diff --git a/build.gradle b/build.gradle index 03ba50702..d7092be2b 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'idea' } -version = "1.10" +version = "1.10.2" group= "kamkeel.customnpc-plus" archivesBaseName = "CustomNPC-Plus" diff --git a/src/api b/src/api index 5c6b16e75..bbbea878f 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit 5c6b16e75f35da078ba1f0c88421cc8e84bc6534 +Subproject commit bbbea878fe30ea033112b0c5f1604417d4197447 diff --git a/src/main/java/kamkeel/npcs/network/packets/player/customgui/CustomGuiClosePacket.java b/src/main/java/kamkeel/npcs/network/packets/player/customgui/CustomGuiClosePacket.java index 51bfacaa0..a94b6c4a3 100644 --- a/src/main/java/kamkeel/npcs/network/packets/player/customgui/CustomGuiClosePacket.java +++ b/src/main/java/kamkeel/npcs/network/packets/player/customgui/CustomGuiClosePacket.java @@ -49,9 +49,6 @@ public final class CustomGuiClosePacket extends AbstractPacket { @Override public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { - if (!(player.openContainer instanceof ContainerCustomGui)) - return; - NBTTagCompound comp = ByteBufUtils.readNBT(in); EventHooks.onCustomGuiClose((IPlayer) NpcAPI.Instance().getIEntity(player), (new ScriptGui()).fromNBT(comp)); } diff --git a/src/main/java/kamkeel/npcs/network/packets/request/role/RoleGetPacket.java b/src/main/java/kamkeel/npcs/network/packets/request/role/RoleGetPacket.java index 762a34ca4..46accdce7 100644 --- a/src/main/java/kamkeel/npcs/network/packets/request/role/RoleGetPacket.java +++ b/src/main/java/kamkeel/npcs/network/packets/request/role/RoleGetPacket.java @@ -55,6 +55,7 @@ public final class RoleGetPacket extends AbstractPacket { NBTTagCompound compound = new NBTTagCompound(); compound.setBoolean("RoleData", true); + compound.setInteger("RoleOrdinal", npc.advanced.role.ordinal()); GuiDataPacket.sendGuiData((EntityPlayerMP) player, npc.roleInterface.writeToNBT(compound)); } } diff --git a/src/main/java/noppes/npcs/CustomNpcs.java b/src/main/java/noppes/npcs/CustomNpcs.java index 8a99d066e..fddea1379 100644 --- a/src/main/java/noppes/npcs/CustomNpcs.java +++ b/src/main/java/noppes/npcs/CustomNpcs.java @@ -41,7 +41,7 @@ import noppes.npcs.scripted.NpcAPI; import java.io.File; import java.util.Set; -@Mod(modid = "customnpcs", name = "CustomNPC+", version = "1.10") +@Mod(modid = "customnpcs", name = "CustomNPC+", version = "1.10.2") public class CustomNpcs { @SidedProxy(clientSide = "noppes.npcs.client.ClientProxy", serverSide = "noppes.npcs.CommonProxy") diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java index 34269f4a1..17f9e2dd6 100644 --- a/src/main/java/noppes/npcs/EventHooks.java +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -390,6 +390,11 @@ public class EventHooks { return NpcAPI.EVENT_BUS.post(event); } + public static boolean onPlayerRightClick(PlayerDataScript handler, PlayerEvent.RightClickEvent event) { + handler.callScript(EnumScriptType.RIGHT_CLICK, event); + return NpcAPI.EVENT_BUS.post(event); + } + public static boolean onProfileChange(PlayerDataScript handler, IPlayer player, IProfile profile, int newSlot, int prevSlot, boolean post) { PlayerEvent.ProfileEvent.Changed event = new PlayerEvent.ProfileEvent.Changed(player, profile, newSlot, prevSlot, post); handler.callScript(EnumScriptType.PROFILE_CHANGE, event); diff --git a/src/main/java/noppes/npcs/ScriptItemEventHandler.java b/src/main/java/noppes/npcs/ScriptItemEventHandler.java index 02f4ee08f..7aa6b8a45 100644 --- a/src/main/java/noppes/npcs/ScriptItemEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptItemEventHandler.java @@ -154,6 +154,7 @@ public class ScriptItemEventHandler { ItemNpcTool.setColor(held.getTagCompound(), color); e.setCanceled(true); + return; } } } diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index e4e1c0f81..8f8ffbb2f 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -23,6 +23,7 @@ import net.minecraftforge.event.entity.item.ItemTossEvent; import net.minecraftforge.event.entity.living.*; import net.minecraftforge.event.entity.player.*; import net.minecraftforge.event.world.BlockEvent; +import noppes.npcs.api.IWorld; import noppes.npcs.api.entity.IPlayer; import noppes.npcs.api.item.IItemCustomizable; import noppes.npcs.config.ConfigMain; @@ -34,8 +35,10 @@ import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.data.*; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.items.ItemNpcTool; +import noppes.npcs.items.ItemScripted; import noppes.npcs.quests.QuestItem; import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.event.ItemEvent; import static noppes.npcs.config.ConfigMain.TrackedQuestUpdateFrequency; @@ -123,9 +126,46 @@ public class ScriptPlayerEventHandler { if (!event.entityPlayer.worldObj.isRemote && event.entityPlayer.worldObj instanceof WorldServer && event.entityPlayer instanceof EntityPlayerMP) { PlayerDataScript handler = ScriptController.Instance.getPlayerScripts(event.entityPlayer); - IPlayer scriptPlayer = (IPlayer) NpcAPI.Instance().getIEntity(event.entityPlayer); - noppes.npcs.scripted.event.player.PlayerEvent.InteractEvent ev = new noppes.npcs.scripted.event.player.PlayerEvent.InteractEvent(scriptPlayer, 1, NpcAPI.Instance().getIEntity(event.target)); - event.setCanceled(EventHooks.onPlayerInteract(handler, ev)); + IPlayer ip = NoppesUtilServer.getIPlayer(event.entityPlayer); + + noppes.npcs.scripted.event.player.PlayerEvent.RightClickEvent rightClickEvent = new noppes.npcs.scripted.event.player.PlayerEvent.RightClickEvent(ip, 1, NpcAPI.Instance().getIEntity(event.target)); + boolean rightClick = EventHooks.onPlayerRightClick(handler, rightClickEvent); + + noppes.npcs.scripted.event.player.PlayerEvent.InteractEvent ev = new noppes.npcs.scripted.event.player.PlayerEvent.InteractEvent(ip, 1, NpcAPI.Instance().getIEntity(event.target)); + boolean interact = EventHooks.onPlayerInteract(handler, ev); + + event.setCanceled(rightClick || interact); + } + } + + @SubscribeEvent + public void invoke(PlayerInteractEvent event) { + if (event.entityPlayer == null || event.entityPlayer.worldObj == null || event.entityPlayer.worldObj.isRemote || !(event.entityPlayer instanceof EntityPlayerMP)) + return; + + if(event.action == PlayerInteractEvent.Action.LEFT_CLICK_BLOCK) + return; + + IPlayer ip = NoppesUtilServer.getIPlayer(event.entityPlayer); + PlayerDataScript handler = ScriptController.Instance.getPlayerScripts(event.entityPlayer); + PlayerData pd = PlayerData.get(event.entityPlayer); + if (pd == null) { + return; + } + + if (event.action == PlayerInteractEvent.Action.RIGHT_CLICK_AIR){ + if (pd.hadInteract) { + pd.hadInteract = false; + return; + } + noppes.npcs.scripted.event.player.PlayerEvent.RightClickEvent rightClickEvent = new noppes.npcs.scripted.event.player.PlayerEvent.RightClickEvent(ip, 0, null); + event.setCanceled(EventHooks.onPlayerRightClick(handler, rightClickEvent)); + } else if (event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK){ + pd.hadInteract = true; + IWorld iw = (IWorld) NpcAPI.Instance().getIWorld(event.world); + Object blockCtx = NpcAPI.Instance().getIBlock(iw, event.x, event.y, event.z); + noppes.npcs.scripted.event.player.PlayerEvent.RightClickEvent rightClickEvent = new noppes.npcs.scripted.event.player.PlayerEvent.RightClickEvent(ip, 2, blockCtx); + event.setCanceled(EventHooks.onPlayerRightClick(handler, rightClickEvent)); } } diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileVariant.java b/src/main/java/noppes/npcs/blocks/tiles/TileVariant.java index 81abe288f..f893a4d05 100644 --- a/src/main/java/noppes/npcs/blocks/tiles/TileVariant.java +++ b/src/main/java/noppes/npcs/blocks/tiles/TileVariant.java @@ -7,6 +7,7 @@ import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Facing; import static noppes.npcs.items.ItemNpcTool.BRUSH_COLOR_TAG; @@ -18,6 +19,11 @@ public class TileVariant extends TileEntity { public int variant = 14; public int rotation; + // Rotation = 0 Couch is Facing North + // Rotation = 1 Couch is Facing East + // Rotation = 2 Couch is Facing South + // Rotation = 3 Couch is Facing West + public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); version = compound.getInteger("CNPCVersion"); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiMagic.java b/src/main/java/noppes/npcs/client/gui/SubGuiMagic.java index c60f851a4..5609d013d 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiMagic.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiMagic.java @@ -93,6 +93,8 @@ public class SubGuiMagic extends SubGuiInterface implements ITextfieldListener, addLabel(new GuiNpcLabel(50, "magic.interaction", guiLeft + 170, guiTop + 30 + 160 + 5)); interactionField = new GuiNpcTextField(90, this, fontRendererObj, guiLeft + 245, guiTop + 30 + 160, 45, 20, ""); interactionField.setFloatsOnly(); + interactionField.setMinMaxDefaultFloat(-Float.MAX_VALUE, Float.MAX_VALUE, 0.0f); + addTextField(interactionField); if (selectedInteraction != null) { interactionField.setText(interactionValues.get(selectedInteraction) + ""); diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAdvanced.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAdvanced.java index 04cce9dc3..2d8466d1c 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAdvanced.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAdvanced.java @@ -119,6 +119,7 @@ public class GuiNpcAdvanced extends GuiNPCInterface2 implements IGuiData { @Override public void setGuiData(NBTTagCompound compound) { if (compound.hasKey("RoleData")) { + npc.advanced.setRole(compound.getInteger("RoleOrdinal")); if (npc.roleInterface != null) npc.roleInterface.readFromNBT(compound); 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 33566f932..6948ce89f 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java @@ -18,6 +18,7 @@ public class GuiScriptPlayers extends GuiScriptInterface { hookList.add(EnumScriptType.INIT.function); hookList.add(EnumScriptType.TICK.function); hookList.add(EnumScriptType.INTERACT.function); + hookList.add(EnumScriptType.RIGHT_CLICK.function); hookList.add(EnumScriptType.ATTACK.function); hookList.add(EnumScriptType.ATTACKED.function); hookList.add(EnumScriptType.DAMAGED_ENTITY.function); diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiDiagram.java b/src/main/java/noppes/npcs/client/gui/util/GuiDiagram.java index 926708989..83a8a7c01 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiDiagram.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiDiagram.java @@ -136,12 +136,20 @@ public abstract class GuiDiagram extends Gui { String nameFrom = iconFrom != null ? getIconName(iconFrom) : "Unknown"; String nameTo = iconTo != null ? getIconName(iconTo) : "Unknown"; tooltip.add(nameFrom + " > " + nameTo + ":"); - tooltip.add(conn.hoverText); + // Split Hover Text by newlines + if (conn.hoverText != null && !conn.hoverText.isEmpty()) { + String[] lines = conn.hoverText.split("\n"); + tooltip.addAll(Arrays.asList(lines)); + } if (allowTwoWay) { DiagramConnection reverse = getConnectionByIds(conn.idTo, conn.idFrom); if (reverse != null) { tooltip.add(nameTo + " > " + nameFrom + ":"); - tooltip.add(reverse.hoverText); + // Split Hover Text by newlines + if (reverse.hoverText != null && !reverse.hoverText.isEmpty()) { + String[] lines = reverse.hoverText.split("\n"); + tooltip.addAll(Arrays.asList(lines)); + } } } return tooltip; diff --git a/src/main/java/noppes/npcs/client/renderer/blocks/BlockCouchWoolRenderer.java b/src/main/java/noppes/npcs/client/renderer/blocks/BlockCouchWoolRenderer.java index bba634853..9933d47d7 100644 --- a/src/main/java/noppes/npcs/client/renderer/blocks/BlockCouchWoolRenderer.java +++ b/src/main/java/noppes/npcs/client/renderer/blocks/BlockCouchWoolRenderer.java @@ -100,7 +100,7 @@ public class BlockCouchWoolRenderer extends BlockRendererInterface { setCouchWood(var1.getBlockMetadata()); if (tile.hasCornerLeft) { GL11.glPushMatrix(); - GL11.glRotatef(90, 0, 1, 0); + GL11.glRotatef(270, 0, 1, 0); modelCouchCorner.CouchBack.render(0.0625F); GL11.glPopMatrix(); } else if (tile.hasCornerRight) @@ -119,8 +119,12 @@ public class BlockCouchWoolRenderer extends BlockRendererInterface { float[] color = ColorUtil.hexToRGB(tile.color); GL11.glColor3f(color[0], color[1], color[2]); - if (tile.hasCornerLeft) + if (tile.hasCornerLeft){ + GL11.glPushMatrix(); + GL11.glRotatef(270, 0, 1, 0); modelCouchCorner.Cussion.render(0.0625F); + GL11.glPopMatrix(); + } else if (tile.hasCornerRight) modelCouchCorner.Cussion.render(0.0625F); else if (tile.hasLeft && tile.hasRight) diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index 07ddbfde4..4eb764103 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -1,6 +1,7 @@ package noppes.npcs.controllers; import cpw.mods.fml.common.eventhandler.Event; +import jdk.nashorn.api.scripting.ScriptObjectMirror; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.NBTTags; import noppes.npcs.config.ConfigScript; @@ -8,10 +9,7 @@ import noppes.npcs.constants.EnumScriptType; import noppes.npcs.controllers.data.IScriptHandler; import noppes.npcs.scripted.NpcAPI; -import javax.script.Compilable; -import javax.script.CompiledScript; -import javax.script.Invocable; -import javax.script.ScriptEngine; +import javax.script.*; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Method; @@ -35,6 +33,7 @@ public class ScriptContainer { private static Method luaCoerce; private static Method luaCall; private CompiledScript compScript = null; + private final HashMap cachedFunctions = new HashMap<>(); public ScriptContainer(IScriptHandler handler) { this.handler = handler; @@ -173,6 +172,7 @@ public class ScriptContainer { try { if (!evaluated) { + this.cachedFunctions.clear(); engine.eval(getFullCode()); evaluated = true; } @@ -188,7 +188,15 @@ public class ScriptContainer { unknownFunctions.add(type); } } else { - ((Invocable) engine).invokeFunction(type, event); + if (!this.cachedFunctions.containsKey(type)) { + ScriptObjectMirror global = (ScriptObjectMirror) engine.getBindings(ScriptContext.ENGINE_SCOPE); + ScriptObjectMirror func = (ScriptObjectMirror) global.get(type); + this.cachedFunctions.put(type, func); + } + ScriptObjectMirror func = this.cachedFunctions.get(type); + if (func != null) { + func.call(null, event); + } } } catch (NoSuchMethodException e) { unknownFunctions.add(type); diff --git a/src/main/java/noppes/npcs/controllers/data/DataScript.java b/src/main/java/noppes/npcs/controllers/data/DataScript.java index f27b83990..514da2dac 100644 --- a/src/main/java/noppes/npcs/controllers/data/DataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/DataScript.java @@ -242,7 +242,7 @@ public class DataScript implements INpcScriptHandler { @Override public void callScript(String hookName, Event event) { try { - EnumScriptType enumScriptType = EnumScriptType.valueOf(hookName); + EnumScriptType enumScriptType = EnumScriptType.valueOfIgnoreCase(hookName); this.callScript(enumScriptType, event); } catch (IllegalArgumentException ignored) { } diff --git a/src/main/java/noppes/npcs/entity/data/ModelPartData.java b/src/main/java/noppes/npcs/entity/data/ModelPartData.java index 53a9a5b19..3aa06ef86 100644 --- a/src/main/java/noppes/npcs/entity/data/ModelPartData.java +++ b/src/main/java/noppes/npcs/entity/data/ModelPartData.java @@ -10,7 +10,7 @@ public class ModelPartData { public byte pattern = 0; public boolean playerTexture; - private ResourceLocation location; + public ResourceLocation location; public ModelPartData() { playerTexture = true; diff --git a/src/main/java/noppes/npcs/scripted/event/player/PlayerEvent.java b/src/main/java/noppes/npcs/scripted/event/player/PlayerEvent.java index 0fae26ab0..bf2225176 100644 --- a/src/main/java/noppes/npcs/scripted/event/player/PlayerEvent.java +++ b/src/main/java/noppes/npcs/scripted/event/player/PlayerEvent.java @@ -13,13 +13,16 @@ import noppes.npcs.api.IDamageSource; import noppes.npcs.api.entity.IEntity; import noppes.npcs.api.entity.IEntityLivingBase; import noppes.npcs.api.entity.IPlayer; +import noppes.npcs.api.event.IItemEvent; import noppes.npcs.api.event.IPlayerEvent; import noppes.npcs.api.handler.data.IPlayerEffect; import noppes.npcs.api.handler.data.IProfile; +import noppes.npcs.api.item.IItemCustomizable; import noppes.npcs.api.item.IItemStack; import noppes.npcs.constants.EnumScriptType; import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.event.CustomNPCsEvent; +import noppes.npcs.scripted.event.ItemEvent; public class PlayerEvent extends CustomNPCsEvent implements IPlayerEvent { public final IPlayer player; @@ -650,6 +653,38 @@ public class PlayerEvent extends CustomNPCsEvent implements IPlayerEvent { } } + @Cancelable + public static class RightClickEvent extends PlayerEvent implements IPlayerEvent.RightClickEvent { + + /** + * 0:air, 1:entity, 2:block + */ + public final int type; + public final Object target; + + public RightClickEvent(IPlayer player, int type, Object target) { + super(player); + this.type = type; + this.target = target; + } + + public String getHookName() { + return EnumScriptType.RIGHT_CLICK.function; + } + + public int getType() { + return type; + } + + public Object getTarget() { + return target; + } + + public IPlayer getPlayer() { + return player; + } + } + public static class UpdateEvent extends PlayerEvent implements IPlayerEvent.UpdateEvent { public UpdateEvent(IPlayer player) { super(player);