1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-07-14 07:52:59 +00:00
SquidDev f9e13ca67a Update CC: Tweaked to 1.13
Look, I originally had this split into several commits, but lots of
other cleanups got mixed in. I then backported some of the cleanups to
1.12, did other tidy ups there, and eventually the web of merges was
unreadable.

Yes, this is a horrible mess, but it's still nicer than it was. Anyway,
changes:

 - Flatten everything. For instance, there are now three instances of
   BlockComputer, two BlockTurtle, ItemPocketComputer. There's also no
   more BlockPeripheral (thank heavens) - there's separate block classes
   for each peripheral type.

 - Remove pretty much all legacy code. As we're breaking world
   compatibility anyway, we can remove all the code to load worlds from
   1.4 days.
 - The command system is largely rewriten to take advantage of 1.13's
   new system. It's very fancy!

 - WidgetTerminal now uses Minecraft's "GUI listener" system.

 - BREAKING CHANGE: All the codes in keys.lua are different, due to the
   move to LWJGL 3. Hopefully this won't have too much of an impact.

   I don't want to map to the old key codes on the Java side, as there
   always ends up being small but slight inconsistencies. IMO it's
   better to make a clean break - people should be using keys rather
   than hard coding the constants anyway.

 - commands.list now allows fetching sub-commands. The ROM has already
   been updated to allow fancy usage such as commands.time.set("noon").

 - Turtles, modems and cables can be waterlogged.
2019-04-02 20:59:48 +01:00

137 lines
3.6 KiB
Java

/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.command.text;
import dan200.computercraft.shared.command.CommandUtils;
import dan200.computercraft.shared.network.NetworkHandler;
import dan200.computercraft.shared.network.client.ChatTableClientMessage;
import net.minecraft.command.CommandSource;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.text.ITextComponent;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class TableBuilder
{
private final int id;
private int columns = -1;
private final ITextComponent[] headers;
private final ArrayList<ITextComponent[]> rows = new ArrayList<>();
private int additional;
public TableBuilder( int id, @Nonnull ITextComponent... headers )
{
if( id < 0 ) throw new IllegalArgumentException( "ID must be positive" );
this.id = id;
this.headers = headers;
columns = headers.length;
}
public TableBuilder( int id )
{
if( id < 0 ) throw new IllegalArgumentException( "ID must be positive" );
this.id = id;
headers = null;
}
public TableBuilder( int id, @Nonnull String... headers )
{
if( id < 0 ) throw new IllegalArgumentException( "ID must be positive" );
this.id = id;
this.headers = new ITextComponent[headers.length];
columns = headers.length;
for( int i = 0; i < headers.length; i++ ) this.headers[i] = ChatHelpers.header( headers[i] );
}
public void row( @Nonnull ITextComponent... row )
{
if( columns == -1 ) columns = row.length;
if( row.length != columns ) throw new IllegalArgumentException( "Row is the incorrect length" );
rows.add( row );
}
/**
* Get the unique identifier for this table type.
*
* When showing a table within Minecraft, previous instances of this table with
* the same ID will be removed from chat.
*
* @return This table's type.
*/
public int getId()
{
return id;
}
/**
* Get the number of columns for this table.
*
* This will be the same as {@link #getHeaders()}'s length if it is is non-{@code null},
* otherwise the length of the first column.
*
* @return The number of columns.
*/
public int getColumns()
{
return columns;
}
@Nullable
public ITextComponent[] getHeaders()
{
return headers;
}
@Nonnull
public List<ITextComponent[]> getRows()
{
return rows;
}
public int getAdditional()
{
return additional;
}
public void setAdditional( int additional )
{
this.additional = additional;
}
/**
* Trim this table to a given height
*
* @param height The desired height.
*/
public void trim( int height )
{
if( rows.size() > height )
{
additional += rows.size() - height - 1;
rows.subList( height - 1, rows.size() ).clear();
}
}
public void display( CommandSource source )
{
if( CommandUtils.isPlayer( source ) )
{
trim( 18 );
NetworkHandler.sendToPlayer( (EntityPlayerMP) source.getEntity(), new ChatTableClientMessage( this ) );
}
else
{
trim( 100 );
new ServerTableFormatter( source ).display( this );
}
}
}