diff --git a/src/api b/src/api index 5685f9a0f..deac61218 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit 5685f9a0f856879edc7e1f722da2fee98be187e2 +Subproject commit deac6121855fe8c8b156965f42380d23a9e13a17 diff --git a/src/main/java/foxz/command/CmdDialog.java b/src/main/java/foxz/command/CmdDialog.java index 0f015f876..50fe9223f 100644 --- a/src/main/java/foxz/command/CmdDialog.java +++ b/src/main/java/foxz/command/CmdDialog.java @@ -50,7 +50,7 @@ public class CmdDialog extends ChMcLogger { } for(PlayerData playerdata : data){ playerdata.dialogData.dialogsRead.add(diagid); - playerdata.save(); + playerdata.save(true); } return true; } @@ -76,7 +76,7 @@ public class CmdDialog extends ChMcLogger { } for(PlayerData playerdata : data){ playerdata.dialogData.dialogsRead.remove(diagid); - playerdata.save(); + playerdata.save(true); } return true; } diff --git a/src/main/java/foxz/command/CmdNoppes.java b/src/main/java/foxz/command/CmdNoppes.java index 37e06ef1d..c0b7b78de 100644 --- a/src/main/java/foxz/command/CmdNoppes.java +++ b/src/main/java/foxz/command/CmdNoppes.java @@ -100,7 +100,7 @@ public class CmdNoppes extends ChMcLogger { cmdfaction.processCommand(this.pcParam, args); for (PlayerData playerdata : cmdfaction.data) { - playerdata.save(); + playerdata.save(true); } return true; } diff --git a/src/main/java/foxz/command/CmdQuest.java b/src/main/java/foxz/command/CmdQuest.java index e250d83ac..e30815820 100644 --- a/src/main/java/foxz/command/CmdQuest.java +++ b/src/main/java/foxz/command/CmdQuest.java @@ -56,7 +56,7 @@ public class CmdQuest extends ChMcLogger{ continue; QuestData questdata = new QuestData(quest); playerdata.questData.activeQuests.put(questid, questdata); - playerdata.save(); + playerdata.save(true); if(playerdata.player != null){ Server.sendData((EntityPlayerMP)playerdata.player, EnumPacketClient.MESSAGE, "quest.newquest", quest.title); Server.sendData((EntityPlayerMP)playerdata.player, EnumPacketClient.CHAT, "quest.newquest", ": ", quest.title); @@ -93,7 +93,7 @@ public class CmdQuest extends ChMcLogger{ } for(PlayerData playerdata : data){ playerdata.questData.finishedQuests.put(questid, System.currentTimeMillis()); - playerdata.save(); + playerdata.save(true); } return true; } @@ -124,7 +124,7 @@ public class CmdQuest extends ChMcLogger{ } for(PlayerData playerdata : data){ playerdata.questData.activeQuests.remove(questid); - playerdata.save(); + playerdata.save(true); } return true; } @@ -156,7 +156,7 @@ public class CmdQuest extends ChMcLogger{ for(PlayerData playerdata : data){ playerdata.questData.activeQuests.remove(questid); playerdata.questData.finishedQuests.remove(questid); - playerdata.save(); + playerdata.save(true); } return true; } diff --git a/src/main/java/kamkeel/command/AnimationCommand.java b/src/main/java/kamkeel/command/AnimationCommand.java index 6cd6b7fa8..116e2c455 100644 --- a/src/main/java/kamkeel/command/AnimationCommand.java +++ b/src/main/java/kamkeel/command/AnimationCommand.java @@ -46,7 +46,7 @@ public class AnimationCommand extends CommandKamkeelBase { processSubCommand(sender, args[1], Arrays.copyOfRange(args, 2, args.length)); data.get(0).animationData.updateClient(); - data.get(0).save(); + data.get(0).save(true); } @SubCommand(desc = "enable animation") diff --git a/src/main/java/kamkeel/command/DialogCommand.java b/src/main/java/kamkeel/command/DialogCommand.java index f2ccca0d5..eac6ddc9c 100644 --- a/src/main/java/kamkeel/command/DialogCommand.java +++ b/src/main/java/kamkeel/command/DialogCommand.java @@ -11,6 +11,7 @@ import noppes.npcs.client.EntityUtil; import noppes.npcs.controllers.DialogController; import noppes.npcs.controllers.PlayerDataController; +import noppes.npcs.controllers.SyncController; import noppes.npcs.controllers.data.Dialog; import noppes.npcs.controllers.data.DialogOption; import noppes.npcs.controllers.data.PlayerData; @@ -48,7 +49,7 @@ public class DialogCommand extends CommandKamkeelBase { } for(PlayerData playerdata : data){ playerdata.dialogData.dialogsRead.add(diagid); - playerdata.save(); + playerdata.save(true); sendResult(sender, String.format("Forced Read for Dialog \u00A7e%d\u00A77 for Player '\u00A7b%s\u00A77'", diagid, playerdata.playername)); } } @@ -73,7 +74,7 @@ public class DialogCommand extends CommandKamkeelBase { } for(PlayerData playerdata : data){ playerdata.dialogData.dialogsRead.remove(diagid); - playerdata.save(); + playerdata.save(true); sendResult(sender, String.format("Forced Unread for Dialog \u00A7e%d\u00A77 for Player '\u00A7b%s\u00A77'", diagid, playerdata.playername)); } } @@ -83,6 +84,7 @@ public class DialogCommand extends CommandKamkeelBase { ) public void reload(ICommandSender sender, String args[]){ new DialogController(); + SyncController.syncAllDialogs(); sendResult(sender, "Dialogs Reloaded"); } diff --git a/src/main/java/kamkeel/command/FactionCommand.java b/src/main/java/kamkeel/command/FactionCommand.java index 510588488..7e1d63d03 100644 --- a/src/main/java/kamkeel/command/FactionCommand.java +++ b/src/main/java/kamkeel/command/FactionCommand.java @@ -64,7 +64,7 @@ public class FactionCommand extends CommandKamkeelBase { processSubCommand(sender, args[2], Arrays.copyOfRange(args, 3, args.length)); for(PlayerData playerdata : data){ - playerdata.save(); + playerdata.save(true); } } diff --git a/src/main/java/kamkeel/command/QuestCommand.java b/src/main/java/kamkeel/command/QuestCommand.java index 9a7687f28..3cc981f24 100644 --- a/src/main/java/kamkeel/command/QuestCommand.java +++ b/src/main/java/kamkeel/command/QuestCommand.java @@ -10,6 +10,7 @@ import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumQuestRepeat; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.QuestController; +import noppes.npcs.controllers.SyncController; import noppes.npcs.controllers.data.PlayerData; import noppes.npcs.controllers.data.Quest; import noppes.npcs.controllers.data.QuestData; @@ -56,7 +57,7 @@ public class QuestCommand extends CommandKamkeelBase { for(PlayerData playerdata : data){ QuestData questdata = new QuestData(quest); playerdata.questData.activeQuests.put(questid, questdata); - playerdata.save(); + playerdata.save(true); if(playerdata.player != null && questdata.sendAlerts){ Server.sendData((EntityPlayerMP)playerdata.player, EnumPacketClient.MESSAGE, "quest.newquest", quest.title); Server.sendData((EntityPlayerMP)playerdata.player, EnumPacketClient.CHAT, "quest.newquest", ": ", quest.title); @@ -101,7 +102,7 @@ public class QuestCommand extends CommandKamkeelBase { else playerdata.questData.finishedQuests.put(quest.id, sender.getEntityWorld().getTotalWorldTime()); - playerdata.save(); + playerdata.save(true); if(playerdata.player != null){ Server.sendData((EntityPlayerMP)playerdata.player, EnumPacketClient.MESSAGE, "quest.completed", quest.title); Server.sendData((EntityPlayerMP)playerdata.player, EnumPacketClient.CHAT, "quest.completed", ": ", quest.title); @@ -135,7 +136,7 @@ public class QuestCommand extends CommandKamkeelBase { } for(PlayerData playerdata : data){ playerdata.questData.activeQuests.remove(questid); - playerdata.save(); + playerdata.save(true); sendResult(sender, String.format("Stopped Quest \u00A7e%d\u00A77 for Player '\u00A7b%s\u00A77'", questid, playerdata.playername)); } } @@ -169,7 +170,7 @@ public class QuestCommand extends CommandKamkeelBase { for(PlayerData playerdata : data){ playerdata.questData.activeQuests.remove(questid); playerdata.questData.finishedQuests.remove(questid); - playerdata.save(); + playerdata.save(true); sendResult(sender, String.format("Removed Quest \u00A7e%d\u00A77 for Player '\u00A7b%s\u00A77'", questid, playerdata.playername)); } } @@ -181,6 +182,7 @@ public class QuestCommand extends CommandKamkeelBase { public void reload(ICommandSender sender, String args[]){ new QuestController(); QuestController.instance.load(); + SyncController.syncAllQuests(); sendResult(sender, "Quests Reloaded"); } } diff --git a/src/main/java/noppes/npcs/NoppesUtilServer.java b/src/main/java/noppes/npcs/NoppesUtilServer.java index 40e228434..504b53be6 100644 --- a/src/main/java/noppes/npcs/NoppesUtilServer.java +++ b/src/main/java/noppes/npcs/NoppesUtilServer.java @@ -25,10 +25,7 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import noppes.npcs.api.entity.IPlayer; -import noppes.npcs.constants.EnumGuiType; -import noppes.npcs.constants.EnumPacketClient; -import noppes.npcs.constants.EnumPlayerData; -import noppes.npcs.constants.EnumRoleType; +import noppes.npcs.constants.*; import noppes.npcs.containers.ContainerManageBanks; import noppes.npcs.containers.ContainerManageRecipes; import noppes.npcs.controllers.*; @@ -39,7 +36,6 @@ import noppes.npcs.roles.RoleTransporter; import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.ScriptSound; import noppes.npcs.scripted.event.DialogEvent; -import noppes.npcs.util.CustomNPCsScheduler; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -163,6 +159,7 @@ public class NoppesUtilServer { public static void openDialog(EntityPlayer player, EntityNPCInterface npc, Dialog dia, int optionId){ Dialog dialog = dia.copy(player); + PlayerData playerdata = PlayerDataController.instance.getPlayerData(player); if (!npc.isRemote()) { if (EventHooks.onNPCDialog(npc, player, dialog.id, optionId, dialog)) { @@ -188,8 +185,10 @@ public class NoppesUtilServer { if(dialog.mail.isValid()) PlayerDataController.instance.addPlayerMessage(player.getCommandSenderName(), dialog.mail); PlayerDialogData data = PlayerDataController.instance.getPlayerData(player).dialogData; - if(!data.dialogsRead.contains(dialog.id)) - data.dialogsRead.add(dialog.id); + if(!data.dialogsRead.contains(dialog.id)){ + data.dialogsRead.add(dialog.id); + playerdata.updateClient = true; + } setEditingNpc(player, npc); } public static void runCommand(EntityPlayer player, String name, String command){ @@ -256,20 +255,18 @@ public class NoppesUtilServer { setEditingNpc(player, npc); sendExtraData(player, npc,gui, i, j, k); - CustomNPCsScheduler.runTack(() -> { - if(CustomNpcs.proxy.getServerGuiElement(gui.ordinal(), player, player.worldObj, i, j, k) != null){ - player.openGui(CustomNpcs.instance, gui.ordinal(), player.worldObj, i, j, k); - return; - } - else{ - Server.sendDataChecked((EntityPlayerMP)player, EnumPacketClient.GUI, gui.ordinal(), i, j, k); - } - ArrayList list = getScrollData(player, gui, npc); - if(list == null || list.isEmpty()) - return; + if(CustomNpcs.proxy.getServerGuiElement(gui.ordinal(), player, player.worldObj, i, j, k) != null){ + player.openGui(CustomNpcs.instance, gui.ordinal(), player.worldObj, i, j, k); + return; + } + else{ + Server.sendDataChecked((EntityPlayerMP)player, EnumPacketClient.GUI, gui.ordinal(), i, j, k); + } + ArrayList list = getScrollData(player, gui, npc); + if(list == null || list.isEmpty()) + return; - Server.sendData((EntityPlayerMP)player, EnumPacketClient.SCROLL_LIST, list); - }, 100); + Server.sendData((EntityPlayerMP)player, EnumPacketClient.SCROLL_LIST, list); } public static void sendOpenGuiNoDelay(final EntityPlayer player, @@ -488,7 +485,7 @@ public class NoppesUtilServer { return; String name = Server.readString(buffer); EnumPlayerData type = EnumPlayerData.values()[id]; - EntityPlayer pl = MinecraftServer.getServer().getConfigurationManager().func_152612_a(name); + EntityPlayerMP pl = MinecraftServer.getServer().getConfigurationManager().func_152612_a(name); PlayerData playerdata = null; if(pl == null) playerdata = PlayerDataController.instance.getDataFromUsername(name); @@ -502,7 +499,7 @@ public class NoppesUtilServer { if(pl != null){ playerdata.setNBT(new NBTTagCompound()); sendPlayerData(type, player, name); - playerdata.save(); + playerdata.save(true); return; } else { @@ -515,28 +512,31 @@ public class NoppesUtilServer { int questId = buffer.readInt(); data.activeQuests.remove(questId); data.finishedQuests.remove(questId); - playerdata.save(); + playerdata.save(true); } if(type == EnumPlayerData.Dialog){ PlayerDialogData data = playerdata.dialogData; data.dialogsRead.remove(buffer.readInt()); - playerdata.save(); + playerdata.save(true); } if(type == EnumPlayerData.Transport){ PlayerTransportData data = playerdata.transportData; data.transports.remove(buffer.readInt()); - playerdata.save(); + playerdata.save(true); } if(type == EnumPlayerData.Bank){ PlayerBankData data = playerdata.bankData; data.banks.remove(buffer.readInt()); - playerdata.save(); + playerdata.save(true); } if(type == EnumPlayerData.Factions){ PlayerFactionData data = playerdata.factionData; data.factionData.remove(buffer.readInt()); - playerdata.save(); + playerdata.save(true); } + if(pl != null) { + SyncController.syncPlayer(pl); + } sendPlayerData(type, player, name); } diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 3cc967326..eadb4aed7 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -27,6 +27,7 @@ import net.minecraftforge.event.world.BlockEvent; import noppes.npcs.api.entity.IPlayer; import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumQuestType; +import noppes.npcs.constants.SyncType; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.data.PlayerData; @@ -67,6 +68,11 @@ public class ScriptPlayerEventHandler { if (PlayerDataController.instance != null) { PlayerData playerData = PlayerDataController.instance.getPlayerData(player); + if(playerData.updateClient) { + Server.sendData((EntityPlayerMP)player, EnumPacketClient.SYNC_END, SyncType.PLAYER_DATA, playerData.getSyncNBT()); + playerData.updateClient = false; + } + if (playerData.timers.size() > 0) { playerData.timers.update(); } diff --git a/src/main/java/noppes/npcs/ServerEventsHandler.java b/src/main/java/noppes/npcs/ServerEventsHandler.java index 5c0c0d92a..dcc5004b4 100644 --- a/src/main/java/noppes/npcs/ServerEventsHandler.java +++ b/src/main/java/noppes/npcs/ServerEventsHandler.java @@ -276,7 +276,7 @@ public class ServerEventsHandler { } if(event.entityLiving instanceof EntityPlayer){ PlayerData data = PlayerDataController.instance.getPlayerData((EntityPlayer)event.entityLiving); - data.save(); + data.save(false); } } @@ -341,6 +341,7 @@ public class ServerEventsHandler { killed.put(name, amount + 1); } quest.setKilled(data, killed); + playerData.updateClient = true; } if(!checkCompletion) return; @@ -369,7 +370,7 @@ public class ServerEventsHandler { @SubscribeEvent public void world(PlayerEvent.SaveToFile event){ PlayerData data = PlayerDataController.instance.getPlayerData((EntityPlayer) event.entity); - data.save(); + data.save(false); } @SubscribeEvent diff --git a/src/main/java/noppes/npcs/ServerTickHandler.java b/src/main/java/noppes/npcs/ServerTickHandler.java index 4ef57f89e..069692f28 100644 --- a/src/main/java/noppes/npcs/ServerTickHandler.java +++ b/src/main/java/noppes/npcs/ServerTickHandler.java @@ -4,9 +4,11 @@ import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.world.WorldServer; import noppes.npcs.client.AnalyticsTracking; +import noppes.npcs.controllers.SyncController; import java.net.InetAddress; import java.net.UnknownHostException; @@ -40,5 +42,9 @@ public class ServerTickHandler { serverName = e; } AnalyticsTracking.sendData(event.player, "join", serverName); + if(event.player instanceof EntityPlayerMP){ + EntityPlayerMP player = (EntityPlayerMP) event.player; + SyncController.syncPlayer(player); + } } } diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java b/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java index 081270cae..73dbe12c3 100644 --- a/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java +++ b/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java @@ -56,6 +56,7 @@ public class TileWaypoint extends TileEntity { player.addChatMessage(new ChatComponentTranslation(name + " " + StatCollector.translateToLocal("quest.found"))); questData.checkQuestCompletion(playerData, EnumQuestType.Location); + playerData.updateClient = true; } } } diff --git a/src/main/java/noppes/npcs/client/Client.java b/src/main/java/noppes/npcs/client/Client.java index 6c101dea5..ba8ab3ffe 100644 --- a/src/main/java/noppes/npcs/client/Client.java +++ b/src/main/java/noppes/npcs/client/Client.java @@ -6,14 +6,12 @@ import io.netty.buffer.Unpooled; import net.minecraft.network.PacketBuffer; import noppes.npcs.AnimationData; import noppes.npcs.CustomNpcs; -import noppes.npcs.LogWriter; import noppes.npcs.Server; import noppes.npcs.client.gui.OverlayQuestTracking; import noppes.npcs.client.gui.customoverlay.OverlayCustom; import noppes.npcs.client.renderer.customitem.ImageData; import noppes.npcs.constants.EnumPacketServer; import noppes.npcs.controllers.data.SkinOverlay; -import noppes.npcs.util.CustomNPCsScheduler; import java.io.IOException; import java.util.HashMap; @@ -27,16 +25,14 @@ public class Client { private static HashMap imageDataCache = new HashMap<>(); public static void sendData(final EnumPacketServer enu, final Object... obs) { - CustomNPCsScheduler.runTack(() -> { - ByteBuf buffer = Unpooled.buffer(); - try { - if(!Server.fillBuffer(buffer, enu, obs)) - return; - CustomNpcs.Channel.sendToServer(new FMLProxyPacket(buffer, "CustomNPCs")); - } catch (IOException e) { - e.printStackTrace(); - } - }); + ByteBuf buffer = Unpooled.buffer(); + try { + if(!Server.fillBuffer(buffer, enu, obs)) + return; + CustomNpcs.Channel.sendToServer(new FMLProxyPacket(buffer, "CustomNPCs")); + } catch (IOException e) { + e.printStackTrace(); + } } public static ImageData getImageData(String directory) { diff --git a/src/main/java/noppes/npcs/client/PacketHandlerClient.java b/src/main/java/noppes/npcs/client/PacketHandlerClient.java index 32e3823a1..073701a7b 100644 --- a/src/main/java/noppes/npcs/client/PacketHandlerClient.java +++ b/src/main/java/noppes/npcs/client/PacketHandlerClient.java @@ -30,14 +30,18 @@ import noppes.npcs.client.gui.util.*; import noppes.npcs.config.ConfigClient; import noppes.npcs.constants.EnumGuiType; import noppes.npcs.constants.EnumPacketClient; +import noppes.npcs.constants.SyncType; import noppes.npcs.controllers.RecipeController; +import noppes.npcs.controllers.SyncController; import noppes.npcs.controllers.data.Animation; import noppes.npcs.controllers.data.RecipeCarpentry; import noppes.npcs.entity.EntityDialogNpc; import noppes.npcs.entity.EntityNPCInterface; +import noppes.npcs.items.ItemScripted; import java.io.IOException; import java.util.HashMap; +import java.util.Map; public class PacketHandlerClient extends PacketHandlerServer{ @@ -100,6 +104,27 @@ public class PacketHandlerClient extends PacketHandlerServer{ RecipeController.instance.anvilRecipes = RecipeController.syncRecipes; RecipeController.syncRecipes = new HashMap(); } + else if(type == EnumPacketClient.SYNC_ADD || type == EnumPacketClient.SYNC_END){ + int synctype = buffer.readInt(); + NBTTagCompound compound = Server.readNBT(buffer); + + SyncController.clientSync(synctype, compound, type == EnumPacketClient.SYNC_END); + + if(synctype == SyncType.PLAYER_DATA){ + ClientProxy.playerData.setNBT(compound); + } + } + else if(type == EnumPacketClient.SYNC_UPDATE){ + int synctype = buffer.readInt(); + NBTTagCompound compound = Server.readNBT(buffer); + SyncController.clientSyncUpdate(synctype, compound, buffer); + } + else if(type == EnumPacketClient.SYNC_REMOVE){ + int synctype = buffer.readInt(); + int id = buffer.readInt(); + + SyncController.clientSyncRemove(synctype, id); + } else if(type == EnumPacketClient.DIALOG){ Entity entity = Minecraft.getMinecraft().theWorld.getEntityByID(buffer.readInt()); if(entity == null || !(entity instanceof EntityNPCInterface)) diff --git a/src/main/java/noppes/npcs/constants/EnumPacketClient.java b/src/main/java/noppes/npcs/constants/EnumPacketClient.java index 60fbe6ee6..cfd02b501 100644 --- a/src/main/java/noppes/npcs/constants/EnumPacketClient.java +++ b/src/main/java/noppes/npcs/constants/EnumPacketClient.java @@ -47,5 +47,6 @@ public enum EnumPacketClient { STOP_SOUND_FOR, PAUSE_SOUNDS, CONTINUE_SOUNDS, - STOP_SOUNDS + STOP_SOUNDS, + SYNC_ADD, SYNC_END, SYNC_UPDATE, SYNC_REMOVE, } diff --git a/src/main/java/noppes/npcs/constants/SyncType.java b/src/main/java/noppes/npcs/constants/SyncType.java new file mode 100644 index 000000000..63b6aa4cd --- /dev/null +++ b/src/main/java/noppes/npcs/constants/SyncType.java @@ -0,0 +1,11 @@ +package noppes.npcs.constants; + +public class SyncType { + + public static final int FACTION = 1; + public static final int QUEST = 2; + public static final int QUEST_CATEGORY = 3; + public static final int DIALOG = 4; + public static final int DIALOG_CATEGORY = 5; + public static final int PLAYER_DATA = 8; +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/controllers/DialogController.java b/src/main/java/noppes/npcs/controllers/DialogController.java index 2544965e3..d779b01d8 100644 --- a/src/main/java/noppes/npcs/controllers/DialogController.java +++ b/src/main/java/noppes/npcs/controllers/DialogController.java @@ -6,10 +6,13 @@ import net.minecraft.nbt.NBTTagList; import noppes.npcs.CustomNpcs; import noppes.npcs.LogWriter; import noppes.npcs.NoppesStringUtils; +import noppes.npcs.Server; import noppes.npcs.api.handler.IDialogHandler; import noppes.npcs.api.handler.data.IDialog; import noppes.npcs.api.handler.data.IDialogCategory; import noppes.npcs.constants.EnumOptionType; +import noppes.npcs.constants.EnumPacketClient; +import noppes.npcs.constants.SyncType; import noppes.npcs.controllers.data.Dialog; import noppes.npcs.controllers.data.DialogCategory; import noppes.npcs.controllers.data.DialogOption; @@ -21,6 +24,7 @@ import java.util.*; public class DialogController implements IDialogHandler { public HashMap categories = new HashMap(); + public HashMap categoriesSync = new HashMap(); public HashMap dialogs = new HashMap(); public static DialogController instance; @@ -227,6 +231,7 @@ public class DialogController implements IDialogHandler { dir.mkdirs(); } categories.put(category.id, category); + Server.sendToAll(EnumPacketClient.SYNC_UPDATE, SyncType.DIALOG_CATEGORY, category.writeNBT(new NBTTagCompound())); } public void removeCategory(int category){ @@ -239,6 +244,7 @@ public class DialogController implements IDialogHandler { for(int dia : cat.dialogs.keySet()) dialogs.remove(dia); categories.remove(category); + Server.sendToAll(EnumPacketClient.SYNC_REMOVE, SyncType.DIALOG_CATEGORY, category); } private boolean containsCategoryName(String name) { @@ -281,10 +287,12 @@ public class DialogController implements IDialogHandler { File file2 = new File(dir, dialog.id + ".json"); try { - NBTJsonUtil.SaveFile(file, dialog.writeToNBTPartial(new NBTTagCompound())); + NBTTagCompound compound = dialog.writeToNBT(new NBTTagCompound()); + NBTJsonUtil.SaveFile(file, compound); if(file2.exists()) file2.delete(); file.renameTo(file2); + Server.sendToAll(EnumPacketClient.SYNC_UPDATE, SyncType.DIALOG, compound, category.id); } catch (Exception e) { LogWriter.except(e); } @@ -298,7 +306,7 @@ public class DialogController implements IDialogHandler { return; category.dialogs.remove(dialog.id); dialogs.remove(dialog.id); - + Server.sendToAll(EnumPacketClient.SYNC_REMOVE, SyncType.DIALOG, dialog.id); } private File getDir(){ diff --git a/src/main/java/noppes/npcs/controllers/FactionController.java b/src/main/java/noppes/npcs/controllers/FactionController.java index 6d1d68784..3c0eb0747 100644 --- a/src/main/java/noppes/npcs/controllers/FactionController.java +++ b/src/main/java/noppes/npcs/controllers/FactionController.java @@ -5,8 +5,11 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import noppes.npcs.CustomNpcs; import noppes.npcs.LogWriter; +import noppes.npcs.Server; import noppes.npcs.api.handler.IFactionHandler; import noppes.npcs.api.handler.data.IFaction; +import noppes.npcs.constants.EnumPacketClient; +import noppes.npcs.constants.SyncType; import noppes.npcs.controllers.data.Faction; import java.io.*; @@ -18,7 +21,7 @@ import java.util.zip.GZIPInputStream; public class FactionController implements IFactionHandler { public HashMap factions; - + public HashMap factionsSync = new HashMap(); private static FactionController instance; private int lastUsedID = 0; @@ -151,6 +154,9 @@ public class FactionController implements IFactionHandler { } factions.remove(faction.id); factions.put(faction.id, faction); + NBTTagCompound nbtTagCompound = new NBTTagCompound(); + faction.writeNBT(nbtTagCompound); + Server.sendToAll(EnumPacketClient.SYNC_UPDATE, SyncType.FACTION, nbtTagCompound); saveFactions(); } @@ -185,6 +191,7 @@ public class FactionController implements IFactionHandler { } else { this.saveFactions(); faction.id = -1; + Server.sendToAll(EnumPacketClient.SYNC_REMOVE, SyncType.FACTION, id); return faction; } } else { diff --git a/src/main/java/noppes/npcs/controllers/PlayerDataController.java b/src/main/java/noppes/npcs/controllers/PlayerDataController.java index a8bc3b215..3ceca3d05 100644 --- a/src/main/java/noppes/npcs/controllers/PlayerDataController.java +++ b/src/main/java/noppes/npcs/controllers/PlayerDataController.java @@ -168,7 +168,7 @@ public class PlayerDataController { readNBT(nbttagcompound); } - public void savePlayerDataMap(){ + public synchronized void savePlayerDataMap(){ CustomNPCsScheduler.runTack(() -> { try { File saveDir = getSaveDir(); @@ -311,7 +311,7 @@ public class PlayerDataController { EntityPlayer player = MinecraftServer.getServer().getConfigurationManager().func_152612_a(username); PlayerData data = getDataFromUsername(username); data.mailData.playermail.add(mail.copy()); - data.save(); + data.save(false); } public List getPlayersData(ICommandSender sender, String username){ diff --git a/src/main/java/noppes/npcs/controllers/QuestController.java b/src/main/java/noppes/npcs/controllers/QuestController.java index 92197bca0..0ba741e2e 100644 --- a/src/main/java/noppes/npcs/controllers/QuestController.java +++ b/src/main/java/noppes/npcs/controllers/QuestController.java @@ -6,9 +6,12 @@ import net.minecraft.nbt.NBTTagList; import noppes.npcs.CustomNpcs; import noppes.npcs.LogWriter; import noppes.npcs.NoppesStringUtils; +import noppes.npcs.Server; import noppes.npcs.api.handler.IQuestHandler; import noppes.npcs.api.handler.data.IQuest; import noppes.npcs.api.handler.data.IQuestCategory; +import noppes.npcs.constants.EnumPacketClient; +import noppes.npcs.constants.SyncType; import noppes.npcs.controllers.data.Quest; import noppes.npcs.controllers.data.QuestCategory; import noppes.npcs.util.NBTJsonUtil; @@ -19,6 +22,7 @@ import java.util.*; public class QuestController implements IQuestHandler { public HashMap categories = new HashMap(); + public HashMap categoriesSync = new HashMap(); public HashMap quests = new HashMap(); public static QuestController instance; @@ -142,6 +146,7 @@ public class QuestController implements IQuestHandler { for(int dia : cat.quests.keySet()) quests.remove(dia); categories.remove(category); + Server.sendToAll(EnumPacketClient.SYNC_REMOVE, SyncType.QUEST_CATEGORY, category); } public void saveCategory(QuestCategory category){ @@ -172,6 +177,7 @@ public class QuestController implements IQuestHandler { dir.mkdirs(); } categories.put(category.id, category); + Server.sendToAll(EnumPacketClient.SYNC_UPDATE, SyncType.QUEST_CATEGORY, category.writeNBT(new NBTTagCompound())); } private boolean containsCategoryName(String name) { name = name.toLowerCase(); @@ -219,6 +225,7 @@ public class QuestController implements IQuestHandler { if(file2.exists()) file2.delete(); file.renameTo(file2); + Server.sendToAll(EnumPacketClient.SYNC_UPDATE, SyncType.QUEST, quest.writeToNBT(new NBTTagCompound()), category.id); } catch (Exception e) { e.printStackTrace(); } @@ -230,6 +237,7 @@ public class QuestController implements IQuestHandler { return; quests.remove(quest.id); quest.category.quests.remove(quest.id); + Server.sendToAll(EnumPacketClient.SYNC_REMOVE, SyncType.QUEST, quest.id); } private File getDir(){ diff --git a/src/main/java/noppes/npcs/controllers/SyncController.java b/src/main/java/noppes/npcs/controllers/SyncController.java new file mode 100644 index 000000000..691e26a70 --- /dev/null +++ b/src/main/java/noppes/npcs/controllers/SyncController.java @@ -0,0 +1,184 @@ +package noppes.npcs.controllers; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.server.MinecraftServer; +import noppes.npcs.CustomNpcs; +import noppes.npcs.NBTTags; +import noppes.npcs.Server; +import noppes.npcs.constants.EnumPacketClient; +import noppes.npcs.constants.SyncType; +import noppes.npcs.controllers.data.*; +import io.netty.buffer.ByteBuf; + +import java.util.HashMap; +import java.util.List; + +public class SyncController { + + public static void syncPlayer(EntityPlayerMP player){ + NBTTagList list = new NBTTagList(); + NBTTagCompound compound = new NBTTagCompound(); + + for(Faction faction : FactionController.getInstance().factions.values()){ + NBTTagCompound nbtTagCompound = new NBTTagCompound(); + faction.writeNBT(nbtTagCompound); + list.appendTag(nbtTagCompound); + if(list.tagCount() > 20){ + compound = new NBTTagCompound(); + compound.setTag("Data", list); + Server.sendData(player, EnumPacketClient.SYNC_ADD, SyncType.FACTION, compound); + list = new NBTTagList(); + } + } + compound = new NBTTagCompound(); + compound.setTag("Data", list); + Server.sendData(player, EnumPacketClient.SYNC_END, SyncType.FACTION, compound); + + for(QuestCategory category : QuestController.instance.categories.values()){ + Server.sendData(player, EnumPacketClient.SYNC_ADD, SyncType.QUEST_CATEGORY, category.writeNBT(new NBTTagCompound())); + } + Server.sendData(player, EnumPacketClient.SYNC_END, SyncType.QUEST_CATEGORY, new NBTTagCompound()); + + for(DialogCategory category : DialogController.instance.categories.values()){ + Server.sendData(player, EnumPacketClient.SYNC_ADD, SyncType.DIALOG_CATEGORY, category.writeNBT(new NBTTagCompound())); + } + Server.sendData(player, EnumPacketClient.SYNC_END, SyncType.DIALOG_CATEGORY, new NBTTagCompound()); + + PlayerData data = PlayerDataController.instance.getPlayerData(player); + Server.sendData(player, EnumPacketClient.SYNC_END, SyncType.PLAYER_DATA, data.getNBT()); + } + + public static void syncAllDialogs() { + for(DialogCategory category : DialogController.instance.categories.values()){ + Server.sendToAll(EnumPacketClient.SYNC_ADD, SyncType.DIALOG_CATEGORY, category.writeNBT(new NBTTagCompound())); + } + Server.sendToAll(EnumPacketClient.SYNC_END, SyncType.DIALOG_CATEGORY, new NBTTagCompound()); + } + + public static void syncAllQuests() { + for(QuestCategory category : QuestController.instance.categories.values()){ + Server.sendToAll(EnumPacketClient.SYNC_ADD, SyncType.QUEST_CATEGORY, category.writeNBT(new NBTTagCompound())); + } + Server.sendToAll(EnumPacketClient.SYNC_END, SyncType.QUEST_CATEGORY, new NBTTagCompound()); + } + + public static void clientSync(int synctype, NBTTagCompound compound, boolean syncEnd) { + if(synctype == SyncType.FACTION){ + NBTTagList list = compound.getTagList("Data", 10); + for(int i = 0; i < list.tagCount(); i++) + { + Faction faction = new Faction(); + faction.readNBT(list.getCompoundTagAt(i)); + FactionController.getInstance().factionsSync.put(faction.id, faction); + } + if(syncEnd){ + FactionController.getInstance().factions = FactionController.getInstance().factionsSync; + FactionController.getInstance().factionsSync = new HashMap(); + } + } + else if(synctype == SyncType.QUEST_CATEGORY){ + if(!compound.hasNoTags()){ + QuestCategory category = new QuestCategory(); + category.readNBT(compound); + QuestController.instance.categoriesSync.put(category.id, category); + } + if(syncEnd){ + HashMap quests = new HashMap(); + for(QuestCategory category : QuestController.instance.categoriesSync.values()){ + for(Quest quest : category.quests.values()){ + quests.put(quest.id, quest); + } + } + QuestController.instance.categories = QuestController.instance.categoriesSync; + QuestController.instance.quests = quests; + QuestController.instance.categoriesSync = new HashMap(); + } + } + else if(synctype == SyncType.DIALOG_CATEGORY){ + if(!compound.hasNoTags()){ + DialogCategory category = new DialogCategory(); + category.readNBT(compound); + DialogController.instance.categoriesSync.put(category.id, category); + } + if(syncEnd){ + HashMap dialogs = new HashMap(); + for(DialogCategory category : DialogController.instance.categoriesSync.values()){ + for(Dialog dialog : category.dialogs.values()){ + dialogs.put(dialog.id, dialog); + } + } + DialogController.instance.categories = DialogController.instance.categoriesSync; + DialogController.instance.dialogs = dialogs; + DialogController.instance.categoriesSync = new HashMap(); + } + } + } + + public static void clientSyncUpdate(int synctype, NBTTagCompound compound, ByteBuf buffer) { + if(synctype == SyncType.FACTION){ + Faction faction = new Faction(); + faction.readNBT(compound); + FactionController.getInstance().factions.put(faction.id, faction); + } + else if(synctype == SyncType.DIALOG){ + DialogCategory category = DialogController.instance.categories.get(buffer.readInt()); + Dialog dialog = new Dialog(); + dialog.category = category; + dialog.readNBT(compound); + DialogController.instance.dialogs.put(dialog.id, dialog); + category.dialogs.put(dialog.id, dialog); + } + else if(synctype == SyncType.DIALOG_CATEGORY){ + DialogCategory category = new DialogCategory(); + category.readNBT(compound); + DialogController.instance.categories.put(category.id, category); + } + else if(synctype == SyncType.QUEST){ + QuestCategory category = QuestController.instance.categories.get(buffer.readInt()); + Quest quest = new Quest(); + quest.category = category; + quest.readNBT(compound); + QuestController.instance.quests.put(quest.id, quest); + category.quests.put(quest.id, quest); + } + else if(synctype == SyncType.QUEST_CATEGORY){ + QuestCategory category = new QuestCategory(); + category.readNBT(compound); + QuestController.instance.categories.put(category.id, category); + } + } + + public static void clientSyncRemove(int synctype, int id) { + if(synctype == SyncType.FACTION){ + FactionController.getInstance().factions.remove(id); + } + else if(synctype == SyncType.DIALOG){ + Dialog dialog = DialogController.instance.dialogs.remove(id); + if(dialog != null) { + dialog.category.dialogs.remove(id); + } + } + else if(synctype == SyncType.DIALOG_CATEGORY){ + DialogCategory category = DialogController.instance.categories.remove(id); + if(category != null) { + DialogController.instance.dialogs.keySet().removeAll(category.dialogs.keySet()); + } + } + else if(synctype == SyncType.QUEST){ + Quest quest = QuestController.instance.quests.remove(id); + if(quest != null) { + quest.category.quests.remove(id); + } + } + else if(synctype == SyncType.QUEST_CATEGORY){ + QuestCategory category = QuestController.instance.categories.remove(id); + if(category != null) { + QuestController.instance.quests.keySet().removeAll(category.quests.keySet()); + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/controllers/data/Faction.java b/src/main/java/noppes/npcs/controllers/data/Faction.java index c0696f886..6fb8c246a 100644 --- a/src/main/java/noppes/npcs/controllers/data/Faction.java +++ b/src/main/java/noppes/npcs/controllers/data/Faction.java @@ -133,7 +133,7 @@ public class Faction implements IFaction { } public int playerStatus(IPlayer player) { - PlayerFactionData data = PlayerData.get((EntityPlayer) player.getMCEntity()).factionData; + PlayerFactionData data = PlayerDataController.instance.getPlayerData((EntityPlayer) player.getMCEntity()).factionData; int points = data.getFactionPoints(this.id); if (points >= this.friendlyPoints) { return 1; diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerData.java b/src/main/java/noppes/npcs/controllers/data/PlayerData.java index 0f7f00555..84b2d4012 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerData.java @@ -50,6 +50,7 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { public int companionID = 0; public boolean isGUIOpen = false; + public boolean updateClient = false; @Override public void saveNBTData(NBTTagCompound nbtTagCompound) { @@ -69,6 +70,15 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { setNBT(data); } + public NBTTagCompound getSyncNBT(){ + NBTTagCompound compound = new NBTTagCompound(); + dialogData.saveNBTData(compound); + questData.saveNBTData(compound); + factionData.saveNBTData(compound); + + return compound; + } + public void setNBT(NBTTagCompound data){ dialogData.loadNBTData(data); bankData.loadNBTData(data); @@ -139,7 +149,7 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { public void setGUIOpen(boolean bool) { isGUIOpen = bool; - save(); + save(false); } public boolean getGUIOpen() { @@ -158,7 +168,7 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { activeCompanion = npc; if(npc != null) ((RoleCompanion)npc.roleInterface).companionID = companionID; - save(); + save(false); } public void updateCompanion(World world) { @@ -299,7 +309,7 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { return mailData; } - public synchronized void save() { + public synchronized void save(boolean update) { final NBTTagCompound compound = getNBT(); final String filename = uuid + ".json"; @@ -319,5 +329,8 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { PlayerDataController.instance.putPlayerMap(playername, uuid); }); + + if(update) + updateClient = true; } } diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerDialogData.java b/src/main/java/noppes/npcs/controllers/data/PlayerDialogData.java index acf39a090..c8d7b7a01 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerDialogData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDialogData.java @@ -48,9 +48,11 @@ public class PlayerDialogData implements IPlayerDialogData { public void readDialog(int id) { dialogsRead.add(id); + parent.updateClient = true; } public void unreadDialog(int id) { dialogsRead.remove(id); + parent.updateClient = true; } } diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java index 2961e6666..f14cfaaf9 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java @@ -175,6 +175,7 @@ public class PlayerQuestData implements IPlayerQuestData { activeQuests.put(id, questdata); Server.sendData((EntityPlayerMP)parent.player, EnumPacketClient.MESSAGE, "quest.newquest", quest.title); Server.sendData((EntityPlayerMP)parent.player, EnumPacketClient.CHAT, "quest.newquest", ": ", quest.title); + parent.updateClient = true; } public void finishQuest(int id) { @@ -186,6 +187,8 @@ public class PlayerQuestData implements IPlayerQuestData { finishedQuests.put(quest.id, System.currentTimeMillis()); else finishedQuests.put(quest.id, parent.player.worldObj.getTotalWorldTime()); + + parent.updateClient = true; } public void stopQuest(int id) { @@ -193,6 +196,7 @@ public class PlayerQuestData implements IPlayerQuestData { if (quest == null) return; activeQuests.remove(id); + parent.updateClient = true; } public void removeQuest(int id) { @@ -201,6 +205,7 @@ public class PlayerQuestData implements IPlayerQuestData { return; activeQuests.remove(id); finishedQuests.remove(id); + parent.updateClient = true; } public boolean hasFinishedQuest(int id){ diff --git a/src/main/java/noppes/npcs/items/ItemNpcWand.java b/src/main/java/noppes/npcs/items/ItemNpcWand.java index 888f30e4e..2c703e9f5 100644 --- a/src/main/java/noppes/npcs/items/ItemNpcWand.java +++ b/src/main/java/noppes/npcs/items/ItemNpcWand.java @@ -18,7 +18,6 @@ import noppes.npcs.NoppesUtilServer; import noppes.npcs.config.ConfigMain; import noppes.npcs.constants.EnumGuiType; import noppes.npcs.entity.EntityCustomNpc; -import noppes.npcs.util.CustomNPCsScheduler; public class ItemNpcWand extends Item{ diff --git a/src/main/java/noppes/npcs/quests/QuestDialog.java b/src/main/java/noppes/npcs/quests/QuestDialog.java index b95c011f2..0d1a67d74 100644 --- a/src/main/java/noppes/npcs/quests/QuestDialog.java +++ b/src/main/java/noppes/npcs/quests/QuestDialog.java @@ -99,13 +99,15 @@ public class QuestDialog extends QuestInterface implements IQuestDialog { if (progress == 0 && completed) { data.dialogData.dialogsRead.remove(this.dialog.id); data.questData.checkQuestCompletion(data, EnumQuestType.values()[1]); - data.save(); + data.updateClient = true; + data.save(true); } if (progress == 1 && !completed) { data.dialogData.dialogsRead.add(this.dialog.id); data.questData.checkQuestCompletion(data, EnumQuestType.values()[1]); - data.save(); + data.updateClient = true; + data.save(true); } } else { diff --git a/src/main/java/noppes/npcs/quests/QuestKill.java b/src/main/java/noppes/npcs/quests/QuestKill.java index ed47df5d8..cfa56b74f 100644 --- a/src/main/java/noppes/npcs/quests/QuestKill.java +++ b/src/main/java/noppes/npcs/quests/QuestKill.java @@ -161,7 +161,7 @@ public class QuestKill extends QuestInterface implements IQuestKill { this.parent.setKilled(questdata, killed); data.questData.checkQuestCompletion(data, EnumQuestType.values()[2]); data.questData.checkQuestCompletion(data, EnumQuestType.values()[4]); - data.save(); + data.save(true); } } else { throw new CustomNPCsException("Progress has to be between 0 and " + this.amount, new Object[0]); diff --git a/src/main/java/noppes/npcs/quests/QuestLocation.java b/src/main/java/noppes/npcs/quests/QuestLocation.java index a38b5c0dd..626d6a3e6 100644 --- a/src/main/java/noppes/npcs/quests/QuestLocation.java +++ b/src/main/java/noppes/npcs/quests/QuestLocation.java @@ -166,7 +166,7 @@ public class QuestLocation extends QuestInterface implements IQuestLocation { if ((!completed || progress != 1) && (completed || progress != 0)) { questData.extraData.setBoolean(this.nbtName, progress == 1); data.questData.checkQuestCompletion(data, EnumQuestType.values()[3]); - data.save(); + data.save(true); } } else { throw new CustomNPCsException("Progress has to be 0 or 1", new Object[0]); diff --git a/src/main/java/noppes/npcs/util/NBTJsonUtil.java b/src/main/java/noppes/npcs/util/NBTJsonUtil.java index d7176cf9d..b6d25a333 100644 --- a/src/main/java/noppes/npcs/util/NBTJsonUtil.java +++ b/src/main/java/noppes/npcs/util/NBTJsonUtil.java @@ -24,8 +24,8 @@ public class NBTJsonUtil { json = json.trim(); JsonFile file = new JsonFile(json); if(!json.startsWith("{") || !json.endsWith("}")) - throw new JsonException("Not properly incapsulated between { }", file); - + throw new JsonException("Not properly encapsulated between { }", file); + NBTTagCompound compound = new NBTTagCompound(); FillCompound(compound, file); return compound; @@ -36,7 +36,7 @@ public class NBTJsonUtil { json.cut(1); if(json.startsWith("}")) return; - int index = json.indexOf(":"); + int index = json.findObjectColonIndex(); if(index < 1) throw new JsonException("Expected key after ," ,json); @@ -85,6 +85,16 @@ public class NBTJsonUtil { if(!json.startsWith("]")){ throw new JsonException("Expected ]", json); } + + if (json.startsWith("]b")) { + json.cut(2); + byte[] arr = new byte[list.tagCount()]; + for(int i = 0; list.tagCount() > 0 ; i++){ + arr[i] = ((NBTTagInt)list.removeTag(0)).func_150290_f(); + } + return new NBTTagByteArray(arr); + } + json.cut(1); if(list.func_150303_d() == 3){ @@ -156,7 +166,19 @@ public class NBTJsonUtil { private static JsonLine ReadTag(String name, NBTBase base, List list){ if(!name.isEmpty()) name = "\"" + name + "\": "; - if(base.getId() == 8){//NBTTagString + if (base.getId() == 7) {//NBTTagByteArray + list.add(new JsonLine(name + "[")); + byte[] bytes = ((NBTTagByteArray) base).func_150292_c(); + + for(int i = 0; i < (bytes.length-1); i++) { + list.add(new JsonLine(String.format("%s,", bytes[i]))); + } + if (bytes.length > 0) { + list.add(new JsonLine(String.format("%s", bytes[bytes.length-1]))); + } + list.add(new JsonLine("]b")); + } + else if(base.getId() == 8){//NBTTagString String data = ((NBTTagString)base).func_150285_a_(); data = data.replace("\"", "\\\""); //replace " with \" list.add(new JsonLine(name + "\"" + data + "\"")); @@ -225,7 +247,8 @@ public class NBTJsonUtil { public boolean reduceTab(){ int length = line.length(); return length == 1 && (line.endsWith("}") || line.endsWith("]")) - || length == 2 && (line.endsWith("},") ||line.endsWith("],")); + || length == 2 && (line.endsWith("},") ||line.endsWith("],") || line.endsWith("]b")) + || length == 3 && (line.endsWith("]b,")); } public boolean increaseTab(){ @@ -283,6 +306,24 @@ public class NBTJsonUtil { return "Line: " + lines.length + ", Pos: " + pos + ", Text: " + line; } + public int findObjectColonIndex() { + int trueQuotesAmount = 0; + + for (int i = 0; i < text.length(); i++) { + if (text.charAt(i) == '"') { + if (i > 1 && text.charAt(i-1) != '\\' || i == 0) { + trueQuotesAmount++; + } + } + + if (trueQuotesAmount == 2) { + return text.indexOf(":", i); + } + } + + return -1; + } + public boolean startsWith(String... ss) { for(String s : ss) if(text.startsWith(s)) diff --git a/src/main/java/tconstruct/client/tabs/InventoryTabFactions.java b/src/main/java/tconstruct/client/tabs/InventoryTabFactions.java index 815d27e00..0c8174d78 100644 --- a/src/main/java/tconstruct/client/tabs/InventoryTabFactions.java +++ b/src/main/java/tconstruct/client/tabs/InventoryTabFactions.java @@ -5,8 +5,6 @@ import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import noppes.npcs.CustomItems; import noppes.npcs.client.gui.player.GuiFaction; -import noppes.npcs.client.gui.player.GuiQuestLog; -import noppes.npcs.util.CustomNPCsScheduler; public class InventoryTabFactions extends AbstractTab { public InventoryTabFactions() { diff --git a/src/main/java/tconstruct/client/tabs/InventoryTabQuests.java b/src/main/java/tconstruct/client/tabs/InventoryTabQuests.java index c3cb49dcb..bca535a5c 100644 --- a/src/main/java/tconstruct/client/tabs/InventoryTabQuests.java +++ b/src/main/java/tconstruct/client/tabs/InventoryTabQuests.java @@ -3,11 +3,8 @@ package tconstruct.client.tabs; import net.minecraft.client.Minecraft; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; -import net.minecraft.network.play.client.C0DPacketCloseWindow; import noppes.npcs.CustomItems; -import noppes.npcs.client.gui.player.GuiFaction; import noppes.npcs.client.gui.player.GuiQuestLog; -import noppes.npcs.util.CustomNPCsScheduler; public class InventoryTabQuests extends AbstractTab { public InventoryTabQuests() {