diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/block/PortalInfoBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/block/PortalInfoBridge.java index fd56bd5b..2a082d3f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/block/PortalInfoBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/block/PortalInfoBridge.java @@ -2,6 +2,7 @@ package io.izzel.arclight.common.bridge.block; import net.minecraft.world.server.ServerWorld; import org.bukkit.craftbukkit.v.event.CraftPortalEvent; +import org.jetbrains.annotations.Nullable; public interface PortalInfoBridge { @@ -11,5 +12,5 @@ public interface PortalInfoBridge { void bridge$setWorld(ServerWorld world); - ServerWorld bridge$getWorld(); + @Nullable ServerWorld bridge$getWorld(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/player/PlayerEntityBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/player/PlayerEntityBridge.java index 426c5038..298f4446 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/player/PlayerEntityBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/player/PlayerEntityBridge.java @@ -11,10 +11,6 @@ public interface PlayerEntityBridge extends LivingEntityBridge { boolean bridge$isFauxSleeping(); - String bridge$getSpawnWorld(); - - void bridge$setSpawnWorld(String world); - @Override CraftHumanEntity bridge$getBukkitEntity(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/TeleporterBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/TeleporterBridge.java index 914ea5ed..aba7469e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/TeleporterBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/TeleporterBridge.java @@ -1,6 +1,7 @@ package io.izzel.arclight.common.bridge.world; import net.minecraft.entity.Entity; +import net.minecraft.util.Direction; import net.minecraft.util.TeleportationRepositioner; import net.minecraft.util.math.BlockPos; @@ -11,4 +12,6 @@ public interface TeleporterBridge { boolean bridge$makePortal(Entity entityIn, BlockPos pos, int createRadius); Optional bridge$findPortal(BlockPos pos, int searchRadius); + + Optional bridge$createPortal(BlockPos pos, Direction.Axis axis, Entity entity, int createRadius); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java index ed05e89b..fce6c959 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java @@ -191,6 +191,10 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, @Shadow protected BlockPos field_242271_ac; @Shadow protected abstract Vector3d func_241839_a(Direction.Axis p_241839_1_, TeleportationRepositioner.Result p_241839_2_); @Shadow public abstract EntitySize getSize(Pose poseIn); + @Shadow protected abstract boolean func_233566_aG_(); + @Shadow public abstract boolean isInLava(); + @Shadow protected abstract void setOnFireFromLava(); + @Shadow protected boolean firstUpdate; // @formatter:on private static final int CURRENT_LEVEL = 2; @@ -862,7 +866,7 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, ServerWorld worldFinal = world = ((CraftWorld) event.getTo().getWorld()).getHandle(); blockpos1 = new BlockPos(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ()); - return this.a(world, blockpos1, flag2, event.getSearchRadius(), event.getCanCreatePortal(), event.getCreationRadius()).map((p_242275_2_) -> { + return this.findOrCreatePortal(world, blockpos1, flag2, event.getSearchRadius(), event.getCanCreatePortal(), event.getCreationRadius()).map((p_242275_2_) -> { BlockState blockstate = this.world.getBlockState(this.field_242271_ac); Direction.Axis direction$axis; Vector3d vector3d; @@ -911,6 +915,10 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, } protected Optional a(ServerWorld serverWorld, BlockPos pos, boolean flag, int searchRadius, boolean canCreatePortal, int createRadius) { + return findOrCreatePortal(serverWorld, pos, flag, searchRadius, canCreatePortal, createRadius); + } + + protected Optional findOrCreatePortal(ServerWorld serverWorld, BlockPos pos, boolean flag, int searchRadius, boolean canCreatePortal, int createRadius) { return ((TeleporterBridge) serverWorld.getDefaultTeleporter()).bridge$findPortal(pos, searchRadius); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/LivingEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/LivingEntityMixin.java index 380b3d9f..b0a174be 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/LivingEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/LivingEntityMixin.java @@ -170,6 +170,7 @@ public abstract class LivingEntityMixin extends EntityMixin implements LivingEnt @Shadow public abstract void applyKnockback(float strength, double ratioX, double ratioZ); @Shadow protected abstract void damageArmor(DamageSource damageSource, float damage); @Shadow protected abstract void playEquipSound(ItemStack stack); + @Shadow public abstract boolean getShouldBeDead(); // @formatter:on public int expToDrop; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/effect/LightningBoltEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/effect/LightningBoltEntityMixin.java index 8acd916c..b35fc6ca 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/effect/LightningBoltEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/effect/LightningBoltEntityMixin.java @@ -9,7 +9,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; @@ -18,37 +17,21 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LightningBoltEntity.class) public abstract class LightningBoltEntityMixin extends EntityMixin { - // @formatter:off - @Shadow private int lightningState; - // @formatter:on + public boolean isSilent = false; - public boolean isEffect; - public boolean isSilent; - - @Inject(method = "", at = @At("RETURN")) - private void arclight$init(World worldIn, double x, double y, double z, boolean effectOnlyIn, CallbackInfo ci) { - this.isEffect = effectOnlyIn; - this.isSilent = false; - } - - @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;onStruckByLightning(Lnet/minecraft/entity/effect/LightningBoltEntity;)V")) + @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;func_241841_a(Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/entity/effect/LightningBoltEntity;)V")) private void arclight$captureEntity(CallbackInfo ci) { ArclightCaptures.captureDamageEventEntity((Entity) (Object) this); } - @Inject(method = "tick", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/entity/Entity;onStruckByLightning(Lnet/minecraft/entity/effect/LightningBoltEntity;)V")) + @Inject(method = "tick", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/entity/Entity;func_241841_a(Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/entity/effect/LightningBoltEntity;)V")) private void arclight$resetEntity(CallbackInfo ci) { ArclightCaptures.captureDamageEventEntity(null); } - @Redirect(method = "tick", at = @At(value = "FIELD", ordinal = 6, target = "Lnet/minecraft/entity/effect/LightningBoltEntity;lightningState:I")) - private int arclight$effectOnlyCheck(LightningBoltEntity entity) { - return (this.lightningState >= 0 && !this.isEffect) ? this.lightningState : -1; - } - @Redirect(method = "igniteBlocks", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) private boolean arclight$blockIgnite(World world, BlockPos pos, BlockState state) { - if (!isEffect && !CraftEventFactory.callBlockIgniteEvent(world, pos, (LightningBoltEntity) (Object) this).isCancelled()) { + if (!CraftEventFactory.callBlockIgniteEvent(world, pos, (LightningBoltEntity) (Object) this).isCancelled()) { return world.setBlockState(pos, state); } else { return false; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/ExperienceBottleEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/ExperienceBottleEntityMixin.java index 688cc134..6e0b36bd 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/ExperienceBottleEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/ExperienceBottleEntityMixin.java @@ -1,11 +1,10 @@ package io.izzel.arclight.common.mixin.core.entity.item; -import io.izzel.arclight.common.mixin.core.entity.EntityMixin; +import io.izzel.arclight.common.mixin.core.entity.projectile.ProjectileItemEntityMixin; import net.minecraft.entity.item.ExperienceBottleEntity; import net.minecraft.entity.item.ExperienceOrbEntity; import net.minecraft.potion.PotionUtils; import net.minecraft.potion.Potions; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.event.entity.ExpBottleEvent; @@ -13,7 +12,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @Mixin(ExperienceBottleEntity.class) -public abstract class ExperienceBottleEntityMixin extends EntityMixin { +public abstract class ExperienceBottleEntityMixin extends ProjectileItemEntityMixin { /** * @author IzzelAliz @@ -21,17 +20,18 @@ public abstract class ExperienceBottleEntityMixin extends EntityMixin { */ @Overwrite protected void onImpact(RayTraceResult result) { + super.onImpact(result); if (!this.world.isRemote) { int i = 3 + this.world.rand.nextInt(5) + this.world.rand.nextInt(5); ExpBottleEvent event = CraftEventFactory.callExpBottleEvent((ExperienceBottleEntity) (Object) this, i); i = event.getExperience(); if (event.getShowEffect()) { - this.world.playEvent(2002, new BlockPos((ExperienceBottleEntity) (Object) this), PotionUtils.getPotionColor(Potions.WATER)); + this.world.playEvent(2002, this.getPosition(), PotionUtils.getPotionColor(Potions.WATER)); } while (i > 0) { int j = ExperienceOrbEntity.getXPSplit(i); i -= j; - this.world.addEntity(new ExperienceOrbEntity(this.world, this.posX, this.posY, this.posZ, j)); + this.world.addEntity(new ExperienceOrbEntity(this.world, this.getPosX(), this.getPosY(), this.getPosZ(), j)); } this.remove(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/ItemFrameEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/ItemFrameEntityMixin.java index e044b58a..693dae9e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/ItemFrameEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/ItemFrameEntityMixin.java @@ -34,7 +34,7 @@ public abstract class ItemFrameEntityMixin extends HangingEntityMixin { if (!itemstack.isEmpty()) { itemstack = itemstack.copy(); itemstack.setCount(1); - itemstack.setItemFrame((ItemFrameEntity) (Object) this); + itemstack.setAttachedEntity((ItemFrameEntity) (Object) this); } this.getDataManager().set(ITEM, itemstack); if (!itemstack.isEmpty() && playSound) { @@ -51,9 +51,7 @@ public abstract class ItemFrameEntityMixin extends HangingEntityMixin { double locY = blockPosition.getY() + 0.5 - direction.getYOffset() * 0.46875; double locZ = blockPosition.getZ() + 0.5 - direction.getZOffset() * 0.46875; if (entity != null) { - entity.posX = locX; - entity.posY = locY; - entity.posZ = locZ; + entity.setRawPosition(locX, locY, locZ); } double d2 = width; double d3 = height; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/LeashKnotEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/LeashKnotEntityMixin.java index 0090cef1..5ad9a35c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/LeashKnotEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/LeashKnotEntityMixin.java @@ -5,6 +5,7 @@ import net.minecraft.entity.item.LeashKnotEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.network.play.server.SMountEntityPacket; +import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.math.AxisAlignedBB; import org.bukkit.craftbukkit.v.event.CraftEventFactory; @@ -30,13 +31,13 @@ public abstract class LeashKnotEntityMixin extends HangingEntityMixin { */ @SuppressWarnings("ConstantConditions") @Overwrite - public boolean processInitialInteract(final PlayerEntity entityhuman, final Hand enumhand) { + public ActionResultType processInitialInteract(final PlayerEntity entityhuman, final Hand enumhand) { if (this.world.isRemote) { - return true; + return ActionResultType.SUCCESS; } boolean flag = false; final double d0 = 7.0; - final List list = this.world.getEntitiesWithinAABB(MobEntity.class, new AxisAlignedBB(this.posX - 7.0, this.posY - 7.0, this.posZ - 7.0, this.posX + 7.0, this.posY + 7.0, this.posZ + 7.0)); + final List list = this.world.getEntitiesWithinAABB(MobEntity.class, new AxisAlignedBB(this.getPosX() - 7.0, this.getPosY() - 7.0, this.getPosZ() - 7.0, this.getPosX() + 7.0, this.getPosY() + 7.0, this.getPosZ() + 7.0)); for (final MobEntity entityinsentient : list) { if (entityinsentient.getLeashHolder() == entityhuman) { if (CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, (LeashKnotEntity) (Object) this, entityhuman).isCancelled()) { @@ -62,6 +63,6 @@ public abstract class LeashKnotEntityMixin extends HangingEntityMixin { this.remove(); } } - return true; + return ActionResultType.CONSUME; } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/AbstractMinecartEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/AbstractMinecartEntityMixin.java index 40b58c84..0eb60674 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/AbstractMinecartEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/AbstractMinecartEntityMixin.java @@ -3,8 +3,8 @@ package io.izzel.arclight.common.mixin.core.entity.item.minecart; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.world.WorldBridge; import io.izzel.arclight.common.mixin.core.entity.EntityMixin; +import net.minecraft.block.AbstractRailBlock; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.block.PoweredRailBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -17,7 +17,7 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.EntityPredicates; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.World; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -59,6 +59,7 @@ public abstract class AbstractMinecartEntityMixin extends EntityMixin { @Shadow public abstract void onActivatorRailPass(int x, int y, int z, boolean receivingPower); @Shadow private boolean isInReverse; @Shadow public abstract AbstractMinecartEntity.Type getMinecartType(); + @Shadow public abstract boolean canUseRail(); // @formatter:on public boolean slowWhenEmpty = true; @@ -130,9 +131,9 @@ public abstract class AbstractMinecartEntityMixin extends EntityMixin { */ @Overwrite public void tick() { - double prevX = this.posX; - double prevY = this.posY; - double prevZ = this.posZ; + double prevX = this.getPosX(); + double prevY = this.getPosY(); + double prevZ = this.getPosZ(); float prevYaw = this.rotationYaw; float prevPitch = this.rotationPitch; if (this.getRollingAmplitude() > 0) { @@ -141,14 +142,14 @@ public abstract class AbstractMinecartEntityMixin extends EntityMixin { if (this.getDamage() > 0.0f) { this.setDamage(this.getDamage() - 1.0f); } - if (this.posY < -64.0) { + if (this.getPosY() < -64.0) { this.outOfWorld(); } if (this.world.isRemote) { if (this.turnProgress > 0) { - double d0 = this.posX + (this.minecartX - this.posX) / this.turnProgress; - double d2 = this.posY + (this.minecartY - this.posY) / this.turnProgress; - double d3 = this.posZ + (this.minecartZ - this.posZ) / this.turnProgress; + double d0 = this.getPosX() + (this.minecartX - this.getPosX()) / this.turnProgress; + double d2 = this.getPosY() + (this.minecartY - this.getPosY()) / this.turnProgress; + double d3 = this.getPosZ() + (this.minecartZ - this.getPosZ()) / this.turnProgress; double d4 = MathHelper.wrapDegrees(this.minecartYaw - this.rotationYaw); this.rotationYaw += (float) (d4 / this.turnProgress); this.rotationPitch += (float) ((this.minecartPitch - this.rotationPitch) / this.turnProgress); @@ -156,38 +157,38 @@ public abstract class AbstractMinecartEntityMixin extends EntityMixin { this.setPosition(d0, d2, d3); this.setRotation(this.rotationYaw, this.rotationPitch); } else { - this.setPosition(this.posX, this.posY, this.posZ); + this.setPosition(this.getPosX(), this.getPosY(), this.getPosZ()); this.setRotation(this.rotationYaw, this.rotationPitch); } } else { /* - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; + this.prevPosX = this.getPosX(); + this.prevPosY = this.getPosY(); + this.prevPosZ = this.getPosZ(); */ if (!this.hasNoGravity()) { this.setMotion(this.getMotion().add(0.0, -0.04, 0.0)); } - int i = MathHelper.floor(this.posX); - int j = MathHelper.floor(this.posY); - int k = MathHelper.floor(this.posZ); + int i = MathHelper.floor(this.getPosX()); + int j = MathHelper.floor(this.getPosY()); + int k = MathHelper.floor(this.getPosZ()); if (this.world.getBlockState(new BlockPos(i, j - 1, k)).isIn(BlockTags.RAILS)) { --j; } BlockPos blockposition = new BlockPos(i, j, k); - BlockState iblockdata = this.world.getBlockState(blockposition); - if (iblockdata.isIn(BlockTags.RAILS)) { - this.moveAlongTrack(blockposition, iblockdata); - if (iblockdata.getBlock() == Blocks.ACTIVATOR_RAIL) { - this.onActivatorRailPass(i, j, k, iblockdata.get(PoweredRailBlock.POWERED)); + BlockState blockstate = this.world.getBlockState(blockposition); + if (this.canUseRail() && AbstractRailBlock.isRail(blockstate)) { + this.moveAlongTrack(blockposition, blockstate); + if (blockstate.getBlock() instanceof PoweredRailBlock && ((PoweredRailBlock) blockstate.getBlock()).isActivatorRail()) { + this.onActivatorRailPass(i, j, k, blockstate.get(PoweredRailBlock.POWERED)); } } else { this.moveDerailedMinecart(); } this.doBlockCollisions(); this.rotationPitch = 0.0f; - double d5 = this.prevPosX - this.posX; - double d6 = this.prevPosZ - this.posZ; + double d5 = this.prevPosX - this.getPosX(); + double d6 = this.prevPosZ - this.getPosZ(); if (d5 * d5 + d6 * d6 > 0.001) { this.rotationYaw = (float) (MathHelper.atan2(d6, d5) * 180.0 / 3.141592653589793); if (this.isInReverse) { @@ -202,7 +203,7 @@ public abstract class AbstractMinecartEntityMixin extends EntityMixin { this.setRotation(this.rotationYaw, this.rotationPitch); org.bukkit.World bworld = ((WorldBridge) this.world).bridge$getWorld(); Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); - Location to = new Location(bworld, this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); + Location to = new Location(bworld, this.getPosX(), this.getPosY(), this.getPosZ(), this.rotationYaw, this.rotationPitch); Vehicle vehicle = (Vehicle) this.getBukkitEntity(); Bukkit.getPluginManager().callEvent(new VehicleUpdateEvent(vehicle)); if (!from.equals(to)) { @@ -242,7 +243,12 @@ public abstract class AbstractMinecartEntityMixin extends EntityMixin { } } } - this.handleWaterMovement(); + this.func_233566_aG_(); + if (this.isInLava()) { + this.setOnFireFromLava(); + this.fallDistance *= 0.5F; + } + this.firstUpdate = false; } } @@ -262,14 +268,14 @@ public abstract class AbstractMinecartEntityMixin extends EntityMixin { @Overwrite protected void moveDerailedMinecart() { final double d0 = this.getMaximumSpeed(); - final Vec3d vec3d = this.getMotion(); + final Vector3d vec3d = this.getMotion(); this.setMotion(MathHelper.clamp(vec3d.x, -d0, d0), vec3d.y, MathHelper.clamp(vec3d.z, -d0, d0)); if (this.onGround) { - this.setMotion(new Vec3d(this.getMotion().x * this.derailedX, this.getMotion().y * this.derailedY, this.getMotion().z * this.derailedZ)); + this.setMotion(new Vector3d(this.getMotion().x * this.derailedX, this.getMotion().y * this.derailedY, this.getMotion().z * this.derailedZ)); } this.move(MoverType.SELF, this.getMotion()); if (!this.onGround) { - this.setMotion(new Vec3d(this.getMotion().x * this.flyingX, this.getMotion().y * this.flyingY, this.getMotion().z * this.flyingZ)); + this.setMotion(new Vector3d(this.getMotion().x * this.flyingX, this.getMotion().y * this.flyingY, this.getMotion().z * this.flyingZ)); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/MinecartCommandBlockEntity_MinecartCommandLogicMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/CommandBlockMinecartEntity_MinecartCommandLogicMixin.java similarity index 76% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/MinecartCommandBlockEntity_MinecartCommandLogicMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/CommandBlockMinecartEntity_MinecartCommandLogicMixin.java index ca882d32..e61fa408 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/MinecartCommandBlockEntity_MinecartCommandLogicMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/CommandBlockMinecartEntity_MinecartCommandLogicMixin.java @@ -3,15 +3,15 @@ package io.izzel.arclight.common.mixin.core.entity.item.minecart; import io.izzel.arclight.common.bridge.command.ICommandSourceBridge; import io.izzel.arclight.common.bridge.entity.EntityBridge; import net.minecraft.command.CommandSource; -import net.minecraft.entity.item.minecart.MinecartCommandBlockEntity; +import net.minecraft.entity.item.minecart.CommandBlockMinecartEntity; import org.bukkit.command.CommandSender; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -@Mixin(MinecartCommandBlockEntity.MinecartCommandLogic.class) -public abstract class MinecartCommandBlockEntity_MinecartCommandLogicMixin implements ICommandSourceBridge { +@Mixin(CommandBlockMinecartEntity.MinecartCommandLogic.class) +public abstract class CommandBlockMinecartEntity_MinecartCommandLogicMixin implements ICommandSourceBridge { - @Shadow(aliases = {"this$0", "field_210168_a"}, remap = false) private MinecartCommandBlockEntity outerThis; + @Shadow(aliases = {"this$0", "field_210168_a"}, remap = false) private CommandBlockMinecartEntity outerThis; public CommandSender getBukkitSender(CommandSource wrapper) { return ((EntityBridge) outerThis).bridge$getBukkitEntity(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/AbstractSkeletonEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/AbstractSkeletonEntityMixin.java index 51ff2ee1..7f4149da 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/AbstractSkeletonEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/AbstractSkeletonEntityMixin.java @@ -25,6 +25,7 @@ public abstract class AbstractSkeletonEntityMixin extends CreatureEntityMixin { if (event.isCancelled()) { event.getProjectile().remove(); ci.cancel(); + return; } if (event.getProjectile() != ((EntityBridge) arrowEntity).bridge$getBukkitEntity()) { this.playSound(SoundEvents.ENTITY_SKELETON_SHOOT, 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SilverfishEntity_SummonSilverfishGoalMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SilverfishEntity_SummonSilverfishGoalMixin.java index 7abf67cd..fd9a0119 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SilverfishEntity_SummonSilverfishGoalMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SilverfishEntity_SummonSilverfishGoalMixin.java @@ -34,7 +34,7 @@ public abstract class SilverfishEntity_SummonSilverfishGoalMixin extends Goal { if (this.lookForFriends <= 0) { World world = this.silverfish.world; Random random = this.silverfish.getRNG(); - BlockPos blockpos = new BlockPos(this.silverfish); + BlockPos blockpos = this.silverfish.getPosition(); for (int i = 0; i <= 5 && i >= -5; i = (i <= 0 ? 1 : 0) - i) { for (int j = 0; j <= 10 && j >= -10; j = (j <= 0 ? 1 : 0) - j) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SlimeEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SlimeEntityMixin.java index cbd02593..7195dc02 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SlimeEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SlimeEntityMixin.java @@ -5,6 +5,7 @@ import io.izzel.arclight.common.mixin.core.entity.MobEntityMixin; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.monster.SlimeEntity; +import net.minecraft.util.text.ITextComponent; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.entity.Slime; @@ -35,30 +36,36 @@ public abstract class SlimeEntityMixin extends MobEntityMixin { @Override public void remove(boolean keepData) { int i = this.getSlimeSize(); - if (!this.world.isRemote && i > 1 && this.getHealth() <= 0.0f) { - int j = 2 + this.rand.nextInt(3); - SlimeSplitEvent event = new SlimeSplitEvent((Slime) this.getBukkitEntity(), j); + if (!this.world.isRemote && i > 1 && this.getShouldBeDead() && !this.removed) { + ITextComponent itextcomponent = this.getCustomName(); + boolean flag = this.isAIDisabled(); + float f = (float) i / 4.0F; + int j = i / 2; + int k = 2 + this.rand.nextInt(3); + + SlimeSplitEvent event = new SlimeSplitEvent((Slime) this.getBukkitEntity(), k); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled() || event.getCount() <= 0) { super.remove(keepData); return; } - j = event.getCount(); - List slimes = new ArrayList<>(j); - for (int k = 0; k < j; ++k) { - float f = (k % 2 - 0.5f) * i / 4.0f; - float f2 = (k / 2 - 0.5f) * i / 4.0f; - SlimeEntity entityslime = this.getType().create(this.world); - if (this.hasCustomName()) { - entityslime.setCustomName(this.getCustomName()); - } + k = event.getCount(); + List slimes = new ArrayList<>(k); + + for (int l = 0; l < k; ++l) { + float f1 = ((float) (l % 2) - 0.5F) * f; + float f2 = ((float) (l / 2) - 0.5F) * f; + SlimeEntity slimeentity = this.getType().create(this.world); if (this.isNoDespawnRequired()) { - entityslime.enablePersistence(); + slimeentity.enablePersistence(); } - entityslime.setInvulnerable(this.isInvulnerable()); - entityslime.setSlimeSize(i / 2, true); - entityslime.setLocationAndAngles(this.posX + f, this.posY + 0.5, this.posZ + f2, this.rand.nextFloat() * 360.0f, 0.0f); - slimes.add(entityslime); + + slimeentity.setCustomName(itextcomponent); + slimeentity.setNoAI(flag); + slimeentity.setInvulnerable(this.isInvulnerable()); + slimeentity.setSlimeSize(j, true); + slimeentity.setLocationAndAngles(this.getPosX() + (double) f1, this.getPosY() + 0.5D, this.getPosZ() + (double) f2, this.rand.nextFloat() * 360.0F, 0.0F); + slimes.add(slimeentity); } if (CraftEventFactory.callEntityTransformEvent((SlimeEntity) (Object) this, slimes, EntityTransformEvent.TransformReason.SPLIT).isCancelled()) { return; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SpellcastingIllagerEntity_UseSpellGoalMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SpellcastingIllagerEntity_UseSpellGoalMixin.java new file mode 100644 index 00000000..5ec861a6 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SpellcastingIllagerEntity_UseSpellGoalMixin.java @@ -0,0 +1,25 @@ +package io.izzel.arclight.common.mixin.core.entity.monster; + +import net.minecraft.entity.monster.SpellcastingIllagerEntity; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(SpellcastingIllagerEntity.UseSpellGoal.class) +public abstract class SpellcastingIllagerEntity_UseSpellGoalMixin { + + // @formatter:off + @Shadow(aliases = {"this$0", "field_193323_e"}, remap = false) private SpellcastingIllagerEntity outerThis; + @Shadow protected abstract SpellcastingIllagerEntity.SpellType getSpellType(); + // @formatter:on + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/monster/SpellcastingIllagerEntity$UseSpellGoal;castSpell()V")) + private void arclight$castSpell(CallbackInfo ci) { + if (!CraftEventFactory.handleEntitySpellCastEvent(outerThis, this.getSpellType())) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SpiderEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SpiderEntityMixin.java index bad7be13..5354d223 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SpiderEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/SpiderEntityMixin.java @@ -1,30 +1,23 @@ package io.izzel.arclight.common.mixin.core.entity.monster; -import io.izzel.arclight.common.bridge.world.WorldBridge; +import io.izzel.arclight.common.mixin.core.entity.CreatureEntityMixin; import net.minecraft.entity.ILivingEntityData; import net.minecraft.entity.SpawnReason; import net.minecraft.entity.monster.SpiderEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.DifficultyInstance; -import net.minecraft.world.IWorld; -import org.bukkit.event.entity.CreatureSpawnEvent; +import net.minecraft.world.IServerWorld; import org.bukkit.event.entity.EntityPotionEffectEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import io.izzel.arclight.common.mixin.core.entity.CreatureEntityMixin; @Mixin(SpiderEntity.class) public abstract class SpiderEntityMixin extends CreatureEntityMixin { - @Inject(method = "onInitialSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/IWorld;addEntity(Lnet/minecraft/entity/Entity;)Z")) - private void arclight$spawnReason(IWorld worldIn, DifficultyInstance difficultyIn, SpawnReason reason, ILivingEntityData spawnDataIn, CompoundNBT dataTag, CallbackInfoReturnable cir) { - ((WorldBridge) worldIn).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.JOCKEY); - } - @Inject(method = "onInitialSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/monster/SpiderEntity;addPotionEffect(Lnet/minecraft/potion/EffectInstance;)Z")) - private void arclight$potionReason(IWorld worldIn, DifficultyInstance difficultyIn, SpawnReason reason, ILivingEntityData spawnDataIn, CompoundNBT dataTag, CallbackInfoReturnable cir) { + private void arclight$potionReason(IServerWorld worldIn, DifficultyInstance difficultyIn, SpawnReason reason, ILivingEntityData spawnDataIn, CompoundNBT dataTag, CallbackInfoReturnable cir) { bridge$pushEffectCause(EntityPotionEffectEvent.Cause.SPIDER_SPAWN); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombiePigmanEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombiePigmanEntityMixin.java deleted file mode 100644 index 79164df8..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombiePigmanEntityMixin.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.izzel.arclight.common.mixin.core.entity.monster; - -import io.izzel.arclight.common.bridge.entity.EntityBridge; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.monster.ZombiePigmanEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.DamageSource; -import org.bukkit.Bukkit; -import org.bukkit.entity.PigZombie; -import org.bukkit.event.entity.PigZombieAngerEvent; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(ZombiePigmanEntity.class) -public abstract class ZombiePigmanEntityMixin extends ZombieEntityMixin { - - // @formatter:off - @Shadow protected abstract boolean func_226547_i_(LivingEntity p_70835_1_); - @Shadow protected abstract int func_223336_ef(); - // @formatter:on - - public boolean attackEntityFrom(DamageSource damagesource, float f) { - if (this.isInvulnerableTo(damagesource)) { - return false; - } - Entity entity = damagesource.getTrueSource(); - boolean result = super.attackEntityFrom(damagesource, f); - if (result && entity instanceof PlayerEntity && !((PlayerEntity) entity).isCreative() && this.canEntityBeSeen(entity)) { - this.func_226547_i_((LivingEntity) entity); - } - return result; - } - - @Inject(method = "func_226547_i_", cancellable = true, at = @At("HEAD")) - private void arclight$anger(LivingEntity entity, CallbackInfoReturnable cir) { - PigZombieAngerEvent event = new PigZombieAngerEvent((PigZombie) this.getBukkitEntity(), (entity == null) ? null : ((EntityBridge) entity).bridge$getBukkitEntity(), this.func_223336_ef()); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - cir.setReturnValue(false); - } else { - arclight$capture = event.getNewAnger(); - } - } - - private transient int arclight$capture; - - @Redirect(method = "func_226547_i_", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/monster/ZombiePigmanEntity;func_223336_ef()I")) - private int arclight$useAnger(ZombiePigmanEntity pigmanEntity) { - return arclight$capture; - } -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombifiedPiglinEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombifiedPiglinEntityMixin.java new file mode 100644 index 00000000..e3779f26 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombifiedPiglinEntityMixin.java @@ -0,0 +1,64 @@ +package io.izzel.arclight.common.mixin.core.entity.monster; + +import io.izzel.arclight.common.bridge.entity.EntityBridge; +import io.izzel.arclight.common.bridge.entity.MobEntityBridge; +import io.izzel.arclight.mixin.Eject; +import net.minecraft.entity.Entity; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.monster.ZombifiedPiglinEntity; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.Bukkit; +import org.bukkit.entity.PigZombie; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.entity.PigZombieAngerEvent; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.UUID; + +@Mixin(ZombifiedPiglinEntity.class) +public abstract class ZombifiedPiglinEntityMixin extends ZombieEntityMixin { + + // @formatter:off + @Shadow public abstract UUID getAngerTarget(); + @Shadow public abstract void setAngerTarget(@Nullable UUID target); + @Shadow public abstract void setAngerTime(int time); + // @formatter:on + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + private void func_241411_fa_() { + double d0 = this.getAttributeValue(Attributes.FOLLOW_RANGE); + AxisAlignedBB axisalignedbb = AxisAlignedBB.fromVector(this.getPositionVec()).grow(d0, 10.0D, d0); + for (ZombifiedPiglinEntity piglinEntity : this.world.getLoadedEntitiesWithinAABB(ZombifiedPiglinEntity.class, axisalignedbb)) { + if (piglinEntity != (Object) this) { + if (piglinEntity.getAttackTarget() == null) { + if (!piglinEntity.isOnSameTeam(this.getAttackTarget())) { + ((MobEntityBridge) piglinEntity).bridge$pushGoalTargetReason(EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); + piglinEntity.setAttackTarget(this.getAttackTarget()); + } + } + } + } + } + + @Eject(method = "func_230258_H__", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/monster/ZombifiedPiglinEntity;setAngerTime(I)V")) + private void arclight$pigAngry(ZombifiedPiglinEntity piglinEntity, int time, CallbackInfo ci) { + Entity entity = ((ServerWorld) this.world).getEntityByUuid(this.getAngerTarget()); + PigZombieAngerEvent event = new PigZombieAngerEvent((PigZombie) this.getBukkitEntity(), entity == null ? null : ((EntityBridge) entity).bridge$getBukkitEntity(), time); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + this.setAngerTarget(null); + ci.cancel(); + } + this.setAngerTime(event.getNewAnger()); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/MooshroomEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/MooshroomEntityMixin.java index 975a6e19..954ccf87 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/MooshroomEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/MooshroomEntityMixin.java @@ -3,9 +3,10 @@ package io.izzel.arclight.common.mixin.core.entity.passive; import io.izzel.arclight.common.bridge.world.WorldBridge; import net.minecraft.entity.passive.CowEntity; import net.minecraft.entity.passive.MooshroomEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IWorld; +import net.minecraft.world.World; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityTransformEvent; @@ -16,6 +17,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import java.util.Collections; import java.util.List; @Mixin(MooshroomEntity.class) @@ -26,9 +28,9 @@ public abstract class MooshroomEntityMixin extends AnimalEntityMixin { } @Inject(method = "onSheared", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;addEntity(Lnet/minecraft/entity/Entity;)Z")) - private void arclight$animalTransform(ItemStack item, IWorld world, BlockPos pos, int fortune, CallbackInfoReturnable> cir, List stackList, CowEntity cowEntity) { + private void arclight$animalTransform(PlayerEntity player, ItemStack item, World world, BlockPos pos, int fortune, CallbackInfoReturnable> cir, CowEntity cowEntity) { if (CraftEventFactory.callEntityTransformEvent((MooshroomEntity) (Object) this, cowEntity, EntityTransformEvent.TransformReason.SHEARED).isCancelled()) { - cir.setReturnValue(stackList); + cir.setReturnValue(Collections.emptyList()); } else { ((WorldBridge) this.world).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.SHEARED); this.remove(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/PandaEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/PandaEntityMixin.java index e06a3d35..bacc0219 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/PandaEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/PandaEntityMixin.java @@ -24,7 +24,7 @@ public abstract class PandaEntityMixin extends AnimalEntityMixin { @Overwrite protected void updateEquipmentIfNeeded(ItemEntity itemEntity) { boolean cancel = this.getItemStackFromSlot(EquipmentSlotType.MAINHAND).isEmpty() && PANDA_ITEMS.test(itemEntity); - if (CraftEventFactory.callEntityPickupItemEvent((PandaEntity) (Object) this, itemEntity, 0, cancel).isCancelled()) { + if (!CraftEventFactory.callEntityPickupItemEvent((PandaEntity) (Object) this, itemEntity, 0, cancel).isCancelled()) { ItemStack itemstack = itemEntity.getItem(); this.setItemStackToSlot(EquipmentSlotType.MAINHAND, itemstack); this.inventoryHandsDropChances[EquipmentSlotType.MAINHAND.getIndex()] = 2.0F; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/ParrotEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/ParrotEntityMixin.java index 3c722434..c695c939 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/ParrotEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/ParrotEntityMixin.java @@ -1,8 +1,8 @@ package io.izzel.arclight.common.mixin.core.entity.passive; -import net.minecraft.entity.ai.goal.SitGoal; import net.minecraft.entity.passive.ParrotEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import org.bukkit.event.entity.EntityPotionEffectEvent; import org.spongepowered.asm.mixin.Mixin; @@ -14,12 +14,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ParrotEntity.class) public abstract class ParrotEntityMixin extends AnimalEntityMixin { - @Inject(method = "processInteract", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/passive/ParrotEntity;addPotionEffect(Lnet/minecraft/potion/EffectInstance;)Z")) - private void arclight$feed(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { + @Inject(method = "func_230254_b_", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/passive/ParrotEntity;addPotionEffect(Lnet/minecraft/potion/EffectInstance;)Z")) + private void arclight$feed(PlayerEntity p_230254_1_, Hand p_230254_2_, CallbackInfoReturnable cir) { bridge$pushEffectCause(EntityPotionEffectEvent.Cause.FOOD); } - @Redirect(method = "attackEntityFrom", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/ai/goal/SitGoal;setSitting(Z)V")) - private void arclight$handledInSuper(SitGoal sitGoal, boolean sitting) { + @Redirect(method = "attackEntityFrom", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/passive/ParrotEntity;func_233687_w_(Z)V")) + private void arclight$handledInSuper(ParrotEntity parrotEntity, boolean p_233687_1_) { } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/PigEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/PigEntityMixin.java index 12ba8fcf..e5547219 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/PigEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/PigEntityMixin.java @@ -2,8 +2,9 @@ package io.izzel.arclight.common.mixin.core.entity.passive; import io.izzel.arclight.common.bridge.world.WorldBridge; import net.minecraft.entity.effect.LightningBoltEntity; -import net.minecraft.entity.monster.ZombiePigmanEntity; +import net.minecraft.entity.monster.ZombifiedPiglinEntity; import net.minecraft.entity.passive.PigEntity; +import net.minecraft.world.server.ServerWorld; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.event.entity.CreatureSpawnEvent; import org.spongepowered.asm.mixin.Mixin; @@ -15,10 +16,10 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(PigEntity.class) public abstract class PigEntityMixin extends AnimalEntityMixin { - @Inject(method = "onStruckByLightning", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, - at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;addEntity(Lnet/minecraft/entity/Entity;)Z")) - private void arclight$pigZap(LightningBoltEntity lightningBolt, CallbackInfo ci, ZombiePigmanEntity pigmanEntity) { - if (CraftEventFactory.callPigZapEvent((PigEntity) (Object) this, lightningBolt, pigmanEntity).isCancelled()) { + @Inject(method = "func_241841_a", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;addEntity(Lnet/minecraft/entity/Entity;)Z")) + private void arclight$pigZap(ServerWorld p_241841_1_, LightningBoltEntity lightningBolt, CallbackInfo ci, ZombifiedPiglinEntity piglin) { + if (CraftEventFactory.callPigZapEvent((PigEntity) (Object) this, lightningBolt, piglin).isCancelled()) { ci.cancel(); } else { ((WorldBridge) this.world).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.LIGHTNING); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/SheepEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/SheepEntityMixin.java index 04fdb32d..303347c6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/SheepEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/passive/SheepEntityMixin.java @@ -18,12 +18,12 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(SheepEntity.class) public abstract class SheepEntityMixin extends AnimalEntityMixin { - @Inject(method = "func_213612_dV", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/passive/SheepEntity;entityDropItem(Lnet/minecraft/util/IItemProvider;I)Lnet/minecraft/entity/item/ItemEntity;")) + @Inject(method = "shear", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/passive/SheepEntity;entityDropItem(Lnet/minecraft/util/IItemProvider;I)Lnet/minecraft/entity/item/ItemEntity;")) private void arclight$forceDrop(CallbackInfo ci) { forceDrops = true; } - @Inject(method = "func_213612_dV", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/entity/passive/SheepEntity;entityDropItem(Lnet/minecraft/util/IItemProvider;I)Lnet/minecraft/entity/item/ItemEntity;")) + @Inject(method = "shear", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/entity/passive/SheepEntity;entityDropItem(Lnet/minecraft/util/IItemProvider;I)Lnet/minecraft/entity/item/ItemEntity;")) private void arclight$forceDropReset(CallbackInfo ci) { forceDrops = false; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/PlayerEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/PlayerEntityMixin.java index b0836ced..c5afca22 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/PlayerEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/PlayerEntityMixin.java @@ -17,6 +17,7 @@ import net.minecraft.entity.CreatureAttribute; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.attributes.Attributes; import net.minecraft.entity.boss.dragon.EnderDragonPartEntity; import net.minecraft.entity.item.ArmorStandEntity; import net.minecraft.entity.item.ItemEntity; @@ -38,7 +39,6 @@ import net.minecraft.scoreboard.Scoreboard; import net.minecraft.stats.Stat; import net.minecraft.stats.Stats; import net.minecraft.util.DamageSource; -import net.minecraft.util.Direction; import net.minecraft.util.FoodStats; import net.minecraft.util.Hand; import net.minecraft.util.HandSide; @@ -48,6 +48,7 @@ import net.minecraft.util.SoundEvents; import net.minecraft.util.Unit; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.Difficulty; import net.minecraft.world.World; @@ -132,103 +133,6 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla ((IInventoryBridge) this.enterChestInventory).setOwner(this.getBukkitEntity()); } - private boolean arclight$forceSleep = false; - private Object arclight$processSleep = null; - - private Either getBedResult(BlockPos at, Direction direction) { - arclight$processSleep = true; - Either either = this.trySleep(at); - arclight$processSleep = null; - return either; - } - - public Either sleep(BlockPos at, boolean force) { - arclight$forceSleep = force; - try { - return this.trySleep(at); - } finally { - arclight$forceSleep = false; - } - } - - @Inject(method = "trySleep", cancellable = true, at = @At(value = "HEAD")) - public void arclight$onSleep(BlockPos at, CallbackInfoReturnable> cir) { - if (arclight$processSleep == null) { - Either result = getBedResult(at, null); - - if (result.left().orElse(null) == PlayerEntity.SleepResult.OTHER_PROBLEM) { - cir.setReturnValue(result); - return; - } - if (arclight$forceSleep) { - result = Either.right(Unit.INSTANCE); - } - if (this.bridge$getBukkitEntity() instanceof Player) { - result = CraftEventFactory.callPlayerBedEnterEvent((PlayerEntity) (Object) this, at, result); - if (result.left().isPresent()) { - cir.setReturnValue(result); - return; - } - } - - this.startSleeping(at); - this.sleepTimer = 0; - if (this.world instanceof ServerWorld) { - ((ServerWorld) this.world).updateAllPlayersSleepingFlag(); - } - cir.setReturnValue(Either.right(Unit.INSTANCE)); - } - } - - @Inject(method = "trySleep", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;startSleeping(Lnet/minecraft/util/math/BlockPos;)V")) - public void arclight$preSleep(BlockPos at, CallbackInfoReturnable> cir) { - if (arclight$processSleep != null) { - cir.setReturnValue(Either.right(Unit.INSTANCE)); - } - } - - @Inject(method = "stopSleepInBed", at = @At(value = "FIELD", target = "Lnet/minecraft/entity/player/PlayerEntity;sleepTimer:I")) - private void arclight$wakeup(boolean flag, boolean flag1, CallbackInfo ci) { - BlockPos blockPos = this.getBedPosition().orElse(null); - if (this.bridge$getBukkitEntity() instanceof Player) { - Player player = (Player) this.bridge$getBukkitEntity(); - Block bed; - if (blockPos != null) { - bed = CraftBlock.at(this.world, blockPos); - } else { - bed = ((WorldBridge) this.world).bridge$getWorld().getBlockAt(player.getLocation()); - } - PlayerBedLeaveEvent event = new PlayerBedLeaveEvent(player, bed, true); - Bukkit.getPluginManager().callEvent(event); - } - } - - @Inject(method = "setSpawnPoint", remap = false, at = @At("RETURN")) - private void arclight$updateSpawnpoint(BlockPos pos, boolean p_226560_2_, boolean p_226560_3_, DimensionType dim, CallbackInfo ci) { - bridge$setSpawnWorld(pos == null ? "" : this.world.worldInfo.getWorldName()); - } - - @Inject(method = "startFallFlying", cancellable = true, at = @At("HEAD")) - private void arclight$startGlidingEvent(CallbackInfo ci) { - if (CraftEventFactory.callToggleGlideEvent((PlayerEntity) (Object) this, true).isCancelled()) { - this.setFlag(7, true); - this.setFlag(7, false); - ci.cancel(); - } - } - - @Inject(method = "stopFallFlying", cancellable = true, at = @At("HEAD")) - private void arclight$stopGlidingEvent(CallbackInfo ci) { - if (CraftEventFactory.callToggleGlideEvent((PlayerEntity) (Object) this, false).isCancelled()) { - ci.cancel(); - } - } - - @Override - public Either bridge$trySleep(BlockPos at, boolean force) { - return sleep(at, force); - } - @Override public boolean bridge$isFauxSleeping() { return fauxSleeping; @@ -270,19 +174,6 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla } } - @Inject(method = "readAdditional", at = @At("RETURN")) - private void arclight$readSpawnWorld(CompoundNBT compound, CallbackInfo ci) { - this.spawnWorld = compound.getString("SpawnWorld"); - if ("".equals(spawnWorld)) { - this.spawnWorld = Bukkit.getWorlds().get(0).getName(); - } - } - - @Inject(method = "writeAdditional", at = @At("RETURN")) - private void arclight$writeSpawnWorld(CompoundNBT compound, CallbackInfo ci) { - compound.putString("SpawnWorld", this.spawnWorld); - } - /** * @author IzzelAliz * @reason @@ -365,7 +256,7 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla public void attackTargetEntityWithCurrentItem(final Entity entity) { if (!net.minecraftforge.common.ForgeHooks.onPlayerAttackTarget((PlayerEntity) (Object) this, entity)) return; if (entity.canBeAttackedWithItem() && !entity.hitByEntity((PlayerEntity) (Object) this)) { - float f = (float) this.getAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).getValue(); + float f = (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); float f2; if (entity instanceof LivingEntity) { f2 = EnchantmentHelper.getModifierForCreature(this.getHeldItemMainhand(), ((LivingEntity) entity).getCreatureAttribute()); @@ -382,7 +273,7 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla final byte b0 = 0; int i = b0 + EnchantmentHelper.getKnockbackModifier((PlayerEntity) (Object) this); if (this.isSprinting() && flag) { - this.world.playSound(null, this.posX, this.posY, this.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_KNOCKBACK, this.getSoundCategory(), 1.0f, 1.0f); + this.world.playSound(null, this.getPosX(), this.getPosY(), this.getPosZ(), SoundEvents.ENTITY_PLAYER_ATTACK_KNOCKBACK, this.getSoundCategory(), 1.0f, 1.0f); ++i; flag2 = true; } @@ -415,12 +306,12 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla } } } - final Vec3d vec3d = entity.getMotion(); + final Vector3d vec3d = entity.getMotion(); final boolean flag6 = entity.attackEntityFrom(DamageSource.causePlayerDamage((PlayerEntity) (Object) this), f); if (flag6) { if (i > 0) { if (entity instanceof LivingEntity) { - ((LivingEntity) entity).knockBack((PlayerEntity) (Object) this, i * 0.5f, MathHelper.sin(this.rotationYaw * 0.017453292f), -MathHelper.cos(this.rotationYaw * 0.017453292f)); + ((LivingEntity) entity).applyKnockback(i * 0.5f, MathHelper.sin(this.rotationYaw * 0.017453292f), -MathHelper.cos(this.rotationYaw * 0.017453292f)); } else { entity.addVelocity(-MathHelper.sin(this.rotationYaw * 0.017453292f) * i * 0.5f, 0.1, MathHelper.cos(this.rotationYaw * 0.017453292f) * i * 0.5f); } @@ -432,10 +323,10 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla final List list = this.world.getEntitiesWithinAABB(LivingEntity.class, entity.getBoundingBox().grow(1.0, 0.25, 1.0)); for (final LivingEntity entityliving : list) { if (entityliving != (Object) this && entityliving != entity && !this.isOnSameTeam(entityliving) && (!(entityliving instanceof ArmorStandEntity) || !((ArmorStandEntity) entityliving).hasMarker()) && this.getDistanceSq(entityliving) < 9.0 && entityliving.attackEntityFrom(((DamageSourceBridge) DamageSource.causePlayerDamage((PlayerEntity) (Object) this)).bridge$sweep(), f5)) { - entityliving.knockBack((PlayerEntity) (Object) this, 0.4f, MathHelper.sin(this.rotationYaw * 0.017453292f), -MathHelper.cos(this.rotationYaw * 0.017453292f)); + entityliving.applyKnockback(0.4f, MathHelper.sin(this.rotationYaw * 0.017453292f), -MathHelper.cos(this.rotationYaw * 0.017453292f)); } } - this.world.playSound(null, this.posX, this.posY, this.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_SWEEP, this.getSoundCategory(), 1.0f, 1.0f); + this.world.playSound(null, this.getPosX(), this.getPosY(), this.getPosZ(), SoundEvents.ENTITY_PLAYER_ATTACK_SWEEP, this.getSoundCategory(), 1.0f, 1.0f); this.spawnSweepParticles(); } if (entity instanceof ServerPlayerEntity && entity.velocityChanged) { @@ -456,14 +347,14 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla } } if (flag3) { - this.world.playSound(null, this.posX, this.posY, this.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_CRIT, this.getSoundCategory(), 1.0f, 1.0f); + this.world.playSound(null, this.getPosX(), this.getPosY(), this.getPosZ(), SoundEvents.ENTITY_PLAYER_ATTACK_CRIT, this.getSoundCategory(), 1.0f, 1.0f); this.onCriticalHit(entity); } if (!flag3 && !flag4) { if (flag) { - this.world.playSound(null, this.posX, this.posY, this.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_STRONG, this.getSoundCategory(), 1.0f, 1.0f); + this.world.playSound(null, this.getPosX(), this.getPosY(), this.getPosZ(), SoundEvents.ENTITY_PLAYER_ATTACK_STRONG, this.getSoundCategory(), 1.0f, 1.0f); } else { - this.world.playSound(null, this.posX, this.posY, this.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_WEAK, this.getSoundCategory(), 1.0f, 1.0f); + this.world.playSound(null, this.getPosX(), this.getPosY(), this.getPosZ(), SoundEvents.ENTITY_PLAYER_ATTACK_WEAK, this.getSoundCategory(), 1.0f, 1.0f); } } if (f2 > 0.0f) { @@ -499,12 +390,12 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla } if (this.world instanceof ServerWorld && f6 > 2.0f) { final int k = (int) (f6 * 0.5); - ((ServerWorld) this.world).spawnParticle(ParticleTypes.DAMAGE_INDICATOR, entity.posX, entity.posY + entity.getHeight() * 0.5f, entity.posZ, k, 0.1, 0.0, 0.1, 0.2); + ((ServerWorld) this.world).spawnParticle(ParticleTypes.DAMAGE_INDICATOR, entity.getPosX(), entity.getPosY() + entity.getHeight() * 0.5f, entity.getPosZ(), k, 0.1, 0.0, 0.1, 0.2); } } this.addExhaustion(0.1f); } else { - this.world.playSound(null, this.posX, this.posY, this.posZ, SoundEvents.ENTITY_PLAYER_ATTACK_NODAMAGE, this.getSoundCategory(), 1.0f, 1.0f); + this.world.playSound(null, this.getPosX(), this.getPosY(), this.getPosZ(), SoundEvents.ENTITY_PLAYER_ATTACK_NODAMAGE, this.getSoundCategory(), 1.0f, 1.0f); if (flag5) { entity.extinguish(); } @@ -516,9 +407,32 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla } } + protected transient boolean arclight$forceSleep; + + public Either sleep(BlockPos at, boolean force) { + this.arclight$forceSleep = force; + return this.trySleep(at); + } + @Override - public void bridge$setSpawnWorld(String world) { - this.spawnWorld = world; + public Either bridge$trySleep(BlockPos at, boolean force) { + return sleep(at, force); + } + + @Inject(method = "stopSleepInBed", at = @At(value = "FIELD", target = "Lnet/minecraft/entity/player/PlayerEntity;sleepTimer:I")) + private void arclight$wakeup(boolean flag, boolean flag1, CallbackInfo ci) { + BlockPos blockPos = this.getBedPosition().orElse(null); + if (this.bridge$getBukkitEntity() instanceof Player) { + Player player = (Player) this.bridge$getBukkitEntity(); + Block bed; + if (blockPos != null) { + bed = CraftBlock.at(this.world, blockPos); + } else { + bed = ((WorldBridge) this.world).bridge$getWorld().getBlockAt(player.getLocation()); + } + PlayerBedLeaveEvent event = new PlayerBedLeaveEvent(player, bed, true); + Bukkit.getPluginManager().callEvent(event); + } } @Redirect(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;setFlag(IZ)V")) @@ -528,6 +442,22 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla } } + @Inject(method = "startFallFlying", cancellable = true, at = @At("HEAD")) + private void arclight$startGlidingEvent(CallbackInfo ci) { + if (CraftEventFactory.callToggleGlideEvent((PlayerEntity) (Object) this, true).isCancelled()) { + this.setFlag(7, true); + this.setFlag(7, false); + ci.cancel(); + } + } + + @Inject(method = "stopFallFlying", cancellable = true, at = @At("HEAD")) + private void arclight$stopGlidingEvent(CallbackInfo ci) { + if (CraftEventFactory.callToggleGlideEvent((PlayerEntity) (Object) this, false).isCancelled()) { + ci.cancel(); + } + } + /** * @author IzzelAliz * @reason @@ -549,7 +479,7 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla if (entity instanceof TameableEntity) { ((TameableEntity) entity).setOwnerId(this.entityUniqueID); } - entity.setPosition(this.posX, this.posY + 0.699999988079071, this.posZ); + entity.setPosition(this.getPosX(), this.getPosY() + 0.699999988079071, this.getPosZ()); return ((ServerWorldBridge) this.world).bridge$addEntitySerialized(entity, CreatureSpawnEvent.SpawnReason.SHOULDER_ENTITY); }).orElse(true); } @@ -562,9 +492,4 @@ public abstract class PlayerEntityMixin extends LivingEntityMixin implements Pla public CraftHumanEntity bridge$getBukkitEntity() { return (CraftHumanEntity) ((InternalEntityBridge) this).internal$getBukkitEntity(); } - - @Override - public String bridge$getSpawnWorld() { - return spawnWorld; - } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java index 7fe609af..12ad1eff 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/player/ServerPlayerEntityMixin.java @@ -2,6 +2,7 @@ package io.izzel.arclight.common.mixin.core.entity.player; import com.google.common.collect.Lists; import com.mojang.datafixers.util.Either; +import io.izzel.arclight.common.bridge.block.PortalInfoBridge; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.entity.InternalEntityBridge; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; @@ -10,26 +11,23 @@ import io.izzel.arclight.common.bridge.network.play.ServerPlayNetHandlerBridge; import io.izzel.arclight.common.bridge.util.FoodStatsBridge; import io.izzel.arclight.common.bridge.world.TeleporterBridge; import io.izzel.arclight.common.bridge.world.WorldBridge; -import io.izzel.arclight.common.bridge.world.dimension.DimensionTypeBridge; -import io.izzel.arclight.common.bridge.world.server.ServerWorldBridge; import io.izzel.arclight.common.mod.util.ArclightCaptures; import io.izzel.arclight.common.mod.util.ChestBlockDoubleInventoryHacks; -import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.block.Blocks; -import net.minecraft.block.pattern.BlockPattern; +import net.minecraft.block.NetherPortalBlock; +import net.minecraft.block.PortalInfo; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.monster.MonsterEntity; import net.minecraft.entity.passive.horse.AbstractHorseEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.SpawnLocationHelper; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.HorseInventoryContainer; import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.RecipeBook; -import net.minecraft.item.crafting.ServerRecipeBook; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.play.ServerPlayNetHandler; import net.minecraft.network.play.client.CClientSettingsPacket; @@ -55,41 +53,48 @@ import net.minecraft.stats.Stat; import net.minecraft.stats.Stats; import net.minecraft.util.CombatTracker; import net.minecraft.util.DamageSource; +import net.minecraft.util.Direction; import net.minecraft.util.FoodStats; import net.minecraft.util.HandSide; import net.minecraft.util.NonNullList; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.TeleportationRepositioner; import net.minecraft.util.Unit; +import net.minecraft.util.Util; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.text.ChatType; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.event.HoverEvent; +import net.minecraft.world.DimensionType; import net.minecraft.world.GameRules; import net.minecraft.world.GameType; import net.minecraft.world.Teleporter; import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.biome.BiomeManager; import net.minecraft.world.server.ServerWorld; -import net.minecraft.world.storage.WorldInfo; +import net.minecraft.world.storage.IWorldInfo; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.util.ITeleporter; import net.minecraftforge.fml.hooks.BasicEventHooks; -import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.server.ServerLifecycleHooks; +import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.WeatherType; -import org.bukkit.block.BlockState; import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.CraftWorld; import org.bukkit.craftbukkit.v.entity.CraftPlayer; import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.craftbukkit.v.event.CraftPortalEvent; import org.bukkit.craftbukkit.v.inventory.CraftItemStack; import org.bukkit.craftbukkit.v.scoreboard.CraftScoreboardManager; -import org.bukkit.craftbukkit.v.util.BlockStateListPopulator; import org.bukkit.craftbukkit.v.util.CraftChatMessage; import org.bukkit.event.entity.EntityPotionEffectEvent; import org.bukkit.event.entity.PlayerDeathEvent; @@ -100,7 +105,6 @@ import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.bukkit.event.player.PlayerLocaleChangeEvent; import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.world.PortalCreateEvent; import org.bukkit.inventory.MainHand; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -120,6 +124,7 @@ import java.util.List; import java.util.Optional; import java.util.OptionalInt; import java.util.Random; +import java.util.UUID; import java.util.function.Consumer; @Mixin(ServerPlayerEntity.class) @@ -138,17 +143,27 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen @Shadow public abstract ServerWorld getServerWorld(); @Shadow public boolean queuedEndExit; @Shadow private boolean seenCredits; - @Shadow @Nullable private Vec3d enteredNetherPosition; + @Shadow @Nullable private Vector3d enteredNetherPosition; @Shadow public abstract void func_213846_b(ServerWorld p_213846_1_); @Shadow public int lastExperience; @Shadow private float lastHealth; @Shadow private int lastFoodLevel; @Shadow public int currentWindowId; @Shadow public abstract void getNextWindowId(); - @Shadow public abstract void sendMessage(ITextComponent component); - @Shadow public String language; + @Shadow private String language; @Shadow public abstract void teleport(ServerWorld p_200619_1_, double x, double y, double z, float yaw, float pitch); @Shadow public abstract void giveExperiencePoints(int p_195068_1_); + @Shadow private RegistryKey field_241137_cq_; + @Shadow @Nullable public abstract BlockPos func_241140_K_(); + @Shadow public abstract float func_242109_L(); + @Shadow protected abstract void func_241157_eT_(); + @Shadow protected abstract void func_242110_a(ServerWorld p_242110_1_, BlockPos p_242110_2_); + @Shadow @Final private static Logger LOGGER; + @Shadow public abstract boolean isCreative(); + @Shadow public abstract void func_242111_a(RegistryKey p_242111_1_, @org.jetbrains.annotations.Nullable BlockPos p_242111_2_, float p_242111_3_, boolean p_242111_4_, boolean p_242111_5_); + @Shadow protected abstract boolean func_241156_b_(BlockPos p_241156_1_, Direction p_241156_2_); + @Shadow protected abstract boolean func_241147_a_(BlockPos p_241147_1_, Direction p_241147_2_); + @Shadow public abstract void sendMessage(ITextComponent component, UUID senderUUID); // @formatter:on public String displayName; @@ -167,6 +182,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen public WeatherType weather = null; private float pluginRainPosition; private float pluginRainPositionPrevious; + public String locale = "en_us"; @Inject(method = "", at = @At("RETURN")) public void arclight$init(CallbackInfo ci) { @@ -175,254 +191,11 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen this.maxHealthCache = this.getMaxHealth(); } - /** - * @author IzzelAliz - * @reason - */ - @Overwrite(remap = false) - @Nullable - public Entity changeDimension(DimensionType dim, ITeleporter teleporter) { - DimensionType[] destination = {dim}; - if (this.isSleeping()) return (ServerPlayerEntity) (Object) this; - - if (!ForgeHooks.onTravelToDimension((ServerPlayerEntity) (Object) this, destination[0])) return null; - - PlayerTeleportEvent.TeleportCause cause = bridge$getTeleportCause().orElse(PlayerTeleportEvent.TeleportCause.UNKNOWN); - // this.invulnerableDimensionChange = true; - DimensionType dimensiontype = this.dimension; - if (((DimensionTypeBridge) dimensiontype).bridge$getType() == DimensionType.THE_END && ((DimensionTypeBridge) destination[0]).bridge$getType() == DimensionType.OVERWORLD && teleporter instanceof Teleporter) { //Forge: Fix non-vanilla teleporters triggering end credits - this.invulnerableDimensionChange = true; - this.detach(); - this.getServerWorld().removePlayer((ServerPlayerEntity) (Object) this, true); //Forge: The player entity is cloned so keep the data until after cloning calls copyFrom - if (!this.queuedEndExit) { - this.queuedEndExit = true; - this.connection.sendPacket(new SChangeGameStatePacket(4, this.seenCredits ? 0.0F : 1.0F)); - this.seenCredits = true; - } - - return (ServerPlayerEntity) (Object) this; - } else { - ServerWorld serverworld = this.server.getWorld(dimensiontype); - // this.dimension = destination; - ServerWorld[] serverworld1 = {this.server.getWorld(destination[0])}; - - /* - WorldInfo worldinfo = serverworld1.getWorldInfo(); - NetworkHooks.sendDimensionDataPacket(this.connection.netManager, (ServerPlayerEntity) (Object) this); - this.connection.sendPacket(new SRespawnPacket(destination, WorldInfo.byHashing(worldinfo.getSeed()), worldinfo.getGenerator(), this.interactionManager.getGameType())); - this.connection.sendPacket(new SServerDifficultyPacket(worldinfo.getDifficulty(), worldinfo.isDifficultyLocked())); - PlayerList playerlist = this.server.getPlayerList(); - playerlist.updatePermissionLevel((ServerPlayerEntity) (Object) this); - serverworld.removeEntity((ServerPlayerEntity) (Object) this, true); //Forge: the player entity is moved to the new world, NOT cloned. So keep the data alive with no matching invalidate call. - this.revive(); - */ - PlayerList[] playerlist = new PlayerList[1]; - - Entity e = teleporter.placeEntity((ServerPlayerEntity) (Object) this, serverworld, serverworld1[0], this.rotationYaw, spawnPortal -> {//Forge: Start vanilla logic - double d0 = this.getPosX(); - double d1 = this.getPosY(); - double d2 = this.getPosZ(); - float f = this.rotationPitch; - float f1 = this.rotationYaw; - double d3 = 8.0D; - float f2 = f1; - serverworld.getProfiler().startSection("moving"); - - if (serverworld1[0] != null) { - double moveFactor = serverworld.getDimension().getMovementFactor() / serverworld1[0].getDimension().getMovementFactor(); - d0 *= moveFactor; - d2 *= moveFactor; - if (dimensiontype == DimensionType.OVERWORLD && destination[0] == DimensionType.THE_NETHER) { - this.enteredNetherPosition = this.getPositionVec(); - } else if (dimensiontype == DimensionType.OVERWORLD && destination[0] == DimensionType.THE_END) { - BlockPos blockpos = serverworld1[0].getSpawnCoordinate(); - d0 = blockpos.getX(); - d1 = blockpos.getY(); - d2 = blockpos.getZ(); - f1 = 90.0F; - f = 0.0F; - } - } - - Location enter = this.bridge$getBukkitEntity().getLocation(); - Location exit = (serverworld1[0] == null) ? null : new Location(((ServerWorldBridge) serverworld1[0]).bridge$getWorld(), d0, d1, d2, f1, f); - PlayerPortalEvent event = new PlayerPortalEvent(this.bridge$getBukkitEntity(), enter, exit, cause, 128, true, ((DimensionTypeBridge) destination[0]).bridge$getType() == DimensionType.THE_END ? 0 : 16); - Bukkit.getServer().getPluginManager().callEvent(event); - if (event.isCancelled() || event.getTo() == null) { - return null; - } - - exit = event.getTo(); - if (exit == null) { - return null; - } - serverworld1[0] = ((CraftWorld) exit.getWorld()).getHandle(); - d0 = exit.getX(); - d1 = exit.getY(); - d2 = exit.getZ(); - - // this.setLocationAndAngles(d0, d1, d2, f1, f); - serverworld.getProfiler().endSection(); - serverworld.getProfiler().startSection("placing"); - double d7 = Math.max(-2.9999872E7D, serverworld1[0].getWorldBorder().minX() + 16.0D); - double d4 = Math.max(-2.9999872E7D, serverworld1[0].getWorldBorder().minZ() + 16.0D); - double d5 = Math.min(2.9999872E7D, serverworld1[0].getWorldBorder().maxX() - 16.0D); - double d6 = Math.min(2.9999872E7D, serverworld1[0].getWorldBorder().maxZ() - 16.0D); - d0 = MathHelper.clamp(d0, d7, d5); - d2 = MathHelper.clamp(d2, d4, d6); - // this.setLocationAndAngles(d0, d1, d2, f1, f); - - Vec3d exitVelocity = Vec3d.ZERO; - BlockPos exitPosition = new BlockPos(d0, d1, d2); - - if (((DimensionTypeBridge) destination[0]).bridge$getType() == DimensionType.THE_END) { - int i = exitPosition.getX(); - int j = exitPosition.getY() - 1; - int k = exitPosition.getZ(); - - if (event.getCanCreatePortal()) { - - BlockStateListPopulator blockList = new BlockStateListPopulator(serverworld1[0]); - - for (int j1 = -2; j1 <= 2; ++j1) { - for (int k1 = -2; k1 <= 2; ++k1) { - for (int l1 = -1; l1 < 3; ++l1) { - int i2 = i + k1 * 1 + j1 * 0; - int j2 = j + l1; - int k2 = k + k1 * 0 - j1 * 1; - boolean flag = l1 < 0; - blockList.setBlockState(new BlockPos(i2, j2, k2), flag ? Blocks.OBSIDIAN.getDefaultState() : Blocks.AIR.getDefaultState(), 3); - } - } - } - - org.bukkit.World bworld = ((ServerWorldBridge) serverworld1[0]).bridge$getWorld(); - PortalCreateEvent portalEvent = new PortalCreateEvent((List) (List) blockList.getList(), bworld, this.bridge$getBukkitEntity(), PortalCreateEvent.CreateReason.END_PLATFORM); - - Bukkit.getPluginManager().callEvent(portalEvent); - if (!portalEvent.isCancelled()) { - blockList.updateList(); - } - } - - // this.setLocationAndAngles(i, j, k, f1, 0.0F); - exit.setX(i); - exit.setY(j); - exit.setZ(k); - // this.setMotion(Vec3d.ZERO); - exitVelocity = Vec3d.ZERO; - } else { - BlockPattern.PortalInfo portalInfo = ((TeleporterBridge) serverworld1[0].getDefaultTeleporter()).bridge$placeInPortal((ServerPlayerEntity) (Object) this, exitPosition, f2, event.getSearchRadius(), true); - if (spawnPortal && portalInfo == null && event.getCanCreatePortal()) { - if (((TeleporterBridge) serverworld1[0].getDefaultTeleporter()).bridge$makePortal((ServerPlayerEntity) (Object) this, exitPosition, event.getCreationRadius())) { - // serverworld1.getDefaultTeleporter().placeInPortal((ServerPlayerEntity) (Object) this, f2); - portalInfo = ((TeleporterBridge) serverworld1[0].getDefaultTeleporter()).bridge$placeInPortal((ServerPlayerEntity) (Object) this, exitPosition, f2, event.getSearchRadius(), true); - } - } - if (portalInfo == null) { - return null; - } - - exitVelocity = portalInfo.motion; - exit.setX(portalInfo.pos.getX()); - exit.setY(portalInfo.pos.getY()); - exit.setZ(portalInfo.pos.getZ()); - exit.setYaw(f2 + (float) portalInfo.rotation); - } - - serverworld.getProfiler().endSection(); - - PlayerTeleportEvent tpEvent = new PlayerTeleportEvent(this.bridge$getBukkitEntity(), enter, exit, cause); - Bukkit.getServer().getPluginManager().callEvent(tpEvent); - if (tpEvent.isCancelled() || tpEvent.getTo() == null) { - return null; - } - exit = tpEvent.getTo(); - if (exit == null) { - return null; - } - serverworld1[0] = ((CraftWorld) exit.getWorld()).getHandle(); - this.invulnerableDimensionChange = true; - - destination[0] = serverworld1[0].getDimension().getType(); - this.dimension = destination[0]; - - WorldInfo worldinfo = serverworld1[0].getWorldInfo(); - NetworkHooks.sendDimensionDataPacket(this.connection.netManager, (ServerPlayerEntity) (Object) this); - this.connection.sendPacket(new SRespawnPacket(destination[0], WorldInfo.byHashing(worldinfo.getSeed()), worldinfo.getGenerator(), this.interactionManager.getGameType())); - this.connection.sendPacket(new SServerDifficultyPacket(worldinfo.getDifficulty(), worldinfo.isDifficultyLocked())); - - playerlist[0] = this.server.getPlayerList(); - playerlist[0].updatePermissionLevel((ServerPlayerEntity) (Object) this); - - serverworld.removeEntity((ServerPlayerEntity) (Object) this, true); //Forge: the player entity is moved to the new world, NOT cloned. So keep the data alive with no matching invalidate call. - this.revive(); - - this.setMotion(exitVelocity); - - this.setWorld(serverworld1[0]); - serverworld1[0].addDuringPortalTeleport((ServerPlayerEntity) (Object) this); - this.func_213846_b(serverworld); - - // this.connection.setPlayerLocation(this.getPosX(), this.getPosY(), this.getPosZ(), f1, f); - ((ServerPlayNetHandlerBridge) this.connection).bridge$teleport(exit); - this.connection.captureCurrentPosition(); - - return (ServerPlayerEntity) (Object) this;//forge: this is part of the ITeleporter patch - });//Forge: End vanilla logic - if (e == null) { - return (ServerPlayerEntity) (Object) this; - } else if (e != (Object) this) { - throw new IllegalArgumentException(String.format("Teleporter %s returned not the player entity but instead %s, expected PlayerEntity %s", teleporter, e, this)); - } - this.interactionManager.setWorld(serverworld1[0]); - this.connection.sendPacket(new SPlayerAbilitiesPacket(this.abilities)); - playerlist[0].sendWorldInfo((ServerPlayerEntity) (Object) this, serverworld1[0]); - playerlist[0].sendInventory((ServerPlayerEntity) (Object) this); - - for (EffectInstance effectinstance : this.getActivePotionEffects()) { - this.connection.sendPacket(new SPlayEntityEffectPacket(this.getEntityId(), effectinstance)); - } - - this.connection.sendPacket(new SPlaySoundEventPacket(1032, BlockPos.ZERO, 0, false)); - this.lastExperience = -1; - this.lastHealth = -1.0F; - this.lastFoodLevel = -1; - BasicEventHooks.firePlayerChangedDimensionEvent((ServerPlayerEntity) (Object) this, dimensiontype, destination[0]); - - PlayerChangedWorldEvent changeEvent = new PlayerChangedWorldEvent(this.bridge$getBukkitEntity(), ((WorldBridge) serverworld).bridge$getWorld()); - Bukkit.getPluginManager().callEvent(changeEvent); - return (ServerPlayerEntity) (Object) this; - } - } - - public Entity a(DimensionType dimensionmanager, final PlayerTeleportEvent.TeleportCause cause) { - bridge$pushChangeDimensionCause(cause); - return this.changeDimension(dimensionmanager); - } - - @Override - public Either sleep(BlockPos at, boolean force) { - return super.sleep(at, force).ifRight((p_213849_1_) -> { - this.addStat(Stats.SLEEP_IN_BED); - CriteriaTriggers.SLEPT_IN_BED.trigger((ServerPlayerEntity) (Object) this); - }); - } - - @Inject(method = "stopSleepInBed", cancellable = true, at = @At("HEAD")) - private void arclight$notWake(boolean flag, boolean flag1, CallbackInfo ci) { - if (!isSleeping()) ci.cancel(); - } - - // todo - @Override - public Entity bridge$changeDimension(DimensionType dimensionType, PlayerTeleportEvent.TeleportCause cause) { - return a(dimensionType, cause); - } - - public BlockPos getSpawnPoint(ServerWorld worldserver) { + public final BlockPos getSpawnPoint(ServerWorld worldserver) { BlockPos blockposition = worldserver.getSpawnPoint(); - if (worldserver.dimension.hasSkyLight() && worldserver.getWorldInfo().getGameType() != GameType.ADVENTURE) { + if (worldserver.func_230315_m_().hasSkyLight() && worldserver.field_241103_E_.getGameType() != GameType.ADVENTURE) { + long k; + long l; int i = Math.max(0, this.server.getSpawnRadius(worldserver)); int j = MathHelper.floor(worldserver.getWorldBorder().getClosestDistance(blockposition.getX(), blockposition.getZ())); if (j < i) { @@ -431,17 +204,16 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen if (j <= 1) { i = 1; } - int k = (i * 2 + 1) * (i * 2 + 1); - int l = this.func_205735_q(k); - int i2 = new Random().nextInt(k); - for (int j2 = 0; j2 < k; ++j2) { - int k2 = (i2 + l * j2) % k; - int l2 = k2 % (i * 2 + 1); - int i3 = k2 / (i * 2 + 1); - BlockPos blockposition2 = worldserver.getDimension().findSpawn(blockposition.getX() + l2 - i, blockposition.getZ() + i3 - i, false); - if (blockposition2 != null) { - return blockposition2; - } + int i1 = (l = (k = (long) (i * 2 + 1)) * k) > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) l; + int j1 = this.func_205735_q(i1); + int k1 = new Random().nextInt(i1); + for (int l1 = 0; l1 < i1; ++l1) { + int i2 = (k1 + j1 * l1) % i1; + int j2 = i2 % (i * 2 + 1); + int k2 = i2 / (i * 2 + 1); + BlockPos blockposition1 = SpawnLocationHelper.func_241092_a_(worldserver, blockposition.getX() + j2 - i, blockposition.getZ() + k2 - i, false); + if (blockposition1 == null) continue; + return blockposition1; } } return blockposition; @@ -455,6 +227,11 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen @Inject(method = "readAdditional", at = @At("RETURN")) private void arclight$readExtra(CompoundNBT compound, CallbackInfo ci) { this.getBukkitEntity().readExtraData(compound); + String spawnWorld = compound.getString("SpawnWorld"); + CraftWorld oldWorld = (CraftWorld) Bukkit.getWorld(spawnWorld); + if (oldWorld != null) { + this.field_241137_cq_ = oldWorld.getHandle().getDimensionKey(); + } } @Redirect(method = "writeAdditional", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isOnePlayerRiding()Z")) @@ -483,22 +260,17 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen super.setWorld(world); if (world == null) { this.removed = false; - Vec3d position = null; - if (this.spawnWorld != null && !this.spawnWorld.equals("")) { - CraftWorld cworld = (CraftWorld) Bukkit.getServer().getWorld(this.spawnWorld); - if (cworld != null && this.getBedLocation() != null) { - world = cworld.getHandle(); - position = PlayerEntity.checkBedValidRespawnPosition(cworld.getHandle(), this.getBedLocation(), false).orElse(null); - } + Vector3d position = null; + if (this.field_241137_cq_ != null && (world = ServerLifecycleHooks.getCurrentServer().getWorld(this.field_241137_cq_)) != null && this.func_241140_K_() != null) { + position = PlayerEntity.func_242374_a((ServerWorld) world, this.func_241140_K_(), this.func_242109_L(), false, false).orElse(null); } if (world == null || position == null) { world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); - position = new Vec3d(world.getSpawnPoint()); + position = Vector3d.copyCentered(((ServerWorld) world).getSpawnPoint()); } this.world = world; this.setPosition(position.getX(), position.getY(), position.getZ()); } - this.dimension = this.world.getDimension().getType(); this.interactionManager.setWorld((ServerWorld) world); } @@ -563,9 +335,9 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen if (!p_212356_2_.isSuccess()) { int i = 256; String s = itextcomponent.getStringTruncated(256); - ITextComponent itextcomponent1 = new TranslationTextComponent("death.attack.message_too_long", (new StringTextComponent(s)).applyTextStyle(TextFormatting.YELLOW)); - ITextComponent itextcomponent2 = (new TranslationTextComponent("death.attack.even_more_magic", this.getDisplayName())).applyTextStyle((p_212357_1_) -> { - p_212357_1_.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, itextcomponent1)); + ITextComponent itextcomponent1 = new TranslationTextComponent("death.attack.message_too_long", (new StringTextComponent(s)).mergeStyle(TextFormatting.YELLOW)); + ITextComponent itextcomponent2 = (new TranslationTextComponent("death.attack.even_more_magic", this.getDisplayName())).modifyStyle((p_212357_1_) -> { + return p_212357_1_.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, itextcomponent1)); }); this.connection.sendPacket(new SCombatPacket(this.getCombatTracker(), SCombatPacket.Event.ENTITY_DIED, itextcomponent2)); } @@ -579,13 +351,17 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen this.server.getPlayerList().sendMessageToTeamOrAllPlayers((ServerPlayerEntity) (Object) this, itextcomponent); } } else { - this.server.getPlayerList().sendMessage(itextcomponent); + this.server.getPlayerList().func_232641_a_(itextcomponent, ChatType.SYSTEM, Util.DUMMY_UUID); } } else { this.connection.sendPacket(new SCombatPacket(this.getCombatTracker(), SCombatPacket.Event.ENTITY_DIED)); } this.spawnShoulderEntities(); + if (this.world.getGameRules().getBoolean(GameRules.FORGIVE_DEAD_PLAYERS)) { + this.func_241157_eT_(); + } + this.dropExperience(); if (!event.getKeepInventory()) { @@ -625,6 +401,232 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen cir.setReturnValue(((WorldBridge) this.world).bridge$isPvpMode()); } + /** + * @author IzzelAliz + * @reason + */ + @Nullable + @Overwrite + protected PortalInfo func_241829_a(ServerWorld p_241829_1_) { + PortalInfo portalinfo = super.func_241829_a(p_241829_1_); + if (portalinfo != null && ((WorldBridge) this.world).bridge$getTypeKey() == DimensionType.OVERWORLD && ((WorldBridge) p_241829_1_).bridge$getTypeKey() == DimensionType.THE_END) { + Vector3d vector3d = portalinfo.pos.add(0.0D, -1.0D, 0.0D); + PortalInfo newInfo = new PortalInfo(vector3d, Vector3d.ZERO, 90.0F, 0.0F); + ((PortalInfoBridge) newInfo).bridge$setWorld(p_241829_1_); + ((PortalInfoBridge) newInfo).bridge$setPortalEventInfo(((PortalInfoBridge) portalinfo).bridge$getPortalEventInfo()); + return newInfo; + } else { + return portalinfo; + } + } + + @Override + public Entity bridge$changeDimension(ServerWorld world, PlayerTeleportEvent.TeleportCause cause) { + this.arclight$cause = cause; + return changeDimension(world); + } + + private transient PlayerTeleportEvent.TeleportCause arclight$cause; + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + @Nullable + public Entity changeDimension(ServerWorld server, ITeleporter teleporter) { + if (this.isSleeping()) { + return (ServerPlayerEntity) (Object) this; + } + if (!ForgeHooks.onTravelToDimension((ServerPlayerEntity) (Object) this, server.getDimensionKey())) return null; + + PlayerTeleportEvent.TeleportCause cause = arclight$cause == null ? PlayerTeleportEvent.TeleportCause.UNKNOWN : arclight$cause; + arclight$cause = null; + + // this.invulnerableDimensionChange = true; + ServerWorld serverworld = this.getServerWorld(); + RegistryKey registrykey = ((WorldBridge) serverworld).bridge$getTypeKey(); + if (registrykey == DimensionType.THE_END && ((WorldBridge) server).bridge$getTypeKey() == DimensionType.OVERWORLD && teleporter instanceof Teleporter) { //Forge: Fix non-vanilla teleporters triggering end credits + this.detach(); + this.getServerWorld().removePlayer((ServerPlayerEntity) (Object) this, true); //Forge: The player entity is cloned so keep the data until after cloning calls copyFrom + if (!this.queuedEndExit) { + this.queuedEndExit = true; + this.connection.sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.field_241768_e_, this.seenCredits ? 0.0F : 1.0F)); + this.seenCredits = true; + } + + return (ServerPlayerEntity) (Object) this; + } else { + PlayerList playerlist = this.server.getPlayerList(); + /* + IWorldInfo iworldinfo = server.getWorldInfo(); + this.connection.sendPacket(new SRespawnPacket(server.func_230315_m_(), server.getDimensionKey(), BiomeManager.func_235200_a_(server.getSeed()), this.interactionManager.getGameType(), this.interactionManager.func_241815_c_(), server.isDebug(), server.func_241109_A_(), true)); + this.connection.sendPacket(new SServerDifficultyPacket(iworldinfo.getDifficulty(), iworldinfo.isDifficultyLocked())); + PlayerList playerlist = this.server.getPlayerList(); + playerlist.updatePermissionLevel((ServerPlayerEntity) (Object) this); + serverworld.removeEntity((ServerPlayerEntity) (Object) this, true); //Forge: the player entity is moved to the new world, NOT cloned. So keep the data alive with no matching invalidate call. + this.revive(); + */ + PortalInfo portalinfo = this.func_241829_a(server); + ServerWorld[] exitWorld = new ServerWorld[]{server}; + if (portalinfo != null) { + Entity e = teleporter.placeEntity((ServerPlayerEntity) (Object) this, serverworld, exitWorld[0], this.rotationYaw, spawnPortal -> {//Forge: Start vanilla logic + serverworld.getProfiler().startSection("moving"); + + exitWorld[0] = ((PortalInfoBridge) portalinfo).bridge$getWorld(); + if (exitWorld[0] != null) { + if (registrykey == DimensionType.OVERWORLD && ((WorldBridge) exitWorld[0]).bridge$getTypeKey() == DimensionType.THE_NETHER) { + this.enteredNetherPosition = this.getPositionVec(); + } else if (spawnPortal && ((WorldBridge) exitWorld[0]).bridge$getTypeKey() == DimensionType.THE_END && ((PortalInfoBridge) portalinfo).bridge$getPortalEventInfo().getCanCreatePortal()) { + this.func_242110_a(exitWorld[0], new BlockPos(portalinfo.pos)); + } + } + + Location enter = this.getBukkitEntity().getLocation(); + Location exit = (exitWorld[0] == null) ? null : new Location(((WorldBridge) exitWorld[0]).bridge$getWorld(), portalinfo.pos.x, portalinfo.pos.y, portalinfo.pos.z, portalinfo.field_242960_c, portalinfo.field_242961_d); + PlayerTeleportEvent tpEvent = new PlayerTeleportEvent(this.getBukkitEntity(), enter, exit, cause); + Bukkit.getServer().getPluginManager().callEvent(tpEvent); + if (tpEvent.isCancelled() || tpEvent.getTo() == null) { + return null; + } + exit = tpEvent.getTo(); + exitWorld[0] = ((CraftWorld) exit.getWorld()).getHandle(); + + serverworld.getProfiler().endSection(); + serverworld.getProfiler().startSection("placing"); + + this.invulnerableDimensionChange = true; + IWorldInfo iworldinfo = exitWorld[0].getWorldInfo(); + this.connection.sendPacket(new SRespawnPacket(exitWorld[0].func_230315_m_(), exitWorld[0].getDimensionKey(), BiomeManager.func_235200_a_(exitWorld[0].getSeed()), this.interactionManager.getGameType(), this.interactionManager.func_241815_c_(), exitWorld[0].isDebug(), exitWorld[0].func_241109_A_(), true)); + this.connection.sendPacket(new SServerDifficultyPacket(iworldinfo.getDifficulty(), iworldinfo.isDifficultyLocked())); + playerlist.updatePermissionLevel((ServerPlayerEntity) (Object) this); + serverworld.removeEntity((ServerPlayerEntity) (Object) this, true); //Forge: the player entity is moved to the new world, NOT cloned. So keep the data alive with no matching invalidate call. + this.revive(); + + this.setWorld(exitWorld[0]); + exitWorld[0].addDuringPortalTeleport((ServerPlayerEntity) (Object) this); + + ((ServerPlayNetHandlerBridge) this.connection).bridge$teleport(exit); + this.connection.captureCurrentPosition(); + + serverworld.getProfiler().endSection(); + this.func_213846_b(exitWorld[0]); + return (ServerPlayerEntity) (Object) this;//forge: this is part of the ITeleporter patch + });//Forge: End vanilla logic + if (e == null) { + return null; + } else if (e != (Object) this) { + throw new IllegalArgumentException(String.format("Teleporter %s returned not the player entity but instead %s, expected PlayerEntity %s", teleporter, e, this)); + } + + this.interactionManager.setWorld(exitWorld[0]); + this.connection.sendPacket(new SPlayerAbilitiesPacket(this.abilities)); + playerlist.sendWorldInfo((ServerPlayerEntity) (Object) this, exitWorld[0]); + playerlist.sendInventory((ServerPlayerEntity) (Object) this); + + for (EffectInstance effectinstance : this.getActivePotionEffects()) { + this.connection.sendPacket(new SPlayEntityEffectPacket(this.getEntityId(), effectinstance)); + } + + this.connection.sendPacket(new SPlaySoundEventPacket(1032, BlockPos.ZERO, 0, false)); + this.lastExperience = -1; + this.lastHealth = -1.0F; + this.lastFoodLevel = -1; + BasicEventHooks.firePlayerChangedDimensionEvent((ServerPlayerEntity) (Object) this, serverworld.getDimensionKey(), exitWorld[0].getDimensionKey()); + PlayerChangedWorldEvent changeEvent = new PlayerChangedWorldEvent(this.getBukkitEntity(), ((WorldBridge) serverworld).bridge$getWorld()); + Bukkit.getPluginManager().callEvent(changeEvent); + } else { + return null; + } + + return (ServerPlayerEntity) (Object) this; + } + } + + @Override + protected CraftPortalEvent callPortalEvent(Entity entity, ServerWorld exitWorldServer, BlockPos exitPosition, PlayerTeleportEvent.TeleportCause cause, int searchRadius, int creationRadius) { + Location enter = this.getBukkitEntity().getLocation(); + Location exit = new Location(((WorldBridge) exitWorldServer).bridge$getWorld(), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ(), this.rotationYaw, this.rotationPitch); + PlayerPortalEvent event = new PlayerPortalEvent(this.getBukkitEntity(), enter, exit, cause, 128, true, creationRadius); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null) { + return null; + } + return new CraftPortalEvent(event); + } + + @Override + protected Optional findOrCreatePortal(ServerWorld worldserver, BlockPos blockposition, boolean flag, int searchRadius, boolean canCreatePortal, int createRadius) { + Optional optional = super.a(worldserver, blockposition, flag, searchRadius, canCreatePortal, createRadius); + if (optional.isPresent() || !canCreatePortal) { + return optional; + } + Direction.Axis enumdirection_enumaxis = this.world.getBlockState(this.field_242271_ac).func_235903_d_(NetherPortalBlock.AXIS).orElse(Direction.Axis.X); + Optional optional1 = ((TeleporterBridge) worldserver.getDefaultTeleporter()).bridge$createPortal(blockposition, enumdirection_enumaxis, (ServerPlayerEntity) (Object) this, createRadius); + if (!optional1.isPresent()) { + LOGGER.error("Unable to create a portal, likely target out of worldborder"); + } + return optional1; + } + + private Either getBedResult(BlockPos blockposition, Direction enumdirection) { + if (!this.isSleeping() && this.isAlive()) { + if (!this.world.func_230315_m_().func_236043_f_()) { + return Either.left(PlayerEntity.SleepResult.NOT_POSSIBLE_HERE); + } + if (!this.func_241147_a_(blockposition, enumdirection)) { + return Either.left(PlayerEntity.SleepResult.TOO_FAR_AWAY); + } + if (this.func_241156_b_(blockposition, enumdirection)) { + return Either.left(PlayerEntity.SleepResult.OBSTRUCTED); + } + this.func_242111_a(this.world.getDimensionKey(), blockposition, this.rotationYaw, false, true); + if (this.world.isDaytime()) { + return Either.left(PlayerEntity.SleepResult.NOT_POSSIBLE_NOW); + } + if (!this.isCreative()) { + double d0 = 8.0; + double d1 = 5.0; + Vector3d vec3d = Vector3d.copyCenteredHorizontally(blockposition); + List list = this.world.getEntitiesWithinAABB(MonsterEntity.class, new AxisAlignedBB(vec3d.getX() - 8.0, vec3d.getY() - 5.0, vec3d.getZ() - 8.0, vec3d.getX() + 8.0, vec3d.getY() + 5.0, vec3d.getZ() + 8.0), entitymonster -> entitymonster.func_230292_f_((ServerPlayerEntity) (Object) this)); + if (!list.isEmpty()) { + return Either.left(PlayerEntity.SleepResult.NOT_SAFE); + } + } + return Either.right(Unit.INSTANCE); + } + return Either.left(PlayerEntity.SleepResult.OTHER_PROBLEM); + } + + @Redirect(method = "trySleep", at = @At(value = "INVOKE", target = "Lcom/mojang/datafixers/util/Either;left(Ljava/lang/Object;)Lcom/mojang/datafixers/util/Either;")) + private Either arclight$failSleep(L value, BlockPos pos) { + Either either = Either.left(value); + return arclight$fireBedEvent(either, pos); + } + + @Redirect(method = "trySleep", at = @At(value = "INVOKE", target = "Lcom/mojang/datafixers/util/Either;ifRight(Ljava/util/function/Consumer;)Lcom/mojang/datafixers/util/Either;")) + private Either arclight$successSleep(Either either, Consumer consumer, BlockPos pos) { + return arclight$fireBedEvent(either, pos).ifRight(consumer); + } + + @SuppressWarnings("unchecked") + private Either arclight$fireBedEvent(Either e, BlockPos pos) { + Either either = (Either) e; + if (either.left().orElse(null) == PlayerEntity.SleepResult.OTHER_PROBLEM) { + return (Either) either; + } else { + if (arclight$forceSleep) { + either = Either.right(Unit.INSTANCE); + } + return (Either) CraftEventFactory.callPlayerBedEnterEvent((ServerPlayerEntity) (Object) this, pos, either); + } + } + + @Inject(method = "stopSleepInBed", cancellable = true, at = @At(value = "HEAD")) + private void arclight$wakeupOutBed(boolean p_225652_1_, boolean p_225652_2_, CallbackInfo ci) { + if (!this.isSleeping()) ci.cancel(); + } + public int nextContainerCounter() { this.getNextWindowId(); return this.currentWindowId; @@ -698,24 +700,20 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen this.lastExperience = -1; } - public void sendMessage(ITextComponent[] ichatbasecomponent) { - for (final ITextComponent component : ichatbasecomponent) { - this.sendMessage(component); + public void sendMessage(ITextComponent[] components) { + for (final ITextComponent component : components) { + this.sendMessage(component, Util.DUMMY_UUID); } } @Override - public void bridge$sendMessage(ITextComponent[] ichatbasecomponent) { - sendMessage(ichatbasecomponent); + public void bridge$sendMessage(ITextComponent[] components) { + sendMessage(components); } @Override public void bridge$sendMessage(ITextComponent component) { - this.sendMessage(component); - } - - @Redirect(method = "copyFrom", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/crafting/ServerRecipeBook;copyFrom(Lnet/minecraft/item/crafting/RecipeBook;)V")) - private void arclight$noRecipeBookCopy(ServerRecipeBook serverRecipeBook, RecipeBook that) { + this.sendMessage(component, Util.DUMMY_UUID); } @Inject(method = "setGameType", cancellable = true, at = @At("HEAD")) @@ -735,13 +733,14 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen @Inject(method = "handleClientSettings", at = @At("HEAD")) private void arclight$settingChange(CClientSettingsPacket packetIn, CallbackInfo ci) { if (this.getPrimaryHand() != packetIn.getMainHand()) { - final PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(this.getBukkitEntity(), (this.getPrimaryHand() == HandSide.LEFT) ? MainHand.LEFT : MainHand.RIGHT); + PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(this.getBukkitEntity(), (this.getPrimaryHand() == HandSide.LEFT) ? MainHand.LEFT : MainHand.RIGHT); Bukkit.getPluginManager().callEvent(event); } - if (!this.language.equals(packetIn.getLang())) { - final PlayerLocaleChangeEvent event2 = new PlayerLocaleChangeEvent(this.getBukkitEntity(), packetIn.getLang()); + if (!this.language.equals(packetIn.getLanguage())) { + PlayerLocaleChangeEvent event2 = new PlayerLocaleChangeEvent(this.getBukkitEntity(), packetIn.getLanguage()); Bukkit.getPluginManager().callEvent(event2); } + this.locale = packetIn.getLanguage(); this.clientViewDistance = packetIn.view; } @@ -782,8 +781,6 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen return (CraftPlayer) ((InternalEntityBridge) this).internal$getBukkitEntity(); } - private transient PlayerTeleportEvent.TeleportCause arclight$cause; - @Override public void bridge$pushChangeDimensionCause(PlayerTeleportEvent.TeleportCause cause) { arclight$cause = cause; @@ -809,7 +806,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen return this.weather; } - public void setPlayerWeather(final WeatherType type, final boolean plugin) { + public void setPlayerWeather(WeatherType type, boolean plugin) { if (!plugin && this.weather != null) { return; } @@ -817,25 +814,25 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen this.weather = type; } if (type == WeatherType.DOWNFALL) { - this.connection.sendPacket(new SChangeGameStatePacket(2, 0.0f)); + this.connection.sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.field_241766_c_, 0.0f)); } else { - this.connection.sendPacket(new SChangeGameStatePacket(1, 0.0f)); + this.connection.sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.field_241765_b_, 0.0f)); } } - public void updateWeather(final float oldRain, final float newRain, final float oldThunder, final float newThunder) { + public void updateWeather(float oldRain, float newRain, float oldThunder, float newThunder) { if (this.weather == null) { if (oldRain != newRain) { - this.connection.sendPacket(new SChangeGameStatePacket(7, newRain)); + this.connection.sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.field_241771_h_, newRain)); } } else if (this.pluginRainPositionPrevious != this.pluginRainPosition) { - this.connection.sendPacket(new SChangeGameStatePacket(7, this.pluginRainPosition)); + this.connection.sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.field_241771_h_, this.pluginRainPosition)); } if (oldThunder != newThunder) { if (this.weather == WeatherType.DOWNFALL || this.weather == null) { - this.connection.sendPacket(new SChangeGameStatePacket(8, newThunder)); + this.connection.sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.field_241772_i_, newThunder)); } else { - this.connection.sendPacket(new SChangeGameStatePacket(8, 0.0f)); + this.connection.sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.field_241772_i_, 0.0f)); } } } @@ -860,7 +857,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin implemen @Override public String toString() { - return super.toString() + "(" + this.getScoreboardName() + " at " + this.posX + "," + this.posY + "," + this.posZ + ")"; + return super.toString() + "(" + this.getScoreboardName() + " at " + this.getPosX() + "," + this.getPosY() + "," + this.getPosZ() + ")"; } public void forceSetPositionRotation(double x, double y, double z, float yaw, float pitch) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/AbstractFireballEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/AbstractFireballEntityMixin.java index 518bf79f..f425889d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/AbstractFireballEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/AbstractFireballEntityMixin.java @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(AbstractFireballEntity.class) -public class AbstractFireballEntityMixin { +public abstract class AbstractFireballEntityMixin extends DamagingProjectileEntityMixin { @Inject(method = "readAdditional", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/projectile/AbstractFireballEntity;setStack(Lnet/minecraft/item/ItemStack;)V")) private void arclight$nonNullItem(CompoundNBT compound, CallbackInfo ci, ItemStack stack) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/LlamaSpitEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/LlamaSpitEntityMixin.java deleted file mode 100644 index 6faa4fc8..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/LlamaSpitEntityMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.izzel.arclight.common.mixin.core.entity.projectile; - -import io.izzel.arclight.common.mixin.core.entity.EntityMixin; -import net.minecraft.entity.projectile.LlamaSpitEntity; -import net.minecraft.util.math.RayTraceResult; -import org.bukkit.craftbukkit.v.event.CraftEventFactory; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(LlamaSpitEntity.class) -public abstract class LlamaSpitEntityMixin extends EntityMixin { - - @Inject(method = "onHit", at = @At("HEAD")) - private void arclight$projectileHit(RayTraceResult result, CallbackInfo ci) { - CraftEventFactory.callProjectileHitEvent((LlamaSpitEntity)(Object)this, result); - } -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/PotionEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/PotionEntityMixin.java index 6ce9ed20..13126c49 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/PotionEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/PotionEntityMixin.java @@ -36,7 +36,7 @@ import java.util.List; import java.util.Map; @Mixin(PotionEntity.class) -public abstract class PotionEntityMixin extends ThrowableEntityMixin { +public abstract class PotionEntityMixin extends ProjectileItemEntityMixin { @Redirect(method = "onImpact", at = @At(value = "INVOKE", remap = false, ordinal = 1, target = "Ljava/util/List;isEmpty()Z")) private boolean arclight$callEvent(List list) { @@ -77,7 +77,7 @@ public abstract class PotionEntityMixin extends ThrowableEntityMixin { double d2 = event.getIntensity(victim); for (EffectInstance mobeffect : list) { Effect mobeffectlist = mobeffect.getPotion(); - if (!((WorldBridge) this.world).bridge$isPvpMode() && this.getThrower() instanceof ServerPlayerEntity && entityliving2 instanceof ServerPlayerEntity && entityliving2 != this.getThrower()) { + if (!((WorldBridge) this.world).bridge$isPvpMode() && this.func_234616_v_() instanceof ServerPlayerEntity && entityliving2 instanceof ServerPlayerEntity && entityliving2 != this.func_234616_v_()) { int i = Effect.getId(mobeffectlist); if (i == 2 || i == 4 || i == 7 || i == 15 || i == 17 || i == 18) { continue; @@ -87,7 +87,7 @@ public abstract class PotionEntityMixin extends ThrowableEntityMixin { } } if (mobeffectlist.isInstant()) { - mobeffectlist.affectEntity((PotionEntity) (Object) this, this.getThrower(), entityliving2, mobeffect.getAmplifier(), d2); + mobeffectlist.affectEntity((PotionEntity) (Object) this, this.func_234616_v_(), entityliving2, mobeffect.getAmplifier(), d2); } else { int i = (int) (d2 * mobeffect.getDuration() + 0.5); if (i <= 20) { @@ -110,7 +110,7 @@ public abstract class PotionEntityMixin extends ThrowableEntityMixin { } } - @Inject(method = "extinguishFires", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;extinguishFire(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/Direction;)Z")) + @Inject(method = "extinguishFires", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;removeBlock(Lnet/minecraft/util/math/BlockPos;Z)Z")) private void arclight$entityChangeBlock(BlockPos pos, Direction direction, CallbackInfo ci) { if (CraftEventFactory.callEntityChangeBlockEvent((PotionEntity) (Object) this, pos.offset(direction), Blocks.AIR.getDefaultState()).isCancelled()) { ci.cancel(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/ShulkerBulletEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/ShulkerBulletEntityMixin.java index 921838b6..c86f30c2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/ShulkerBulletEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/ShulkerBulletEntityMixin.java @@ -7,9 +7,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.projectile.ShulkerBulletEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.EntityRayTraceResult; -import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.event.entity.EntityPotionEffectEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -23,7 +21,6 @@ import javax.annotation.Nullable; public abstract class ShulkerBulletEntityMixin extends EntityMixin { // @formatter:off - @Shadow private LivingEntity owner; @Shadow private Entity target; @Shadow @Nullable private Direction direction; @Shadow protected abstract void selectNextMoveDirection(@Nullable Direction.Axis p_184569_1_); @@ -34,22 +31,9 @@ public abstract class ShulkerBulletEntityMixin extends EntityMixin { this.projectileSource = ((LivingEntityBridge) ownerIn).bridge$getBukkitEntity(); } - @Inject(method = "bulletHit", at = @At("HEAD")) - private void arclight$projectileHit(RayTraceResult result, CallbackInfo ci) { - CraftEventFactory.callProjectileHitEvent((ShulkerBulletEntity) (Object) this, result); - } - - @Inject(method = "bulletHit", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;addPotionEffect(Lnet/minecraft/potion/EffectInstance;)Z")) - private void arclight$reason(RayTraceResult result, CallbackInfo ci) { - ((LivingEntityBridge) ((EntityRayTraceResult) result).getEntity()).bridge$pushEffectCause(EntityPotionEffectEvent.Cause.ATTACK); - } - - public LivingEntity getShooter() { - return this.owner; - } - - public void setShooter(final LivingEntity e) { - this.owner = e; + @Inject(method = "onEntityHit", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;addPotionEffect(Lnet/minecraft/potion/EffectInstance;)Z")) + private void arclight$reason(EntityRayTraceResult result, CallbackInfo ci) { + ((LivingEntityBridge) result.getEntity()).bridge$pushEffectCause(EntityPotionEffectEvent.Cause.ATTACK); } public Entity getTarget() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/SmallFireballEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/SmallFireballEntityMixin.java index e32cfada..21dfdf3a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/SmallFireballEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/SmallFireballEntityMixin.java @@ -1,78 +1,51 @@ package io.izzel.arclight.common.mixin.core.entity.projectile; -import io.izzel.arclight.api.ArclightVersion; import io.izzel.arclight.common.bridge.entity.EntityBridge; -import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.MobEntity; import net.minecraft.entity.projectile.SmallFireballEntity; -import net.minecraft.util.DamageSource; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.EntityRayTraceResult; -import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.GameRules; import net.minecraft.world.World; -import net.minecraftforge.event.ForgeEventFactory; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.event.entity.EntityCombustByEntityEvent; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(SmallFireballEntity.class) -public abstract class SmallFireballEntityMixin extends DamagingProjectileEntityMixin { +public abstract class SmallFireballEntityMixin extends AbstractFireballEntityMixin { @Inject(method = "(Lnet/minecraft/world/World;Lnet/minecraft/entity/LivingEntity;DDD)V", at = @At("RETURN")) private void arclight$init(World worldIn, LivingEntity shooter, double accelX, double accelY, double accelZ, CallbackInfo ci) { - if (this.shootingEntity != null && this.shootingEntity instanceof MobEntity) { + if (this.func_234616_v_() != null && this.func_234616_v_() instanceof MobEntity) { this.isIncendiary = this.world.getGameRules().getBoolean(GameRules.MOB_GRIEFING); } } - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - protected void onImpact(RayTraceResult result) { - if (ArclightVersion.atLeast(ArclightVersion.v1_15)) { - super.onImpact(result); - } - if (!this.world.isRemote) { - if (result.getType() == RayTraceResult.Type.ENTITY) { - Entity entity = ((EntityRayTraceResult) result).getEntity(); - if (!entity.isImmuneToFire()) { - int i = entity.getFireTimer(); - if (isIncendiary) { - EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this.getBukkitEntity(), ((EntityBridge) entity).bridge$getBukkitEntity(), 5); - Bukkit.getPluginManager().callEvent(event); + @Redirect(method = "onEntityHit", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;setFire(I)V")) + private void arclight$entityCombust(Entity entity, int seconds) { + if (this.isIncendiary) { + EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this.getBukkitEntity(), ((EntityBridge) entity).bridge$getBukkitEntity(), seconds); + Bukkit.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - ((EntityBridge) entity).bridge$setOnFire(event.getDuration(), false); - } - } - boolean flag = entity.attackEntityFrom(DamageSource.causeFireballDamage((SmallFireballEntity) (Object) this, this.shootingEntity), 5.0F); - if (flag) { - this.applyEnchantments(this.shootingEntity, entity); - } else { - entity.setFireTimer(i); - } - } - } else if (isIncendiary && this.shootingEntity == null || !(this.shootingEntity instanceof MobEntity) || ForgeEventFactory.getMobGriefingEvent(this.world, this.shootingEntity)) { - BlockRayTraceResult blockraytraceresult = (BlockRayTraceResult) result; - BlockPos blockpos = blockraytraceresult.getPos().offset(blockraytraceresult.getFace()); - if (this.world.isAirBlock(blockpos) && !CraftEventFactory.callBlockIgniteEvent(this.world, blockpos, (SmallFireballEntity) (Object) this).isCancelled()) { - this.world.setBlockState(blockpos, Blocks.FIRE.getDefaultState()); - } + if (!event.isCancelled()) { + ((EntityBridge) entity).bridge$setOnFire(event.getDuration(), false); } - - this.remove(); } + } + @Inject(method = "func_230299_a_", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) + private void arclight$burnBlock(BlockRayTraceResult result, CallbackInfo ci, Entity entity, BlockPos pos) { + if (!this.isIncendiary || CraftEventFactory.callBlockIgniteEvent(this.world, pos, (SmallFireballEntity) (Object) this).isCancelled()) { + ci.cancel(); + } } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/TridentEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/TridentEntityMixin.java index 22051592..cb0c4c05 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/TridentEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/projectile/TridentEntityMixin.java @@ -2,24 +2,26 @@ package io.izzel.arclight.common.mixin.core.entity.projectile; import io.izzel.arclight.common.bridge.entity.projectile.TridentEntityBridge; import io.izzel.arclight.common.bridge.world.server.ServerWorldBridge; +import net.minecraft.entity.Entity; +import net.minecraft.entity.effect.LightningBoltEntity; import net.minecraft.entity.projectile.TridentEntity; import net.minecraft.item.ItemStack; -import net.minecraft.util.math.EntityRayTraceResult; +import net.minecraft.world.World; import org.bukkit.event.weather.LightningStrikeEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(TridentEntity.class) public abstract class TridentEntityMixin extends AbstractArrowEntityMixin implements TridentEntityBridge { @Shadow public ItemStack thrownStack; - @Inject(method = "onEntityHit", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;addLightningBolt(Lnet/minecraft/entity/effect/LightningBoltEntity;)V")) - private void arclight$lightning(EntityRayTraceResult p_213868_1_, CallbackInfo ci) { - ((ServerWorldBridge) this.world).bridge$pushStrikeLightningCause(LightningStrikeEvent.Cause.TRIDENT); + @Redirect(method = "onEntityHit", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;addEntity(Lnet/minecraft/entity/Entity;)Z")) + private boolean arclight$lightning(World world, Entity entityIn) { + ((ServerWorldBridge) this.world).bridge$strikeLightning((LightningBoltEntity) entityIn, LightningStrikeEvent.Cause.TRIDENT); + return true; } @Override diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ShearsItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ShearsItemMixin.java index 75411697..bf9b6937 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ShearsItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ShearsItemMixin.java @@ -1,14 +1,12 @@ package io.izzel.arclight.common.mixin.core.item; -import io.izzel.arclight.common.bridge.entity.EntityBridge; -import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.ShearsItem; +import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; -import org.bukkit.Bukkit; -import org.bukkit.event.player.PlayerShearEntityEvent; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -17,14 +15,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ShearsItem.class) public class ShearsItemMixin { - @Inject(method = "itemInteractionForEntity", cancellable = true, at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraftforge/common/IShearable;isShearable(Lnet/minecraft/item/ItemStack;Lnet/minecraft/world/IWorldReader;Lnet/minecraft/util/math/BlockPos;)Z")) - private void arclight$onShear(ItemStack stack, PlayerEntity playerIn, LivingEntity entity, Hand hand, CallbackInfoReturnable cir) { - if (playerIn instanceof ServerPlayerEntityBridge) { - PlayerShearEntityEvent event = new PlayerShearEntityEvent(((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity(), ((EntityBridge) entity).bridge$getBukkitEntity()); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - cir.setReturnValue(false); - } + @Inject(method = "itemInteractionForEntity", cancellable = true, at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraftforge/common/IForgeShearable;isShearable(Lnet/minecraft/item/ItemStack;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)Z")) + private void arclight$onShear(ItemStack stack, PlayerEntity playerIn, LivingEntity entity, Hand hand, CallbackInfoReturnable cir) { + if (!CraftEventFactory.handlePlayerShearEntityEvent(playerIn, entity, stack, hand)) { + cir.setReturnValue(ActionResultType.PASS); } } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java index 1836fa62..3eeed0b7 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java @@ -165,36 +165,6 @@ public class ArclightMixinPlugin implements IMixinConfigPlugin { } } modifyConstructor(targetClassName, targetClass); - if (targetClassName.equals("net.minecraft.entity.projectile.LlamaSpitEntity")) { - for (FieldNode node : targetClass.fields) { - if (node.name.equals("field_190539_a")) { - node.desc = "Lnet/minecraft/entity/LivingEntity;"; - } - } - for (MethodNode node : targetClass.methods) { - ListIterator iterator = node.instructions.iterator(); - while (iterator.hasNext()) { - AbstractInsnNode insnNode = iterator.next(); - if (insnNode instanceof FieldInsnNode) { - FieldInsnNode fieldInsnNode = (FieldInsnNode) insnNode; - if (fieldInsnNode.getOpcode() == Opcodes.GETFIELD || fieldInsnNode.getOpcode() == Opcodes.PUTFIELD) { - if (fieldInsnNode.name.equals("field_190539_a")) { - fieldInsnNode.desc = "Lnet/minecraft/entity/LivingEntity;"; - if (iterator.hasNext()) { - AbstractInsnNode next = iterator.next(); - if (next.getOpcode() == Opcodes.INVOKEVIRTUAL && ((MethodInsnNode) next).name.equals("func_110124_au") - && ((MethodInsnNode) next).desc.equals("()Ljava/util/UUID;")) { - ((MethodInsnNode) next).owner = "net/minecraft/entity/LivingEntity"; - } - } - } - } - } - } - } - FieldNode node = new FieldNode(Opcodes.ACC_PUBLIC, "field_190539_a", "Lnet/minecraft/entity/passive/horse/LlamaEntity;", null, null); - targetClass.fields.add(node); - } if (targetClassName.equals("net.minecraft.world.chunk.Chunk")) { for (FieldNode field : targetClass.fields) { if (field.name.equals("$$world")) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/EntityTeleportEventDispatcher.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/EntityTeleportEventDispatcher.java index 60ce27a0..9bb8ad3e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/EntityTeleportEventDispatcher.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/EntityTeleportEventDispatcher.java @@ -2,7 +2,6 @@ package io.izzel.arclight.common.mod.server.event; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; -import net.minecraft.entity.monster.EndermanEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -17,16 +16,14 @@ public class EntityTeleportEventDispatcher { @SubscribeEvent(receiveCanceled = true) public void onTeleport(EnderTeleportEvent event) { - if (!(event.getEntity() instanceof EndermanEntity)) { - if (event.getEntity() instanceof ServerPlayerEntity) { - CraftPlayer player = ((ServerPlayerEntityBridge) event.getEntity()).bridge$getBukkitEntity(); - PlayerTeleportEvent bukkitEvent = new PlayerTeleportEvent(player, player.getLocation(), new Location(player.getWorld(), event.getTargetX(), event.getTargetY(), event.getTargetZ()), PlayerTeleportEvent.TeleportCause.ENDER_PEARL); - Bukkit.getPluginManager().callEvent(bukkitEvent); - event.setCanceled(bukkitEvent.isCancelled()); - event.setTargetX(bukkitEvent.getTo().getX()); - event.setTargetY(bukkitEvent.getTo().getY()); - event.setTargetZ(bukkitEvent.getTo().getZ()); - } + if (event.getEntity() instanceof ServerPlayerEntity) { + CraftPlayer player = ((ServerPlayerEntityBridge) event.getEntity()).bridge$getBukkitEntity(); + PlayerTeleportEvent bukkitEvent = new PlayerTeleportEvent(player, player.getLocation(), new Location(player.getWorld(), event.getTargetX(), event.getTargetY(), event.getTargetZ()), PlayerTeleportEvent.TeleportCause.ENDER_PEARL); + Bukkit.getPluginManager().callEvent(bukkitEvent); + event.setCanceled(bukkitEvent.isCancelled()); + event.setTargetX(bukkitEvent.getTo().getX()); + event.setTargetY(bukkitEvent.getTo().getY()); + event.setTargetZ(bukkitEvent.getTo().getZ()); } else { CraftEntity entity = ((EntityBridge) event.getEntity()).bridge$getBukkitEntity(); EntityTeleportEvent bukkitEvent = new EntityTeleportEvent(entity, entity.getLocation(), new Location(entity.getWorld(), event.getTargetX(), event.getTargetY(), event.getTargetZ())); diff --git a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg index 2cbafcd9..8afd830a 100644 --- a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg +++ b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg @@ -42,6 +42,7 @@ public net.minecraft.entity.passive.BeeEntity$PollinateGoal func_226504_l_()V #c # Arclight 1.16 public net.minecraft.block.ComposterBlock func_235490_d_(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/IWorld;Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState; #resetFillState public net.minecraft.util.text.Style (Lnet/minecraft/util/text/Color;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Lnet/minecraft/util/text/event/ClickEvent;Lnet/minecraft/util/text/event/HoverEvent;Ljava/lang/String;Lnet/minecraft/util/ResourceLocation;)V +public net.minecraft.entity.player.SpawnLocationHelper func_241092_a_(Lnet/minecraft/world/server/ServerWorld;IIZ)Lnet/minecraft/util/math/BlockPos; #func_241092_a_ # Bukkit public net.minecraft.entity.player.PlayerEntity func_190531_bD()I public net.minecraft.entity.item.ItemFrameEntity func_174859_a(Lnet/minecraft/util/Direction;)V diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 685c0e7c..bd01e854 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -163,7 +163,7 @@ "entity.item.TNTEntityMixin", "entity.item.minecart.AbstractMinecartEntityMixin", "entity.item.minecart.ContainerMinecartEntityMixin", - "entity.item.minecart.MinecartCommandBlockEntity_MinecartCommandLogicMixin", + "entity.item.minecart.CommandBlockMinecartEntity_MinecartCommandLogicMixin", "entity.merchant.IMerchantMixin", "entity.merchant.villager.AbstractVillagerEntityMixin", "entity.merchant.villager.VillagerEntityMixin", @@ -187,13 +187,15 @@ "entity.monster.SilverfishEntity_HideInStoneGoalMixin", "entity.monster.SilverfishEntity_SummonSilverfishGoalMixin", "entity.monster.SlimeEntityMixin", + "entity.monster.SpellcastingIllagerEntity_UseSpellGoalMixin", + "entity.monster.SpellcastingIllagerEntityMixin", "entity.monster.SpiderEntityMixin", "entity.monster.VexEntity_CopyOwnerTargetGoalMixin", "entity.monster.WitchEntityMixin", "entity.monster.WitherSkeletonEntityMixin", "entity.monster.ZombieEntityMixin", "entity.monster.ZombiePigmanEntity_HurtByAggressorGoalMixin", - "entity.monster.ZombiePigmanEntityMixin", + "entity.monster.ZombifiedPiglinEntityMixin", "entity.monster.ZombieVillagerEntityMixin", "entity.passive.AnimalEntityMixin", "entity.passive.BatEntityMixin",