diff --git a/.gitignore b/.gitignore index ca28fe9ef..29bbc6b88 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ eclipse .project .settings bin -.metadata \ No newline at end of file +.metadata +*.bak diff --git a/src/main/java/noppes/npcs/DataStats.java b/src/main/java/noppes/npcs/DataStats.java index 48672d31f..e9c1e6313 100644 --- a/src/main/java/noppes/npcs/DataStats.java +++ b/src/main/java/noppes/npcs/DataStats.java @@ -27,6 +27,7 @@ public class DataStats { public int spawnCycle = 0; public boolean hideKilledBody = false; public boolean canDespawn = false; + public boolean playerSetCanDespawn = false; public Resistances resistances = new Resistances(); @@ -47,6 +48,7 @@ public class DataStats { public int pEffAmp = 0; public String fireSound = "random.bow"; public boolean aimWhileShooting = false; + public boolean projectilesKeepTerrain = false; public EnumCreatureAttribute creatureType = EnumCreatureAttribute.UNDEFINED; @@ -102,14 +104,16 @@ public class DataStats { compound.setInteger("pEffAmp", pEffAmp); compound.setString("FiringSound", fireSound); compound.setBoolean("AimWhileShooting", aimWhileShooting); + compound.setBoolean("ProjectilesKeepTerrain", projectilesKeepTerrain); compound.setBoolean("ImmuneToFire", immuneToFire); compound.setBoolean("PotionImmune", potionImmune); compound.setBoolean("CanDrown", canDrown); compound.setBoolean("BurnInSun", burnInSun); compound.setBoolean("NoFallDamage", noFallDamage); - compound.setBoolean("CanDespawn", canDespawn); compound.setBoolean("AttackInvisible", attackInvisible); + compound.setBoolean("CanDespawn", canDespawn); + compound.setBoolean("PlayerSetCanDespawn", playerSetCanDespawn); return compound; } @@ -160,14 +164,16 @@ public class DataStats { pEffAmp = compound.getInteger("pEffAmp"); fireSound = compound.getString("FiringSound"); aimWhileShooting = compound.getBoolean("AimWhileShooting"); + projectilesKeepTerrain = compound.getBoolean("ProjectilesKeepTerrain"); immuneToFire = compound.getBoolean("ImmuneToFire"); potionImmune = compound.getBoolean("PotionImmune"); canDrown = compound.getBoolean("CanDrown"); burnInSun = compound.getBoolean("BurnInSun"); noFallDamage = compound.getBoolean("NoFallDamage"); - canDespawn = compound.getBoolean("CanDespawn"); attackInvisible = compound.getBoolean("AttackInvisible"); + canDespawn = compound.getBoolean("CanDespawn"); + playerSetCanDespawn = compound.getBoolean("PlayerSetCanDespawn"); npc.setImmuneToFire(immuneToFire); } diff --git a/src/main/java/noppes/npcs/NBTTags.java b/src/main/java/noppes/npcs/NBTTags.java index 85b7eb08b..cb39bab95 100644 --- a/src/main/java/noppes/npcs/NBTTags.java +++ b/src/main/java/noppes/npcs/NBTTags.java @@ -131,6 +131,34 @@ public class NBTTags { } return list; } + + public static HashMap getStringIntegerArrayMap(NBTTagList tagList) { + HashMap list = new HashMap(); + for(int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound nbttagcompound = tagList.getCompoundTagAt(i); + list.put(nbttagcompound.getString("Slot"), nbttagcompound.getIntArray("Value")); + } + return list; + } + + /** + * @param tagList + * @param arraySize if an int array is not this length a new int array with this length is made + * @return + */ + public static HashMap getStringIntegerArrayMap(NBTTagList tagList, int arrayLength) { + HashMap list = new HashMap(); + for(int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound nbttagcompound = tagList.getCompoundTagAt(i); + int[] a = nbttagcompound.getIntArray("Value"); + if (a.length != arrayLength) a = new int[arrayLength]; + list.put(nbttagcompound.getString("Slot"), a); + } + return list; + } + public static HashMap> getVectorMap(NBTTagList tagList) { HashMap> map = new HashMap>(); for(int i = 0; i < tagList.tagCount(); i++) @@ -336,6 +364,21 @@ public class NBTTags { } return nbttaglist; } + + public static NBTTagList nbtStringIntegerArrayMap(HashMap map) { + NBTTagList nbttaglist = new NBTTagList(); + if(map == null) + return nbttaglist; + for(String slot : map.keySet()) + { + NBTTagCompound nbttagcompound = new NBTTagCompound(); + nbttagcompound.setString("Slot", slot); + nbttagcompound.setIntArray("Value", map.get(slot)); + + nbttaglist.appendTag(nbttagcompound); + } + return nbttaglist; + } public static NBTBase nbtIntegerStringMap(HashMap map) { NBTTagList nbttaglist = new NBTTagList(); diff --git a/src/main/java/noppes/npcs/NoppesUtilServer.java b/src/main/java/noppes/npcs/NoppesUtilServer.java index eff4322f9..eef05193c 100644 --- a/src/main/java/noppes/npcs/NoppesUtilServer.java +++ b/src/main/java/noppes/npcs/NoppesUtilServer.java @@ -658,6 +658,8 @@ public class NoppesUtilServer { if(entity instanceof EntityNPCInterface){ EntityNPCInterface npc = (EntityNPCInterface) entity; npc.ai.startPos = new int[]{MathHelper.floor_double(npc.posX),MathHelper.floor_double(npc.posY),MathHelper.floor_double(npc.posZ)}; + npc.ticksExisted = 0; + npc.totalTicksAlive = 0; } worldObj.spawnEntityInWorld(entity); return entity; diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRespawn.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRespawn.java index 16d5f191c..0779ac282 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRespawn.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRespawn.java @@ -55,6 +55,7 @@ public class SubGuiNpcRespawn extends SubGuiInterface implements ITextfieldListe } else if(button.id == 1){ stats.canDespawn = button.getValue() == 1; + stats.playerSetCanDespawn = stats.canDespawn; } else if(button.id == 4){ stats.hideKilledBody = button.getValue() == 1; diff --git a/src/main/java/noppes/npcs/client/gui/player/GuiNPCTrader.java b/src/main/java/noppes/npcs/client/gui/player/GuiNPCTrader.java index 81ffe1346..6536f822f 100644 --- a/src/main/java/noppes/npcs/client/gui/player/GuiNPCTrader.java +++ b/src/main/java/noppes/npcs/client/gui/player/GuiNPCTrader.java @@ -117,6 +117,10 @@ public class GuiNPCTrader extends GuiContainerNPCInterface{ this.fontRendererObj.drawString(title, (xSize - fontRendererObj.getStringWidth(title))/2, 131, 0xDD0000); GL11.glTranslatef(0, 0, -300); } + else if (!container.isSlotEnabled(slot, player)) { + String title = StatCollector.translateToLocal("trader.slotdisabled"); + this.fontRendererObj.drawString(title, (xSize - fontRendererObj.getStringWidth(title))/2, 131, 0x00DD00); + } else{ String title = StatCollector.translateToLocal("trader.sufficient"); this.fontRendererObj.drawString(title, (xSize - fontRendererObj.getStringWidth(title))/2, 131, 0x00DD00); diff --git a/src/main/java/noppes/npcs/containers/ContainerNPCTrader.java b/src/main/java/noppes/npcs/containers/ContainerNPCTrader.java index 77a3b8a43..f0390478e 100644 --- a/src/main/java/noppes/npcs/containers/ContainerNPCTrader.java +++ b/src/main/java/noppes/npcs/containers/ContainerNPCTrader.java @@ -62,19 +62,24 @@ public class ContainerNPCTrader extends ContainerNpcInterface{ return null; if(!canBuy(i, entityplayer)) return null; + if (!isSlotEnabled(i, entityplayer)) + return null; NoppesUtilPlayer.consumeItem(entityplayer, role.inventoryCurrency.getStackInSlot(i), role.ignoreDamage, role.ignoreNBT); NoppesUtilPlayer.consumeItem(entityplayer, role.inventoryCurrency.getStackInSlot(i + 18), role.ignoreDamage, role.ignoreNBT); ItemStack soldItem = item.copy(); givePlayer(soldItem, entityplayer); + role.addPurchase(i, entityplayer); return soldItem; } + public boolean isSlotEnabled(int slot, EntityPlayer player) { + return role.isSlotEnabled(slot, player); + } public boolean canBuy(int slot, EntityPlayer player) { ItemStack currency = role.inventoryCurrency.getStackInSlot(slot); ItemStack currency2 = role.inventoryCurrency.getStackInSlot(slot + 18); if(currency == null && currency2 == null) return true; - if(currency == null){ currency = currency2; currency2 = null; diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index c8b672a82..0f8e81f60 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -139,7 +139,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti public boolean updateClient = false; public boolean updateAI = false; - + public FlyingMoveHelper flyMoveHelper = new FlyingMoveHelper(this); public PathNavigate flyNavigator = new PathNavigateFlying(this, worldObj); @@ -956,6 +956,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti totalTicksAlive = compound.getLong("TotalTicksAlive"); linkedName = compound.getString("LinkedNpcName"); + if(!isRemote()) LinkedNpcController.Instance.loadNpcData(this); diff --git a/src/main/java/noppes/npcs/entity/EntityProjectile.java b/src/main/java/noppes/npcs/entity/EntityProjectile.java index dec7f789e..e0a1d0b21 100644 --- a/src/main/java/noppes/npcs/entity/EntityProjectile.java +++ b/src/main/java/noppes/npcs/entity/EntityProjectile.java @@ -77,6 +77,7 @@ public class EntityProjectile extends EntityThrowable { public boolean accelerate = false; public boolean explosive = false; public boolean explosiveDamage = true; + public boolean destroyTerrain = true; public int explosiveRadius = 0; public EnumPotionType effect = EnumPotionType.None; public int duration = 5; @@ -138,6 +139,7 @@ public class EntityProjectile extends EntityThrowable { if (isNPC) { this.npc = (EntityNPCInterface) this.thrower; this.getStatProperties(this.npc.stats); + this.destroyTerrain = !this.npc.stats.projectilesKeepTerrain; } } @@ -562,7 +564,7 @@ public class EntityProjectile extends EntityThrowable { if (explosive){ if (this.explosiveRadius != 0 || this.effect == EnumPotionType.None){ - boolean terraindamage = this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing") && explosiveDamage; + boolean terraindamage = this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing") && explosiveDamage && destroyTerrain; Explosion explosion = new Explosion(worldObj, this, posX, posY, posZ, explosiveRadius); explosion.isFlaming = this.effect == EnumPotionType.Fire; explosion.isSmoking = terraindamage; diff --git a/src/main/java/noppes/npcs/roles/RoleFollower.java b/src/main/java/noppes/npcs/roles/RoleFollower.java index 67a578f3c..c0f1960d2 100644 --- a/src/main/java/noppes/npcs/roles/RoleFollower.java +++ b/src/main/java/noppes/npcs/roles/RoleFollower.java @@ -104,6 +104,7 @@ public class RoleFollower extends RoleInterface{ daysHired = 0; hiredTime = 0; isFollowing = true; + npc.stats.canDespawn = npc.stats.playerSetCanDespawn; } public int getDaysLeft(){ @@ -150,6 +151,7 @@ public class RoleFollower extends RoleInterface{ if(ownerUUID == null || id == null || !ownerUUID.equals(id)) killed(); ownerUUID = id.toString(); + npc.stats.canDespawn = false; } diff --git a/src/main/java/noppes/npcs/roles/RoleTrader.java b/src/main/java/noppes/npcs/roles/RoleTrader.java index d8da53a7c..3c918dc57 100644 --- a/src/main/java/noppes/npcs/roles/RoleTrader.java +++ b/src/main/java/noppes/npcs/roles/RoleTrader.java @@ -1,17 +1,19 @@ package noppes.npcs.roles; +import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; +import foxz.utils.Market; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import noppes.npcs.NBTTags; import noppes.npcs.NoppesUtilPlayer; import noppes.npcs.NoppesUtilServer; import noppes.npcs.NpcMiscInventory; import noppes.npcs.constants.EnumGuiType; import noppes.npcs.entity.EntityNPCInterface; -import foxz.utils.Market; public class RoleTrader extends RoleInterface{ @@ -24,10 +26,19 @@ public class RoleTrader extends RoleInterface{ public boolean toSave = false; + public int[] purchases; + public int[] disableSlot; + public HashMap playerPurchases; + public HashMap playerDisableSlot; + public RoleTrader(EntityNPCInterface npc) { super(npc); inventoryCurrency = new NpcMiscInventory(36); inventorySold = new NpcMiscInventory(18); + purchases = new int[18]; + disableSlot = new int[18]; + playerPurchases = new HashMap(); + playerDisableSlot = new HashMap(); } @Override @@ -46,6 +57,10 @@ public class RoleTrader extends RoleInterface{ nbttagcompound.setTag("TraderSold", inventorySold.getToNBT()); nbttagcompound.setBoolean("TraderIgnoreDamage", ignoreDamage); nbttagcompound.setBoolean("TraderIgnoreNBT", ignoreNBT); + nbttagcompound.setIntArray("Purchases", purchases); + nbttagcompound.setIntArray("DisableSlot", disableSlot); + nbttagcompound.setTag("PlayerPurchases", NBTTags.nbtStringIntegerArrayMap(playerPurchases)); + nbttagcompound.setTag("PlayerDisableSlot", NBTTags.nbtStringIntegerArrayMap(playerDisableSlot)); return nbttagcompound; } @@ -67,7 +82,18 @@ public class RoleTrader extends RoleInterface{ inventorySold.setFromNBT(nbttagcompound.getCompoundTag("TraderSold")); ignoreDamage = nbttagcompound.getBoolean("TraderIgnoreDamage"); ignoreNBT = nbttagcompound.getBoolean("TraderIgnoreNBT"); - + purchases = nbttagcompound.getIntArray("Purchases"); + if (purchases == null || purchases.length != 18) { + purchases = new int[18]; + for (int i = 0; i < purchases.length; ++i) purchases[i] = 0; + } + disableSlot = nbttagcompound.getIntArray("DisableSlot"); + if (disableSlot == null || disableSlot.length != 18) { + disableSlot = new int[18]; + for (int i = 0; i < disableSlot.length; ++i) disableSlot[i] = 0; + } + playerPurchases = NBTTags.getStringIntegerArrayMap(nbttagcompound.getTagList("PlayerPurchases", 10), 18); + playerDisableSlot = NBTTags.getStringIntegerArrayMap(nbttagcompound.getTagList("PlayerDisableSlot", 10), 18); } @Override @@ -91,5 +117,24 @@ public class RoleTrader extends RoleInterface{ } return false; } + + public void addPurchase(int slot, EntityPlayer player) { + if(slot >= 18 || slot < 0) return; + ++purchases[slot]; + ++getArrayByName(player.getDisplayName(), playerPurchases)[slot]; + } + + public boolean isSlotEnabled(int slot, EntityPlayer player) { + if(slot >= 18 || slot < 0) return false; + if (disableSlot[slot] > 0) return false; + if (getArrayByName(player.getDisplayName(), playerDisableSlot)[slot] > 0) return false; + return true; + } + + public int[] getArrayByName(String name, HashMap map) { + int[] a = map.get(name); + if (a == null) a = map.put(name, new int[18]); + return a; + } } diff --git a/src/main/java/noppes/npcs/scripted/ScriptFaction.java b/src/main/java/noppes/npcs/scripted/ScriptFaction.java index 972ecaf2b..d2aa114f4 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptFaction.java +++ b/src/main/java/noppes/npcs/scripted/ScriptFaction.java @@ -1,11 +1,17 @@ package noppes.npcs.scripted; import noppes.npcs.controllers.Faction; +import noppes.npcs.controllers.FactionController; import noppes.npcs.scripted.entity.ScriptNpc; import noppes.npcs.scripted.entity.ScriptPlayer; public class ScriptFaction { + private Faction faction; + + public void saveFaction() { + FactionController.getInstance().saveFaction(faction); + } public ScriptFaction(Faction faction){ this.faction = faction; @@ -25,14 +31,58 @@ public class ScriptFaction { return faction.name; } + public void setName(String name) { + faction.name = name; + } + public int getDefaultPoints(){ return faction.defaultPoints; } + + public void setDefaultPoints(int p) { + faction.defaultPoints = p; + } + + public int getFriendlyPoints() { + return faction.friendlyPoints; + } + + public void setFriendlyPoints(int p) { + faction.friendlyPoints = p; + } + + public int getNeutralPoints() { + return faction.neutralPoints; + } + + public void setNeutralPoints(int p) { + faction.neutralPoints = p; + } + + public boolean getHideFaction() { + return faction.hideFaction; + } + + public void setHideFaction(boolean b) { + faction.hideFaction = b; + } + + public boolean getGetsAttacked() { + return faction.getsAttacked; + } + + public void setGetsAttacked(boolean b) { + faction.getsAttacked = b; + } public int getColor(){ return faction.color; } + public void setColor(int c) { + faction.color = c; + } + public boolean isFriendlyToPlayer(ScriptPlayer player){ return faction.isFriendlyToPlayer(player.player); } @@ -48,4 +98,27 @@ public class ScriptFaction { public boolean isAggressiveToNpc(ScriptNpc npc){ return faction.isAggressiveToNpc(npc.npc); } + + public Integer[] getEnemyFactionIds() { + if (faction.attackFactions == null) return new Integer[0]; + return faction.attackFactions.toArray(new Integer[faction.attackFactions.size()]); + } + + public boolean isEnemyFaction(int id) { + if (faction.attackFactions == null) return false; + Integer[] enemies = getEnemyFactionIds(); + for (int i = 0; i < enemies.length; ++i) { + if (enemies[i] == id) return true; + } + return false; + } + + public void addFactionEnemy(int id) { + if (!faction.attackFactions.contains(id)) faction.attackFactions.add(id); + } + + public void removeFactionEnemy(int id) { + faction.attackFactions.remove(id); + } + } diff --git a/src/main/java/noppes/npcs/scripted/ScriptItemStack.java b/src/main/java/noppes/npcs/scripted/ScriptItemStack.java index 81fb082a0..f15b8d41a 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptItemStack.java +++ b/src/main/java/noppes/npcs/scripted/ScriptItemStack.java @@ -6,12 +6,14 @@ import java.util.List; import java.util.Map; import com.google.common.collect.Multimap; + import net.minecraft.block.Block; import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTBase.NBTPrimitive; @@ -346,6 +348,15 @@ public class ScriptItemStack implements IItemStack { return false; return true; } + + public boolean isFood() { + return item.getItem() instanceof ItemFood; + } + + public int getFoodPoints() { + if (isFood()) return ((ItemFood)item.getItem()).func_150905_g(item); + return -1; + } public INbt getNbt() { NBTTagCompound compound = this.item.getTagCompound(); diff --git a/src/main/java/noppes/npcs/scripted/ScriptScoreboard.java b/src/main/java/noppes/npcs/scripted/ScriptScoreboard.java index 603f88ec8..513f9cc7f 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptScoreboard.java +++ b/src/main/java/noppes/npcs/scripted/ScriptScoreboard.java @@ -152,6 +152,16 @@ public class ScriptScoreboard { return teams; } + public ScriptScoreboardTeam getTeamByName(String name) { + ScriptScoreboardTeam[] teams = getTeams(); + for (int i = 0; i < teams.length; i++) { + if (teams[i].getName().equals(name)) { + return teams[i]; + } + } + return null; + } + public boolean hasTeam(String name){ return board.getPlayersTeam(name) != null; } diff --git a/src/main/java/noppes/npcs/scripted/ScriptScoreboardTeam.java b/src/main/java/noppes/npcs/scripted/ScriptScoreboardTeam.java index 639ee0b3e..bed2b0a24 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptScoreboardTeam.java +++ b/src/main/java/noppes/npcs/scripted/ScriptScoreboardTeam.java @@ -44,6 +44,10 @@ public class ScriptScoreboardTeam { return list.toArray(new String[list.size()]); } + public int getTeamsize() { + return team.getMembershipCollection().size(); + } + public void clearPlayers(){ List list = new ArrayList(team.getMembershipCollection()); for(String player : list){ diff --git a/src/main/java/noppes/npcs/scripted/ScriptWorld.java b/src/main/java/noppes/npcs/scripted/ScriptWorld.java index cbcc43f48..846b20fbe 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptWorld.java +++ b/src/main/java/noppes/npcs/scripted/ScriptWorld.java @@ -18,8 +18,8 @@ import net.minecraft.nbt.NBTTagString; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntitySign; +import net.minecraft.util.Vec3; 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; @@ -28,6 +28,7 @@ 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.IPos; import noppes.npcs.scripted.interfaces.IWorld; public class ScriptWorld implements IWorld { @@ -67,6 +68,14 @@ public class ScriptWorld implements IWorld { return null; return new ScriptBlock(world, block, new BlockPos(x,y,z)); } + + /** + * @param pos + * @return The block at the given position. Returns null if there isn't a block + */ + public IBlock getBlock(IPos pos){ + return getBlock(pos.getX(), pos.getY(), pos.getZ()); + } /** * @param x World position x @@ -93,6 +102,14 @@ public class ScriptWorld implements IWorld { return null; } + public void setBlock(int x, int y, int z, IBlock block){ + if(block == null || block.getMCBlock().isAir(world, x, y, z)){ + removeBlock(x, y, z); + return; + } + world.setBlock(x, y, z, block.getMCBlock()); + } + /** * @param x World position x * @param y World position y @@ -119,6 +136,82 @@ public class ScriptWorld implements IWorld { world.setBlock(x, y, z, Blocks.air); } + /** + * starting at the start position, draw a line in the lookVector direction until a block is detected + * @param startPos + * @param lookVector should be a normalized direction vector + * @param maxDistance + * @return the first detected block but null if maxDistance is reached + */ + public IBlock rayCastBlock(double[] startPos, double[] lookVector, int maxDistance) { + if (startPos.length != 3 || lookVector.length != 3) return null; + Vec3 currentPos = Vec3.createVectorHelper(startPos[0], startPos[1], startPos[2]); int rep = 0; + while (rep++ < maxDistance + 10) { + currentPos = currentPos.addVector(lookVector[0], lookVector[1], lookVector[2]); + IBlock block = getBlock((int)currentPos.xCoord, (int)currentPos.yCoord, (int)currentPos.zCoord); + //System.out.println("Checking block at ["+(int)currentPos.xCoord+","+(int)currentPos.yCoord+","+(int)currentPos.zCoord+"]"); + if (block == null) continue; + double distance = Math.pow( + Math.pow(currentPos.xCoord-startPos[0],2) + +Math.pow(currentPos.yCoord-startPos[1],2) + +Math.pow(currentPos.zCoord-startPos[2],2) + , 0.5); + //System.out.println("current distance check: "+distance+" on rep "+rep); + if (distance > maxDistance) return null; + return block; + } + //System.out.println("ScriptWorld:WARNING: Repeated a ray cast to many times"); + return null; + } + + /** + * starting at the start position, draw a line in the lookVector direction until a block is detected + * @param startPos + * @param lookVector will normalize x, y, z to get a direction vector + * @param maxDistance + * @return the first detected block but null if maxDistance is reached + */ + public IBlock rayCastBlock(IPos startPos, IPos lookVector, int maxDistance) { + return rayCastBlock(new double[] {startPos.getX(), startPos.getY(), startPos.getZ()}, lookVector.normalize(), maxDistance); + } + + public IPos getNearestAir(IPos pos, int maxHeight) { + if (pos == null) return null; + IPos currentPos = pos; + IBlock block = null; int rep = 0; + while (rep++ < maxHeight) { + //check +x + currentPos = currentPos.add(1, 0, 0); + block = getBlock(currentPos); + if (block == null) break; + //check -x + currentPos = currentPos.add(-2, 0, 0); + block = getBlock(currentPos); + if (block == null) break; + //check +z + currentPos = currentPos.add(1, 0, 1); + block = getBlock(currentPos); + if (block == null) break; + //check -z + currentPos = currentPos.add(0, 0, -2); + block = getBlock(currentPos); + if (block == null) break; + //check up 1 + currentPos = currentPos.add(0, 1, 1); + block = getBlock(currentPos); + if (block == null) break; + } + return currentPos; + } + + public boolean canSeeSky(int x, int y, int z) { + return world.canBlockSeeTheSky(x, y, z); + } + + public boolean canSeeSky(IPos pos) { + return canSeeSky(pos.getX(), pos.getY(), pos.getZ()); + } + /** * @param name The name of the player to be returned * @return The Player with name. Null is returned when the player isnt found @@ -317,6 +410,13 @@ public class ScriptWorld implements IWorld { return arr; } + public String[] getPlayerNames() { + ScriptPlayer[] players = getAllServerPlayers(); + String[] names = new String[players.length]; + for (int i = 0; i < names.length; ++i) names[i] = players[i].getDisplayName(); + return names; + } + /** * @since 1.7.10c * @param x Position x diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java index ca7d500b2..2e3c734bf 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java @@ -15,8 +15,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTBase.NBTPrimitive; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagIntArray; import net.minecraft.nbt.NBTTagString; -import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldServer; @@ -24,7 +24,12 @@ import noppes.npcs.NoppesUtilServer; import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.ServerCloneController; import noppes.npcs.entity.EntityNPCInterface; -import noppes.npcs.scripted.*; +import noppes.npcs.scripted.CustomNPCsException; +import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.ScriptBlockPos; +import noppes.npcs.scripted.ScriptEntityParticle; +import noppes.npcs.scripted.ScriptItemStack; +import noppes.npcs.scripted.ScriptWorld; import noppes.npcs.scripted.constants.EntityType; import noppes.npcs.scripted.interfaces.IEntity; import noppes.npcs.scripted.interfaces.INbt; @@ -413,6 +418,8 @@ public class ScriptEntity implements IEntity { NBTBase base = compound.getTag(key); if(base instanceof NBTPrimitive) return ((NBTPrimitive)base).func_150286_g(); + else if (base instanceof NBTTagIntArray) + return ((NBTTagIntArray)base).func_150302_c(); return ((NBTTagString)base).func_150285_a_(); } @@ -430,6 +437,12 @@ public class ScriptEntity implements IEntity { compound.setString(key, (String)value); saveStoredCompound(compound); } + + public void setStoredData(String key, int[] array){ + NBTTagCompound compound = getStoredCompound(); + compound.setIntArray(key, array); + saveStoredCompound(compound); + } /** * @param key The key of the data to be checked @@ -528,6 +541,10 @@ public class ScriptEntity implements IEntity { public String getTypeName(){ return EntityList.getEntityString(entity); } + + public void playSound(String name, float volume, float pitch) { + entity.playSound(name, volume, pitch); + } /** * @param item Item to be dropped diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index a777901ae..550a1eaa2 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -269,6 +269,16 @@ public class ScriptNpc extends ScriptLiving imp npc.shoot(target.entity, accuracy, item.item, false); } + public void setProjectilesKeepTerrain(boolean t) { + npc.stats.projectilesKeepTerrain = t; + } + + public boolean getProjectilesKeepTerrain() { + return npc.stats.projectilesKeepTerrain; + } + + + /** * @param message The message the npc will say */ @@ -524,7 +534,8 @@ public class ScriptNpc extends ScriptLiving imp * @param item The item the drop list slot will be changed to */ public void setLootItem(int slot, ScriptItemStack item) { - npc.inventory.setInventorySlotContents(slot+7, item.item); + if (item == null) npc.inventory.setInventorySlotContents(slot+7, null); + else npc.inventory.setInventorySlotContents(slot+7, item.item); } /** @@ -856,6 +867,7 @@ public class ScriptNpc extends ScriptLiving imp public void setNaturallyDespawns(boolean canDespawn) { npc.stats.canDespawn = canDespawn; + npc.stats.playerSetCanDespawn = canDespawn; } public void giveItem(ScriptPlayer player, ScriptItemStack item){ @@ -1000,6 +1012,13 @@ public class ScriptNpc extends ScriptLiving imp npc.stats.healthRegen = (float)(Math.floor(regen)); } + public boolean getCanDrown() { + return npc.stats.canDrown; + } + public void setCanDrown(boolean d) { + npc.stats.canDrown = d; + } + @Override public long getAge(){ return npc.totalTicksAlive; diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java index d3b1fc98f..a64bf92ad 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptPlayer.java @@ -1,6 +1,10 @@ package noppes.npcs.scripted.entity; -import net.minecraft.entity.player.EntityPlayer; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -9,31 +13,46 @@ import net.minecraft.stats.Achievement; import net.minecraft.stats.StatBase; import net.minecraft.stats.StatList; import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.Vec3; import net.minecraft.world.WorldSettings; -import noppes.npcs.*; +import noppes.npcs.CustomNpcsPermissions; +import noppes.npcs.NoppesStringUtils; +import noppes.npcs.NoppesUtilPlayer; +import noppes.npcs.NoppesUtilServer; +import noppes.npcs.Server; import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumQuestType; import noppes.npcs.containers.ContainerCustomGui; -import noppes.npcs.controllers.*; +import noppes.npcs.controllers.CustomGuiController; +import noppes.npcs.controllers.Dialog; +import noppes.npcs.controllers.DialogController; +import noppes.npcs.controllers.PixelmonHelper; +import noppes.npcs.controllers.PlayerData; +import noppes.npcs.controllers.PlayerDataController; +import noppes.npcs.controllers.PlayerDialogData; +import noppes.npcs.controllers.PlayerQuestData; +import noppes.npcs.controllers.Quest; +import noppes.npcs.controllers.QuestController; +import noppes.npcs.controllers.QuestData; import noppes.npcs.entity.EntityDialogNpc; -import noppes.npcs.scripted.CustomNPCsException; 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.event.FactionEvent; import noppes.npcs.scripted.gui.ScriptGui; import noppes.npcs.scripted.handler.data.IQuest; -import noppes.npcs.scripted.interfaces.*; +import noppes.npcs.scripted.interfaces.IBlock; +import noppes.npcs.scripted.interfaces.IContainer; +import noppes.npcs.scripted.interfaces.ICustomGui; +import noppes.npcs.scripted.interfaces.ICustomOverlay; +import noppes.npcs.scripted.interfaces.IPlayer; +import noppes.npcs.scripted.interfaces.ITimers; import noppes.npcs.scripted.overlay.ScriptOverlay; import noppes.npcs.util.ValueUtil; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - public class ScriptPlayer extends ScriptLivingBase implements IPlayer { public T player; private PlayerData data; @@ -120,6 +139,14 @@ public class ScriptPlayer extends ScriptLivingBase PlayerDialogData data = PlayerDataController.instance.getPlayerData(player).dialogData; return data.dialogsRead.contains(id); } + + public void readDialog(int id) { + PlayerDataController.instance.getPlayerData(player).dialogData.dialogsRead.add(id); + } + + public void unreadDialog(int id) { + PlayerDataController.instance.getPlayerData(player).dialogData.dialogsRead.remove(id); + } /** * Add the quest from active quest list @@ -192,6 +219,14 @@ public class ScriptPlayer extends ScriptLivingBase PlayerData data = PlayerDataController.instance.getPlayerData(player); data.factionData.increasePoints(faction, points, player); } + /** + * @param faction The faction id + * @param points The new point value for this faction + */ + public void setFactionPoints(int faction, int points) { + PlayerData data = PlayerDataController.instance.getPlayerData(player); + data.factionData.increasePoints(faction, points-getFactionPoints(faction), player); + } /** * @param faction The faction id @@ -209,6 +244,36 @@ public class ScriptPlayer extends ScriptLivingBase player.addChatMessage(new ChatComponentTranslation(NoppesStringUtils.formatText(message,player))); } + /** + * @param message The message you want to send + */ + public void sendMessage(String message, EnumChatFormatting color, boolean bold, boolean italic, boolean underlined) { + ChatComponentTranslation chat = new ChatComponentTranslation(NoppesStringUtils.formatText(message,player)); + ChatStyle style = new ChatStyle(); + style.setColor(color); + style.setBold(bold); + style.setItalic(italic); + style.setUnderlined(underlined); + chat.setChatStyle(style); + player.addChatMessage(chat); + } + + /** + * @param message The message you want to send + */ + public void sendMessage(String message, EnumChatFormatting color, boolean bold, boolean italic, boolean obfuscated, boolean strikethrough, boolean underlined) { + ChatComponentTranslation chat = new ChatComponentTranslation(NoppesStringUtils.formatText(message,player)); + ChatStyle style = new ChatStyle(); + style.setColor(color); + style.setBold(bold); + style.setItalic(italic); + style.setObfuscated(obfuscated); + style.setStrikethrough(strikethrough); + style.setUnderlined(underlined); + chat.setChatStyle(style); + player.addChatMessage(chat); + } + /** * @return Return gamemode. 0: Survival, 1: Creative, 2: Adventure */ @@ -352,6 +417,11 @@ public class ScriptPlayer extends ScriptLivingBase player.inventory.mainInventory[i] = null; } } + + public void clearInventory() { + for(int i = 0; i < player.inventory.mainInventory.length; i++) player.inventory.mainInventory[i] = null; + for(int i = 0; i < player.inventory.armorInventory.length; i++) player.inventory.armorInventory[i] = null; + } public void setRotation(float rotationYaw){ NoppesUtilPlayer.teleportPlayer(player, player.posX, player.posY, player.posZ, rotationYaw, player.rotationPitch, player.dimension); @@ -407,6 +477,14 @@ public class ScriptPlayer extends ScriptLivingBase return null; return new ScriptPixelmonPlayerData(player); } + + public IBlock getLookingAtBlock(int maxDistance) { + Vec3 lookVec = player.getLookVec(); + return getWorld().rayCastBlock( + new double[] {player.posX, player.posY+player.getEyeHeight(), player.posZ}, + new double[] {lookVec.xCoord, lookVec.yCoord, lookVec.zCoord}, + maxDistance); + } public ITimers getTimers() { return PlayerDataController.instance.getPlayerData(player).timers; diff --git a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java index 47f0fa7ab..6f3e5bdcc 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/ICustomNpc.java @@ -162,6 +162,10 @@ public interface ICustomNpc extends IEntityLiving { * @param accuracy Accuracy of the shot (0-100) */ public void shootItem(ScriptLivingBase target, ScriptItemStack item, int accuracy); + + public void setProjectilesKeepTerrain(boolean b); + + public boolean getProjectilesKeepTerrain(); /** * @param message The message the npc will say @@ -343,7 +347,11 @@ public interface ICustomNpc extends IEntityLiving { * @return The maximum XP gained from killing the NPC. */ public int getMaxLootXP(); - + + public boolean getCanDrown(); + + public void setCanDrown(boolean b); + /** * @param type The AnimationType */ diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IEntity.java b/src/main/java/noppes/npcs/scripted/interfaces/IEntity.java index a806676d9..7e77cad95 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/IEntity.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/IEntity.java @@ -130,7 +130,6 @@ public interface IEntity { */ 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 @@ -190,6 +189,8 @@ public interface IEntity { * @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); + + public void setStoredData(String key, int[] array); /** * @param key The key of the data to be checked @@ -251,6 +252,8 @@ public interface IEntity { * @return Name as which it's registered in minecraft */ public String getTypeName(); + + public void playSound(String name, float volume, float pitch); /** * @param item Item to be dropped diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IPlayer.java b/src/main/java/noppes/npcs/scripted/interfaces/IPlayer.java index cafe9629e..cd47334be 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/IPlayer.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/IPlayer.java @@ -1,6 +1,8 @@ package noppes.npcs.scripted.interfaces; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.Vec3; import noppes.npcs.scripted.ScriptItemStack; import noppes.npcs.scripted.ScriptPixelmonPlayerData; @@ -26,6 +28,10 @@ public interface IPlayer extends IEntityLivingBase public void showDialog(int id); public boolean hasReadDialog(int id); + + public void readDialog(int id); + + public void unreadDialog(int id); /** * Add the quest from active quest list @@ -58,7 +64,11 @@ public interface IPlayer extends IEntityLivingBase * @param points The points to increase. Use negative values to decrease */ public void addFactionPoints(int faction, int points); - + /** + * @param faction The faction id + * @param points The new point value for this faction + */ + public void setFactionPoints(int faction, int points); /** * @param faction The faction id * @return points @@ -69,7 +79,11 @@ public interface IPlayer extends IEntityLivingBase * @param message The message you want to send */ public void sendMessage(String message); - + + public void sendMessage(String message, EnumChatFormatting color, boolean bold, boolean italic, boolean underlined); + + public void sendMessage(String message, EnumChatFormatting color, boolean bold, boolean italic, boolean obfuscated, boolean strikethrough, boolean underlined); + /** * @return Return gamemode. 0: Survival, 1: Creative, 2: Adventure */ @@ -139,6 +153,8 @@ public interface IPlayer extends IEntityLivingBase * @param item The item to be removed from the players inventory */ public void removeAllItems(ScriptItemStack item); + + public void clearInventory(); /** @@ -170,6 +186,8 @@ public interface IPlayer extends IEntityLivingBase * @since 1.7.10d */ public ScriptPixelmonPlayerData getPixelmonData(); + + public IBlock getLookingAtBlock(int maxDistance); public ITimers getTimers(); diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java b/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java index 9c7b14534..0d3b053c4 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java @@ -1,9 +1,10 @@ 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.ScriptEntityParticle; +import noppes.npcs.scripted.ScriptItemStack; +import noppes.npcs.scripted.ScriptScoreboard; import noppes.npcs.scripted.entity.ScriptEntity; import noppes.npcs.scripted.entity.ScriptPlayer; @@ -25,6 +26,12 @@ public interface IWorld { * @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 pos + * @return The block at the given position. Returns null if there isn't a block + */ + public IBlock getBlock(IPos pos); /** * @param x World position x @@ -42,13 +49,60 @@ public interface IWorld { * @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 + * @param block The block to be set + */ + public void setBlock(int x, int y, int z, IBlock block); + /** * @param x World position x * @param y World position y * @param z World position z */ public void removeBlock(int x, int y, int z); + + /** + * starting at the start position, draw a line in the lookVector direction until a block is detected + * @param startPos + * @param lookVector should be a normalized direction vector + * @param maxDistance + * @return the first detected block but null if maxDistance is reached + */ + public IBlock rayCastBlock(double[] startPos, double[] lookVector, int maxDistance); + + /** + * starting at the start position, draw a line in the lookVector direction until a block is detected + * @param startPos + * @param lookVector will normalize x, y, z to get a direction vector + * @param maxDistance + * @return the first detected block but null if maxDistance is reached + */ + public IBlock rayCastBlock(IPos startPos, IPos lookVector, int maxDistance); + + /** + * @param startPos + * @param maxHeight + * @return the position of the closest block of air to startPos + */ + public IPos getNearestAir(IPos startPos, int maxHeight); + + /** + * @param x + * @param y + * @param z + * @return can the block at this position see the sky or are there no blocks above this one + */ + public boolean canSeeSky(int x, int y, int z); + + /** + * @param pos + * @return can the block at this position see the sky or are there no blocks above this one + */ + public boolean canSeeSky(IPos pos); /** * @param name The name of the player to be returned @@ -180,6 +234,8 @@ public interface IWorld { public void explode(double x, double y, double z, float range, boolean fire, boolean grief); public ScriptPlayer[] getAllServerPlayers(); + + public String[] getPlayerNames(); /** * @since 1.7.10c @@ -199,7 +255,7 @@ public interface IWorld { * @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); diff --git a/src/main/java/noppes/npcs/scripted/roles/ScriptRoleFollower.java b/src/main/java/noppes/npcs/scripted/roles/ScriptRoleFollower.java index d10bd8dad..1041e3f17 100644 --- a/src/main/java/noppes/npcs/scripted/roles/ScriptRoleFollower.java +++ b/src/main/java/noppes/npcs/scripted/roles/ScriptRoleFollower.java @@ -46,6 +46,14 @@ public class ScriptRoleFollower extends ScriptRoleInterface{ return role.owner != null; } + public boolean isFollowing() { + return role.isFollowing(); + } + + public void setIsFollowing(boolean following) { + if (role.owner != null && role.getDaysLeft() > 0) role.isFollowing = following; + } + /** * @since 1.7.10c * @return Returns days left diff --git a/src/main/java/noppes/npcs/scripted/roles/ScriptRoleTrader.java b/src/main/java/noppes/npcs/scripted/roles/ScriptRoleTrader.java index 353afc2fb..5ea82236f 100644 --- a/src/main/java/noppes/npcs/scripted/roles/ScriptRoleTrader.java +++ b/src/main/java/noppes/npcs/scripted/roles/ScriptRoleTrader.java @@ -1,10 +1,13 @@ package noppes.npcs.scripted.roles; +import foxz.utils.Market; +import net.minecraft.entity.player.EntityPlayer; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.roles.RoleTrader; import noppes.npcs.scripted.ScriptItemStack; import noppes.npcs.scripted.constants.RoleType; -import foxz.utils.Market; +import noppes.npcs.scripted.interfaces.IItemStack; +import noppes.npcs.scripted.interfaces.IPlayer; public class ScriptRoleTrader extends ScriptRoleInterface{ private RoleTrader role; @@ -19,7 +22,7 @@ public class ScriptRoleTrader extends ScriptRoleInterface{ * @param currency2 Currency item number two * @param sold Item to be sold by this npc */ - public void setSellOption(int slot, ScriptItemStack currency, ScriptItemStack currency2, ScriptItemStack sold){ + public void setSellOption(int slot, IItemStack currency, IItemStack currency2, IItemStack sold){ if(sold == null || slot >= 18 || slot < 0) return; if(currency == null) @@ -42,16 +45,41 @@ public class ScriptRoleTrader extends ScriptRoleInterface{ * @param currency Currency item * @param sold Item to be sold by this npc */ - public void setSellOption(int slot, ScriptItemStack currency, ScriptItemStack sold){ + public void setSellOption(int slot, IItemStack currency, IItemStack sold){ setSellOption(slot, currency, null, sold); } + /** + * @param slot + * @return The item being sold in this slot. + */ + public IItemStack getSellOption(int slot) { + if (slot >= 18 || slot < 0) return null; + if (role.inventorySold.items.get(slot) == null) return null; + return new ScriptItemStack(role.inventorySold.items.get(slot)); + } + + /** + * @param slot + * @return a ScriptItemStack array of size 2 which contains the currency of this trade + */ + public IItemStack[] getCurrency(int slot) { + if (slot >= 18 || slot < 0) return null; + ScriptItemStack[] currency = new ScriptItemStack[2]; + if (role.inventoryCurrency.items.get(slot) != null) { + currency[0] = new ScriptItemStack(role.inventoryCurrency.items.get(slot)); + } + if (role.inventoryCurrency.items.get(slot + 18) != null) { + currency[1] = new ScriptItemStack(role.inventoryCurrency.items.get(slot + 18)); + } + return currency; + } + /** * @param slot Slot number 0-17 */ public void removeSellOption(int slot){ - if(slot >= 18 || slot < 0) - return; + if(slot >= 18 || slot < 0) return; role.inventoryCurrency.items.remove(slot); role.inventoryCurrency.items.remove(slot + 18); role.inventorySold.items.remove(slot); @@ -70,6 +98,108 @@ public class ScriptRoleTrader extends ScriptRoleInterface{ public String getMarket(){ return role.marketName; } + + /** + * @param slot + * @return the number of times an item has been sold on that slot + */ + public int getPurchaseNum(int slot) { + if(slot >= 18 || slot < 0) return -1; + return role.purchases[slot]; + } + + /** + * @param slot + * @param player + * @return the number of times this player has purchased from this trader + */ + public int getPurchaseNum(int slot, IPlayer player) { + if(slot >= 18 || slot < 0) return -1; + return role.getArrayByName(player.getDisplayName(), role.playerPurchases)[slot]; + } + + /** + * Sets the purchase count of all slots to 0 + */ + public void resetPurchaseNum() { + for (int i = 0; i < role.purchases.length; ++i) role.purchases[i] = 0; + } + + /** + * sets the purchase num for that slot to 0 + * @param slot + */ + public void resetPurchaseNum(int slot) { + if(slot >= 18 || slot < 0) return; + role.purchases[slot] = 0; + } + + /** + * sets the purchase num for that slot and player to 0 + * @param slot + * @param player + */ + public void resetPurchaseNum(int slot, IPlayer player) { + if(slot >= 18 || slot < 0) return; + role.getArrayByName(player.getDisplayName(), role.playerPurchases)[slot] = 0; + } + + /** + * @param slot + * @return if this slot is enabled + */ + public boolean isSlotEnabled(int slot) { + if(slot >= 18 || slot < 0) return false; + return role.disableSlot[slot] > 0; + } + + /** + * @param slot + * @param player + * @return if this slot is enabled for this player + */ + public boolean isSlotEnabled(int slot, IPlayer player) { + if(slot >= 18 || slot < 0) return false; + return role.isSlotEnabled(slot, (EntityPlayer)player.getMCEntity()); + } + + /** + * prevent an item from being sold on that slot + * @param slot + */ + public void disableSlot(int slot) { + if(slot >= 18 || slot < 0) return; + role.disableSlot[slot] = 1; + } + + /** + * disables the slot for this player + * @param slot + * @param player + */ + public void disableSlot(int slot, IPlayer player) { + if(slot >= 18 || slot < 0) return; + role.getArrayByName(player.getDisplayName(), role.playerDisableSlot)[slot] = 1; + } + + /** + * allow an item to be sold on that slot + * @param slot + */ + public void enableSlot(int slot) { + if(slot >= 18 || slot < 0) return; + role.disableSlot[slot] = 0; + } + + /** + * enables the slot for this player + * @param slot + * @param player + */ + public void enableSlot(int slot, IPlayer player) { + if(slot >= 18 || slot < 0) return; + role.getArrayByName(player.getDisplayName(), role.playerDisableSlot)[slot] = 0; + } @Override public int getType(){ diff --git a/src/main/resources/assets/customnpcs/lang/en_US.lang b/src/main/resources/assets/customnpcs/lang/en_US.lang index 14502512f..bf212b636 100644 --- a/src/main/resources/assets/customnpcs/lang/en_US.lang +++ b/src/main/resources/assets/customnpcs/lang/en_US.lang @@ -222,6 +222,7 @@ role.companion=Companion trader.insufficient=Insufficient Currency trader.sufficient=Sufficient Currency +trader.slotdisabled=Slot Disabled job.name=Job job.none=No Job