Skip to content

Commit

Permalink
Change error reporting to be much more versatile and its now based on…
Browse files Browse the repository at this point in the history
… ActingPlayer instead of UndoTracker

errors, now note lack of chisel, which bit types are missing, even if there are multiple types, and lack of bag space for auto chisel.
More interactions now report errors, such as patterns, and tool usage.
Auto Chiseling Blocks now reports error if your short on bag space.
Fixed a crash when using negative pattern. ( sharing related? )
  • Loading branch information
AlgorithmX2 committed Dec 5, 2017
1 parent 6d6e37e commit 72b26ad
Show file tree
Hide file tree
Showing 16 changed files with 258 additions and 93 deletions.
6 changes: 6 additions & 0 deletions src/main/java/mod/chiselsandbits/bitbag/BagInventory.java
Expand Up @@ -468,4 +468,10 @@ public int countItems(

return count;
}

public static boolean isBag(
ItemStack which )
{
return which != null && which.getItem() instanceof ItemBitBag;
}
}
Expand Up @@ -9,7 +9,6 @@
import mod.chiselsandbits.blueprints.BlueprintData.EnumLoadState;
import mod.chiselsandbits.chiseledblock.data.VoxelBlob;
import mod.chiselsandbits.chiseledblock.data.VoxelBlobStateReference;
import mod.chiselsandbits.client.UndoTracker;
import mod.chiselsandbits.core.ChiselsAndBits;
import mod.chiselsandbits.helpers.ActingPlayer;
import mod.chiselsandbits.helpers.LocalStrings;
Expand Down Expand Up @@ -458,7 +457,7 @@ private void beginPlacement(
}
else
{
UndoTracker.getInstance().displayError();
testPlayer.displayError();
break;
}
}
Expand Down
44 changes: 2 additions & 42 deletions src/main/java/mod/chiselsandbits/client/UndoTracker.java
@@ -1,27 +1,22 @@
package mod.chiselsandbits.client;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import mod.chiselsandbits.chiseledblock.data.VoxelBlobStateReference;
import mod.chiselsandbits.core.ChiselsAndBits;
import mod.chiselsandbits.core.ClientSide;
import mod.chiselsandbits.helpers.ActingPlayer;
import mod.chiselsandbits.helpers.ModUtil;
import mod.chiselsandbits.interfaces.ICacheClearable;
import mod.chiselsandbits.network.NetworkRouter;
import mod.chiselsandbits.network.packets.PacketUndo;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class UndoTracker implements ICacheClearable
{
Expand All @@ -45,15 +40,6 @@ public UndoTracker()

private final List<UndoStep> undoLevels = new ArrayList<UndoStep>();

class TrackerError
{
String msg;
String[] args;
};

// errors produced by operations are accumulated for display.
private final Set<TrackerError> errors = new HashSet<TrackerError>();

/**
* capture stack trace from whoever opened the undo group, for display
* later.
Expand Down Expand Up @@ -124,7 +110,7 @@ public void undo()
}
}

displayError();
testPlayer.displayError();
}
}
else
Expand Down Expand Up @@ -154,7 +140,7 @@ public void redo()
}
}

displayError();
testPlayer.displayError();
}
}
else
Expand Down Expand Up @@ -261,32 +247,6 @@ public void endGroup(
grouping = false;
}

@SideOnly( Side.CLIENT )
public void displayError()
{
for ( final TrackerError err : errors )
{
ClientSide.instance.getPlayer().addChatMessage( new TextComponentString( ModUtil.localizeAndInsertVars( err.msg, err.args ) ) );
}

errors.clear();
}

public void addError(
final ActingPlayer player,
final String string,
String... vars )
{
// servers don't care about this...
if ( !player.isReal() && player.getWorld().isRemote )
{
TrackerError trackerErr = new TrackerError();
trackerErr.msg = string;
trackerErr.args = vars;
errors.add( trackerErr );
}
}

@Override
public void clearCache()
{
Expand Down
101 changes: 101 additions & 0 deletions src/main/java/mod/chiselsandbits/helpers/ActingPlayer.java
@@ -1,16 +1,27 @@
package mod.chiselsandbits.helpers;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.Nonnull;

import mod.chiselsandbits.api.EventBlockBitModification;
import mod.chiselsandbits.bitbag.BagInventory;
import mod.chiselsandbits.core.ClientSide;
import mod.chiselsandbits.items.ItemChiseledBit;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ActingPlayer
{
Expand Down Expand Up @@ -160,4 +171,94 @@ public BlockPos getPosition()
return getPlayer().getPosition();
}

class TrackerError
{
ChiselErrors msg;
Object[] args;

@Override
public int hashCode()
{
return msg.hashCode() ^ Arrays.hashCode( args );
}

@Override
public boolean equals(
Object obj )
{
TrackerError a = (TrackerError) obj;

if ( a.msg == this.msg )
{
return Arrays.equals( args, a.args );
}

return false;
}
};

// errors produced by operations are accumulated for display.
private final Set<TrackerError> errors = new HashSet<TrackerError>();

@SideOnly( Side.CLIENT )
private void innerDisplayError()
{
for ( final TrackerError err : errors )
{
ClientSide.instance.getPlayer().addChatMessage( new TextComponentString( err.msg.getLocal( err.args ) ) );
}
}

public void displayError()
{
if ( FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT )
{
this.innerDisplayError();
}

errors.clear();
}

public void report(
ChiselErrors string,
Object... vars )
{
if ( this.getWorld().isRemote )
{
TrackerError trackerErr = new TrackerError();
trackerErr.msg = string;
trackerErr.args = vars;
errors.add( trackerErr );
}
}

public boolean hasBagWithRoom(
int state,
int requiredRoom )
{
IInventory inv = getInventory();
int emptyRoom = 0;

for ( int zz = 0; zz < inv.getSizeInventory(); zz++ )
{
final ItemStack which = inv.getStackInSlot( zz );

if ( BagInventory.isBag( which ) )
{
BagInventory bi = new BagInventory( which );

for ( int x = 0; x < bi.getSizeInventory(); x++ )
{
ItemStack g = bi.getStackInSlot( x );
if ( ModUtil.isEmpty( g ) )
emptyRoom += bi.getInventoryStackLimit();
else if ( ItemChiseledBit.sameBit( g, state ) )
emptyRoom += bi.getInventoryStackLimit() - ModUtil.getStackSize( g );
}
}
}

return emptyRoom >= requiredRoom;
}

}
46 changes: 46 additions & 0 deletions src/main/java/mod/chiselsandbits/helpers/BitName.java
@@ -0,0 +1,46 @@
package mod.chiselsandbits.helpers;

import mod.chiselsandbits.api.APIExceptions.InvalidBitItem;
import mod.chiselsandbits.core.ChiselsAndBits;

public class BitName
{
private int state;

public BitName(
int state )
{
this.state = state;
}

@Override
public boolean equals(
Object obj )
{
if ( obj instanceof BitName )
{
return this.state == ( (BitName) obj ).state;
}

return false;
}

@Override
public int hashCode()
{
return state;
}

@Override
public String toString()
{
try
{
return ChiselsAndBits.getApi().getBitItem( ModUtil.getStateById( state ) ).getDisplayName();
}
catch ( InvalidBitItem e )
{
return "No Such Bit.";
}
}
}
26 changes: 26 additions & 0 deletions src/main/java/mod/chiselsandbits/helpers/ChiselErrors.java
@@ -0,0 +1,26 @@
package mod.chiselsandbits.helpers;

public enum ChiselErrors
{
OUT_OF_RANGE( "mod.chiselsandbits.result.out_of_range" ),
NO_BAG_SPACE( "mod.chiselsandbits.result.no_bag_space" ),
HAS_CHANGED( "mod.chiselsandbits.result.has_changed" ),
NO_CHISELS( "mod.chiselsandbits.result.missing_chisels" ),
NO_BITS( "mod.chiselsandbits.result.missing_bits" ),
NOTHING_TO_UNDO( "mod.chiselsandbits.result.nothing_to_undo" ),
NOTHING_TO_REDO( "mod.chiselsandbits.result.nothing_to_redo" );

private final String msg;

private ChiselErrors(
String str )
{
msg = str;
}

public String getLocal(
Object... args )
{
return ModUtil.localizeAndInsertVars( msg, args );
}
}
Expand Up @@ -123,6 +123,9 @@ public static IToolMode getChiselMode(
return setting.getMode( ei );
}

if ( setting.getAvailableModes().isEmpty() )
return ChiselMode.SINGLE;

return setting.getAvailableModes().get( 0 );
}
else if ( setting == ChiselToolType.CHISEL )
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/mod/chiselsandbits/helpers/ContinousBits.java
Expand Up @@ -6,7 +6,6 @@
import mod.chiselsandbits.bitbag.BagInventory;
import mod.chiselsandbits.core.ChiselsAndBits;
import mod.chiselsandbits.helpers.ModUtil.ItemStackSlot;
import mod.chiselsandbits.items.ItemBitBag;
import mod.chiselsandbits.items.ItemChiseledBit;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
Expand Down Expand Up @@ -64,7 +63,7 @@ public ContinousBits(
}
}

if ( which != null && which.getItem() instanceof ItemBitBag )
if ( BagInventory.isBag( which ) )
{
bags.add( new BagInventory( which ) );
}
Expand Down
24 changes: 17 additions & 7 deletions src/main/java/mod/chiselsandbits/helpers/InfiniteBitStorage.java
Expand Up @@ -122,16 +122,26 @@ public boolean chiselBlock(

if ( item_state != null && ModUtil.getStateId( item_state ) == state )
{
if ( chisels.useItem( state, VoxelBlob.full_size ) )
// I know this isn't perfect, but it seems better then just
// throwing three inventories worth of bits on the ground
// without warning.
if ( player.hasBagWithRoom( state, VoxelBlob.full_size ) )
{
ItemStack post = is.copy();
ModUtil.adjustStackSize( post, -1 );
if ( chisels.useItem( state, VoxelBlob.full_size ) )
{
ItemStack post = is.copy();
ModUtil.adjustStackSize( post, -1 );

inv.setInventorySlotContents( x, post );
BlockPos p = player.getPosition();
this.insert( state, VoxelBlob.full_size, p.getX() + 0.5, p.getY() + 0.5, p.getZ() + 0.5 );
return true;
inv.setInventorySlotContents( x, post );
BlockPos p = player.getPosition();
this.insert( state, VoxelBlob.full_size, p.getX() + 0.5, p.getY() + 0.5, p.getZ() + 0.5 );
return true;
}
else
player.report( ChiselErrors.NO_CHISELS );
}
else
player.report( ChiselErrors.NO_BAG_SPACE );
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/mod/chiselsandbits/helpers/ModUtil.java
Expand Up @@ -869,7 +869,7 @@ public static boolean isEmpty(

public static String localizeAndInsertVars(
String stringName,
final String... variables )
final Object... variables )
{
stringName = DeprecationHelper.translateToLocal( stringName );

Expand All @@ -882,7 +882,7 @@ public static String localizeAndInsertVars(
{
final String pre = stringName.substring( 0, offset );
final String post = stringName.substring( offset + 2 );
stringName = new StringBuilder( pre ).append( variables[varOffset++] ).append( post ).toString();
stringName = new StringBuilder( pre ).append( variables[varOffset++].toString() ).append( post ).toString();
}
}

Expand Down

0 comments on commit 72b26ad

Please sign in to comment.