Merge branch 'master' into dev

This commit is contained in:
Kam committed 2023-05-16 11:36:40 -04:00
commit 2791b3aae5
54 files changed
+761 -533

No files matched your search

+50 -17
View File
@@ -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.
+6 -3
View File
@@ -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'
}
+2 -2
View File
@@ -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;
}
+124 -163
View File
@@ -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<String,Class<?>> SlayMap = new LinkedHashMap<String,Class<?>>();
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<String, Class<?>> SlayMap = new LinkedHashMap<String, Class<?>>();
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<String,Class<?>> list = new HashMap<String,Class<?>>(EntityList.stringToClassMapping);
for(String name : list.keySet()){
HashMap<String, Class<?>> list = new HashMap<String, Class<?>>(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 = "<player> <faction> <command>",
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="<npc> <command>",
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<EntityNPCInterface> 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 = "<type>.. [range]",
permissions = {PlayerOnly.class, OpOnly.class, ParamCheck.class}
)
public Boolean slay(String[] args) {
EntityPlayerMP player = (EntityPlayerMP) pcParam;
@SubCommand(
name = "faction",
desc = "Faction operations",
usage = "<player> <faction> <command>",
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 = "<npc> <command>",
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<EntityNPCInterface> 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 = "<type>.. [range]",
permissions = {PlayerOnly.class, OpOnly.class, ParamCheck.class}
)
public Boolean slay(String[] args) {
EntityPlayerMP player = (EntityPlayerMP) pcParam;
ArrayList<Class<?>> toDelete = new ArrayList<Class<?>>();
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<Entity> 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<Class<?>> toDelete) {
for(Class<?> delete : toDelete){
if(delete == EntityAnimal.class && (entity instanceof EntityHorse)){
return true;
}
private boolean delete(Entity entity, ArrayList<Class<?>> 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);
}
//<editor-fold desc="--- FoxZ fork (keep it pls)">
// @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;
// }
//</editor-fold>
}
return super.addTabCompletion(par1, args);
}
}
+4 -4
View File
@@ -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;
}
@@ -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")
@@ -1,4 +1,4 @@
package kamkeel;
package kamkeel.command;
import java.util.List;
@@ -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;
}
}
@@ -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<String, Method> subcommands = new HashMap<String, Method>();
@@ -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;
}
}
@@ -1,4 +1,4 @@
package kamkeel;
package kamkeel.command;
import net.minecraft.block.Block;
import net.minecraft.block.BlockIce;
@@ -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));
}
}
@@ -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();
}
}
@@ -1,4 +1,4 @@
package kamkeel;
package kamkeel.command;
import java.lang.reflect.Method;
import java.util.Map.Entry;
@@ -1,4 +1,4 @@
package kamkeel;
package kamkeel.command;
import java.util.Arrays;
import java.util.List;
@@ -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));
}
}
@@ -1,4 +1,4 @@
package kamkeel;
package kamkeel.command;
import net.minecraft.command.ICommandSender;
import noppes.npcs.controllers.ScriptController;
@@ -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 {
@@ -0,0 +1,36 @@
package kamkeel.developer;
import java.util.ArrayList;
import java.util.UUID;
public class Developer {
public static ArrayList<UUID> Universal = new ArrayList<>();
public static ArrayList<UUID> ScriptUser = new ArrayList<>();
public static ArrayList<UUID> WandUser = new ArrayList<>();
public static ArrayList<UUID> 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);
}
}
+5 -2
View File
@@ -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);
+2 -4
View File
@@ -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<UUID> ScriptDevs = new ArrayList<>();
public static final MarkovGenerator[] MARKOV_GENERATOR = new MarkovGenerator[10];
public static boolean InitIgnore = false;
@@ -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);
+58 -18
View File
@@ -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<String,String> questAlerts = NBTTags.getStringStringMap(compound.getTagList("Alerts", 10));
for (Map.Entry<String,String> 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;
+51 -33
View File
@@ -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<String> 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<String> 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();
}
}
@@ -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<String,Integer> map = new HashMap<String,Integer>();
@@ -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<String,String> questAlerts = NBTTags.getStringStringMap(compound.getTagList("Alerts", 10));
for (Map.Entry<String,String> 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);
}
+2 -2
View File
@@ -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;
}
}
@@ -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();
+35 -15
View File
@@ -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();
@@ -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
+14 -9
View File
@@ -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<UUID, AnimationData> playerAnimations = new HashMap<>();
private static HashMap<String, ImageData> 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) {
@@ -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<String,String> 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);
@@ -72,7 +72,15 @@ public class GuiRecipes extends GuiNPCInterface
}
List<IRecipe> list = new ArrayList<IRecipe>();
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);
}
@@ -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;
@@ -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();
}
@@ -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;
}
}
@@ -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)
{
@@ -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;
}
@@ -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<String, String> 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<PlayerData> 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();
}
@@ -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)
@@ -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);
@@ -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;
@@ -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);
});
}
}
@@ -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<Integer,QuestData> activeQuests = new HashMap<Integer,QuestData>();
public HashMap<Integer,Long> finishedQuests = new HashMap<Integer,Long>();
@@ -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) {
@@ -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());
}
@@ -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"));
@@ -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;
@@ -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 {
@@ -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<String> getQuestLogStatus(EntityPlayer player);
@@ -131,18 +131,16 @@ public class QuestItem extends QuestInterface implements IQuestItem {
}
public IQuestObjective[] getObjectives(EntityPlayer player) {
List<IQuestObjective> list = new ArrayList();
List<IQuestObjective> list = new ArrayList<>();
List<ItemStack> 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;
}
@@ -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]);
@@ -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]);
@@ -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<T extends EntityPlayerMP> extends ScriptLivingBase<T>
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());
}
/**
@@ -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);
}
}
@@ -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
@@ -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