Posted June 10, 201411 yr 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); } } } http://i.imgur.com/wNvtGZw.png[/img] MODS and MODDING TUTORIALS
June 10, 201411 yr 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.