fix RiftConfigurationToolItem counter

This commit is contained in:
CreepyCre 2021-02-09 23:34:40 +01:00
parent 0ace3ffa76
commit 25bc8caeab
6 changed files with 138 additions and 15 deletions

View file

@ -1,26 +1,27 @@
package org.dimdev.dimdoors; package org.dimdev.dimdoors;
import net.minecraft.nbt.CompoundTag;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.block.ModBlocks; import org.dimdev.dimdoors.block.ModBlocks;
import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes; import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes;
import org.dimdev.dimdoors.client.ModSkyRendering; import org.dimdev.dimdoors.client.ModSkyRendering;
import org.dimdev.dimdoors.entity.ModEntityTypes; import org.dimdev.dimdoors.entity.ModEntityTypes;
import org.dimdev.dimdoors.entity.MonolithEntity; import org.dimdev.dimdoors.entity.MonolithEntity;
import org.dimdev.dimdoors.fluid.ModFluids; import org.dimdev.dimdoors.fluid.ModFluids;
import org.dimdev.dimdoors.network.s2c.PlayerInventorySlotUpdateS2CPacket;
import org.dimdev.dimdoors.particle.ModParticleTypes; import org.dimdev.dimdoors.particle.ModParticleTypes;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.network.PacketByteBuf;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
import net.fabricmc.fabric.api.networking.v1.PacketSender; import java.io.IOException;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class DimensionalDoorsClientInitializer implements ClientModInitializer { public class DimensionalDoorsClientInitializer implements ClientModInitializer {
private static final Logger LOGGER = LogManager.getLogger();
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
ModEntityTypes.initClient(); ModEntityTypes.initClient();
@ -31,5 +32,18 @@ public class DimensionalDoorsClientInitializer implements ClientModInitializer {
ModParticleTypes.initClient(); ModParticleTypes.initClient();
ClientPlayNetworking.registerGlobalReceiver(DimensionalDoorsInitializer.MONOLITH_PARTICLE_PACKET, (client, networkHandler, buf, sender) -> MonolithEntity.spawnParticles(buf, client)); ClientPlayNetworking.registerGlobalReceiver(DimensionalDoorsInitializer.MONOLITH_PARTICLE_PACKET, (client, networkHandler, buf, sender) -> MonolithEntity.spawnParticles(buf, client));
// TODO: change this to a normal Receiver with the inventory network handler attached. Will have to register/ unregister when a player joins/ leaves a world
ClientPlayNetworking.registerGlobalReceiver(PlayerInventorySlotUpdateS2CPacket.ID, (minecraftClient, clientPlayNetworkHandler, packetByteBuf, packetSender) -> {
PlayerInventorySlotUpdateS2CPacket packet = new PlayerInventorySlotUpdateS2CPacket();
try {
packet.read(packetByteBuf);
minecraftClient.player.inventory.setStack(packet.getSlot(), packet.getStack());
// TODO: remove commented out debug code
//LOGGER.info("Synced slot " + packet.getSlot() + " with item stack " + packet.getStack().toTag(new CompoundTag()));
} catch (IOException e) {
LOGGER.error(e);
}
});
} }
} }

View file

@ -1,8 +1,15 @@
package org.dimdev.dimdoors.item; package org.dimdev.dimdoors.item;
import java.io.IOException;
import java.util.List; import java.util.List;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.DimensionalDoorsInitializer; import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity; import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
@ -20,6 +27,7 @@ import net.minecraft.util.hit.HitResult;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import org.dimdev.dimdoors.network.s2c.PlayerInventorySlotUpdateS2CPacket;
import org.dimdev.dimdoors.rift.targets.IdMarker; import org.dimdev.dimdoors.rift.targets.IdMarker;
import org.dimdev.dimdoors.util.EntityUtils; import org.dimdev.dimdoors.util.EntityUtils;
import org.dimdev.dimdoors.world.level.Counter; import org.dimdev.dimdoors.world.level.Counter;
@ -27,6 +35,7 @@ import org.dimdev.dimdoors.world.level.Counter;
import static net.fabricmc.api.EnvType.CLIENT; import static net.fabricmc.api.EnvType.CLIENT;
public class RiftConfigurationToolItem extends Item { public class RiftConfigurationToolItem extends Item {
private static final Logger LOGGER = LogManager.getLogger();
public static final String ID = "rift_configuration_tool"; public static final String ID = "rift_configuration_tool";
@ -55,7 +64,8 @@ public class RiftConfigurationToolItem extends Item {
EntityUtils.chat(player, Text.of("Id: " + ((IdMarker) rift.getDestination()).getId())); EntityUtils.chat(player, Text.of("Id: " + ((IdMarker) rift.getDestination()).getId()));
} else { } else {
int id = counter.increment(); int id = counter.increment();
EntityUtils.chat(player, Text.of("Rift stripped of data and set to target id: : " + id)); sync(stack, player, hand);
EntityUtils.chat(player, Text.of("Rift stripped of data and set to target id: " + id));
rift.setDestination(new IdMarker(id)); rift.setDestination(new IdMarker(id));
} }
@ -63,7 +73,8 @@ public class RiftConfigurationToolItem extends Item {
return new TypedActionResult<>(ActionResult.SUCCESS, stack); return new TypedActionResult<>(ActionResult.SUCCESS, stack);
} else { } else {
if(player.isSneaking()) { if(player.isSneaking()) {
counter.clear(); counter.set(-1);
sync(stack, player, hand);
EntityUtils.chat(player, Text.of("Counter has been reset.")); EntityUtils.chat(player, Text.of("Counter has been reset."));
} else { } else {
EntityUtils.chat(player, Text.of("Current Count: " + counter.count())); EntityUtils.chat(player, Text.of("Current Count: " + counter.count()));
@ -81,4 +92,28 @@ public class RiftConfigurationToolItem extends Item {
list.add(new TranslatableText(this.getTranslationKey() + ".info")); list.add(new TranslatableText(this.getTranslationKey() + ".info"));
} }
} }
@Override
public ItemStack getDefaultStack() {
ItemStack defaultStack = super.getDefaultStack();
Counter.get(defaultStack).set(-1);
return defaultStack;
}
private void sync(ItemStack stack, PlayerEntity player, Hand hand) {
ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player;
PlayerInventorySlotUpdateS2CPacket packet;
if (hand == Hand.OFF_HAND) {
packet = new PlayerInventorySlotUpdateS2CPacket(45, stack);
} else {
packet = new PlayerInventorySlotUpdateS2CPacket(serverPlayer.inventory.selectedSlot, stack);
}
PacketByteBuf buf = PacketByteBufs.create();
try {
packet.write(buf);
ServerPlayNetworking.send(serverPlayer, PlayerInventorySlotUpdateS2CPacket.ID, buf);
} catch (IOException e) {
LOGGER.error(e);
}
}
} }

View file

@ -0,0 +1,55 @@
package org.dimdev.dimdoors.network.s2c;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.item.ItemStack;
import net.minecraft.network.Packet;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.listener.ClientPlayPacketListener;
import net.minecraft.util.Identifier;
import java.io.IOException;
// TODO: replace ClientPlayPackListener
public class PlayerInventorySlotUpdateS2CPacket implements Packet<ClientPlayPacketListener> {
public static Identifier ID = new Identifier("dimdoors:player_inventory_slot_update");
private int slot;
private ItemStack stack;
public PlayerInventorySlotUpdateS2CPacket() {
this.stack = ItemStack.EMPTY;
}
public PlayerInventorySlotUpdateS2CPacket(int slot, ItemStack stack) {
this.slot = slot;
this.stack = stack;
}
@Override
public void read(PacketByteBuf buf) throws IOException {
slot = buf.readInt();
stack = buf.readItemStack();
}
@Override
public void write(PacketByteBuf buf) throws IOException {
buf.writeInt(slot);
buf.writeItemStack(stack);
}
@Override
public void apply(ClientPlayPacketListener listener) {
// TODO: write method
}
@Environment(EnvType.CLIENT)
public int getSlot() {
return slot;
}
@Environment(EnvType.CLIENT)
public ItemStack getStack() {
return stack;
}
}

View file

@ -7,18 +7,16 @@ import dev.onyxstudios.cca.api.v3.item.ItemComponent;
public class Counter extends ItemComponent { public class Counter extends ItemComponent {
public Counter(ItemStack stack) { public Counter(ItemStack stack) {
super(stack, DimensionalDoorsComponents.COUNTER_COMPONENT_KEY); super(stack, DimensionalDoorsComponents.COUNTER_COMPONENT_KEY);
if (!this.hasTag("counter"))
if(!this.hasTag("counter")) { this.putInt("counter", 0);
this.putInt("counter", -1);
}
} }
public int count() { public int count() {
return getInt("counter"); return getInt("counter");
} }
public void clear() { public void set(int value) {
this.putInt("counter", -1); this.putInt("counter", omitZero(value));
} }
public int increment() { public int increment() {
@ -30,4 +28,23 @@ public class Counter extends ItemComponent {
public static <T> Counter get(T provider) { public static <T> Counter get(T provider) {
return DimensionalDoorsComponents.COUNTER_COMPONENT_KEY.get(provider); return DimensionalDoorsComponents.COUNTER_COMPONENT_KEY.get(provider);
} }
@Override
protected void putInt(String key, int value) {
super.putInt(key, omitZero(value));
}
@Override
protected int getInt(String key) {
return withZero(super.getInt(key));
}
private int omitZero(int value) {
return value >= 0 ? value + 1 : value;
}
private int withZero(int value) {
return value > 0 ? value - 1 : value;
}
} }

View file

@ -17,7 +17,7 @@
"type": "dimdoors:shell" "type": "dimdoors:shell"
}, },
{ {
"door_type": "dimdoors:iron_dimensional_door", "door_type": "dimdoors:quartz_dimensional_door",
"x": "width/2", "x": "width/2",
"facing": "north", "facing": "north",
"y": "5", "y": "5",

View file

@ -35,6 +35,8 @@
"id": 0 "id": 0
} }
], ],
"offset_x": "5",
"offset_y": "5", "offset_y": "5",
"offset_z": "5",
"height": "5 + 16 * min(15, public_size)" "height": "5 + 16 * min(15, public_size)"
} }