Jump to content

Recommended Posts

Posted

Hi, I'm currently working on a project and got into a small problem. I try to change a value that is saved in the player using the ExtendedEntityProperties stuff, inside a gui. The only I am having is that the way I am doing it, I only change the values on the client side which makes a lot of problems. So I was wondering how I can fix this problem, is there something missing in my packet or something or do I need a new one?

 

Here is all the classes I am using for it:

 

Mod class:

 

package com.xetosphere.pantheon.entity;

import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.IExtendedEntityProperties;

import com.xetosphere.pantheon.PantheonCraft;
import com.xetosphere.pantheon.lib.Reference;
import com.xetosphere.pantheon.network.packet.SyncPlayerPropsPacket;
import com.xetosphere.pantheon.proxy.CommonProxy;

public class ExtendedPlayer implements IExtendedEntityProperties {

public static final String IDENTIFIER = Reference.MOD_ID + "_properties";

private final EntityPlayer player;

private int culture, maxCulture, pantheonId;

private String pantheon;

public static final int CULTURE_WATCHER = 25;
public static final int PANTHEON_WATCHER = 26;
public static final int ID_WATCHER = 27;

public ExtendedPlayer(EntityPlayer player) {

	this.player = player;
	culture = 0;
	maxCulture = 1000;
	pantheon = "None";
	pantheonId = 1;
	player.getDataWatcher().addObject(CULTURE_WATCHER, culture);
	player.getDataWatcher().addObject(PANTHEON_WATCHER, pantheon);
	player.getDataWatcher().addObject(ID_WATCHER, pantheonId);
}

public static final void register(EntityPlayer player) {

	player.registerExtendedProperties(IDENTIFIER, new ExtendedPlayer(player));
}

public static final ExtendedPlayer get(EntityPlayer player) {

	return (ExtendedPlayer) player.getExtendedProperties(IDENTIFIER);
}

@Override
public void saveNBTData(NBTTagCompound compound) {

	NBTTagCompound properties = new NBTTagCompound();
	properties.setInteger("Culture", player.getDataWatcher().getWatchableObjectInt(CULTURE_WATCHER));
	properties.setInteger("MaxCulture", maxCulture);
	properties.setString("Pantheon", player.getDataWatcher().getWatchableObjectString(PANTHEON_WATCHER));
	properties.setInteger("IdPantheon", player.getDataWatcher().getWatchableObjectInt(ID_WATCHER));
	compound.setTag(IDENTIFIER, properties);
}

@Override
public void loadNBTData(NBTTagCompound compound) {

	NBTTagCompound properties = (NBTTagCompound) compound.getTag(IDENTIFIER);
	player.getDataWatcher().updateObject(CULTURE_WATCHER, properties.getInteger("Culture"));
	maxCulture = properties.getInteger("MaxCulture");
	player.getDataWatcher().updateObject(PANTHEON_WATCHER, properties.getString("Pantheon"));
	player.getDataWatcher().updateObject(ID_WATCHER, properties.getInteger("IdPantheon"));
	System.out.println("[XETOPC PROPS] Culture from NBT: " + player.getDataWatcher().getWatchableObjectInt(CULTURE_WATCHER) + "/" + maxCulture);
	System.out.println("[XETOPC PROPS] Pantheon from NBT: [iD = " + player.getDataWatcher().getWatchableObjectInt(ID_WATCHER) + "] " + player.getDataWatcher().getWatchableObjectString(PANTHEON_WATCHER));
}

@Override
public void init(Entity entity, World world) {
}

public final boolean consumeCulture(int amount) {
	boolean sufficient = amount <= getCulture();
	setCulture(getCulture() - amount);
	return sufficient;
}

public final int getCulture() {

	return player.getDataWatcher().getWatchableObjectInt(CULTURE_WATCHER);
}

public final String getPantheon() {

	return player.getDataWatcher().getWatchableObjectString(PANTHEON_WATCHER);
}

public final int getPantheonId() {

	return player.getDataWatcher().getWatchableObjectInt(ID_WATCHER);
}

public final void setCulture(int amount) {

	player.getDataWatcher().updateObject(CULTURE_WATCHER, amount > 0 ? (amount < maxCulture ? amount : maxCulture) : 0);
}

public final void setPantheon(String pantheon) {

	player.getDataWatcher().updateObject(PANTHEON_WATCHER, pantheon);
}

public final void setPantheonId(int id) {

	player.getDataWatcher().updateObject(ID_WATCHER, id);
}

public final int getMaxCulture() {

	return maxCulture;
}

public final void setMaxCulture(int amount) {

	maxCulture = (amount > 0 ? amount : 0);
	PantheonCraft.packetPipeline.sendTo(new SyncPlayerPropsPacket(player), (EntityPlayerMP) player);
}

private static final String getSaveKey(EntityPlayer player) {

	return player.getCommandSenderName() + ":" + IDENTIFIER;
}

public static final void saveProxyData(EntityPlayer player) {

	NBTTagCompound savedData = new NBTTagCompound();
	ExtendedPlayer.get(player).saveNBTData(savedData);
	CommonProxy.storeEntityData(getSaveKey(player), savedData);
}

public static final void loadProxyData(EntityPlayer player) {

	ExtendedPlayer playerData = ExtendedPlayer.get(player);
	NBTTagCompound savedData = CommonProxy.getEntityData(getSaveKey(player));
	if (savedData != null) {
		playerData.loadNBTData(savedData);
	}

	PantheonCraft.packetPipeline.sendTo(new SyncPlayerPropsPacket(player), (EntityPlayerMP) player);
}

}

 

 

 

ItemTalisman class:

 

package com.xetosphere.pantheon.item;

import net.minecraft.entity.effect.EntityLightningBolt;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;

import org.lwjgl.input.Keyboard;

import com.xetosphere.pantheon.PantheonCraft;
import com.xetosphere.pantheon.entity.ExtendedPlayer;
import com.xetosphere.pantheon.lib.GuiIds;

public class ItemTalisman extends ItemPC {

public ItemTalisman() {

}

public ItemTalisman(EntityPlayer player) {

}

public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {

	String pantheon = ExtendedPlayer.get(player).getPantheon();

	final double EYE_HEIGHT = 1.62;
	final double REACH_DISTANCE = 300;

	Vec3 startPos = player.getPosition(1.0F);

	if (!world.isRemote) startPos = startPos.addVector(0, EYE_HEIGHT, 0);

	Vec3 look = player.getLook(1.0F);
	Vec3 endPos = startPos.addVector(look.xCoord * REACH_DISTANCE, look.yCoord * REACH_DISTANCE, look.zCoord * REACH_DISTANCE);

	MovingObjectPosition objectMouseOver = world.rayTraceBlocks(startPos, endPos);

	if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {

		if (world.isRemote) {

			player.openGui(PantheonCraft.instance, GuiIds.RELIGION_GUI, world, (int) player.posX, (int) player.posY, (int) player.posZ);
		}

	}

	// TODO Greek
	if (pantheon.equals("Greek") && !Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {

		if (ExtendedPlayer.get(player).getCulture() >= 100 && objectMouseOver != null && objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {

			ExtendedPlayer.get(player).consumeCulture(100);

			int i = objectMouseOver.blockX;
			int j = objectMouseOver.blockY;
			int k = objectMouseOver.blockZ;

			player.addChatComponentMessage(new ChatComponentText("This is ran. Greek"));

			world.spawnEntityInWorld(new EntityLightningBolt(world, i, j, k));

		} else {

			if (!world.isRemote) {

				player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
				ExtendedPlayer.get(player).setCulture(100);
			}
		}
	}

	// TODO Norse
	if (pantheon.equals("Norse") && !Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {

		if (ExtendedPlayer.get(player).getCulture() >= 100) {

			ExtendedPlayer.get(player).consumeCulture(100);
			player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 2400, 0, false));
			player.addChatComponentMessage(new ChatComponentText("This is ran. Norse"));

		} else {

			if (!world.isRemote) {

				player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
				ExtendedPlayer.get(player).setCulture(100);
			}
		}
	}

	// TODO Roman
	if (pantheon.equals("Roman") && !Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {

		if (ExtendedPlayer.get(player).getCulture() >= 100 && objectMouseOver != null && objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {
			ExtendedPlayer.get(player).consumeCulture(100);

			int i = objectMouseOver.blockX;
			int j = objectMouseOver.blockY;
			int k = objectMouseOver.blockZ;
			player.addChatComponentMessage(new ChatComponentText("This is ran. Roman"));

			if (!world.isRemote) world.createExplosion(player, i, j, k, 5, true);

		} else {

			if (!world.isRemote) {

				player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
				ExtendedPlayer.get(player).setCulture(100);
			}
		}
	}

	// TODO Egyptian
	if (pantheon.equals("Egyptian") && !Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {

		if (ExtendedPlayer.get(player).getCulture() >= 100) {

			ExtendedPlayer.get(player).consumeCulture(100);
			player.addPotionEffect(new PotionEffect(Potion.nightVision.id, 2400, 0, false));
			player.addChatComponentMessage(new ChatComponentText("This is ran. Egyptian"));

		} else {

			if (!world.isRemote) {

				player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
				ExtendedPlayer.get(player).setCulture(100);
			}
		}
	}

	return itemStack;
}
}

 

 

 

GuiReligion class:

 

package com.xetosphere.pantheon.client.gui;

import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ChatComponentText;

import org.lwjgl.opengl.GL11;

import com.xetosphere.pantheon.entity.ExtendedPlayer;
import com.xetosphere.pantheon.lib.Textures;

public class GuiReligion extends GuiScreen {

private int xSize = 176;

private int ySize = 166;

EntityPlayer player;

private String[] pantheons = { "None", "Greek", "Norse", "Roman", "Egyptian" };

public GuiReligion(EntityPlayer player) {

	this.player = player;
}

public void updateScreen() {
	super.updateScreen();
}

public void drawScreen(int x, int y, float f) {

	drawDefaultBackground();

	GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

	mc.getTextureManager().bindTexture(Textures.GUI_RELIGION);

	int posX = (width - xSize) / 2;
	int posY = (height - ySize) / 2;

	drawTexturedModalRect(posX, posY, 0, 0, xSize, ySize);
	drawCenteredString(fontRendererObj, ExtendedPlayer.get(player).getPantheon(), posX + (xSize / 4 * 3), posY + 15, 0xffffffff);

	super.drawScreen(x, y, f);
}

public boolean doesGuiPauseGame() {

	return false;
}

@SuppressWarnings("unchecked")
public void initGui() {

	this.buttonList.clear();

	int posX = (width - xSize) / 2;
	int posY = (height - ySize) / 2;

	this.buttonList.add(new GuiButton(0, posX + 10, posY + 10, 50, 20, pantheons[0]));
	this.buttonList.add(new GuiButton(1, posX + 10, posY + 40, 50, 20, pantheons[1]));
	this.buttonList.add(new GuiButton(2, posX + 10, posY + 70, 50, 20, pantheons[2]));
	this.buttonList.add(new GuiButton(3, posX + 10, posY + 100, 50, 20, pantheons[3]));
	this.buttonList.add(new GuiButton(4, posX + 10, posY + 130, 50, 20, pantheons[4]));
}

public void actionPerformed(GuiButton button) {

	switch (button.id) {
		case 0:
			ExtendedPlayer.get(player).setPantheon(pantheons[0]);
			ExtendedPlayer.get(player).setPantheonId(0);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			break;
		case 1:
			ExtendedPlayer.get(player).setPantheon(pantheons[1]);
			ExtendedPlayer.get(player).setPantheonId(1);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			break;
		case 2:
			ExtendedPlayer.get(player).setPantheon(pantheons[2]);
			ExtendedPlayer.get(player).setPantheonId(2);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			break;
		case 3:
			ExtendedPlayer.get(player).setPantheon(pantheons[3]);
			ExtendedPlayer.get(player).setPantheonId(3);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			break;
		case 4:
			ExtendedPlayer.get(player).setPantheon(pantheons[4]);
			ExtendedPlayer.get(player).setPantheonId(4);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			break;
	}
}
}

 

 

 

PacketPipeline class:

 

package com.xetosphere.pantheon.network;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;

import java.util.Collections;
import java.util.Comparator;
import java.util.EnumMap;
import java.util.LinkedList;
import java.util.List;

import com.xetosphere.pantheon.lib.Reference;
import com.xetosphere.pantheon.network.packet.SyncPlayerPropsPacket;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.INetHandler;
import net.minecraft.network.NetHandlerPlayServer;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.network.FMLEmbeddedChannel;
import cpw.mods.fml.common.network.FMLOutboundHandler;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.internal.FMLProxyPacket;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

@ChannelHandler.Sharable
public class PacketPipeline extends MessageToMessageCodec<FMLProxyPacket, AbstractPacket> {

private EnumMap<Side, FMLEmbeddedChannel> channels;
private LinkedList<Class<? extends AbstractPacket>> packets = new LinkedList<Class<? extends AbstractPacket>>();
private boolean isPostInitialised = false;

public boolean registerPacket(Class<? extends AbstractPacket> clazz) {

	if (this.packets.size() > 256) {

		return false;
	}

	if (this.packets.contains(clazz)) {

		return false;
	}

	if (this.isPostInitialised) {

		return false;
	}

	this.packets.add(clazz);
	return true;
}

protected void encode(ChannelHandlerContext ctx, AbstractPacket msg, List<Object> out) throws Exception {

	ByteBuf buffer = Unpooled.buffer();
	Class<? extends AbstractPacket> clazz = msg.getClass();

	if (!this.packets.contains(msg.getClass())) {

		throw new NullPointerException("No Packet Registered for: " + msg.getClass().getCanonicalName());
	}

	byte discriminator = (byte) this.packets.indexOf(clazz);
	buffer.writeByte(discriminator);
	msg.encodeInto(ctx, buffer);
	FMLProxyPacket proxyPacket = new FMLProxyPacket(buffer.copy(), ctx.channel().attr(NetworkRegistry.FML_CHANNEL).get());
	out.add(proxyPacket);
}

@Override
protected void decode(ChannelHandlerContext ctx, FMLProxyPacket msg, List<Object> out) throws Exception {

	ByteBuf payload = msg.payload();
	byte discriminator = payload.readByte();
	Class<? extends AbstractPacket> clazz = this.packets.get(discriminator);

	if (clazz == null) {

		throw new NullPointerException("No packet registered for discriminator: " + discriminator);
	}

	AbstractPacket pkt = clazz.newInstance();
	pkt.decodeInto(ctx, payload.slice());

	EntityPlayer player;
	switch (FMLCommonHandler.instance().getEffectiveSide()) {
		case CLIENT:
			player = this.getClientPlayer();
			pkt.handleClientSide(player);
			break;

		case SERVER:
			INetHandler netHandler = ctx.channel().attr(NetworkRegistry.NET_HANDLER).get();
			player = ((NetHandlerPlayServer) netHandler).playerEntity;
			pkt.handleServerSide(player);
			break;

		default:
	}

	out.add(pkt);
}

public void initialise() {

	this.channels = NetworkRegistry.INSTANCE.newChannel(Reference.MOD_ID, this);
	registerPackets();
}

public void registerPackets() {

	registerPacket(SyncPlayerPropsPacket.class);
}

public void postInitialise() {

	if (this.isPostInitialised) {

		return;
	}

	this.isPostInitialised = true;
	Collections.sort(this.packets, new Comparator<Class<? extends AbstractPacket>>() {

		@Override
		public int compare(Class<? extends AbstractPacket> clazz1, Class<? extends AbstractPacket> clazz2) {

			int com = String.CASE_INSENSITIVE_ORDER.compare(clazz1.getCanonicalName(), clazz2.getCanonicalName());

			if (com == 0) {

				com = clazz1.getCanonicalName().compareTo(clazz2.getCanonicalName());
			}

			return com;
		}
	});
}

@SideOnly(Side.CLIENT)
private EntityPlayer getClientPlayer() {

	return Minecraft.getMinecraft().thePlayer;
}

public void sendToAll(AbstractPacket message) {

	this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL);
	this.channels.get(Side.SERVER).writeAndFlush(message);
}

public void sendTo(AbstractPacket message, EntityPlayerMP player) {

	this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER);
	this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player);
	this.channels.get(Side.SERVER).writeAndFlush(message);
}

public void sendToAllAround(AbstractPacket message, NetworkRegistry.TargetPoint point) {

	this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT);
	this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point);
	this.channels.get(Side.SERVER).writeAndFlush(message);
}

public void sendToDimension(AbstractPacket message, int dimensionId) {

	this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.DIMENSION);
	this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(dimensionId);
	this.channels.get(Side.SERVER).writeAndFlush(message);
}

public void sendToServer(AbstractPacket message) {

	this.channels.get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
	this.channels.get(Side.CLIENT).writeAndFlush(message);
}
}

 

 

 

SyncPlayerPropsPacket class:

 

package com.xetosphere.pantheon.network.packet;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;

import com.xetosphere.pantheon.entity.ExtendedPlayer;
import com.xetosphere.pantheon.network.AbstractPacket;

import cpw.mods.fml.common.network.ByteBufUtils;

public class SyncPlayerPropsPacket extends AbstractPacket {

private NBTTagCompound data;

public SyncPlayerPropsPacket() {
}

public SyncPlayerPropsPacket(EntityPlayer player) {

	data = new NBTTagCompound();
	ExtendedPlayer.get(player).saveNBTData(data);
}

@Override
public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {

	ByteBufUtils.writeTag(buffer, data);
}

@Override
public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {

	data = ByteBufUtils.readTag(buffer);
}

@Override
public void handleClientSide(EntityPlayer player) {

	ExtendedPlayer.get(player).loadNBTData(data);
}

@Override
public void handleServerSide(EntityPlayer player) {
}
}

 

 

 

CultureEventHandler class:

 

package com.xetosphere.pantheon.event;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.event.entity.EntityEvent.EntityConstructing;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.event.entity.living.LivingDeathEvent;

import com.xetosphere.pantheon.entity.ExtendedPlayer;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;

public class CultureEventHandler {

@SubscribeEvent
public void onEntityConstructing(EntityConstructing event) {

	if (event.entity instanceof EntityPlayer) {

		if (ExtendedPlayer.get((EntityPlayer) event.entity) == null)

		ExtendedPlayer.register((EntityPlayer) event.entity);
	}
}

@SubscribeEvent
public void onEntityJoinWorld(EntityJoinWorldEvent event) {

	if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer) {

		ExtendedPlayer.loadProxyData((EntityPlayer) event.entity);
	}
}

@SubscribeEvent
public void onLivingDeathEvent(LivingDeathEvent event) {

	if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer) {

		ExtendedPlayer.saveProxyData((EntityPlayer) event.entity);
	}
}
}

 

 

 

CommonProxy class:

 

package com.xetosphere.pantheon.proxy;

import java.util.HashMap;
import java.util.Map;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;

import com.xetosphere.pantheon.client.gui.GuiReligion;
import com.xetosphere.pantheon.lib.GuiIds;

import cpw.mods.fml.common.network.IGuiHandler;

public class CommonProxy implements IGuiHandler {

private static final Map<String, NBTTagCompound> extendedEntityData = new HashMap<String, NBTTagCompound>();

public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {

	if (id == GuiIds.RELIGION_GUI) {

		return null;
	}

	return null;
}

public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {

	if (id == GuiIds.RELIGION_GUI) {

		return new GuiReligion(player);
	}

	return null;
}

public static void storeEntityData(String name, NBTTagCompound compound) {

	extendedEntityData.put(name, compound);
}

public static NBTTagCompound getEntityData(String name) {

	return extendedEntityData.remove(name);
}
}

 

 

 

ExtendedPlayer class:

 

package com.xetosphere.pantheon.entity;

import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.IExtendedEntityProperties;

import com.xetosphere.pantheon.PantheonCraft;
import com.xetosphere.pantheon.lib.Reference;
import com.xetosphere.pantheon.network.packet.SyncPlayerPropsPacket;
import com.xetosphere.pantheon.proxy.CommonProxy;

public class ExtendedPlayer implements IExtendedEntityProperties {

public static final String IDENTIFIER = Reference.MOD_ID + "_properties";

private final EntityPlayer player;

private int culture, maxCulture, pantheonId;

private String pantheon;

public static final int CULTURE_WATCHER = 25;
public static final int PANTHEON_WATCHER = 26;
public static final int ID_WATCHER = 27;

public ExtendedPlayer(EntityPlayer player) {

	this.player = player;
	culture = 0;
	maxCulture = 1000;
	pantheon = "None";
	pantheonId = 1;
	player.getDataWatcher().addObject(CULTURE_WATCHER, culture);
	player.getDataWatcher().addObject(PANTHEON_WATCHER, pantheon);
	player.getDataWatcher().addObject(ID_WATCHER, pantheonId);
}

public static final void register(EntityPlayer player) {

	player.registerExtendedProperties(IDENTIFIER, new ExtendedPlayer(player));
}

public static final ExtendedPlayer get(EntityPlayer player) {

	return (ExtendedPlayer) player.getExtendedProperties(IDENTIFIER);
}

@Override
public void saveNBTData(NBTTagCompound compound) {

	NBTTagCompound properties = new NBTTagCompound();
	properties.setInteger("Culture", player.getDataWatcher().getWatchableObjectInt(CULTURE_WATCHER));
	properties.setInteger("MaxCulture", maxCulture);
	properties.setString("Pantheon", player.getDataWatcher().getWatchableObjectString(PANTHEON_WATCHER));
	properties.setInteger("IdPantheon", player.getDataWatcher().getWatchableObjectInt(ID_WATCHER));
	compound.setTag(IDENTIFIER, properties);
}

@Override
public void loadNBTData(NBTTagCompound compound) {

	NBTTagCompound properties = (NBTTagCompound) compound.getTag(IDENTIFIER);
	player.getDataWatcher().updateObject(CULTURE_WATCHER, properties.getInteger("Culture"));
	maxCulture = properties.getInteger("MaxCulture");
	player.getDataWatcher().updateObject(PANTHEON_WATCHER, properties.getString("Pantheon"));
	player.getDataWatcher().updateObject(ID_WATCHER, properties.getInteger("IdPantheon"));
	System.out.println("[XETOPC PROPS] Culture from NBT: " + player.getDataWatcher().getWatchableObjectInt(CULTURE_WATCHER) + "/" + maxCulture);
	System.out.println("[XETOPC PROPS] Pantheon from NBT: [iD = " + player.getDataWatcher().getWatchableObjectInt(ID_WATCHER) + "] " + player.getDataWatcher().getWatchableObjectString(PANTHEON_WATCHER));
}

@Override
public void init(Entity entity, World world) {
}

public final boolean consumeCulture(int amount) {
	boolean sufficient = amount <= getCulture();
	setCulture(getCulture() - amount);
	return sufficient;
}

public final int getCulture() {

	return player.getDataWatcher().getWatchableObjectInt(CULTURE_WATCHER);
}

public final String getPantheon() {

	return player.getDataWatcher().getWatchableObjectString(PANTHEON_WATCHER);
}

public final int getPantheonId() {

	return player.getDataWatcher().getWatchableObjectInt(ID_WATCHER);
}

public final void setCulture(int amount) {

	player.getDataWatcher().updateObject(CULTURE_WATCHER, amount > 0 ? (amount < maxCulture ? amount : maxCulture) : 0);
}

public final void setPantheon(String pantheon) {

	player.getDataWatcher().updateObject(PANTHEON_WATCHER, pantheon);
}

public final void setPantheonId(int id) {

	player.getDataWatcher().updateObject(ID_WATCHER, id);
}

public final int getMaxCulture() {

	return maxCulture;
}

public final void setMaxCulture(int amount) {

	maxCulture = (amount > 0 ? amount : 0);
	PantheonCraft.packetPipeline.sendTo(new SyncPlayerPropsPacket(player), (EntityPlayerMP) player);
}

private static final String getSaveKey(EntityPlayer player) {

	return player.getCommandSenderName() + ":" + IDENTIFIER;
}

public static final void saveProxyData(EntityPlayer player) {

	NBTTagCompound savedData = new NBTTagCompound();
	ExtendedPlayer.get(player).saveNBTData(savedData);
	CommonProxy.storeEntityData(getSaveKey(player), savedData);
}

public static final void loadProxyData(EntityPlayer player) {

	ExtendedPlayer playerData = ExtendedPlayer.get(player);
	NBTTagCompound savedData = CommonProxy.getEntityData(getSaveKey(player));
	if (savedData != null) {
		playerData.loadNBTData(savedData);
	}

	PantheonCraft.packetPipeline.sendTo(new SyncPlayerPropsPacket(player), (EntityPlayerMP) player);
}

}

 

 

Posted

First, you're not using extended properties properly. Second, this code will register your Entity data with a null player. Reverse to == to != and it should fix one problem.

public void onEntityConstructing(EntityConstructing event) {
	if (event.entity instanceof EntityPlayer) {
		if (ExtendedPlayer.get((EntityPlayer) event.entity) == null)
		ExtendedPlayer.register((EntityPlayer) event.entity);
	}
}

 

Advice, the init() method is called when entity is created to set the initial properties for the entity. Yours does nothing. (maybe not critical, as the defaults are 0... in the case of objects it another story).

loadNBTData() and saveNBTData() are called on entity spawn (player spawn in this case), and on entity despawn. This is where the data in the ExtendedEntity itself is loaded and saved.

 

DataWatcher is nice only to the extent that it lets you know if the data has changed and communicates it to the other side immediately. However, you need to keep a valid copy in the data fields of this object. (So, when the datawatcher changes, you grab the data and update).

 

Beyond that, I have not looked closely enough to give you an absolute fix. I'll keep looking, though.

Posted

First, you're not using extended properties properly. Second, this code will register your Entity data with a null player. Reverse to == to != and it should fix one problem.

public void onEntityConstructing(EntityConstructing event) {
	if (event.entity instanceof EntityPlayer) {
		if (ExtendedPlayer.get((EntityPlayer) event.entity) == null)
		ExtendedPlayer.register((EntityPlayer) event.entity);
	}
}

 

Advice, the init() method is called when entity is created to set the initial properties for the entity. Yours does nothing. (maybe not critical, as the defaults are 0... in the case of objects it another story).

loadNBTData() and saveNBTData() are called on entity spawn (player spawn in this case), and on entity despawn. This is where the data in the ExtendedEntity itself is loaded and saved.

 

DataWatcher is nice only to the extent that it lets you know if the data has changed and communicates it to the other side immediately. However, you need to keep a valid copy in the data fields of this object. (So, when the datawatcher changes, you grab the data and update).

 

Beyond that, I have not looked closely enough to give you an absolute fix. I'll keep looking, though.

No, I am pretty sure what that code does is, if the player haven't been registered yet then register it. Other than that thank you for replying and helping me out. (btw if I use != it just crashes when the player joins the world)
Posted

Dude you have it as == the guy just said make it != and you say I can't make it == it crashes.

No, what I meant to say is that when I have it as "!=" it crashes when I open the world. I get a nullpointer exception when using "!=".

 

Crashlog:

 

[13:29:11] [server thread/INFO]: Xetosphere joined the game

[13:29:11] [server thread/ERROR] [FML]: HandshakeCompletionHandler exception

java.lang.NullPointerException

at com.xetosphere.pantheon.network.packet.SyncPlayerPropsPacket.<init>(SyncPlayerPropsPacket.java:23) ~[syncPlayerPropsPacket.class:?]

at com.xetosphere.pantheon.entity.ExtendedPlayer.loadProxyData(ExtendedPlayer.java:146) ~[ExtendedPlayer.class:?]

at com.xetosphere.pantheon.event.CultureEventHandler.onEntityJoinWorld(CultureEventHandler.java:30) ~[CultureEventHandler.class:?]

at cpw.mods.fml.common.eventhandler.ASMEventHandler_4_CultureEventHandler_onEntityJoinWorld_EntityJoinWorldEvent.invoke(.dynamic) ~[?:?]

at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:51) ~[ASMEventHandler.class:?]

at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:122) ~[EventBus.class:?]

at net.minecraft.world.World.spawnEntityInWorld(World.java:1516) ~[World.class:?]

at net.minecraft.server.management.ServerConfigurationManager.playerLoggedIn(ServerConfigurationManager.java:288) ~[serverConfigurationManager.class:?]

at net.minecraft.server.management.ServerConfigurationManager.initializeConnectionToPlayer(ServerConfigurationManager.java:151) ~[serverConfigurationManager.class:?]

at cpw.mods.fml.common.network.handshake.NetworkDispatcher.completeServerSideConnection(NetworkDispatcher.java:172) ~[NetworkDispatcher.class:?]

at cpw.mods.fml.common.network.handshake.NetworkDispatcher.completeHandshake(NetworkDispatcher.java:428) ~[NetworkDispatcher.class:?]

at cpw.mods.fml.common.network.internal.HandshakeCompletionHandler.channelRead0(HandshakeCompletionHandler.java:17) ~[HandshakeCompletionHandler.class:?]

at cpw.mods.fml.common.network.internal.HandshakeCompletionHandler.channelRead0(HandshakeCompletionHandler.java:11) ~[HandshakeCompletionHandler.class:?]

at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) ~[simpleChannelInboundHandler.class:?]

at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]

at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]

at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) [MessageToMessageDecoder.class:?]

at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) [MessageToMessageCodec.class:?]

at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?]

at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?]

at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?]

at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?]

at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:80) [FMLProxyPacket.class:?]

at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242) [NetworkManager.class:?]

at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190) [NetworkSystem.class:?]

at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:763) [MinecraftServer.class:?]

at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:651) [MinecraftServer.class:?]

at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120) [integratedServer.class:?]

at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:530) [MinecraftServer.class:?]

at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:788) [MinecraftServer$2.class:?]

[13:29:11] [server thread/ERROR] [FML]: There was a critical exception handling a packet on channel FML

java.lang.NullPointerException

at com.xetosphere.pantheon.network.packet.SyncPlayerPropsPacket.<init>(SyncPlayerPropsPacket.java:23) ~[syncPlayerPropsPacket.class:?]

at com.xetosphere.pantheon.entity.ExtendedPlayer.loadProxyData(ExtendedPlayer.java:146) ~[ExtendedPlayer.class:?]

at com.xetosphere.pantheon.event.CultureEventHandler.onEntityJoinWorld(CultureEventHandler.java:30) ~[CultureEventHandler.class:?]

at cpw.mods.fml.common.eventhandler.ASMEventHandler_4_CultureEventHandler_onEntityJoinWorld_EntityJoinWorldEvent.invoke(.dynamic) ~[?:?]

at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:51) ~[ASMEventHandler.class:?]

at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:122) ~[EventBus.class:?]

at net.minecraft.world.World.spawnEntityInWorld(World.java:1516) ~[World.class:?]

at net.minecraft.server.management.ServerConfigurationManager.playerLoggedIn(ServerConfigurationManager.java:288) ~[serverConfigurationManager.class:?]

at net.minecraft.server.management.ServerConfigurationManager.initializeConnectionToPlayer(ServerConfigurationManager.java:151) ~[serverConfigurationManager.class:?]

at cpw.mods.fml.common.network.handshake.NetworkDispatcher.completeServerSideConnection(NetworkDispatcher.java:172) ~[NetworkDispatcher.class:?]

at cpw.mods.fml.common.network.handshake.NetworkDispatcher.completeHandshake(NetworkDispatcher.java:428) ~[NetworkDispatcher.class:?]

at cpw.mods.fml.common.network.internal.HandshakeCompletionHandler.channelRead0(HandshakeCompletionHandler.java:17) ~[HandshakeCompletionHandler.class:?]

at cpw.mods.fml.common.network.internal.HandshakeCompletionHandler.channelRead0(HandshakeCompletionHandler.java:11) ~[HandshakeCompletionHandler.class:?]

at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) ~[simpleChannelInboundHandler.class:?]

at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?]

at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?]

at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[MessageToMessageDecoder.class:?]

at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?]

at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?]

at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?]

at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) ~[DefaultChannelPipeline.class:?]

at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) ~[EmbeddedChannel.class:?]

at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:80) [FMLProxyPacket.class:?]

at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242) [NetworkManager.class:?]

at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190) [NetworkSystem.class:?]

at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:763) [MinecraftServer.class:?]

at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:651) [MinecraftServer.class:?]

at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120) [integratedServer.class:?]

at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:530) [MinecraftServer.class:?]

at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:788) [MinecraftServer$2.class:?]

[13:29:11] [server thread/ERROR]: Encountered an unexpected exception

net.minecraft.util.ReportedException: Ticking memory connection

at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:206) ~[NetworkSystem.class:?]

at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:763) ~[MinecraftServer.class:?]

at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:651) ~[MinecraftServer.class:?]

at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120) ~[integratedServer.class:?]

at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:530) [MinecraftServer.class:?]

at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:788) [MinecraftServer$2.class:?]

Caused by: java.lang.NullPointerException

at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:90) ~[FMLProxyPacket.class:?]

at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242) ~[NetworkManager.class:?]

at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190) ~[NetworkSystem.class:?]

... 5 more

[13:29:11] [server thread/ERROR]: This crash report has been saved to: D:\development\forge\.\crash-reports\crash-2014-03-18_13.29.11-server.txt

[13:29:11] [server thread/INFO]: Stopping server

[13:29:11] [server thread/INFO]: Saving players

[13:29:11] [server thread/INFO]: Saving worlds

[13:29:11] [server thread/INFO]: Saving chunks for level 'New World'/Overworld

---- Minecraft Crash Report ----

// Quite honestly, I wouldn't worry myself about that.

 

Time: 3/18/14 1:29 PM

Description: Ticking memory connection

 

java.lang.NullPointerException: Ticking memory connection

at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:90)

at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242)

at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190)

at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:763)

at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:651)

at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120)

at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:530)

at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:788)

 

 

A detailed walkthrough of the error, its code path and all known details is as follows:

---------------------------------------------------------------------------------------

 

-- Head --

Stacktrace:

at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:90)

at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242)

 

-- Ticking connection --

Details:

Connection: net.minecraft.network.NetworkManager@6bd92b68

Stacktrace:

at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190)

at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:763)

at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:651)

at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120)

at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:530)

at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:788)

 

-- System Details --

Details:

Minecraft Version: 1.7.2

Operating System: Windows 8 (amd64) version 6.2

Java Version: 1.7.0_51, Oracle Corporation

Java VM Version: Java HotSpot 64-Bit Server VM (mixed mode), Oracle Corporation

Memory: 853569328 bytes (814 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB)

JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M

AABB Pool Size: 1156 (64736 bytes; 0 MB) allocated, 1142 (63952 bytes; 0 MB) used

IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95

FML: MCP v9.01-pre FML v7.2.125.1039 Minecraft Forge 10.12.0.1039 4 mods loaded, 4 mods active

mcp{8.09} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

FML{7.2.125.1039} [Forge Mod Loader] (forgeSrc-1.7.2-10.12.0.1039.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

Forge{10.12.0.1039} [Minecraft Forge] (forgeSrc-1.7.2-10.12.0.1039.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

xetopc{0.1} [Pantheon Craft] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available

Profiler Position: N/A (disabled)

Vec3 Pool Size: 506 (28336 bytes; 0 MB) allocated, 469 (26264 bytes; 0 MB) used

Player Count: 1 / 8; [EntityPlayerMP['Xetosphere'/111, l='New World', x=237.50, y=64.00, z=49.50]]

Type: Integrated Server (map_client.txt)

Is Modded: Definitely; Client brand changed to 'fml,forge'

#@!@# Game crashed! Crash report saved to: #@!@# .\crash-reports\crash-2014-03-18_13.29.11-server.txt

AL lib: (EE) alc_cleanup: 1 device not closed

 

 

 

My real problems (I think) is that my values never really gets synced (client -> server or server -> client). This also make it so that when I open a new world, the gui says that I have the religion from the previous world (even if I create a new one) as well as when I close down minecraft and open it again it is reset to "None" instead of the religion name (where "None" is my default value in the ExtendedPlayer class).

Posted

Don't listen to what that guy said about registration - he obviously has no clue. Anyway, what you're doing wrong is you're setting the values client side, but your packet is set up to only sync data from the server TO the client, not the other way around. Easy fix is just allow your packet to be handled server side as well, reading everything from some bundled NBT that you send, but I do NOT recommend that.

 

Instead, what you should do is send a packet directly from the GUI to the server, saying "button x was pressed, do something", and then parse through the button ids server side setting the data as you need. This will avoid the issue of possible bad packets from the client overwriting your server side data, and you should then be able to synchronize right away with your normal packet. I prefer to have dedicated packets for various things, rather than sending the entire properties data every single time, but that's up to you.

Posted

Don't listen to what that guy said about registration - he obviously has no clue. Anyway, what you're doing wrong is you're setting the values client side, but your packet is set up to only sync data from the server TO the client, not the other way around. Easy fix is just allow your packet to be handled server side as well, reading everything from some bundled NBT that you send, but I do NOT recommend that.

 

Instead, what you should do is send a packet directly from the GUI to the server, saying "button x was pressed, do something", and then parse through the button ids server side setting the data as you need. This will avoid the issue of possible bad packets from the client overwriting your server side data, and you should then be able to synchronize right away with your normal packet. I prefer to have dedicated packets for various things, rather than sending the entire properties data every single time, but that's up to you.

So let me see if I got you right, you mean that I create a new packet that instead of sending from server side sends info from server to client instead? And that this new packet should be sent whenever one of the buttons are pressed?

 

If that is correct do you know of any tutorial on sending data from server to client or the other way around? I wanna learn the new netty system in and out, so that I can use this for future projects and problems as well.

Posted

I mean you need to send a packet from the client to the server, but you can do it both ways using the exact same packet since you seem to have followed the same network tutorial I did :P

 

// on the server side, this is how you send a packet to a single player:
dispatcher.sendTo(new YourPacket(somedata), (EntityPlayerMP) player);

// on the client side, this is how you send a packet from the player to the server
// the handling on the server side is for the same player that sent it
dispatcher.sendToServer(new YourPacket(somedata));

Note that those are both using the exact same packet, and you have two methods in the AbstractPacket class that you need to implement if you want it to work both ways:

/**
     * Handle a packet on the client side. Note this occurs after decoding has completed.
     *
     * @param player the player reference
     */
    public abstract void handleClientSide(EntityPlayer player);

    /**
     * Handle a packet on the server side. Note this occurs after decoding has completed.
     *
     * @param player the player reference
     */
    public abstract void handleServerSide(EntityPlayer player);

Posted

BTW, I found example code somewhere (can't remember where tho) and used similar code.

 

[spoiler=ChannelHandler]

public class ChannelHandler extends FMLIndexedMessageToMessageCodec<IPacket> {
public ChannelHandler() {
	this.addDiscriminator(0, PacketWormhole.class);
	this.addDiscriminator(1, PacketDHDEnterGlyph.class);
}

public static EnumMap<Side, FMLEmbeddedChannel> channels;

public static void initChannels() {
	channels = NetworkRegistry.INSTANCE.newChannel("SpaceDistortion", new ChannelHandler());
}

@SideOnly(Side.CLIENT)
/**
 * Sends a packet from the client to the server
 * @param packet An IPacket to send
 */
public static void clientSendPacket(IPacket packet) {
	FMLEmbeddedChannel channel = ChannelHandler.channels.get(Side.CLIENT);
	channel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
	channel.writeOutbound(packet);
}

@SideOnly(Side.SERVER)
/**
 * Sends a packet from the server to a given client
 * @param packet An IPacket to send
 * @param player A player to send it to
 */
public static void serverSentPacket(IPacket packet, EntityPlayer player) {
	FMLEmbeddedChannel channel = ChannelHandler.channels.get(Side.SERVER);
	channel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER);
	channel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player);
	channel.writeOutbound(packet);
}

/**
 * Sends a packet from the server to all clients
 * @param packet An IPacket to send
 */
@SideOnly(Side.SERVER)
public static void serverSendPacketAllClients(IPacket packet) {
	FMLEmbeddedChannel channel = ChannelHandler.channels.get(Side.SERVER);
	channel.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL);
	channel.writeOutbound(packet);
}

@Override
public void encodeInto(ChannelHandlerContext context, IPacket packet, ByteBuf data) throws Exception {
	packet.writeBytes(data);
}

@Override
public void decodeInto(ChannelHandlerContext context, ByteBuf data, IPacket packet) {
	// read the packet
	packet.readBytes(data);

	// handle the packet by calling IPacket#onReceive
	Side side = FMLCommonHandler.instance().getEffectiveSide();
	EntityPlayer player;
	switch (side) {
		case CLIENT:
			player = Minecraft.getMinecraft().thePlayer;
			packet.onReceive(player, side);
		case SERVER:
			INetHandler net = context.channel().attr(NetworkRegistry.NET_HANDLER).get();
			player = ((NetHandlerPlayServer) net).playerEntity;
			packet.onReceive(player, side);
	}
}

 

 

[spoiler=IPacket]

public interface IPacket {
public void readBytes(ByteBuf bytes);
public void writeBytes(ByteBuf bytes);
public void onReceive(EntityPlayer player, Side side);
}

[/code]

 

You probably don't need the entire class, but I hope this helps. Especially look at clientSendPacket, serverSendPacket, and serverSendPacketAllClients.

I like to make mods, just like you. Here's one worth checking out

Posted

Ok, it seems I can't work this out by myself even after the information you gave me (server/client stuff really confuses me and this is my first time handling nbttag stuff).

 

My current bugs is, when I open a world after quiting the game, it prints out correct information in the console (I made it so that when I use the method loadNBTData in the ExtendedPlayer.class it will print the religion and culture) but when I look inside my gui everything is reset back to the standard values. Though when I open a different world without leaving the game, it still has the information from the earlier world.

 

So I ask how I can make it save for only the world he is currently in, and that it will save and load correctly even after I restart the game.

 

Here is my current code:

 

Mod class:

 

package com.xetosphere.pantheon;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.common.MinecraftForge;

import com.xetosphere.pantheon.block.ModBlocks;
import com.xetosphere.pantheon.creativetab.TabPantheon;
import com.xetosphere.pantheon.event.CultureEventHandler;
import com.xetosphere.pantheon.item.ModItems;
import com.xetosphere.pantheon.lib.Reference;
import com.xetosphere.pantheon.network.PacketPipeline;
import com.xetosphere.pantheon.proxy.CommonProxy;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkRegistry;

@Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, version = Reference.VERSION)
public class PantheonCraft {

public static final CreativeTabs tabPC = new TabPantheon(CreativeTabs.getNextID(), Reference.MOD_ID);

public static final PacketPipeline packetPipeline = new PacketPipeline();

ModBlocks blocks = new ModBlocks();
ModItems items = new ModItems();

@Instance(Reference.MOD_ID)
public static PantheonCraft instance;

@SidedProxy(clientSide = Reference.CLIENT_PROXY, serverSide = Reference.COMMON_PROXY)
public static CommonProxy proxy;

@EventHandler
public void preInit(FMLPreInitializationEvent e) {

	blocks.init();

	items.init();
}

@EventHandler
public void init(FMLInitializationEvent e) {

	packetPipeline.initialise();
}

@EventHandler
public void postInit(FMLPostInitializationEvent e) {

	packetPipeline.postInitialise();

	MinecraftForge.EVENT_BUS.register(new CultureEventHandler());

	NetworkRegistry.INSTANCE.registerGuiHandler(this, new CommonProxy());
}
}

 

 

GuiReligion.class:

 

package com.xetosphere.pantheon.client.gui;

import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ChatComponentText;

import org.lwjgl.opengl.GL11;

import com.xetosphere.pantheon.PantheonCraft;
import com.xetosphere.pantheon.entity.ExtendedPlayer;
import com.xetosphere.pantheon.item.ItemTalisman;
import com.xetosphere.pantheon.lib.PantheonReference;
import com.xetosphere.pantheon.lib.Textures;
import com.xetosphere.pantheon.network.packet.SyncPlayerPropsPacket;

public class GuiReligion extends GuiScreen {

private int xSize = 176;

private int ySize = 206;

EntityPlayer player;

public GuiReligion(EntityPlayer player) {

	this.player = player;
}

public void updateScreen() {
	super.updateScreen();
}

public void drawScreen(int x, int y, float f) {

	drawDefaultBackground();

	GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

	mc.getTextureManager().bindTexture(Textures.GUI_RELIGION);

	int posX = (width - xSize) / 2;
	int posY = (height - ySize) / 2;

	drawTexturedModalRect(posX, posY, 0, 0, xSize, ySize);
	drawString(fontRendererObj, "Pantheon:", posX + (xSize / 12), posY + 16, 0xffffffff);
	drawString(fontRendererObj, "Culture:", posX + (xSize / 12), posY + 36, 0xffffffff);
	drawCenteredString(fontRendererObj, ExtendedPlayer.get(player).getPantheon(), posX + (xSize / 4 * 3), posY + 16, 0xffffffff);
	drawCenteredString(fontRendererObj, ExtendedPlayer.get(player).getCulture() + "/" + ExtendedPlayer.get(player).getMaxCulture(), posX + (xSize / 4 * 3), posY + 36, 0xffffffff);

	super.drawScreen(x, y, f);
}

public boolean doesGuiPauseGame() {

	return false;
}

@SuppressWarnings("unchecked")
public void initGui() {

	this.buttonList.clear();

	int posX = (width - xSize) / 2;
	int posY = (height - ySize) / 2;

	this.buttonList.add(new GuiButton(0, posX + (xSize / 9 * 0) + 6, posY + 120 + (25 * 0), 50, 20, PantheonReference.pantheons[PantheonReference.NO_RELIGION]));
	this.buttonList.add(new GuiButton(1, posX + (xSize / 9 * 0) + 6, posY + 120 + (25 * 1), 50, 20, PantheonReference.pantheons[PantheonReference.GREEK]));
	this.buttonList.add(new GuiButton(2, posX + (xSize / 9 * 0) + 6, posY + 120 + (25 * 2), 50, 20, PantheonReference.pantheons[PantheonReference.NORSE]));
	this.buttonList.add(new GuiButton(3, posX + (xSize / 9 * 3) + 6, posY + 120 + (25 * 0), 50, 20, PantheonReference.pantheons[PantheonReference.ROMAN]));
	this.buttonList.add(new GuiButton(4, posX + (xSize / 9 * 3) + 6, posY + 120 + (25 * 1), 50, 20, PantheonReference.pantheons[PantheonReference.EGYPTIAN]));
	this.buttonList.add(new GuiButton(6, posX + (xSize / 9 * 3) + 6, posY + 120 + (25 * 2), 50, 20, PantheonReference.pantheons[PantheonReference.MAYAN]));
	this.buttonList.add(new GuiButton(7, posX + (xSize / 9 * 6) + 6, posY + 120 + (25 * 0), 50, 20, PantheonReference.pantheons[PantheonReference.CHINESE]));
	this.buttonList.add(new GuiButton(8, posX + (xSize / 9 * 6) + 6, posY + 120 + (25 * 1), 50, 20, PantheonReference.pantheons[PantheonReference.HINDU]));
	this.buttonList.add(new GuiButton(9, posX + (xSize / 9 * 6) + 6, posY + 120 + (25 * 2), 50, 20, PantheonReference.pantheons[PantheonReference.AZTECIAN]));
}

public void actionPerformed(GuiButton button) {

	switch (button.id) {
		case 0:
			ItemTalisman.pantheon = PantheonReference.NO_RELIGION;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.NO_RELIGION]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.NO_RELIGION);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
		case 1:
			ItemTalisman.pantheon = PantheonReference.GREEK;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.GREEK]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.GREEK);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
		case 2:
			ItemTalisman.pantheon = PantheonReference.NORSE;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.NORSE]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.NORSE);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
		case 3:
			ItemTalisman.pantheon = PantheonReference.ROMAN;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.ROMAN]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.ROMAN);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
		case 4:
			ItemTalisman.pantheon = PantheonReference.EGYPTIAN;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.EGYPTIAN]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.EGYPTIAN);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
		case 5:
			ItemTalisman.pantheon = PantheonReference.EGYPTIAN;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.EGYPTIAN]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.EGYPTIAN);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
		case 6:
			ItemTalisman.pantheon = PantheonReference.MAYAN;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.MAYAN]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.MAYAN);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
		case 7:
			ItemTalisman.pantheon = PantheonReference.CHINESE;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.CHINESE]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.CHINESE);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
		case 8:
			ItemTalisman.pantheon = PantheonReference.HINDU;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.HINDU]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.HINDU);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
		case 9:
			ItemTalisman.pantheon = PantheonReference.AZTECIAN;
			ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.AZTECIAN]);
			ExtendedPlayer.get(player).setPantheonId(PantheonReference.AZTECIAN);
			System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
			System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
			player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
			PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
			break;
	}
}
}

 

 

ItemTalisman.class:

 

package com.xetosphere.pantheon.item;

import net.minecraft.entity.Entity;
import net.minecraft.entity.effect.EntityLightningBolt;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;

import org.lwjgl.input.Keyboard;

import com.xetosphere.pantheon.PantheonCraft;
import com.xetosphere.pantheon.entity.ExtendedPlayer;
import com.xetosphere.pantheon.lib.GuiIds;
import com.xetosphere.pantheon.lib.PantheonReference;

public class ItemTalisman extends ItemPC {

public static int pantheon;

public ItemTalisman() {
}

public void onUpdate(ItemStack item, World world, Entity player, int par4, boolean par5) {

	if (player instanceof EntityPlayer) {

		switch (pantheon) {

			case PantheonReference.NO_RELIGION:
				ExtendedPlayer.get((EntityPlayer) player).setPantheon(PantheonReference.pantheons[PantheonReference.NO_RELIGION]);
				ExtendedPlayer.get((EntityPlayer) player).setPantheonId(PantheonReference.NO_RELIGION);
				break;
			case PantheonReference.GREEK:
				ExtendedPlayer.get((EntityPlayer) player).setPantheon(PantheonReference.pantheons[PantheonReference.GREEK]);
				ExtendedPlayer.get((EntityPlayer) player).setPantheonId(PantheonReference.GREEK);
				break;
			case PantheonReference.NORSE:
				ExtendedPlayer.get((EntityPlayer) player).setPantheon(PantheonReference.pantheons[PantheonReference.NORSE]);
				ExtendedPlayer.get((EntityPlayer) player).setPantheonId(PantheonReference.NORSE);
				break;
			case PantheonReference.ROMAN:
				ExtendedPlayer.get((EntityPlayer) player).setPantheon(PantheonReference.pantheons[PantheonReference.ROMAN]);
				ExtendedPlayer.get((EntityPlayer) player).setPantheonId(PantheonReference.ROMAN);
				break;
			case PantheonReference.EGYPTIAN:
				ExtendedPlayer.get((EntityPlayer) player).setPantheon(PantheonReference.pantheons[PantheonReference.EGYPTIAN]);
				ExtendedPlayer.get((EntityPlayer) player).setPantheonId(PantheonReference.EGYPTIAN);
				break;
			case PantheonReference.MAYAN:
				ExtendedPlayer.get((EntityPlayer) player).setPantheon(PantheonReference.pantheons[PantheonReference.MAYAN]);
				ExtendedPlayer.get((EntityPlayer) player).setPantheonId(PantheonReference.MAYAN);
				break;
			case PantheonReference.CHINESE:
				ExtendedPlayer.get((EntityPlayer) player).setPantheon(PantheonReference.pantheons[PantheonReference.CHINESE]);
				ExtendedPlayer.get((EntityPlayer) player).setPantheonId(PantheonReference.CHINESE);
				break;
			case PantheonReference.HINDU:
				ExtendedPlayer.get((EntityPlayer) player).setPantheon(PantheonReference.pantheons[PantheonReference.HINDU]);
				ExtendedPlayer.get((EntityPlayer) player).setPantheonId(PantheonReference.HINDU);
				break;
			case PantheonReference.AZTECIAN:
				ExtendedPlayer.get((EntityPlayer) player).setPantheon(PantheonReference.pantheons[PantheonReference.AZTECIAN]);
				ExtendedPlayer.get((EntityPlayer) player).setPantheonId(PantheonReference.AZTECIAN);
				break;
		}
	}
}

public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {

	String pantheon = ExtendedPlayer.get(player).getPantheon();

	final int ONE_SECOND = 20;

	final double EYE_HEIGHT = 1.62;
	final double REACH_DISTANCE = 300;

	Vec3 startPos = player.getPosition(1.0F);

	if (!world.isRemote) startPos = startPos.addVector(0, EYE_HEIGHT, 0);

	Vec3 look = player.getLook(1.0F);
	Vec3 endPos = startPos.addVector(look.xCoord * REACH_DISTANCE, look.yCoord * REACH_DISTANCE, look.zCoord * REACH_DISTANCE);

	MovingObjectPosition objectMouseOver = world.rayTraceBlocks(startPos, endPos);

	if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {

		if (world.isRemote) {

			player.openGui(PantheonCraft.instance, GuiIds.RELIGION_GUI, world, (int) player.posX, (int) player.posY, (int) player.posZ);
		}
	}

	if (!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {

		// TODO Greek
		if (pantheon.equals(PantheonReference.pantheons[PantheonReference.GREEK])) {

			if (ExtendedPlayer.get(player).getCulture() >= 100 && objectMouseOver != null && objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {

				ExtendedPlayer.get(player).consumeCulture(100);

				int i = objectMouseOver.blockX;
				int j = objectMouseOver.blockY;
				int k = objectMouseOver.blockZ;

				world.spawnEntityInWorld(new EntityLightningBolt(world, i, j, k));

			} else {

				if (!world.isRemote) {

					player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
					ExtendedPlayer.get(player).setCulture(1000);
				}
			}
		}

		// TODO Norse
		if (pantheon.equals(PantheonReference.pantheons[PantheonReference.NORSE])) {

			if (ExtendedPlayer.get(player).getCulture() >= 100) {

				ExtendedPlayer.get(player).consumeCulture(100);
				player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * ONE_SECOND, 0, false));

			} else {

				if (!world.isRemote) {

					player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
					ExtendedPlayer.get(player).setCulture(1000);
				}
			}
		}

		// TODO Roman
		if (pantheon.equals(PantheonReference.pantheons[PantheonReference.ROMAN])) {

			if (ExtendedPlayer.get(player).getCulture() >= 100 && objectMouseOver != null && objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {

				ExtendedPlayer.get(player).consumeCulture(100);

				int i = objectMouseOver.blockX;
				int j = objectMouseOver.blockY;
				int k = objectMouseOver.blockZ;

				if (!world.isRemote) world.createExplosion(player, i, j, k, 3, true);

			} else {

				if (!world.isRemote) {

					player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
					ExtendedPlayer.get(player).setCulture(1000);
				}
			}
		}

		// TODO Egyptian
		if (pantheon.equals(PantheonReference.pantheons[PantheonReference.EGYPTIAN])) {

			if (ExtendedPlayer.get(player).getCulture() >= 100) {

				ExtendedPlayer.get(player).consumeCulture(100);
				if (!world.isRemote) player.addPotionEffect(new PotionEffect(Potion.nightVision.id, 120 * ONE_SECOND, 0, false));

			} else {

				if (!world.isRemote) {

					player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
					ExtendedPlayer.get(player).setCulture(1000);
				}
			}
		}

		// TODO Mayan
		if (pantheon.equals(PantheonReference.pantheons[PantheonReference.MAYAN])) {

			if (ExtendedPlayer.get(player).getCulture() >= 100) {

				ExtendedPlayer.get(player).consumeCulture(100);
				if (!world.isRemote) player.addChatComponentMessage(new ChatComponentText("Shooting mayan powers."));

			} else {

				if (!world.isRemote) {

					player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
					ExtendedPlayer.get(player).setCulture(1000);
				}
			}
		}

		// TODO Chinese
		if (pantheon.equals(PantheonReference.pantheons[PantheonReference.CHINESE])) {

			if (ExtendedPlayer.get(player).getCulture() >= 100) {

				ExtendedPlayer.get(player).consumeCulture(100);
				if (!world.isRemote) player.addChatComponentMessage(new ChatComponentText("Shooting chinese powers."));

			} else {

				if (!world.isRemote) {

					player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
					ExtendedPlayer.get(player).setCulture(1000);
				}
			}
		}

		// TODO Hindi
		if (pantheon.equals(PantheonReference.pantheons[PantheonReference.HINDU])) {

			if (ExtendedPlayer.get(player).getCulture() >= 100) {

				ExtendedPlayer.get(player).consumeCulture(100);
				if (!world.isRemote) player.addChatComponentMessage(new ChatComponentText("Shooting hindu powers."));

			} else {

				if (!world.isRemote) {

					player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
					ExtendedPlayer.get(player).setCulture(1000);
				}
			}
		}

		// TODO Aztecian
		if (pantheon.equals(PantheonReference.pantheons[PantheonReference.AZTECIAN])) {

			if (ExtendedPlayer.get(player).getCulture() >= 100) {

				ExtendedPlayer.get(player).consumeCulture(100);
				if (!world.isRemote) player.addChatComponentMessage(new ChatComponentText("Shooting aztecian powers."));

			} else {

				if (!world.isRemote) {

					player.addChatComponentMessage(new ChatComponentText("You don't have enough culture."));
					ExtendedPlayer.get(player).setCulture(1000);
				}
			}
		}

		if (!world.isRemote && pantheon.equals(PantheonReference.pantheons[PantheonReference.NO_RELIGION])) player.addChatComponentMessage(new ChatComponentText("No God, no special effects!"));
	}

	return itemStack;
}
}

 

 

ExtendedPlayer.class:

 

package com.xetosphere.pantheon.entity;

import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.IExtendedEntityProperties;

import com.xetosphere.pantheon.PantheonCraft;
import com.xetosphere.pantheon.lib.PantheonReference;
import com.xetosphere.pantheon.lib.Reference;
import com.xetosphere.pantheon.network.packet.SyncPlayerPropsPacket;
import com.xetosphere.pantheon.proxy.CommonProxy;

public class ExtendedPlayer implements IExtendedEntityProperties {

public static final String IDENTIFIER = Reference.MOD_ID + "_properties";

private final EntityPlayer player;

private int culture, maxCulture, pantheonId;

private String pantheon;

public static final int CULTURE_WATCHER = 25;
public static final int PANTHEON_WATCHER = 26;
public static final int ID_WATCHER = 27;

public ExtendedPlayer(EntityPlayer player) {

	this.player = player;
	culture = 0;
	maxCulture = PantheonReference.MAX_CULTURE;
	pantheon = PantheonReference.pantheons[PantheonReference.NO_RELIGION];
	pantheonId = PantheonReference.NO_RELIGION;
	player.getDataWatcher().addObject(CULTURE_WATCHER, culture);
	player.getDataWatcher().addObject(PANTHEON_WATCHER, pantheon);
	player.getDataWatcher().addObject(ID_WATCHER, pantheonId);
}

public static final void register(EntityPlayer player) {

	player.registerExtendedProperties(IDENTIFIER, new ExtendedPlayer(player));
}

public static final ExtendedPlayer get(EntityPlayer player) {

	return (ExtendedPlayer) player.getExtendedProperties(IDENTIFIER);
}

@Override
public void saveNBTData(NBTTagCompound compound) {

	NBTTagCompound properties = new NBTTagCompound();
	properties.setInteger("Culture", player.getDataWatcher().getWatchableObjectInt(CULTURE_WATCHER));
	properties.setInteger("MaxCulture", maxCulture);
	properties.setString("Pantheon", player.getDataWatcher().getWatchableObjectString(PANTHEON_WATCHER));
	properties.setInteger("IdPantheon", player.getDataWatcher().getWatchableObjectInt(ID_WATCHER));
	compound.setTag(IDENTIFIER, properties);
}

@Override
public void loadNBTData(NBTTagCompound compound) {

	NBTTagCompound properties = (NBTTagCompound) compound.getTag(IDENTIFIER);
	player.getDataWatcher().updateObject(CULTURE_WATCHER, properties.getInteger("Culture"));
	maxCulture = properties.getInteger("MaxCulture");
	player.getDataWatcher().updateObject(PANTHEON_WATCHER, properties.getString("Pantheon"));
	player.getDataWatcher().updateObject(ID_WATCHER, properties.getInteger("IdPantheon"));
	System.out.println("[XETOPC PROPS] Culture from NBT: " + player.getDataWatcher().getWatchableObjectInt(CULTURE_WATCHER) + "/" + maxCulture);
	System.out.println("[XETOPC PROPS] Pantheon from NBT: [iD = " + player.getDataWatcher().getWatchableObjectInt(ID_WATCHER) + "] " + player.getDataWatcher().getWatchableObjectString(PANTHEON_WATCHER));
}

@Override
public void init(Entity entity, World world) {
}

public final boolean consumeCulture(int amount) {

	boolean sufficient = amount <= getCulture();
	setCulture(getCulture() - amount);
	return sufficient;
}

public final int getCulture() {

	return player.getDataWatcher().getWatchableObjectInt(CULTURE_WATCHER);
}

public final String getPantheon() {

	return player.getDataWatcher().getWatchableObjectString(PANTHEON_WATCHER);
}

public final int getPantheonId() {

	return player.getDataWatcher().getWatchableObjectInt(ID_WATCHER);
}

public final void setCulture(int amount) {

	player.getDataWatcher().updateObject(CULTURE_WATCHER, amount > 0 ? (amount < maxCulture ? amount : maxCulture) : 0);
}

public final void setPantheon(String pantheon) {

	player.getDataWatcher().updateObject(PANTHEON_WATCHER, pantheon);
}

public final void setPantheonId(int id) {

	player.getDataWatcher().updateObject(ID_WATCHER, id);
}

public final int getMaxCulture() {

	return maxCulture;
}

public final void setMaxCulture(int amount) {

	maxCulture = (amount > 0 ? amount : 0);
	PantheonCraft.packetPipeline.sendTo(new SyncPlayerPropsPacket(player), (EntityPlayerMP) player);
	PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
}

private static final String getSaveKey(EntityPlayer player) {

	return player.getCommandSenderName() + ":" + IDENTIFIER;
}

public static final void saveProxyData(EntityPlayer player) {

	NBTTagCompound savedData = new NBTTagCompound();
	ExtendedPlayer.get(player).saveNBTData(savedData);
	CommonProxy.storeEntityData(getSaveKey(player), savedData);
}

public static final void loadProxyData(EntityPlayer player) {

	ExtendedPlayer playerData = ExtendedPlayer.get(player);
	NBTTagCompound savedData = CommonProxy.getEntityData(getSaveKey(player));

	if (savedData != null) {
		playerData.loadNBTData(savedData);
	}

	PantheonCraft.packetPipeline.sendTo(new SyncPlayerPropsPacket(player), (EntityPlayerMP) player);
	PantheonCraft.packetPipeline.sendToServer(new SyncPlayerPropsPacket(player));
}

}

 

 

CultureEventHandler.class:

 

package com.xetosphere.pantheon.event;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.event.entity.EntityEvent.EntityConstructing;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.event.entity.living.LivingDeathEvent;

import com.xetosphere.pantheon.entity.ExtendedPlayer;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;

public class CultureEventHandler {

@SubscribeEvent
public void onEntityConstructing(EntityConstructing event) {

	if (event.entity instanceof EntityPlayer) {

		if (ExtendedPlayer.get((EntityPlayer) event.entity) == null) {

			ExtendedPlayer.register((EntityPlayer) event.entity);
		}
	}
}

@SubscribeEvent
public void onEntityJoinWorld(EntityJoinWorldEvent event) {

	if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer) {

		ExtendedPlayer.loadProxyData((EntityPlayer) event.entity);
	}
}

@SubscribeEvent
public void onLivingDeathEvent(LivingDeathEvent event) {

	if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer) {

		ExtendedPlayer.saveProxyData((EntityPlayer) event.entity);
	}
}
}

 

 

SyncPlayerPropsPacket.class:

 

package com.xetosphere.pantheon.network.packet;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;

import com.xetosphere.pantheon.entity.ExtendedPlayer;
import com.xetosphere.pantheon.network.AbstractPacket;

import cpw.mods.fml.common.network.ByteBufUtils;

public class SyncPlayerPropsPacket extends AbstractPacket {

private NBTTagCompound data;

public SyncPlayerPropsPacket() {
}

public SyncPlayerPropsPacket(EntityPlayer player) {

	data = new NBTTagCompound();
	ExtendedPlayer.get(player).saveNBTData(data);
}

@Override
public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {

	ByteBufUtils.writeTag(buffer, data);
}

@Override
public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {

	data = ByteBufUtils.readTag(buffer);
}

@Override
public void handleClientSide(EntityPlayer player) {

	ExtendedPlayer.get(player).loadNBTData(data);
}

@Override
public void handleServerSide(EntityPlayer player) {

	ExtendedPlayer.get(player).loadNBTData(data);
}
}

 

 

CommonProxy.class:

 

package com.xetosphere.pantheon.proxy;

import java.util.HashMap;
import java.util.Map;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;

import com.xetosphere.pantheon.client.gui.GuiReligion;
import com.xetosphere.pantheon.lib.GuiIds;

import cpw.mods.fml.common.network.IGuiHandler;

public class CommonProxy implements IGuiHandler {

private static final Map<String, NBTTagCompound> extendedEntityData = new HashMap<String, NBTTagCompound>();

public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {

	if (id == GuiIds.RELIGION_GUI) {

		return null;
	}

	return null;
}

public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {

	if (id == GuiIds.RELIGION_GUI) {

		return new GuiReligion(player);
	}

	return null;
}

public static void storeEntityData(String name, NBTTagCompound compound) {

	extendedEntityData.put(name, compound);
}

public static NBTTagCompound getEntityData(String name) {

	return extendedEntityData.remove(name);
}
}

 

 

AbstractPacket.class:

 

package com.xetosphere.pantheon.network;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.entity.player.EntityPlayer;

public abstract class AbstractPacket {

public abstract void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer);

public abstract void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer);

public abstract void handleClientSide(EntityPlayer player);

public abstract void handleServerSide(EntityPlayer player);
}

 

 

ClientProxy.class:

 

package com.xetosphere.pantheon.proxy;

public class ClientProxy extends CommonProxy {
// Doesn't do anything.
}

 

Posted

1. You don't need to send a synchronization packet to the server when loading your properties - they just loaded on the server.

 

2. You are using DataWatcher for your variables, so you don't need to send a packet at all - that's done automatically when you update the value, ON THE SERVER SIDE. Send a packet from your GUI to the server, rather than trying to set the data from the GUI:

switch (button.id) {
case 0:
// BIG NOOOOOO!!! This is on the client! Send a packet with the information you need and set the data there
ItemTalisman.pantheon = PantheonReference.NO_RELIGION;
ExtendedPlayer.get(player).setPantheon(PantheonReference.pantheons[PantheonReference.NO_RELIGION]);
// etc.

// Should be:
yourDispatcher.sendToServer(new UpdateReligion(newReligion));
// and in your UpdateReligion packet, in the handle server side method, you would then do
// what you were doing in your GUI:
handleServerSide(args) { // <- obviously don't copy that
ExtendedPlayer.get(player).setPantheon(packet.religion);
}

 

So your GUI code would look like this:

public void actionPerformed(GuiButton button) {
YourReligionObject newReligion = PantheonReference.NO_RELIGION;
switch (button.id) {
// don't need case 0 anymore, that's the default
case 1:
newReligion = PantheonReference.GREEK;
break;
case 2:
newReligion = PantheonReference.NORSE;
break;
.
.
. etc.
}
PantheonCraft.packetPipeline.sendToServer(new UpdateReligionPacket(newReligion));
}

UpdateReligionPacket writes the religion to the buffer, reads it back in, and then uses that religion to set both the ItemTalisman and ExtendedProperties data, on the SERVER.

Posted

For some reason this is giving me null and 0 all the time. I even tried using lists but that doesn't work either.

package com.xetosphere.pantheon.network.packet;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentText;

import com.xetosphere.pantheon.entity.ExtendedPlayer;
import com.xetosphere.pantheon.network.AbstractPacket;

import cpw.mods.fml.common.network.ByteBufUtils;

public class UpdateReligionPacket extends AbstractPacket {

private NBTTagCompound data;
private String religion;
private int religionId;

public UpdateReligionPacket() {
}

public UpdateReligionPacket(String religion, int religionId) {

	data = new NBTTagCompound();
	setReligion(religion);
	setReligionId(religionId);
}

public void setReligion(String religion) {

	this.religion = religion;
}

public void setReligionId(int religionId) {

	this.religionId = religionId;
}

public String getReligion() {

	return religion;
}

public int getReligionId() {

	return religionId;
}

@Override
public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {

	ByteBufUtils.writeTag(buffer, data);
}

@Override
public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {

	data = ByteBufUtils.readTag(buffer);
}

@Override
public void handleClientSide(EntityPlayer player) {

}

@Override
public void handleServerSide(EntityPlayer player) {

	System.out.println(getReligion() + ", " + getReligionId());
	ExtendedPlayer.get(player).setPantheon(getReligion());
	ExtendedPlayer.get(player).setPantheonId(getReligionId());
	if (!player.worldObj.isRemote) player.addChatComponentMessage(new ChatComponentText("You set your pantheon to: " + ExtendedPlayer.get(player).getPantheon()));
	System.out.println("[XETOPC] Pantheon = " + ExtendedPlayer.get(player).getPantheon());
	System.out.println("[XETOPC] PantheonId = " + ExtendedPlayer.get(player).getPantheonId());
}

}

 

Posted

For some reason this is giving me null and 0 all the time. I even tried using lists but that doesn't work either.

You never add any data to the NBTTagCompound, which you don't even need since you can write the int and String directly to the output stream, and read them back in. You don't need getter and setter methods because you will never be (should never be) trying to access your variables outside of this class.

Posted

For some reason this is giving me null and 0 all the time. I even tried using lists but that doesn't work either.

You never add any data to the NBTTagCompound, which you don't even need since you can write the int and String directly to the output stream, and read them back in. You don't need getter and setter methods because you will never be (should never be) trying to access your variables outside of this class.

Thank you, I forgot I could use the NBTTagCompound to store the values (I am very stupid sometimes). Everything works as it should now, I really appreciate your help.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Open the file and remove the # from # -Xmx4G
    • https://mclo.gs/uea1hj9 It should be easier to see the crash report in this format...sorry I'm new to this
    • Hello...I was wondering if somebody could help me with this crash. I was using chunky to pre-load chunks and this chunk, -473 285 (-7685 y 4560) seems to be corrupted or something. So like a dummy I teleported myself from the server console there and it crashed as soon as I would join the world. I used MCA selector to delete the problematic chunk and luckily it sent me back to my last known location. Can anyone see what is possibly causing this issue with the crash log? Anyway...here it is. My gosh this is frustrating. ---- Minecraft Crash Report ---- // Hi. I'm Connector, and I'm a crashaholic ========================= SINYTRA CONNECTOR IS PRESENT! Please verify issues are not caused by Connector before reporting them to mod authors. If you're unsure, file a report on Connector's issue tracker found at https://github.com/Sinytra/Connector/issues. ========================= // You should try our sister game, Minceraft! Time: 2025-09-05 03:24:05 Description: Feature placement java.lang.NullPointerException: Cannot invoke "net.minecraft.world.level.Level.m_8055_(net.minecraft.core.BlockPos)" because "this.f_58857_" is null     at net.minecraft.world.level.block.entity.JukeboxBlockEntity.m_271871_(JukeboxBlockEntity.java:76) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:mixin:APP:fabric-transfer-api-v1.mixins.json:JukeboxBlockEntityMixin from mod fabric_transfer_api_v1,pl:mixin:APP:amendments-common.mixins.json:JukeboxBlockEntityMixin from mod amendments,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.block.entity.JukeboxBlockEntity.m_7407_(JukeboxBlockEntity.java:132) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:mixin:APP:fabric-transfer-api-v1.mixins.json:JukeboxBlockEntityMixin from mod fabric_transfer_api_v1,pl:mixin:APP:amendments-common.mixins.json:JukeboxBlockEntityMixin from mod amendments,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.ticks.ContainerSingleItem.m_8016_(ContainerSingleItem.java:37) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.ticks.ContainerSingleItem.m_272108_(ContainerSingleItem.java:28) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.ticks.ContainerSingleItem.m_6211_(ContainerSingleItem.java:20) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.Clearable.m_18908_(Clearable.java:10) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.m_230328_(StructureTemplate.java:232) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,xf:fml:forge:forge_method_redirector,pl:connector_pre_launch:A,re:classloading,xf:fml:forge:forge_method_redirector,pl:mixin:APP:betterdungeons.mixins.json:DungeonContextMixin from mod betterdungeons,pl:mixin:APP:betterdungeons.mixins.json:StructureTemplateMixin from mod betterdungeons,pl:mixin:APP:cataclysm.mixins.json:StructureTemplateMixin from mod cataclysm,pl:mixin:APP:lithostitched.mixins.json:common.StructureTemplateMixin from mod lithostitched,pl:mixin:APP:dungeonnowloading.forge.mixins.json:structures.StructureTemplateMixin from mod dungeonnowloading,pl:mixin:APP:integrated_api-common.mixins.json:structures.StructureTemplateMixin from mod integrated_api,pl:mixin:APP:integrated_api-common.mixins.json:structures.TemplateAccessor from mod integrated_api,pl:mixin:APP:blueprint.mixins.json:StructureTemplateMixin from mod blueprint,pl:mixin:APP:zeta.mixins.json:StructureTemplateMixin from mod zeta,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.levelgen.structure.TemplateStructurePiece.m_213694_(TemplateStructurePiece.java:83) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:computing_frames,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A,re:mixin,pl:connector_pre_launch:A}     at net.minecraft.world.level.levelgen.structure.structures.OceanRuinPieces$OceanRuinPiece.m_213694_(OceanRuinPieces.java:309) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,xf:fml:forge:forge_method_redirector,pl:connector_pre_launch:A}     at net.minecraft.world.level.levelgen.structure.StructureStart.m_226850_(StructureStart.java:90) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:mixin:APP:blueprint.mixins.json:StructureStartMixin from mod blueprint,pl:mixin:APP:zeta.mixins.json:StructureStartMixin from mod zeta,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkGenerator.m_223080_(ChunkGenerator.java:320) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:citadel.mixins.json:ChunkGeneratorMixin from mod citadel,pl:mixin:APP:bettermineshafts.mixins.json:DisableVanillaMineshaftsMixin from mod bettermineshafts,pl:mixin:A,pl:connector_pre_launch:A}     at com.google.common.collect.ImmutableList.forEach(ImmutableList.java:422) ~[guava-31.1-jre.jar%2374!/:?] {re:mixin}     at net.minecraft.world.level.chunk.ChunkGenerator.m_213609_(ChunkGenerator.java:319) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:citadel.mixins.json:ChunkGeneratorMixin from mod citadel,pl:mixin:APP:bettermineshafts.mixins.json:DisableVanillaMineshaftsMixin from mod bettermineshafts,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus.m_279978_(ChunkStatus.java:108) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus$SimpleGenerationTask.m_214024_(ChunkStatus.java:309) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus.m_280308_(ChunkStatus.java:252) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:connector_pre_launch:A}     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$27(ChunkMap.java:643) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at com.mojang.datafixers.util.Either$Left.map(Either.java:38) ~[datafixerupper-6.0.8.jar%2377!/:?] {}     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$29(ChunkMap.java:634) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ~[?:?] {}     at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {}     at net.minecraft.server.level.ChunkTaskPriorityQueueSorter.m_143188_(ChunkTaskPriorityQueueSorter.java:62) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18759_(ProcessorMailbox.java:91) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18747_(ProcessorMailbox.java:146) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.run(ProcessorMailbox.java:102) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395) ~[?:?] {}     at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] {}     at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[?:?] {}     at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[?:?] {re:mixin,re:computing_frames}     at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[?:?] {re:mixin,re:computing_frames}     at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[?:?] {re:mixin} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Server thread Suspected Mods: NONE Stacktrace:     at net.minecraft.world.level.block.entity.JukeboxBlockEntity.m_271871_(JukeboxBlockEntity.java:76) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:mixin:APP:fabric-transfer-api-v1.mixins.json:JukeboxBlockEntityMixin from mod fabric_transfer_api_v1,pl:mixin:APP:amendments-common.mixins.json:JukeboxBlockEntityMixin from mod amendments,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.block.entity.JukeboxBlockEntity.m_7407_(JukeboxBlockEntity.java:132) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:mixin:APP:fabric-transfer-api-v1.mixins.json:JukeboxBlockEntityMixin from mod fabric_transfer_api_v1,pl:mixin:APP:amendments-common.mixins.json:JukeboxBlockEntityMixin from mod amendments,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.ticks.ContainerSingleItem.m_8016_(ContainerSingleItem.java:37) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.ticks.ContainerSingleItem.m_272108_(ContainerSingleItem.java:28) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.ticks.ContainerSingleItem.m_6211_(ContainerSingleItem.java:20) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.Clearable.m_18908_(Clearable.java:10) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.m_230328_(StructureTemplate.java:232) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,xf:fml:forge:forge_method_redirector,pl:connector_pre_launch:A,re:classloading,xf:fml:forge:forge_method_redirector,pl:mixin:APP:betterdungeons.mixins.json:DungeonContextMixin from mod betterdungeons,pl:mixin:APP:betterdungeons.mixins.json:StructureTemplateMixin from mod betterdungeons,pl:mixin:APP:cataclysm.mixins.json:StructureTemplateMixin from mod cataclysm,pl:mixin:APP:lithostitched.mixins.json:common.StructureTemplateMixin from mod lithostitched,pl:mixin:APP:dungeonnowloading.forge.mixins.json:structures.StructureTemplateMixin from mod dungeonnowloading,pl:mixin:APP:integrated_api-common.mixins.json:structures.StructureTemplateMixin from mod integrated_api,pl:mixin:APP:integrated_api-common.mixins.json:structures.TemplateAccessor from mod integrated_api,pl:mixin:APP:blueprint.mixins.json:StructureTemplateMixin from mod blueprint,pl:mixin:APP:zeta.mixins.json:StructureTemplateMixin from mod zeta,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.levelgen.structure.TemplateStructurePiece.m_213694_(TemplateStructurePiece.java:83) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:computing_frames,pl:connector_pre_launch:A,re:classloading,pl:connector_pre_launch:A,re:mixin,pl:connector_pre_launch:A}     at net.minecraft.world.level.levelgen.structure.structures.OceanRuinPieces$OceanRuinPiece.m_213694_(OceanRuinPieces.java:309) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,xf:fml:forge:forge_method_redirector,pl:connector_pre_launch:A}     at net.minecraft.world.level.levelgen.structure.StructureStart.m_226850_(StructureStart.java:90) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:connector_pre_launch:A,re:classloading,pl:mixin:APP:blueprint.mixins.json:StructureStartMixin from mod blueprint,pl:mixin:APP:zeta.mixins.json:StructureStartMixin from mod zeta,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkGenerator.m_223080_(ChunkGenerator.java:320) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:citadel.mixins.json:ChunkGeneratorMixin from mod citadel,pl:mixin:APP:bettermineshafts.mixins.json:DisableVanillaMineshaftsMixin from mod bettermineshafts,pl:mixin:A,pl:connector_pre_launch:A}     at com.google.common.collect.ImmutableList.forEach(ImmutableList.java:422) ~[guava-31.1-jre.jar%2374!/:?] {re:mixin}     at net.minecraft.world.level.chunk.ChunkGenerator.m_213609_(ChunkGenerator.java:319) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:citadel.mixins.json:ChunkGeneratorMixin from mod citadel,pl:mixin:APP:bettermineshafts.mixins.json:DisableVanillaMineshaftsMixin from mod bettermineshafts,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus.m_279978_(ChunkStatus.java:108) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus$SimpleGenerationTask.m_214024_(ChunkStatus.java:309) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus.m_280308_(ChunkStatus.java:252) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:connector_pre_launch:A}     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$27(ChunkMap.java:643) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at com.mojang.datafixers.util.Either$Left.map(Either.java:38) ~[datafixerupper-6.0.8.jar%2377!/:?] {}     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$29(ChunkMap.java:634) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ~[?:?] {}     at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {}     at net.minecraft.server.level.ChunkTaskPriorityQueueSorter.m_143188_(ChunkTaskPriorityQueueSorter.java:62) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18759_(ProcessorMailbox.java:91) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18747_(ProcessorMailbox.java:146) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.run(ProcessorMailbox.java:102) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395) ~[?:?] {}     at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] {} -- Feature -- Details:     Description: ResourceKey[minecraft:worldgen/structure / minecraft:ocean_ruin_warm] Stacktrace:     at net.minecraft.world.level.chunk.ChunkGenerator.m_213609_(ChunkGenerator.java:319) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:citadel.mixins.json:ChunkGeneratorMixin from mod citadel,pl:mixin:APP:bettermineshafts.mixins.json:DisableVanillaMineshaftsMixin from mod bettermineshafts,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus.m_279978_(ChunkStatus.java:108) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus$SimpleGenerationTask.m_214024_(ChunkStatus.java:309) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus.m_280308_(ChunkStatus.java:252) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:connector_pre_launch:A}     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$27(ChunkMap.java:643) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at com.mojang.datafixers.util.Either$Left.map(Either.java:38) ~[datafixerupper-6.0.8.jar%2377!/:?] {}     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$29(ChunkMap.java:634) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ~[?:?] {}     at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {}     at net.minecraft.server.level.ChunkTaskPriorityQueueSorter.m_143188_(ChunkTaskPriorityQueueSorter.java:62) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18759_(ProcessorMailbox.java:91) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18747_(ProcessorMailbox.java:146) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.run(ProcessorMailbox.java:102) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395) ~[?:?] {}     at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] {}     at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[?:?] {}     at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[?:?] {re:mixin,re:computing_frames}     at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[?:?] {re:mixin,re:computing_frames}     at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[?:?] {re:mixin} -- Generation -- Details:     CenterX: -473     CenterZ: 285     Seed: 1176945434636047048 Stacktrace:     at net.minecraft.world.level.chunk.ChunkGenerator.m_213609_(ChunkGenerator.java:319) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:citadel.mixins.json:ChunkGeneratorMixin from mod citadel,pl:mixin:APP:bettermineshafts.mixins.json:DisableVanillaMineshaftsMixin from mod bettermineshafts,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus.m_279978_(ChunkStatus.java:108) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus$SimpleGenerationTask.m_214024_(ChunkStatus.java:309) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.world.level.chunk.ChunkStatus.m_280308_(ChunkStatus.java:252) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:connector_pre_launch:A}     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$27(ChunkMap.java:643) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at com.mojang.datafixers.util.Either$Left.map(Either.java:38) ~[datafixerupper-6.0.8.jar%2377!/:?] {}     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$29(ChunkMap.java:634) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ~[?:?] {}     at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {}     at net.minecraft.server.level.ChunkTaskPriorityQueueSorter.m_143188_(ChunkTaskPriorityQueueSorter.java:62) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18759_(ProcessorMailbox.java:91) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18747_(ProcessorMailbox.java:146) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.run(ProcessorMailbox.java:102) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395) ~[?:?] {}     at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] {}     at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[?:?] {}     at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[?:?] {re:mixin,re:computing_frames}     at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[?:?] {re:mixin,re:computing_frames}     at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[?:?] {re:mixin} -- Chunk to be generated -- Details:     Location: -473,285     Position hash: 1228360646183     Generator: net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator@68ab688d Stacktrace:     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$27(ChunkMap.java:643) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at com.mojang.datafixers.util.Either$Left.map(Either.java:38) ~[datafixerupper-6.0.8.jar%2377!/:?] {}     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$29(ChunkMap.java:634) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:bugfix.paper_chunk_patches.ChunkMapMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:bugfix.chunk_deadlock.ChunkMapLoadMixin from mod modernfix,pl:mixin:APP:fabric-networking-api-v1.mixins.json:accessor.ThreadedAnvilChunkStorageAccessor from mod fabric_networking_api_v1,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:ThreadedAnvilChunkStorageMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:lithium.mixins.json:world.player_chunk_tick.ThreadedAnvilChunkStorageMixin from mod radium,pl:mixin:APP:lithostitched.mixins.json:common.ChunkMapMixin from mod lithostitched,pl:mixin:A,pl:connector_pre_launch:A}     at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ~[?:?] {}     at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?] {}     at net.minecraft.server.level.ChunkTaskPriorityQueueSorter.m_143188_(ChunkTaskPriorityQueueSorter.java:62) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18759_(ProcessorMailbox.java:91) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.m_18747_(ProcessorMailbox.java:146) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at net.minecraft.util.thread.ProcessorMailbox.run(ProcessorMailbox.java:102) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:classloading,pl:connector_pre_launch:A}     at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395) ~[?:?] {}     at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] {}     at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[?:?] {}     at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[?:?] {re:mixin,re:computing_frames}     at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[?:?] {re:mixin,re:computing_frames}     at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[?:?] {re:mixin} -- Wrapped in -- Details:     Wrapping exception: ~~ERROR~~ CompletionException: net.minecraft.ReportedException: Feature placement Stacktrace:     at net.minecraft.server.MinecraftServer.m_206568_(MinecraftServer.java:718) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:computing_frames,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:perf.fix_loop_spin_waiting.MinecraftServerMixin from mod modernfix,pl:mixin:APP:modernfix-common.mixins.json:core.MinecraftServerMixin from mod modernfix,pl:mixin:APP:modernfix-common.mixins.json:perf.dedicated_reload_executor.MinecraftServerMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:core.MinecraftServerMixin from mod modernfix,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin from mod citadel,pl:mixin:APP:connectormod.mixins.json:registries.MinecraftServerMixin from mod connectormod,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:MinecraftServerMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:fabric-resource-loader-v0.mixins.json:MinecraftServerMixin from mod fabric_resource_loader_v0,pl:mixin:APP:blueprint.mixins.json:MinecraftServerMixin from mod blueprint,pl:mixin:APP:fabric-message-api-v1.mixins.json:MinecraftServerMixin from mod fabric_message_api_v1,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:675) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:computing_frames,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:perf.fix_loop_spin_waiting.MinecraftServerMixin from mod modernfix,pl:mixin:APP:modernfix-common.mixins.json:core.MinecraftServerMixin from mod modernfix,pl:mixin:APP:modernfix-common.mixins.json:perf.dedicated_reload_executor.MinecraftServerMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:core.MinecraftServerMixin from mod modernfix,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin from mod citadel,pl:mixin:APP:connectormod.mixins.json:registries.MinecraftServerMixin from mod connectormod,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:MinecraftServerMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:fabric-resource-loader-v0.mixins.json:MinecraftServerMixin from mod fabric_resource_loader_v0,pl:mixin:APP:blueprint.mixins.json:MinecraftServerMixin from mod blueprint,pl:mixin:APP:fabric-message-api-v1.mixins.json:MinecraftServerMixin from mod fabric_message_api_v1,pl:mixin:A,pl:connector_pre_launch:A}     at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251) ~[server-1.20.1-20230612.114412-srg.jar%23269!/:?] {re:mixin,pl:accesstransformer:B,pl:connector_pre_launch:A,re:computing_frames,pl:accesstransformer:B,pl:connector_pre_launch:A,re:classloading,pl:accesstransformer:B,pl:mixin:APP:modernfix-common.mixins.json:perf.fix_loop_spin_waiting.MinecraftServerMixin from mod modernfix,pl:mixin:APP:modernfix-common.mixins.json:core.MinecraftServerMixin from mod modernfix,pl:mixin:APP:modernfix-common.mixins.json:perf.dedicated_reload_executor.MinecraftServerMixin from mod modernfix,pl:mixin:APP:modernfix-forge.mixins.json:core.MinecraftServerMixin from mod modernfix,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin from mod citadel,pl:mixin:APP:connectormod.mixins.json:registries.MinecraftServerMixin from mod connectormod,pl:mixin:APP:fabric-lifecycle-events-v1.mixins.json:MinecraftServerMixin from mod fabric_lifecycle_events_v1,pl:mixin:APP:fabric-resource-loader-v0.mixins.json:MinecraftServerMixin from mod fabric_resource_loader_v0,pl:mixin:APP:blueprint.mixins.json:MinecraftServerMixin from mod blueprint,pl:mixin:APP:fabric-message-api-v1.mixins.json:MinecraftServerMixin from mod fabric_message_api_v1,pl:mixin:A,pl:connector_pre_launch:A}     at java.lang.Thread.run(Thread.java:833) ~[?:?] {re:mixin} -- System Details -- Details:     Minecraft Version: 1.20.1     Minecraft Version ID: 1.20.1     Operating System: Windows 10 (amd64) version 10.0     Java Version: 17.0.7, Oracle Corporation     Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode, sharing), Oracle Corporation     Memory: 475988768 bytes (453 MiB) / 2516582400 bytes (2400 MiB) up to 34359738368 bytes (32768 MiB)     CPUs: 32     Processor Vendor: AuthenticAMD     Processor Name: AMD Ryzen 9 9950X 16-Core Processor                 Identifier: AuthenticAMD Family 26 Model 68 Stepping 0     Microarchitecture: unknown     Frequency (GHz): 4.29     Number of physical packages: 1     Number of physical CPUs: 16     Number of logical CPUs: 32     Graphics card #0 name: NVIDIA GeForce RTX 5070 Ti     Graphics card #0 vendor: NVIDIA (0x10de)     Graphics card #0 VRAM (MB): 4095.00     Graphics card #0 deviceId: 0x2c05     Graphics card #0 versionInfo: DriverVersion=32.0.15.8097     Memory slot #0 capacity (MB): 49152.00     Memory slot #0 clockSpeed (GHz): 6.40     Memory slot #0 type: Unknown     Memory slot #1 capacity (MB): 49152.00     Memory slot #1 clockSpeed (GHz): 6.40     Memory slot #1 type: Unknown     Virtual memory max (MB): 104051.97     Virtual memory used (MB): 20980.76     Swap memory total (MB): 6144.00     Swap memory used (MB): 36.83     JVM Flags: 1 total; -Xmx32G     Server Running: true     Player Count: 0 / 20; []     Data Packs: vanilla, mod:betterdungeons, mod:fabric_renderer_api_v1, mod:netherexp, mod:playeranimator (incompatible), mod:fabric_item_api_v1, mod:illagerinvasion, mod:fabric_rendering_fluids_v1, mod:exlinecopperequipment, mod:fabric_models_v0, mod:sophisticatedcore (incompatible), mod:golemsarefriends (incompatible), mod:fabric_convention_tags_v1, mod:placebo (incompatible), mod:citadel (incompatible), mod:alexsmobs (incompatible), mod:fabric_command_api_v1, mod:fabric_block_view_api_v2, mod:fabric_command_api_v2, mod:yungsapi, mod:fabric_data_attachment_api_v1, mod:mixinextras (incompatible), mod:bookshelf, mod:sophisticatedbackpacks (incompatible), mod:guardvillagers (incompatible), mod:fabric_screen_api_v1, mod:cloth_config (incompatible), mod:fabric_api, mod:fabric_content_registries_v0, mod:geophilic, mod:jadensnetherexpansiondelight, mod:farmersdelight, mod:fabric_game_rule_api_v1, mod:fabric_api_lookup_api_v1, mod:endersdelight, mod:cataclysmiccombat, mod:lionfishapi (incompatible), mod:cataclysm (incompatible), mod:curios (incompatible), mod:connectormod, mod:fabric_entity_events_v1, mod:spartanweaponry, mod:architectury (incompatible), mod:fabric_loot_api_v2, mod:betterendisland, mod:fabric_rendering_data_attachment_v1, mod:fabric_networking_api_v1, mod:illageandspillage, mod:bettermineshafts, mod:fabric_lifecycle_events_v1, mod:fabric_key_binding_api_v1, mod:fabric_client_tags_api_v1, mod:fabric_transfer_api_v1, mod:fabric_dimensions_v1, mod:mowziesmobs, mod:geckolib, mod:endertrigon (incompatible), mod:elysium_api, mod:fabric_model_loading_api_v1, mod:mowzies_cataclysm, mod:jei, mod:lithostitched, mod:graveyard (incompatible), mod:fabric_screen_handler_api_v1, mod:fabric_resource_loader_v0, mod:caelus (incompatible), mod:obscure_api (incompatible), mod:fabric_rendering_v1, mod:fabric_renderer_indigo, mod:fastsuite (incompatible), mod:dungeonnowloading (incompatible), mod:integrated_api, mod:fabric_mining_level_api_v1, mod:fromtheshadows (incompatible), mod:crackerslib (incompatible), mod:outer_end, mod:magistuarmory (incompatible), mod:starlight (incompatible), mod:aquamirae_mod_extra_music, mod:blueprint, mod:savage_and_ravage (incompatible), mod:fabric_particles_v1, mod:puzzlesaccessapi, mod:forge, mod:fabric_transitive_access_wideners_v1, mod:nyfsspiders (incompatible), mod:tectonic (incompatible), mod:caverns_and_chasms (incompatible), mod:upgrade_aquatic (incompatible), mod:illagerwarship, mod:okzoomer (incompatible), mod:enchdesc (incompatible), mod:moonlight (incompatible), mod:fabric_api_base, mod:bettercombat (incompatible), mod:combatroll (incompatible), mod:glowingraidillagers (incompatible), mod:fabric_blockrenderlayer_v1, mod:mixinsquared (incompatible), mod:fabric_block_api_v1, mod:nethersdelight, mod:fabric_resource_conditions_api_v1, mod:spartanshields, mod:fabric_item_group_api_v1, mod:fastbench (incompatible), mod:aquacombat, mod:zeta (incompatible), mod:quark (incompatible), mod:supplementaries, mod:amendments (incompatible), mod:irons_spellbooks, mod:fabric_biome_api_v1, mod:fabric_registry_sync_v0, mod:fastfurnace (incompatible), mod:oceansdelight (incompatible), mod:alexsdelight, mod:fabric_recipe_api_v1, mod:ferritecore (incompatible), mod:fabric_object_builder_api_v1, mod:puzzleslib, mod:fabric_sound_api_v1, mod:ias_spellbooks, mod:fabric_message_api_v1, mod:fabric_data_generation_api_v1, mod:fabric_events_interaction_v0, mod:aquamirae (incompatible), tectonic/tectonic (incompatible), tectonic/tectonic/overlay.mod, alexsmobs_compat, caverns_and_chasms_compat, fabric, lithostitched/breaks_seed_parity, Supplementaries Generated Pack, mod:cupboard (incompatible), mod:modernfix (incompatible), mod:chunky (incompatible), mod:radium     Enabled Feature Flags: minecraft:vanilla     World Generation: Experimental     Is Modded: Definitely; Server brand changed to 'forge'     Type: Dedicated Server (map_server.txt)     Sinytra Connector: 1.0.0-beta.46+1.20.1         SINYTRA CONNECTOR IS PRESENT!         Please verify issues are not caused by Connector before reporting them to mod authors. If you're unsure, file a report on Connector's issue tracker.         Connector's issue tracker can be found at https://github.com/Sinytra/Connector/issues.     ModLauncher: 10.0.9+10.0.9+main.dcd20f30     ModLauncher launch target: forgeserver     ModLauncher naming: srg     ModLauncher services:          mixin-0.8.5.jar mixin PLUGINSERVICE          eventbus-6.0.5.jar eventbus PLUGINSERVICE          fmlloader-1.20.1-47.4.0.jar slf4jfixer PLUGINSERVICE          fmlloader-1.20.1-47.4.0.jar object_holder_definalize PLUGINSERVICE          fmlloader-1.20.1-47.4.0.jar runtime_enum_extender PLUGINSERVICE          fmlloader-1.20.1-47.4.0.jar capability_token_subclass PLUGINSERVICE          accesstransformers-8.0.4.jar accesstransformer PLUGINSERVICE          fmlloader-1.20.1-47.4.0.jar runtimedistcleaner PLUGINSERVICE          modlauncher-10.0.9.jar mixin TRANSFORMATIONSERVICE          modlauncher-10.0.9.jar fml TRANSFORMATIONSERVICE          modlauncher-10.0.9.jar mixin-transmogrifier TRANSFORMATIONSERVICE          modlauncher-10.0.9.jar connector_loader TRANSFORMATIONSERVICE      FML Language Providers:          [email protected]         lowcodefml@null         javafml@null     Mod List:          YungsBetterDungeons-1.20-Forge-4.0.4.jar          |YUNG's Better Dungeons        |betterdungeons                |1.20-Forge-4.0.4    |DONE      |Manifest: NOSIGNATURE         fabric-renderer-api-v1-3.2.1+cf68abbe77.jar       |Fabric Renderer API (v1)      |fabric_renderer_api_v1        |3.2.1+cf68abbe77    |DONE      |Manifest: NOSIGNATURE         Jadens-Nether-Expansion-2.3.5.jar                 |Jaden's Nether Expansion      |netherexp                     |2.3.5               |DONE      |Manifest: NOSIGNATURE         player-animation-lib-forge-1.0.2-rc1+1.20.jar     |Player Animator               |playeranimator                |1.0.2-rc1+1.20      |DONE      |Manifest: NOSIGNATURE         fabric-item-api-v1-2.1.28+4d0bbcfa77.jar          |Fabric Item API (v1)          |fabric_item_api_v1            |2.1.28+4d0bbcfa77   |DONE      |Manifest: NOSIGNATURE         IllagerInvasion-v8.0.7-1.20.1-Forge.jar           |Illager Invasion              |illagerinvasion               |8.0.7               |DONE      |Manifest: 9a:09:85:98:65:c4:8c:11:c5:49:f6:d6:33:23:39:df:8d:b4:ff:92:84:b8:bd:a5:83:9f:ac:7f:2a:d1:4b:6a         fabric-rendering-fluids-v1-3.0.28+4ac5e37a77.jar  |Fabric Rendering Fluids (v1)  |fabric_rendering_fluids_v1    |3.0.28+4ac5e37a77   |DONE      |Manifest: NOSIGNATURE         exlinecopperequipment-forge-1.20.1-v2.0.8.jar     |Exline's Copper Equipment     |exlinecopperequipment         |2.0.8               |DONE      |Manifest: NOSIGNATURE         fabric-models-v0-0.4.2+7c3892a477.jar             |Fabric Models (v0)            |fabric_models_v0              |0.4.2+7c3892a477    |DONE      |Manifest: NOSIGNATURE         sophisticatedcore-1.20.1-1.2.79.1066.jar          |Sophisticated Core            |sophisticatedcore             |1.2.79.1066         |DONE      |Manifest: NOSIGNATURE         golemsarefriends-1.20.0-1.0.1.jar                 |Golems Are Friends Not Fodder |golemsarefriends              |1.20.0-1.0.1        |DONE      |Manifest: NOSIGNATURE         fabric-convention-tags-v1-1.5.5+fa3d1c0177.jar    |Fabric Convention Tags        |fabric_convention_tags_v1     |1.5.5+fa3d1c0177    |DONE      |Manifest: NOSIGNATURE         Placebo-1.20.1-8.6.3.jar                          |Placebo                       |placebo                       |8.6.3               |DONE      |Manifest: NOSIGNATURE         modernfix-forge-5.24.4+mc1.20.1.jar               |ModernFix                     |modernfix                     |5.24.4+mc1.20.1     |DONE      |Manifest: NOSIGNATURE         citadel-2.6.2-1.20.1.jar                          |Citadel                       |citadel                       |2.6.2               |DONE      |Manifest: NOSIGNATURE         alexsmobs-1.22.9.jar                              |Alex's Mobs                   |alexsmobs                     |1.22.9              |DONE      |Manifest: NOSIGNATURE         fabric-command-api-v1-1.2.34+f71b366f77.jar       |Fabric Command API (v1)       |fabric_command_api_v1         |1.2.34+f71b366f77   |DONE      |Manifest: NOSIGNATURE         fabric-block-view-api-v2-1.0.1+0767707077.jar     |Fabric BlockView API (v2)     |fabric_block_view_api_v2      |1.0.1+0767707077    |DONE      |Manifest: NOSIGNATURE         fabric-command-api-v2-2.2.13+561530ec77.jar       |Fabric Command API (v2)       |fabric_command_api_v2         |2.2.13+561530ec77   |DONE      |Manifest: NOSIGNATURE         YungsApi-1.20-Forge-4.0.6.jar                     |YUNG's API                    |yungsapi                      |1.20-Forge-4.0.6    |DONE      |Manifest: NOSIGNATURE         fabric-data-attachment-api-v1-1.0.0+30ef839e77.jar|Fabric Data Attachment API (v1|fabric_data_attachment_api_v1 |1.0.0+30ef839e77    |DONE      |Manifest: NOSIGNATURE         mixinextras-forge-0.2.0-beta.7.jar                |MixinExtras                   |mixinextras                   |0.2.0-beta.7        |DONE      |Manifest: NOSIGNATURE         Bookshelf-Forge-1.20.1-20.2.13.jar                |Bookshelf                     |bookshelf                     |20.2.13             |DONE      |Manifest: eb:c4:b1:67:8b:f9:0c:db:dc:4f:01:b1:8e:61:64:39:4c:10:85:0b:a6:c4:c7:48:f0:fa:95:f2:cb:08:3a:e5         sophisticatedbackpacks-1.20.1-3.23.23.1289.jar    |Sophisticated Backpacks       |sophisticatedbackpacks        |3.23.23.1289        |DONE      |Manifest: NOSIGNATURE         guardvillagers-1.20.1-1.6.11.jar                  |Guard Villagers               |guardvillagers                |1.20.1-1.6.11       |DONE      |Manifest: NOSIGNATURE         fabric-screen-api-v1-2.0.8+45a670a577.jar         |Fabric Screen API (v1)        |fabric_screen_api_v1          |2.0.8+45a670a577    |DONE      |Manifest: NOSIGNATURE         cloth-config-11.1.136-forge.jar                   |Cloth Config v10 API          |cloth_config                  |11.1.136            |DONE      |Manifest: NOSIGNATURE         fabric-api-0.92.2+1.11.12+1.20.1.jar              |Forgified Fabric API          |fabric_api                    |0.92.2+1.11.12+1.20.|DONE      |Manifest: NOSIGNATURE         fabric-content-registries-v0-4.0.11+a670df1e77.jar|Fabric Content Registries (v0)|fabric_content_registries_v0  |4.0.11+a670df1e77   |DONE      |Manifest: NOSIGNATURE         Geophilic v3.4.2 f15-80.mod.jar                   |Geophilic                     |geophilic                     |3.4.2               |DONE      |Manifest: NOSIGNATURE         jadensnetherexpansiondelight-1.0.3-1.20.1-forge.ja|Jaden's Nether Expansion Delig|jadensnetherexpansiondelight  |1.0.3-1.20.1-forge  |DONE      |Manifest: NOSIGNATURE         FarmersDelight-1.20.1-1.2.8.jar                   |Farmer's Delight              |farmersdelight                |1.20.1-1.2.8        |DONE      |Manifest: NOSIGNATURE         fabric-game-rule-api-v1-1.0.40+683d4da877.jar     |Fabric Game Rule API (v1)     |fabric_game_rule_api_v1       |1.0.40+683d4da877   |DONE      |Manifest: NOSIGNATURE         fabric-api-lookup-api-v1-1.6.36+67f9824077.jar    |Fabric API Lookup API (v1)    |fabric_api_lookup_api_v1      |1.6.36+67f9824077   |DONE      |Manifest: NOSIGNATURE         endersdelight-forge-1.20.1-1.1.3.jar              |Ender's Delight               |endersdelight                 |1.1.3               |DONE      |Manifest: NOSIGNATURE         cataclysmiccombat-1.4.1-1.20.1.jar                |Cataclysmic Combat            |cataclysmiccombat             |1.4                 |DONE      |Manifest: NOSIGNATURE         Chunky-1.3.146.jar                                |Chunky                        |chunky                        |1.3.146             |DONE      |Manifest: NOSIGNATURE         lionfishapi-2.4.jar                               |LionfishAPI                   |lionfishapi                   |2.4                 |DONE      |Manifest: NOSIGNATURE         L_Enders_Cataclysm-3.15.jar                       |cataclysm                     |cataclysm                     |3.15                |DONE      |Manifest: NOSIGNATURE         curios-forge-5.14.1+1.20.1.jar                    |Curios API                    |curios                        |5.14.1+1.20.1       |DONE      |Manifest: NOSIGNATURE         Connector-1.0.0-beta.46+1.20.1-mod.jar            |Connector                     |connectormod                  |1.0.0-beta.46+1.20.1|DONE      |Manifest: NOSIGNATURE         fabric-entity-events-v1-1.6.0+4ca7515277.jar      |Fabric Entity Events (v1)     |fabric_entity_events_v1       |1.6.0+4ca7515277    |DONE      |Manifest: NOSIGNATURE         SpartanWeaponry-1.20.1-forge-3.2.1-all.jar        |Spartan Weaponry              |spartanweaponry               |3.2.1               |DONE      |Manifest: NOSIGNATURE         architectury-9.2.14-forge.jar                     |Architectury                  |architectury                  |9.2.14              |DONE      |Manifest: NOSIGNATURE         fabric-loot-api-v2-1.2.1+eb28f93e77.jar           |Fabric Loot API (v2)          |fabric_loot_api_v2            |1.2.1+eb28f93e77    |DONE      |Manifest: NOSIGNATURE         cupboard-1.20.1-2.7.jar                           |Cupboard utilities            |cupboard                      |1.20.1-2.7          |DONE      |Manifest: NOSIGNATURE         YungsBetterEndIsland-1.20-Forge-2.0.6.jar         |YUNG's Better End Island      |betterendisland               |1.20-Forge-2.0.6    |DONE      |Manifest: NOSIGNATURE         fabric-rendering-data-attachment-v1-0.3.37+a6081af|Fabric Rendering Data Attachme|fabric_rendering_data_attachme|0.3.37+a6081afc77   |DONE      |Manifest: NOSIGNATURE         fabric-networking-api-v1-1.3.11+503a202477.jar    |Fabric Networking API (v1)    |fabric_networking_api_v1      |1.3.11+503a202477   |DONE      |Manifest: NOSIGNATURE         illageandspillagerespillaged-1.2.8.jar            |Illage and Spillage: Respillag|illageandspillage             |1.2.8               |DONE      |Manifest: NOSIGNATURE         YungsBetterMineshafts-1.20-Forge-4.0.4.jar        |YUNG's Better Mineshafts      |bettermineshafts              |1.20-Forge-4.0.4    |DONE      |Manifest: NOSIGNATURE         fabric-lifecycle-events-v1-2.2.22+afab492177.jar  |Fabric Lifecycle Events (v1)  |fabric_lifecycle_events_v1    |2.2.22+afab492177   |DONE      |Manifest: NOSIGNATURE         fabric-key-binding-api-v1-1.0.37+561530ec77.jar   |Fabric Key Binding API (v1)   |fabric_key_binding_api_v1     |1.0.37+561530ec77   |DONE      |Manifest: NOSIGNATURE         fabric-client-tags-api-v1-1.1.2+5d6761b877.jar    |Fabric Client Tags            |fabric_client_tags_api_v1     |1.1.2+5d6761b877    |DONE      |Manifest: NOSIGNATURE         fabric-transfer-api-v1-3.3.5+631c9cd677.jar       |Fabric Transfer API (v1)      |fabric_transfer_api_v1        |3.3.5+631c9cd677    |DONE      |Manifest: NOSIGNATURE         fabric-dimensions-v1-2.1.54+8005d10d77.jar        |Fabric Dimensions API (v1)    |fabric_dimensions_v1          |2.1.54+8005d10d77   |DONE      |Manifest: NOSIGNATURE         radium-mc1.20.1-0.12.4+git.26c9d8e.jar            |Radium                        |radium                        |0.12.4+git.26c9d8e  |DONE      |Manifest: NOSIGNATURE         mowziesmobs-1.7.3.jar                             |Mowzie's Mobs                 |mowziesmobs                   |1.7.3               |DONE      |Manifest: NOSIGNATURE         geckolib-forge-1.20.1-4.7.3.jar                   |GeckoLib 4                    |geckolib                      |4.7.3               |DONE      |Manifest: NOSIGNATURE         endertrigon-1.20.1-1.1-all.jar                    |Ender Trigon                  |endertrigon                   |1.20.1-1.1          |DONE      |Manifest: NOSIGNATURE         ElysiumAPI-1.20.1-1.1.3.jar                       |Elysium                       |elysium_api                   |1.1.3               |DONE      |Manifest: NOSIGNATURE         fabric-model-loading-api-v1-1.0.3+6274ab9d77.jar  |Fabric Model Loading API (v1) |fabric_model_loading_api_v1   |1.0.3+6274ab9d77    |DONE      |Manifest: NOSIGNATURE         mowzies_cataclysm-1.2.0.jar                       |Mowzie's Cataclysm            |mowzies_cataclysm             |1.2.0               |DONE      |Manifest: NOSIGNATURE         jei-1.20.1-forge-15.20.0.112.jar                  |Just Enough Items             |jei                           |15.20.0.112         |DONE      |Manifest: NOSIGNATURE         lithostitched-forge-1.20.1-1.4.11.jar             |Lithostitched                 |lithostitched                 |1.4.11              |DONE      |Manifest: NOSIGNATURE         The_Graveyard_3.1_(FORGE)_for_1.20.1.jar          |The Graveyard                 |graveyard                     |3.1                 |DONE      |Manifest: NOSIGNATURE         fabric-screen-handler-api-v1-1.3.30+561530ec77.jar|Fabric Screen Handler API (v1)|fabric_screen_handler_api_v1  |1.3.30+561530ec77   |DONE      |Manifest: NOSIGNATURE         fabric-resource-loader-v0-0.11.10+bcd08ed377.jar  |Fabric Resource Loader (v0)   |fabric_resource_loader_v0     |0.11.10+bcd08ed377  |DONE      |Manifest: NOSIGNATURE         caelus-forge-3.2.0+1.20.1.jar                     |Caelus API                    |caelus                        |3.2.0+1.20.1        |DONE      |Manifest: NOSIGNATURE         obscure_api-15.jar                                |Obscure API                   |obscure_api                   |15                  |DONE      |Manifest: NOSIGNATURE         fabric-rendering-v1-3.0.8+66e9a48f77.jar          |Fabric Rendering (v1)         |fabric_rendering_v1           |3.0.8+66e9a48f77    |DONE      |Manifest: NOSIGNATURE         fabric-renderer-indigo-1.5.2+b5b2da4177.jar       |Fabric Renderer - Indigo      |fabric_renderer_indigo        |1.5.2+b5b2da4177    |DONE      |Manifest: NOSIGNATURE         FastSuite-1.20.1-5.1.0.jar                        |Fast Suite                    |fastsuite                     |5.1.0               |DONE      |Manifest: NOSIGNATURE         Dungeon Now Loading-forge-1.20.1-1.5.jar          |Dungeon Now Loading           |dungeonnowloading             |1.5                 |DONE      |Manifest: NOSIGNATURE         integrated_api-1.5.3+1.20.1-forge.jar             |Integrated API                |integrated_api                |1.5.3+1.20.1-forge  |DONE      |Manifest: NOSIGNATURE         fabric-mining-level-api-v1-2.1.50+561530ec77.jar  |Fabric Mining Level API (v1)  |fabric_mining_level_api_v1    |2.1.50+561530ec77   |DONE      |Manifest: NOSIGNATURE         fromtheshadowsreborn-2.8.jar                      |From the Shadows Reborn       |fromtheshadows                |2.8                 |DONE      |Manifest: NOSIGNATURE         crackerslib-forge-1.20.1-0.3.2.1.jar              |CrackersLib                   |crackerslib                   |1.20.1-0.3.2.1      |DONE      |Manifest: NOSIGNATURE         TheOuterEnd-1.0.10.jar                            |The Outer End                 |outer_end                     |1.0.8               |DONE      |Manifest: NOSIGNATURE         [1.20.1-forge]-Epic-Knights-9.23.jar              |Epic Knights Mod              |magistuarmory                 |9.23                |DONE      |Manifest: NOSIGNATURE         starlight-1.1.2+forge.1cda73c.jar                 |Starlight                     |starlight                     |1.1.2+forge.1cda73c |DONE      |Manifest: NOSIGNATURE         Aquamirae Mod Boss Music Tweaks 1.20.1 v1.1.0.jar |Aquamirae Mod EXTRA Music     |aquamirae_mod_extra_music     |1.0.0               |DONE      |Manifest: NOSIGNATURE         blueprint-1.20.1-7.1.3.jar                        |Blueprint                     |blueprint                     |7.1.3               |DONE      |Manifest: NOSIGNATURE         savage_and_ravage-1.20.1-6.0.0.jar                |Savage & Ravage               |savage_and_ravage             |6.0.0               |DONE      |Manifest: NOSIGNATURE         fabric-particles-v1-1.1.2+78e1ecb877.jar          |Fabric Particles (v1)         |fabric_particles_v1           |1.1.2+78e1ecb877    |DONE      |Manifest: NOSIGNATURE         puzzlesaccessapi-forge-20.1.1.jar                 |Puzzles Access Api            |puzzlesaccessapi              |20.1.1              |DONE      |Manifest: NOSIGNATURE         forge-1.20.1-47.4.0-universal.jar                 |Forge                         |forge                         |47.4.0              |DONE      |Manifest: 84:ce:76:e8:45:35:e4:0e:63:86:df:47:59:80:0f:67:6c:c1:5f:6e:5f:4d:b3:54:47:1a:9f:7f:ed:5e:f2:90         fabric-transitive-access-wideners-v1-4.3.1+1880499|Fabric Transitive Access Widen|fabric_transitive_access_widen|4.3.1+1880499877    |DONE      |Manifest: NOSIGNATURE         nyfsspiders-forge-1.20.1-2.1.1.jar                |Nyf's Spiders                 |nyfsspiders                   |2.1.1               |DONE      |Manifest: NOSIGNATURE         tectonic-3.0.6-forge-1.20.1.jar                   |Tectonic                      |tectonic                      |3.0.6               |DONE      |Manifest: NOSIGNATURE         server-1.20.1-20230612.114412-srg.jar             |Minecraft                     |minecraft                     |1.20.1              |DONE      |Manifest: NOSIGNATURE         caverns_and_chasms-1.20.1-2.0.0.jar               |Caverns & Chasms              |caverns_and_chasms            |2.0.0               |DONE      |Manifest: NOSIGNATURE         upgrade_aquatic-1.20.1-6.0.3.jar                  |Upgrade Aquatic               |upgrade_aquatic               |6.0.3               |DONE      |Manifest: NOSIGNATURE         illagerwarship-1.0.1-forge-1.20.1.jar             |Illager-Warship               |illagerwarship                |1.0.1               |DONE      |Manifest: NOSIGNATURE         okzoomer-forge-1.20-3.0.1.jar                     |OkZoomer                      |okzoomer                      |3.0.1               |DONE      |Manifest: NOSIGNATURE         EnchantmentDescriptions-Forge-1.20.1-17.1.19.jar  |EnchantmentDescriptions       |enchdesc                      |17.1.19             |DONE      |Manifest: eb:c4:b1:67:8b:f9:0c:db:dc:4f:01:b1:8e:61:64:39:4c:10:85:0b:a6:c4:c7:48:f0:fa:95:f2:cb:08:3a:e5         moonlight-1.20-2.15.6-forge.jar                   |Moonlight Library             |moonlight                     |1.20-2.15.6         |DONE      |Manifest: NOSIGNATURE         fabric-api-base-0.4.31+ef105b4977.jar             |Fabric API Base               |fabric_api_base               |0.4.31+ef105b4977   |DONE      |Manifest: NOSIGNATURE         bettercombat-forge-1.8.6+1.20.1.jar               |Better Combat                 |bettercombat                  |1.8.6+1.20.1        |DONE      |Manifest: NOSIGNATURE         combatroll-forge-1.3.3+1.20.1.jar                 |Combat Roll                   |combatroll                    |1.3.3+1.20.1        |DONE      |Manifest: NOSIGNATURE         glowingraidillagers-1.20-1.20.1-1.0.0.jar         |GlowingRaidIllagers           |glowingraidillagers           |1.0.0               |DONE      |Manifest: NOSIGNATURE         fabric-blockrenderlayer-v1-1.1.41+1d0da21e77.jar  |Fabric BlockRenderLayer Regist|fabric_blockrenderlayer_v1    |1.1.41+1d0da21e77   |DONE      |Manifest: NOSIGNATURE         mixinsquared-forge-0.1.1.jar                      |MixinSquared                  |mixinsquared                  |0.1.1               |DONE      |Manifest: NOSIGNATURE         fabric-block-api-v1-1.0.11+0e6cb7f777.jar         |Fabric Block API (v1)         |fabric_block_api_v1           |1.0.11+0e6cb7f777   |DONE      |Manifest: NOSIGNATURE         nethersdelight-1.20.1-4.0.jar                     |Nether's Delight              |nethersdelight                |1.20.1-4.0          |DONE      |Manifest: NOSIGNATURE         fabric-resource-conditions-api-v1-2.3.8+9e342fc177|Fabric Resource Conditions API|fabric_resource_conditions_api|2.3.8+9e342fc177    |DONE      |Manifest: NOSIGNATURE         SpartanShields-1.20.1-forge-3.1.1.jar             |Spartan Shields               |spartanshields                |3.1.1               |DONE      |Manifest: NOSIGNATURE         fabric-item-group-api-v1-4.0.12+c9161c2d77.jar    |Fabric Item Group API (v1)    |fabric_item_group_api_v1      |4.0.12+c9161c2d77   |DONE      |Manifest: NOSIGNATURE         FastWorkbench-1.20.1-8.0.4.jar                    |Fast Workbench                |fastbench                     |8.0.4               |DONE      |Manifest: NOSIGNATURE         aquacombat 1.2.jar                                |Aqua combat                   |aquacombat                    |1.2                 |DONE      |Manifest: NOSIGNATURE         Zeta-1.0-30.jar                                   |Zeta                          |zeta                          |1.0-30              |DONE      |Manifest: NOSIGNATURE         Quark-4.0-462.jar                                 |Quark                         |quark                         |4.0-462             |DONE      |Manifest: NOSIGNATURE         supplementaries-1.20-3.1.36.jar                   |Supplementaries               |supplementaries               |1.20-3.1.36         |DONE      |Manifest: NOSIGNATURE         amendments-1.20-2.0.3.jar                         |Amendments                    |amendments                    |1.20-2.0.3          |DONE      |Manifest: NOSIGNATURE         irons_spellbooks-1.20.1-3.4.0.10.jar              |Iron's Spells 'n Spellbooks   |irons_spellbooks              |1.20.1-3.4.0.10     |DONE      |Manifest: NOSIGNATURE         fabric-biome-api-v1-13.0.13+dc36698e77.jar        |Fabric Biome API (v1)         |fabric_biome_api_v1           |13.0.13+dc36698e77  |DONE      |Manifest: NOSIGNATURE         fabric-registry-sync-v0-2.3.3+1c0ea72177.jar      |Fabric Registry Sync (v0)     |fabric_registry_sync_v0       |2.3.3+1c0ea72177    |DONE      |Manifest: NOSIGNATURE         FastFurnace-1.20.1-8.0.2.jar                      |FastFurnace                   |fastfurnace                   |8.0.2               |DONE      |Manifest: NOSIGNATURE         oceansdelight-1.0.2-1.20.jar                      |Ocean's Delight               |oceansdelight                 |1.0.2-1.20          |DONE      |Manifest: NOSIGNATURE         alexsdelight-1.5.jar                              |Alex's Delight                |alexsdelight                  |1.5                 |DONE      |Manifest: NOSIGNATURE         fabric-recipe-api-v1-1.0.21+514a076577.jar        |Fabric Recipe API (v1)        |fabric_recipe_api_v1          |1.0.21+514a076577   |DONE      |Manifest: NOSIGNATURE         ferritecore-6.0.1-forge.jar                       |Ferrite Core                  |ferritecore                   |6.0.1               |DONE      |Manifest: 41:ce:50:66:d1:a0:05:ce:a1:0e:02:85:9b:46:64:e0:bf:2e:cf:60:30:9a:fe:0c:27:e0:63:66:9a:84:ce:8a         fabric-object-builder-api-v1-11.1.3+4bd998fa77.jar|Fabric Object Builder API (v1)|fabric_object_builder_api_v1  |11.1.3+4bd998fa77   |DONE      |Manifest: NOSIGNATURE         PuzzlesLib-v8.1.32-1.20.1-Forge.jar               |Puzzles Lib                   |puzzleslib                    |8.1.32              |DONE      |Manifest: 9a:09:85:98:65:c4:8c:11:c5:49:f6:d6:33:23:39:df:8d:b4:ff:92:84:b8:bd:a5:83:9f:ac:7f:2a:d1:4b:6a         fabric-sound-api-v1-1.0.13+4f23bd8477.jar         |Fabric Sound API (v1)         |fabric_sound_api_v1           |1.0.13+4f23bd8477   |DONE      |Manifest: NOSIGNATURE         illage-and-spell-age-0.5.0-1.20.1.jar             |Illage and Spell-age          |ias_spellbooks                |0.5.0-1.20.1        |DONE      |Manifest: NOSIGNATURE         fabric-message-api-v1-5.1.9+52cc178c77.jar        |Fabric Message API (v1)       |fabric_message_api_v1         |5.1.9+52cc178c77    |DONE      |Manifest: NOSIGNATURE         fabric-data-generation-api-v1-12.3.4+369cb3a477.ja|Fabric Data Generation API (v1|fabric_data_generation_api_v1 |12.3.4+369cb3a477   |DONE      |Manifest: NOSIGNATURE         fabric-events-interaction-v0-0.6.2+0d0bd5a777.jar |Fabric Events Interaction (v0)|fabric_events_interaction_v0  |0.6.2+0d0bd5a777    |DONE      |Manifest: NOSIGNATURE         aquamirae-6.API15.jar                             |Aquamirae                     |aquamirae                     |6.API15             |DONE      |Manifest: NOSIGNATURE     Crash Report UUID: 1bafdbcd-c29f-499e-a272-e920f6f303c3     FML: 47.4     Forge: net.minecraftforge:47.4.0  
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.