ViaFabric/viafabric-mc18/src/main/java/com/viaversion/fabric/mc18/providers/VRHandItemProvider.java

79 lines
2.9 KiB
Java

package com.viaversion.fabric.mc18.providers;
import com.viaversion.fabric.mc18.ViaFabric;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.item.DataItem;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.legacyfabric.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.legacyfabric.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.server.MinecraftServer;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class VRHandItemProvider extends HandItemProvider {
public final Map<UUID, Item> serverPlayers = new ConcurrentHashMap<>();
public Item clientItem = null;
@Override
public Item getHandItem(UserConnection info) {
Item serverItem;
if (info.isClientSide()) {
return getClientItem();
} else if ((serverItem = serverPlayers.get(info.getProtocolInfo().getUuid())) != null) {
return new DataItem(serverItem);
}
return super.getHandItem(info);
}
private Item getClientItem() {
if (clientItem == null) {
return new DataItem(0, (byte) 0, (short) 0, null);
}
return new DataItem(clientItem);
}
@Environment(EnvType.CLIENT)
public void registerClientTick() {
try {
ClientTickEvents.END_WORLD_TICK.register(world -> tickClient());
} catch (NoClassDefFoundError ignored1) {
ViaFabric.JLOGGER.info("Fabric Lifecycle V1 isn't installed");
}
}
public void registerServerTick() {
try {
ServerTickEvents.END_SERVER_TICK.register(this::tickServer);
} catch (NoClassDefFoundError ignored1) {
ViaFabric.JLOGGER.info("Fabric Lifecycle V1 isn't installed");
}
}
private void tickClient() {
ClientPlayerEntity p = MinecraftClient.getInstance().player;
if (p != null) {
clientItem = fromNative(p.inventory.getMainHandStack());
}
}
private void tickServer(MinecraftServer server) {
serverPlayers.clear();
server.getPlayerManager().getPlayers().forEach(it -> serverPlayers
.put(it.getUuid(), fromNative(it.inventory.getMainHandStack())));
}
private Item fromNative(ItemStack original) {
if (original == null) return new DataItem(0, (byte) 0, (short) 0, null);
int id = net.minecraft.item.Item.getRawId(original.getItem());
return new DataItem(id, (byte) original.count, (short) original.getDamage(), null);
}
}