diff --git a/build.gradle b/build.gradle index 75c0a7202..49ae6b8b6 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'idea' } -version = "1.10-beta9" +version = "1.10-testingbeta1" group= "kamkeel.customnpc-plus" archivesBaseName = "CustomNPC-Plus" diff --git a/src/api b/src/api index 7d81fc13b..07bef8c46 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit 7d81fc13b50bb6b4fac9f91184ea44cadfdc47a9 +Subproject commit 07bef8c46c1b63d6d780021e966e384ee69ca1f6 diff --git a/src/main/java/kamkeel/npcs/controllers/ProfileController.java b/src/main/java/kamkeel/npcs/controllers/ProfileController.java index 1b0204bdc..c309c8195 100644 --- a/src/main/java/kamkeel/npcs/controllers/ProfileController.java +++ b/src/main/java/kamkeel/npcs/controllers/ProfileController.java @@ -4,10 +4,7 @@ import kamkeel.npcs.controllers.data.profile.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; -import noppes.npcs.CustomNpcs; -import noppes.npcs.CustomNpcsPermissions; -import noppes.npcs.LogWriter; -import noppes.npcs.NoppesUtilServer; +import noppes.npcs.*; import noppes.npcs.api.entity.IPlayer; import noppes.npcs.api.handler.IPlayerData; import noppes.npcs.api.handler.data.IProfile; @@ -15,8 +12,11 @@ import noppes.npcs.api.handler.IProfileHandler; import noppes.npcs.api.handler.data.ISlot; import noppes.npcs.config.ConfigMain; import noppes.npcs.controllers.QuestController; +import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.data.PlayerData; +import noppes.npcs.controllers.data.PlayerDataScript; import noppes.npcs.controllers.data.PlayerQuestData; +import noppes.npcs.scripted.NpcAPI; import noppes.npcs.util.CustomNPCsThreader; import noppes.npcs.util.NBTJsonUtil; @@ -48,6 +48,7 @@ public class ProfileController implements IProfileHandler { private static final String MSG_SLOT_ALREADY_ACTIVE = "Slot is already active."; private static final String MSG_REGION_NOT_ALLOWED = "Profile switching not allowed from your current location."; private static final String MSG_CHANGE_SUCCESS = "Slot changed successfully."; + private static final String MSG_CANCELLED = "Operation cancelled."; public static Map profileTypes = new HashMap<>(); public static Map activeProfiles = new HashMap<>(); @@ -362,7 +363,21 @@ public class ProfileController implements IProfileHandler { if (!profile.getSlots().containsKey(slotId)) { return ProfileOperation.error(MSG_SLOT_NOT_EXIST); } + + PlayerDataScript handler = ScriptController.Instance.playerScripts; + if(profile.player != null){ + IPlayer scriptPlayer = (IPlayer) NpcAPI.Instance().getIEntity(profile.player); + if(EventHooks.onProfileRemove(handler, scriptPlayer, profile, slotId, false)) + return ProfileOperation.error(MSG_CANCELLED); + } + profile.getSlots().remove(slotId); + + if(profile.player != null){ + IPlayer scriptPlayer = (IPlayer) NpcAPI.Instance().getIEntity(profile.player); + EventHooks.onProfileRemove(handler, scriptPlayer, profile, slotId, true); + } + return ProfileOperation.success(MSG_REMOVE_SUCCESS); } @@ -386,12 +401,23 @@ public class ProfileController implements IProfileHandler { } } } + + PlayerDataScript handler = ScriptController.Instance.playerScripts; + if(profile.player != null){ + IPlayer scriptPlayer = (IPlayer) NpcAPI.Instance().getIEntity(profile.player); + if(EventHooks.onProfileCreate(handler, scriptPlayer, profile, newSlotId, false)) + return ProfileOperation.error(MSG_CANCELLED); + } + Slot newSlot = new Slot(newSlotId, "Slot " + newSlotId); newSlot.setLastLoaded(System.currentTimeMillis()); profile.getSlots().put(newSlotId, newSlot); if(profile.player != null){ verifySlotQuests(profile.player); save(profile.player, profile); + + IPlayer scriptPlayer = (IPlayer) NpcAPI.Instance().getIEntity(profile.player); + EventHooks.onProfileCreate(handler, scriptPlayer, profile, newSlotId, true); } return ProfileOperation.success(MSG_NEW_SLOT_CREATED); } @@ -437,6 +463,7 @@ public class ProfileController implements IProfileHandler { return ProfileOperation.error(MSG_REGION_NOT_ALLOWED); } } + List dataList = new ArrayList<>(profileTypes.values()); dataList.sort(Comparator.comparingInt(IProfileData::getSwitchPriority)); for (IProfileData pd : dataList) { @@ -444,9 +471,20 @@ public class ProfileController implements IProfileHandler { return pd.verifySwitch(profile.player); } } + + int prevSlot = profile.getCurrentSlotId(); + + PlayerDataScript handler = ScriptController.Instance.playerScripts; + IPlayer scriptPlayer = (IPlayer) NpcAPI.Instance().getIEntity(profile.player); + if(EventHooks.onProfileChange(handler, scriptPlayer, profile, newSlotId, prevSlot, false)) + return ProfileOperation.error(MSG_CANCELLED); + + saveSlotData(profile.player); profile.currentSlotId = newSlotId; loadSlotData(profile.player); + + EventHooks.onProfileChange(handler, scriptPlayer, profile, newSlotId, prevSlot, true); } else { return ProfileOperation.error(MSG_PLAYER_NOT_FOUND); } diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java index bbf68fa9c..fa145f87f 100644 --- a/src/main/java/noppes/npcs/EventHooks.java +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -389,6 +389,24 @@ public class EventHooks { 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); + return NpcAPI.EVENT_BUS.post(event); + } + + public static boolean onProfileRemove(PlayerDataScript handler, IPlayer player, IProfile profile, int slot, boolean post) { + PlayerEvent.ProfileEvent.Removed event = new PlayerEvent.ProfileEvent.Removed(player, profile, slot, post); + handler.callScript(EnumScriptType.PROFILE_REMOVE, event); + return NpcAPI.EVENT_BUS.post(event); + } + + public static boolean onProfileCreate(PlayerDataScript handler, IPlayer player, IProfile profile, int slot, boolean post) { + PlayerEvent.ProfileEvent.Create event = new PlayerEvent.ProfileEvent.Create(player, profile, slot, post); + handler.callScript(EnumScriptType.PROFILE_CREATE, event); + return NpcAPI.EVENT_BUS.post(event); + } + public static boolean onStartUsingItem(PlayerDataScript handler, IPlayer player, int duration, ItemStack item){ PlayerEvent.StartUsingItem event = new PlayerEvent.StartUsingItem(player, item, duration); handler.callScript(EnumScriptType.START_USING_ITEM, event); @@ -919,22 +937,4 @@ public class EventHooks { } postAnimationEvent(new AnimationEvent.FrameEvent.Exited(animation, frame)); } - - public static boolean onProfileChange(PlayerDataScript handler, IPlayer player, IProfile profile, int slot) { - PlayerEvent.ProfileEvent.Changed event = new PlayerEvent.ProfileEvent.Changed(player, profile, slot, profile.getCurrentSlotId()); - handler.callScript(EnumScriptType.PROFILE_CHANGE, event); - return NpcAPI.EVENT_BUS.post(event); - } - - public static boolean onProfileRemove(PlayerDataScript handler, IPlayer player, IProfile profile, int slot) { - PlayerEvent.ProfileEvent.Removed event = new PlayerEvent.ProfileEvent.Removed(player, profile, slot); - handler.callScript(EnumScriptType.PROFILE_REMOVE, event); - return NpcAPI.EVENT_BUS.post(event); - } - - public static boolean onProfileCreate(PlayerDataScript handler, IPlayer player, IProfile profile, int slot) { - PlayerEvent.ProfileEvent.Create event = new PlayerEvent.ProfileEvent.Create(player, profile, slot); - handler.callScript(EnumScriptType.PROFILE_CREATE, event); - return NpcAPI.EVENT_BUS.post(event); - } } 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 153dea0c7..ab9910159 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java @@ -4,6 +4,7 @@ import kamkeel.npcs.network.packets.request.script.PlayerScriptPacket; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.NBTTags; +import noppes.npcs.constants.EnumScriptType; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.data.PlayerDataScript; @@ -13,69 +14,72 @@ public class GuiScriptPlayers extends GuiScriptInterface { private PlayerDataScript script = new PlayerDataScript((EntityPlayer)null); public GuiScriptPlayers() { - hookList.add("init"); - hookList.add("tick"); - hookList.add("interact"); - hookList.add("attack"); - hookList.add("attacked"); - hookList.add("damagedEntity"); - hookList.add("damaged"); - hookList.add("kills"); - hookList.add("killed"); - hookList.add("drop"); - hookList.add("respawn"); - hookList.add("breakBlock"); - hookList.add("chat"); - hookList.add("login"); - hookList.add("logout"); - hookList.add("keyPressed"); - hookList.add("mouseClicked"); - hookList.add("toss"); - hookList.add("pickUp"); - hookList.add("pickupXP"); - hookList.add("rangedCharge"); - hookList.add("rangedLaunched"); - hookList.add("timer"); - hookList.add("startItem"); - hookList.add("usingItem"); - hookList.add("stopItem"); - hookList.add("finishItem"); - hookList.add("containerOpen"); - hookList.add("useHoe"); - hookList.add("bonemeal"); - hookList.add("fillBucket"); - hookList.add("jump"); - hookList.add("fall"); - hookList.add("wakeUp"); - hookList.add("sleep"); - hookList.add("playSound"); - hookList.add("lightning"); - hookList.add("changedDim"); - hookList.add("questStart"); - hookList.add("questCompleted"); - hookList.add("questTurnIn"); - hookList.add("factionPoints"); - hookList.add("dialogOpen"); - hookList.add("dialogOption"); - hookList.add("dialogClose"); - hookList.add("scriptCommand"); - hookList.add("customGuiClosed"); - hookList.add("customGuiButton"); - hookList.add("customGuiSlot"); - hookList.add("customGuiSlotClicked"); - hookList.add("customGuiScroll"); - hookList.add("customGuiTextfield"); - hookList.add("partyQuestCompleted"); - hookList.add("partyQuestSet"); - hookList.add("partyQuestTurnedIn"); - hookList.add("partyInvite"); - hookList.add("partyKick"); - hookList.add("partyLeave"); - hookList.add("partyDisband"); - hookList.add("animationStart"); - hookList.add("animationEnd"); - hookList.add("frameEnter"); - hookList.add("frameExit"); + hookList.add(EnumScriptType.INIT.function); + hookList.add(EnumScriptType.TICK.function); + hookList.add(EnumScriptType.INTERACT.function); + hookList.add(EnumScriptType.ATTACK.function); + hookList.add(EnumScriptType.ATTACKED.function); + hookList.add(EnumScriptType.DAMAGED_ENTITY.function); + hookList.add(EnumScriptType.DAMAGED.function); + hookList.add(EnumScriptType.KILLS.function); + hookList.add(EnumScriptType.KILLED.function); + hookList.add(EnumScriptType.DROP.function); + hookList.add(EnumScriptType.RESPAWN.function); + hookList.add(EnumScriptType.BREAK_BLOCK.function); + hookList.add(EnumScriptType.CHAT.function); + hookList.add(EnumScriptType.LOGIN.function); + hookList.add(EnumScriptType.LOGOUT.function); + hookList.add(EnumScriptType.KEY_PRESSED.function); + hookList.add(EnumScriptType.MOUSE_CLICKED.function); + hookList.add(EnumScriptType.TOSS.function); + hookList.add(EnumScriptType.PICKUP.function); + hookList.add(EnumScriptType.PICKUP_XP.function); + hookList.add(EnumScriptType.RANGED_CHARGE.function); + hookList.add(EnumScriptType.RANGED_LAUNCHED.function); + hookList.add(EnumScriptType.TIMER.function); + hookList.add(EnumScriptType.START_USING_ITEM.function); + hookList.add(EnumScriptType.USING_ITEM.function); + hookList.add(EnumScriptType.STOP_USING_ITEM.function); + hookList.add(EnumScriptType.FINISH_USING_ITEM.function); + hookList.add(EnumScriptType.CONTAINER_OPEN.function); + hookList.add(EnumScriptType.USE_HOE.function); + hookList.add(EnumScriptType.BONEMEAL.function); + hookList.add(EnumScriptType.FILL_BUCKET.function); + hookList.add(EnumScriptType.JUMP.function); + hookList.add(EnumScriptType.FALL.function); + hookList.add(EnumScriptType.WAKE_UP.function); + hookList.add(EnumScriptType.SLEEP.function); + hookList.add(EnumScriptType.PLAYSOUND.function); + hookList.add(EnumScriptType.LIGHTNING.function); + hookList.add(EnumScriptType.CHANGED_DIM.function); + hookList.add(EnumScriptType.QUEST_START.function); + hookList.add(EnumScriptType.QUEST_COMPLETED.function); + hookList.add(EnumScriptType.QUEST_TURNIN.function); + hookList.add(EnumScriptType.FACTION_POINTS.function); + hookList.add(EnumScriptType.DIALOG_OPEN.function); + hookList.add(EnumScriptType.DIALOG_OPTION.function); + hookList.add(EnumScriptType.DIALOG_CLOSE.function); + hookList.add(EnumScriptType.SCRIPT_COMMAND.function); + hookList.add(EnumScriptType.CUSTOM_GUI_CLOSED.function); + hookList.add(EnumScriptType.CUSTOM_GUI_BUTTON.function); + hookList.add(EnumScriptType.CUSTOM_GUI_SLOT.function); + hookList.add(EnumScriptType.CUSTOM_GUI_SLOT_CLICKED.function); + hookList.add(EnumScriptType.CUSTOM_GUI_SCROLL.function); + hookList.add(EnumScriptType.CUSTOM_GUI_TEXTFIELD.function); + hookList.add(EnumScriptType.PARTY_QUEST_COMPLETED.function); + hookList.add(EnumScriptType.PARTY_QUEST_SET.function); + hookList.add(EnumScriptType.PARTY_QUEST_TURNED_IN.function); + hookList.add(EnumScriptType.PARTY_INVITE.function); + hookList.add(EnumScriptType.PARTY_KICK.function); + hookList.add(EnumScriptType.PARTY_LEAVE.function); + hookList.add(EnumScriptType.PARTY_DISBAND.function); + hookList.add(EnumScriptType.ANIMATION_START.function); + hookList.add(EnumScriptType.ANIMATION_END.function); + hookList.add(EnumScriptType.ANIMATION_FRAME_ENTER.function); + hookList.add(EnumScriptType.ANIMATION_FRAME_EXIT.function); + hookList.add(EnumScriptType.PROFILE_CHANGE.function); + hookList.add(EnumScriptType.PROFILE_REMOVE.function); + hookList.add(EnumScriptType.PROFILE_CREATE.function); this.handler = this.script; PlayerScriptPacket.Get(); diff --git a/src/main/java/noppes/npcs/scripted/event/PlayerEvent.java b/src/main/java/noppes/npcs/scripted/event/PlayerEvent.java index 8ed22fe95..24cc9a7e9 100644 --- a/src/main/java/noppes/npcs/scripted/event/PlayerEvent.java +++ b/src/main/java/noppes/npcs/scripted/event/PlayerEvent.java @@ -1011,11 +1011,13 @@ public class PlayerEvent extends CustomNPCsEvent implements IPlayerEvent { public static class ProfileEvent extends PlayerEvent implements IPlayerEvent.ProfileEvent { public final IProfile profile; public final int slot; + public final boolean post; - public ProfileEvent(IPlayer player, IProfile profile, int slot) { + public ProfileEvent(IPlayer player, IProfile profile, int slot, boolean post) { super(player); this.profile = profile; this.slot = slot; + this.post = post; } public String getHookName() { @@ -1032,12 +1034,17 @@ public class PlayerEvent extends CustomNPCsEvent implements IPlayerEvent { return this.slot; } + @Override + public boolean isPost() { + return this.post; + } + @Cancelable public static class Changed extends PlayerEvent.ProfileEvent implements IPlayerEvent.ProfileEvent.Changed { public final int prevSlot; - public Changed(IPlayer player, IProfile profile, int slot, int prevSlot) { - super(player, profile, slot); + public Changed(IPlayer player, IProfile profile, int slot, int prevSlot, boolean post) { + super(player, profile, slot, post); this.prevSlot = prevSlot; } @@ -1054,8 +1061,8 @@ public class PlayerEvent extends CustomNPCsEvent implements IPlayerEvent { @Cancelable public static class Removed extends PlayerEvent.ProfileEvent implements IPlayerEvent.ProfileEvent.Removed { - public Removed(IPlayer player, IProfile profile, int slot) { - super(player, profile, slot); + public Removed(IPlayer player, IProfile profile, int slot, boolean post) { + super(player, profile, slot, post); } public String getHookName() { @@ -1066,8 +1073,8 @@ public class PlayerEvent extends CustomNPCsEvent implements IPlayerEvent { @Cancelable public static class Create extends PlayerEvent.ProfileEvent implements IPlayerEvent.ProfileEvent.Create { - public Create(IPlayer player, IProfile profile, int slot) { - super(player, profile, slot); + public Create(IPlayer player, IProfile profile, int slot, boolean post) { + super(player, profile, slot, post); } public String getHookName() {