diff --git a/src/main/java/kamkeel/npcs/controllers/SyncController.java b/src/main/java/kamkeel/npcs/controllers/SyncController.java index d96129736..faa8329fa 100644 --- a/src/main/java/kamkeel/npcs/controllers/SyncController.java +++ b/src/main/java/kamkeel/npcs/controllers/SyncController.java @@ -4,9 +4,11 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import kamkeel.npcs.addon.DBCAddon; import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.packets.data.large.SyncEffectPacket; import kamkeel.npcs.network.packets.data.large.SyncPacket; import kamkeel.npcs.network.enums.EnumSyncAction; import kamkeel.npcs.network.enums.EnumSyncType; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -15,6 +17,8 @@ import noppes.npcs.controllers.*; import noppes.npcs.controllers.data.*; import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class SyncController { @@ -558,4 +562,21 @@ public class SyncController { break; } } + + public static void syncEffects(EntityPlayerMP playerMP){ + ConcurrentHashMap playerEffects = CustomEffectController.getInstance().getPlayerEffects(playerMP); + PlayerData playerData = PlayerData.get(playerMP); + playerData.effectData.setEffects(playerEffects); + + NBTTagCompound compound = playerData.getPlayerEffects(); + PacketHandler.Instance.sendToPlayer(new SyncEffectPacket(compound), playerMP); + } + + @SideOnly(Side.CLIENT) + public static void clientSyncEffects(NBTTagCompound compound) { + PlayerData playerData = PlayerData.get(Minecraft.getMinecraft().thePlayer); + if(playerData != null){ + playerData.setPlayerEffects(compound); + } + } } diff --git a/src/main/java/kamkeel/npcs/network/PacketHandler.java b/src/main/java/kamkeel/npcs/network/PacketHandler.java index a4dc8045f..a5728aa0d 100644 --- a/src/main/java/kamkeel/npcs/network/PacketHandler.java +++ b/src/main/java/kamkeel/npcs/network/PacketHandler.java @@ -367,6 +367,7 @@ public class PacketHandler { DATA_PACKET.registerPacket(new ScrollDataPacket()); DATA_PACKET.registerPacket(new ScrollListPacket()); DATA_PACKET.registerPacket(new SyncPacket()); + DATA_PACKET.registerPacket(new SyncEffectPacket()); DATA_PACKET.registerPacket(new GuiDataPacket()); DATA_PACKET.registerPacket(new PartyDataPacket()); } diff --git a/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java b/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java index 29e714dd8..afde0e87e 100644 --- a/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java +++ b/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java @@ -4,6 +4,7 @@ package kamkeel.npcs.network.enums; public enum EnumDataPacket { // Synchronization SYNC, + SYNC_EFFECTS, CONFIG_COMMAND, // Messages diff --git a/src/main/java/kamkeel/npcs/network/packets/data/large/SyncEffectPacket.java b/src/main/java/kamkeel/npcs/network/packets/data/large/SyncEffectPacket.java new file mode 100644 index 000000000..723df8658 --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/data/large/SyncEffectPacket.java @@ -0,0 +1,64 @@ +package kamkeel.npcs.network.packets.data.large; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import kamkeel.npcs.controllers.SyncController; +import kamkeel.npcs.network.LargeAbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.enums.EnumDataPacket; +import kamkeel.npcs.network.enums.EnumSyncAction; +import kamkeel.npcs.network.enums.EnumSyncType; +import kamkeel.npcs.util.ByteBufUtils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import noppes.npcs.CustomNpcs; +import noppes.npcs.LogWriter; + +import java.io.IOException; + +public final class SyncEffectPacket extends LargeAbstractPacket { + + private NBTTagCompound syncData; + + public SyncEffectPacket() {} + + public SyncEffectPacket(NBTTagCompound syncData) { + this.syncData = syncData; + } + + @Override + public Enum getType() { + return EnumDataPacket.SYNC_EFFECTS; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.DATA_PACKET; + } + + @Override + protected byte[] getData() throws IOException { + ByteBuf buffer = Unpooled.buffer(); + ByteBufUtils.writeBigNBT(buffer, syncData); + byte[] bytes = new byte[buffer.readableBytes()]; + buffer.readBytes(bytes); + return bytes; + } + + @SideOnly(Side.CLIENT) + @Override + protected void handleCompleteData(ByteBuf data, EntityPlayer player) throws IOException { + if (CustomNpcs.side() != Side.CLIENT) + return; + try { + NBTTagCompound tag = ByteBufUtils.readBigNBT(data); + SyncController.clientSyncEffects(tag); + } + catch (RuntimeException e){ + LogWriter.error(String.format("Attempted to Sync Effects but it was too big")); + } + } +} diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index df59cb7ee..a9d420c8b 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -72,6 +72,9 @@ public class ScriptPlayerEventHandler { playerData.timers.update(); } + if(player.ticksExisted % 10 == 0) + SyncController.syncEffects((EntityPlayerMP) player); + // TODO: Fix Config // player.ticksExisted % ConfigDBCGameplay.CheckEffectsTick == 0 if (player.ticksExisted % 10 == 0) diff --git a/src/main/java/noppes/npcs/ServerTickHandler.java b/src/main/java/noppes/npcs/ServerTickHandler.java index 2b628659f..e793e8db0 100644 --- a/src/main/java/noppes/npcs/ServerTickHandler.java +++ b/src/main/java/noppes/npcs/ServerTickHandler.java @@ -53,6 +53,7 @@ public class ServerTickHandler { } SyncController.syncPlayer(player); + SyncController.syncEffects(player); ProfileController.login(player); } diff --git a/src/main/java/noppes/npcs/controllers/CustomEffectController.java b/src/main/java/noppes/npcs/controllers/CustomEffectController.java index af8ce1c22..983405ccf 100644 --- a/src/main/java/noppes/npcs/controllers/CustomEffectController.java +++ b/src/main/java/noppes/npcs/controllers/CustomEffectController.java @@ -41,7 +41,7 @@ public class CustomEffectController implements ICustomEffectHandler { private HashMap bootOrder; private int lastUsedID = 0; - public ConcurrentHashMap> playerEffects = new ConcurrentHashMap<>(); + public ConcurrentHashMap> playerEffects = new ConcurrentHashMap<>(); public CustomEffectController() {} @@ -214,9 +214,9 @@ public class CustomEffectController implements ICustomEffectHandler { return has(name, 0); } - public Map getPlayerEffects(EntityPlayer player) { + public ConcurrentHashMap getPlayerEffects(EntityPlayer player) { UUID playerId = NoppesUtilServer.getUUID(player); - Map effects = playerEffects.get(playerId); + ConcurrentHashMap effects = playerEffects.get(playerId); if (effects == null) { effects = new ConcurrentHashMap<>(); playerEffects.put(playerId, effects);