Fixes the color applicator

This commit is contained in:
Sebastian Hartte
2020-06-21 20:41:04 +02:00
parent 8ed68d9c74
commit 8606bd5c61
5 changed files with 271 additions and 135 deletions
@@ -21,28 +21,28 @@ package appeng.hooks;
import net.minecraft.block.DispenserBlock; import net.minecraft.block.DispenserBlock;
import net.minecraft.dispenser.DefaultDispenseItemBehavior; import net.minecraft.dispenser.DefaultDispenseItemBehavior;
import net.minecraft.dispenser.IBlockSource; import net.minecraft.dispenser.IBlockSource;
import net.minecraft.item.DirectionalPlaceContext;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld; import net.minecraft.world.server.ServerWorld;
import appeng.util.Platform;
public final class DispenserBlockTool extends DefaultDispenseItemBehavior { public final class DispenserBlockTool extends DefaultDispenseItemBehavior {
@Override @Override
protected ItemStack dispenseStack(final IBlockSource dispenser, final ItemStack dispensedItem) { protected ItemStack dispenseStack(final IBlockSource dispenser, final ItemStack dispensedItem) {
final Item i = dispensedItem.getItem(); final Item i = dispensedItem.getItem();
if (i instanceof IBlockTool) { if (i instanceof IBlockTool) {
final Direction Direction = dispenser.getBlockState().get(DispenserBlock.FACING); final Direction direction = dispenser.getBlockState().get(DispenserBlock.FACING);
final IBlockTool tm = (IBlockTool) i; final IBlockTool tm = (IBlockTool) i;
final World w = dispenser.getWorld(); final World w = dispenser.getWorld();
if (w instanceof ServerWorld) { if (w instanceof ServerWorld) {
tm.onItemUse(dispensedItem, Platform.getPlayer((ServerWorld) w), w, ItemUseContext context = new DirectionalPlaceContext(w, dispenser.getBlockPos().offset(direction),
dispenser.getBlockPos().offset(Direction), Hand.MAIN_HAND, Direction, 0.5f, 0.5f, 0.5f); direction, dispensedItem, direction.getOpposite());
tm.onItemUse(context);
} }
} }
return dispensedItem; return dispensedItem;
+2 -6
View File
@@ -20,6 +20,7 @@ package appeng.hooks;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.util.ActionResultType; import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
@@ -28,11 +29,6 @@ import net.minecraft.world.World;
public interface IBlockTool { public interface IBlockTool {
// Workaround for dispenser logic. // Workaround for dispenser logic.
// TODO ItemUseContext ActionResultType onItemUse(ItemUseContext itemUseContext);
ActionResultType onItemUse(ItemStack is, PlayerEntity p, World w, BlockPos pos, Hand hand, Direction side,
float hitX, float hitY, float hitZ);
ActionResultType onItemUse(PlayerEntity p, World w, BlockPos pos, Hand hand, Direction side, float hitX, float hitY,
float hitZ);
} }
@@ -0,0 +1,167 @@
package appeng.items.tools.powered;
import java.util.List;
import com.google.common.base.Preconditions;
import com.google.common.collect.BiMap;
import com.google.common.collect.EnumHashBiMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import appeng.api.util.AEColor;
/**
* Allows recoloring a variety of vanilla blocks.
*/
public final class BlockRecolorer {
private BlockRecolorer() {
}
private static final BiMap<AEColor, Block> STAINED_GLASS_BY_COLOR = EnumHashBiMap.create(ImmutableMap
.<AEColor, Block>builder().put(AEColor.WHITE, Blocks.WHITE_STAINED_GLASS)
.put(AEColor.ORANGE, Blocks.ORANGE_STAINED_GLASS).put(AEColor.MAGENTA, Blocks.MAGENTA_STAINED_GLASS)
.put(AEColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_STAINED_GLASS).put(AEColor.YELLOW, Blocks.YELLOW_STAINED_GLASS)
.put(AEColor.LIME, Blocks.LIME_STAINED_GLASS).put(AEColor.PINK, Blocks.PINK_STAINED_GLASS)
.put(AEColor.GRAY, Blocks.GRAY_STAINED_GLASS).put(AEColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_STAINED_GLASS)
.put(AEColor.CYAN, Blocks.CYAN_STAINED_GLASS).put(AEColor.PURPLE, Blocks.PURPLE_STAINED_GLASS)
.put(AEColor.BLUE, Blocks.BLUE_STAINED_GLASS).put(AEColor.BROWN, Blocks.BROWN_STAINED_GLASS)
.put(AEColor.GREEN, Blocks.GREEN_STAINED_GLASS).put(AEColor.RED, Blocks.RED_STAINED_GLASS)
.put(AEColor.BLACK, Blocks.BLACK_STAINED_GLASS).build());
private static final BiMap<AEColor, Block> STAINED_GLASS_PANE_BY_COLOR = EnumHashBiMap.create(ImmutableMap
.<AEColor, Block>builder().put(AEColor.WHITE, Blocks.WHITE_STAINED_GLASS_PANE)
.put(AEColor.ORANGE, Blocks.ORANGE_STAINED_GLASS_PANE)
.put(AEColor.MAGENTA, Blocks.MAGENTA_STAINED_GLASS_PANE)
.put(AEColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_STAINED_GLASS_PANE)
.put(AEColor.YELLOW, Blocks.YELLOW_STAINED_GLASS_PANE).put(AEColor.LIME, Blocks.LIME_STAINED_GLASS_PANE)
.put(AEColor.PINK, Blocks.PINK_STAINED_GLASS_PANE).put(AEColor.GRAY, Blocks.GRAY_STAINED_GLASS_PANE)
.put(AEColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_STAINED_GLASS_PANE)
.put(AEColor.CYAN, Blocks.CYAN_STAINED_GLASS_PANE).put(AEColor.PURPLE, Blocks.PURPLE_STAINED_GLASS_PANE)
.put(AEColor.BLUE, Blocks.BLUE_STAINED_GLASS_PANE).put(AEColor.BROWN, Blocks.BROWN_STAINED_GLASS_PANE)
.put(AEColor.GREEN, Blocks.GREEN_STAINED_GLASS_PANE).put(AEColor.RED, Blocks.RED_STAINED_GLASS_PANE)
.put(AEColor.BLACK, Blocks.BLACK_STAINED_GLASS_PANE).build());
private static final BiMap<AEColor, Block> WOOL_BY_COLOR = EnumHashBiMap.create(ImmutableMap
.<AEColor, Block>builder().put(AEColor.WHITE, Blocks.WHITE_WOOL).put(AEColor.ORANGE, Blocks.ORANGE_WOOL)
.put(AEColor.MAGENTA, Blocks.MAGENTA_WOOL).put(AEColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_WOOL)
.put(AEColor.YELLOW, Blocks.YELLOW_WOOL).put(AEColor.LIME, Blocks.LIME_WOOL)
.put(AEColor.PINK, Blocks.PINK_WOOL).put(AEColor.GRAY, Blocks.GRAY_WOOL)
.put(AEColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_WOOL).put(AEColor.CYAN, Blocks.CYAN_WOOL)
.put(AEColor.PURPLE, Blocks.PURPLE_WOOL).put(AEColor.BLUE, Blocks.BLUE_WOOL)
.put(AEColor.BROWN, Blocks.BROWN_WOOL).put(AEColor.GREEN, Blocks.GREEN_WOOL)
.put(AEColor.RED, Blocks.RED_WOOL).put(AEColor.BLACK, Blocks.BLACK_WOOL).build());
private static final BiMap<AEColor, Block> BANNER_BY_COLOR = EnumHashBiMap.create(ImmutableMap
.<AEColor, Block>builder().put(AEColor.WHITE, Blocks.WHITE_BANNER).put(AEColor.ORANGE, Blocks.ORANGE_BANNER)
.put(AEColor.MAGENTA, Blocks.MAGENTA_BANNER).put(AEColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_BANNER)
.put(AEColor.YELLOW, Blocks.YELLOW_BANNER).put(AEColor.LIME, Blocks.LIME_BANNER)
.put(AEColor.PINK, Blocks.PINK_BANNER).put(AEColor.GRAY, Blocks.GRAY_BANNER)
.put(AEColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_BANNER).put(AEColor.CYAN, Blocks.CYAN_BANNER)
.put(AEColor.PURPLE, Blocks.PURPLE_BANNER).put(AEColor.BLUE, Blocks.BLUE_BANNER)
.put(AEColor.BROWN, Blocks.BROWN_BANNER).put(AEColor.GREEN, Blocks.GREEN_BANNER)
.put(AEColor.RED, Blocks.RED_BANNER).put(AEColor.BLACK, Blocks.BLACK_BANNER).build());
private static final BiMap<AEColor, Block> WALL_BANNER_BY_COLOR = EnumHashBiMap
.create(ImmutableMap.<AEColor, Block>builder().put(AEColor.WHITE, Blocks.WHITE_WALL_BANNER)
.put(AEColor.ORANGE, Blocks.ORANGE_WALL_BANNER).put(AEColor.MAGENTA, Blocks.MAGENTA_WALL_BANNER)
.put(AEColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_WALL_BANNER)
.put(AEColor.YELLOW, Blocks.YELLOW_WALL_BANNER).put(AEColor.LIME, Blocks.LIME_WALL_BANNER)
.put(AEColor.PINK, Blocks.PINK_WALL_BANNER).put(AEColor.GRAY, Blocks.GRAY_WALL_BANNER)
.put(AEColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_WALL_BANNER).put(AEColor.CYAN, Blocks.CYAN_WALL_BANNER)
.put(AEColor.PURPLE, Blocks.PURPLE_WALL_BANNER).put(AEColor.BLUE, Blocks.BLUE_WALL_BANNER)
.put(AEColor.BROWN, Blocks.BROWN_WALL_BANNER).put(AEColor.GREEN, Blocks.GREEN_WALL_BANNER)
.put(AEColor.RED, Blocks.RED_WALL_BANNER).put(AEColor.BLACK, Blocks.BLACK_WALL_BANNER).build());
private static final BiMap<AEColor, Block> CARPET_BY_COLOR = EnumHashBiMap.create(ImmutableMap
.<AEColor, Block>builder().put(AEColor.WHITE, Blocks.WHITE_CARPET).put(AEColor.ORANGE, Blocks.ORANGE_CARPET)
.put(AEColor.MAGENTA, Blocks.MAGENTA_CARPET).put(AEColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_CARPET)
.put(AEColor.YELLOW, Blocks.YELLOW_CARPET).put(AEColor.LIME, Blocks.LIME_CARPET)
.put(AEColor.PINK, Blocks.PINK_CARPET).put(AEColor.GRAY, Blocks.GRAY_CARPET)
.put(AEColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_CARPET).put(AEColor.CYAN, Blocks.CYAN_CARPET)
.put(AEColor.PURPLE, Blocks.PURPLE_CARPET).put(AEColor.BLUE, Blocks.BLUE_CARPET)
.put(AEColor.BROWN, Blocks.BROWN_CARPET).put(AEColor.GREEN, Blocks.GREEN_CARPET)
.put(AEColor.RED, Blocks.RED_CARPET).put(AEColor.BLACK, Blocks.BLACK_CARPET).build());
private static final BiMap<AEColor, Block> TERRACOTTA_BY_COLOR = EnumHashBiMap
.create(ImmutableMap.<AEColor, Block>builder().put(AEColor.WHITE, Blocks.WHITE_TERRACOTTA)
.put(AEColor.ORANGE, Blocks.ORANGE_TERRACOTTA).put(AEColor.MAGENTA, Blocks.MAGENTA_TERRACOTTA)
.put(AEColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_TERRACOTTA).put(AEColor.YELLOW, Blocks.YELLOW_TERRACOTTA)
.put(AEColor.LIME, Blocks.LIME_TERRACOTTA).put(AEColor.PINK, Blocks.PINK_TERRACOTTA)
.put(AEColor.GRAY, Blocks.GRAY_TERRACOTTA).put(AEColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_TERRACOTTA)
.put(AEColor.CYAN, Blocks.CYAN_TERRACOTTA).put(AEColor.PURPLE, Blocks.PURPLE_TERRACOTTA)
.put(AEColor.BLUE, Blocks.BLUE_TERRACOTTA).put(AEColor.BROWN, Blocks.BROWN_TERRACOTTA)
.put(AEColor.GREEN, Blocks.GREEN_TERRACOTTA).put(AEColor.RED, Blocks.RED_TERRACOTTA)
.put(AEColor.BLACK, Blocks.BLACK_TERRACOTTA).build());
private static final BiMap<AEColor, Block> GLAZED_TERRACOTTA_BY_COLOR = EnumHashBiMap.create(ImmutableMap
.<AEColor, Block>builder().put(AEColor.WHITE, Blocks.WHITE_GLAZED_TERRACOTTA)
.put(AEColor.ORANGE, Blocks.ORANGE_GLAZED_TERRACOTTA).put(AEColor.MAGENTA, Blocks.MAGENTA_GLAZED_TERRACOTTA)
.put(AEColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_GLAZED_TERRACOTTA)
.put(AEColor.YELLOW, Blocks.YELLOW_GLAZED_TERRACOTTA).put(AEColor.LIME, Blocks.LIME_GLAZED_TERRACOTTA)
.put(AEColor.PINK, Blocks.PINK_GLAZED_TERRACOTTA).put(AEColor.GRAY, Blocks.GRAY_GLAZED_TERRACOTTA)
.put(AEColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_GLAZED_TERRACOTTA)
.put(AEColor.CYAN, Blocks.CYAN_GLAZED_TERRACOTTA).put(AEColor.PURPLE, Blocks.PURPLE_GLAZED_TERRACOTTA)
.put(AEColor.BLUE, Blocks.BLUE_GLAZED_TERRACOTTA).put(AEColor.BROWN, Blocks.BROWN_GLAZED_TERRACOTTA)
.put(AEColor.GREEN, Blocks.GREEN_GLAZED_TERRACOTTA).put(AEColor.RED, Blocks.RED_GLAZED_TERRACOTTA)
.put(AEColor.BLACK, Blocks.BLACK_GLAZED_TERRACOTTA).build());
private static final BiMap<AEColor, Block> CONCRETE_BY_COLOR = EnumHashBiMap
.create(ImmutableMap.<AEColor, Block>builder().put(AEColor.WHITE, Blocks.WHITE_CONCRETE)
.put(AEColor.ORANGE, Blocks.ORANGE_CONCRETE).put(AEColor.MAGENTA, Blocks.MAGENTA_CONCRETE)
.put(AEColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_CONCRETE).put(AEColor.YELLOW, Blocks.YELLOW_CONCRETE)
.put(AEColor.LIME, Blocks.LIME_CONCRETE).put(AEColor.PINK, Blocks.PINK_CONCRETE)
.put(AEColor.GRAY, Blocks.GRAY_CONCRETE).put(AEColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_CONCRETE)
.put(AEColor.CYAN, Blocks.CYAN_CONCRETE).put(AEColor.PURPLE, Blocks.PURPLE_CONCRETE)
.put(AEColor.BLUE, Blocks.BLUE_CONCRETE).put(AEColor.BROWN, Blocks.BROWN_CONCRETE)
.put(AEColor.GREEN, Blocks.GREEN_CONCRETE).put(AEColor.RED, Blocks.RED_CONCRETE)
.put(AEColor.BLACK, Blocks.BLACK_CONCRETE).build());
private static final List<RecolorableBlockGroup> BLOCK_GROUPS = ImmutableList.of(
new RecolorableBlockGroup(Blocks.GLASS, STAINED_GLASS_BY_COLOR),
new RecolorableBlockGroup(Blocks.GLASS_PANE, STAINED_GLASS_PANE_BY_COLOR),
new RecolorableBlockGroup(Blocks.WHITE_WOOL, WOOL_BY_COLOR),
new RecolorableBlockGroup(Blocks.WHITE_BANNER, BANNER_BY_COLOR),
new RecolorableBlockGroup(Blocks.WHITE_WALL_BANNER, WALL_BANNER_BY_COLOR),
new RecolorableBlockGroup(Blocks.WHITE_CARPET, CARPET_BY_COLOR),
new RecolorableBlockGroup(Blocks.TERRACOTTA, TERRACOTTA_BY_COLOR),
new RecolorableBlockGroup(null, GLAZED_TERRACOTTA_BY_COLOR),
new RecolorableBlockGroup(null, CONCRETE_BY_COLOR));
public static Block recolor(Block block, AEColor newColor) {
Preconditions.checkNotNull(block);
for (RecolorableBlockGroup group : BLOCK_GROUPS) {
if (group.uncoloredVariant == block || group.coloredVariants.containsValue(block)) {
Block newBlock = group.coloredVariants.get(newColor);
if (newBlock == null) {
if (group.uncoloredVariant != null) {
newBlock = group.uncoloredVariant;
} else {
newBlock = block;
}
}
return newBlock;
}
}
return block;
}
private static class RecolorableBlockGroup {
final Block uncoloredVariant;
final BiMap<AEColor, Block> coloredVariants;
public RecolorableBlockGroup(Block uncoloredVariant, BiMap<AEColor, Block> coloredVariants) {
this.uncoloredVariant = uncoloredVariant;
this.coloredVariants = coloredVariants;
}
}
}
@@ -18,14 +18,11 @@
package appeng.items.tools.powered; package appeng.items.tools.powered;
import java.util.Collections; import java.util.*;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.text.WordUtils; import javax.annotation.Nullable;
import com.google.common.collect.ImmutableMap;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@@ -33,17 +30,21 @@ import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.item.SnowballItem; import net.minecraft.item.SnowballItem;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.IProperty;
import net.minecraft.tags.ItemTags;
import net.minecraft.tags.Tag;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType; import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
@@ -81,42 +82,49 @@ import appeng.util.item.AEItemStack;
public class ToolColorApplicator extends AEBasePoweredItem public class ToolColorApplicator extends AEBasePoweredItem
implements IStorageCell<IAEItemStack>, IItemGroup, IBlockTool, IMouseWheelItem { implements IStorageCell<IAEItemStack>, IItemGroup, IBlockTool, IMouseWheelItem {
private static final Map<Integer, AEColor> ORE_TO_COLOR = new HashMap<>(); private static final Map<ResourceLocation, AEColor> TAG_TO_COLOR = ImmutableMap.<ResourceLocation, AEColor>builder()
.put(new ResourceLocation("forge:dyes/black"), AEColor.BLACK)
.put(new ResourceLocation("forge:dyes/blue"), AEColor.BLUE)
.put(new ResourceLocation("forge:dyes/brown"), AEColor.BROWN)
.put(new ResourceLocation("forge:dyes/cyan"), AEColor.CYAN)
.put(new ResourceLocation("forge:dyes/gray"), AEColor.GRAY)
.put(new ResourceLocation("forge:dyes/green"), AEColor.GREEN)
.put(new ResourceLocation("forge:dyes/light_blue"), AEColor.LIGHT_BLUE)
.put(new ResourceLocation("forge:dyes/light_gray"), AEColor.LIGHT_GRAY)
.put(new ResourceLocation("forge:dyes/lime"), AEColor.LIME)
.put(new ResourceLocation("forge:dyes/magenta"), AEColor.MAGENTA)
.put(new ResourceLocation("forge:dyes/orange"), AEColor.ORANGE)
.put(new ResourceLocation("forge:dyes/pink"), AEColor.PINK)
.put(new ResourceLocation("forge:dyes/purple"), AEColor.PURPLE)
.put(new ResourceLocation("forge:dyes/red"), AEColor.RED)
.put(new ResourceLocation("forge:dyes/white"), AEColor.WHITE)
.put(new ResourceLocation("forge:dyes/yellow"), AEColor.YELLOW).build();
private static final String TAG_COLOR = "color"; private static final String TAG_COLOR = "color";
static {
for (final AEColor color : AEColor.VALID_COLORS) {
final String dyeName = color.dye.getTranslationKey();
final String oreDictName = "dye" + WordUtils.capitalize(dyeName);
// FIXME final int oreDictId = OreDictionary.getOreID( oreDictName );
// FIXME ORE_TO_COLOR.put( oreDictId, color );
}
}
public ToolColorApplicator(Item.Properties props) { public ToolColorApplicator(Item.Properties props) {
super(AEConfig.instance().getColorApplicatorBattery(), props); super(AEConfig.instance().getColorApplicatorBattery(), props);
addPropertyOverride(new ResourceLocation(AppEng.MOD_ID, "colored"), (itemStack, world, entity) -> { addPropertyOverride(new ResourceLocation(AppEng.MOD_ID, "colored"), (itemStack, world, entity) -> {
// If the stack has no color, don't use the colored model since the impact of // If the stack has no color, don't use the colored model since the impact of
// calling getColor // calling getColor for every quad is extremely high, if the stack tries to
// for every quad is extremely high, if the stack tries to re-search its // re-search its
// inventory for a new // inventory for a new paintball everytime
// paintball everytime
AEColor col = getActiveColor(itemStack); AEColor col = getActiveColor(itemStack);
return (col != null) ? 1 : 0; return (col != null) ? 1 : 0;
}); });
} }
@Override @Override
public ActionResultType onItemUse(PlayerEntity p, World w, BlockPos pos, Hand hand, Direction side, float hitX, public ActionResultType onItemUse(ItemUseContext context) {
float hitY, float hitZ) { World w = context.getWorld();
return this.onItemUse(p.getHeldItem(hand), p, w, pos, hand, side, hitX, hitY, hitZ); BlockPos pos = context.getPos();
} ItemStack is = context.getItem();
Direction side = context.getFace();
PlayerEntity p = context.getPlayer(); // This can be null
if (p == null && w instanceof ServerWorld) {
p = Platform.getPlayer((ServerWorld) w);
}
@Override
public ActionResultType onItemUse(ItemStack is, PlayerEntity p, World w, BlockPos pos, Hand hand, Direction side,
float hitX, float hitY, float hitZ) {
final Block blk = w.getBlockState(pos).getBlock(); final Block blk = w.getBlockState(pos).getBlock();
ItemStack paintBall = this.getColor(is); ItemStack paintBall = this.getColor(is);
@@ -134,7 +142,7 @@ public class ToolColorApplicator extends AEBasePoweredItem
paintBall = ItemStack.EMPTY; paintBall = ItemStack.EMPTY;
} }
if (!Platform.hasPermissions(new DimensionalCoord(w, pos), p)) { if (p != null && !Platform.hasPermissions(new DimensionalCoord(w, pos), p)) {
return ActionResultType.FAIL; return ActionResultType.FAIL;
} }
@@ -142,7 +150,7 @@ public class ToolColorApplicator extends AEBasePoweredItem
if (!paintBall.isEmpty() && paintBall.getItem() instanceof SnowballItem) { if (!paintBall.isEmpty() && paintBall.getItem() instanceof SnowballItem) {
final TileEntity te = w.getTileEntity(pos); final TileEntity te = w.getTileEntity(pos);
// clean cables. // clean cables.
if (te instanceof IColorableTile) { if (te instanceof IColorableTile && p != null) {
if (this.getAECurrentPower(is) > powerPerUse if (this.getAECurrentPower(is) > powerPerUse
&& ((IColorableTile) te).getColor() != AEColor.TRANSPARENT) { && ((IColorableTile) te).getColor() != AEColor.TRANSPARENT) {
if (((IColorableTile) te).recolourBlock(side, AEColor.TRANSPARENT, p)) { if (((IColorableTile) te).recolourBlock(side, AEColor.TRANSPARENT, p)) {
@@ -168,7 +176,7 @@ public class ToolColorApplicator extends AEBasePoweredItem
final AEColor color = this.getColorFromItem(paintBall); final AEColor color = this.getColorFromItem(paintBall);
if (color != null && this.getAECurrentPower(is) > powerPerUse) { if (color != null && this.getAECurrentPower(is) > powerPerUse) {
if (color != AEColor.TRANSPARENT && this.recolourBlock(blk, side, w, pos, side, color, p)) { if (color != AEColor.TRANSPARENT && this.recolourBlock(blk, side, w, pos, color, p)) {
inv.extractItems(AEItemStack.fromItemStack(paintBall), Actionable.MODULATE, inv.extractItems(AEItemStack.fromItemStack(paintBall), Actionable.MODULATE,
new BaseActionSource()); new BaseActionSource());
this.extractAEPower(is, powerPerUse, Actionable.MODULATE); this.extractAEPower(is, powerPerUse, Actionable.MODULATE);
@@ -178,7 +186,7 @@ public class ToolColorApplicator extends AEBasePoweredItem
} }
} }
if (p.isCrouching()) { if (p != null && p.isCrouching()) {
this.cycleColors(is, paintBall, 1); this.cycleColors(is, paintBall, 1);
} }
@@ -215,15 +223,12 @@ public class ToolColorApplicator extends AEBasePoweredItem
final ItemPaintBall ipb = (ItemPaintBall) paintBall.getItem(); final ItemPaintBall ipb = (ItemPaintBall) paintBall.getItem();
return ipb.getColor(); return ipb.getColor();
} else { } else {
// FIXME final int[] id = OreDictionary.getOreIDs( paintBall ); for (Map.Entry<ResourceLocation, AEColor> entry : TAG_TO_COLOR.entrySet()) {
// FIXME Tag<Item> tag = ItemTags.getCollection().get(entry.getKey());
// FIXME for( final int oreID : id ) if (tag != null && paintBall.getItem().isIn(tag)) {
// FIXME { return entry.getValue();
// FIXME if( ORE_TO_COLOR.containsKey( oreID ) ) }
// FIXME { }
// FIXME return ORE_TO_COLOR.get( oreID );
// FIXME }
// FIXME }
} }
return null; return null;
@@ -262,16 +267,21 @@ public class ToolColorApplicator extends AEBasePoweredItem
list.add(i); list.add(i);
} }
Collections.sort(list, (a, b) -> Integer.compare(a.getItemDamage(), b.getItemDamage())); if (list.isEmpty()) {
if (list.size() <= 0) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
// Sort by color
list.sort(Comparator.comparingInt(a -> {
AEColor color = getColorFromItem(a.getDefinition());
return color != null ? color.ordinal() : Integer.MAX_VALUE;
}));
IAEItemStack where = list.getFirst(); IAEItemStack where = list.getFirst();
int cycles = 1 + list.size(); int cycles = 1 + list.size();
while (cycles > 0 && !where.equals(anchor)) { AEColor anchorColor = getColorFromItem(anchor);
while (cycles > 0 && getColorFromItem(where.getDefinition()) != anchorColor) {
list.addLast(list.removeFirst()); list.addLast(list.removeFirst());
cycles--; cycles--;
where = list.getFirst(); where = list.getFirst();
@@ -308,67 +318,34 @@ public class ToolColorApplicator extends AEBasePoweredItem
} }
private boolean recolourBlock(final Block blk, final Direction side, final World w, final BlockPos pos, private boolean recolourBlock(final Block blk, final Direction side, final World w, final BlockPos pos,
final Direction orientation, final AEColor newColor, final PlayerEntity p) { final AEColor newColor, @Nullable final PlayerEntity p) {
final BlockState state = w.getBlockState(pos); final BlockState state = w.getBlockState(pos);
// FIXME if( blk instanceof BlockColored ) Block recolored = BlockRecolorer.recolor(blk, newColor);
// FIXME { if (recolored != blk) {
// FIXME final DyeColor color = state.get( BlockColored.COLOR ); BlockState newState = recolored.getDefaultState();
// FIXME for (IProperty<?> prop : newState.getProperties()) {
// FIXME if( newColor.dye == color ) newState = copyProp(state, newState, prop);
// FIXME { }
// FIXME return false;
// FIXME }
// FIXME
// FIXME return w.setBlockState( pos, state.with( BlockColored.COLOR, newColor.dye ) );
// FIXME }
// if( blk == Blocks.GLASS ) return w.setBlockState(pos, newState);
// { }
// return w.setBlockState( pos, Blocks.STAINED_GLASS.getDefaultState().with( BlockStainedGlass.COLOR, newColor.dye ) );
// }
//
// if( blk == Blocks.STAINED_GLASS )
// {
// final DyeColor color = state.get( BlockStainedGlass.COLOR );
//
// if( newColor.dye == color )
// {
// return false;
// }
//
// return w.setBlockState( pos, state.with( BlockStainedGlass.COLOR, newColor.dye ) );
// }
// if( blk == Blocks.GLASS_PANE ) if (blk instanceof BlockCableBus && p != null) {
// {
// return w.setBlockState( pos, Blocks.STAINED_GLASS_PANE.getDefaultState().with( BlockStainedGlassPane.COLOR, newColor.dye ) );
// }
//
// if( blk == Blocks.STAINED_GLASS_PANE )
// {
// final DyeColor color = state.get( BlockStainedGlassPane.COLOR );
//
// if( newColor.dye == color )
// {
// return false;
// }
//
// return w.setBlockState( pos, state.with( BlockStainedGlassPane.COLOR, newColor.dye ) );
// }
//
// if( blk == Blocks.HARDENED_CLAY )
// {
// return w.setBlockState( pos, Blocks.STAINED_HARDENED_CLAY.getDefaultState().with( BlockColored.COLOR, newColor.dye ) );
// }
if (blk instanceof BlockCableBus) {
return ((BlockCableBus) blk).recolorBlock(w, pos, side, newColor.dye, p); return ((BlockCableBus) blk).recolorBlock(w, pos, side, newColor.dye, p);
} }
return blk.recolorBlock(state, w, pos, side, newColor.dye); return blk.recolorBlock(state, w, pos, side, newColor.dye);
} }
private static <T extends Comparable<T>> BlockState copyProp(BlockState oldState, BlockState newState,
IProperty<T> prop) {
if (newState.has(prop)) {
return newState.with(prop, oldState.get(prop));
}
return newState;
}
public void cycleColors(final ItemStack is, final ItemStack paintBall, final int i) { public void cycleColors(final ItemStack is, final ItemStack paintBall, final int i) {
if (paintBall.isEmpty()) { if (paintBall.isEmpty()) {
this.setColor(is, this.getColor(is)); this.setColor(is, this.getColor(is));
@@ -407,22 +384,7 @@ public class ToolColorApplicator extends AEBasePoweredItem
@Override @Override
public boolean isBlackListed(final ItemStack cellItem, final IAEItemStack requestedAddition) { public boolean isBlackListed(final ItemStack cellItem, final IAEItemStack requestedAddition) {
if (requestedAddition != null) { if (requestedAddition != null) {
// FIXME final int[] id = OreDictionary.getOreIDs( return getColorFromItem(requestedAddition.getDefinition()) == null;
// requestedAddition.getDefinition() );
// FIXME for( final int x : id )
// FIXME {
// FIXME if( ORE_TO_COLOR.containsKey( x ) )
// FIXME {
// FIXME return false;
// FIXME }
// FIXME }
if (requestedAddition.getItem() instanceof SnowballItem) {
return false;
}
return !(requestedAddition.getItem() instanceof ItemPaintBall && requestedAddition.getItemDamage() < 20);
} }
return true; return true;
} }
@@ -32,6 +32,7 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.item.Items; import net.minecraft.item.Items;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.ActionResultType; import net.minecraft.util.ActionResultType;
@@ -44,6 +45,8 @@ import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.RayTraceContext; import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.common.util.FakePlayer;
import appeng.api.config.Actionable; import appeng.api.config.Actionable;
import appeng.api.util.DimensionalCoord; import appeng.api.util.DimensionalCoord;
@@ -187,9 +190,11 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT
return false; return false;
} }
// Overridden to allow use of the item on WATER and LAVA which are otherwise not
// considered for onItemUse
@Override @Override
public ActionResult<ItemStack> onItemRightClick(final World w, final PlayerEntity p, final Hand hand) { public ActionResult<ItemStack> onItemRightClick(final World w, final PlayerEntity p, final Hand hand) {
final RayTraceResult target = this.rayTrace(w, p, RayTraceContext.FluidMode.ANY); final RayTraceResult target = rayTrace(w, p, RayTraceContext.FluidMode.ANY);
if (target.getType() != RayTraceResult.Type.BLOCK) { if (target.getType() != RayTraceResult.Type.BLOCK) {
return new ActionResult<>(ActionResultType.FAIL, p.getHeldItem(hand)); return new ActionResult<>(ActionResultType.FAIL, p.getHeldItem(hand));
@@ -198,7 +203,8 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT
final BlockState state = w.getBlockState(pos); final BlockState state = w.getBlockState(pos);
if (state.getMaterial() == Material.LAVA || state.getMaterial() == Material.WATER) { if (state.getMaterial() == Material.LAVA || state.getMaterial() == Material.WATER) {
if (Platform.hasPermissions(new DimensionalCoord(w, pos), p)) { if (Platform.hasPermissions(new DimensionalCoord(w, pos), p)) {
this.onItemUse(p, w, pos, hand, Direction.UP, 0.0F, 0.0F, 0.0F); ItemUseContext context = new ItemUseContext(p, hand, (BlockRayTraceResult) target);
this.onItemUse(context);
} }
} }
} }
@@ -207,14 +213,19 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT
} }
@Override @Override
public ActionResultType onItemUse(PlayerEntity p, World w, BlockPos pos, Hand hand, Direction side, float hitX, public ActionResultType onItemUse(ItemUseContext context) {
float hitY, float hitZ) { World w = context.getWorld();
return this.onItemUse(p.getHeldItem(hand), p, w, pos, hand, side, hitX, hitY, hitZ); ItemStack item = context.getItem();
} BlockPos pos = context.getPos();
Direction side = context.getFace();
PlayerEntity p = context.getPlayer();
if (p == null) {
if (w.isRemote) {
return ActionResultType.FAIL;
}
p = Platform.getPlayer((ServerWorld) w);
}
@Override
public ActionResultType onItemUse(ItemStack item, PlayerEntity p, World w, BlockPos pos, Hand hand, Direction side,
float hitX, float hitY, float hitZ) {
if (this.getAECurrentPower(item) > 1600) { if (this.getAECurrentPower(item) > 1600) {
if (!p.canPlayerEdit(pos, side, item)) { if (!p.canPlayerEdit(pos, side, item)) {
return ActionResultType.FAIL; return ActionResultType.FAIL;