110 lines
3.6 KiB
Java
110 lines
3.6 KiB
Java
package appeng.debug;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import net.minecraft.block.entity.BlockEntity;
|
|
import net.minecraft.entity.player.PlayerEntity;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.item.ItemUsageContext;
|
|
import net.minecraft.text.LiteralText;
|
|
import net.minecraft.util.ActionResult;
|
|
import net.minecraft.util.Util;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.util.math.Direction;
|
|
import net.minecraft.util.math.Vec3i;
|
|
import net.minecraft.util.registry.Registry;
|
|
import net.minecraft.world.World;
|
|
|
|
import appeng.api.parts.IPart;
|
|
import appeng.api.parts.IPartHost;
|
|
import appeng.api.parts.PartItemStack;
|
|
import appeng.api.util.AEPartLocation;
|
|
import appeng.hooks.AEToolItem;
|
|
import appeng.items.AEBaseItem;
|
|
import appeng.items.parts.ColoredPartItem;
|
|
import appeng.items.parts.PartItem;
|
|
|
|
/**
|
|
* This tool will try to place anything that is registered as a {@link PartItem}
|
|
* (and not a colored one) onto an existing cable to quickly test parts and
|
|
* their rendering.
|
|
*/
|
|
public class DebugPartPlacerItem extends AEBaseItem implements AEToolItem {
|
|
|
|
public DebugPartPlacerItem(Settings properties) {
|
|
super(properties);
|
|
}
|
|
|
|
@Override
|
|
public ActionResult onItemUseFirst(ItemStack stack, ItemUsageContext context) {
|
|
World world = context.getWorld();
|
|
if (world.isClient()) {
|
|
return ActionResult.PASS;
|
|
}
|
|
|
|
PlayerEntity player = context.getPlayer();
|
|
BlockPos pos = context.getBlockPos();
|
|
|
|
if (player == null) {
|
|
return ActionResult.PASS;
|
|
}
|
|
|
|
if (!player.isCreative()) {
|
|
player.sendSystemMessage(new LiteralText("Only usable in creative mode"), Util.NIL_UUID);
|
|
return ActionResult.FAIL;
|
|
}
|
|
|
|
BlockEntity te = world.getBlockEntity(pos);
|
|
if (!(te instanceof IPartHost)) {
|
|
player.sendSystemMessage(new LiteralText("Right-click something that will accept parts"), Util.NIL_UUID);
|
|
return ActionResult.FAIL;
|
|
}
|
|
IPartHost center = (IPartHost) te;
|
|
IPart cable = center.getPart(AEPartLocation.INTERNAL);
|
|
if (cable == null) {
|
|
player.sendSystemMessage(new LiteralText("Clicked part host must have an INSIDE part"), Util.NIL_UUID);
|
|
return ActionResult.FAIL;
|
|
}
|
|
|
|
Direction face = context.getSide();
|
|
Vec3i offset = face.getVector();
|
|
Direction[] perpendicularFaces = Arrays.stream(Direction.values()).filter(d -> d.getAxis() != face.getAxis())
|
|
.toArray(Direction[]::new);
|
|
|
|
BlockPos nextPos = pos;
|
|
for (Item item : Registry.ITEM) {
|
|
if (!(item instanceof PartItem)) {
|
|
continue;
|
|
}
|
|
|
|
if (item instanceof ColoredPartItem) {
|
|
continue; // Cables and such
|
|
}
|
|
|
|
nextPos = nextPos.add(offset);
|
|
if (!world.setBlockState(nextPos, te.getCachedState())) {
|
|
continue;
|
|
}
|
|
|
|
BlockEntity t = world.getBlockEntity(nextPos);
|
|
if (!(t instanceof IPartHost)) {
|
|
continue;
|
|
}
|
|
|
|
IPartHost partHost = (IPartHost) t;
|
|
if (partHost.addPart(cable.getItemStack(PartItemStack.PICK), AEPartLocation.INTERNAL, player,
|
|
null) == null) {
|
|
continue;
|
|
}
|
|
for (Direction dir : perpendicularFaces) {
|
|
ItemStack itemStack = new ItemStack(item, 1);
|
|
partHost.addPart(itemStack, AEPartLocation.fromFacing(dir), player, null);
|
|
}
|
|
}
|
|
|
|
return ActionResult.SUCCESS;
|
|
}
|
|
|
|
}
|