From 72869e6a784b3832930ce99bdf0940dd0add66f2 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 1 Dec 2021 15:31:05 -0600 Subject: [PATCH 01/54] Consolidated EventScriptContainer and ScriptContainer into a single ScriptContainer class. NPCs are now able to fly when ai.movementType == 1. --- src/main/java/noppes/npcs/DataScript.java | 94 +++++- .../noppes/npcs/EventScriptContainer.java | 172 ----------- src/main/java/noppes/npcs/NBTTags.java | 9 +- .../noppes/npcs/ScriptPlayerEventHandler.java | 21 -- .../npcs/client/gui/EventGuiScriptList.java | 6 +- .../noppes/npcs/client/gui/GuiScript.java | 87 +++--- .../noppes/npcs/client/gui/GuiScriptList.java | 3 - .../client/gui/script/EventGuiScriptList.java | 6 +- .../client/gui/script/GuiScriptInterface.java | 30 +- .../npcs/controllers/IScriptHandler.java | 3 +- .../npcs/controllers/ScriptContainer.java | 281 +++++++++++++----- .../controllers/data/ForgeDataScript.java | 15 +- .../controllers/data/PlayerDataScript.java | 65 ++-- .../noppes/npcs/entity/EntityNPCFlying.java | 87 +++--- 14 files changed, 422 insertions(+), 457 deletions(-) delete mode 100644 src/main/java/noppes/npcs/EventScriptContainer.java diff --git a/src/main/java/noppes/npcs/DataScript.java b/src/main/java/noppes/npcs/DataScript.java index 9494e0811..3bac5d19a 100644 --- a/src/main/java/noppes/npcs/DataScript.java +++ b/src/main/java/noppes/npcs/DataScript.java @@ -1,10 +1,10 @@ package noppes.npcs; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import javax.script.ScriptEngine; +import cpw.mods.fml.common.eventhandler.Event; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -12,6 +12,7 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import noppes.npcs.constants.EnumScriptType; import noppes.npcs.controllers.ScriptContainer; +import noppes.npcs.controllers.IScriptHandler; import noppes.npcs.controllers.ScriptController; import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; @@ -24,8 +25,8 @@ import noppes.npcs.scripted.constants.RoleType; import noppes.npcs.scripted.interfaces.IWorld; import noppes.npcs.scripted.wrapper.WrapperNpcAPI; -public class DataScript { - public Map scripts = new HashMap(); +public class DataScript implements IScriptHandler { + public List scripts = new ArrayList(); private final static EntityType entities = new EntityType(); private final static JobType jobs = new JobType(); private final static RoleType roles = new RoleType(); @@ -41,6 +42,10 @@ public class DataScript { public boolean hasInited = false; public DataScript(EntityNPCInterface npc) { + for (int i = 0; i < 10; i++) { + scripts.add(new ScriptContainer(this)); + } + this.npc = npc; if(npc instanceof EntityCustomNpc) dummyNpc = new ScriptNpc((EntityCustomNpc) npc); @@ -61,21 +66,25 @@ public class DataScript { return compound; } - private Map readScript(NBTTagList list){ - Map scripts = new HashMap(); + private List readScript(NBTTagList list){ + List scripts = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + scripts.add(new ScriptContainer(this)); + } + for(int i = 0; i < list.tagCount(); i++){ NBTTagCompound compoundd = list.getCompoundTagAt(i); - ScriptContainer script = new ScriptContainer(); + ScriptContainer script = new ScriptContainer(this); script.readFromNBT(compoundd); - if(script.hasCode() || npc.isRemote()) - scripts.put(compoundd.getInteger("Type"), script); + if(script.hasCode() || npc.isRemote()) + scripts.set(compoundd.getInteger("Type"), script); } return scripts; } - private NBTTagList writeScript(Map scripts){ + private NBTTagList writeScript(List scripts){ NBTTagList list = new NBTTagList(); - for(Integer type : scripts.keySet()){ + for(int type = 0; type < scripts.size(); type++){ NBTTagCompound compoundd = new NBTTagCompound(); compoundd.setInteger("Type", type); ScriptContainer script = scripts.get(type); @@ -144,6 +153,69 @@ public class DataScript { return enabled && ScriptController.HasStart && !npc.worldObj.isRemote && !scripts.isEmpty(); } + public void callScript(EnumScriptType var1, Event var2, Object... obs) { + + } + + public Map getConsoleText() { + Map map = new TreeMap(); + int tab = 0; + Iterator var3 = this.getScripts().iterator(); + + while(var3.hasNext()) { + ScriptContainer script = (ScriptContainer)var3.next(); + ++tab; + Iterator var5 = script.console.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry entry = (Map.Entry)var5.next(); + map.put(entry.getKey(), " tab " + tab + ":\n" + (String)entry.getValue()); + } + } + + return map; + } + + public void clearConsole() { + Iterator var1 = this.getScripts().iterator(); + + while(var1.hasNext()) { + ScriptContainer script = (ScriptContainer)var1.next(); + script.console.clear(); + } + + } + + public boolean isClient() { + return this.npc.isRemote(); + } + + public boolean getEnabled() { + return this.enabled; + } + + public void setEnabled(boolean bo) { + this.enabled = bo; + } + + public String getLanguage() { + return this.scriptLanguage; + } + + public void setLanguage(String lang) { + this.scriptLanguage = lang; + } + + public List getScripts() { + return this.scripts; + } + + public String noticeString() { + //BlockPos pos = this.npc.func_180425_c(); + //return MoreObjects.toStringHelper(this.npc).add("x", pos.func_177958_n()).add("y", pos.func_177956_o()).add("z", pos.func_177952_p()).toString(); + return ""; + } + public void setWorld(World world) { if(world instanceof WorldServer) dummyWorld = new ScriptWorld((WorldServer) world); diff --git a/src/main/java/noppes/npcs/EventScriptContainer.java b/src/main/java/noppes/npcs/EventScriptContainer.java deleted file mode 100644 index a66d930b3..000000000 --- a/src/main/java/noppes/npcs/EventScriptContainer.java +++ /dev/null @@ -1,172 +0,0 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by Fernflower decompiler) -// - -package noppes.npcs; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.*; -import javax.script.Compilable; -import javax.script.CompiledScript; -import javax.script.Invocable; -import javax.script.ScriptEngine; - -import cpw.mods.fml.common.eventhandler.Event; -import net.minecraft.nbt.NBTTagCompound; -import noppes.npcs.constants.EnumScriptType; -import noppes.npcs.controllers.IScriptHandler; -import noppes.npcs.controllers.ScriptController; - -public class EventScriptContainer { - public static EventScriptContainer Current; - //public String type = "init"; - private static String CurrentType; - public String fullscript = ""; - public String script = ""; - public TreeMap console = new TreeMap(); - private HashSet unknownFunctions = new HashSet(); - public boolean errored = false; - public List scripts = new ArrayList(); - public long lastCreated = 0L; - private String currentScriptLanguage = null; - public ScriptEngine engine = null; - private IScriptHandler handler = null; - private CompiledScript compScript = null; - private boolean init = false; - - public EventScriptContainer(IScriptHandler handler) { - this.handler = handler; - } - - public void readFromNBT(NBTTagCompound compound) { - this.script = compound.getString("Script"); - //this.type = compound.getString("Type"); - this.console = NBTTags.GetLongStringMap(compound.getTagList("Console", 10)); - this.scripts = NBTTags.getStringList(compound.getTagList("ScriptList", 10)); - this.lastCreated = 0L; - } - - public NBTTagCompound writeToNBT(NBTTagCompound compound) { - compound.setString("Script", this.script); - //compound.setString("Type", this.type); - compound.setTag("Console", NBTTags.NBTLongStringMap(this.console)); - compound.setTag("ScriptList", NBTTags.nbtStringList(this.scripts)); - return compound; - } - - private String getFullCode() { - if(!this.init) { - this.fullscript = this.script; - if(!this.fullscript.isEmpty()) { - this.fullscript = this.fullscript + "\n"; - } - - Iterator var1 = this.scripts.iterator(); - - while(var1.hasNext()) { - String loc = (String)var1.next(); - String code = (String)ScriptController.Instance.scripts.get(loc); - if(code != null && !code.isEmpty()) { - this.fullscript = this.fullscript + code + "\n"; - } - } - } - - return this.fullscript; - } - - /*public void run(ScriptEngine engine){ - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - engine.getContext().setWriter(pw); - engine.getContext().setErrorWriter(pw); - try { - if(compScript == null && engine instanceof Compilable) - compScript = ((Compilable)engine).compile(getFullCode()); - - if(compScript != null){ - compScript.eval(engine.getContext()); - } - else - engine.eval(getFullCode()); - - } catch (Exception e) { - errored = true; - appandConsole(e.getMessage()); - } - appandConsole(sw.getBuffer().toString().trim()); - }*/ - - public void run(EnumScriptType type, Event event) { - this.run((String)type.function, (Object)event); - } - - public void run(String type, Object event) { - if (!this.errored && this.hasCode() && !this.unknownFunctions.contains(type)) { - this.setEngine(this.handler.getLanguage()); - if (this.engine != null) { - if (ScriptController.Instance.lastLoaded > this.lastCreated) { - this.lastCreated = ScriptController.Instance.lastLoaded; - this.init = false; - } - - String var3 = "lock"; - synchronized("lock") { - Current = this; - CurrentType = type; - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - this.engine.getContext().setWriter(pw); - this.engine.getContext().setErrorWriter(pw); - - try { - if (!this.init) { - this.engine.eval(this.getFullCode()); - this.init = true; - } - - ((Invocable)this.engine).invokeFunction(type, new Object[]{event}); - } catch (NoSuchMethodException var13) { - this.unknownFunctions.add(type); - } catch (Throwable var14) { - this.errored = true; - var14.printStackTrace(pw); - } finally { - this.appandConsole(sw.getBuffer().toString().trim()); - pw.close(); - Current = null; - } - - } - } - } - } - - public void appandConsole(String message) { - if (message != null && !message.isEmpty()) { - long time = System.currentTimeMillis(); - if (this.console.containsKey(time)) { - message = (String)this.console.get(time) + "\n" + message; - } - - this.console.put(time, message); - - while(this.console.size() > 40) { - this.console.remove(this.console.firstKey()); - } - } - } - - public boolean hasCode() { - return !this.getFullCode().isEmpty(); - } - - public void setEngine(String scriptLanguage) { - if(currentScriptLanguage != null && currentScriptLanguage.equals(scriptLanguage)) - return; - engine = ScriptController.Instance.getEngineByName(scriptLanguage.toLowerCase()); - currentScriptLanguage = scriptLanguage; - } -} diff --git a/src/main/java/noppes/npcs/NBTTags.java b/src/main/java/noppes/npcs/NBTTags.java index 23cc9b8e4..8323fe5df 100644 --- a/src/main/java/noppes/npcs/NBTTags.java +++ b/src/main/java/noppes/npcs/NBTTags.java @@ -7,6 +7,7 @@ import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagDouble; import net.minecraft.nbt.NBTTagList; +import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.IScriptHandler; public class NBTTags { @@ -408,12 +409,12 @@ public class NBTTags { } } - public static List GetScript(NBTTagList list, IScriptHandler handler) { + public static List GetScript(NBTTagList list, IScriptHandler handler) { ArrayList scripts = new ArrayList(); for(int i = 0; i < list.tagCount(); ++i) { NBTTagCompound compoundd = list.getCompoundTagAt(i); - EventScriptContainer script = new EventScriptContainer(handler); + ScriptContainer script = new ScriptContainer(handler); script.readFromNBT(compoundd); scripts.add(script); } @@ -421,12 +422,12 @@ public class NBTTags { return scripts; } - public static NBTTagList NBTScript(List scripts) { + public static NBTTagList NBTScript(List scripts) { NBTTagList list = new NBTTagList(); Iterator var2 = scripts.iterator(); while(var2.hasNext()) { - EventScriptContainer script = (EventScriptContainer)var2.next(); + ScriptContainer script = (ScriptContainer)var2.next(); NBTTagCompound compound = new NBTTagCompound(); script.writeToNBT(compound); list.appendTag(compound); diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index c1ebd7f06..d5ae3a1eb 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -453,25 +453,4 @@ public class ScriptPlayerEventHandler { } } } - - /*@SubscribeEvent - public void forgeTick(TickEvent.ServerTickEvent event){ - if(event.side == Side.SERVER && event.phase == TickEvent.Phase.START) { - EventHooks.onForgeEvent(new ForgeEvent(event), event); - } - } - - @SubscribeEvent - public void forgeTick(TickEvent.WorldTickEvent event){ - if(event.side == Side.SERVER && event.phase == TickEvent.Phase.START) { - EventHooks.onForgeEvent(new ForgeEvent(event), event); - } - } - - @SubscribeEvent - public void forgeTick(TickEvent.PlayerTickEvent event){ - if(event.side == Side.SERVER && event.phase == TickEvent.Phase.START) { - EventHooks.onForgeEvent(new ForgeEvent(event), event); - } - }*/ } \ No newline at end of file diff --git a/src/main/java/noppes/npcs/client/gui/EventGuiScriptList.java b/src/main/java/noppes/npcs/client/gui/EventGuiScriptList.java index 7cbdc488a..757bc9e51 100644 --- a/src/main/java/noppes/npcs/client/gui/EventGuiScriptList.java +++ b/src/main/java/noppes/npcs/client/gui/EventGuiScriptList.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.client.gui.GuiButton; -import noppes.npcs.EventScriptContainer; +import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.client.gui.util.GuiCustomScroll; import noppes.npcs.client.gui.util.GuiNpcButton; import noppes.npcs.client.gui.util.GuiNpcLabel; @@ -13,10 +13,10 @@ import noppes.npcs.client.gui.util.SubGuiInterface; public class EventGuiScriptList extends SubGuiInterface{ private GuiCustomScroll scroll1; private GuiCustomScroll scroll2; - private EventScriptContainer container; + private ScriptContainer container; private List scripts; - public EventGuiScriptList(List scripts, EventScriptContainer container){ + public EventGuiScriptList(List scripts, ScriptContainer container){ this.container = container; setBackground("menubg.png"); xSize = 346; diff --git a/src/main/java/noppes/npcs/client/gui/GuiScript.java b/src/main/java/noppes/npcs/client/gui/GuiScript.java index bbdec81d3..e8c3d698e 100644 --- a/src/main/java/noppes/npcs/client/gui/GuiScript.java +++ b/src/main/java/noppes/npcs/client/gui/GuiScript.java @@ -1,9 +1,6 @@ package noppes.npcs.client.gui; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiConfirmOpenLink; @@ -15,6 +12,7 @@ import noppes.npcs.DataScript; import noppes.npcs.NoppesStringUtils; import noppes.npcs.client.Client; import noppes.npcs.client.NoppesUtil; +import noppes.npcs.client.gui.script.EventGuiScriptList; import noppes.npcs.client.gui.swing.GuiJTextArea; import noppes.npcs.client.gui.util.GuiCustomScroll; import noppes.npcs.client.gui.util.GuiMenuTopButton; @@ -139,19 +137,16 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall } private String getConsoleText() { - String console = ""; - if(activeConsole == 0){ - for(ScriptContainer container : script.scripts.values()){ - if(!container.console.isEmpty()) - console += container.console + '\n'; - } + Map map = this.script.getConsoleText(); + StringBuilder builder = new StringBuilder(); + Iterator var3 = map.entrySet().iterator(); + + while(var3.hasNext()) { + Map.Entry entry = (Map.Entry)var3.next(); + builder.insert(0, new Date((Long)entry.getKey()) + (String)entry.getValue() + "\n"); } - else{ - ScriptContainer container = script.scripts.get(activeConsole - 1); - if(container != null) - console = container.console; - } - return console; + + return builder.toString(); } @Override @@ -182,19 +177,16 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall if (guibutton.id == 101) { getTextField(2).setText(NoppesStringUtils.getClipboardContents()); } - if (guibutton.id == 102) { - getTextField(2).setText(""); - if(!showScript){ - if(activeConsole == 0){ - for(ScriptContainer container : script.scripts.values()) - container.console = ""; - } - else{ - ScriptContainer container = script.scripts.get(activeConsole - 1); - if(container != null) - container.console = ""; - } + ScriptContainer container; + if(guibutton.id == 102) { + if(this.activeTab > 0) { + container = (ScriptContainer)this.script.getScripts().get(this.activeTab - 1); + container.script = ""; + } else { + this.script.clearConsole(); } + + this.initGui(); } if (guibutton.id == 103) { script.scriptLanguage = ((GuiNpcButton)guibutton).displayString; @@ -209,31 +201,36 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall if (guibutton.id == 106) { NoppesUtil.openFolder(ScriptController.Instance.dir); } - if (guibutton.id == 107) { - ScriptContainer container = script.scripts.get(activeTab); - if(container == null) - script.scripts.put(activeTab, container = new ScriptContainer()); - setSubGui(new GuiScriptList(languages.get(script.scriptLanguage), container)); + if(guibutton.id == 107) { + container = (ScriptContainer)this.script.getScripts().get(this.activeTab - 1); + if(container == null) { + this.script.getScripts().add(container = new ScriptContainer(this.script)); + } + + this.setSubGui(new EventGuiScriptList((List)this.languages.get(this.script.getLanguage()), container)); } - if (guibutton.id == 108) { - ScriptContainer container = script.scripts.get(activeTab); - if(container != null){ - setScript(); + if(guibutton.id == 108) { + container = (ScriptContainer)this.script.getScripts().get(this.activeTab - 1); + if(container != null) { + this.setScript(); this.AWTWindow = new GuiJTextArea(container.script).setListener(this); } } } - - private void setScript(){ - if(showScript){ - ScriptContainer container = script.scripts.get(activeTab); - if(container == null) - script.scripts.put(activeTab, container = new ScriptContainer()); - String text = getTextField(2).getText(); + + private void setScript() { + if(this.activeTab > 0) { + ScriptContainer container = (ScriptContainer)this.script.getScripts().get(this.activeTab - 1); + if(container == null) { + this.script.getScripts().add(container = new ScriptContainer(this.script)); + } + + String text = (this.getTextField(2)).getText(); text = text.replace("\r\n", "\n"); text = text.replace("\r", "\n"); container.script = text; } + } @Override @@ -271,7 +268,7 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall @Override public void saveText(String text) { - ScriptContainer container = script.scripts.get(activeTab); + ScriptContainer container = script.getScripts().get(activeTab); if(container != null) container.script = text; initGui(); diff --git a/src/main/java/noppes/npcs/client/gui/GuiScriptList.java b/src/main/java/noppes/npcs/client/gui/GuiScriptList.java index 34c121776..5ec6bd1f2 100644 --- a/src/main/java/noppes/npcs/client/gui/GuiScriptList.java +++ b/src/main/java/noppes/npcs/client/gui/GuiScriptList.java @@ -4,14 +4,11 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.client.gui.GuiButton; -import net.minecraft.world.biome.BiomeGenBase; import noppes.npcs.client.gui.util.GuiCustomScroll; -import noppes.npcs.client.gui.util.GuiNPCInterface; import noppes.npcs.client.gui.util.GuiNpcButton; import noppes.npcs.client.gui.util.GuiNpcLabel; import noppes.npcs.client.gui.util.SubGuiInterface; import noppes.npcs.controllers.ScriptContainer; -import noppes.npcs.entity.EntityNPCInterface; public class GuiScriptList extends SubGuiInterface{ private GuiCustomScroll scroll1; diff --git a/src/main/java/noppes/npcs/client/gui/script/EventGuiScriptList.java b/src/main/java/noppes/npcs/client/gui/script/EventGuiScriptList.java index 533a7654f..e3ee8d057 100644 --- a/src/main/java/noppes/npcs/client/gui/script/EventGuiScriptList.java +++ b/src/main/java/noppes/npcs/client/gui/script/EventGuiScriptList.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.minecraft.client.gui.GuiButton; -import noppes.npcs.EventScriptContainer; +import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.client.gui.util.GuiCustomScroll; import noppes.npcs.client.gui.util.GuiNpcButton; import noppes.npcs.client.gui.util.GuiNpcLabel; @@ -18,10 +18,10 @@ import noppes.npcs.client.gui.util.SubGuiInterface; public class EventGuiScriptList extends SubGuiInterface { private GuiCustomScroll scroll1; private GuiCustomScroll scroll2; - private EventScriptContainer container; + private ScriptContainer container; private List scripts; - public EventGuiScriptList(List scripts, EventScriptContainer container) { + public EventGuiScriptList(List scripts, ScriptContainer container) { this.container = container; this.setBackground("menubg.png"); this.xSize = 346; diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java index 735689a0d..370566ca4 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java @@ -6,15 +6,11 @@ package noppes.npcs.client.gui.script; import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.*; import java.util.Map.Entry; import com.google.common.reflect.ClassPath; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.ModContainer; import cpw.mods.fml.common.eventhandler.Event; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.network.FMLNetworkEvent; @@ -24,17 +20,15 @@ import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNoCallback; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.EntityEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.event.world.WorldEvent; -import noppes.npcs.EventScriptContainer; +import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.NoppesStringUtils; import noppes.npcs.client.NoppesUtil; import noppes.npcs.client.gui.swing.GuiJTextArea; import noppes.npcs.client.gui.util.*; import noppes.npcs.controllers.IScriptHandler; -import noppes.npcs.controllers.PixelmonHelper; import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.data.ForgeDataScript; import noppes.npcs.controllers.data.PlayerDataScript; @@ -180,7 +174,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb hookLabel.color = 0xaaaaaa; addLabel(hookLabel); - EventScriptContainer var7 = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + ScriptContainer var7 = (ScriptContainer)this.handler.getScripts().get(this.activeTab - 1); GuiNpcTextArea left = new GuiNpcTextArea(2, this, this.guiLeft + yoffset, this.guiTop + yoffset, this.xSize - 110 - yoffset, (int)((double)this.ySize * 0.96D) - yoffset * 2, var7 == null?"":var7.script); this.addTextField(left); int left1 = this.guiLeft + this.xSize - 104; @@ -307,7 +301,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb } if(guibutton.id == scriptLimit) { - this.handler.getScripts().add(new EventScriptContainer(this.handler)); + this.handler.getScripts().add(new ScriptContainer(this.handler)); this.activeTab = this.handler.getScripts().size(); this.initGui(); } @@ -336,10 +330,10 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb (this.getTextField(2)).setText(NoppesStringUtils.getClipboardContents()); } - EventScriptContainer container; + ScriptContainer container; if(guibutton.id == 102) { if(this.activeTab > 0) { - container = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + container = (ScriptContainer)this.handler.getScripts().get(this.activeTab - 1); container.script = ""; } else { this.handler.clearConsole(); @@ -366,16 +360,16 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb } if(guibutton.id == 107) { - container = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + container = (ScriptContainer)this.handler.getScripts().get(this.activeTab - 1); if(container == null) { - this.handler.getScripts().add(container = new EventScriptContainer(this.handler)); + this.handler.getScripts().add(container = new ScriptContainer(this.handler)); } this.setSubGui(new EventGuiScriptList((List)this.languages.get(this.handler.getLanguage()), container)); } if(guibutton.id == 108) { - container = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + container = (ScriptContainer)this.handler.getScripts().get(this.activeTab - 1); if(container != null) { this.setScript(); this.AWTWindow = new GuiJTextArea(container.script).setListener(this); @@ -386,9 +380,9 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb private void setScript() { if(this.activeTab > 0) { - EventScriptContainer container = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + ScriptContainer container = (ScriptContainer)this.handler.getScripts().get(this.activeTab - 1); if(container == null) { - this.handler.getScripts().add(container = new EventScriptContainer(this.handler)); + this.handler.getScripts().add(container = new ScriptContainer(this.handler)); } String text = (this.getTextField(2)).getText(); @@ -424,7 +418,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb } public void textUpdate(String text) { - EventScriptContainer container = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + ScriptContainer container = (ScriptContainer)this.handler.getScripts().get(this.activeTab - 1); if(container != null) { container.script = text; } @@ -433,7 +427,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb @Override public void saveText(String text) { - EventScriptContainer container = handler.getScripts().get(activeTab); + ScriptContainer container = handler.getScripts().get(activeTab); if(container != null) container.script = text; initGui(); diff --git a/src/main/java/noppes/npcs/controllers/IScriptHandler.java b/src/main/java/noppes/npcs/controllers/IScriptHandler.java index b4f8f9625..c52b9f852 100644 --- a/src/main/java/noppes/npcs/controllers/IScriptHandler.java +++ b/src/main/java/noppes/npcs/controllers/IScriptHandler.java @@ -8,7 +8,6 @@ package noppes.npcs.controllers; import java.util.List; import java.util.Map; import cpw.mods.fml.common.eventhandler.Event; -import noppes.npcs.EventScriptContainer; import noppes.npcs.constants.EnumScriptType; public interface IScriptHandler { @@ -24,7 +23,7 @@ public interface IScriptHandler { void setLanguage(String var1); - List getScripts(); + List getScripts(); String noticeString(); diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index 6b8d0aef2..8c690fdc4 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -1,94 +1,225 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + package noppes.npcs.controllers; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.ArrayList; -import java.util.List; - +import java.lang.reflect.Method; +import java.util.*; import javax.script.Compilable; import javax.script.CompiledScript; +import javax.script.Invocable; import javax.script.ScriptEngine; -import javax.script.ScriptException; +import cpw.mods.fml.common.eventhandler.Event; import net.minecraft.nbt.NBTTagCompound; +import noppes.npcs.CustomNpcs; import noppes.npcs.NBTTags; +import noppes.npcs.NoppesUtilServer; +import noppes.npcs.constants.EnumScriptType; public class ScriptContainer { - public String fullscript = ""; - public String script = ""; - public String console = ""; - public boolean errored = false; - public List scripts = new ArrayList(); - private long lastCreated = 0; - private CompiledScript compScript = null; - private String currentScriptLanguage = null; - public ScriptEngine engine = null; + private static final String lock = "lock"; + public static ScriptContainer Current; + private static String CurrentType; + private static final HashMap Data = new HashMap(); + public String fullscript = ""; + public String script = ""; + public TreeMap console = new TreeMap(); + public boolean errored = false; + public List scripts = new ArrayList(); + private HashSet unknownFunctions = new HashSet(); + public long lastCreated = 0L; + private String currentScriptLanguage = null; + public ScriptEngine engine = null; + private IScriptHandler handler = null; + private boolean init = false; + private static Method luaCoerce; + private static Method luaCall; + private CompiledScript compScript = null; - public void readFromNBT(NBTTagCompound compound) { - script = compound.getString("Script"); - console = compound.getString("ScriptConsole"); - scripts = NBTTags.getStringList(compound.getTagList("ScriptList", 10)); - lastCreated = 0; - } + public ScriptContainer(IScriptHandler handler) { + this.handler = handler; + } - public void writeToNBT(NBTTagCompound compound) { - compound.setString("Script", script); - compound.setString("ScriptConsole", console); - compound.setTag("ScriptList", NBTTags.nbtStringList(scripts)); - } + public void readFromNBT(NBTTagCompound compound) { + this.script = compound.getString("Script"); + //this.type = compound.getString("Type"); + this.console = NBTTags.GetLongStringMap(compound.getTagList("Console", 10)); + this.scripts = NBTTags.getStringList(compound.getTagList("ScriptList", 10)); + this.lastCreated = 0L; + } - public String getCode() { - if(ScriptController.Instance.lastLoaded > lastCreated){ - lastCreated = ScriptController.Instance.lastLoaded; - fullscript = script; - if(!fullscript.isEmpty()) - fullscript += "\n"; - for(String loc : scripts){ - String code = ScriptController.Instance.scripts.get(loc); - if(code != null && !code.isEmpty()) - fullscript += code + "\n"; - } - compScript = null; - } - return fullscript; - } - - public void run(ScriptEngine engine){ - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - engine.getContext().setWriter(pw); - engine.getContext().setErrorWriter(pw); - try { - if(compScript == null && engine instanceof Compilable) - compScript = ((Compilable)engine).compile(getCode()); - - if(compScript != null){ - compScript.eval(engine.getContext()); - } - else - engine.eval(getCode()); - - } catch (Exception e) { - errored = true; - appandConsole(e.getMessage()); - } - appandConsole(sw.getBuffer().toString().trim()); - } + public NBTTagCompound writeToNBT(NBTTagCompound compound) { + compound.setString("Script", this.script); + //compound.setString("Type", this.type); + compound.setTag("Console", NBTTags.NBTLongStringMap(this.console)); + compound.setTag("ScriptList", NBTTags.nbtStringList(this.scripts)); + return compound; + } - public void appandConsole(String message) { - if(message == null || message.isEmpty()) - return; - console = message + "\n" + console; - } + private String getFullCode() { + if(!this.init) { + this.fullscript = this.script; + if(!this.fullscript.isEmpty()) { + this.fullscript = this.fullscript + "\n"; + } - public boolean hasCode() { - return !getCode().isEmpty(); - } + Iterator var1 = this.scripts.iterator(); - public void setEngine(String scriptLanguage) { - if(currentScriptLanguage != null && currentScriptLanguage.equals(scriptLanguage)) - return; - engine = ScriptController.Instance.getEngineByName(scriptLanguage.toLowerCase()); - currentScriptLanguage = scriptLanguage; - } + while(var1.hasNext()) { + String loc = (String)var1.next(); + String code = (String)ScriptController.Instance.scripts.get(loc); + if(code != null && !code.isEmpty()) { + this.fullscript = this.fullscript + code + "\n"; + } + } + } + + return this.fullscript; + } + + public void run(ScriptEngine engine){ + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + engine.getContext().setWriter(pw); + engine.getContext().setErrorWriter(pw); + try { + if(compScript == null && engine instanceof Compilable) + compScript = ((Compilable)engine).compile(getFullCode()); + + if(compScript != null){ + compScript.eval(engine.getContext()); + } + else + engine.eval(getFullCode()); + + } catch (Exception e) { + errored = true; + appandConsole(e.getMessage()); + } + appandConsole(sw.getBuffer().toString().trim()); + } + + public void run(EnumScriptType type, Event event) { + this.run((String)type.function, (Object)event); + } + + public void run(String type, Object event) { + if (!this.errored && this.hasCode() && !this.unknownFunctions.contains(type)) { + this.setEngine(this.handler.getLanguage()); + if (this.engine != null) { + if (ScriptController.Instance.lastLoaded > this.lastCreated) { + this.lastCreated = ScriptController.Instance.lastLoaded; + this.init = false; + } + + String var3 = "lock"; + synchronized("lock") { + Current = this; + CurrentType = type; + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + this.engine.getContext().setWriter(pw); + this.engine.getContext().setErrorWriter(pw); + + try { + if (!this.init) { + this.engine.eval(this.getFullCode()); + this.init = true; + } + + if (this.engine.getFactory().getLanguageName().equals("lua")) { + Object ob = this.engine.get(type); + if (ob == null) { + this.unknownFunctions.add(type); + } + } else { + ((Invocable)this.engine).invokeFunction(type, new Object[]{event}); + } + } catch (NoSuchMethodException var13) { + this.unknownFunctions.add(type); + } catch (Throwable var14) { + this.errored = true; + var14.printStackTrace(pw); + } finally { + this.appandConsole(sw.getBuffer().toString().trim()); + pw.close(); + Current = null; + } + + } + } + } + } + + /*public void run(String type, Object event) { + if (!this.errored && this.hasCode() && !this.unknownFunctions.contains(type)) { + this.setEngine(this.handler.getLanguage()); + if (this.engine != null) { + if (ScriptController.Instance.lastLoaded > this.lastCreated) { + this.lastCreated = ScriptController.Instance.lastLoaded; + this.init = false; + } + + String var3 = "lock"; + synchronized("lock") { + Current = this; + CurrentType = type; + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + this.engine.getContext().setWriter(pw); + this.engine.getContext().setErrorWriter(pw); + + try { + if (!this.init) { + this.engine.eval(this.getFullCode()); + this.init = true; + } + + ((Invocable)this.engine).invokeFunction(type, new Object[]{event}); + } catch (NoSuchMethodException var13) { + this.unknownFunctions.add(type); + } catch (Throwable var14) { + this.errored = true; + var14.printStackTrace(pw); + } finally { + this.appandConsole(sw.getBuffer().toString().trim()); + pw.close(); + Current = null; + } + + } + } + } + }*/ + + public void appandConsole(String message) { + if (message != null && !message.isEmpty()) { + long time = System.currentTimeMillis(); + if (this.console.containsKey(time)) { + message = (String)this.console.get(time) + "\n" + message; + } + + this.console.put(time, message); + + while(this.console.size() > 40) { + this.console.remove(this.console.firstKey()); + } + } + } + + public boolean hasCode() { + return !this.getFullCode().isEmpty(); + } + + public void setEngine(String scriptLanguage) { + if(currentScriptLanguage != null && currentScriptLanguage.equals(scriptLanguage)) + return; + engine = ScriptController.Instance.getEngineByName(scriptLanguage.toLowerCase()); + currentScriptLanguage = scriptLanguage; + } } diff --git a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java index 8514f9b00..eb831b2f1 100644 --- a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java @@ -13,10 +13,9 @@ import java.util.TreeMap; import java.util.Map.Entry; import cpw.mods.fml.common.eventhandler.Event; -import net.minecraft.client.Minecraft; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.EventHooks; -import noppes.npcs.EventScriptContainer; +import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.NBTTags; import noppes.npcs.constants.EnumScriptType; import noppes.npcs.controllers.IScriptHandler; @@ -26,7 +25,7 @@ import noppes.npcs.scripted.wrapper.WrapperNpcAPI; import javax.script.ScriptEngine; public class ForgeDataScript implements IScriptHandler { - private List scripts = new ArrayList(); + private List scripts = new ArrayList(); private String scriptLanguage = "ECMAScript"; public long lastInited = -1L; private boolean enabled = false; @@ -69,7 +68,7 @@ public class ForgeDataScript implements IScriptHandler { Iterator var3 = this.scripts.iterator(); while (var3.hasNext()) { - EventScriptContainer script = (EventScriptContainer) var3.next(); + ScriptContainer script = (ScriptContainer) var3.next(); script.setEngine(scriptLanguage); if(script.engine == null) @@ -80,8 +79,6 @@ public class ForgeDataScript implements IScriptHandler { script.engine.put("event", event); script.engine.put("API", new WrapperNpcAPI()); - ScriptEngine engine = script.engine; - script.run(type, event); } //}); @@ -112,7 +109,7 @@ public class ForgeDataScript implements IScriptHandler { this.scriptLanguage = lang; } - public List getScripts() { + public List getScripts() { return this.scripts; } @@ -126,7 +123,7 @@ public class ForgeDataScript implements IScriptHandler { Iterator var3 = this.getScripts().iterator(); while(var3.hasNext()) { - EventScriptContainer script = (EventScriptContainer)var3.next(); + ScriptContainer script = (ScriptContainer)var3.next(); ++tab; Iterator var5 = script.console.entrySet().iterator(); @@ -143,7 +140,7 @@ public class ForgeDataScript implements IScriptHandler { Iterator var1 = this.getScripts().iterator(); while(var1.hasNext()) { - EventScriptContainer script = (EventScriptContainer)var1.next(); + ScriptContainer script = (ScriptContainer)var1.next(); script.console.clear(); } diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java index b051d1ea5..725d8646f 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java @@ -12,21 +12,17 @@ import java.util.Map.Entry; import com.google.common.base.Preconditions; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; import cpw.mods.fml.common.eventhandler.Event; import net.minecraft.world.WorldServer; import noppes.npcs.EventHooks; -import noppes.npcs.EventScriptContainer; +import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.NBTTags; -import noppes.npcs.controllers.PlayerData; import noppes.npcs.scripted.NpcAPI; -import noppes.npcs.scripted.entity.ScriptPlayer; import noppes.npcs.constants.EnumScriptType; import noppes.npcs.controllers.IScriptHandler; import noppes.npcs.controllers.ScriptController; -import noppes.npcs.scripted.ScriptWorld; import noppes.npcs.scripted.event.PlayerEvent; import noppes.npcs.scripted.interfaces.IPlayer; import noppes.npcs.scripted.interfaces.IWorld; @@ -36,7 +32,7 @@ import javax.annotation.CheckForNull; import javax.script.ScriptEngine; public class PlayerDataScript implements IScriptHandler { - public List scripts = new ArrayList(); + public List scripts = new ArrayList(); public String scriptLanguage = "ECMAScript"; private EntityPlayer player; private IPlayer playerAPI; @@ -82,71 +78,50 @@ public class PlayerDataScript implements IScriptHandler { } public void callScript(EnumScriptType type, Event event, Object... obs) { - if(this.isEnabled()) { - EventScriptContainer script; - if(ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { + if (this.isEnabled()) { + ScriptContainer script; + if (ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { this.lastInited = ScriptController.Instance.lastLoaded; - //ScriptController.Instance.playerScripts.errored.clear(); - if(this.player != null) { + errored.clear(); + if (this.player != null) { this.scripts.clear(); - Iterator i = ScriptController.Instance.playerScripts.scripts.iterator(); + Iterator var3 = ScriptController.Instance.playerScripts.scripts.iterator(); - while(i.hasNext()) { - script = (EventScriptContainer)i.next(); - EventScriptContainer s = new EventScriptContainer(this); + while(var3.hasNext()) { + script = (ScriptContainer)var3.next(); + ScriptContainer s = new ScriptContainer(this); s.readFromNBT(script.writeToNBT(new NBTTagCompound())); - this.scripts.add(s); } } this.lastPlayerUpdate = ScriptController.Instance.lastPlayerUpdate; - if(type != EnumScriptType.INIT) { + if (type != EnumScriptType.INIT) { EventHooks.onPlayerInit(this); } } - for(int var7 = 0; var7 < this.scripts.size(); ++var7) { - script = (EventScriptContainer)this.scripts.get(var7); - - if(!ScriptController.Instance.playerScripts.errored.contains(Integer.valueOf(var7))) { - if(script == null || script.errored || !script.hasCode()) - return; - script.setEngine(scriptLanguage); - if(script.engine == null) - return; - for(int i = 0; i + 1 < obs.length; i += 2){ - Object ob = obs[i + 1]; - if(ob instanceof Entity) - ob = ScriptController.Instance.getScriptForEntity((Entity)ob); - script.engine.put(obs[i].toString(), ob); - } - - ScriptEngine engine = script.engine; - engine.put("world", dummyWorld); - engine.put("player", dummyPlayer); - PlayerEvent result = (PlayerEvent) engine.get("event"); - if(result == null) - engine.put("event", result = new PlayerEvent(this.getPlayer())); - script.engine.put("API", new WrapperNpcAPI()); + for(int i = 0; i < this.scripts.size(); ++i) { + script = (ScriptContainer)this.scripts.get(i); + if (!errored.contains(i)) { script.run(type, event); - if (script.errored) { - ScriptController.Instance.playerScripts.errored.add(var7); + errored.add(i); } Iterator var8 = script.console.entrySet().iterator(); while(var8.hasNext()) { Entry entry = (Entry)var8.next(); - if (!ScriptController.Instance.playerScripts.console.containsKey(entry.getKey())) { - ScriptController.Instance.playerScripts.console.put(entry.getKey(), " tab " + (var7 + 1) + ":\n" + (String)entry.getValue()); + if (!console.containsKey(entry.getKey())) { + console.put(entry.getKey(), " tab " + (i + 1) + ":\n" + (String)entry.getValue()); } } script.console.clear(); } } + } } @@ -175,7 +150,7 @@ public class PlayerDataScript implements IScriptHandler { this.scriptLanguage = lang; } - public List getScripts() { + public List getScripts() { return this.scripts; } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 3fd6ca295..f4ec4ce5e 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -3,6 +3,7 @@ package noppes.npcs.entity; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; import net.minecraft.util.math.BlockPos; @@ -35,59 +36,53 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { super.updateFallState(p_180433_1_, p_180433_3_); } - @Override - public void moveEntityWithHeading(float p_70612_1_, float p_70612_2_){ - if(!canFly()){ - super.moveEntityWithHeading(p_70612_1_, p_70612_2_); - return; - } - - if (this.isInWater()){ - this.moveFlying(p_70612_1_, p_70612_2_, 0.02F); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.800000011920929D; - this.motionY *= 0.800000011920929D; - this.motionZ *= 0.800000011920929D; + public void onLivingUpdate() + { + if(!canFly()){ + super.onLivingUpdate(); + return; } - else if (this.isInsideOfMaterial(Material.lava)){ - this.moveFlying(p_70612_1_, p_70612_2_, 0.02F); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.5D; - this.motionY *= 0.5D; - this.motionZ *= 0.5D; - } - else{ - float f2 = 0.91F; - if (this.onGround){ - f2 = this.worldObj.getBlock((int)this.posX, (int)this.boundingBox.minY - 1, (int)this.posZ).slipperiness * 0.91F; + this.motionY *= 0.6000000238418579D; + double d1; + double d3; + double d5; + + if (!this.worldObj.isRemote && this.getAttackTarget() != null) + { + Entity entity = this.getAttackTarget(); + + if (entity != null) + { + if (this.posY < entity.posY) + { + if (this.motionY < 0.0D) + { + this.motionY = 0.0D; + } + + this.motionY += (0.5D - this.motionY) * 0.6000000238418579D; + } + + double d0 = entity.posX - this.posX; + d1 = entity.posZ - this.posZ; + d3 = d0 * d0 + d1 * d1; + + if (d3 > 9.0D) + { + d5 = (double)MathHelper.sqrt_double(d3); + this.motionX += (d0 / d5 * 0.5D - this.motionX) * 0.6000000238418579D; + this.motionZ += (d1 / d5 * 0.5D - this.motionZ) * 0.6000000238418579D; + } } - - float f3 = 0.16277136F / (f2 * f2 * f2); - this.moveFlying(p_70612_1_, p_70612_2_, this.onGround ? 0.1F * f3 : 0.02F); - f2 = 0.91F; - - if (this.onGround){ - f2 = this.worldObj.getBlock((int)this.posX, (int)this.boundingBox.minY - 1, (int)this.posZ).slipperiness * 0.91F; - } - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= (double)f2; - this.motionY *= (double)f2; - this.motionZ *= (double)f2; } - this.prevLimbSwingAmount = this.limbSwingAmount; - double d1 = this.posX - this.prevPosX; - double d0 = this.posZ - this.prevPosZ; - float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F; - - if (f4 > 1.0F){ - f4 = 1.0F; + if (this.motionX * this.motionX + this.motionZ * this.motionZ > 0.05000000074505806D) + { + this.rotationYaw = (float)Math.atan2(this.motionZ, this.motionX) * (180F / (float)Math.PI) - 90.0F; } - this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F; - this.limbSwing += this.limbSwingAmount; + super.onLivingUpdate(); } @Override From 17eb612fb8568f5f33f34fc94f0b2fc2393edecc Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 1 Dec 2021 17:42:48 -0600 Subject: [PATCH 02/54] Fixed NPC Script GUI error not saving/accessing scripts correctly. --- src/main/java/noppes/npcs/DataScript.java | 4 +- .../noppes/npcs/client/gui/GuiScript.java | 132 +++++++++--------- 2 files changed, 67 insertions(+), 69 deletions(-) diff --git a/src/main/java/noppes/npcs/DataScript.java b/src/main/java/noppes/npcs/DataScript.java index 3bac5d19a..29fb4be31 100644 --- a/src/main/java/noppes/npcs/DataScript.java +++ b/src/main/java/noppes/npcs/DataScript.java @@ -42,7 +42,7 @@ public class DataScript implements IScriptHandler { public boolean hasInited = false; public DataScript(EntityNPCInterface npc) { - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 12; i++) { scripts.add(new ScriptContainer(this)); } @@ -68,7 +68,7 @@ public class DataScript implements IScriptHandler { private List readScript(NBTTagList list){ List scripts = new ArrayList<>(); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 12; i++) { scripts.add(new ScriptContainer(this)); } diff --git a/src/main/java/noppes/npcs/client/gui/GuiScript.java b/src/main/java/noppes/npcs/client/gui/GuiScript.java index e8c3d698e..199529ae5 100644 --- a/src/main/java/noppes/npcs/client/gui/GuiScript.java +++ b/src/main/java/noppes/npcs/client/gui/GuiScript.java @@ -12,7 +12,6 @@ import noppes.npcs.DataScript; import noppes.npcs.NoppesStringUtils; import noppes.npcs.client.Client; import noppes.npcs.client.NoppesUtil; -import noppes.npcs.client.gui.script.EventGuiScriptList; import noppes.npcs.client.gui.swing.GuiJTextArea; import noppes.npcs.client.gui.util.GuiCustomScroll; import noppes.npcs.client.gui.util.GuiMenuTopButton; @@ -28,23 +27,23 @@ import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.ScriptController; import noppes.npcs.entity.EntityNPCInterface; -public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCallback, ICustomScrollListener, IJTextAreaListener { +public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCallback, ICustomScrollListener, IJTextAreaListener { public boolean showScript = false; private int activeTab = 0; public DataScript script; public Map> languages = new HashMap>(); - + private static int activeConsole = 0; - + public GuiScript(EntityNPCInterface npc) { super(npc); script = npc.script; drawDefaultBackground = true; closeOnEsc = true; - xSize = 420; - - setBackground("menubg.png"); - Client.sendData(EnumPacketServer.ScriptDataGet); + xSize = 420; + + setBackground("menubg.png"); + Client.sendData(EnumPacketServer.ScriptDataGet); } public void initGui() { @@ -57,38 +56,38 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall top.active = !showScript; addTopButton(new GuiMenuTopButton(15, top, "gui.website")); - List list = new ArrayList(); - list.add("script.init"); - list.add("script.update"); - list.add("script.interact"); - list.add("dialog.dialog"); - list.add("script.damaged"); - list.add("script.killed"); - list.add("script.attack"); - list.add("script.target"); - list.add("script.collide"); - list.add("script.kills"); - list.add("script.dialog_closed"); + List list = new ArrayList(); + list.add("script.init"); + list.add("script.update"); + list.add("script.interact"); + list.add("dialog.dialog"); + list.add("script.damaged"); + list.add("script.killed"); + list.add("script.attack"); + list.add("script.target"); + list.add("script.collide"); + list.add("script.kills"); + list.add("script.dialog_closed"); list.add("script.timer"); - + if(showScript){ addLabel(new GuiNpcLabel(0, "script.hooks", guiLeft + 4, guiTop + 5)); GuiCustomScroll hooks = new GuiCustomScroll(this, 1); hooks.setSize(68, 198); hooks.guiLeft = guiLeft + 4; hooks.guiTop = guiTop + 14; - hooks.setUnsortedList(list); - hooks.selected = activeTab; - addScroll(hooks); - + hooks.setUnsortedList(list); + hooks.selected = activeTab; + addScroll(hooks); + ScriptContainer container = script.scripts.get(activeTab); - + addTextField(new GuiNpcTextArea(2, this, guiLeft + 74, guiTop + 4, 239, 208, container == null?"":container.script)); addButton(new GuiNpcButton(102, guiLeft + 315, guiTop + 4, 50, 20, "gui.clear")); addButton(new GuiNpcButton(101, guiLeft + 366, guiTop + 4, 50, 20, "gui.paste")); addButton(new GuiNpcButton(100, guiLeft + 315, guiTop + 25, 50, 20, "gui.copy")); - + addButton(new GuiNpcButton(108, guiLeft + 315, guiTop + 47, 80, 20, "gui.editor")); addButton(new GuiNpcButton(107, guiLeft + 315, guiTop + 70, 80, 20, "script.loadscript")); @@ -113,14 +112,14 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall l.add("All"); l.addAll(list); addButton(new GuiNpcButton(105, guiLeft + 60, guiTop + 4, 80, 20, l.toArray(new String[l.size()]), activeConsole)); - + addLabel(new GuiNpcLabel(1, "script.language", guiLeft + 232, guiTop + 30)); addButton(new GuiNpcButton(103, guiLeft + 294, guiTop + 25, 80, 20, languages.keySet().toArray(new String[languages.keySet().size()]), getScriptIndex())); getButton(103).enabled = languages.size() > 0; addLabel(new GuiNpcLabel(2, "gui.enabled", guiLeft + 232, guiTop + 53)); addButton(new GuiNpcButton(104, guiLeft + 294, guiTop + 48, 50, 20, new String[]{"gui.no","gui.yes"}, script.enabled?1:0)); - + if(MinecraftServer.getServer() != null) addButton(new GuiNpcButton(106, guiLeft + 232, guiTop + 71, 150, 20, "script.openfolder")); } @@ -148,13 +147,13 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall return builder.toString(); } - - @Override - public void confirmClicked(boolean flag, int i){ - if(flag) - openLink("http://www.kodevelopment.nl/minecraft/customnpcs/scripting"); + + @Override + public void confirmClicked(boolean flag, int i){ + if(flag) + openLink("http://www.kodevelopment.nl/minecraft/customnpcs/scripting"); displayGuiScreen(this); - } + } @Override protected void actionPerformed(GuiButton guibutton) { @@ -169,7 +168,7 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall } if(guibutton.id == 15){ GuiConfirmOpenLink guiyesno = new GuiConfirmOpenLink(this, "http://www.kodevelopment.nl/minecraft/customnpcs/scripting", 0, true); - mc.displayGuiScreen(guiyesno); + mc.displayGuiScreen(guiyesno); } if (guibutton.id == 100) { NoppesStringUtils.setClipboardContents(getTextField(2).getText()); @@ -177,16 +176,19 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall if (guibutton.id == 101) { getTextField(2).setText(NoppesStringUtils.getClipboardContents()); } - ScriptContainer container; - if(guibutton.id == 102) { - if(this.activeTab > 0) { - container = (ScriptContainer)this.script.getScripts().get(this.activeTab - 1); - container.script = ""; - } else { - this.script.clearConsole(); + if (guibutton.id == 102) { + getTextField(2).setText(""); + if(!showScript){ + if(activeConsole == 0){ + for(ScriptContainer container : script.scripts) + container.console.clear(); + } + else{ + ScriptContainer container = script.scripts.get(activeConsole - 1); + if(container != null) + container.console.clear(); + } } - - this.initGui(); } if (guibutton.id == 103) { script.scriptLanguage = ((GuiNpcButton)guibutton).displayString; @@ -201,36 +203,31 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall if (guibutton.id == 106) { NoppesUtil.openFolder(ScriptController.Instance.dir); } - if(guibutton.id == 107) { - container = (ScriptContainer)this.script.getScripts().get(this.activeTab - 1); - if(container == null) { - this.script.getScripts().add(container = new ScriptContainer(this.script)); - } - - this.setSubGui(new EventGuiScriptList((List)this.languages.get(this.script.getLanguage()), container)); + if (guibutton.id == 107) { + ScriptContainer container = script.scripts.get(activeTab); + if(container == null) + script.scripts.set(activeTab, container = new ScriptContainer(this.script)); + setSubGui(new GuiScriptList(languages.get(script.scriptLanguage), container)); } - if(guibutton.id == 108) { - container = (ScriptContainer)this.script.getScripts().get(this.activeTab - 1); - if(container != null) { - this.setScript(); + if (guibutton.id == 108) { + ScriptContainer container = script.scripts.get(activeTab); + if(container != null){ + setScript(); this.AWTWindow = new GuiJTextArea(container.script).setListener(this); } } } - private void setScript() { - if(this.activeTab > 0) { - ScriptContainer container = (ScriptContainer)this.script.getScripts().get(this.activeTab - 1); - if(container == null) { - this.script.getScripts().add(container = new ScriptContainer(this.script)); - } - - String text = (this.getTextField(2)).getText(); + private void setScript(){ + if(showScript){ + ScriptContainer container = script.scripts.get(activeTab); + if(container == null) + script.scripts.set(activeTab, container = new ScriptContainer(this.script)); + String text = getTextField(2).getText(); text = text.replace("\r\n", "\n"); text = text.replace("\r", "\n"); container.script = text; } - } @Override @@ -254,7 +251,7 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall @Override public void save() { setScript(); - Client.sendData(EnumPacketServer.ScriptDataSave, script.writeToNBT(new NBTTagCompound())); + Client.sendData(EnumPacketServer.ScriptDataSave, script.writeToNBT(new NBTTagCompound())); } @Override @@ -268,10 +265,11 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall @Override public void saveText(String text) { - ScriptContainer container = script.getScripts().get(activeTab); + ScriptContainer container = script.scripts.get(activeTab); if(container != null) container.script = text; initGui(); } } + From 44d4e74279b5fef8c33c4192a56128fc70376d19 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 1 Dec 2021 18:46:48 -0600 Subject: [PATCH 03/54] Enabled fly button in movement, and set max value for fields as Integer.MAX_VALUE for various fields. --- .../npcs/client/gui/SubGuiNpcMeleeProperties.java | 10 +++++----- .../noppes/npcs/client/gui/SubGuiNpcMovement.java | 6 +++--- .../noppes/npcs/client/gui/SubGuiNpcProjectiles.java | 10 +++++----- .../npcs/client/gui/SubGuiNpcRangeProperties.java | 12 ++++++------ .../npcs/client/gui/global/GuiNpcQuestReward.java | 2 +- .../noppes/npcs/client/gui/mainmenu/GuiNpcStats.java | 2 +- .../noppes/npcs/client/gui/roles/GuiNpcBard.java | 4 ++-- .../npcs/client/gui/roles/GuiNpcConversation.java | 4 ++-- .../noppes/npcs/client/gui/roles/GuiNpcHealer.java | 4 ++-- .../java/noppes/npcs/entity/EntityNPCFlying.java | 3 +++ 10 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMeleeProperties.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMeleeProperties.java index 642b0d356..f33aceda7 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMeleeProperties.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMeleeProperties.java @@ -29,28 +29,28 @@ public class SubGuiNpcMeleeProperties extends SubGuiInterface implements ITextfi addLabel(new GuiNpcLabel(1,"stats.meleestrength", guiLeft + 5, guiTop + 15)); addTextField(new GuiNpcTextField(1,this, fontRendererObj, guiLeft + 85, guiTop + 10, 50, 18, stats.getAttackStrength()+"")); getTextField(1).numbersOnly = true; - getTextField(1).setMinMaxDefault(0, 99999, 5); + getTextField(1).setMinMaxDefault(0, Integer.MAX_VALUE, 5); addLabel(new GuiNpcLabel(2,"stats.meleerange", guiLeft + 5, guiTop + 45)); addTextField(new GuiNpcTextField(2,this, fontRendererObj, guiLeft + 85, guiTop + 40, 50, 18, stats.attackRange+"")); getTextField(2).numbersOnly = true; - getTextField(2).setMinMaxDefault(1, 30, 2); + getTextField(2).setMinMaxDefault(1, Integer.MAX_VALUE, 2); addLabel(new GuiNpcLabel(3,"stats.meleespeed", guiLeft + 5, guiTop + 75)); addTextField(new GuiNpcTextField(3,this, fontRendererObj, guiLeft + 85, guiTop + 70, 50, 18, stats.attackSpeed+"")); getTextField(3).numbersOnly = true; - getTextField(3).setMinMaxDefault(1, 1000, 20); + getTextField(3).setMinMaxDefault(1, Integer.MAX_VALUE, 20); addLabel(new GuiNpcLabel(4,"enchantment.knockback", guiLeft + 5, guiTop + 105)); addTextField(new GuiNpcTextField(4,this, fontRendererObj, guiLeft + 85, guiTop + 100, 50, 18, stats.knockback + "")); getTextField(4).numbersOnly = true; - getTextField(4).setMinMaxDefault(0, 4, 0); + getTextField(4).setMinMaxDefault(0, Integer.MAX_VALUE, 0); addLabel(new GuiNpcLabel(5,"stats.meleeeffect", guiLeft + 5, guiTop + 135)); addButton(new GuiNpcButton(5,guiLeft + 85, guiTop + 130, 52, 20, potionNames, stats.potionType.ordinal())); if(stats.potionType != EnumPotionType.None) { addLabel(new GuiNpcLabel(6,"gui.time", guiLeft + 5, guiTop + 165)); addTextField(new GuiNpcTextField(6,this, fontRendererObj, guiLeft + 85, guiTop + 160, 50, 18, stats.potionDuration + "")); getTextField(6).numbersOnly = true; - getTextField(6).setMinMaxDefault(1, 99999, 5); + getTextField(6).setMinMaxDefault(1, Integer.MAX_VALUE, 5); if(stats.potionType != EnumPotionType.Fire) { addLabel(new GuiNpcLabel(7,"stats.amplify", guiLeft + 5, guiTop + 195)); addButton(new GuiNpcButton(7,guiLeft + 85, guiTop + 190, 52, 20, new String[]{"gui.no", "gui.yes"} ,stats.potionAmp)); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java index c9f63ddf6..276f4eec0 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java @@ -30,12 +30,12 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList this.addButton(new GuiNpcButton(0, guiLeft + 80, y, 100, 20, EnumMovingType.names(), ai.movingType.ordinal())); // Fly Change - // this.addButton(new GuiNpcButton(15, guiLeft + 80, y += 22, 100, 20, new String[]{"movement.ground","movement.flying"}, ai.movementType)); + this.addButton(new GuiNpcButton(15, guiLeft + 80, y += 22, 100, 20, new String[]{"movement.ground","movement.flying"}, ai.movementType)); if(ai.movingType == EnumMovingType.Wandering){ addTextField(new GuiNpcTextField(4,this, guiLeft + 100, y += 22, 40, 20, ai.walkingRange + "")); getTextField(4).numbersOnly = true; - getTextField(4).setMinMaxDefault(0, 1000, 5); + getTextField(4).setMinMaxDefault(0, Integer.MAX_VALUE, 5); addLabel(new GuiNpcLabel(4,"gui.range", guiLeft + 4, y + 5)); addButton(new GuiNpcButton(5, guiLeft + 100, y += 22, 50, 20, new String[]{"gui.no","gui.yes"}, ai.npcInteracting?1:0)); @@ -93,7 +93,7 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList addTextField(new GuiNpcTextField(14,this, guiLeft + 80, y += 22, 50, 18, ai.getWalkingSpeed()+"")); getTextField(14).numbersOnly = true; - getTextField(14).setMinMaxDefault(0, 10, 4); + getTextField(14).setMinMaxDefault(0, Integer.MAX_VALUE, 4); addLabel(new GuiNpcLabel(14,"stats.walkspeed", guiLeft + 5, y + 5)); addButton(new GuiNpcButton(66, guiLeft + 190, guiTop + 190, 60, 20, "gui.done")); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java index 7b9f6af39..7814ee228 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java @@ -31,19 +31,19 @@ public class SubGuiNpcProjectiles extends SubGuiInterface implements ITextfieldL addLabel(new GuiNpcLabel(1,"enchantment.arrowDamage", guiLeft + 5, guiTop + 15)); addTextField(new GuiNpcTextField(1,this, fontRendererObj, guiLeft + 45, guiTop + 10, 50, 18, stats.pDamage+"")); getTextField(1).numbersOnly = true; - getTextField(1).setMinMaxDefault(0, 9999, 5); + getTextField(1).setMinMaxDefault(0, Integer.MAX_VALUE, 5); addLabel(new GuiNpcLabel(2,"enchantment.arrowKnockback", guiLeft + 110, guiTop + 15)); addTextField(new GuiNpcTextField(2,this, fontRendererObj, guiLeft + 150, guiTop + 10, 50, 18, stats.pImpact+"")); getTextField(2).numbersOnly = true; - getTextField(2).setMinMaxDefault(0, 3, 0); + getTextField(2).setMinMaxDefault(0, Integer.MAX_VALUE, 0); addLabel(new GuiNpcLabel(3,"stats.size", guiLeft + 5, guiTop + 45)); addTextField(new GuiNpcTextField(3,this, fontRendererObj, guiLeft + 45, guiTop + 40, 50, 18, stats.pSize+"")); getTextField(3).numbersOnly = true; - getTextField(3).setMinMaxDefault(1, 10, 10); + getTextField(3).setMinMaxDefault(1, Integer.MAX_VALUE, 10); addLabel(new GuiNpcLabel(4,"stats.speed", guiLeft + 5, guiTop + 75)); addTextField(new GuiNpcTextField(4,this, fontRendererObj, guiLeft + 45, guiTop + 70, 50, 18, stats.pSpeed+"")); getTextField(4).numbersOnly = true; - getTextField(4).setMinMaxDefault(1, 50, 10); + getTextField(4).setMinMaxDefault(1, Integer.MAX_VALUE, 10); addLabel(new GuiNpcLabel(5,"stats.hasgravity", guiLeft + 5, guiTop + 105)); addButton(new GuiNpcButton(0, guiLeft + 60, guiTop + 100, 60, 20, new String[]{"gui.no", "gui.yes"} ,stats.pPhysics ? 1:0)); @@ -60,7 +60,7 @@ public class SubGuiNpcProjectiles extends SubGuiInterface implements ITextfieldL if(stats.pEffect != EnumPotionType.None) { addTextField(new GuiNpcTextField(5,this, fontRendererObj, guiLeft + 140, guiTop + 160, 60, 18, stats.pDur + "")); getTextField(5).numbersOnly = true; - getTextField(5).setMinMaxDefault(1, 99999, 5); + getTextField(5).setMinMaxDefault(1, Integer.MAX_VALUE, 5); if(stats.pEffect != EnumPotionType.Fire) { addButton(new GuiNpcButton(10, guiLeft + 210, guiTop + 160, 40, 20, new String[]{"stats.regular", "stats.amplified"} ,stats.pEffAmp)); } diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java index 2077f34f0..2df1ddced 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java @@ -34,31 +34,31 @@ public class SubGuiNpcRangeProperties extends SubGuiInterface implements ITextfi addTextField(new GuiNpcTextField(2,this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.rangedRange+"")); addLabel(new GuiNpcLabel(2,"stats.rangedrange", guiLeft + 5, y + 5)); getTextField(2).numbersOnly = true; - getTextField(2).setMinMaxDefault(1, 64, 2); + getTextField(2).setMinMaxDefault(1, Integer.MAX_VALUE, 2); addTextField(new GuiNpcTextField(3,this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.minDelay+"")); addLabel(new GuiNpcLabel(3,"stats.mindelay", guiLeft + 5, y + 5)); getTextField(3).numbersOnly = true; - getTextField(3).setMinMaxDefault(1, 9999, 20); + getTextField(3).setMinMaxDefault(1, Integer.MAX_VALUE, 20); addTextField(new GuiNpcTextField(4,this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.maxDelay+"")); addLabel(new GuiNpcLabel(4,"stats.maxdelay", guiLeft + 5, y + 5)); getTextField(4).numbersOnly = true; - getTextField(4).setMinMaxDefault(1, 9999, 20); + getTextField(4).setMinMaxDefault(1, Integer.MAX_VALUE, 20); addTextField(new GuiNpcTextField(5, this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.fireRate + "")); addLabel(new GuiNpcLabel(5, "stats.burstspeed", guiLeft + 5, y + 5)); getTextField(5).numbersOnly = true; - getTextField(5).setMinMaxDefault(0, 30, 0); + getTextField(5).setMinMaxDefault(0, Integer.MAX_VALUE, 0); addTextField(new GuiNpcTextField(6, this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.burstCount + "")); addLabel(new GuiNpcLabel(6, "stats.burstcount", guiLeft + 5, y + 5)); getTextField(6).numbersOnly = true; - getTextField(6).setMinMaxDefault(1, 100, 20); + getTextField(6).setMinMaxDefault(1, Integer.MAX_VALUE, 20); addTextField(new GuiNpcTextField(7,this, fontRendererObj, guiLeft + 85, y += 22, 100, 20, stats.fireSound)); addLabel(new GuiNpcLabel(7, "stats.firesound:", guiLeft + 5, y + 5)); addButton(new GuiNpcButton(7, guiLeft + 187, y, 60, 20, "mco.template.button.select")); addTextField(new GuiNpcTextField(8, this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.shotCount + "")); addLabel(new GuiNpcLabel(8, "stats.shotcount", guiLeft + 5, y + 5)); getTextField(8).numbersOnly = true; - getTextField(8).setMinMaxDefault(1, 10, 1); + getTextField(8).setMinMaxDefault(1, Integer.MAX_VALUE, 1); addButton(new GuiNpcButtonYesNo(9, guiLeft + 100, y += 22, stats.aimWhileShooting)); addLabel(new GuiNpcLabel(9, "stats.aimWhileShooting", guiLeft + 5, y + 5)); diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNpcQuestReward.java b/src/main/java/noppes/npcs/client/gui/global/GuiNpcQuestReward.java index 545efde11..a27090ab7 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNpcQuestReward.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNpcQuestReward.java @@ -33,7 +33,7 @@ public class GuiNpcQuestReward extends GuiContainerNPCInterface implements IText addLabel(new GuiNpcLabel(1, "quest.exp", guiLeft + 4, guiTop + 45)); addTextField(new GuiNpcTextField(0, this, this.fontRendererObj, guiLeft + 4, guiTop + 55, 60, 20, quest.rewardExp + "")); getTextField(0).numbersOnly = true; - getTextField(0).setMinMaxDefault(0, 99999, 0); + getTextField(0).setMinMaxDefault(0, Integer.MAX_VALUE, 0); } public void actionPerformed(GuiButton guibutton){ diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java index 0da4b3c6d..51608c45f 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java @@ -39,7 +39,7 @@ public class GuiNpcStats extends GuiNPCInterface2 implements ITextfieldListener, addLabel(new GuiNpcLabel(1,"stats.aggro", guiLeft + 140, y + 5)); addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft + 220, y, 50, 18, stats.aggroRange+"")); getTextField(1).numbersOnly = true; - getTextField(1).setMinMaxDefault(1, 64, 2); + getTextField(1).setMinMaxDefault(1, Integer.MAX_VALUE, 2); addLabel(new GuiNpcLabel(34,"stats.creaturetype", guiLeft + 275, y + 5)); addButton(new GuiNpcButton(8,guiLeft + 355, y, 56, 20, new String[]{"stats.normal","stats.undead","stats.arthropod"} ,stats.creatureType.ordinal())); diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcBard.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcBard.java index 3414870fc..0f91fb138 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcBard.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcBard.java @@ -40,7 +40,7 @@ public class GuiNpcBard extends GuiNPCInterface2 addLabel(new GuiNpcLabel(2,"bard.ondistance", guiLeft + 60, guiTop + 143)); addTextField(new GuiNpcTextField(2,this, this.fontRendererObj, guiLeft+160, guiTop + 138, 40, 20, job.minRange + "")); getTextField(2).numbersOnly = true; - getTextField(2).setMinMaxDefault(2, 64, 5); + getTextField(2).setMinMaxDefault(2, Integer.MAX_VALUE, 5); addLabel(new GuiNpcLabel(4,"bard.hasoff", guiLeft + 60, guiTop + 166)); addButton(new GuiNpcButton(4, guiLeft + 160, guiTop + 161, 60, 20, new String[]{"gui.no","gui.yes"}, job.hasOffRange?1:0)); @@ -48,7 +48,7 @@ public class GuiNpcBard extends GuiNPCInterface2 addLabel(new GuiNpcLabel(3,"bard.offdistance", guiLeft + 60, guiTop + 189)); addTextField(new GuiNpcTextField(3,this, this.fontRendererObj, guiLeft+160, guiTop + 184, 40, 20, job.maxRange + "")); getTextField(3).numbersOnly = true; - getTextField(3).setMinMaxDefault(2, 64, 10); + getTextField(3).setMinMaxDefault(2, Integer.MAX_VALUE, 10); getLabel(3).enabled = job.hasOffRange; getTextField(3).enabled = job.hasOffRange; diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcConversation.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcConversation.java index 0ddc3641f..a6ef74a9a 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcConversation.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcConversation.java @@ -55,12 +55,12 @@ public class GuiNpcConversation extends GuiNPCInterface2 implements ITextfieldLi addLabel(new GuiNpcLabel(50, "conversation.delay", guiLeft + 202, guiTop + 175)); addTextField(new GuiNpcTextField(50, this, fontRendererObj, guiLeft + 260, guiTop + 170, 40, 20, job.generalDelay + "")); getTextField(50).numbersOnly = true; - getTextField(50).setMinMaxDefault(10, 1000000, 12000); + getTextField(50).setMinMaxDefault(10, Integer.MAX_VALUE, 12000); addLabel(new GuiNpcLabel(54, "gui.range", guiLeft + 202, guiTop + 196)); addTextField(new GuiNpcTextField(54, this, fontRendererObj, guiLeft + 260, guiTop + 191, 40, 20, job.range + "")); getTextField(54).numbersOnly = true; - getTextField(54).setMinMaxDefault(4, 60, 20); + getTextField(54).setMinMaxDefault(4, Integer.MAX_VALUE, 20); addLabel(new GuiNpcLabel(51, "quest.quest", guiLeft + 13, guiTop + 175)); String title = job.questTitle; diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcHealer.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcHealer.java index 3fc26ad1a..48bdedeaa 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcHealer.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcHealer.java @@ -25,12 +25,12 @@ public class GuiNpcHealer extends GuiNPCInterface2 addLabel(new GuiNpcLabel(1,"Healing Speed:", guiLeft + 60, guiTop + 110)); addTextField(new GuiNpcTextField(1,this, this.fontRendererObj, guiLeft+130, guiTop + 105, 40, 20, job.speed + "")); getTextField(1).numbersOnly = true; - getTextField(1).setMinMaxDefault(1, 10, 8); + getTextField(1).setMinMaxDefault(1, Integer.MAX_VALUE, 8); addLabel(new GuiNpcLabel(2,"Range:", guiLeft + 60, guiTop + 133)); addTextField(new GuiNpcTextField(2,this, this.fontRendererObj, guiLeft+130, guiTop + 128, 40, 20, job.range + "")); getTextField(2).numbersOnly = true; - getTextField(2).setMinMaxDefault(2, 20, 5); + getTextField(2).setMinMaxDefault(2, Integer.MAX_VALUE, 5); } @Override diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index f4ec4ce5e..0906283ee 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -73,6 +73,9 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { d5 = (double)MathHelper.sqrt_double(d3); this.motionX += (d0 / d5 * 0.5D - this.motionX) * 0.6000000238418579D; this.motionZ += (d1 / d5 * 0.5D - this.motionZ) * 0.6000000238418579D; + + this.motionX *= this.ai.getWalkingSpeed()/10.0D; + this.motionZ *= this.ai.getWalkingSpeed()/10.0D; } } } From 23686dc3b82cd73bc9906d38ab9e079360d51b2b Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 3 Dec 2021 00:49:10 -0600 Subject: [PATCH 04/54] Enabled fly button in movement, and extended max values for several NPC attributes, converting some to floats and doubles. NPCs fly with speed based on their movement speed now. --- src/main/java/noppes/npcs/DataDisplay.java | 2 +- src/main/java/noppes/npcs/DataStats.java | 39 ++++---- .../npcs/ai/target/EntityAIClosestTarget.java | 6 +- .../npcs/client/gui/GuiBorderBlock.java | 3 +- .../npcs/client/gui/GuiNpcRedstoneBlock.java | 17 ++-- .../npcs/client/gui/GuiNpcWaypoint.java | 2 +- .../client/gui/SubGuiNpcAvailability.java | 8 +- .../client/gui/SubGuiNpcFactionOptions.java | 2 +- .../client/gui/SubGuiNpcFactionPoints.java | 6 +- .../client/gui/SubGuiNpcMeleeProperties.java | 14 +-- .../npcs/client/gui/SubGuiNpcMovement.java | 14 +-- .../npcs/client/gui/SubGuiNpcProjectiles.java | 15 ++- .../client/gui/SubGuiNpcRangeProperties.java | 14 +-- .../npcs/client/gui/SubGuiNpcRespawn.java | 2 +- .../client/gui/global/GuiNPCManageBanks.java | 5 +- .../client/gui/global/GuiNpcQuestReward.java | 2 +- .../npcs/client/gui/mainmenu/GuiNPCInv.java | 5 +- .../npcs/client/gui/mainmenu/GuiNpcAI.java | 4 +- .../client/gui/mainmenu/GuiNpcDisplay.java | 6 +- .../npcs/client/gui/mainmenu/GuiNpcStats.java | 19 ++-- .../gui/questtypes/GuiNpcQuestTypeKill.java | 4 +- .../npcs/client/gui/roles/GuiNpcBard.java | 4 +- .../client/gui/roles/GuiNpcCompanion.java | 2 +- .../client/gui/roles/GuiNpcConversation.java | 6 +- .../client/gui/roles/GuiNpcFollowerSetup.java | 2 +- .../npcs/client/gui/roles/GuiNpcHealer.java | 4 +- .../client/gui/roles/GuiNpcItemGiver.java | 4 +- .../npcs/client/gui/roles/GuiNpcSpawner.java | 7 +- .../npcs/client/gui/util/GuiNpcTextField.java | 91 ++++++++++++++++--- .../noppes/npcs/entity/EntityNPCFlying.java | 44 ++++----- .../npcs/entity/EntityNPCInterface.java | 26 +++--- .../java/noppes/npcs/roles/RoleCompanion.java | 2 +- .../scripted/entity/ScriptLivingBase.java | 4 - .../npcs/scripted/entity/ScriptNpc.java | 40 ++++---- .../npcs/scripted/interfaces/ICustomNpc.java | 22 +++-- 35 files changed, 258 insertions(+), 189 deletions(-) diff --git a/src/main/java/noppes/npcs/DataDisplay.java b/src/main/java/noppes/npcs/DataDisplay.java index f7697233f..1bda8ee33 100644 --- a/src/main/java/noppes/npcs/DataDisplay.java +++ b/src/main/java/noppes/npcs/DataDisplay.java @@ -158,7 +158,7 @@ public class DataDisplay { cloakTexture = nbttagcompound.getString("CloakTexture"); glowTexture = nbttagcompound.getString("GlowTexture"); - modelSize = ValueUtil.CorrectInt(nbttagcompound.getInteger("Size"), 1, 30); + modelSize = ValueUtil.CorrectInt(nbttagcompound.getInteger("Size"), 1, Integer.MAX_VALUE); modelType = nbttagcompound.getInteger("modelType"); showName = nbttagcompound.getInteger("ShowName"); diff --git a/src/main/java/noppes/npcs/DataStats.java b/src/main/java/noppes/npcs/DataStats.java index f011ee324..d841d596c 100644 --- a/src/main/java/noppes/npcs/DataStats.java +++ b/src/main/java/noppes/npcs/DataStats.java @@ -10,7 +10,7 @@ import noppes.npcs.util.ValueUtil; public class DataStats { - private int attackStrength = 5; + private float attackStrength = 5; public int attackSpeed = 20, attackRange = 2, knockback = 0; public int minDelay = 20, maxDelay = 40, rangedRange = 15, fireRate = 5, burstCount = 1, shotCount = 1, accuracy = 60; public int aggroRange = 16; @@ -19,7 +19,7 @@ public class DataStats { public int potionDuration = 5; //20 = 1 second public int potionAmp = 0; - public int maxHealth = 20; + public double maxHealth = 20; public int respawnTime = 20; public int spawnCycle = 0; public boolean hideKilledBody = false; @@ -32,10 +32,11 @@ public class DataStats { public boolean canDrown = true; public boolean burnInSun = false; public boolean noFallDamage = false; - public int healthRegen = 1; - public int combatRegen = 0; - - public int pDamage = 4, pImpact = 0, pSize = 5, pSpeed = 10, pArea = 0, pDur = 5; + public float healthRegen = 1; + public float combatRegen = 0; + + public float pDamage = 4; + public int pImpact = 0, pSize = 5, pSpeed = 10, pArea = 0, pDur = 5; public boolean pPhysics = true, pXlr8 = false, pGlows = false, pExplode = false; public boolean pRender3D = false, pSpin = false, pStick = false; public EnumPotionType pEffect = EnumPotionType.None; @@ -55,16 +56,16 @@ public class DataStats { public NBTTagCompound writeToNBT(NBTTagCompound compound) { compound.setTag("Resistances", resistances.writeToNBT()); - compound.setInteger("MaxHealth", maxHealth); + compound.setDouble("MaxHealth", maxHealth); compound.setInteger("AggroRange", aggroRange); compound.setBoolean("HideBodyWhenKilled", hideKilledBody); compound.setInteger("RespawnTime", respawnTime); compound.setInteger("SpawnCycle", spawnCycle); compound.setInteger("CreatureType", creatureType.ordinal()); - compound.setInteger("HealthRegen", healthRegen); - compound.setInteger("CombatRegen", combatRegen); + compound.setFloat("HealthRegen", healthRegen); + compound.setFloat("CombatRegen", combatRegen); - compound.setInteger("AttackStrenght", attackStrength); + compound.setFloat("AttackStrenght", attackStrength); compound.setInteger("AttackRange", attackRange); compound.setInteger("AttackSpeed", attackSpeed); compound.setInteger("KnockBack", knockback); @@ -80,7 +81,7 @@ public class DataStats { compound.setInteger("ShotCount", shotCount); compound.setInteger("Accuracy", accuracy); - compound.setInteger("pDamage", pDamage); + compound.setFloat("pDamage", pDamage); compound.setInteger("pImpact", pImpact); compound.setInteger("pSize", pSize); compound.setInteger("pSpeed", pSpeed); @@ -113,16 +114,16 @@ public class DataStats { public void readToNBT(NBTTagCompound compound) { resistances.readToNBT(compound.getCompoundTag("Resistances")); - setMaxHealth(compound.getInteger("MaxHealth")); + setMaxHealth(compound.getDouble("MaxHealth")); hideKilledBody = compound.getBoolean("HideBodyWhenKilled"); aggroRange = compound.getInteger("AggroRange"); respawnTime = compound.getInteger("RespawnTime"); spawnCycle = compound.getInteger("SpawnCycle"); creatureType = EnumCreatureAttribute.values()[compound.getInteger("CreatureType") % EnumPotionType.values().length]; - healthRegen = compound.getInteger("HealthRegen"); - combatRegen = compound.getInteger("CombatRegen"); + healthRegen = compound.getFloat("HealthRegen"); + combatRegen = compound.getFloat("CombatRegen"); - setAttackStrength(compound.getInteger("AttackStrenght")); + setAttackStrength(compound.getFloat("AttackStrenght")); attackSpeed = compound.getInteger("AttackSpeed"); attackRange = compound.getInteger("AttackRange"); knockback = compound.getInteger("KnockBack"); @@ -138,7 +139,7 @@ public class DataStats { shotCount = ValueUtil.CorrectInt(compound.getInteger("ShotCount"), 1, 10); accuracy = compound.getInteger("Accuracy"); - pDamage = compound.getInteger("pDamage"); + pDamage = compound.getFloat("pDamage"); pImpact = compound.getInteger("pImpact"); pSize = compound.getInteger("pSize"); pSpeed = compound.getInteger("pSpeed"); @@ -168,15 +169,15 @@ public class DataStats { npc.setImmuneToFire(immuneToFire); } - public int getAttackStrength(){ + public float getAttackStrength(){ return attackStrength; } - public void setAttackStrength(int strength){ + public void setAttackStrength(float strength){ attackStrength = strength; npc.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(attackStrength); } - public void setMaxHealth(int maxHealth) { + public void setMaxHealth(double maxHealth) { this.maxHealth = maxHealth; npc.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(maxHealth); } diff --git a/src/main/java/noppes/npcs/ai/target/EntityAIClosestTarget.java b/src/main/java/noppes/npcs/ai/target/EntityAIClosestTarget.java index 6bf82b4b3..454d1fb71 100644 --- a/src/main/java/noppes/npcs/ai/target/EntityAIClosestTarget.java +++ b/src/main/java/noppes/npcs/ai/target/EntityAIClosestTarget.java @@ -6,10 +6,13 @@ import java.util.List; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.EntityCreature; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; import net.minecraft.entity.ai.EntityAITarget; import net.minecraft.entity.monster.EntityMob; import net.minecraft.util.MathHelper; +import noppes.npcs.CustomNpcs; +import noppes.npcs.entity.EntityNPCInterface; public class EntityAIClosestTarget extends EntityAITarget { @@ -52,10 +55,11 @@ public class EntityAIClosestTarget extends EntityAITarget } else { + taskOwner.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(((EntityNPCInterface) taskOwner).stats.aggroRange); double d0 = this.getTargetDistance(); List list = this.taskOwner.worldObj.selectEntitiesWithinAABB(this.targetClass, this.taskOwner.boundingBox.expand(d0, MathHelper.ceiling_double_int(d0 / 2.0D), d0), this.field_82643_g); Collections.sort(list, this.theNearestAttackableTargetSorter); - + taskOwner.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(CustomNpcs.NpcNavRange); if (list.isEmpty()) { return false; diff --git a/src/main/java/noppes/npcs/client/gui/GuiBorderBlock.java b/src/main/java/noppes/npcs/client/gui/GuiBorderBlock.java index fe5464912..d0ee018bc 100644 --- a/src/main/java/noppes/npcs/client/gui/GuiBorderBlock.java +++ b/src/main/java/noppes/npcs/client/gui/GuiBorderBlock.java @@ -4,7 +4,6 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.blocks.tiles.TileBorder; import noppes.npcs.client.Client; -import noppes.npcs.client.NoppesUtil; import noppes.npcs.client.gui.util.GuiNPCInterface; import noppes.npcs.client.gui.util.GuiNpcButton; import noppes.npcs.client.gui.util.GuiNpcLabel; @@ -30,7 +29,7 @@ public class GuiBorderBlock extends GuiNPCInterface implements IGuiData{ addLabel(new GuiNpcLabel(0,"Height", guiLeft+ 1, guiTop + 76, 0xffffff)); addTextField(new GuiNpcTextField(0, this, fontRendererObj, guiLeft+ 60, guiTop + 71,40,20, tile.height + "")); - getTextField(0).numbersOnly = true; + getTextField(0).integersOnly = true; getTextField(0).setMinMaxDefault(0, 500, 6); addLabel(new GuiNpcLabel(1,"Message", guiLeft+ 1, guiTop + 100, 0xffffff)); diff --git a/src/main/java/noppes/npcs/client/gui/GuiNpcRedstoneBlock.java b/src/main/java/noppes/npcs/client/gui/GuiNpcRedstoneBlock.java index f48b634f3..b965a877c 100644 --- a/src/main/java/noppes/npcs/client/gui/GuiNpcRedstoneBlock.java +++ b/src/main/java/noppes/npcs/client/gui/GuiNpcRedstoneBlock.java @@ -5,7 +5,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.StatCollector; import noppes.npcs.blocks.tiles.TileRedstoneBlock; import noppes.npcs.client.Client; -import noppes.npcs.client.NoppesUtil; import noppes.npcs.client.gui.util.GuiNPCInterface; import noppes.npcs.client.gui.util.GuiNpcButton; import noppes.npcs.client.gui.util.GuiNpcLabel; @@ -33,39 +32,39 @@ public class GuiNpcRedstoneBlock extends GuiNPCInterface{ if(tile.isDetailed){ addLabel(new GuiNpcLabel(0,StatCollector.translateToLocal("bard.ondistance") + " X:", guiLeft+ 1, guiTop + 76, 0xffffff)); addTextField(new GuiNpcTextField(0, this, fontRendererObj, guiLeft+ 80, guiTop + 71,30,20, tile.onRangeX + "")); - getTextField(0).numbersOnly = true; + getTextField(0).integersOnly = true; getTextField(0).setMinMaxDefault(0, 50, 6); addLabel(new GuiNpcLabel(1,"Y:", guiLeft+ 113, guiTop + 76, 0xffffff)); addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft+ 122, guiTop + 71,30,20, tile.onRangeY + "")); - getTextField(1).numbersOnly = true; + getTextField(1).integersOnly = true; getTextField(1).setMinMaxDefault(0, 50, 6); addLabel(new GuiNpcLabel(2,"Z:", guiLeft+ 155, guiTop + 76, 0xffffff)); addTextField(new GuiNpcTextField(2, this, fontRendererObj, guiLeft+ 164, guiTop + 71,30,20, tile.onRangeZ + "")); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; getTextField(2).setMinMaxDefault(0, 50, 6); addLabel(new GuiNpcLabel(3,StatCollector.translateToLocal("bard.offdistance") + " X:", guiLeft - 3, guiTop + 99, 0xffffff)); addTextField(new GuiNpcTextField(3, this, fontRendererObj, guiLeft+ 80, guiTop + 94,30,20, tile.offRangeX + "")); - getTextField(3).numbersOnly = true; + getTextField(3).integersOnly = true; getTextField(3).setMinMaxDefault(0, 50, 10); addLabel(new GuiNpcLabel(4,"Y:", guiLeft+ 113, guiTop + 99, 0xffffff)); addTextField(new GuiNpcTextField(4, this, fontRendererObj, guiLeft+ 122, guiTop + 94,30,20, tile.offRangeY + "")); - getTextField(4).numbersOnly = true; + getTextField(4).integersOnly = true; getTextField(4).setMinMaxDefault(0, 50, 10); addLabel(new GuiNpcLabel(5,"Z:", guiLeft+ 155, guiTop + 99, 0xffffff)); addTextField(new GuiNpcTextField(5, this, fontRendererObj, guiLeft+ 164, guiTop + 94,30,20, tile.offRangeZ + "")); - getTextField(5).numbersOnly = true; + getTextField(5).integersOnly = true; getTextField(5).setMinMaxDefault(0, 50, 10); } else{ addLabel(new GuiNpcLabel(0,"bard.ondistance", guiLeft+ 1, guiTop + 76, 0xffffff)); addTextField(new GuiNpcTextField(0, this, fontRendererObj, guiLeft+ 80, guiTop + 71,30,20, tile.onRange + "")); - getTextField(0).numbersOnly = true; + getTextField(0).integersOnly = true; getTextField(0).setMinMaxDefault(0, 50, 6); addLabel(new GuiNpcLabel(3,"bard.offdistance", guiLeft - 3, guiTop + 99, 0xffffff)); addTextField(new GuiNpcTextField(3, this, fontRendererObj, guiLeft+ 80, guiTop + 94,30,20, tile.offRange + "")); - getTextField(3).numbersOnly = true; + getTextField(3).integersOnly = true; getTextField(3).setMinMaxDefault(0, 50, 10); } addButton(new GuiNpcButton(0, guiLeft + 40, guiTop + 190,120,20, "Done")); diff --git a/src/main/java/noppes/npcs/client/gui/GuiNpcWaypoint.java b/src/main/java/noppes/npcs/client/gui/GuiNpcWaypoint.java index 602292ca0..bd1c40785 100644 --- a/src/main/java/noppes/npcs/client/gui/GuiNpcWaypoint.java +++ b/src/main/java/noppes/npcs/client/gui/GuiNpcWaypoint.java @@ -29,7 +29,7 @@ public class GuiNpcWaypoint extends GuiNPCInterface{ addLabel(new GuiNpcLabel(1,"gui.range", guiLeft+ 1, guiTop + 97, 0xffffff)); addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft+ 60, guiTop + 92,200,20, tile.range + "")); - getTextField(1).numbersOnly = true; + getTextField(1).integersOnly = true; getTextField(1).setMinMaxDefault(2, 60, 10); addButton(new GuiNpcButton(0, guiLeft + 40, guiTop + 190,120,20, "Done")); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcAvailability.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcAvailability.java index beee1673b..a1708aa89 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcAvailability.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcAvailability.java @@ -1,11 +1,9 @@ package noppes.npcs.client.gui; import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.client.Client; import noppes.npcs.client.NoppesUtil; -import noppes.npcs.client.gui.global.GuiNPCQuestSelection; import noppes.npcs.client.gui.util.GuiNpcButton; import noppes.npcs.client.gui.util.GuiNpcLabel; import noppes.npcs.client.gui.util.GuiNpcTextField; @@ -13,15 +11,11 @@ import noppes.npcs.client.gui.util.GuiSelectionListener; import noppes.npcs.client.gui.util.ITextfieldListener; import noppes.npcs.client.gui.util.IGuiData; import noppes.npcs.client.gui.util.SubGuiInterface; -import noppes.npcs.constants.EnumAvailabilityDialog; import noppes.npcs.constants.EnumAvailabilityFactionType; -import noppes.npcs.constants.EnumAvailabilityQuest; import noppes.npcs.constants.EnumDayTime; import noppes.npcs.constants.EnumPacketServer; import noppes.npcs.controllers.Availability; -import noppes.npcs.controllers.Dialog; import noppes.npcs.controllers.Faction; -import noppes.npcs.controllers.Quest; public class SubGuiNpcAvailability extends SubGuiInterface implements ITextfieldListener, GuiSelectionListener, IGuiData { @@ -66,7 +60,7 @@ public class SubGuiNpcAvailability extends SubGuiInterface implements ITextfield addLabel(new GuiNpcLabel(51,"availability.minlevel", guiLeft + 4 , guiTop + 175)); this.addTextField(new GuiNpcTextField(51, this, fontRendererObj, guiLeft + 50, guiTop + 170,90, 20, availabitily.minPlayerLevel + "")); - this.getTextField(51).numbersOnly = true; + this.getTextField(51).integersOnly = true; this.getTextField(51).setMinMaxDefault(0, Integer.MAX_VALUE, 0); this.addButton(new GuiNpcButton(66, guiLeft + 82, guiTop + 192,98, 20, "gui.done")); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcFactionOptions.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcFactionOptions.java index 021f43165..4f4fa1469 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcFactionOptions.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcFactionOptions.java @@ -80,7 +80,7 @@ public class SubGuiNpcFactionOptions extends SubGuiInterface implements IScrollD addButton(new GuiNpcButton(2, guiLeft + 4, guiTop + 60, 90, 20, new String[]{"gui.increase","gui.decrease"},0)); addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft + 4, guiTop + 82, 110, 20, "10")); - getTextField(1).numbersOnly = true; + getTextField(1).integersOnly = true; getTextField(1).setMinMaxDefault(1, 100000, 10); addButton(new GuiNpcButton(3, guiLeft + 4, guiTop + 104, 60, 20, "gui.add")); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcFactionPoints.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcFactionPoints.java index 909bb11ab..0f018ea15 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcFactionPoints.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcFactionPoints.java @@ -28,7 +28,7 @@ public class SubGuiNpcFactionPoints extends SubGuiInterface implements ITextfiel this.addTextField(new GuiNpcTextField(2, this, guiLeft + 8 + fontRendererObj.getStringWidth(getLabel(2).label), guiTop + 28, 70, 20, faction.defaultPoints + "")); getTextField(2).setMaxStringLength(6); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; String title = StatCollector.translateToLocal("faction.unfriendly") + "<->" + StatCollector.translateToLocal("faction.neutral"); addLabel(new GuiNpcLabel(3, title, guiLeft + 4, guiTop + 80)); @@ -38,8 +38,8 @@ public class SubGuiNpcFactionPoints extends SubGuiInterface implements ITextfiel addLabel(new GuiNpcLabel(4, title, guiLeft + 4, guiTop + 105)); addTextField(new GuiNpcTextField(4, this, guiLeft + 8 + fontRendererObj.getStringWidth(title), guiTop + 100, 70, 20, faction.friendlyPoints + "")); - getTextField(3).numbersOnly = true; - getTextField(4).numbersOnly = true; + getTextField(3).integersOnly = true; + getTextField(4).integersOnly = true; if(getTextField(3).xPosition > getTextField(4).xPosition) getTextField(4).xPosition = getTextField(3).xPosition; diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMeleeProperties.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMeleeProperties.java index f33aceda7..2990de28d 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMeleeProperties.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMeleeProperties.java @@ -28,28 +28,28 @@ public class SubGuiNpcMeleeProperties extends SubGuiInterface implements ITextfi super.initGui(); addLabel(new GuiNpcLabel(1,"stats.meleestrength", guiLeft + 5, guiTop + 15)); addTextField(new GuiNpcTextField(1,this, fontRendererObj, guiLeft + 85, guiTop + 10, 50, 18, stats.getAttackStrength()+"")); - getTextField(1).numbersOnly = true; - getTextField(1).setMinMaxDefault(0, Integer.MAX_VALUE, 5); + getTextField(1).floatsOnly = true; + getTextField(1).setMinMaxDefaultFloat(0,Float.MAX_VALUE,5); addLabel(new GuiNpcLabel(2,"stats.meleerange", guiLeft + 5, guiTop + 45)); addTextField(new GuiNpcTextField(2,this, fontRendererObj, guiLeft + 85, guiTop + 40, 50, 18, stats.attackRange+"")); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; getTextField(2).setMinMaxDefault(1, Integer.MAX_VALUE, 2); addLabel(new GuiNpcLabel(3,"stats.meleespeed", guiLeft + 5, guiTop + 75)); addTextField(new GuiNpcTextField(3,this, fontRendererObj, guiLeft + 85, guiTop + 70, 50, 18, stats.attackSpeed+"")); - getTextField(3).numbersOnly = true; + getTextField(3).integersOnly = true; getTextField(3).setMinMaxDefault(1, Integer.MAX_VALUE, 20); addLabel(new GuiNpcLabel(4,"enchantment.knockback", guiLeft + 5, guiTop + 105)); addTextField(new GuiNpcTextField(4,this, fontRendererObj, guiLeft + 85, guiTop + 100, 50, 18, stats.knockback + "")); - getTextField(4).numbersOnly = true; + getTextField(4).integersOnly = true; getTextField(4).setMinMaxDefault(0, Integer.MAX_VALUE, 0); addLabel(new GuiNpcLabel(5,"stats.meleeeffect", guiLeft + 5, guiTop + 135)); addButton(new GuiNpcButton(5,guiLeft + 85, guiTop + 130, 52, 20, potionNames, stats.potionType.ordinal())); if(stats.potionType != EnumPotionType.None) { addLabel(new GuiNpcLabel(6,"gui.time", guiLeft + 5, guiTop + 165)); addTextField(new GuiNpcTextField(6,this, fontRendererObj, guiLeft + 85, guiTop + 160, 50, 18, stats.potionDuration + "")); - getTextField(6).numbersOnly = true; + getTextField(6).integersOnly = true; getTextField(6).setMinMaxDefault(1, Integer.MAX_VALUE, 5); if(stats.potionType != EnumPotionType.Fire) { addLabel(new GuiNpcLabel(7,"stats.amplify", guiLeft + 5, guiTop + 195)); @@ -61,7 +61,7 @@ public class SubGuiNpcMeleeProperties extends SubGuiInterface implements ITextfi public void unFocused(GuiNpcTextField textfield) { if(textfield.id == 1){ - stats.setAttackStrength(textfield.getInteger()); + stats.setAttackStrength(Float.parseFloat(textfield.getText())); } else if(textfield.id == 2){ stats.attackRange = textfield.getInteger(); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java index 276f4eec0..329d304d0 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java @@ -34,7 +34,7 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList if(ai.movingType == EnumMovingType.Wandering){ addTextField(new GuiNpcTextField(4,this, guiLeft + 100, y += 22, 40, 20, ai.walkingRange + "")); - getTextField(4).numbersOnly = true; + getTextField(4).integersOnly = true; getTextField(4).setMinMaxDefault(0, Integer.MAX_VALUE, 5); addLabel(new GuiNpcLabel(4,"gui.range", guiLeft + 4, y + 5)); @@ -45,15 +45,15 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList addTextField(new GuiNpcTextField(7,this, guiLeft + 99, y += 22, 24, 20, (int)ai.bodyOffsetX + "")); addLabel(new GuiNpcLabel(17, "spawner.posoffset", guiLeft + 4, y + 5)); addLabel(new GuiNpcLabel(7,"X:", guiLeft + 115, y + 5)); - getTextField(7).numbersOnly = true; + getTextField(7).integersOnly = true; getTextField(7).setMinMaxDefault(0, 10, 5); addLabel(new GuiNpcLabel(8,"Y:", guiLeft + 125, y + 5)); addTextField(new GuiNpcTextField(8,this, guiLeft + 135, y, 24, 20, (int)ai.bodyOffsetY + "")); - getTextField(8).numbersOnly = true; + getTextField(8).integersOnly = true; getTextField(8).setMinMaxDefault(0, 10, 5); addLabel(new GuiNpcLabel(9,"Z:", guiLeft + 161, y + 5)); addTextField(new GuiNpcTextField(9,this, guiLeft + 171, y, 24, 20, (int)ai.bodyOffsetZ + "")); - getTextField(9).numbersOnly = true; + getTextField(9).integersOnly = true; getTextField(9).setMinMaxDefault(0, 10, 5); this.addButton(new GuiNpcButton(3, guiLeft + 80, y += 22, 100, 20, new String[]{"stats.normal","movement.sitting","movement.lying","movement.sneaking","movement.dancing","movement.aiming", "movement.crawling", "movement.hug"},ai.animationType.ordinal())); @@ -65,14 +65,14 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList } else{ addTextField(new GuiNpcTextField(5,this, guiLeft + 99, y += 22, 40, 20, ai.orientation + "")); - getTextField(5).numbersOnly = true; + getTextField(5).integersOnly = true; getTextField(5).setMinMaxDefault(0, 359, 0); this.addLabel(new GuiNpcLabel(6, "movement.rotation", guiLeft + 4, y + 5)); addLabel(new GuiNpcLabel(5,"(0-359)", guiLeft + 142, y + 5)); } if(ai.standingType == EnumStandingType.NoRotation || ai.standingType == EnumStandingType.HeadRotation){ addTextField(new GuiNpcTextField(5,this, guiLeft + 165, y, 40, 20, ai.orientation + "")); - getTextField(5).numbersOnly = true; + getTextField(5).integersOnly = true; getTextField(5).setMinMaxDefault(0, 359, 0); addLabel(new GuiNpcLabel(5,"(0-359)", guiLeft + 207, y + 5)); } @@ -92,7 +92,7 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList addLabel(new GuiNpcLabel(13,"movement.stopinteract", guiLeft + 4, y + 5)); addTextField(new GuiNpcTextField(14,this, guiLeft + 80, y += 22, 50, 18, ai.getWalkingSpeed()+"")); - getTextField(14).numbersOnly = true; + getTextField(14).integersOnly = true; getTextField(14).setMinMaxDefault(0, Integer.MAX_VALUE, 4); addLabel(new GuiNpcLabel(14,"stats.walkspeed", guiLeft + 5, y + 5)); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java index 7814ee228..dea73dc45 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java @@ -7,7 +7,6 @@ import noppes.npcs.client.gui.util.GuiNpcLabel; import noppes.npcs.client.gui.util.GuiNpcTextField; import noppes.npcs.client.gui.util.ITextfieldListener; import noppes.npcs.client.gui.util.SubGuiInterface; -import noppes.npcs.constants.EnumAnimation; import noppes.npcs.constants.EnumPotionType; import noppes.npcs.constants.EnumParticleType; @@ -30,19 +29,19 @@ public class SubGuiNpcProjectiles extends SubGuiInterface implements ITextfieldL super.initGui(); addLabel(new GuiNpcLabel(1,"enchantment.arrowDamage", guiLeft + 5, guiTop + 15)); addTextField(new GuiNpcTextField(1,this, fontRendererObj, guiLeft + 45, guiTop + 10, 50, 18, stats.pDamage+"")); - getTextField(1).numbersOnly = true; - getTextField(1).setMinMaxDefault(0, Integer.MAX_VALUE, 5); + getTextField(1).setFloatsOnly(); + getTextField(1).setMinMaxDefaultFloat(0, Float.MAX_VALUE, 5); addLabel(new GuiNpcLabel(2,"enchantment.arrowKnockback", guiLeft + 110, guiTop + 15)); addTextField(new GuiNpcTextField(2,this, fontRendererObj, guiLeft + 150, guiTop + 10, 50, 18, stats.pImpact+"")); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; getTextField(2).setMinMaxDefault(0, Integer.MAX_VALUE, 0); addLabel(new GuiNpcLabel(3,"stats.size", guiLeft + 5, guiTop + 45)); addTextField(new GuiNpcTextField(3,this, fontRendererObj, guiLeft + 45, guiTop + 40, 50, 18, stats.pSize+"")); - getTextField(3).numbersOnly = true; + getTextField(3).integersOnly = true; getTextField(3).setMinMaxDefault(1, Integer.MAX_VALUE, 10); addLabel(new GuiNpcLabel(4,"stats.speed", guiLeft + 5, guiTop + 75)); addTextField(new GuiNpcTextField(4,this, fontRendererObj, guiLeft + 45, guiTop + 70, 50, 18, stats.pSpeed+"")); - getTextField(4).numbersOnly = true; + getTextField(4).integersOnly = true; getTextField(4).setMinMaxDefault(1, Integer.MAX_VALUE, 10); addLabel(new GuiNpcLabel(5,"stats.hasgravity", guiLeft + 5, guiTop + 105)); @@ -59,7 +58,7 @@ public class SubGuiNpcProjectiles extends SubGuiInterface implements ITextfieldL addButton(new GuiNpcButton(4,guiLeft + 60, guiTop + 160, 60, 20, potionNames, stats.pEffect.ordinal())); if(stats.pEffect != EnumPotionType.None) { addTextField(new GuiNpcTextField(5,this, fontRendererObj, guiLeft + 140, guiTop + 160, 60, 18, stats.pDur + "")); - getTextField(5).numbersOnly = true; + getTextField(5).integersOnly = true; getTextField(5).setMinMaxDefault(1, Integer.MAX_VALUE, 5); if(stats.pEffect != EnumPotionType.Fire) { addButton(new GuiNpcButton(10, guiLeft + 210, guiTop + 160, 40, 20, new String[]{"stats.regular", "stats.amplified"} ,stats.pEffAmp)); @@ -82,7 +81,7 @@ public class SubGuiNpcProjectiles extends SubGuiInterface implements ITextfieldL public void unFocused(GuiNpcTextField textfield) { if(textfield.id == 1){ - stats.pDamage = textfield.getInteger(); + stats.pDamage = Float.parseFloat(textfield.getText()); } else if(textfield.id == 2){ stats.pImpact = textfield.getInteger(); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java index 2df1ddced..9810d7085 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java @@ -29,35 +29,35 @@ public class SubGuiNpcRangeProperties extends SubGuiInterface implements ITextfi int y = guiTop + 4; addTextField(new GuiNpcTextField(1,this, fontRendererObj, guiLeft + 85, y, 50, 18, stats.accuracy+"")); addLabel(new GuiNpcLabel(1,"stats.accuracy", guiLeft + 5, y + 5)); - getTextField(1).numbersOnly = true; + getTextField(1).integersOnly = true; getTextField(1).setMinMaxDefault(0, 100, 90); addTextField(new GuiNpcTextField(2,this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.rangedRange+"")); addLabel(new GuiNpcLabel(2,"stats.rangedrange", guiLeft + 5, y + 5)); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; getTextField(2).setMinMaxDefault(1, Integer.MAX_VALUE, 2); addTextField(new GuiNpcTextField(3,this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.minDelay+"")); addLabel(new GuiNpcLabel(3,"stats.mindelay", guiLeft + 5, y + 5)); - getTextField(3).numbersOnly = true; + getTextField(3).integersOnly = true; getTextField(3).setMinMaxDefault(1, Integer.MAX_VALUE, 20); addTextField(new GuiNpcTextField(4,this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.maxDelay+"")); addLabel(new GuiNpcLabel(4,"stats.maxdelay", guiLeft + 5, y + 5)); - getTextField(4).numbersOnly = true; + getTextField(4).integersOnly = true; getTextField(4).setMinMaxDefault(1, Integer.MAX_VALUE, 20); addTextField(new GuiNpcTextField(5, this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.fireRate + "")); addLabel(new GuiNpcLabel(5, "stats.burstspeed", guiLeft + 5, y + 5)); - getTextField(5).numbersOnly = true; + getTextField(5).integersOnly = true; getTextField(5).setMinMaxDefault(0, Integer.MAX_VALUE, 0); addTextField(new GuiNpcTextField(6, this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.burstCount + "")); addLabel(new GuiNpcLabel(6, "stats.burstcount", guiLeft + 5, y + 5)); - getTextField(6).numbersOnly = true; + getTextField(6).integersOnly = true; getTextField(6).setMinMaxDefault(1, Integer.MAX_VALUE, 20); addTextField(new GuiNpcTextField(7,this, fontRendererObj, guiLeft + 85, y += 22, 100, 20, stats.fireSound)); addLabel(new GuiNpcLabel(7, "stats.firesound:", guiLeft + 5, y + 5)); addButton(new GuiNpcButton(7, guiLeft + 187, y, 60, 20, "mco.template.button.select")); addTextField(new GuiNpcTextField(8, this, fontRendererObj, guiLeft + 85, y += 22, 50, 18, stats.shotCount + "")); addLabel(new GuiNpcLabel(8, "stats.shotcount", guiLeft + 5, y + 5)); - getTextField(8).numbersOnly = true; + getTextField(8).integersOnly = true; getTextField(8).setMinMaxDefault(1, Integer.MAX_VALUE, 1); addButton(new GuiNpcButtonYesNo(9, guiLeft + 100, y += 22, stats.aimWhileShooting)); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRespawn.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRespawn.java index 26f28e05f..16d5f191c 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRespawn.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRespawn.java @@ -27,7 +27,7 @@ public class SubGuiNpcRespawn extends SubGuiInterface implements ITextfieldListe if(stats.respawnTime > 0){ addLabel(new GuiNpcLabel(3,"gui.time", guiLeft + 5, guiTop + 57)); addTextField(new GuiNpcTextField(2,this, fontRendererObj, guiLeft + 122, guiTop + 53, 50, 18, stats.respawnTime + "")); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; getTextField(2).setMinMaxDefault(1, Integer.MAX_VALUE, 20); addLabel(new GuiNpcLabel(4,"stats.deadbody", guiLeft + 4, guiTop + 79)); diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageBanks.java b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageBanks.java index 647177b4f..0a544a5cb 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageBanks.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageBanks.java @@ -7,7 +7,6 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.client.Client; import noppes.npcs.client.CustomNpcResourceListener; -import noppes.npcs.client.NoppesUtil; import noppes.npcs.client.gui.util.GuiContainerNPCInterface2; import noppes.npcs.client.gui.util.GuiCustomScroll; import noppes.npcs.client.gui.util.ICustomScrollListener; @@ -63,11 +62,11 @@ public class GuiNPCManageBanks extends GuiContainerNPCInterface2 implements IScr getTextField(0).setMaxStringLength(20); addTextField(new GuiNpcTextField(1,this, this.fontRendererObj, guiLeft+10, guiTop + 80, 16, 16, "")); - getTextField(1).numbersOnly = true; + getTextField(1).integersOnly = true; getTextField(1).setMaxStringLength(1); addTextField(new GuiNpcTextField(2,this, this.fontRendererObj, guiLeft+10, guiTop + 110, 16, 16, "")); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; getTextField(2).setMaxStringLength(1); } diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNpcQuestReward.java b/src/main/java/noppes/npcs/client/gui/global/GuiNpcQuestReward.java index a27090ab7..2a0d5bd3c 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNpcQuestReward.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNpcQuestReward.java @@ -32,7 +32,7 @@ public class GuiNpcQuestReward extends GuiContainerNPCInterface implements IText addLabel(new GuiNpcLabel(1, "quest.exp", guiLeft + 4, guiTop + 45)); addTextField(new GuiNpcTextField(0, this, this.fontRendererObj, guiLeft + 4, guiTop + 55, 60, 20, quest.rewardExp + "")); - getTextField(0).numbersOnly = true; + getTextField(0).integersOnly = true; getTextField(0).setMinMaxDefault(0, Integer.MAX_VALUE, 0); } diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCInv.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCInv.java index f18b87dae..c5c8ceb30 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCInv.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCInv.java @@ -11,7 +11,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; import noppes.npcs.client.Client; -import noppes.npcs.client.NoppesUtil; import noppes.npcs.client.gui.util.GuiContainerNPCInterface2; import noppes.npcs.client.gui.util.GuiNpcButton; import noppes.npcs.client.gui.util.GuiNpcLabel; @@ -45,12 +44,12 @@ public class GuiNPCInv extends GuiContainerNPCInterface2 implements ISliderListe super.initGui(); addLabel(new GuiNpcLabel(0,"inv.minExp", guiLeft + 118, guiTop + 18)); addTextField(new GuiNpcTextField(0,this, fontRendererObj, guiLeft + 108, guiTop + 29, 60, 20, npc.inventory.minExp + "")); - getTextField(0).numbersOnly = true; + getTextField(0).integersOnly = true; getTextField(0).setMinMaxDefault(0, Short.MAX_VALUE, 0); addLabel(new GuiNpcLabel(1,"inv.maxExp", guiLeft + 118, guiTop + 52)); addTextField(new GuiNpcTextField(1,this, fontRendererObj, guiLeft + 108, guiTop + 63, 60, 20, npc.inventory.maxExp + "")); - getTextField(1).numbersOnly = true; + getTextField(1).integersOnly = true; getTextField(1).setMinMaxDefault(0, Short.MAX_VALUE, 0); addButton(new GuiNpcButton(10, guiLeft + 88, guiTop + 88, 80, 20, new String[]{"stats.normal", "inv.auto"}, npc.inventory.lootMode)); diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAI.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAI.java index 10e367774..1abd1cdd1 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAI.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAI.java @@ -52,7 +52,7 @@ public class GuiNpcAI extends GuiNPCInterface2 implements ITextfieldListener, IG if (ai.useRangeMelee >= 1){ addLabel(new GuiNpcLabel(20,"gui.minrange", guiLeft + 300, guiTop + 115)); addTextField(new GuiNpcTextField(6,this, fontRendererObj, guiLeft + 380, guiTop + 110, 30, 20, ai.distanceToMelee + "")); - getTextField(6).numbersOnly = true; + getTextField(6).integersOnly = true; getTextField(6).setMinMaxDefault(1, npc.stats.aggroRange, 5); } addLabel(new GuiNpcLabel(19,"ai.tacticalvariant", guiLeft + 150, guiTop + 140)); @@ -70,7 +70,7 @@ public class GuiNpcAI extends GuiNPCInterface2 implements ITextfieldListener, IG } addLabel(new GuiNpcLabel(21, label, guiLeft + 300, guiTop + 140)); addTextField(new GuiNpcTextField(3,this, fontRendererObj, guiLeft + 380, guiTop + 135, 30, 20, ai.tacticalRadius + "")); - getTextField(3).numbersOnly = true; + getTextField(3).integersOnly = true; getTextField(3).setMinMaxDefault(1, npc.stats.aggroRange, 5); } diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcDisplay.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcDisplay.java index bbabae2a4..4503f4a31 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcDisplay.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcDisplay.java @@ -55,9 +55,9 @@ public class GuiNpcDisplay extends GuiNPCInterface2 implements ITextfieldListene this.addButton(new GuiNpcButton(1, guiLeft + 50, y,110,20, "selectServer.edit")); addLabel(new GuiNpcLabel(2,"display.size", guiLeft + 175, y + 5)); addTextField(new GuiNpcTextField(2,this, fontRendererObj, guiLeft + 203, y, 40, 20, display.modelSize + "")); - getTextField(2).numbersOnly = true; - getTextField(2).setMinMaxDefault(1, 30, 5); - addLabel(new GuiNpcLabel(3,"(1-30)", guiLeft + 246 , y + 5)); + getTextField(2).integersOnly = true; + getTextField(2).setMinMaxDefault(1, Integer.MAX_VALUE, 5); + //addLabel(new GuiNpcLabel(3,"(1-30)", guiLeft + 246 , y + 5)); y+=23; addLabel(new GuiNpcLabel(4,"display.texture", guiLeft + 5, y + 5)); diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java index 51608c45f..447458af3 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java @@ -2,6 +2,7 @@ package noppes.npcs.client.gui.mainmenu; import net.minecraft.client.gui.GuiButton; import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.DataStats; import noppes.npcs.client.Client; @@ -34,11 +35,11 @@ public class GuiNpcStats extends GuiNPCInterface2 implements ITextfieldListener, int y = guiTop + 10; addLabel(new GuiNpcLabel(0,"stats.health", guiLeft + 5, y + 5)); addTextField(new GuiNpcTextField(0,this, guiLeft + 85, y, 50, 18, stats.maxHealth+"")); - getTextField(0).numbersOnly = true; - getTextField(0).setMinMaxDefault(1, Integer.MAX_VALUE, 20); + getTextField(0).doublesOnly = true; + getTextField(0).setMinMaxDefaultDouble(0,Double.MAX_VALUE,20); addLabel(new GuiNpcLabel(1,"stats.aggro", guiLeft + 140, y + 5)); addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft + 220, y, 50, 18, stats.aggroRange+"")); - getTextField(1).numbersOnly = true; + getTextField(1).integersOnly = true; getTextField(1).setMinMaxDefault(1, Integer.MAX_VALUE, 2); addLabel(new GuiNpcLabel(34,"stats.creaturetype", guiLeft + 275, y + 5)); addButton(new GuiNpcButton(8,guiLeft + 355, y, 56, 20, new String[]{"stats.normal","stats.undead","stats.arthropod"} ,stats.creatureType.ordinal())); @@ -63,10 +64,10 @@ public class GuiNpcStats extends GuiNPCInterface2 implements ITextfieldListener, addLabel(new GuiNpcLabel(10,"stats.fireimmune", guiLeft + 5, y + 5)); addButton(new GuiNpcButton(5,guiLeft + 217, y, 56, 20, new String[]{"gui.no","gui.yes"} ,stats.canDrown? 1:0)); addLabel(new GuiNpcLabel(11,"stats.candrown", guiLeft + 140, y + 5)); - addTextField(new GuiNpcTextField(14, this, guiLeft + 355, y, 56, 20, stats.healthRegen + "").setNumbersOnly()); + addTextField(new GuiNpcTextField(14, this, guiLeft + 355, y, 56, 20, stats.healthRegen + "").setFloatsOnly()); addLabel(new GuiNpcLabel(14,"stats.regenhealth", guiLeft + 275, y + 5)); - addTextField(new GuiNpcTextField(16, this, guiLeft + 355, y+=22, 56, 20, stats.combatRegen + "").setNumbersOnly()); + addTextField(new GuiNpcTextField(16, this, guiLeft + 355, y+=22, 56, 20, stats.combatRegen + "").setFloatsOnly()); addLabel(new GuiNpcLabel(16,"stats.combatregen", guiLeft + 275, y + 5)); addButton(new GuiNpcButton(6,guiLeft + 82, y, 56, 20, new String[]{"gui.no","gui.yes"} ,stats.burnInSun? 1:0)); addLabel(new GuiNpcLabel(12,"stats.burninsun", guiLeft + 5, y + 5)); @@ -82,17 +83,17 @@ public class GuiNpcStats extends GuiNPCInterface2 implements ITextfieldListener, @Override public void unFocused(GuiNpcTextField textfield){ if(textfield.id == 0){ - stats.maxHealth = textfield.getInteger(); - npc.heal(stats.maxHealth); + stats.maxHealth = Double.parseDouble(textfield.getText()); + npc.heal((float)(stats.maxHealth)); } else if(textfield.id == 1){ stats.aggroRange = textfield.getInteger(); } else if(textfield.id == 14){ - stats.healthRegen = textfield.getInteger(); + stats.healthRegen = Float.parseFloat(textfield.getText()); } else if(textfield.id == 16){ - stats.combatRegen = textfield.getInteger(); + stats.combatRegen = Float.parseFloat(textfield.getText()); } } diff --git a/src/main/java/noppes/npcs/client/gui/questtypes/GuiNpcQuestTypeKill.java b/src/main/java/noppes/npcs/client/gui/questtypes/GuiNpcQuestTypeKill.java index 386caec09..a753c28bc 100644 --- a/src/main/java/noppes/npcs/client/gui/questtypes/GuiNpcQuestTypeKill.java +++ b/src/main/java/noppes/npcs/client/gui/questtypes/GuiNpcQuestTypeKill.java @@ -50,7 +50,7 @@ public class GuiNpcQuestTypeKill extends SubGuiInterface implements ITextfieldLi for (String name : quest.targets.keySet()) { this.addTextField(new GuiNpcTextField(i, this, fontRendererObj, guiLeft + 4, guiTop + 70 + i * 22, 180, 20, name)); this.addTextField(new GuiNpcTextField(i + 3, this, fontRendererObj, guiLeft + 186, guiTop + 70 + i * 22, 24, 20, quest.targets.get(name) + "")); - this.getTextField(i+3).numbersOnly = true; + this.getTextField(i+3).integersOnly = true; this.getTextField(i+3).setMinMaxDefault(1, Integer.MAX_VALUE, 1); i++; } @@ -58,7 +58,7 @@ public class GuiNpcQuestTypeKill extends SubGuiInterface implements ITextfieldLi for(;i < 3; i++){ this.addTextField(new GuiNpcTextField(i, this, fontRendererObj, guiLeft + 4, guiTop + 70 + i * 22, 180, 20, "")); this.addTextField(new GuiNpcTextField(i + 3, this, fontRendererObj, guiLeft + 186, guiTop + 70 + i * 22, 24, 20, "1")); - this.getTextField(i+3).numbersOnly = true; + this.getTextField(i+3).integersOnly = true; this.getTextField(i+3).setMinMaxDefault(1, Integer.MAX_VALUE, 1); } Map data = EntityList.stringToClassMapping; diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcBard.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcBard.java index 0f91fb138..d79ea5025 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcBard.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcBard.java @@ -39,7 +39,7 @@ public class GuiNpcBard extends GuiNPCInterface2 addLabel(new GuiNpcLabel(2,"bard.ondistance", guiLeft + 60, guiTop + 143)); addTextField(new GuiNpcTextField(2,this, this.fontRendererObj, guiLeft+160, guiTop + 138, 40, 20, job.minRange + "")); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; getTextField(2).setMinMaxDefault(2, Integer.MAX_VALUE, 5); addLabel(new GuiNpcLabel(4,"bard.hasoff", guiLeft + 60, guiTop + 166)); @@ -47,7 +47,7 @@ public class GuiNpcBard extends GuiNPCInterface2 addLabel(new GuiNpcLabel(3,"bard.offdistance", guiLeft + 60, guiTop + 189)); addTextField(new GuiNpcTextField(3,this, this.fontRendererObj, guiLeft+160, guiTop + 184, 40, 20, job.maxRange + "")); - getTextField(3).numbersOnly = true; + getTextField(3).integersOnly = true; getTextField(3).setMinMaxDefault(2, Integer.MAX_VALUE, 10); getLabel(3).enabled = job.hasOffRange; diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcCompanion.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcCompanion.java index f4d016082..865965a66 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcCompanion.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcCompanion.java @@ -42,7 +42,7 @@ public class GuiNpcCompanion extends GuiNPCInterface2 implements ITextfieldListe addLabel(new GuiNpcLabel(2, "companion.age", guiLeft + 4, y + 5)); if(role.canAge){ addTextField(new GuiNpcTextField(2, this, guiLeft + 162, y, 140, 20, role.ticksActive + "")); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; getTextField(2).setMinMaxDefault(0, Integer.MAX_VALUE, 0); } diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcConversation.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcConversation.java index a6ef74a9a..c8f64f800 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcConversation.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcConversation.java @@ -48,18 +48,18 @@ public class GuiNpcConversation extends GuiNPCInterface2 implements ITextfieldLi if(i > 0){ this.addTextField(new GuiNpcTextField(i + 14, this, this.fontRendererObj, guiLeft + 164 + offset, guiTop + 13 + i % 7 * 22, 30, 20, line.delay + "")); - this.getTextField(i + 14).numbersOnly = true; + this.getTextField(i + 14).integersOnly = true; this.getTextField(i + 14).setMinMaxDefault(5, 1000, 40); } } addLabel(new GuiNpcLabel(50, "conversation.delay", guiLeft + 202, guiTop + 175)); addTextField(new GuiNpcTextField(50, this, fontRendererObj, guiLeft + 260, guiTop + 170, 40, 20, job.generalDelay + "")); - getTextField(50).numbersOnly = true; + getTextField(50).integersOnly = true; getTextField(50).setMinMaxDefault(10, Integer.MAX_VALUE, 12000); addLabel(new GuiNpcLabel(54, "gui.range", guiLeft + 202, guiTop + 196)); addTextField(new GuiNpcTextField(54, this, fontRendererObj, guiLeft + 260, guiTop + 191, 40, 20, job.range + "")); - getTextField(54).numbersOnly = true; + getTextField(54).integersOnly = true; getTextField(54).setMinMaxDefault(4, Integer.MAX_VALUE, 20); addLabel(new GuiNpcLabel(51, "quest.quest", guiLeft + 13, guiTop + 175)); diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcFollowerSetup.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcFollowerSetup.java index c63388c9f..86ad48590 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcFollowerSetup.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcFollowerSetup.java @@ -37,7 +37,7 @@ public class GuiNpcFollowerSetup extends GuiContainerNPCInterface2 int y = guiTop + 37; y += i * 25; GuiNpcTextField tf = new GuiNpcTextField(i,this, fontRendererObj,x, y, 24, 20, "1"); - tf.numbersOnly = true; + tf.integersOnly = true; tf.setMinMaxDefault(1, Integer.MAX_VALUE, 1); addTextField(tf); } diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcHealer.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcHealer.java index 48bdedeaa..615efbd12 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcHealer.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcHealer.java @@ -24,12 +24,12 @@ public class GuiNpcHealer extends GuiNPCInterface2 addLabel(new GuiNpcLabel(1,"Healing Speed:", guiLeft + 60, guiTop + 110)); addTextField(new GuiNpcTextField(1,this, this.fontRendererObj, guiLeft+130, guiTop + 105, 40, 20, job.speed + "")); - getTextField(1).numbersOnly = true; + getTextField(1).integersOnly = true; getTextField(1).setMinMaxDefault(1, Integer.MAX_VALUE, 8); addLabel(new GuiNpcLabel(2,"Range:", guiLeft + 60, guiTop + 133)); addTextField(new GuiNpcTextField(2,this, this.fontRendererObj, guiLeft+130, guiTop + 128, 40, 20, job.range + "")); - getTextField(2).numbersOnly = true; + getTextField(2).integersOnly = true; getTextField(2).setMinMaxDefault(2, Integer.MAX_VALUE, 5); } diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcItemGiver.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcItemGiver.java index c5d855632..cd51ccc11 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcItemGiver.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcItemGiver.java @@ -34,11 +34,11 @@ public class GuiNpcItemGiver extends GuiContainerNPCInterface2 this.addButton(new GuiNpcButton(1, guiLeft + 6, guiTop + 29, 140,20, new String[]{"Timer","Give Only Once","Daily"},role.cooldownType)); addTextField(new GuiNpcTextField(0, this, fontRendererObj, guiLeft + 55, guiTop + 54, 90, 20, role.cooldown + "")); - getTextField(0).numbersOnly = true; + getTextField(0).integersOnly = true; addLabel(new GuiNpcLabel(0,"Cooldown:", guiLeft + 6, guiTop + 59)); addLabel(new GuiNpcLabel(1,"Items to give", guiLeft + 46, guiTop + 79)); - getTextField(0).numbersOnly = true; + getTextField(0).integersOnly = true; int i = 0; for(String line : role.lines){ diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcSpawner.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcSpawner.java index 9e7170d7b..376288e50 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcSpawner.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcSpawner.java @@ -5,7 +5,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.StatCollector; import noppes.npcs.client.Client; import noppes.npcs.client.gui.GuiNpcMobSpawnerSelector; -import noppes.npcs.client.gui.GuiNpcSoundSelection; import noppes.npcs.client.gui.util.GuiNPCInterface2; import noppes.npcs.client.gui.util.GuiNpcButton; import noppes.npcs.client.gui.util.GuiNpcLabel; @@ -82,15 +81,15 @@ public class GuiNpcSpawner extends GuiNPCInterface2 implements ITextfieldListene y += 23; addLabel(new GuiNpcLabel(7,StatCollector.translateToLocal("spawner.posoffset")+" X:", guiLeft + 4, y + 5)); addTextField(new GuiNpcTextField(7,this, fontRendererObj, guiLeft + 99, y, 24, 20, job.xOffset + "")); - getTextField(7).numbersOnly = true; + getTextField(7).integersOnly = true; getTextField(7).setMinMaxDefault(-9, 9, 0); addLabel(new GuiNpcLabel(8,"Y:", guiLeft + 125, y + 5)); addTextField(new GuiNpcTextField(8,this, fontRendererObj, guiLeft + 135, y, 24, 20, job.yOffset + "")); - getTextField(8).numbersOnly = true; + getTextField(8).integersOnly = true; getTextField(8).setMinMaxDefault(-9, 9, 0); addLabel(new GuiNpcLabel(9,"Z:", guiLeft + 161, y + 5)); addTextField(new GuiNpcTextField(9,this, fontRendererObj, guiLeft + 171, y, 24, 20, job.zOffset + "")); - getTextField(9).numbersOnly = true; + getTextField(9).integersOnly = true; getTextField(9).setMinMaxDefault(-9, 9, 0); y += 23; diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java b/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java index 5b0ba8454..a01b0283c 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java @@ -8,10 +8,14 @@ import net.minecraft.client.gui.GuiTextField; public class GuiNpcTextField extends GuiTextField{ public boolean enabled = true; public boolean inMenu = true; - public boolean numbersOnly = false; + public boolean integersOnly = false; + public boolean doublesOnly = false; + public boolean floatsOnly = false; private ITextfieldListener listener; public int id; public int min = 0,max = Integer.MAX_VALUE,def = 0; + public double minDouble = 0, maxDouble = Double.MAX_VALUE, defDouble = 0; + public float minFloat = 0, maxFloat = Float.MAX_VALUE, defFloat = 0; private static GuiNpcTextField activeTextfield = null; public boolean canEdit = true; @@ -37,7 +41,7 @@ public class GuiNpcTextField extends GuiTextField{ } private boolean charAllowed(char c, int i){ - if(!numbersOnly || Character.isDigit(c)) + if(!integersOnly || Character.isDigit(c)) return true; for(int j : allowedSpecialChars) if(j == i) @@ -61,6 +65,7 @@ public class GuiNpcTextField extends GuiTextField{ public int getInteger(){ return Integer.parseInt(getText()); } + public boolean isInteger(){ try{ Integer.parseInt(getText()); @@ -69,6 +74,33 @@ public class GuiNpcTextField extends GuiTextField{ return false; } } + + public double getDouble(){ + return Double.parseDouble(getText()); + } + + public boolean isDouble() { + try{ + Double.parseDouble(getText()); + return true; + }catch(NumberFormatException e){ + return false; + } + } + + public float getFloat(){ + return Float.parseFloat(getText()); + } + + public boolean isFloat() { + try{ + Float.parseFloat(getText()); + return true; + }catch(NumberFormatException e){ + return false; + } + } + @Override public void mouseClicked(int i, int j, int k){ if(!canEdit) @@ -85,30 +117,58 @@ public class GuiNpcTextField extends GuiTextField{ } public void unFocused(){ - if(numbersOnly){ + if(integersOnly && !doublesOnly && !floatsOnly){ if(isEmpty() || !isInteger()) - setText(def + ""); - else if( getInteger() < min) + setText(def+""); + else if(getInteger() < min) setText(min+""); else if(getInteger() > max) setText(max+""); } + else if(doublesOnly && !floatsOnly){ + if(isEmpty() || !isDouble()) + setText(defDouble +""); + else if(getDouble() < minDouble) + setText(minDouble +""); + else if(getDouble() > maxDouble) + setText(maxDouble +""); + } + else if(floatsOnly){ + if(isEmpty() || !isFloat()) + setText(defFloat +""); + else if(getFloat() < minFloat) + setText(minFloat +""); + else if(getFloat() > maxFloat) + setText(maxFloat +""); + } + if(listener != null) listener.unFocused(this); if(this == activeTextfield) activeTextfield = null; } + @Override public void drawTextBox() { if(enabled) super.drawTextBox(); } - public void setMinMaxDefault(int i, int j, int k) { - min = i; - max = j; - def = k; + public void setMinMaxDefault(int min, int max, int def) { + this.min = min; + this.max = max; + this.def = def; + } + public void setMinMaxDefaultDouble(double min, double max, double def) { + minDouble = min; + maxDouble = max; + defDouble = def; + } + public void setMinMaxDefaultFloat(float min, float max, float def) { + minFloat = min; + maxFloat = max; + defFloat = def; } public static void unfocus() { GuiNpcTextField prev = activeTextfield; @@ -122,8 +182,17 @@ public class GuiNpcTextField extends GuiTextField{ drawTextBox(); } - public GuiNpcTextField setNumbersOnly() { - numbersOnly = true; + public GuiNpcTextField setIntegersOnly() { + integersOnly = true; + return this; + } + + public GuiNpcTextField setDoublesOnly() { + doublesOnly = true; + return this; + } + public GuiNpcTextField setFloatsOnly() { + floatsOnly = true; return this; } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 0906283ee..93db80325 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -1,20 +1,17 @@ package noppes.npcs.entity; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; -import net.minecraft.init.Blocks; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.util.MathHelper; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.IChunkProvider; public abstract class EntityNPCFlying extends EntityNPCInterface { public EntityNPCFlying(World world) { super(world); + this.getNavigator().setCanSwim(true); + this.tasks.addTask(0, new EntityAISwimming(this)); } // FLY CHANGE [WIP] @@ -43,15 +40,14 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { return; } - this.motionY *= 0.6000000238418579D; - double d1; - double d3; - double d5; + double speed = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue(); + double speedMult = 0.6000000238418579D/0.5D; - if (!this.worldObj.isRemote && this.getAttackTarget() != null) + this.motionY *= speed*speedMult; + + Entity entity = this.getAttackTarget(); + if (!this.worldObj.isRemote) { - Entity entity = this.getAttackTarget(); - if (entity != null) { if (this.posY < entity.posY) @@ -61,26 +57,26 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { this.motionY = 0.0D; } - this.motionY += (0.5D - this.motionY) * 0.6000000238418579D; + this.motionY += (speed - this.motionY) * speed*speedMult; } double d0 = entity.posX - this.posX; - d1 = entity.posZ - this.posZ; - d3 = d0 * d0 + d1 * d1; + double d1 = entity.posY - this.posY; + double d2 = entity.posZ - this.posZ; + double d3 = d0 * d0 + d2 * d2; if (d3 > 9.0D) { - d5 = (double)MathHelper.sqrt_double(d3); - this.motionX += (d0 / d5 * 0.5D - this.motionX) * 0.6000000238418579D; - this.motionZ += (d1 / d5 * 0.5D - this.motionZ) * 0.6000000238418579D; - - this.motionX *= this.ai.getWalkingSpeed()/10.0D; - this.motionZ *= this.ai.getWalkingSpeed()/10.0D; + double d5 = (double)MathHelper.sqrt_double(d3); + this.motionX += (d0 / d5 * speed - this.motionX) * speed*speedMult; + this.motionZ += (d2 / d5 * speed - this.motionZ) * speed*speedMult; } + + this.rotationYaw = (float)((Math.atan2(-d0,-d2)+Math.PI)*-(180F/Math.PI)); } } - if (this.motionX * this.motionX + this.motionZ * this.motionZ > 0.05000000074505806D) + if (this.motionX * this.motionX + this.motionZ * this.motionZ > 0.05000000074505806D && isEntityAlive()) { this.rotationYaw = (float)Math.atan2(this.motionZ, this.motionX) * (180F / (float)Math.PI) - 90.0F; } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index d0e95bf22..f3ece40fa 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -196,7 +196,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(stats.maxHealth); this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(CustomNpcs.NpcNavRange); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(this.getSpeed()); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(this.getSpeed()); this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(stats.getAttackStrength()); } @@ -599,15 +599,17 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti this.tasks.addTask(0, new EntityAIWaterNav(this)); -// if(canFly()){ -// this.moveHelper = new FlyingMoveHelper(this); -// this.navigator = new PathNavigateFlying(this, worldObj); -// } -// else{ -// this.moveHelper = new EntityMoveHelper(this); -// this.navigator = new PathNavigateGround(this, worldObj); -// this.tasks.addTask(0, new EntityAIWaterNav(this)); -// } + if(canFly()){ + //this.moveHelper = new FlyingMoveHelper(this); + //this.navigator = new PathNavigateFlying(this, worldObj); + this.getNavigator().setCanSwim(true); + this.tasks.addTask(0, new EntityAISwimming(this)); + } + else{ + //this.moveHelper = new EntityMoveHelper(this); + //this.navigator = new PathNavigateGround(this, worldObj); + this.tasks.addTask(0, new EntityAIWaterNav(this)); + } this.taskCount = 1; this.doorInteractType(); @@ -1450,7 +1452,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti public NBTTagCompound writeSpawnData() { NBTTagCompound compound = new NBTTagCompound(); display.writeToNBT(compound); - compound.setInteger("MaxHealth", stats.maxHealth); + compound.setDouble("MaxHealth", stats.maxHealth); compound.setTag("Armor", NBTTags.nbtItemStackList(inventory.getArmor())); compound.setTag("Weapons", NBTTags.nbtItemStackList(inventory.getWeapons())); compound.setInteger("Speed", ai.getWalkingSpeed()); @@ -1489,7 +1491,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } } public void readSpawnData(NBTTagCompound compound) { - stats.maxHealth = compound.getInteger("MaxHealth"); + stats.maxHealth = compound.getDouble("MaxHealth"); ai.setWalkingSpeed(compound.getInteger("Speed")); stats.hideKilledBody = compound.getBoolean("DeadBody"); ai.standingType = EnumStandingType.values()[compound.getInteger("StandingState") % EnumStandingType.values().length]; diff --git a/src/main/java/noppes/npcs/roles/RoleCompanion.java b/src/main/java/noppes/npcs/roles/RoleCompanion.java index eb425094f..853745bc1 100644 --- a/src/main/java/noppes/npcs/roles/RoleCompanion.java +++ b/src/main/java/noppes/npcs/roles/RoleCompanion.java @@ -528,7 +528,7 @@ public class RoleCompanion extends RoleInterface { public void setStats(){ ItemStack weapon = npc.inventory.getWeapon(); - npc.stats.setAttackStrength((int) (1 + getSwordDamage(weapon))); + npc.stats.setAttackStrength((float) (1 + getSwordDamage(weapon))); npc.stats.healthRegen = 0; npc.stats.combatRegen = 0; int ranged = getTalentLevel(EnumCompanionTalent.RANGED); diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java index 705de1b55..efbab1cd8 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java @@ -122,13 +122,9 @@ public class ScriptLivingBase extends ScriptEntity 255) - strength = 255; if(duration < 0) duration = 0; - else if(duration > 1000000) - duration = 1000000; if(!Potion.potionTypes[effect].isInstant()) duration *= 20; diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 14240d037..2148890d3 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -1,6 +1,5 @@ package noppes.npcs.scripted.entity; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import noppes.npcs.NoppesUtilServer; import noppes.npcs.constants.EnumAnimation; @@ -33,7 +32,6 @@ import noppes.npcs.scripted.roles.ScriptRoleTransporter; import noppes.npcs.util.ValueUtil; import java.util.ArrayList; -import java.util.List; import java.util.UUID; public class ScriptNpc extends ScriptLiving implements ICustomNpc { @@ -45,19 +43,17 @@ public class ScriptNpc extends ScriptLiving imp } /** - * @return Returns the current npcs size 1-30 + * @return Returns the current npcs size */ public int getSize(){ return npc.display.modelSize; } /** - * @param size The size of the npc (1-30) default is 5 + * @param size The size of the npc. Default is 5 */ public void setSize(int size){ - if(size > 30) - size = 30; - else if(size < 1) + if(size < 1) size = 1; npc.display.modelSize = size; npc.script.clientNeedsUpdate = true; @@ -186,7 +182,7 @@ public class ScriptNpc extends ScriptLiving imp /** * @param health New max health */ - public void setMaxHealth(int health){ + public void setMaxHealth(double health){ npc.stats.setMaxHealth(health); npc.script.clientNeedsUpdate = true; } @@ -488,14 +484,14 @@ public class ScriptNpc extends ScriptLiving imp /** * @return The melee strength */ - public int getMeleeStrength(){ + public float getMeleeStrength(){ return npc.stats.getAttackStrength(); } /** * @param strength The melee strength */ - public void setMeleeStrength(int strength){ + public void setMeleeStrength(float strength){ npc.stats.setAttackStrength(strength); } @@ -516,14 +512,14 @@ public class ScriptNpc extends ScriptLiving imp /** * @return The ranged strength */ - public int getRangedStrength(){ + public float getRangedStrength(){ return npc.stats.pDamage; } /** * @param strength The ranged strength */ - public void setRangedStrength(int strength){ + public void setRangedStrength(float strength){ npc.stats.pDamage = strength; } @@ -673,28 +669,28 @@ public class ScriptNpc extends ScriptLiving imp /** * @return Returns the combat health regen per second */ - public int getCombatRegen(){ + public float getCombatRegen(){ return npc.stats.combatRegen; } /** * @param regen The combat health regen per second */ - public void setCombatRegen(int regen){ + public void setCombatRegen(float regen){ npc.stats.combatRegen = regen; } /** * @return Returns the health regen per second when not in combat */ - public int getHealthRegen(){ + public float getHealthRegen(){ return npc.stats.healthRegen; } /** * @param regen The health regen per second when not in combat */ - public void setHealthRegen(int regen){ + public void setHealthRegen(float regen){ npc.stats.healthRegen = regen; } @@ -706,4 +702,16 @@ public class ScriptNpc extends ScriptLiving imp public ITimers getTimers() { return ((EntityNPCInterface)this.npc).timers; } + + public boolean canFly(){ + return npc.ai.movementType == 1; + } + + public void setFly(int fly){ + if(fly > 0) + fly = 1; + else fly = 0; + + npc.ai.movementType = fly; + } } diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index 69c78d02d..c1f6c2cef 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -105,7 +105,7 @@ public interface ICustomNpc extends IEntityLiving { /** * @param health New max health */ - public void setMaxHealth(int health); + public void setMaxHealth(double health); /** * @param bo Whether or not the npc will try to return to his home position @@ -264,12 +264,12 @@ public interface ICustomNpc extends IEntityLiving { /** * @return The melee strength */ - public int getMeleeStrength(); + public float getMeleeStrength(); /** * @param strength The melee strength */ - public void setMeleeStrength(int strength); + public void setMeleeStrength(float strength); /** * @return The melee speed @@ -284,12 +284,12 @@ public interface ICustomNpc extends IEntityLiving { /** * @return The ranged strength */ - public int getRangedStrength(); + public float getRangedStrength(); /** * @param strength The ranged strength */ - public void setRangedStrength(int strength); + public void setRangedStrength(float strength); /** * @return The ranged speed @@ -382,22 +382,26 @@ public interface ICustomNpc extends IEntityLiving { /** * @return Returns the combat health regen per second */ - public int getCombatRegen(); + public float getCombatRegen(); /** * @param regen The combat health regen per second */ - public void setCombatRegen(int regen); + public void setCombatRegen(float regen); /** * @return Returns the health regen per second when not in combat */ - public int getHealthRegen(); + public float getHealthRegen(); /** * @param regen The health regen per second when not in combat */ - public void setHealthRegen(int regen); + public void setHealthRegen(float regen); public long getAge(); + + public boolean canFly(); + + public void setFly(int fly); } From 547f5ab82dfede973ffdb79dc84ccef1776597bc Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 3 Dec 2021 18:17:52 -0600 Subject: [PATCH 05/54] Container event spam when no container is open fixed. Fixed scripted player and forge events not launching after merging ScriptContainer and EventScriptContainer. --- build.gradle | 2 + .../noppes/npcs/ScriptPlayerEventHandler.java | 3 +- .../npcs/controllers/ScriptContainer.java | 50 +----------------- .../controllers/data/PlayerDataScript.java | 51 +++++++++++++------ 4 files changed, 41 insertions(+), 65 deletions(-) diff --git a/build.gradle b/build.gradle index 0f17c8a56..db31bb9a1 100644 --- a/build.gradle +++ b/build.gradle @@ -64,3 +64,5 @@ processResources exclude 'mcmod.info' } } + +sourceSets {main { output.resourcesDir = output.classesDir }} diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index d5ae3a1eb..8aea2035f 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -28,6 +28,7 @@ import cpw.mods.fml.common.network.FMLNetworkEvent; import cpw.mods.fml.relauncher.Side; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ContainerPlayer; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldServer; @@ -173,7 +174,7 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(PlayerOpenContainerEvent event) { - if(event.entityPlayer.worldObj instanceof WorldServer) { + if(event.entityPlayer.worldObj instanceof WorldServer && !(event.entityPlayer.openContainer instanceof ContainerPlayer)) { PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; EventHooks.onPlayerContainerOpen(handler, event.entityPlayer.openContainer); } diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index 8c690fdc4..a9d919356 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -109,54 +109,6 @@ public class ScriptContainer { } public void run(String type, Object event) { - if (!this.errored && this.hasCode() && !this.unknownFunctions.contains(type)) { - this.setEngine(this.handler.getLanguage()); - if (this.engine != null) { - if (ScriptController.Instance.lastLoaded > this.lastCreated) { - this.lastCreated = ScriptController.Instance.lastLoaded; - this.init = false; - } - - String var3 = "lock"; - synchronized("lock") { - Current = this; - CurrentType = type; - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - this.engine.getContext().setWriter(pw); - this.engine.getContext().setErrorWriter(pw); - - try { - if (!this.init) { - this.engine.eval(this.getFullCode()); - this.init = true; - } - - if (this.engine.getFactory().getLanguageName().equals("lua")) { - Object ob = this.engine.get(type); - if (ob == null) { - this.unknownFunctions.add(type); - } - } else { - ((Invocable)this.engine).invokeFunction(type, new Object[]{event}); - } - } catch (NoSuchMethodException var13) { - this.unknownFunctions.add(type); - } catch (Throwable var14) { - this.errored = true; - var14.printStackTrace(pw); - } finally { - this.appandConsole(sw.getBuffer().toString().trim()); - pw.close(); - Current = null; - } - - } - } - } - } - - /*public void run(String type, Object event) { if (!this.errored && this.hasCode() && !this.unknownFunctions.contains(type)) { this.setEngine(this.handler.getLanguage()); if (this.engine != null) { @@ -195,7 +147,7 @@ public class ScriptContainer { } } } - }*/ + } public void appandConsole(String message) { if (message != null && !message.isEmpty()) { diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java index 725d8646f..3394672b7 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java @@ -78,50 +78,71 @@ public class PlayerDataScript implements IScriptHandler { } public void callScript(EnumScriptType type, Event event, Object... obs) { - if (this.isEnabled()) { + if(this.isEnabled()) { ScriptContainer script; - if (ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { + if(ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { this.lastInited = ScriptController.Instance.lastLoaded; - errored.clear(); - if (this.player != null) { + //ScriptController.Instance.playerScripts.errored.clear(); + if(this.player != null) { this.scripts.clear(); - Iterator var3 = ScriptController.Instance.playerScripts.scripts.iterator(); + Iterator i = ScriptController.Instance.playerScripts.scripts.iterator(); - while(var3.hasNext()) { - script = (ScriptContainer)var3.next(); + while(i.hasNext()) { + script = (ScriptContainer)i.next(); ScriptContainer s = new ScriptContainer(this); s.readFromNBT(script.writeToNBT(new NBTTagCompound())); + this.scripts.add(s); } } this.lastPlayerUpdate = ScriptController.Instance.lastPlayerUpdate; - if (type != EnumScriptType.INIT) { + if(type != EnumScriptType.INIT) { EventHooks.onPlayerInit(this); } } - for(int i = 0; i < this.scripts.size(); ++i) { - script = (ScriptContainer)this.scripts.get(i); - if (!errored.contains(i)) { + for(int var7 = 0; var7 < this.scripts.size(); ++var7) { + script = (ScriptContainer)this.scripts.get(var7); + + if(!ScriptController.Instance.playerScripts.errored.contains(Integer.valueOf(var7))) { + if(script == null || script.errored || !script.hasCode()) + return; + script.setEngine(scriptLanguage); + if(script.engine == null) + return; + for(int i = 0; i + 1 < obs.length; i += 2){ + Object ob = obs[i + 1]; + if(ob instanceof Entity) + ob = ScriptController.Instance.getScriptForEntity((Entity)ob); + script.engine.put(obs[i].toString(), ob); + } + + ScriptEngine engine = script.engine; + engine.put("world", dummyWorld); + engine.put("player", dummyPlayer); + PlayerEvent result = (PlayerEvent) engine.get("event"); + if(result == null) + engine.put("event", result = new PlayerEvent(this.getPlayer())); + script.engine.put("API", new WrapperNpcAPI()); script.run(type, event); + if (script.errored) { - errored.add(i); + ScriptController.Instance.playerScripts.errored.add(var7); } Iterator var8 = script.console.entrySet().iterator(); while(var8.hasNext()) { Entry entry = (Entry)var8.next(); - if (!console.containsKey(entry.getKey())) { - console.put(entry.getKey(), " tab " + (i + 1) + ":\n" + (String)entry.getValue()); + if (!ScriptController.Instance.playerScripts.console.containsKey(entry.getKey())) { + ScriptController.Instance.playerScripts.console.put(entry.getKey(), " tab " + (var7 + 1) + ":\n" + (String)entry.getValue()); } } script.console.clear(); } } - } } From f14bc107d384a6c3cae5dd652a06751497306f27 Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 3 Dec 2021 21:13:56 -0600 Subject: [PATCH 06/54] Double clicking events in the hook list will now paste them into your code. More scripting functions added for NPCs. --- .../npcs/client/gui/mainmenu/GuiNPCInv.java | 4 +- .../client/gui/script/GuiScriptInterface.java | 23 +- .../npcs/controllers/ScriptContainer.java | 16 +- .../npcs/scripted/entity/ScriptNpc.java | 282 ++++++++++++++++- .../npcs/scripted/interfaces/ICustomNpc.java | 291 ++++++++++++++++++ 5 files changed, 586 insertions(+), 30 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCInv.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCInv.java index c5c8ceb30..17ab799b6 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCInv.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCInv.java @@ -45,12 +45,12 @@ public class GuiNPCInv extends GuiContainerNPCInterface2 implements ISliderListe addLabel(new GuiNpcLabel(0,"inv.minExp", guiLeft + 118, guiTop + 18)); addTextField(new GuiNpcTextField(0,this, fontRendererObj, guiLeft + 108, guiTop + 29, 60, 20, npc.inventory.minExp + "")); getTextField(0).integersOnly = true; - getTextField(0).setMinMaxDefault(0, Short.MAX_VALUE, 0); + getTextField(0).setMinMaxDefault(0, npc.inventory.maxExp, 0); addLabel(new GuiNpcLabel(1,"inv.maxExp", guiLeft + 118, guiTop + 52)); addTextField(new GuiNpcTextField(1,this, fontRendererObj, guiLeft + 108, guiTop + 63, 60, 20, npc.inventory.maxExp + "")); getTextField(1).integersOnly = true; - getTextField(1).setMinMaxDefault(0, Short.MAX_VALUE, 0); + getTextField(1).setMinMaxDefault(npc.inventory.maxExp, Short.MAX_VALUE, 0); addButton(new GuiNpcButton(10, guiLeft + 88, guiTop + 88, 80, 20, new String[]{"stats.normal", "inv.auto"}, npc.inventory.lootMode)); diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java index 370566ca4..34955b4af 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java @@ -218,9 +218,21 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb this.ySize = 256; } + public String previousHookClicked = ""; @Override public void customScrollClicked(int i, int j, int k, GuiCustomScroll scroll) { - //this.handler.getScripts().get(this.activeTab - 1).setType(scroll.getSelected().replace("playerscript.","")); + String hook = scroll.getSelected(); + if(previousHookClicked.equals(hook)){ + String addString = ""; + if(!this.getTextField(2).getText().isEmpty()) + addString += "\n"; + addString += "function "+hook+"(event) {\n \n}\n"; + + this.getTextField(2).setText(this.getTextField(2).getText()+addString); + previousHookClicked = ""; + } else { + previousHookClicked = hook; + } } @Override @@ -230,15 +242,6 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb }*/ } - /*private int getScriptHook(EventScriptContainer eventScriptContainer, List list) { - for(String s : list) { - if (s.replace("playerscript.", "").equals(eventScriptContainer.type)) { - return list.indexOf(s); - } - } - return 0; - }*/ - private String getConsoleText() { Map map = this.handler.getConsoleText(); StringBuilder builder = new StringBuilder(); diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index a9d919356..fefa8ff50 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -85,8 +85,9 @@ public class ScriptContainer { public void run(ScriptEngine engine){ StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); - engine.getContext().setWriter(pw); - engine.getContext().setErrorWriter(pw); + this.engine.getContext().setWriter(pw); + this.engine.getContext().setErrorWriter(pw); + try { if(compScript == null && engine instanceof Compilable) compScript = ((Compilable)engine).compile(getFullCode()); @@ -96,12 +97,13 @@ public class ScriptContainer { } else engine.eval(getFullCode()); - - } catch (Exception e) { - errored = true; - appandConsole(e.getMessage()); + } catch (Throwable var14) { + this.errored = true; + var14.printStackTrace(pw); + } finally { + this.appandConsole(sw.getBuffer().toString().trim()); + pw.close(); } - appandConsole(sw.getBuffer().toString().trim()); } public void run(EnumScriptType type, Event event) { diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 2148890d3..6520fa597 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -4,6 +4,7 @@ import net.minecraft.item.ItemStack; import noppes.npcs.NoppesUtilServer; import noppes.npcs.constants.EnumAnimation; import noppes.npcs.constants.EnumJobType; +import noppes.npcs.constants.EnumNavType; import noppes.npcs.constants.EnumRoleType; import noppes.npcs.controllers.Line; import noppes.npcs.entity.EntityCustomNpc; @@ -215,6 +216,22 @@ public class ScriptNpc extends ScriptLiving imp npc.setFaction(id); } + public void setAttackFactions(boolean attackOtherFactions){ + npc.advanced.attackOtherFactions = attackOtherFactions; + } + + public boolean getAttackFactions(){ + return npc.advanced.attackOtherFactions; + } + + public void setDefendFaction(boolean defendFaction){ + npc.advanced.defendFaction = defendFaction; + } + + public boolean getDefendFaction(){ + return npc.advanced.defendFaction; + } + @Override public int getType(){ return EntityType.NPC; @@ -372,6 +389,22 @@ public class ScriptNpc extends ScriptLiving imp npc.inventory.setProjectile(item.item); npc.script.aiNeedsUpdate = true; } + + public boolean canAimWhileShooting() { + return !npc.stats.aimWhileShooting; + } + + public void aimWhileShooting(boolean aimWhileShooting) { + npc.stats.aimWhileShooting = aimWhileShooting; + } + + public String getFireSound() { + return npc.stats.fireSound; + } + + public void setFireSound(String fireSound) { + npc.stats.fireSound = fireSound; + } /** * @param slot The armor slot to return. 0:head, 1:body, 2:legs, 3:boots @@ -398,6 +431,91 @@ public class ScriptNpc extends ScriptLiving imp npc.script.clientNeedsUpdate = true; } + + /** + * + * @param slot The slot from the NPC's drop list to return (0-8) + * @return + */ + public ScriptItemStack getLootItem(int slot) { + return new ScriptItemStack(npc.inventory.getStackInSlot(slot+7)); + } + + /** + * + * @param slot The slot from the NPC's drop list to change + * @param item The item the drop list slot will be changed to + */ + public void setLootItem(int slot, ScriptItemStack item) { + npc.inventory.setInventorySlotContents(slot+7, item.item); + } + + /** + * + * @param slot The slot from the NPC's drop list to return (0-8) + * @return The chance of dropping the item in this slot. Returns 100 if the slot is not found. + */ + public int getLootChance(int slot) { + if(!npc.inventory.dropchance.containsKey(slot)) + return 100; + + return npc.inventory.dropchance.get(slot); + } + + /** + * + * @param slot The slot from the NPC's drop list to change + * @param chance The new chance of dropping the item in this slot + */ + public void setLootChance(int slot, int chance) { + if(slot < 0 || slot > 8) + return; + + if(chance < 0) + chance = 0; + if(chance > 100) + chance = 100; + + npc.inventory.dropchance.put(slot,chance); + } + + public int getLootMode(){ + return npc.inventory.lootMode; + } + + public void setLootMode(int lootMode){ + if(lootMode < 0 || lootMode > 1) + return; + npc.inventory.lootMode = lootMode; + } + + public void setMinLootXP(int lootXP) { + if(lootXP > npc.inventory.maxExp) + lootXP = npc.inventory.maxExp; + if(lootXP < 0) + lootXP = 0; + if(lootXP > Short.MAX_VALUE) + lootXP = Short.MAX_VALUE; + + npc.inventory.minExp = lootXP; + } + public void setMaxLootXP(int lootXP) { + if(lootXP < npc.inventory.minExp) + lootXP = npc.inventory.minExp; + if(lootXP < 0) + lootXP = 0; + if(lootXP > Short.MAX_VALUE) + lootXP = Short.MAX_VALUE; + + npc.inventory.maxExp = lootXP; + } + + public int getMinLootXP(){ + return npc.inventory.minExp; + } + public int getMaxLootXP(){ + return npc.inventory.maxExp; + } /** * @param type The AnimationType @@ -415,7 +533,81 @@ public class ScriptNpc extends ScriptLiving imp npc.ai.animationType = EnumAnimation.LYING; else if(type == AnimationType.HUGGING) npc.ai.animationType = EnumAnimation.HUG; - + } + + public void setTacticalVariant(int variant){ + if(variant > EnumNavType.values().length-1) + return; + + npc.ai.tacticalVariant = EnumNavType.values()[variant]; + } + + public int getTacticalVariant(){ + return npc.ai.tacticalVariant.ordinal(); + } + + public void setTacticalVariant(String variant){ + boolean found = false; + for(String s : EnumNavType.names()){ + if(s.equals(variant)) + found = true; + } + + if(!found) + return; + + npc.ai.tacticalVariant = EnumNavType.valueOf(variant); + } + + public String getTacticalVariantName(){ + return npc.ai.tacticalVariant.name(); + } + + public void setTacticalRadius(int tacticalRadius){ + if(tacticalRadius < 0) + tacticalRadius = 0; + + npc.ai.tacticalRadius = tacticalRadius; + } + + public int getTacticalRadius(){ + return npc.ai.tacticalRadius; + } + + public void setIgnoreCobweb(boolean ignore){ + npc.ai.ignoreCobweb = ignore; + } + + public boolean getIgnoreCobweb(){ + return npc.ai.ignoreCobweb; + } + + public void setOnFoundEnemy(int onAttack){ + if(onAttack < 0 || onAttack > 3) + return; + npc.ai.onAttack = onAttack; + } + + public int onFoundEnemy(){ + return npc.ai.onAttack; + } + + public void setShelterFrom(int shelterFrom){ + if(shelterFrom < 0 || shelterFrom > 2) + return; + npc.ai.findShelter = shelterFrom; + } + + public int getShelterFrom(){ + return npc.ai.findShelter; + } + + public boolean hasLivingAnimation() { + return !npc.display.disableLivingAnimation; + } + + public void setLivingAnimation(boolean livingAnimation) { + npc.display.disableLivingAnimation = !livingAnimation; } /** @@ -551,19 +743,47 @@ public class ScriptNpc extends ScriptLiving imp npc.stats.burstCount = count; } - /** - * @param player The player to give the item to - * @param item The item given to the player - */ + public int getRespawnTime() { + return npc.stats.respawnTime; + } + + public void setRespawnTime(int time) { + npc.stats.respawnTime = time; + } + + public int getRespawnCycle() { + return npc.stats.spawnCycle; + } + + public void setRespawnCycle(int cycle) { + if(cycle < 0) + cycle = 0; + if(cycle > 3) + cycle = 3; + + npc.stats.spawnCycle = cycle; + } + + public boolean getHideKilledBody() { + return npc.stats.hideKilledBody; + } + + public void hideKilledBody(boolean hide) { + npc.stats.hideKilledBody = hide; + } + + public boolean naturallyDespawns() { + return npc.stats.canDespawn; + } + + public void setNaturallyDespawns(boolean canDespawn) { + npc.stats.canDespawn = canDespawn; + } + public void giveItem(ScriptPlayer player, ScriptItemStack item){ npc.givePlayerItem(player.player, item.item); } - - - /** - * On servers the enable-command-block option in the server.properties needs to be set to true - * @param command The command to be executed - */ + public void executeCommand(String command){ NoppesUtilServer.runCommand(npc, npc.getCommandSenderName(), command, null); } @@ -714,4 +934,44 @@ public class ScriptNpc extends ScriptLiving imp npc.ai.movementType = fly; } + + public void setSkinType(byte type) { + npc.display.skinType = type; + npc.updateClient = true; + } + + public byte getSkinType() { + return npc.display.skinType; + } + + public void setSkinUrl(String url){ + if(this.npc.display.url.equals(url)) + return; + this.npc.display.url = url; + npc.textureLocation = null; + npc.display.skinType = 2; + npc.updateClient = true; + } + + public String getSkinUrl() { + return this.npc.display.url; + } + + public void setCloakTexture(String cloakTexture) { + npc.display.cloakTexture = cloakTexture; + npc.updateClient = true; + } + + public String getCloakTexture() { + return npc.display.cloakTexture; + } + + public void setOverlayTexture(String overlayTexture) { + npc.display.glowTexture = overlayTexture; + npc.updateClient = true; + } + + public String getOverlayTexture() { + return npc.display.glowTexture; + } } diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index c1f6c2cef..f4c504e8d 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -6,6 +6,7 @@ package noppes.npcs.scripted.interfaces; import net.minecraft.entity.EntityCreature; +import noppes.npcs.constants.EnumNavType; import noppes.npcs.scripted.ScriptFaction; import noppes.npcs.scripted.ScriptItemStack; import noppes.npcs.scripted.entity.ScriptLivingBase; @@ -127,6 +128,30 @@ public interface ICustomNpc extends IEntityLiving { */ public void setFaction(int id); + /** + * + * @param attackOtherFactions True if you want the NPC to attack other factions, false otherwise. + */ + public void setAttackFactions(boolean attackOtherFactions); + + /** + * + * @return Returns true if the NPC attacks other factions, false otherwise. + */ + public boolean getAttackFactions(); + + /** + * + * @param defendFaction True if the NPC should defend faction members, false otherwise. + */ + public void setDefendFaction(boolean defendFaction); + + /** + * + * @return Returns true if the NPC should defend faction members, false otherwise. + */ + public boolean getDefendFaction(); + public int getType(); public boolean typeOf(int type); @@ -198,6 +223,30 @@ public interface ICustomNpc extends IEntityLiving { */ public void setProjectileItem(ScriptItemStack item); + /** + * + * @return Returns true if the NPC can aim while shooting. + */ + public boolean canAimWhileShooting(); + + /** + * + * @param aimWhileShooting Set to true if you want the NPC to aim while shooting, false otherwise. + */ + public void aimWhileShooting(boolean aimWhileShooting); + + /** + * + * @return The directory of the sound that plays when a projectile is shot + */ + public String getFireSound(); + + /** + * + * @param fireSound The new directory of the sound that plays when a projectile is shot + */ + public void setFireSound(String fireSound); + /** * @param slot The armor slot to return. 0:head, 1:body, 2:legs, 3:boots * @return Returns the worn armor in slot @@ -210,11 +259,189 @@ public interface ICustomNpc extends IEntityLiving { */ public void setArmor(int slot, ScriptItemStack item); + /** + * + * @param slot The slot from the NPC's drop list to return (0-8) + * @return The item in the NPC's drop list slot + */ + public ScriptItemStack getLootItem(int slot); + + /** + * + * @param slot The slot from the NPC's drop list to change + * @param item The item the drop list slot will be changed to + */ + public void setLootItem(int slot, ScriptItemStack item); + + /** + * + * @param slot The slot from the NPC's drop list to return (0-8) + * @return The chance of dropping the item in this slot. Returns 100 if the slot is not found. + */ + public int getLootChance(int slot); + + /** + * + * @param slot The slot from the NPC's drop list to change + * @param chance The new chance of dropping the item in this slot + */ + public void setLootChance(int slot, int chance); + + /** + * + * @return The NPC's loot mode. 0 = Normal, 1 = Auto Pickup + */ + public int getLootMode(); + + /** + * + * @param lootMode The NPC's loot mode. 0 = Normal, 1 = Auto Pickup + */ + public void setLootMode(int lootMode); + + /** + * + * @param lootXP The new minimum XP gained from killing the NPC. If greater than the max XP, it will be set to it. + */ + public void setMinLootXP(int lootXP); + + /** + * + * @param lootXP The new maximum XP gained from killing the NPC. If less than the min XP, it will be set to it. + */ + public void setMaxLootXP(int lootXP); + + /** + * + * @return The minimum XP gained from killing the NPC. + */ + public int getMinLootXP(); + + /** + * + * @return The maximum XP gained from killing the NPC. + */ + public int getMaxLootXP(); + /** * @param type The AnimationType */ public void setAnimation(int type); + /** + * + * @param variant Changes the tactical variant of the NPC. + * 0 - Rush + * 1 - Dodge + * 2 - Surround + * 3 - Hit N Run + * 4 - Ambush + * 5 - Stalk + * 6 - None + * + */ + public void setTacticalVariant(int variant); + + /** + * + * @return Returns the tactical variant of the NPC. + * 0 - Rush + * 1 - Dodge + * 2 - Surround + * 3 - Hit N Run + * 4 - Ambush + * 5 - Stalk + * 6 - None + * + */ + public int getTacticalVariant(); + + /** + * + * @param variant Sets the NPC's tactical variant by name. + */ + public void setTacticalVariant(String variant); + + /** + * + * @return Returns the name of the NPc's tactical variant. + */ + public String getTacticalVariantName(); + + /** + * + * @param tacticalRadius Sets the radius in which the tactical variant is affected, if any. Effective for all tactical variants except Rush and None. + */ + public void setTacticalRadius(int tacticalRadius); + + /** + * + * @return Gets the radius in which the tactical variant is affected, if any. Effective for all tactical variants except Rush and None. + */ + public int getTacticalRadius(); + + /** + * + * @param ignore True if the NPC goes through cobwebs + */ + public void setIgnoreCobweb(boolean ignore); + + /** + * + * @return True if the NPC goes through cobwebs + */ + public boolean getIgnoreCobweb(); + + /** + * + * @return Changes what the NPC does when it finds an enemy based on the integer given. + * 0 - Retaliate + * 1 - Panic + * 2 - Retreat + * 3 - Nothing + */ + public void setOnFoundEnemy(int onAttack); + + /** + * + * @return Returns an integer representing what the NPC does when it finds an enemy. + * 0 - Retaliate + * 1 - Panic + * 2 - Retreat + * 3 - Nothing + */ + public int onFoundEnemy(); + + /** + * + * @param shelterFrom An integer representing what conditions the NPC seeks shelter under. + * 0 - Darkenss + * 1 - Sunlight + * 2 - Disabled + */ + public void setShelterFrom(int shelterFrom); + + /** + * + * @return Returns an integer representing what conditions the NPC seeks shelter under. + * 0 - Darkenss + * 1 - Sunlight + * 2 - Disabled + */ + public int getShelterFrom(); + + /** + * + * @return Whether the NPC has a living animation + */ + public boolean hasLivingAnimation(); + + /** + * + * @param livingAnimation True if you want the NPC to have a living animation, false otherwise + */ + public void setLivingAnimation(boolean livingAnimation); + /** * @param type The visibility type of the npc, 0:visible, 1:invisible, 2:semi-visible */ @@ -311,6 +538,54 @@ public interface ICustomNpc extends IEntityLiving { */ public void setRangedBurst(int count); + /** + * + * @return The amount of ticks before this entity respawns + */ + public int getRespawnTime(); + + /** + * + * @param time The new amount of ticks before this entity respawns + */ + public void setRespawnTime(int time); + + /** + * + * @return Respawn: 0 - Yes (Always), 1 - Day, 2 - Night, 3 - No (Dies permanently) + */ + public int getRespawnCycle(); + + /** + * + * @param cycle Sets when the NPC respawns. Respawn: 0 - Yes (Always), 1 - Day, 2 - Night, 3 - No (Dies permanently) + */ + public void setRespawnCycle(int cycle); + + /** + * + * @return Whether the NPC is hidden when it dies + */ + public boolean getHideKilledBody(); + + /** + * + * @param hide True if the NPC is hidden when it dies. False otherwise. + */ + public void hideKilledBody(boolean hide); + + /** + * + * @return Returns true if the NPC naturally despawns. + */ + public boolean naturallyDespawns(); + + /** + * + * @param canDespawn True if the NPC should naturally despawn. False otherwise. + */ + public void setNaturallyDespawns(boolean canDespawn); + /** * @param player The player to give the item to * @param item The item given to the player @@ -404,4 +679,20 @@ public interface ICustomNpc extends IEntityLiving { public boolean canFly(); public void setFly(int fly); + + public void setSkinType(byte type); + + public byte getSkinType(); + + public void setSkinUrl(String url); + + public String getSkinUrl(); + + public void setCloakTexture(String cloakTexture); + + public String getCloakTexture(); + + public void setOverlayTexture(String overlayTexture); + + public String getOverlayTexture(); } From cd5b4c0633e384ffd8ac48182ab899bc6b1c29bc Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 3 Dec 2021 21:54:13 -0600 Subject: [PATCH 07/54] Removed shadow when rendering an NPC that shouldn't be visible to a specific player after using setVisibleTo(). --- .../java/noppes/npcs/client/renderer/RenderNPCInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java index 1d4844e25..a65fbd801 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java @@ -73,7 +73,7 @@ public class RenderNPCInterface extends RenderLiving{ public void doRenderShadowAndFire(Entity par1Entity, double par2, double par4, double par6, float par8, float par9){ EntityNPCInterface npc = (EntityNPCInterface) par1Entity; - if(!npc.isKilled()) + if(!npc.isKilled() && !npc.scriptInvisibleToPlayer(Minecraft.getMinecraft().thePlayer)) super.doRenderShadowAndFire(par1Entity, par2, par4, par6, par8, par9); } From 3c1bc30e449cb1395ca2fa35d03dcf4a9b3bb9b2 Mon Sep 17 00:00:00 2001 From: luisc Date: Sat, 4 Dec 2021 12:46:53 -0600 Subject: [PATCH 08/54] Floor values are set for max health, combat regen, health regen, melee damage, and projectile damage when changing them now. --- src/main/java/noppes/npcs/DataStats.java | 7 +++++-- .../java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java | 2 +- .../java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java | 6 +++--- .../java/noppes/npcs/scripted/entity/ScriptLivingBase.java | 5 +++-- src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java | 6 +++--- .../noppes/npcs/scripted/interfaces/IEntityLivingBase.java | 2 +- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/noppes/npcs/DataStats.java b/src/main/java/noppes/npcs/DataStats.java index d841d596c..48672d31f 100644 --- a/src/main/java/noppes/npcs/DataStats.java +++ b/src/main/java/noppes/npcs/DataStats.java @@ -8,6 +8,9 @@ import noppes.npcs.constants.EnumPotionType; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.util.ValueUtil; +import java.math.RoundingMode; +import java.text.DecimalFormat; + public class DataStats { private float attackStrength = 5; @@ -173,12 +176,12 @@ public class DataStats { return attackStrength; } public void setAttackStrength(float strength){ - attackStrength = strength; + attackStrength = (float)(Math.floor(strength)); npc.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(attackStrength); } public void setMaxHealth(double maxHealth) { - this.maxHealth = maxHealth; + this.maxHealth = Math.floor(maxHealth); npc.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(maxHealth); } } diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java index dea73dc45..9d9c764d7 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcProjectiles.java @@ -81,7 +81,7 @@ public class SubGuiNpcProjectiles extends SubGuiInterface implements ITextfieldL public void unFocused(GuiNpcTextField textfield) { if(textfield.id == 1){ - stats.pDamage = Float.parseFloat(textfield.getText()); + stats.pDamage = (float)(Math.floor(Float.parseFloat(textfield.getText()))); } else if(textfield.id == 2){ stats.pImpact = textfield.getInteger(); diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java index 447458af3..ae41dd9be 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java @@ -83,17 +83,17 @@ public class GuiNpcStats extends GuiNPCInterface2 implements ITextfieldListener, @Override public void unFocused(GuiNpcTextField textfield){ if(textfield.id == 0){ - stats.maxHealth = Double.parseDouble(textfield.getText()); + stats.maxHealth = Math.floor(Double.parseDouble(textfield.getText())); npc.heal((float)(stats.maxHealth)); } else if(textfield.id == 1){ stats.aggroRange = textfield.getInteger(); } else if(textfield.id == 14){ - stats.healthRegen = Float.parseFloat(textfield.getText()); + stats.healthRegen = (float)(Math.floor(Float.parseFloat(textfield.getText()))); } else if(textfield.id == 16){ - stats.combatRegen = Float.parseFloat(textfield.getText()); + stats.combatRegen = (float)(Math.floor(Float.parseFloat(textfield.getText()))); } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java index efbab1cd8..ea06ad025 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java @@ -1,6 +1,7 @@ package noppes.npcs.scripted.entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; @@ -49,8 +50,8 @@ public class ScriptLivingBase extends ScriptEntity extends ScriptLiving imp * @param strength The ranged strength */ public void setRangedStrength(float strength){ - npc.stats.pDamage = strength; + npc.stats.pDamage = (float)(Math.floor(strength)); } /** @@ -897,7 +897,7 @@ public class ScriptNpc extends ScriptLiving imp * @param regen The combat health regen per second */ public void setCombatRegen(float regen){ - npc.stats.combatRegen = regen; + npc.stats.combatRegen = (float)(Math.floor(regen)); } /** @@ -911,7 +911,7 @@ public class ScriptNpc extends ScriptLiving imp * @param regen The health regen per second when not in combat */ public void setHealthRegen(float regen){ - npc.stats.healthRegen = regen; + npc.stats.healthRegen = (float)(Math.floor(regen)); } @Override diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IEntityLivingBase.java b/src/main/java/noppes/npcs/scripted/interfaces/IEntityLivingBase.java index 1fc2b472d..846a7ed8b 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/IEntityLivingBase.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/IEntityLivingBase.java @@ -19,7 +19,7 @@ public interface IEntityLivingBase extends IEntity Date: Sun, 5 Dec 2021 15:04:03 -0600 Subject: [PATCH 09/54] Added new ScriptDBCPlayer class for manipulating Dragon Block C attributes. Flying NPCs no longer chase you down if you're dead, or if they're dead. --- .../noppes/npcs/entity/EntityNPCFlying.java | 54 +++--- .../npcs/scripted/entity/ScriptDBCPlayer.java | 169 ++++++++++++++++++ .../npcs/scripted/entity/ScriptPlayer.java | 19 ++ 3 files changed, 213 insertions(+), 29 deletions(-) create mode 100644 src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 93db80325..8c215191d 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -45,40 +45,36 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { this.motionY *= speed*speedMult; - Entity entity = this.getAttackTarget(); - if (!this.worldObj.isRemote) - { - if (entity != null) - { - if (this.posY < entity.posY) - { - if (this.motionY < 0.0D) - { - this.motionY = 0.0D; + if(isEntityAlive()) { + if (!this.worldObj.isRemote) { + Entity entity = this.getAttackTarget(); + if (entity != null && entity.isEntityAlive()) { + if (this.posY < entity.posY) { + if (this.motionY < 0.0D) { + this.motionY = 0.0D; + } + + this.motionY += (speed - this.motionY) * speed * speedMult; } - this.motionY += (speed - this.motionY) * speed*speedMult; + double d0 = entity.posX - this.posX; + double d1 = entity.posY - this.posY; + double d2 = entity.posZ - this.posZ; + double d3 = d0 * d0 + d2 * d2; + + if (d3 > 9.0D) { + double d5 = (double) MathHelper.sqrt_double(d3); + this.motionX += (d0 / d5 * speed - this.motionX) * speed * speedMult; + this.motionZ += (d2 / d5 * speed - this.motionZ) * speed * speedMult; + } + + this.rotationYaw = (float) ((Math.atan2(-d0, -d2) + Math.PI) * -(180F / Math.PI)); } - - double d0 = entity.posX - this.posX; - double d1 = entity.posY - this.posY; - double d2 = entity.posZ - this.posZ; - double d3 = d0 * d0 + d2 * d2; - - if (d3 > 9.0D) - { - double d5 = (double)MathHelper.sqrt_double(d3); - this.motionX += (d0 / d5 * speed - this.motionX) * speed*speedMult; - this.motionZ += (d2 / d5 * speed - this.motionZ) * speed*speedMult; - } - - this.rotationYaw = (float)((Math.atan2(-d0,-d2)+Math.PI)*-(180F/Math.PI)); } - } - if (this.motionX * this.motionX + this.motionZ * this.motionZ > 0.05000000074505806D && isEntityAlive()) - { - this.rotationYaw = (float)Math.atan2(this.motionZ, this.motionX) * (180F / (float)Math.PI) - 90.0F; + if (this.motionX * this.motionX + this.motionZ * this.motionZ > 0.05000000074505806D && isEntityAlive()) { + this.rotationYaw = (float) Math.atan2(this.motionZ, this.motionX) * (180F / (float) Math.PI) - 90.0F; + } } super.onLivingUpdate(); diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java new file mode 100644 index 000000000..e796ba16e --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java @@ -0,0 +1,169 @@ +package noppes.npcs.scripted.entity; + +import net.minecraft.entity.player.EntityPlayerMP; +import noppes.npcs.scripted.CustomNPCsException; + +public class ScriptDBCPlayer extends ScriptPlayer{ + public T player; + + public ScriptDBCPlayer(T player){ + super(player); + this.player = player; + } + + public void setStat(String stat, int value) { + stat = stat.toLowerCase().trim(); + switch (stat) { + case "str": + case "strength": + player.getEntityData().setInteger("jrmcStrI", value); + break; + case "dex": + case "dexterity": + player.getEntityData().setInteger("jrmcDexI", value); + break; + case "con": + case "constitution": + player.getEntityData().setInteger("jrmcCnsI", value); + break; + case "wil": + case "willpower": + player.getEntityData().setInteger("jrmcWilI", value); + break; + case "mnd": + case "mind": + player.getEntityData().setInteger("jrmcIntI", value); + break; + case "spi": + case "spirit": + player.getEntityData().setInteger("jrmcCncI", value); + break; + } + } + + public int getStat(String stat) { + stat = stat.toLowerCase().trim(); + switch (stat) { + case "str": + case "strength": + return player.getEntityData().getInteger("jrmcStrI"); + case "dex": + case "dexterity": + return player.getEntityData().getInteger("jrmcDexI"); + case "con": + case "constitution": + return player.getEntityData().getInteger("jrmcCnsI"); + case "wil": + case "willpower": + return player.getEntityData().getInteger("jrmcWilI"); + case "mnd": + case "mind": + return player.getEntityData().getInteger("jrmcIntI"); + case "spi": + case "spirit": + return player.getEntityData().getInteger("jrmcCncI"); + } + + throw new CustomNPCsException("Invalid stat name: " + stat + "\nValid stat names are:" + + "\nstr, dex, con, wil, mnd, spi\nstrength, dexterity, constitution, willpower, mind, spirit",new Object[0]); + } + + public void setRelease(byte release){ + player.getEntityData().setByte("jrmcRelease",release); + } + public byte getRelease(){ + return player.getEntityData().getByte("jrmcRelease"); + } + + public void setBody(int body){ + player.getEntityData().setInteger("jrmcBdy",body); + } + public int getBody(){ + return player.getEntityData().getInteger("jrmcBdy"); + } + + public void setStamina(int stamina){ + player.getEntityData().setInteger("jrmcStamina",stamina); + } + public int getStamina(){ + return player.getEntityData().getInteger("jrmcStamina"); + } + + public void setKi(int ki){ + player.getEntityData().setInteger("jrmcEnrgy",ki); + } + public int getKi(){ + return player.getEntityData().getInteger("jrmcEnrgy"); + } + + public void setTP(int tp){ + player.getEntityData().setInteger("jrmcTpint",tp); + } + public int getTP(){ + return player.getEntityData().getInteger("jrmcTpint"); + } + + public void setGravity(float gravity){ + player.getEntityData().setFloat("jrmcGravForce",gravity); + } + public float getGravity(){ + return player.getEntityData().getFloat("jrmcGravForce"); + } + + public void setForm(byte form){ + player.getEntityData().setByte("jrmcState",form); + } + public byte getForm(){ + return player.getEntityData().getByte("jrmcState"); + } + public void setForm2(byte form2){ + player.getEntityData().setByte("jrmcState2",form2); + } + public byte getForm2(){ + return player.getEntityData().getByte("jrmcState2"); + } + + public void setPowerPoints(int points){ + player.getEntityData().setInteger("jrmcArcRsrv",points); + } + public int getPowerPoints(){ + return player.getEntityData().getInteger("jrmcArcRsrv"); + } + + public void setAuraColor(int color){ + player.getEntityData().setInteger("jrmcAuraColor",color); + } + public int getAuraColor(){ + return player.getEntityData().getInteger("jrmcAuraColor"); + } + + public byte getDBCClass(){ + return player.getEntityData().getByte("jrmcClass"); + } + public int getRace(){ + return player.getEntityData().getByte("jrmcRace"); + } + public int getPowerType(){ + return player.getEntityData().getByte("jrmcPwrtyp"); + } + public int getKillCount(String type){ + type = type.toLowerCase().trim(); + + int evilKills = player.getEntityData().getInteger("jrmcKillCountEvil"); + int goodKills = player.getEntityData().getInteger("jrmcKillCountGood"); + int neutKills = player.getEntityData().getInteger("jrmcKillCountNeut"); + + switch (type) { + case "evil": + return evilKills; + case "good": + return goodKills; + case "neutral": + return neutKills; + case "all": + return evilKills + goodKills + neutKills; + } + + throw new CustomNPCsException("Invalid kill type: " + type + "\nValid kill types are: evil, good, neutral, all", 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 55cfb4aed..345446be3 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java @@ -4,6 +4,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.stats.Achievement; import net.minecraft.stats.StatBase; import net.minecraft.stats.StatList; @@ -24,6 +26,7 @@ import noppes.npcs.controllers.PlayerQuestData; import noppes.npcs.controllers.Quest; import noppes.npcs.controllers.QuestController; import noppes.npcs.controllers.QuestData; +import noppes.npcs.scripted.CustomNPCsException; import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.ScriptItemStack; import noppes.npcs.scripted.ScriptPixelmonPlayerData; @@ -32,6 +35,9 @@ import noppes.npcs.scripted.interfaces.IPlayer; import noppes.npcs.scripted.interfaces.ITimers; import noppes.npcs.util.ValueUtil; +import java.util.Iterator; +import java.util.Set; + public class ScriptPlayer extends ScriptLivingBase implements IPlayer { public T player; public ScriptPlayer(T player){ @@ -383,4 +389,17 @@ public class ScriptPlayer extends ScriptLivingBase PlayerData data = PlayerDataController.instance.getPlayerData(player); return data.getGUIOpen(); } + + public ScriptDBCPlayer getDBCPlayer() { + Set keySet = player.getEntityData().func_150296_c(); + Iterator iterator = keySet.iterator(); + + while (iterator.hasNext()) + { + String s = (String)iterator.next(); + if(s.contains("jrmc")) + return new ScriptDBCPlayer<>(this.player); + } + return null; + } } From 12333de3a141f8898ba95598c32b532200c022cb Mon Sep 17 00:00:00 2001 From: luisc Date: Mon, 6 Dec 2021 00:10:10 -0600 Subject: [PATCH 10/54] knockback() function for ScriptEntity now *only* knocks the entity back instead of hitting it. Flying NPC's get knocked back properly, and their vertical speed has been increased. Flying NPC's vertical flying speed can be changed by npc.setFlySpeed(double speed) from ScriptNpc. --- src/main/java/noppes/npcs/DataAI.java | 12 +++++- .../ai/pathfinder/PathNavigateFlying.java | 2 +- .../noppes/npcs/entity/EntityNPCFlying.java | 38 +++++++++---------- .../npcs/entity/EntityNPCInterface.java | 13 ++++--- .../npcs/scripted/ScriptEntityParticle.java | 2 +- .../npcs/scripted/entity/ScriptEntity.java | 9 ++--- .../scripted/entity/ScriptLivingBase.java | 1 + .../npcs/scripted/entity/ScriptNpc.java | 19 ++++++++-- .../npcs/scripted/interfaces/ICustomNpc.java | 6 ++- 9 files changed, 62 insertions(+), 40 deletions(-) diff --git a/src/main/java/noppes/npcs/DataAI.java b/src/main/java/noppes/npcs/DataAI.java index 5011b9ce7..e694065aa 100644 --- a/src/main/java/noppes/npcs/DataAI.java +++ b/src/main/java/noppes/npcs/DataAI.java @@ -35,6 +35,7 @@ public class DataAI { // Fly Change public int movementType = 0; + public double flySpeed = 1.0D; public EnumAnimation animationType = EnumAnimation.NONE; public EnumStandingType standingType = EnumStandingType.RotateBody; @@ -96,8 +97,13 @@ public class DataAI { setMovingPath(NBTTags.getIntegerArraySet(compound.getTagList("MovingPathNew",10))); movingPos = compound.getInteger("MovingPos"); movingPattern = compound.getInteger("MovingPatern"); + movementType = compound.getInteger("MovingType"); - + if(!compound.hasKey("FlySpeed")) + flySpeed = 1.0D; + else + flySpeed = compound.getDouble("FlySpeed"); + startPos = compound.getIntArray("StartPosNew"); if (startPos == null || startPos.length != 3){ startPos = new int[] { @@ -143,8 +149,10 @@ public class DataAI { compound.setTag("MovingPathNew", NBTTags.nbtIntegerArraySet(movingPath)); compound.setInteger("MovingPos", movingPos); compound.setInteger("MovingPatern", movingPattern); + compound.setInteger("MovingType", movementType); - + compound.setDouble("FlySpeed",flySpeed); + npc.setAvoidWater(avoidsWater); compound.setIntArray("StartPosNew", npc.getStartPos()); diff --git a/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java b/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java index 9a3ab7207..c2187dbeb 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java @@ -10,7 +10,7 @@ public class PathNavigateFlying extends PathNavigateSwimmer { super(p_i45873_1_, worldIn); } - protected PathFinder func_179679_a() + protected PathFinder getPathFinder() { return new NPCPathFinder(new FlyNodeProcessor()); } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 8c215191d..610ac8055 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -10,12 +10,8 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { public EntityNPCFlying(World world) { super(world); - this.getNavigator().setCanSwim(true); - this.tasks.addTask(0, new EntityAISwimming(this)); } - // FLY CHANGE [WIP] - @Override public boolean canFly(){ return ai.movementType == 1; @@ -43,32 +39,36 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { double speed = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue(); double speedMult = 0.6000000238418579D/0.5D; - this.motionY *= speed*speedMult; - if(isEntityAlive()) { if (!this.worldObj.isRemote) { Entity entity = this.getAttackTarget(); if (entity != null && entity.isEntityAlive()) { - if (this.posY < entity.posY) { - if (this.motionY < 0.0D) { - this.motionY = 0.0D; - } - - this.motionY += (speed - this.motionY) * speed * speedMult; - } - double d0 = entity.posX - this.posX; - double d1 = entity.posY - this.posY; double d2 = entity.posZ - this.posZ; double d3 = d0 * d0 + d2 * d2; - if (d3 > 9.0D) { - double d5 = (double) MathHelper.sqrt_double(d3); - this.motionX += (d0 / d5 * speed - this.motionX) * speed * speedMult; - this.motionZ += (d2 / d5 * speed - this.motionZ) * speed * speedMult; + if(this.hurtTime == 0) { + if (this.posY != entity.posY) { + if (this.motionY * Math.signum(this.posY - entity.posY) > 0.0D) { + this.motionY = 0.0D; + } + + this.motionY -= Math.signum(this.posY - entity.posY) * (speed * speedMult) * this.ai.flySpeed; + } + + if (d3 > 9.0D) { + double d5 = MathHelper.sqrt_double(d3); + this.motionX += (d0 / d5 * speed - this.motionX) * speed * speedMult; + this.motionZ += (d2 / d5 * speed - this.motionZ) * speed * speedMult; + } } this.rotationYaw = (float) ((Math.atan2(-d0, -d2) + Math.PI) * -(180F / Math.PI)); + } else { + if (!this.onGround && this.motionY < 0.0D) + { + this.motionY *= 0.6D; + } } } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index f3ece40fa..79c43f23a 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -25,6 +25,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemBow; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathNavigate; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.AxisAlignedBB; @@ -59,6 +60,8 @@ import noppes.npcs.ai.EntityAIMoveIndoors; import noppes.npcs.ai.EntityAIPanic; import noppes.npcs.ai.EntityAIWander; import noppes.npcs.ai.EntityAIWatchClosest; +import noppes.npcs.ai.pathfinder.PathNavigateFlying; +import noppes.npcs.ai.pathfinder.PathNavigateGround; import noppes.npcs.ai.selector.NPCAttackSelector; import noppes.npcs.ai.target.EntityAIClearTarget; import noppes.npcs.ai.target.EntityAIClosestTarget; @@ -153,8 +156,8 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti public boolean updateAI = false; // Fly Change -// public EntityMoveHelper moveHelper; -// public PathNavigate navigator; + //public EntityMoveHelper moveHelper; + public PathNavigate navigator; public EntityNPCInterface(World world) { super(world); @@ -597,17 +600,15 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti this.targetTasks.addTask(3, new EntityAIOwnerHurtByTarget(this)); this.targetTasks.addTask(4, new EntityAIOwnerHurtTarget(this)); - this.tasks.addTask(0, new EntityAIWaterNav(this)); - if(canFly()){ //this.moveHelper = new FlyingMoveHelper(this); - //this.navigator = new PathNavigateFlying(this, worldObj); + this.navigator = new PathNavigateFlying(this, worldObj); this.getNavigator().setCanSwim(true); this.tasks.addTask(0, new EntityAISwimming(this)); } else{ //this.moveHelper = new EntityMoveHelper(this); - //this.navigator = new PathNavigateGround(this, worldObj); + this.navigator = new PathNavigateGround(this, worldObj); this.tasks.addTask(0, new EntityAIWaterNav(this)); } diff --git a/src/main/java/noppes/npcs/scripted/ScriptEntityParticle.java b/src/main/java/noppes/npcs/scripted/ScriptEntityParticle.java index 19ab0e360..bc7e15120 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptEntityParticle.java +++ b/src/main/java/noppes/npcs/scripted/ScriptEntityParticle.java @@ -113,7 +113,7 @@ public class ScriptEntityParticle { this.directory = directory; } - public void setHEXcolor(int HEXcolor) { + public void setHEXColor(int HEXcolor) { this.HEXcolor = HEXcolor; } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java index 541ff0778..373446653 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java @@ -457,20 +457,17 @@ public class ScriptEntity implements IEntity { * @param power How strong the knockback is * @param direction The direction in which he flies back (0-360). Usually based on getRotation() */ + @Override public void knockback(int power, float direction){ float v = direction * (float)Math.PI / 180.0F; + entity.velocityChanged = true; entity.addVelocity(-MathHelper.sin(v) * (float)power, 0.1D + power * 0.04f, MathHelper.cos(v) * (float)power); - entity.motionX *= 0.6D; - entity.motionZ *= 0.6D; - entity.attackEntityFrom(DamageSource.outOfWorld, 0.0001F); - entity.hurtResistantTime = 0; } public void knockback(int xpower, int ypower, int zpower, float direction){ float v = direction * (float)Math.PI / 180.0F; + entity.velocityChanged = true; entity.addVelocity(-MathHelper.sin(v) * (float)xpower, 0.1D + ypower * 0.04f, MathHelper.cos(v) * (float)zpower); - entity.attackEntityFrom(DamageSource.outOfWorld, 0.0001F); - entity.hurtResistantTime = 0; } public void setImmune(int ticks) { diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java index ea06ad025..843a402fd 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java @@ -7,6 +7,7 @@ import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSource; +import net.minecraft.util.MathHelper; import noppes.npcs.controllers.ScriptController; import noppes.npcs.scripted.ScriptItemStack; import noppes.npcs.scripted.constants.EntityType; diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index dcd8d93e3..02fcde002 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -923,10 +923,6 @@ public class ScriptNpc extends ScriptLiving imp return ((EntityNPCInterface)this.npc).timers; } - public boolean canFly(){ - return npc.ai.movementType == 1; - } - public void setFly(int fly){ if(fly > 0) fly = 1; @@ -935,6 +931,21 @@ public class ScriptNpc extends ScriptLiving imp npc.ai.movementType = fly; } + public boolean canFly(){ + return npc.ai.movementType == 1; + } + + public void setFlySpeed(double flySpeed){ + if(flySpeed < 0.0D) + flySpeed = 0.0D; + + npc.ai.flySpeed = flySpeed; + } + + public double getFlySpeed(double flySpeed){ + return npc.ai.flySpeed; + } + public void setSkinType(byte type) { npc.display.skinType = type; npc.updateClient = true; diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index f4c504e8d..fdbb03e48 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -676,9 +676,13 @@ public interface ICustomNpc extends IEntityLiving { public long getAge(); + public void setFly(int fly); + public boolean canFly(); - public void setFly(int fly); + public void setFlySpeed(double flySpeed); + + public double getFlySpeed(double flySpeed); public void setSkinType(byte type); From 43b324180113d89e8f74554837eec7be7f1b785f Mon Sep 17 00:00:00 2001 From: luisc Date: Tue, 7 Dec 2021 03:57:57 -0600 Subject: [PATCH 11/54] Implemented path navigator and move helper for flying NPCs (npc.getNavigator() and npc.getMoveHelper() used to return the default navigator and move helper, added override function). Improved Flying AI getting stuck when trying to get over a block towards the enemy. --- .../npcs/ai/pathfinder/FlyingMoveHelper.java | 98 ++-- .../ai/pathfinder/PathNavigateFlying.java | 502 +++++++++++++++++- .../noppes/npcs/entity/EntityNPCFlying.java | 23 +- .../npcs/entity/EntityNPCInterface.java | 47 +- 4 files changed, 602 insertions(+), 68 deletions(-) diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java index 7031a9e00..078598d75 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java @@ -1,5 +1,6 @@ package noppes.npcs.ai.pathfinder; +import net.minecraft.entity.EntityLiving; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityMoveHelper; import net.minecraft.util.AxisAlignedBB; @@ -8,60 +9,83 @@ import noppes.npcs.entity.EntityNPCInterface; // Fly Change -public class FlyingMoveHelper extends EntityMoveHelper { +public class FlyingMoveHelper extends EntityMoveHelper{ private EntityNPCInterface entity; - private int field_179928_h; - protected boolean update; - - public double posX; - public double posY; - public double posZ; + private double posX; + private double posY; + private double posZ; + private double speed; + private boolean update; + private static final String __OBFID = "CL_00001573"; public FlyingMoveHelper(EntityNPCInterface entity){ super(entity); this.entity = entity; + this.posX = entity.posX; + this.posY = entity.posY; + this.posZ = entity.posZ; } - public void onUpdateMoveHelper(){ - if (this.update){ + public void onUpdateMoveHelper() { + this.entity.setMoveForward(0.0F); + + if (this.update) { + this.update = false; + int i = MathHelper.floor_double(this.entity.boundingBox.minY + 0.5D); double d0 = this.posX - this.entity.posX; - double d1 = this.posY - this.entity.posY; - double d2 = this.posZ - this.entity.posZ; - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - - if (this.field_179928_h-- <= 0){ - this.field_179928_h += this.entity.getRNG().nextInt(5) + 2; - d3 = (double) MathHelper.sqrt_double(d3); + double d1 = this.posZ - this.entity.posZ; + double d2 = this.posY - (double)i; + double d3 = d0 * d0 + d2 * d2 + d1 * d1; - if (d3 > 1 && this.func_179926_b(this.posX, this.posY, this.posZ, d3)){ - double speed = entity.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue() / 2.5; - this.entity.motionX += d0 / d3 * speed; - this.entity.motionY += d1 / d3 * speed; - this.entity.motionZ += d2 / d3 * speed; - this.entity.renderYawOffset = this.entity.rotationYaw = -((float)Math.atan2(this.entity.motionX, this.entity.motionZ)) * 180.0F / (float)Math.PI; - } - else{ - this.update = false; + if (d3 >= 2.500000277905201E-7D) { + float f = (float)(Math.atan2(d1, d0) * 180.0D / Math.PI) - 90.0F; + this.entity.rotationYaw = this.limitAngle(this.entity.rotationYaw, f, 30.0F); + this.entity.setAIMoveSpeed((float)(this.speed * this.entity.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue())); + + if (d2 > 0.0D && d0 * d0 + d1 * d1 < 1.0D) { + this.entity.getJumpHelper().setJumping(); } } } } - private boolean func_179926_b(double p_179926_1_, double p_179926_3_, double p_179926_5_, double p_179926_7_){ - double d4 = (p_179926_1_ - this.entity.posX) / p_179926_7_; - double d5 = (p_179926_3_ - this.entity.posY) / p_179926_7_; - double d6 = (p_179926_5_ - this.entity.posZ) / p_179926_7_; - AxisAlignedBB axisalignedbb = this.entity.getBoundingBox(); + private float limitAngle(float p_75639_1_, float p_75639_2_, float p_75639_3_) + { + float f3 = MathHelper.wrapAngleTo180_float(p_75639_2_ - p_75639_1_); - for (int i = 1; (double)i < p_179926_7_; ++i){ - axisalignedbb = axisalignedbb.offset(d4, d5, d6); - - if (!this.entity.worldObj.getCollidingBoundingBoxes(this.entity, axisalignedbb).isEmpty()){ - return false; - } + if (f3 > p_75639_3_) + { + f3 = p_75639_3_; } - return true; + if (f3 < -p_75639_3_) + { + f3 = -p_75639_3_; + } + + return p_75639_1_ + f3; + } + + /** + * Sets the speed and location to move to + */ + public void setMoveTo(double p_75642_1_, double p_75642_3_, double p_75642_5_, double p_75642_7_) + { + this.posX = p_75642_1_; + this.posY = p_75642_3_; + this.posZ = p_75642_5_; + this.speed = p_75642_7_; + this.update = true; + } + + public boolean isUpdating() + { + return this.update; + } + + public double getSpeed() + { + return this.speed; } } diff --git a/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java b/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java index c2187dbeb..3e0bf41ee 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java @@ -1,25 +1,511 @@ package noppes.npcs.ai.pathfinder; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.IAttributeInstance; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.passive.EntityChicken; +import net.minecraft.init.Blocks; +import net.minecraft.pathfinding.PathEntity; import net.minecraft.pathfinding.PathFinder; +import net.minecraft.pathfinding.PathNavigate; +import net.minecraft.pathfinding.PathPoint; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraft.world.ChunkCache; import net.minecraft.world.World; +import noppes.npcs.entity.EntityNPCInterface; -public class PathNavigateFlying extends PathNavigateSwimmer { +public class PathNavigateFlying extends PathNavigate { + private EntityNPCInterface theEntity; + private World worldObj; + /** The PathEntity being followed. */ + private PathEntity currentPath; + private double speed; + /** The number of blocks (extra) +/- in each axis that get pulled out as cache for the pathfinder's search space */ + private IAttributeInstance pathSearchRange; + private boolean noSunPathfind; + /** Time, in number of ticks, following the current path */ + private int totalTicks; + /** The time when the last position check was done (to detect successful movement) */ + private int ticksAtLastPos; + /** Coordinates of the entity's position last time a check was done (part of monitoring getting 'stuck') */ + private Vec3 lastPosCheck = Vec3.createVectorHelper(0.0D, 0.0D, 0.0D); + /** Specifically, if a wooden door block is even considered to be passable by the pathfinder */ + private boolean canPassOpenWoodenDoors = true; + /** If door blocks are considered passable even when closed */ + private boolean canPassClosedWoodenDoors; + /** If water blocks are avoided (at least by the pathfinder) */ + private boolean avoidsWater; + /** + * If the entity can swim. Swimming AI enables this and the pathfinder will also cause the entity to swim straight + * upwards when underwater + */ + private boolean canSwim; + private static final String __OBFID = "CL_00001627"; - public PathNavigateFlying(EntityLiving p_i45873_1_, World worldIn) { - super(p_i45873_1_, worldIn); - } - - protected PathFinder getPathFinder() + public PathNavigateFlying(EntityLiving p_i45873_1_, World worldIn) { + super(p_i45873_1_, worldIn); + this.theEntity = (EntityNPCInterface)p_i45873_1_; + this.worldObj = worldIn; + this.pathSearchRange = p_i45873_1_.getEntityAttribute(SharedMonsterAttributes.followRange); + } + + public void setAvoidsWater(boolean p_75491_1_) { - return new NPCPathFinder(new FlyNodeProcessor()); + this.avoidsWater = p_75491_1_; + } + + public boolean getAvoidsWater() + { + return this.avoidsWater; + } + + public void setBreakDoors(boolean p_75498_1_) + { + this.canPassClosedWoodenDoors = p_75498_1_; + } + + /** + * Sets if the entity can enter open doors + */ + public void setEnterDoors(boolean p_75490_1_) + { + this.canPassOpenWoodenDoors = p_75490_1_; + } + + /** + * Returns true if the entity can break doors, false otherwise + */ + public boolean getCanBreakDoors() + { + return this.canPassClosedWoodenDoors; + } + + /** + * Sets if the path should avoid sunlight + */ + public void setAvoidSun(boolean p_75504_1_) + { + this.noSunPathfind = p_75504_1_; + } + + /** + * Sets the speed + */ + public void setSpeed(double p_75489_1_) + { + this.speed = p_75489_1_; + } + + /** + * Sets if the entity can swim + */ + public void setCanSwim(boolean p_75495_1_) + { + this.canSwim = p_75495_1_; + } + + /** + * Gets the maximum distance that the path finding will search in. + */ + public float getPathSearchRange() + { + return (float)this.pathSearchRange.getAttributeValue(); + } + + /** + * Returns the path to the given coordinates + */ + public PathEntity getPathToXYZ(double p_75488_1_, double p_75488_3_, double p_75488_5_) + { + return !this.canNavigate() ? null : this.getEntityPathToXYZ(this.theEntity, MathHelper.floor_double(p_75488_1_), (int)p_75488_3_, MathHelper.floor_double(p_75488_5_), this.getPathSearchRange(), this.canPassOpenWoodenDoors, this.canPassClosedWoodenDoors, this.avoidsWater, this.canSwim); + } + + /** + * Try to find and set a path to XYZ. Returns true if successful. + */ + public boolean tryMoveToXYZ(double p_75492_1_, double p_75492_3_, double p_75492_5_, double p_75492_7_) + { + PathEntity pathentity = this.getPathToXYZ((double)MathHelper.floor_double(p_75492_1_), (double)((int)p_75492_3_), (double)MathHelper.floor_double(p_75492_5_)); + return this.setPath(pathentity, p_75492_7_); + } + + /** + * Returns the path to the given EntityLiving + */ + public PathEntity getPathToEntityLiving(Entity p_75494_1_) + { + return !this.canNavigate() ? null : this.getPathEntityToEntity(this.theEntity, p_75494_1_, this.getPathSearchRange(), this.canPassOpenWoodenDoors, this.canPassClosedWoodenDoors, this.avoidsWater, this.canSwim); + } + + /** + * Try to find and set a path to EntityLiving. Returns true if successful. + */ + public boolean tryMoveToEntityLiving(Entity p_75497_1_, double p_75497_2_) + { + PathEntity pathentity = this.getPathToEntityLiving(p_75497_1_); + return pathentity != null ? this.setPath(pathentity, p_75497_2_) : false; + } + + /** + * sets the active path data if path is 100% unique compared to old path, checks to adjust path for sun avoiding + * ents and stores end coords + */ + public boolean setPath(PathEntity p_75484_1_, double p_75484_2_) + { + if (p_75484_1_ == null) + { + this.currentPath = null; + return false; + } + else + { + if (!p_75484_1_.isSamePath(this.currentPath)) + { + this.currentPath = p_75484_1_; + } + + if (this.noSunPathfind) + { + this.removeSunnyPath(); + } + + if (this.currentPath.getCurrentPathLength() == 0) + { + return false; + } + else + { + this.speed = p_75484_2_; + Vec3 vec3 = this.getEntityPosition(); + this.ticksAtLastPos = this.totalTicks; + this.lastPosCheck.xCoord = vec3.xCoord; + this.lastPosCheck.yCoord = vec3.yCoord; + this.lastPosCheck.zCoord = vec3.zCoord; + return true; + } + } + } + + /** + * gets the actively used PathEntity + */ + public PathEntity getPath() + { + return this.currentPath; + } + + public void onUpdateNavigation() + { + ++this.totalTicks; + + if (!this.noPath()) + { + if (this.canNavigate()) + { + this.pathFollow(); + } + + if (!this.noPath()) + { + Vec3 vec3 = this.currentPath.getPosition(this.theEntity); + + if (vec3 != null) + { + this.theEntity.getMoveHelper().setMoveTo(vec3.xCoord, vec3.yCoord, vec3.zCoord, this.speed); + } + } + } + } + + private void pathFollow() + { + Vec3 vec3 = this.getEntityPosition(); + int i = this.currentPath.getCurrentPathLength(); + + for (int j = this.currentPath.getCurrentPathIndex(); j < this.currentPath.getCurrentPathLength(); ++j) + { + if (this.currentPath.getPathPointFromIndex(j).yCoord != (int)vec3.yCoord) + { + i = j; + break; + } + } + + float f = this.theEntity.width * this.theEntity.width; + int k; + + for (k = this.currentPath.getCurrentPathIndex(); k < i; ++k) + { + if (vec3.squareDistanceTo(this.currentPath.getVectorFromIndex(this.theEntity, k)) < (double)f) + { + this.currentPath.setCurrentPathIndex(k + 1); + } + } + + k = MathHelper.ceiling_float_int(this.theEntity.width); + int l = (int)this.theEntity.height + 1; + int i1 = k; + + for (int j1 = i - 1; j1 >= this.currentPath.getCurrentPathIndex(); --j1) + { + if (this.isDirectPathBetweenPoints(vec3, this.currentPath.getVectorFromIndex(this.theEntity, j1), k, l, i1)) + { + this.currentPath.setCurrentPathIndex(j1); + break; + } + } + + if (this.totalTicks - this.ticksAtLastPos > 100) + { + if (vec3.squareDistanceTo(this.lastPosCheck) < 2.25D) + { + this.clearPathEntity(); + } + + this.ticksAtLastPos = this.totalTicks; + this.lastPosCheck.xCoord = vec3.xCoord; + this.lastPosCheck.yCoord = vec3.yCoord; + this.lastPosCheck.zCoord = vec3.zCoord; + } + } + + /** + * If null path or reached the end + */ + public boolean noPath() + { + return this.currentPath == null || this.currentPath.isFinished(); + } + + /** + * sets active PathEntity to null + */ + public void clearPathEntity() + { + this.currentPath = null; + } + + private Vec3 getEntityPosition() + { + return Vec3.createVectorHelper(this.theEntity.posX, (double)this.getPathableYPos(), this.theEntity.posZ); + } + + /** + * Gets the safe pathing Y position for the entity depending on if it can path swim or not + */ + private int getPathableYPos() + { + int i = (int)this.theEntity.boundingBox.minY; + Block block = this.worldObj.getBlock(MathHelper.floor_double(this.theEntity.posX), i, MathHelper.floor_double(this.theEntity.posZ)); + int j = 0; + + do + { + if (block != Blocks.air) + { + return i; + } + + ++i; + block = this.worldObj.getBlock(MathHelper.floor_double(this.theEntity.posX), i, MathHelper.floor_double(this.theEntity.posZ)); + ++j; + } + while (j <= 16); + + return (int)(this.theEntity.boundingBox.minY + 0.5D); } /** * If on ground or swimming and can swim */ - protected boolean canNavigate() + private boolean canNavigate() { return true; } + + /** + * Returns true when an entity could stand at a position, including solid blocks under the entire entity. Args: + * xOffset, yOffset, zOffset, entityXSize, entityYSize, entityZSize, originPosition, vecX, vecZ + */ + private boolean isSafeToStandAt(int p_75483_1_, int p_75483_2_, int p_75483_3_, int p_75483_4_, int p_75483_5_, int p_75483_6_, Vec3 p_75483_7_, double p_75483_8_, double p_75483_10_) + { + return true; + } + + /** + * Trims path data from the end to the first sun covered block + */ + private void removeSunnyPath() + { + if (!this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.theEntity.posX), (int)(this.theEntity.boundingBox.minY + 0.5D), MathHelper.floor_double(this.theEntity.posZ))) + { + for (int i = 0; i < this.currentPath.getCurrentPathLength(); ++i) + { + PathPoint pathpoint = this.currentPath.getPathPointFromIndex(i); + + if (this.worldObj.canBlockSeeTheSky(pathpoint.xCoord, pathpoint.yCoord, pathpoint.zCoord)) + { + this.currentPath.setCurrentPathLength(i - 1); + return; + } + } + } + } + + /** + * Returns true when an entity of specified size could safely walk in a straight line between the two points. Args: + * pos1, pos2, entityXSize, entityYSize, entityZSize + */ + private boolean isDirectPathBetweenPoints(Vec3 p_75493_1_, Vec3 p_75493_2_, int p_75493_3_, int p_75493_4_, int p_75493_5_) + { + int l = MathHelper.floor_double(p_75493_1_.xCoord); + int i1 = MathHelper.floor_double(p_75493_1_.zCoord); + double d0 = p_75493_2_.xCoord - p_75493_1_.xCoord; + double d1 = p_75493_2_.zCoord - p_75493_1_.zCoord; + double d2 = d0 * d0 + d1 * d1; + + if (d2 < 1.0E-8D) + { + return false; + } + else + { + double d3 = 1.0D / Math.sqrt(d2); + d0 *= d3; + d1 *= d3; + p_75493_3_ += 2; + p_75493_5_ += 2; + + if (!this.isSafeToStandAt(l, (int)p_75493_1_.yCoord, i1, p_75493_3_, p_75493_4_, p_75493_5_, p_75493_1_, d0, d1)) + { + return false; + } + else + { + p_75493_3_ -= 2; + p_75493_5_ -= 2; + double d4 = 1.0D / Math.abs(d0); + double d5 = 1.0D / Math.abs(d1); + double d6 = (double)(l * 1) - p_75493_1_.xCoord; + double d7 = (double)(i1 * 1) - p_75493_1_.zCoord; + + if (d0 >= 0.0D) + { + ++d6; + } + + if (d1 >= 0.0D) + { + ++d7; + } + + d6 /= d0; + d7 /= d1; + int j1 = d0 < 0.0D ? -1 : 1; + int k1 = d1 < 0.0D ? -1 : 1; + int l1 = MathHelper.floor_double(p_75493_2_.xCoord); + int i2 = MathHelper.floor_double(p_75493_2_.zCoord); + int j2 = l1 - l; + int k2 = i2 - i1; + + do + { + if (j2 * j1 <= 0 && k2 * k1 <= 0) + { + return true; + } + + if (d6 < d7) + { + d6 += d4; + l += j1; + j2 = l1 - l; + } + else + { + d7 += d5; + i1 += k1; + k2 = i2 - i1; + } + } + while (this.isSafeToStandAt(l, (int)p_75493_1_.yCoord, i1, p_75493_3_, p_75493_4_, p_75493_5_, p_75493_1_, d0, d1)); + + return false; + } + } + } + + /** + * Returns true if an entity does not collide with any solid blocks at the position. Args: xOffset, yOffset, + * zOffset, entityXSize, entityYSize, entityZSize, originPosition, vecX, vecZ + */ + private boolean isPositionClear(int p_75496_1_, int p_75496_2_, int p_75496_3_, int p_75496_4_, int p_75496_5_, int p_75496_6_, Vec3 p_75496_7_, double p_75496_8_, double p_75496_10_) + { + for (int k1 = p_75496_1_; k1 < p_75496_1_ + p_75496_4_; ++k1) + { + for (int l1 = p_75496_2_; l1 < p_75496_2_ + p_75496_5_; ++l1) + { + for (int i2 = p_75496_3_; i2 < p_75496_3_ + p_75496_6_; ++i2) + { + double d2 = (double)k1 + 0.5D - p_75496_7_.xCoord; + double d3 = (double)i2 + 0.5D - p_75496_7_.zCoord; + + if (d2 * p_75496_8_ + d3 * p_75496_10_ >= 0.0D) + { + Block block = this.worldObj.getBlock(k1, l1, i2); + + if (!block.getBlocksMovement(this.worldObj, k1, l1, i2)) + { + return false; + } + } + } + } + } + + return true; + } + + public PathEntity getPathEntityToEntity(Entity p_72865_1_, Entity p_72865_2_, float p_72865_3_, boolean p_72865_4_, boolean p_72865_5_, boolean p_72865_6_, boolean p_72865_7_) + { + this.theEntity.worldObj.theProfiler.startSection("pathfind"); + int i = MathHelper.floor_double(p_72865_1_.posX); + int j = MathHelper.floor_double(p_72865_1_.posY + 1.0D); + int k = MathHelper.floor_double(p_72865_1_.posZ); + int l = (int)(p_72865_3_ + 16.0F); + int i1 = i - l; + int j1 = j - l; + int k1 = k - l; + int l1 = i + l; + int i2 = j + l; + int j2 = k + l; + ChunkCache chunkcache = new ChunkCache(this.theEntity.worldObj, i1, j1, k1, l1, i2, j2, 0); + PathEntity pathentity = (new PathFinder(chunkcache, p_72865_4_, p_72865_5_, p_72865_6_, p_72865_7_)).createEntityPathTo(p_72865_1_, p_72865_2_, p_72865_3_); + this.theEntity.worldObj.theProfiler.endSection(); + return pathentity; + } + + public PathEntity getEntityPathToXYZ(Entity p_72844_1_, int p_72844_2_, int p_72844_3_, int p_72844_4_, float p_72844_5_, boolean p_72844_6_, boolean p_72844_7_, boolean p_72844_8_, boolean p_72844_9_) + { + this.theEntity.worldObj.theProfiler.startSection("pathfind"); + int l = MathHelper.floor_double(p_72844_1_.posX); + int i1 = MathHelper.floor_double(p_72844_1_.posY); + int j1 = MathHelper.floor_double(p_72844_1_.posZ); + int k1 = (int)(p_72844_5_ + 8.0F); + int l1 = l - k1; + int i2 = i1 - k1; + int j2 = j1 - k1; + int k2 = l + k1; + int l2 = i1 + k1; + int i3 = j1 + k1; + ChunkCache chunkcache = new ChunkCache(this.theEntity.worldObj, l1, i2, j2, k2, l2, i3, 0); + PathEntity pathentity = (new PathFinder(chunkcache, p_72844_6_, p_72844_7_, p_72844_8_, p_72844_9_)).createEntityPathTo(p_72844_1_, p_72844_2_, p_72844_3_, p_72844_4_, p_72844_5_); + this.theEntity.worldObj.theProfiler.endSection(); + return pathentity; + } } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 610ac8055..85c53a223 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -31,7 +31,7 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { public void onLivingUpdate() { - if(!canFly()){ + if(!canFly() || this.isJumping){ super.onLivingUpdate(); return; } @@ -41,23 +41,24 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { if(isEntityAlive()) { if (!this.worldObj.isRemote) { - Entity entity = this.getAttackTarget(); - if (entity != null && entity.isEntityAlive()) { - double d0 = entity.posX - this.posX; - double d2 = entity.posZ - this.posZ; - double d3 = d0 * d0 + d2 * d2; + Entity target = this.getAttackTarget(); + if (target != null && target.isEntityAlive()) { + double d0 = target.posX - this.posX; + double d1 = target.posY - this.posY; + double d2 = target.posZ - this.posZ; + double d4 = d0 * d0 + d1 * d1 + d2 * d2; if(this.hurtTime == 0) { - if (this.posY != entity.posY) { - if (this.motionY * Math.signum(this.posY - entity.posY) > 0.0D) { + if (this.posY != target.posY) { + if (this.motionY * Math.signum(this.posY - target.posY) > 0.0D) { this.motionY = 0.0D; } - this.motionY -= Math.signum(this.posY - entity.posY) * (speed * speedMult) * this.ai.flySpeed; + this.motionY -= Math.signum(this.posY - target.posY) * (speed * speedMult) * this.ai.flySpeed; } - if (d3 > 9.0D) { - double d5 = MathHelper.sqrt_double(d3); + if (d4 > 0.5D) { + double d5 = MathHelper.sqrt_double(d4); this.motionX += (d0 / d5 * speed - this.motionX) * speed * speedMult; this.motionZ += (d2 / d5 * speed - this.motionZ) * speed * speedMult; } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 79c43f23a..2ac01b37e 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -20,7 +20,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemBow; import net.minecraft.item.ItemStack; @@ -60,8 +59,8 @@ import noppes.npcs.ai.EntityAIMoveIndoors; import noppes.npcs.ai.EntityAIPanic; import noppes.npcs.ai.EntityAIWander; import noppes.npcs.ai.EntityAIWatchClosest; +import noppes.npcs.ai.pathfinder.FlyingMoveHelper; import noppes.npcs.ai.pathfinder.PathNavigateFlying; -import noppes.npcs.ai.pathfinder.PathNavigateGround; import noppes.npcs.ai.selector.NPCAttackSelector; import noppes.npcs.ai.target.EntityAIClearTarget; import noppes.npcs.ai.target.EntityAIClosestTarget; @@ -96,7 +95,6 @@ import noppes.npcs.roles.RoleCompanion; import noppes.npcs.roles.RoleFollower; import noppes.npcs.roles.RoleInterface; import noppes.npcs.scripted.entity.ScriptNpc; -import noppes.npcs.scripted.entity.ScriptPlayer; import noppes.npcs.scripted.event.ScriptEventAttack; import noppes.npcs.scripted.event.ScriptEventDamaged; import noppes.npcs.scripted.event.ScriptEventKilled; @@ -156,12 +154,19 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti public boolean updateAI = false; // Fly Change - //public EntityMoveHelper moveHelper; - public PathNavigate navigator; + public FlyingMoveHelper flyMoveHelper = new FlyingMoveHelper(this); + public PathNavigate flyNavigator = new PathNavigateFlying(this, worldObj); public EntityNPCInterface(World world) { super(world); try{ + if (canFly()) { + this.getNavigator().setCanSwim(true); + this.tasks.addTask(0, new EntityAISwimming(this)); + } else { + this.tasks.addTask(0, new EntityAIWaterNav(this)); + } + dialogs = new HashMap(); if(!CustomNpcs.DefaultInteractLine.isEmpty()) advanced.interactLines.lines.put(0, new Line(CustomNpcs.DefaultInteractLine)); @@ -405,6 +410,29 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti return true; } + + public PathNavigate getNavigator() { + if(canFly() && !this.onGround) + return this.flyNavigator; + else { + return super.getNavigator(); + } + } + + public EntityMoveHelper getMoveHelper() { + if(canFly() && !this.onGround) + return this.flyMoveHelper; + else { + return super.getMoveHelper(); + } + } + + protected void updateAITasks() + { + super.updateAITasks(); + this.getNavigator().onUpdateNavigation(); + this.getMoveHelper().onUpdateMoveHelper(); + } public void addInteract(EntityLivingBase entity){ if( !ai.stopAndInteract || isAttacking() || !entity.isEntityAlive()) @@ -600,15 +628,10 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti this.targetTasks.addTask(3, new EntityAIOwnerHurtByTarget(this)); this.targetTasks.addTask(4, new EntityAIOwnerHurtTarget(this)); - if(canFly()){ - //this.moveHelper = new FlyingMoveHelper(this); - this.navigator = new PathNavigateFlying(this, worldObj); + if (canFly()) { this.getNavigator().setCanSwim(true); this.tasks.addTask(0, new EntityAISwimming(this)); - } - else{ - //this.moveHelper = new EntityMoveHelper(this); - this.navigator = new PathNavigateGround(this, worldObj); + } else { this.tasks.addTask(0, new EntityAIWaterNav(this)); } From 922708bf9774d3e07d854306ecffb45037f98ae8 Mon Sep 17 00:00:00 2001 From: luisc Date: Tue, 7 Dec 2021 23:52:57 -0600 Subject: [PATCH 12/54] Changed npc field in ScriptNpc to EntityNPCInterface --- .../npcs/scripted/entity/ScriptNpc.java | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 02fcde002..879d0f96e 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -36,11 +36,11 @@ import java.util.ArrayList; import java.util.UUID; public class ScriptNpc extends ScriptLiving implements ICustomNpc { - public EntityCustomNpc npc; + public EntityNPCInterface npc; public ScriptNpc(T npc){ super(npc); - this.npc = (EntityCustomNpc)npc; + this.npc = npc; } /** @@ -789,35 +789,43 @@ public class ScriptNpc extends ScriptLiving imp } public void setHeadScale(float x, float y, float z){ - npc.modelData.head.scaleX = ValueUtil.correctFloat(x, 0.5f, 1.5f); - npc.modelData.head.scaleY = ValueUtil.correctFloat(y, 0.5f, 1.5f); - npc.modelData.head.scaleZ = ValueUtil.correctFloat(z, 0.5f, 1.5f); - - npc.script.clientNeedsUpdate = true; + if(npc instanceof EntityCustomNpc) { + ((EntityCustomNpc) this.npc).modelData.head.scaleX = ValueUtil.correctFloat(x, 0.5f, 1.5f); + ((EntityCustomNpc) this.npc).modelData.head.scaleY = ValueUtil.correctFloat(y, 0.5f, 1.5f); + ((EntityCustomNpc) this.npc).modelData.head.scaleZ = ValueUtil.correctFloat(z, 0.5f, 1.5f); + + npc.script.clientNeedsUpdate = true; + } } public void setBodyScale(float x, float y, float z){ - npc.modelData.body.scaleX = ValueUtil.correctFloat(x, 0.5f, 1.5f); - npc.modelData.body.scaleY = ValueUtil.correctFloat(y, 0.5f, 1.5f); - npc.modelData.body.scaleZ = ValueUtil.correctFloat(z, 0.5f, 1.5f); - - npc.script.clientNeedsUpdate = true; + if(npc instanceof EntityCustomNpc) { + ((EntityCustomNpc) this.npc).modelData.body.scaleX = ValueUtil.correctFloat(x, 0.5f, 1.5f); + ((EntityCustomNpc) this.npc).modelData.body.scaleY = ValueUtil.correctFloat(y, 0.5f, 1.5f); + ((EntityCustomNpc) this.npc).modelData.body.scaleZ = ValueUtil.correctFloat(z, 0.5f, 1.5f); + + npc.script.clientNeedsUpdate = true; + } } public void setArmsScale(float x, float y, float z){ - npc.modelData.arms.scaleX = ValueUtil.correctFloat(x, 0.5f, 1.5f); - npc.modelData.arms.scaleY = ValueUtil.correctFloat(y, 0.5f, 1.5f); - npc.modelData.arms.scaleZ = ValueUtil.correctFloat(z, 0.5f, 1.5f); - - npc.script.clientNeedsUpdate = true; + if(npc instanceof EntityCustomNpc) { + ((EntityCustomNpc) this.npc).modelData.arms.scaleX = ValueUtil.correctFloat(x, 0.5f, 1.5f); + ((EntityCustomNpc) this.npc).modelData.arms.scaleY = ValueUtil.correctFloat(y, 0.5f, 1.5f); + ((EntityCustomNpc) this.npc).modelData.arms.scaleZ = ValueUtil.correctFloat(z, 0.5f, 1.5f); + + npc.script.clientNeedsUpdate = true; + } } public void setLegsScale(float x, float y, float z){ - npc.modelData.legs.scaleX = ValueUtil.correctFloat(x, 0.5f, 1.5f); - npc.modelData.legs.scaleY = ValueUtil.correctFloat(y, 0.5f, 1.5f); - npc.modelData.legs.scaleZ = ValueUtil.correctFloat(z, 0.5f, 1.5f); - - npc.script.clientNeedsUpdate = true; + if(npc instanceof EntityCustomNpc) { + ((EntityCustomNpc) this.npc).modelData.legs.scaleX = ValueUtil.correctFloat(x, 0.5f, 1.5f); + ((EntityCustomNpc) this.npc).modelData.legs.scaleY = ValueUtil.correctFloat(y, 0.5f, 1.5f); + ((EntityCustomNpc) this.npc).modelData.legs.scaleZ = ValueUtil.correctFloat(z, 0.5f, 1.5f); + + npc.script.clientNeedsUpdate = true; + } } /** From 2147bd00d0b227a90e051c4a25ae615a9fb7cdfc Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 04:00:28 -0600 Subject: [PATCH 13/54] Pathing classes for NPC flying added. NPCs can now follow tactical variants while flying, and their pathing is a LOT better. --- .../noppes/npcs/ai/pathfinder/FlyPath.java | 173 +++++++ .../npcs/ai/pathfinder/FlyPathEntity.java | 130 +++++ .../npcs/ai/pathfinder/FlyPathFinder.java | 448 ++++++++++++++++++ .../npcs/ai/pathfinder/FlyPathPoint.java | 96 ++++ .../npcs/ai/pathfinder/FlyingMoveHelper.java | 36 +- .../ai/pathfinder/PathNavigateFlying.java | 27 +- .../noppes/npcs/entity/EntityNPCFlying.java | 43 +- .../npcs/entity/EntityNPCInterface.java | 4 +- 8 files changed, 888 insertions(+), 69 deletions(-) create mode 100644 src/main/java/noppes/npcs/ai/pathfinder/FlyPath.java create mode 100644 src/main/java/noppes/npcs/ai/pathfinder/FlyPathEntity.java create mode 100644 src/main/java/noppes/npcs/ai/pathfinder/FlyPathFinder.java create mode 100644 src/main/java/noppes/npcs/ai/pathfinder/FlyPathPoint.java diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyPath.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyPath.java new file mode 100644 index 000000000..1f36db860 --- /dev/null +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyPath.java @@ -0,0 +1,173 @@ +package noppes.npcs.ai.pathfinder; + +public class FlyPath { + private FlyPathPoint[] pathPoints = new FlyPathPoint[1024]; + /** The number of points in this path */ + private int count; + private static final String __OBFID = "CL_00000573"; + + /** + * Adds a point to the path + */ + public FlyPathPoint addPoint(FlyPathPoint p_75849_1_) + { + if (p_75849_1_.index >= 0) + { + throw new IllegalStateException("OW KNOWS!"); + } + else + { + if (this.count == this.pathPoints.length) + { + FlyPathPoint[] apathpoint = new FlyPathPoint[this.count << 1]; + System.arraycopy(this.pathPoints, 0, apathpoint, 0, this.count); + this.pathPoints = apathpoint; + } + + this.pathPoints[this.count] = p_75849_1_; + p_75849_1_.index = this.count; + this.sortBack(this.count++); + return p_75849_1_; + } + } + + /** + * Clears the path + */ + public void clearPath() + { + this.count = 0; + } + + /** + * Returns and removes the first point in the path + */ + public FlyPathPoint dequeue() + { + FlyPathPoint pathpoint = this.pathPoints[0]; + this.pathPoints[0] = this.pathPoints[--this.count]; + this.pathPoints[this.count] = null; + + if (this.count > 0) + { + this.sortForward(0); + } + + pathpoint.index = -1; + return pathpoint; + } + + /** + * Changes the provided point's distance to target + */ + public void changeDistance(FlyPathPoint p_75850_1_, float p_75850_2_) + { + float f1 = p_75850_1_.distanceToTarget; + p_75850_1_.distanceToTarget = p_75850_2_; + + if (p_75850_2_ < f1) + { + this.sortBack(p_75850_1_.index); + } + else + { + this.sortForward(p_75850_1_.index); + } + } + + /** + * Sorts a point to the left + */ + private void sortBack(int p_75847_1_) + { + FlyPathPoint pathpoint = this.pathPoints[p_75847_1_]; + int j; + + for (float f = pathpoint.distanceToTarget; p_75847_1_ > 0; p_75847_1_ = j) + { + j = p_75847_1_ - 1 >> 1; + FlyPathPoint pathpoint1 = this.pathPoints[j]; + + if (f >= pathpoint1.distanceToTarget) + { + break; + } + + this.pathPoints[p_75847_1_] = pathpoint1; + pathpoint1.index = p_75847_1_; + } + + this.pathPoints[p_75847_1_] = pathpoint; + pathpoint.index = p_75847_1_; + } + + /** + * Sorts a point to the right + */ + private void sortForward(int p_75846_1_) + { + FlyPathPoint pathpoint = this.pathPoints[p_75846_1_]; + float f = pathpoint.distanceToTarget; + + while (true) + { + int j = 1 + (p_75846_1_ << 1); + int k = j + 1; + + if (j >= this.count) + { + break; + } + + FlyPathPoint pathpoint1 = this.pathPoints[j]; + float f1 = pathpoint1.distanceToTarget; + FlyPathPoint pathpoint2; + float f2; + + if (k >= this.count) + { + pathpoint2 = null; + f2 = Float.POSITIVE_INFINITY; + } + else + { + pathpoint2 = this.pathPoints[k]; + f2 = pathpoint2.distanceToTarget; + } + + if (f1 < f2) + { + if (f1 >= f) + { + break; + } + + this.pathPoints[p_75846_1_] = pathpoint1; + pathpoint1.index = p_75846_1_; + p_75846_1_ = j; + } + else + { + if (f2 >= f) + { + break; + } + + this.pathPoints[p_75846_1_] = pathpoint2; + pathpoint2.index = p_75846_1_; + p_75846_1_ = k; + } + } + + this.pathPoints[p_75846_1_] = pathpoint; + pathpoint.index = p_75846_1_; + } + + /** + * Returns true if this path contains no points + */ + public boolean isPathEmpty() + { + return this.count == 0; + } +} diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyPathEntity.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyPathEntity.java new file mode 100644 index 000000000..a6715e6c6 --- /dev/null +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyPathEntity.java @@ -0,0 +1,130 @@ +package noppes.npcs.ai.pathfinder; + +import net.minecraft.entity.Entity; +import net.minecraft.pathfinding.PathEntity; +import net.minecraft.pathfinding.PathPoint; +import net.minecraft.util.Vec3; + +public class FlyPathEntity extends PathEntity{ + public final PathPoint[] points; + /** PathEntity Array Index the Entity is currently targeting */ + public int currentPathIndex; + /** The total length of the path */ + public int pathLength; + private static final String __OBFID = "CL_00000575"; + + public FlyPathEntity(PathPoint[] p_i2136_1_) + { + super(p_i2136_1_); + this.points = p_i2136_1_; + this.pathLength = p_i2136_1_.length; + } + + /** + * Directs this path to the next point in its array + */ + public void incrementPathIndex() + { + ++this.currentPathIndex; + } + + /** + * Returns true if this path has reached the end + */ + public boolean isFinished() + { + return this.currentPathIndex >= this.pathLength; + } + + /** + * returns the last PathPoint of the Array + */ + public PathPoint getFinalPathPoint() + { + return this.pathLength > 0 ? this.points[this.pathLength - 1] : null; + } + + /** + * return the PathPoint located at the specified PathIndex, usually the current one + */ + public PathPoint getPathPointFromIndex(int p_75877_1_) + { + return this.points[p_75877_1_]; + } + + public int getCurrentPathLength() + { + return this.pathLength; + } + + public void setCurrentPathLength(int p_75871_1_) + { + this.pathLength = p_75871_1_; + } + + public int getCurrentPathIndex() + { + return this.currentPathIndex; + } + + public void setCurrentPathIndex(int p_75872_1_) + { + this.currentPathIndex = p_75872_1_; + } + + /** + * Gets the vector of the PathPoint associated with the given index. + */ + public Vec3 getVectorFromIndex(Entity p_75881_1_, int p_75881_2_) + { + double d0 = (double)this.points[p_75881_2_].xCoord + (double)((int)(p_75881_1_.width + 1.0F)) * 0.5D; + double d1 = (double)this.points[p_75881_2_].yCoord; + double d2 = (double)this.points[p_75881_2_].zCoord + (double)((int)(p_75881_1_.width + 1.0F)) * 0.5D; + return Vec3.createVectorHelper(d0, d1, d2); + } + + /** + * returns the current PathEntity target node as Vec3D + */ + public Vec3 getPosition(Entity p_75878_1_) + { + return this.getVectorFromIndex(p_75878_1_, this.currentPathIndex); + } + + /** + * Returns true if the EntityPath are the same. Non instance related equals. + */ + public boolean isSamePath(PathEntity pathEntity) + { + FlyPathEntity p_75876_1_ = (FlyPathEntity) pathEntity; + if (p_75876_1_ == null) + { + return false; + } + else if (p_75876_1_.points.length != this.points.length) + { + return false; + } + else + { + for (int i = 0; i < this.points.length; ++i) + { + if (this.points[i].xCoord != p_75876_1_.points[i].xCoord || this.points[i].yCoord != p_75876_1_.points[i].yCoord || this.points[i].zCoord != p_75876_1_.points[i].zCoord) + { + return false; + } + } + + return true; + } + } + + /** + * Returns true if the final PathPoint in the PathEntity is equal to Vec3D coords. + */ + public boolean isDestinationSame(Vec3 p_75880_1_) + { + PathPoint pathpoint = this.getFinalPathPoint(); + return pathpoint == null ? false : pathpoint.xCoord == (int)p_75880_1_.xCoord && pathpoint.zCoord == (int)p_75880_1_.zCoord; + } +} diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyPathFinder.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyPathFinder.java new file mode 100644 index 000000000..9673520d5 --- /dev/null +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyPathFinder.java @@ -0,0 +1,448 @@ +package noppes.npcs.ai.pathfinder; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.pathfinding.PathFinder; +import net.minecraft.util.IntHashMap; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; + +public class FlyPathFinder extends PathFinder +{ + /** Used to find obstacles */ + private IBlockAccess worldMap; + /** The path being generated */ + private FlyPath path = new FlyPath(); + /** The points in the path */ + private IntHashMap pointMap = new IntHashMap(); + /** Selection of path points to add to the path */ + private FlyPathPoint[] pathOptions = new FlyPathPoint[32]; + /** should the PathFinder go through wodden door blocks */ + private boolean isWoddenDoorAllowed; + /** should the PathFinder disregard BlockMovement type materials in its path */ + private boolean isMovementBlockAllowed; + private boolean isPathingInWater; + /** tells the FathFinder to not stop pathing underwater */ + private boolean canEntityDrown; + private static final String __OBFID = "CL_00000576"; + + public FlyPathFinder(IBlockAccess p_i2137_1_, boolean p_i2137_2_, boolean p_i2137_3_, boolean p_i2137_4_, boolean p_i2137_5_) + { + super(p_i2137_1_,p_i2137_2_,p_i2137_3_,p_i2137_4_,p_i2137_5_); + this.worldMap = p_i2137_1_; + this.isWoddenDoorAllowed = p_i2137_2_; + this.isMovementBlockAllowed = p_i2137_3_; + this.isPathingInWater = p_i2137_4_; + this.canEntityDrown = p_i2137_5_; + } + + /** + * Creates a path from one entity to another within a minimum distance + */ + public FlyPathEntity createEntityPathTo(Entity p_75856_1_, Entity p_75856_2_, float p_75856_3_) + { + return this.createEntityPathTo(p_75856_1_, p_75856_2_.posX, p_75856_2_.boundingBox.minY, p_75856_2_.posZ, p_75856_3_); + } + + /** + * Creates a path from an entity to a specified location within a minimum distance + */ + public FlyPathEntity createEntityPathTo(Entity p_75859_1_, int p_75859_2_, int p_75859_3_, int p_75859_4_, float p_75859_5_) + { + return this.createEntityPathTo(p_75859_1_, (double)((float)p_75859_2_ + 0.5F), (double)((float)p_75859_3_ + 0.5F), (double)((float)p_75859_4_ + 0.5F), p_75859_5_); + } + + /** + * Internal implementation of creating a path from an entity to a point + */ + private FlyPathEntity createEntityPathTo(Entity p_75857_1_, double p_75857_2_, double p_75857_4_, double p_75857_6_, float p_75857_8_) + { + this.path.clearPath(); + this.pointMap.clearMap(); + boolean flag = this.isPathingInWater; + int i = MathHelper.floor_double(p_75857_1_.boundingBox.minY + 0.5D); + + if (this.canEntityDrown && p_75857_1_.isInWater()) + { + i = (int)p_75857_1_.boundingBox.minY; + + for (Block block = this.worldMap.getBlock(MathHelper.floor_double(p_75857_1_.posX), i, MathHelper.floor_double(p_75857_1_.posZ)); block == Blocks.flowing_water || block == Blocks.water; block = this.worldMap.getBlock(MathHelper.floor_double(p_75857_1_.posX), i, MathHelper.floor_double(p_75857_1_.posZ))) + { + ++i; + } + + flag = this.isPathingInWater; + this.isPathingInWater = false; + } + else + { + i = MathHelper.floor_double(p_75857_1_.boundingBox.minY + 0.5D); + } + + FlyPathPoint pathpoint2 = this.openPoint(MathHelper.floor_double(p_75857_1_.boundingBox.minX), i, MathHelper.floor_double(p_75857_1_.boundingBox.minZ)); + FlyPathPoint pathpoint = this.openPoint(MathHelper.floor_double(p_75857_2_ - (double)(p_75857_1_.width / 2.0F)), MathHelper.floor_double(p_75857_4_), MathHelper.floor_double(p_75857_6_ - (double)(p_75857_1_.width / 2.0F))); + FlyPathPoint pathpoint1 = new FlyPathPoint(MathHelper.floor_float(p_75857_1_.width + 1.0F), MathHelper.floor_float(p_75857_1_.height + 1.0F), MathHelper.floor_float(p_75857_1_.width + 1.0F)); + FlyPathEntity pathentity = this.addToPath(p_75857_1_, pathpoint2, pathpoint, pathpoint1, p_75857_8_); + this.isPathingInWater = flag; + return pathentity; + } + + /** + * Adds a path from start to end and returns the whole path (args: unused, start, end, unused, maxDistance) + */ + private FlyPathEntity addToPath(Entity p_75861_1_, FlyPathPoint p_75861_2_, FlyPathPoint p_75861_3_, FlyPathPoint p_75861_4_, float p_75861_5_) + { + p_75861_2_.totalPathDistance = 0.0F; + p_75861_2_.distanceToNext = p_75861_2_.distanceToSquared(p_75861_3_); + p_75861_2_.distanceToTarget = p_75861_2_.distanceToNext; + this.path.clearPath(); + this.path.addPoint(p_75861_2_); + FlyPathPoint pathpoint3 = p_75861_2_; + + while (!this.path.isPathEmpty()) + { + FlyPathPoint pathpoint4 = this.path.dequeue(); + + if (pathpoint4.equals(p_75861_3_)) + { + return this.createEntityPath(p_75861_2_, p_75861_3_); + } + + if (pathpoint4.distanceToSquared(p_75861_3_) < pathpoint3.distanceToSquared(p_75861_3_)) + { + pathpoint3 = pathpoint4; + } + + pathpoint4.isFirst = true; + int i = this.findPathOptions(p_75861_1_, pathpoint4, p_75861_4_, p_75861_3_, p_75861_5_); + + for (int j = 0; j < i; ++j) + { + FlyPathPoint pathpoint5 = this.pathOptions[j]; + float f1 = pathpoint4.totalPathDistance + pathpoint4.distanceToSquared(pathpoint5); + + if (!pathpoint5.isAssigned() || f1 < pathpoint5.totalPathDistance) + { + pathpoint5.previous = pathpoint4; + pathpoint5.totalPathDistance = f1; + pathpoint5.distanceToNext = pathpoint5.distanceToSquared(p_75861_3_); + + if (pathpoint5.isAssigned()) + { + this.path.changeDistance(pathpoint5, pathpoint5.totalPathDistance + pathpoint5.distanceToNext); + } + else + { + pathpoint5.distanceToTarget = pathpoint5.totalPathDistance + pathpoint5.distanceToNext; + this.path.addPoint(pathpoint5); + } + } + } + } + + if (pathpoint3 == p_75861_2_) + { + return null; + } + else + { + return this.createEntityPath(p_75861_2_, pathpoint3); + } + } + + /** + * populates pathOptions with available points and returns the number of options found (args: unused1, currentPoint, + * unused2, targetPoint, maxDistance) + */ + private int findPathOptions(Entity p_75860_1_, FlyPathPoint p_75860_2_, FlyPathPoint p_75860_3_, FlyPathPoint p_75860_4_, float p_75860_5_) + { + int i = 0; + byte b0 = 0; + + if (this.getVerticalOffset(p_75860_1_, p_75860_2_.xCoord, p_75860_2_.yCoord + 1, p_75860_2_.zCoord, p_75860_3_) == 1) + { + b0 = 1; + } + + FlyPathPoint pathpoint3 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord, p_75860_2_.yCoord, p_75860_2_.zCoord + 1, p_75860_3_, b0); + FlyPathPoint pathpoint4 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord - 1, p_75860_2_.yCoord, p_75860_2_.zCoord, p_75860_3_, b0); + FlyPathPoint pathpoint5 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord + 1, p_75860_2_.yCoord, p_75860_2_.zCoord, p_75860_3_, b0); + FlyPathPoint pathpoint6 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord, p_75860_2_.yCoord, p_75860_2_.zCoord - 1, p_75860_3_, b0); + + FlyPathPoint pathpoint7 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord, p_75860_2_.yCoord + 1, p_75860_2_.zCoord + 1, p_75860_3_, b0); + FlyPathPoint pathpoint8 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord - 1, p_75860_2_.yCoord + 1, p_75860_2_.zCoord, p_75860_3_, b0); + FlyPathPoint pathpoint9 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord + 1, p_75860_2_.yCoord + 1, p_75860_2_.zCoord, p_75860_3_, b0); + FlyPathPoint pathpoint10 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord, p_75860_2_.yCoord + 1, p_75860_2_.zCoord - 1, p_75860_3_, b0); + + FlyPathPoint pathpoint11 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord, p_75860_2_.yCoord - 1, p_75860_2_.zCoord + 1, p_75860_3_, b0); + FlyPathPoint pathpoint12 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord - 1, p_75860_2_.yCoord - 1, p_75860_2_.zCoord, p_75860_3_, b0); + FlyPathPoint pathpoint13 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord + 1, p_75860_2_.yCoord - 1, p_75860_2_.zCoord, p_75860_3_, b0); + FlyPathPoint pathpoint14 = this.getSafePoint(p_75860_1_, p_75860_2_.xCoord, p_75860_2_.yCoord - 1, p_75860_2_.zCoord - 1, p_75860_3_, b0); + + if (pathpoint3 != null && !pathpoint3.isFirst && pathpoint3.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint3; + } + + if (pathpoint4 != null && !pathpoint4.isFirst && pathpoint4.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint4; + } + + if (pathpoint5 != null && !pathpoint5.isFirst && pathpoint5.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint5; + } + + if (pathpoint6 != null && !pathpoint6.isFirst && pathpoint6.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint6; + } + + if (pathpoint7 != null && !pathpoint7.isFirst && pathpoint7.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint7; + } + + if (pathpoint8 != null && !pathpoint8.isFirst && pathpoint8.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint8; + } + + if (pathpoint9 != null && !pathpoint9.isFirst && pathpoint9.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint9; + } + + if (pathpoint10 != null && !pathpoint10.isFirst && pathpoint10.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint10; + } + + if (pathpoint11 != null && !pathpoint11.isFirst && pathpoint11.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint11; + } + + if (pathpoint12 != null && !pathpoint12.isFirst && pathpoint12.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint12; + } + + if (pathpoint13 != null && !pathpoint13.isFirst && pathpoint13.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint13; + } + + if (pathpoint14 != null && !pathpoint14.isFirst && pathpoint14.distanceTo(p_75860_4_) < p_75860_5_) + { + this.pathOptions[i++] = pathpoint14; + } + + return i; + } + + /** + * Returns a point that the entity can safely move to + */ + private FlyPathPoint getSafePoint(Entity entity, int blockX, int blockY, int blockZ, FlyPathPoint pathPoint, int verticalOffsetFlag) + { + FlyPathPoint pathpoint1 = null; + int verticalOffset = this.getVerticalOffset(entity, blockX, blockY, blockZ, pathPoint); + + if (verticalOffset == 2) + { + return this.openPoint(blockX, blockY, blockZ); + } + else + { + if (verticalOffset == 1) + { + pathpoint1 = this.openPoint(blockX, blockY, blockZ); + } + + if (pathpoint1 == null && verticalOffsetFlag > 0 && verticalOffset != -3 && verticalOffset != -4 && this.getVerticalOffset(entity, blockX, blockY + verticalOffsetFlag, blockZ, pathPoint) == 1) + { + pathpoint1 = this.openPoint(blockX, blockY + verticalOffsetFlag, blockZ); + blockY += verticalOffsetFlag; + } + + if (pathpoint1 != null) + { + int j1 = 0; + int k1 = 0; + + while (blockY > 0) + { + k1 = this.getVerticalOffset(entity, blockX, blockY - 1, blockZ, pathPoint); + + if (this.isPathingInWater && k1 == -1) + { + return null; + } + + if (k1 != 1) + { + break; + } + + if (j1++ >= entity.getMaxSafePointTries()) + { + return null; + } + + --blockY; + + if (blockY > 0) + { + pathpoint1 = this.openPoint(blockX, blockY, blockZ); + } + } + + if (k1 == -2) + { + return null; + } + } + + return pathpoint1; + } + } + + /** + * Returns a mapped point or creates and adds one + */ + private final FlyPathPoint openPoint(int p_75854_1_, int p_75854_2_, int p_75854_3_) + { + int l = FlyPathPoint.makeHash(p_75854_1_, p_75854_2_, p_75854_3_); + FlyPathPoint pathpoint = (FlyPathPoint)this.pointMap.lookup(l); + + if (pathpoint == null) + { + pathpoint = new FlyPathPoint(p_75854_1_, p_75854_2_, p_75854_3_); + this.pointMap.addKey(l, pathpoint); + } + + return pathpoint; + } + + /** + * Checks if an entity collides with blocks at a position. Returns 1 if clear, 0 for colliding with any solid block, + * -1 for water(if avoiding water) but otherwise clear, -2 for lava, -3 for fence, -4 for closed trapdoor, 2 if + * otherwise clear except for open trapdoor or water(if not avoiding) + */ + public int getVerticalOffset(Entity p_75855_1_, int p_75855_2_, int p_75855_3_, int p_75855_4_, FlyPathPoint p_75855_5_) + { + return canEntityStandAt(p_75855_1_, p_75855_2_, p_75855_3_, p_75855_4_, p_75855_5_, this.isPathingInWater, this.isMovementBlockAllowed, this.isWoddenDoorAllowed); + } + + public static int canEntityStandAt(Entity entity, int blockX, int blockY, int blockZ, FlyPathPoint pathPoint, boolean isPathingInWater, boolean isMovementBlockAllowed, boolean isWoddenDoorAllowed) + { + boolean flag3 = false; + + for (int l = blockX; l < blockX + pathPoint.xCoord; ++l) + { + for (int i1 = blockY; i1 < blockY + pathPoint.yCoord; ++i1) + { + for (int j1 = blockZ; j1 < blockZ + pathPoint.zCoord; ++j1) + { + Block block = entity.worldObj.getBlock(l, i1, j1); + + if(block == Blocks.air) + { + return 2; + } + + if (block == Blocks.trapdoor) + { + flag3 = true; + } + else if (block != Blocks.flowing_water && block != Blocks.water) + { + if (!isWoddenDoorAllowed && block == Blocks.wooden_door) + { + return 0; + } + } + else + { + if (isPathingInWater) + { + return -1; + } + + flag3 = true; + } + + int k1 = block.getRenderType(); + + if (entity.worldObj.getBlock(l, i1, j1).getRenderType() == 9) + { + int j2 = MathHelper.floor_double(entity.posX); + int l1 = MathHelper.floor_double(entity.posY); + int i2 = MathHelper.floor_double(entity.posZ); + + if (entity.worldObj.getBlock(j2, l1, i2).getRenderType() != 9 && entity.worldObj.getBlock(j2, l1 - 1, i2).getRenderType() != 9) + { + return -3; + } + } + else if (!block.getBlocksMovement(entity.worldObj, l, i1, j1) && (!isMovementBlockAllowed || block != Blocks.wooden_door)) + { + if (k1 == 11 || block == Blocks.fence_gate || k1 == 32) + { + return -3; + } + + if (block == Blocks.trapdoor) + { + return -4; + } + + Material material = block.getMaterial(); + + if (material != Material.lava) + { + return 0; + } + + if (!entity.handleLavaMovement()) + { + return -2; + } + } + } + } + } + + return flag3 ? 2 : 1; + } + + /** + * Returns a new FlyPathEntity for a given start and end point + */ + private FlyPathEntity createEntityPath(FlyPathPoint p_75853_1_, FlyPathPoint p_75853_2_) + { + int i = 1; + FlyPathPoint pathpoint2; + + for (pathpoint2 = p_75853_2_; pathpoint2.previous != null; pathpoint2 = pathpoint2.previous) + { + ++i; + } + + FlyPathPoint[] apathpoint = new FlyPathPoint[i]; + pathpoint2 = p_75853_2_; + --i; + + for (apathpoint[i] = p_75853_2_; pathpoint2.previous != null; apathpoint[i] = pathpoint2) + { + pathpoint2 = pathpoint2.previous; + --i; + } + + return new FlyPathEntity(apathpoint); + } +} diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyPathPoint.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyPathPoint.java new file mode 100644 index 000000000..87af78ae7 --- /dev/null +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyPathPoint.java @@ -0,0 +1,96 @@ +package noppes.npcs.ai.pathfinder; + +import net.minecraft.pathfinding.PathPoint; +import net.minecraft.util.MathHelper; + +public class FlyPathPoint extends PathPoint +{ + /** The x coordinate of this point */ + public final int xCoord; + /** The y coordinate of this point */ + public final int yCoord; + /** The z coordinate of this point */ + public final int zCoord; + /** A hash of the coordinates used to identify this point */ + public final int hash; + /** The index of this point in its assigned path */ + public int index = -1; + /** The distance along the path to this point */ + public float totalPathDistance; + /** The linear distance to the next point */ + public float distanceToNext; + /** The distance to the target */ + public float distanceToTarget; + /** The point preceding this in its assigned path */ + public FlyPathPoint previous; + /** Indicates this is the origin */ + public boolean isFirst; + private static final String __OBFID = "CL_00000574"; + + public FlyPathPoint(int p_i2135_1_, int p_i2135_2_, int p_i2135_3_) + { + super(p_i2135_1_,p_i2135_2_,p_i2135_3_); + this.xCoord = p_i2135_1_; + this.yCoord = p_i2135_2_; + this.zCoord = p_i2135_3_; + this.hash = makeHash(p_i2135_1_, p_i2135_2_, p_i2135_3_); + } + + public static int makeHash(int p_75830_0_, int p_75830_1_, int p_75830_2_) + { + return p_75830_1_ & 255 | (p_75830_0_ & 32767) << 8 | (p_75830_2_ & 32767) << 24 | (p_75830_0_ < 0 ? Integer.MIN_VALUE : 0) | (p_75830_2_ < 0 ? 32768 : 0); + } + + /** + * Returns the linear distance to another path point + */ + public float distanceTo(net.minecraft.pathfinding.PathPoint p_75829_1_) + { + float f = (float)(p_75829_1_.xCoord - this.xCoord); + float f1 = (float)(p_75829_1_.yCoord - this.yCoord); + float f2 = (float)(p_75829_1_.zCoord - this.zCoord); + return MathHelper.sqrt_float(f * f + f1 * f1 + f2 * f2); + } + + /** + * Returns the squared distance to another path point + */ + public float distanceToSquared(net.minecraft.pathfinding.PathPoint p_75832_1_) + { + float f = (float)(p_75832_1_.xCoord - this.xCoord); + float f1 = (float)(p_75832_1_.yCoord - this.yCoord); + float f2 = (float)(p_75832_1_.zCoord - this.zCoord); + return f * f + f1 * f1 + f2 * f2; + } + + public boolean equals(Object p_equals_1_) + { + if (!(p_equals_1_ instanceof FlyPathPoint)) + { + return false; + } + else + { + FlyPathPoint pathpoint = (FlyPathPoint)p_equals_1_; + return this.hash == pathpoint.hash && this.xCoord == pathpoint.xCoord && this.yCoord == pathpoint.yCoord && this.zCoord == pathpoint.zCoord; + } + } + + public int hashCode() + { + return this.hash; + } + + /** + * Returns true if this point has already been assigned to a path + */ + public boolean isAssigned() + { + return this.index >= 0; + } + + public String toString() + { + return this.xCoord + ", " + this.yCoord + ", " + this.zCoord; + } +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java index 078598d75..e50e53eb3 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java @@ -1,5 +1,6 @@ package noppes.npcs.ai.pathfinder; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityMoveHelper; @@ -28,25 +29,36 @@ public class FlyingMoveHelper extends EntityMoveHelper{ } public void onUpdateMoveHelper() { - this.entity.setMoveForward(0.0F); - if (this.update) { this.update = false; - int i = MathHelper.floor_double(this.entity.boundingBox.minY + 0.5D); + + double speed = this.entity.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue(); + double speedMult = 0.6000000238418579D / 0.5D; + double d0 = this.posX - this.entity.posX; - double d1 = this.posZ - this.entity.posZ; - double d2 = this.posY - (double)i; - double d3 = d0 * d0 + d2 * d2 + d1 * d1; + double d1 = this.posY - this.entity.posY; + double d2 = this.posZ - this.entity.posZ; + double d4 = d0 * d0 + d1 * d1 + d2 * d2; - if (d3 >= 2.500000277905201E-7D) { - float f = (float)(Math.atan2(d1, d0) * 180.0D / Math.PI) - 90.0F; - this.entity.rotationYaw = this.limitAngle(this.entity.rotationYaw, f, 30.0F); - this.entity.setAIMoveSpeed((float)(this.speed * this.entity.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue())); + if (this.entity.hurtTime == 0 && d4 > 0.5D) { + if (this.posY != this.entity.posY) { + if (this.entity.motionY * Math.signum(this.entity.posY - this.posY) > 0.0D) { + this.entity.motionY = 0.0D; + } - if (d2 > 0.0D && d0 * d0 + d1 * d1 < 1.0D) { - this.entity.getJumpHelper().setJumping(); + double verticalSpeed = Math.abs(this.entity.posY - this.posY); + if(verticalSpeed > speed * speedMult) + verticalSpeed = speed * speedMult; + + this.entity.motionY -= Math.signum(this.entity.posY - this.posY) * verticalSpeed * this.entity.ai.flySpeed; } + + double d5 = MathHelper.sqrt_double(d4); + this.entity.motionX += (d0 / d5 * speed - this.entity.motionX) * speed * speedMult; + this.entity.motionZ += (d2 / d5 * speed - this.entity.motionZ) * speed * speedMult; } + + this.entity.rotationYaw = this.limitAngle(this.entity.rotationYaw,(float) ((Math.atan2(-d0, -d2) + Math.PI) * -(180F / Math.PI)),30.0F); } } diff --git a/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java b/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java index 3e0bf41ee..f1027e02a 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java @@ -1,16 +1,12 @@ package noppes.npcs.ai.pathfinder; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.IAttributeInstance; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.passive.EntityChicken; import net.minecraft.init.Blocks; import net.minecraft.pathfinding.PathEntity; -import net.minecraft.pathfinding.PathFinder; import net.minecraft.pathfinding.PathNavigate; import net.minecraft.pathfinding.PathPoint; import net.minecraft.util.MathHelper; @@ -23,7 +19,7 @@ public class PathNavigateFlying extends PathNavigate { private EntityNPCInterface theEntity; private World worldObj; /** The PathEntity being followed. */ - private PathEntity currentPath; + private FlyPathEntity currentPath; private double speed; /** The number of blocks (extra) +/- in each axis that get pulled out as cache for the pathfinder's search space */ private IAttributeInstance pathSearchRange; @@ -120,7 +116,7 @@ public class PathNavigateFlying extends PathNavigate { /** * Returns the path to the given coordinates */ - public PathEntity getPathToXYZ(double p_75488_1_, double p_75488_3_, double p_75488_5_) + public FlyPathEntity getPathToXYZ(double p_75488_1_, double p_75488_3_, double p_75488_5_) { return !this.canNavigate() ? null : this.getEntityPathToXYZ(this.theEntity, MathHelper.floor_double(p_75488_1_), (int)p_75488_3_, MathHelper.floor_double(p_75488_5_), this.getPathSearchRange(), this.canPassOpenWoodenDoors, this.canPassClosedWoodenDoors, this.avoidsWater, this.canSwim); } @@ -130,14 +126,14 @@ public class PathNavigateFlying extends PathNavigate { */ public boolean tryMoveToXYZ(double p_75492_1_, double p_75492_3_, double p_75492_5_, double p_75492_7_) { - PathEntity pathentity = this.getPathToXYZ((double)MathHelper.floor_double(p_75492_1_), (double)((int)p_75492_3_), (double)MathHelper.floor_double(p_75492_5_)); + FlyPathEntity pathentity = this.getPathToXYZ((double)MathHelper.floor_double(p_75492_1_), (double)((int)p_75492_3_), (double)MathHelper.floor_double(p_75492_5_)); return this.setPath(pathentity, p_75492_7_); } /** * Returns the path to the given EntityLiving */ - public PathEntity getPathToEntityLiving(Entity p_75494_1_) + public FlyPathEntity getPathToEntityLiving(Entity p_75494_1_) { return !this.canNavigate() ? null : this.getPathEntityToEntity(this.theEntity, p_75494_1_, this.getPathSearchRange(), this.canPassOpenWoodenDoors, this.canPassClosedWoodenDoors, this.avoidsWater, this.canSwim); } @@ -147,16 +143,17 @@ public class PathNavigateFlying extends PathNavigate { */ public boolean tryMoveToEntityLiving(Entity p_75497_1_, double p_75497_2_) { - PathEntity pathentity = this.getPathToEntityLiving(p_75497_1_); - return pathentity != null ? this.setPath(pathentity, p_75497_2_) : false; + FlyPathEntity pathentity = this.getPathToEntityLiving(p_75497_1_); + return pathentity != null && this.setPath(pathentity, p_75497_2_); } /** * sets the active path data if path is 100% unique compared to old path, checks to adjust path for sun avoiding * ents and stores end coords */ - public boolean setPath(PathEntity p_75484_1_, double p_75484_2_) + public boolean setPath(PathEntity pathEntity, double p_75484_2_) { + FlyPathEntity p_75484_1_ = (FlyPathEntity) pathEntity; if (p_75484_1_ == null) { this.currentPath = null; @@ -471,7 +468,7 @@ public class PathNavigateFlying extends PathNavigate { return true; } - public PathEntity getPathEntityToEntity(Entity p_72865_1_, Entity p_72865_2_, float p_72865_3_, boolean p_72865_4_, boolean p_72865_5_, boolean p_72865_6_, boolean p_72865_7_) + public FlyPathEntity getPathEntityToEntity(Entity p_72865_1_, Entity p_72865_2_, float p_72865_3_, boolean p_72865_4_, boolean p_72865_5_, boolean p_72865_6_, boolean p_72865_7_) { this.theEntity.worldObj.theProfiler.startSection("pathfind"); int i = MathHelper.floor_double(p_72865_1_.posX); @@ -485,12 +482,12 @@ public class PathNavigateFlying extends PathNavigate { int i2 = j + l; int j2 = k + l; ChunkCache chunkcache = new ChunkCache(this.theEntity.worldObj, i1, j1, k1, l1, i2, j2, 0); - PathEntity pathentity = (new PathFinder(chunkcache, p_72865_4_, p_72865_5_, p_72865_6_, p_72865_7_)).createEntityPathTo(p_72865_1_, p_72865_2_, p_72865_3_); + FlyPathEntity pathentity = (new FlyPathFinder(chunkcache, p_72865_4_, p_72865_5_, p_72865_6_, p_72865_7_)).createEntityPathTo(p_72865_1_, p_72865_2_, p_72865_3_); this.theEntity.worldObj.theProfiler.endSection(); return pathentity; } - public PathEntity getEntityPathToXYZ(Entity p_72844_1_, int p_72844_2_, int p_72844_3_, int p_72844_4_, float p_72844_5_, boolean p_72844_6_, boolean p_72844_7_, boolean p_72844_8_, boolean p_72844_9_) + public FlyPathEntity getEntityPathToXYZ(Entity p_72844_1_, int p_72844_2_, int p_72844_3_, int p_72844_4_, float p_72844_5_, boolean p_72844_6_, boolean p_72844_7_, boolean p_72844_8_, boolean p_72844_9_) { this.theEntity.worldObj.theProfiler.startSection("pathfind"); int l = MathHelper.floor_double(p_72844_1_.posX); @@ -504,7 +501,7 @@ public class PathNavigateFlying extends PathNavigate { int l2 = i1 + k1; int i3 = j1 + k1; ChunkCache chunkcache = new ChunkCache(this.theEntity.worldObj, l1, i2, j2, k2, l2, i3, 0); - PathEntity pathentity = (new PathFinder(chunkcache, p_72844_6_, p_72844_7_, p_72844_8_, p_72844_9_)).createEntityPathTo(p_72844_1_, p_72844_2_, p_72844_3_, p_72844_4_, p_72844_5_); + FlyPathEntity pathentity = (new FlyPathFinder(chunkcache, p_72844_6_, p_72844_7_, p_72844_8_, p_72844_9_)).createEntityPathTo(p_72844_1_, p_72844_2_, p_72844_3_, p_72844_4_, p_72844_5_); this.theEntity.worldObj.theProfiler.endSection(); return pathentity; } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 85c53a223..a740a771f 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -36,46 +36,9 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { return; } - double speed = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue(); - double speedMult = 0.6000000238418579D/0.5D; - - if(isEntityAlive()) { - if (!this.worldObj.isRemote) { - Entity target = this.getAttackTarget(); - if (target != null && target.isEntityAlive()) { - double d0 = target.posX - this.posX; - double d1 = target.posY - this.posY; - double d2 = target.posZ - this.posZ; - double d4 = d0 * d0 + d1 * d1 + d2 * d2; - - if(this.hurtTime == 0) { - if (this.posY != target.posY) { - if (this.motionY * Math.signum(this.posY - target.posY) > 0.0D) { - this.motionY = 0.0D; - } - - this.motionY -= Math.signum(this.posY - target.posY) * (speed * speedMult) * this.ai.flySpeed; - } - - if (d4 > 0.5D) { - double d5 = MathHelper.sqrt_double(d4); - this.motionX += (d0 / d5 * speed - this.motionX) * speed * speedMult; - this.motionZ += (d2 / d5 * speed - this.motionZ) * speed * speedMult; - } - } - - this.rotationYaw = (float) ((Math.atan2(-d0, -d2) + Math.PI) * -(180F / Math.PI)); - } else { - if (!this.onGround && this.motionY < 0.0D) - { - this.motionY *= 0.6D; - } - } - } - - if (this.motionX * this.motionX + this.motionZ * this.motionZ > 0.05000000074505806D && isEntityAlive()) { - this.rotationYaw = (float) Math.atan2(this.motionZ, this.motionX) * (180F / (float) Math.PI) - 90.0F; - } + if (!this.onGround && !this.getMoveHelper().isUpdating()) + { + this.motionY *= 0.0D; } super.onLivingUpdate(); diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 2ac01b37e..c384260d8 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -412,7 +412,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } public PathNavigate getNavigator() { - if(canFly() && !this.onGround) + if(canFly()) return this.flyNavigator; else { return super.getNavigator(); @@ -420,7 +420,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } public EntityMoveHelper getMoveHelper() { - if(canFly() && !this.onGround) + if(canFly()) return this.flyMoveHelper; else { return super.getMoveHelper(); From c2564de4701a22988eb25dd1a556d33025a1bddd Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 04:41:41 -0600 Subject: [PATCH 14/54] NPCs properly stay floating when not navigating and in the air. --- src/main/java/noppes/npcs/entity/EntityNPCFlying.java | 7 +++---- src/main/java/noppes/npcs/entity/EntityNPCInterface.java | 7 ------- .../java/noppes/npcs/scripted/entity/ScriptEntity.java | 4 ++-- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index a740a771f..430a498ef 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -31,17 +31,16 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { public void onLivingUpdate() { - if(!canFly() || this.isJumping){ - super.onLivingUpdate(); + super.onLivingUpdate(); + if(!canFly()){ return; } if (!this.onGround && !this.getMoveHelper().isUpdating()) { this.motionY *= 0.0D; + this.velocityChanged = true; } - - super.onLivingUpdate(); } @Override diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index c384260d8..991ba265f 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -931,13 +931,6 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti return true; } - @Override - public void addVelocity(double d, double d1, double d2) { - if (isWalking() && !isKilled()) - super.addVelocity(d, d1, d2); - } - - @Override public void readEntityFromNBT(NBTTagCompound compound) { super.readEntityFromNBT(compound); diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java index 373446653..e5fa28582 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java @@ -460,14 +460,14 @@ public class ScriptEntity implements IEntity { @Override public void knockback(int power, float direction){ float v = direction * (float)Math.PI / 180.0F; - entity.velocityChanged = true; entity.addVelocity(-MathHelper.sin(v) * (float)power, 0.1D + power * 0.04f, MathHelper.cos(v) * (float)power); + entity.velocityChanged = true; } public void knockback(int xpower, int ypower, int zpower, float direction){ float v = direction * (float)Math.PI / 180.0F; - entity.velocityChanged = true; entity.addVelocity(-MathHelper.sin(v) * (float)xpower, 0.1D + ypower * 0.04f, MathHelper.cos(v) * (float)zpower); + entity.velocityChanged = true; } public void setImmune(int ticks) { From 94c7df410b8d00ee7027105590119153ad32f8a4 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 04:50:23 -0600 Subject: [PATCH 15/54] Added fly gravity for NPCs, configurable with npc.setFlyGravity(gravity) and npc.getFlyGravity() --- src/main/java/noppes/npcs/DataAI.java | 7 +++++++ .../java/noppes/npcs/entity/EntityNPCFlying.java | 2 +- .../java/noppes/npcs/scripted/entity/ScriptNpc.java | 13 +++++++++++++ .../noppes/npcs/scripted/interfaces/ICustomNpc.java | 4 ++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/DataAI.java b/src/main/java/noppes/npcs/DataAI.java index e694065aa..19ceeaf02 100644 --- a/src/main/java/noppes/npcs/DataAI.java +++ b/src/main/java/noppes/npcs/DataAI.java @@ -36,6 +36,7 @@ public class DataAI { // Fly Change public int movementType = 0; public double flySpeed = 1.0D; + public double flyGravity = 0.0D; public EnumAnimation animationType = EnumAnimation.NONE; public EnumStandingType standingType = EnumStandingType.RotateBody; @@ -104,6 +105,11 @@ public class DataAI { else flySpeed = compound.getDouble("FlySpeed"); + if(!compound.hasKey("FlyGravity")) + flyGravity = 0.0D; + else + flyGravity = compound.getDouble("FlyGravity"); + startPos = compound.getIntArray("StartPosNew"); if (startPos == null || startPos.length != 3){ startPos = new int[] { @@ -152,6 +158,7 @@ public class DataAI { compound.setInteger("MovingType", movementType); compound.setDouble("FlySpeed",flySpeed); + compound.setDouble("FlyGravity",flyGravity); npc.setAvoidWater(avoidsWater); diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 430a498ef..1311fa34a 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -38,7 +38,7 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { if (!this.onGround && !this.getMoveHelper().isUpdating()) { - this.motionY *= 0.0D; + this.motionY *= this.ai.flyGravity; this.velocityChanged = true; } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 879d0f96e..64cd375b6 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -954,6 +954,19 @@ public class ScriptNpc extends ScriptLiving imp return npc.ai.flySpeed; } + public void setFlyGravity(double flyGravity){ + if(flyGravity < 0.0D) + flyGravity = 0.0D; + if(flyGravity > 1.0D) + flyGravity = 1.0D; + + npc.ai.flyGravity = flyGravity; + } + + public double getFlyGravity(double flySpeed){ + return npc.ai.flyGravity; + } + public void setSkinType(byte type) { npc.display.skinType = type; npc.updateClient = true; diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index fdbb03e48..c92d8c7ae 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -684,6 +684,10 @@ public interface ICustomNpc extends IEntityLiving { public double getFlySpeed(double flySpeed); + public void setFlyGravity(double flyGravity); + + public double getFlyGravity(double flyGravity); + public void setSkinType(byte type); public byte getSkinType(); From 90eec7a57b936e0db05f5f96e83d330f0863eaf9 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 05:26:32 -0600 Subject: [PATCH 16/54] Added GUI fields for setting flying properties of NPCs. Updated en_lang file to add GUI texts. --- .../npcs/ai/pathfinder/FlyingMoveHelper.java | 3 ++- .../npcs/client/gui/SubGuiNpcMovement.java | 19 +++++++++++++++++++ .../assets/customnpcs/lang/en_US.lang | 5 +++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java index e50e53eb3..47c56f4a5 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java @@ -49,8 +49,9 @@ public class FlyingMoveHelper extends EntityMoveHelper{ double verticalSpeed = Math.abs(this.entity.posY - this.posY); if(verticalSpeed > speed * speedMult) verticalSpeed = speed * speedMult; + verticalSpeed += this.entity.ai.flySpeed/2.0D; - this.entity.motionY -= Math.signum(this.entity.posY - this.posY) * verticalSpeed * this.entity.ai.flySpeed; + this.entity.motionY -= Math.signum(this.entity.posY - this.posY) * verticalSpeed; } double d5 = MathHelper.sqrt_double(d4); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java index 329d304d0..86b85d3d9 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java @@ -32,6 +32,18 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList // Fly Change this.addButton(new GuiNpcButton(15, guiLeft + 80, y += 22, 100, 20, new String[]{"movement.ground","movement.flying"}, ai.movementType)); + if(ai.movementType == 1){ + this.addLabel(new GuiNpcLabel(18, "fly.speed", guiLeft + 4, y + 140)); + addTextField(new GuiNpcTextField(18,this, guiLeft + 80, y + 135, 40, 20, ai.flySpeed + "")); + getTextField(18).doublesOnly = true; + getTextField(18).setMinMaxDefaultDouble(0.0D,Double.MAX_VALUE,1.0D); + + this.addLabel(new GuiNpcLabel(19, "fly.gravity", guiLeft + 4, y + 160)); + addTextField(new GuiNpcTextField(19,this, guiLeft + 80, y + 155, 40, 20, ai.flyGravity + "")); + getTextField(19).doublesOnly = true; + getTextField(19).setMinMaxDefaultDouble(0.0D,1.0D,0.0D); + } + if(ai.movingType == EnumMovingType.Wandering){ addTextField(new GuiNpcTextField(4,this, guiLeft + 100, y += 22, 40, 20, ai.walkingRange + "")); getTextField(4).integersOnly = true; @@ -146,6 +158,7 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList } else if (button.id == 15) { ai.movementType = button.getValue(); + initGui(); } else if(button.id == 66){ close(); @@ -172,6 +185,12 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList else if(textfield.id == 14){ ai.setWalkingSpeed(textfield.getInteger()); } + else if(textfield.id == 18){ + ai.flySpeed = textfield.getDouble(); + } + else if(textfield.id == 19){ + ai.flyGravity = textfield.getDouble(); + } } } diff --git a/src/main/resources/assets/customnpcs/lang/en_US.lang b/src/main/resources/assets/customnpcs/lang/en_US.lang index e1082b3fa..c3d90ccf7 100644 --- a/src/main/resources/assets/customnpcs/lang/en_US.lang +++ b/src/main/resources/assets/customnpcs/lang/en_US.lang @@ -308,6 +308,11 @@ ai.tacticalvariant=TacticalVariant ai.cobwebAffected=CobwebAffected ai.movement=Movement +movement.ground=Ground +movement.flying=Flying +fly.speed=Flying Speed +fly.gravity=Flying Gravity + aitactics.rush=Rush aitactics.stagger=Dodge aitactics.orbit=Surround From 29db4bfe3317f2c6d70c061fe0eb4e260fba1ee3 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 06:25:28 -0600 Subject: [PATCH 17/54] Fixed flying aggro range now working for larger aggro ranges --- src/main/java/noppes/npcs/ai/EntityAIAttackTarget.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/noppes/npcs/ai/EntityAIAttackTarget.java b/src/main/java/noppes/npcs/ai/EntityAIAttackTarget.java index b5859e296..4cf345196 100644 --- a/src/main/java/noppes/npcs/ai/EntityAIAttackTarget.java +++ b/src/main/java/noppes/npcs/ai/EntityAIAttackTarget.java @@ -1,10 +1,12 @@ package noppes.npcs.ai; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.pathfinding.PathEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import noppes.npcs.CustomNpcs; import noppes.npcs.constants.AiMutex; import noppes.npcs.entity.EntityNPCInterface; @@ -55,7 +57,9 @@ public class EntityAIAttackTarget extends EntityAIBase } else{ this.entityTarget = entitylivingbase; + this.attacker.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(((EntityNPCInterface) this.attacker).stats.aggroRange); this.entityPathEntity = this.attacker.getNavigator().getPathToEntityLiving(entitylivingbase); + this.attacker.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(CustomNpcs.NpcNavRange); return this.entityPathEntity != null; } } From d37e9860060d7f463e5e17b2127c9c385092be1b Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 15:34:41 -0600 Subject: [PATCH 18/54] Fixed NPCs bobbing in the air when flying. --- src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java | 3 +++ src/main/java/noppes/npcs/entity/EntityNPCFlying.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java index 47c56f4a5..e3c017fcf 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java @@ -51,6 +51,9 @@ public class FlyingMoveHelper extends EntityMoveHelper{ verticalSpeed = speed * speedMult; verticalSpeed += this.entity.ai.flySpeed/2.0D; + if(verticalSpeed > Math.abs(this.entity.posY - this.posY)) + verticalSpeed = Math.abs(this.entity.posY - this.posY); + this.entity.motionY -= Math.signum(this.entity.posY - this.posY) * verticalSpeed; } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 1311fa34a..f7e1a1aef 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -36,7 +36,7 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { return; } - if (!this.onGround && !this.getMoveHelper().isUpdating()) + if (!this.onGround) { this.motionY *= this.ai.flyGravity; this.velocityChanged = true; From d66f5326434f1bef5e60aabd770b0acd81d490bf Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 15:50:58 -0600 Subject: [PATCH 19/54] Made entity field in FlyingMoveHelper final --- .../java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java index e3c017fcf..2a9d40580 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java @@ -1,24 +1,20 @@ package noppes.npcs.ai.pathfinder; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityMoveHelper; -import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import noppes.npcs.entity.EntityNPCInterface; // Fly Change public class FlyingMoveHelper extends EntityMoveHelper{ - private EntityNPCInterface entity; + private final EntityNPCInterface entity; private double posX; private double posY; private double posZ; private double speed; private boolean update; - private static final String __OBFID = "CL_00001573"; public FlyingMoveHelper(EntityNPCInterface entity){ super(entity); From 8c602c4d16072ab26fa53505fd305cc03dc8dd6d Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 17:43:27 -0600 Subject: [PATCH 20/54] Adjusted floating: NPCs don't float when they're knocked back or hurt. --- src/main/java/noppes/npcs/entity/EntityNPCFlying.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index f7e1a1aef..5d98fd290 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -36,7 +36,7 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { return; } - if (!this.onGround) + if (!this.onGround && !this.velocityChanged && this.motionY < 0 && this.hurtTime == 0) { this.motionY *= this.ai.flyGravity; this.velocityChanged = true; From 34f6f670eb8c058bed2975aaeb2a093a5eb965c1 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 17:48:35 -0600 Subject: [PATCH 21/54] Y velocity when calling entity.knockback() is no longer decreased drastically. --- src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java index e5fa28582..3f4ec36f4 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java @@ -460,13 +460,13 @@ public class ScriptEntity implements IEntity { @Override public void knockback(int power, float direction){ float v = direction * (float)Math.PI / 180.0F; - entity.addVelocity(-MathHelper.sin(v) * (float)power, 0.1D + power * 0.04f, MathHelper.cos(v) * (float)power); + entity.addVelocity(-MathHelper.sin(v) * (float)power, power, MathHelper.cos(v) * (float)power); entity.velocityChanged = true; } public void knockback(int xpower, int ypower, int zpower, float direction){ float v = direction * (float)Math.PI / 180.0F; - entity.addVelocity(-MathHelper.sin(v) * (float)xpower, 0.1D + ypower * 0.04f, MathHelper.cos(v) * (float)zpower); + entity.addVelocity(-MathHelper.sin(v) * (float)xpower, ypower, MathHelper.cos(v) * (float)zpower); entity.velocityChanged = true; } From 909f69575a3e8d19e801a459bdac79d65156885b Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 20:46:02 -0600 Subject: [PATCH 22/54] Set max aggro range to 100. --- src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java index ae41dd9be..478eb3551 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java @@ -40,7 +40,7 @@ public class GuiNpcStats extends GuiNPCInterface2 implements ITextfieldListener, addLabel(new GuiNpcLabel(1,"stats.aggro", guiLeft + 140, y + 5)); addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft + 220, y, 50, 18, stats.aggroRange+"")); getTextField(1).integersOnly = true; - getTextField(1).setMinMaxDefault(1, Integer.MAX_VALUE, 2); + getTextField(1).setMinMaxDefault(1, 100, 2); addLabel(new GuiNpcLabel(34,"stats.creaturetype", guiLeft + 275, y + 5)); addButton(new GuiNpcButton(8,guiLeft + 355, y, 56, 20, new String[]{"stats.normal","stats.undead","stats.arthropod"} ,stats.creatureType.ordinal())); From 81881e6e1941a83c892d663bc6a3670f8a22b2d8 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 20:52:39 -0600 Subject: [PATCH 23/54] Reset aggro range to Integer.MAX_VALUE. Sustainable aggro ranges seem to correlate to client/server RAM, and people should decide what max range is suitable for their client/server. --- src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java index 478eb3551..ae41dd9be 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcStats.java @@ -40,7 +40,7 @@ public class GuiNpcStats extends GuiNPCInterface2 implements ITextfieldListener, addLabel(new GuiNpcLabel(1,"stats.aggro", guiLeft + 140, y + 5)); addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft + 220, y, 50, 18, stats.aggroRange+"")); getTextField(1).integersOnly = true; - getTextField(1).setMinMaxDefault(1, 100, 2); + getTextField(1).setMinMaxDefault(1, Integer.MAX_VALUE, 2); addLabel(new GuiNpcLabel(34,"stats.creaturetype", guiLeft + 275, y + 5)); addButton(new GuiNpcButton(8,guiLeft + 355, y, 56, 20, new String[]{"stats.normal","stats.undead","stats.arthropod"} ,stats.creatureType.ordinal())); From ba4bf107b56a6f668157866d6cec5dbd7f4973f8 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 8 Dec 2021 23:29:08 -0600 Subject: [PATCH 24/54] Added npc.setPoweredTexture(directory) and npc.getPoweredTexture() functions, along with a new powered texture resource. Sample code: npc.setPoweredTexture("customnpcs:textures/entity/npc_armor.png"); --- src/main/java/noppes/npcs/DataDisplay.java | 5 ++- .../npcs/client/renderer/RenderCustomNpc.java | 42 ++++++++++++++++++ .../npcs/entity/EntityNPCInterface.java | 4 ++ .../npcs/scripted/entity/ScriptNpc.java | 9 ++++ .../npcs/scripted/interfaces/ICustomNpc.java | 4 ++ .../customnpcs/textures/entity/npc_armor.png | Bin 0 -> 1681 bytes 6 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/customnpcs/textures/entity/npc_armor.png diff --git a/src/main/java/noppes/npcs/DataDisplay.java b/src/main/java/noppes/npcs/DataDisplay.java index 1bda8ee33..a18bcd6a7 100644 --- a/src/main/java/noppes/npcs/DataDisplay.java +++ b/src/main/java/noppes/npcs/DataDisplay.java @@ -37,7 +37,8 @@ public class DataDisplay { public String texture = "customnpcs:textures/entity/humanmale/Steve.png"; public String cloakTexture = ""; public String glowTexture = ""; - + public String poweredTexture = ""; + public int visible = 0; //0:visible 1:Invisible 2:semi-invisible public int modelSize = 5; @@ -102,6 +103,7 @@ public class DataDisplay { nbttagcompound.setString("Texture", texture); nbttagcompound.setString("CloakTexture", cloakTexture); nbttagcompound.setString("GlowTexture", glowTexture); + nbttagcompound.setString("PoweredTexture", poweredTexture); nbttagcompound.setByte("UsingSkinUrl", skinType); if (this.playerProfile != null) @@ -157,6 +159,7 @@ public class DataDisplay { texture = nbttagcompound.getString("Texture"); cloakTexture = nbttagcompound.getString("CloakTexture"); glowTexture = nbttagcompound.getString("GlowTexture"); + poweredTexture = nbttagcompound.getString("PoweredTexture"); modelSize = ValueUtil.CorrectInt(nbttagcompound.getInteger("Size"), 1, Integer.MAX_VALUE); modelType = nbttagcompound.getInteger("modelType"); diff --git a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java index 57e9dd460..9ef6ab233 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java @@ -11,6 +11,7 @@ import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.boss.BossStatus; +import net.minecraft.util.ResourceLocation; import noppes.npcs.client.model.ModelMPM; import noppes.npcs.client.model.util.ModelRenderPassHelper; import noppes.npcs.constants.EnumStandingType; @@ -88,6 +89,47 @@ public class RenderCustomNpc extends RenderNPCHumanMale{ @Override protected int shouldRenderPass(EntityLivingBase par1EntityLivingBase, int par2, float par3){ + EntityNPCInterface npc = (EntityNPCInterface) par1EntityLivingBase; + if (npc.hasPoweredTexture()) + { + if (npc.isInvisible()) + { + GL11.glDepthMask(false); + } + else + { + GL11.glDepthMask(true); + } + + if (par2 == 1) + { + ResourceLocation poweredNPCTexture = new ResourceLocation(npc.display.poweredTexture);//customnpcs:textures/entity/npc_armor.png + float f1 = (float)npc.ticksExisted + par3; + this.bindTexture(poweredNPCTexture); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glLoadIdentity(); + float f2 = f1 * 0.01F; + float f3 = f1 * 0.01F; + GL11.glTranslatef(f2, f3, 0.0F); + this.setRenderPassModel(this.originalModel); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glEnable(GL11.GL_BLEND); + float f4 = 0.5F; + GL11.glColor4f(f4, f4, f4, 1.0F); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + return 1; + } + + if (par2 == 2) + { + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + } + } if(renderEntity != null){ return NPCRendererHelper.shouldRenderPass(entity, par2, par3, renderEntity); } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 991ba265f..9c0947b19 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -1732,4 +1732,8 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti { this.display.modelType = val; } + + public boolean hasPoweredTexture() { + return !("".equals(this.display.poweredTexture)); + } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 64cd375b6..2c36a142c 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -1006,4 +1006,13 @@ public class ScriptNpc extends ScriptLiving imp public String getOverlayTexture() { return npc.display.glowTexture; } + + public void setPoweredTexture(String poweredTexture) { + npc.display.poweredTexture = poweredTexture; + npc.updateClient = true; + } + + public String getPoweredTexture() { + return npc.display.poweredTexture; + } } diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index c92d8c7ae..ff0df53b0 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -703,4 +703,8 @@ public interface ICustomNpc extends IEntityLiving { public void setOverlayTexture(String overlayTexture); public String getOverlayTexture(); + + public void setPoweredTexture(String poweredTexture); + + public String getPoweredTexture(); } diff --git a/src/main/resources/assets/customnpcs/textures/entity/npc_armor.png b/src/main/resources/assets/customnpcs/textures/entity/npc_armor.png new file mode 100644 index 0000000000000000000000000000000000000000..73a5d7ce29a4a895aa17d6fb196a5fd897067527 GIT binary patch literal 1681 zcmd5+`!^H_8-6t`aU`L!`qXsUG(~igOQju5E+d2(*B!=fN|GU$(Yg#V$-O0-mQoUh zY_YjiQnO5j#DqSjU7t&QRzr<6dUyIS_C4o$pYxpem-ji(ISWVUD;%Fg*c0J;9nFdnyqelakXDYWTrBOv%iXxE5Wy$_PKoahqFyd;%trX>F|!sS zK)5X*Z@fe}J_5#J#ZM9ZJG#dZ9Qd#+w7du5#3(rr!I1H{1hvv}%~=HIGq6ay_ZmC@ z!t^$L@(zC+KnUuAxCOAxP)|dzDg?(e2<`>j^EPGJ_7=bAA-GgR{Gu$uQ09kkspdqv zIJ(Mg{)+}a9M>evURxev>&XUK@$ehuj*5880SLWz))Y5eTJ#YWj+XJt;r})`ueznL zH8iZ1TvAVzZ>-3$f3mtcYala&6=+755Zu&1vDVgCICAIDz zVsvopo7>V(3ucJaY*zW-Yt+ysX&Oy~2BG!!ZIYk(H}zXv5nmEmv2K~9{dvSwWuTy?3O)0FKQ#cyq`#;Yz zLvfSasF1wq*B?~XILwMZ^G5E?JH@VLRbasNXuQeymlVSFXOtj6+C46kN_vq#4+hkt@ZI_svsB`$$4N}S)}o_wt3H=!rP*5j@z?Gn572e9C++F13>B5N^` zqDLzxSQH%jvA2J{XxN7KNTYGYad46Sk>gF#lV;0J< zMWKFK>&=GAZ0<3BvO}$8QJ2jXW?B~}YKb1ca(l4V*EhQ6ve9`~7v=s;vscd4(cv%e z8ip1s%)@J^K4p41=+01In_to=yj>91DU$g+-YU1p)OXGb1a6i3weQK(e@GT6?^zda zjke`bpR~pm45j9+Ua*TK)7k7M@2u60BPZ5)OC2iq?(Q?Jr;V)i`CL6w6u9|pvq`x? z_wv+a`-6Vs?az`ug<#e=x^|{idwS<1FZFf%Q|(^OjdS`PKEUM0MiVA^FwLjBC(}T1 zf<;!?`XxR{s&>2W#SI&46|N;|jAK%_Uq?Q(=(O*MQnlw-J&A>{L)X)+4R_9q)rZQd zk>5!MV>LDOH`K@fy4^@QpVqXzmCl+;44SvPwd5}9B-9YihkC@~{wr5hD)fV|-LvWY zNxbVGtt)la^|gPw5`7(${S}p)F3i92=v!=)d}`d8^q_oGN`zD`FuUh#LuuLL{6Ch~ xE*+>-M23OB4!`f^L}fMU?WD~|rR~;s@Kr(L6iYl%lliTUz>ex@U1P~e`3G&BXX*d| literal 0 HcmV?d00001 From 9560228ba8ff26c1e28f65dbaecb8daa2c28f4ab Mon Sep 17 00:00:00 2001 From: luisc Date: Thu, 9 Dec 2021 23:24:36 -0600 Subject: [PATCH 25/54] Fixed powered texture not showing up when changing NPC model attributes. --- .../client/renderer/RenderNPCInterface.java | 60 +++++++++++++++---- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java index a65fbd801..52c5a5e23 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java @@ -231,23 +231,63 @@ public class RenderNPCInterface extends RenderLiving{ GL11.glDepthMask(true); } GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glPushMatrix(); - GL11.glScalef(1.001f, 1.001f, 1.001f); - if(mainModel instanceof ModelMPM){ - ((ModelMPM)mainModel).isArmor = true; - mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); - ((ModelMPM)mainModel).isArmor = false; - } - else - mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); + GL11.glScalef(1.001f, 1.001f, 1.001f); + if(mainModel instanceof ModelMPM){ + ((ModelMPM)mainModel).isArmor = true; + mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); + ((ModelMPM)mainModel).isArmor = false; + } + else + mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); GL11.glPopMatrix(); - GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glEnable(GL11.GL_LIGHTING); GL11.glColor4f(1.0F, 1.0F, 1.0F, f1); - + GL11.glDepthFunc(GL11.GL_LEQUAL); GL11.glDisable(GL11.GL_BLEND); } + if (npc.hasPoweredTexture()) + { + GL11.glDepthMask(!npc.isInvisible()); + ResourceLocation poweredNPCTexture = new ResourceLocation(npc.display.poweredTexture);//customnpcs:textures/entity/npc_armor.png + float f1 = (float)npc.ticksExisted + par3; + this.bindTexture(poweredNPCTexture); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glLoadIdentity(); + float f2 = f1 * 0.01F; + float f3 = f1 * 0.01F; + GL11.glTranslatef(f2, f3, 0.0F); + this.setRenderPassModel(this.originalModel); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glEnable(GL11.GL_BLEND); + float f4 = 0.5F; + GL11.glColor4f(f4, f4, f4, 1.0F); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + + + GL11.glPushMatrix(); + GL11.glScalef(1.001f, 1.001f, 1.001f); + if(mainModel instanceof ModelMPM){ + ((ModelMPM)mainModel).isArmor = true; + mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); + ((ModelMPM)mainModel).isArmor = false; + } + else + mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); + GL11.glPopMatrix(); + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glColor4f(1.0F, 1.0F, 1.0F, f1); + + + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glDisable(GL11.GL_BLEND); + } } @Override protected float handleRotationFloat(EntityLivingBase par1EntityLiving, float par2){ From b7d2dab9056799f5c8a99f1600eee405b6adb4ed Mon Sep 17 00:00:00 2001 From: luisc Date: Thu, 9 Dec 2021 23:37:04 -0600 Subject: [PATCH 26/54] Added parameters for texture translation when the NPC is powered, namely npc.display.poweredTranslateX, poweredTranslateY, and poweredTranslateZ, which can all be changed by setPoweredXYZ(x,y,z), and gotten with getPoweredX(), getPoweredY(), and getPoweredZ(). --- src/main/java/noppes/npcs/DataDisplay.java | 11 +++++++++++ .../npcs/client/renderer/RenderCustomNpc.java | 13 ++++++++----- .../client/renderer/RenderNPCInterface.java | 13 ++++++++----- .../noppes/npcs/scripted/entity/ScriptNpc.java | 17 +++++++++++++++++ .../npcs/scripted/interfaces/ICustomNpc.java | 6 ++++++ 5 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/main/java/noppes/npcs/DataDisplay.java b/src/main/java/noppes/npcs/DataDisplay.java index a18bcd6a7..a9459b6ff 100644 --- a/src/main/java/noppes/npcs/DataDisplay.java +++ b/src/main/java/noppes/npcs/DataDisplay.java @@ -37,7 +37,11 @@ public class DataDisplay { public String texture = "customnpcs:textures/entity/humanmale/Steve.png"; public String cloakTexture = ""; public String glowTexture = ""; + public String poweredTexture = ""; + public float poweredTranslateX = 0.01F; + public float poweredTranslateY = 0.01F; + public float poweredTranslateZ = 0.0F; public int visible = 0; //0:visible 1:Invisible 2:semi-invisible @@ -106,6 +110,10 @@ public class DataDisplay { nbttagcompound.setString("PoweredTexture", poweredTexture); nbttagcompound.setByte("UsingSkinUrl", skinType); + nbttagcompound.setFloat("PoweredX",poweredTranslateX); + nbttagcompound.setFloat("PoweredY",poweredTranslateY); + nbttagcompound.setFloat("PoweredZ",poweredTranslateZ); + if (this.playerProfile != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); @@ -160,6 +168,9 @@ public class DataDisplay { cloakTexture = nbttagcompound.getString("CloakTexture"); glowTexture = nbttagcompound.getString("GlowTexture"); poweredTexture = nbttagcompound.getString("PoweredTexture"); + poweredTranslateX = nbttagcompound.getFloat("PoweredX"); + poweredTranslateY = nbttagcompound.getFloat("PoweredY"); + poweredTranslateZ = nbttagcompound.getFloat("PoweredZ"); modelSize = ValueUtil.CorrectInt(nbttagcompound.getInteger("Size"), 1, Integer.MAX_VALUE); modelType = nbttagcompound.getInteger("modelType"); diff --git a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java index 9ef6ab233..c7c82f5d4 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java @@ -108,14 +108,17 @@ public class RenderCustomNpc extends RenderNPCHumanMale{ this.bindTexture(poweredNPCTexture); GL11.glMatrixMode(GL11.GL_TEXTURE); GL11.glLoadIdentity(); - float f2 = f1 * 0.01F; - float f3 = f1 * 0.01F; - GL11.glTranslatef(f2, f3, 0.0F); + + float f2 = f1 * npc.display.poweredTranslateX; + float f3 = f1 * npc.display.poweredTranslateY; + float f4 = f1 * npc.display.poweredTranslateZ; + GL11.glTranslatef(f2, f3, f4); + this.setRenderPassModel(this.originalModel); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glEnable(GL11.GL_BLEND); - float f4 = 0.5F; - GL11.glColor4f(f4, f4, f4, 1.0F); + float f5 = 0.5F; + GL11.glColor4f(f5, f5, f5, 1.0F); GL11.glDisable(GL11.GL_LIGHTING); GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); return 1; diff --git a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java index 52c5a5e23..355fece03 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java @@ -258,14 +258,17 @@ public class RenderNPCInterface extends RenderLiving{ this.bindTexture(poweredNPCTexture); GL11.glMatrixMode(GL11.GL_TEXTURE); GL11.glLoadIdentity(); - float f2 = f1 * 0.01F; - float f3 = f1 * 0.01F; - GL11.glTranslatef(f2, f3, 0.0F); + + float f2 = f1 * npc.display.poweredTranslateX; + float f3 = f1 * npc.display.poweredTranslateY; + float f4 = f1 * npc.display.poweredTranslateZ; + GL11.glTranslatef(f2, f3, f4); + this.setRenderPassModel(this.originalModel); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glEnable(GL11.GL_BLEND); - float f4 = 0.5F; - GL11.glColor4f(f4, f4, f4, 1.0F); + float f5 = 0.5F; + GL11.glColor4f(f5, f5, f5, 1.0F); GL11.glDisable(GL11.GL_LIGHTING); GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 2c36a142c..60bd1d225 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -1015,4 +1015,21 @@ public class ScriptNpc extends ScriptLiving imp public String getPoweredTexture() { return npc.display.poweredTexture; } + + public void setPoweredXYZ(float x, float y, float z) { + npc.display.poweredTranslateX = x; + npc.display.poweredTranslateY = y; + npc.display.poweredTranslateZ = z; + npc.updateClient = true; + } + + public float getPoweredX() { + return npc.display.poweredTranslateX; + } + public float getPoweredY() { + return npc.display.poweredTranslateY; + } + public float getPoweredZ() { + return npc.display.poweredTranslateZ; + } } diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index ff0df53b0..0e36e9253 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -707,4 +707,10 @@ public interface ICustomNpc extends IEntityLiving { public void setPoweredTexture(String poweredTexture); public String getPoweredTexture(); + + public void setPoweredXYZ(float x, float y, float z); + + public float getPoweredX(); + public float getPoweredY(); + public float getPoweredZ(); } From fc1c16032f324cea47d543eebdd64ab0d72d9cfe Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 10 Dec 2021 00:08:47 -0600 Subject: [PATCH 27/54] Added RGB and alpha powered texture modifiers: setPoweredRGBA(r,g,b,alpha) getPoweredR(),getPoweredG(),getPoweredB(),getPoweredAlpha() --- src/main/java/noppes/npcs/DataDisplay.java | 14 +++++++++++++ .../npcs/client/renderer/RenderCustomNpc.java | 9 ++++++-- .../client/renderer/RenderNPCInterface.java | 9 ++++++-- .../npcs/scripted/entity/ScriptNpc.java | 21 +++++++++++++++++++ .../npcs/scripted/interfaces/ICustomNpc.java | 7 +++++++ 5 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/main/java/noppes/npcs/DataDisplay.java b/src/main/java/noppes/npcs/DataDisplay.java index a9459b6ff..f82845bca 100644 --- a/src/main/java/noppes/npcs/DataDisplay.java +++ b/src/main/java/noppes/npcs/DataDisplay.java @@ -43,6 +43,11 @@ public class DataDisplay { public float poweredTranslateY = 0.01F; public float poweredTranslateZ = 0.0F; + public float poweredRed = 1.0F; + public float poweredGreen = 1.0F; + public float poweredBlue = 1.0F; + public float poweredAlpha = 1.0F; + public int visible = 0; //0:visible 1:Invisible 2:semi-invisible public int modelSize = 5; @@ -114,6 +119,11 @@ public class DataDisplay { nbttagcompound.setFloat("PoweredY",poweredTranslateY); nbttagcompound.setFloat("PoweredZ",poweredTranslateZ); + nbttagcompound.setFloat("PoweredRed",poweredRed); + nbttagcompound.setFloat("PoweredGreen",poweredGreen); + nbttagcompound.setFloat("PoweredBlue",poweredBlue); + nbttagcompound.setFloat("PoweredAlpha",poweredAlpha); + if (this.playerProfile != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); @@ -171,6 +181,10 @@ public class DataDisplay { poweredTranslateX = nbttagcompound.getFloat("PoweredX"); poweredTranslateY = nbttagcompound.getFloat("PoweredY"); poweredTranslateZ = nbttagcompound.getFloat("PoweredZ"); + poweredRed = nbttagcompound.getFloat("PoweredRed"); + poweredGreen = nbttagcompound.getFloat("PoweredGreen"); + poweredBlue = nbttagcompound.getFloat("PoweredBlue"); + poweredAlpha = nbttagcompound.getFloat("PoweredAlpha"); modelSize = ValueUtil.CorrectInt(nbttagcompound.getInteger("Size"), 1, Integer.MAX_VALUE); modelType = nbttagcompound.getInteger("modelType"); diff --git a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java index c7c82f5d4..965475a82 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java @@ -117,8 +117,13 @@ public class RenderCustomNpc extends RenderNPCHumanMale{ this.setRenderPassModel(this.originalModel); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glEnable(GL11.GL_BLEND); - float f5 = 0.5F; - GL11.glColor4f(f5, f5, f5, 1.0F); + + float f5 = npc.display.poweredRed; + float f6 = npc.display.poweredGreen; + float f7 = npc.display.poweredBlue; + float f8 = npc.display.poweredAlpha; + GL11.glColor4f(f5, f6, f7, f8); + GL11.glDisable(GL11.GL_LIGHTING); GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); return 1; diff --git a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java index 355fece03..f3e554d8e 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java @@ -267,8 +267,13 @@ public class RenderNPCInterface extends RenderLiving{ this.setRenderPassModel(this.originalModel); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glEnable(GL11.GL_BLEND); - float f5 = 0.5F; - GL11.glColor4f(f5, f5, f5, 1.0F); + + float f5 = npc.display.poweredRed; + float f6 = npc.display.poweredGreen; + float f7 = npc.display.poweredBlue; + float f8 = npc.display.poweredAlpha; + GL11.glColor4f(f5, f6, f7, f8); + GL11.glDisable(GL11.GL_LIGHTING); GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 60bd1d225..63f8b32e4 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -1032,4 +1032,25 @@ public class ScriptNpc extends ScriptLiving imp public float getPoweredZ() { return npc.display.poweredTranslateZ; } + + public void setPoweredRGBA(float r, float g, float b, float alpha) { + npc.display.poweredRed = r; + npc.display.poweredGreen = g; + npc.display.poweredBlue = b; + npc.display.poweredAlpha = alpha; + npc.updateClient = true; + } + + public float getPoweredR() { + return npc.display.poweredRed; + } + public float getPoweredG() { + return npc.display.poweredGreen; + } + public float getPoweredB() { + return npc.display.poweredBlue; + } + public float getPoweredAlpha() { + return npc.display.poweredAlpha; + } } diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index 0e36e9253..920e7d418 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -713,4 +713,11 @@ public interface ICustomNpc extends IEntityLiving { public float getPoweredX(); public float getPoweredY(); public float getPoweredZ(); + + public void setPoweredRGBA(float r, float g, float b, float alpha); + + public float getPoweredR(); + public float getPoweredG(); + public float getPoweredB(); + public float getPoweredAlpha(); } From 743cdb9db777eec703dce20ed3427eddeecbf88f Mon Sep 17 00:00:00 2001 From: luisc Date: Sat, 11 Dec 2021 08:38:38 -0600 Subject: [PATCH 28/54] Revert "Fixed powered texture not showing up when changing NPC model attributes." This reverts commit 9560228ba8ff26c1e28f65dbaecb8daa2c28f4ab. --- src/main/java/noppes/npcs/DataDisplay.java | 25 ------- .../npcs/client/renderer/RenderCustomNpc.java | 18 ++--- .../client/renderer/RenderNPCInterface.java | 68 +++---------------- .../npcs/scripted/entity/ScriptNpc.java | 38 ----------- .../npcs/scripted/interfaces/ICustomNpc.java | 13 ---- 5 files changed, 15 insertions(+), 147 deletions(-) diff --git a/src/main/java/noppes/npcs/DataDisplay.java b/src/main/java/noppes/npcs/DataDisplay.java index f82845bca..a18bcd6a7 100644 --- a/src/main/java/noppes/npcs/DataDisplay.java +++ b/src/main/java/noppes/npcs/DataDisplay.java @@ -37,16 +37,7 @@ public class DataDisplay { public String texture = "customnpcs:textures/entity/humanmale/Steve.png"; public String cloakTexture = ""; public String glowTexture = ""; - public String poweredTexture = ""; - public float poweredTranslateX = 0.01F; - public float poweredTranslateY = 0.01F; - public float poweredTranslateZ = 0.0F; - - public float poweredRed = 1.0F; - public float poweredGreen = 1.0F; - public float poweredBlue = 1.0F; - public float poweredAlpha = 1.0F; public int visible = 0; //0:visible 1:Invisible 2:semi-invisible @@ -115,15 +106,6 @@ public class DataDisplay { nbttagcompound.setString("PoweredTexture", poweredTexture); nbttagcompound.setByte("UsingSkinUrl", skinType); - nbttagcompound.setFloat("PoweredX",poweredTranslateX); - nbttagcompound.setFloat("PoweredY",poweredTranslateY); - nbttagcompound.setFloat("PoweredZ",poweredTranslateZ); - - nbttagcompound.setFloat("PoweredRed",poweredRed); - nbttagcompound.setFloat("PoweredGreen",poweredGreen); - nbttagcompound.setFloat("PoweredBlue",poweredBlue); - nbttagcompound.setFloat("PoweredAlpha",poweredAlpha); - if (this.playerProfile != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); @@ -178,13 +160,6 @@ public class DataDisplay { cloakTexture = nbttagcompound.getString("CloakTexture"); glowTexture = nbttagcompound.getString("GlowTexture"); poweredTexture = nbttagcompound.getString("PoweredTexture"); - poweredTranslateX = nbttagcompound.getFloat("PoweredX"); - poweredTranslateY = nbttagcompound.getFloat("PoweredY"); - poweredTranslateZ = nbttagcompound.getFloat("PoweredZ"); - poweredRed = nbttagcompound.getFloat("PoweredRed"); - poweredGreen = nbttagcompound.getFloat("PoweredGreen"); - poweredBlue = nbttagcompound.getFloat("PoweredBlue"); - poweredAlpha = nbttagcompound.getFloat("PoweredAlpha"); modelSize = ValueUtil.CorrectInt(nbttagcompound.getInteger("Size"), 1, Integer.MAX_VALUE); modelType = nbttagcompound.getInteger("modelType"); diff --git a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java index 965475a82..9ef6ab233 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java @@ -108,22 +108,14 @@ public class RenderCustomNpc extends RenderNPCHumanMale{ this.bindTexture(poweredNPCTexture); GL11.glMatrixMode(GL11.GL_TEXTURE); GL11.glLoadIdentity(); - - float f2 = f1 * npc.display.poweredTranslateX; - float f3 = f1 * npc.display.poweredTranslateY; - float f4 = f1 * npc.display.poweredTranslateZ; - GL11.glTranslatef(f2, f3, f4); - + float f2 = f1 * 0.01F; + float f3 = f1 * 0.01F; + GL11.glTranslatef(f2, f3, 0.0F); this.setRenderPassModel(this.originalModel); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glEnable(GL11.GL_BLEND); - - float f5 = npc.display.poweredRed; - float f6 = npc.display.poweredGreen; - float f7 = npc.display.poweredBlue; - float f8 = npc.display.poweredAlpha; - GL11.glColor4f(f5, f6, f7, f8); - + float f4 = 0.5F; + GL11.glColor4f(f4, f4, f4, 1.0F); GL11.glDisable(GL11.GL_LIGHTING); GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); return 1; diff --git a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java index f3e554d8e..a65fbd801 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java @@ -231,71 +231,23 @@ public class RenderNPCInterface extends RenderLiving{ GL11.glDepthMask(true); } GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glPushMatrix(); - GL11.glScalef(1.001f, 1.001f, 1.001f); - if(mainModel instanceof ModelMPM){ - ((ModelMPM)mainModel).isArmor = true; - mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); - ((ModelMPM)mainModel).isArmor = false; - } - else - mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); + GL11.glScalef(1.001f, 1.001f, 1.001f); + if(mainModel instanceof ModelMPM){ + ((ModelMPM)mainModel).isArmor = true; + mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); + ((ModelMPM)mainModel).isArmor = false; + } + else + mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); GL11.glPopMatrix(); - - GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_LIGHTING); GL11.glColor4f(1.0F, 1.0F, 1.0F, f1); - + GL11.glDepthFunc(GL11.GL_LEQUAL); GL11.glDisable(GL11.GL_BLEND); } - if (npc.hasPoweredTexture()) - { - GL11.glDepthMask(!npc.isInvisible()); - ResourceLocation poweredNPCTexture = new ResourceLocation(npc.display.poweredTexture);//customnpcs:textures/entity/npc_armor.png - float f1 = (float)npc.ticksExisted + par3; - this.bindTexture(poweredNPCTexture); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glLoadIdentity(); - - float f2 = f1 * npc.display.poweredTranslateX; - float f3 = f1 * npc.display.poweredTranslateY; - float f4 = f1 * npc.display.poweredTranslateZ; - GL11.glTranslatef(f2, f3, f4); - - this.setRenderPassModel(this.originalModel); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glEnable(GL11.GL_BLEND); - - float f5 = npc.display.poweredRed; - float f6 = npc.display.poweredGreen; - float f7 = npc.display.poweredBlue; - float f8 = npc.display.poweredAlpha; - GL11.glColor4f(f5, f6, f7, f8); - - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - - - GL11.glPushMatrix(); - GL11.glScalef(1.001f, 1.001f, 1.001f); - if(mainModel instanceof ModelMPM){ - ((ModelMPM)mainModel).isArmor = true; - mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); - ((ModelMPM)mainModel).isArmor = false; - } - else - mainModel.render(entityliving, par2, par3, par4, par5, par6, par7); - GL11.glPopMatrix(); - - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glColor4f(1.0F, 1.0F, 1.0F, f1); - - - GL11.glDepthFunc(GL11.GL_LEQUAL); - GL11.glDisable(GL11.GL_BLEND); - } } @Override protected float handleRotationFloat(EntityLivingBase par1EntityLiving, float par2){ diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 63f8b32e4..2c36a142c 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -1015,42 +1015,4 @@ public class ScriptNpc extends ScriptLiving imp public String getPoweredTexture() { return npc.display.poweredTexture; } - - public void setPoweredXYZ(float x, float y, float z) { - npc.display.poweredTranslateX = x; - npc.display.poweredTranslateY = y; - npc.display.poweredTranslateZ = z; - npc.updateClient = true; - } - - public float getPoweredX() { - return npc.display.poweredTranslateX; - } - public float getPoweredY() { - return npc.display.poweredTranslateY; - } - public float getPoweredZ() { - return npc.display.poweredTranslateZ; - } - - public void setPoweredRGBA(float r, float g, float b, float alpha) { - npc.display.poweredRed = r; - npc.display.poweredGreen = g; - npc.display.poweredBlue = b; - npc.display.poweredAlpha = alpha; - npc.updateClient = true; - } - - public float getPoweredR() { - return npc.display.poweredRed; - } - public float getPoweredG() { - return npc.display.poweredGreen; - } - public float getPoweredB() { - return npc.display.poweredBlue; - } - public float getPoweredAlpha() { - return npc.display.poweredAlpha; - } } diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index 920e7d418..ff0df53b0 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -707,17 +707,4 @@ public interface ICustomNpc extends IEntityLiving { public void setPoweredTexture(String poweredTexture); public String getPoweredTexture(); - - public void setPoweredXYZ(float x, float y, float z); - - public float getPoweredX(); - public float getPoweredY(); - public float getPoweredZ(); - - public void setPoweredRGBA(float r, float g, float b, float alpha); - - public float getPoweredR(); - public float getPoweredG(); - public float getPoweredB(); - public float getPoweredAlpha(); } From ba0f21dc2609903b55ad75a05b39d9bc53ddd738 Mon Sep 17 00:00:00 2001 From: luisc Date: Sat, 11 Dec 2021 08:41:54 -0600 Subject: [PATCH 29/54] Revert "Added npc.setPoweredTexture(directory) and npc.getPoweredTexture() functions, along with a new powered texture resource." This reverts commit ba4bf107b56a6f668157866d6cec5dbd7f4973f8. --- src/main/java/noppes/npcs/DataDisplay.java | 5 +-- .../npcs/client/renderer/RenderCustomNpc.java | 42 ------------------ .../npcs/entity/EntityNPCInterface.java | 4 -- .../npcs/scripted/entity/ScriptNpc.java | 9 ---- .../npcs/scripted/interfaces/ICustomNpc.java | 4 -- .../customnpcs/textures/entity/npc_armor.png | Bin 1681 -> 0 bytes 6 files changed, 1 insertion(+), 63 deletions(-) delete mode 100644 src/main/resources/assets/customnpcs/textures/entity/npc_armor.png diff --git a/src/main/java/noppes/npcs/DataDisplay.java b/src/main/java/noppes/npcs/DataDisplay.java index a18bcd6a7..1bda8ee33 100644 --- a/src/main/java/noppes/npcs/DataDisplay.java +++ b/src/main/java/noppes/npcs/DataDisplay.java @@ -37,8 +37,7 @@ public class DataDisplay { public String texture = "customnpcs:textures/entity/humanmale/Steve.png"; public String cloakTexture = ""; public String glowTexture = ""; - public String poweredTexture = ""; - + public int visible = 0; //0:visible 1:Invisible 2:semi-invisible public int modelSize = 5; @@ -103,7 +102,6 @@ public class DataDisplay { nbttagcompound.setString("Texture", texture); nbttagcompound.setString("CloakTexture", cloakTexture); nbttagcompound.setString("GlowTexture", glowTexture); - nbttagcompound.setString("PoweredTexture", poweredTexture); nbttagcompound.setByte("UsingSkinUrl", skinType); if (this.playerProfile != null) @@ -159,7 +157,6 @@ public class DataDisplay { texture = nbttagcompound.getString("Texture"); cloakTexture = nbttagcompound.getString("CloakTexture"); glowTexture = nbttagcompound.getString("GlowTexture"); - poweredTexture = nbttagcompound.getString("PoweredTexture"); modelSize = ValueUtil.CorrectInt(nbttagcompound.getInteger("Size"), 1, Integer.MAX_VALUE); modelType = nbttagcompound.getInteger("modelType"); diff --git a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java index 9ef6ab233..57e9dd460 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderCustomNpc.java @@ -11,7 +11,6 @@ import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.boss.BossStatus; -import net.minecraft.util.ResourceLocation; import noppes.npcs.client.model.ModelMPM; import noppes.npcs.client.model.util.ModelRenderPassHelper; import noppes.npcs.constants.EnumStandingType; @@ -89,47 +88,6 @@ public class RenderCustomNpc extends RenderNPCHumanMale{ @Override protected int shouldRenderPass(EntityLivingBase par1EntityLivingBase, int par2, float par3){ - EntityNPCInterface npc = (EntityNPCInterface) par1EntityLivingBase; - if (npc.hasPoweredTexture()) - { - if (npc.isInvisible()) - { - GL11.glDepthMask(false); - } - else - { - GL11.glDepthMask(true); - } - - if (par2 == 1) - { - ResourceLocation poweredNPCTexture = new ResourceLocation(npc.display.poweredTexture);//customnpcs:textures/entity/npc_armor.png - float f1 = (float)npc.ticksExisted + par3; - this.bindTexture(poweredNPCTexture); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glLoadIdentity(); - float f2 = f1 * 0.01F; - float f3 = f1 * 0.01F; - GL11.glTranslatef(f2, f3, 0.0F); - this.setRenderPassModel(this.originalModel); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glEnable(GL11.GL_BLEND); - float f4 = 0.5F; - GL11.glColor4f(f4, f4, f4, 1.0F); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - return 1; - } - - if (par2 == 2) - { - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glLoadIdentity(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_BLEND); - } - } if(renderEntity != null){ return NPCRendererHelper.shouldRenderPass(entity, par2, par3, renderEntity); } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 9c0947b19..991ba265f 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -1732,8 +1732,4 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti { this.display.modelType = val; } - - public boolean hasPoweredTexture() { - return !("".equals(this.display.poweredTexture)); - } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 2c36a142c..64cd375b6 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -1006,13 +1006,4 @@ public class ScriptNpc extends ScriptLiving imp public String getOverlayTexture() { return npc.display.glowTexture; } - - public void setPoweredTexture(String poweredTexture) { - npc.display.poweredTexture = poweredTexture; - npc.updateClient = true; - } - - public String getPoweredTexture() { - return npc.display.poweredTexture; - } } diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index ff0df53b0..c92d8c7ae 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -703,8 +703,4 @@ public interface ICustomNpc extends IEntityLiving { public void setOverlayTexture(String overlayTexture); public String getOverlayTexture(); - - public void setPoweredTexture(String poweredTexture); - - public String getPoweredTexture(); } diff --git a/src/main/resources/assets/customnpcs/textures/entity/npc_armor.png b/src/main/resources/assets/customnpcs/textures/entity/npc_armor.png deleted file mode 100644 index 73a5d7ce29a4a895aa17d6fb196a5fd897067527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1681 zcmd5+`!^H_8-6t`aU`L!`qXsUG(~igOQju5E+d2(*B!=fN|GU$(Yg#V$-O0-mQoUh zY_YjiQnO5j#DqSjU7t&QRzr<6dUyIS_C4o$pYxpem-ji(ISWVUD;%Fg*c0J;9nFdnyqelakXDYWTrBOv%iXxE5Wy$_PKoahqFyd;%trX>F|!sS zK)5X*Z@fe}J_5#J#ZM9ZJG#dZ9Qd#+w7du5#3(rr!I1H{1hvv}%~=HIGq6ay_ZmC@ z!t^$L@(zC+KnUuAxCOAxP)|dzDg?(e2<`>j^EPGJ_7=bAA-GgR{Gu$uQ09kkspdqv zIJ(Mg{)+}a9M>evURxev>&XUK@$ehuj*5880SLWz))Y5eTJ#YWj+XJt;r})`ueznL zH8iZ1TvAVzZ>-3$f3mtcYala&6=+755Zu&1vDVgCICAIDz zVsvopo7>V(3ucJaY*zW-Yt+ysX&Oy~2BG!!ZIYk(H}zXv5nmEmv2K~9{dvSwWuTy?3O)0FKQ#cyq`#;Yz zLvfSasF1wq*B?~XILwMZ^G5E?JH@VLRbasNXuQeymlVSFXOtj6+C46kN_vq#4+hkt@ZI_svsB`$$4N}S)}o_wt3H=!rP*5j@z?Gn572e9C++F13>B5N^` zqDLzxSQH%jvA2J{XxN7KNTYGYad46Sk>gF#lV;0J< zMWKFK>&=GAZ0<3BvO}$8QJ2jXW?B~}YKb1ca(l4V*EhQ6ve9`~7v=s;vscd4(cv%e z8ip1s%)@J^K4p41=+01In_to=yj>91DU$g+-YU1p)OXGb1a6i3weQK(e@GT6?^zda zjke`bpR~pm45j9+Ua*TK)7k7M@2u60BPZ5)OC2iq?(Q?Jr;V)i`CL6w6u9|pvq`x? z_wv+a`-6Vs?az`ug<#e=x^|{idwS<1FZFf%Q|(^OjdS`PKEUM0MiVA^FwLjBC(}T1 zf<;!?`XxR{s&>2W#SI&46|N;|jAK%_Uq?Q(=(O*MQnlw-J&A>{L)X)+4R_9q)rZQd zk>5!MV>LDOH`K@fy4^@QpVqXzmCl+;44SvPwd5}9B-9YihkC@~{wr5hD)fV|-LvWY zNxbVGtt)la^|gPw5`7(${S}p)F3i92=v!=)d}`d8^q_oGN`zD`FuUh#LuuLL{6Ch~ xE*+>-M23OB4!`f^L}fMU?WD~|rR~;s@Kr(L6iYl%lliTUz>ex@U1P~e`3G&BXX*d| From eac3d2c2145d8c0c1e1ffef4537e63353eef3f48 Mon Sep 17 00:00:00 2001 From: luisc Date: Sun, 12 Dec 2021 23:10:55 -0600 Subject: [PATCH 30/54] Added getSpeed() and setSpeed(speed) functions to ScriptNpc --- build.gradle | 2 +- src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java | 8 ++++++++ .../java/noppes/npcs/scripted/interfaces/ICustomNpc.java | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index db31bb9a1..86bf1de90 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { apply plugin: 'forge' -version = "1.3" +version = "1.4" group= "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "CustomNPC-Plus" diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 64cd375b6..9b7cc2dd8 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -967,6 +967,14 @@ public class ScriptNpc extends ScriptLiving imp return npc.ai.flyGravity; } + public void setSpeed(int speed) { + npc.ai.setWalkingSpeed(speed); + } + + public int getSpeed() { + return npc.ai.getWalkingSpeed(); + } + public void setSkinType(byte type) { npc.display.skinType = type; npc.updateClient = true; diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index c92d8c7ae..2b2e6370e 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -688,6 +688,10 @@ public interface ICustomNpc extends IEntityLiving { public double getFlyGravity(double flyGravity); + public void setSpeed(int speed); + + public int getSpeed(); + public void setSkinType(byte type); public byte getSkinType(); From 541958b630d513e76d0897ecab74b2edc1548e1b Mon Sep 17 00:00:00 2001 From: luisc Date: Sun, 12 Dec 2021 23:43:44 -0600 Subject: [PATCH 31/54] Fixed "world" keyword in for NPC scripting and API.getIWorld not returning the same instance. --- src/main/java/noppes/npcs/DataScript.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/DataScript.java b/src/main/java/noppes/npcs/DataScript.java index 29fb4be31..4522b5cfd 100644 --- a/src/main/java/noppes/npcs/DataScript.java +++ b/src/main/java/noppes/npcs/DataScript.java @@ -16,6 +16,7 @@ import noppes.npcs.controllers.IScriptHandler; import noppes.npcs.controllers.ScriptController; import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; +import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.event.ScriptEvent; import noppes.npcs.scripted.entity.ScriptNpc; import noppes.npcs.scripted.ScriptWorld; @@ -50,7 +51,7 @@ public class DataScript implements IScriptHandler { if(npc instanceof EntityCustomNpc) dummyNpc = new ScriptNpc((EntityCustomNpc) npc); if(npc.worldObj instanceof WorldServer) - dummyWorld = new ScriptWorld((WorldServer) npc.worldObj); + dummyWorld = NpcAPI.Instance().getIWorld((WorldServer) npc.worldObj);//new ScriptWorld((WorldServer) npc.worldObj); } public void readFromNBT(NBTTagCompound compound) { From 00557df9a71b3fc97a394212189adc57d8b68147 Mon Sep 17 00:00:00 2001 From: luisc Date: Mon, 13 Dec 2021 00:16:06 -0600 Subject: [PATCH 32/54] Fixed players being able to push NPCs around. --- .../noppes/npcs/entity/EntityNPCInterface.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 991ba265f..0165c51ce 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -1590,11 +1590,27 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti if(!ai.ignoreCobweb) super.setInWeb(); } + @Override public boolean canBeCollidedWith(){ return !isKilled(); } + // obviously we dont want this + @Override + public boolean canBePushed() { + return false; + } + + // not any entity can collide. if you want projectiles to still be + // effective, you will have to handle those yourself + @Override + protected void collideWithEntity(Entity p_82167_1_) {} + + // checks for any entity within a certain boundingbox, eg minecarts + @Override + protected void collideWithNearbyEntities() {} + public boolean canFly(){ return false; } From f2da93451f348bb792e4313949ba9a43d118f2c6 Mon Sep 17 00:00:00 2001 From: luisc Date: Mon, 13 Dec 2021 03:11:24 -0600 Subject: [PATCH 33/54] Re-added hasEnchant, addEnchant, setAttribute, getAttribute, hasAttribute, getLore, and setLore to ScriptItemStack after they were lost in a commit A LONG TIME AGO --- .../noppes/npcs/scripted/ScriptItemStack.java | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/src/main/java/noppes/npcs/scripted/ScriptItemStack.java b/src/main/java/noppes/npcs/scripted/ScriptItemStack.java index 97567e857..7c4e6a2b6 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptItemStack.java +++ b/src/main/java/noppes/npcs/scripted/ScriptItemStack.java @@ -1,9 +1,14 @@ package noppes.npcs.scripted; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import com.google.common.collect.Multimap; import net.minecraft.block.Block; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -145,6 +150,126 @@ public class ScriptItemStack implements IItemStack { } return false; } + + public void addEnchant(int id, int strength) { + Enchantment ench = Enchantment.enchantmentsList[id]; + if (ench == null) { + throw new CustomNPCsException("Unknown enchant id:" + id, new Object[0]); + } else { + this.item.addEnchantment(ench, strength); + } + } + + public void setAttribute(String name, double value) { + NBTTagCompound compound = this.item.getTagCompound(); + if (compound == null) { + this.item.setTagCompound(compound = new NBTTagCompound()); + } + + NBTTagList nbttaglist = compound.getTagList("AttributeModifiers", 10); + NBTTagList newList = new NBTTagList(); + + NBTTagCompound nbttagcompound; + for(int i = 0; i < nbttaglist.tagCount(); ++i) { + nbttagcompound = nbttaglist.getCompoundTagAt(i); + if (!nbttagcompound.getString("AttributeName").equals(name)) { + newList.appendTag(nbttagcompound); + } + } + + if (value != 0.0D) { + AttributeModifier attributeModifier = new AttributeModifier(name, value, 0); + nbttagcompound = new NBTTagCompound(); + nbttagcompound.setString("Name", attributeModifier.getName()); + nbttagcompound.setDouble("Amount", attributeModifier.getAmount()); + nbttagcompound.setInteger("Operation", attributeModifier.getOperation()); + nbttagcompound.setLong("UUIDMost", attributeModifier.getID().getMostSignificantBits()); + nbttagcompound.setLong("UUIDLeast", attributeModifier.getID().getLeastSignificantBits()); + nbttagcompound.setString("AttributeName", name); + newList.appendTag(nbttagcompound); + } + + compound.setTag("AttributeModifiers", newList); + } + + public double getAttribute(String name) { + NBTTagCompound compound = this.item.getTagCompound(); + if (compound == null) { + return 0.0D; + } else { + Multimap map = this.item.getAttributeModifiers(); + Iterator var4 = map.entries().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + if (((String)entry.getKey()).equals(name)) { + AttributeModifier mod = (AttributeModifier)entry.getValue(); + return mod.getAmount(); + } + } + + return 0.0D; + } + } + + public String[] getLore() { + NBTTagCompound compound = this.item.getTagCompound().getCompoundTag("display"); + if (compound != null && compound.func_150299_b("Lore") == 9) { + NBTTagList nbttaglist = compound.getTagList("Lore", 8); + if (nbttaglist.tagCount() < 1) { + return new String[0]; + } else { + List lore = new ArrayList(); + + for(int i = 0; i < nbttaglist.tagCount(); ++i) { + lore.add(nbttaglist.getStringTagAt(i)); + } + + return (String[])((String[])lore.toArray(new String[lore.size()])); + } + } else { + return new String[0]; + } + } + + public void setLore(String[] lore) { + NBTTagCompound compound = this.item.getTagCompound(); + if (compound == null) { + this.item.setTagCompound(compound = new NBTTagCompound()); + } + + NBTTagList nbttaglist = compound.getTagList("display", 10); + NBTTagList newList = new NBTTagList(); + String[] var4 = lore; + int var5 = lore.length; + + for(int var6 = 0; var6 < var5; ++var6) { + String s = var4[var6]; + newList.appendTag(new NBTTagString(s)); + } + + NBTTagCompound nbttagcompound = new NBTTagCompound(); + nbttagcompound.setTag("Lore", newList); + compound.setTag("display", nbttagcompound); + } + + public boolean hasAttribute(String name) { + NBTTagCompound compound = this.item.getTagCompound(); + if (compound == null) { + return false; + } else { + NBTTagList nbttaglist = compound.getTagList("AttributeModifiers", 10); + + for(int i = 0; i < nbttaglist.tagCount(); ++i) { + NBTTagCompound c = nbttaglist.getCompoundTagAt(i); + if (c.getString("AttributeName").equals(name)) { + return true; + } + } + + return false; + } + } /** * @since 1.7.10d From 03395ad7509f4a838a980e23afc721a765d53095 Mon Sep 17 00:00:00 2001 From: luisc Date: Mon, 13 Dec 2021 16:47:15 -0600 Subject: [PATCH 34/54] Added getWorld() function to ScriptEntity. --- .../java/noppes/npcs/scripted/entity/ScriptEntity.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java index 3f4ec36f4..b5a77d44e 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java @@ -18,14 +18,12 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagString; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; +import net.minecraft.world.WorldServer; import noppes.npcs.NoppesUtilServer; import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.ServerCloneController; import noppes.npcs.entity.EntityNPCInterface; -import noppes.npcs.scripted.CustomNPCsException; -import noppes.npcs.scripted.NpcAPI; -import noppes.npcs.scripted.ScriptEntityParticle; -import noppes.npcs.scripted.ScriptItemStack; +import noppes.npcs.scripted.*; import noppes.npcs.scripted.constants.EntityType; import noppes.npcs.scripted.interfaces.IEntity; import noppes.npcs.scripted.interfaces.INbt; @@ -525,4 +523,8 @@ public class ScriptEntity implements IEntity { ServerCloneController.Instance.addClone(compound, name, tab); } } + + public ScriptWorld getWorld() { + return (ScriptWorld)NpcAPI.Instance().getIWorld((WorldServer) entity.worldObj); + } } \ No newline at end of file From cf91d8638f5c39812ccfd3ce5bb828ca7b2fbddc Mon Sep 17 00:00:00 2001 From: luisc Date: Mon, 13 Dec 2021 18:33:20 -0600 Subject: [PATCH 35/54] Fixed getDBCPlayer not returning a DBC Player instance. --- .../npcs/scripted/entity/ScriptDBCPlayer.java | 76 +++++++++---------- .../npcs/scripted/entity/ScriptPlayer.java | 6 +- 2 files changed, 40 insertions(+), 42 deletions(-) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java index e796ba16e..503811418 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java @@ -16,27 +16,27 @@ public class ScriptDBCPlayer extends ScriptPlayer{ switch (stat) { case "str": case "strength": - player.getEntityData().setInteger("jrmcStrI", value); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcStrI", value); break; case "dex": case "dexterity": - player.getEntityData().setInteger("jrmcDexI", value); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcDexI", value); break; case "con": case "constitution": - player.getEntityData().setInteger("jrmcCnsI", value); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcCnsI", value); break; case "wil": case "willpower": - player.getEntityData().setInteger("jrmcWilI", value); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcWilI", value); break; case "mnd": case "mind": - player.getEntityData().setInteger("jrmcIntI", value); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcIntI", value); break; case "spi": case "spirit": - player.getEntityData().setInteger("jrmcCncI", value); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcCncI", value); break; } } @@ -46,22 +46,22 @@ public class ScriptDBCPlayer extends ScriptPlayer{ switch (stat) { case "str": case "strength": - return player.getEntityData().getInteger("jrmcStrI"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcStrI"); case "dex": case "dexterity": - return player.getEntityData().getInteger("jrmcDexI"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcDexI"); case "con": case "constitution": - return player.getEntityData().getInteger("jrmcCnsI"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcCnsI"); case "wil": case "willpower": - return player.getEntityData().getInteger("jrmcWilI"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcWilI"); case "mnd": case "mind": - return player.getEntityData().getInteger("jrmcIntI"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcIntI"); case "spi": case "spirit": - return player.getEntityData().getInteger("jrmcCncI"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcCncI"); } throw new CustomNPCsException("Invalid stat name: " + stat + "\nValid stat names are:" + @@ -69,89 +69,89 @@ public class ScriptDBCPlayer extends ScriptPlayer{ } public void setRelease(byte release){ - player.getEntityData().setByte("jrmcRelease",release); + player.getEntityData().getCompoundTag("PlayerPersisted").setByte("jrmcRelease",release); } public byte getRelease(){ - return player.getEntityData().getByte("jrmcRelease"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getByte("jrmcRelease"); } public void setBody(int body){ - player.getEntityData().setInteger("jrmcBdy",body); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcBdy",body); } public int getBody(){ - return player.getEntityData().getInteger("jrmcBdy"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcBdy"); } public void setStamina(int stamina){ - player.getEntityData().setInteger("jrmcStamina",stamina); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcStamina",stamina); } public int getStamina(){ - return player.getEntityData().getInteger("jrmcStamina"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcStamina"); } public void setKi(int ki){ - player.getEntityData().setInteger("jrmcEnrgy",ki); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcEnrgy",ki); } public int getKi(){ - return player.getEntityData().getInteger("jrmcEnrgy"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcEnrgy"); } public void setTP(int tp){ - player.getEntityData().setInteger("jrmcTpint",tp); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcTpint",tp); } public int getTP(){ - return player.getEntityData().getInteger("jrmcTpint"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcTpint"); } public void setGravity(float gravity){ - player.getEntityData().setFloat("jrmcGravForce",gravity); + player.getEntityData().getCompoundTag("PlayerPersisted").setFloat("jrmcGravForce",gravity); } public float getGravity(){ - return player.getEntityData().getFloat("jrmcGravForce"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getFloat("jrmcGravForce"); } public void setForm(byte form){ - player.getEntityData().setByte("jrmcState",form); + player.getEntityData().getCompoundTag("PlayerPersisted").setByte("jrmcState",form); } public byte getForm(){ - return player.getEntityData().getByte("jrmcState"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getByte("jrmcState"); } public void setForm2(byte form2){ - player.getEntityData().setByte("jrmcState2",form2); + player.getEntityData().getCompoundTag("PlayerPersisted").setByte("jrmcState2",form2); } public byte getForm2(){ - return player.getEntityData().getByte("jrmcState2"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getByte("jrmcState2"); } public void setPowerPoints(int points){ - player.getEntityData().setInteger("jrmcArcRsrv",points); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcArcRsrv",points); } public int getPowerPoints(){ - return player.getEntityData().getInteger("jrmcArcRsrv"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcArcRsrv"); } public void setAuraColor(int color){ - player.getEntityData().setInteger("jrmcAuraColor",color); + player.getEntityData().getCompoundTag("PlayerPersisted").setInteger("jrmcAuraColor",color); } public int getAuraColor(){ - return player.getEntityData().getInteger("jrmcAuraColor"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcAuraColor"); } public byte getDBCClass(){ - return player.getEntityData().getByte("jrmcClass"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getByte("jrmcClass"); } public int getRace(){ - return player.getEntityData().getByte("jrmcRace"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getByte("jrmcRace"); } public int getPowerType(){ - return player.getEntityData().getByte("jrmcPwrtyp"); + return player.getEntityData().getCompoundTag("PlayerPersisted").getByte("jrmcPwrtyp"); } public int getKillCount(String type){ type = type.toLowerCase().trim(); - int evilKills = player.getEntityData().getInteger("jrmcKillCountEvil"); - int goodKills = player.getEntityData().getInteger("jrmcKillCountGood"); - int neutKills = player.getEntityData().getInteger("jrmcKillCountNeut"); + int evilKills = player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcKillCountEvil"); + int goodKills = player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcKillCountGood"); + int neutKills = player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcKillCountNeut"); switch (type) { case "evil": diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java index 345446be3..4d5787a7d 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java @@ -4,8 +4,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.stats.Achievement; import net.minecraft.stats.StatBase; import net.minecraft.stats.StatList; @@ -391,14 +389,14 @@ public class ScriptPlayer extends ScriptLivingBase } public ScriptDBCPlayer getDBCPlayer() { - Set keySet = player.getEntityData().func_150296_c(); + Set keySet = player.getEntityData().getCompoundTag("PlayerPersisted").func_150296_c(); Iterator iterator = keySet.iterator(); while (iterator.hasNext()) { String s = (String)iterator.next(); if(s.contains("jrmc")) - return new ScriptDBCPlayer<>(this.player); + return new ScriptDBCPlayer(this.player); } return null; } From 816445bccd80ab9f6ac204aee980318d208f41e3 Mon Sep 17 00:00:00 2001 From: luisc Date: Mon, 13 Dec 2021 22:51:33 -0600 Subject: [PATCH 36/54] Script error output shortened to just the error description and line number. --- .../npcs/controllers/ScriptContainer.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index fefa8ff50..f252a871f 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -20,6 +20,7 @@ import noppes.npcs.CustomNpcs; import noppes.npcs.NBTTags; import noppes.npcs.NoppesUtilServer; import noppes.npcs.constants.EnumScriptType; +import scala.Char; public class ScriptContainer { private static final String lock = "lock"; @@ -101,7 +102,20 @@ public class ScriptContainer { this.errored = true; var14.printStackTrace(pw); } finally { - this.appandConsole(sw.getBuffer().toString().trim()); + String errorString = sw.getBuffer().toString().trim(); + int startIndex = 0; + if(!errorString.isEmpty()) { + String endString = "in at line number "; + startIndex = errorString.indexOf(endString) + endString.length(); + + for (int i = startIndex; i < errorString.length(); i++) { + if (!Character.isDigit(errorString.charAt(i))) { + startIndex = i; + break; + } + } + } + this.appandConsole(errorString.substring(0, startIndex)); pw.close(); } } @@ -141,7 +155,20 @@ public class ScriptContainer { this.errored = true; var14.printStackTrace(pw); } finally { - this.appandConsole(sw.getBuffer().toString().trim()); + String errorString = sw.getBuffer().toString().trim(); + int startIndex = 0; + if(!errorString.isEmpty()) { + String endString = "in at line number "; + startIndex = errorString.indexOf(endString) + endString.length(); + + for (int i = startIndex; i < errorString.length(); i++) { + if (!Character.isDigit(errorString.charAt(i))) { + startIndex = i; + break; + } + } + } + this.appandConsole(errorString.substring(0, startIndex)); pw.close(); Current = null; } From cad275e8456825ecf219987036dacbee6a348804 Mon Sep 17 00:00:00 2001 From: luisc Date: Tue, 14 Dec 2021 21:41:57 -0600 Subject: [PATCH 37/54] Added isBlocking, set/getHairCode, set/getExtraCode, and getInventory functions to ScriptDBCPlayer --- .../npcs/scripted/entity/ScriptDBCPlayer.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java index 503811418..590f0ae94 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java @@ -1,7 +1,14 @@ package noppes.npcs.scripted.entity; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import noppes.npcs.scripted.CustomNPCsException; +import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.ScriptItemStack; + +import java.util.ArrayList; public class ScriptDBCPlayer extends ScriptPlayer{ public T player; @@ -110,6 +117,48 @@ public class ScriptDBCPlayer extends ScriptPlayer{ return player.getEntityData().getCompoundTag("PlayerPersisted").getFloat("jrmcGravForce"); } + public boolean isBlocking(){ + NBTTagCompound compound = new NBTTagCompound(); + this.player.writeToNBT(compound); + return compound.getCompoundTag("JRMCEP").getInteger("blocking") == 1; + } + + public void setHairCode(String hairCode){ + NBTTagCompound compound = new NBTTagCompound(); + this.player.writeToNBT(compound); + compound.getCompoundTag("JRMCEP").setString("haircode",hairCode); + } + public String getHairCode(){ + NBTTagCompound compound = new NBTTagCompound(); + this.player.writeToNBT(compound); + return compound.getCompoundTag("JRMCEP").getString("haircode"); + } + + public void setExtraCode(String extraCode){ + NBTTagCompound compound = new NBTTagCompound(); + this.player.writeToNBT(compound); + compound.getCompoundTag("JRMCEP").setString("extracode",extraCode); + } + public String getExtraCode(){ + NBTTagCompound compound = new NBTTagCompound(); + this.player.writeToNBT(compound); + return compound.getCompoundTag("JRMCEP").getString("extracode"); + } + + public ScriptItemStack[] getInventory(){ + NBTTagCompound compound = new NBTTagCompound(); + this.player.writeToNBT(compound); + + NBTTagList list = compound.getCompoundTag("JRMCEP").getTagList("dbcExtraInvTag",10); + ScriptItemStack[] itemList = new ScriptItemStack[list.tagCount()]; + for (int i = 0; i < list.tagCount(); i++) { + ItemStack itemStack = ItemStack.loadItemStackFromNBT(list.getCompoundTagAt(i)); + itemList[i] = new ScriptItemStack(itemStack); + } + + return itemList; + } + public void setForm(byte form){ player.getEntityData().getCompoundTag("PlayerPersisted").setByte("jrmcState",form); } From 12cb6a2937e45165e2213c3eaf9b0e6991905ddd Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 15 Dec 2021 00:02:27 -0600 Subject: [PATCH 38/54] Added blocking() function to ScriptPlayer to check whether the player is blocking. --- src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java index 4d5787a7d..7f6c0d2d8 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java @@ -400,4 +400,8 @@ public class ScriptPlayer extends ScriptLivingBase } return null; } + + public boolean blocking() { + return player.isBlocking(); + } } From 934d5a69d65df26807c55e5e976a1c24377dca6b Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 15 Dec 2021 03:14:48 -0600 Subject: [PATCH 39/54] Added getFormLevel and setFormLevel to ScriptDBCPlayer --- .../java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java index 590f0ae94..c81ac244e 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java @@ -186,6 +186,13 @@ public class ScriptDBCPlayer extends ScriptPlayer{ return player.getEntityData().getCompoundTag("PlayerPersisted").getInteger("jrmcAuraColor"); } + public void setFormLevel(int level){ + player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcSSltX","TR"+level); + } + public int getFormLevel(){ + return Integer.parseInt(player.getEntityData().getCompoundTag("PlayerPersisted").getString("jrmcSSltX").replace("TR","")); + } + public byte getDBCClass(){ return player.getEntityData().getCompoundTag("PlayerPersisted").getByte("jrmcClass"); } From e9a4471cd2ec5dadf6b845a89046ee91787e610f Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 15 Dec 2021 03:19:34 -0600 Subject: [PATCH 40/54] Added getSkills and setSkills functions to ScriptDBCPlayer --- .../java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java index c81ac244e..1ac41055a 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java @@ -193,6 +193,13 @@ public class ScriptDBCPlayer extends ScriptPlayer{ return Integer.parseInt(player.getEntityData().getCompoundTag("PlayerPersisted").getString("jrmcSSltX").replace("TR","")); } + public void setSkills(String skills){ + player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcSSlts",skills); + } + public String getSkills(){ + return player.getEntityData().getCompoundTag("PlayerPersisted").getString("jrmcSSlts"); + } + public byte getDBCClass(){ return player.getEntityData().getCompoundTag("PlayerPersisted").getByte("jrmcClass"); } From 98d2d943ae9e5d667070161ba913b6d7cd60e93b Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 15 Dec 2021 05:43:07 -0600 Subject: [PATCH 41/54] Added bonusAttribute function, which works the same as the command. --- .../npcs/scripted/entity/ScriptDBCPlayer.java | 217 ++++++++++++++++++ 1 file changed, 217 insertions(+) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java index 1ac41055a..ece51cf82 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java @@ -9,6 +9,7 @@ import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.ScriptItemStack; import java.util.ArrayList; +import java.util.Locale; public class ScriptDBCPlayer extends ScriptPlayer{ public T player; @@ -75,6 +76,215 @@ public class ScriptDBCPlayer extends ScriptPlayer{ "\nstr, dex, con, wil, mnd, spi\nstrength, dexterity, constitution, willpower, mind, spirit",new Object[0]); } + private double applyOperator(String method, double n1, double n2) { + if (method.equals("+")) { + n1 += n2; + } else if (method.equals("-")) { + n1 -= n2; + } else if (method.equals("*")) { + n1 *= n2; + } else if (method.equals("/")) { + n1 /= n2; + } else if (method.equals("%")) { + n1 %= n2; + } + + return n1; + } + + public String bonusAttribute(String action, String stat, String bonusID, String operation, double attributeValue, boolean endOfTheList) { + String[] actions = new String[]{"add", "addto", "set", "get", "remove", "clear"}; + String[] operations = new String[]{"+", "-", "*", "/", "%"}; + + boolean valid = false; + for(String s : actions){ + if(s.equals(action.toLowerCase())){ + valid = true; + } + } + if (!valid) { + throw new CustomNPCsException("Action can be: add/addTo/set/get/remove/clear", new Object[0]); + } + + valid = false; + for(String s : operations){ + if(s.equals(operation)){ + valid = true; + } + } + if (!valid) { + throw new CustomNPCsException("Operation can be: + - * / %", new Object[0]); + } + + stat = stat.toLowerCase().trim(); + switch (stat) { + case "strength": + stat = "str"; + case "dexterity": + stat = "dex"; + case "constitution": + stat = "con"; + case "willpower": + stat = "wil"; + case "mind": + stat = "mnd"; + case "spirit": + stat = "spi"; + } + if(!(stat.equals("str") || stat.equals("dex") || stat.equals("con") || stat.equals("wil") || stat.equals("mnd") || stat.equals("spi"))) + throw new CustomNPCsException("Invalid stat name: " + stat + "\nValid stat names are:" + + "\nstr, dex, con, wil, mnd, spi\nstrength, dexterity, constitution, willpower, mind, spirit",new Object[0]); + + String bonusValueString = operation + attributeValue; + String bonus = player.getEntityData().getCompoundTag("PlayerPersisted").getString("jrmcAttrBonus"+stat); + String bonuses[] = bonus.split("\\|"); + String[][] bonusValues = new String[bonuses.length][2]; + if (bonuses.length > 0 && bonuses[0].length() > 0) { + for(int i = 0; i < bonuses.length; ++i) { + String[] bonusValue = bonuses[i].split("\\;"); + bonusValues[i][0] = bonusValue[0]; + bonusValues[i][1] = bonusValue[1]; + } + } + + switch (action) { + case "get": + if(player.getEntityData().getCompoundTag("PlayerPersisted").hasKey("jrmcAttrBonus"+stat)) { + for (String[] s : bonusValues) { + if (s[0].equals(bonusID)) + return s[1]; + } + } + return ""; + case "clear": + if(player.getEntityData().getCompoundTag("PlayerPersisted").hasKey("jrmcAttrBonus"+stat)) + player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcAttrBonus"+stat, ""); + break; + case "remove": + String newBonusString = ""; + for (int i = 0; i < bonusValues.length; i++) { + if (!bonusValues[i][0].equals(bonusID)) + newBonusString += (i != 0 ? "|" : "") + bonusValues[i][0] + ";" + bonusValues[i][1]; + } + player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcAttrBonus"+stat, newBonusString); + break; + case "add": + boolean nbtFail = false; + + for (int id = 0; id < bonuses.length; ++id) { + String[] bonusValue = bonuses[id].split("\\;"); + bonusValues[id][0] = bonusValue[0]; + if (bonusValues[id][0].equals(bonusID)) { + nbtFail = true; + break; + } + } + + if (!nbtFail) { + if (endOfTheList) { + if (bonus.length() == 0) { + bonus = bonusID + ";" + bonusValueString; + } else { + bonus = bonus + "|" + bonusID + ";" + bonusValueString; + } + } else { + if (bonus.length() == 0) { + bonus = bonusID + ";" + bonusValueString; + } else { + bonus = bonusID + ";" + bonusValueString + "|" + bonus; + } + } + player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcAttrBonus"+stat, bonus); + } + break; + case "set": { + String noNBTText; + int startIndex = -1; + boolean number = false; + boolean run = false; + + try { + startIndex = Integer.parseInt(bonusID); + number = true; + } catch (Exception var34) { + number = false; + } + + for (startIndex = 0; startIndex < bonuses.length; ++startIndex) { + String[] bonusValue = bonuses[startIndex].split("\\;"); + bonusValues[startIndex][0] = bonusValue[0]; + if (number && startIndex == startIndex || !number && bonusValues[startIndex][0].equals(bonusID)) { + noNBTText = bonusValues[startIndex][0] + ";" + bonusValueString; + bonuses[startIndex] = ""; + run = true; + bonuses[startIndex] = noNBTText; + bonusValue = bonuses[startIndex].split("\\;"); + bonusValues[startIndex][0] = bonusValue[0]; + bonusValues[startIndex][1] = bonusValue[1]; + break; + } + } + + if (run) { + String startString = ""; + + for (int i = 0; i < bonuses.length; ++i) { + if (bonuses[i] != null && bonuses[i].length() > 0) { + startString = startString + bonuses[i] + (bonuses.length - 1 == i ? "" : "|"); + } + } + + player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcAttrBonus"+stat, startString); + } + break; + } + case "addto": { + boolean number; + boolean run = false; + int id = -1; + try { + id = Integer.parseInt(bonusID); + number = true; + } catch (Exception var35) { + number = false; + } + + for (int i = 0; i < bonuses.length; ++i) { + String[] bonusValue = bonuses[i].split("\\;"); + bonusValues[i][0] = bonusValue[0]; + if (number && i == id || !number && bonusValues[i][0].equals(bonusID)) { + if (!bonusValues[i][1].contains("nbt_") && !bonusValues[i][1].contains("NBT_") && !bonusValueString.contains("nbt_") && !bonusValueString.contains("NBT_")) { + double value = Double.parseDouble(bonusValues[i][1].substring(1)); + double resultValue = applyOperator(operation, value, attributeValue); + String result = bonusValues[i][1].substring(0, 1) + resultValue; + String data = bonusValues[i][0] + ";" + result; + bonuses[i] = data; + bonusValue = bonuses[i].split("\\;"); + bonusValues[i][0] = bonusValue[0]; + bonusValues[i][1] = bonusValue[1]; + run = true; + } + break; + } + } + if (run) { + String startString = ""; + + for (int i = 0; i < bonuses.length; ++i) { + if (bonuses[i] != null && bonuses[i].length() > 0) { + startString = startString + bonuses[i] + (bonuses.length - 1 == i ? "" : "|"); + } + } + + player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcAttrBonus"+stat, startString); + } + break; + } + } + + return ""; + } + public void setRelease(byte release){ player.getEntityData().getCompoundTag("PlayerPersisted").setByte("jrmcRelease",release); } @@ -200,6 +410,13 @@ public class ScriptDBCPlayer extends ScriptPlayer{ return player.getEntityData().getCompoundTag("PlayerPersisted").getString("jrmcSSlts"); } + public void setJRMCSE(String statusEffects){ + player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcStatusEff",statusEffects); + } + public String getJRMCSE(){ + return player.getEntityData().getCompoundTag("PlayerPersisted").getString("jrmcStatusEff"); + } + public byte getDBCClass(){ return player.getEntityData().getCompoundTag("PlayerPersisted").getByte("jrmcClass"); } From 9d9c481bddc06a1526fe1812e08fdef236d01ca9 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 15 Dec 2021 06:19:16 -0600 Subject: [PATCH 42/54] Added alternative bonusAttribute function for just get remove and clear, as well as dedicated functions for all bonus attribute functions. --- .../npcs/scripted/entity/ScriptDBCPlayer.java | 53 ++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java index ece51cf82..22f046d49 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java @@ -92,6 +92,43 @@ public class ScriptDBCPlayer extends ScriptPlayer{ return n1; } + public void addBonusAttribute(String stat, String bonusID, String operation, double attributeValue){ + addBonusAttribute(stat,bonusID,operation,attributeValue,true); + } + public void addBonusAttribute(String stat, String bonusID, String operation, double attributeValue, boolean endOfTheList){ + bonusAttribute("add",stat,bonusID,operation,attributeValue,endOfTheList); + } + public void addToBonusAttribute(String stat, String bonusID, String operation, double attributeValue){ + bonusAttribute("addto",stat,bonusID,operation,attributeValue,true); + } + public void setBonusAttribute(String stat, String bonusID, String operation, double attributeValue){ + bonusAttribute("set",stat,bonusID,operation,attributeValue,true); + } + public void getBonusAttribute(String stat, String bonusID){ + bonusAttribute("get",stat,bonusID,"*",1.0,true); + } + public void removeBonusAttribute(String stat, String bonusID){ + bonusAttribute("remove",stat,bonusID,"*",1.0,true); + } + public void clearBonusAttribute(String stat){ + bonusAttribute("clear",stat,"","*",1.0,true); + } + + public String bonusAttribute(String action, String stat, String bonusID) { + String[] actions = new String[]{"get", "remove", "clear"}; + boolean valid = false; + for(String s : actions){ + if(s.equals(action.toLowerCase())){ + valid = true; + } + } + if (!valid) { + throw new CustomNPCsException("Action can be: get/remove/clear", new Object[0]); + } + + return bonusAttribute(action,stat,bonusID,"*",1.0,false); + } + public String bonusAttribute(String action, String stat, String bonusID, String operation, double attributeValue, boolean endOfTheList) { String[] actions = new String[]{"add", "addto", "set", "get", "remove", "clear"}; String[] operations = new String[]{"+", "-", "*", "/", "%"}; @@ -106,14 +143,16 @@ public class ScriptDBCPlayer extends ScriptPlayer{ throw new CustomNPCsException("Action can be: add/addTo/set/get/remove/clear", new Object[0]); } - valid = false; - for(String s : operations){ - if(s.equals(operation)){ - valid = true; + if(!action.equals("remove") && !action.equals("get") && !action.equals("clear")) { + valid = false; + for (String s : operations) { + if (s.equals(operation)) { + valid = true; + } + } + if (!valid) { + throw new CustomNPCsException("Operation can be: + - * / %", new Object[0]); } - } - if (!valid) { - throw new CustomNPCsException("Operation can be: + - * / %", new Object[0]); } stat = stat.toLowerCase().trim(); From 69b7a9aab4a7ae659055e72e5d49d62363934686 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 15 Dec 2021 06:46:27 -0600 Subject: [PATCH 43/54] Fixed errors in remove and clear functions for bonusAttribute in ScriptDBCPlayer --- .../npcs/scripted/entity/ScriptDBCPlayer.java | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java index 22f046d49..5e4fbddd4 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptDBCPlayer.java @@ -159,16 +159,22 @@ public class ScriptDBCPlayer extends ScriptPlayer{ switch (stat) { case "strength": stat = "str"; + break; case "dexterity": stat = "dex"; + break; case "constitution": stat = "con"; + break; case "willpower": stat = "wil"; + break; case "mind": stat = "mnd"; + break; case "spirit": stat = "spi"; + break; } if(!(stat.equals("str") || stat.equals("dex") || stat.equals("con") || stat.equals("wil") || stat.equals("mnd") || stat.equals("spi"))) throw new CustomNPCsException("Invalid stat name: " + stat + "\nValid stat names are:" + @@ -201,11 +207,41 @@ public class ScriptDBCPlayer extends ScriptPlayer{ break; case "remove": String newBonusString = ""; - for (int i = 0; i < bonusValues.length; i++) { - if (!bonusValues[i][0].equals(bonusID)) - newBonusString += (i != 0 ? "|" : "") + bonusValues[i][0] + ";" + bonusValues[i][1]; + if(player.getEntityData().getCompoundTag("PlayerPersisted").hasKey("jrmcAttrBonus"+stat)) { + int num = -1; + boolean number; + boolean run = false; + String[] bonusValue; + + try { + num = Integer.parseInt(bonusID); + number = true; + } catch (Exception var33) { + number = false; + } + + for(int i = 0; i < bonuses.length; ++i) { + bonusValue = bonuses[i].split("\\;"); + bonusValues[i][0] = bonusValue[0]; + if (number && i == num || !number && bonusValues[i][0].equals(bonusID)) { + bonuses[i] = ""; + run = true; + break; + } + } + + if (run) { + String startString = ""; + + for (int i = 0; i < bonuses.length; ++i) { + if (bonuses[i] != null && bonuses[i].length() > 0) { + startString = startString + bonuses[i] + (bonuses.length - 1 == i ? "" : "|"); + } + } + + player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcAttrBonus"+stat, startString); + } } - player.getEntityData().getCompoundTag("PlayerPersisted").setString("jrmcAttrBonus"+stat, newBonusString); break; case "add": boolean nbtFail = false; From 3a9789b3fd59bf089260729c68e7e9008425f26a Mon Sep 17 00:00:00 2001 From: luisc Date: Thu, 16 Dec 2021 02:53:17 -0600 Subject: [PATCH 44/54] Made player script implementation closer to that of 1.12. --- src/main/java/noppes/npcs/CustomNpcs.java | 8 +- src/main/java/noppes/npcs/DataScript.java | 5 ++ src/main/java/noppes/npcs/EventHooks.java | 74 ++++++++--------- .../java/noppes/npcs/PacketHandlerServer.java | 9 +-- .../noppes/npcs/ScriptPlayerEventHandler.java | 7 +- .../client/gui/script/GuiScriptInterface.java | 2 +- .../client/gui/script/GuiScriptPlayers.java | 9 +-- .../npcs/controllers/IScriptHandler.java | 2 +- .../npcs/controllers/ScriptContainer.java | 3 + .../npcs/controllers/ScriptController.java | 6 +- .../controllers/data/ForgeDataScript.java | 2 +- .../controllers/data/PlayerDataScript.java | 81 ++++++------------- 12 files changed, 89 insertions(+), 119 deletions(-) diff --git a/src/main/java/noppes/npcs/CustomNpcs.java b/src/main/java/noppes/npcs/CustomNpcs.java index d1a6bcf2a..5d6b7fab4 100644 --- a/src/main/java/noppes/npcs/CustomNpcs.java +++ b/src/main/java/noppes/npcs/CustomNpcs.java @@ -173,13 +173,11 @@ public class CustomNpcs { proxy.load(); NetworkRegistry.INSTANCE.registerGuiHandler(this, proxy); - MinecraftForge.EVENT_BUS.register(new ServerEventsHandler()); MinecraftForge.EVENT_BUS.register(new ScriptController()); + MinecraftForge.EVENT_BUS.register((new ScriptPlayerEventHandler()).registerForgeEvents()); - ScriptPlayerEventHandler scriptPlayerEventHandler = new ScriptPlayerEventHandler(); - MinecraftForge.EVENT_BUS.register(scriptPlayerEventHandler); - FMLCommonHandler.instance().bus().register(scriptPlayerEventHandler.registerForgeEvents()); - FMLCommonHandler.instance().bus().register(new ServerTickHandler()); + MinecraftForge.EVENT_BUS.register(new ServerEventsHandler()); + FMLCommonHandler.instance().bus().register(new ServerTickHandler()); registerNpc(EntityNPCHumanMale.class, "npchumanmale"); registerNpc(EntityNPCVillager.class, "npcvillager"); diff --git a/src/main/java/noppes/npcs/DataScript.java b/src/main/java/noppes/npcs/DataScript.java index 4522b5cfd..6b6bcfdef 100644 --- a/src/main/java/noppes/npcs/DataScript.java +++ b/src/main/java/noppes/npcs/DataScript.java @@ -187,6 +187,11 @@ public class DataScript implements IScriptHandler { } + @Override + public void callScript(EnumScriptType var1, Event var2) { + + } + public boolean isClient() { return this.npc.isRemote(); } diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java index 7833cb110..d880305bf 100644 --- a/src/main/java/noppes/npcs/EventHooks.java +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -55,42 +55,42 @@ public class EventHooks { public static void onPlayerInit(PlayerDataScript handler) { noppes.npcs.scripted.event.PlayerEvent.InitEvent event = new noppes.npcs.scripted.event.PlayerEvent.InitEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.INIT, event, "event", event); + handler.callScript(EnumScriptType.INIT, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerTick(PlayerDataScript handler) { noppes.npcs.scripted.event.PlayerEvent.UpdateEvent event = new noppes.npcs.scripted.event.PlayerEvent.UpdateEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.TICK, event, "event", event); + handler.callScript(EnumScriptType.TICK, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerInteract(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.InteractEvent event) { - handler.callScript(EnumScriptType.INTERACT, event,"event", event); + handler.callScript(EnumScriptType.INTERACT, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onStartUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.StartUsingItem event = new PlayerEvent.StartUsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.START_USING_ITEM, event,"event", event); + handler.callScript(EnumScriptType.START_USING_ITEM, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.UsingItem event = new PlayerEvent.UsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.USING_ITEM, event,"event", event); + handler.callScript(EnumScriptType.USING_ITEM, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onStopUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.StopUsingItem event = new PlayerEvent.StopUsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.STOP_USING_ITEM, event,"event", event); + handler.callScript(EnumScriptType.STOP_USING_ITEM, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onFinishUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.FinishUsingItem event = new PlayerEvent.FinishUsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.FINISH_USING_ITEM, event,"event", event); + handler.callScript(EnumScriptType.FINISH_USING_ITEM, event); WrapperNpcAPI.EVENT_BUS.post(event); } @@ -99,178 +99,178 @@ public class EventHooks { for(int i = 0; i < entityItems.size(); i++){ items[i] = NpcAPI.Instance().getIItemStack(entityItems.get(i).getEntityItem()); } DropEvent event = new DropEvent(handler.getPlayer(), items); - handler.callScript(EnumScriptType.DROP, event,"event", event); + handler.callScript(EnumScriptType.DROP, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerPickupXP(PlayerDataScript handler, EntityXPOrb orb) { PlayerEvent.PickupXPEvent event = new PlayerEvent.PickupXPEvent(handler.getPlayer(), orb); - handler.callScript(EnumScriptType.PICKUP_XP, event,"event", event); + handler.callScript(EnumScriptType.PICKUP_XP, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerToss(PlayerDataScript handler, EntityItem entityItem) { PlayerEvent.TossEvent event = new PlayerEvent.TossEvent(handler.getPlayer(), NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); - handler.callScript(EnumScriptType.TOSS, event,"event", event); + handler.callScript(EnumScriptType.TOSS, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerPickUp(PlayerDataScript handler, EntityItem entityItem) { PickUpEvent event = new PickUpEvent(handler.getPlayer(), new ScriptItemStack(entityItem.getEntityItem()));//NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); - handler.callScript(EnumScriptType.PICKUP, event,"event", event); + handler.callScript(EnumScriptType.PICKUP, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerContainerOpen(PlayerDataScript handler, Container container) { ContainerOpen event = new ContainerOpen(handler.getPlayer(), NpcAPI.Instance().getIContainer(container)); - handler.callScript(EnumScriptType.CONTAINER_OPEN, event,"event", event); + handler.callScript(EnumScriptType.CONTAINER_OPEN, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerUseHoe(PlayerDataScript handler, ItemStack hoe, int x, int y, int z) { noppes.npcs.scripted.event.PlayerEvent.UseHoe event = new noppes.npcs.scripted.event.PlayerEvent.UseHoe(handler.getPlayer(), hoe, x, y, z); - handler.callScript(EnumScriptType.USE_HOE, event,"event", event); + handler.callScript(EnumScriptType.USE_HOE, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerSleep(PlayerDataScript handler, int x, int y, int z) { noppes.npcs.scripted.event.PlayerEvent.Sleep event = new noppes.npcs.scripted.event.PlayerEvent.Sleep(handler.getPlayer(), x, y, z); - handler.callScript(EnumScriptType.SLEEP, event,"event", event); + handler.callScript(EnumScriptType.SLEEP, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerWakeUp(PlayerDataScript handler, boolean setSpawn) { noppes.npcs.scripted.event.PlayerEvent.WakeUp event = new noppes.npcs.scripted.event.PlayerEvent.WakeUp(handler.getPlayer(), setSpawn); - handler.callScript(EnumScriptType.WAKE_UP, event,"event", event); + handler.callScript(EnumScriptType.WAKE_UP, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerDeath(PlayerDataScript handler, DamageSource source, Entity entity) { noppes.npcs.scripted.event.PlayerEvent.DiedEvent event = new noppes.npcs.scripted.event.PlayerEvent.DiedEvent(handler.getPlayer(), source, entity); - handler.callScript(EnumScriptType.KILLED, event,"event", event); + handler.callScript(EnumScriptType.KILLED, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerKills(PlayerDataScript handler, EntityLivingBase entityLiving) { noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent event = new noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent(handler.getPlayer(), entityLiving); - handler.callScript(EnumScriptType.KILLS, event,"event", event); + handler.callScript(EnumScriptType.KILLS, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerDamaged(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.DamagedEvent event) { - handler.callScript(EnumScriptType.DAMAGED, event,"event", event); + handler.callScript(EnumScriptType.DAMAGED, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerLightning(PlayerDataScript handler) { PlayerEvent.LightningEvent event = new PlayerEvent.LightningEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.LIGHTNING, event, "event", event); + handler.callScript(EnumScriptType.LIGHTNING, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerSound(PlayerDataScript handler, String name, float pitch, float volume) { PlayerEvent.SoundEvent event = new PlayerEvent.SoundEvent(handler.getPlayer(), name, pitch, volume); - handler.callScript(EnumScriptType.PLAYSOUND, event,"event", event); + handler.callScript(EnumScriptType.PLAYSOUND, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerFall(PlayerDataScript handler, float distance) { PlayerEvent.FallEvent event = new PlayerEvent.FallEvent(handler.getPlayer(),distance); - handler.callScript(EnumScriptType.FALL, event,"event", event); + handler.callScript(EnumScriptType.FALL, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerJump(PlayerDataScript handler) { PlayerEvent.JumpEvent event = new PlayerEvent.JumpEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.JUMP, event,"event", event); + handler.callScript(EnumScriptType.JUMP, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerLogin(PlayerDataScript handler) { LoginEvent event = new LoginEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.LOGIN, event, "event", event); + handler.callScript(EnumScriptType.LOGIN, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerAchievement(PlayerDataScript handler, String description) { PlayerEvent.Achievement event = new PlayerEvent.Achievement(handler.getPlayer(), description); - handler.callScript(EnumScriptType.ACHIEVEMENT, event, "event", event); + handler.callScript(EnumScriptType.ACHIEVEMENT, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerFillBucket(PlayerDataScript handler, ItemStack current, ItemStack result) { PlayerEvent.FillBucket event = new PlayerEvent.FillBucket(handler.getPlayer(), current, result); - handler.callScript(EnumScriptType.FILL_BUCKET, event, "event", event); + handler.callScript(EnumScriptType.FILL_BUCKET, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerBonemeal(PlayerDataScript handler, int x, int y, int z, World world) { PlayerEvent.Bonemeal event = new PlayerEvent.Bonemeal(handler.getPlayer(), x, y, z, world); - handler.callScript(EnumScriptType.BONEMEAL, event, "event", event); + handler.callScript(EnumScriptType.BONEMEAL, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerRespawn(PlayerDataScript handler) { PlayerEvent.RespawnEvent event = new PlayerEvent.RespawnEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.RESPAWN, event, "event", event); + handler.callScript(EnumScriptType.RESPAWN, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerLogout(PlayerDataScript handler) { LogoutEvent event = new LogoutEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.LOGOUT, event, "event", event); + handler.callScript(EnumScriptType.LOGOUT, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerChat(PlayerDataScript handler, ChatEvent event) { - handler.callScript(EnumScriptType.CHAT, event,"event", event); + handler.callScript(EnumScriptType.CHAT, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerBowCharge(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.RangedChargeEvent event) { - handler.callScript(EnumScriptType.RANGED_CHARGE, event,"event", event); + handler.callScript(EnumScriptType.RANGED_CHARGE, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerRanged(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.RangedLaunchedEvent event) { - handler.callScript(EnumScriptType.RANGED_LAUNCHED, event,"event", event); + handler.callScript(EnumScriptType.RANGED_LAUNCHED, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerDamagedEntity(PlayerDataScript handler, DamagedEntityEvent event) { - handler.callScript(EnumScriptType.DAMAGED_ENTITY, event,"event", event); + handler.callScript(EnumScriptType.DAMAGED_ENTITY, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerChangeDim(PlayerDataScript handler, int fromDim, int toDim) { PlayerEvent.ChangedDimension event = new PlayerEvent.ChangedDimension(handler.getPlayer(), fromDim, toDim); - handler.callScript(EnumScriptType.CHANGED_DIM, event,"event", event); + handler.callScript(EnumScriptType.CHANGED_DIM, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerMouseClicked(EntityPlayerMP player, int button, int mouseWheel, boolean buttonDown) { PlayerDataScript handler = PlayerData.get(player).scriptData; PlayerEvent.MouseClickedEvent event = new PlayerEvent.MouseClickedEvent(handler.getPlayer(), button, mouseWheel, buttonDown); - handler.callScript(EnumScriptType.MOUSE_CLICKED, event,"event", event); + handler.callScript(EnumScriptType.MOUSE_CLICKED, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerKeyPressed(EntityPlayerMP player, int button, boolean isCtrlPressed, boolean isShiftPressed, boolean isAltPressed, boolean isMetaPressed, boolean buttonDown) { PlayerDataScript handler = PlayerData.get(player).scriptData; KeyPressedEvent event = new KeyPressedEvent(handler.getPlayer(), button, isCtrlPressed, isAltPressed, isShiftPressed, isMetaPressed, buttonDown); - handler.callScript(EnumScriptType.KEY_PRESSED, event,"event", event); + handler.callScript(EnumScriptType.KEY_PRESSED, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerTimer(PlayerData data, int id) { PlayerDataScript handler = data.scriptData; noppes.npcs.scripted.event.PlayerEvent.TimerEvent event = new noppes.npcs.scripted.event.PlayerEvent.TimerEvent(handler.getPlayer(), id); - handler.callScript(EnumScriptType.TIMER, event,"event", event); + handler.callScript(EnumScriptType.TIMER, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerBreak(PlayerDataScript handler, PlayerEvent.BreakEvent event) { - handler.callScript(EnumScriptType.BREAK_BLOCK, event,"event", event); + handler.callScript(EnumScriptType.BREAK_BLOCK, event); return WrapperNpcAPI.EVENT_BUS.post(event); } diff --git a/src/main/java/noppes/npcs/PacketHandlerServer.java b/src/main/java/noppes/npcs/PacketHandlerServer.java index 6e4f42fbb..d03bc9389 100644 --- a/src/main/java/noppes/npcs/PacketHandlerServer.java +++ b/src/main/java/noppes/npcs/PacketHandlerServer.java @@ -145,12 +145,11 @@ public class PacketHandlerServer{ private void playerScriptPackets(EnumPacketServer type, ByteBuf buffer, EntityPlayerMP player) throws Exception { NBTTagCompound compound; - if(type == EnumPacketServer.ScriptPlayerGet) { - PlayerDataScript data = ScriptController.Instance.playerScripts; - compound = data.writeToNBT(new NBTTagCompound()); + if (type == EnumPacketServer.ScriptPlayerGet) { + compound = ScriptController.Instance.playerScripts.writeToNBT(new NBTTagCompound()); compound.setTag("Languages", ScriptController.Instance.nbtLanguages()); - Server.sendData(player, EnumPacketClient.GUI_DATA, compound); - } else if(type == EnumPacketServer.ScriptPlayerSave) { + Server.sendData(player, EnumPacketClient.GUI_DATA, new Object[]{compound}); + } else if (type == EnumPacketServer.ScriptPlayerSave) { ScriptController.Instance.setPlayerScripts(Server.readNBT(buffer)); } } diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 8aea2035f..4669a8784 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -62,11 +62,12 @@ public class ScriptPlayerEventHandler { } @SubscribeEvent public void onServerTick(TickEvent.PlayerTickEvent event) { - if(event.side == Side.SERVER && event.phase == TickEvent.Phase.START) { + if (event.side == Side.SERVER && event.phase == TickEvent.Phase.START) { EntityPlayer player = event.player; PlayerData data = PlayerData.get(player); - EventHooks.onPlayerTick(data.scriptData); - + if(player.ticksExisted%10 == 0) { + EventHooks.onPlayerTick(data.scriptData); + } if(PlayerDataController.instance != null) { PlayerDataController.instance.getPlayerData(player).scriptData = data.scriptData; PlayerDataController.instance.getPlayerData(player).timers.update(); diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java index 34955b4af..2577fd211 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java @@ -350,7 +350,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb } if(guibutton.id == 104) { - this.handler.setEnabled((((GuiNpcButton)guibutton).getValue() == 1)); + this.handler.setEnabled(((GuiNpcButton)guibutton).getValue() == 1); } if(guibutton.id == 105) { diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java index 79dd8753c..3357b4012 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java @@ -17,7 +17,7 @@ public class GuiScriptPlayers extends GuiScriptInterface { public GuiScriptPlayers() { this.handler = this.script; - Client.sendData(EnumPacketServer.ScriptPlayerGet); + Client.sendData(EnumPacketServer.ScriptPlayerGet, new Object[0]); } public void setGuiData(NBTTagCompound compound) { @@ -27,11 +27,6 @@ public class GuiScriptPlayers extends GuiScriptInterface { public void save() { super.save(); - Client.sendData(EnumPacketServer.ScriptPlayerSave, script.writeToNBT(new NBTTagCompound())); - } - - public void close() { - super.close(); - ScriptController.Instance.playerScripts.errored.clear(); + Client.sendData(EnumPacketServer.ScriptPlayerSave, new Object[]{this.script.writeToNBT(new NBTTagCompound())}); } } diff --git a/src/main/java/noppes/npcs/controllers/IScriptHandler.java b/src/main/java/noppes/npcs/controllers/IScriptHandler.java index c52b9f852..4ece1fbca 100644 --- a/src/main/java/noppes/npcs/controllers/IScriptHandler.java +++ b/src/main/java/noppes/npcs/controllers/IScriptHandler.java @@ -11,7 +11,7 @@ import cpw.mods.fml.common.eventhandler.Event; import noppes.npcs.constants.EnumScriptType; public interface IScriptHandler { - void callScript(EnumScriptType var1, Event var2, Object... obs); + void callScript(EnumScriptType var1, Event var2); boolean isClient(); diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index f252a871f..9a2f68d3e 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -20,6 +20,7 @@ import noppes.npcs.CustomNpcs; import noppes.npcs.NBTTags; import noppes.npcs.NoppesUtilServer; import noppes.npcs.constants.EnumScriptType; +import noppes.npcs.scripted.NpcAPI; import scala.Char; public class ScriptContainer { @@ -142,6 +143,8 @@ public class ScriptContainer { this.engine.getContext().setWriter(pw); this.engine.getContext().setErrorWriter(pw); + this.engine.put("API", NpcAPI.Instance()); + try { if (!this.init) { this.engine.eval(this.getFullCode()); diff --git a/src/main/java/noppes/npcs/controllers/ScriptController.java b/src/main/java/noppes/npcs/controllers/ScriptController.java index 83415bd1a..8c871ddc4 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptController.java +++ b/src/main/java/noppes/npcs/controllers/ScriptController.java @@ -114,7 +114,7 @@ public class ScriptController { } private File playerScriptsFile() { - return new File(dir, "player_scripts.json"); + return new File(this.dir, "player_scripts.json"); } public boolean loadPlayerScripts() { @@ -122,11 +122,10 @@ public class ScriptController { File file = this.playerScriptsFile(); try { - if(!file.exists()) { + if (!file.exists()) { return false; } else { this.playerScripts.readFromNBT(NBTJsonUtil.LoadFile(file)); - shouldSave = false; return true; } } catch (Exception var3) { @@ -147,6 +146,7 @@ public class ScriptController { } catch (JsonException var5) { var5.printStackTrace(); } + } private void loadCategories(){ diff --git a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java index eb831b2f1..59ae206b1 100644 --- a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java @@ -51,7 +51,7 @@ public class ForgeDataScript implements IScriptHandler { } @Override - public void callScript(EnumScriptType var1, Event var2, Object... obs) { + public void callScript(EnumScriptType var1, Event var2) { callScript(var1.function, var2); } diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java index 3394672b7..7129dc274 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java @@ -32,33 +32,24 @@ import javax.annotation.CheckForNull; import javax.script.ScriptEngine; public class PlayerDataScript implements IScriptHandler { - public List scripts = new ArrayList(); - public String scriptLanguage = "ECMAScript"; + private List scripts = new ArrayList(); + private String scriptLanguage = "ECMAScript"; private EntityPlayer player; private IPlayer playerAPI; private long lastPlayerUpdate = 0L; public long lastInited = -1L; public boolean hadInteract = true; - public boolean enabled = false; - private Map console = new TreeMap(); - public List errored = new ArrayList(); - - public IPlayer dummyPlayer; - public IWorld dummyWorld; + private boolean enabled = false; + private static Map console = new TreeMap(); + private static List errored = new ArrayList(); public PlayerDataScript(EntityPlayer player) { - if(player != null) { - this.player = player; - if (player instanceof EntityPlayer) - dummyPlayer = (IPlayer) ScriptController.Instance.getScriptForEntity(this.player); - if (player.worldObj instanceof WorldServer) - dummyWorld = (IWorld) NpcAPI.Instance().getIWorld((WorldServer) this.player.worldObj); - } + this.player = player; } public void clear() { - this.console = new TreeMap(); - this.errored = new ArrayList(); + console = new TreeMap(); + errored = new ArrayList(); this.scripts = new ArrayList(); } @@ -66,7 +57,7 @@ public class PlayerDataScript implements IScriptHandler { this.scripts = NBTTags.GetScript(compound.getTagList("Scripts", 10), this); this.scriptLanguage = compound.getString("ScriptLanguage"); this.enabled = compound.getBoolean("ScriptEnabled"); - this.console = NBTTags.GetLongStringMap(compound.getTagList("ScriptConsole", 10)); + console = NBTTags.GetLongStringMap(compound.getTagList("ScriptConsole", 10)); } public NBTTagCompound writeToNBT(NBTTagCompound compound) { @@ -77,72 +68,51 @@ public class PlayerDataScript implements IScriptHandler { return compound; } - public void callScript(EnumScriptType type, Event event, Object... obs) { - if(this.isEnabled()) { + public void callScript(EnumScriptType type, Event event) { + if (this.isEnabled()) { ScriptContainer script; - if(ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { + if (ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { this.lastInited = ScriptController.Instance.lastLoaded; - //ScriptController.Instance.playerScripts.errored.clear(); - if(this.player != null) { + errored.clear(); + if (this.player != null) { this.scripts.clear(); - Iterator i = ScriptController.Instance.playerScripts.scripts.iterator(); + Iterator var3 = ScriptController.Instance.playerScripts.scripts.iterator(); - while(i.hasNext()) { - script = (ScriptContainer)i.next(); + while(var3.hasNext()) { + script = (ScriptContainer)var3.next(); ScriptContainer s = new ScriptContainer(this); s.readFromNBT(script.writeToNBT(new NBTTagCompound())); - this.scripts.add(s); } } this.lastPlayerUpdate = ScriptController.Instance.lastPlayerUpdate; - if(type != EnumScriptType.INIT) { + if (type != EnumScriptType.INIT) { EventHooks.onPlayerInit(this); } } - for(int var7 = 0; var7 < this.scripts.size(); ++var7) { - script = (ScriptContainer)this.scripts.get(var7); - - if(!ScriptController.Instance.playerScripts.errored.contains(Integer.valueOf(var7))) { - if(script == null || script.errored || !script.hasCode()) - return; - script.setEngine(scriptLanguage); - if(script.engine == null) - return; - for(int i = 0; i + 1 < obs.length; i += 2){ - Object ob = obs[i + 1]; - if(ob instanceof Entity) - ob = ScriptController.Instance.getScriptForEntity((Entity)ob); - script.engine.put(obs[i].toString(), ob); - } - - ScriptEngine engine = script.engine; - engine.put("world", dummyWorld); - engine.put("player", dummyPlayer); - PlayerEvent result = (PlayerEvent) engine.get("event"); - if(result == null) - engine.put("event", result = new PlayerEvent(this.getPlayer())); - script.engine.put("API", new WrapperNpcAPI()); + for(int i = 0; i < this.scripts.size(); ++i) { + script = (ScriptContainer)this.scripts.get(i); + if (!errored.contains(i)) { script.run(type, event); - if (script.errored) { - ScriptController.Instance.playerScripts.errored.add(var7); + errored.add(i); } Iterator var8 = script.console.entrySet().iterator(); while(var8.hasNext()) { Entry entry = (Entry)var8.next(); - if (!ScriptController.Instance.playerScripts.console.containsKey(entry.getKey())) { - ScriptController.Instance.playerScripts.console.put(entry.getKey(), " tab " + (var7 + 1) + ":\n" + (String)entry.getValue()); + if (!console.containsKey(entry.getKey())) { + console.put(entry.getKey(), " tab " + (i + 1) + ":\n" + (String)entry.getValue()); } } script.console.clear(); } } + } } @@ -160,7 +130,6 @@ public class PlayerDataScript implements IScriptHandler { public void setEnabled(boolean bo) { ScriptController.Instance.playerScripts.enabled = bo; - this.enabled = bo; } public String getLanguage() { From 6bdc68337cfcc6f3ace56cb6554e39f796953af7 Mon Sep 17 00:00:00 2001 From: luisc Date: Thu, 16 Dec 2021 04:05:05 -0600 Subject: [PATCH 45/54] Revert "Made player script implementation closer to that of 1.12." This reverts commit 3a9789b3fd59bf089260729c68e7e9008425f26a. --- src/main/java/noppes/npcs/CustomNpcs.java | 10 ++- src/main/java/noppes/npcs/DataScript.java | 5 -- src/main/java/noppes/npcs/EventHooks.java | 74 ++++++++--------- .../java/noppes/npcs/PacketHandlerServer.java | 9 ++- .../noppes/npcs/ScriptPlayerEventHandler.java | 7 +- .../client/gui/script/GuiScriptInterface.java | 2 +- .../client/gui/script/GuiScriptPlayers.java | 9 ++- .../npcs/controllers/IScriptHandler.java | 2 +- .../npcs/controllers/ScriptContainer.java | 3 - .../npcs/controllers/ScriptController.java | 6 +- .../controllers/data/ForgeDataScript.java | 2 +- .../controllers/data/PlayerDataScript.java | 81 +++++++++++++------ 12 files changed, 120 insertions(+), 90 deletions(-) diff --git a/src/main/java/noppes/npcs/CustomNpcs.java b/src/main/java/noppes/npcs/CustomNpcs.java index 5d6b7fab4..d1a6bcf2a 100644 --- a/src/main/java/noppes/npcs/CustomNpcs.java +++ b/src/main/java/noppes/npcs/CustomNpcs.java @@ -173,11 +173,13 @@ public class CustomNpcs { proxy.load(); NetworkRegistry.INSTANCE.registerGuiHandler(this, proxy); - MinecraftForge.EVENT_BUS.register(new ScriptController()); - MinecraftForge.EVENT_BUS.register((new ScriptPlayerEventHandler()).registerForgeEvents()); - MinecraftForge.EVENT_BUS.register(new ServerEventsHandler()); - FMLCommonHandler.instance().bus().register(new ServerTickHandler()); + MinecraftForge.EVENT_BUS.register(new ScriptController()); + + ScriptPlayerEventHandler scriptPlayerEventHandler = new ScriptPlayerEventHandler(); + MinecraftForge.EVENT_BUS.register(scriptPlayerEventHandler); + FMLCommonHandler.instance().bus().register(scriptPlayerEventHandler.registerForgeEvents()); + FMLCommonHandler.instance().bus().register(new ServerTickHandler()); registerNpc(EntityNPCHumanMale.class, "npchumanmale"); registerNpc(EntityNPCVillager.class, "npcvillager"); diff --git a/src/main/java/noppes/npcs/DataScript.java b/src/main/java/noppes/npcs/DataScript.java index 6b6bcfdef..4522b5cfd 100644 --- a/src/main/java/noppes/npcs/DataScript.java +++ b/src/main/java/noppes/npcs/DataScript.java @@ -187,11 +187,6 @@ public class DataScript implements IScriptHandler { } - @Override - public void callScript(EnumScriptType var1, Event var2) { - - } - public boolean isClient() { return this.npc.isRemote(); } diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java index d880305bf..7833cb110 100644 --- a/src/main/java/noppes/npcs/EventHooks.java +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -55,42 +55,42 @@ public class EventHooks { public static void onPlayerInit(PlayerDataScript handler) { noppes.npcs.scripted.event.PlayerEvent.InitEvent event = new noppes.npcs.scripted.event.PlayerEvent.InitEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.INIT, event); + handler.callScript(EnumScriptType.INIT, event, "event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerTick(PlayerDataScript handler) { noppes.npcs.scripted.event.PlayerEvent.UpdateEvent event = new noppes.npcs.scripted.event.PlayerEvent.UpdateEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.TICK, event); + handler.callScript(EnumScriptType.TICK, event, "event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerInteract(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.InteractEvent event) { - handler.callScript(EnumScriptType.INTERACT, event); + handler.callScript(EnumScriptType.INTERACT, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onStartUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.StartUsingItem event = new PlayerEvent.StartUsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.START_USING_ITEM, event); + handler.callScript(EnumScriptType.START_USING_ITEM, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.UsingItem event = new PlayerEvent.UsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.USING_ITEM, event); + handler.callScript(EnumScriptType.USING_ITEM, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onStopUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.StopUsingItem event = new PlayerEvent.StopUsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.STOP_USING_ITEM, event); + handler.callScript(EnumScriptType.STOP_USING_ITEM, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onFinishUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.FinishUsingItem event = new PlayerEvent.FinishUsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.FINISH_USING_ITEM, event); + handler.callScript(EnumScriptType.FINISH_USING_ITEM, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } @@ -99,178 +99,178 @@ public class EventHooks { for(int i = 0; i < entityItems.size(); i++){ items[i] = NpcAPI.Instance().getIItemStack(entityItems.get(i).getEntityItem()); } DropEvent event = new DropEvent(handler.getPlayer(), items); - handler.callScript(EnumScriptType.DROP, event); + handler.callScript(EnumScriptType.DROP, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerPickupXP(PlayerDataScript handler, EntityXPOrb orb) { PlayerEvent.PickupXPEvent event = new PlayerEvent.PickupXPEvent(handler.getPlayer(), orb); - handler.callScript(EnumScriptType.PICKUP_XP, event); + handler.callScript(EnumScriptType.PICKUP_XP, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerToss(PlayerDataScript handler, EntityItem entityItem) { PlayerEvent.TossEvent event = new PlayerEvent.TossEvent(handler.getPlayer(), NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); - handler.callScript(EnumScriptType.TOSS, event); + handler.callScript(EnumScriptType.TOSS, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerPickUp(PlayerDataScript handler, EntityItem entityItem) { PickUpEvent event = new PickUpEvent(handler.getPlayer(), new ScriptItemStack(entityItem.getEntityItem()));//NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); - handler.callScript(EnumScriptType.PICKUP, event); + handler.callScript(EnumScriptType.PICKUP, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerContainerOpen(PlayerDataScript handler, Container container) { ContainerOpen event = new ContainerOpen(handler.getPlayer(), NpcAPI.Instance().getIContainer(container)); - handler.callScript(EnumScriptType.CONTAINER_OPEN, event); + handler.callScript(EnumScriptType.CONTAINER_OPEN, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerUseHoe(PlayerDataScript handler, ItemStack hoe, int x, int y, int z) { noppes.npcs.scripted.event.PlayerEvent.UseHoe event = new noppes.npcs.scripted.event.PlayerEvent.UseHoe(handler.getPlayer(), hoe, x, y, z); - handler.callScript(EnumScriptType.USE_HOE, event); + handler.callScript(EnumScriptType.USE_HOE, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerSleep(PlayerDataScript handler, int x, int y, int z) { noppes.npcs.scripted.event.PlayerEvent.Sleep event = new noppes.npcs.scripted.event.PlayerEvent.Sleep(handler.getPlayer(), x, y, z); - handler.callScript(EnumScriptType.SLEEP, event); + handler.callScript(EnumScriptType.SLEEP, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerWakeUp(PlayerDataScript handler, boolean setSpawn) { noppes.npcs.scripted.event.PlayerEvent.WakeUp event = new noppes.npcs.scripted.event.PlayerEvent.WakeUp(handler.getPlayer(), setSpawn); - handler.callScript(EnumScriptType.WAKE_UP, event); + handler.callScript(EnumScriptType.WAKE_UP, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerDeath(PlayerDataScript handler, DamageSource source, Entity entity) { noppes.npcs.scripted.event.PlayerEvent.DiedEvent event = new noppes.npcs.scripted.event.PlayerEvent.DiedEvent(handler.getPlayer(), source, entity); - handler.callScript(EnumScriptType.KILLED, event); + handler.callScript(EnumScriptType.KILLED, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerKills(PlayerDataScript handler, EntityLivingBase entityLiving) { noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent event = new noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent(handler.getPlayer(), entityLiving); - handler.callScript(EnumScriptType.KILLS, event); + handler.callScript(EnumScriptType.KILLS, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerDamaged(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.DamagedEvent event) { - handler.callScript(EnumScriptType.DAMAGED, event); + handler.callScript(EnumScriptType.DAMAGED, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerLightning(PlayerDataScript handler) { PlayerEvent.LightningEvent event = new PlayerEvent.LightningEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.LIGHTNING, event); + handler.callScript(EnumScriptType.LIGHTNING, event, "event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerSound(PlayerDataScript handler, String name, float pitch, float volume) { PlayerEvent.SoundEvent event = new PlayerEvent.SoundEvent(handler.getPlayer(), name, pitch, volume); - handler.callScript(EnumScriptType.PLAYSOUND, event); + handler.callScript(EnumScriptType.PLAYSOUND, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerFall(PlayerDataScript handler, float distance) { PlayerEvent.FallEvent event = new PlayerEvent.FallEvent(handler.getPlayer(),distance); - handler.callScript(EnumScriptType.FALL, event); + handler.callScript(EnumScriptType.FALL, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerJump(PlayerDataScript handler) { PlayerEvent.JumpEvent event = new PlayerEvent.JumpEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.JUMP, event); + handler.callScript(EnumScriptType.JUMP, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerLogin(PlayerDataScript handler) { LoginEvent event = new LoginEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.LOGIN, event); + handler.callScript(EnumScriptType.LOGIN, event, "event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerAchievement(PlayerDataScript handler, String description) { PlayerEvent.Achievement event = new PlayerEvent.Achievement(handler.getPlayer(), description); - handler.callScript(EnumScriptType.ACHIEVEMENT, event); + handler.callScript(EnumScriptType.ACHIEVEMENT, event, "event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerFillBucket(PlayerDataScript handler, ItemStack current, ItemStack result) { PlayerEvent.FillBucket event = new PlayerEvent.FillBucket(handler.getPlayer(), current, result); - handler.callScript(EnumScriptType.FILL_BUCKET, event); + handler.callScript(EnumScriptType.FILL_BUCKET, event, "event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerBonemeal(PlayerDataScript handler, int x, int y, int z, World world) { PlayerEvent.Bonemeal event = new PlayerEvent.Bonemeal(handler.getPlayer(), x, y, z, world); - handler.callScript(EnumScriptType.BONEMEAL, event); + handler.callScript(EnumScriptType.BONEMEAL, event, "event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerRespawn(PlayerDataScript handler) { PlayerEvent.RespawnEvent event = new PlayerEvent.RespawnEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.RESPAWN, event); + handler.callScript(EnumScriptType.RESPAWN, event, "event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerLogout(PlayerDataScript handler) { LogoutEvent event = new LogoutEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.LOGOUT, event); + handler.callScript(EnumScriptType.LOGOUT, event, "event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerChat(PlayerDataScript handler, ChatEvent event) { - handler.callScript(EnumScriptType.CHAT, event); + handler.callScript(EnumScriptType.CHAT, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerBowCharge(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.RangedChargeEvent event) { - handler.callScript(EnumScriptType.RANGED_CHARGE, event); + handler.callScript(EnumScriptType.RANGED_CHARGE, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerRanged(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.RangedLaunchedEvent event) { - handler.callScript(EnumScriptType.RANGED_LAUNCHED, event); + handler.callScript(EnumScriptType.RANGED_LAUNCHED, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerDamagedEntity(PlayerDataScript handler, DamagedEntityEvent event) { - handler.callScript(EnumScriptType.DAMAGED_ENTITY, event); + handler.callScript(EnumScriptType.DAMAGED_ENTITY, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerChangeDim(PlayerDataScript handler, int fromDim, int toDim) { PlayerEvent.ChangedDimension event = new PlayerEvent.ChangedDimension(handler.getPlayer(), fromDim, toDim); - handler.callScript(EnumScriptType.CHANGED_DIM, event); + handler.callScript(EnumScriptType.CHANGED_DIM, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerMouseClicked(EntityPlayerMP player, int button, int mouseWheel, boolean buttonDown) { PlayerDataScript handler = PlayerData.get(player).scriptData; PlayerEvent.MouseClickedEvent event = new PlayerEvent.MouseClickedEvent(handler.getPlayer(), button, mouseWheel, buttonDown); - handler.callScript(EnumScriptType.MOUSE_CLICKED, event); + handler.callScript(EnumScriptType.MOUSE_CLICKED, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerKeyPressed(EntityPlayerMP player, int button, boolean isCtrlPressed, boolean isShiftPressed, boolean isAltPressed, boolean isMetaPressed, boolean buttonDown) { PlayerDataScript handler = PlayerData.get(player).scriptData; KeyPressedEvent event = new KeyPressedEvent(handler.getPlayer(), button, isCtrlPressed, isAltPressed, isShiftPressed, isMetaPressed, buttonDown); - handler.callScript(EnumScriptType.KEY_PRESSED, event); + handler.callScript(EnumScriptType.KEY_PRESSED, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerTimer(PlayerData data, int id) { PlayerDataScript handler = data.scriptData; noppes.npcs.scripted.event.PlayerEvent.TimerEvent event = new noppes.npcs.scripted.event.PlayerEvent.TimerEvent(handler.getPlayer(), id); - handler.callScript(EnumScriptType.TIMER, event); + handler.callScript(EnumScriptType.TIMER, event,"event", event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerBreak(PlayerDataScript handler, PlayerEvent.BreakEvent event) { - handler.callScript(EnumScriptType.BREAK_BLOCK, event); + handler.callScript(EnumScriptType.BREAK_BLOCK, event,"event", event); return WrapperNpcAPI.EVENT_BUS.post(event); } diff --git a/src/main/java/noppes/npcs/PacketHandlerServer.java b/src/main/java/noppes/npcs/PacketHandlerServer.java index d03bc9389..6e4f42fbb 100644 --- a/src/main/java/noppes/npcs/PacketHandlerServer.java +++ b/src/main/java/noppes/npcs/PacketHandlerServer.java @@ -145,11 +145,12 @@ public class PacketHandlerServer{ private void playerScriptPackets(EnumPacketServer type, ByteBuf buffer, EntityPlayerMP player) throws Exception { NBTTagCompound compound; - if (type == EnumPacketServer.ScriptPlayerGet) { - compound = ScriptController.Instance.playerScripts.writeToNBT(new NBTTagCompound()); + if(type == EnumPacketServer.ScriptPlayerGet) { + PlayerDataScript data = ScriptController.Instance.playerScripts; + compound = data.writeToNBT(new NBTTagCompound()); compound.setTag("Languages", ScriptController.Instance.nbtLanguages()); - Server.sendData(player, EnumPacketClient.GUI_DATA, new Object[]{compound}); - } else if (type == EnumPacketServer.ScriptPlayerSave) { + Server.sendData(player, EnumPacketClient.GUI_DATA, compound); + } else if(type == EnumPacketServer.ScriptPlayerSave) { ScriptController.Instance.setPlayerScripts(Server.readNBT(buffer)); } } diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 4669a8784..8aea2035f 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -62,12 +62,11 @@ public class ScriptPlayerEventHandler { } @SubscribeEvent public void onServerTick(TickEvent.PlayerTickEvent event) { - if (event.side == Side.SERVER && event.phase == TickEvent.Phase.START) { + if(event.side == Side.SERVER && event.phase == TickEvent.Phase.START) { EntityPlayer player = event.player; PlayerData data = PlayerData.get(player); - if(player.ticksExisted%10 == 0) { - EventHooks.onPlayerTick(data.scriptData); - } + EventHooks.onPlayerTick(data.scriptData); + if(PlayerDataController.instance != null) { PlayerDataController.instance.getPlayerData(player).scriptData = data.scriptData; PlayerDataController.instance.getPlayerData(player).timers.update(); diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java index 2577fd211..34955b4af 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java @@ -350,7 +350,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb } if(guibutton.id == 104) { - this.handler.setEnabled(((GuiNpcButton)guibutton).getValue() == 1); + this.handler.setEnabled((((GuiNpcButton)guibutton).getValue() == 1)); } if(guibutton.id == 105) { diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java index 3357b4012..79dd8753c 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java @@ -17,7 +17,7 @@ public class GuiScriptPlayers extends GuiScriptInterface { public GuiScriptPlayers() { this.handler = this.script; - Client.sendData(EnumPacketServer.ScriptPlayerGet, new Object[0]); + Client.sendData(EnumPacketServer.ScriptPlayerGet); } public void setGuiData(NBTTagCompound compound) { @@ -27,6 +27,11 @@ public class GuiScriptPlayers extends GuiScriptInterface { public void save() { super.save(); - Client.sendData(EnumPacketServer.ScriptPlayerSave, new Object[]{this.script.writeToNBT(new NBTTagCompound())}); + Client.sendData(EnumPacketServer.ScriptPlayerSave, script.writeToNBT(new NBTTagCompound())); + } + + public void close() { + super.close(); + ScriptController.Instance.playerScripts.errored.clear(); } } diff --git a/src/main/java/noppes/npcs/controllers/IScriptHandler.java b/src/main/java/noppes/npcs/controllers/IScriptHandler.java index 4ece1fbca..c52b9f852 100644 --- a/src/main/java/noppes/npcs/controllers/IScriptHandler.java +++ b/src/main/java/noppes/npcs/controllers/IScriptHandler.java @@ -11,7 +11,7 @@ import cpw.mods.fml.common.eventhandler.Event; import noppes.npcs.constants.EnumScriptType; public interface IScriptHandler { - void callScript(EnumScriptType var1, Event var2); + void callScript(EnumScriptType var1, Event var2, Object... obs); boolean isClient(); diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index 9a2f68d3e..f252a871f 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -20,7 +20,6 @@ import noppes.npcs.CustomNpcs; import noppes.npcs.NBTTags; import noppes.npcs.NoppesUtilServer; import noppes.npcs.constants.EnumScriptType; -import noppes.npcs.scripted.NpcAPI; import scala.Char; public class ScriptContainer { @@ -143,8 +142,6 @@ public class ScriptContainer { this.engine.getContext().setWriter(pw); this.engine.getContext().setErrorWriter(pw); - this.engine.put("API", NpcAPI.Instance()); - try { if (!this.init) { this.engine.eval(this.getFullCode()); diff --git a/src/main/java/noppes/npcs/controllers/ScriptController.java b/src/main/java/noppes/npcs/controllers/ScriptController.java index 8c871ddc4..83415bd1a 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptController.java +++ b/src/main/java/noppes/npcs/controllers/ScriptController.java @@ -114,7 +114,7 @@ public class ScriptController { } private File playerScriptsFile() { - return new File(this.dir, "player_scripts.json"); + return new File(dir, "player_scripts.json"); } public boolean loadPlayerScripts() { @@ -122,10 +122,11 @@ public class ScriptController { File file = this.playerScriptsFile(); try { - if (!file.exists()) { + if(!file.exists()) { return false; } else { this.playerScripts.readFromNBT(NBTJsonUtil.LoadFile(file)); + shouldSave = false; return true; } } catch (Exception var3) { @@ -146,7 +147,6 @@ public class ScriptController { } catch (JsonException var5) { var5.printStackTrace(); } - } private void loadCategories(){ diff --git a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java index 59ae206b1..eb831b2f1 100644 --- a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java @@ -51,7 +51,7 @@ public class ForgeDataScript implements IScriptHandler { } @Override - public void callScript(EnumScriptType var1, Event var2) { + public void callScript(EnumScriptType var1, Event var2, Object... obs) { callScript(var1.function, var2); } diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java index 7129dc274..3394672b7 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java @@ -32,24 +32,33 @@ import javax.annotation.CheckForNull; import javax.script.ScriptEngine; public class PlayerDataScript implements IScriptHandler { - private List scripts = new ArrayList(); - private String scriptLanguage = "ECMAScript"; + public List scripts = new ArrayList(); + public String scriptLanguage = "ECMAScript"; private EntityPlayer player; private IPlayer playerAPI; private long lastPlayerUpdate = 0L; public long lastInited = -1L; public boolean hadInteract = true; - private boolean enabled = false; - private static Map console = new TreeMap(); - private static List errored = new ArrayList(); + public boolean enabled = false; + private Map console = new TreeMap(); + public List errored = new ArrayList(); + + public IPlayer dummyPlayer; + public IWorld dummyWorld; public PlayerDataScript(EntityPlayer player) { - this.player = player; + if(player != null) { + this.player = player; + if (player instanceof EntityPlayer) + dummyPlayer = (IPlayer) ScriptController.Instance.getScriptForEntity(this.player); + if (player.worldObj instanceof WorldServer) + dummyWorld = (IWorld) NpcAPI.Instance().getIWorld((WorldServer) this.player.worldObj); + } } public void clear() { - console = new TreeMap(); - errored = new ArrayList(); + this.console = new TreeMap(); + this.errored = new ArrayList(); this.scripts = new ArrayList(); } @@ -57,7 +66,7 @@ public class PlayerDataScript implements IScriptHandler { this.scripts = NBTTags.GetScript(compound.getTagList("Scripts", 10), this); this.scriptLanguage = compound.getString("ScriptLanguage"); this.enabled = compound.getBoolean("ScriptEnabled"); - console = NBTTags.GetLongStringMap(compound.getTagList("ScriptConsole", 10)); + this.console = NBTTags.GetLongStringMap(compound.getTagList("ScriptConsole", 10)); } public NBTTagCompound writeToNBT(NBTTagCompound compound) { @@ -68,51 +77,72 @@ public class PlayerDataScript implements IScriptHandler { return compound; } - public void callScript(EnumScriptType type, Event event) { - if (this.isEnabled()) { + public void callScript(EnumScriptType type, Event event, Object... obs) { + if(this.isEnabled()) { ScriptContainer script; - if (ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { + if(ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { this.lastInited = ScriptController.Instance.lastLoaded; - errored.clear(); - if (this.player != null) { + //ScriptController.Instance.playerScripts.errored.clear(); + if(this.player != null) { this.scripts.clear(); - Iterator var3 = ScriptController.Instance.playerScripts.scripts.iterator(); + Iterator i = ScriptController.Instance.playerScripts.scripts.iterator(); - while(var3.hasNext()) { - script = (ScriptContainer)var3.next(); + while(i.hasNext()) { + script = (ScriptContainer)i.next(); ScriptContainer s = new ScriptContainer(this); s.readFromNBT(script.writeToNBT(new NBTTagCompound())); + this.scripts.add(s); } } this.lastPlayerUpdate = ScriptController.Instance.lastPlayerUpdate; - if (type != EnumScriptType.INIT) { + if(type != EnumScriptType.INIT) { EventHooks.onPlayerInit(this); } } - for(int i = 0; i < this.scripts.size(); ++i) { - script = (ScriptContainer)this.scripts.get(i); - if (!errored.contains(i)) { + for(int var7 = 0; var7 < this.scripts.size(); ++var7) { + script = (ScriptContainer)this.scripts.get(var7); + + if(!ScriptController.Instance.playerScripts.errored.contains(Integer.valueOf(var7))) { + if(script == null || script.errored || !script.hasCode()) + return; + script.setEngine(scriptLanguage); + if(script.engine == null) + return; + for(int i = 0; i + 1 < obs.length; i += 2){ + Object ob = obs[i + 1]; + if(ob instanceof Entity) + ob = ScriptController.Instance.getScriptForEntity((Entity)ob); + script.engine.put(obs[i].toString(), ob); + } + + ScriptEngine engine = script.engine; + engine.put("world", dummyWorld); + engine.put("player", dummyPlayer); + PlayerEvent result = (PlayerEvent) engine.get("event"); + if(result == null) + engine.put("event", result = new PlayerEvent(this.getPlayer())); + script.engine.put("API", new WrapperNpcAPI()); script.run(type, event); + if (script.errored) { - errored.add(i); + ScriptController.Instance.playerScripts.errored.add(var7); } Iterator var8 = script.console.entrySet().iterator(); while(var8.hasNext()) { Entry entry = (Entry)var8.next(); - if (!console.containsKey(entry.getKey())) { - console.put(entry.getKey(), " tab " + (i + 1) + ":\n" + (String)entry.getValue()); + if (!ScriptController.Instance.playerScripts.console.containsKey(entry.getKey())) { + ScriptController.Instance.playerScripts.console.put(entry.getKey(), " tab " + (var7 + 1) + ":\n" + (String)entry.getValue()); } } script.console.clear(); } } - } } @@ -130,6 +160,7 @@ public class PlayerDataScript implements IScriptHandler { public void setEnabled(boolean bo) { ScriptController.Instance.playerScripts.enabled = bo; + this.enabled = bo; } public String getLanguage() { From 23384d1d679d84228b60f7e94479c220bb7747c1 Mon Sep 17 00:00:00 2001 From: luisc Date: Thu, 16 Dec 2021 21:54:05 -0600 Subject: [PATCH 46/54] Fixed some server-side lag caused by player events. Player ticks now execute every 10 MC ticks. --- src/main/java/noppes/npcs/DataScript.java | 5 ++ src/main/java/noppes/npcs/EventHooks.java | 74 +++++++++---------- .../noppes/npcs/ScriptPlayerEventHandler.java | 4 +- .../npcs/controllers/IScriptHandler.java | 2 +- .../npcs/controllers/ScriptContainer.java | 71 +++++++++--------- .../controllers/data/ForgeDataScript.java | 16 +--- .../controllers/data/PlayerDataScript.java | 53 ++++--------- 7 files changed, 100 insertions(+), 125 deletions(-) diff --git a/src/main/java/noppes/npcs/DataScript.java b/src/main/java/noppes/npcs/DataScript.java index 4522b5cfd..6b6bcfdef 100644 --- a/src/main/java/noppes/npcs/DataScript.java +++ b/src/main/java/noppes/npcs/DataScript.java @@ -187,6 +187,11 @@ public class DataScript implements IScriptHandler { } + @Override + public void callScript(EnumScriptType var1, Event var2) { + + } + public boolean isClient() { return this.npc.isRemote(); } diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java index 7833cb110..d880305bf 100644 --- a/src/main/java/noppes/npcs/EventHooks.java +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -55,42 +55,42 @@ public class EventHooks { public static void onPlayerInit(PlayerDataScript handler) { noppes.npcs.scripted.event.PlayerEvent.InitEvent event = new noppes.npcs.scripted.event.PlayerEvent.InitEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.INIT, event, "event", event); + handler.callScript(EnumScriptType.INIT, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerTick(PlayerDataScript handler) { noppes.npcs.scripted.event.PlayerEvent.UpdateEvent event = new noppes.npcs.scripted.event.PlayerEvent.UpdateEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.TICK, event, "event", event); + handler.callScript(EnumScriptType.TICK, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerInteract(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.InteractEvent event) { - handler.callScript(EnumScriptType.INTERACT, event,"event", event); + handler.callScript(EnumScriptType.INTERACT, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onStartUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.StartUsingItem event = new PlayerEvent.StartUsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.START_USING_ITEM, event,"event", event); + handler.callScript(EnumScriptType.START_USING_ITEM, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.UsingItem event = new PlayerEvent.UsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.USING_ITEM, event,"event", event); + handler.callScript(EnumScriptType.USING_ITEM, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onStopUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.StopUsingItem event = new PlayerEvent.StopUsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.STOP_USING_ITEM, event,"event", event); + handler.callScript(EnumScriptType.STOP_USING_ITEM, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onFinishUsingItem(PlayerDataScript handler, int duration, ItemStack item){ PlayerEvent.FinishUsingItem event = new PlayerEvent.FinishUsingItem(handler.getPlayer(), item, duration); - handler.callScript(EnumScriptType.FINISH_USING_ITEM, event,"event", event); + handler.callScript(EnumScriptType.FINISH_USING_ITEM, event); WrapperNpcAPI.EVENT_BUS.post(event); } @@ -99,178 +99,178 @@ public class EventHooks { for(int i = 0; i < entityItems.size(); i++){ items[i] = NpcAPI.Instance().getIItemStack(entityItems.get(i).getEntityItem()); } DropEvent event = new DropEvent(handler.getPlayer(), items); - handler.callScript(EnumScriptType.DROP, event,"event", event); + handler.callScript(EnumScriptType.DROP, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerPickupXP(PlayerDataScript handler, EntityXPOrb orb) { PlayerEvent.PickupXPEvent event = new PlayerEvent.PickupXPEvent(handler.getPlayer(), orb); - handler.callScript(EnumScriptType.PICKUP_XP, event,"event", event); + handler.callScript(EnumScriptType.PICKUP_XP, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerToss(PlayerDataScript handler, EntityItem entityItem) { PlayerEvent.TossEvent event = new PlayerEvent.TossEvent(handler.getPlayer(), NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); - handler.callScript(EnumScriptType.TOSS, event,"event", event); + handler.callScript(EnumScriptType.TOSS, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerPickUp(PlayerDataScript handler, EntityItem entityItem) { PickUpEvent event = new PickUpEvent(handler.getPlayer(), new ScriptItemStack(entityItem.getEntityItem()));//NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); - handler.callScript(EnumScriptType.PICKUP, event,"event", event); + handler.callScript(EnumScriptType.PICKUP, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerContainerOpen(PlayerDataScript handler, Container container) { ContainerOpen event = new ContainerOpen(handler.getPlayer(), NpcAPI.Instance().getIContainer(container)); - handler.callScript(EnumScriptType.CONTAINER_OPEN, event,"event", event); + handler.callScript(EnumScriptType.CONTAINER_OPEN, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerUseHoe(PlayerDataScript handler, ItemStack hoe, int x, int y, int z) { noppes.npcs.scripted.event.PlayerEvent.UseHoe event = new noppes.npcs.scripted.event.PlayerEvent.UseHoe(handler.getPlayer(), hoe, x, y, z); - handler.callScript(EnumScriptType.USE_HOE, event,"event", event); + handler.callScript(EnumScriptType.USE_HOE, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerSleep(PlayerDataScript handler, int x, int y, int z) { noppes.npcs.scripted.event.PlayerEvent.Sleep event = new noppes.npcs.scripted.event.PlayerEvent.Sleep(handler.getPlayer(), x, y, z); - handler.callScript(EnumScriptType.SLEEP, event,"event", event); + handler.callScript(EnumScriptType.SLEEP, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerWakeUp(PlayerDataScript handler, boolean setSpawn) { noppes.npcs.scripted.event.PlayerEvent.WakeUp event = new noppes.npcs.scripted.event.PlayerEvent.WakeUp(handler.getPlayer(), setSpawn); - handler.callScript(EnumScriptType.WAKE_UP, event,"event", event); + handler.callScript(EnumScriptType.WAKE_UP, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerDeath(PlayerDataScript handler, DamageSource source, Entity entity) { noppes.npcs.scripted.event.PlayerEvent.DiedEvent event = new noppes.npcs.scripted.event.PlayerEvent.DiedEvent(handler.getPlayer(), source, entity); - handler.callScript(EnumScriptType.KILLED, event,"event", event); + handler.callScript(EnumScriptType.KILLED, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerKills(PlayerDataScript handler, EntityLivingBase entityLiving) { noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent event = new noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent(handler.getPlayer(), entityLiving); - handler.callScript(EnumScriptType.KILLS, event,"event", event); + handler.callScript(EnumScriptType.KILLS, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerDamaged(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.DamagedEvent event) { - handler.callScript(EnumScriptType.DAMAGED, event,"event", event); + handler.callScript(EnumScriptType.DAMAGED, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerLightning(PlayerDataScript handler) { PlayerEvent.LightningEvent event = new PlayerEvent.LightningEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.LIGHTNING, event, "event", event); + handler.callScript(EnumScriptType.LIGHTNING, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerSound(PlayerDataScript handler, String name, float pitch, float volume) { PlayerEvent.SoundEvent event = new PlayerEvent.SoundEvent(handler.getPlayer(), name, pitch, volume); - handler.callScript(EnumScriptType.PLAYSOUND, event,"event", event); + handler.callScript(EnumScriptType.PLAYSOUND, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerFall(PlayerDataScript handler, float distance) { PlayerEvent.FallEvent event = new PlayerEvent.FallEvent(handler.getPlayer(),distance); - handler.callScript(EnumScriptType.FALL, event,"event", event); + handler.callScript(EnumScriptType.FALL, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerJump(PlayerDataScript handler) { PlayerEvent.JumpEvent event = new PlayerEvent.JumpEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.JUMP, event,"event", event); + handler.callScript(EnumScriptType.JUMP, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerLogin(PlayerDataScript handler) { LoginEvent event = new LoginEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.LOGIN, event, "event", event); + handler.callScript(EnumScriptType.LOGIN, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerAchievement(PlayerDataScript handler, String description) { PlayerEvent.Achievement event = new PlayerEvent.Achievement(handler.getPlayer(), description); - handler.callScript(EnumScriptType.ACHIEVEMENT, event, "event", event); + handler.callScript(EnumScriptType.ACHIEVEMENT, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerFillBucket(PlayerDataScript handler, ItemStack current, ItemStack result) { PlayerEvent.FillBucket event = new PlayerEvent.FillBucket(handler.getPlayer(), current, result); - handler.callScript(EnumScriptType.FILL_BUCKET, event, "event", event); + handler.callScript(EnumScriptType.FILL_BUCKET, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerBonemeal(PlayerDataScript handler, int x, int y, int z, World world) { PlayerEvent.Bonemeal event = new PlayerEvent.Bonemeal(handler.getPlayer(), x, y, z, world); - handler.callScript(EnumScriptType.BONEMEAL, event, "event", event); + handler.callScript(EnumScriptType.BONEMEAL, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerRespawn(PlayerDataScript handler) { PlayerEvent.RespawnEvent event = new PlayerEvent.RespawnEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.RESPAWN, event, "event", event); + handler.callScript(EnumScriptType.RESPAWN, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerLogout(PlayerDataScript handler) { LogoutEvent event = new LogoutEvent(handler.getPlayer()); - handler.callScript(EnumScriptType.LOGOUT, event, "event", event); + handler.callScript(EnumScriptType.LOGOUT, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerChat(PlayerDataScript handler, ChatEvent event) { - handler.callScript(EnumScriptType.CHAT, event,"event", event); + handler.callScript(EnumScriptType.CHAT, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerBowCharge(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.RangedChargeEvent event) { - handler.callScript(EnumScriptType.RANGED_CHARGE, event,"event", event); + handler.callScript(EnumScriptType.RANGED_CHARGE, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerRanged(PlayerDataScript handler, noppes.npcs.scripted.event.PlayerEvent.RangedLaunchedEvent event) { - handler.callScript(EnumScriptType.RANGED_LAUNCHED, event,"event", event); + handler.callScript(EnumScriptType.RANGED_LAUNCHED, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerDamagedEntity(PlayerDataScript handler, DamagedEntityEvent event) { - handler.callScript(EnumScriptType.DAMAGED_ENTITY, event,"event", event); + handler.callScript(EnumScriptType.DAMAGED_ENTITY, event); return WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerChangeDim(PlayerDataScript handler, int fromDim, int toDim) { PlayerEvent.ChangedDimension event = new PlayerEvent.ChangedDimension(handler.getPlayer(), fromDim, toDim); - handler.callScript(EnumScriptType.CHANGED_DIM, event,"event", event); + handler.callScript(EnumScriptType.CHANGED_DIM, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerMouseClicked(EntityPlayerMP player, int button, int mouseWheel, boolean buttonDown) { PlayerDataScript handler = PlayerData.get(player).scriptData; PlayerEvent.MouseClickedEvent event = new PlayerEvent.MouseClickedEvent(handler.getPlayer(), button, mouseWheel, buttonDown); - handler.callScript(EnumScriptType.MOUSE_CLICKED, event,"event", event); + handler.callScript(EnumScriptType.MOUSE_CLICKED, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerKeyPressed(EntityPlayerMP player, int button, boolean isCtrlPressed, boolean isShiftPressed, boolean isAltPressed, boolean isMetaPressed, boolean buttonDown) { PlayerDataScript handler = PlayerData.get(player).scriptData; KeyPressedEvent event = new KeyPressedEvent(handler.getPlayer(), button, isCtrlPressed, isAltPressed, isShiftPressed, isMetaPressed, buttonDown); - handler.callScript(EnumScriptType.KEY_PRESSED, event,"event", event); + handler.callScript(EnumScriptType.KEY_PRESSED, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerTimer(PlayerData data, int id) { PlayerDataScript handler = data.scriptData; noppes.npcs.scripted.event.PlayerEvent.TimerEvent event = new noppes.npcs.scripted.event.PlayerEvent.TimerEvent(handler.getPlayer(), id); - handler.callScript(EnumScriptType.TIMER, event,"event", event); + handler.callScript(EnumScriptType.TIMER, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static boolean onPlayerBreak(PlayerDataScript handler, PlayerEvent.BreakEvent event) { - handler.callScript(EnumScriptType.BREAK_BLOCK, event,"event", event); + handler.callScript(EnumScriptType.BREAK_BLOCK, event); return WrapperNpcAPI.EVENT_BUS.post(event); } diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 8aea2035f..eca610683 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -65,7 +65,9 @@ public class ScriptPlayerEventHandler { if(event.side == Side.SERVER && event.phase == TickEvent.Phase.START) { EntityPlayer player = event.player; PlayerData data = PlayerData.get(player); - EventHooks.onPlayerTick(data.scriptData); + + if(player.ticksExisted%10 == 0) + EventHooks.onPlayerTick(data.scriptData); if(PlayerDataController.instance != null) { PlayerDataController.instance.getPlayerData(player).scriptData = data.scriptData; diff --git a/src/main/java/noppes/npcs/controllers/IScriptHandler.java b/src/main/java/noppes/npcs/controllers/IScriptHandler.java index c52b9f852..4ece1fbca 100644 --- a/src/main/java/noppes/npcs/controllers/IScriptHandler.java +++ b/src/main/java/noppes/npcs/controllers/IScriptHandler.java @@ -11,7 +11,7 @@ import cpw.mods.fml.common.eventhandler.Event; import noppes.npcs.constants.EnumScriptType; public interface IScriptHandler { - void callScript(EnumScriptType var1, Event var2, Object... obs); + void callScript(EnumScriptType var1, Event var2); boolean isClient(); diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index f252a871f..6d20281f9 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -20,6 +20,7 @@ import noppes.npcs.CustomNpcs; import noppes.npcs.NBTTags; import noppes.npcs.NoppesUtilServer; import noppes.npcs.constants.EnumScriptType; +import noppes.npcs.scripted.NpcAPI; import scala.Char; public class ScriptContainer { @@ -133,46 +134,44 @@ public class ScriptContainer { this.init = false; } - String var3 = "lock"; - synchronized("lock") { - Current = this; - CurrentType = type; - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - this.engine.getContext().setWriter(pw); - this.engine.getContext().setErrorWriter(pw); + engine.put("API", NpcAPI.Instance()); - try { - if (!this.init) { - this.engine.eval(this.getFullCode()); - this.init = true; - } + Current = this; + CurrentType = type; + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + this.engine.getContext().setWriter(pw); + this.engine.getContext().setErrorWriter(pw); - ((Invocable)this.engine).invokeFunction(type, new Object[]{event}); - } catch (NoSuchMethodException var13) { - this.unknownFunctions.add(type); - } catch (Throwable var14) { - this.errored = true; - var14.printStackTrace(pw); - } finally { - String errorString = sw.getBuffer().toString().trim(); - int startIndex = 0; - if(!errorString.isEmpty()) { - String endString = "in at line number "; - startIndex = errorString.indexOf(endString) + endString.length(); - - for (int i = startIndex; i < errorString.length(); i++) { - if (!Character.isDigit(errorString.charAt(i))) { - startIndex = i; - break; - } - } - } - this.appandConsole(errorString.substring(0, startIndex)); - pw.close(); - Current = null; + try { + if (!this.init) { + this.engine.eval(this.getFullCode()); + this.init = true; } + ((Invocable)this.engine).invokeFunction(type, new Object[]{event}); + } catch (NoSuchMethodException var13) { + this.unknownFunctions.add(type); + } catch (Throwable var14) { + this.errored = true; + var14.printStackTrace(pw); + } finally { + String errorString = sw.getBuffer().toString().trim(); + int startIndex = 0; + if(!errorString.isEmpty()) { + String endString = "in at line number "; + startIndex = errorString.indexOf(endString) + endString.length(); + + for (int i = startIndex; i < errorString.length(); i++) { + if (!Character.isDigit(errorString.charAt(i))) { + startIndex = i; + break; + } + } + } + this.appandConsole(errorString.substring(0, startIndex)); + pw.close(); + Current = null; } } } diff --git a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java index eb831b2f1..839211186 100644 --- a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java @@ -51,7 +51,7 @@ public class ForgeDataScript implements IScriptHandler { } @Override - public void callScript(EnumScriptType var1, Event var2, Object... obs) { + public void callScript(EnumScriptType var1, Event var2) { callScript(var1.function, var2); } @@ -67,18 +67,8 @@ public class ForgeDataScript implements IScriptHandler { Iterator var3 = this.scripts.iterator(); - while (var3.hasNext()) { - ScriptContainer script = (ScriptContainer) var3.next(); - - script.setEngine(scriptLanguage); - if(script.engine == null) - return; - - Event result = (Event) script.engine.get("event"); - if(result == null) - script.engine.put("event", event); - script.engine.put("API", new WrapperNpcAPI()); - + while(var3.hasNext()) { + ScriptContainer script = (ScriptContainer)var3.next(); script.run(type, event); } //}); diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java index 3394672b7..d6f7110ab 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java @@ -77,72 +77,51 @@ public class PlayerDataScript implements IScriptHandler { return compound; } - public void callScript(EnumScriptType type, Event event, Object... obs) { - if(this.isEnabled()) { + public void callScript(EnumScriptType type, Event event) { + if (this.isEnabled()) { ScriptContainer script; - if(ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { + if (ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { this.lastInited = ScriptController.Instance.lastLoaded; - //ScriptController.Instance.playerScripts.errored.clear(); - if(this.player != null) { + errored.clear(); + if (this.player != null) { this.scripts.clear(); - Iterator i = ScriptController.Instance.playerScripts.scripts.iterator(); + Iterator var3 = ScriptController.Instance.playerScripts.scripts.iterator(); - while(i.hasNext()) { - script = (ScriptContainer)i.next(); + while(var3.hasNext()) { + script = (ScriptContainer)var3.next(); ScriptContainer s = new ScriptContainer(this); s.readFromNBT(script.writeToNBT(new NBTTagCompound())); - this.scripts.add(s); } } this.lastPlayerUpdate = ScriptController.Instance.lastPlayerUpdate; - if(type != EnumScriptType.INIT) { + if (type != EnumScriptType.INIT) { EventHooks.onPlayerInit(this); } } - for(int var7 = 0; var7 < this.scripts.size(); ++var7) { - script = (ScriptContainer)this.scripts.get(var7); - - if(!ScriptController.Instance.playerScripts.errored.contains(Integer.valueOf(var7))) { - if(script == null || script.errored || !script.hasCode()) - return; - script.setEngine(scriptLanguage); - if(script.engine == null) - return; - for(int i = 0; i + 1 < obs.length; i += 2){ - Object ob = obs[i + 1]; - if(ob instanceof Entity) - ob = ScriptController.Instance.getScriptForEntity((Entity)ob); - script.engine.put(obs[i].toString(), ob); - } - - ScriptEngine engine = script.engine; - engine.put("world", dummyWorld); - engine.put("player", dummyPlayer); - PlayerEvent result = (PlayerEvent) engine.get("event"); - if(result == null) - engine.put("event", result = new PlayerEvent(this.getPlayer())); - script.engine.put("API", new WrapperNpcAPI()); + for(int i = 0; i < this.scripts.size(); ++i) { + script = (ScriptContainer)this.scripts.get(i); + if (!errored.contains(i)) { script.run(type, event); - if (script.errored) { - ScriptController.Instance.playerScripts.errored.add(var7); + errored.add(i); } Iterator var8 = script.console.entrySet().iterator(); while(var8.hasNext()) { Entry entry = (Entry)var8.next(); - if (!ScriptController.Instance.playerScripts.console.containsKey(entry.getKey())) { - ScriptController.Instance.playerScripts.console.put(entry.getKey(), " tab " + (var7 + 1) + ":\n" + (String)entry.getValue()); + if (!console.containsKey(entry.getKey())) { + console.put(entry.getKey(), " tab " + (i + 1) + ":\n" + (String)entry.getValue()); } } script.console.clear(); } } + } } From f03516b00fbb82fca5fc70a8b4b37726ac337b4a Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 17 Dec 2021 08:10:21 -0600 Subject: [PATCH 47/54] Fixed console and console spam with scripted player events. --- .../controllers/data/PlayerDataScript.java | 75 ++++--------------- 1 file changed, 13 insertions(+), 62 deletions(-) diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java index d6f7110ab..288e35846 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java @@ -2,13 +2,10 @@ // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // - package noppes.npcs.controllers.data; - import java.lang.reflect.Array; import java.util.*; import java.util.Map.Entry; - import com.google.common.base.Preconditions; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -27,10 +24,8 @@ import noppes.npcs.scripted.event.PlayerEvent; import noppes.npcs.scripted.interfaces.IPlayer; import noppes.npcs.scripted.interfaces.IWorld; import noppes.npcs.scripted.wrapper.WrapperNpcAPI; - import javax.annotation.CheckForNull; import javax.script.ScriptEngine; - public class PlayerDataScript implements IScriptHandler { public List scripts = new ArrayList(); public String scriptLanguage = "ECMAScript"; @@ -42,10 +37,8 @@ public class PlayerDataScript implements IScriptHandler { public boolean enabled = false; private Map console = new TreeMap(); public List errored = new ArrayList(); - public IPlayer dummyPlayer; public IWorld dummyWorld; - public PlayerDataScript(EntityPlayer player) { if(player != null) { this.player = player; @@ -55,20 +48,17 @@ public class PlayerDataScript implements IScriptHandler { dummyWorld = (IWorld) NpcAPI.Instance().getIWorld((WorldServer) this.player.worldObj); } } - public void clear() { this.console = new TreeMap(); this.errored = new ArrayList(); this.scripts = new ArrayList(); } - public void readFromNBT(NBTTagCompound compound) { this.scripts = NBTTags.GetScript(compound.getTagList("Scripts", 10), this); this.scriptLanguage = compound.getString("ScriptLanguage"); this.enabled = compound.getBoolean("ScriptEnabled"); this.console = NBTTags.GetLongStringMap(compound.getTagList("ScriptConsole", 10)); } - public NBTTagCompound writeToNBT(NBTTagCompound compound) { compound.setTag("Scripts", NBTTags.NBTScript(this.scripts)); compound.setString("ScriptLanguage", this.scriptLanguage); @@ -83,14 +73,15 @@ public class PlayerDataScript implements IScriptHandler { if (ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { this.lastInited = ScriptController.Instance.lastLoaded; errored.clear(); - if (this.player != null) { + if(this.player != null) { this.scripts.clear(); - Iterator var3 = ScriptController.Instance.playerScripts.scripts.iterator(); + Iterator i = ScriptController.Instance.playerScripts.scripts.iterator(); - while(var3.hasNext()) { - script = (ScriptContainer)var3.next(); + while(i.hasNext()) { + script = (ScriptContainer)i.next(); ScriptContainer s = new ScriptContainer(this); s.readFromNBT(script.writeToNBT(new NBTTagCompound())); + this.scripts.add(s); } } @@ -104,17 +95,21 @@ public class PlayerDataScript implements IScriptHandler { for(int i = 0; i < this.scripts.size(); ++i) { script = (ScriptContainer)this.scripts.get(i); if (!errored.contains(i)) { + if(script == null || script.errored || !script.hasCode() || ScriptController.Instance.playerScripts.errored.contains(i)) + return; + script.run(type, event); + if (script.errored) { - errored.add(i); + ScriptController.Instance.playerScripts.errored.add(i); } Iterator var8 = script.console.entrySet().iterator(); while(var8.hasNext()) { Entry entry = (Entry)var8.next(); - if (!console.containsKey(entry.getKey())) { - console.put(entry.getKey(), " tab " + (i + 1) + ":\n" + (String)entry.getValue()); + if (!ScriptController.Instance.playerScripts.console.containsKey(entry.getKey())) { + ScriptController.Instance.playerScripts.console.put(entry.getKey(), " tab " + (i + 1) + ":\n" + (String)entry.getValue()); } } @@ -128,32 +123,25 @@ public class PlayerDataScript implements IScriptHandler { public boolean isEnabled() { return ScriptController.Instance.playerScripts.enabled && ScriptController.HasStart && (this.player == null || !this.player.worldObj.isRemote); } - public boolean isClient() { return this.player.isClientWorld(); } - public boolean getEnabled() { return ScriptController.Instance.playerScripts.enabled; } - public void setEnabled(boolean bo) { ScriptController.Instance.playerScripts.enabled = bo; this.enabled = bo; } - public String getLanguage() { return ScriptController.Instance.playerScripts.scriptLanguage; } - public void setLanguage(String lang) { this.scriptLanguage = lang; } - public List getScripts() { return this.scripts; } - public String noticeString() { if(this.player == null) { return "Global script"; @@ -162,30 +150,24 @@ public class PlayerDataScript implements IScriptHandler { return PlayerDataScript.toStringHelper(this.player).add("x", pos.getX()).add("y", pos.getY()).add("z", pos.getZ()).toString(); } } - public IPlayer getPlayer() { if (this.playerAPI == null) { this.playerAPI = (IPlayer) NpcAPI.Instance().getIEntity(this.player); } - return this.playerAPI; } - public Map getConsoleText() { return this.console; } - public void clearConsole() { this.console.clear(); } - public static final class ToStringHelper { private final String className; private final PlayerDataScript.ToStringHelper.ValueHolder holderHead; private PlayerDataScript.ToStringHelper.ValueHolder holderTail; private boolean omitNullValues; private boolean omitEmptyValues; - private ToStringHelper(String className) { this.holderHead = new PlayerDataScript.ToStringHelper.ValueHolder(); this.holderTail = this.holderHead; @@ -193,68 +175,52 @@ public class PlayerDataScript implements IScriptHandler { this.omitEmptyValues = false; this.className = (String) Preconditions.checkNotNull(className); } - public PlayerDataScript.ToStringHelper omitNullValues() { this.omitNullValues = true; return this; } - public PlayerDataScript.ToStringHelper add(String name, @CheckForNull Object value) { return this.addHolder(name, value); } - public PlayerDataScript.ToStringHelper add(String name, boolean value) { return this.addUnconditionalHolder(name, String.valueOf(value)); } - public PlayerDataScript.ToStringHelper add(String name, char value) { return this.addUnconditionalHolder(name, String.valueOf(value)); } - public PlayerDataScript.ToStringHelper add(String name, double value) { return this.addUnconditionalHolder(name, String.valueOf(value)); } - public PlayerDataScript.ToStringHelper add(String name, float value) { return this.addUnconditionalHolder(name, String.valueOf(value)); } - public PlayerDataScript.ToStringHelper add(String name, int value) { return this.addUnconditionalHolder(name, String.valueOf(value)); } - public PlayerDataScript.ToStringHelper add(String name, long value) { return this.addUnconditionalHolder(name, String.valueOf(value)); } - public PlayerDataScript.ToStringHelper addValue(@CheckForNull Object value) { return this.addHolder(value); } - public PlayerDataScript.ToStringHelper addValue(boolean value) { return this.addUnconditionalHolder(String.valueOf(value)); } - public PlayerDataScript.ToStringHelper addValue(char value) { return this.addUnconditionalHolder(String.valueOf(value)); } - public PlayerDataScript.ToStringHelper addValue(double value) { return this.addUnconditionalHolder(String.valueOf(value)); } - public PlayerDataScript.ToStringHelper addValue(float value) { return this.addUnconditionalHolder(String.valueOf(value)); } - public PlayerDataScript.ToStringHelper addValue(int value) { return this.addUnconditionalHolder(String.valueOf(value)); } - public PlayerDataScript.ToStringHelper addValue(long value) { return this.addUnconditionalHolder(String.valueOf(value)); } - private static boolean isEmpty(Object value) { if (value instanceof CharSequence) { return ((CharSequence)value).length() == 0; @@ -278,13 +244,11 @@ public class PlayerDataScript implements IScriptHandler { return false; } } - public String toString() { boolean omitNullValuesSnapshot = this.omitNullValues; boolean omitEmptyValuesSnapshot = this.omitEmptyValues; String nextSeparator = ""; StringBuilder builder = (new StringBuilder(32)).append(this.className).append('{'); - for(PlayerDataScript.ToStringHelper.ValueHolder valueHolder = this.holderHead.next; valueHolder != null; valueHolder = valueHolder.next) { Object value = valueHolder.value; if (!(valueHolder instanceof PlayerDataScript.ToStringHelper.UnconditionalValueHolder)) { @@ -296,13 +260,11 @@ public class PlayerDataScript implements IScriptHandler { continue; } } - builder.append(nextSeparator); nextSeparator = ", "; if (valueHolder.name != null) { builder.append(valueHolder.name).append('='); } - if (value != null && value.getClass().isArray()) { Object[] objectArray = new Object[]{value}; String arrayString = Arrays.deepToString(objectArray); @@ -311,54 +273,45 @@ public class PlayerDataScript implements IScriptHandler { builder.append(value); } } - return builder.append('}').toString(); } - private PlayerDataScript.ToStringHelper.ValueHolder addHolder() { PlayerDataScript.ToStringHelper.ValueHolder valueHolder = new PlayerDataScript.ToStringHelper.ValueHolder(); this.holderTail = this.holderTail.next = valueHolder; return valueHolder; } - private PlayerDataScript.ToStringHelper addHolder(@CheckForNull Object value) { PlayerDataScript.ToStringHelper.ValueHolder valueHolder = this.addHolder(); valueHolder.value = value; return this; } - private PlayerDataScript.ToStringHelper addHolder(String name, @CheckForNull Object value) { PlayerDataScript.ToStringHelper.ValueHolder valueHolder = this.addHolder(); valueHolder.value = value; valueHolder.name = (String)Preconditions.checkNotNull(name); return this; } - private PlayerDataScript.ToStringHelper.UnconditionalValueHolder addUnconditionalHolder() { PlayerDataScript.ToStringHelper.UnconditionalValueHolder valueHolder = new PlayerDataScript.ToStringHelper.UnconditionalValueHolder(); this.holderTail = this.holderTail.next = valueHolder; return valueHolder; } - private PlayerDataScript.ToStringHelper addUnconditionalHolder(Object value) { PlayerDataScript.ToStringHelper.UnconditionalValueHolder valueHolder = this.addUnconditionalHolder(); valueHolder.value = value; return this; } - private PlayerDataScript.ToStringHelper addUnconditionalHolder(String name, Object value) { PlayerDataScript.ToStringHelper.UnconditionalValueHolder valueHolder = this.addUnconditionalHolder(); valueHolder.value = value; valueHolder.name = (String)Preconditions.checkNotNull(name); return this; } - private static final class UnconditionalValueHolder extends PlayerDataScript.ToStringHelper.ValueHolder { private UnconditionalValueHolder() { super(); } } - private static class ValueHolder { @CheckForNull String name; @@ -366,13 +319,11 @@ public class PlayerDataScript implements IScriptHandler { Object value; @CheckForNull PlayerDataScript.ToStringHelper.ValueHolder next; - private ValueHolder() { } } } - public static PlayerDataScript.ToStringHelper toStringHelper(Object self) { return new PlayerDataScript.ToStringHelper(self.getClass().getSimpleName()); } -} +} \ No newline at end of file From 7d94e0e210673f1280404ee4608fb34651d9395d Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 17 Dec 2021 08:25:02 -0600 Subject: [PATCH 48/54] Removed forge chunk and terrain gen events. --- src/main/java/noppes/npcs/ScriptPlayerEventHandler.java | 6 +++--- .../noppes/npcs/client/gui/script/GuiScriptInterface.java | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index eca610683..bf2c6cbea 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -44,8 +44,7 @@ import net.minecraftforge.event.entity.living.LivingEvent; import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.*; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.event.world.*; import net.minecraftforge.event.world.WorldEvent.PotentialSpawns; import noppes.npcs.controllers.PlayerData; import noppes.npcs.controllers.PlayerDataController; @@ -374,6 +373,7 @@ public class ScriptPlayerEventHandler { ArrayList list = new ArrayList(); list.addAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("cpw.mods.fml.common.gameevent")); list.addAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("net.minecraftforge.event")); + list.removeAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("net.minecraftforge.event.terraingen")); Iterator e1 = list.iterator(); while(true) { @@ -415,7 +415,7 @@ public class ScriptPlayerEventHandler { Iterator var10 = c.iterator(); while(var10.hasNext()) { Class c1 = (Class)var10.next(); - if(!EntityConstructing.class.isAssignableFrom(c1) && !PotentialSpawns.class.isAssignableFrom(c1) && !TickEvent.RenderTickEvent.class.isAssignableFrom(c1) && !TickEvent.ClientTickEvent.class.isAssignableFrom(c1) && !FMLNetworkEvent.ClientCustomPacketEvent.class.isAssignableFrom(c1) && !ItemTooltipEvent.class.isAssignableFrom(c1) && Event.class.isAssignableFrom(c1) && !Modifier.isAbstract(c1.getModifiers()) && Modifier.isPublic(c1.getModifiers())) { + if(!EntityConstructing.class.isAssignableFrom(c1) && !PotentialSpawns.class.isAssignableFrom(c1) && !TickEvent.RenderTickEvent.class.isAssignableFrom(c1) && !TickEvent.ClientTickEvent.class.isAssignableFrom(c1) && !FMLNetworkEvent.ClientCustomPacketEvent.class.isAssignableFrom(c1) && !ItemTooltipEvent.class.isAssignableFrom(c1) && Event.class.isAssignableFrom(c1) && !Modifier.isAbstract(c1.getModifiers()) && Modifier.isPublic(c1.getModifiers()) && !ChunkEvent.class.isAssignableFrom(c1) && !ChunkWatchEvent.class.isAssignableFrom(c1) && !ChunkDataEvent.class.isAssignableFrom(c1)) { register.invoke(FMLCommonHandler.instance().bus(), new Object[]{c1, handler, e, Loader.instance().activeModContainer()}); } } diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java index 34955b4af..18e2b8ce3 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java @@ -22,6 +22,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.event.entity.EntityEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.world.ChunkDataEvent; +import net.minecraftforge.event.world.ChunkEvent; +import net.minecraftforge.event.world.ChunkWatchEvent; import net.minecraftforge.event.world.WorldEvent; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.NoppesStringUtils; @@ -140,9 +143,9 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb ArrayList list = new ArrayList(); try { - list.addAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("cpw.mods.fml.common.event")); list.addAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("cpw.mods.fml.common.gameevent")); list.addAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("net.minecraftforge.event")); + list.removeAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("net.minecraftforge.event.terraingen")); } catch (IOException e) { e.printStackTrace(); } @@ -157,7 +160,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb Iterator var10 = c.iterator(); while(var10.hasNext()) { Class c1 = (Class) var10.next(); - if (!EntityEvent.EntityConstructing.class.isAssignableFrom(c1) && !WorldEvent.PotentialSpawns.class.isAssignableFrom(c1) && !TickEvent.RenderTickEvent.class.isAssignableFrom(c1) && !TickEvent.ClientTickEvent.class.isAssignableFrom(c1) && !FMLNetworkEvent.ClientCustomPacketEvent.class.isAssignableFrom(c1) && !ItemTooltipEvent.class.isAssignableFrom(c1) && Event.class.isAssignableFrom(c1) && !Modifier.isAbstract(c1.getModifiers()) && Modifier.isPublic(c1.getModifiers())) { + if(!EntityEvent.EntityConstructing.class.isAssignableFrom(c1) && !WorldEvent.PotentialSpawns.class.isAssignableFrom(c1) && !TickEvent.RenderTickEvent.class.isAssignableFrom(c1) && !TickEvent.ClientTickEvent.class.isAssignableFrom(c1) && !FMLNetworkEvent.ClientCustomPacketEvent.class.isAssignableFrom(c1) && !ItemTooltipEvent.class.isAssignableFrom(c1) && Event.class.isAssignableFrom(c1) && !Modifier.isAbstract(c1.getModifiers()) && Modifier.isPublic(c1.getModifiers()) && !ChunkEvent.class.isAssignableFrom(c1) && !ChunkWatchEvent.class.isAssignableFrom(c1) && !ChunkDataEvent.class.isAssignableFrom(c1)) { String eventName = c1.getName(); int i = eventName.lastIndexOf("."); eventName = StringUtils.uncapitalize(eventName.substring(i + 1).replace("$", "")); From 03ee73362096b8cd6093c65bc2fa88297782aefc Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 17 Dec 2021 14:26:52 -0600 Subject: [PATCH 49/54] Forge tick events only run if they are in the starting phase. --- .../java/noppes/npcs/ScriptPlayerEventHandler.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index bf2c6cbea..6bae8bc30 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -433,6 +433,10 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void forgeEntity(Event event) { if(CustomNpcs.getServer() != null && ScriptController.Instance.forgeScripts.isEnabled()) { + if(event instanceof TickEvent && !(((TickEvent)event).side == Side.SERVER && ((TickEvent)event).phase == TickEvent.Phase.START)) { + return; + } + if(event instanceof EntityEvent) { EntityEvent ev2 = (EntityEvent)event; if(ev2.entity != null && ev2.entity.worldObj instanceof WorldServer) { @@ -444,9 +448,9 @@ public class ScriptPlayerEventHandler { EventHooks.onForgeWorldEvent(ev1); } } else if(!(event instanceof TickEvent) || ((TickEvent)event).side != Side.CLIENT) { - if(event instanceof PlayerEvent) { - PlayerEvent ev = (PlayerEvent)event; - if(!(ev.player.worldObj instanceof WorldServer)) { + if (event instanceof PlayerEvent) { + PlayerEvent ev = (PlayerEvent) event; + if (!(ev.player.worldObj instanceof WorldServer)) { return; } } From d46d0aba7e9f6de74dba744db19e37074898fb62 Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 17 Dec 2021 15:14:52 -0600 Subject: [PATCH 50/54] Player events and Forge events run in their own separate buses without redundant registering. --- src/main/java/noppes/npcs/CustomNpcs.java | 4 +- .../noppes/npcs/ScriptForgeEventHandler.java | 126 ++++++++++++++++++ .../noppes/npcs/ScriptPlayerEventHandler.java | 98 -------------- 3 files changed, 129 insertions(+), 99 deletions(-) create mode 100644 src/main/java/noppes/npcs/ScriptForgeEventHandler.java diff --git a/src/main/java/noppes/npcs/CustomNpcs.java b/src/main/java/noppes/npcs/CustomNpcs.java index d1a6bcf2a..8d16e739b 100644 --- a/src/main/java/noppes/npcs/CustomNpcs.java +++ b/src/main/java/noppes/npcs/CustomNpcs.java @@ -178,7 +178,9 @@ public class CustomNpcs { ScriptPlayerEventHandler scriptPlayerEventHandler = new ScriptPlayerEventHandler(); MinecraftForge.EVENT_BUS.register(scriptPlayerEventHandler); - FMLCommonHandler.instance().bus().register(scriptPlayerEventHandler.registerForgeEvents()); + FMLCommonHandler.instance().bus().register(scriptPlayerEventHandler); + + FMLCommonHandler.instance().bus().register(new ScriptForgeEventHandler().registerForgeEvents()); FMLCommonHandler.instance().bus().register(new ServerTickHandler()); registerNpc(EntityNPCHumanMale.class, "npchumanmale"); diff --git a/src/main/java/noppes/npcs/ScriptForgeEventHandler.java b/src/main/java/noppes/npcs/ScriptForgeEventHandler.java new file mode 100644 index 000000000..4feebb7a0 --- /dev/null +++ b/src/main/java/noppes/npcs/ScriptForgeEventHandler.java @@ -0,0 +1,126 @@ +package noppes.npcs; + +import com.google.common.reflect.ClassPath; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.network.FMLNetworkEvent; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.world.WorldServer; +import net.minecraftforge.event.entity.EntityEvent; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.world.ChunkDataEvent; +import net.minecraftforge.event.world.ChunkEvent; +import net.minecraftforge.event.world.ChunkWatchEvent; +import net.minecraftforge.event.world.WorldEvent; +import noppes.npcs.controllers.PixelmonHelper; +import noppes.npcs.controllers.ScriptController; +import noppes.npcs.scripted.event.ForgeEvent; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.Vector; + +public class ScriptForgeEventHandler { + public ScriptForgeEventHandler() { + } + + @SubscribeEvent + public void forgeEntity(Event event) { + if(CustomNpcs.getServer() != null && ScriptController.Instance.forgeScripts.isEnabled()) { + if(event instanceof TickEvent && !(((TickEvent)event).side == Side.SERVER && ((TickEvent)event).phase == TickEvent.Phase.START)) { + return; + } + + if(event instanceof EntityEvent) { + EntityEvent ev2 = (EntityEvent)event; + if(ev2.entity != null && ev2.entity.worldObj instanceof WorldServer) { + EventHooks.onForgeEntityEvent(ev2); + } + } else if(event instanceof WorldEvent) { + WorldEvent ev1 = (WorldEvent)event; + if(ev1.world instanceof WorldServer) { + EventHooks.onForgeWorldEvent(ev1); + } + } else if(!(event instanceof TickEvent) || ((TickEvent)event).side != Side.CLIENT) { + if (event instanceof PlayerEvent) { + PlayerEvent ev = (PlayerEvent) event; + if (!(ev.player.worldObj instanceof WorldServer)) { + return; + } + } + + EventHooks.onForgeEvent(new ForgeEvent(event), event); + } + } + } + + public ScriptForgeEventHandler registerForgeEvents() { + try { + Method e = this.getClass().getMethod("forgeEntity", new Class[]{Event.class}); + Method register = FMLCommonHandler.instance().bus().getClass().getDeclaredMethod("register", new Class[]{Class.class, Object.class, Method.class, ModContainer.class}); + register.setAccessible(true); + ArrayList list = new ArrayList(); + list.addAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("cpw.mods.fml.common.gameevent")); + list.addAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("net.minecraftforge.event")); + list.removeAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("net.minecraftforge.event.terraingen")); + Iterator e1 = list.iterator(); + + while(true) { + ClassPath.ClassInfo classLoader; + String classes; + do { + if(!e1.hasNext()) { + if(PixelmonHelper.Enabled) { + try { + Field e2 = ClassLoader.class.getDeclaredField("classes"); + e2.setAccessible(true); + ClassLoader classLoader1 = Thread.currentThread().getContextClassLoader(); + ArrayList classes1 = new ArrayList((Vector)e2.get(classLoader1)); + Iterator infoClass1 = classes1.iterator(); + + while(infoClass1.hasNext()) { + Class c2 = (Class)infoClass1.next(); + } + } catch (Exception var12) { + var12.printStackTrace(); + } + + return this; + } + + return this; + } + + classLoader = (ClassPath.ClassInfo)e1.next(); + classes = classLoader.getName(); + } while(classes.startsWith("net.minecraftforge.event.terraingen")); + + Class infoClass = classLoader.load(); + ArrayList c = new ArrayList(Arrays.asList(infoClass.getDeclaredClasses())); + if(c.isEmpty()) { + c.add(infoClass); + } + + Iterator var10 = c.iterator(); + while(var10.hasNext()) { + Class c1 = (Class)var10.next(); + if(!EntityEvent.EntityConstructing.class.isAssignableFrom(c1) && !WorldEvent.PotentialSpawns.class.isAssignableFrom(c1) && !TickEvent.RenderTickEvent.class.isAssignableFrom(c1) && !TickEvent.ClientTickEvent.class.isAssignableFrom(c1) && !FMLNetworkEvent.ClientCustomPacketEvent.class.isAssignableFrom(c1) && !ItemTooltipEvent.class.isAssignableFrom(c1) && Event.class.isAssignableFrom(c1) && !Modifier.isAbstract(c1.getModifiers()) && Modifier.isPublic(c1.getModifiers()) && !ChunkEvent.class.isAssignableFrom(c1) && !ChunkWatchEvent.class.isAssignableFrom(c1) && !ChunkDataEvent.class.isAssignableFrom(c1)) { + register.invoke(FMLCommonHandler.instance().bus(), new Object[]{c1, this, e, Loader.instance().activeModContainer()}); + } + } + } + } catch (Exception var13) { + var13.printStackTrace(); + return this; + } + } +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 6bae8bc30..254e18949 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -362,102 +362,4 @@ public class ScriptPlayerEventHandler { } } } - - public ScriptPlayerEventHandler registerForgeEvents() { - ScriptPlayerEventHandler.ForgeEventHandler handler = new ScriptPlayerEventHandler.ForgeEventHandler(); - - try { - Method e = handler.getClass().getMethod("forgeEntity", new Class[]{Event.class}); - Method register = FMLCommonHandler.instance().bus().getClass().getDeclaredMethod("register", new Class[]{Class.class, Object.class, Method.class, ModContainer.class}); - register.setAccessible(true); - ArrayList list = new ArrayList(); - list.addAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("cpw.mods.fml.common.gameevent")); - list.addAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("net.minecraftforge.event")); - list.removeAll(ClassPath.from(this.getClass().getClassLoader()).getTopLevelClassesRecursive("net.minecraftforge.event.terraingen")); - Iterator e1 = list.iterator(); - - while(true) { - ClassInfo classLoader; - String classes; - do { - if(!e1.hasNext()) { - if(PixelmonHelper.Enabled) { - try { - Field e2 = ClassLoader.class.getDeclaredField("classes"); - e2.setAccessible(true); - ClassLoader classLoader1 = Thread.currentThread().getContextClassLoader(); - ArrayList classes1 = new ArrayList((Vector)e2.get(classLoader1)); - Iterator infoClass1 = classes1.iterator(); - - while(infoClass1.hasNext()) { - Class c2 = (Class)infoClass1.next(); - } - } catch (Exception var12) { - var12.printStackTrace(); - } - - return this; - } - - return this; - } - - classLoader = (ClassInfo)e1.next(); - classes = classLoader.getName(); - } while(classes.startsWith("net.minecraftforge.event.terraingen")); - - Class infoClass = classLoader.load(); - ArrayList c = new ArrayList(Arrays.asList(infoClass.getDeclaredClasses())); - if(c.isEmpty()) { - c.add(infoClass); - } - - Iterator var10 = c.iterator(); - while(var10.hasNext()) { - Class c1 = (Class)var10.next(); - if(!EntityConstructing.class.isAssignableFrom(c1) && !PotentialSpawns.class.isAssignableFrom(c1) && !TickEvent.RenderTickEvent.class.isAssignableFrom(c1) && !TickEvent.ClientTickEvent.class.isAssignableFrom(c1) && !FMLNetworkEvent.ClientCustomPacketEvent.class.isAssignableFrom(c1) && !ItemTooltipEvent.class.isAssignableFrom(c1) && Event.class.isAssignableFrom(c1) && !Modifier.isAbstract(c1.getModifiers()) && Modifier.isPublic(c1.getModifiers()) && !ChunkEvent.class.isAssignableFrom(c1) && !ChunkWatchEvent.class.isAssignableFrom(c1) && !ChunkDataEvent.class.isAssignableFrom(c1)) { - register.invoke(FMLCommonHandler.instance().bus(), new Object[]{c1, handler, e, Loader.instance().activeModContainer()}); - } - } - } - } catch (Exception var13) { - var13.printStackTrace(); - return this; - } - } - - public class ForgeEventHandler { - public ForgeEventHandler() { - } - - @SubscribeEvent - public void forgeEntity(Event event) { - if(CustomNpcs.getServer() != null && ScriptController.Instance.forgeScripts.isEnabled()) { - if(event instanceof TickEvent && !(((TickEvent)event).side == Side.SERVER && ((TickEvent)event).phase == TickEvent.Phase.START)) { - return; - } - - if(event instanceof EntityEvent) { - EntityEvent ev2 = (EntityEvent)event; - if(ev2.entity != null && ev2.entity.worldObj instanceof WorldServer) { - EventHooks.onForgeEntityEvent(ev2); - } - } else if(event instanceof WorldEvent) { - WorldEvent ev1 = (WorldEvent)event; - if(ev1.world instanceof WorldServer) { - EventHooks.onForgeWorldEvent(ev1); - } - } else if(!(event instanceof TickEvent) || ((TickEvent)event).side != Side.CLIENT) { - if (event instanceof PlayerEvent) { - PlayerEvent ev = (PlayerEvent) event; - if (!(ev.player.worldObj instanceof WorldServer)) { - return; - } - } - - EventHooks.onForgeEvent(new ForgeEvent(event), event); - } - } - } - } } \ No newline at end of file From 1a78b2dad7a8f4202a3bc1396d749292576addfe Mon Sep 17 00:00:00 2001 From: luisc Date: Fri, 17 Dec 2021 17:30:50 -0600 Subject: [PATCH 51/54] Timers are only updated if a timer exists for a player. --- src/main/java/noppes/npcs/ScriptPlayerEventHandler.java | 3 ++- src/main/java/noppes/npcs/entity/data/DataTimers.java | 2 ++ src/main/java/noppes/npcs/scripted/interfaces/ITimers.java | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 254e18949..1a5628905 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -70,7 +70,8 @@ public class ScriptPlayerEventHandler { if(PlayerDataController.instance != null) { PlayerDataController.instance.getPlayerData(player).scriptData = data.scriptData; - PlayerDataController.instance.getPlayerData(player).timers.update(); + if(PlayerDataController.instance.getPlayerData(player).timers.size() > 0) + PlayerDataController.instance.getPlayerData(player).timers.update(); } } } diff --git a/src/main/java/noppes/npcs/entity/data/DataTimers.java b/src/main/java/noppes/npcs/entity/data/DataTimers.java index 34f0adb3b..58378e07a 100644 --- a/src/main/java/noppes/npcs/entity/data/DataTimers.java +++ b/src/main/java/noppes/npcs/entity/data/DataTimers.java @@ -101,6 +101,8 @@ public class DataTimers implements ITimers { this.timers = new HashMap(); } + public int size() { return this.timers.size(); } + class Timer { public int id; private boolean repeat; diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ITimers.java b/src/main/java/noppes/npcs/scripted/interfaces/ITimers.java index c01509e34..f69b93032 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ITimers.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ITimers.java @@ -17,4 +17,6 @@ public interface ITimers { void reset(int var1); void clear(); + + int size(); } From 953f6e0459bf8c4115092aa6055925cd0a8327cb Mon Sep 17 00:00:00 2001 From: luisc Date: Sat, 18 Dec 2021 08:34:30 -0600 Subject: [PATCH 52/54] Fixed server-side lag caused by player events. THIS IS BIG. --- src/main/java/noppes/npcs/EventHooks.java | 121 ++++++------ .../noppes/npcs/ScriptPlayerEventHandler.java | 172 ++++++++++-------- .../noppes/npcs/controllers/PlayerData.java | 2 - .../controllers/data/PlayerDataScript.java | 29 +-- 4 files changed, 166 insertions(+), 158 deletions(-) diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java index d880305bf..f1367a235 100644 --- a/src/main/java/noppes/npcs/EventHooks.java +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -23,6 +23,7 @@ import noppes.npcs.controllers.data.ForgeDataScript; import noppes.npcs.controllers.data.PlayerDataScript; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.scripted.*; +import noppes.npcs.scripted.entity.ScriptPlayer; import noppes.npcs.scripted.event.*; import noppes.npcs.scripted.event.PlayerEvent.ChatEvent; import noppes.npcs.scripted.event.PlayerEvent.ContainerOpen; @@ -53,14 +54,14 @@ public class EventHooks { WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerInit(PlayerDataScript handler) { - noppes.npcs.scripted.event.PlayerEvent.InitEvent event = new noppes.npcs.scripted.event.PlayerEvent.InitEvent(handler.getPlayer()); + public static void onPlayerInit(PlayerDataScript handler, ScriptPlayer player) { + noppes.npcs.scripted.event.PlayerEvent.InitEvent event = new noppes.npcs.scripted.event.PlayerEvent.InitEvent(player); handler.callScript(EnumScriptType.INIT, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerTick(PlayerDataScript handler) { - noppes.npcs.scripted.event.PlayerEvent.UpdateEvent event = new noppes.npcs.scripted.event.PlayerEvent.UpdateEvent(handler.getPlayer()); + public static void onPlayerTick(PlayerDataScript handler, ScriptPlayer player) { + noppes.npcs.scripted.event.PlayerEvent.UpdateEvent event = new noppes.npcs.scripted.event.PlayerEvent.UpdateEvent(player); handler.callScript(EnumScriptType.TICK, event); WrapperNpcAPI.EVENT_BUS.post(event); } @@ -70,89 +71,89 @@ public class EventHooks { return WrapperNpcAPI.EVENT_BUS.post(event); } - public static boolean onStartUsingItem(PlayerDataScript handler, int duration, ItemStack item){ - PlayerEvent.StartUsingItem event = new PlayerEvent.StartUsingItem(handler.getPlayer(), item, duration); + public static boolean onStartUsingItem(PlayerDataScript handler, ScriptPlayer player, int duration, ItemStack item){ + PlayerEvent.StartUsingItem event = new PlayerEvent.StartUsingItem(player, item, duration); handler.callScript(EnumScriptType.START_USING_ITEM, event); return WrapperNpcAPI.EVENT_BUS.post(event); } - public static boolean onUsingItem(PlayerDataScript handler, int duration, ItemStack item){ - PlayerEvent.UsingItem event = new PlayerEvent.UsingItem(handler.getPlayer(), item, duration); + public static boolean onUsingItem(PlayerDataScript handler, ScriptPlayer player, int duration, ItemStack item){ + PlayerEvent.UsingItem event = new PlayerEvent.UsingItem(player, item, duration); handler.callScript(EnumScriptType.USING_ITEM, event); return WrapperNpcAPI.EVENT_BUS.post(event); } - public static boolean onStopUsingItem(PlayerDataScript handler, int duration, ItemStack item){ - PlayerEvent.StopUsingItem event = new PlayerEvent.StopUsingItem(handler.getPlayer(), item, duration); + public static boolean onStopUsingItem(PlayerDataScript handler, ScriptPlayer player, int duration, ItemStack item){ + PlayerEvent.StopUsingItem event = new PlayerEvent.StopUsingItem(player, item, duration); handler.callScript(EnumScriptType.STOP_USING_ITEM, event); return WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onFinishUsingItem(PlayerDataScript handler, int duration, ItemStack item){ - PlayerEvent.FinishUsingItem event = new PlayerEvent.FinishUsingItem(handler.getPlayer(), item, duration); + public static void onFinishUsingItem(PlayerDataScript handler, ScriptPlayer player, int duration, ItemStack item){ + PlayerEvent.FinishUsingItem event = new PlayerEvent.FinishUsingItem(player, item, duration); handler.callScript(EnumScriptType.FINISH_USING_ITEM, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static boolean onPlayerDropItems(PlayerDataScript handler, ArrayList entityItems) { + public static boolean onPlayerDropItems(PlayerDataScript handler, ScriptPlayer player, ArrayList entityItems) { IItemStack[] items = new IItemStack[entityItems.size()]; for(int i = 0; i < entityItems.size(); i++){ items[i] = NpcAPI.Instance().getIItemStack(entityItems.get(i).getEntityItem()); } - DropEvent event = new DropEvent(handler.getPlayer(), items); + DropEvent event = new DropEvent(player, items); handler.callScript(EnumScriptType.DROP, event); return WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerPickupXP(PlayerDataScript handler, EntityXPOrb orb) { - PlayerEvent.PickupXPEvent event = new PlayerEvent.PickupXPEvent(handler.getPlayer(), orb); + public static void onPlayerPickupXP(PlayerDataScript handler, ScriptPlayer player, EntityXPOrb orb) { + PlayerEvent.PickupXPEvent event = new PlayerEvent.PickupXPEvent(player, orb); handler.callScript(EnumScriptType.PICKUP_XP, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static boolean onPlayerToss(PlayerDataScript handler, EntityItem entityItem) { - PlayerEvent.TossEvent event = new PlayerEvent.TossEvent(handler.getPlayer(), NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); + public static boolean onPlayerToss(PlayerDataScript handler, ScriptPlayer player, EntityItem entityItem) { + PlayerEvent.TossEvent event = new PlayerEvent.TossEvent(player, NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); handler.callScript(EnumScriptType.TOSS, event); return WrapperNpcAPI.EVENT_BUS.post(event); } - public static boolean onPlayerPickUp(PlayerDataScript handler, EntityItem entityItem) { - PickUpEvent event = new PickUpEvent(handler.getPlayer(), new ScriptItemStack(entityItem.getEntityItem()));//NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); + public static boolean onPlayerPickUp(PlayerDataScript handler, ScriptPlayer player, EntityItem entityItem) { + PickUpEvent event = new PickUpEvent(player, new ScriptItemStack(entityItem.getEntityItem()));//NpcAPI.Instance().getIItemStack(entityItem.getEntityItem())); handler.callScript(EnumScriptType.PICKUP, event); return WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerContainerOpen(PlayerDataScript handler, Container container) { - ContainerOpen event = new ContainerOpen(handler.getPlayer(), NpcAPI.Instance().getIContainer(container)); + public static void onPlayerContainerOpen(PlayerDataScript handler, ScriptPlayer player, Container container) { + ContainerOpen event = new ContainerOpen(player, NpcAPI.Instance().getIContainer(container)); handler.callScript(EnumScriptType.CONTAINER_OPEN, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerUseHoe(PlayerDataScript handler, ItemStack hoe, int x, int y, int z) { - noppes.npcs.scripted.event.PlayerEvent.UseHoe event = new noppes.npcs.scripted.event.PlayerEvent.UseHoe(handler.getPlayer(), hoe, x, y, z); + public static void onPlayerUseHoe(PlayerDataScript handler, ScriptPlayer player, ItemStack hoe, int x, int y, int z) { + noppes.npcs.scripted.event.PlayerEvent.UseHoe event = new noppes.npcs.scripted.event.PlayerEvent.UseHoe(player, hoe, x, y, z); handler.callScript(EnumScriptType.USE_HOE, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerSleep(PlayerDataScript handler, int x, int y, int z) { - noppes.npcs.scripted.event.PlayerEvent.Sleep event = new noppes.npcs.scripted.event.PlayerEvent.Sleep(handler.getPlayer(), x, y, z); + public static void onPlayerSleep(PlayerDataScript handler, ScriptPlayer player, int x, int y, int z) { + noppes.npcs.scripted.event.PlayerEvent.Sleep event = new noppes.npcs.scripted.event.PlayerEvent.Sleep(player, x, y, z); handler.callScript(EnumScriptType.SLEEP, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerWakeUp(PlayerDataScript handler, boolean setSpawn) { - noppes.npcs.scripted.event.PlayerEvent.WakeUp event = new noppes.npcs.scripted.event.PlayerEvent.WakeUp(handler.getPlayer(), setSpawn); + public static void onPlayerWakeUp(PlayerDataScript handler, ScriptPlayer player, boolean setSpawn) { + noppes.npcs.scripted.event.PlayerEvent.WakeUp event = new noppes.npcs.scripted.event.PlayerEvent.WakeUp(player, setSpawn); handler.callScript(EnumScriptType.WAKE_UP, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerDeath(PlayerDataScript handler, DamageSource source, Entity entity) { - noppes.npcs.scripted.event.PlayerEvent.DiedEvent event = new noppes.npcs.scripted.event.PlayerEvent.DiedEvent(handler.getPlayer(), source, entity); + public static void onPlayerDeath(PlayerDataScript handler, ScriptPlayer player, DamageSource source, Entity entity) { + noppes.npcs.scripted.event.PlayerEvent.DiedEvent event = new noppes.npcs.scripted.event.PlayerEvent.DiedEvent(player, source, entity); handler.callScript(EnumScriptType.KILLED, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerKills(PlayerDataScript handler, EntityLivingBase entityLiving) { - noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent event = new noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent(handler.getPlayer(), entityLiving); + public static void onPlayerKills(PlayerDataScript handler, ScriptPlayer player, EntityLivingBase entityLiving) { + noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent event = new noppes.npcs.scripted.event.PlayerEvent.KilledEntityEvent(player, entityLiving); handler.callScript(EnumScriptType.KILLS, event); WrapperNpcAPI.EVENT_BUS.post(event); } @@ -162,62 +163,62 @@ public class EventHooks { return WrapperNpcAPI.EVENT_BUS.post(event); } - public static boolean onPlayerLightning(PlayerDataScript handler) { - PlayerEvent.LightningEvent event = new PlayerEvent.LightningEvent(handler.getPlayer()); + public static boolean onPlayerLightning(PlayerDataScript handler, ScriptPlayer player) { + PlayerEvent.LightningEvent event = new PlayerEvent.LightningEvent(player); handler.callScript(EnumScriptType.LIGHTNING, event); return WrapperNpcAPI.EVENT_BUS.post(event); } - public static boolean onPlayerSound(PlayerDataScript handler, String name, float pitch, float volume) { - PlayerEvent.SoundEvent event = new PlayerEvent.SoundEvent(handler.getPlayer(), name, pitch, volume); + public static boolean onPlayerSound(PlayerDataScript handler, ScriptPlayer player, String name, float pitch, float volume) { + PlayerEvent.SoundEvent event = new PlayerEvent.SoundEvent(player, name, pitch, volume); handler.callScript(EnumScriptType.PLAYSOUND, event); return WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerFall(PlayerDataScript handler, float distance) { - PlayerEvent.FallEvent event = new PlayerEvent.FallEvent(handler.getPlayer(),distance); + public static void onPlayerFall(PlayerDataScript handler, ScriptPlayer player, float distance) { + PlayerEvent.FallEvent event = new PlayerEvent.FallEvent(player,distance); handler.callScript(EnumScriptType.FALL, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerJump(PlayerDataScript handler) { - PlayerEvent.JumpEvent event = new PlayerEvent.JumpEvent(handler.getPlayer()); + public static void onPlayerJump(PlayerDataScript handler, ScriptPlayer player) { + PlayerEvent.JumpEvent event = new PlayerEvent.JumpEvent(player); handler.callScript(EnumScriptType.JUMP, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerLogin(PlayerDataScript handler) { - LoginEvent event = new LoginEvent(handler.getPlayer()); + public static void onPlayerLogin(PlayerDataScript handler, ScriptPlayer player) { + LoginEvent event = new LoginEvent(player); handler.callScript(EnumScriptType.LOGIN, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerAchievement(PlayerDataScript handler, String description) { - PlayerEvent.Achievement event = new PlayerEvent.Achievement(handler.getPlayer(), description); + public static void onPlayerAchievement(PlayerDataScript handler, ScriptPlayer player, String description) { + PlayerEvent.Achievement event = new PlayerEvent.Achievement(player, description); handler.callScript(EnumScriptType.ACHIEVEMENT, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerFillBucket(PlayerDataScript handler, ItemStack current, ItemStack result) { - PlayerEvent.FillBucket event = new PlayerEvent.FillBucket(handler.getPlayer(), current, result); + public static void onPlayerFillBucket(PlayerDataScript handler, ScriptPlayer player, ItemStack current, ItemStack result) { + PlayerEvent.FillBucket event = new PlayerEvent.FillBucket(player, current, result); handler.callScript(EnumScriptType.FILL_BUCKET, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerBonemeal(PlayerDataScript handler, int x, int y, int z, World world) { - PlayerEvent.Bonemeal event = new PlayerEvent.Bonemeal(handler.getPlayer(), x, y, z, world); + public static void onPlayerBonemeal(PlayerDataScript handler, ScriptPlayer player, int x, int y, int z, World world) { + PlayerEvent.Bonemeal event = new PlayerEvent.Bonemeal(player, x, y, z, world); handler.callScript(EnumScriptType.BONEMEAL, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerRespawn(PlayerDataScript handler) { - PlayerEvent.RespawnEvent event = new PlayerEvent.RespawnEvent(handler.getPlayer()); + public static void onPlayerRespawn(PlayerDataScript handler, ScriptPlayer player) { + PlayerEvent.RespawnEvent event = new PlayerEvent.RespawnEvent(player); handler.callScript(EnumScriptType.RESPAWN, event); WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerLogout(PlayerDataScript handler) { - LogoutEvent event = new LogoutEvent(handler.getPlayer()); + public static void onPlayerLogout(PlayerDataScript handler, ScriptPlayer player) { + LogoutEvent event = new LogoutEvent(player); handler.callScript(EnumScriptType.LOGOUT, event); WrapperNpcAPI.EVENT_BUS.post(event); } @@ -242,29 +243,29 @@ public class EventHooks { return WrapperNpcAPI.EVENT_BUS.post(event); } - public static void onPlayerChangeDim(PlayerDataScript handler, int fromDim, int toDim) { - PlayerEvent.ChangedDimension event = new PlayerEvent.ChangedDimension(handler.getPlayer(), fromDim, toDim); + public static void onPlayerChangeDim(PlayerDataScript handler, ScriptPlayer player, int fromDim, int toDim) { + PlayerEvent.ChangedDimension event = new PlayerEvent.ChangedDimension(player, fromDim, toDim); handler.callScript(EnumScriptType.CHANGED_DIM, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerMouseClicked(EntityPlayerMP player, int button, int mouseWheel, boolean buttonDown) { - PlayerDataScript handler = PlayerData.get(player).scriptData; - PlayerEvent.MouseClickedEvent event = new PlayerEvent.MouseClickedEvent(handler.getPlayer(), button, mouseWheel, buttonDown); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + PlayerEvent.MouseClickedEvent event = new PlayerEvent.MouseClickedEvent((ScriptPlayer)ScriptController.Instance.getScriptForEntity(player), button, mouseWheel, buttonDown); handler.callScript(EnumScriptType.MOUSE_CLICKED, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerKeyPressed(EntityPlayerMP player, int button, boolean isCtrlPressed, boolean isShiftPressed, boolean isAltPressed, boolean isMetaPressed, boolean buttonDown) { - PlayerDataScript handler = PlayerData.get(player).scriptData; - KeyPressedEvent event = new KeyPressedEvent(handler.getPlayer(), button, isCtrlPressed, isAltPressed, isShiftPressed, isMetaPressed, buttonDown); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + KeyPressedEvent event = new KeyPressedEvent((ScriptPlayer)ScriptController.Instance.getScriptForEntity(player), button, isCtrlPressed, isAltPressed, isShiftPressed, isMetaPressed, buttonDown); handler.callScript(EnumScriptType.KEY_PRESSED, event); WrapperNpcAPI.EVENT_BUS.post(event); } public static void onPlayerTimer(PlayerData data, int id) { - PlayerDataScript handler = data.scriptData; - noppes.npcs.scripted.event.PlayerEvent.TimerEvent event = new noppes.npcs.scripted.event.PlayerEvent.TimerEvent(handler.getPlayer(), id); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + noppes.npcs.scripted.event.PlayerEvent.TimerEvent event = new noppes.npcs.scripted.event.PlayerEvent.TimerEvent((ScriptPlayer)ScriptController.Instance.getScriptForEntity(data.player), id); handler.callScript(EnumScriptType.TIMER, event); WrapperNpcAPI.EVENT_BUS.post(event); } diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 1a5628905..334c63465 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -51,6 +51,7 @@ import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.data.PlayerDataScript; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.entity.ScriptPlayer; import noppes.npcs.scripted.event.ForgeEvent; import noppes.npcs.controllers.PixelmonHelper; import noppes.npcs.controllers.ScriptController; @@ -63,13 +64,14 @@ public class ScriptPlayerEventHandler { public void onServerTick(TickEvent.PlayerTickEvent event) { if(event.side == Side.SERVER && event.phase == TickEvent.Phase.START) { EntityPlayer player = event.player; - PlayerData data = PlayerData.get(player); - if(player.ticksExisted%10 == 0) - EventHooks.onPlayerTick(data.scriptData); + if(player.ticksExisted%10 == 0) { + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(player); + EventHooks.onPlayerTick(handler, scriptPlayer); + } if(PlayerDataController.instance != null) { - PlayerDataController.instance.getPlayerData(player).scriptData = data.scriptData; if(PlayerDataController.instance.getPlayerData(player).timers.size() > 0) PlayerDataController.instance.getPlayerData(player).timers.update(); } @@ -79,8 +81,9 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(EntityInteractEvent event) { if(!event.entityPlayer.worldObj.isRemote && event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - noppes.npcs.scripted.event.PlayerEvent.InteractEvent ev = new noppes.npcs.scripted.event.PlayerEvent.InteractEvent(handler.getPlayer(), 1, NpcAPI.Instance().getIEntity(event.target)); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + noppes.npcs.scripted.event.PlayerEvent.InteractEvent ev = new noppes.npcs.scripted.event.PlayerEvent.InteractEvent(scriptPlayer, 1, NpcAPI.Instance().getIEntity(event.target)); event.setCanceled(EventHooks.onPlayerInteract(handler, ev)); } } @@ -88,8 +91,9 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(ArrowNockEvent event) { if(!event.entityPlayer.worldObj.isRemote && event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - noppes.npcs.scripted.event.PlayerEvent.RangedChargeEvent ev = new noppes.npcs.scripted.event.PlayerEvent.RangedChargeEvent(handler.getPlayer()); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + noppes.npcs.scripted.event.PlayerEvent.RangedChargeEvent ev = new noppes.npcs.scripted.event.PlayerEvent.RangedChargeEvent(scriptPlayer); EventHooks.onPlayerBowCharge(handler, ev); } } @@ -97,8 +101,9 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(ArrowLooseEvent event) { if(!event.entityPlayer.worldObj.isRemote && event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - noppes.npcs.scripted.event.PlayerEvent.RangedLaunchedEvent ev = new noppes.npcs.scripted.event.PlayerEvent.RangedLaunchedEvent(handler.getPlayer(), event.bow, event.charge); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + noppes.npcs.scripted.event.PlayerEvent.RangedLaunchedEvent ev = new noppes.npcs.scripted.event.PlayerEvent.RangedLaunchedEvent(scriptPlayer, event.bow, event.charge); EventHooks.onPlayerRanged(handler, ev); } } @@ -106,8 +111,9 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(BlockEvent.BreakEvent event) { if(!event.getPlayer().worldObj.isRemote && event.world instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.getPlayer()).scriptData; - noppes.npcs.scripted.event.PlayerEvent.BreakEvent ev = new noppes.npcs.scripted.event.PlayerEvent.BreakEvent(handler.getPlayer(), NpcAPI.Instance().getIBlock(event.world, new BlockPos(event.x,event.y,event.z)), event.getExpToDrop()); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.getPlayer()); + noppes.npcs.scripted.event.PlayerEvent.BreakEvent ev = new noppes.npcs.scripted.event.PlayerEvent.BreakEvent(scriptPlayer, NpcAPI.Instance().getIBlock(event.world, new BlockPos(event.x,event.y,event.z)), event.getExpToDrop()); event.setCanceled(EventHooks.onPlayerBreak(handler, ev)); event.setExpToDrop(ev.exp); } @@ -116,135 +122,151 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(PlayerUseItemEvent.Start event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - event.setCanceled(EventHooks.onStartUsingItem(handler, event.duration, event.item)); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + event.setCanceled(EventHooks.onStartUsingItem(handler, scriptPlayer, event.duration, event.item)); } } @SubscribeEvent public void invoke(PlayerUseItemEvent.Tick event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - event.setCanceled(EventHooks.onUsingItem(handler, event.duration, event.item)); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + event.setCanceled(EventHooks.onUsingItem(handler, scriptPlayer, event.duration, event.item)); } } @SubscribeEvent public void invoke(PlayerUseItemEvent.Stop event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - event.setCanceled(EventHooks.onStopUsingItem(handler, event.duration, event.item)); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + event.setCanceled(EventHooks.onStopUsingItem(handler, scriptPlayer, event.duration, event.item)); } } @SubscribeEvent public void invoke(PlayerUseItemEvent.Finish event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - EventHooks.onFinishUsingItem(handler, event.duration, event.item); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + EventHooks.onFinishUsingItem(handler, scriptPlayer, event.duration, event.item); } } @SubscribeEvent public void invoke(PlayerDropsEvent event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - event.setCanceled(EventHooks.onPlayerDropItems(handler, event.drops)); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + event.setCanceled(EventHooks.onPlayerDropItems(handler, scriptPlayer, event.drops)); } } @SubscribeEvent public void invoke(PlayerPickupXpEvent event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - EventHooks.onPlayerPickupXP(handler, event.orb); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + EventHooks.onPlayerPickupXP(handler, scriptPlayer, event.orb); } } @SubscribeEvent public void invoke(PlayerEvent.PlayerChangedDimensionEvent event) { if(event.player.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.player).scriptData; - EventHooks.onPlayerChangeDim(handler, event.fromDim, event.toDim); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.player); + EventHooks.onPlayerChangeDim(handler, scriptPlayer, event.fromDim, event.toDim); } } @SubscribeEvent public void invoke(PlayerEvent.ItemPickupEvent event) { if(event.player.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.player).scriptData; - EventHooks.onPlayerPickUp(handler, event.pickedUp); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.player); + EventHooks.onPlayerPickUp(handler, scriptPlayer, event.pickedUp); } } @SubscribeEvent public void invoke(PlayerOpenContainerEvent event) { if(event.entityPlayer.worldObj instanceof WorldServer && !(event.entityPlayer.openContainer instanceof ContainerPlayer)) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - EventHooks.onPlayerContainerOpen(handler, event.entityPlayer.openContainer); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + EventHooks.onPlayerContainerOpen(handler, scriptPlayer, event.entityPlayer.openContainer); } } @SubscribeEvent public void invoke(UseHoeEvent event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - EventHooks.onPlayerUseHoe(handler, event.current, event.x, event.y, event.z); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + EventHooks.onPlayerUseHoe(handler, scriptPlayer, event.current, event.x, event.y, event.z); } } @SubscribeEvent public void invoke(PlayerSleepInBedEvent event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - EventHooks.onPlayerSleep(handler, event.x, event.y, event.z); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + EventHooks.onPlayerSleep(handler, scriptPlayer, event.x, event.y, event.z); } } @SubscribeEvent public void invoke(PlayerWakeUpEvent event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - EventHooks.onPlayerWakeUp(handler, event.setSpawn); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + EventHooks.onPlayerWakeUp(handler, scriptPlayer, event.setSpawn); } } @SubscribeEvent public void invoke(FillBucketEvent event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - EventHooks.onPlayerFillBucket(handler, event.current, event.result); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + EventHooks.onPlayerFillBucket(handler, scriptPlayer, event.current, event.result); } } @SubscribeEvent public void invoke(BonemealEvent event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - EventHooks.onPlayerBonemeal(handler, event.x, event.y, event.z, event.world); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + EventHooks.onPlayerBonemeal(handler, scriptPlayer, event.x, event.y, event.z, event.world); } } @SubscribeEvent public void invoke(AchievementEvent event) { if(event.entityPlayer.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; - EventHooks.onPlayerAchievement(handler, CustomNpcs.proxy.getAchievementDesc(event.achievement)); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityPlayer); + EventHooks.onPlayerAchievement(handler, scriptPlayer, CustomNpcs.proxy.getAchievementDesc(event.achievement)); } } @SubscribeEvent public void invoke(ItemTossEvent event) { if(event.player.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.player).scriptData; - EventHooks.onPlayerToss(handler, event.entityItem); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.player); + EventHooks.onPlayerToss(handler, scriptPlayer, event.entityItem); } } @SubscribeEvent public void invoke(LivingFallEvent event) { if(event.entityLiving.worldObj instanceof WorldServer) { - PlayerDataScript handler; if (event.entityLiving instanceof EntityPlayer) { - handler = PlayerData.get((EntityPlayer)event.entityLiving).scriptData; - EventHooks.onPlayerFall(handler, event.distance); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityLiving); + EventHooks.onPlayerFall(handler, scriptPlayer, event.distance); } } } @@ -252,10 +274,10 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(LivingEvent.LivingJumpEvent event) { if(event.entityLiving.worldObj instanceof WorldServer) { - PlayerDataScript handler; if (event.entityLiving instanceof EntityPlayer) { - handler = PlayerData.get((EntityPlayer)event.entityLiving).scriptData; - EventHooks.onPlayerJump(handler); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityLiving); + EventHooks.onPlayerJump(handler, scriptPlayer); } } } @@ -263,10 +285,10 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(EntityStruckByLightningEvent event) { if(event.entity.worldObj instanceof WorldServer) { - PlayerDataScript handler; if (event.entity instanceof EntityPlayer) { - handler = PlayerData.get((EntityPlayer)event.entity).scriptData; - EventHooks.onPlayerLightning(handler); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entity); + EventHooks.onPlayerLightning(handler, scriptPlayer); } } } @@ -274,10 +296,10 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(PlaySoundAtEntityEvent event) { if(event.entity.worldObj instanceof WorldServer) { - PlayerDataScript handler; if (event.entity instanceof EntityPlayer) { - handler = PlayerData.get((EntityPlayer)event.entity).scriptData; - EventHooks.onPlayerSound(handler,event.name,event.pitch,event.volume); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entity); + EventHooks.onPlayerSound(handler,scriptPlayer,event.name,event.pitch,event.volume); } } } @@ -286,15 +308,15 @@ public class ScriptPlayerEventHandler { public void invoke(LivingDeathEvent event) { if(event.entityLiving.worldObj instanceof WorldServer) { Entity source = NoppesUtilServer.GetDamageSourcee(event.source); - PlayerDataScript handler; + PlayerDataScript handler = ScriptController.Instance.playerScripts; if(event.entityLiving instanceof EntityPlayer) { - handler = PlayerData.get((EntityPlayer)event.entityLiving).scriptData; - EventHooks.onPlayerDeath(handler, event.source, source); + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.entityLiving); + EventHooks.onPlayerDeath(handler,scriptPlayer, event.source, source); } if(source instanceof EntityPlayer) { - handler = PlayerData.get((EntityPlayer)source).scriptData; - EventHooks.onPlayerKills(handler, event.entityLiving); + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.source.getEntity()); + EventHooks.onPlayerKills(handler,scriptPlayer, event.entityLiving); } } @@ -304,17 +326,15 @@ public class ScriptPlayerEventHandler { public void invoke(LivingHurtEvent event) { if(event.entityLiving.worldObj instanceof WorldServer) { Entity source = NoppesUtilServer.GetDamageSourcee(event.source); - PlayerDataScript handler; + PlayerDataScript handler = ScriptController.Instance.playerScripts; if(event.entityLiving instanceof EntityPlayer) { - handler = PlayerData.get((EntityPlayer)event.entityLiving).scriptData; - noppes.npcs.scripted.event.PlayerEvent.DamagedEvent pevent = new noppes.npcs.scripted.event.PlayerEvent.DamagedEvent(handler.getPlayer(), source, event.ammount, event.source); + noppes.npcs.scripted.event.PlayerEvent.DamagedEvent pevent = new noppes.npcs.scripted.event.PlayerEvent.DamagedEvent((ScriptPlayer)ScriptController.Instance.getScriptForEntity((EntityPlayer)event.entityLiving), source, event.ammount, event.source); event.setCanceled(EventHooks.onPlayerDamaged(handler, pevent)); event.ammount = pevent.damage; } if(source instanceof EntityPlayer) { - handler = PlayerData.get((EntityPlayer)source).scriptData; - noppes.npcs.scripted.event.PlayerEvent.DamagedEntityEvent pevent1 = new noppes.npcs.scripted.event.PlayerEvent.DamagedEntityEvent(handler.getPlayer(), event.entityLiving, event.ammount, event.source); + noppes.npcs.scripted.event.PlayerEvent.DamagedEntityEvent pevent1 = new noppes.npcs.scripted.event.PlayerEvent.DamagedEntityEvent((ScriptPlayer)ScriptController.Instance.getScriptForEntity((EntityPlayer)event.source.getEntity()), event.entityLiving, event.ammount, event.source); event.setCanceled(EventHooks.onPlayerDamagedEntity(handler, pevent1)); event.ammount = pevent1.damage; } @@ -325,24 +345,27 @@ public class ScriptPlayerEventHandler { @SubscribeEvent public void invoke(PlayerEvent.PlayerRespawnEvent event) { if(event.player.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.player).scriptData; - EventHooks.onPlayerRespawn(handler); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.player); + EventHooks.onPlayerRespawn(handler, scriptPlayer); } } @SubscribeEvent public void invoke(PlayerEvent.PlayerLoggedInEvent event) { if(event.player.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.player).scriptData; - EventHooks.onPlayerLogin(handler); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.player); + EventHooks.onPlayerLogin(handler, scriptPlayer); } } @SubscribeEvent public void invoke(PlayerEvent.PlayerLoggedOutEvent event) { if(event.player.worldObj instanceof WorldServer) { - PlayerDataScript handler = PlayerData.get(event.player).scriptData; - EventHooks.onPlayerLogout(handler); + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.player); + EventHooks.onPlayerLogout(handler, scriptPlayer); } } @@ -351,9 +374,10 @@ public class ScriptPlayerEventHandler { ) public void invoke(net.minecraftforge.event.ServerChatEvent event) { if(event.player.worldObj instanceof WorldServer && !event.player.equals(EntityNPCInterface.chateventPlayer)) { - PlayerDataScript handler = PlayerData.get(event.player).scriptData; + PlayerDataScript handler = ScriptController.Instance.playerScripts; + ScriptPlayer scriptPlayer = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(event.player); String message = event.message; - noppes.npcs.scripted.event.PlayerEvent.ChatEvent ev = new noppes.npcs.scripted.event.PlayerEvent.ChatEvent(handler.getPlayer(), event.message); + noppes.npcs.scripted.event.PlayerEvent.ChatEvent ev = new noppes.npcs.scripted.event.PlayerEvent.ChatEvent(scriptPlayer, event.message); EventHooks.onPlayerChat(handler, ev); event.setCanceled(ev.isCanceled()); if(!message.equals(ev.message)) { diff --git a/src/main/java/noppes/npcs/controllers/PlayerData.java b/src/main/java/noppes/npcs/controllers/PlayerData.java index ec37e4cb4..28b018239 100644 --- a/src/main/java/noppes/npcs/controllers/PlayerData.java +++ b/src/main/java/noppes/npcs/controllers/PlayerData.java @@ -28,7 +28,6 @@ public class PlayerData implements IExtendedEntityProperties{ public PlayerFactionData factionData = new PlayerFactionData(); public PlayerItemGiverData itemgiverData = new PlayerItemGiverData(); public PlayerMailData mailData = new PlayerMailData(); - public PlayerDataScript scriptData; public DataTimers timers = new DataTimers(this); public EntityNPCInterface editingNpc; @@ -232,7 +231,6 @@ public class PlayerData implements IExtendedEntityProperties{ PlayerData data = new PlayerData(); if (data.player == null) { data.player = player; - data.scriptData = new PlayerDataScript(player); NBTTagCompound compound = loadPlayerData(player.getPersistentID().toString()); if (compound.hasNoTags()) { compound = loadPlayerDataOld(player.getCommandSenderName()); diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java index 288e35846..b3614e6b9 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java @@ -20,6 +20,7 @@ import noppes.npcs.scripted.NpcAPI; import noppes.npcs.constants.EnumScriptType; import noppes.npcs.controllers.IScriptHandler; import noppes.npcs.controllers.ScriptController; +import noppes.npcs.scripted.entity.ScriptPlayer; import noppes.npcs.scripted.event.PlayerEvent; import noppes.npcs.scripted.interfaces.IPlayer; import noppes.npcs.scripted.interfaces.IWorld; @@ -33,19 +34,13 @@ public class PlayerDataScript implements IScriptHandler { private IPlayer playerAPI; private long lastPlayerUpdate = 0L; public long lastInited = -1L; - public boolean hadInteract = true; public boolean enabled = false; private Map console = new TreeMap(); public List errored = new ArrayList(); - public IPlayer dummyPlayer; - public IWorld dummyWorld; + public PlayerDataScript(EntityPlayer player) { if(player != null) { this.player = player; - if (player instanceof EntityPlayer) - dummyPlayer = (IPlayer) ScriptController.Instance.getScriptForEntity(this.player); - if (player.worldObj instanceof WorldServer) - dummyWorld = (IWorld) NpcAPI.Instance().getIWorld((WorldServer) this.player.worldObj); } } public void clear() { @@ -73,27 +68,17 @@ public class PlayerDataScript implements IScriptHandler { if (ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { this.lastInited = ScriptController.Instance.lastLoaded; errored.clear(); - if(this.player != null) { - this.scripts.clear(); - Iterator i = ScriptController.Instance.playerScripts.scripts.iterator(); - - while(i.hasNext()) { - script = (ScriptContainer)i.next(); - ScriptContainer s = new ScriptContainer(this); - s.readFromNBT(script.writeToNBT(new NBTTagCompound())); - - this.scripts.add(s); - } - } this.lastPlayerUpdate = ScriptController.Instance.lastPlayerUpdate; + if (type != EnumScriptType.INIT) { - EventHooks.onPlayerInit(this); + noppes.npcs.scripted.event.PlayerEvent playerEvent = (noppes.npcs.scripted.event.PlayerEvent)event; + EventHooks.onPlayerInit(this, (ScriptPlayer) playerEvent.player); } } - for(int i = 0; i < this.scripts.size(); ++i) { - script = (ScriptContainer)this.scripts.get(i); + for(int i = 0; i < ScriptController.Instance.playerScripts.scripts.size(); ++i) { + script = (ScriptContainer)ScriptController.Instance.playerScripts.scripts.get(i); if (!errored.contains(i)) { if(script == null || script.errored || !script.hasCode() || ScriptController.Instance.playerScripts.errored.contains(i)) return; From 69d4fb20fff4c39110b11bf45652ac0e9db6849d Mon Sep 17 00:00:00 2001 From: luisc Date: Mon, 20 Dec 2021 16:57:05 -0600 Subject: [PATCH 53/54] Modified client and server packet sending a little bit for player and forge scripts. --- .../java/noppes/npcs/client/gui/script/GuiScriptForge.java | 5 +++-- .../java/noppes/npcs/client/gui/script/GuiScriptPlayers.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java index e9a29fe6a..de7047c3f 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java @@ -8,6 +8,7 @@ package noppes.npcs.client.gui.script; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.client.Client; import noppes.npcs.constants.EnumPacketServer; +import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.data.ForgeDataScript; public class GuiScriptForge extends GuiScriptInterface { @@ -15,7 +16,7 @@ public class GuiScriptForge extends GuiScriptInterface { public GuiScriptForge() { this.handler = this.script; - Client.sendData(EnumPacketServer.ScriptForgeGet); + Client.sendData(EnumPacketServer.ScriptForgeGet, new Object[0]); } public void setGuiData(NBTTagCompound compound) { @@ -25,6 +26,6 @@ public class GuiScriptForge extends GuiScriptInterface { public void save() { super.save(); - Client.sendData(EnumPacketServer.ScriptForgeSave, script.writeToNBT(new NBTTagCompound())); + Client.sendData(EnumPacketServer.ScriptForgeSave, new Object[]{this.script.writeToNBT(new NBTTagCompound())}); } } diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java index 79dd8753c..1637260f8 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java @@ -17,7 +17,7 @@ public class GuiScriptPlayers extends GuiScriptInterface { public GuiScriptPlayers() { this.handler = this.script; - Client.sendData(EnumPacketServer.ScriptPlayerGet); + Client.sendData(EnumPacketServer.ScriptPlayerGet, new Object[0]); } public void setGuiData(NBTTagCompound compound) { @@ -27,7 +27,7 @@ public class GuiScriptPlayers extends GuiScriptInterface { public void save() { super.save(); - Client.sendData(EnumPacketServer.ScriptPlayerSave, script.writeToNBT(new NBTTagCompound())); + Client.sendData(EnumPacketServer.ScriptPlayerSave, new Object[]{this.script.writeToNBT(new NBTTagCompound())}); } public void close() { From ff810cbc8d95ef22d5a5e6b29bd53f248110d5b4 Mon Sep 17 00:00:00 2001 From: luisc Date: Mon, 20 Dec 2021 17:03:54 -0600 Subject: [PATCH 54/54] Full console output is now shown again for script errors. --- .../npcs/controllers/ScriptContainer.java | 28 ++----------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index 6d20281f9..806be0e3e 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -104,19 +104,7 @@ public class ScriptContainer { var14.printStackTrace(pw); } finally { String errorString = sw.getBuffer().toString().trim(); - int startIndex = 0; - if(!errorString.isEmpty()) { - String endString = "in at line number "; - startIndex = errorString.indexOf(endString) + endString.length(); - - for (int i = startIndex; i < errorString.length(); i++) { - if (!Character.isDigit(errorString.charAt(i))) { - startIndex = i; - break; - } - } - } - this.appandConsole(errorString.substring(0, startIndex)); + this.appandConsole(errorString); pw.close(); } } @@ -157,19 +145,7 @@ public class ScriptContainer { var14.printStackTrace(pw); } finally { String errorString = sw.getBuffer().toString().trim(); - int startIndex = 0; - if(!errorString.isEmpty()) { - String endString = "in at line number "; - startIndex = errorString.indexOf(endString) + endString.length(); - - for (int i = startIndex; i < errorString.length(); i++) { - if (!Character.isDigit(errorString.charAt(i))) { - startIndex = i; - break; - } - } - } - this.appandConsole(errorString.substring(0, startIndex)); + this.appandConsole(errorString); pw.close(); Current = null; }