diff --git a/CustomNPC-Plus-1.21.iml b/CustomNPC-Plus-1.21.iml new file mode 100644 index 000000000..371deae12 --- /dev/null +++ b/CustomNPC-Plus-1.21.iml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5695c93b2..4698f6eab 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,9 @@ minecraft { runDir = "eclipse" } +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + dependencies { // you may put jars on which you depend on in ./libs // or you may define them like so.. diff --git a/src/main/java/net/minecraft/util/math/BlockPos.java b/src/main/java/net/minecraft/util/math/BlockPos.java index 87db5faf0..b9aa29c1b 100644 --- a/src/main/java/net/minecraft/util/math/BlockPos.java +++ b/src/main/java/net/minecraft/util/math/BlockPos.java @@ -4,7 +4,6 @@ import com.google.common.collect.AbstractIterator; import java.util.Iterator; import net.minecraft.entity.Entity; import net.minecraft.util.EnumFacing; -import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.util.Vec3i; @@ -13,7 +12,7 @@ import net.minecraft.util.Vec3i; public class BlockPos extends Vec3i{ /** The BlockPos with all coordinates 0 */ public static final BlockPos ORIGIN = new BlockPos(0, 0, 0); - private static final int NUM_X_BITS = 1 + MathHelper.calculateLogBaseTwo(MathHelper.roundUpToPowerOfTwo(30000000)); + private static final int NUM_X_BITS = 1 + 25;//MathHelper.calculateLogBaseTwo(MathHelper.roundUpToPowerOfTwo(30000000)); private static final int NUM_Z_BITS = NUM_X_BITS; private static final int NUM_Y_BITS = 64 - NUM_X_BITS - NUM_Z_BITS; private static final int Y_SHIFT = 0 + NUM_Z_BITS; diff --git a/src/main/java/noppes/npcs/CommonProxy.java b/src/main/java/noppes/npcs/CommonProxy.java index 836d85f6e..b5075fec4 100644 --- a/src/main/java/noppes/npcs/CommonProxy.java +++ b/src/main/java/noppes/npcs/CommonProxy.java @@ -5,7 +5,9 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.Item; +import net.minecraft.stats.Achievement; import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; import noppes.npcs.blocks.tiles.TileNpcContainer; import noppes.npcs.constants.EnumGuiType; import noppes.npcs.containers.ContainerCarpentryBench; @@ -28,8 +30,11 @@ import noppes.npcs.containers.ContainerNPCTraderSetup; import noppes.npcs.containers.ContainerNpcItemGiver; import noppes.npcs.containers.ContainerNpcQuestReward; import noppes.npcs.containers.ContainerNpcQuestTypeItem; +import noppes.npcs.controllers.PlayerData; +import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; import cpw.mods.fml.common.network.IGuiHandler; +import noppes.npcs.scripted.interfaces.IWorld; public class CommonProxy implements IGuiHandler { @@ -41,6 +46,10 @@ public class CommonProxy implements IGuiHandler { CustomNpcs.ChannelPlayer.register(new PacketHandlerPlayer()); } + public PlayerData getPlayerData(EntityPlayer player) { + return null; + } + @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if(ID > EnumGuiType.values().length) @@ -55,31 +64,31 @@ public class CommonProxy implements IGuiHandler { if(gui == EnumGuiType.PlayerBankSmall) return new ContainerNPCBankSmall(player, x , y); - + if(gui == EnumGuiType.PlayerBankUnlock) return new ContainerNPCBankUnlock(player, x , y); if(gui == EnumGuiType.PlayerBankUprade) return new ContainerNPCBankUpgrade(player, x , y); - + if(gui == EnumGuiType.PlayerBankLarge) return new ContainerNPCBankLarge(player, x , y); if(gui == EnumGuiType.PlayerFollowerHire) return new ContainerNPCFollowerHire(npc, player); - + if(gui == EnumGuiType.PlayerFollower) return new ContainerNPCFollower(npc, player); - + if(gui == EnumGuiType.PlayerTrader) return new ContainerNPCTrader(npc, player); if(gui == EnumGuiType.PlayerAnvil) return new ContainerCarpentryBench(player.inventory, player.worldObj, x, y, z); - + if(gui == EnumGuiType.SetupItemGiver) return new ContainerNpcItemGiver(npc, player); - + if(gui == EnumGuiType.SetupTrader) return new ContainerNPCTraderSetup(npc, player); @@ -88,10 +97,10 @@ public class CommonProxy implements IGuiHandler { if(gui == EnumGuiType.QuestReward) return new ContainerNpcQuestReward(player); - + if(gui == EnumGuiType.QuestItem) return new ContainerNpcQuestTypeItem(player); - + if(gui == EnumGuiType.ManageRecipes) return new ContainerManageRecipes(player,x); @@ -103,13 +112,13 @@ public class CommonProxy implements IGuiHandler { if(gui == EnumGuiType.Crate) return new ContainerCrate(player.inventory, (TileNpcContainer)player.worldObj.getTileEntity(x, y, z)); - + if(gui == EnumGuiType.PlayerMailman) return new ContainerMail(player, x == 1, y == 1); - + if(gui == EnumGuiType.CompanionInv) return new ContainerNPCCompanion(npc, player); - + return null; } @@ -129,19 +138,21 @@ public class CommonProxy implements IGuiHandler { public void openGui(int i, int j, int k, EnumGuiType gui, EntityPlayer player) { - + } public void openGui(EntityPlayer player, Object guiscreen) { // TODO Auto-generated method stub - + } public void spawnParticle(EntityLivingBase player, String string, Object... ob) { // TODO Auto-generated method stub - + } + public FakePlayer getCommandPlayer(IWorld world) { return null; } + public boolean hasClient() { return false; } @@ -152,7 +163,7 @@ public class CommonProxy implements IGuiHandler { public void registerItem(Item item) { // TODO Auto-generated method stub - + } public ModelBiped getSkirtModel() { @@ -160,8 +171,15 @@ public class CommonProxy implements IGuiHandler { } public void spawnParticle(String particle, double x, double y, double z, - double motionX, double motionY, double motionZ, float scale) { - + double motionX, double motionY, double motionZ, float scale) { + } -} + public String getAchievementDesc(Achievement achievement) { + return ""; + } + + public boolean isGUIOpen(){ + return false; + } +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/CustomNpcs.java b/src/main/java/noppes/npcs/CustomNpcs.java index 742c15966..c4ceaa46d 100644 --- a/src/main/java/noppes/npcs/CustomNpcs.java +++ b/src/main/java/noppes/npcs/CustomNpcs.java @@ -59,6 +59,7 @@ import noppes.npcs.entity.old.EntityNpcMonsterMale; import noppes.npcs.entity.old.EntityNpcNagaFemale; import noppes.npcs.entity.old.EntityNpcNagaMale; import noppes.npcs.entity.old.EntityNpcSkeleton; +import noppes.npcs.scripted.wrapper.WrapperNpcAPI; @Mod(modid = "customnpcs", name = "CustomNpcs", version = "1.2.1") public class CustomNpcs { @@ -175,6 +176,9 @@ public class CustomNpcs { MinecraftForge.EVENT_BUS.register(new ServerEventsHandler()); 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"); @@ -244,7 +248,10 @@ public class CustomNpcs { new SpawnController(); new LinkedNpcController(); ScriptController.Instance.loadStoredData(); + ScriptController.Instance.loadForgeScripts(); + ScriptController.Instance.loadPlayerScripts(); ScriptController.HasStart = false; + WrapperNpcAPI.clearCache(); Set names = Block.blockRegistry.getKeys(); for(String name : names){ @@ -308,4 +315,33 @@ public class CustomNpcs { return null; } + public static File getWorldSaveDirectory(String s) { + try { + File dir = new File("."); + if (getServer() != null) { + if (!getServer().isDedicatedServer()) { + dir = new File(Minecraft.getMinecraft().mcDataDir, "saves"); + } + + dir = new File(new File(dir, getServer().getFolderName()), "customnpcs"); + } + + if (s != null) { + dir = new File(dir, s); + } + + if (!dir.exists()) { + dir.mkdirs(); + } + + return dir; + } catch (Exception var2) { + LogWriter.error("Error getting worldsave", var2); + return null; + } + } + + public static MinecraftServer getServer(){ + return MinecraftServer.getServer(); + } } diff --git a/src/main/java/noppes/npcs/DataDisplay.java b/src/main/java/noppes/npcs/DataDisplay.java index 0bac810dd..942afc39c 100644 --- a/src/main/java/noppes/npcs/DataDisplay.java +++ b/src/main/java/noppes/npcs/DataDisplay.java @@ -1,8 +1,15 @@ package noppes.npcs; +import java.util.ArrayList; +import java.util.List; import java.util.Random; +import java.util.UUID; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; import net.minecraft.nbt.NBTUtil; import net.minecraft.server.MinecraftServer; import net.minecraft.util.StringUtils; @@ -43,6 +50,8 @@ public class DataDisplay { public byte showBossBar = 0; + public ArrayList invisibleToList = new ArrayList<>(); + public DataDisplay(EntityNPCInterface npc){ this.npc = npc; @@ -112,6 +121,13 @@ public class DataDisplay { nbttagcompound.setBoolean("NoLivingAnimation", disableLivingAnimation); nbttagcompound.setByte("BossBar", showBossBar); + NBTTagList list = new NBTTagList(); + for(UUID uuid : invisibleToList){ + list.appendTag(new NBTTagString(uuid.toString())); + } + + nbttagcompound.setTag("InvisibleToList", list); + return nbttagcompound; } public void readToNBT(NBTTagCompound nbttagcompound) { @@ -152,6 +168,13 @@ public class DataDisplay { disableLivingAnimation = nbttagcompound.getBoolean("NoLivingAnimation"); showBossBar = nbttagcompound.getByte("BossBar"); + invisibleToList.clear(); + NBTTagList tagList = (NBTTagList)nbttagcompound.getTag("InvisibleToList"); + for(int i = 0; i < tagList.tagCount(); i++){ + String nbtTagString = tagList.getStringTagAt(i); + invisibleToList.add(UUID.fromString(nbtTagString)); + } + if(prevSkinType != skinType || !texture.equals(prevTexture)) npc.textureLocation = null; npc.textureGlowLocation = null; diff --git a/src/main/java/noppes/npcs/DataScript.java b/src/main/java/noppes/npcs/DataScript.java index d36b0be7c..9494e0811 100644 --- a/src/main/java/noppes/npcs/DataScript.java +++ b/src/main/java/noppes/npcs/DataScript.java @@ -15,12 +15,14 @@ import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.ScriptController; import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; -import noppes.npcs.scripted.ScriptEvent; -import noppes.npcs.scripted.ScriptNpc; +import noppes.npcs.scripted.event.ScriptEvent; +import noppes.npcs.scripted.entity.ScriptNpc; import noppes.npcs.scripted.ScriptWorld; import noppes.npcs.scripted.constants.EntityType; import noppes.npcs.scripted.constants.JobType; 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(); @@ -33,7 +35,7 @@ public class DataScript { public boolean enabled = false; public ScriptNpc dummyNpc; - public ScriptWorld dummyWorld; + public IWorld dummyWorld; public boolean clientNeedsUpdate = false; public boolean aiNeedsUpdate = false; public boolean hasInited = false; @@ -113,11 +115,7 @@ public class DataScript { return callScript(script); } - - public boolean isEnabled(){ - return enabled && ScriptController.HasStart && !npc.worldObj.isRemote && !scripts.isEmpty(); - } - + private boolean callScript(ScriptContainer script){ ScriptEngine engine = script.engine; engine.put("npc", dummyNpc); @@ -125,11 +123,12 @@ public class DataScript { ScriptEvent result = (ScriptEvent) engine.get("event"); if(result == null) engine.put("event", result = new ScriptEvent()); + engine.put("API", new WrapperNpcAPI()); engine.put("EntityType", entities); engine.put("RoleType", roles); engine.put("JobType", jobs); script.run(engine); - + if(clientNeedsUpdate){ npc.updateClient = true; clientNeedsUpdate = false; @@ -140,6 +139,10 @@ public class DataScript { } return result.isCancelled(); } + + public boolean isEnabled(){ + return enabled && ScriptController.HasStart && !npc.worldObj.isRemote && !scripts.isEmpty(); + } public void setWorld(World world) { if(world instanceof WorldServer) diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java new file mode 100644 index 000000000..7833cb110 --- /dev/null +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -0,0 +1,313 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs; + +import cpw.mods.fml.common.eventhandler.Event; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.EntityXPOrb; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.event.entity.EntityEvent; +import net.minecraftforge.event.world.WorldEvent; +import noppes.npcs.controllers.ScriptController; +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.event.*; +import noppes.npcs.scripted.event.PlayerEvent.ChatEvent; +import noppes.npcs.scripted.event.PlayerEvent.ContainerOpen; +import noppes.npcs.scripted.event.PlayerEvent.DamagedEntityEvent; +import noppes.npcs.scripted.event.PlayerEvent.KeyPressedEvent; +import noppes.npcs.scripted.event.PlayerEvent.LoginEvent; +import noppes.npcs.scripted.event.PlayerEvent.LogoutEvent; +import noppes.npcs.scripted.event.PlayerEvent.PickUpEvent; +import noppes.npcs.scripted.event.PlayerEvent.DropEvent; +import noppes.npcs.scripted.interfaces.IEntity; +import noppes.npcs.scripted.interfaces.IItemStack; +import noppes.npcs.scripted.interfaces.IWorld; +import noppes.npcs.scripted.wrapper.WrapperNpcAPI; +import noppes.npcs.constants.EnumScriptType; +import noppes.npcs.controllers.PlayerData; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; + +public class EventHooks { + public EventHooks() { + } + + public static void onNPCTimer(EntityNPCInterface npc, int id) { + NpcEvent.TimerEvent event = new NpcEvent.TimerEvent(npc.wrappedNPC, id); + ScriptEventTimer scriptEvent = new ScriptEventTimer(id); + npc.script.callScript(EnumScriptType.TIMER, "event", scriptEvent); + 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()); + 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, "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,"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,"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,"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,"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,"event", event); + WrapperNpcAPI.EVENT_BUS.post(event); + } + + public static boolean onPlayerDropItems(PlayerDataScript handler, 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); + 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,"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,"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,"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,"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,"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,"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,"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,"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,"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,"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, "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,"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,"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,"event", 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); + 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); + 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); + 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); + 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); + WrapperNpcAPI.EVENT_BUS.post(event); + } + + public static void onPlayerLogout(PlayerDataScript handler) { + LogoutEvent event = new LogoutEvent(handler.getPlayer()); + 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,"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,"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,"event", event); + return WrapperNpcAPI.EVENT_BUS.post(event); + } + + public static boolean onPlayerDamagedEntity(PlayerDataScript handler, DamagedEntityEvent 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,"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,"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,"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,"event", event); + WrapperNpcAPI.EVENT_BUS.post(event); + } + + public static boolean onPlayerBreak(PlayerDataScript handler, PlayerEvent.BreakEvent event) { + handler.callScript(EnumScriptType.BREAK_BLOCK, event,"event", event); + return WrapperNpcAPI.EVENT_BUS.post(event); + } + + public static void onForgeEntityEvent(EntityEvent event) { + IEntity e = NpcAPI.Instance().getIEntity(event.entity); + onForgeEvent(new noppes.npcs.scripted.event.ForgeEvent.EntityEvent(event, e), event); + } + + public static void onForgeWorldEvent(WorldEvent event) { + if(ScriptController.Instance.forgeScripts.isEnabled()) { + IWorld e = NpcAPI.Instance().getIWorld((WorldServer)event.world); + onForgeEvent(new noppes.npcs.scripted.event.ForgeEvent.WorldEvent(event, e), event); + } + } + + public static void onForgeInit(ForgeDataScript handler) { + noppes.npcs.scripted.event.ForgeEvent.InitEvent event = new noppes.npcs.scripted.event.ForgeEvent.InitEvent(); + handler.callScript("init", event); + WrapperNpcAPI.EVENT_BUS.post(event); + } + + public static void onForgeEvent(ForgeEvent ev, Event event) { + ForgeDataScript handler = ScriptController.Instance.forgeScripts; + if(handler.isEnabled()) { + String eventName = event.getClass().getName(); + int i = eventName.lastIndexOf("."); + eventName = StringUtils.uncapitalize(eventName.substring(i + 1).replace("$", "")); + if(event.isCancelable()) { + ev.setCanceled(event.isCanceled()); + } + + handler.callScript(eventName, event); + WrapperNpcAPI.EVENT_BUS.post(ev); + if(event.isCancelable()) { + event.setCanceled(ev.isCanceled()); + } + + } + } +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/EventScriptContainer.java b/src/main/java/noppes/npcs/EventScriptContainer.java new file mode 100644 index 000000000..a66d930b3 --- /dev/null +++ b/src/main/java/noppes/npcs/EventScriptContainer.java @@ -0,0 +1,172 @@ +// +// 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/ModelPartData.java b/src/main/java/noppes/npcs/ModelPartData.java index 5e41cf672..963bd3d30 100644 --- a/src/main/java/noppes/npcs/ModelPartData.java +++ b/src/main/java/noppes/npcs/ModelPartData.java @@ -8,9 +8,9 @@ public class ModelPartData { public String texture; public byte type = 0; public boolean playerTexture; - + private ResourceLocation location; - + public ModelPartData(){ playerTexture = true; } @@ -29,7 +29,7 @@ public class ModelPartData { compound.setBoolean("PlayerTexture", playerTexture); return compound; } - + public void readFromNBT(NBTTagCompound compound){ type = compound.getByte("Type"); color = compound.getInteger("Color"); @@ -37,13 +37,13 @@ public class ModelPartData { playerTexture = compound.getBoolean("PlayerTexture"); location = null; } - + public ResourceLocation getResource(){ if(texture.isEmpty()) return null; if(location != null) return location; - location = new ResourceLocation(texture); + location = new ResourceLocation(texture); return location; } @@ -59,7 +59,7 @@ public class ModelPartData { playerTexture = false; } } - + public String toString(){ return "Color: " + color + " Type: " + type; } @@ -67,9 +67,9 @@ public class ModelPartData { public String getColor() { String str = Integer.toHexString(color); - while(str.length() < 6) - str = "0" + str; - - return str; + while(str.length() < 6) + str = "0" + str; + + return str; } -} +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/NBTTags.java b/src/main/java/noppes/npcs/NBTTags.java index 87fc9826a..23cc9b8e4 100644 --- a/src/main/java/noppes/npcs/NBTTags.java +++ b/src/main/java/noppes/npcs/NBTTags.java @@ -1,18 +1,13 @@ package noppes.npcs; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.Vector; +import java.util.*; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagDouble; -import net.minecraft.nbt.NBTTagInt; import net.minecraft.nbt.NBTTagList; +import noppes.npcs.controllers.IScriptHandler; public class NBTTags { @@ -383,4 +378,60 @@ public class NBTTags { return compound; } + public static TreeMap GetLongStringMap(NBTTagList tagList) { + TreeMap list = new TreeMap(); + + for(int i = 0; i < tagList.tagCount(); ++i) { + NBTTagCompound nbttagcompound = tagList.getCompoundTagAt(i); + list.put(Long.valueOf(nbttagcompound.getLong("Long")), nbttagcompound.getString("String")); + } + + return list; + } + + public static NBTTagList NBTLongStringMap(Map map) { + NBTTagList nbttaglist = new NBTTagList(); + if(map == null) { + return nbttaglist; + } else { + Iterator var2 = map.keySet().iterator(); + + while(var2.hasNext()) { + long slot = ((Long)var2.next()).longValue(); + NBTTagCompound nbttagcompound = new NBTTagCompound(); + nbttagcompound.setLong("Long", slot); + nbttagcompound.setString("String", (String) map.get(Long.valueOf(slot))); + nbttaglist.appendTag(nbttagcompound); + } + + return nbttaglist; + } + } + + 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); + script.readFromNBT(compoundd); + scripts.add(script); + } + + return scripts; + } + + public static NBTTagList NBTScript(List scripts) { + NBTTagList list = new NBTTagList(); + Iterator var2 = scripts.iterator(); + + while(var2.hasNext()) { + EventScriptContainer script = (EventScriptContainer)var2.next(); + NBTTagCompound compound = new NBTTagCompound(); + script.writeToNBT(compound); + list.appendTag(compound); + } + + return list; + } } diff --git a/src/main/java/noppes/npcs/NoppesUtilPlayer.java b/src/main/java/noppes/npcs/NoppesUtilPlayer.java index 984bd717e..30e07e2e4 100644 --- a/src/main/java/noppes/npcs/NoppesUtilPlayer.java +++ b/src/main/java/noppes/npcs/NoppesUtilPlayer.java @@ -110,6 +110,28 @@ public class NoppesUtilPlayer { } player.worldObj.updateEntityWithOptionalForce(player, false); } + + public static void teleportPlayer(EntityPlayerMP player, double posX, double posY, double posZ, float yaw, float pitch, int dimension){ + if(player.dimension != dimension){ + int dim = player.dimension; + MinecraftServer server = MinecraftServer.getServer(); + WorldServer wor = server.worldServerForDimension(dimension); + if(wor == null){ + player.addChatMessage(new ChatComponentText("Broken transporter. Dimenion does not exist")); + return; + } + player.setLocationAndAngles(posX, posY, posZ, yaw, pitch); + server.getConfigurationManager().transferPlayerToDimension(player, dimension, new CustomTeleporter(wor)); + player.playerNetServerHandler.setPlayerLocation(posX, posY, posZ, yaw, pitch); + + if(!wor.playerEntities.contains(player)) + wor.spawnEntityInWorld(player); + } + else{ + player.playerNetServerHandler.setPlayerLocation(posX, posY, posZ, yaw, pitch); + } + player.worldObj.updateEntityWithOptionalForce(player, false); + } private static void followerBuy(RoleFollower role,IInventory currencyInv,EntityPlayerMP player, EntityNPCInterface npc){ ItemStack currency = currencyInv.getStackInSlot(0); @@ -375,5 +397,7 @@ public class NoppesUtilPlayer { } } } - + public static void isGUIOpen(EntityPlayerMP player){ + Server.sendData(player, EnumPacketClient.ISGUIOPEN); + } } diff --git a/src/main/java/noppes/npcs/NoppesUtilServer.java b/src/main/java/noppes/npcs/NoppesUtilServer.java index 237f62357..13b82c061 100644 --- a/src/main/java/noppes/npcs/NoppesUtilServer.java +++ b/src/main/java/noppes/npcs/NoppesUtilServer.java @@ -14,6 +14,7 @@ import java.util.Map; import java.util.UUID; import java.util.zip.GZIPOutputStream; +import net.minecraft.command.ICommandSender; import net.minecraft.command.server.CommandBlockLogic; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; @@ -21,6 +22,8 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; 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.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -31,8 +34,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityCommandBlock; import net.minecraft.tileentity.TileEntityMobSpawner; import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; -import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import noppes.npcs.constants.EnumGuiType; import noppes.npcs.constants.EnumPacketClient; @@ -69,7 +72,7 @@ import noppes.npcs.controllers.TransportLocation; import noppes.npcs.entity.EntityDialogNpc; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.roles.RoleTransporter; -import noppes.npcs.scripted.ScriptEventDialog; +import noppes.npcs.scripted.event.ScriptEventDialog; public class NoppesUtilServer { private static HashMap editingQuests = new HashMap(); @@ -216,6 +219,19 @@ public class NoppesUtilServer { logic.func_145754_b("@"+name); logic.func_145755_a(executer.worldObj); } + + public static void runCommand(World world, String name, String command) { + TileEntityCommandBlock tile = new TileEntityCommandBlock(); + tile.setWorldObj(world.provider.worldObj); + tile.xCoord = 0; + tile.yCoord = 0; + tile.zCoord = 0; + + CommandBlockLogic logic = tile.func_145993_a(); + logic.func_145752_a(command); + logic.func_145754_b("@"+name); + logic.func_145755_a(world); + } public static void consumeItemStack(int i, EntityPlayer player){ ItemStack item = player.inventory.getCurrentItem(); @@ -291,6 +307,22 @@ public class NoppesUtilServer { Server.sendAssociatedData(entity, EnumPacketClient.PARTICLE, entity.posX, entity.posY, entity.posZ, entity.height, entity.width, entity.yOffset, particle); } + public static void spawnScriptedParticle(Entity entity, String directory, int HEXcolor, int amount, int maxAge, + double x, double y, double z, + double motionX, double motionY, double motionZ, float gravity, + float scale1, float scale2, float scaleRate, int scaleRateStart, + float alpha1, float alpha2, float alphaRate, int alphaRateStart, + int entityID + ){ + Server.sendAssociatedData(entity, EnumPacketClient.SCRIPTED_PARTICLE, + directory, HEXcolor, amount, maxAge, + x, y, z, + motionX, motionY, motionZ, gravity, + scale1, scale2, scaleRate, scaleRateStart, + alpha1, alpha2, alphaRate, alphaRateStart, + entityID + ); + } public static void deleteNpc(EntityNPCInterface npc,EntityPlayer player) { Server.sendAssociatedData(npc, EnumPacketClient.DELETE_NPC, npc.getEntityId()); @@ -658,4 +690,25 @@ public class NoppesUtilServer { } return null; } + + public static Entity GetDamageSourcee(DamageSource damagesource) { + Object entity = damagesource.getEntity(); + if(entity == null) { + entity = damagesource.getSourceOfDamage(); + } + + if(entity instanceof EntityArrow && ((EntityArrow)entity).shootingEntity instanceof EntityLivingBase) { + entity = ((EntityArrow)entity).shootingEntity; + } else if(entity instanceof EntityThrowable) { + entity = ((EntityThrowable)entity).getThrower(); + } + + return (Entity)entity; + } + + public static void isGUIOpen(ByteBuf buffer, EntityPlayer player) throws IOException { + PlayerData playerdata = PlayerDataController.instance.getPlayerData(player); + boolean isGUIOpen = buffer.readBoolean(); + playerdata.setGUIOpen(isGUIOpen); + } } diff --git a/src/main/java/noppes/npcs/PacketHandlerPlayer.java b/src/main/java/noppes/npcs/PacketHandlerPlayer.java index 63053e684..55f3faabb 100644 --- a/src/main/java/noppes/npcs/PacketHandlerPlayer.java +++ b/src/main/java/noppes/npcs/PacketHandlerPlayer.java @@ -22,13 +22,7 @@ import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumPlayerPacket; import noppes.npcs.constants.EnumRoleType; import noppes.npcs.containers.ContainerMail; -import noppes.npcs.controllers.BankData; -import noppes.npcs.controllers.PlayerDataController; -import noppes.npcs.controllers.PlayerFactionData; -import noppes.npcs.controllers.PlayerMail; -import noppes.npcs.controllers.PlayerMailData; -import noppes.npcs.controllers.PlayerQuestController; -import noppes.npcs.controllers.PlayerQuestData; +import noppes.npcs.controllers.*; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.roles.RoleCompanion; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -67,17 +61,31 @@ public class PacketHandlerPlayer{ return; NoppesUtilServer.sendOpenGui(player, EnumGuiType.CompanionInv, npc); } + else if(type == EnumPlayerPacket.KeyPressed) { + if(ScriptController.Instance.languages.isEmpty()) { + return; + } + + EventHooks.onPlayerKeyPressed(player, buffer.readInt(), buffer.readBoolean(), buffer.readBoolean(), buffer.readBoolean(), buffer.readBoolean(), buffer.readBoolean()); + } + else if(type == EnumPlayerPacket.MouseClicked) { + if(ScriptController.Instance.languages.isEmpty()) { + return; + } + + EventHooks.onPlayerMouseClicked(player, buffer.readInt(), buffer.readInt(), buffer.readBoolean()); + } else if(type == EnumPlayerPacket.FollowerHire){ EntityNPCInterface npc = NoppesUtilServer.getEditingNpc(player); if(npc == null || npc.advanced.role != EnumRoleType.Follower) return; - NoppesUtilPlayer.hireFollower(player,npc); + NoppesUtilPlayer.hireFollower(player, npc); } else if(type == EnumPlayerPacket.FollowerExtend){ EntityNPCInterface npc = NoppesUtilServer.getEditingNpc(player); if(npc == null || npc.advanced.role != EnumRoleType.Follower) return; - NoppesUtilPlayer.extendFollower(player,npc); + NoppesUtilPlayer.extendFollower(player, npc); Server.sendData(player, EnumPacketClient.GUI_DATA, npc.roleInterface.writeToNBT(new NBTTagCompound())); } else if(type == EnumPlayerPacket.FollowerState){ @@ -124,17 +132,17 @@ public class PacketHandlerPlayer{ EntityNPCInterface npc = NoppesUtilServer.getEditingNpc(player); if(npc == null) return; - NoppesUtilPlayer.dialogSelected(buffer.readInt(),buffer.readInt(),player,npc); + NoppesUtilPlayer.dialogSelected(buffer.readInt(), buffer.readInt(), player, npc); } else if(type == EnumPlayerPacket.CheckQuestCompletion){ PlayerQuestData playerdata = PlayerDataController.instance.getPlayerData(player).questData; - playerdata.checkQuestCompletion(player,null); + playerdata.checkQuestCompletion(player, null); } else if(type == EnumPlayerPacket.QuestLog){ NoppesUtilPlayer.sendQuestLogData(player); } else if(type == EnumPlayerPacket.QuestCompletion){ - NoppesUtilPlayer.questCompletion(player,buffer.readInt()); + NoppesUtilPlayer.questCompletion(player, buffer.readInt()); } else if(type == EnumPlayerPacket.FactionsGet){ PlayerFactionData data = PlayerDataController.instance.getPlayerData(player).factionData; diff --git a/src/main/java/noppes/npcs/PacketHandlerServer.java b/src/main/java/noppes/npcs/PacketHandlerServer.java index 490c567a7..6e4f42fbb 100644 --- a/src/main/java/noppes/npcs/PacketHandlerServer.java +++ b/src/main/java/noppes/npcs/PacketHandlerServer.java @@ -9,7 +9,6 @@ import java.util.HashMap; import java.util.List; import java.util.Set; -import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.passive.EntityVillager; @@ -62,6 +61,8 @@ import noppes.npcs.controllers.SpawnController; import noppes.npcs.controllers.SpawnData; import noppes.npcs.controllers.TransportController; import noppes.npcs.controllers.TransportLocation; +import noppes.npcs.controllers.data.ForgeDataScript; +import noppes.npcs.controllers.data.PlayerDataScript; import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.roles.JobSpawner; @@ -88,13 +89,19 @@ public class PacketHandlerServer{ ItemStack item = player.inventory.getCurrentItem(); EntityNPCInterface npc = NoppesUtilServer.getEditingNpc(player); + + if(type == EnumPacketServer.IsGuiOpen) { + isGuiOpenPacket(buffer, player); + return; + } + if(type.needsNpc && npc == null){ } else if(type.hasPermission() && !CustomNpcsPermissions.Instance.hasPermission(player, type.permission)){ - //player doesnt have permission todo this + //player doesnt have permission to do this } - else if(item == null ) + else if(item == null && (type == EnumPacketServer.ScriptPlayerGet || type == EnumPacketServer.ScriptPlayerSave || type == EnumPacketServer.ScriptForgeGet || type == EnumPacketServer.ScriptForgeSave)) warn(player, "tried to use custom npcs without a tool in hand, probably a hacker"); else if(item.getItem() == CustomItems.wand) wandPackets(type, buffer, player, npc); @@ -106,6 +113,10 @@ public class PacketHandlerServer{ clonePackets(type, buffer, player); else if(item.getItem() == CustomItems.teleporter) featherPackets(type, buffer, player); + else if(type == EnumPacketServer.ScriptPlayerGet || type == EnumPacketServer.ScriptPlayerSave) + playerScriptPackets(type, buffer, player); + else if(type == EnumPacketServer.ScriptForgeGet || type == EnumPacketServer.ScriptForgeSave) + forgeScriptPackets(type, buffer, player); else if(item.getItem() == CustomItems.scripter) scriptPackets(type, buffer, player, npc); else if(item.getItem() == Item.getItemFromBlock(CustomItems.waypoint) || item.getItem() == Item.getItemFromBlock(CustomItems.border) || item.getItem() == Item.getItemFromBlock(CustomItems.redstoneBlock)) @@ -114,7 +125,11 @@ public class PacketHandlerServer{ LogWriter.error("Error with EnumPacketServer." + type, e); } } - + + private void isGuiOpenPacket(ByteBuf buffer, EntityPlayerMP player) throws IOException { + NoppesUtilServer.isGUIOpen(buffer, player); + } + private void scriptPackets(EnumPacketServer type, ByteBuf buffer, EntityPlayerMP player, EntityNPCInterface npc) throws Exception { if(type == EnumPacketServer.ScriptDataSave){ npc.script.readFromNBT(Server.readNBT(buffer)); @@ -128,6 +143,30 @@ 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()); + compound.setTag("Languages", ScriptController.Instance.nbtLanguages()); + Server.sendData(player, EnumPacketClient.GUI_DATA, compound); + } else if(type == EnumPacketServer.ScriptPlayerSave) { + ScriptController.Instance.setPlayerScripts(Server.readNBT(buffer)); + } + } + + private void forgeScriptPackets(EnumPacketServer type, ByteBuf buffer, EntityPlayerMP player) throws Exception { + NBTTagCompound compound; + if (type == EnumPacketServer.ScriptForgeGet) { + ForgeDataScript data = ScriptController.Instance.forgeScripts; + compound = data.writeToNBT(new NBTTagCompound()); + compound.setTag("Languages", ScriptController.Instance.nbtLanguages()); + Server.sendData(player, EnumPacketClient.GUI_DATA, new Object[]{compound}); + } else if (type == EnumPacketServer.ScriptForgeSave) { + ScriptController.Instance.setForgeScripts(Server.readNBT(buffer)); + } + } + private void featherPackets(EnumPacketServer type, ByteBuf buffer, EntityPlayerMP player) throws IOException { if(type == EnumPacketServer.DimensionsGet){ HashMap map = new HashMap(); diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java new file mode 100644 index 000000000..c1ebd7f06 --- /dev/null +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -0,0 +1,477 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs; + +import com.google.common.reflect.ClassPath; +import com.google.common.reflect.ClassPath.ClassInfo; +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; + +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.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.InputEvent; +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.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.EntityEvent; +import net.minecraftforge.event.entity.EntityEvent.EntityConstructing; +import net.minecraftforge.event.entity.EntityStruckByLightningEvent; +import net.minecraftforge.event.entity.PlaySoundAtEntityEvent; +import net.minecraftforge.event.entity.item.ItemTossEvent; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +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.WorldEvent.PotentialSpawns; +import noppes.npcs.controllers.PlayerData; +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.event.ForgeEvent; +import noppes.npcs.controllers.PixelmonHelper; +import noppes.npcs.controllers.ScriptController; +import org.lwjgl.input.Mouse; + +public class ScriptPlayerEventHandler { + public ScriptPlayerEventHandler() { + } + @SubscribeEvent + 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); + EventHooks.onPlayerTick(data.scriptData); + + if(PlayerDataController.instance != null) { + PlayerDataController.instance.getPlayerData(player).scriptData = data.scriptData; + PlayerDataController.instance.getPlayerData(player).timers.update(); + } + } + } + + @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)); + event.setCanceled(EventHooks.onPlayerInteract(handler, ev)); + } + } + + @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()); + EventHooks.onPlayerBowCharge(handler, ev); + } + } + + @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); + EventHooks.onPlayerRanged(handler, ev); + } + } + + @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()); + event.setCanceled(EventHooks.onPlayerBreak(handler, ev)); + event.setExpToDrop(ev.exp); + } + } + + @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)); + } + } + @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)); + } + } + @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)); + } + } + @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); + } + } + + @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)); + } + } + + @SubscribeEvent + public void invoke(PlayerPickupXpEvent event) { + if(event.entityPlayer.worldObj instanceof WorldServer) { + PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; + EventHooks.onPlayerPickupXP(handler, 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); + } + } + + @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); + } + } + + @SubscribeEvent + public void invoke(PlayerOpenContainerEvent event) { + if(event.entityPlayer.worldObj instanceof WorldServer) { + PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; + EventHooks.onPlayerContainerOpen(handler, 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); + } + } + + @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); + } + } + + @SubscribeEvent + public void invoke(PlayerWakeUpEvent event) { + if(event.entityPlayer.worldObj instanceof WorldServer) { + PlayerDataScript handler = PlayerData.get(event.entityPlayer).scriptData; + EventHooks.onPlayerWakeUp(handler, 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); + } + } + + @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); + } + } + + @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)); + } + } + + @SubscribeEvent + public void invoke(ItemTossEvent event) { + if(event.player.worldObj instanceof WorldServer) { + PlayerDataScript handler = PlayerData.get(event.player).scriptData; + EventHooks.onPlayerToss(handler, 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); + } + } + } + + @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); + } + } + } + + @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); + } + } + } + + @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); + } + } + } + + @SubscribeEvent + public void invoke(LivingDeathEvent event) { + if(event.entityLiving.worldObj instanceof WorldServer) { + Entity source = NoppesUtilServer.GetDamageSourcee(event.source); + PlayerDataScript handler; + if(event.entityLiving instanceof EntityPlayer) { + handler = PlayerData.get((EntityPlayer)event.entityLiving).scriptData; + EventHooks.onPlayerDeath(handler, event.source, source); + } + + if(source instanceof EntityPlayer) { + handler = PlayerData.get((EntityPlayer)source).scriptData; + EventHooks.onPlayerKills(handler, event.entityLiving); + } + + } + } + + @SubscribeEvent + public void invoke(LivingHurtEvent event) { + if(event.entityLiving.worldObj instanceof WorldServer) { + Entity source = NoppesUtilServer.GetDamageSourcee(event.source); + PlayerDataScript handler; + 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); + 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); + event.setCanceled(EventHooks.onPlayerDamagedEntity(handler, pevent1)); + event.ammount = pevent1.damage; + } + + } + } + + @SubscribeEvent + public void invoke(PlayerEvent.PlayerRespawnEvent event) { + if(event.player.worldObj instanceof WorldServer) { + PlayerDataScript handler = PlayerData.get(event.player).scriptData; + EventHooks.onPlayerRespawn(handler); + } + } + + @SubscribeEvent + public void invoke(PlayerEvent.PlayerLoggedInEvent event) { + if(event.player.worldObj instanceof WorldServer) { + PlayerDataScript handler = PlayerData.get(event.player).scriptData; + EventHooks.onPlayerLogin(handler); + } + } + + @SubscribeEvent + public void invoke(PlayerEvent.PlayerLoggedOutEvent event) { + if(event.player.worldObj instanceof WorldServer) { + PlayerDataScript handler = PlayerData.get(event.player).scriptData; + EventHooks.onPlayerLogout(handler); + } + } + + @SubscribeEvent( + priority = EventPriority.HIGHEST + ) + 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; + String message = event.message; + noppes.npcs.scripted.event.PlayerEvent.ChatEvent ev = new noppes.npcs.scripted.event.PlayerEvent.ChatEvent(handler.getPlayer(), event.message); + EventHooks.onPlayerChat(handler, ev); + event.setCanceled(ev.isCanceled()); + if(!message.equals(ev.message)) { + ChatComponentTranslation chat = new ChatComponentTranslation("", new Object[0]); + chat.appendSibling(ForgeHooks.newChatWithLinks(ev.message)); + event.component = chat; + } + } + } + + 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")); + 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())) { + 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 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); + } + } + } + } + + /*@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/ClientProxy.java b/src/main/java/noppes/npcs/client/ClientProxy.java index 13f9c1c74..b96e82b61 100644 --- a/src/main/java/noppes/npcs/client/ClientProxy.java +++ b/src/main/java/noppes/npcs/client/ClientProxy.java @@ -21,12 +21,14 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.Item; +import net.minecraft.stats.Achievement; import net.minecraft.util.ChatComponentText; import net.minecraft.util.ReportedException; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.FakePlayer; import noppes.npcs.CommonProxy; import noppes.npcs.CustomNpcs; import noppes.npcs.LogWriter; @@ -62,16 +64,7 @@ import noppes.npcs.client.controllers.PresetController; import noppes.npcs.client.fx.EntityElementalStaffFX; import noppes.npcs.client.fx.EntityEnderFX; import noppes.npcs.client.fx.EntityRainbowFX; -import noppes.npcs.client.gui.GuiBorderBlock; -import noppes.npcs.client.gui.GuiMerchantAdd; -import noppes.npcs.client.gui.GuiNpcDimension; -import noppes.npcs.client.gui.GuiNpcMobSpawner; -import noppes.npcs.client.gui.GuiNpcMobSpawnerMounter; -import noppes.npcs.client.gui.GuiNpcPather; -import noppes.npcs.client.gui.GuiNpcRedstoneBlock; -import noppes.npcs.client.gui.GuiNpcRemoteEditor; -import noppes.npcs.client.gui.GuiNpcWaypoint; -import noppes.npcs.client.gui.GuiScript; +import noppes.npcs.client.gui.*; import noppes.npcs.client.gui.global.GuiNPCManageBanks; import noppes.npcs.client.gui.global.GuiNPCManageDialogs; import noppes.npcs.client.gui.global.GuiNPCManageFactions; @@ -105,6 +98,7 @@ import noppes.npcs.client.gui.roles.GuiNpcFollowerSetup; import noppes.npcs.client.gui.roles.GuiNpcItemGiver; import noppes.npcs.client.gui.roles.GuiNpcTraderSetup; import noppes.npcs.client.gui.roles.GuiNpcTransporter; +import noppes.npcs.client.gui.script.GuiScriptGlobal; import noppes.npcs.client.model.*; import noppes.npcs.client.renderer.*; import noppes.npcs.client.renderer.blocks.BlockBannerRenderer; @@ -150,8 +144,10 @@ import noppes.npcs.containers.ContainerNPCTraderSetup; import noppes.npcs.containers.ContainerNpcItemGiver; import noppes.npcs.containers.ContainerNpcQuestReward; import noppes.npcs.containers.ContainerNpcQuestTypeItem; +import noppes.npcs.controllers.PlayerData; import noppes.npcs.entity.*; +import noppes.npcs.scripted.interfaces.IWorld; import org.lwjgl.input.Keyboard; import tconstruct.client.tabs.InventoryTabFactions; @@ -165,9 +161,9 @@ import cpw.mods.fml.common.ObfuscationReflectionHelper; public class ClientProxy extends CommonProxy { public static KeyBinding QuestLog; - + public static FontContainer Font; - + public void load() { Font = new FontContainer(CustomNpcs.FontType, CustomNpcs.FontSize); createFolders(); @@ -217,43 +213,47 @@ public class ClientProxy extends CommonProxy { RenderingRegistry.registerBlockHandler(new BlockBloodRenderer()); } Minecraft mc = Minecraft.getMinecraft(); - + QuestLog = new KeyBinding("Quest Log", Keyboard.KEY_L, "key.categories.gameplay"); - + ClientRegistry.registerKeyBinding(QuestLog); mc.gameSettings.loadOptions(); - + new PresetController(CustomNpcs.Dir); - + if(CustomNpcs.EnableUpdateChecker){ VersionChecker checker = new VersionChecker(); checker.start(); } - + ClientCloneController.Instance = new ClientCloneController(); - MinecraftForge.EVENT_BUS.register(new ClientEventHandler()); - - if(CustomNpcs.InventoryGuiEnabled){ - MinecraftForge.EVENT_BUS.register(new TabRegistry()); - - if (TabRegistry.getTabList().size() < 2){ - TabRegistry.registerTab(new InventoryTabVanilla()); - } - TabRegistry.registerTab(new InventoryTabFactions()); - TabRegistry.registerTab(new InventoryTabQuests()); - } + MinecraftForge.EVENT_BUS.register(new ClientEventHandler()); + + if(CustomNpcs.InventoryGuiEnabled){ + MinecraftForge.EVENT_BUS.register(new TabRegistry()); + + if (TabRegistry.getTabList().size() < 2){ + TabRegistry.registerTab(new InventoryTabVanilla()); + } + TabRegistry.registerTab(new InventoryTabFactions()); + TabRegistry.registerTab(new InventoryTabQuests()); + } + } + + public FakePlayer getCommandPlayer(IWorld world) { + return (FakePlayer)(new EntityCustomNpc(world.getMCWorld())).getFakePlayer(); } private void createFolders() { File file = new File(CustomNpcs.Dir,"assets/customnpcs"); if(!file.exists()) file.mkdirs(); - + File check = new File(file,"sounds"); if(!check.exists()) check.mkdir(); - + File json = new File(file, "sounds.json"); if(!json.exists()){ try { @@ -268,16 +268,30 @@ public class ClientProxy extends CommonProxy { check = new File(file,"textures"); if(!check.exists()) check.mkdir(); - + File cache = new File(check,"cache"); if(!cache.exists()) cache.mkdir(); ((IReloadableResourceManager)Minecraft.getMinecraft().getResourceManager()).registerReloadListener(new CustomNpcResourceListener()); } + public static PlayerData playerData = new PlayerData(); + @Override + public PlayerData getPlayerData(EntityPlayer player) { + if (player.getUniqueID() == Minecraft.getMinecraft().thePlayer.getUniqueID()) { + if (playerData.player != player) { + playerData.player = player; + } + + return playerData; + } else { + return null; + } + } + @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { - + if (ID > EnumGuiType.values().length) return null; EnumGuiType gui = EnumGuiType.values()[ID]; @@ -286,6 +300,8 @@ public class ClientProxy extends CommonProxy { return getGui(npc, gui, container, x, y, z); } + + private GuiScreen getGui(EntityNPCInterface npc, EnumGuiType gui, Container container, int x, int y, int z) { if (gui == EnumGuiType.MainMenuDisplay){ if(npc != null) @@ -304,16 +320,16 @@ public class ClientProxy extends CommonProxy { else if(gui == EnumGuiType.QuestReward) return new GuiNpcQuestReward(npc, (ContainerNpcQuestReward) container); - + else if(gui == EnumGuiType.QuestItem) return new GuiNpcQuestTypeItem(npc, (ContainerNpcQuestTypeItem) container); - + else if (gui == EnumGuiType.MovingPath) return new GuiNpcPather(npc); else if (gui == EnumGuiType.ManageFactions) return new GuiNPCManageFactions(npc); - + else if (gui == EnumGuiType.ManageLinked) return new GuiNPCManageLinkedNpc(npc); @@ -322,15 +338,15 @@ public class ClientProxy extends CommonProxy { else if (gui == EnumGuiType.ManageRecipes) return new GuiNpcManageRecipes(npc,(ContainerManageRecipes) container); - + else if (gui == EnumGuiType.ManageDialogs) return new GuiNPCManageDialogs(npc); - + else if (gui == EnumGuiType.ManageQuests) return new GuiNPCManageQuest(npc); - + else if(gui == EnumGuiType.ManageBanks) - return new GuiNPCManageBanks(npc,(ContainerManageBanks) container); + return new GuiNPCManageBanks(npc,(ContainerManageBanks) container); else if (gui == EnumGuiType.MainMenuGlobal) return new GuiNPCGlobalMainMenu(npc); @@ -343,84 +359,87 @@ public class ClientProxy extends CommonProxy { else if (gui == EnumGuiType.PlayerFollower) return new GuiNpcFollower(npc, (ContainerNPCFollower) container); - + else if(gui == EnumGuiType.PlayerTrader) return new GuiNPCTrader(npc, (ContainerNPCTrader) container); - + else if(gui == EnumGuiType.PlayerBankSmall || gui == EnumGuiType.PlayerBankUnlock || gui == EnumGuiType.PlayerBankUprade || gui == EnumGuiType.PlayerBankLarge) return new GuiNPCBankChest(npc, (ContainerNPCBankInterface) container); else if(gui == EnumGuiType.PlayerTransporter) return new GuiTransportSelection(npc); - + else if(gui == EnumGuiType.Script) return new GuiScript(npc); - + else if(gui == EnumGuiType.PlayerAnvil) return new GuiNpcCarpentryBench((ContainerCarpentryBench) container); - + else if (gui == EnumGuiType.SetupFollower) return new GuiNpcFollowerSetup(npc, (ContainerNPCFollowerSetup) container); - + else if (gui == EnumGuiType.SetupItemGiver) return new GuiNpcItemGiver(npc, (ContainerNpcItemGiver) container); - + else if(gui == EnumGuiType.SetupTrader) return new GuiNpcTraderSetup(npc, (ContainerNPCTraderSetup) container); else if(gui == EnumGuiType.SetupTransporter) return new GuiNpcTransporter(npc); - + else if(gui == EnumGuiType.SetupBank) return new GuiNpcBankSetup(npc); - + else if(gui == EnumGuiType.NpcRemote && Minecraft.getMinecraft().currentScreen == null) return new GuiNpcRemoteEditor(); + else if(gui == EnumGuiType.ScriptEvent && Minecraft.getMinecraft().currentScreen == null) + return new GuiScriptGlobal(); + else if(gui == EnumGuiType.PlayerMailman) return new GuiMailmanWrite((ContainerMail) container, x == 1, y == 1); - + else if(gui == EnumGuiType.PlayerMailbox) return new GuiMailbox(); - + else if(gui == EnumGuiType.MerchantAdd) return new GuiMerchantAdd(); - + else if(gui == EnumGuiType.Crate) return new GuiCrate((ContainerCrate)container); else if(gui == EnumGuiType.NpcDimensions) return new GuiNpcDimension(); - + else if(gui == EnumGuiType.Border) return new GuiBorderBlock(x, y, z); else if(gui == EnumGuiType.BigSign) return new GuiBigSign(x, y, z); - + else if (gui == EnumGuiType.RedstoneBlock) return new GuiNpcRedstoneBlock(x, y, z); - + else if(gui == EnumGuiType.MobSpawner) return new GuiNpcMobSpawner(x, y, z); - + else if(gui == EnumGuiType.MobSpawnerMounter) return new GuiNpcMobSpawnerMounter(x, y, z); else if (gui == EnumGuiType.Waypoint) return new GuiNpcWaypoint(x, y, z); - + else if (gui == EnumGuiType.Companion) return new GuiNpcCompanionStats(npc); - + else if (gui == EnumGuiType.CompanionTalent) return new GuiNpcCompanionTalents(npc); - + else if (gui == EnumGuiType.CompanionInv) return new GuiNpcCompanionInv(npc, (ContainerNPCCompanion) container); return null; } - + @Override public void openGui(int i, int j, int k, EnumGuiType gui, EntityPlayer player) { Minecraft minecraft = Minecraft.getMinecraft(); @@ -428,7 +447,7 @@ public class ClientProxy extends CommonProxy { return; GuiScreen guiscreen = getGui(null, gui, null, i, j, k); - + if (guiscreen != null) { minecraft.displayGuiScreen(guiscreen); @@ -459,7 +478,7 @@ public class ClientProxy extends CommonProxy { if (guiscreen != null) { minecraft.displayGuiScreen((GuiScreen)guiscreen); } - + } @Override @@ -467,18 +486,18 @@ public class ClientProxy extends CommonProxy { if(string.equals("Spell")){ int color = (Integer) ob[0]; int number = (Integer) ob[1]; - for(int i = 0; i < number; i++){ - Random rand = player.worldObj.rand; + for(int i = 0; i < number; i++){ + Random rand = player.worldObj.rand; double x = (rand.nextDouble() - 0.5D) * (double)player.width; double y = player.getEyeHeight(); double z = (rand.nextDouble() - 0.5D) * (double)player.width; - - double f = (rand.nextDouble() - 0.5D) * 2D; - double f1 = -rand.nextDouble(); - double f2 = (rand.nextDouble() - 0.5D) * 2D; - - Minecraft.getMinecraft().effectRenderer.addEffect(new EntityElementalStaffFX(player, x, y, z, f, f1, f2, color)); - } + + double f = (rand.nextDouble() - 0.5D) * 2D; + double f1 = -rand.nextDouble(); + double f2 = (rand.nextDouble() - 0.5D) * 2D; + + Minecraft.getMinecraft().effectRenderer.addEffect(new EntityElementalStaffFX(player, x, y, z, f, f1, f2, color)); + } } else if(string.equals("ModelData")){ ModelData data = (ModelData) ob[0]; @@ -492,21 +511,21 @@ public class ClientProxy extends CommonProxy { EntityEnderFX fx = new EntityEnderFX(npc, (rand.nextDouble() - 0.5D) * (double)player.width, (rand.nextDouble() * (double)player.height) - height - 0.25D, (rand.nextDouble() - 0.5D) * (double)player.width, (rand.nextDouble() - 0.5D) * 2D, -rand.nextDouble(), (rand.nextDouble() - 0.5D) * 2D, particles); minecraft.effectRenderer.addEffect(fx); } - + } else if(particles.type == 1){ - for(int i = 0; i < 2; i++){ - double x = player.posX + (rand.nextDouble() - 0.5D) * 0.9; - double y = (player.posY + rand.nextDouble() * 1.9) - 0.25D - height; - double z = player.posZ + (rand.nextDouble() - 0.5D) * 0.9; - - - double f = (rand.nextDouble() - 0.5D) * 2D; - double f1 = -rand.nextDouble(); - double f2 = (rand.nextDouble() - 0.5D) * 2D; - - minecraft.effectRenderer.addEffect(new EntityRainbowFX(player.worldObj, x, y, z, f, f1, f2)); - } + for(int i = 0; i < 2; i++){ + double x = player.posX + (rand.nextDouble() - 0.5D) * 0.9; + double y = (player.posY + rand.nextDouble() * 1.9) - 0.25D - height; + double z = player.posZ + (rand.nextDouble() - 0.5D) * 0.9; + + + double f = (rand.nextDouble() - 0.5D) * 2D; + double f1 = -rand.nextDouble(); + double f2 = (rand.nextDouble() - 0.5D) * 2D; + + minecraft.effectRenderer.addEffect(new EntityRainbowFX(player.worldObj, x, y, z, f, f1, f2)); + } } } } @@ -519,7 +538,7 @@ public class ClientProxy extends CommonProxy { public boolean hasClient() { return true; } - + public EntityPlayer getPlayer() { return Minecraft.getMinecraft().thePlayer; } @@ -534,54 +553,63 @@ public class ClientProxy extends CommonProxy { try{ if(location == null) return; - TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager(); - if(location != null) - texturemanager.bindTexture((ResourceLocation) location); + TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager(); + if(location != null) + texturemanager.bindTexture((ResourceLocation) location); } catch(NullPointerException ex){ - + } catch(ReportedException ex){ - + } } @Override public void spawnParticle(String particle, double x, double y, double z, - double motionX, double motionY, double motionZ, float scale) { - + double motionX, double motionY, double motionZ, float scale) { + RenderGlobal render = Minecraft.getMinecraft().renderGlobal; - + EntityFX fx = render.doSpawnParticle(particle, x, y, z, motionX, motionY, motionZ); if(fx == null) return; - if (particle.equals("flame")){ - ObfuscationReflectionHelper.setPrivateValue(EntityFlameFX.class, (EntityFlameFX)fx, scale, 0); - } - else if (particle.equals("smoke")){ - ObfuscationReflectionHelper.setPrivateValue(EntitySmokeFX.class, (EntitySmokeFX)fx, scale, 0); - } + if (particle.equals("flame")){ + ObfuscationReflectionHelper.setPrivateValue(EntityFlameFX.class, (EntityFlameFX)fx, scale, 0); + } + else if (particle.equals("smoke")){ + ObfuscationReflectionHelper.setPrivateValue(EntitySmokeFX.class, (EntitySmokeFX)fx, scale, 0); + } + } + + @Override + public String getAchievementDesc(Achievement achievement) { + return achievement.getDescription(); + } + + @Override + public boolean isGUIOpen(){ + return Minecraft.getMinecraft().currentScreen != null; } - public static class FontContainer { private StringCache textFont = null; public boolean useCustomFont = true; - + private FontContainer(){ - + } - + public FontContainer(String fontType, int fontSize) { textFont = new StringCache(); textFont.setDefaultFont("Arial", fontSize, true); useCustomFont = !fontType.equalsIgnoreCase("minecraft"); - try { - if(!useCustomFont || fontType.isEmpty() || fontType.equalsIgnoreCase("default")) - textFont.setCustomFont(new ResourceLocation("customnpcs","OpenSans.ttf"), fontSize, true); - else - textFont.setDefaultFont(fontType, fontSize, true); + try { + if(!useCustomFont || fontType.isEmpty() || fontType.equalsIgnoreCase("default")) + textFont.setCustomFont(new ResourceLocation("customnpcs","OpenSans.ttf"), fontSize, true); + else + textFont.setDefaultFont(fontType, fontSize, true); } catch (Exception e) { LogWriter.info("Failed loading font so using Arial"); } @@ -592,7 +620,7 @@ public class ClientProxy extends CommonProxy { return textFont.fontHeight; return Minecraft.getMinecraft().fontRenderer.FONT_HEIGHT; } - + public int width(String text){ if(useCustomFont) return textFont.getStringWidth(text); @@ -622,4 +650,4 @@ public class ClientProxy extends CommonProxy { return textFont.usedFont().getFontName(); } } -} +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/client/ClientTickHandler.java b/src/main/java/noppes/npcs/client/ClientTickHandler.java index 06cd83b1a..30ef21cae 100644 --- a/src/main/java/noppes/npcs/client/ClientTickHandler.java +++ b/src/main/java/noppes/npcs/client/ClientTickHandler.java @@ -14,11 +14,15 @@ import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.InputEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; public class ClientTickHandler{ - private World prevWorld; private boolean otherContainer = false; + private int buttonPressed = -1; + private long buttonTime = 0L; + private final int[] ignoreKeys = new int[]{157, 29, 54, 42, 184, 56, 220, 219}; @SubscribeEvent(priority = EventPriority.LOWEST) public void onClientTick(TickEvent.ClientTickEvent event){ @@ -41,6 +45,14 @@ public class ClientTickHandler{ } } + @SubscribeEvent + public void onMouse(InputEvent.MouseInputEvent event){ + if(Mouse.getEventButton() == -1 && Mouse.getDWheel() == 0) + return; + + NoppesUtilPlayer.sendData(EnumPlayerPacket.MouseClicked, new Object[]{Mouse.getEventButton(),Mouse.getEventDWheel(),Mouse.isButtonDown(Mouse.getEventButton())}); + } + @SubscribeEvent public void onKey(InputEvent.KeyInputEvent event){ if(ClientProxy.QuestLog.isPressed()){ @@ -50,6 +62,37 @@ public class ClientTickHandler{ else if(mc.currentScreen instanceof GuiQuestLog) mc.setIngameFocus(); } + + int key = Keyboard.getEventKey(); + long time = Keyboard.getEventNanoseconds(); + + if(Keyboard.getEventKeyState()) { + if(!this.isIgnoredKey(key)) { + this.buttonTime = time; + } + } + + if(time-this.buttonTime == 0 || !Keyboard.getEventKeyState()) { + boolean isCtrlPressed = Keyboard.isKeyDown(157) || Keyboard.isKeyDown(29); + boolean isShiftPressed = Keyboard.isKeyDown(54) || Keyboard.isKeyDown(42); + boolean isAltPressed = Keyboard.isKeyDown(184) || Keyboard.isKeyDown(56); + boolean isMetaPressed = Keyboard.isKeyDown(220) || Keyboard.isKeyDown(219); + boolean keyDown = Keyboard.isKeyDown(key); + NoppesUtilPlayer.sendData(EnumPlayerPacket.KeyPressed, new Object[]{Integer.valueOf(key), Boolean.valueOf(isCtrlPressed), Boolean.valueOf(isShiftPressed), Boolean.valueOf(isAltPressed), Boolean.valueOf(isMetaPressed), Boolean.valueOf(keyDown)}); + } } + private boolean isIgnoredKey(int key) { + int[] var2 = this.ignoreKeys; + int var3 = var2.length; + + for(int var4 = 0; var4 < var3; ++var4) { + int i = var2[var4]; + if(i == key) { + return true; + } + } + + return false; + } } diff --git a/src/main/java/noppes/npcs/client/NoppesUtil.java b/src/main/java/noppes/npcs/client/NoppesUtil.java index 945911008..cfe3ce72e 100644 --- a/src/main/java/noppes/npcs/client/NoppesUtil.java +++ b/src/main/java/noppes/npcs/client/NoppesUtil.java @@ -6,12 +6,14 @@ import java.io.File; import java.io.IOException; import java.net.URI; import java.util.HashMap; +import java.util.List; import java.util.Random; import java.util.Vector; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -21,6 +23,7 @@ import net.minecraft.world.World; import noppes.npcs.CustomNpcs; import noppes.npcs.NoppesUtilPlayer; import noppes.npcs.Server; +import noppes.npcs.client.fx.EntityCustomFX; import noppes.npcs.client.gui.player.GuiDialogInteract; import noppes.npcs.client.gui.player.GuiQuestCompletion; import noppes.npcs.client.gui.util.GuiContainerNPCInterface; @@ -67,6 +70,57 @@ public class NoppesUtil { } } + public static void spawnScriptedParticle(ByteBuf buffer){ + Minecraft minecraft = Minecraft.getMinecraft(); + + String directory = Server.readString(buffer); + + int HEXcolor = buffer.readInt(); + int amount = buffer.readInt(); + int maxAge = buffer.readInt(); + + double x = buffer.readDouble(); + double y = buffer.readDouble(); + double z = buffer.readDouble(); + + double motionX = buffer.readDouble(); + double motionY = buffer.readDouble(); + double motionZ = buffer.readDouble(); + float gravity = buffer.readFloat(); + + float scale1 = buffer.readFloat(); + float scale2 = buffer.readFloat(); + float scaleRate = buffer.readFloat(); + int scaleRateStart = buffer.readInt(); + + float alpha1 = buffer.readFloat(); + float alpha2 = buffer.readFloat(); + float alphaRate = buffer.readFloat(); + int alphaRateStart = buffer.readInt(); + + int entityID = buffer.readInt(); + + World worldObj = Minecraft.getMinecraft().theWorld; + Entity entity = worldObj.getEntityByID(entityID); + + if(entity == null) + return; + + EntityCustomFX fx = new EntityCustomFX( + entity, + directory, HEXcolor, + x, y, z, + motionX, motionY, motionZ, gravity, + scale1, scale2, scaleRate, scaleRateStart, + alpha1, alpha2, alphaRate, alphaRateStart, + maxAge + ); + + for(int i = 0; i < amount; i++){ + minecraft.effectRenderer.addEffect(fx); + } + } + public static void clickSound() { Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); } @@ -237,4 +291,7 @@ public class NoppesUtil { CustomNpcs.proxy.openGui(x, y, z, EnumGuiType.Waypoint, player); } + public static void isGUIOpen(boolean isGUIOpen) { + Client.sendData(EnumPacketServer.IsGuiOpen, isGUIOpen); + } } diff --git a/src/main/java/noppes/npcs/client/PacketHandlerClient.java b/src/main/java/noppes/npcs/client/PacketHandlerClient.java index 4331b1d43..138958ed4 100644 --- a/src/main/java/noppes/npcs/client/PacketHandlerClient.java +++ b/src/main/java/noppes/npcs/client/PacketHandlerClient.java @@ -151,6 +151,9 @@ public class PacketHandlerClient extends PacketHandlerServer{ EnumGuiType gui = EnumGuiType.values()[buffer.readInt()]; CustomNpcs.proxy.openGui(NoppesUtil.getLastNpc(), gui, buffer.readInt(), buffer.readInt(), buffer.readInt()); } + else if(type == EnumPacketClient.SCRIPTED_PARTICLE){ + NoppesUtil.spawnScriptedParticle(buffer); + } else if(type == EnumPacketClient.PARTICLE){ NoppesUtil.spawnParticle(buffer); } @@ -251,8 +254,10 @@ public class PacketHandlerClient extends PacketHandlerServer{ player.addChatMessage(new ChatComponentTranslation("Current font is %s", ClientProxy.Font.getName())); } } + else if(type == EnumPacketClient.ISGUIOPEN){ + boolean isGUIOpen = Minecraft.getMinecraft().currentScreen != null; + + NoppesUtil.isGUIOpen(isGUIOpen); + } } - - - } diff --git a/src/main/java/noppes/npcs/client/fx/EntityCustomFX.java b/src/main/java/noppes/npcs/client/fx/EntityCustomFX.java new file mode 100644 index 000000000..318cf8152 --- /dev/null +++ b/src/main/java/noppes/npcs/client/fx/EntityCustomFX.java @@ -0,0 +1,162 @@ +package noppes.npcs.client.fx; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ResourceLocation; +import noppes.npcs.client.ClientProxy; +import org.lwjgl.Sys; +import org.lwjgl.opengl.GL11; + +public class EntityCustomFX extends EntityFX { + private Entity entity; + private final ResourceLocation location; + private static final ResourceLocation resource = new ResourceLocation("textures/particle/particles.png"); + private boolean move = true; + private float startX = 0, startY = 0, startZ = 0; + + public float scale1 = 1.0F; + public float scale2 = 1.0F; + public float scaleRate = 1.0F; + public int scaleRateStart = 0; + + public float alpha1 = 1.0F; + public float alpha2 = 0; + public float alphaRate = 0.0F; + public int alphaRateStart = 0; + + public EntityCustomFX(Entity entity, String directory, int HEXColor, double x, double y, double z, + double motionX, double motionY, double motionZ, float gravity, + float scale1, float scale2, float scaleRate, int scaleRateStart, + float alpha1, float alpha2, float alphaRate, int alphaRateStart, + int age) { + super(entity.worldObj, x, y, z, motionX, motionY, motionZ); + + this.scale1 = scale1; + this.scale2 = scale2; + this.scaleRate = Math.abs(scaleRate); + this.scaleRateStart = scaleRateStart; + particleScale = scale1; + if(scale1 > scale2) + this.scaleRate *= -1; + + this.alpha1 = alpha1; + this.alpha2 = alpha2; + this.alphaRate = Math.abs(alphaRate); + this.alphaRateStart = alphaRateStart; + particleAlpha = alpha1; + if(alpha1 > alpha2) + this.alphaRate *= -1; + + particleGravity = gravity/0.04F; + particleMaxAge = age; + + this.motionX = motionX; + this.motionY = motionY; + this.motionZ = motionZ; + + this.entity = entity; + noClip = true; + + particleRed = (HEXColor >> 16 & 255) / 255f; + particleGreen = (HEXColor >> 8 & 255) / 255f; + particleBlue = (HEXColor & 255) / 255f; + + if(Math.floor(Math.random()*3) == 1){ + move = false; + this.startX = (float) entity.posX; + this.startY = (float) entity.posY; + this.startZ = (float) entity.posZ; + } + + location = new ResourceLocation(directory); + } + + @Override + public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) + { + if(move){ + startX = (float)(entity.prevPosX + (entity.posX - entity.prevPosX) * (double)par2); + startY = (float)(entity.prevPosY + (entity.posY - entity.prevPosY) * (double)par2); + startZ = (float)(entity.prevPosZ + (entity.posZ - entity.prevPosZ) * (double)par2); + } + Tessellator tessellator = Tessellator.instance; + tessellator.draw(); + + float scale = this.scaleRate / (float)particleMaxAge; + if((this.scaleRate < 0 && particleScale+scale < this.scale2) || (this.scaleRate > 0 && particleScale+scale > this.scale2)) + particleScale = this.scale2; + else if(particleAge >= this.scaleRateStart) + particleScale += scale; + + float alpha = this.alphaRate / (float)particleMaxAge; + if((this.alphaRate < 0 && particleAlpha+alpha < this.alpha2) || (this.alphaRate > 0 && particleAlpha+alpha > this.alpha2)) + particleAlpha = this.alpha2; + else if(particleAge >= this.alphaRateStart) + particleAlpha += alpha; + + ClientProxy.bindTexture(location); + + float f = 0.0f; + float f1 = 1.0f; + float f2 = 0.0f; + float f3 = 1.0f; + float f4 = 0.1F * particleScale; + float f5 = (float)(((prevPosX + (posX - prevPosX) * (double)par2) - interpPosX) + startX); + float f6 = (float)(((prevPosY + (posY - prevPosY) * (double)par2) - interpPosY) + startY); + float f7 = (float)(((prevPosZ + (posZ - prevPosZ) * (double)par2) - interpPosZ) + startZ); + + tessellator.startDrawingQuads(); + tessellator.setBrightness(240); + par1Tessellator.setColorOpaque_F(1, 1, 1); + par1Tessellator.setColorRGBA_F(particleRed, particleGreen, particleBlue, particleAlpha); + par1Tessellator.addVertexWithUV(f5 - par3 * f4 - par6 * f4, f6 - par4 * f4, f7 - par5 * f4 - par7 * f4, f1, f3); + par1Tessellator.addVertexWithUV((f5 - par3 * f4) + par6 * f4, f6 + par4 * f4, (f7 - par5 * f4) + par7 * f4, f1, f2); + par1Tessellator.addVertexWithUV(f5 + par3 * f4 + par6 * f4, f6 + par4 * f4, f7 + par5 * f4 + par7 * f4, f, f2); + par1Tessellator.addVertexWithUV((f5 + par3 * f4) - par6 * f4, f6 - par4 * f4, (f7 + par5 * f4) - par7 * f4, f, f3); + + /* + Minecraft minecraft = Minecraft.getMinecraft(); + EntityPlayer player = minecraft.thePlayer; + + double yaw = (player.rotationYaw/180)*Math.PI; + double pitch = (player.rotationPitch/180)*Math.PI; + + double angle = Minecraft.getMinecraft().theWorld.getWorldTime()%360; + double angleRad = (angle/180)*Math.PI; + + double angleX = Math.sin(yaw)*Math.cos(pitch); + if(Math.abs(angleX) < 0.0001){ + angleX = 0.0D; + } + double angleY = Math.sin(pitch); + if(Math.abs(angleY) < 0.0001){ + angleY = 0.0D; + } + double angleZ = -Math.cos(yaw)*Math.cos(pitch); + if(Math.abs(angleZ) < 0.0001){ + angleZ = 0.0D; + } + + double translateX = 0; + double translateY = 0; + double translateZ = 0; + */ + + GL11.glPushMatrix(); + GL11.glColor4f(1, 1, 1, 1.0F); + //GL11.glTranslated(translateX,translateY,translateZ); + //GL11.glRotated(angle, angleX, angleY, angleZ); + + tessellator.draw(); + ClientProxy.bindTexture(resource); + tessellator.startDrawingQuads(); + GL11.glPopMatrix(); + } + + public int getFXLayer(){ + return 0; + } +} diff --git a/src/main/java/noppes/npcs/client/gui/EventGuiScriptList.java b/src/main/java/noppes/npcs/client/gui/EventGuiScriptList.java new file mode 100644 index 000000000..7cbdc488a --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/EventGuiScriptList.java @@ -0,0 +1,103 @@ +package noppes.npcs.client.gui; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.gui.GuiButton; +import noppes.npcs.EventScriptContainer; +import noppes.npcs.client.gui.util.GuiCustomScroll; +import noppes.npcs.client.gui.util.GuiNpcButton; +import noppes.npcs.client.gui.util.GuiNpcLabel; +import noppes.npcs.client.gui.util.SubGuiInterface; + +public class EventGuiScriptList extends SubGuiInterface{ + private GuiCustomScroll scroll1; + private GuiCustomScroll scroll2; + private EventScriptContainer container; + private List scripts; + + public EventGuiScriptList(List scripts, EventScriptContainer container){ + this.container = container; + setBackground("menubg.png"); + xSize = 346; + ySize = 216; + if(scripts == null) + scripts = new ArrayList(); + this.scripts = scripts; + } + @Override + public void initGui(){ + super.initGui(); + if(scroll1 == null){ + scroll1 = new GuiCustomScroll(this,0); + scroll1.setSize(140, 180); + } + scroll1.guiLeft = guiLeft + 4; + scroll1.guiTop = guiTop + 14; + this.addScroll(scroll1); + addLabel(new GuiNpcLabel(1, "script.availableScripts", guiLeft + 4, guiTop + 4)); + + if(scroll2 == null){ + scroll2 = new GuiCustomScroll(this,1); + scroll2.setSize(140, 180); + } + scroll2.guiLeft = guiLeft + 200; + scroll2.guiTop = guiTop + 14; + this.addScroll(scroll2); + addLabel(new GuiNpcLabel(2, "script.loadedScripts", guiLeft + 200, guiTop + 4)); + List temp = new ArrayList(scripts); + temp.removeAll(container.scripts); + scroll1.setList(temp); + scroll2.setList(container.scripts); + + addButton(new GuiNpcButton(1, guiLeft + 145, guiTop + 40, 55, 20, ">")); + addButton(new GuiNpcButton(2, guiLeft + 145, guiTop + 62, 55, 20, "<")); + + addButton(new GuiNpcButton(3, guiLeft + 145, guiTop + 90, 55, 20, ">>")); + addButton(new GuiNpcButton(4, guiLeft + 145, guiTop + 112, 55, 20, "<<")); + + addButton(new GuiNpcButton(66, guiLeft + 260, guiTop + 194, 60, 20, "gui.done")); + } + + protected void actionPerformed(GuiButton guibutton){ + GuiNpcButton button = (GuiNpcButton) guibutton; + if(button.id == 1){ + if(scroll1.hasSelected()){ + container.scripts.add(scroll1.getSelected()); + scroll1.selected = -1; + scroll1.selected = -1; + initGui(); + } + } + if(button.id == 2){ + if(scroll2.hasSelected()){ + container.scripts.remove(scroll2.getSelected()); + scroll2.selected = -1; + initGui(); + } + } + if(button.id == 3){ + container.scripts.clear(); + for(String script : scripts){ + container.scripts.add(script); + } + scroll1.selected = -1; + scroll1.selected = -1; + initGui(); + } + if(button.id == 4){ + container.scripts.clear(); + scroll1.selected = -1; + scroll1.selected = -1; + initGui(); + } + if(button.id == 66){ + close(); + } + } + @Override + public void save() { + + } + +} diff --git a/src/main/java/noppes/npcs/client/gui/GuiScript.java b/src/main/java/noppes/npcs/client/gui/GuiScript.java index 4d84a3fc6..bbdec81d3 100644 --- a/src/main/java/noppes/npcs/client/gui/GuiScript.java +++ b/src/main/java/noppes/npcs/client/gui/GuiScript.java @@ -71,6 +71,7 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall 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)); diff --git a/src/main/java/noppes/npcs/client/gui/player/GuiMailmanWrite.java b/src/main/java/noppes/npcs/client/gui/player/GuiMailmanWrite.java index 369fcd163..bccb11d4e 100644 --- a/src/main/java/noppes/npcs/client/gui/player/GuiMailmanWrite.java +++ b/src/main/java/noppes/npcs/client/gui/player/GuiMailmanWrite.java @@ -240,7 +240,7 @@ public class GuiMailmanWrite extends GuiContainerNPCInterface implements ITextfi */ public void keyTyped(char par1, int par2) { - if(!GuiNpcTextField.isActive() && canEdit) + if(!GuiNpcTextField.isFieldActive() && canEdit) this.keyTypedInBook(par1, par2); else super.keyTyped(par1, par2); 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 201b177d9..386caec09 100644 --- a/src/main/java/noppes/npcs/client/gui/questtypes/GuiNpcQuestTypeKill.java +++ b/src/main/java/noppes/npcs/client/gui/questtypes/GuiNpcQuestTypeKill.java @@ -10,10 +10,8 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLivingBase; import net.minecraft.world.World; -import noppes.npcs.client.NoppesUtil; import noppes.npcs.client.gui.util.GuiCustomScroll; import noppes.npcs.client.gui.util.ICustomScrollListener; -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.GuiNpcTextField; @@ -84,7 +82,7 @@ public class GuiNpcQuestTypeKill extends SubGuiInterface implements ITextfieldLi addScroll(scroll); this.addButton(new GuiNpcButton(0, guiLeft + 4, guiTop + 140, 98, 20, "gui.back")); - scroll.visible = GuiNpcTextField.isActive(); + scroll.visible = GuiNpcTextField.isFieldActive(); } protected void actionPerformed(GuiButton guibutton) { @@ -96,7 +94,7 @@ public class GuiNpcQuestTypeKill extends SubGuiInterface implements ITextfieldLi public void mouseClicked(int i, int j, int k) { super.mouseClicked(i, j, k); - scroll.visible = GuiNpcTextField.isActive(); + scroll.visible = GuiNpcTextField.isFieldActive(); } public void save() { } diff --git a/src/main/java/noppes/npcs/client/gui/script/EventGuiScriptList.java b/src/main/java/noppes/npcs/client/gui/script/EventGuiScriptList.java new file mode 100644 index 000000000..533a7654f --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/script/EventGuiScriptList.java @@ -0,0 +1,111 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.client.gui.script; + +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.client.gui.util.GuiCustomScroll; +import noppes.npcs.client.gui.util.GuiNpcButton; +import noppes.npcs.client.gui.util.GuiNpcLabel; +import noppes.npcs.client.gui.util.SubGuiInterface; + +public class EventGuiScriptList extends SubGuiInterface { + private GuiCustomScroll scroll1; + private GuiCustomScroll scroll2; + private EventScriptContainer container; + private List scripts; + + public EventGuiScriptList(List scripts, EventScriptContainer container) { + this.container = container; + this.setBackground("menubg.png"); + this.xSize = 346; + this.ySize = 216; + if(scripts == null) { + scripts = new ArrayList(); + } + + this.scripts = (List)scripts; + } + + public void initGui() { + super.initGui(); + if(this.scroll1 == null) { + this.scroll1 = new GuiCustomScroll(this, 0); + this.scroll1.setSize(140, 180); + } + + this.scroll1.guiLeft = this.guiLeft + 4; + this.scroll1.guiTop = this.guiTop + 14; + this.addScroll(this.scroll1); + this.addLabel(new GuiNpcLabel(1, "script.availableScripts", this.guiLeft + 4, this.guiTop + 4)); + if(this.scroll2 == null) { + this.scroll2 = new GuiCustomScroll(this, 1); + this.scroll2.setSize(140, 180); + } + + this.scroll2.guiLeft = this.guiLeft + 200; + this.scroll2.guiTop = this.guiTop + 14; + this.addScroll(this.scroll2); + this.addLabel(new GuiNpcLabel(2, "script.loadedScripts", this.guiLeft + 200, this.guiTop + 4)); + ArrayList temp = new ArrayList(this.scripts); + temp.removeAll(this.container.scripts); + this.scroll1.setList(temp); + this.scroll2.setList(this.container.scripts); + this.addButton(new GuiNpcButton(1, this.guiLeft + 145, this.guiTop + 40, 55, 20, ">")); + this.addButton(new GuiNpcButton(2, this.guiLeft + 145, this.guiTop + 62, 55, 20, "<")); + this.addButton(new GuiNpcButton(3, this.guiLeft + 145, this.guiTop + 90, 55, 20, ">>")); + this.addButton(new GuiNpcButton(4, this.guiLeft + 145, this.guiTop + 112, 55, 20, "<<")); + this.addButton(new GuiNpcButton(66, this.guiLeft + 260, this.guiTop + 194, 60, 20, "gui.done")); + } + + protected void actionPerformed(GuiButton guibutton) { + GuiNpcButton button = (GuiNpcButton)guibutton; + if(button.id == 1 && this.scroll1.hasSelected()) { + this.container.scripts.add(this.scroll1.getSelected()); + this.scroll1.selected = -1; + this.scroll1.selected = -1; + this.initGui(); + } + + if(button.id == 2 && this.scroll2.hasSelected()) { + this.container.scripts.remove(this.scroll2.getSelected()); + this.scroll2.selected = -1; + this.initGui(); + } + + if(button.id == 3) { + this.container.scripts.clear(); + Iterator var3 = this.scripts.iterator(); + + while(var3.hasNext()) { + String script = (String)var3.next(); + this.container.scripts.add(script); + } + + this.scroll1.selected = -1; + this.scroll1.selected = -1; + this.initGui(); + } + + if(button.id == 4) { + this.container.scripts.clear(); + this.scroll1.selected = -1; + this.scroll1.selected = -1; + this.initGui(); + } + + if(button.id == 66) { + this.close(); + } + + } + + public void save() { + } +} diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java new file mode 100644 index 000000000..e9a29fe6a --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java @@ -0,0 +1,30 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +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.data.ForgeDataScript; + +public class GuiScriptForge extends GuiScriptInterface { + private ForgeDataScript script = new ForgeDataScript(); + + public GuiScriptForge() { + this.handler = this.script; + Client.sendData(EnumPacketServer.ScriptForgeGet); + } + + public void setGuiData(NBTTagCompound compound) { + this.script.readFromNBT(compound); + super.setGuiData(compound); + } + + public void save() { + super.save(); + Client.sendData(EnumPacketServer.ScriptForgeSave, script.writeToNBT(new NBTTagCompound())); + } +} diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptGlobal.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptGlobal.java new file mode 100644 index 000000000..26bfb2834 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptGlobal.java @@ -0,0 +1,55 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.client.gui.script; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.util.ResourceLocation; +import noppes.npcs.client.gui.util.GuiNPCInterface; +import noppes.npcs.client.gui.util.GuiNpcButton; +import org.lwjgl.opengl.GL11; + +public class GuiScriptGlobal extends GuiNPCInterface { + private final ResourceLocation resource = new ResourceLocation("customnpcs", "textures/gui/smallbg.png"); + + public GuiScriptGlobal() { + this.xSize = 176; + this.ySize = 222; + this.drawDefaultBackground = false; + this.title = ""; + } + + public void initGui() { + super.initGui(); + this.addButton(new GuiNpcButton(0, this.guiLeft + 38, this.guiTop + 20, 100, 20, "Players")); + this.addButton(new GuiNpcButton(1, this.guiLeft + 38, this.guiTop + 50, 100, 20, "Forge")); + } + + public void drawScreen(int i, int j, float f) { + this.drawDefaultBackground(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.renderEngine.bindTexture(this.resource); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize); + super.drawScreen(i, j, f); + } + + protected void actionPerformed(GuiButton guibutton) { + if (guibutton.id == 0) { + this.displayGuiScreen(new GuiScriptPlayers()); + } + if (guibutton.id == 1) { + this.displayGuiScreen(new GuiScriptForge()); + } + } + + public void keyTyped(char c, int i) { + if (i == 1 || this.isInventoryKey(i)) { + this.close(); + } + } + + public void save() { + } +} diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java new file mode 100644 index 000000000..735689a0d --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java @@ -0,0 +1,441 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +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; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiConfirmOpenLink; +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.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; +import org.apache.commons.lang3.StringUtils; + +public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallback, IGuiData, ITextChangeListener, ICustomScrollListener, IJTextAreaListener, ITextfieldListener { + private int activeTab = 0; + public IScriptHandler handler; + public Map> languages = new HashMap(); + private int scriptLimit = 1; + + public GuiScriptInterface() { + this.drawDefaultBackground = true; + this.closeOnEsc = true; + this.xSize = 420; + this.setBackground("menubg.png"); + } + + public void initGui() { + //this.xSize = (int)((double)this.width * 0.88D); + this.ySize = (int)((double)this.xSize * 0.56D); + if((double)this.ySize > (double)this.height * 0.95D) { + this.ySize = (int)((double)this.height * 0.95D); + this.xSize = (int)((double)this.ySize / 0.56D); + } + + this.bgScale = (float)this.xSize / 400.0F; + super.initGui(); + this.guiTop += 10; + int yoffset = (int)((double)this.ySize * 0.02D); + GuiMenuTopButton top; + this.addTopButton(top = new GuiMenuTopButton(0, this.guiLeft + 4, this.guiTop - 17, "gui.settings")); + + int topXoffset = 0; + int topYoffset = 0; + for(int ta = 0; ta < this.handler.getScripts().size(); ++ta) { + if(ta%20 == 0 && ta > 0) { + topYoffset -= 20; + topXoffset -= top.width+20*22; + } + this.addTopButton(top = new GuiMenuTopButton(ta + 1, top.xPosition+top.width + topXoffset, top.yPosition + topYoffset, ta + 1 + "")); + topXoffset = 0; + topYoffset = 0; + scriptLimit = ta + 2; + } + + if(this.handler.getScripts().size() < 100) + this.addTopButton(new GuiMenuTopButton(scriptLimit, top.xPosition+top.width, top.yPosition, "+")); + + top = this.getTopButton(this.activeTab); + if(top == null) { + this.activeTab = 0; + top = this.getTopButton(0); + } + + top.active = true; + if(this.activeTab > 0) { + List hookList = new ArrayList(); + + GuiCustomScroll hooks = new GuiCustomScroll(this, 1); + hooks.allowUserInput = false; + hooks.setSize(108, 198); + hooks.guiLeft = guiLeft - 110; + hooks.guiTop = guiTop + 14; + + if(handler instanceof PlayerDataScript) { + hookList.add("init"); + hookList.add("tick"); + hookList.add("interact"); + 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"); + } + else if(handler instanceof ForgeDataScript) { + hooks.setSize(238, 198); + hooks.guiLeft = guiLeft - 240; + + hookList.add("init"); + + 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")); + } catch (IOException e) { + e.printStackTrace(); + } + + for(ClassPath.ClassInfo e1 : list){ + ClassPath.ClassInfo classLoader = e1; + 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())) { + String eventName = c1.getName(); + int i = eventName.lastIndexOf("."); + eventName = StringUtils.uncapitalize(eventName.substring(i + 1).replace("$", "")); + + hookList.add(eventName); + } + } + } + } + hooks.setUnsortedList(hookList); + addScroll(hooks); + + GuiNpcLabel hookLabel = new GuiNpcLabel(0, "script.hooks", hooks.guiLeft, guiTop + 5); + hookLabel.color = 0xaaaaaa; + addLabel(hookLabel); + + EventScriptContainer var7 = (EventScriptContainer)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; + this.addButton(new GuiNpcButton(102, left1, this.guiTop + yoffset, 60, 20, "gui.clear")); + this.addButton(new GuiNpcButton(101, left1 + 61, this.guiTop + yoffset, 60, 20, "gui.paste")); + this.addButton(new GuiNpcButton(100, left1, this.guiTop + 21 + yoffset, 60, 20, "gui.copy")); + this.addButton(new GuiNpcButton(105, left1 + 61, this.guiTop + 21 + yoffset, 60, 20, "gui.remove")); + this.addButton(new GuiNpcButton(107, left1, this.guiTop + 66 + yoffset, 80, 20, "script.loadscript")); + GuiCustomScroll scroll = (new GuiCustomScroll(this, 0)).setUnselectable(); + scroll.setSize(100, (int)((double)this.ySize * 0.54D) - yoffset * 2); + scroll.guiLeft = left1; + scroll.guiTop = this.guiTop + 88 + yoffset; + if(var7 != null) { + scroll.setList(var7.scripts); + } + + this.addScroll(scroll); + } else { + GuiNpcTextArea var8 = new GuiNpcTextArea(2, this, this.guiLeft + 4 + yoffset, this.guiTop + 6 + yoffset, this.xSize - 160 - yoffset, (int)((float)this.ySize * 0.92F) - yoffset * 2, this.getConsoleText()); + var8.enabled = false; + this.addTextField(var8); + int var9 = this.guiLeft + this.xSize - 150; + this.addButton(new GuiNpcButton(100, var9, this.guiTop + 125, 60, 20, "gui.copy")); + this.addButton(new GuiNpcButton(102, var9, this.guiTop + 146, 60, 20, "gui.clear")); + this.addLabel(new GuiNpcLabel(1, "script.language", var9, this.guiTop + 15)); + this.addButton(new GuiNpcButton(103, var9 + 60, this.guiTop + 10, 80, 20, (String[])this.languages.keySet().toArray(new String[this.languages.keySet().size()]), this.getScriptIndex())); + this.getButton(103).enabled = this.languages.size() > 0; + this.addLabel(new GuiNpcLabel(2, "gui.enabled", var9, this.guiTop + 36)); + this.addButton(new GuiNpcButton(104, var9 + 60, this.guiTop + 31, 50, 20, new String[]{"gui.no", "gui.yes"}, this.handler.getEnabled()?1:0)); + if(this.player.worldObj.isRemote) { + this.addButton(new GuiNpcButton(106, var9, this.guiTop + 55, 150, 20, "script.openfolder")); + } + + this.addButton(new GuiNpcButton(109, var9, this.guiTop + 78, 80, 20, "gui.website")); + this.addButton(new GuiNpcButton(112, var9 + 81, this.guiTop + 78, 80, 20, "gui.forum")); + this.addButton(new GuiNpcButton(110, var9, this.guiTop + 99, 80, 20, "script.apidoc")); + this.addButton(new GuiNpcButton(111, var9 + 81, this.guiTop + 99, 80, 20, "script.apisrc")); + } + + this.xSize = 420; + this.ySize = 256; + } + + @Override + public void customScrollClicked(int i, int j, int k, GuiCustomScroll scroll) { + //this.handler.getScripts().get(this.activeTab - 1).setType(scroll.getSelected().replace("playerscript.","")); + } + + @Override + public void unFocused(GuiNpcTextField textfield) { + /*if(textfield.id == 1){ + this.handler.getScripts().get(this.activeTab - 1).setType(textfield.getText()); + }*/ + } + + /*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(); + Iterator var3 = map.entrySet().iterator(); + + while(var3.hasNext()) { + Entry entry = (Entry)var3.next(); + builder.insert(0, new Date((Long)entry.getKey()) + (String)entry.getValue() + "\n"); + } + + return builder.toString(); + } + + private int getScriptIndex() { + int i = 0; + + for(Iterator var2 = this.languages.keySet().iterator(); var2.hasNext(); ++i) { + String language = (String)var2.next(); + if(language.equalsIgnoreCase(this.handler.getLanguage())) { + return i; + } + } + + return 0; + } + + public void confirmClicked(boolean flag, int i) { + if(flag) { + if(i == 0) { + this.openLink("http://www.kodevelopment.nl/minecraft/customnpcs/scripting"); + } + + if(i == 1) { + this.openLink("http://www.kodevelopment.nl/customnpcs/api/"); + } + + if(i == 2) { + this.openLink("http://www.kodevelopment.nl/minecraft/customnpcs/scripting"); + } + + if(i == 3) { + this.openLink("http://www.minecraftforge.net/forum/index.php/board,122.0.html"); + } + + if(i == 10) { + this.handler.getScripts().remove(this.activeTab - 1); + this.activeTab = 0; + } + } + + this.displayGuiScreen(this); + } + + @Override + protected void actionPerformed(GuiButton guibutton) { + if(guibutton.id >= 0 && guibutton.id < scriptLimit) { + this.setScript(); + this.activeTab = guibutton.id; + this.initGui(); + } + + if(guibutton.id == scriptLimit) { + this.handler.getScripts().add(new EventScriptContainer(this.handler)); + this.activeTab = this.handler.getScripts().size(); + this.initGui(); + } + + if(guibutton.id == 109) { + this.displayGuiScreen(new GuiConfirmOpenLink(this, "http://www.kodevelopment.nl/minecraft/customnpcs/scripting", 0, true)); + } + + if(guibutton.id == 110) { + this.displayGuiScreen(new GuiConfirmOpenLink(this, "http://www.kodevelopment.nl/customnpcs/api/", 1, true)); + } + + if(guibutton.id == 111) { + this.displayGuiScreen(new GuiConfirmOpenLink(this, "https://github.com/Noppes/CustomNPCsAPI", 2, true)); + } + + if(guibutton.id == 112) { + this.displayGuiScreen(new GuiConfirmOpenLink(this, "http://www.minecraftforge.net/forum/index.php/board,122.0.html", 3, true)); + } + + if(guibutton.id == 100) { + NoppesStringUtils.setClipboardContents((this.getTextField(2)).getText()); + } + + if(guibutton.id == 101) { + (this.getTextField(2)).setText(NoppesStringUtils.getClipboardContents()); + } + + EventScriptContainer container; + if(guibutton.id == 102) { + if(this.activeTab > 0) { + container = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + container.script = ""; + } else { + this.handler.clearConsole(); + } + + this.initGui(); + } + + if(guibutton.id == 103) { + this.handler.setLanguage(((GuiNpcButton)guibutton).displayString); + } + + if(guibutton.id == 104) { + this.handler.setEnabled((((GuiNpcButton)guibutton).getValue() == 1)); + } + + if(guibutton.id == 105) { + GuiYesNo container1 = new GuiYesNo(this, "", ((GuiNpcButton)guibutton).displayString, 10); + this.displayGuiScreen(container1); + } + + if(guibutton.id == 106) { + NoppesUtil.openFolder(ScriptController.Instance.dir); + } + + if(guibutton.id == 107) { + container = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + if(container == null) { + this.handler.getScripts().add(container = new EventScriptContainer(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); + if(container != null) { + this.setScript(); + this.AWTWindow = new GuiJTextArea(container.script).setListener(this); + } + } + + } + + private void setScript() { + if(this.activeTab > 0) { + EventScriptContainer container = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + if(container == null) { + this.handler.getScripts().add(container = new EventScriptContainer(this.handler)); + } + + String text = (this.getTextField(2)).getText(); + text = text.replace("\r\n", "\n"); + text = text.replace("\r", "\n"); + container.script = text; + } + + } + + public void setGuiData(NBTTagCompound compound) { + NBTTagList data = compound.getTagList("Languages", 10); + HashMap languages = new HashMap(); + + for(int i = 0; i < data.tagCount(); ++i) { + NBTTagCompound comp = data.getCompoundTagAt(i); + ArrayList scripts = new ArrayList(); + NBTTagList list = comp.getTagList("Scripts", 8); + + for(int j = 0; j < list.tagCount(); ++j) { + scripts.add(list.getStringTagAt(j)); + } + + languages.put(comp.getString("Language"), scripts); + } + + this.languages = languages; + this.initGui(); + } + + public void save() { + this.setScript(); + } + + public void textUpdate(String text) { + EventScriptContainer container = (EventScriptContainer)this.handler.getScripts().get(this.activeTab - 1); + if(container != null) { + container.script = text; + } + + } + + @Override + public void saveText(String text) { + EventScriptContainer container = handler.getScripts().get(activeTab); + if(container != null) + container.script = text; + initGui(); + } +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java new file mode 100644 index 000000000..79dd8753c --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java @@ -0,0 +1,37 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.client.gui.script; + +import net.minecraft.entity.player.EntityPlayer; +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.PlayerDataScript; + +public class GuiScriptPlayers extends GuiScriptInterface { + private PlayerDataScript script = new PlayerDataScript((EntityPlayer)null); + + public GuiScriptPlayers() { + this.handler = this.script; + Client.sendData(EnumPacketServer.ScriptPlayerGet); + } + + public void setGuiData(NBTTagCompound compound) { + this.script.readFromNBT(compound); + super.setGuiData(compound); + } + + public void save() { + super.save(); + 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/client/gui/util/GuiContainerNPCInterface.java b/src/main/java/noppes/npcs/client/gui/util/GuiContainerNPCInterface.java index dbfa56b76..236556aa3 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiContainerNPCInterface.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiContainerNPCInterface.java @@ -109,7 +109,7 @@ public abstract class GuiContainerNPCInterface extends GuiContainer for(GuiNpcTextField tf : new ArrayList(textfields.values())) tf.textboxKeyTyped(c, i); - if (closeOnEsc && (i == 1 || i == mc.gameSettings.keyBindInventory.getKeyCode() && !GuiNpcTextField.isActive())) + if (closeOnEsc && (i == 1 || i == mc.gameSettings.keyBindInventory.getKeyCode() && !GuiNpcTextField.isFieldActive())) close(); } } diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiCustomScroll.java b/src/main/java/noppes/npcs/client/gui/util/GuiCustomScroll.java index f567c7043..362400803 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiCustomScroll.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiCustomScroll.java @@ -280,4 +280,7 @@ public class GuiCustomScroll extends GuiScreen return this; } + public boolean isMouseOver(int x, int y) { + return x >= this.guiLeft && x <= this.guiLeft + this.xSize && y >= this.guiTop && y <= this.guiTop + this.ySize; + } } diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java b/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java index 9adce5233..cb6e52ce0 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java @@ -144,7 +144,7 @@ public abstract class GuiNPCInterface extends GuiScreen for(GuiNpcTextField tf : textfields.values()) tf.textboxKeyTyped(c, i); - if (closeOnEsc && (i == 1 || !GuiNpcTextField.isActive() && isInventoryKey(i))){ + if (closeOnEsc && (i == 1 || !GuiNpcTextField.isFieldActive() && isInventoryKey(i))){ close(); } } diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextArea.java b/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextArea.java index 07837b115..e7560b25c 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextArea.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextArea.java @@ -15,7 +15,7 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; -public class GuiNpcTextArea extends GuiNpcTextField{ +public class GuiNpcTextArea extends GuiNpcTextField implements IGui{ public boolean inMenu = true; public boolean numbersOnly = false; private int posX,posY,width,height; @@ -307,4 +307,24 @@ public class GuiNpcTextArea extends GuiNpcTextField{ } drawTexturedModalRect(x, y, width, 11, 5, 1); } + + @Override + public int getID() { + return 0; + } + + @Override + public void drawScreen(int var1, int var2) { + + } + + @Override + public void updateScreen() { + + } + + @Override + public boolean isActive() { + return isFieldActive(); + } } 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 4aef50d55..5b0ba8454 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java @@ -27,7 +27,7 @@ public class GuiNpcTextField extends GuiTextField{ listener = (ITextfieldListener) parent; } - public static boolean isActive(){ + public static boolean isFieldActive(){ return activeTextfield != null; } diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiTextArea.java b/src/main/java/noppes/npcs/client/gui/util/GuiTextArea.java new file mode 100644 index 000000000..5103da22e --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/util/GuiTextArea.java @@ -0,0 +1,473 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.client.gui.util; + +import java.awt.Font; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.util.ChatAllowedCharacters; +import net.minecraftforge.client.GuiIngameForge; +import noppes.npcs.CustomNpcs; +import noppes.npcs.NoppesStringUtils; +import noppes.npcs.client.gui.util.TextContainer.LineData; +import noppes.npcs.config.TrueTypeFont; +import org.lwjgl.input.Mouse; + +public class GuiTextArea extends Gui implements IGui, IKeyListener, IMouseListener { + public int id; + public int x; + public int y; + public int width; + public int height; + private int cursorCounter; + private ITextChangeListener listener; + private static TrueTypeFont font; + public String text = null; + private TextContainer container = null; + public boolean active = false; + public boolean enabled = true; + public boolean visible = true; + public boolean clicked = false; + public boolean doubleClicked = false; + public boolean clickScrolling = false; + private int startSelection; + private int endSelection; + private int cursorPosition; + private int scrolledLine = 0; + private boolean enableCodeHighlighting = false; + private static final char colorChar = '\uffff'; + public List undoList = new ArrayList(); + public List redoList = new ArrayList(); + public boolean undoing = false; + private long lastClicked = 0L; + + public GuiTextArea(int id, int x, int y, int width, int height, String text) { + this.id = id; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.undoing = true; + this.setText(text); + this.undoing = false; + font.setSpecial('\uffff'); + } + + public void drawScreen(int xMouse, int yMouse) { + if(this.visible) { + drawRect(this.x - 1, this.y - 1, this.x + this.width + 1, this.y + this.height + 1, -6250336); + drawRect(this.x, this.y, this.x + this.width, this.y + this.height, -16777216); + this.container.visibleLines = this.height / this.container.lineHeight; + int startBracket; + if(this.clicked) { + this.clicked = Mouse.isButtonDown(0); + startBracket = this.getSelectionPos(xMouse, yMouse); + if(startBracket != this.cursorPosition) { + if(this.doubleClicked) { + this.startSelection = this.endSelection = this.cursorPosition; + this.doubleClicked = false; + } + + this.setCursor(startBracket, true); + } + } else if(this.doubleClicked) { + this.doubleClicked = false; + } + + if(this.clickScrolling) { + this.clickScrolling = Mouse.isButtonDown(0); + startBracket = this.container.linesCount - this.container.visibleLines; + this.scrolledLine = Math.min(Math.max((int)(1.0F * (float)startBracket * (float)(yMouse - this.y) / (float)this.height), 0), startBracket); + } + + startBracket = 0; + int endBracket = 0; + if(this.endSelection - this.startSelection == 1 || this.startSelection == this.endSelection && this.startSelection < this.text.length()) { + char list = this.text.charAt(this.startSelection); + int wordHightLight = 0; + if(list == 123) { + wordHightLight = this.findClosingBracket(this.text.substring(this.startSelection), '{', '}'); + } else if(list == 91) { + wordHightLight = this.findClosingBracket(this.text.substring(this.startSelection), '[', ']'); + } else if(list == 40) { + wordHightLight = this.findClosingBracket(this.text.substring(this.startSelection), '(', ')'); + } else if(list == 125) { + wordHightLight = this.findOpeningBracket(this.text.substring(0, this.startSelection + 1), '{', '}'); + } else if(list == 93) { + wordHightLight = this.findOpeningBracket(this.text.substring(0, this.startSelection + 1), '[', ']'); + } else if(list == 41) { + wordHightLight = this.findOpeningBracket(this.text.substring(0, this.startSelection + 1), '(', ')'); + } + + if(wordHightLight != 0) { + startBracket = this.startSelection; + endBracket = this.startSelection + wordHightLight; + } + } + + ArrayList var15 = new ArrayList(this.container.lines); + String var18 = null; + if(this.startSelection != this.endSelection) { + Matcher sbSize = this.container.regexWord.matcher(this.text); + + while(sbSize.find()) { + if(sbSize.start() == this.startSelection && sbSize.end() == this.endSelection) { + var18 = this.text.substring(this.startSelection, this.endSelection); + } + } + } + + int var16; + for(var16 = 0; var16 < var15.size(); ++var16) { + LineData posX = (LineData)var15.get(var16); + String posY = posX.text; + int w = posY.length(); + int yPos; + int posX1; + int posY1; + if(startBracket != endBracket) { + if(startBracket >= posX.start && startBracket < posX.end) { + yPos = font.width(posY.substring(0, startBracket - posX.start)); + posX1 = font.width(posY.substring(0, startBracket - posX.start + 1)) + 1; + posY1 = this.y + 1 + (var16 - this.scrolledLine) * this.container.lineHeight; + drawRect(this.x + 1 + yPos, posY1, this.x + 1 + posX1, posY1 + this.container.lineHeight + 1, -1728001024); + } + + if(endBracket >= posX.start && endBracket < posX.end) { + yPos = font.width(posY.substring(0, endBracket - posX.start)); + posX1 = font.width(posY.substring(0, endBracket - posX.start + 1)) + 1; + posY1 = this.y + 1 + (var16 - this.scrolledLine) * this.container.lineHeight; + drawRect(this.x + 1 + yPos, posY1, this.x + 1 + posX1, posY1 + this.container.lineHeight + 1, -1728001024); + } + } + + if(var16 >= this.scrolledLine && var16 < this.scrolledLine + this.container.visibleLines) { + if(var18 != null) { + Matcher var20 = this.container.regexWord.matcher(posY); + + while(var20.find()) { + if(posY.substring(var20.start(), var20.end()).equals(var18)) { + posX1 = font.width(posY.substring(0, var20.start())); + posY1 = font.width(posY.substring(0, var20.end())) + 1; + int posY2 = this.y + 1 + (var16 - this.scrolledLine) * this.container.lineHeight; + drawRect(this.x + 1 + posX1, posY2, this.x + 1 + posY1, posY2 + this.container.lineHeight + 1, -1728033792); + } + } + } + + if(this.startSelection != this.endSelection && this.endSelection > posX.start && this.startSelection <= posX.end && this.startSelection < posX.end) { + yPos = font.width(posY.substring(0, Math.max(this.startSelection - posX.start, 0))); + posX1 = font.width(posY.substring(0, Math.min(this.endSelection - posX.start, w))) + 1; + posY1 = this.y + 1 + (var16 - this.scrolledLine) * this.container.lineHeight; + drawRect(this.x + 1 + yPos, posY1, this.x + 1 + posX1, posY1 + this.container.lineHeight + 1, -1728052993); + } + + yPos = this.y + (var16 - this.scrolledLine) * this.container.lineHeight + 1; + font.draw(posX.getFormattedString(), (float)(this.x + 1), (float)yPos, -2039584); + if(this.active && this.isEnabled() && this.cursorCounter / 6 % 2 == 0 && this.cursorPosition >= posX.start && this.cursorPosition < posX.end) { + posX1 = this.x + font.width(posY.substring(0, this.cursorPosition - posX.start)); + drawRect(posX1 + 1, yPos, posX1 + 2, yPos + 1 + this.container.lineHeight, -3092272); + } + } + } + + if(this.hasVerticalScrollbar()) { + Minecraft.getMinecraft().renderEngine.bindTexture(GuiCustomScroll.resource); + + var16 = Math.max((int)(1.0F * (float)this.container.visibleLines / (float)this.container.linesCount * (float)this.height), 2); + int var17 = this.x + this.width - 6; + int var19 = (int)((float)this.y + 1.0F * (float)this.scrolledLine / (float)this.container.linesCount * (float)(this.height - 4)) + 1; + drawRect(var17, var19, var17 + 5, var19 + var16, -2039584); + } + + } + } + + private int findClosingBracket(String str, char s, char e) { + int found = 0; + char[] chars = str.toCharArray(); + + for(int i = 0; i < chars.length; ++i) { + char c = chars[i]; + if(c == s) { + ++found; + } else if(c == e) { + --found; + if(found == 0) { + return i; + } + } + } + + return 0; + } + + private int findOpeningBracket(String str, char s, char e) { + int found = 0; + char[] chars = str.toCharArray(); + + for(int i = chars.length - 1; i >= 0; --i) { + char c = chars[i]; + if(c == e) { + ++found; + } else if(c == s) { + --found; + if(found == 0) { + return i - chars.length + 1; + } + } + } + + return 0; + } + + private int getSelectionPos(int xMouse, int yMouse) { + xMouse -= this.x + 1; + yMouse -= this.y + 1; + ArrayList list = new ArrayList(this.container.lines); + + for(int i = 0; i < list.size(); ++i) { + LineData data = (LineData)list.get(i); + if(i >= this.scrolledLine && i < this.scrolledLine + this.container.visibleLines) { + int yPos = (i - this.scrolledLine) * this.container.lineHeight; + if(yMouse >= yPos && yMouse < yPos + this.container.lineHeight) { + int lineWidth = 0; + char[] chars = data.text.toCharArray(); + + for(int j = 1; j <= chars.length; ++j) { + int w = font.width(data.text.substring(0, j)); + if(xMouse < lineWidth + (w - lineWidth) / 2) { + return data.start + j - 1; + } + + lineWidth = w; + } + + return data.end - 1; + } + } + } + + return this.container.text.length(); + } + + public int getID() { + return this.id; + } + + + public void keyTyped(char c, int i) { + if(this.active && this.isEnabled()) { + if(i == 15) { + this.addText(" "); + } + + if(i == 28) { + this.addText(Character.toString('\n') + this.getIndentCurrentLine()); + } + + if(ChatAllowedCharacters.isAllowedCharacter(c)) { + this.addText(Character.toString(c)); + } + } + } + + private String getIndentCurrentLine() { + Iterator var1 = this.container.lines.iterator(); + + LineData data; + do { + if(!var1.hasNext()) { + return ""; + } + + data = (LineData)var1.next(); + } while(this.cursorPosition <= data.start || this.cursorPosition > data.end); + + int i; + for(i = 0; i < data.text.length() && data.text.charAt(i) == 32; ++i) { + ; + } + + return data.text.substring(0, i); + } + + private void setCursor(int i, boolean select) { + i = Math.min(Math.max(i, 0), this.text.length()); + if(i != this.cursorPosition) { + if(!select) { + this.endSelection = this.startSelection = this.cursorPosition = i; + } else { + int diff = this.cursorPosition - i; + if(this.cursorPosition == this.startSelection) { + this.startSelection -= diff; + } else if(this.cursorPosition == this.endSelection) { + this.endSelection -= diff; + } + + if(this.startSelection > this.endSelection) { + int j = this.endSelection; + this.endSelection = this.startSelection; + this.startSelection = j; + } + + this.cursorPosition = i; + } + } + } + + private void addText(String s) { + this.setText(this.getSelectionBeforeText() + s + this.getSelectionAfterText()); + this.endSelection = this.startSelection = this.cursorPosition = this.startSelection + s.length(); + } + + private int cursorUp() { + for(int i = 0; i < this.container.lines.size(); ++i) { + LineData data = (LineData)this.container.lines.get(i); + if(this.cursorPosition >= data.start && this.cursorPosition < data.end) { + if(i == 0) { + return 0; + } + + int var10000 = this.cursorPosition - data.start; + return this.getSelectionPos(this.x + 1 + font.width(data.text.substring(0, this.cursorPosition - data.start)), this.y + 1 + (i - 1 - this.scrolledLine) * this.container.lineHeight); + } + } + + return 0; + } + + private int cursorDown() { + for(int i = 0; i < this.container.lines.size(); ++i) { + LineData data = (LineData)this.container.lines.get(i); + if(this.cursorPosition >= data.start && this.cursorPosition < data.end) { + int var10000 = this.cursorPosition - data.start; + return this.getSelectionPos(this.x + 1 + font.width(data.text.substring(0, this.cursorPosition - data.start)), this.y + 1 + (i + 1 - this.scrolledLine) * this.container.lineHeight); + } + } + + return this.text.length(); + } + + public String getSelectionBeforeText() { + return this.startSelection == 0?"":this.text.substring(0, this.startSelection); + } + + public String getSelectionAfterText() { + return this.text.substring(this.endSelection); + } + + public boolean mouseClicked(int xMouse, int yMouse, int mouseButton) { + this.active = xMouse >= this.x && xMouse < this.x + this.width && yMouse >= this.y && yMouse < this.y + this.height; + if(this.active) { + this.startSelection = this.endSelection = this.cursorPosition = this.getSelectionPos(xMouse, yMouse); + this.clicked = mouseButton == 0; + this.doubleClicked = false; + long time = System.currentTimeMillis(); + if(this.clicked && this.container.linesCount * this.container.lineHeight > this.height && xMouse > this.x + this.width - 8) { + this.clicked = false; + this.clickScrolling = true; + } else if(time - this.lastClicked < 500L) { + this.doubleClicked = true; + Matcher m = this.container.regexWord.matcher(this.text); + + while(m.find()) { + if(this.cursorPosition > m.start() && this.cursorPosition < m.end()) { + this.startSelection = m.start(); + this.endSelection = m.end(); + break; + } + } + } + + this.lastClicked = time; + } + + return this.active; + } + + public void updateScreen() { + ++this.cursorCounter; + int k2 = Mouse.getDWheel(); + if(k2 != 0) { + this.scrolledLine += k2 > 0?-1:1; + this.scrolledLine = Math.max(Math.min(this.scrolledLine, this.container.linesCount - this.height / this.container.lineHeight), 0); + } + + } + + public void setText(String text) { + text = text.replace("\r", ""); + if(this.text == null || !this.text.equals(text)) { + if(this.listener != null) { + this.listener.textUpdate(text); + } + + if(!this.undoing) { + this.undoList.add(new GuiTextArea.UndoData(this.text, this.cursorPosition)); + this.redoList.clear(); + } + + this.text = text; + this.container = new TextContainer(text); + this.container.init(font, this.width, this.height); + if(this.enableCodeHighlighting) { + this.container.formatCodeText(); + } + + if(this.scrolledLine > this.container.linesCount - this.container.visibleLines) { + this.scrolledLine = Math.max(0, this.container.linesCount - this.container.visibleLines); + } + + } + } + + public String getText() { + return this.text; + } + + public boolean isEnabled() { + return this.enabled && this.visible; + } + + public boolean hasVerticalScrollbar() { + return this.container.visibleLines < this.container.linesCount; + } + + public void enableCodeHighlighting() { + this.enableCodeHighlighting = true; + this.container.formatCodeText(); + } + + public void setListener(ITextChangeListener listener) { + this.listener = listener; + } + + public boolean isActive() { + return this.active; + } + + static { + font = new TrueTypeFont(new Font("Arial Unicode MS", 0, CustomNpcs.FontSize), 1.0F); + } + + class UndoData { + public String text; + public int cursorPosition; + + public UndoData(String text, int cursorPosition) { + this.text = text; + this.cursorPosition = cursorPosition; + } + } +} diff --git a/src/main/java/noppes/npcs/client/gui/util/IGui.java b/src/main/java/noppes/npcs/client/gui/util/IGui.java new file mode 100644 index 000000000..cc0d20135 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/util/IGui.java @@ -0,0 +1,16 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.client.gui.util; + +public interface IGui { + int getID(); + + void drawScreen(int var1, int var2); + + void updateScreen(); + + boolean isActive(); +} diff --git a/src/main/java/noppes/npcs/client/gui/util/IKeyListener.java b/src/main/java/noppes/npcs/client/gui/util/IKeyListener.java new file mode 100644 index 000000000..643352735 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/util/IKeyListener.java @@ -0,0 +1,10 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.client.gui.util; + +public interface IKeyListener { + void keyTyped(char var1, int var2); +} diff --git a/src/main/java/noppes/npcs/client/gui/util/IMouseListener.java b/src/main/java/noppes/npcs/client/gui/util/IMouseListener.java new file mode 100644 index 000000000..7204139b4 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/util/IMouseListener.java @@ -0,0 +1,10 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.client.gui.util; + +public interface IMouseListener { + boolean mouseClicked(int var1, int var2, int var3); +} diff --git a/src/main/java/noppes/npcs/client/gui/util/ITextChangeListener.java b/src/main/java/noppes/npcs/client/gui/util/ITextChangeListener.java new file mode 100644 index 000000000..7a5a2d302 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/util/ITextChangeListener.java @@ -0,0 +1,10 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.client.gui.util; + +public interface ITextChangeListener { + void textUpdate(String var1); +} diff --git a/src/main/java/noppes/npcs/client/gui/util/TextContainer.java b/src/main/java/noppes/npcs/client/gui/util/TextContainer.java new file mode 100644 index 000000000..8d8fc3b6d --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/util/TextContainer.java @@ -0,0 +1,225 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.client.gui.util; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import noppes.npcs.config.TrueTypeFont; + +public class TextContainer { + private static final char colorChar = '\uffff'; + private static final Comparator MarkUpComparator = (o1, o2) -> { + return o1.start > o2.start?1:(o1.start < o2.start?-1:0); + }; + public final Pattern regexString = Pattern.compile("([\"\'])(?:(?=(\\\\?))\\2.)*?\\1", 8); + public final Pattern regexFunction = Pattern.compile("\\b(if|else|switch|with|for|while|in|var|const|let|throw|then|function|continue|break|foreach|return|try|catch|finally|do|this|typeof|instanceof|new)(?=[^\\w])"); + public final Pattern regexWord = Pattern.compile("[\\p{L}-]+|\\n|$"); + public final Pattern regexNumber = Pattern.compile("\\b-?(?:0[xX][\\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?(?:[fFbBdDlLsS])?|NaN|null|Infinity|unidentified|true|false)\\b"); + public final Pattern regexComment = Pattern.compile("\\/\\*[\\s\\S]*?(?:\\*\\/|$)|\\/\\/.*|#.*"); + public String text; + public List makeup = new ArrayList(); + public List lines = new ArrayList(); + private TrueTypeFont font; + public int lineHeight; + public int totalHeight; + public int visibleLines = 1; + public int linesCount; + + public TextContainer(String text) { + this.text = text; + text.replaceAll("\\r?\\n|\\r", "\n"); + double l = 1.0D; + } + + public void init(TrueTypeFont font, int width, int height) { + this.font = font; + this.lineHeight = font.height(this.text); + if(this.lineHeight == 0) { + this.lineHeight = 12; + } + + String[] split = this.text.split("\n"); + int totalChars = 0; + String[] var6 = split; + int var7 = split.length; + + for(int var8 = 0; var8 < var7; ++var8) { + String l = var6[var8]; + StringBuilder line = new StringBuilder(); + Matcher m = this.regexWord.matcher(l); + + for(int i = 0; m.find(); i = m.start()) { + String word = l.substring(i, m.start()); + if(font.width(line + word) > width - 10) { + this.lines.add(new TextContainer.LineData(line.toString(), totalChars, totalChars + line.length())); + totalChars += line.length(); + line = new StringBuilder(); + } + + line.append(word); + } + + this.lines.add(new TextContainer.LineData(line.toString(), totalChars, totalChars + line.length() + 1)); + totalChars += line.length() + 1; + } + + this.linesCount = this.lines.size(); + this.totalHeight = this.linesCount * this.lineHeight; + this.visibleLines = Math.max(height / this.lineHeight, 1); + } + + public void formatCodeText() { + TextContainer.MarkUp markup = null; + + for(int start = 0; (markup = this.getNextMatching(start)) != null; start = markup.end) { + this.makeup.add(markup); + } + + } + + private TextContainer.MarkUp getNextMatching(int start) { + TextContainer.MarkUp markup = null; + String s = this.text.substring(start); + Matcher matcher = this.regexNumber.matcher(s); + if(matcher.find()) { + markup = new TextContainer.MarkUp(matcher.start(), matcher.end(), '6', 0); + } + + matcher = this.regexFunction.matcher(s); + TextContainer.MarkUp markup2; + if(matcher.find()) { + markup2 = new TextContainer.MarkUp(matcher.start(), matcher.end(), '2', 0); + if(this.compareMarkUps(markup, markup2)) { + markup = markup2; + } + } + + matcher = this.regexString.matcher(s); + if(matcher.find()) { + markup2 = new TextContainer.MarkUp(matcher.start(), matcher.end(), '4', 7); + if(this.compareMarkUps(markup, markup2)) { + markup = markup2; + } + } + + matcher = this.regexComment.matcher(s); + if(matcher.find()) { + markup2 = new TextContainer.MarkUp(matcher.start(), matcher.end(), '8', 7); + if(this.compareMarkUps(markup, markup2)) { + markup = markup2; + } + } + + if(markup != null) { + markup.start += start; + markup.end += start; + } + + return markup; + } + + public boolean compareMarkUps(TextContainer.MarkUp mu1, TextContainer.MarkUp mu2) { + return mu1 == null?true:mu1.start > mu2.start; + } + + public void addMakeUp(int start, int end, char c, int level) { + if(this.removeConflictingMarkUp(start, end, level)) { + this.makeup.add(new TextContainer.MarkUp(start, end, c, level)); + } + } + + private boolean removeConflictingMarkUp(int start, int end, int level) { + ArrayList conflicting = new ArrayList(); + Iterator var5 = this.makeup.iterator(); + + while(true) { + TextContainer.MarkUp m; + do { + if(!var5.hasNext()) { + this.makeup.removeAll(conflicting); + return true; + } + + m = (TextContainer.MarkUp)var5.next(); + } while((start < m.start || start > m.end) && (end < m.start || end > m.end) && (start >= m.start || end <= m.start)); + + if(level < m.level || level == m.level && m.start <= start) { + return false; + } + + conflicting.add(m); + } + } + + public String getFormattedString() { + StringBuilder builder = new StringBuilder(this.text); + Iterator var2 = this.makeup.iterator(); + + while(var2.hasNext()) { + TextContainer.MarkUp entry = (TextContainer.MarkUp)var2.next(); + builder.insert(entry.start, Character.toString('\uffff') + Character.toString(entry.c)); + builder.insert(entry.end, Character.toString('\uffff') + Character.toString('r')); + } + + return builder.toString(); + } + + class MarkUp { + public int start; + public int end; + public int level; + public char c; + + public MarkUp(int start, int end, char c, int level) { + this.start = start; + this.end = end; + this.c = c; + this.level = level; + } + } + + class LineData { + public String text; + public int start; + public int end; + + public LineData(String text, int start, int end) { + this.text = text; + this.start = start; + this.end = end; + } + + public String getFormattedString() { + StringBuilder builder = new StringBuilder(this.text); + int found = 0; + Iterator var3 = TextContainer.this.makeup.iterator(); + + while(var3.hasNext()) { + TextContainer.MarkUp entry = (TextContainer.MarkUp)var3.next(); + if(entry.start >= this.start && entry.start < this.end) { + builder.insert(entry.start - this.start + found * 2, Character.toString('\uffff') + Character.toString(entry.c)); + ++found; + } + + if(entry.start < this.start && entry.end > this.start) { + builder.insert(0, Character.toString('\uffff') + Character.toString(entry.c)); + ++found; + } + + if(entry.end >= this.start && entry.end < this.end) { + builder.insert(entry.end - this.start + found * 2, Character.toString('\uffff') + Character.toString('r')); + ++found; + } + } + + return builder.toString(); + } + } +} diff --git a/src/main/java/noppes/npcs/client/model/ModelMPM.java b/src/main/java/noppes/npcs/client/model/ModelMPM.java index 5e7a4ece2..58f35c2bb 100644 --- a/src/main/java/noppes/npcs/client/model/ModelMPM.java +++ b/src/main/java/noppes/npcs/client/model/ModelMPM.java @@ -8,7 +8,9 @@ import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.MathHelper; +import noppes.npcs.CustomItems; import noppes.npcs.ModelPartConfig; import noppes.npcs.ModelPartData; import noppes.npcs.client.ClientProxy; @@ -294,6 +296,9 @@ public class ModelMPM extends ModelNPCMale{ @Override public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7){ EntityCustomNpc npc = (EntityCustomNpc) par1Entity; + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if(npc.scriptInvisibleToPlayer(Minecraft.getMinecraft().thePlayer) && (player.getHeldItem() == null || player.getHeldItem().getItem() != CustomItems.wand)) + return; if(entityModel != null){ if(!isArmor){ @@ -311,7 +316,8 @@ public class ModelMPM extends ModelNPCMale{ } } else{ - alpha = npc.isInvisible() && !npc.isInvisibleToPlayer(Minecraft.getMinecraft().thePlayer)?0.15f:1; + alpha = npc.isInvisible() && !npc.isInvisibleToPlayer(player) ? 0.15f : 1; + setPlayerData(npc); currentlyPlayerTexture = true; setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity); diff --git a/src/main/java/noppes/npcs/config/TrueTypeFont.java b/src/main/java/noppes/npcs/config/TrueTypeFont.java new file mode 100644 index 000000000..15cbd65dd --- /dev/null +++ b/src/main/java/noppes/npcs/config/TrueTypeFont.java @@ -0,0 +1,340 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.config; + +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.GraphicsEnvironment; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.util.ResourceLocation; +import noppes.npcs.util.LRUHashMap; +import org.lwjgl.opengl.GL11; + +public class TrueTypeFont { + private static final int MaxWidth = 512; + private static final List allFonts = Arrays.asList(GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts()); + private List usedFonts = new ArrayList(); + private LinkedHashMap textcache = new LRUHashMap(100); + private Map glyphcache = new HashMap(); + private List textures = new ArrayList(); + private Font font; + private int lineHeight = 1; + private Graphics2D globalG = (Graphics2D)(new BufferedImage(1, 1, 2)).getGraphics(); + public float scale = 1.0F; + private int specialChar = 167; + + public TrueTypeFont(Font font, float scale) { + this.font = font; + this.scale = scale; + this.globalG.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + this.lineHeight = this.globalG.getFontMetrics(font).getHeight(); + } + + public TrueTypeFont(ResourceLocation resource, int fontSize, float scale) throws IOException, FontFormatException { + InputStream stream = Minecraft.getMinecraft().getResourceManager().getResource(resource).getInputStream(); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + Font font = Font.createFont(0, stream); + ge.registerFont(font); + this.font = font.deriveFont(0, (float)fontSize); + this.scale = scale; + this.globalG.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + this.lineHeight = this.globalG.getFontMetrics(font).getHeight(); + } + + public void setSpecial(char c) { + this.specialChar = c; + } + + public void draw(String text, float x, float y, int color) { + TrueTypeFont.GlyphCache cache = this.getOrCreateCache(text); + float r = (float)(color >> 16 & 255) / 255.0F; + float g = (float)(color >> 8 & 255) / 255.0F; + float b = (float)(color & 255) / 255.0F; + GL11.glColor4f(r, g, b, 1.0F); + //GlStateManager.func_179147_l(); + GL11.glPushMatrix(); + GL11.glTranslatef(x, y, 0.0F); + GL11.glScalef(this.scale, this.scale, 1.0F); + float i = 0.0F; + Iterator var10 = cache.glyphs.iterator(); + + while(var10.hasNext()) { + TrueTypeFont.Glyph gl = (TrueTypeFont.Glyph)var10.next(); + if(gl.type != TrueTypeFont.GlyphType.NORMAL) { + if(gl.type == TrueTypeFont.GlyphType.RESET) { + GL11.glColor4f(r, g, b, 1.0F); + } else if(gl.type == TrueTypeFont.GlyphType.COLOR) { + GL11.glColor4f((float) (gl.color >> 16 & 255) / 255.0F, (float) (gl.color >> 8 & 255) / 255.0F, (float) (gl.color & 255) / 255.0F, 1.0F); + } + } else { + GL11.glBindTexture(gl.texture, gl.texture); + this.drawTexturedModalRect(i, 0.0F, (float)gl.x * this.textureScale(), (float)gl.y * this.textureScale(), (float)gl.width * this.textureScale(), (float)gl.height * this.textureScale()); + i += (float)gl.width * this.textureScale(); + } + } + + //GlStateManager.func_179084_k(); + GL11.glPopMatrix(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + private TrueTypeFont.GlyphCache getOrCreateCache(String text) { + TrueTypeFont.GlyphCache cache = (TrueTypeFont.GlyphCache)this.textcache.get(text); + if(cache != null) { + return cache; + } else { + cache = new TrueTypeFont.GlyphCache(); + + for(int i = 0; i < text.length(); ++i) { + char c = text.charAt(i); + if(c == this.specialChar && i + 1 < text.length()) { + char g = text.toLowerCase(Locale.ENGLISH).charAt(i + 1); + int index = "0123456789abcdefklmnor".indexOf(g); + if(index >= 0) { + TrueTypeFont.Glyph g1 = new TrueTypeFont.Glyph(); + if(index < 16) { + g1.type = TrueTypeFont.GlyphType.COLOR; + //g1.color = Minecraft.getMinecraft().fontRenderer.func_175064_b(g); + g1.color = 0; + } else if(index == 16) { + g1.type = TrueTypeFont.GlyphType.RANDOM; + } else if(index == 17) { + g1.type = TrueTypeFont.GlyphType.BOLD; + } else if(index == 18) { + g1.type = TrueTypeFont.GlyphType.STRIKETHROUGH; + } else if(index == 19) { + g1.type = TrueTypeFont.GlyphType.UNDERLINE; + } else if(index == 20) { + g1.type = TrueTypeFont.GlyphType.ITALIC; + } else { + g1.type = TrueTypeFont.GlyphType.RESET; + } + + cache.glyphs.add(g1); + ++i; + continue; + } + } + + TrueTypeFont.Glyph var8 = this.getOrCreateGlyph(c); + cache.glyphs.add(var8); + cache.width += var8.width; + cache.height = Math.max(cache.height, var8.height); + } + + this.textcache.put(text, cache); + return cache; + } + } + + private TrueTypeFont.Glyph getOrCreateGlyph(char c) { + TrueTypeFont.Glyph g = (TrueTypeFont.Glyph)this.glyphcache.get(Character.valueOf(c)); + if(g != null) { + return g; + } else { + TrueTypeFont.TextureCache cache = this.getCurrentTexture(); + Font font = this.getFontForChar(c); + FontMetrics metrics = this.globalG.getFontMetrics(font); + g = new TrueTypeFont.Glyph(); + g.width = Math.max(metrics.charWidth(c), 1); + g.height = Math.max(metrics.getHeight(), 1); + if(cache.x + g.width >= 512) { + cache.x = 0; + cache.y += this.lineHeight + 1; + if(cache.y >= 512) { + cache.full = true; + cache = this.getCurrentTexture(); + } + } + + g.x = cache.x; + g.y = cache.y; + cache.x += g.width + 3; + this.lineHeight = Math.max(this.lineHeight, g.height); + cache.g.setFont(font); + cache.g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + cache.g.drawString(c + "", g.x, g.y + metrics.getAscent()); + g.texture = cache.textureId; + TextureUtil.uploadTextureImage(cache.textureId, cache.bufferedImage); + this.glyphcache.put(Character.valueOf(c), g); + return g; + } + } + + private TrueTypeFont.TextureCache getCurrentTexture() { + TrueTypeFont.TextureCache cache = null; + Iterator var2 = this.textures.iterator(); + + while(var2.hasNext()) { + TrueTypeFont.TextureCache t = (TrueTypeFont.TextureCache)var2.next(); + if(!t.full) { + cache = t; + break; + } + } + + if(cache == null) { + this.textures.add(cache = new TrueTypeFont.TextureCache()); + } + + return cache; + } + + public void drawCentered(String text, float x, float y, int color) { + this.draw(text, x - (float)this.width(text) / 2.0F, y, color); + } + + private Font getFontForChar(char c) { + if(this.font.canDisplay(c)) { + return this.font; + } else { + Iterator fa = this.usedFonts.iterator(); + + Font f; + do { + if(!fa.hasNext()) { + Font fa1 = new Font("Arial Unicode MS", 0, this.font.getSize()); + if(fa1.canDisplay(c)) { + return fa1; + } + + Iterator f2 = allFonts.iterator(); + + Font f1; + do { + if(!f2.hasNext()) { + return this.font; + } + + f1 = (Font)f2.next(); + } while(!f1.canDisplay(c)); + + this.usedFonts.add(f1 = f1.deriveFont(0, (float)this.font.getSize())); + return f1; + } + + f = (Font)fa.next(); + } while(!f.canDisplay(c)); + + return f; + } + } + + public void drawTexturedModalRect(float p_73729_1_, float p_73729_2_, float p_73729_3_, float p_73729_4_, float p_73729_5_, float p_73729_6_) + { + float f = 0.00390625F; + float f1 = 0.00390625F; + byte zLevel = 0; + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV((double)(p_73729_1_ + 0), (double)(p_73729_2_ + p_73729_6_), (double)zLevel, (double)((float)(p_73729_3_ + 0) * f), (double)((float)(p_73729_4_ + p_73729_6_) * f1)); + tessellator.addVertexWithUV((double)(p_73729_1_ + p_73729_5_), (double)(p_73729_2_ + p_73729_6_), (double)zLevel, (double)((float)(p_73729_3_ + p_73729_5_) * f), (double)((float)(p_73729_4_ + p_73729_6_) * f1)); + tessellator.addVertexWithUV((double)(p_73729_1_ + p_73729_5_), (double)(p_73729_2_ + 0), (double)zLevel, (double)((float)(p_73729_3_ + p_73729_5_) * f), (double)((float)(p_73729_4_ + 0) * f1)); + tessellator.addVertexWithUV((double)(p_73729_1_ + 0), (double)(p_73729_2_ + 0), (double)zLevel, (double)((float)(p_73729_3_ + 0) * f), (double)((float)(p_73729_4_ + 0) * f1)); + tessellator.draw(); + } + + public int width(String text) { + TrueTypeFont.GlyphCache cache = this.getOrCreateCache(text); + return (int)((float)cache.width * this.scale * this.textureScale()); + } + + public int height(String text) { + if(text != null && !text.trim().isEmpty()) { + TrueTypeFont.GlyphCache cache = this.getOrCreateCache(text); + return Math.max(1, (int)((float)cache.height * this.scale * this.textureScale())); + } else { + return (int)((float)this.lineHeight * this.scale * this.textureScale()); + } + } + + private float textureScale() { + return 0.5F; + } + + public void dispose() { + Iterator var1 = this.textures.iterator(); + + while(var1.hasNext()) { + TrueTypeFont.TextureCache cache = (TrueTypeFont.TextureCache)var1.next(); + GL11.glDeleteTextures(cache.textureId); + } + + this.textcache.clear(); + } + + public String getFontName() { + return this.font.getFontName(); + } + + class GlyphCache { + public int width; + public int height; + List glyphs = new ArrayList(); + + GlyphCache() { + } + } + + class Glyph { + TrueTypeFont.GlyphType type; + int color; + int x; + int y; + int height; + int width; + int texture; + + Glyph() { + this.type = TrueTypeFont.GlyphType.NORMAL; + this.color = -1; + } + } + + class TextureCache { + int x; + int y; + int textureId = GL11.glGenTextures(); + BufferedImage bufferedImage = new BufferedImage(512, 512, 2); + Graphics2D g; + boolean full; + + TextureCache() { + this.g = (Graphics2D)this.bufferedImage.getGraphics(); + } + } + + static enum GlyphType { + NORMAL, + COLOR, + RANDOM, + BOLD, + STRIKETHROUGH, + UNDERLINE, + ITALIC, + RESET, + OTHER; + + private GlyphType() { + } + } +} diff --git a/src/main/java/noppes/npcs/constants/EnumGuiType.java b/src/main/java/noppes/npcs/constants/EnumGuiType.java index 4f1e0b7fa..39e728518 100644 --- a/src/main/java/noppes/npcs/constants/EnumGuiType.java +++ b/src/main/java/noppes/npcs/constants/EnumGuiType.java @@ -1,5 +1,5 @@ package noppes.npcs.constants; public enum EnumGuiType { - MainMenuDisplay, MainMenuInv, MainMenuStats, ManageFactions, MainMenuAdvanced, MainMenuGlobal, PlayerBankSmall, PlayerFollowerHire, PlayerFollower, SetupItemGiver, SetupTrader, SetupFollower, PlayerTrader, PlayerTransporter, RedstoneBlock, SetupTransporter, ManageTransport, ManageBanks, MobSpawner, SetupBank, ManageDialogs, ManageQuests, PlayerAnvil, QuestReward, ManageRecipes, QuestItem, NpcRemote, MoneyBag, MainMenuAI, MovingPath, PlayerBankUnlock, PlayerBankUprade, PlayerBankLarge, MobSpawnerAdd, PlayerMailbox, PlayerMailman, Waypoint, MerchantAdd, MobSpawnerMounter, Crate, NpcDimensions, Border, BigSign, Script, Companion, CompanionInv, CompanionTalent, CompanionTrader, ManageLinked + MainMenuDisplay, MainMenuInv, MainMenuStats, ManageFactions, MainMenuAdvanced, MainMenuGlobal, PlayerBankSmall, PlayerFollowerHire, PlayerFollower, SetupItemGiver, SetupTrader, SetupFollower, PlayerTrader, PlayerTransporter, RedstoneBlock, SetupTransporter, ManageTransport, ManageBanks, MobSpawner, SetupBank, ManageDialogs, ManageQuests, PlayerAnvil, QuestReward, ManageRecipes, QuestItem, NpcRemote, ScriptEvent, MoneyBag, MainMenuAI, MovingPath, PlayerBankUnlock, PlayerBankUprade, PlayerBankLarge, MobSpawnerAdd, PlayerMailbox, PlayerMailman, Waypoint, MerchantAdd, MobSpawnerMounter, Crate, NpcDimensions, Border, BigSign, Script, Companion, CompanionInv, CompanionTalent, CompanionTrader, ManageLinked } diff --git a/src/main/java/noppes/npcs/constants/EnumPacketClient.java b/src/main/java/noppes/npcs/constants/EnumPacketClient.java index c392e5e51..c11a36d6e 100644 --- a/src/main/java/noppes/npcs/constants/EnumPacketClient.java +++ b/src/main/java/noppes/npcs/constants/EnumPacketClient.java @@ -1,6 +1,6 @@ package noppes.npcs.constants; public enum EnumPacketClient { - CHAT, MESSAGE, SYNCRECIPES_ADD, SYNCRECIPES_WORKBENCH, DIALOG, QUEST_COMPLETION, EDIT_NPC, PLAY_SOUND, PLAY_MUSIC, UPDATE_NPC, ROLE, GUI, PARTICLE, DELETE_NPC, SCROLL_LIST, SCROLL_DATA, SCROLL_DATA_PART, SCROLL_SELECTED, GUI_REDSTONE, GUI_WAYPOINT, GUI_DATA, GUI_ERROR, GUI_CLOSE, VILLAGER_LIST, CHATBUBBLE, SYNCRECIPES_CARPENTRYBENCH, CLONE, OPEN_BOOK, DIALOG_DUMMY, CONFIG + CHAT, MESSAGE, SYNCRECIPES_ADD, SYNCRECIPES_WORKBENCH, DIALOG, QUEST_COMPLETION, EDIT_NPC, PLAY_SOUND, PLAY_MUSIC, UPDATE_NPC, ROLE, GUI, SCRIPTED_PARTICLE, PARTICLE, DELETE_NPC, SCROLL_LIST, SCROLL_DATA, SCROLL_DATA_PART, SCROLL_SELECTED, GUI_REDSTONE, GUI_WAYPOINT, GUI_DATA, GUI_ERROR, GUI_CLOSE, VILLAGER_LIST, CHATBUBBLE, SYNCRECIPES_CARPENTRYBENCH, CLONE, OPEN_BOOK, DIALOG_DUMMY, CONFIG, ISGUIOPEN } diff --git a/src/main/java/noppes/npcs/constants/EnumPacketServer.java b/src/main/java/noppes/npcs/constants/EnumPacketServer.java index c15f88eda..54b7bbcbf 100644 --- a/src/main/java/noppes/npcs/constants/EnumPacketServer.java +++ b/src/main/java/noppes/npcs/constants/EnumPacketServer.java @@ -34,6 +34,12 @@ public enum EnumPacketServer { ClonePreSave(CustomNpcsPermissions.NPC_CLONE), CloneSave(CustomNpcsPermissions.NPC_CLONE), CloneRemove(CustomNpcsPermissions.NPC_CLONE), CloneList, + ScriptPlayerSave(CustomNpcsPermissions.TOOL_SCRIPTER, false), + ScriptPlayerGet(false), + + ScriptForgeSave(CustomNpcsPermissions.TOOL_SCRIPTER, false), + ScriptForgeGet(false), + LinkedGetAll, LinkedRemove(CustomNpcsPermissions.GLOBAL_LINKED), LinkedAdd(CustomNpcsPermissions.GLOBAL_LINKED), ScriptDataSave(CustomNpcsPermissions.TOOL_SCRIPTER, true), ScriptDataGet(true), PlayerDataRemove(CustomNpcsPermissions.GLOBAL_PLAYERDATA), @@ -70,7 +76,7 @@ public enum EnumPacketServer { RemoteTpToNpc,QuestGet, QuestCategoryGet, SaveTileEntity, NaturalSpawnGetAll, MailOpenSetup, - DimensionsGet, DimensionTeleport, GetTileEntity, Gui, ; + DimensionsGet, DimensionTeleport, GetTileEntity, Gui, IsGuiOpen; public CustomNpcsPermissions.Permission permission = null; public boolean needsNpc = false; diff --git a/src/main/java/noppes/npcs/constants/EnumPlayerPacket.java b/src/main/java/noppes/npcs/constants/EnumPlayerPacket.java index c891d3d78..e1a1b95e2 100644 --- a/src/main/java/noppes/npcs/constants/EnumPlayerPacket.java +++ b/src/main/java/noppes/npcs/constants/EnumPlayerPacket.java @@ -1,5 +1,5 @@ package noppes.npcs.constants; public enum EnumPlayerPacket { - FollowerHire,FollowerExtend,Trader, FollowerState, Transport, BankUnlock, BankUpgrade, Dialog, QuestLog, QuestCompletion, CheckQuestCompletion, BankSlotOpen, FactionsGet, MailGet, MailDelete, MailSend, MailRead, MailboxOpenMail, SignSave, SaveBook, CompanionOpenInv, RoleGet, CompanionTalentExp + FollowerHire,FollowerExtend,Trader, FollowerState, Transport, BankUnlock, BankUpgrade, Dialog, QuestLog, QuestCompletion, CheckQuestCompletion, BankSlotOpen, FactionsGet, MailGet, MailDelete, MailSend, MailRead, MailboxOpenMail, SignSave, SaveBook, CompanionOpenInv, RoleGet, KeyPressed, MouseClicked, CompanionTalentExp } diff --git a/src/main/java/noppes/npcs/constants/EnumScriptType.java b/src/main/java/noppes/npcs/constants/EnumScriptType.java index 424a4e62d..a3980a94a 100644 --- a/src/main/java/noppes/npcs/constants/EnumScriptType.java +++ b/src/main/java/noppes/npcs/constants/EnumScriptType.java @@ -1,5 +1,86 @@ package noppes.npcs.constants; public enum EnumScriptType { - INIT, TICK, INTERACT, DIALOG, DAMAGED, KILLED, ATTACK, TARGET, COLLIDE, KILLS, DIALOG_OPTION -} + INIT("init"), + TICK("tick"), + INTERACT("interact"), + DIALOG("dialog"), + DAMAGED("damaged"), + KILLED("killed"), + ATTACK("attack"), + TARGET("target"), + COLLIDE("collide"), + KILLS("kills"), + DIALOG_OPTION("dialogOption"), + TIMER("timer"), + + ATTACK_MELEE("meleeAttack"), + TARGET_LOST("targetLost"), + ROLE("role"), + RANGED_CHARGE("rangedCharge"), + RANGED_LAUNCHED("rangedLaunched"), + CLICKED("clicked"), + FALLEN_UPON("fallenUpon"), + RAIN_FILLED("rainFilled"), + BROKEN("broken"), + HARVESTED("harvested"), + EXPLODED("exploded"), + NEIGHBOR_CHANGED("neighborChanged"), + REDSTONE("redstone"), + DOOR_TOGGLE("doorToggle"), + TOSS("toss"), + DROP("drop"), + CONTAINER_OPEN("containerOpen"), + CONTAINER_CLOSED("containerClosed"), + LOGIN("login"), + LOGOUT("logout"), + CHAT("chat"), + DAMAGED_ENTITY("damagedEntity"), + DIALOG_CLOSE("dialogClose"), + SPAWN("spawn"), + TOSSED("tossed"), + PICKEDUP("pickedUp"), + PICKUP("pickUp"), + PROJECTILE_TICK("projectileTick"), + PROJECTILE_IMPACT("projectileImpact"), + LEVEL_UP("levelUp"), + QUEST_START("questStart"), + QUEST_COMPLETED("questCompleted"), + QUEST_TURNIN("questTurnIn"), + KEY_PRESSED("keyPressed"), + CUSTOM_CHEST_CLOSED("customChestClosed"), + CUSTOM_CHEST_CLICKED("customChestClicked"), + SCRIPT_COMMAND("scriptCommand"), + CUSTOM_GUI_CLOSED("customGuiClosed"), + CUSTOM_GUI_BUTTON("customGuiButton"), + CUSTOM_GUI_SLOT("customGuiSlot"), + CUSTOM_GUI_SCROLL("customGuiScroll"), + PICKUP_XP("pickupXP"), + MOUSE_CLICKED("mouseClicked"), + START_USING_ITEM("startItem"), + USING_ITEM("usingItem"), + STOP_USING_ITEM("stopItem"), + FINISH_USING_ITEM("finishItem"), + USE_HOE("useHoe"), + SLEEP("sleep"), + WAKE_UP("wakeUp"), + FILL_BUCKET("fillBucket"), + BONEMEAL("bonemeal"), + ACHIEVEMENT("achievement"), + FALL("fall"), + JUMP("jump"), + LIGHTNING("lightning"), + PLAYSOUND("playSound"), + RESPAWN("respawn"), + CHANGED_DIM("changedDim"), + BREAK_BLOCK("breakBlock"), + FORGE_INIT("forgeInit"), + FORGE_ENTITY("forgeEntity"), + FORGE_WORLD("forgeWorld"); + + public String function; + + private EnumScriptType(String function) { + this.function = function; + } +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/containers/ContainerNpcInterface.java b/src/main/java/noppes/npcs/containers/ContainerNpcInterface.java index 5577cd847..9996ec51f 100644 --- a/src/main/java/noppes/npcs/containers/ContainerNpcInterface.java +++ b/src/main/java/noppes/npcs/containers/ContainerNpcInterface.java @@ -3,9 +3,13 @@ package noppes.npcs.containers; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.util.MathHelper; +import noppes.npcs.scripted.interfaces.IContainer; +import noppes.npcs.scripted.ScriptContainer; public class ContainerNpcInterface extends Container{ private int posX, posZ; + public EntityPlayer player; + public IContainer scriptContainer; public ContainerNpcInterface(EntityPlayer player){ posX = MathHelper.floor_double(player.posX); @@ -18,4 +22,11 @@ public class ContainerNpcInterface extends Container{ return !player.isDead && posX == MathHelper.floor_double(player.posX) && posZ == MathHelper.floor_double(player.posZ); } + public static IContainer getOrCreateIContainer(ContainerNpcInterface container) { + if (container.scriptContainer != null) { + return container.scriptContainer; + } else { + return container.scriptContainer = new ScriptContainer(container); + } + } } diff --git a/src/main/java/noppes/npcs/controllers/IScriptHandler.java b/src/main/java/noppes/npcs/controllers/IScriptHandler.java new file mode 100644 index 000000000..b4f8f9625 --- /dev/null +++ b/src/main/java/noppes/npcs/controllers/IScriptHandler.java @@ -0,0 +1,34 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +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 { + void callScript(EnumScriptType var1, Event var2, Object... obs); + + boolean isClient(); + + boolean getEnabled(); + + void setEnabled(boolean var1); + + String getLanguage(); + + void setLanguage(String var1); + + List getScripts(); + + String noticeString(); + + Map getConsoleText(); + + void clearConsole(); +} diff --git a/src/main/java/noppes/npcs/controllers/PlayerData.java b/src/main/java/noppes/npcs/controllers/PlayerData.java index 675c0d089..ec37e4cb4 100644 --- a/src/main/java/noppes/npcs/controllers/PlayerData.java +++ b/src/main/java/noppes/npcs/controllers/PlayerData.java @@ -2,13 +2,23 @@ package noppes.npcs.controllers; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraftforge.common.IExtendedEntityProperties; +import noppes.npcs.CustomNpcs; +import noppes.npcs.LogWriter; import noppes.npcs.constants.EnumRoleType; +import noppes.npcs.controllers.data.PlayerDataScript; import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; +import noppes.npcs.entity.data.DataTimers; import noppes.npcs.roles.RoleCompanion; +import noppes.npcs.util.NBTJsonUtil; + +import java.io.File; +import java.io.FileInputStream; public class PlayerData implements IExtendedEntityProperties{ public PlayerDialogData dialogData = new PlayerDialogData(); @@ -18,7 +28,9 @@ 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; public NBTTagCompound cloned; @@ -26,10 +38,12 @@ public class PlayerData implements IExtendedEntityProperties{ public String playername = ""; public String uuid = ""; - + private EntityNPCInterface activeCompanion = null; public int companionID = 0; + public boolean isGUIOpen = false; + @Override public void saveNBTData(NBTTagCompound compound) { PlayerDataController.instance.savePlayerData(this); @@ -51,8 +65,8 @@ public class PlayerData implements IExtendedEntityProperties{ transportData.loadNBTData(data); factionData.loadNBTData(data); itemgiverData.loadNBTData(data); - mailData.loadNBTData(data); - + mailData.loadNBTData(data); + timers.readFromNBT(data); if(player != null){ playername = player.getCommandSenderName(); @@ -73,6 +87,7 @@ public class PlayerData implements IExtendedEntityProperties{ player.worldObj.spawnEntityInWorld(npc); } } + isGUIOpen = data.getBoolean("isGUIOpen"); } public NBTTagCompound getNBT() { if(player != null){ @@ -87,10 +102,12 @@ public class PlayerData implements IExtendedEntityProperties{ factionData.saveNBTData(compound); itemgiverData.saveNBTData(compound); mailData.saveNBTData(compound); - + timers.writeToNBT(compound); + compound.setString("PlayerName", playername); compound.setString("UUID", uuid); compound.setInteger("PlayerCompanionId", companionID); + compound.setBoolean("isGUIOpen",isGUIOpen); if(hasCompanion()){ NBTTagCompound nbt = new NBTTagCompound(); @@ -104,7 +121,17 @@ public class PlayerData implements IExtendedEntityProperties{ public void init(Entity entity, World world) { } - + + public void setGUIOpen(boolean bool) { + isGUIOpen = bool; + saveNBTData(null); + } + + public boolean getGUIOpen() { + loadNBTData(null); + return isGUIOpen; + } + public boolean hasCompanion(){ return activeCompanion != null && !activeCompanion.isDead; } @@ -138,4 +165,83 @@ public class PlayerData implements IExtendedEntityProperties{ world.spawnEntityInWorld(npc); } + public static NBTTagCompound loadPlayerDataOld(String player) { + File saveDir = CustomNpcs.getWorldSaveDirectory("playerdata"); + String filename = player; + if (player.isEmpty()) { + filename = "noplayername"; + } + + filename = filename + ".dat"; + + File file; + try { + file = new File(saveDir, filename); + if (file.exists()) { + NBTTagCompound comp = CompressedStreamTools.readCompressed(new FileInputStream(file)); + file.delete(); + file = new File(saveDir, filename + "_old"); + if (file.exists()) { + file.delete(); + } + + return comp; + } + } catch (Exception var6) { + LogWriter.except(var6); + } + + try { + file = new File(saveDir, filename + "_old"); + if (file.exists()) { + return CompressedStreamTools.readCompressed(new FileInputStream(file)); + } + } catch (Exception var5) { + LogWriter.except(var5); + } + + return new NBTTagCompound(); + } + + public static NBTTagCompound loadPlayerData(String player) { + File saveDir = CustomNpcs.getWorldSaveDirectory("playerdata"); + String filename = player; + if (player.isEmpty()) { + filename = "noplayername"; + } + + filename = filename + ".json"; + File file = null; + + try { + file = new File(saveDir, filename); + if (file.exists()) { + return NBTJsonUtil.LoadFile(file); + } + } catch (Exception var5) { + LogWriter.error("Error loading: " + file.getAbsolutePath(), var5); + } + + return new NBTTagCompound(); + } + + public static PlayerData get(EntityPlayer player) { + if(player.worldObj.isRemote) { + return CustomNpcs.proxy.getPlayerData(player); + } else { + 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()); + } + + data.setNBT(compound); + } + + return data; + } + } } diff --git a/src/main/java/noppes/npcs/controllers/ScriptController.java b/src/main/java/noppes/npcs/controllers/ScriptController.java index 37f6df1e4..83415bd1a 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptController.java +++ b/src/main/java/noppes/npcs/controllers/ScriptController.java @@ -19,6 +19,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.passive.EntityTameable; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -27,20 +28,23 @@ import net.minecraft.server.MinecraftServer; import net.minecraftforge.event.world.WorldEvent; import noppes.npcs.CustomNpcs; import noppes.npcs.LogWriter; +import noppes.npcs.controllers.data.ForgeDataScript; +import noppes.npcs.controllers.data.PlayerDataScript; import noppes.npcs.entity.EntityNPCInterface; -import noppes.npcs.scripted.ScriptAnimal; -import noppes.npcs.scripted.ScriptEntity; -import noppes.npcs.scripted.ScriptLiving; -import noppes.npcs.scripted.ScriptLivingBase; -import noppes.npcs.scripted.ScriptMonster; -import noppes.npcs.scripted.ScriptPixelmon; -import noppes.npcs.scripted.ScriptPlayer; +import noppes.npcs.scripted.entity.ScriptAnimal; +import noppes.npcs.scripted.entity.ScriptEntity; +import noppes.npcs.scripted.entity.ScriptLiving; +import noppes.npcs.scripted.entity.ScriptLivingBase; +import noppes.npcs.scripted.entity.ScriptMonster; +import noppes.npcs.scripted.entity.ScriptPixelmon; +import noppes.npcs.scripted.entity.ScriptPlayer; import noppes.npcs.scripted.ScriptWorld; +import noppes.npcs.util.JsonException; import noppes.npcs.util.NBTJsonUtil; import cpw.mods.fml.common.eventhandler.SubscribeEvent; public class ScriptController { - + public static ScriptController Instance; public static boolean HasStart = false; private ScriptEngineManager manager; @@ -49,10 +53,15 @@ public class ScriptController { public long lastLoaded = 0; public File dir; public NBTTagCompound compound = new NBTTagCompound(); - + private boolean loaded = false; public boolean shouldSave = false; - + + public PlayerDataScript playerScripts = new PlayerDataScript((EntityPlayer)null); + public long lastPlayerUpdate = 0L; + + public ForgeDataScript forgeScripts = new ForgeDataScript(); + public ScriptController(){ loaded = false; Instance = this; @@ -68,6 +77,78 @@ public class ScriptController { } } + private File forgeScriptsFile() { + return new File(this.dir, "forge_scripts.json"); + } + + public boolean loadForgeScripts() { + this.forgeScripts.clear(); + File file = this.forgeScriptsFile(); + + try { + if(!file.exists()) { + return false; + } else { + this.forgeScripts.readFromNBT(NBTJsonUtil.LoadFile(file)); + return true; + } + } catch (Exception var3) { + LogWriter.error("Error loading: " + file.getAbsolutePath(), var3); + return false; + } + } + + public void setForgeScripts(NBTTagCompound compound) { + this.forgeScripts.readFromNBT(compound); + File file = this.forgeScriptsFile(); + + try { + NBTJsonUtil.SaveFile(file, compound); + this.forgeScripts.lastInited = -1L; + } catch (IOException var4) { + var4.printStackTrace(); + } catch (JsonException var5) { + var5.printStackTrace(); + } + + } + + private File playerScriptsFile() { + return new File(dir, "player_scripts.json"); + } + + public boolean loadPlayerScripts() { + this.playerScripts.clear(); + File file = this.playerScriptsFile(); + + try { + if(!file.exists()) { + return false; + } else { + this.playerScripts.readFromNBT(NBTJsonUtil.LoadFile(file)); + shouldSave = false; + return true; + } + } catch (Exception var3) { + LogWriter.error("Error loading: " + file.getAbsolutePath(), var3); + return false; + } + } + + public void setPlayerScripts(NBTTagCompound compound) { + this.playerScripts.readFromNBT(compound); + File file = this.playerScriptsFile(); + + try { + NBTJsonUtil.SaveFile(file, compound); + this.lastPlayerUpdate = System.currentTimeMillis(); + } catch (IOException var4) { + var4.printStackTrace(); + } catch (JsonException var5) { + var5.printStackTrace(); + } + } + private void loadCategories(){ dir = new File(CustomNpcs.getWorldSaveDirectory(), "scripts"); if(!dir.exists()) @@ -103,39 +184,40 @@ public class ScriptController { } } public boolean loadStoredData(){ - loadCategories(); - File file = getSavedFile(); - try { - if(!file.exists()) - return false; - this.compound = NBTJsonUtil.LoadFile(file); - shouldSave = false; - } - catch (Exception e) { + loadCategories(); + File file = getSavedFile(); + try { + if(!file.exists()) + return false; + this.compound = NBTJsonUtil.LoadFile(file); + shouldSave = false; + } + catch (Exception e) { LogWriter.error("Error loading: " + file.getAbsolutePath(), e); - return false; - } - return true; + return false; + } + return true; } - + private File getSavedFile(){ return new File(dir, "world_data.json"); } - private String readFile(File file) throws IOException { - BufferedReader br = new BufferedReader(new FileReader(file)); - try { - StringBuilder sb = new StringBuilder(); - String line = br.readLine(); - while (line != null) { - sb.append(line); - sb.append("\n"); - line = br.readLine(); - } - return sb.toString(); - } finally { - br.close(); - } + private String readFile(File file) throws IOException { + BufferedReader br = new BufferedReader(new FileReader(file)); + try { + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + + while (line != null) { + sb.append(line); + sb.append("\n"); + line = br.readLine(); + } + return sb.toString(); + } finally { + br.close(); + } } public ScriptEngine getEngineByName(String language) { @@ -156,7 +238,7 @@ public class ScriptController { } return list; } - + private List getScripts(String language){ List list = new ArrayList(); String ext = languages.get(language); @@ -202,14 +284,14 @@ public class ScriptController { public void saveWorld(WorldEvent.Save event){ if(!shouldSave || event.world.isRemote || event.world != MinecraftServer.getServer().worldServers[0]) return; - + try { NBTJsonUtil.SaveFile(getSavedFile(), compound); - } + } catch (Exception e) { LogWriter.except(e); - } - + } + shouldSave = false; } -} +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/controllers/ScriptEntityData.java b/src/main/java/noppes/npcs/controllers/ScriptEntityData.java index 3f283f1f7..08c4e152d 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptEntityData.java +++ b/src/main/java/noppes/npcs/controllers/ScriptEntityData.java @@ -4,7 +4,7 @@ import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.IExtendedEntityProperties; -import noppes.npcs.scripted.ScriptEntity; +import noppes.npcs.scripted.entity.ScriptEntity; public class ScriptEntityData implements IExtendedEntityProperties{ public ScriptEntity base; diff --git a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java new file mode 100644 index 000000000..8514f9b00 --- /dev/null +++ b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java @@ -0,0 +1,151 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.controllers.data; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +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.NBTTags; +import noppes.npcs.constants.EnumScriptType; +import noppes.npcs.controllers.IScriptHandler; +import noppes.npcs.controllers.ScriptController; +import noppes.npcs.scripted.wrapper.WrapperNpcAPI; + +import javax.script.ScriptEngine; + +public class ForgeDataScript implements IScriptHandler { + private List scripts = new ArrayList(); + private String scriptLanguage = "ECMAScript"; + public long lastInited = -1L; + private boolean enabled = false; + + public ForgeDataScript() { + } + + public void clear() { + 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"); + } + + public NBTTagCompound writeToNBT(NBTTagCompound compound) { + compound.setTag("Scripts", NBTTags.NBTScript(this.scripts)); + compound.setString("ScriptLanguage", this.scriptLanguage); + compound.setBoolean("ScriptEnabled", this.enabled); + return compound; + } + + @Override + public void callScript(EnumScriptType var1, Event var2, Object... obs) { + callScript(var1.function, var2); + } + + public void callScript(String type, Event event) { + if(this.isEnabled()) { + //Minecraft.getMinecraft().func_152344_a(() -> { + if (ScriptController.Instance.lastLoaded > this.lastInited) { + this.lastInited = ScriptController.Instance.lastLoaded; + if (!type.equals("init")) { + EventHooks.onForgeInit(this); + } + } + + Iterator var3 = this.scripts.iterator(); + + while (var3.hasNext()) { + EventScriptContainer script = (EventScriptContainer) 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()); + + ScriptEngine engine = script.engine; + + script.run(type, event); + } + //}); + } + } + + public boolean isEnabled() { + return this.enabled && ScriptController.HasStart && this.scripts.size() > 0; + } + + public boolean isClient() { + return false; + } + + 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() { + return "ForgeScript"; + } + + public Map getConsoleText() { + TreeMap map = new TreeMap(); + int tab = 0; + Iterator var3 = this.getScripts().iterator(); + + while(var3.hasNext()) { + EventScriptContainer script = (EventScriptContainer)var3.next(); + ++tab; + Iterator var5 = script.console.entrySet().iterator(); + + while(var5.hasNext()) { + Entry entry = (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()) { + EventScriptContainer script = (EventScriptContainer)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 new file mode 100644 index 000000000..b051d1ea5 --- /dev/null +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java @@ -0,0 +1,403 @@ +// +// 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; +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.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; +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"; + 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; + + 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() { + 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); + compound.setBoolean("ScriptEnabled", this.enabled); + compound.setTag("ScriptConsole", NBTTags.NBTLongStringMap(this.console)); + return compound; + } + + 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) { + this.lastInited = ScriptController.Instance.lastLoaded; + //ScriptController.Instance.playerScripts.errored.clear(); + if(this.player != null) { + this.scripts.clear(); + Iterator i = ScriptController.Instance.playerScripts.scripts.iterator(); + + while(i.hasNext()) { + script = (EventScriptContainer)i.next(); + EventScriptContainer s = new EventScriptContainer(this); + s.readFromNBT(script.writeToNBT(new NBTTagCompound())); + + this.scripts.add(s); + } + } + + this.lastPlayerUpdate = ScriptController.Instance.lastPlayerUpdate; + 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()); + script.run(type, event); + + if (script.errored) { + ScriptController.Instance.playerScripts.errored.add(var7); + } + + 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()); + } + } + + script.console.clear(); + } + } + } + } + + 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"; + } else { + BlockPos pos = new BlockPos(this.player); + 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; + this.omitNullValues = false; + 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; + } else if (value instanceof Collection) { + return ((Collection)value).isEmpty(); + } else if (value instanceof Map) { + return ((Map)value).isEmpty(); + } else if (value instanceof Optional) { + return !((Optional)value).isPresent(); + } else if (value instanceof OptionalInt) { + return !((OptionalInt)value).isPresent(); + } else if (value instanceof OptionalLong) { + return !((OptionalLong)value).isPresent(); + } else if (value instanceof OptionalDouble) { + return !((OptionalDouble)value).isPresent(); + } else if (value instanceof com.google.common.base.Optional) { + return !((com.google.common.base.Optional)value).isPresent(); + } else if (value.getClass().isArray()) { + return Array.getLength(value) == 0; + } else { + 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)) { + if (value == null) { + if (omitNullValuesSnapshot) { + continue; + } + } else if (omitEmptyValuesSnapshot && isEmpty(value)) { + 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); + builder.append(arrayString, 1, arrayString.length() - 1); + } else { + 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; + @CheckForNull + Object value; + @CheckForNull + PlayerDataScript.ToStringHelper.ValueHolder next; + + private ValueHolder() { + } + } + } + + public static PlayerDataScript.ToStringHelper toStringHelper(Object self) { + return new PlayerDataScript.ToStringHelper(self.getClass().getSimpleName()); + } +} diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index c8e4731d2..4f674cbe5 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -3,11 +3,7 @@ package noppes.npcs.entity; import io.netty.buffer.ByteBuf; import java.io.IOException; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; +import java.util.*; import net.minecraft.block.Block; import net.minecraft.command.ICommandSender; @@ -28,7 +24,6 @@ import net.minecraft.init.Items; import net.minecraft.item.Item; 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; @@ -63,9 +58,6 @@ 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; @@ -92,23 +84,29 @@ import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.PlayerQuestData; import noppes.npcs.controllers.QuestData; import noppes.npcs.controllers.TransformData; +import noppes.npcs.entity.data.DataTimers; import noppes.npcs.roles.JobBard; import noppes.npcs.roles.JobFollower; import noppes.npcs.roles.JobInterface; import noppes.npcs.roles.RoleCompanion; import noppes.npcs.roles.RoleFollower; import noppes.npcs.roles.RoleInterface; -import noppes.npcs.scripted.ScriptEventAttack; -import noppes.npcs.scripted.ScriptEventDamaged; -import noppes.npcs.scripted.ScriptEventKilled; -import noppes.npcs.scripted.ScriptEventTarget; +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; +import noppes.npcs.scripted.event.ScriptEventTarget; +import noppes.npcs.scripted.interfaces.ICustomNpc; import noppes.npcs.util.GameProfileAlt; import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; public abstract class EntityNPCInterface extends EntityCreature implements IEntityAdditionalSpawnData, ICommandSender, IRangedAttackMob, IBossDisplayData{ + public ICustomNpc wrappedNPC; - private static final GameProfileAlt chateventProfile = new GameProfileAlt(); - private static FakePlayer chateventPlayer; + public static final GameProfileAlt chateventProfile = new GameProfileAlt(); + public static FakePlayer chateventPlayer; + public static FakePlayer CommandPlayer; public DataDisplay display; public DataStats stats; public DataAI ai; @@ -116,6 +114,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti public DataInventory inventory; public DataScript script; public TransformData transform; + public DataTimers timers; public String linkedName = ""; public long linkedLast = 0; @@ -170,6 +169,10 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti setFaction(faction.id); setSize(1, 1); this.updateTasks(); + + if (!this.isRemote()) { + this.wrappedNPC = new ScriptNpc(this); + } } catch(Exception e){ e.printStackTrace(); @@ -187,7 +190,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti inventory = new DataInventory(this); transform = new TransformData(this); script = new DataScript(this); - + timers = new DataTimers(this); this.getAttributeMap().registerAttribute(SharedMonsterAttributes.attackDamage); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(stats.maxHealth); @@ -223,6 +226,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti super.onUpdate(); if(this.ticksExisted % 10 == 0) script.callScript(EnumScriptType.TICK); + this.timers.update(); } public void setWorld(World world){ @@ -521,7 +525,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti if(event.getTarget() == null) entity = null; else - entity = event.getTarget().getMinecraftEntity(); + entity = event.getTarget().getMCEntity(); } if (entity != null && entity != this && ai.onAttack != 3 && !isAttacking() && !isRemote()){ Line line = advanced.getAttackLine(); @@ -917,7 +921,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti stats.readToNBT(compound); ai.readToNBT(compound); script.readFromNBT(compound); - + timers.readFromNBT(compound); advanced.readToNBT(compound); if (advanced.role != EnumRoleType.None && roleInterface != null) roleInterface.readFromNBT(compound); @@ -948,7 +952,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti stats.writeToNBT(compound); ai.writeToNBT(compound); script.writeToNBT(compound); - + timers.writeToNBT(compound); advanced.writeToNBT(compound); if (advanced.role != EnumRoleType.None && roleInterface != null) roleInterface.writeToNBT(compound); @@ -1512,7 +1516,18 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } display.readToNBT(compound); } - + + public Entity func_174793_f() { + if (this.worldObj.isRemote) { + return this; + } else { + EntityUtil.Copy(this, CommandPlayer); + CommandPlayer.setWorld(this.worldObj); + CommandPlayer.setPosition(this.posX, this.posY, this.posZ); + return CommandPlayer; + } + } + @Override public String getCommandSenderName() { return display.name; @@ -1582,9 +1597,13 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti @Override public boolean isInvisibleToPlayer(EntityPlayer player){ - return display.visible == 1 && (player.getHeldItem() == null || player.getHeldItem().getItem() != CustomItems.wand); + return (scriptInvisibleToPlayer(player) || display.visible == 1) && (player.getHeldItem() == null || player.getHeldItem().getItem() != CustomItems.wand); } + public boolean scriptInvisibleToPlayer(EntityPlayer player){ + return display.invisibleToList != null && display.invisibleToList.contains(player.getPersistentID()); + } + @Override public boolean isInvisible(){ return display.visible != 0; diff --git a/src/main/java/noppes/npcs/entity/data/DataTimers.java b/src/main/java/noppes/npcs/entity/data/DataTimers.java new file mode 100644 index 000000000..42b05f298 --- /dev/null +++ b/src/main/java/noppes/npcs/entity/data/DataTimers.java @@ -0,0 +1,133 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.entity.data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import noppes.npcs.EventHooks; +import noppes.npcs.entity.EntityNPCInterface; +import noppes.npcs.scripted.interfaces.ITimers; +import noppes.npcs.controllers.PlayerData; +import noppes.npcs.scripted.CustomNPCsException; + +public class DataTimers implements ITimers { + private Object parent; + private Map timers = new HashMap(); + + public DataTimers(Object parent) { + this.parent = parent; + } + + public void start(int id, int ticks, boolean repeat) { + if(this.timers.containsKey(Integer.valueOf(id))) { + throw new CustomNPCsException("There is already a timer with id: " + id, new Object[0]); + } else { + this.timers.put(Integer.valueOf(id), new DataTimers.Timer(id, ticks, repeat)); + } + } + + public void forceStart(int id, int ticks, boolean repeat) { + this.timers.put(Integer.valueOf(id), new DataTimers.Timer(id, ticks, repeat)); + } + + public boolean has(int id) { + return this.timers.containsKey(Integer.valueOf(id)); + } + + public boolean stop(int id) { + boolean remove = this.timers.remove(Integer.valueOf(id)) != null; + return remove; + } + + public void reset(int id) { + DataTimers.Timer timer = (DataTimers.Timer)this.timers.get(Integer.valueOf(id)); + if(timer == null) { + throw new CustomNPCsException("There is no timer with id: " + id, new Object[0]); + } else { + timer.ticks = 0; + } + } + + public void writeToNBT(NBTTagCompound compound) { + NBTTagList list = new NBTTagList(); + Iterator var3 = this.timers.values().iterator(); + + while(var3.hasNext()) { + DataTimers.Timer timer = (DataTimers.Timer)var3.next(); + NBTTagCompound c = new NBTTagCompound(); + c.setInteger("ID", timer.id); + c.setInteger("TimerTicks", timer.id); + c.setBoolean("Repeat", timer.repeat); + c.setInteger("Ticks", timer.ticks); + list.appendTag(c); + } + + compound.setTag("NpcsTimers", list); + } + + public void readFromNBT(NBTTagCompound compound) { + Map timers = new HashMap(); + NBTTagList list = compound.getTagList("NpcsTimers", 10); + + for(int i = 0; i < list.tagCount(); ++i) { + NBTTagCompound c = list.getCompoundTagAt(i); + DataTimers.Timer t = new DataTimers.Timer(c.getInteger("ID"), c.getInteger("TimerTicks"), c.getBoolean("Repeat")); + t.ticks = c.getInteger("Ticks"); + timers.put(t.id, t); + } + + this.timers = timers; + } + + public void update() { + Iterator var1 = (new ArrayList(this.timers.values())).iterator(); + + while(var1.hasNext()) { + DataTimers.Timer timer = (DataTimers.Timer)var1.next(); + timer.update(); + } + } + + public void clear() { + this.timers = new HashMap(); + } + + class Timer { + public int id; + private boolean repeat; + private int timerTicks; + private int ticks = 0; + + public Timer(int id, int ticks, boolean repeat) { + this.id = id; + this.repeat = repeat; + this.timerTicks = ticks; + this.ticks = ticks; + } + + public void update() { + if(this.ticks-- <= 0) { + if(this.repeat) { + this.ticks = this.timerTicks; + } else { + DataTimers.this.stop(this.id); + } + + Object ob = DataTimers.this.parent; + if (ob instanceof EntityNPCInterface) { + EventHooks.onNPCTimer((EntityNPCInterface)ob, this.id); + } + else if(ob instanceof PlayerData) { + EventHooks.onPlayerTimer((PlayerData)ob, this.id); + } + } + } + } +} diff --git a/src/main/java/noppes/npcs/items/ItemNpcScripter.java b/src/main/java/noppes/npcs/items/ItemNpcScripter.java index 3207b7cf7..c4e7b9750 100644 --- a/src/main/java/noppes/npcs/items/ItemNpcScripter.java +++ b/src/main/java/noppes/npcs/items/ItemNpcScripter.java @@ -1,16 +1,20 @@ package noppes.npcs.items; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.world.World; import noppes.npcs.CustomItems; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import noppes.npcs.CustomNpcs; +import noppes.npcs.constants.EnumGuiType; public class ItemNpcScripter extends Item{ - + public ItemNpcScripter(){ maxStackSize = 1; setCreativeTab(CustomItems.tab); @@ -25,7 +29,15 @@ public class ItemNpcScripter extends Item{ public boolean requiresMultipleRenderPasses(){ return true; } - + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer){ + if(!par2World.isRemote) + return par1ItemStack; + CustomNpcs.proxy.openGui(0, 0, 0, EnumGuiType.ScriptEvent, par3EntityPlayer); + return par1ItemStack; + } + @SideOnly(Side.CLIENT) @Override public void registerIcons(IIconRegister par1IconRegister){ diff --git a/src/main/java/noppes/npcs/scripted/CustomNPCsException.java b/src/main/java/noppes/npcs/scripted/CustomNPCsException.java new file mode 100644 index 000000000..7952cd18d --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/CustomNPCsException.java @@ -0,0 +1,16 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted; + +public class CustomNPCsException extends RuntimeException { + public CustomNPCsException(String message, Object... obs) { + super(String.format(message, obs)); + } + + public CustomNPCsException(Exception ex, String message, Object... obs) { + super(String.format(message, obs), ex); + } +} diff --git a/src/main/java/noppes/npcs/scripted/NpcAPI.java b/src/main/java/noppes/npcs/scripted/NpcAPI.java new file mode 100644 index 000000000..3d49dc260 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/NpcAPI.java @@ -0,0 +1,97 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted; + +import java.io.File; + +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.eventhandler.EventBus; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import noppes.npcs.scripted.entity.ScriptPlayer; +import noppes.npcs.scripted.interfaces.*; + +public abstract class NpcAPI { + private static NpcAPI instance = null; + + public NpcAPI() { + } + + public abstract ICustomNpc createNPC(World var1); + + public abstract ICustomNpc spawnNPC(World var1, int var2, int var3, int var4); + + public abstract IEntity getIEntity(Entity var1); + + public abstract IBlock getIBlock(World var1, BlockPos var2); + + public abstract IBlock getIBlock(World world, int x, int y, int z); + + public abstract IContainer getIContainer(IInventory var1); + + public abstract IContainer getIContainer(Container var1); + + public abstract IItemStack getIItemStack(ItemStack var1); + + public abstract IWorld getIWorld(WorldServer var1); + + public abstract IWorld getIWorld(int var1); + + public abstract IWorld[] getIWorlds(); + + public abstract IDamageSource getIDamageSource(DamageSource var1); + + public abstract EventBus events(); + + public abstract File getGlobalDir(); + + public abstract File getWorldDir(); + + public static boolean IsAvailable() { + return Loader.isModLoaded("customnpcs"); + } + + public static NpcAPI Instance() { + if (instance != null) { + return instance; + } else if (!IsAvailable()) { + return null; + } else { + try { + Class c = Class.forName("noppes.npcs.scripted.wrapper.WrapperNpcAPI"); + instance = (NpcAPI) c.getMethod("Instance").invoke((Object) null); + } catch (Exception var1) { + var1.printStackTrace(); + } + + return instance; + } + } + + public abstract void executeCommand(IWorld var1, String var2); + + public abstract String getRandomName(int var1, int var2); + + public abstract INbt getINbt(NBTTagCompound entityData); + + public abstract ScriptPlayer[] getAllServerPlayers(); + + public abstract ScriptItemStack createItem(String id, int damage, int size); + + public abstract ScriptEntityParticle createEntityParticle(String directory); + + public abstract int getServerTime(); +} diff --git a/src/main/java/noppes/npcs/scripted/ScriptBlock.java b/src/main/java/noppes/npcs/scripted/ScriptBlock.java new file mode 100644 index 000000000..69dd6d984 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/ScriptBlock.java @@ -0,0 +1,119 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted; + +import java.util.Map; +import net.minecraft.block.Block; +import net.minecraft.inventory.IInventory; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import noppes.npcs.scripted.interfaces.*; +import noppes.npcs.util.LRUHashMap; + +public class ScriptBlock implements IBlock { + private static final Map blockCache = new LRUHashMap(400); + protected final IWorld world; + protected final Block block; + protected final BlockPos pos; + protected final ScriptBlockPos bPos; + protected TileEntity tile; + + public ScriptBlock(World world, Block block, BlockPos pos) { + this.world = NpcAPI.Instance().getIWorld((WorldServer)world); + this.block = block; + this.pos = pos; + this.bPos = new ScriptBlockPos(pos); + } + + public IPos getPos() { + return this.bPos; + } + + public int getX() { + return this.pos.getX(); + } + + public int getY() { + return this.pos.getY(); + } + + public int getZ() { + return this.pos.getZ(); + } + + public void remove() { + this.world.getMCWorld().setBlockToAir(getX(), getY(), getZ()); + } + + public boolean isAir() { + return this.block.isAir(this.world.getMCWorld(), getX(), getY(), getZ()); + } + + public ScriptBlock setBlock(String name) { + Block block = (Block)Block.blockRegistry.getObject(new ResourceLocation(name)); + if(block == null) { + return this; + } else { + this.world.getMCWorld().setBlock(getX(),getY(),getZ(),block); + return new ScriptBlock(this.world.getMCWorld(), block, this.pos); + } + } + + public ScriptBlock setBlock(IBlock block) { + this.world.getMCWorld().setBlock(getX(),getY(),getZ(),block.getMCBlock()); + return new ScriptBlock(this.world.getMCWorld(), block.getMCBlock(), this.pos); + } + + public boolean isContainer() { + return this.tile != null && this.tile instanceof IInventory?((IInventory)this.tile).getSizeInventory() > 0:false; + } + + public IContainer getContainer() { + if(!this.isContainer()) { + throw new CustomNPCsException("This block is not a container", new Object[0]); + } else { + return NpcAPI.Instance().getIContainer((IInventory)this.tile); + } + } + + public String getName() { + return Block.blockRegistry.getNameForObject(this.block) + ""; + } + + public String getDisplayName() { + return this.tile == null?this.getName():this.tile.blockType.getItemIconName(); + } + + public IWorld getWorld() { + return this.world; + } + + public Block getMCBlock() { + return this.block; + } + + public static void clearCache() { + blockCache.clear(); + } + + public boolean hasTileEntity() { + return this.tile != null; + } + + public TileEntity getMCTileEntity() { + return this.tile; + } + + public INbt getTileEntityNBT() { + NBTTagCompound compound = new NBTTagCompound(); + this.tile.writeToNBT(compound); + return NpcAPI.Instance().getINbt(compound); + } +} diff --git a/src/main/java/noppes/npcs/scripted/ScriptBlockPos.java b/src/main/java/noppes/npcs/scripted/ScriptBlockPos.java new file mode 100644 index 000000000..d8214e1c9 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/ScriptBlockPos.java @@ -0,0 +1,118 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted; + +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import noppes.npcs.scripted.interfaces.IPos; + +public class ScriptBlockPos implements IPos { + private BlockPos blockPos; + + public ScriptBlockPos(BlockPos pos) { + this.blockPos = pos; + } + + public int getX() { + return this.blockPos.getX(); + } + + public int getY() { + return this.blockPos.getY(); + } + + public int getZ() { + return this.blockPos.getZ(); + } + + public IPos up() { + return new ScriptBlockPos(this.blockPos.up()); + } + + public IPos up(int n) { + return new ScriptBlockPos(this.blockPos.up(n)); + } + + public IPos down() { + return new ScriptBlockPos(this.blockPos.down()); + } + + public IPos down(int n) { + return new ScriptBlockPos(this.blockPos.down(n)); + } + + public IPos north() { + return new ScriptBlockPos(this.blockPos.north()); + } + + public IPos north(int n) { + return new ScriptBlockPos(this.blockPos.north(n)); + } + + public IPos east() { + return new ScriptBlockPos(this.blockPos.east()); + } + + public IPos east(int n) { + return new ScriptBlockPos(this.blockPos.east(n)); + } + + public IPos south() { + return new ScriptBlockPos(this.blockPos.south()); + } + + public IPos south(int n) { + return new ScriptBlockPos(this.blockPos.south(n)); + } + + public IPos west() { + return new ScriptBlockPos(this.blockPos.west()); + } + + public IPos west(int n) { + return new ScriptBlockPos(this.blockPos.west(n)); + } + + public IPos add(int x, int y, int z) { + return new ScriptBlockPos(this.blockPos.add(x, y, z)); + } + + public IPos add(IPos pos) { + return new ScriptBlockPos(this.blockPos.add(pos.getMCBlockPos())); + } + + public IPos subtract(int x, int y, int z) { + return new ScriptBlockPos(this.blockPos.add(-x, -y, -z)); + } + + public IPos subtract(IPos pos) { + return new ScriptBlockPos(this.blockPos.add(-pos.getX(), -pos.getY(), -pos.getZ())); + } + + public IPos offset(int direction) { + return new ScriptBlockPos(this.blockPos.offset(EnumFacing.values()[direction])); + } + + public IPos offset(int direction, int n) { + return new ScriptBlockPos(this.blockPos.offset(EnumFacing.values()[direction], n)); + } + + public BlockPos getMCBlockPos() { + return this.blockPos; + } + + public double[] normalize() { + double d = Math.sqrt((double)(this.blockPos.getX() * this.blockPos.getX() + this.blockPos.getY() * this.blockPos.getY() + this.blockPos.getZ() * this.blockPos.getZ())); + return new double[]{(double)this.getX() / d, (double)this.getY() / d, (double)this.getZ() / d}; + } + + public double distanceTo(IPos pos) { + double d0 = (double)(this.getX() - pos.getX()); + double d1 = (double)(this.getY() - pos.getY()); + double d2 = (double)(this.getZ() - pos.getZ()); + return Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2); + } +} diff --git a/src/main/java/noppes/npcs/scripted/ScriptContainer.java b/src/main/java/noppes/npcs/scripted/ScriptContainer.java new file mode 100644 index 000000000..34c733a87 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/ScriptContainer.java @@ -0,0 +1,85 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted; + +import net.minecraft.block.Block; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import noppes.npcs.NoppesUtilPlayer; +import noppes.npcs.scripted.interfaces.IContainer; +import noppes.npcs.scripted.interfaces.IItemStack; + +public class ScriptContainer implements IContainer { + private IInventory inventory; + private Container container; + + public ScriptContainer(IInventory inventory) { + this.inventory = inventory; + } + + public ScriptContainer(Container container) { + this.container = container; + } + + public int getSize() { + return this.inventory != null ? this.inventory.getSizeInventory() : this.container.inventorySlots.size(); + } + + public IItemStack getSlot(int slot) { + if (slot >= 0 && slot < this.getSize()) { + return this.inventory != null ? NpcAPI.Instance().getIItemStack(this.inventory.getStackInSlot(slot)) : NpcAPI.Instance().getIItemStack(this.container.getSlot(slot).getStack()); + } else { + throw new CustomNPCsException("Slot is out of range " + slot, new Object[0]); + } + } + + public void setSlot(int slot, IItemStack item) { + if (slot >= 0 && slot < this.getSize()) { + ItemStack itemstack = item == null ? new ItemStack(Block.getBlockById(0)) : item.getMCItemStack(); + if (this.inventory != null) { + this.inventory.setInventorySlotContents(slot, itemstack); + } else { + this.container.putStackInSlot(slot, itemstack); + this.container.detectAndSendChanges(); + } + + } else { + throw new CustomNPCsException("Slot is out of range " + slot, new Object[0]); + } + } + + public int count(IItemStack item, boolean ignoreDamage, boolean ignoreNBT) { + int count = 0; + + for(int i = 0; i < this.getSize(); ++i) { + IItemStack toCompare = this.getSlot(i); + if (NoppesUtilPlayer.compareItems(item.getMCItemStack(), toCompare.getMCItemStack(), ignoreDamage, ignoreNBT)) { + count += toCompare.getStackSize(); + } + } + + return count; + } + + public IInventory getMCInventory() { + return this.inventory; + } + + public Container getMCContainer() { + return this.container; + } + + public IItemStack[] getItems() { + IItemStack[] items = new IItemStack[this.getSize()]; + + for(int i = 0; i < this.getSize(); ++i) { + items[i] = this.getSlot(i); + } + + return items; + } +} diff --git a/src/main/java/noppes/npcs/scripted/ScriptEntityParticle.java b/src/main/java/noppes/npcs/scripted/ScriptEntityParticle.java new file mode 100644 index 000000000..19ab0e360 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/ScriptEntityParticle.java @@ -0,0 +1,214 @@ +package noppes.npcs.scripted; + +import noppes.npcs.NoppesUtilServer; +import noppes.npcs.scripted.entity.ScriptEntity; + +/** + * Created by luisc on 9/8/2021. + */ +public class ScriptEntityParticle { + private String directory; + private int HEXcolor = 0xFFFFFF; + private int amount = 1; + private int maxAge = 20; + private double x = 0,y = 0,z = 0; + private double motionX = 0,motionY = 0,motionZ = 0; + private float gravity = 0; + private float scale1 = 1.0f,scale2 = 1.0f,scaleRate = 0.0f; + private float alpha1 = 1.0f,alpha2 = 1.0f,alphaRate = 0.0f; + private int scaleRateStart = 0, alphaRateStart = 0; + + public ScriptEntityParticle(String directory){ + this.directory = directory; + } + + public void spawnOnEntity(ScriptEntity entity){ + int entityID = entity.getMCEntity().getEntityId(); + NoppesUtilServer.spawnScriptedParticle(entity.getMCEntity(), directory, HEXcolor, amount, maxAge, + x, y, z, + motionX, motionY, motionZ, gravity, + scale1, scale2, scaleRate, scaleRateStart, + alpha1, alpha2, alphaRate, alphaRateStart, + entityID + ); + } + + public String getDirectory() { + return directory; + } + + public int getHEXcolor() { + return HEXcolor; + } + + public int getAmount() { + return amount; + } + + public int getMaxAge() { + return maxAge; + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + public double getMotionX() { + return motionX; + } + + public double getMotionY() { + return motionY; + } + + public double getMotionZ() { + return motionZ; + } + + public float getGravity() { + return gravity; + } + + public float getScale1() { + return scale1; + } + + public float getScale2() { + return scale2; + } + + public float getScaleRate() { + return scaleRate; + } + + public float getAlpha1() { + return alpha1; + } + + public float getAlpha2() { + return alpha2; + } + + public float getAlphaRate() { + return alphaRate; + } + + public int getScaleRateStart() { + return scaleRateStart; + } + + public int getAlphaRateStart() { + return alphaRateStart; + } + + public void setDirectory(String directory) { + this.directory = directory; + } + + public void setHEXcolor(int HEXcolor) { + this.HEXcolor = HEXcolor; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public void setMaxAge(int maxAge) { + this.maxAge = maxAge; + } + + public void setPosition(double x, double y, double z){ + this.x = x; + this.y = y; + this.z = z; + } + + public void setX(double x) { + this.x = x; + } + + public void setY(double y) { + this.y = y; + } + + public void setZ(double z) { + this.z = z; + } + + public void setMotion(double motionX, double motionY, double motionZ, float gravity){ + this.motionX = motionX; + this.motionY = motionY; + this.motionZ = motionZ; + this.gravity = gravity; + } + + public void setMotionX(double motionX) { + this.motionX = motionX; + } + + public void setMotionY(double motionY) { + this.motionY = motionY; + } + + public void setMotionZ(double motionZ) { + this.motionZ = motionZ; + } + + public void setGravity(float gravity) { + this.gravity = gravity; + } + + public void setScale(float scale1, float scale2, float scaleRate, int scaleRateStart){ + this.scale1 = scale1; + this.scale2 = scale2; + this.scaleRate = scaleRate; + this.scaleRateStart = scaleRateStart; + } + + public void setScale1(float scale1) { + this.scale1 = scale1; + } + + public void setScale2(float scale2) { + this.scale2 = scale2; + } + + public void setScaleRate(float scaleRate) { + this.scaleRate = scaleRate; + } + + public void setScaleRateStart(int scaleRateStart) { + this.scaleRateStart = scaleRateStart; + } + + public void setAlpha(float alpha1, float alpha2, float alphaRate, int alphaRateStart){ + this.alpha1 = alpha1; + this.alpha2 = alpha2; + this.alphaRate = alphaRate; + this.alphaRateStart = alphaRateStart; + } + + public void setAlpha1(float alpha1) { + this.alpha1 = alpha1; + } + + public void setAlpha2(float alpha2) { + this.alpha2 = alpha2; + } + + public void setAlphaRate(float alphaRate) { + this.alphaRate = alphaRate; + } + + public void setAlphaRateStart(int alphaRateStart) { + this.alphaRateStart = alphaRateStart; + } +} diff --git a/src/main/java/noppes/npcs/scripted/ScriptEventDialog.java b/src/main/java/noppes/npcs/scripted/ScriptEventDialog.java deleted file mode 100644 index 861faa27e..000000000 --- a/src/main/java/noppes/npcs/scripted/ScriptEventDialog.java +++ /dev/null @@ -1,15 +0,0 @@ -package noppes.npcs.scripted; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.DamageSource; -import noppes.npcs.controllers.ScriptController; - -public class ScriptEventDialog extends ScriptEvent{ - - /** - * @deprecated - */ - public boolean isClosing(){ - return true; - } -} diff --git a/src/main/java/noppes/npcs/scripted/ScriptFaction.java b/src/main/java/noppes/npcs/scripted/ScriptFaction.java index 003c08dba..972ecaf2b 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptFaction.java +++ b/src/main/java/noppes/npcs/scripted/ScriptFaction.java @@ -1,6 +1,8 @@ package noppes.npcs.scripted; import noppes.npcs.controllers.Faction; +import noppes.npcs.scripted.entity.ScriptNpc; +import noppes.npcs.scripted.entity.ScriptPlayer; public class ScriptFaction { private Faction faction; diff --git a/src/main/java/noppes/npcs/scripted/ScriptItemStack.java b/src/main/java/noppes/npcs/scripted/ScriptItemStack.java index 5be275499..97567e857 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptItemStack.java +++ b/src/main/java/noppes/npcs/scripted/ScriptItemStack.java @@ -13,9 +13,11 @@ import net.minecraft.nbt.NBTBase.NBTPrimitive; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; +import noppes.npcs.scripted.interfaces.IItemStack; +import noppes.npcs.scripted.interfaces.INbt; -public class ScriptItemStack { - protected ItemStack item; +public class ScriptItemStack implements IItemStack { + public ItemStack item; public ScriptItemStack(ItemStack item){ this.item = item; @@ -199,6 +201,21 @@ public class ScriptItemStack { return true; } + public INbt getNbt() { + NBTTagCompound compound = this.item.getTagCompound(); + if(compound == null) { + this.item.setTagCompound(compound = new NBTTagCompound()); + } + + return NpcAPI.Instance().getINbt(compound); + } + + public INbt getItemNbt() { + NBTTagCompound compound = new NBTTagCompound(); + this.item.writeToNBT(compound); + return NpcAPI.Instance().getINbt(compound); + } + /** * No support is given for this method. Dont use if you dont know what you are doing. * @return Minecraft ItemStack diff --git a/src/main/java/noppes/npcs/scripted/ScriptNbt.java b/src/main/java/noppes/npcs/scripted/ScriptNbt.java new file mode 100644 index 000000000..968ea698d --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/ScriptNbt.java @@ -0,0 +1,215 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted; + +import java.util.Iterator; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagDouble; +import net.minecraft.nbt.NBTTagFloat; +import net.minecraft.nbt.NBTTagInt; +import net.minecraft.nbt.NBTTagIntArray; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import noppes.npcs.scripted.interfaces.INbt; +import noppes.npcs.util.NBTJsonUtil; + +public class ScriptNbt implements INbt { + private NBTTagCompound compound; + + public ScriptNbt(NBTTagCompound compound) { + this.compound = compound; + } + + public void remove(String key) { + this.compound.removeTag(key); + } + + public boolean has(String key) { + return this.compound.hasKey(key); + } + + public boolean getBoolean(String key) { + return this.compound.getBoolean(key); + } + + public void setBoolean(String key, boolean value) { + this.compound.setBoolean(key, value); + } + + public short getShort(String key) { + return this.compound.getShort(key); + } + + public void setShort(String key, short value) { + this.compound.setShort(key, value); + } + + public int getInteger(String key) { + return this.compound.getInteger(key); + } + + public void setInteger(String key, int value) { + this.compound.setInteger(key, value); + } + + public byte getByte(String key) { + return this.compound.getByte(key); + } + + public void setByte(String key, byte value) { + this.compound.setByte(key, value); + } + + public long getLong(String key) { + return this.compound.getLong(key); + } + + public void setLong(String key, long value) { + this.compound.setLong(key, value); + } + + public double getDouble(String key) { + return this.compound.getDouble(key); + } + + public void setDouble(String key, double value) { + this.compound.setDouble(key, value); + } + + public float getFloat(String key) { + return this.compound.getFloat(key); + } + + public void setFloat(String key, float value) { + this.compound.setFloat(key, value); + } + + public String getString(String key) { + return this.compound.getString(key); + } + + public void setString(String key, String value) { + this.compound.setString(key, value); + } + + public byte[] getByteArray(String key) { + return this.compound.getByteArray(key); + } + + public void setByteArray(String key, byte[] value) { + this.compound.setByteArray(key, value); + } + + public int[] getIntegerArray(String key) { + return this.compound.getIntArray(key); + } + + public void setIntegerArray(String key, int[] value) { + this.compound.setIntArray(key, value); + } + + public Object[] getList(String key, int type) { + NBTTagList list = this.compound.getTagList(key, type); + Object[] nbts = new Object[list.tagCount()]; + + for(int i = 0; i < list.tagCount(); ++i) { + if(list.func_150303_d() == 10) { + nbts[i] = new ScriptNbt(list.getCompoundTagAt(i)); + } else if(list.func_150303_d() == 8) { + nbts[i] = list.getStringTagAt(i); + } else if(list.func_150303_d() == 6) { + nbts[i] = Double.valueOf(list.func_150309_d(i)); + } else if(list.func_150303_d() == 5) { + nbts[i] = Float.valueOf(list.func_150308_e(i)); + } else if(list.func_150303_d() == 3) { + nbts[i] = Integer.valueOf(list.getStringTagAt(i)); + } else if(list.func_150303_d() == 11) { + nbts[i] = list.func_150306_c(i); + } + } + + return nbts; + } + + public int getListType(String key) { + NBTBase b = this.compound.getTag(key); + if(b == null) { + return 0; + } else if(b.getId() != 9) { + throw new CustomNPCsException("NBT tag " + key + " isn\'t a list", new Object[0]); + } else { + return ((NBTTagList)b).func_150303_d(); + } + } + + public void setList(String key, Object[] value) { + NBTTagList list = new NBTTagList(); + Object[] var4 = value; + int var5 = value.length; + + for(int var6 = 0; var6 < var5; ++var6) { + Object nbt = var4[var6]; + if(nbt instanceof INbt) { + list.appendTag(((INbt) nbt).getMCNBT()); + } else if(nbt instanceof String) { + list.appendTag(new NBTTagString((String) nbt)); + } else if(nbt instanceof Double) { + list.appendTag(new NBTTagDouble(((Double) nbt).doubleValue())); + } else if(nbt instanceof Float) { + list.appendTag(new NBTTagFloat(((Float) nbt).floatValue())); + } else if(nbt instanceof Integer) { + list.appendTag(new NBTTagInt(((Integer) nbt).intValue())); + } else if(nbt instanceof int[]) { + list.appendTag(new NBTTagIntArray((int[]) ((int[]) nbt))); + } + } + + this.compound.setTag(key, list); + } + + public INbt getCompound(String key) { + return new ScriptNbt(this.compound.getCompoundTag(key)); + } + + public void setCompound(String key, INbt value) { + if(value == null) { + throw new CustomNPCsException("Value cant be null", new Object[0]); + } else { + this.compound.setTag(key, value.getMCNBT()); + } + } + + public String[] getKeys() { + return (String[])this.compound.func_150296_c().toArray(new String[this.compound.func_150296_c().size()]); + } + + public int getType(String key) { + return this.compound.func_150299_b(key); + } + + public NBTTagCompound getMCNBT() { + return this.compound; + } + + public String toJsonString() { + return NBTJsonUtil.Convert(this.compound); + } + + public boolean isEqual(INbt nbt) { + return nbt == null?false:this.compound.equals(nbt.getMCNBT()); + } + + public void clear() { + Iterator var1 = this.compound.func_150296_c().iterator(); + + while(var1.hasNext()) { + String name = (String)var1.next(); + this.compound.removeTag(name); + } + + } +} diff --git a/src/main/java/noppes/npcs/scripted/ScriptPixelmonPlayerData.java b/src/main/java/noppes/npcs/scripted/ScriptPixelmonPlayerData.java index e44476362..1efd16256 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptPixelmonPlayerData.java +++ b/src/main/java/noppes/npcs/scripted/ScriptPixelmonPlayerData.java @@ -4,6 +4,7 @@ import net.minecraft.entity.passive.EntityTameable; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.controllers.PixelmonHelper; +import noppes.npcs.scripted.entity.ScriptPixelmon; public class ScriptPixelmonPlayerData { private EntityPlayerMP player; diff --git a/src/main/java/noppes/npcs/scripted/ScriptWorld.java b/src/main/java/noppes/npcs/scripted/ScriptWorld.java index b22b335db..cbcc43f48 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptWorld.java +++ b/src/main/java/noppes/npcs/scripted/ScriptWorld.java @@ -18,21 +18,29 @@ import net.minecraft.nbt.NBTTagString; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntitySign; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import noppes.npcs.NoppesUtilServer; import noppes.npcs.blocks.tiles.TileBigSign; -import noppes.npcs.blocks.tiles.TileSign; import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.ServerCloneController; +import noppes.npcs.scripted.entity.ScriptEntity; +import noppes.npcs.scripted.entity.ScriptPlayer; +import noppes.npcs.scripted.interfaces.IBlock; +import noppes.npcs.scripted.interfaces.IWorld; -public class ScriptWorld{ +public class ScriptWorld implements IWorld { private static Map tempData = new HashMap(); - protected WorldServer world; + public WorldServer world; public ScriptWorld(WorldServer world){ this.world = world; } - + + public static ScriptWorld createNew(WorldServer world) { + return new ScriptWorld(world); + } + /** * @return The worlds time */ @@ -53,11 +61,11 @@ public class ScriptWorld{ * @param z World position z * @return The block at the given position. Returns null if there isn't a block */ - public ScriptItemStack getBlock(int x, int y, int z){ + public IBlock getBlock(int x, int y, int z){ Block block = world.getBlock(x, y, z); if(block == null || block.isAir(world, x, y, z)) return null; - return new ScriptItemStack(new ItemStack(block, 1, world.getBlockMetadata(x, y, z))); + return new ScriptBlock(world, block, new BlockPos(x,y,z)); } /** @@ -187,6 +195,14 @@ public class ScriptWorld{ return null; return new ScriptItemStack(new ItemStack(item, size, damage)); } + + /** + * @param directory The particle's texture directory. Use only forward slashes when writing a directory. Example: "customnpcs:textures/particle/tail.png" + * @return Returns ScriptEntityParticle object + */ + public ScriptEntityParticle createEntityParticle(String directory){ + return new ScriptEntityParticle(directory); + } /** * @param key Get temp data for this key @@ -333,13 +349,21 @@ public class ScriptWorld{ public ScriptScoreboard getScoreboard(){ return new ScriptScoreboard(); } - + + public BlockPos getMCBlockPos(int x, int y, int z){ + return new BlockPos(x,y,z); + } + /** * @since 1.7.10c * Expert use only * @return Returns minecraft world object */ - public World getMCWorld(){ - return world; + public WorldServer getMCWorld(){ + return this.world; + } + + public int getDimensionID(){ + return world.provider.dimensionId; } } diff --git a/src/main/java/noppes/npcs/scripted/ScriptAnimal.java b/src/main/java/noppes/npcs/scripted/entity/ScriptAnimal.java similarity index 58% rename from src/main/java/noppes/npcs/scripted/ScriptAnimal.java rename to src/main/java/noppes/npcs/scripted/entity/ScriptAnimal.java index 232d230bd..e1217aedb 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptAnimal.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptAnimal.java @@ -1,11 +1,12 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.entity; import net.minecraft.entity.passive.EntityAnimal; import noppes.npcs.scripted.constants.EntityType; +import noppes.npcs.scripted.interfaces.IAnimal; -public class ScriptAnimal extends ScriptLiving{ +public class ScriptAnimal extends ScriptLiving implements IAnimal { - public ScriptAnimal(EntityAnimal entity) { + public ScriptAnimal(T entity) { super(entity); } diff --git a/src/main/java/noppes/npcs/scripted/ScriptEntity.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java similarity index 70% rename from src/main/java/noppes/npcs/scripted/ScriptEntity.java rename to src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java index b7391b251..541ff0778 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptEntity.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java @@ -1,4 +1,4 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.entity; import java.util.ArrayList; import java.util.HashMap; @@ -18,18 +18,79 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagString; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; +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.constants.EntityType; +import noppes.npcs.scripted.interfaces.IEntity; +import noppes.npcs.scripted.interfaces.INbt; -public class ScriptEntity { - protected Entity entity; +public class ScriptEntity implements IEntity { + protected T entity; private Map tempData = new HashMap(); - - public ScriptEntity(Entity entity){ + + public ScriptEntity(T entity){ this.entity = entity; } + /** + * @param directory The particle's directory. Use only forward slashes when writing a directory. Example: "customnpcs:textures/particle/tail.png" + * @param HEXcolor The particle's color as a HEX integer + * @param amount The amount of particles to spawn + * @param maxAge The particle's maximum age in MC ticks + + * @param x The particle's x position + * @param y The particle's y position + * @param z The particle's z position + + * @param motionX The particle's speed in the x axis + * @param motionY The particle's speed in the y axis + * @param motionZ The particle's speed in the z axis + * @param gravity The particle's gravity + + * @param scale1 The particle's starting scale + * @param scale2 The particle's ending scale + * @param scaleRate Multiplier for the particle's scale growth rate + * @param scaleRateStart The time at which the particle begins growing/shrinking + + * @param alpha1 The particle's starting transparency + * @param alpha2 The particle's ending transparency + * @param scaleRate Multiplier for the particle's transparency growth rate + * @param alphaRateStart The time at which the particle begins appearing/fading + */ + public void spawnParticle(String directory, int HEXcolor, int amount, int maxAge, + double x, double y, double z, + double motionX, double motionY, double motionZ, float gravity, + float scale1, float scale2, float scaleRate, int scaleRateStart, + float alpha1, float alpha2, float alphaRate, int alphaRateStart + ) { + int entityID = entity.getEntityId(); + NoppesUtilServer.spawnScriptedParticle(entity, directory, HEXcolor, amount, maxAge, + x, y, z, + motionX, motionY, motionZ, gravity, + scale1, scale2, scaleRate, scaleRateStart, + alpha1, alpha2, alphaRate, alphaRateStart, + entityID + ); + } + public void spawnParticle(ScriptEntityParticle entityParticle) { entityParticle.spawnOnEntity(this); } + + public double getYOffset() { return entity.getYOffset(); } + + /** + * @return The entities width + */ + public double getWidth(){ return entity.width; } + + /** + * @return The entities height + */ + public double getHeight(){ return entity.height; } /** * @return The entities x position @@ -37,35 +98,35 @@ public class ScriptEntity { public double getX(){ return entity.posX; } - + /** * @param x The entities x position */ public void setX(double x){ entity.posX = x; } - + /** * @return The entities y position */ public double getY(){ return entity.posY; } - + /** * @param y The entities y position */ public void setY(double y){ entity.posY = y; } - + /** * @return The entities x position */ public double getZ(){ return entity.posZ; } - + /** * @param z The entities x position */ @@ -93,7 +154,7 @@ public class ScriptEntity { public int getBlockZ(){ return MathHelper.floor_double(entity.posZ); } - + /** * @param x The x position * @param y The y position @@ -103,7 +164,7 @@ public class ScriptEntity { entity.setPosition(x, y, z); } - + /** * @param range The search range for entities around this entity * @return Array of entities within range @@ -117,7 +178,7 @@ public class ScriptEntity { } return list.toArray(new ScriptEntity[list.size()]); } - + /** * @param range The search range for entities around this entity * @param type The EntityType you want to find @@ -135,7 +196,7 @@ public class ScriptEntity { cls = EntityMob.class; else if(type == EntityType.NPC) cls = EntityNPCInterface.class; - + List entities = entity.worldObj.getEntitiesWithinAABB(cls, entity.boundingBox.expand(range, range, range)); List list = new ArrayList(); for(Entity living : entities){ @@ -143,16 +204,16 @@ public class ScriptEntity { list.add(ScriptController.Instance.getScriptForEntity(living)); } return list.toArray(new ScriptEntity[list.size()]); - } + } + - /** * @return Whether the entity is alive or not */ public boolean isAlive(){ return entity.isEntityAlive(); } - + /** * @param key Get temp data for this key * @return Returns the stored temp data @@ -160,7 +221,7 @@ public class ScriptEntity { public Object getTempData(String key){ return tempData.get(key); } - + /** * Tempdata gets cleared when the entity gets unloaded or the world restarts * @param key The key for the data stored @@ -169,7 +230,7 @@ public class ScriptEntity { public void setTempData(String key, Object value){ tempData.put(key, value); } - + /** * @param key The key thats going to be tested against the temp data * @return Whether or not temp data containes the key @@ -177,21 +238,21 @@ public class ScriptEntity { public boolean hasTempData(String key){ return tempData.containsKey(key); } - + /** * @param key The key for the temp data to be removed */ public void removeTempData(String key){ tempData.remove(key); } - + /** * Remove all tempdata */ public void clearTempData(){ tempData.clear(); } - + /** * @param key The key of the data to be returned * @return Returns the stored data @@ -205,7 +266,7 @@ public class ScriptEntity { return ((NBTPrimitive)base).func_150286_g(); return ((NBTTagString)base).func_150285_a_(); } - + /** * Stored data persists through world restart. Unlike tempdata only Strings and Numbers can be saved * @param key The key for the data stored @@ -220,7 +281,7 @@ public class ScriptEntity { compound.setString(key, (String)value); saveStoredCompound(compound); } - + /** * @param key The key of the data to be checked * @return Returns whether or not the stored data contains the key @@ -228,7 +289,7 @@ public class ScriptEntity { public boolean hasStoredData(String key){ return getStoredCompound().hasKey(key); } - + /** * @param key The key of the data to be removed */ @@ -237,74 +298,74 @@ public class ScriptEntity { compound.removeTag(key); saveStoredCompound(compound); } - + /** * Remove all stored data */ public void clearStoredData(){ entity.getEntityData().removeTag("CNPCStoredData"); } - + private NBTTagCompound getStoredCompound(){ NBTTagCompound compound = entity.getEntityData().getCompoundTag("CNPCStoredData"); if(compound == null) entity.getEntityData().setTag("CNPCStoredData", compound = new NBTTagCompound()); return compound; } - + private void saveStoredCompound(NBTTagCompound compound){ entity.getEntityData().setTag("CNPCStoredData", compound); } - + /** * @return The age of this entity in ticks */ public long getAge(){ return entity.ticksExisted; } - + /** * Despawns this entity. Removes it permanently */ public void despawn(){ entity.isDead = true; } - + /** * @return Return whether or not this entity is standing in water */ public boolean inWater(){ return entity.isInsideOfMaterial(Material.water); } - + /** * @return Return whether or not this entity is standing in lava */ public boolean inLava(){ return entity.isInsideOfMaterial(Material.lava); } - + /** * @return Return whether or not this entity is standing in fire */ public boolean inFire(){ return entity.isInsideOfMaterial(Material.fire); } - + /** * @return Return whether or not this entity is on fire */ public boolean isBurning(){ return entity.isBurning(); } - + /** * @param ticks Amount of world ticks this entity will burn. 20 ticks equals 1 second */ public void setBurning(int ticks){ entity.setFire(ticks); } - + /** * Removes fire from this entity */ @@ -318,7 +379,7 @@ public class ScriptEntity { public String getTypeName(){ return EntityList.getEntityString(entity); } - + /** * @param item Item to be dropped */ @@ -332,7 +393,7 @@ public class ScriptEntity { public ScriptEntity getRider(){ return ScriptController.Instance.getScriptForEntity(entity.riddenByEntity); } - + /** * @param entity The entity to ride this entity */ @@ -350,7 +411,7 @@ public class ScriptEntity { public ScriptEntity getMount(){ return ScriptController.Instance.getScriptForEntity(entity.ridingEntity); } - + /** * @param entity The entity this entity will mount */ @@ -368,7 +429,7 @@ public class ScriptEntity { public int getType(){ return EntityType.UNKNOWN; } - + /** * @since 1.7.10c * @param type @EntityType to check @@ -377,33 +438,49 @@ public class ScriptEntity { public boolean typeOf(int type){ return type == EntityType.UNKNOWN; } - + /** * @param rotation The rotation to be set (0-360) */ public void setRotation(float rotation){ entity.rotationYaw = rotation; } - + /** * @return Current rotation of the npc */ public float getRotation(){ return entity.rotationYaw; } - + /** * @param power How strong the knockback is * @param direction The direction in which he flies back (0-360). Usually based on getRotation() */ 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.motionX *= 0.6D; - entity.motionZ *= 0.6D; - entity.attackEntityFrom(DamageSource.outOfWorld, 0.0001F); + 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.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) { + entity.hurtResistantTime = ticks; + }; + + public boolean hasCollided() { + return entity.isCollided; + } + /** * @since 1.7.10c * @return Returns whether or not this entity is sneaking @@ -411,7 +488,7 @@ public class ScriptEntity { public boolean isSneaking(){ return entity.isSneaking(); } - + /** * @since 1.7.10c * @return Returns whether or not this entity is sprinting @@ -419,13 +496,36 @@ public class ScriptEntity { public boolean isSprinting(){ return entity.isSprinting(); } - + /** * @since 1.7.10c * Expert users only * @return Returns minecrafts entity */ - public Entity getMCEntity(){ + public T getMCEntity(){ return entity; } -} + + public INbt getNbt() { + return NpcAPI.Instance().getINbt(this.entity.getEntityData()); + } + + public INbt getAllNbt() { + NBTTagCompound compound = new NBTTagCompound(); + this.entity.writeToNBT(compound); + return NpcAPI.Instance().getINbt(compound); + } + + public void setNbt(INbt nbt) { + this.entity.readFromNBT(nbt.getMCNBT()); + } + + public void storeAsClone(int tab, String name) { + NBTTagCompound compound = new NBTTagCompound(); + if (!this.entity.writeToNBTOptional(compound)) { + throw new CustomNPCsException("Cannot store dead entities", new Object[0]); + } else { + ServerCloneController.Instance.addClone(compound, name, tab); + } + } +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/scripted/ScriptLiving.java b/src/main/java/noppes/npcs/scripted/entity/ScriptLiving.java similarity index 79% rename from src/main/java/noppes/npcs/scripted/ScriptLiving.java rename to src/main/java/noppes/npcs/scripted/entity/ScriptLiving.java index 2809ebc24..9b06e5625 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptLiving.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptLiving.java @@ -1,17 +1,13 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.entity; -import net.minecraft.entity.NPCEntityHelper; import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import noppes.npcs.controllers.ScriptController; -import noppes.npcs.scripted.constants.EntityType; +import noppes.npcs.scripted.interfaces.IEntityLiving; -public class ScriptLiving extends ScriptLivingBase{ +public class ScriptLiving extends ScriptLivingBase implements IEntityLiving { - private EntityLiving entity; - public ScriptLiving(EntityLiving entity) { + private T entity; + public ScriptLiving(T entity) { super(entity); this.entity = entity; } diff --git a/src/main/java/noppes/npcs/scripted/ScriptLivingBase.java b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java similarity index 83% rename from src/main/java/noppes/npcs/scripted/ScriptLivingBase.java rename to src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java index 070433b6f..705de1b55 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptLivingBase.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java @@ -1,30 +1,21 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.entity; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTBase.NBTPrimitive; -import net.minecraft.nbt.NBTTagString; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.MathHelper; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; import noppes.npcs.controllers.ScriptController; +import noppes.npcs.scripted.ScriptItemStack; import noppes.npcs.scripted.constants.EntityType; +import noppes.npcs.scripted.interfaces.IEntityLivingBase; +import noppes.npcs.scripted.wrapper.ScriptDamageSource; -public class ScriptLivingBase extends ScriptEntity{ - protected EntityLivingBase entity; +public class ScriptLivingBase extends ScriptEntity implements IEntityLivingBase { + protected T entity; - public ScriptLivingBase(EntityLivingBase entity){ + public ScriptLivingBase(T entity){ super(entity); this.entity = entity; } @@ -42,6 +33,18 @@ public class ScriptLivingBase extends ScriptEntity{ public void setHealth(float health){ entity.setHealth(health); } + + public void hurt(float damage){ + entity.attackEntityFrom(DamageSource.generic,damage); + } + + public void hurt(float damage, ScriptEntity source) { + entity.attackEntityFrom(new EntityDamageSource(source.getTypeName(),source.getMCEntity()),damage); + } + + public void hurt(float damage, ScriptDamageSource damageSource) { + entity.attackEntityFrom(damageSource.getMCDamageSource(),damage); + } /** * @return Entity's max health @@ -95,7 +98,7 @@ public class ScriptLivingBase extends ScriptEntity{ * Expert use only * @return Returns the minecraft entity object */ - public EntityLivingBase getMinecraftEntity(){ + public T getMCEntity(){ return entity; } diff --git a/src/main/java/noppes/npcs/scripted/ScriptMonster.java b/src/main/java/noppes/npcs/scripted/entity/ScriptMonster.java similarity index 58% rename from src/main/java/noppes/npcs/scripted/ScriptMonster.java rename to src/main/java/noppes/npcs/scripted/entity/ScriptMonster.java index 12f504a66..8e7afdd8e 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptMonster.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptMonster.java @@ -1,12 +1,12 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.entity; -import net.minecraft.entity.EntityLiving; import net.minecraft.entity.monster.EntityMob; import noppes.npcs.scripted.constants.EntityType; +import noppes.npcs.scripted.interfaces.IMonster; -public class ScriptMonster extends ScriptLiving{ +public class ScriptMonster extends ScriptLiving implements IMonster { - public ScriptMonster(EntityMob entity) { + public ScriptMonster(T entity) { super(entity); } diff --git a/src/main/java/noppes/npcs/scripted/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java similarity index 93% rename from src/main/java/noppes/npcs/scripted/ScriptNpc.java rename to src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 6134ce704..14240d037 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -1,9 +1,7 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.entity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.item.Item; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; -import net.minecraft.util.MathHelper; import noppes.npcs.NoppesUtilServer; import noppes.npcs.constants.EnumAnimation; import noppes.npcs.constants.EnumJobType; @@ -11,9 +9,12 @@ import noppes.npcs.constants.EnumRoleType; import noppes.npcs.controllers.Line; import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; -import noppes.npcs.roles.JobBard; +import noppes.npcs.scripted.ScriptFaction; +import noppes.npcs.scripted.ScriptItemStack; import noppes.npcs.scripted.constants.AnimationType; import noppes.npcs.scripted.constants.EntityType; +import noppes.npcs.scripted.interfaces.ICustomNpc; +import noppes.npcs.scripted.interfaces.ITimers; import noppes.npcs.scripted.roles.ScriptJobBard; import noppes.npcs.scripted.roles.ScriptJobConversation; import noppes.npcs.scripted.roles.ScriptJobFollower; @@ -31,12 +32,16 @@ import noppes.npcs.scripted.roles.ScriptRoleTrader; import noppes.npcs.scripted.roles.ScriptRoleTransporter; import noppes.npcs.util.ValueUtil; -public class ScriptNpc extends ScriptLiving{ - protected EntityCustomNpc npc; - - public ScriptNpc(EntityCustomNpc npc){ +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class ScriptNpc extends ScriptLiving implements ICustomNpc { + public EntityCustomNpc npc; + + public ScriptNpc(T npc){ super(npc); - this.npc = npc; + this.npc = (EntityCustomNpc)npc; } /** @@ -431,6 +436,24 @@ public class ScriptNpc extends ScriptLiving{ public int getVisibleType(){ return npc.display.visible; } + + public void setVisibleTo(ScriptPlayer player, boolean visible) { + UUID uuid = player.player.getPersistentID(); + ArrayList uuidList = npc.display.invisibleToList; + if(uuidList != null) { + if (!uuidList.contains(uuid)) { + if (!visible) + npc.display.invisibleToList.add(uuid); + } else if (visible) { + npc.display.invisibleToList.remove(uuid); + } + } + npc.script.clientNeedsUpdate = true; + } + + public boolean isVisibleTo(ScriptPlayer player) { + return !npc.scriptInvisibleToPlayer(player.player); + } /** * @param type The visibility type of the name, 0:visible, 1:invisible, 2:when-attacking @@ -679,4 +702,8 @@ public class ScriptNpc extends ScriptLiving{ public long getAge(){ return npc.totalTicksAlive; } + + public ITimers getTimers() { + return ((EntityNPCInterface)this.npc).timers; + } } diff --git a/src/main/java/noppes/npcs/scripted/ScriptPixelmon.java b/src/main/java/noppes/npcs/scripted/entity/ScriptPixelmon.java similarity index 96% rename from src/main/java/noppes/npcs/scripted/ScriptPixelmon.java rename to src/main/java/noppes/npcs/scripted/entity/ScriptPixelmon.java index f3d1ef628..727ca20e8 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptPixelmon.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptPixelmon.java @@ -1,21 +1,21 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.entity; -import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.passive.EntityTameable; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.controllers.PixelmonHelper; +import noppes.npcs.scripted.interfaces.IPixelmon; import noppes.npcs.util.ValueUtil; -public class ScriptPixelmon extends ScriptAnimal{ - private EntityTameable pixelmon; +public class ScriptPixelmon extends ScriptAnimal implements IPixelmon { + private T pixelmon; private NBTTagCompound compound = null; - public ScriptPixelmon(EntityTameable pixelmon){ + public ScriptPixelmon(T pixelmon){ super(pixelmon); this.pixelmon = pixelmon; compound = new NBTTagCompound(); pixelmon.writeEntityToNBT(compound); } - public ScriptPixelmon(EntityTameable pixelmon, NBTTagCompound compound){ + public ScriptPixelmon(T pixelmon, NBTTagCompound compound){ this(pixelmon); this.compound = compound; } diff --git a/src/main/java/noppes/npcs/scripted/ScriptPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java similarity index 84% rename from src/main/java/noppes/npcs/scripted/ScriptPlayer.java rename to src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java index 19eb36dc6..55cfb4aed 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java @@ -1,5 +1,6 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.entity; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -14,6 +15,7 @@ import noppes.npcs.NoppesStringUtils; import noppes.npcs.NoppesUtilPlayer; import noppes.npcs.Server; import noppes.npcs.constants.EnumPacketClient; +import noppes.npcs.constants.EnumQuestType; import noppes.npcs.controllers.PixelmonHelper; import noppes.npcs.controllers.PlayerData; import noppes.npcs.controllers.PlayerDataController; @@ -22,12 +24,17 @@ import noppes.npcs.controllers.PlayerQuestData; import noppes.npcs.controllers.Quest; import noppes.npcs.controllers.QuestController; import noppes.npcs.controllers.QuestData; +import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.ScriptItemStack; +import noppes.npcs.scripted.ScriptPixelmonPlayerData; import noppes.npcs.scripted.constants.EntityType; +import noppes.npcs.scripted.interfaces.IPlayer; +import noppes.npcs.scripted.interfaces.ITimers; import noppes.npcs.util.ValueUtil; -public class ScriptPlayer extends ScriptLivingBase{ - protected EntityPlayerMP player; - public ScriptPlayer(EntityPlayerMP player){ +public class ScriptPlayer extends ScriptLivingBase implements IPlayer { + public T player; + public ScriptPlayer(T player){ super(player); this.player = player; } @@ -50,6 +57,18 @@ public class ScriptPlayer extends ScriptLivingBase{ public void setPosition(double x, double y, double z){ NoppesUtilPlayer.teleportPlayer(player, x, y, z, player.dimension); } + + public void setPosition(double x, double y, double z, int dimensionId){ + if (NpcAPI.Instance().getIWorld(dimensionId) == null) + return; + + NoppesUtilPlayer.teleportPlayer(player, x, y, z, dimensionId); + } + + public int getDimension(){ + return player.dimension; + } + public boolean hasFinishedQuest(int id){ PlayerQuestData data = PlayerDataController.instance.getPlayerData(player).questData; @@ -221,6 +240,7 @@ public class ScriptPlayer extends ScriptLivingBase{ } } } + this.updatePlayerInventory(); return true; } @@ -245,8 +265,14 @@ public class ScriptPlayer extends ScriptLivingBase{ * @return Returns whether or not it gave the item succesfully */ public boolean giveItem(ScriptItemStack item, int amount){ - String itemname = Item.itemRegistry.getNameForObject(item.getMCItemStack().getItem()); - return giveItem(itemname, item.getItemDamage(), amount); + if(item != null && item.getMCItemStack() != null) { + item.setStackSize(amount); + boolean bool = this.player.inventory.addItemStackToInventory(item.getMCItemStack()); + this.updatePlayerInventory(); + return bool; + } else { + return false; + } } /** @@ -290,7 +316,10 @@ public class ScriptPlayer extends ScriptLivingBase{ player.inventory.mainInventory[i] = null; } } - + + public void setRotation(float rotationYaw, float rotationPitch){ + NoppesUtilPlayer.teleportPlayer(player, player.posX, player.posY, player.posZ, rotationYaw, rotationPitch, player.dimension); + } /** * @param achievement The achievement id. For a complete list see http://minecraft.gamepedia.com/Achievements @@ -338,4 +367,20 @@ public class ScriptPlayer extends ScriptLivingBase{ return null; return new ScriptPixelmonPlayerData(player); } + + public ITimers getTimers() { + return PlayerDataController.instance.getPlayerData(player).timers; + } + + public void updatePlayerInventory() { + ((EntityPlayerMP)this.entity).inventoryContainer.detectAndSendChanges(); + PlayerQuestData playerdata = PlayerDataController.instance.getPlayerData(player).questData; + playerdata.checkQuestCompletion((EntityPlayer)this.entity, EnumQuestType.Item); + } + + public boolean checkGUIOpen() { + NoppesUtilPlayer.isGUIOpen(player); + PlayerData data = PlayerDataController.instance.getPlayerData(player); + return data.getGUIOpen(); + } } diff --git a/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java b/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java new file mode 100644 index 000000000..9aa5c5aa4 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java @@ -0,0 +1,16 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted.event; + +import cpw.mods.fml.common.eventhandler.Event; +import noppes.npcs.scripted.NpcAPI; + +public class CustomNPCsEvent extends Event{ + public final NpcAPI API = NpcAPI.Instance(); + + public CustomNPCsEvent() { + } +} diff --git a/src/main/java/noppes/npcs/scripted/event/ForgeEvent.java b/src/main/java/noppes/npcs/scripted/event/ForgeEvent.java new file mode 100644 index 000000000..29c03b5a8 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/event/ForgeEvent.java @@ -0,0 +1,46 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.event; + +import cpw.mods.fml.common.eventhandler.Cancelable; +import cpw.mods.fml.common.eventhandler.Event; +import noppes.npcs.scripted.interfaces.IWorld; +import noppes.npcs.scripted.interfaces.IEntity; + +@Cancelable +public class ForgeEvent extends CustomNPCsEvent { + public final Event event; + + public ForgeEvent(Event event) { + this.event = event; + } + + @Cancelable + public static class WorldEvent extends ForgeEvent { + public final IWorld world; + + public WorldEvent(net.minecraftforge.event.world.WorldEvent event, IWorld world) { + super(event); + this.world = world; + } + } + + @Cancelable + public static class EntityEvent extends ForgeEvent { + public final IEntity entity; + + public EntityEvent(net.minecraftforge.event.entity.EntityEvent event, IEntity entity) { + super(event); + this.entity = entity; + } + } + + public static class InitEvent extends ForgeEvent { + public InitEvent() { + super((Event)null); + } + } +} diff --git a/src/main/java/noppes/npcs/scripted/event/NpcEvent.java b/src/main/java/noppes/npcs/scripted/event/NpcEvent.java new file mode 100644 index 000000000..58994c14d --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/event/NpcEvent.java @@ -0,0 +1,145 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.event; + +import cpw.mods.fml.common.eventhandler.Cancelable; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.DamageSource; +import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.interfaces.*; + +public class NpcEvent extends CustomNPCsEvent { + public final ICustomNpc npc; + + public NpcEvent(ICustomNpc npc) { + this.npc = npc; + } + + public static class TimerEvent extends NpcEvent { + public final int id; + + public TimerEvent(ICustomNpc npc, int id) { + super(npc); + this.id = id; + } + } + + public static class CollideEvent extends NpcEvent { + public final IEntity entity; + + public CollideEvent(ICustomNpc npc, Entity entity) { + super(npc); + this.entity = NpcAPI.Instance().getIEntity(entity); + } + } + + @Cancelable + public static class DamagedEvent extends NpcEvent { + public final IDamageSource damageSource; + public final IEntity source; + public float damage; + public boolean clearTarget = false; + + public DamagedEvent(ICustomNpc npc, Entity source, float damage, DamageSource damagesource) { + super(npc); + this.source = NpcAPI.Instance().getIEntity(source); + this.damage = damage; + this.damageSource = NpcAPI.Instance().getIDamageSource(damagesource); + } + } + + public static class RangedLaunchedEvent extends NpcEvent { + public final IEntityLivingBase target; + public float damage; + //public List projectiles = new ArrayList(); + + public RangedLaunchedEvent(ICustomNpc npc, EntityLivingBase target, float damage) { + super(npc); + this.target = (IEntityLivingBase)NpcAPI.Instance().getIEntity(target); + this.damage = damage; + } + } + + @Cancelable + public static class MeleeAttackEvent extends NpcEvent { + public final IEntityLivingBase target; + public float damage; + + public MeleeAttackEvent(ICustomNpc npc, EntityLivingBase target, float damage) { + super(npc); + this.target = (IEntityLivingBase)NpcAPI.Instance().getIEntity(target); + this.damage = damage; + } + } + + public static class KilledEntityEvent extends NpcEvent { + public final IEntityLivingBase entity; + + public KilledEntityEvent(ICustomNpc npc, EntityLivingBase entity) { + super(npc); + this.entity = (IEntityLivingBase)NpcAPI.Instance().getIEntity(entity); + } + } + + public static class DiedEvent extends NpcEvent { + public final IDamageSource damageSource; + public final String type; + public final IEntity source; + public IItemStack[] droppedItems; + public int expDropped; + + public DiedEvent(ICustomNpc npc, DamageSource damagesource, Entity entity) { + super(npc); + this.damageSource = NpcAPI.Instance().getIDamageSource(damagesource); + this.type = damagesource.damageType; + this.source = NpcAPI.Instance().getIEntity(entity); + } + } + + @Cancelable + public static class InteractEvent extends NpcEvent { + public final IPlayer player; + + public InteractEvent(ICustomNpc npc, EntityPlayer player) { + super(npc); + this.player = (IPlayer)NpcAPI.Instance().getIEntity(player); + } + } + + @Cancelable + public static class TargetLostEvent extends NpcEvent { + public final IEntityLivingBase entity; + + public TargetLostEvent(ICustomNpc npc, EntityLivingBase entity) { + super(npc); + this.entity = (IEntityLivingBase)NpcAPI.Instance().getIEntity(entity); + } + } + + @Cancelable + public static class TargetEvent extends NpcEvent { + public IEntityLivingBase entity; + + public TargetEvent(ICustomNpc npc, EntityLivingBase entity) { + super(npc); + this.entity = (IEntityLivingBase) NpcAPI.Instance().getIEntity(entity); + } + } + + public static class UpdateEvent extends NpcEvent { + public UpdateEvent(ICustomNpc npc) { + super(npc); + } + } + + public static class InitEvent extends NpcEvent { + public InitEvent(ICustomNpc npc) { + super(npc); + } + } +} diff --git a/src/main/java/noppes/npcs/scripted/event/PlayerEvent.java b/src/main/java/noppes/npcs/scripted/event/PlayerEvent.java new file mode 100644 index 000000000..cc07fdb11 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/event/PlayerEvent.java @@ -0,0 +1,444 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.event; + +import cpw.mods.fml.common.eventhandler.Cancelable; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityXPOrb; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import noppes.npcs.scripted.*; +import noppes.npcs.scripted.entity.ScriptLivingBase; +import noppes.npcs.scripted.interfaces.*; + +public class PlayerEvent extends CustomNPCsEvent { + public final IPlayer player; + + public PlayerEvent(IPlayer player) { + this.player = player; + } + + @Cancelable + public static class ChatEvent extends PlayerEvent { + public String message; + + public ChatEvent(IPlayer player, String message) { + super(player); + this.message = message; + } + } + + public static class KeyPressedEvent extends PlayerEvent { + public final int key; + public final boolean isCtrlPressed; + public final boolean isAltPressed; + public final boolean isShiftPressed; + public final boolean isMetaPressed; + public final boolean keyDown; + + public KeyPressedEvent(IPlayer player, int key, boolean isCtrlPressed, boolean isAltPressed, boolean isShiftPressed, boolean isMetaPressed, boolean keyDown) { + super(player); + this.key = key; + this.isCtrlPressed = isCtrlPressed; + this.isAltPressed = isAltPressed; + this.isShiftPressed = isShiftPressed; + this.isMetaPressed = isMetaPressed; + this.keyDown = keyDown; + } + } + + public static class MouseClickedEvent extends PlayerEvent { + public final int button; + public final int mouseWheel; + public final boolean buttonDown; + + public MouseClickedEvent(IPlayer player, int button, int mouseWheel, boolean buttonDown){ + super(player); + this.button = button; + this.mouseWheel = mouseWheel; + this.buttonDown = buttonDown; + } + } + + public static class PickupXPEvent extends PlayerEvent { + public final int amount; + + public PickupXPEvent(IPlayer player, EntityXPOrb orb) { + super(player); + this.amount = orb.xpValue; + } + } + + public static class LevelUpEvent extends PlayerEvent { + public final int change; + + public LevelUpEvent(IPlayer player, int change) { + super(player); + this.change = change; + } + } + + public static class LogoutEvent extends PlayerEvent { + public LogoutEvent(IPlayer player) { + super(player); + } + } + + public static class LoginEvent extends PlayerEvent { + public LoginEvent(IPlayer player) { + super(player); + } + } + + public static class RespawnEvent extends PlayerEvent { + public RespawnEvent(IPlayer player) { + super(player); + } + } + + public static class ChangedDimension extends PlayerEvent { + public final int fromDim; + public final int toDim; + + public ChangedDimension(IPlayer player, int fromDim, int toDim){ + super(player); + this.fromDim = fromDim; + this.toDim = toDim; + } + } + + public static class TimerEvent extends PlayerEvent { + public final int id; + + public TimerEvent(IPlayer player, int id) { + super(player); + this.id = id; + } + } + + @Cancelable + public static class DamagedEvent extends PlayerEvent { + public final IDamageSource damageSource; + public final IEntity source; + public float damage; + public boolean clearTarget = false; + + public DamagedEvent(IPlayer player, Entity source, float damage, DamageSource damagesource) { + super(player); + this.source = NpcAPI.Instance().getIEntity(source); + this.damage = damage; + this.damageSource = NpcAPI.Instance().getIDamageSource(damagesource); + } + } + + @Cancelable + public static class LightningEvent extends PlayerEvent { + public LightningEvent(IPlayer player) { + super(player); + } + } + + @Cancelable + public static class SoundEvent extends PlayerEvent { + public final String name; + public final float pitch; + public final float volume; + + public SoundEvent(IPlayer player, String name, float pitch, float volume) { + super(player); + this.name = name; + this.pitch = pitch; + this.volume = volume; + } + } + + public static class FallEvent extends PlayerEvent { + public final float distance; + + public FallEvent(IPlayer player, float distance){ + super(player); + this.distance = distance; + } + } + + public static class JumpEvent extends PlayerEvent { + public JumpEvent(IPlayer player){ + super(player); + } + } + + public static class KilledEntityEvent extends PlayerEvent { + public final IEntityLivingBase entity; + + public KilledEntityEvent(IPlayer player, EntityLivingBase entity) { + super(player); + this.entity = new ScriptLivingBase<>(entity);//NpcAPI.Instance().getIEntity(entity); + } + } + + @Cancelable + public static class DiedEvent extends PlayerEvent { + public final IDamageSource damageSource; + public final String type; + public final IEntity source; + + public DiedEvent(IPlayer player, DamageSource damagesource, Entity entity) { + super(player); + this.damageSource = NpcAPI.Instance().getIDamageSource(damagesource); + this.type = damagesource.getDamageType(); + this.source = NpcAPI.Instance().getIEntity(entity); + } + } + + @Cancelable + public static class RangedLaunchedEvent extends PlayerEvent { + public final IItemStack bow; + public int charge; + + public RangedLaunchedEvent(IPlayer player, ItemStack bow, int charge) { + super(player); + this.bow = NpcAPI.Instance().getIItemStack(bow); + this.charge = charge; + } + } + + @Cancelable + public static class DamagedEntityEvent extends PlayerEvent { + public final IDamageSource damageSource; + public final IEntity target; + public float damage; + + public DamagedEntityEvent(IPlayer player, Entity target, float damage, DamageSource damagesource) { + super(player); + this.target = NpcAPI.Instance().getIEntity(target); + this.damage = damage; + this.damageSource = NpcAPI.Instance().getIDamageSource(damagesource); + } + } + + public static class ContainerClosed extends PlayerEvent { + public final IContainer container; + + public ContainerClosed(IPlayer player, IContainer container) { + super(player); + this.container = container; + } + } + + public static class ContainerOpen extends PlayerEvent { + public final IContainer container; + + public ContainerOpen(IPlayer player, IContainer container) { + super(player); + this.container = container; + } + } + + @Cancelable + public static class PickUpEvent extends PlayerEvent { + public final IItemStack item; + + public PickUpEvent(IPlayer player, IItemStack item) { + super(player); + this.item = item; + } + } + + @Cancelable + public static class DropEvent extends PlayerEvent { + public final IItemStack[] items; + + public DropEvent(IPlayer player, IItemStack[] items) { + super(player); + this.items = items; + } + } + + @Cancelable + public static class TossEvent extends PlayerEvent { + public final IItemStack item; + + public TossEvent(IPlayer player, IItemStack item) { + super(player); + this.item = item; + } + } + + @Cancelable + public static class AttackEvent extends PlayerEvent { + public final int type; + public final Object target; + + public AttackEvent(IPlayer player, int type, Object target) { + super(player); + this.type = type; + this.target = target; + } + } + + @Cancelable + public static class InteractEvent extends PlayerEvent { + public final int type; + public final Object target; + + public InteractEvent(IPlayer player, int type, Object target) { + super(player); + this.type = type; + this.target = target; + } + } + + public static class UpdateEvent extends PlayerEvent { + public UpdateEvent(IPlayer player) { + super(player); + } + } + + public static class InitEvent extends PlayerEvent { + public InitEvent(IPlayer player) { + super(player); + } + } + + public static class StartUsingItem extends PlayerEvent { + public final IItemStack item; + public final int duration; + + public StartUsingItem(IPlayer player, ItemStack item, int duration){ + super(player); + + this.item = NpcAPI.Instance().getIItemStack(item); + this.duration = duration; + } + } + public static class UsingItem extends PlayerEvent { + public final IItemStack item; + public final int duration; + + public UsingItem(IPlayer player, ItemStack item, int duration){ + super(player); + + this.item = NpcAPI.Instance().getIItemStack(item); + this.duration = duration; + } + } + public static class StopUsingItem extends PlayerEvent { + public final IItemStack item; + public final int duration; + + public StopUsingItem(IPlayer player, ItemStack item, int duration){ + super(player); + + this.item = NpcAPI.Instance().getIItemStack(item); + this.duration = duration; + } + } + public static class FinishUsingItem extends PlayerEvent { + public final IItemStack item; + public final int duration; + + public FinishUsingItem(IPlayer player, ItemStack item, int duration){ + super(player); + + this.item = NpcAPI.Instance().getIItemStack(item); + this.duration = duration; + } + } + + @Cancelable + public static class BreakEvent extends PlayerEvent { + public final IBlock block; + public int exp; + + public BreakEvent(IPlayer player, IBlock block, int exp) { + super(player); + this.block = block; + this.exp = exp; + } + } + + public static class UseHoe extends PlayerEvent { + public final IItemStack hoe; + public final int x; + public final int y; + public final int z; + + public UseHoe(IPlayer player, ItemStack item, int x, int y, int z) { + super(player); + this.hoe = new ScriptItemStack(item); + this.x = x; + this.y = y; + this.z = z; + } + } + + public static class WakeUp extends PlayerEvent{ + public final boolean setSpawn; + + public WakeUp(IPlayer player, boolean setSpawn) { + super(player); + this.setSpawn = setSpawn; + } + } + + public static class Sleep extends PlayerEvent { + public final int x; + public final int y; + public final int z; + + public Sleep(IPlayer player, int x, int y, int z) { + super(player); + this.x = x; + this.y = y; + this.z = z; + } + } + + public static class Achievement extends PlayerEvent { + public final String description; + + public Achievement(IPlayer player, String description) { + super(player); + this.description = description; + } + } + + public static class FillBucket extends PlayerEvent { + public final IItemStack current; + public final IItemStack result; + + public FillBucket(IPlayer player, ItemStack current, ItemStack result) { + super(player); + this.current = new ScriptItemStack(current); + this.result = new ScriptItemStack(result); + } + } + + public static class Bonemeal extends PlayerEvent { + public final IBlock block; + public final int x; + public final int y; + public final int z; + + public Bonemeal(IPlayer player, int x, int y, int z, World world) { + super(player); + this.block = API.getIBlock(world, x, y, z); + this.x = x; + this.y = y; + this.z = z; + } + } + + public static class RangedChargeEvent extends PlayerEvent { + public RangedChargeEvent(IPlayer player) { + super(player); + } + } +} diff --git a/src/main/java/noppes/npcs/scripted/ScriptEvent.java b/src/main/java/noppes/npcs/scripted/event/ScriptEvent.java similarity index 84% rename from src/main/java/noppes/npcs/scripted/ScriptEvent.java rename to src/main/java/noppes/npcs/scripted/event/ScriptEvent.java index fc5ccc9a1..5a5a8cbfd 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptEvent.java +++ b/src/main/java/noppes/npcs/scripted/event/ScriptEvent.java @@ -1,4 +1,4 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.event; public class ScriptEvent{ diff --git a/src/main/java/noppes/npcs/scripted/ScriptEventAttack.java b/src/main/java/noppes/npcs/scripted/event/ScriptEventAttack.java similarity index 90% rename from src/main/java/noppes/npcs/scripted/ScriptEventAttack.java rename to src/main/java/noppes/npcs/scripted/event/ScriptEventAttack.java index 218b6e681..5b37517a4 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptEventAttack.java +++ b/src/main/java/noppes/npcs/scripted/event/ScriptEventAttack.java @@ -1,8 +1,8 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.event; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.DamageSource; import noppes.npcs.controllers.ScriptController; +import noppes.npcs.scripted.entity.ScriptLivingBase; public class ScriptEventAttack extends ScriptEvent{ diff --git a/src/main/java/noppes/npcs/scripted/ScriptEventDamaged.java b/src/main/java/noppes/npcs/scripted/event/ScriptEventDamaged.java similarity index 92% rename from src/main/java/noppes/npcs/scripted/ScriptEventDamaged.java rename to src/main/java/noppes/npcs/scripted/event/ScriptEventDamaged.java index 27cf4a26f..8a21666e5 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptEventDamaged.java +++ b/src/main/java/noppes/npcs/scripted/event/ScriptEventDamaged.java @@ -1,8 +1,9 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.event; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.DamageSource; import noppes.npcs.controllers.ScriptController; +import noppes.npcs.scripted.entity.ScriptLivingBase; public class ScriptEventDamaged extends ScriptEvent{ diff --git a/src/main/java/noppes/npcs/scripted/event/ScriptEventDialog.java b/src/main/java/noppes/npcs/scripted/event/ScriptEventDialog.java new file mode 100644 index 000000000..af4e300ad --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/event/ScriptEventDialog.java @@ -0,0 +1,11 @@ +package noppes.npcs.scripted.event; + +public class ScriptEventDialog extends ScriptEvent{ + + /** + * @deprecated + */ + public boolean isClosing(){ + return true; + } +} diff --git a/src/main/java/noppes/npcs/scripted/ScriptEventKilled.java b/src/main/java/noppes/npcs/scripted/event/ScriptEventKilled.java similarity index 88% rename from src/main/java/noppes/npcs/scripted/ScriptEventKilled.java rename to src/main/java/noppes/npcs/scripted/event/ScriptEventKilled.java index 37c7e202f..606002a34 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptEventKilled.java +++ b/src/main/java/noppes/npcs/scripted/event/ScriptEventKilled.java @@ -1,8 +1,9 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.event; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.DamageSource; import noppes.npcs.controllers.ScriptController; +import noppes.npcs.scripted.entity.ScriptLivingBase; public class ScriptEventKilled extends ScriptEvent{ diff --git a/src/main/java/noppes/npcs/scripted/ScriptEventTarget.java b/src/main/java/noppes/npcs/scripted/event/ScriptEventTarget.java similarity index 77% rename from src/main/java/noppes/npcs/scripted/ScriptEventTarget.java rename to src/main/java/noppes/npcs/scripted/event/ScriptEventTarget.java index 9fa1f28d3..1bb9832c2 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptEventTarget.java +++ b/src/main/java/noppes/npcs/scripted/event/ScriptEventTarget.java @@ -1,10 +1,10 @@ -package noppes.npcs.scripted; +package noppes.npcs.scripted.event; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.DamageSource; import noppes.npcs.controllers.ScriptController; +import noppes.npcs.scripted.entity.ScriptLivingBase; -public class ScriptEventTarget extends ScriptEvent{ +public class ScriptEventTarget extends ScriptEvent { private ScriptLivingBase target; diff --git a/src/main/java/noppes/npcs/scripted/event/ScriptEventTimer.java b/src/main/java/noppes/npcs/scripted/event/ScriptEventTimer.java new file mode 100644 index 000000000..0fdc3584b --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/event/ScriptEventTimer.java @@ -0,0 +1,13 @@ +package noppes.npcs.scripted.event; + +public class ScriptEventTimer extends ScriptEvent { + private int id; + + public ScriptEventTimer(int id){ + this.id = id; + } + + public int getId(){ + return id; + } +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IAnimal.java b/src/main/java/noppes/npcs/scripted/interfaces/IAnimal.java new file mode 100644 index 000000000..4bf435547 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IAnimal.java @@ -0,0 +1,11 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.entity.passive.EntityAnimal; + +public interface IAnimal extends IEntityLiving { +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IBlock.java b/src/main/java/noppes/npcs/scripted/interfaces/IBlock.java new file mode 100644 index 000000000..bb84849df --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IBlock.java @@ -0,0 +1,41 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; + +public interface IBlock { + int getX(); + + int getY(); + + int getZ(); + + IPos getPos(); + + String getName(); + + void remove(); + + boolean isAir(); + + IBlock setBlock(String var1); + + IBlock setBlock(IBlock var1); + + boolean isContainer(); + + IContainer getContainer(); + + IWorld getWorld(); + + TileEntity getMCTileEntity(); + + Block getMCBlock(); + + String getDisplayName(); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IContainer.java b/src/main/java/noppes/npcs/scripted/interfaces/IContainer.java new file mode 100644 index 000000000..915980288 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IContainer.java @@ -0,0 +1,25 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; + +public interface IContainer { + int getSize(); + + IItemStack getSlot(int var1); + + void setSlot(int slot, IItemStack item); + + IInventory getMCInventory(); + + Container getMCContainer(); + + int count(IItemStack var1, boolean var2, boolean var3); + + IItemStack[] getItems(); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java new file mode 100644 index 000000000..69c78d02d --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -0,0 +1,403 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.entity.EntityCreature; +import noppes.npcs.scripted.ScriptFaction; +import noppes.npcs.scripted.ScriptItemStack; +import noppes.npcs.scripted.entity.ScriptLivingBase; +import noppes.npcs.scripted.entity.ScriptPlayer; +import noppes.npcs.scripted.roles.*; + +public interface ICustomNpc extends IEntityLiving { + /** + * @return Returns the current npcs size 1-30 + */ + public int getSize(); + + /** + * @param size The size of the npc (1-30) default is 5 + */ + public void setSize(int size); + + /** + * @return Returns the current npcs modelType of the NPC + */ + public int getModelType(); + + /** + * @param modelType The modelType of the NPC. 0: Steve, 1: Steve64, 2: Alex + */ + public void setModelType(int modelType); + + /** + * @return The npcs name + */ + public String getName(); + + public void setRotation(float rotation); + /** + * @param name The name of the npc + */ + public void setName(String name); + + /** + * @since 1.7.10 + * @return The npcs title + */ + public String getTitle(); + + /** + * @since 1.7.10 + * @param title The title of the npc + */ + public void setTitle(String title); + + /** + * @return The npcs texture + */ + public String getTexture(); + + /** + * @param texture The texture of the npc + */ + public void setTexture(String texture); + + /** + * @return Home position x + */ + public int getHomeX(); + + /** + * @param x The home x position + */ + public void setHomeX(int x); + + /** + * @return Home position x + */ + public int getHomeY(); + + /** + * @param y The home y position + */ + public void setHomeY(int y); + + /** + * @return Home position x + */ + public int getHomeZ(); + + /** + * @param z The home x position + */ + public void setHomeZ(int z); + + /** + * @param x The home x position + * @param y The home y position + * @param z The home z position + */ + public void setHome(int x, int y, int z); + /** + * @param health New max health + */ + public void setMaxHealth(int health); + + /** + * @param bo Whether or not the npc will try to return to his home position + */ + public void setReturnToHome(boolean bo); + + /** + * @return Whether or not the npc returns home + */ + public boolean getReturnToHome(); + + /** + * @return The faction of the npc + */ + public ScriptFaction getFaction(); + + /** + * @param id The id of the new faction + */ + public void setFaction(int id); + + public int getType(); + + public boolean typeOf(int type); + + /** + * @param target The targeted npc + * @param item The item you want to shoot + * @param accuracy Accuracy of the shot (0-100) + */ + public void shootItem(ScriptLivingBase target, ScriptItemStack item, int accuracy); + + /** + * @param message The message the npc will say + */ + public void say(String message); + + /** + * @param message The message the npc will say + */ + public void say(ScriptPlayer player, String message); + + /** + * Kill the npc, doesnt't despawn it + */ + public void kill(); + + /** + * Basically completely resets the npc. This will also call the Init script + */ + public void reset(); + + /** + * @return Returns the npcs current role + */ + public ScriptRoleInterface getRole(); + + /** + * @return Returns the npcs current job + */ + public ScriptJobInterface getJob(); + + /** + * @return The item held in the right hand + */ + public ScriptItemStack getRightItem(); + + /** + * @param item Item to be held in the right hand + */ + public void setRightItem(ScriptItemStack item); + + /** + * @return The item held in the left hand + */ + public ScriptItemStack getLefttItem(); + + /** + * @param item Item to be held in the left hand + */ + public void setLeftItem(ScriptItemStack item); + + /** + * @return Returns the projectile the npc uses + */ + public ScriptItemStack getProjectileItem(); + + /** + * @param item Item to be used as projectile + */ + public void setProjectileItem(ScriptItemStack item); + + /** + * @param slot The armor slot to return. 0:head, 1:body, 2:legs, 3:boots + * @return Returns the worn armor in slot + */ + public ScriptItemStack getArmor(int slot); + + /** + * @param slot The armor slot to set. 0:head, 1:body, 2:legs, 3:boots + * @param item Item to be set as armor + */ + public void setArmor(int slot, ScriptItemStack item); + + /** + * @param type The AnimationType + */ + public void setAnimation(int type); + + /** + * @param type The visibility type of the npc, 0:visible, 1:invisible, 2:semi-visible + */ + public void setVisibleType(int type); + + /** + * @return The visibility type of the npc, 0:visible, 1:invisible, 2:semi-visible + */ + public int getVisibleType(); + + /** + * + * @param player The player this NPC becomes visible/invisible to + * @param visible True if you want the NPC to be invisible to the player, false otherwise + */ + public void setVisibleTo(ScriptPlayer player, boolean visible); + + /** + * + * @param player The player this NPC is visible/invisible to + * @return False if the NPC has been toggled to be invisible to this player, true otherwise. + * If setVisibleTo(player,visible) was not called to make this NPC invisible to the player at any point + * in the NPC's life, this function will return true regardless of the value of isVisible(). + */ + public boolean isVisibleTo(ScriptPlayer player); + + /** + * @param type The visibility type of the name, 0:visible, 1:invisible, 2:when-attacking + */ + public void setShowName(int type); + + /** + * @return Returns the visibility type of the name, 0:visible, 1:invisible, 2:when-attacking + */ + public int getShowName(); + + /** + * @return Returns the visiblity of the boss bar, 0:invisible, 1:visible, 2:when-attacking + */ + public int getShowBossBar(); + + /** + * @param type The visibility type of the boss bar, 0:invisible, 1:visible, 2:when-attacking + */ + public void setShowBossBar(int type); + + /** + * @return The melee strength + */ + public int getMeleeStrength(); + + /** + * @param strength The melee strength + */ + public void setMeleeStrength(int strength); + + /** + * @return The melee speed + */ + public int getMeleeSpeed(); + + /** + * @param speed The melee speed + */ + public void setMeleeSpeed(int speed); + + /** + * @return The ranged strength + */ + public int getRangedStrength(); + + /** + * @param strength The ranged strength + */ + public void setRangedStrength(int strength); + + /** + * @return The ranged speed + */ + public int getRangedSpeed(); + + /** + * @param speed The ranged speed + */ + public void setRangedSpeed(int speed); + + /** + * @return The ranged burst count + */ + public int getRangedBurst(); + + /** + * @param count The ranged burst count + */ + public void setRangedBurst(int count); + + /** + * @param player The player to give the item to + * @param item The item given to the player + */ + public void giveItem(ScriptPlayer player, ScriptItemStack 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); + + public void setHeadScale(float x, float y, float z); + + public void setBodyScale(float x, float y, float z); + + public void setArmsScale(float x, float y, float z); + + public void setLegsScale(float x, float y, float z); + + /** + * @since 1.7.10c + * @param resistance Explosion resistance (0-2) default is 1 + */ + public void setExplosionResistance(float resistance); + + /** + * @since 1.7.10c + * @return Returns Explosion Resistance + */ + public float getExplosionResistance(); + + /** + * @param resistance Melee resistance (0-2) default is 1 + */ + public void setMeleeResistance(float resistance); + + /** + * @return Returns Melee Resistance + */ + public float getMeleeResistance(); + + /** + * @param resistance Arrow resistance (0-2) default is 1 + */ + public void setArrowResistance(float resistance); + + /** + * @return Returns Arrow Resistance + */ + public float getArrowResistance(); + + /** + * @param resistance Knockback resistance (0-2) default is 1 + */ + public void setKnockbackResistance(float resistance); + + /** + * @return Returns Knockback Resistance + */ + public float getKnockbackResistance(); + + /** + * @param type Retaliation type. 0:normal, 1:panic, 2:retreat, 3:nothing + */ + public void setRetaliateType(int type); + + /** + * @return Returns the combat health regen per second + */ + public int getCombatRegen(); + + /** + * @param regen The combat health regen per second + */ + public void setCombatRegen(int regen); + + /** + * @return Returns the health regen per second when not in combat + */ + public int getHealthRegen(); + + /** + * @param regen The health regen per second when not in combat + */ + public void setHealthRegen(int regen); + + public long getAge(); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IDamageSource.java b/src/main/java/noppes/npcs/scripted/interfaces/IDamageSource.java new file mode 100644 index 000000000..8d7dd5caa --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IDamageSource.java @@ -0,0 +1,20 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.util.DamageSource; + +public interface IDamageSource { + String getType(); + + boolean isProjectile(); + + IEntity getTrueSource(); + + IEntity getImmediateSource(); + + DamageSource getMCDamageSource(); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IEntity.java b/src/main/java/noppes/npcs/scripted/interfaces/IEntity.java new file mode 100644 index 000000000..27cdbc218 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IEntity.java @@ -0,0 +1,311 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.entity.Entity; +import noppes.npcs.scripted.entity.ScriptEntity; +import noppes.npcs.scripted.ScriptItemStack; + +public interface IEntity { + /** + * @param directory The particle's directory. Use only forward slashes when writing a directory. Example: "customnpcs:textures/particle/tail.png" + * @param HEXcolor The particle's color as a HEX integer + * @param amount The amount of particles to spawn + * @param maxAge The particle's maximum age in MC ticks + + * @param x The particle's x position + * @param y The particle's y position + * @param z The particle's z position + + * @param motionX The particle's speed in the x axis + * @param motionY The particle's speed in the y axis + * @param motionZ The particle's speed in the z axis + * @param gravity The particle's gravity + + * @param scale1 The particle's starting scale + * @param scale2 The particle's ending scale + * @param scaleRate Multiplier for the particle's scale growth rate + * @param scaleRateStart The time at which the particle begins growing/shrinking + + * @param alpha1 The particle's starting transparency + * @param alpha2 The particle's ending transparency + * @param scaleRate Multiplier for the particle's transparency growth rate + * @param alphaRateStart The time at which the particle begins appearing/fading + */ + public void spawnParticle(String directory, int HEXcolor, int amount, int maxAge, + double x, double y, double z, + double motionX, double motionY, double motionZ, float gravity, + float scale1, float scale2, float scaleRate, int scaleRateStart, + float alpha1, float alpha2, float alphaRate, int alphaRateStart + ); + + public double getYOffset(); + + /** + * @return The entities width + */ + public double getWidth(); + + /** + * @return The entities height + */ + public double getHeight(); + + /** + * @return The entities x position + */ + public double getX(); + + /** + * @param x The entities x position + */ + public void setX(double x); + + /** + * @return The entities y position + */ + public double getY(); + + /** + * @param y The entities y position + */ + public void setY(double y); + + /** + * @return The entities x position + */ + public double getZ(); + + /** + * @param z The entities x position + */ + public void setZ(double z); + + /** + * @return The block x position + */ + public int getBlockX(); + + /** + * @return The block y position + */ + public int getBlockY(); + + /** + * @return The block z position + */ + public int getBlockZ(); + + /** + * @param x The x position + * @param y The y position + * @param z The z position + */ + public void setPosition(double x, double y, double z); + + + /** + * @param range The search range for entities around this entity + * @return Array of entities within range + */ + public ScriptEntity[] getSurroundingEntities(int range); + + /** + * @param range The search range for entities around this entity + * @param type The EntityType you want to find + * @return Array of entities within range + */ + public ScriptEntity[] getSurroundingEntities(int range, int type); + + /** + * @return Whether the entity is alive or not + */ + public boolean isAlive(); + + /** + * @param key Get temp data for this key + * @return Returns the stored temp data + */ + public Object getTempData(String key); + + /** + * Tempdata gets cleared when the entity gets unloaded or the world restarts + * @param key The key for the data stored + * @param value The data stored + */ + public void setTempData(String key, Object value); + + /** + * @param key The key thats going to be tested against the temp data + * @return Whether or not temp data containes the key + */ + public boolean hasTempData(String key); + + /** + * @param key The key for the temp data to be removed + */ + public void removeTempData(String key); + + /** + * Remove all tempdata + */ + public void clearTempData(); + + /** + * @param key The key of the data to be returned + * @return Returns the stored data + */ + public Object getStoredData(String key); + + /** + * Stored data persists through world restart. Unlike tempdata only Strings and Numbers can be saved + * @param key The key for the data stored + * @param value The data stored. This data can be either a Number or a String. Other data is not stored + */ + public void setStoredData(String key, Object value); + + /** + * @param key The key of the data to be checked + * @return Returns whether or not the stored data contains the key + */ + public boolean hasStoredData(String key); + + /** + * @param key The key of the data to be removed + */ + public void removeStoredData(String key); + + /** + * Remove all stored data + */ + public void clearStoredData(); + + /** + * @return The age of this entity in ticks + */ + public long getAge(); + + /** + * Despawns this entity. Removes it permanently + */ + public void despawn(); + + /** + * @return Return whether or not this entity is standing in water + */ + public boolean inWater(); + + /** + * @return Return whether or not this entity is standing in lava + */ + public boolean inLava(); + + /** + * @return Return whether or not this entity is standing in fire + */ + public boolean inFire(); + + /** + * @return Return whether or not this entity is on fire + */ + public boolean isBurning(); + + /** + * @param ticks Amount of world ticks this entity will burn. 20 ticks equals 1 second + */ + public void setBurning(int ticks); + + /** + * Removes fire from this entity + */ + public void extinguish(); + + /** + * @return Name as which it's registered in minecraft + */ + public String getTypeName(); + + /** + * @param item Item to be dropped + */ + public void dropItem(ScriptItemStack item); + + /** + * @return Return the rider + */ + public ScriptEntity getRider(); + + /** + * @param entity The entity to ride this entity + */ + public void setRider(ScriptEntity entity); + + /** + * @return Return the entity, this entity is riding + */ + public ScriptEntity getMount(); + + /** + * @param entity The entity this entity will mount + */ + public void setMount(ScriptEntity entity); + + /** + * @see noppes.npcs.scripted.constants.EntityType + * @return Returns the EntityType of this entity + */ + public int getType(); + + /** + * @since 1.7.10c + * @param type @EntityType to check + * @return Returns whether the entity is type of the given @EntityType + */ + public boolean typeOf(int type); + + /** + * @param rotation The rotation to be set (0-360) + */ + public void setRotation(float rotation); + + /** + * @return Current rotation of the npc + */ + public float getRotation(); + + /** + * @param power How strong the knockback is + * @param direction The direction in which he flies back (0-360). Usually based on getRotation() + */ + public void knockback(int power, float direction); + + public void knockback(int xpower, int ypower, int zpower, float direction); + + public void setImmune(int ticks); + + public boolean hasCollided(); + + /** + * @since 1.7.10c + * @return Returns whether or not this entity is sneaking + */ + public boolean isSneaking(); + + /** + * @since 1.7.10c + * @return Returns whether or not this entity is sprinting + */ + public boolean isSprinting(); + + /** + * @since 1.7.10c + * Expert users only + * @return Returns minecrafts entity + */ + public T getMCEntity(); + + void storeAsClone(int tab, String name); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IEntityLiving.java b/src/main/java/noppes/npcs/scripted/interfaces/IEntityLiving.java new file mode 100644 index 000000000..4fda07e84 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IEntityLiving.java @@ -0,0 +1,18 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.entity.EntityLiving; + +public interface IEntityLiving extends IEntityLivingBase { + boolean isNavigating(); + + void clearNavigation(); + + void navigateTo(double var1, double var3, double var5, double var7); + + T getMCEntity(); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IEntityLivingBase.java b/src/main/java/noppes/npcs/scripted/interfaces/IEntityLivingBase.java new file mode 100644 index 000000000..1fc2b472d --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IEntityLivingBase.java @@ -0,0 +1,108 @@ +package noppes.npcs.scripted.interfaces; + +import net.minecraft.entity.EntityLivingBase; +import noppes.npcs.scripted.entity.ScriptEntity; +import noppes.npcs.scripted.ScriptItemStack; +import noppes.npcs.scripted.entity.ScriptLivingBase; + +public interface IEntityLivingBase extends IEntity { + /** + * @return The entity's current health + */ + public float getHealth(); + + /** + * @param health The new health of this entity + */ + public void setHealth(float health); + + /** + * @return Entity's max health + */ + public float getMaxHealth(); + /** + * @return Whether or not this entity is attacking something + */ + public boolean isAttacking(); + + /** + * @param living Entity which this entity will attack + */ + public void setAttackTarget(ScriptLivingBase living); + + /** + * @return The entity which this entity is attacking + */ + public ScriptLivingBase getAttackTarget(); + + public int getType(); + + public boolean typeOf(int type); + + /** + * @param entity Entity to check + * @return Whether or not this entity can see the given entity + */ + public boolean canSeeEntity(ScriptEntity entity); + + /** + * Expert use only + * @return Returns the minecraft entity object + */ + public T getMCEntity(); + + /** + * Makes the entity swing its hand + */ + public void swingHand(); + + /** + * Works the same as the /effect command + * @param effect + * @param duration The duration in seconds + * @param strength The amplifier of the potion effect + * @param hideParticles Whether or not you want to hide potion particles + */ + public void addPotionEffect(int effect, int duration, int strength, boolean hideParticles); + + /** + * Clears all potion effects + */ + public void clearPotionEffects(); + + /** + * @since 1.7.10c + * @param effect Potion effect to check + * @return Returns -1 if its not active. Otherwise returns the strenght of the potion + */ + public int getPotionEffect(int effect); + + /** + * Note not all Living Entities support this + * @since 1.7.10c + * @return The item the entity is holding + */ + public ScriptItemStack getHeldItem(); + + /** + * Note not all Living Entities support this + * @since 1.7.10c + * @param item The item to be set + */ + public void setHeldItem(ScriptItemStack item); + + /** + * Note not all Living Entities support this + * @param slot Slot of what armor piece to get, 0:boots, 1:pants, 2:body, 3:head + * @return The item in the given slot + */ + public ScriptItemStack getArmor(int slot); + + /** + * Note not all Living Entities support this + * @since 1.7.10c + * @param slot Slot of what armor piece to set, 0:boots, 1:pants, 2:body, 3:head + * @param item Item to be set + */ + public void setArmor(int slot, ScriptItemStack item); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IItemStack.java b/src/main/java/noppes/npcs/scripted/interfaces/IItemStack.java new file mode 100644 index 000000000..afd04e263 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IItemStack.java @@ -0,0 +1,113 @@ +package noppes.npcs.scripted.interfaces; + +import net.minecraft.item.ItemStack; + +public interface IItemStack { + public String getName(); + + /** + * @return Returns the stacksize + */ + public int getStackSize(); + + /** + * @return Return whether or not the item has a custom name + */ + public boolean hasCustomName(); + + /** + * @param name The custom name this item will get + */ + public void setCustomName(String name); + + /** + * @return Return the ingame displayed name. This is either the item name or the custom name if it has one. + */ + public String getDisplayName(); + + /** + * @return Get the items ingame name. Use this incase the item ingame has custom name and you want the original name. + */ + public String getItemName(); + + /** + * @param size The size of the itemstack. A number between 1 and 64 + */ + public void setStackSize(int size); + + /** + * @return Returns the item damage of this item. For tools this is the durability for other items the color and more. + */ + public int getItemDamage(); + + /** + * @param value The value to be set as item damage. For tools this is the durability for other items the color and more. + */ + public void setItemDamage(int value); + + /** + * @param key The key of this NBTTag + * @param value The value to be stored. Can be a Number or String + */ + public void setTag(String key, Object value); + + /** + * @param key The key of the NBTTag + * @return Returns whether or not the key exists + */ + public boolean hasTag(String key); + + /** + * @param key The key of the NBTTag + * @return Returns the value associated with the key. Returns null of it doesnt exist + */ + public Object getTag(String key); + + public boolean isEnchanted(); + + /** + * @since 1.7.10d + * @param id The enchantment id + * @return + */ + public boolean hasEnchant(int id); + + /** + * @since 1.7.10d + * @return Returns whether this item is a book + */ + public boolean isWrittenBook(); + + /** + * @since 1.7.10d + * @return Returns the books title + */ + public String getBookTitle(); + + /** + * @since 1.7.10d + * @return Returns the books author + */ + public String getBookAuthor(); + + /** + * @since 1.7.10d + * @return If the item is a book, returns a string array with book pages + */ + public String[] getBookText(); + + /** + * @return Returns whether or not this item is a block + */ + public boolean isBlock(); + + public INbt getNbt(); + + public INbt getItemNbt(); + + /** + * No support is given for this method. Dont use if you dont know what you are doing. + * @return Minecraft ItemStack + */ + public ItemStack getMCItemStack(); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IMonster.java b/src/main/java/noppes/npcs/scripted/interfaces/IMonster.java new file mode 100644 index 000000000..99baf9350 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IMonster.java @@ -0,0 +1,11 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.entity.monster.EntityMob; + +public interface IMonster extends IEntityLiving { +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/INbt.java b/src/main/java/noppes/npcs/scripted/interfaces/INbt.java new file mode 100644 index 000000000..0ff2b9f77 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/INbt.java @@ -0,0 +1,76 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.nbt.NBTTagCompound; + +public interface INbt { + void remove(String var1); + + boolean has(String var1); + + boolean getBoolean(String var1); + + void setBoolean(String var1, boolean var2); + + short getShort(String var1); + + void setShort(String var1, short var2); + + int getInteger(String var1); + + void setInteger(String var1, int var2); + + byte getByte(String var1); + + void setByte(String var1, byte var2); + + long getLong(String var1); + + void setLong(String var1, long var2); + + double getDouble(String var1); + + void setDouble(String var1, double var2); + + float getFloat(String var1); + + void setFloat(String var1, float var2); + + String getString(String var1); + + void setString(String var1, String var2); + + byte[] getByteArray(String var1); + + void setByteArray(String var1, byte[] var2); + + int[] getIntegerArray(String var1); + + void setIntegerArray(String var1, int[] var2); + + Object[] getList(String var1, int var2); + + int getListType(String var1); + + void setList(String var1, Object[] var2); + + INbt getCompound(String var1); + + void setCompound(String var1, INbt var2); + + String[] getKeys(); + + int getType(String var1); + + NBTTagCompound getMCNBT(); + + String toJsonString(); + + boolean isEqual(INbt var1); + + void clear(); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IPixelmon.java b/src/main/java/noppes/npcs/scripted/interfaces/IPixelmon.java new file mode 100644 index 000000000..b744ac4cc --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IPixelmon.java @@ -0,0 +1,11 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.entity.passive.EntityTameable; + +public interface IPixelmon extends IAnimal { +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IPlayer.java b/src/main/java/noppes/npcs/scripted/interfaces/IPlayer.java new file mode 100644 index 000000000..c83d258a8 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IPlayer.java @@ -0,0 +1,177 @@ +package noppes.npcs.scripted.interfaces; + +import net.minecraft.entity.player.EntityPlayerMP; +import noppes.npcs.scripted.ScriptItemStack; +import noppes.npcs.scripted.ScriptPixelmonPlayerData; + +public interface IPlayer extends IEntityLivingBase { + /** + * @return Returns the displayed name of the player + */ + public String getDisplayName(); + + /** + * @return Returns the players name + */ + public String getName(); + + public void setPosition(double x, double y, double z); + + public void setPosition(double x, double y, double z, int dimensionId); + + public boolean hasFinishedQuest(int id); + + public boolean hasActiveQuest(int id); + + public boolean hasReadDialog(int id); + + /** + * Add the quest from active quest list + * @param id The Quest ID + */ + public void startQuest(int id); + + /** + * Add the quest from finished quest list + * @param id The Quest ID + */ + public void finishQuest(int id); + /** + * Removes the quest from active quest list + * @param id The Quest ID + */ + public void stopQuest(int id); + + /** + * Removes the quest from active and finished quest list + * @param id The Quest ID + */ + public void removeQuest(int id); + + public int getType(); + + public boolean typeOf(int type); + /** + * @param faction The faction id + * @param points The points to increase. Use negative values to decrease + */ + public void addFactionPoints(int faction, int points); + + /** + * @param faction The faction id + * @return points + */ + public int getFactionPoints(int faction); + + /** + * @param message The message you want to send + */ + public void sendMessage(String message); + + /** + * @return Return gamemode. 0: Survival, 1: Creative, 2: Adventure + */ + public int getMode(); + + /** + * @param type The gamemode type. 0:SURVIVAL, 1:CREATIVE, 2:ADVENTURE + */ + public void setMode(int type); + + /** + * @param item The item to be checked + * @return How many of this item the player has + */ + public int inventoryItemCount(ScriptItemStack item); + + /** + * @since 1.7.10d + * @return Returns a IItemStack array size 36 + */ + public ScriptItemStack[] getInventory(); + + /** + * @param item The Item type to be removed + * @param amount How many will be removed + * @return Returns true if the items were removed succesfully. Returns false incase a bigger amount than what the player has was given + */ + public boolean removeItem(ScriptItemStack item, int amount); + + /** + * @since 1.7.10c + * @param id The items name + * @param damage The damage value + * @param amount How many will be removed + * @return Returns true if the items were removed succesfully. Returns false incase a bigger amount than what the player has was given or item doesnt exist + */ + public boolean removeItem(String id, int damage, int amount); + + /** + * @since 1.7.10c + * @param item Item to be added + * @param amount The amount of the item to be added + * @return Returns whether or not it gave the item succesfully + */ + public boolean giveItem(ScriptItemStack item, int amount); + + /** + * @since 1.7.10c + * @param id The items name + * @param damage The damage value + * @param amount The amount of the item to be added + * @return Returns whether or not it gave the item succesfully + */ + public boolean giveItem(String id, int damage, int amount); + + /** + * Same as the /spawnpoint command + * @param x The x position + * @param y The y position + * @param z The z position + */ + public void setSpawnpoint(int x, int y, int z); + + public void resetSpawnpoint(); + + /** + * @param item The item to be removed from the players inventory + */ + public void removeAllItems(ScriptItemStack item); + + + /** + * @param achievement The achievement id. For a complete list see http://minecraft.gamepedia.com/Achievements + * @return Returns whether or not the player has this achievement + */ + public boolean hasAchievement(String achievement); + + /** + * @param permission Bukkit/Cauldron permission + * @return Returns whether or not the player has the permission + */ + public boolean hasBukkitPermission(String permission); + + /** + * @since 1.7.10c + * @return Returns the exp level + */ + public int getExpLevel(); + + /** + * @since 1.7.10c + * @param level The new exp level you want to set + */ + public void setExpLevel(int level); + + /** + * Requires pixelmon to be installed + * @since 1.7.10d + */ + public ScriptPixelmonPlayerData getPixelmonData(); + + public ITimers getTimers(); + + public void updatePlayerInventory(); + + public boolean checkGUIOpen(); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IPos.java b/src/main/java/noppes/npcs/scripted/interfaces/IPos.java new file mode 100644 index 000000000..3743f60aa --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IPos.java @@ -0,0 +1,58 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +import net.minecraft.util.math.BlockPos; + +public interface IPos { + int getX(); + + int getY(); + + int getZ(); + + IPos up(); + + IPos up(int var1); + + IPos down(); + + IPos down(int var1); + + IPos north(); + + IPos north(int var1); + + IPos east(); + + IPos east(int var1); + + IPos south(); + + IPos south(int var1); + + IPos west(); + + IPos west(int var1); + + IPos add(int var1, int var2, int var3); + + IPos add(IPos var1); + + IPos subtract(int var1, int var2, int var3); + + IPos subtract(IPos var1); + + double[] normalize(); + + BlockPos getMCBlockPos(); + + IPos offset(int var1); + + IPos offset(int var1, int var2); + + double distanceTo(IPos var1); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ITimers.java b/src/main/java/noppes/npcs/scripted/interfaces/ITimers.java new file mode 100644 index 000000000..c01509e34 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/ITimers.java @@ -0,0 +1,20 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package noppes.npcs.scripted.interfaces; + +public interface ITimers { + void start(int var1, int var2, boolean var3); + + void forceStart(int var1, int var2, boolean var3); + + boolean has(int var1); + + boolean stop(int var1); + + void reset(int var1); + + void clear(); +} diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java b/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java new file mode 100644 index 000000000..9c7b14534 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java @@ -0,0 +1,215 @@ +package noppes.npcs.scripted.interfaces; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import noppes.npcs.scripted.*; +import noppes.npcs.scripted.entity.ScriptEntity; +import noppes.npcs.scripted.entity.ScriptPlayer; + +public interface IWorld { + /** + * @return The worlds time + */ + public long getTime(); + + /** + * @return The total world time + */ + public long getTotalTime(); + + /** + * @param x World position x + * @param y World position y + * @param z World position z + * @return The block at the given position. Returns null if there isn't a block + */ + public IBlock getBlock(int x, int y, int z); + + /** + * @param x World position x + * @param y World position y + * @param z World position z + * @return Text from signs + * @since 1.7.10d + */ + public String getSignText(int x, int y, int z); + + /** + * @param x World position x + * @param y World position y + * @param z World position z + * @param item The block to be set + */ + public void setBlock(int x, int y, int z, ScriptItemStack item); + + /** + * @param x World position x + * @param y World position y + * @param z World position z + */ + public void removeBlock(int x, int y, int z); + + /** + * @param name The name of the player to be returned + * @return The Player with name. Null is returned when the player isnt found + */ + public ScriptPlayer getPlayer(String name); + + /** + * @param time The world time to be set + */ + public void setTime(long time); + + /** + * @return Whether or not its daytime + */ + public boolean isDay(); + + /** + * @return Whether or not its currently raining + */ + public boolean isRaining(); + + /** + * @param bo Set if it's raining + */ + public void setRaining(boolean bo); + + /** + * @param x The x position + * @param y The y position + * @param z The z position + */ + public void thunderStrike(double x, double y, double z); + + /** + * Sends a packet from the server to the client everytime its called. Probably should not use this too much. + * @param particle Particle name. Particle name list: http://minecraft.gamepedia.com/Particles + * @param x The x position + * @param y The y position + * @param z The z position + * @param dx Usually used for the x motion + * @param dy Usually used for the y motion + * @param dz Usually used for the z motion + * @param speed Speed of the particles, usually between 0 and 1 + * @param count Particle count + */ + public void spawnParticle(String particle, double x, double y, double z, double dx, double dy, double dz, double speed, int count); + + /** + * @param id The items name + * @param damage The damage value + * @param size The number of items in the item + * @return Returns the item + */ + public ScriptItemStack createItem(String id, int damage, int size); + + /** + * @param directory The particle's texture directory. Use only forward slashes when writing a directory. Example: "customnpcs:textures/particle/tail.png" + * @return Returns ScriptEntityParticle object + */ + public ScriptEntityParticle createEntityParticle(String directory); + + /** + * @param key Get temp data for this key + * @return Returns the stored temp data + */ + public Object getTempData(String key); + + /** + * Tempdata gets cleared when the server restarts. All worlds share the same temp data. + * @param key The key for the data stored + * @param value The data stored + */ + public void setTempData(String key, Object value); + + /** + * @param key The key thats going to be tested against the temp data + * @return Whether or not temp data containes the key + */ + public boolean hasTempData(String key); + + /** + * @param key The key for the temp data to be removed + */ + public void removeTempData(String key); + + /** + * Removes all tempdata + */ + public void clearTempData(); + + /** + * @param key The key of the data to be returned + * @return Returns the stored data + */ + public Object getStoredData(String key); + + /** + * Stored data persists through world restart. Unlike tempdata only Strings and Numbers can be saved + * @param key The key for the data stored + * @param value The data stored. This data can be either a Number or a String. Other data is not stored + */ + public void setStoredData(String key, Object value); + + /** + * @param key The key of the data to be checked + * @return Returns whether or not the stored data contains the key + */ + public boolean hasStoredData(String key); + + /** + * @param key The key of the data to be removed + */ + public void removeStoredData(String key); + + /** + * Remove all stored data + */ + public void clearStoredData(); + + /** + * @param x Position x + * @param y Position y + * @param z Position z + * @param range Range of the explosion + * @param fire Whether or not the explosion does fire damage + * @param grief Whether or not the explosion does damage to blocks + */ + public void explode(double x, double y, double z, float range, boolean fire, boolean grief); + + public ScriptPlayer[] getAllServerPlayers(); + + /** + * @since 1.7.10c + * @param x Position x + * @param z Position z + * @return Returns the name of the biome + */ + public String getBiomeName(int x, int z); + + /** + * Lets you spawn a server side cloned entity + * @param x The x position the clone will be spawned at + * @param y The y position the clone will be spawned at + * @param z The z position the clone will be spawned at + * @param tab The tab in which the clone is + * @param name Name of the cloned entity + * @return Returns the entity which was spawned + */ + public ScriptEntity spawnClone(int x, int y, int z, int tab, String name); + + public ScriptScoreboard getScoreboard(); + + BlockPos getMCBlockPos(int x, int y, int z); + + /** + * @since 1.7.10c + * Expert use only + * @return Returns minecraft world object + */ + public WorldServer getMCWorld(); + + public int getDimensionID(); +} diff --git a/src/main/java/noppes/npcs/scripted/roles/ScriptJobConversation.java b/src/main/java/noppes/npcs/scripted/roles/ScriptJobConversation.java index 45d403e34..5f92c6d92 100644 --- a/src/main/java/noppes/npcs/scripted/roles/ScriptJobConversation.java +++ b/src/main/java/noppes/npcs/scripted/roles/ScriptJobConversation.java @@ -2,10 +2,6 @@ package noppes.npcs.scripted.roles; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.roles.JobConversation; -import noppes.npcs.roles.JobGuard; -import noppes.npcs.roles.JobItemGiver; -import noppes.npcs.scripted.ScriptItemStack; -import noppes.npcs.scripted.ScriptPlayer; import noppes.npcs.scripted.constants.JobType; public class ScriptJobConversation extends ScriptJobInterface{ diff --git a/src/main/java/noppes/npcs/scripted/roles/ScriptJobFollower.java b/src/main/java/noppes/npcs/scripted/roles/ScriptJobFollower.java index f12e9cb88..c2ddd5d82 100644 --- a/src/main/java/noppes/npcs/scripted/roles/ScriptJobFollower.java +++ b/src/main/java/noppes/npcs/scripted/roles/ScriptJobFollower.java @@ -2,8 +2,7 @@ package noppes.npcs.scripted.roles; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.roles.JobFollower; -import noppes.npcs.roles.JobGuard; -import noppes.npcs.scripted.ScriptNpc; +import noppes.npcs.scripted.entity.ScriptNpc; import noppes.npcs.scripted.constants.JobType; public class ScriptJobFollower extends ScriptJobInterface{ diff --git a/src/main/java/noppes/npcs/scripted/roles/ScriptJobHealer.java b/src/main/java/noppes/npcs/scripted/roles/ScriptJobHealer.java index 8c6c934ce..52bcaefc9 100644 --- a/src/main/java/noppes/npcs/scripted/roles/ScriptJobHealer.java +++ b/src/main/java/noppes/npcs/scripted/roles/ScriptJobHealer.java @@ -1,9 +1,8 @@ package noppes.npcs.scripted.roles; import noppes.npcs.entity.EntityNPCInterface; -import noppes.npcs.roles.JobGuard; import noppes.npcs.roles.JobHealer; -import noppes.npcs.scripted.ScriptLivingBase; +import noppes.npcs.scripted.entity.ScriptLivingBase; import noppes.npcs.scripted.constants.JobType; public class ScriptJobHealer extends ScriptJobInterface{ @@ -14,7 +13,7 @@ public class ScriptJobHealer extends ScriptJobInterface{ } public void heal(ScriptLivingBase entity, float amount){ - job.heal(entity.getMinecraftEntity(), amount); + job.heal(entity.getMCEntity(), amount); } @Override diff --git a/src/main/java/noppes/npcs/scripted/roles/ScriptJobItemGiver.java b/src/main/java/noppes/npcs/scripted/roles/ScriptJobItemGiver.java index e2d81c5c2..046f89dac 100644 --- a/src/main/java/noppes/npcs/scripted/roles/ScriptJobItemGiver.java +++ b/src/main/java/noppes/npcs/scripted/roles/ScriptJobItemGiver.java @@ -1,10 +1,7 @@ package noppes.npcs.scripted.roles; import noppes.npcs.entity.EntityNPCInterface; -import noppes.npcs.roles.JobGuard; import noppes.npcs.roles.JobItemGiver; -import noppes.npcs.scripted.ScriptItemStack; -import noppes.npcs.scripted.ScriptPlayer; import noppes.npcs.scripted.constants.JobType; public class ScriptJobItemGiver extends ScriptJobInterface{ diff --git a/src/main/java/noppes/npcs/scripted/roles/ScriptJobPuppet.java b/src/main/java/noppes/npcs/scripted/roles/ScriptJobPuppet.java index 7177de312..20b12965f 100644 --- a/src/main/java/noppes/npcs/scripted/roles/ScriptJobPuppet.java +++ b/src/main/java/noppes/npcs/scripted/roles/ScriptJobPuppet.java @@ -1,11 +1,7 @@ package noppes.npcs.scripted.roles; -import noppes.npcs.controllers.ScriptController; import noppes.npcs.entity.EntityNPCInterface; -import noppes.npcs.roles.JobGuard; -import noppes.npcs.roles.JobHealer; import noppes.npcs.roles.JobPuppet; -import noppes.npcs.scripted.ScriptLivingBase; import noppes.npcs.scripted.constants.JobType; public class ScriptJobPuppet extends ScriptJobInterface{ diff --git a/src/main/java/noppes/npcs/scripted/roles/ScriptJobSpawner.java b/src/main/java/noppes/npcs/scripted/roles/ScriptJobSpawner.java index 178afc911..cf9529be8 100644 --- a/src/main/java/noppes/npcs/scripted/roles/ScriptJobSpawner.java +++ b/src/main/java/noppes/npcs/scripted/roles/ScriptJobSpawner.java @@ -1,18 +1,12 @@ package noppes.npcs.scripted.roles; import java.util.ArrayList; -import java.util.Iterator; import net.minecraft.entity.EntityLivingBase; -import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.ScriptController; import noppes.npcs.entity.EntityNPCInterface; -import noppes.npcs.roles.JobGuard; -import noppes.npcs.roles.JobItemGiver; import noppes.npcs.roles.JobSpawner; -import noppes.npcs.scripted.ScriptItemStack; -import noppes.npcs.scripted.ScriptLivingBase; -import noppes.npcs.scripted.ScriptPlayer; +import noppes.npcs.scripted.entity.ScriptLivingBase; import noppes.npcs.scripted.constants.JobType; public class ScriptJobSpawner extends ScriptJobInterface{ diff --git a/src/main/java/noppes/npcs/scripted/roles/ScriptRoleFollower.java b/src/main/java/noppes/npcs/scripted/roles/ScriptRoleFollower.java index 3b65007c6..d10bd8dad 100644 --- a/src/main/java/noppes/npcs/scripted/roles/ScriptRoleFollower.java +++ b/src/main/java/noppes/npcs/scripted/roles/ScriptRoleFollower.java @@ -4,7 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import noppes.npcs.controllers.ScriptController; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.roles.RoleFollower; -import noppes.npcs.scripted.ScriptPlayer; +import noppes.npcs.scripted.entity.ScriptPlayer; import noppes.npcs.scripted.constants.RoleType; public class ScriptRoleFollower extends ScriptRoleInterface{ @@ -19,11 +19,11 @@ public class ScriptRoleFollower extends ScriptRoleInterface{ * @param player Player who is set as the owner. If null given everything resets */ public void setOwner(ScriptPlayer player){ - if(player == null || player.getMinecraftEntity() == null){ + if(player == null || player.getMCEntity() == null){ role.setOwner(null); return; } - EntityPlayer mcplayer = (EntityPlayer) player.getMinecraftEntity(); + EntityPlayer mcplayer = (EntityPlayer) player.getMCEntity(); role.setOwner(mcplayer); } diff --git a/src/main/java/noppes/npcs/scripted/wrapper/ScriptDamageSource.java b/src/main/java/noppes/npcs/scripted/wrapper/ScriptDamageSource.java new file mode 100644 index 000000000..32aecda6c --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/wrapper/ScriptDamageSource.java @@ -0,0 +1,43 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.wrapper; + +import net.minecraft.util.DamageSource; +import noppes.npcs.scripted.interfaces.IDamageSource; +import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.interfaces.IEntity; + +public class ScriptDamageSource implements IDamageSource { + private DamageSource source; + + public ScriptDamageSource(DamageSource source) { + this.source = source; + } + + public String getType() { + return this.source.getDamageType(); + } + + public boolean isUnblockable() { + return this.source.isUnblockable(); + } + + public boolean isProjectile() { + return this.source.isProjectile(); + } + + public DamageSource getMCDamageSource() { + return this.source; + } + + public IEntity getTrueSource() { + return NpcAPI.Instance().getIEntity(this.source.getEntity()); + } + + public IEntity getImmediateSource() { + return NpcAPI.Instance().getIEntity(this.source.getSourceOfDamage()); + } +} diff --git a/src/main/java/noppes/npcs/scripted/wrapper/WrapperEntityData.java b/src/main/java/noppes/npcs/scripted/wrapper/WrapperEntityData.java new file mode 100644 index 000000000..641e211e2 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/wrapper/WrapperEntityData.java @@ -0,0 +1,59 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.wrapper; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityTameable; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.ResourceLocation; +import noppes.npcs.controllers.PixelmonHelper; +import noppes.npcs.scripted.entity.*; +import noppes.npcs.scripted.interfaces.IEntity; + +public class WrapperEntityData{ + public IEntity base; + private static final ResourceLocation key = new ResourceLocation("customnpcs", "entitydata"); + + public WrapperEntityData(IEntity base) { + this.base = base; + } + + public static IEntity get(Entity entity) { + if (entity == null) { + return null; + } else { + WrapperEntityData data = new WrapperEntityData(new ScriptEntity(entity)); + if (data == null) { + return getData(entity).base; + } else { + return data.base; + } + } + } + + private static WrapperEntityData getData(Entity entity) { + if (entity != null && entity.worldObj != null && !entity.worldObj.isRemote) { + if (entity instanceof EntityPlayerMP) { + return new WrapperEntityData(new ScriptPlayer((EntityPlayerMP)entity)); + } else if (PixelmonHelper.isPixelmon(entity)) { + return new WrapperEntityData(new ScriptPixelmon((EntityTameable)entity)); + } else if (entity instanceof EntityAnimal) { + return new WrapperEntityData(new ScriptAnimal((EntityAnimal)entity)); + } else if (entity instanceof EntityMob) { + return new WrapperEntityData(new ScriptMonster((EntityMob)entity)); + } else if (entity instanceof EntityLiving) { + return new WrapperEntityData(new ScriptLiving((EntityLiving)entity)); + } else if (entity instanceof EntityLivingBase) { + return new WrapperEntityData(new ScriptLivingBase((EntityLivingBase)entity)); + } + } + return null; + } +} diff --git a/src/main/java/noppes/npcs/scripted/wrapper/WrapperNpcAPI.java b/src/main/java/noppes/npcs/scripted/wrapper/WrapperNpcAPI.java new file mode 100644 index 000000000..9bdfe6d21 --- /dev/null +++ b/src/main/java/noppes/npcs/scripted/wrapper/WrapperNpcAPI.java @@ -0,0 +1,244 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.scripted.wrapper; + +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import com.mojang.authlib.GameProfile; +import cpw.mods.fml.common.eventhandler.EventBus; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityTameable; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.FakePlayer; +import noppes.npcs.CustomNpcs; +import noppes.npcs.NoppesUtilServer; +import noppes.npcs.client.EntityUtil; +import noppes.npcs.controllers.PixelmonHelper; +import noppes.npcs.controllers.ScriptController; +import noppes.npcs.controllers.ScriptEntityData; +import noppes.npcs.scripted.*; +import noppes.npcs.containers.ContainerNpcInterface; +import noppes.npcs.entity.EntityCustomNpc; +import noppes.npcs.entity.EntityNPCInterface; +import noppes.npcs.scripted.entity.*; +import noppes.npcs.scripted.interfaces.*; +import noppes.npcs.util.LRUHashMap; + +public class WrapperNpcAPI extends NpcAPI { + private static final Map worldCache = new LRUHashMap(10); + public static final EventBus EVENT_BUS = new EventBus(); + private static NpcAPI instance = null; + + public WrapperNpcAPI() { + } + + public static void clearCache() { + worldCache.clear(); + } + + public IEntity getIEntity(Entity entity) { + /* + if (entity != null && !entity.worldObj.isRemote) { + return (entity instanceof EntityNPCInterface ? ((EntityNPCInterface)entity).wrappedNPC : entity instanceof EntityPlayerMP ? getIPlayer((EntityPlayerMP) entity) : WrapperEntityData.get(entity)); + } else { + return null; + } + */ + if(entity == null) + return null; + if(entity instanceof EntityNPCInterface) + return ((EntityNPCInterface) entity).script.dummyNpc; + else{ + ScriptEntityData data = (ScriptEntityData) entity.getExtendedProperties("ScriptedObject"); + if(data != null) + return data.base; + if(entity instanceof EntityPlayerMP) + data = new ScriptEntityData(new ScriptPlayer((EntityPlayerMP) entity)); + else if(PixelmonHelper.isPixelmon(entity)) + return new ScriptPixelmon((EntityTameable) entity); + else if(entity instanceof EntityAnimal) + data = new ScriptEntityData(new ScriptAnimal((EntityAnimal) entity)); + else if(entity instanceof EntityMob) + data = new ScriptEntityData(new ScriptMonster((EntityMob) entity)); + else if(entity instanceof EntityLiving) + data = new ScriptEntityData(new ScriptLiving((EntityLiving) entity)); + else if(entity instanceof EntityLivingBase) + data = new ScriptEntityData(new ScriptLivingBase((EntityLivingBase)entity)); + else + data = new ScriptEntityData(new ScriptEntity(entity)); + entity.registerExtendedProperties("ScriptedObject", data); + return data.base; + } + } + + public IBlock getIBlock(World world, BlockPos pos) { + return new ScriptBlock(world, world.getBlock(pos.getX(),pos.getY(),pos.getZ()), pos); + } + + public IBlock getIBlock(World world, int x, int y, int z) { + return new ScriptBlock(world, world.getBlock(x, y, z), new BlockPos(x,y,z)); + } + + public INbt getINbt(NBTTagCompound compound) { + return compound == null?new ScriptNbt(new NBTTagCompound()):new ScriptNbt(compound); + } + + public ICustomNpc createNPC(World world) { + if (world.isRemote) { + return null; + } else { + EntityCustomNpc npc = new EntityCustomNpc(world); + return npc.wrappedNPC; + } + } + + public ICustomNpc spawnNPC(World world, int x, int y, int z) { + if (world.isRemote) { + return null; + } else { + EntityCustomNpc npc = new EntityCustomNpc(world); + npc.setPositionAndRotation((double)x + 0.5D, (double)y, (double)z + 0.5D, 0.0F, 0.0F); + npc.setHealth(npc.getMaxHealth()); + world.spawnEntityInWorld(npc); + return npc.wrappedNPC; + } + } + + public static NpcAPI Instance() { + if (instance == null) { + instance = new WrapperNpcAPI(); + } + + return instance; + } + + public EventBus events() { + return EVENT_BUS; + } + + public IItemStack getIItemStack(ItemStack itemstack) { + return (IItemStack)(itemstack != null && itemstack.stackSize > 0 ? new ScriptItemStack(itemstack) : new ScriptItemStack(new ItemStack(Item.getItemById(0)))); + + } + + public IWorld getIWorld(WorldServer world) { + ScriptWorld w = (ScriptWorld)worldCache.get(world.provider.dimensionId); + if (w != null) { + w.world = world; + return w; + } else { + worldCache.put(world.provider.dimensionId, w = ScriptWorld.createNew(world)); + return w; + } + } + + public IWorld getIWorld(int dimensionId) { + WorldServer[] var2 = CustomNpcs.getServer().worldServers; + int var3 = var2.length; + + for(int var4 = 0; var4 < var3; ++var4) { + WorldServer world = var2[var4]; + if (world.provider.dimensionId == dimensionId) { + return this.getIWorld(world); + } + } + + throw new CustomNPCsException("Unknown dimension id: " + dimensionId, new Object[0]); + } + + public IContainer getIContainer(IInventory inventory) { + return new ScriptContainer(inventory); + } + + public IContainer getIContainer(Container container) { + return (IContainer)(container instanceof ContainerNpcInterface ? ContainerNpcInterface.getOrCreateIContainer((ContainerNpcInterface)container) : new ScriptContainer(container)); + } + + private void checkWorld() { + if (CustomNpcs.getServer() == null || CustomNpcs.getServer().isServerStopped()) { + throw new CustomNPCsException("No world is loaded right now", new Object[0]); + } + } + + public IWorld[] getIWorlds() { + this.checkWorld(); + IWorld[] worlds = new IWorld[CustomNpcs.getServer().worldServers.length]; + + for(int i = 0; i < CustomNpcs.getServer().worldServers.length; ++i) { + worlds[i] = this.getIWorld(CustomNpcs.getServer().worldServers[i]); + } + + return worlds; + } + + public File getGlobalDir() { + return CustomNpcs.Dir; + } + + public File getWorldDir() { + return CustomNpcs.getWorldSaveDirectory(); + } + + public IDamageSource getIDamageSource(DamageSource damagesource) { + return new ScriptDamageSource(damagesource); + } + + public IDamageSource getIDamageSource(IEntity entity) { + return new ScriptDamageSource(new EntityDamageSource(entity.getTypeName(),entity.getMCEntity())); + } + + public void executeCommand(IWorld world, String command) { + //if(!world.getMCWorld().isRemote) + NoppesUtilServer.runCommand(world.getMCWorld(), "API", command); + } + public String getRandomName(int dictionary, int gender) { + return CustomNpcs.MARKOV_GENERATOR[dictionary].fetch(gender); + } + + public ScriptPlayer[] getAllServerPlayers(){ + List list = MinecraftServer.getServer().getConfigurationManager().playerEntityList; + ScriptPlayer[] arr = new ScriptPlayer[list.size()]; + for(int i = 0; i < list.size(); i++){ + arr[i] = (ScriptPlayer) ScriptController.Instance.getScriptForEntity(list.get(i)); + } + + return arr; + } + + public ScriptItemStack createItem(String id, int damage, int size){ + Item item = (Item)Item.itemRegistry.getObject(id); + if(item == null) + return null; + return new ScriptItemStack(new ItemStack(item, size, damage)); + } + + public ScriptEntityParticle createEntityParticle(String directory){ + return new ScriptEntityParticle(directory); + } + + public int getServerTime() { + return MinecraftServer.getServer().getTickCounter(); + } +} diff --git a/src/main/java/noppes/npcs/util/LRUHashMap.java b/src/main/java/noppes/npcs/util/LRUHashMap.java new file mode 100644 index 000000000..0fe23a99f --- /dev/null +++ b/src/main/java/noppes/npcs/util/LRUHashMap.java @@ -0,0 +1,22 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package noppes.npcs.util; + +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +public class LRUHashMap extends LinkedHashMap { + private final int maxSize; + + public LRUHashMap(int size) { + super(size, 0.75F, true); + this.maxSize = size; + } + + protected boolean removeEldestEntry(Entry eldest) { + return this.size() > this.maxSize; + } +} diff --git a/src/main/resources/assets/customnpcs/lang/en_US.lang b/src/main/resources/assets/customnpcs/lang/en_US.lang index 85193e066..7a022e197 100644 --- a/src/main/resources/assets/customnpcs/lang/en_US.lang +++ b/src/main/resources/assets/customnpcs/lang/en_US.lang @@ -117,6 +117,7 @@ gui.update=Update gui.disabled=Disabled gui.editor=Editor gui.playernearby=Player nearby +gui.forum=Forum remote.title=Nearby NPCs remote.reset=Reset @@ -145,7 +146,7 @@ mailbox.name=Mailbox mailbox.sender=Sender mailbox.read=Read mailbox.timesend=%s ago -mailbox.day=day +mailbox.day=day mailbox.days=days mailbox.hour=hour mailbox.hours=hours @@ -376,7 +377,7 @@ follower.lastday=Last day follower.day=Day follower.days=Days follower.hireText=Thank you for hiring me for -follower.farewellText=My days with you are over. Farewell +follower.farewellText=My days with you are over. Farewell follower.infiniteDays=Infinite Days follower.guiDisabled=GuiDisabled follower.allowSoulstone=AllowSoulstone @@ -442,6 +443,9 @@ quest.exp=Exp quest.takeitems=Take Items quest.objectives=Objectives +script.apidoc=API Docs +script.apisrc=API Source + script.scripts=Scripts script.hooks=Hooks script.loadscript=Load Scripts @@ -455,12 +459,58 @@ script.damaged=Damaged script.killed=Killed script.attack=Attack script.target=Target +script.timer=Timer script.availableScripts=Available Scripts script.loadedScripts=Loaded Scripts script.collide=Collide script.kills=Kills script.dialog_closed=Dialog Closed +eventscript.playerevent=Player Events + +playerscript.disabled=Disabled +playerscript.attack=Attack +playerscript.breakBlock=Break +playerscript.chat=Chat +playerscript.containerclosed=Closed Container +playerscript.containerOpen=Open Container +playerscript.damagedEntity=Damaged Entity +playerscript.damaged=Hurt +playerscript.killed=Killed +playerscript.factionupdate=Faction Updated +playerscript.init=Init +playerscript.interact=Interact +playerscript.keyPressed=Key Pressed +playerscript.kills=Kills +playerscript.levelUp=Level Up +playerscript.login=Login +playerscript.logout=Logout +playerscript.pickUp=Pickup +playerscript.rangedCharge=Arrow Charge +playerscript.rangedLaunched=Arrow Launched +playerscript.toss=Toss Item +playerscript.drop=Drop Items +playerscript.tick=Update +playerscript.pickupXP=Pickup XP +playerscript.timer=Timer +playerscript.mouseClicked=Mouse Click +playerscript.startItem=Item Start +playerscript.usingItem=Using Item +playerscript.stopItem=Item Stop +playerscript.finishItem=Item Finish +playerscript.playSound=Play Sound +playerscript.lightning=Lightning Struck +playerscript.fall=Fall +playerscript.jump=Jump +playerscript.respawn=Respawn +playerscript.changedDim=Dimension Change +playerscript.useHoe=Use Hoe +playerscript.sleep=Sleep +playerscript.wakeUp=Wake Up +playerscript.fillBucket=Fill Bucket +playerscript.bonemeal=Bonemeal +playerscript.achievement=Achievement + item.npcWand.name=Npc Wand item.npcMobCloner.name=Mob Cloner item.npcMovingPath.name=Npc Pather