Jump to content

[1.7.10] Controlling Mob Grinders


HalestormXV

Recommended Posts

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));
		}
	}

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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));
		}
	}
}
}

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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));
		}
	}
}
}

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hi, I want to make a client-only mod, everything is ok, but when I use shaders, none of the textures rendered in RenderLevelStageEvent nor the crow entity model are rendered, I want them to be visible, because it's a horror themed mod Here is how i render the crow model in the CrowEntityRenderer<CrowEntity>, by the time i use this method, i know is not the right method but i don't think this is the cause of the problem, the renderType i'm using is entityCutout @Override public void render(CrowEntity p_entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { super.render(p_entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); ClientEventHandler.getClient().crow.renderToBuffer(poseStack, bufferSource.getBuffer(ClientEventHandler.getClient().crow .renderType(TEXTURE)), packedLight, OverlayTexture.NO_OVERLAY, Utils.rgb(255, 255, 255)); } Here renderLevelStage @Override public void renderWorld(RenderLevelStageEvent e) { horrorEvents.draw(e); } Here is how i render every event public void draw(RenderLevelStageEvent e) { for (HorrorEvent event : currentHorrorEvents) { event.tick(e.getPartialTick()); event.draw(e); } } Here is how i render the crow model on the event @Override public void draw(RenderLevelStageEvent e) { if(e.getStage() == RenderLevelStageEvent.Stage.AFTER_ENTITIES) { float arcProgress = getArcProgress(0.25f); int alpha = (int) Mth.lerp(arcProgress, 0, 255); int packedLight = LevelRenderer.getLightColor(Minecraft.getInstance().level, blockPos); VertexConsumer builder = ClientEventHandler.bufferSource.getBuffer(crow); Crow<CreepyBirdHorrorEvent> model = ClientEventHandler .getClient().crow; model.setupAnim(this); RenderHelper.renderModelInWorld(model, position, offset, e.getCamera(), e.getPoseStack(), builder, packedLight, OverlayTexture.NO_OVERLAY, alpha); builder = ClientEventHandler.bufferSource.getBuffer(eyes); RenderHelper.renderModelInWorld(model, position, offset, e.getCamera(), e.getPoseStack(), builder, 15728880, OverlayTexture.NO_OVERLAY, alpha); } } How i render the model public static void renderModelInWorld(Model model, Vector3f pos, Vector3f offset, Camera camera, PoseStack matrix, VertexConsumer builder, int light, int overlay, int alpha) { matrix.pushPose(); Vec3 cameraPos = camera.getPosition(); double finalX = pos.x - cameraPos.x + offset.x; double finalY = pos.y - cameraPos.y + offset.y; double finalZ = pos.z - cameraPos.z + offset.z; matrix.pushPose(); matrix.translate(finalX, finalY, finalZ); matrix.mulPose(Axis.XP.rotationDegrees(180f)); model.renderToBuffer(matrix, builder, light, overlay, Utils .rgba(255, 255, 255, alpha)); matrix.popPose(); matrix.popPose(); } Thanks in advance
    • Here's the link: https://mclo.gs/7L5FibL Here's the link: https://mclo.gs/7L5FibL
    • Also the mod "Connector Extras" modifies Reach-entity-attributes and can cause fatal errors when combined with ValkrienSkies mod. Disable this mod and continue to use Syntra without it.
    • Hi everyone. I was trying modify the vanilla loot of the "short_grass" block, I would like it drops seeds and vegetal fiber (new item of my mod), but I don't found any guide or tutorial on internet. Somebody can help me?
    • On 1.20.1 use ValkrienSkies mod version 2.3.0 Beta 1. I had the same issues as you and it turns out the newer beta versions have tons of unresolved incompatibilities. If you change the version you will not be required to change the versions of eureka or any other additions unless prompted at startup. This will resolve Reach-entity-attributes error sound related error and cowardly errors.
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.