Add generic EntityTeleportEvent (#7694)

This commit is contained in:
SizableShrimp authored and GitHub committed 2021-03-29 18:05:13 -07:00
1 parent f47429717d
commit 80feb0aeb2
11 files changed
+332 -8

No files matched your search

@@ -43,6 +43,7 @@ import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.effect.LightningBoltEntity;
import net.minecraft.entity.item.EnderPearlEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.ZombieEntity;
import net.minecraft.entity.passive.AnimalEntity;
@@ -105,6 +106,7 @@ import net.minecraftforge.event.entity.PlaySoundAtEntityEvent;
import net.minecraftforge.event.entity.ProjectileImpactEvent;
import net.minecraftforge.event.entity.item.ItemExpireEvent;
import net.minecraftforge.event.entity.living.AnimalTameEvent;
import net.minecraftforge.event.entity.living.EnderTeleportEvent;
import net.minecraftforge.event.entity.living.LivingConversionEvent;
import net.minecraftforge.event.entity.living.LivingDestroyBlockEvent;
import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent;
@@ -113,6 +115,7 @@ import net.minecraftforge.event.entity.living.LivingHealEvent;
import net.minecraftforge.event.entity.living.LivingPackSizeEvent;
import net.minecraftforge.event.entity.living.LivingSpawnEvent;
import net.minecraftforge.event.entity.living.LivingSpawnEvent.AllowDespawn;
import net.minecraftforge.event.entity.living.EntityTeleportEvent;
import net.minecraftforge.event.entity.living.ZombieEvent.SummonAidEvent;
import net.minecraftforge.event.entity.player.ArrowLooseEvent;
import net.minecraftforge.event.entity.player.ArrowNockEvent;
@@ -768,4 +771,53 @@ public class ForgeEventFactory
{
MinecraftForge.EVENT_BUS.post(new LivingConversionEvent.Post(entity, outcome));
}
public static EntityTeleportEvent.TeleportCommand onEntityTeleportCommand(Entity entity, double targetX, double targetY, double targetZ)
{
EntityTeleportEvent.TeleportCommand event = new EntityTeleportEvent.TeleportCommand(entity, targetX, targetY, targetZ);
MinecraftForge.EVENT_BUS.post(event);
return event;
}
public static EntityTeleportEvent.SpreadPlayersCommand onEntityTeleportSpreadPlayersCommand(Entity entity, double targetX, double targetY, double targetZ)
{
EntityTeleportEvent.SpreadPlayersCommand event = new EntityTeleportEvent.SpreadPlayersCommand(entity, targetX, targetY, targetZ);
MinecraftForge.EVENT_BUS.post(event);
return event;
}
public static EntityTeleportEvent.EnderEntity onEnderTeleport(LivingEntity entity, double targetX, double targetY, double targetZ)
{
EntityTeleportEvent.EnderEntity event = new EntityTeleportEvent.EnderEntity(entity, targetX, targetY, targetZ);
onOldEnderTeleport(entity, 0, event); //TODO Forge: Remove this line in 1.17
MinecraftForge.EVENT_BUS.post(event);
return event;
}
public static EntityTeleportEvent.EnderPearl onEnderPearlLand(ServerPlayerEntity entity, double targetX, double targetY, double targetZ, EnderPearlEntity pearlEntity, float attackDamage)
{
EntityTeleportEvent.EnderPearl event = new EntityTeleportEvent.EnderPearl(entity, targetX, targetY, targetZ, pearlEntity, attackDamage);
event.setAttackDamage(onOldEnderTeleport(entity, attackDamage, event)); //TODO Forge: Remove this line in 1.17
MinecraftForge.EVENT_BUS.post(event);
return event;
}
@SuppressWarnings("deprecation") //TODO Forge: Scrap this method/event in 1.17 - it only exists for backwards-compatibility
private static float onOldEnderTeleport(LivingEntity entity, float attackDamage, EntityTeleportEvent event)
{
EnderTeleportEvent enderEvent = new EnderTeleportEvent(entity, event.getTargetX(), event.getTargetY(), event.getTargetZ(), attackDamage);
MinecraftForge.EVENT_BUS.post(enderEvent);
event.setCanceled(enderEvent.isCanceled());
event.setTargetX(enderEvent.getTargetX());
event.setTargetY(enderEvent.getTargetY());
event.setTargetZ(enderEvent.getTargetZ());
return enderEvent.getAttackDamage();
}
public static EntityTeleportEvent.ChorusFruit onChorusFruitTeleport(LivingEntity entity, double targetX, double targetY, double targetZ)
{
EntityTeleportEvent.ChorusFruit event = new EntityTeleportEvent.ChorusFruit(entity, targetX, targetY, targetZ);
MinecraftForge.EVENT_BUS.post(event);
return event;
}
}
@@ -25,8 +25,9 @@ import net.minecraft.entity.LivingEntity;
/**
* Event for when an Enderman/Shulker teleports or an ender pearl is used. Can be used to either modify the target position, or cancel the teleport outright.
* @author Mithion
*
* @deprecated Use {@link EntityTeleportEvent.EnderEntity} or {@link EntityTeleportEvent.EnderPearl}.
*/
@Deprecated //TODO Forge: Remove in 1.17
@Cancelable
public class EnderTeleportEvent extends LivingEvent
{
@@ -0,0 +1,206 @@
package net.minecraftforge.event.entity.living;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.EnderPearlEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.EntityEvent;
import net.minecraftforge.eventbus.api.Cancelable;
/**
* EntityTeleportEvent is fired when an event involving any teleportation of an Entity occurs.<br>
* If a method utilizes this {@link net.minecraftforge.eventbus.api.Event} as its parameter, the method will
* receive every child event of this class.<br>
* <br>
* {@link #getTarget()} contains the target destination.<br>
* {@link #getPrev()} contains the entity's current position.<br>
* <br>
* All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}.<br>
**/
public class EntityTeleportEvent extends EntityEvent
{
protected double targetX;
protected double targetY;
protected double targetZ;
public EntityTeleportEvent(Entity entity, double targetX, double targetY, double targetZ) {
super(entity);
this.targetX = targetX;
this.targetY = targetY;
this.targetZ = targetZ;
}
public double getTargetX() { return targetX; }
public void setTargetX(double targetX) { this.targetX = targetX; }
public double getTargetY() { return targetY; }
public void setTargetY(double targetY) { this.targetY = targetY; }
public double getTargetZ() { return targetZ; }
public void setTargetZ(double targetZ) { this.targetZ = targetZ; }
public Vector3d getTarget() { return new Vector3d(this.targetX, this.targetY, this.targetZ); }
public double getPrevX() { return getEntity().getX(); }
public double getPrevY() { return getEntity().getY(); }
public double getPrevZ() { return getEntity().getZ(); }
public Vector3d getPrev() { return getEntity().position(); }
/**
* EntityTeleportEvent.TeleportCommand is fired before a living entity is teleported
* from use of {@link net.minecraft.command.impl.TeleportCommand}.
* <br>
* This event is {@link net.minecraftforge.eventbus.api.Cancelable}.<br>
* If the event is not canceled, the entity will be teleported.
* <br>
* This event does not have a result. {@link HasResult}<br>
* <br>
* This event is fired on the {@link MinecraftForge#EVENT_BUS}.<br>
* <br>
* This event is only fired on the {@link net.minecraftforge.fml.LogicalSide#SERVER} side.<br>
* <br>
* If this event is canceled, the entity will not be teleported.
*/
@Cancelable
public static class TeleportCommand extends EntityTeleportEvent
{
public TeleportCommand(Entity entity, double targetX, double targetY, double targetZ)
{
super(entity, targetX, targetY, targetZ);
}
}
/**
* EntityTeleportEvent.SpreadPlayersCommand is fired before a living entity is teleported
* from use of {@link net.minecraft.command.impl.SpreadPlayersCommand}.
* <br>
* This event is {@link net.minecraftforge.eventbus.api.Cancelable}.<br>
* If the event is not canceled, the entity will be teleported.
* <br>
* This event does not have a result. {@link HasResult}<br>
* <br>
* This event is fired on the {@link MinecraftForge#EVENT_BUS}.<br>
* <br>
* This event is only fired on the {@link net.minecraftforge.fml.LogicalSide#SERVER} side.<br>
* <br>
* If this event is canceled, the entity will not be teleported.
*/
@Cancelable
public static class SpreadPlayersCommand extends EntityTeleportEvent
{
public SpreadPlayersCommand(Entity entity, double targetX, double targetY, double targetZ)
{
super(entity, targetX, targetY, targetZ);
}
}
/**
* EntityTeleportEvent.EnderEntity is fired before an Enderman or Shulker randomly teleports.
* <br>
* This event is {@link net.minecraftforge.eventbus.api.Cancelable}.<br>
* If the event is not canceled, the entity will be teleported.
* <br>
* This event does not have a result. {@link HasResult}<br>
* <br>
* This event is fired on the {@link MinecraftForge#EVENT_BUS}.<br>
* <br>
* This event is only fired on the {@link net.minecraftforge.fml.LogicalSide#SERVER} side.<br>
* <br>
* If this event is canceled, the entity will not be teleported.
*/
@Cancelable
public static class EnderEntity extends EntityTeleportEvent
{
private final LivingEntity entityLiving;
public EnderEntity(LivingEntity entity, double targetX, double targetY, double targetZ)
{
super(entity, targetX, targetY, targetZ);
this.entityLiving = entity;
}
public LivingEntity getEntityLiving()
{
return entityLiving;
}
}
/**
* EntityTeleportEvent.EnderPearl is fired before an Entity is teleported from an EnderPearlEntity.
* <br>
* This event is {@link net.minecraftforge.eventbus.api.Cancelable}.<br>
* If the event is not canceled, the entity will be teleported.
* <br>
* This event does not have a result. {@link HasResult}<br>
* <br>
* This event is fired on the {@link MinecraftForge#EVENT_BUS}.<br>
* <br>
* This event is only fired on the {@link net.minecraftforge.fml.LogicalSide#SERVER} side.<br>
* <br>
* If this event is canceled, the entity will not be teleported.
*/
@Cancelable
public static class EnderPearl extends EntityTeleportEvent
{
private final ServerPlayerEntity player;
private final EnderPearlEntity pearlEntity;
private float attackDamage;
public EnderPearl(ServerPlayerEntity entity, double targetX, double targetY, double targetZ, EnderPearlEntity pearlEntity, float attackDamage)
{
super(entity, targetX, targetY, targetZ);
this.pearlEntity = pearlEntity;
this.player = entity;
this.attackDamage = attackDamage;
}
public EnderPearlEntity getPearlEntity()
{
return pearlEntity;
}
public ServerPlayerEntity getPlayer()
{
return player;
}
public float getAttackDamage()
{
return attackDamage;
}
public void setAttackDamage(float attackDamage)
{
this.attackDamage = attackDamage;
}
}
/**
* EntityTeleportEvent.ChorusFruit is fired before a LivingEntity is teleported due to consuming Chorus Fruit.
* <br>
* This event is {@link net.minecraftforge.eventbus.api.Cancelable}.<br>
* If the event is not canceled, the entity will be teleported.
* <br>
* This event does not have a result. {@link HasResult}<br>
* <br>
* This event is fired on the {@link MinecraftForge#EVENT_BUS}.<br>
* <br>
* This event is only fired on the {@link net.minecraftforge.fml.LogicalSide#SERVER} side.<br>
* <br>
* If this event is canceled, the entity will not be teleported.
*/
@Cancelable
public static class ChorusFruit extends EntityTeleportEvent
{
private final LivingEntity entityLiving;
public ChorusFruit(LivingEntity entity, double targetX, double targetY, double targetZ)
{
super(entity, targetX, targetY, targetZ);
this.entityLiving = entity;
}
public LivingEntity getEntityLiving()
{
return entityLiving;
}
}
}