Xile Posted September 29, 2014 Share Posted September 29, 2014 Hello everyone, I'm new to modding and java in general, and I'm currently working on an RF powered armor set. The issue is I would like to make my armor detect nearby players and mobs within a configurable radius around the player and then constantly zap them with lightning at a configurable interval. If anyone could provide insight into how I would go about doing this I would be immensely grateful. Thank you. Quote Link to comment Share on other sites More sharing options...
Jwosty Posted September 29, 2014 Share Posted September 29, 2014 Do you mean like just vanilla lightning raining down from the sky, or zaps coming from the player to mobs? If the latter, you'll have to create your own entity. Quote I like to make mods, just like you. Here's one worth checking out Link to comment Share on other sites More sharing options...
david476 Posted September 29, 2014 Share Posted September 29, 2014 To get the players around you, entites have methods for finding other ones inside an AABB, just go through the list. Quote Link to comment Share on other sites More sharing options...
Xile Posted September 29, 2014 Author Share Posted September 29, 2014 Do you mean like just vanilla lightning raining down from the sky, or zaps coming from the player to mobs? If the latter, you'll have to create your own entity. Initially i was going to do my own zaps, but this is my first mod and im a noob so I just want to make vanilla lightning from sky hit them. To get the players around you, entites have methods for finding other ones inside an AABB, just go through the list. This is what I have tried so far. to no avail. //Bounding Box Attempt public double minX; public double minY; public double minZ; public double maxX; public double maxY; public double maxZ; public AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ); { this.minX = 0; this.minY = 0; this.minZ = 0; this.maxX = 10; this.maxY = 10; this.maxZ = 10; } @Override public void onArmorTick(World world, EntityPlayer player, ItemStack armor) { List entities = world.getEntitiesWithinAABB(getClass(), axisalignedbb); System.out.println("These Entities Are within Range!" + entities + ""); } It doesn't detect any entities unfortunately Quote Link to comment Share on other sites More sharing options...
jabelar Posted September 29, 2014 Share Posted September 29, 2014 I'm not sure, but I think the bounding box minX, maxX, etc. are absolute positions. I mean you're looking between 0 and 10 but do you even know where that is in the world? How are you sure there are even any entities there? I think that might be way underground or something. Quote Check out my tutorials here: http://jabelarminecraft.blogspot.com/ Link to comment Share on other sites More sharing options...
Xile Posted September 29, 2014 Author Share Posted September 29, 2014 Yea that's the part i'm having trouble with how do make it follow the player around. If its even possible. Quote Link to comment Share on other sites More sharing options...
hugo_the_dwarf Posted September 29, 2014 Share Posted September 29, 2014 List players = getWorldObj().getEntitiesWithinAABB(EntityPlayer.class,player.getBoundingBox().expand(3, 3, 3); this will get all players around the player (and probably the origin player too) just change what class to find to something else or use the base class, I think EntityLiving? EntitiyLivingBase? then when spawning lightening just make sure you're not spawning one on whoever created the bounding box. Quote Currently updating my Mod to 1.10.2 https://bitbucket.org/hugo_the_dwarf/riseoftristram2016/src?at=master Link to comment Share on other sites More sharing options...
Xile Posted September 30, 2014 Author Share Posted September 30, 2014 List players = getWorldObj().getEntitiesWithinAABB(EntityPlayer.class,player.getBoundingBox().expand(3, 3, 3); this will get all players around the player (and probably the origin player too) just change what class to find to something else or use the base class, I think EntityLiving? EntitiyLivingBase? then when spawning lightening just make sure you're not spawning one on whoever created the bounding box. Thank you very much! However getWorldObj() says that it cannot find that method. I forgot to mention this is on 1.7.10. That may be why? Quote Link to comment Share on other sites More sharing options...
Eternaldoom Posted September 30, 2014 Share Posted September 30, 2014 Just use the worldObj field. Quote Check out my mod, Realms of Chaos, here. If I helped you, be sure to press the "Thank You" button! Link to comment Share on other sites More sharing options...
Xile Posted September 30, 2014 Author Share Posted September 30, 2014 Ok this is what I tried. List players = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, player.getBoundingBox().expand(3, 3, 3)); System.out.println("Nearby Entities" + players + "!"); Is this correct? apologies if this is a noob question. I've been able to figure out some stuff myself but this one has been stumping me. Quote Link to comment Share on other sites More sharing options...
hugo_the_dwarf Posted September 30, 2014 Share Posted September 30, 2014 yeah I didn't want to give copy paste ready code (which i'm bad for) because I was hoping you'd see the error and go "maybe it just takes a world object/instance" but the expand(3,3,3) can be any numbers you want it to be. I just used 3's as a placeholder to show you how to use it. PreEdit: you might want to use an Iterator and a while loop, or some kindof loop to go through the list for each entry. you can also refactor the "players" to something like "entities" or "targets" idk whatever you want to call it. I used it for a block that would store mana, and recharge nearby mages. but yeah looks a bit better, altho since it's an "onArmorTick" it should have a world param that you can toss in. like par2World.getEntitiesWithin..... and if it doesn't it should at least reference the player or entity wearing it (since zombies and skeletons can wear armor) and you can get the world object from there too. Quote Currently updating my Mod to 1.10.2 https://bitbucket.org/hugo_the_dwarf/riseoftristram2016/src?at=master Link to comment Share on other sites More sharing options...
Xile Posted September 30, 2014 Author Share Posted September 30, 2014 You guys have all been an immense help thus far! This is what I currently have in the armortick //Armor Effects @Override public void onArmorTick(World world, EntityPlayer player, ItemStack armor) { EnergyStored = armor.stackTagCompound.getInteger("Energy"); if (EnergyStored < 1) NoPower = true; if (KeyInputHandler.ArmorOn == true) if (NoPower != true) System.out.println("Tesla AOE Activated"); else System.out.println("Tesla Ability Deactivated"); //Just A Test For Charging Armor Without External Mods! if (KeyInputHandler.ArmorOn == false) armor.stackTagCompound.setInteger("Energy", (EnergyStored + 1000)); //PotionEffects Not sure why they dont work when all armor equipped... is weird.. if (player.inventory.armorItemInSlot(2) == ItemLoader.armorTeslaLegs) { if (NoPower != true) player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 500, 4)); } if (player.inventory.armorItemInSlot(3) == ItemLoader.armorTeslaBoots) { if (NoPower != true) player.addPotionEffect(new PotionEffect(Potion.jump.id, 500, 4)); } while (KeyInputHandler.ArmorOn == true) { List players = world.getEntitiesWithinAABB(EntityLivingBase.class, player.getBoundingBox().expand(7, 7, 7)); System.out.println("Nearby Entities" + players + "!"); } } currently I'm just testing random things to find out how they work but the bounding box crashes the game when my world with me wearing my armor loads up with this crash. http://pastebin.com/KgYbz6gh I got this crash when i was previously messing with bounding boxes as well. I feel like its something obvious I'm missing here. Quote Link to comment Share on other sites More sharing options...
Xile Posted September 30, 2014 Author Share Posted September 30, 2014 Disregard that! After some searching I was able to get it working with this code: List entities = player.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(player.posX - 5, player.posY - 5, player.posZ - 5, player.posX + 7, player.posY + 7, player.posZ + 7) This correctly prints out all nearby entities in the console as well Thank you everyone! Quote Link to comment Share on other sites More sharing options...
Xile Posted September 30, 2014 Author Share Posted September 30, 2014 Well, I'm once again stumped lol. How do I go about pulling the entities coordinates out of the list by using the Iterator? Any help or hints is much appreciated Quote Link to comment Share on other sites More sharing options...
TheGreyGhost Posted September 30, 2014 Share Posted September 30, 2014 Hi EntityPotion.onImpact() has a good example of this entity.posX, .posY, .posZ contain the position. -TGG Quote Link to comment Share on other sites More sharing options...
DonKresenko Posted September 30, 2014 Share Posted September 30, 2014 Can you post the full source? Quote _ ___ ___| |__ _ __ / __/ __| '_ \| '_ \ \__ \__ \ | | | | | | |___/___/_| |_|_| |_| Link to comment Share on other sites More sharing options...
larsgerrits Posted September 30, 2014 Share Posted September 30, 2014 No, they are vanilla files and you can look at them yourself (located at Referenced Libraries->forgeSrc.jar) Quote Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support. 1.12 -> 1.13 primer by williewillus. 1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support. http://www.howoldisminecraft1710.today/ Link to comment Share on other sites More sharing options...
Xile Posted September 30, 2014 Author Share Posted September 30, 2014 Edit: Nevermind I fixed it! Should I just use this code after the lightning spawn to make it only fire every half second? try { TimeUnit.MILLISECONDS.sleep(500); } catch (InterruptedException e) { //Handle exception } Working Code: //Attempt at Entity scan and target if (KeyInputHandler.ArmorOn == true) { System.out.println("Scanner Activated"); List entities = player.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(player.posX - 5, player.posY - 5, player.posZ - 5, player.posX + 7, player.posY + 7, player.posZ + 7)); if (entities != null && !entities.isEmpty()) { Iterator iterator = entities.iterator(); double posX; double posY; double posZ; EntityLivingBase ent; while (iterator.hasNext()) { ent = (EntityLivingBase) iterator.next(); posX = ent.posX; posY = ent.posY; posZ = ent.posZ; EntityLightningBolt Lightning = new EntityLightningBolt(world, posX, posY, posZ); world.spawnEntityInWorld(Lightning); } } } } Pre Edit: Ok, I feel like this should work. However as soon as I activate it my whole game just freezes with no errors //Attempt at Entity scan and target if (KeyInputHandler.ArmorOn == true) { System.out.println("Scanner Activated"); List entities = player.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(player.posX - 5, player.posY - 5, player.posZ - 5, player.posX + 7, player.posY + 7, player.posZ + 7)); Iterator iterator = entities.iterator(); double posX; double posY; double posZ; EntityLivingBase ent; while (iterator.hasNext()); ent = (EntityLivingBase)iterator.next(); posX = ent.posX; posY = ent.posY; posZ = ent.posZ; EntityLightningBolt Lightning = new EntityLightningBolt(world, posX, posY, posZ); world.spawnEntityInWorld(Lightning); Quote Link to comment Share on other sites More sharing options...
Xile Posted October 1, 2014 Author Share Posted October 1, 2014 Thank you very much! You have all been a great help. One thing that's been giving me issues is that for some reason the detection of the armor that is equipped doesnt work properly. Currently this is how I am detecting what armor is worn. It doesn't seem to work at all though. This is just a test. public void onArmorTick(World world, EntityPlayer player, ItemStack armor) { //0 is Boots //1 is Legs //2 is Chest //3 is Helm ItemStack armorslot = player.inventory.armorItemInSlot(0); System.out.println(armorslot + " Is Equipped"); if (player.inventory.armorItemInSlot(0) == ItemLoader.ArmorTeslaBoots) { System.out.println("Boots worn"); in console it prints: 1xitem.ArmorTeslaBoots@0 Is Equipped however it does not print "Boots Worn" when equipped... Quote Link to comment Share on other sites More sharing options...
hugo_the_dwarf Posted October 1, 2014 Share Posted October 1, 2014 the problem is "armorItemInSlot(0)" returns an ItemStack, you can't compare ItemStacks with Items you will always get a false. You want armorItemInSlot(0).getItem() .equals(item) or == item, or instanceof item also you already have the itemstack from this line: ItemStack armorslot = player.inventory.armorItemInSlot(0); so just use if (armorslot.getItem() == ItemLoader.ArmorTeslaBoots) { //do stuff } Quote Currently updating my Mod to 1.10.2 https://bitbucket.org/hugo_the_dwarf/riseoftristram2016/src?at=master Link to comment Share on other sites More sharing options...
jeffryfisher Posted October 1, 2014 Share Posted October 1, 2014 You should take a look at the getEntitiesWithinAABB(...) method and the other methods around it in its class. By that I mean to select the method name in your code in Eclipse, then right-click on it, then use the popup menu to view the method's declaration. You'll learn much more that way much faster than coming here to ask others to go do that reading for you. Once there, you will see several such methods. Look at their arguments. You can exclude an entity or include only a certain type of entity. I think you'll also see some calls to underlying methods in the chunk management class. Investigating those might give you more ideas how to refine your search to get exactly those entities you want to electrocute (i.e. you probably don't want lightning shooting at paintings and lead-knots). Good Luck! Quote The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting. Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.