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