Jump to content

Recommended Posts

Posted

Heyho Guys!

 

I want to create a potions which stuns the entity to which it has been applied. Generally it works fine; Zombies, Pigs or Players can't move any more, but I want some extra features:

[*]A player who is flying should not be able to move (this is not affected by SharedMonsterAttributes.movementSpeed) and thus he has to fall down

[*]The same for a flying bat

[*]The same for a swimming squid

[*]Enderman should not be able to teleport

All in all: No mob should be able to move, they all have to fall down until they hit a block. (Maybe not the enderdragon/wither but generally every mob)

 

Actual code:

Potion:

package com.bedrockminer.magicum.potion;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.ai.attributes.IAttribute;
import net.minecraft.potion.Potion;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.MinecraftForge;

import com.bedrockminer.magicum.Main;
import com.bedrockminer.magicum.event.potion.EventHandlerFreezePotion;

public class PotionFreeze extends Potion {

private ResourceLocation icons = new ResourceLocation(Main.MODID, "textures/gui/icons.png");

protected PotionFreeze(int id, boolean isBad, int color) {
	super(id, isBad, color);
	this.setIconIndex(0, 0);
	MinecraftForge.EVENT_BUS.register(new EventHandlerFreezePotion());
}

@Override
public int getStatusIconIndex() {
	Minecraft.getMinecraft().getTextureManager().bindTexture(this.icons);
	return super.getStatusIconIndex();
}

@Override
public boolean isReady(int duration, int amplifier) {
	return false;
}

public Potion addAttribute(IAttribute attribute, String name, double amount, int operation) {
	this.func_111184_a(attribute, name, amount, operation);
	return this;
}
}

 

Init of the Potion:

freeze = 				new PotionFreeze(getNextID(), true, rgbToInt(100, 100, 255)).setPotionName("potion.magicum.freeze"); //0|0
	((PotionFreeze) freeze).addAttribute(SharedMonsterAttributes.movementSpeed, "91AEAA56-376B-4498-935B-2F7F68070635", -1.0D, 2);
	((PotionFreeze) freeze).addAttribute(SharedMonsterAttributes.attackDamage, "91AEAA56-376B-4498-935B-2F7F68070635", -1.0D, 2);
	((PotionFreeze) freeze).addAttribute(SharedMonsterAttributes.followRange, "91AEAA56-376B-4498-935B-2F7F68070635", -1.0D, 2);

 

EventHandler for Potion:

package com.bedrockminer.magicum.event.potion;

import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent;

import org.lwjgl.input.Mouse;

import com.bedrockminer.magicum.potion.ModPotions;

import cpw.mods.fml.common.eventhandler.EventPriority;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;

public class EventHandlerFreezePotion {

@SubscribeEvent(priority=EventPriority.HIGHEST)
public void mouseEvent(MouseEvent e) {
	if (Minecraft.getMinecraft().thePlayer.isPotionActive(ModPotions.freeze)) {
		Mouse.getDX();
		Mouse.getDY();
	}
}

@SubscribeEvent(priority=EventPriority.HIGHEST)
public void jumpEvent(LivingJumpEvent e) {
	if (e.entityLiving.isPotionActive(ModPotions.freeze)) {
		e.entityLiving.setVelocity(0.0F, -10.0F, 0.0F);
	}
}
}

Posted

The bat movement is directly coded in its updateAITasks() method.  In that event you can see that the motion fields get updated with some randomness to give the fluttery flight of the bat.  Additionally some motionY randomness is added in the onUpdate() method.

 

So to freeze the bat I think you can force the motionX, motionY, and motionZ all to be 0.  You may need to also set the poxX = prevPosX, etc. as the position might change a bit before potion effect is processed -- not sure about that.

 

In fact, for the freezing effect generally I don't think you should change the movementSpeed, which technically is an attribute -- it doesn't represent the speed the entity is actually moving, but instead represents the speed the entity might move.  The actual speed of the entity is reflected by motionX, motionY, motionZ for the most part.

 

Anyway, I think clearing the motion fields and resetting the position fields to previous value should generally "freeze" all types of entity. 

 

For the teleporting of an Enderman, that occurs in the EntityEnderman onLivingUpdate() method.  To modify that I think you have to create an event handler for the LivingUpdateEvent and check if the entityLiving is instanceof EntityEnderman and then check if potion effect is active on it and if it is then cancel the update processing.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

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



×
×
  • Create New...

Important Information

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