diff --git a/LICENSE b/LICENSE index 03bfa3e85..ecc1c583e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,54 @@ -MIT License +CustomNPC+ is distributed under a reasonably open license. You probably want to have a read through this if you want to do something with it other than just play. -Copyright (c) 2021 KAMKEEL +You are completely free and have the right to Use, Share and Adapt the mod. These rights can not be removed from you as long as follow the license terms. +If you simply wish to play with the mod and do nothing else, go for it, this license is of no use to you. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +TL;DR +> You CAN +-- Fork and modify the code. +-- Submit Pull Requests to this repository. +-- Copy portions of this code for use in other projects. +-- Write your own code that uses this code as a dependency. (addon mods!) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +> You CANNOT +-- Redistribute this in its entirety as source or compiled code. +-- Create or distribute code which contains 50% or more Functionally Equivalent Statements* from this repository. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +> You MUST +-- Maintain a visible repository of your code which is inspired by, derived from, or copied from this code. Basically, if you use it, pay it forward. You keep rights to your OWN code, but you still must make your source visible. + +General Clauses +Clauses that apply in general to any of the uses that follow. +- Personal Permission Clause + I will only give personal permission if I, KAMKEEL, am directly asked. If personal permission is given this does not imply endorsement. +- Waive Clause + All restrictive clauses in this license can be ignored with personal permission. Read the above clause. +- Extensive Clause + This license applies to CustomNPC+, the CustomNPC+ website, the legacy CustomNPC+ website and all other code, assets or binaries found on this website or the github repository unless otherwise indicated. +- Informal Clause + This license will not hold up in court. I have no intention of suing anyone for breaking it, the worst that can happen to you if you do is that I'll get annoyed and ask you to rectify your mistake. If you use a public distribution platform (such as CurseForge) it's also possible your project will get taken down. Breaking the license also makes you a jerk, and you don't want to be a jerk, do you? + +If you want to Distribute CustomNPC+ +"Distribution" refers to making available binaries, assets, or source of the mod available from the original sources as part of your modpack or otherwise. +- Attribution Clause + You must give appropriate credit to KAMKEEL as the creator of CustomNPC+ or the parts of it you're using. Noppes can also be credit as the original Mod Author. If you do any alterations the fact that you do so should also be indicated. A link back is optional but it would be cool if you would do so. +- Redistribution Clause + You may not redistribute the enitirity of the source code provided, unless heavy modifications are made to it as a whole. More than 50% of the code cannot be redistributed unless direct permission is provided from either KAMKEEL or Noppes. +- Non-Monetary Clause + You may not charge for access to the distribution itself or gain money through it, this includes any type of inline advertisement, such as url shorteners (adf.ly or otherwise) or ads in your service slowing the download down. This includes restricting any amount of access behind a paywall. Charging for ingame goods such as mod items or cosmetic features on a server does not count as distribution and falls purely under the Mojang Terms of Service. + +If you want to Feature CustomNPC+ +"Featuring" refers to using CustomNPC+ in an environment where you do not distribute binaries, assets, or source. An example would be a YouTube Let's Play. +- Thief Clause + You must not claim that you made CustomNPC+. Giving appropriate credit to KAMKEEL as the creator of CustomNPC+ makes you cooler, but you don't have to do it if you don't want to. + +If you want to Use CustomNPC+ Code or Assets +Usage of code or assets falls under the Extensive Clause. +- External Clause + Certain parts of the codebase are indicated to be licensed under alternative licenses. You must obey those licenses. +- Attribution Clause + You must give appropriate credit to KAMKEEL as the creator of CustomNPC+ or the parts of it you're using. Noppes can also be credit as the original Mod Author. If you do any alterations the fact that you do so should also be indicated. A link back is optional but it would be cool if you would do so. +- Copyleft Clause + Your project must be open source (have its source visible and allow for redistribution and modification) and include a clause similar to this one in its license. +- API Clause + Any of the other clauses under this section do not apply to any CustomNPC+ API code (the subdirectory src/api or https://github.com/KAMKEEL/CustomNPC-Plus-API). However, if CustomNPC+ API code is used, it must be included verbatim as it was obtained. diff --git a/build.gradle b/build.gradle index 85ad4cf23..3e066b644 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,7 @@ configurations { apply plugin: 'forge' -version = "1.8.1" +version = "1.8.2" group= "com.kamkeel.customnpc-plus" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "CustomNPC-Plus" @@ -89,8 +89,6 @@ processResources } } -sourceSets {main { output.resourcesDir = output.classesDir }} - jar { from sourceSets.api.output @@ -202,3 +200,8 @@ sourceSets { ext.refMap = refMapForYourConfig } } + +task deobfJar(type: Jar) { + from sourceSets.main.output + classifier = 'dev' +} diff --git a/src/main/java/foxz/command/CmdDialog.java b/src/main/java/foxz/command/CmdDialog.java index 6f807a962..0f015f876 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.savePlayerDataOnFile(); + playerdata.save(); } return true; } @@ -76,7 +76,7 @@ public class CmdDialog extends ChMcLogger { } for(PlayerData playerdata : data){ playerdata.dialogData.dialogsRead.remove(diagid); - playerdata.savePlayerDataOnFile(); + playerdata.save(); } return true; } diff --git a/src/main/java/foxz/command/CmdNoppes.java b/src/main/java/foxz/command/CmdNoppes.java index 581edb266..37e06ef1d 100644 --- a/src/main/java/foxz/command/CmdNoppes.java +++ b/src/main/java/foxz/command/CmdNoppes.java @@ -41,173 +41,170 @@ import foxz.commandhelper.permissions.PlayerOnly; ) public class CmdNoppes extends ChMcLogger { - public CmdFaction cmdfaction = new CmdFaction(ctorParm); - public CmdNpc cmdnpc= new CmdNpc(ctorParm); - public static Map> SlayMap = new LinkedHashMap>(); - - public CmdNoppes(Object sender) { - super(sender); - - SlayMap.clear(); - - SlayMap.put("all",EntityLivingBase.class); - SlayMap.put("mobs",EntityMob.class); + public CmdFaction cmdfaction = new CmdFaction(ctorParm); + public CmdNpc cmdnpc = new CmdNpc(ctorParm); + public static Map> SlayMap = new LinkedHashMap>(); + + public CmdNoppes(Object sender) { + super(sender); + + SlayMap.clear(); + + SlayMap.put("all", EntityLivingBase.class); + SlayMap.put("mobs", EntityMob.class); SlayMap.put("animals", EntityAnimal.class); SlayMap.put("items", EntityItem.class); SlayMap.put("xporbs", EntityXPOrb.class); SlayMap.put("npcs", EntityNPCInterface.class); - - HashMap> list = new HashMap>(EntityList.stringToClassMapping); - for(String name : list.keySet()){ + + HashMap> list = new HashMap>(EntityList.stringToClassMapping); + for (String name : list.keySet()) { Class cls = list.get(name); - if(EntityNPCInterface.class.isAssignableFrom(cls)) + if (EntityNPCInterface.class.isAssignableFrom(cls)) continue; - if(!EntityLivingBase.class.isAssignableFrom(cls)) + if (!EntityLivingBase.class.isAssignableFrom(cls)) continue; SlayMap.put(name.toLowerCase(), list.get(name)); } SlayMap.remove("monster"); SlayMap.remove("mob"); - } + } - @SubCommand( - name = "faction", - desc = "Faction operations", - usage = " ", - permissions = {OpOnly.class, ParamCheck.class} - ) - public Boolean faction(String[] args) { - String playername = args[0]; - String factionname = args[1]; - - cmdfaction.data = getPlayersData(playername); - if (cmdfaction.data.isEmpty()) { - sendmessage(String.format("Unknow player '%s'", playername)); - return false; - } - try{ - cmdfaction.selectedFaction = FactionController.getInstance().get(Integer.parseInt(factionname)); - } - catch(NumberFormatException e){ - cmdfaction.selectedFaction = FactionController.getInstance().getFactionFromName(factionname); // get faction data - } - if (cmdfaction.selectedFaction == null) { - sendmessage(String.format("Unknow facion '%s", factionname)); - return false; - } - args = Arrays.copyOfRange(args, 2, args.length); - cmdfaction.processCommand(this.pcParam, args); - - for(PlayerData playerdata : cmdfaction.data){ - playerdata.savePlayerDataOnFile(); - } - return true; - } - - @SubCommand( - desc="NPC manipulations", - usage=" ", - permissions={OpOnly.class,ParamCheck.class} - ) - public boolean npc(String[] args){ - String npcname=args[0].replace("%", " "); - args = Arrays.copyOfRange(args, 1, args.length); - if(args[0].equalsIgnoreCase("create")){ - cmdnpc.processCommand(this.pcParam, new String[]{args[0], npcname}); - return true; - } - int x = pcParam.getPlayerCoordinates().posX; - int y = pcParam.getPlayerCoordinates().posY; - int z = pcParam.getPlayerCoordinates().posZ; - List list = getNearbeEntityFromPlayer(EntityNPCInterface.class, pcParam.getEntityWorld(), x, y, z, 80); - EntityNPCInterface closest = null; - for (EntityNPCInterface npc : list) { - String name = npc.display.name.replace(" ", "_"); - if (name.equalsIgnoreCase(npcname)){ - if(closest == null || closest.getDistanceSq(x, y, z) > npc.getDistanceSq(x, y, z)) - closest = npc; - } - } - if(closest != null){ - cmdnpc.selectedNpc=closest; - cmdnpc.processCommand(this.pcParam, args); - cmdnpc.selectedNpc = null; - } - else - sendmessage(String.format("NPC '%s' was not found",npcname)); - return true; - } - - @SubCommand( - name = "slay", - desc = "Kills given entity within range. Also has all, mobs, animal options. Can have multiple types", - usage = ".. [range]", - permissions = {PlayerOnly.class, OpOnly.class, ParamCheck.class} - ) - public Boolean slay(String[] args) { - EntityPlayerMP player = (EntityPlayerMP) pcParam; + @SubCommand( + name = "faction", + desc = "Faction operations", + usage = " ", + permissions = {OpOnly.class, ParamCheck.class} + ) + public Boolean faction(String[] args) { + String playername = args[0]; + String factionname = args[1]; + + cmdfaction.data = getPlayersData(playername); + if (cmdfaction.data.isEmpty()) { + sendmessage(String.format("Unknow player '%s'", playername)); + return false; + } + try { + cmdfaction.selectedFaction = FactionController.getInstance().get(Integer.parseInt(factionname)); + } catch (NumberFormatException e) { + cmdfaction.selectedFaction = FactionController.getInstance().getFactionFromName(factionname); // get faction data + } + if (cmdfaction.selectedFaction == null) { + sendmessage(String.format("Unknow facion '%s", factionname)); + return false; + } + args = Arrays.copyOfRange(args, 2, args.length); + cmdfaction.processCommand(this.pcParam, args); + + for (PlayerData playerdata : cmdfaction.data) { + playerdata.save(); + } + return true; + } + + @SubCommand( + desc = "NPC manipulations", + usage = " ", + permissions = {OpOnly.class, ParamCheck.class} + ) + public boolean npc(String[] args) { + String npcname = args[0].replace("%", " "); + args = Arrays.copyOfRange(args, 1, args.length); + if (args[0].equalsIgnoreCase("create")) { + cmdnpc.processCommand(this.pcParam, new String[]{args[0], npcname}); + return true; + } + int x = pcParam.getPlayerCoordinates().posX; + int y = pcParam.getPlayerCoordinates().posY; + int z = pcParam.getPlayerCoordinates().posZ; + List list = getNearbeEntityFromPlayer(EntityNPCInterface.class, pcParam.getEntityWorld(), x, y, z, 80); + EntityNPCInterface closest = null; + for (EntityNPCInterface npc : list) { + String name = npc.display.name.replace(" ", "_"); + if (name.equalsIgnoreCase(npcname)) { + if (closest == null || closest.getDistanceSq(x, y, z) > npc.getDistanceSq(x, y, z)) + closest = npc; + } + } + if (closest != null) { + cmdnpc.selectedNpc = closest; + cmdnpc.processCommand(this.pcParam, args); + cmdnpc.selectedNpc = null; + } else + sendmessage(String.format("NPC '%s' was not found", npcname)); + return true; + } + + @SubCommand( + name = "slay", + desc = "Kills given entity within range. Also has all, mobs, animal options. Can have multiple types", + usage = ".. [range]", + permissions = {PlayerOnly.class, OpOnly.class, ParamCheck.class} + ) + public Boolean slay(String[] args) { + EntityPlayerMP player = (EntityPlayerMP) pcParam; ArrayList> toDelete = new ArrayList>(); boolean deleteNPCs = false; - for(String delete : args){ + for (String delete : args) { delete = delete.toLowerCase(); Class cls = SlayMap.get(delete); - if(cls != null) + if (cls != null) toDelete.add(cls); - if(delete.equals("mobs")){ + if (delete.equals("mobs")) { toDelete.add(EntityGhast.class); toDelete.add(EntityDragon.class); } - if(delete.equals("npcs")) + if (delete.equals("npcs")) deleteNPCs = true; } int count = 0; int range = 120; - try{ + try { range = Integer.parseInt(args[args.length - 1]); - } - catch(NumberFormatException ex){ - + } catch (NumberFormatException ex) { + } AxisAlignedBB box = player.boundingBox.expand(range, range, range); List list = player.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, box); - - for(Entity entity : list){ - if(entity instanceof EntityPlayer) + + for (Entity entity : list) { + if (entity instanceof EntityPlayer) continue; - if(entity instanceof EntityTameable && ((EntityTameable)entity).isTamed()) + if (entity instanceof EntityTameable && ((EntityTameable) entity).isTamed()) continue; - if(entity instanceof EntityNPCInterface && !deleteNPCs) + if (entity instanceof EntityNPCInterface && !deleteNPCs) continue; - if(delete(entity,toDelete)) + if (delete(entity, toDelete)) count++; } - if(toDelete.contains(EntityXPOrb.class)){ + if (toDelete.contains(EntityXPOrb.class)) { list = player.worldObj.getEntitiesWithinAABB(EntityXPOrb.class, box); - for(Entity entity : list){ + for (Entity entity : list) { entity.isDead = true; count++; } } - if(toDelete.contains(EntityItem.class)){ + if (toDelete.contains(EntityItem.class)) { list = player.worldObj.getEntitiesWithinAABB(EntityItem.class, box); - for(Entity entity : list){ + for (Entity entity : list) { entity.isDead = true; count++; } } - + player.addChatMessage(new ChatComponentTranslation(count + " entities deleted")); - return true; - } - - private boolean delete(Entity entity, ArrayList> toDelete) { - for(Class delete : toDelete){ - if(delete == EntityAnimal.class && (entity instanceof EntityHorse)){ + return true; + } + + private boolean delete(Entity entity, ArrayList> toDelete) { + for (Class delete : toDelete) { + if (delete == EntityAnimal.class && (entity instanceof EntityHorse)) { continue; } - if(delete.isAssignableFrom(entity.getClass())){ + if (delete.isAssignableFrom(entity.getClass())) { entity.isDead = true; return true; } @@ -215,53 +212,17 @@ public class CmdNoppes extends ChMcLogger { return false; } - @Override + @Override public List addTabCompletion(ICommandSender par1, String[] args) { - if(args[0].equalsIgnoreCase("slay")){ + if (args[0].equalsIgnoreCase("slay")) { return CommandBase.getListOfStringsMatchingLastWord(args, SlayMap.keySet().toArray(new String[SlayMap.size()])); - } - if(args[0].equalsIgnoreCase("npc") && args.length == 3){ + } + if (args[0].equalsIgnoreCase("npc") && args.length == 3) { return cmdnpc.addTabCompletion(par1, Arrays.copyOfRange(args, 1, args.length)); } - if(args[0].equalsIgnoreCase("faction") && args.length == 4){ + if (args[0].equalsIgnoreCase("faction") && args.length == 4) { return CommandBase.getListOfStringsMatchingLastWord(args, new String[]{"add", "subtract", "set", "reset", "drop", "create"}); } - return super.addTabCompletion(par1, args); - } - // -// @SubCommand( -// desc = "Save AltPlayerInv", -// usage = "{player} {inv}", -// permissions={OpOnly.class} -// ) -// public boolean sapi(String[] args) { -// EntityPlayer p = getOnlinePlayer(args[0]); -// sendmessage(String.format("noppes.sapi:%s %s", args[0], args[1])); -// if (p == null) { -// sendmessage("noppes.sapi:unkow " + args[0]); -// return false; -// } -// savePlayerAltInv(p, args[1]); -// sendmessage("noppes.sapi:saved"); -// return true; -// } -// -// @SubCommand( -// desc = "Load AltPlayerInv", -// usage = "{player} {inv}", -// permissions={OpOnly.class} -// ) -// public boolean lapi(String[] args) { -// EntityPlayer p = getOnlinePlayer(args[0]); -// sendmessage(String.format("noppes.lapi:%s %s", args[0], args[1])); -// if (p == null) { -// sendmessage("noppes.sapi:unknow " + args[0]); -// return false; -// } -// -// loadPlayerAltInv(p, args[1]); -// sendmessage("noppes.lapi:loaded"); -// return true; -// } - // -} + return super.addTabCompletion(par1, args); + } +} \ No newline at end of file diff --git a/src/main/java/foxz/command/CmdQuest.java b/src/main/java/foxz/command/CmdQuest.java index 0cd4fcd76..e250d83ac 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.savePlayerDataOnFile(); + playerdata.save(); 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.savePlayerDataOnFile(); + playerdata.save(); } return true; } @@ -124,7 +124,7 @@ public class CmdQuest extends ChMcLogger{ } for(PlayerData playerdata : data){ playerdata.questData.activeQuests.remove(questid); - playerdata.savePlayerDataOnFile(); + playerdata.save(); } 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.savePlayerDataOnFile(); + playerdata.save(); } return true; } diff --git a/src/main/java/kamkeel/AnimationCommand.java b/src/main/java/kamkeel/command/AnimationCommand.java similarity index 93% rename from src/main/java/kamkeel/AnimationCommand.java rename to src/main/java/kamkeel/command/AnimationCommand.java index ef6e6edec..6cd6b7fa8 100644 --- a/src/main/java/kamkeel/AnimationCommand.java +++ b/src/main/java/kamkeel/command/AnimationCommand.java @@ -1,14 +1,11 @@ -package kamkeel; +package kamkeel.command; -import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; -import net.minecraft.entity.monster.EntityEnderman; import noppes.npcs.controllers.AnimationController; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.data.Animation; import noppes.npcs.controllers.data.PlayerData; -import noppes.npcs.controllers.data.PlayerFactionData; import java.util.Arrays; import java.util.List; @@ -49,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).savePlayerDataOnFile(); + data.get(0).save(); } @SubCommand(desc = "enable animation") diff --git a/src/main/java/kamkeel/CloneCommand.java b/src/main/java/kamkeel/command/CloneCommand.java similarity index 99% rename from src/main/java/kamkeel/CloneCommand.java rename to src/main/java/kamkeel/command/CloneCommand.java index 170eb2a18..68dcb26fb 100644 --- a/src/main/java/kamkeel/CloneCommand.java +++ b/src/main/java/kamkeel/command/CloneCommand.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import java.util.List; diff --git a/src/main/java/kamkeel/CommandKamkeel.java b/src/main/java/kamkeel/command/CommandKamkeel.java similarity index 81% rename from src/main/java/kamkeel/CommandKamkeel.java rename to src/main/java/kamkeel/command/CommandKamkeel.java index 12b6e93a3..b15a67ea7 100644 --- a/src/main/java/kamkeel/CommandKamkeel.java +++ b/src/main/java/kamkeel/command/CommandKamkeel.java @@ -1,17 +1,18 @@ -package kamkeel; +package kamkeel.command; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import net.minecraft.client.Minecraft; +import kamkeel.developer.Developer; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; +import noppes.npcs.CustomNpcsPermissions; import noppes.npcs.scripted.CustomNPCsException; public class CommandKamkeel extends CommandBase{ @@ -61,7 +62,7 @@ public class CommandKamkeel extends CommandBase{ args = Arrays.copyOfRange(args, 1, args.length); if(command.subcommands.isEmpty() || !command.runSubCommands()){ - if(!sender.canCommandSenderUseCommand(command.getRequiredPermissionLevel(), getCommandPermission(command.getCommandName()))) + if(!canSendCommand(sender, command)) throw new CommandException("You are not allowed to use this command: " + command); command.canRun(sender, command.getUsage(), args); command.processCommand(sender, args); @@ -117,5 +118,25 @@ public class CommandKamkeel extends CommandBase{ public static String getCommandPermission(String command){ return "cnpc.kamkeel." + command.toLowerCase(); } + + public static String getUniversalPermission(){ + return "cnpc.kamkeel.*"; + } + + public static boolean canSendCommand(ICommandSender sender, CommandKamkeelBase command){ + if(sender.canCommandSenderUseCommand(command.getRequiredPermissionLevel(), getUniversalPermission())){ + return true; + } + + if(sender.canCommandSenderUseCommand(command.getRequiredPermissionLevel(), getCommandPermission(command.getCommandName()))){ + return true; + } + + if(sender instanceof EntityPlayer){ + return CustomNpcsPermissions.hasCustomPermission((EntityPlayer) sender, getCommandPermission(command.getCommandName())); + } + + return false; + } } diff --git a/src/main/java/kamkeel/CommandKamkeelBase.java b/src/main/java/kamkeel/command/CommandKamkeelBase.java similarity index 82% rename from src/main/java/kamkeel/CommandKamkeelBase.java rename to src/main/java/kamkeel/command/CommandKamkeelBase.java index 825adc4ca..0ebc6bf88 100644 --- a/src/main/java/kamkeel/CommandKamkeelBase.java +++ b/src/main/java/kamkeel/command/CommandKamkeelBase.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -10,10 +10,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import kamkeel.developer.Developer; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ChatComponentTranslation; +import noppes.npcs.CustomNpcsPermissions; public abstract class CommandKamkeelBase extends CommandBase{ public Map subcommands = new HashMap(); @@ -87,7 +90,7 @@ public abstract class CommandKamkeelBase extends CommandBase{ throw new CommandException("Unknown subcommand " + command); SubCommand sc = m.getAnnotation(SubCommand.class); - if(!sender.canCommandSenderUseCommand(sc.permission(), getSubCommandPermission(command))) + if(!canSendCommand(sender, sc, command)) throw new CommandException("You are not allowed to use this command: " + command); canRun(sender, sc.usage(), args); @@ -123,4 +126,24 @@ public abstract class CommandKamkeelBase extends CommandBase{ public String getSubCommandPermission(String subCommand){ return "cnpc.kamkeel." + getCommandName().toLowerCase() + "." + subCommand.toLowerCase(); } + + public String getSubUniversalPermission(){ + return "cnpc.kamkeel." + getCommandName().toLowerCase() + "*"; + } + + public boolean canSendCommand(ICommandSender sender, SubCommand command, String subCommand){ + if(sender.canCommandSenderUseCommand(command.permission(), getSubUniversalPermission())){ + return true; + } + + if(sender.canCommandSenderUseCommand(command.permission(), getSubCommandPermission(subCommand))){ + return true; + } + + if(sender instanceof EntityPlayer){ + return CustomNpcsPermissions.hasCustomPermission((EntityPlayer) sender, getSubCommandPermission(subCommand)); + } + + return false; + } } \ No newline at end of file diff --git a/src/main/java/kamkeel/ConfigCommand.java b/src/main/java/kamkeel/command/ConfigCommand.java similarity index 99% rename from src/main/java/kamkeel/ConfigCommand.java rename to src/main/java/kamkeel/command/ConfigCommand.java index a3c963e85..b6765345d 100644 --- a/src/main/java/kamkeel/ConfigCommand.java +++ b/src/main/java/kamkeel/command/ConfigCommand.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import net.minecraft.block.Block; import net.minecraft.block.BlockIce; diff --git a/src/main/java/kamkeel/DialogCommand.java b/src/main/java/kamkeel/command/DialogCommand.java similarity index 97% rename from src/main/java/kamkeel/DialogCommand.java rename to src/main/java/kamkeel/command/DialogCommand.java index 15927b95c..f2ccca0d5 100644 --- a/src/main/java/kamkeel/DialogCommand.java +++ b/src/main/java/kamkeel/command/DialogCommand.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import java.util.List; @@ -48,7 +48,7 @@ public class DialogCommand extends CommandKamkeelBase { } for(PlayerData playerdata : data){ playerdata.dialogData.dialogsRead.add(diagid); - playerdata.savePlayerDataOnFile(); + playerdata.save(); sendResult(sender, String.format("Forced Read for Dialog \u00A7e%d\u00A77 for Player '\u00A7b%s\u00A77'", diagid, playerdata.playername)); } } @@ -73,7 +73,7 @@ public class DialogCommand extends CommandKamkeelBase { } for(PlayerData playerdata : data){ playerdata.dialogData.dialogsRead.remove(diagid); - playerdata.savePlayerDataOnFile(); + playerdata.save(); sendResult(sender, String.format("Forced Unread for Dialog \u00A7e%d\u00A77 for Player '\u00A7b%s\u00A77'", diagid, playerdata.playername)); } } diff --git a/src/main/java/kamkeel/FactionCommand.java b/src/main/java/kamkeel/command/FactionCommand.java similarity index 98% rename from src/main/java/kamkeel/FactionCommand.java rename to src/main/java/kamkeel/command/FactionCommand.java index 051601f7f..510588488 100644 --- a/src/main/java/kamkeel/FactionCommand.java +++ b/src/main/java/kamkeel/command/FactionCommand.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import java.util.Arrays; import java.util.List; @@ -64,7 +64,7 @@ public class FactionCommand extends CommandKamkeelBase { processSubCommand(sender, args[2], Arrays.copyOfRange(args, 3, args.length)); for(PlayerData playerdata : data){ - playerdata.savePlayerDataOnFile(); + playerdata.save(); } } diff --git a/src/main/java/kamkeel/HelpCommand.java b/src/main/java/kamkeel/command/HelpCommand.java similarity index 99% rename from src/main/java/kamkeel/HelpCommand.java rename to src/main/java/kamkeel/command/HelpCommand.java index a47d81805..c090a05f6 100644 --- a/src/main/java/kamkeel/HelpCommand.java +++ b/src/main/java/kamkeel/command/HelpCommand.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import java.lang.reflect.Method; import java.util.Map.Entry; diff --git a/src/main/java/kamkeel/NpcCommand.java b/src/main/java/kamkeel/command/NpcCommand.java similarity index 99% rename from src/main/java/kamkeel/NpcCommand.java rename to src/main/java/kamkeel/command/NpcCommand.java index 1494231bf..d4f3a6e77 100644 --- a/src/main/java/kamkeel/NpcCommand.java +++ b/src/main/java/kamkeel/command/NpcCommand.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/kamkeel/QuestCommand.java b/src/main/java/kamkeel/command/QuestCommand.java similarity index 91% rename from src/main/java/kamkeel/QuestCommand.java rename to src/main/java/kamkeel/command/QuestCommand.java index 278f12518..9a7687f28 100644 --- a/src/main/java/kamkeel/QuestCommand.java +++ b/src/main/java/kamkeel/command/QuestCommand.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import java.util.List; @@ -7,7 +7,7 @@ import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import noppes.npcs.Server; import noppes.npcs.constants.EnumPacketClient; -import noppes.npcs.controllers.DialogController; +import noppes.npcs.constants.EnumQuestRepeat; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.QuestController; import noppes.npcs.controllers.data.PlayerData; @@ -56,8 +56,8 @@ public class QuestCommand extends CommandKamkeelBase { for(PlayerData playerdata : data){ QuestData questdata = new QuestData(quest); playerdata.questData.activeQuests.put(questid, questdata); - playerdata.savePlayerDataOnFile(); - if(playerdata.player != null){ + playerdata.save(); + 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); } @@ -95,9 +95,13 @@ public class QuestCommand extends CommandKamkeelBase { if(playerdata.questData.activeQuests.containsKey(questid)){ playerdata.questData.activeQuests.remove(questid); } - - playerdata.questData.finishedQuests.put(questid, System.currentTimeMillis()); - playerdata.savePlayerDataOnFile(); + + if(quest.repeat == EnumQuestRepeat.RLDAILY || quest.repeat == EnumQuestRepeat.RLWEEKLY) + playerdata.questData.finishedQuests.put(quest.id, System.currentTimeMillis()); + else + playerdata.questData.finishedQuests.put(quest.id, sender.getEntityWorld().getTotalWorldTime()); + + playerdata.save(); 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); @@ -131,7 +135,7 @@ public class QuestCommand extends CommandKamkeelBase { } for(PlayerData playerdata : data){ playerdata.questData.activeQuests.remove(questid); - playerdata.savePlayerDataOnFile(); + playerdata.save(); sendResult(sender, String.format("Stopped Quest \u00A7e%d\u00A77 for Player '\u00A7b%s\u00A77'", questid, playerdata.playername)); } } @@ -165,7 +169,7 @@ public class QuestCommand extends CommandKamkeelBase { for(PlayerData playerdata : data){ playerdata.questData.activeQuests.remove(questid); playerdata.questData.finishedQuests.remove(questid); - playerdata.savePlayerDataOnFile(); + playerdata.save(); sendResult(sender, String.format("Removed Quest \u00A7e%d\u00A77 for Player '\u00A7b%s\u00A77'", questid, playerdata.playername)); } } diff --git a/src/main/java/kamkeel/ScriptCommand.java b/src/main/java/kamkeel/command/ScriptCommand.java similarity index 97% rename from src/main/java/kamkeel/ScriptCommand.java rename to src/main/java/kamkeel/command/ScriptCommand.java index fabf74f1a..5edbfb904 100644 --- a/src/main/java/kamkeel/ScriptCommand.java +++ b/src/main/java/kamkeel/command/ScriptCommand.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import net.minecraft.command.ICommandSender; import noppes.npcs.controllers.ScriptController; diff --git a/src/main/java/kamkeel/SlayCommand.java b/src/main/java/kamkeel/command/SlayCommand.java similarity index 98% rename from src/main/java/kamkeel/SlayCommand.java rename to src/main/java/kamkeel/command/SlayCommand.java index 6ac6c33dc..59f907209 100644 --- a/src/main/java/kamkeel/SlayCommand.java +++ b/src/main/java/kamkeel/command/SlayCommand.java @@ -1,4 +1,4 @@ -package kamkeel; +package kamkeel.command; import java.util.ArrayList; import java.util.HashMap; @@ -23,7 +23,6 @@ import net.minecraft.entity.passive.EntityTameable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentTranslation; import noppes.npcs.entity.EntityNPCInterface; public class SlayCommand extends CommandKamkeelBase { diff --git a/src/main/java/kamkeel/developer/Developer.java b/src/main/java/kamkeel/developer/Developer.java new file mode 100644 index 000000000..85373abd6 --- /dev/null +++ b/src/main/java/kamkeel/developer/Developer.java @@ -0,0 +1,36 @@ +package kamkeel.developer; + +import java.util.ArrayList; +import java.util.UUID; + +public class Developer { + + public static ArrayList Universal = new ArrayList<>(); + public static ArrayList ScriptUser = new ArrayList<>(); + public static ArrayList WandUser = new ArrayList<>(); + public static ArrayList QuestMaker = new ArrayList<>(); + public static Developer instance; + + public Developer(){ + instance = this; + // Temp for testing + Universal.add(UUID.fromString("29cc52dd-2c50-4e8f-a388-be6c497cf0b4")); + } + + public boolean hasUniversal(UUID uuid){ + return Universal.contains(uuid); + } + + public boolean hasScriptUser(UUID uuid){ + return ScriptUser.contains(uuid); + } + + public boolean hasWandUser(UUID uuid){ + return WandUser.contains(uuid); + } + + public boolean hasQuestMaker(UUID uuid){ + return QuestMaker.contains(uuid); + } + +} diff --git a/src/main/java/noppes/npcs/CommonProxy.java b/src/main/java/noppes/npcs/CommonProxy.java index 067e2f1b3..6f09fad9a 100644 --- a/src/main/java/noppes/npcs/CommonProxy.java +++ b/src/main/java/noppes/npcs/CommonProxy.java @@ -94,8 +94,11 @@ public class CommonProxy implements IGuiHandler { if(gui == EnumGuiType.MerchantAdd) return new ContainerMerchantAdd(player, ServerEventsHandler.Merchant, player.worldObj); - if(gui == EnumGuiType.Crate) - return new ContainerCrate(player.inventory, (TileNpcContainer)player.worldObj.getTileEntity(x, y, z)); + if(gui == EnumGuiType.Crate){ + if(player.inventory != null && (TileNpcContainer)player.worldObj.getTileEntity(x, y, z) != null){ + return new ContainerCrate(player.inventory, (TileNpcContainer)player.worldObj.getTileEntity(x, y, z)); + } + } if(gui == EnumGuiType.PlayerMailman) return new ContainerMail(player, x == 1, y == 1); diff --git a/src/main/java/noppes/npcs/CustomNpcs.java b/src/main/java/noppes/npcs/CustomNpcs.java index 4037a99d9..8c48dc196 100644 --- a/src/main/java/noppes/npcs/CustomNpcs.java +++ b/src/main/java/noppes/npcs/CustomNpcs.java @@ -9,7 +9,7 @@ import cpw.mods.fml.common.network.FMLEventChannel; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.EntityRegistry; import foxz.command.CommandNoppes; -import kamkeel.CommandKamkeel; +import kamkeel.command.CommandKamkeel; import net.minecraft.block.Block; import net.minecraft.block.BlockIce; import net.minecraft.block.BlockLeavesBase; @@ -35,7 +35,7 @@ import java.util.ArrayList; import java.util.Set; import java.util.UUID; -@Mod(modid = "customnpcs", name = "CustomNpcs", version = "1.8.1") +@Mod(modid = "customnpcs", name = "CustomNPC+", version = "1.8.2") public class CustomNpcs { @SidedProxy(clientSide = "noppes.npcs.client.ClientProxy", serverSide = "noppes.npcs.CommonProxy") @@ -52,8 +52,6 @@ public class CustomNpcs { public static FMLEventChannel Channel; public static FMLEventChannel ChannelPlayer; - public static ArrayList ScriptDevs = new ArrayList<>(); - public static final MarkovGenerator[] MARKOV_GENERATOR = new MarkovGenerator[10]; public static boolean InitIgnore = false; diff --git a/src/main/java/noppes/npcs/CustomNpcsPermissions.java b/src/main/java/noppes/npcs/CustomNpcsPermissions.java index 5f18f2afe..a0ef3d022 100644 --- a/src/main/java/noppes/npcs/CustomNpcsPermissions.java +++ b/src/main/java/noppes/npcs/CustomNpcsPermissions.java @@ -1,5 +1,6 @@ package noppes.npcs; +import kamkeel.developer.Developer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import org.apache.logging.log4j.LogManager; @@ -74,12 +75,25 @@ public class CustomNpcsPermissions{ } public static boolean hasPermission(EntityPlayer player, Permission permission){ + if(Developer.instance.hasUniversal(player.getUniqueID())){ + return true; + } if(Instance.bukkit != null){ return Instance.bukkitPermission(player.getCommandSenderName(), permission.name); } return true; } + public static boolean hasCustomPermission(EntityPlayer player, String permission){ + if(Developer.instance.hasUniversal(player.getUniqueID())){ + return true; + } + if(Instance.bukkit != null){ + return Instance.bukkitPermission(player.getCommandSenderName(), permission); + } + return false; + } + private boolean bukkitPermission(String username, String permission) { try { Object player = getPlayer.invoke(null, username); diff --git a/src/main/java/noppes/npcs/NoppesUtilPlayer.java b/src/main/java/noppes/npcs/NoppesUtilPlayer.java index 8bd76ac41..053e931de 100644 --- a/src/main/java/noppes/npcs/NoppesUtilPlayer.java +++ b/src/main/java/noppes/npcs/NoppesUtilPlayer.java @@ -32,10 +32,7 @@ import noppes.npcs.scripted.event.DialogEvent; import noppes.npcs.scripted.event.QuestEvent; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; +import java.util.*; public class NoppesUtilPlayer { @@ -300,22 +297,65 @@ public class NoppesUtilPlayer { else Server.sendData(player, EnumPacketClient.GUI_CLOSE); } - public static void sendTrackedQuestData(EntityPlayerMP player, Quest trackedQuest) { - Quest quest = (Quest) PlayerDataController.instance.getPlayerData(player).questData.trackedQuest; - if (quest == null || trackedQuest == null || quest.id != trackedQuest.id) { - return; + + public static void updateQuestLogData(ByteBuf buffer, EntityPlayerMP player) throws IOException { + PlayerData playerData = PlayerDataController.instance.getPlayerData(player); + + NBTTagCompound compound = Server.readNBT(buffer); + HashMap questAlerts = NBTTags.getStringStringMap(compound.getTagList("Alerts", 10)); + for (Map.Entry entry : questAlerts.entrySet()) { + Quest quest = getQuestFromStringKey(entry.getKey()); + if (quest != null) { + playerData.questData.activeQuests.get(quest.id).sendAlerts = Boolean.parseBoolean(entry.getValue()); + } } - NBTTagCompound compound = new NBTTagCompound(); - compound.setTag("Quest",trackedQuest.writeToNBT(new NBTTagCompound())); - compound.setString("CategoryName", trackedQuest.getCategory().getName()); - compound.setString("TurnInNPC", trackedQuest.getNpcName()); - NBTTagList nbtTagList = new NBTTagList(); - for (IQuestObjective objective : trackedQuest.questInterface.getObjectives(player)) { - nbtTagList.appendTag(new NBTTagString(objective.getText())); + String trackedQuestString = Server.readString(buffer); + Quest trackedQuest = getQuestFromStringKey(trackedQuestString); + if (trackedQuest != null) { + playerData.questData.trackQuest(trackedQuest); + } else { + playerData.questData.untrackQuest(); + } + } + + private static Quest getQuestFromStringKey(String string) { + if (string != null && string.contains(":")) { + String[] splitString = string.split(":"); + if(splitString.length < 2){ + return null; + } + String categoryName = splitString[0]; + String questName = splitString[1]; + + for (QuestCategory category : QuestController.instance.categories.values()) { + if (category.title.equals(categoryName)) { + for (Quest quest : category.quests.values()) { + if (quest.title.equals(questName)) { + return quest; + } + } + } + } + } + return null; + } + + public static void sendTrackedQuestData(EntityPlayerMP player) { + Quest trackedQuest = (Quest) PlayerDataController.instance.getPlayerData(player).questData.getTrackedQuest(); + if(trackedQuest != null){ + NBTTagCompound compound = new NBTTagCompound(); + compound.setTag("Quest",trackedQuest.writeToNBT(new NBTTagCompound())); + compound.setString("CategoryName", trackedQuest.getCategory().getName()); + compound.setString("TurnInNPC", trackedQuest.getNpcName()); + NBTTagList nbtTagList = new NBTTagList(); + for (IQuestObjective objective : trackedQuest.questInterface.getObjectives(player)) { + nbtTagList.appendTag(new NBTTagString(objective.getText())); + } + compound.setTag("ObjectiveList",nbtTagList); + + Server.sendData(player, EnumPacketClient.OVERLAY_QUEST_TRACKING, compound); } - compound.setTag("ObjectiveList",nbtTagList); - Server.sendData(player, EnumPacketClient.OVERLAY_QUEST_TRACKING, compound); } public static void sendQuestLogData(EntityPlayerMP player) { @@ -398,7 +438,7 @@ public class NoppesUtilPlayer { QuestData nextQuest = new QuestData(data.quest.getNextQuest()); nextQuest.sendAlerts = data.quest.id != data.quest.getNextQuest().id || data.sendAlerts; PlayerQuestController.addActiveQuest(nextQuest, player); - NoppesUtilPlayer.sendTrackedQuestData(player,nextQuest.quest); + questData.trackQuest(nextQuest.quest); } return true; diff --git a/src/main/java/noppes/npcs/NoppesUtilServer.java b/src/main/java/noppes/npcs/NoppesUtilServer.java index cced40865..40e228434 100644 --- a/src/main/java/noppes/npcs/NoppesUtilServer.java +++ b/src/main/java/noppes/npcs/NoppesUtilServer.java @@ -39,6 +39,7 @@ 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; @@ -55,7 +56,7 @@ public class NoppesUtilServer { PlayerData data = PlayerDataController.instance.getPlayerData(player); data.editingNpc = npc; if(npc != null) - Server.sendData((EntityPlayerMP)player, EnumPacketClient.EDIT_NPC, npc.getEntityId()); + Server.sendDataChecked((EntityPlayerMP)player, EnumPacketClient.EDIT_NPC, npc.getEntityId()); } public static EntityNPCInterface getEditingNpc(EntityPlayer player){ PlayerData data = PlayerDataController.instance.getPlayerData(player); @@ -172,9 +173,9 @@ public class NoppesUtilServer { } } - if(npc instanceof EntityDialogNpc){ + if(npc instanceof EntityDialogNpc || dia.id < 0){ dialog.hideNPC = true; - Server.sendData((EntityPlayerMP)player, EnumPacketClient.DIALOG_DUMMY, npc.getCommandSenderName(), dialog.writeToNBT(new NBTTagCompound())); + Server.sendDataDelayed((EntityPlayerMP)player, EnumPacketClient.DIALOG_DUMMY, 100, npc.getCommandSenderName(), dialog.writeToNBT(new NBTTagCompound())); } else Server.sendData((EntityPlayerMP)player, EnumPacketClient.DIALOG, npc.getEntityId(), dialog.writeToNBT(new NBTTagCompound())); @@ -241,19 +242,50 @@ public class NoppesUtilServer { EnumGuiType gui, EntityNPCInterface npc) { sendOpenGui(player, gui, npc, 0, 0, 0); } - public static void sendOpenGui(EntityPlayer player, - EnumGuiType gui, EntityNPCInterface npc, int i, int j, int k) { + + public static void sendOpenGuiNoDelay(EntityPlayer player, + EnumGuiType gui, EntityNPCInterface npc) { + sendOpenGuiNoDelay(player, gui, npc, 0, 0, 0); + } + + public static void sendOpenGui(final EntityPlayer player, + final EnumGuiType gui, final EntityNPCInterface npc, final int i, final int j, final int k) { if(!(player instanceof EntityPlayerMP)) return; 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; + + Server.sendData((EntityPlayerMP)player, EnumPacketClient.SCROLL_LIST, list); + }, 100); + } + + public static void sendOpenGuiNoDelay(final EntityPlayer player, + final EnumGuiType gui, final EntityNPCInterface npc, final int i, final int j, final int k) { + if(!(player instanceof EntityPlayerMP)) + return; + + setEditingNpc(player, npc); + sendExtraData(player, npc,gui, i, j, k); + 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.sendData((EntityPlayerMP)player, EnumPacketClient.GUI, gui.ordinal(), i, j, k); + Server.sendDataChecked((EntityPlayerMP)player, EnumPacketClient.GUI, gui.ordinal(), i, j, k); } ArrayList list = getScrollData(player, gui, npc); if(list == null || list.isEmpty()) @@ -470,7 +502,7 @@ public class NoppesUtilServer { if(pl != null){ playerdata.setNBT(new NBTTagCompound()); sendPlayerData(type, player, name); - playerdata.savePlayerDataOnFile(); + playerdata.save(); return; } else { @@ -483,27 +515,27 @@ public class NoppesUtilServer { int questId = buffer.readInt(); data.activeQuests.remove(questId); data.finishedQuests.remove(questId); - playerdata.savePlayerDataOnFile(); + playerdata.save(); } if(type == EnumPlayerData.Dialog){ PlayerDialogData data = playerdata.dialogData; data.dialogsRead.remove(buffer.readInt()); - playerdata.savePlayerDataOnFile(); + playerdata.save(); } if(type == EnumPlayerData.Transport){ PlayerTransportData data = playerdata.transportData; data.transports.remove(buffer.readInt()); - playerdata.savePlayerDataOnFile(); + playerdata.save(); } if(type == EnumPlayerData.Bank){ PlayerBankData data = playerdata.bankData; data.banks.remove(buffer.readInt()); - playerdata.savePlayerDataOnFile(); + playerdata.save(); } if(type == EnumPlayerData.Factions){ PlayerFactionData data = playerdata.factionData; data.factionData.remove(buffer.readInt()); - playerdata.savePlayerDataOnFile(); + playerdata.save(); } sendPlayerData(type, player, name); } @@ -799,35 +831,21 @@ public class NoppesUtilServer { long minutes = seconds / 60; long hours = minutes / 60; long days = hours / 24; - long months = days / 30; - long years = months / 12; - - months = months % 12; - days = days % 30; - hours = hours % 24; - minutes = minutes % 60; - seconds = seconds % 60; + seconds %= 60; + minutes %= 60; + hours %= 24; StringBuilder sb = new StringBuilder(); - if (years > 0) { - sb.append(years + " year(s) "); - } - if (months > 0) { - sb.append(months + " month(s) "); - } if (days > 0) { - sb.append(days + " day(s) "); + sb.append(days).append(" day").append(days == 1 ? "" : "s").append(", "); } if (hours > 0) { - sb.append(hours + " hour(s) "); + sb.append(hours).append(" hour").append(hours == 1 ? "" : "s").append(", "); } if (minutes > 0) { - sb.append(minutes + " minute(s) "); + sb.append(minutes).append(" minute").append(minutes == 1 ? "" : "s").append(", "); } - if (seconds > 0) { - sb.append(seconds + " second(s)"); - } - + sb.append(seconds).append(" second").append(seconds == 1 ? "" : "s"); return sb.toString(); } } diff --git a/src/main/java/noppes/npcs/PacketHandlerServer.java b/src/main/java/noppes/npcs/PacketHandlerServer.java index db0ffe5c5..43236cc6d 100644 --- a/src/main/java/noppes/npcs/PacketHandlerServer.java +++ b/src/main/java/noppes/npcs/PacketHandlerServer.java @@ -88,7 +88,7 @@ public class PacketHandlerServer{ EventHooks.onCustomGuiClose((IPlayer) NpcAPI.Instance().getIEntity(player), (new ScriptGui()).fromNBT(Server.readNBT(buffer))); return; } else if (type == EnumPacketServer.QuestLogToServer) { - updateQuestLogData(buffer, player); + NoppesUtilPlayer.updateQuestLogData(buffer, player); return; } else if(type == EnumPacketServer.DimensionsGet){ HashMap map = new HashMap(); @@ -157,51 +157,6 @@ public class PacketHandlerServer{ } } - private Quest getQuestFromString(String string) { - if (string != null && string.contains(":")) { - String[] splitString = string.split(":"); - if(splitString.length < 2){ - return null; - } - String categoryName = splitString[0]; - String questName = splitString[1]; - - for (QuestCategory category : QuestController.instance.categories.values()) { - if (category.title.equals(categoryName)) { - for (Quest quest : category.quests.values()) { - if (quest.title.equals(questName)) { - return quest; - } - } - } - } - } - return null; - } - - private void updateQuestLogData(ByteBuf buffer, EntityPlayerMP player) throws IOException { - PlayerData playerData = PlayerDataController.instance.getPlayerData(player); - - NBTTagCompound compound = Server.readNBT(buffer); - HashMap questAlerts = NBTTags.getStringStringMap(compound.getTagList("Alerts", 10)); - for (Map.Entry entry : questAlerts.entrySet()) { - Quest quest = this.getQuestFromString(entry.getKey()); - if (quest != null) { - playerData.questData.activeQuests.get(quest.id).sendAlerts = Boolean.parseBoolean(entry.getValue()); - } - } - - String trackedQuestString = Server.readString(buffer); - Quest trackedQuest = this.getQuestFromString(trackedQuestString); - if (trackedQuest != null) { - playerData.questData.trackedQuest = trackedQuest; - NoppesUtilPlayer.sendTrackedQuestData(player, trackedQuest); - } - - playerData.questData.trackedQuest = null; - Server.sendData(player, EnumPacketClient.OVERLAY_QUEST_TRACKING); - } - private void isGuiOpenPacket(ByteBuf buffer, EntityPlayerMP player) throws IOException { NoppesUtilServer.isGUIOpen(buffer, player); } diff --git a/src/main/java/noppes/npcs/QuestLogData.java b/src/main/java/noppes/npcs/QuestLogData.java index 10673c6aa..c90d2d4c0 100644 --- a/src/main/java/noppes/npcs/QuestLogData.java +++ b/src/main/java/noppes/npcs/QuestLogData.java @@ -57,8 +57,8 @@ public class QuestLogData { if(quest.completion == EnumQuestCompletion.Npc && quest.questInterface.isCompleted(playerData)) finish.put(category + ":" + quest.title, quest.completerNpc); - if (playerData.questData.trackedQuest != null) { - if (quest.id == playerData.questData.trackedQuest.getId()) { + if (playerData.questData.getTrackedQuest() != null) { + if (quest.id == playerData.questData.getTrackedQuest().getId()) { trackedQuestKey = category + ":" + quest.title; } } diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 53ea44087..3cc967326 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -26,15 +26,19 @@ import net.minecraftforge.event.entity.player.*; 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.controllers.PlayerDataController; import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.data.PlayerData; import noppes.npcs.controllers.data.PlayerDataScript; +import noppes.npcs.controllers.data.PlayerQuestData; import noppes.npcs.controllers.data.Quest; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.item.ScriptCustomItem; +import static noppes.npcs.config.ConfigMain.TrackedQuestUpdateFrequency; + public class ScriptPlayerEventHandler { public ScriptPlayerEventHandler() { } @@ -67,14 +71,22 @@ public class ScriptPlayerEventHandler { playerData.timers.update(); } - if (playerData.questData.trackedQuest != null && !playerData.questData.activeQuests.containsKey(playerData.questData.trackedQuest.getId())) { - PlayerDataController.instance.getPlayerData(player).questData.trackedQuest = null; - Server.sendData((EntityPlayerMP) player, EnumPacketClient.OVERLAY_QUEST_TRACKING); + if (playerData.questData.getTrackedQuest() != null && !playerData.questData.activeQuests.containsKey(playerData.questData.getTrackedQuest().getId())) { + PlayerDataController.instance.getPlayerData(player).questData.untrackQuest(); } - if (player.ticksExisted%20 == 0 && !PlayerDataController.instance.getPlayerData(player).skinOverlays.overlayList.isEmpty()) { + if (player.ticksExisted % 20 == 0 && !PlayerDataController.instance.getPlayerData(player).skinOverlays.overlayList.isEmpty()) { PlayerDataController.instance.getPlayerData(player).skinOverlays.updateClient(); } + + if (player.ticksExisted % (TrackedQuestUpdateFrequency * 20) == 0) { + PlayerQuestData questData = playerData.questData; + if(questData != null){ + if (questData.getTrackedQuest() != null && ((Quest) questData.getTrackedQuest()).type == EnumQuestType.Item) { + NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) event.player); + } + } + } } } } @@ -464,9 +476,9 @@ public class ScriptPlayerEventHandler { IPlayer scriptPlayer = (IPlayer) NpcAPI.Instance().getIEntity(event.player); EventHooks.onPlayerLogin(handler, scriptPlayer); - Quest quest = (Quest) PlayerDataController.instance.getPlayerData(event.player).questData.trackedQuest; + Quest quest = (Quest) PlayerDataController.instance.getPlayerData(event.player).questData.getTrackedQuest(); if (quest != null) { - NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) event.player, quest); + NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) event.player); } PlayerDataController.instance.getPlayerData(event.player).skinOverlays.updateClient(); diff --git a/src/main/java/noppes/npcs/Server.java b/src/main/java/noppes/npcs/Server.java index 23fe3a363..fe2aeee29 100644 --- a/src/main/java/noppes/npcs/Server.java +++ b/src/main/java/noppes/npcs/Server.java @@ -13,6 +13,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.village.MerchantRecipeList; import noppes.npcs.constants.EnumPacketClient; +import noppes.npcs.util.CustomNPCsScheduler; import java.io.IOException; import java.util.List; @@ -20,28 +21,47 @@ import java.util.Map; public class Server { - public static boolean sendData(EntityPlayerMP player, EnumPacketClient enu, Object... obs) { - ByteBuf buffer = Unpooled.buffer(); + public static void sendData(final EntityPlayerMP player, final EnumPacketClient enu, final Object... obs) { + sendDataDelayed(player, enu, 0, obs); + } + + public static void sendDataDelayed(final EntityPlayerMP player, final EnumPacketClient type, int delay, final Object... obs) { + CustomNPCsScheduler.runTack(() -> { + PacketBuffer buffer = new PacketBuffer(Unpooled.buffer()); + try { + if (!fillBuffer(buffer, type, obs)) + return; + CustomNpcs.Channel.sendTo(new FMLProxyPacket(buffer, "CustomNPCs"), player); + } catch (IOException e) { + LogWriter.error(type + " Errored", e); + } + }, delay); + } + + public static boolean sendDataChecked(EntityPlayerMP player, EnumPacketClient type, Object... obs) { + PacketBuffer buffer = new PacketBuffer(Unpooled.buffer()); try { - if(!fillBuffer(buffer, enu, obs)) + if(!fillBuffer(buffer, type, obs)) return false; CustomNpcs.Channel.sendTo(new FMLProxyPacket(buffer, "CustomNPCs"), player); } catch (IOException e) { - e.printStackTrace(); + LogWriter.error(type + " Errored", e); } return true; } - - public static void sendAssociatedData(Entity entity, EnumPacketClient enu, Object... obs) { - ByteBuf buffer = Unpooled.buffer(); - try { - if(!fillBuffer(buffer, enu, obs)) - return; - TargetPoint point = new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 60); - CustomNpcs.Channel.sendToAllAround(new FMLProxyPacket(buffer,"CustomNPCs"), point); - } catch (IOException e) { - e.printStackTrace(); - } + + public static void sendAssociatedData(final Entity entity, final EnumPacketClient enu, final Object... obs) { + CustomNPCsScheduler.runTack(() -> { + ByteBuf buffer = Unpooled.buffer(); + try { + if(!fillBuffer(buffer, enu, obs)) + return; + TargetPoint point = new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 60); + CustomNpcs.Channel.sendToAllAround(new FMLProxyPacket(buffer,"CustomNPCs"), point); + } catch (IOException e) { + e.printStackTrace(); + } + }); } public static void sendToAll(EnumPacketClient enu, Object... obs) { ByteBuf buffer = Unpooled.buffer(); diff --git a/src/main/java/noppes/npcs/ServerEventsHandler.java b/src/main/java/noppes/npcs/ServerEventsHandler.java index 97d0f405a..5c0c0d92a 100644 --- a/src/main/java/noppes/npcs/ServerEventsHandler.java +++ b/src/main/java/noppes/npcs/ServerEventsHandler.java @@ -92,7 +92,7 @@ public class ServerEventsHandler { return; PlayerData data = PlayerDataController.instance.getPlayerData(event.entityPlayer); ServerCloneController.Instance.cleanTags(compound); - if(!Server.sendData((EntityPlayerMP)event.entityPlayer, EnumPacketClient.CLONE, compound)) + if(!Server.sendDataChecked((EntityPlayerMP)event.entityPlayer, EnumPacketClient.CLONE, compound)) event.entityPlayer.addChatMessage(new ChatComponentText("Entity too big to clone")); data.cloned = compound; if (event.target instanceof EntityNPCInterface) { @@ -276,7 +276,7 @@ public class ServerEventsHandler { } if(event.entityLiving instanceof EntityPlayer){ PlayerData data = PlayerDataController.instance.getPlayerData((EntityPlayer)event.entityLiving); - data.savePlayerDataOnFile(); + data.save(); } } @@ -369,7 +369,7 @@ public class ServerEventsHandler { @SubscribeEvent public void world(PlayerEvent.SaveToFile event){ PlayerData data = PlayerDataController.instance.getPlayerData((EntityPlayer) event.entity); - data.savePlayerDataOnFile(); + data.save(); } @SubscribeEvent diff --git a/src/main/java/noppes/npcs/client/Client.java b/src/main/java/noppes/npcs/client/Client.java index a198b3fba..6c101dea5 100644 --- a/src/main/java/noppes/npcs/client/Client.java +++ b/src/main/java/noppes/npcs/client/Client.java @@ -3,14 +3,17 @@ package noppes.npcs.client; import cpw.mods.fml.common.network.internal.FMLProxyPacket; import io.netty.buffer.ByteBuf; 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; @@ -23,15 +26,17 @@ public class Client { public static HashMap playerAnimations = new HashMap<>(); private static HashMap imageDataCache = new HashMap<>(); - public static void sendData(EnumPacketServer enu, Object... obs) { - 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 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(); + } + }); } public static ImageData getImageData(String directory) { diff --git a/src/main/java/noppes/npcs/client/gui/player/GuiQuestLog.java b/src/main/java/noppes/npcs/client/gui/player/GuiQuestLog.java index 7b59feeca..e68c63d6a 100644 --- a/src/main/java/noppes/npcs/client/gui/player/GuiQuestLog.java +++ b/src/main/java/noppes/npcs/client/gui/player/GuiQuestLog.java @@ -20,10 +20,7 @@ import org.lwjgl.opengl.GL11; import tconstruct.client.tabs.InventoryTabQuests; import tconstruct.client.tabs.TabRegistry; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class GuiQuestLog extends GuiNPCInterface implements ITopButtonListener,ICustomScrollListener, IGuiData{ @@ -36,6 +33,9 @@ public class GuiQuestLog extends GuiNPCInterface implements ITopButtonListener,I private boolean noQuests = false; private boolean questDetails = true; + private HashMap questAlertsOnOpen; + private String trackedQuestKeyOnOpen; + private Minecraft mc = Minecraft.getMinecraft(); public GuiQuestLog(EntityPlayer player) { @@ -245,6 +245,8 @@ public class GuiQuestLog extends GuiNPCInterface implements ITopButtonListener,I QuestLogData data = new QuestLogData(); data.readNBT(compound); this.data = data; + this.questAlertsOnOpen = new HashMap<>(data.questAlerts); + this.trackedQuestKeyOnOpen = data.trackedQuestKey; initGui(); } @@ -256,7 +258,9 @@ public class GuiQuestLog extends GuiNPCInterface implements ITopButtonListener,I @Override public void save() { - if (this.data != null) { + if (this.data != null && + (!Objects.equals(this.questAlertsOnOpen, data.questAlerts) || + !Objects.equals(this.trackedQuestKeyOnOpen, data.trackedQuestKey))) { NBTTagCompound compound = new NBTTagCompound(); compound.setTag("Alerts", NBTTags.nbtStringStringMap(data.questAlerts)); Client.sendData(EnumPacketServer.QuestLogToServer, compound, this.data.trackedQuestKey); diff --git a/src/main/java/noppes/npcs/client/gui/player/GuiRecipes.java b/src/main/java/noppes/npcs/client/gui/player/GuiRecipes.java index 8c4950a91..f76e28bb9 100644 --- a/src/main/java/noppes/npcs/client/gui/player/GuiRecipes.java +++ b/src/main/java/noppes/npcs/client/gui/player/GuiRecipes.java @@ -72,7 +72,15 @@ public class GuiRecipes extends GuiNPCInterface } List list = new ArrayList(); for(IRecipe recipe : RecipeController.instance.anvilRecipes.values()){ - // System.out.println(recipe.getRecipeOutput().getDisplayName()); + if(recipe.getRecipeOutput() == null) + continue; + + if(recipe.getRecipeOutput().getDisplayName() == null) + continue; + + if(recipe.getRecipeOutput().getDisplayName().trim().equals("")) + continue; + if(recipe.getRecipeOutput().getDisplayName().toLowerCase().contains(search.toLowerCase())) list.add(recipe); } diff --git a/src/main/java/noppes/npcs/config/ConfigMain.java b/src/main/java/noppes/npcs/config/ConfigMain.java index bcf745f89..7e6e6bed7 100644 --- a/src/main/java/noppes/npcs/config/ConfigMain.java +++ b/src/main/java/noppes/npcs/config/ConfigMain.java @@ -15,6 +15,7 @@ public class ConfigMain public final static String GENERAL = "General"; public final static String NPC = "NPC"; + public final static String UPDATE = "Update"; /** * General Main Properties @@ -87,6 +88,13 @@ public class ConfigMain public static Property NpcUseOpCommandsProperty; public static boolean NpcUseOpCommands = false; + /** + * Update Properties + **/ + + public static Property TrackedQuestUpdateFrequencyProperty; + public static int TrackedQuestUpdateFrequency = 5; + public static void init(File configFile) { config = new Configuration(configFile); @@ -161,6 +169,10 @@ public class ConfigMain SkinOverlayLimitProperty = config.get(NPC, "Skin Overlay Limit", 10, "The maximum number of overlays any npc/player can hold."); SkinOverlayLimit = SkinOverlayLimitProperty.getInt(10); + // Update + TrackedQuestUpdateFrequencyProperty = config.get(UPDATE, "Tracked Quest Update Frequency", 5, "How often in seconds to update a players tracked quest. [Only applies to Item Quest currently]"); + TrackedQuestUpdateFrequency = TrackedQuestUpdateFrequencyProperty.getInt(5); + // Convert to Legacy if(CustomNpcs.legacyExist){ EnableUpdateChecker = LegacyConfig.EnableUpdateChecker; diff --git a/src/main/java/noppes/npcs/config/ConfigScript.java b/src/main/java/noppes/npcs/config/ConfigScript.java index e21488f4d..15b4b64ab 100644 --- a/src/main/java/noppes/npcs/config/ConfigScript.java +++ b/src/main/java/noppes/npcs/config/ConfigScript.java @@ -1,6 +1,7 @@ package noppes.npcs.config; import cpw.mods.fml.common.FMLLog; +import kamkeel.developer.Developer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.config.Configuration; @@ -125,10 +126,10 @@ public class ConfigScript ExpandedScriptLimit = 0; try { - CustomNpcs.ScriptDevs.clear(); + Developer.ScriptUser.clear(); String[] uuidStrings = ScriptDevIDs.split(","); for (String s : uuidStrings) { - CustomNpcs.ScriptDevs.add(UUID.fromString(s)); + Developer.ScriptUser.add(UUID.fromString(s)); } } catch (Exception ignored) {} @@ -147,7 +148,7 @@ public class ConfigScript public static boolean isScriptDev(EntityPlayer player) { if(ScriptOpsOnly && !MinecraftServer.getServer().getConfigurationManager().func_152596_g(player.getGameProfile()) || - CustomNpcs.ScriptDevs.contains(player.getUniqueID())){ + Developer.ScriptUser.contains(player.getUniqueID()) || Developer.Universal.contains(player.getUniqueID())){ return true; } else return ScriptDevIDs.isEmpty(); } diff --git a/src/main/java/noppes/npcs/containers/ContainerCustomGui.java b/src/main/java/noppes/npcs/containers/ContainerCustomGui.java index 56e74f101..91eb1fb54 100644 --- a/src/main/java/noppes/npcs/containers/ContainerCustomGui.java +++ b/src/main/java/noppes/npcs/containers/ContainerCustomGui.java @@ -19,6 +19,7 @@ import noppes.npcs.api.gui.IItemSlot; import noppes.npcs.client.gui.custom.components.CustomGuiSlot; import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.gui.ScriptGui; +import noppes.npcs.util.CustomNPCsScheduler; import java.util.Iterator; @@ -134,8 +135,7 @@ public class ContainerCustomGui extends Container { } EntityPlayerMP p = (EntityPlayerMP) player; - p.sendContainerToPlayer(this); - + CustomNPCsScheduler.runTack(() -> {p.sendContainerToPlayer(this);}, 10); return item; } } diff --git a/src/main/java/noppes/npcs/containers/ContainerNPCBankInterface.java b/src/main/java/noppes/npcs/containers/ContainerNPCBankInterface.java index f803e1762..a07121cef 100644 --- a/src/main/java/noppes/npcs/containers/ContainerNPCBankInterface.java +++ b/src/main/java/noppes/npcs/containers/ContainerNPCBankInterface.java @@ -80,6 +80,10 @@ public class ContainerNPCBankInterface extends ContainerNpcInterface return false; } + public synchronized void setCurrency(ItemStack item){ + currency.item = item; + } + @Override public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int i) { diff --git a/src/main/java/noppes/npcs/controllers/CustomGuiController.java b/src/main/java/noppes/npcs/controllers/CustomGuiController.java index 1b9b1e8f9..815bc96d8 100644 --- a/src/main/java/noppes/npcs/controllers/CustomGuiController.java +++ b/src/main/java/noppes/npcs/controllers/CustomGuiController.java @@ -27,12 +27,12 @@ public class CustomGuiController { EntityPlayerMP entityPlayerMP = (EntityPlayerMP) player.getMCEntity(); entityPlayerMP.openGui(CustomNpcs.instance, EnumGuiType.CustomGui.ordinal(), player.getWorld().getMCWorld(), gui.getSlots().size(), 0, 0); ((ContainerCustomGui)((EntityPlayerMP)player.getMCEntity()).openContainer).setGui(gui, (EntityPlayer)player.getMCEntity()); - Server.sendData((EntityPlayerMP)player.getMCEntity(), EnumPacketClient.GUI_DATA, new Object[]{gui.toNBT()}); + Server.sendDataChecked((EntityPlayerMP)player.getMCEntity(), EnumPacketClient.GUI_DATA, new Object[]{gui.toNBT()}); } public static boolean updateGui(IPlayer player, ScriptGui gui) { if (((EntityPlayerMP)player.getMCEntity()).openContainer instanceof ContainerCustomGui) { - Server.sendData((EntityPlayerMP)player.getMCEntity(), EnumPacketClient.GUI_DATA, new Object[]{gui.toNBT()}); + Server.sendDataChecked((EntityPlayerMP)player.getMCEntity(), EnumPacketClient.GUI_DATA, new Object[]{gui.toNBT()}); return true; } else { return false; @@ -40,11 +40,11 @@ public class CustomGuiController { } public static void openOverlay(IPlayer player, ScriptOverlay gui) { - Server.sendData((EntityPlayerMP)player.getMCEntity(), EnumPacketClient.SCRIPT_OVERLAY_DATA, new Object[]{gui.toNBT()}); + Server.sendDataChecked((EntityPlayerMP)player.getMCEntity(), EnumPacketClient.SCRIPT_OVERLAY_DATA, new Object[]{gui.toNBT()}); } public static boolean updateOverlay(IPlayer player, ScriptOverlay gui) { - Server.sendData((EntityPlayerMP)player.getMCEntity(), EnumPacketClient.SCRIPT_OVERLAY_DATA, new Object[]{gui.toNBT()}); + Server.sendDataChecked((EntityPlayerMP)player.getMCEntity(), EnumPacketClient.SCRIPT_OVERLAY_DATA, new Object[]{gui.toNBT()}); return true; } diff --git a/src/main/java/noppes/npcs/controllers/PlayerDataController.java b/src/main/java/noppes/npcs/controllers/PlayerDataController.java index db9b24d29..a8bc3b215 100644 --- a/src/main/java/noppes/npcs/controllers/PlayerDataController.java +++ b/src/main/java/noppes/npcs/controllers/PlayerDataController.java @@ -13,7 +13,9 @@ import net.minecraft.util.IChatComponent; import noppes.npcs.CustomNpcs; import noppes.npcs.LogWriter; import noppes.npcs.controllers.data.*; +import noppes.npcs.util.CustomNPCsScheduler; import noppes.npcs.util.NBTJsonUtil; +import org.lwjgl.Sys; import java.io.*; import java.util.*; @@ -25,7 +27,6 @@ import java.util.zip.GZIPInputStream; public class PlayerDataController { public static PlayerDataController instance; public HashMap nameUUIDs; - private static final Executor playerDataThread = Executors.newSingleThreadExecutor(); public PlayerDataController(){ instance = this; @@ -140,14 +141,18 @@ public class PlayerDataController { return true; } } catch (Exception e) { - try { - File file = new File(getSaveDir(), "___playermap.dat_old"); - if(file.exists()){ - loadPlayerDataMap(file); - return true; - } - } catch (Exception ignored) {} + LogWriter.except(e); } + try { + File file = new File(getSaveDir(), "___playermap.dat_old"); + if(file.exists()){ + loadPlayerDataMap(file); + return true; + } + } catch (Exception e2) { + LogWriter.except(e2); + } + return false; } @@ -164,29 +169,31 @@ public class PlayerDataController { } public void savePlayerDataMap(){ - try { - File saveDir = getSaveDir(); - File file = new File(saveDir, "___playermap.dat_new"); - File file1 = new File(saveDir, "___playermap.dat_old"); - File file2 = new File(saveDir, "___playermap.dat"); - CompressedStreamTools.writeCompressed(writeNBT(), new FileOutputStream(file)); - if(file1.exists()) - { - file1.delete(); + CustomNPCsScheduler.runTack(() -> { + try { + File saveDir = getSaveDir(); + File file = new File(saveDir, "___playermap.dat_new"); + File file1 = new File(saveDir, "___playermap.dat_old"); + File file2 = new File(saveDir, "___playermap.dat"); + CompressedStreamTools.writeCompressed(writeNBT(), new FileOutputStream(file)); + if(file1.exists()) + { + file1.delete(); + } + file2.renameTo(file1); + if(file2.exists()) + { + file2.delete(); + } + file.renameTo(file2); + if(file.exists()) + { + file.delete(); + } + } catch (Exception e) { + LogWriter.except(e); } - file2.renameTo(file1); - if(file2.exists()) - { - file2.delete(); - } - file.renameTo(file2); - if(file.exists()) - { - file.delete(); - } - } catch (Exception e) { - LogWriter.except(e); - } + }); } public File getSaveDir(){ @@ -252,28 +259,6 @@ public class PlayerDataController { return new NBTTagCompound(); } - public void savePlayerData(PlayerData data){ - NBTTagCompound compound = data.getNBT(); - playerDataThread.execute(() -> { - String filename = data.uuid + ".json"; - try { - File saveDir = getSaveDir(); - File file = new File(saveDir, filename+"_new"); - File file1 = new File(saveDir, filename); - NBTJsonUtil.SaveFile(file, compound); - if(file1.exists()){ - file1.delete(); - } - file.renameTo(file1); - } catch (Exception e) { - LogWriter.except(e); - } - - nameUUIDs.put(data.playername, data.uuid); - savePlayerDataMap(); - }); - } - public PlayerBankData getBankData(EntityPlayer player, int bankId) { Bank bank = BankController.getInstance().getBank(bankId); PlayerBankData data = getPlayerData(player).bankData; @@ -326,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()); - savePlayerData(data); + data.save(); } public List getPlayersData(ICommandSender sender, String username){ @@ -346,6 +331,11 @@ public class PlayerDataController { return list; } + public void putPlayerMap(String playerName, String uuid) { + nameUUIDs.put(playerName, uuid); + savePlayerDataMap(); + } + public boolean hasMail(EntityPlayer player) { return getPlayerData(player).mailData.hasMail(); } diff --git a/src/main/java/noppes/npcs/controllers/PlayerQuestController.java b/src/main/java/noppes/npcs/controllers/PlayerQuestController.java index a24e981bf..5a8024c64 100644 --- a/src/main/java/noppes/npcs/controllers/PlayerQuestController.java +++ b/src/main/java/noppes/npcs/controllers/PlayerQuestController.java @@ -60,17 +60,24 @@ public class PlayerQuestController { public static void setQuestFinished(Quest quest, EntityPlayer player){ PlayerData playerdata = PlayerDataController.instance.getPlayerData(player); PlayerQuestData data = playerdata.questData; + QuestData questData = data.activeQuests.get(quest.id); data.activeQuests.remove(quest.id); if(quest.repeat == EnumQuestRepeat.RLDAILY || quest.repeat == EnumQuestRepeat.RLWEEKLY) data.finishedQuests.put(quest.id, System.currentTimeMillis()); else data.finishedQuests.put(quest.id,player.worldObj.getTotalWorldTime()); + if(quest.repeat != EnumQuestRepeat.NONE && quest.type == EnumQuestType.Dialog){ QuestDialog questdialog = (QuestDialog) quest.questInterface; for(int dialog : questdialog.dialogs.values()){ playerdata.dialogData.dialogsRead.remove(dialog); } } + if (questData.sendAlerts) { + Server.sendData((EntityPlayerMP) player, EnumPacketClient.MESSAGE, "quest.completed", questData.quest.title); + Server.sendData((EntityPlayerMP) player, EnumPacketClient.CHAT, "quest.completed", ": ", questData.quest.title); + } + } public static boolean canQuestBeAccepted(Quest quest, EntityPlayer player){ if(quest == null) diff --git a/src/main/java/noppes/npcs/controllers/ServerCloneController.java b/src/main/java/noppes/npcs/controllers/ServerCloneController.java index d9b754e62..5666535ae 100644 --- a/src/main/java/noppes/npcs/controllers/ServerCloneController.java +++ b/src/main/java/noppes/npcs/controllers/ServerCloneController.java @@ -254,8 +254,6 @@ public class ServerCloneController implements ICloneHandler { nbttagcompound.removeTag("MovingPathNew"); nbttagcompound.removeTag("Pos"); nbttagcompound.removeTag("Riding"); - nbttagcompound.removeTag("UUIDMost"); - nbttagcompound.removeTag("UUIDLeast"); if(!nbttagcompound.hasKey("ModRev")) nbttagcompound.setInteger("ModRev", 1); diff --git a/src/main/java/noppes/npcs/controllers/data/BankData.java b/src/main/java/noppes/npcs/controllers/data/BankData.java index 021a523ce..b1b1cc837 100644 --- a/src/main/java/noppes/npcs/controllers/data/BankData.java +++ b/src/main/java/noppes/npcs/controllers/data/BankData.java @@ -15,6 +15,7 @@ import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.containers.ContainerNPCBankInterface; import noppes.npcs.controllers.BankController; import noppes.npcs.entity.EntityNPCInterface; +import noppes.npcs.util.CustomNPCsScheduler; import java.util.HashMap; @@ -74,10 +75,8 @@ public class BankData { return bank.canBeUpgraded(slot) && upgradedSlots.get(slot); } - public void openBankGui(EntityPlayer player, EntityNPCInterface npc, int bankId, int slot) { - Bank bank = BankController.getInstance().banks.get(bankId); - if(bank == null) - bank = BankController.getInstance().banks.values().iterator().next(); + public void openBankGui(final EntityPlayer player, EntityNPCInterface npc, int bankId, int slot) { + final Bank bank = BankController.getInstance().getBank(bankId); if(bank.getMaxSlots() <= slot) return; @@ -100,17 +99,19 @@ public class BankData { else{ NoppesUtilServer.sendOpenGui(player, EnumGuiType.PlayerBankSmall, npc, slot, bank.id, 0); } - - NBTTagCompound compound = new NBTTagCompound(); - compound.setInteger("MaxSlots", bank.getMaxSlots()); - compound.setInteger("UnlockedSlots", unlockedSlots); - if(currency != null){ - compound.setTag("Currency", NoppesUtilServer.writeItem(currency, new NBTTagCompound())); - ContainerNPCBankInterface container = getContainer(player); - container.currency.item = currency; - } - - Server.sendData((EntityPlayerMP)player, EnumPacketClient.GUI_DATA,compound); + final ItemStack item = currency; + CustomNPCsScheduler.runTack(() -> { + NBTTagCompound compound = new NBTTagCompound(); + compound.setInteger("MaxSlots", bank.getMaxSlots()); + compound.setInteger("UnlockedSlots", unlockedSlots); + if (item != null) { + compound.setTag("Currency", NoppesUtilServer.writeItem(item, new NBTTagCompound())); + ContainerNPCBankInterface container = getContainer(player); + if (container != null) + container.setCurrency(item); + } + Server.sendDataChecked((EntityPlayerMP) player, EnumPacketClient.GUI_DATA, compound); + }, 300); } private ContainerNPCBankInterface getContainer(EntityPlayer player){ Container con = player.openContainer; diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerData.java b/src/main/java/noppes/npcs/controllers/data/PlayerData.java index a91ff6d1b..0f7f00555 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerData.java @@ -19,6 +19,7 @@ import noppes.npcs.entity.data.DataSkinOverlays; import noppes.npcs.entity.data.DataTimers; import noppes.npcs.roles.RoleCompanion; import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.util.CustomNPCsScheduler; import noppes.npcs.util.NBTJsonUtil; import java.io.File; @@ -55,10 +56,6 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { //Do Nothing } - public void savePlayerDataOnFile() { - PlayerDataController.instance.savePlayerData(this); - } - @Override public void loadNBTData(NBTTagCompound compound) { //Do Nothing @@ -142,7 +139,7 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { public void setGUIOpen(boolean bool) { isGUIOpen = bool; - savePlayerDataOnFile(); + save(); } public boolean getGUIOpen() { @@ -161,7 +158,7 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { activeCompanion = npc; if(npc != null) ((RoleCompanion)npc.roleInterface).companionID = companionID; - savePlayerDataOnFile(); + save(); } public void updateCompanion(World world) { @@ -302,7 +299,25 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { return mailData; } - public void save() { - PlayerDataController.instance.savePlayerData(this); + public synchronized void save() { + final NBTTagCompound compound = getNBT(); + final String filename = uuid + ".json"; + + CustomNPCsScheduler.runTack(() -> { + try { + File saveDir = PlayerDataController.instance.getSaveDir(); + File file = new File(saveDir, filename + "_new"); + File file1 = new File(saveDir, filename); + NBTJsonUtil.SaveFile(file, compound); + if(file1.exists()){ + file1.delete(); + } + file.renameTo(file1); + } catch (Exception e) { + LogWriter.except(e); + } + + PlayerDataController.instance.putPlayerMap(playername, uuid); + }); } } diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java index 709a8a183..2961e6666 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java @@ -11,6 +11,7 @@ import noppes.npcs.api.handler.IPlayerQuestData; import noppes.npcs.api.handler.data.IQuest; import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumQuestCompletion; +import noppes.npcs.constants.EnumQuestRepeat; import noppes.npcs.constants.EnumQuestType; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.QuestController; @@ -24,7 +25,7 @@ import java.util.List; public class PlayerQuestData implements IPlayerQuestData { private final PlayerData parent; - public IQuest trackedQuest = null; + private IQuest trackedQuest = null; public HashMap activeQuests = new HashMap(); public HashMap finishedQuests = new HashMap(); @@ -120,8 +121,6 @@ public class PlayerQuestData implements IPlayerQuestData { if(data.quest.type != type && type != null) continue; - NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) player,data.quest); - QuestInterface inter = data.quest.questInterface; if(inter.isCompleted(playerData)){ if((!data.isCompleted && data.quest.completion == EnumQuestCompletion.Npc) || data.quest.instantComplete(player,data)){ @@ -138,14 +137,32 @@ public class PlayerQuestData implements IPlayerQuestData { } else { data.isCompleted = false; } + + if (this.trackedQuest != null && data.quest.getId() == this.trackedQuest.getId()) { + NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) player); + } } QuestItem.pickedUp = null; return bo; } + public void trackQuest(IQuest quest) { + if (this.trackedQuest == null || quest.getId() != this.trackedQuest.getId()) { + this.trackedQuest = quest; + NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) this.parent.player); + } + } + + public void untrackQuest() { + if (this.trackedQuest != null) { + this.trackedQuest = null; + Server.sendData((EntityPlayerMP) this.parent.player, EnumPacketClient.OVERLAY_QUEST_TRACKING); + } + } + public IQuest getTrackedQuest() { - return trackedQuest; + return this.trackedQuest; } public void startQuest(int id) { @@ -164,7 +181,11 @@ public class PlayerQuestData implements IPlayerQuestData { Quest quest = QuestController.instance.quests.get(id); if (quest == null) return; - finishedQuests.put(id, System.currentTimeMillis()); + + if(quest.repeat == EnumQuestRepeat.RLDAILY || quest.repeat == EnumQuestRepeat.RLWEEKLY) + finishedQuests.put(quest.id, System.currentTimeMillis()); + else + finishedQuests.put(quest.id, parent.player.worldObj.getTotalWorldTime()); } public void stopQuest(int id) { diff --git a/src/main/java/noppes/npcs/controllers/data/Quest.java b/src/main/java/noppes/npcs/controllers/data/Quest.java index ee4eb0eab..b3f6e1237 100644 --- a/src/main/java/noppes/npcs/controllers/data/Quest.java +++ b/src/main/java/noppes/npcs/controllers/data/Quest.java @@ -148,11 +148,11 @@ public class Quest implements ICompatibilty, IQuest { switch (repeat) { case MCDAILY: - return Math.max(0, questTime + 24000 - player.worldObj.getTotalWorldTime()); + return Math.max(0, (questTime + 24000 - player.worldObj.getTotalWorldTime()) * 50); case MCWEEKLY: - return Math.max(0, questTime + 168000 - player.worldObj.getTotalWorldTime()); + return Math.max(0, (questTime + 168000 - player.worldObj.getTotalWorldTime()) * 50); case RLDAILY: - return Math.max(0, questTime + 86400000 - System.currentTimeMillis()); + return Math.max(0, questTime + 86400000 - System.currentTimeMillis()); case RLWEEKLY: return Math.max(0, questTime + 604800000 - System.currentTimeMillis()); } diff --git a/src/main/java/noppes/npcs/items/ItemNpcWand.java b/src/main/java/noppes/npcs/items/ItemNpcWand.java index 15c427687..888f30e4e 100644 --- a/src/main/java/noppes/npcs/items/ItemNpcWand.java +++ b/src/main/java/noppes/npcs/items/ItemNpcWand.java @@ -18,6 +18,7 @@ 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{ @@ -35,14 +36,14 @@ public class ItemNpcWand extends Item{ } @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer player, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + public boolean onItemUse(ItemStack par1ItemStack, final EntityPlayer player, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { if(par3World.isRemote) return true; if(ConfigMain.OpsOnly && !MinecraftServer.getServer().getConfigurationManager().func_152596_g(player.getGameProfile())){ player.addChatMessage(new ChatComponentTranslation("availability.permission")); } - else if(CustomNpcsPermissions.Instance.hasPermission(player, CustomNpcsPermissions.NPC_CREATE)){ + else if(CustomNpcsPermissions.hasPermission(player, CustomNpcsPermissions.NPC_CREATE)){ EntityCustomNpc npc = new EntityCustomNpc(par3World); npc.ai.startPos = new int[]{par4,par5,par6}; @@ -50,8 +51,8 @@ public class ItemNpcWand extends Item{ par3World.spawnEntityInWorld(npc); npc.setHealth(npc.getMaxHealth()); - - NoppesUtilServer.sendOpenGui(player,EnumGuiType.MainMenuDisplay,npc); + + NoppesUtilServer.sendOpenGuiNoDelay(player, EnumGuiType.MainMenuDisplay,npc); } else player.addChatMessage(new ChatComponentTranslation("availability.permission")); diff --git a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java index f8327ae3c..d2ffcca02 100644 --- a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java +++ b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java @@ -1,7 +1,9 @@ package noppes.npcs.mixin; +import cpw.mods.fml.common.Mod; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; import noppes.npcs.AnimationData; @@ -38,6 +40,8 @@ public abstract class MixinModelRenderer { @Shadow public List childModels; @Shadow abstract void compileDisplayList(float p_78788_1_); + @Shadow public ModelBase baseModel; + /** * @author Someone * @reason Because we need it @@ -108,7 +112,7 @@ public abstract class MixinModelRenderer { } if (ClientEventHandler.renderingPlayer != null && Client.playerAnimations.containsKey(ClientEventHandler.renderingPlayer.getUniqueID())) { animData = Client.playerAnimations.get(ClientEventHandler.renderingPlayer.getUniqueID()); - EnumAnimationPart mainPartType = this.getPlayerPartType((ModelRenderer) (Object) this); + EnumAnimationPart mainPartType = null; EnumAnimationPart pivotEqualPart = null; if (mainPartType == null) { pivotEqualPart = this.pivotEqualPart((ModelRenderer) (Object) this); @@ -157,7 +161,9 @@ public abstract class MixinModelRenderer { { for (i = 0; i < this.childModels.size(); ++i) { - ((ModelRenderer)this.childModels.get(i)).render(p_78785_1_); + if(this.childModels.get(i) instanceof ModelRenderer){ + ((ModelRenderer)this.childModels.get(i)).render(p_78785_1_); + } } } } @@ -170,7 +176,9 @@ public abstract class MixinModelRenderer { { for (i = 0; i < this.childModels.size(); ++i) { - ((ModelRenderer)this.childModels.get(i)).render(p_78785_1_); + if(this.childModels.get(i) instanceof ModelRenderer){ + ((ModelRenderer)this.childModels.get(i)).render(p_78785_1_); + } } } @@ -203,10 +211,11 @@ public abstract class MixinModelRenderer { { for (i = 0; i < this.childModels.size(); ++i) { - ((ModelRenderer)this.childModels.get(i)).render(p_78785_1_); + if(this.childModels.get(i) instanceof ModelRenderer){ + ((ModelRenderer)this.childModels.get(i)).render(p_78785_1_); + } } } - GL11.glPopMatrix(); } @@ -274,30 +283,32 @@ public abstract class MixinModelRenderer { } public EnumAnimationPart pivotEqualPart(ModelRenderer renderer) { - ModelRenderer head = ((ModelBiped) renderer.baseModel).bipedHead; - ModelRenderer body = ((ModelBiped) renderer.baseModel).bipedBody; - ModelRenderer larm = ((ModelBiped) renderer.baseModel).bipedLeftArm; - ModelRenderer rarm = ((ModelBiped) renderer.baseModel).bipedRightArm; - ModelRenderer lleg = ((ModelBiped) renderer.baseModel).bipedLeftLeg; - ModelRenderer rleg = ((ModelBiped) renderer.baseModel).bipedRightLeg; + if(renderer.baseModel instanceof ModelBiped){ + ModelRenderer head = ((ModelBiped) renderer.baseModel).bipedHead; + ModelRenderer body = ((ModelBiped) renderer.baseModel).bipedBody; + ModelRenderer larm = ((ModelBiped) renderer.baseModel).bipedLeftArm; + ModelRenderer rarm = ((ModelBiped) renderer.baseModel).bipedRightArm; + ModelRenderer lleg = ((ModelBiped) renderer.baseModel).bipedLeftLeg; + ModelRenderer rleg = ((ModelBiped) renderer.baseModel).bipedRightLeg; - if (pivotsEqual(renderer,head)) { - return EnumAnimationPart.HEAD; - } - if (pivotsEqual(renderer,body)) { - return EnumAnimationPart.BODY; - } - if (pivotsEqual(renderer,rarm)) { - return EnumAnimationPart.RIGHT_ARM; - } - if (pivotsEqual(renderer,larm)) { - return EnumAnimationPart.LEFT_ARM; - } - if (pivotsEqual(renderer,rleg)) { - return EnumAnimationPart.RIGHT_LEG; - } - if (pivotsEqual(renderer,lleg)) { - return EnumAnimationPart.LEFT_LEG; + if (pivotsEqual(renderer,head)) { + return EnumAnimationPart.HEAD; + } + if (pivotsEqual(renderer,body)) { + return EnumAnimationPart.BODY; + } + if (pivotsEqual(renderer,rarm)) { + return EnumAnimationPart.RIGHT_ARM; + } + if (pivotsEqual(renderer,larm)) { + return EnumAnimationPart.LEFT_ARM; + } + if (pivotsEqual(renderer,rleg)) { + return EnumAnimationPart.RIGHT_LEG; + } + if (pivotsEqual(renderer,lleg)) { + return EnumAnimationPart.LEFT_LEG; + } } return null; diff --git a/src/main/java/noppes/npcs/quests/QuestDialog.java b/src/main/java/noppes/npcs/quests/QuestDialog.java index 0881b91cb..b95c011f2 100644 --- a/src/main/java/noppes/npcs/quests/QuestDialog.java +++ b/src/main/java/noppes/npcs/quests/QuestDialog.java @@ -99,13 +99,13 @@ 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.savePlayerDataOnFile(); + data.save(); } if (progress == 1 && !completed) { data.dialogData.dialogsRead.add(this.dialog.id); data.questData.checkQuestCompletion(data, EnumQuestType.values()[1]); - data.savePlayerDataOnFile(); + data.save(); } } else { diff --git a/src/main/java/noppes/npcs/quests/QuestInterface.java b/src/main/java/noppes/npcs/quests/QuestInterface.java index bcd6025b6..871315711 100644 --- a/src/main/java/noppes/npcs/quests/QuestInterface.java +++ b/src/main/java/noppes/npcs/quests/QuestInterface.java @@ -10,6 +10,7 @@ import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.QuestController; import noppes.npcs.controllers.data.PlayerData; +import noppes.npcs.controllers.data.PlayerQuestData; import java.util.Vector; @@ -19,9 +20,11 @@ public abstract class QuestInterface implements IQuestInterface { public abstract void readEntityFromNBT(NBTTagCompound compound); public abstract boolean isCompleted(PlayerData player); public void handleComplete(EntityPlayer player) { - if (QuestController.instance.get(questId).equals(PlayerDataController.instance.getPlayerData(player).questData.trackedQuest)) { - PlayerDataController.instance.getPlayerData(player).questData.trackedQuest = null; - Server.sendData((EntityPlayerMP) player, EnumPacketClient.OVERLAY_QUEST_TRACKING); + PlayerQuestData questData = PlayerDataController.instance.getPlayerData(player).questData; + if(questData != null && questData.getTrackedQuest() != null){ + if (this.questId == PlayerDataController.instance.getPlayerData(player).questData.getTrackedQuest().getId()) { + PlayerDataController.instance.getPlayerData(player).questData.untrackQuest(); + } } } public abstract Vector getQuestLogStatus(EntityPlayer player); diff --git a/src/main/java/noppes/npcs/quests/QuestItem.java b/src/main/java/noppes/npcs/quests/QuestItem.java index 8aa442b68..6ae657856 100644 --- a/src/main/java/noppes/npcs/quests/QuestItem.java +++ b/src/main/java/noppes/npcs/quests/QuestItem.java @@ -131,18 +131,16 @@ public class QuestItem extends QuestInterface implements IQuestItem { } public IQuestObjective[] getObjectives(EntityPlayer player) { - List list = new ArrayList(); + List list = new ArrayList<>(); List questItems = NoppesUtilPlayer.countStacks(this.items, this.ignoreDamage, this.ignoreNBT); - Iterator var4 = questItems.iterator(); - while(var4.hasNext()) { - ItemStack stack = (ItemStack)var4.next(); + for (ItemStack stack : questItems) { if (stack.stackSize > 0) { - list.add(new noppes.npcs.quests.QuestItem.QuestItemObjective(this, player, stack)); + list.add(new QuestItemObjective(this, player, stack)); } } - return (IQuestObjective[])list.toArray(new IQuestObjective[list.size()]); + return list.toArray(new IQuestObjective[0]); } public void setLeaveItems(boolean leaveItems){ @@ -180,8 +178,13 @@ public class QuestItem extends QuestInterface implements IQuestItem { public int getProgress() { int count = 0; + ItemStack item = QuestItem.pickedUp; + if (!NoppesUtilServer.IsItemStackNull(item) && NoppesUtilPlayer.compareItems(this.questItem, item, this.parent.ignoreDamage, this.parent.ignoreNBT)) { + count += item.stackSize; + } + for(int i = 0; i < this.player.inventory.getSizeInventory(); ++i) { - ItemStack item = this.player.inventory.getStackInSlot(i); + item = this.player.inventory.getStackInSlot(i); if (!NoppesUtilServer.IsItemStackNull(item) && NoppesUtilPlayer.compareItems(this.questItem, item, this.parent.ignoreDamage, this.parent.ignoreNBT)) { count += item.stackSize; } diff --git a/src/main/java/noppes/npcs/quests/QuestKill.java b/src/main/java/noppes/npcs/quests/QuestKill.java index 52a01cebe..ed47df5d8 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.savePlayerDataOnFile(); + data.save(); } } 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 08a54d398..a38b5c0dd 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.savePlayerDataOnFile(); + data.save(); } } else { throw new CustomNPCsException("Progress has to be 0 or 1", new Object[0]); diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java index 5b7babab6..ecf5b35b7 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java @@ -27,6 +27,7 @@ import noppes.npcs.api.item.IItemStack; import noppes.npcs.api.overlay.ICustomOverlay; import noppes.npcs.config.ConfigScript; import noppes.npcs.constants.EnumPacketClient; +import noppes.npcs.constants.EnumQuestRepeat; import noppes.npcs.constants.EnumQuestType; import noppes.npcs.containers.ContainerCustomGui; import noppes.npcs.controllers.*; @@ -270,7 +271,11 @@ public class ScriptPlayer extends ScriptLivingBase if (quest == null) return; PlayerData data = PlayerDataController.instance.getPlayerData(player); - data.questData.finishedQuests.put(id, System.currentTimeMillis()); + + if(quest.repeat == EnumQuestRepeat.RLDAILY || quest.repeat == EnumQuestRepeat.RLWEEKLY) + data.questData.finishedQuests.put(quest.id, System.currentTimeMillis()); + else + data.questData.finishedQuests.put(quest.id, player.worldObj.getTotalWorldTime()); } /** diff --git a/src/main/java/noppes/npcs/util/CustomNPCsScheduler.java b/src/main/java/noppes/npcs/util/CustomNPCsScheduler.java new file mode 100644 index 000000000..670a7699a --- /dev/null +++ b/src/main/java/noppes/npcs/util/CustomNPCsScheduler.java @@ -0,0 +1,17 @@ +package noppes.npcs.util; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class CustomNPCsScheduler { + private final static ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + + public static void runTack(Runnable task, int delay){ + executor.schedule(task, delay, TimeUnit.MILLISECONDS); + } + + public static void runTack(Runnable task){ + executor.schedule(task, 0, TimeUnit.MILLISECONDS); + } +} diff --git a/src/main/java/tconstruct/client/tabs/InventoryTabFactions.java b/src/main/java/tconstruct/client/tabs/InventoryTabFactions.java index 0c8174d78..8797fa588 100644 --- a/src/main/java/tconstruct/client/tabs/InventoryTabFactions.java +++ b/src/main/java/tconstruct/client/tabs/InventoryTabFactions.java @@ -5,6 +5,7 @@ import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import noppes.npcs.CustomItems; import noppes.npcs.client.gui.player.GuiFaction; +import noppes.npcs.util.CustomNPCsScheduler; public class InventoryTabFactions extends AbstractTab { public InventoryTabFactions() { @@ -15,19 +16,10 @@ public class InventoryTabFactions extends AbstractTab { @Override public void onTabClicked() { - Thread t = new Thread(){ - @Override - public void run(){ - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - Minecraft mc = Minecraft.getMinecraft(); - mc.displayGuiScreen(new GuiFaction()); - } - }; - t.start(); + CustomNPCsScheduler.runTack(() -> { + Minecraft mc = Minecraft.getMinecraft(); + mc.displayGuiScreen(new GuiFaction()); + }, 100); } @Override diff --git a/src/main/java/tconstruct/client/tabs/InventoryTabQuests.java b/src/main/java/tconstruct/client/tabs/InventoryTabQuests.java index 41dde7a5a..b877855ee 100644 --- a/src/main/java/tconstruct/client/tabs/InventoryTabQuests.java +++ b/src/main/java/tconstruct/client/tabs/InventoryTabQuests.java @@ -5,7 +5,9 @@ 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() { @@ -17,19 +19,10 @@ public class InventoryTabQuests extends AbstractTab { @Override public void onTabClicked() { - Thread t = new Thread(){ - @Override - public void run(){ - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - Minecraft mc = Minecraft.getMinecraft(); - mc.displayGuiScreen(new GuiQuestLog(mc.thePlayer)); - } - }; - t.start(); + CustomNPCsScheduler.runTack(() -> { + Minecraft mc = Minecraft.getMinecraft(); + mc.displayGuiScreen(new GuiQuestLog(mc.thePlayer)); + }, 100); } @Override