Skip to content

Commit

Permalink
Compatibility with Patchwork entity size event
Browse files Browse the repository at this point in the history
  • Loading branch information
Virtuoel committed Feb 18, 2021
1 parent 730ad86 commit e590086
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public String getRefMapperConfig()
private static final boolean STEP_HEIGHT_ATTRIBUTES_LOADED = FabricLoader.getInstance().isModLoaded("step-height-entity-attribute");
private static final boolean IDENTITY_LOADED = FabricLoader.getInstance().isModLoaded("identity");
private static final boolean OPTIFABRIC_LOADED = FabricLoader.getInstance().isModLoaded("optifabric");
private static final boolean PATCHWORK_ENTITY_EVENTS_LOADED = FabricLoader.getInstance().isModLoaded("patchwork-events-entity");

@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName)
Expand All @@ -56,6 +57,11 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName)
return OPTIFABRIC_LOADED == mixinClassName.contains(".optifine.compat.");
}

if (mixinClassName.endsWith("EntityCalculateDimensionsMixin"))
{
return PATCHWORK_ENTITY_EVENTS_LOADED == mixinClassName.contains(".patchwork.compat.");
}

if (mixinClassName.startsWith(MIXIN_PACKAGE + ".reach"))
{
return REACH_ATTRIBUTES_LOADED == mixinClassName.equals(MIXIN_PACKAGE + ".reach.compat.ReachEntityAttributesMixin");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import virtuoel.pehkui.util.ScaleUtils;

@Mixin(Entity.class)
public abstract class EntityMixin
public abstract class EntityCalculateDimensionsMixin
{
@Shadow World world;
@Shadow @Final @Mutable EntityType<?> type;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package virtuoel.pehkui.mixin.compat116minus.patchwork.compat;

import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.At.Shift;
import org.spongepowered.asm.mixin.injection.Coerce;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityDimensions;
import net.minecraft.entity.EntityPose;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.MovementType;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import virtuoel.pehkui.util.ScaleUtils;

@Mixin(value = Entity.class, priority = 1010)
public abstract class EntityCalculateDimensionsMixin
{
@Shadow World world;
@Shadow @Final @Mutable EntityType<?> type;
@Shadow abstract void move(MovementType type, Vec3d movement);

@Inject(method = "calculateDimensions", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", shift = Shift.AFTER, ordinal = 1, target = "Lnet/minecraft/entity/Entity;setBoundingBox(Lnet/minecraft/util/math/Box;)V"))
private void onCalculateDimensions(CallbackInfo info, EntityDimensions previous, EntityPose pose, @Coerce Object sizeEvent, EntityDimensions current, Box box)
{
if (this.world.isClient && type == EntityType.PLAYER && current.width > previous.width)
{
final float scale = ScaleUtils.getWidthScale((Entity) (Object) this);
final float dist = (previous.width - current.width) / 2.0F;

move(MovementType.SELF, new Vec3d(dist / scale, 0.0D, dist / scale));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import net.minecraft.util.shape.VoxelShapes;

@Mixin(Entity.class)
public abstract class EntityMixin
public abstract class EntityCalculateDimensionsMixin
{
@Inject(method = "calculateDimensions", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", shift = Shift.AFTER, target = "Lnet/minecraft/entity/Entity;refreshPosition()V"))
private void onCalculateDimensions(CallbackInfo info, EntityDimensions previous, EntityPose pose, EntityDimensions current)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package virtuoel.pehkui.mixin.compat117plus.patchwork.compat;

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.At.Shift;
import org.spongepowered.asm.mixin.injection.Coerce;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityDimensions;
import net.minecraft.entity.EntityPose;
import net.minecraft.entity.EntityType;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;

@Mixin(value = Entity.class, priority = 1010)
public abstract class EntityCalculateDimensionsMixin
{
@Shadow
protected boolean firstUpdate;

@Inject(method = "calculateDimensions", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", shift = Shift.AFTER, target = "Lnet/minecraft/entity/Entity;refreshPosition()V"))
private void onCalculateDimensions(CallbackInfo info, EntityDimensions previous, EntityPose pose, @Coerce Object sizeEvent, EntityDimensions current)
{
final Entity self = (Entity) (Object) this;

if (self.world.isClient && self.getType() == EntityType.PLAYER && current.width > previous.width)
{
final Vec3d lastCenter = self.getPos().add(0.0D, previous.height / 2.0D, 0.0D);
final double w = Math.max(0.0F, current.width - previous.width) + 1.0E-6D;
final double h = Math.max(0.0F, current.height - previous.height) + 1.0E-6D;
final VoxelShape voxelShape = VoxelShapes.cuboid(Box.of(lastCenter, w, h, w));
self.world.method_33594(self, voxelShape, lastCenter, current.width, current.height, current.width)
.ifPresent(vec -> self.method_33574(vec.add(0.0D, (-current.height) / 2.0D, 0.0D)));
}
}
}
6 changes: 4 additions & 2 deletions src/main/resources/pehkui.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@
"compat115plus.PlayerEntityMixin",
"compat115plus.compat116minus.LivingEntityMixin",
"compat116.EntityMixin",
"compat116minus.EntityMixin",
"compat116minus.EntityCalculateDimensionsMixin",
"compat116minus.patchwork.compat.EntityCalculateDimensionsMixin",
"compat116minus.SlimeEntityMixin",
"compat116plus.AbstractBlockStateMixin",
"compat116plus.AnimalEntityMixin",
Expand All @@ -84,7 +85,8 @@
"compat116plus.SpawnEggItemMixin",
"compat116plus.VillagerBreedTaskMixin",
"compat116plus.VillagerEntityMixin",
"compat117plus.EntityMixin",
"compat117plus.EntityCalculateDimensionsMixin",
"compat117plus.patchwork.compat.EntityCalculateDimensionsMixin",
"compat117plus.SlimeEntityMixin",
"identity.compat.IdentityComponentMixin",
"identity.compat.PlayerEntityMixin",
Expand Down

0 comments on commit e590086

Please sign in to comment.