Posted October 15, 20159 yr Alright, so I have added Global Loot to all existing living vanilla entities and any other new entities that might be subsequently added to the game. The item is meant to be incredibly rare, which it currently is, however it can drop off of anything. Kinda like a Trophy from openBlocks. Here is my inquiry. I want to make it so that players cannot set up a mob-grinder, flip a switch and then just play the waiting game. I know I saw a tutorial on how to do this somewhere but I cannot find it again. I input the global loot via the Subscribe Event when loot is created. Basically letting this item be obtained via a mob farm breaks the whole purpose of the mod so I Want to prevent that. And I do know it is possible I just don't know how to do it. My current method is very simple for adding drops. Now I essentials just need to add a mob-farm check to that. @SubscribeEvent public void dropSpiritualEssence(LivingDropsEvent event){ if ( !(event.entity instanceof EntityPlayer) ) { Random dChance = new Random(); int rareDrop = dChance.nextInt((100 - 1) + 1) + 1; if (rareDrop < celConfiguration.SPIRITESSENCE_DROP_PERCENT) { Random random = new Random(); ItemStack itemStackToDrop = new ItemStack(CelestialCraft_items.spiritualEssence, random.nextInt(3)); event.drops.add(new EntityItem(event.entity.worldObj, event.entity.posX, event.entity.posY, event.entity.posZ, itemStackToDrop)); } }
October 15, 20159 yr If I understand correctly - you want your item to drop only if the mob was killed by player? Totally possible - assign IExtendedEntityProperties to every living entity, store boolean defaulted to false. Change boolean to true using LivingDeathEvent if event.source.getEntity() instanceof EntityPlayer. Use IEEP's boolean in LivingDropsEvent to decide if mob was killed by player. Other option would be without IEEP. Simply spawn EntityItem in world using LivingDeathEvent. But that way it goes beyond vanilla drops system. 1.7.10 is no longer supported by forge, you are on your own.
October 15, 20159 yr Author In your second option without the IEEP. What do you mean it goes beyond the vanilla drops system? As in the item is not really being "dropped" just created? So vanilla isn't actually controlling it?
October 15, 20159 yr You don't need IEEP for this. The living drops event should include that damage source. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
October 16, 20159 yr Author Oh yeah, it did have it in there. Not sure how I missed it. So this should prevent these specific item drops from grinders correct: public class CCMobDrops { @SubscribeEvent public void dropSpiritualEssence(LivingDropsEvent event) { if ( !(event.entity instanceof EntityPlayer)) { Random dChance = new Random(); int rareDrop = dChance.nextInt((100 - 1) + 1) + 1; if (rareDrop < celConfiguration.SPIRITESSENCE_DROP_PERCENT && event.source.getSourceOfDamage() instanceof EntityPlayer) { Random random = new Random(); ItemStack itemStackToDrop = new ItemStack(CelestialCraft_items.spiritualEssence, random.nextInt(3)); event.drops.add(new EntityItem(event.entity.worldObj, event.entity.posX, event.entity.posY, event.entity.posZ, itemStackToDrop)); } } } }
October 16, 20159 yr Look at the DamageSource class more closely. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
October 16, 20159 yr Author I'm not sure what you mean. I've slightly altered the code: I've gone though the DamageSource class and I do see a variety of different methods like DamageSource causeArrowDamage, DamageSource setExplosion, public Entity getSourceOfDamage(), public String getDamageType() etc. Is using the above way not correct? Essentially how I am reading it we are retrieving the Source of the damage and if it is an instance of a player we continue. Or perhaps I should just do it right from the start is what you are suggesting? public class CCMobDrops { @SubscribeEvent public void dropSpiritualEssence(LivingDropsEvent event, DamageSource damage) { if ( !(event.entity instanceof EntityPlayer) ) && (damage.getSourceOfDamage() instanceof EntityPlayer) ) //check the entity that caused the damage and making sure it is of player. { Random dChance = new Random(); int rareDrop = dChance.nextInt((100 - 1) + 1) + 1; if (rareDrop < celConfiguration.SPIRITESSENCE_DROP_PERCENT) { Random random = new Random(); ItemStack itemStackToDrop = new ItemStack(CelestialCraft_items.spiritualEssence, random.nextInt(3)); event.drops.add(new EntityItem(event.entity.worldObj, event.entity.posX, event.entity.posY, event.entity.posZ, itemStackToDrop)); } } } }
October 16, 20159 yr Sorry, my mistake. I saw damage.getSourceOfDamage() instanceof EntityPlayer and it looked wrong, but I was away from Eclipse and on my tablet. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
October 16, 20159 yr I'm not sure what you mean. I've slightly altered the code: I've gone though the DamageSource class and I do see a variety of different methods like DamageSource causeArrowDamage, DamageSource setExplosion, public Entity getSourceOfDamage(), public String getDamageType() etc. Is using the above way not correct? Essentially how I am reading it we are retrieving the Source of the damage and if it is an instance of a player we continue. Or perhaps I should just do it right from the start is what you are suggesting? public class CCMobDrops { @SubscribeEvent public void dropSpiritualEssence(LivingDropsEvent event, DamageSource damage) { if ( !(event.entity instanceof EntityPlayer) ) && (damage.getSourceOfDamage() instanceof EntityPlayer) ) //check the entity that caused the damage and making sure it is of player. { Random dChance = new Random(); int rareDrop = dChance.nextInt((100 - 1) + 1) + 1; if (rareDrop < celConfiguration.SPIRITESSENCE_DROP_PERCENT) { Random random = new Random(); ItemStack itemStackToDrop = new ItemStack(CelestialCraft_items.spiritualEssence, random.nextInt(3)); event.drops.add(new EntityItem(event.entity.worldObj, event.entity.posX, event.entity.posY, event.entity.posZ, itemStackToDrop)); } } } } 1st: I totally forgot you have source in Drops event, sry. 2nd: Your if statement is pretty much it, BUT - #getSourceOfDamage() is direct source. Meaning that for IndirectDamageSource caused by arrow, shoot by player - it will return arrow. #getEntity() will return the shooter. Use 2nd one. 3rd: This is not how you do it. Method should ONLY have Event is its params. Then you pull source from "event.source". 4th: General rule is "do not declare new Random()". World class has its own Random alredy prepared. Hell, even entity itself has one, but protected. Use event.entity.worldObj.rand. 1.7.10 is no longer supported by forge, you are on your own.
October 16, 20159 yr 4) You could declare new Random() but I would do it at the event handler class level, not inside the function. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
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.