Skip to content

Commit

Permalink
fix: fabricated gate drops not containing NBT data
Browse files Browse the repository at this point in the history
  • Loading branch information
MrTJP committed Apr 8, 2024
1 parent 3e0dd85 commit a3abc56
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import mrtjp.projectred.fabrication.item.FabricatedGatePartItem;
import mrtjp.projectred.fabrication.part.FabricatedGatePart;
import mrtjp.projectred.integration.GateType;
import mrtjp.projectred.integration.item.GatePartItem;
import mrtjp.projectred.integration.part.GatePart;
import net.minecraftforge.registries.RegistryObject;

Expand All @@ -17,7 +16,7 @@ public class FabricationParts {

public static final String ID_FABRICATED_GATE = "fabricated_gate";

public static RegistryObject<GatePartItem> FABRICATED_GATE_ITEM;
public static RegistryObject<FabricatedGatePartItem> FABRICATED_GATE_ITEM;
public static RegistryObject<MultipartType<GatePart>> FABRICATED_GATE_PART;

public static void register() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package mrtjp.projectred.fabrication.item;

import mrtjp.projectred.integration.GateType;
import mrtjp.projectred.integration.item.GatePartItem;
import mrtjp.projectred.integration.item.BaseGatePartItem;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.Nullable;

import java.util.List;

public class FabricatedGatePartItem extends GatePartItem {
public class FabricatedGatePartItem extends BaseGatePartItem {

public FabricatedGatePartItem(GateType gateType) {
super(gateType);
super(new Item.Properties(), gateType); // No creative tab
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,63 @@

import codechicken.lib.data.MCDataInput;
import codechicken.lib.data.MCDataOutput;
import codechicken.multipart.util.MultipartPlaceContext;
import mrtjp.fengine.api.ICFlatMap;
import mrtjp.projectred.core.BundledSignalsLib;
import mrtjp.projectred.fabrication.editor.EditorDataUtils;
import mrtjp.projectred.fabrication.engine.ICSimulationContainer;
import mrtjp.projectred.fabrication.engine.InterfaceSpec;
import mrtjp.projectred.fabrication.engine.PRFabricationEngine;
import mrtjp.projectred.integration.GateType;
import mrtjp.projectred.integration.part.BundledGatePart;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;

import javax.annotation.Nullable;
import java.util.Objects;

import static mrtjp.projectred.fabrication.ProjectRedFabrication.LOGGER;
import static mrtjp.projectred.fabrication.editor.EditorDataUtils.*;

public class FabricatedGatePart extends BundledGatePart {

private final ICSimulationContainer simulationContainer = new ICSimulationContainer();
private String icName = "untitled";
private final InterfaceSpec ifSpec = new InterfaceSpec();

private CompoundTag itemStackTag = new CompoundTag();
private String icName = "untitled";
private long simulationTimeStart = -1L;

public FabricatedGatePart() {
super(GateType.FABRICATED_GATE);
}

@Override
public void preparePlacement(@Nullable Player player, BlockPos pos, int side) {
super.preparePlacement(player, pos, side);
public boolean preparePlacement(MultipartPlaceContext context) {

if (!super.preparePlacement(context)) return false;

if (player == null || player.level.isClientSide) return;
if (context.getPlayer() == null || context.getPlayer().getLevel().isClientSide()) return false;

ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); // TODO handle offhand
ItemStack stack = context.getItemInHand();
if (stack.isEmpty() || !stack.hasTag()) {
LOGGER.warn("Gate placement issue: no NBT on gate item");
return;
return false;
}

CompoundTag tag = stack.getTag();
if (tag != null) {
icName = tag.getString(KEY_IC_NAME);
ICFlatMap flatMap = PRFabricationEngine.instance.deserializeFlatMap(tag.getString(KEY_FLAT_MAP));
simulationContainer.setFlatMap(flatMap);
ifSpec.loadFrom(tag, KEY_IO_SPEC);
if (!EditorDataUtils.hasFabricationTarget(tag)) {
LOGGER.warn("Gate placement issue: no fabrication target in gate item");
return false;
}

itemStackTag = EditorDataUtils.createFabricationCopy(tag);
icName = tag.getString(KEY_IC_NAME);
ICFlatMap flatMap = PRFabricationEngine.instance.deserializeFlatMap(tag.getString(KEY_FLAT_MAP));
simulationContainer.setFlatMap(flatMap);
ifSpec.loadFrom(tag, KEY_IO_SPEC);

return true;
}

@Override
Expand All @@ -74,20 +82,24 @@ public void load(CompoundTag tag) {
@Override
public void writeDesc(MCDataOutput packet) {
super.writeDesc(packet);
packet.writeCompoundNBT(itemStackTag); // Client needs tag for pick-blcok
packet.writeString(icName);
ifSpec.writeDesc(packet);
}

@Override
public void readDesc(MCDataInput packet) {
super.readDesc(packet);
itemStackTag = Objects.requireNonNullElse(packet.readCompoundNBT(), new CompoundTag());
icName = packet.readString();
ifSpec.readDesc(packet);
}

@Override
public ItemStack getItem() {
return super.getItem(); //TODO set nbt on this item
ItemStack stack = super.getItem();
stack.setTag(itemStackTag);
return stack;
}

//region RedstoneGatePart overrides
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import codechicken.lib.util.TransformUtils;
import codechicken.lib.vec.RedundantTransformation;
import com.mojang.blaze3d.vertex.PoseStack;
import mrtjp.projectred.integration.item.GatePartItem;
import mrtjp.projectred.integration.item.BaseGatePartItem;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.ItemTransforms;
Expand Down Expand Up @@ -40,7 +40,7 @@ public boolean usesBlockLight() {
@Override
public void renderItem(ItemStack stack, ItemTransforms.TransformType transformType, PoseStack mStack, MultiBufferSource getter, int packedLight, int packedOverlay) {

if (!(stack.getItem() instanceof GatePartItem gateItem)) return;
if (!(stack.getItem() instanceof BaseGatePartItem gateItem)) return;

CCRenderState ccrs = CCRenderState.instance();
ccrs.reset();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package mrtjp.projectred.integration.item;

import codechicken.multipart.api.ItemMultipart;
import codechicken.multipart.api.part.MultiPart;
import codechicken.multipart.util.MultipartPlaceContext;
import mrtjp.projectred.core.PlacementLib;
import mrtjp.projectred.integration.GateType;
import mrtjp.projectred.integration.part.GatePart;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;

public abstract class BaseGatePartItem extends ItemMultipart {

protected final GateType gateType;

public BaseGatePartItem(Properties properties, GateType gateType) {
super(properties);
this.gateType = gateType;
}

public GateType getGateType() {
return gateType;
}

@Override
public MultiPart newPart(MultipartPlaceContext context) {
Direction side = context.getClickedFace();
BlockPos onPos = context.getClickedPos().relative(side.getOpposite());
if (!PlacementLib.canPlaceGateOnSide(context.getLevel(), onPos, side)) {
return null;
}
GatePart gatePart = gateType.newPart();
if (!gatePart.preparePlacement(context)) {
return null;
}
return gatePart;
}
}
Original file line number Diff line number Diff line change
@@ -1,38 +1,13 @@
package mrtjp.projectred.integration.item;

import codechicken.multipart.api.ItemMultipart;
import codechicken.multipart.api.part.MultiPart;
import codechicken.multipart.util.MultipartPlaceContext;
import mrtjp.projectred.core.PlacementLib;
import mrtjp.projectred.integration.GateType;
import mrtjp.projectred.integration.ProjectRedIntegration;
import mrtjp.projectred.integration.part.GatePart;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.item.Item;

public class GatePartItem extends ItemMultipart {

private final GateType gateType;
public class GatePartItem extends BaseGatePartItem {

public GatePartItem(GateType gateType) {
super(new Item.Properties().tab(ProjectRedIntegration.CREATIVE_TAB));
this.gateType = gateType;
}

public GateType getGateType() {
return gateType;
super(new Item.Properties().tab(ProjectRedIntegration.CREATIVE_TAB), gateType);
}

@Override
public MultiPart newPart(MultipartPlaceContext context) {
Direction side = context.getClickedFace();
BlockPos onPos = context.getClickedPos().relative(side.getOpposite());
if (!PlacementLib.canPlaceGateOnSide(context.getLevel(), onPos, side)) {
return null;
}
GatePart gatePart = gateType.newPart();
gatePart.preparePlacement(context.getPlayer(), onPos, side.ordinal());
return gatePart;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import codechicken.multipart.api.part.MultiPart;
import codechicken.multipart.api.part.redstone.FaceRedstonePart;
import codechicken.multipart.block.BlockMultipart;
import codechicken.multipart.util.MultipartPlaceContext;
import com.google.common.collect.ImmutableSet;
import mrtjp.projectred.api.IConnectable;
import mrtjp.projectred.core.Configurator;
Expand All @@ -21,7 +22,6 @@
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.RedStoneWireBlock;
import net.minecraft.world.phys.shapes.CollisionContext;
Expand Down Expand Up @@ -252,18 +252,22 @@ public int weakPowerLevel(int side) {
//endregion

//region Multipart properties

@Override
public void preparePlacement(@Nullable Player player, BlockPos pos, int side) {
super.preparePlacement(player, pos, side);
if (canCross() && player != null) {
public boolean preparePlacement(MultipartPlaceContext context) {
if (!super.preparePlacement(context)) return false;

if (canCross() && context.getPlayer() != null) {
BlockPos onPos = context.getClickedPos().relative(context.getClickedFace().getOpposite());
// Note: tile() is not available yet, must access from player.level
MultiPart tpart = BlockMultipart.getPart(player.level, pos, getSide()^1);
MultiPart tpart = BlockMultipart.getPart(context.getPlayer().getLevel(), onPos, getSide()^1);
if (tpart instanceof ArrayGatePart part) {
if (part.getGateType() == getGateType() && (part.getRotation() & 1) == (getRotation() & 1)) {
setRotation((getRotation() + 1) % 4);
}
}
}
return true;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import codechicken.multipart.api.MultipartType;
import codechicken.multipart.api.part.*;
import codechicken.multipart.block.TileMultipart;
import codechicken.multipart.util.MultipartPlaceContext;
import codechicken.multipart.util.PartRayTraceResult;
import com.google.common.collect.ImmutableSet;
import mrtjp.projectred.api.IConnectable;
Expand Down Expand Up @@ -80,9 +81,11 @@ public GatePart(GateType type) {
this.type = type;
}

public void preparePlacement(@Nullable Player player, BlockPos pos, int side) {
public boolean preparePlacement(MultipartPlaceContext context) {
int side = context.getClickedFace().ordinal();
setSide(side ^ 1);
setRotation(player == null ? 0 : (Rotation.getSidedRotation(player, side) + 2) % 4);
setRotation(context.getPlayer() == null ? 0 : (Rotation.getSidedRotation(context.getPlayer(), side) + 2) % 4);
return true;
}

public final GateType getGateType() {
Expand Down

0 comments on commit a3abc56

Please sign in to comment.