mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-30 16:28:00 +01:00
Fix mixins and rewrite dimension changing
This commit is contained in:
parent
6678999dd0
commit
7a1b3aab98
16 changed files with 204 additions and 146 deletions
|
@ -5,17 +5,14 @@ import java.util.Random;
|
||||||
import com.minelittlepony.unicopia.Race;
|
import com.minelittlepony.unicopia.Race;
|
||||||
import com.minelittlepony.unicopia.USounds;
|
import com.minelittlepony.unicopia.USounds;
|
||||||
import com.minelittlepony.unicopia.ability.FlightPredicate;
|
import com.minelittlepony.unicopia.ability.FlightPredicate;
|
||||||
import com.minelittlepony.unicopia.ability.HeightPredicate;
|
|
||||||
import com.minelittlepony.unicopia.entity.FlightControl;
|
import com.minelittlepony.unicopia.entity.FlightControl;
|
||||||
import com.minelittlepony.unicopia.entity.Updatable;
|
import com.minelittlepony.unicopia.entity.Updatable;
|
||||||
import com.minelittlepony.unicopia.magic.MagicEffect;
|
import com.minelittlepony.unicopia.magic.MagicEffect;
|
||||||
import com.minelittlepony.unicopia.mixin.MixinEntity;
|
|
||||||
import com.minelittlepony.unicopia.particles.MagicParticleEffect;
|
import com.minelittlepony.unicopia.particles.MagicParticleEffect;
|
||||||
import com.minelittlepony.unicopia.util.NbtSerialisable;
|
import com.minelittlepony.unicopia.util.NbtSerialisable;
|
||||||
import com.minelittlepony.unicopia.util.MutableVector;
|
import com.minelittlepony.unicopia.util.MutableVector;
|
||||||
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.EntityPose;
|
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.sound.SoundCategory;
|
import net.minecraft.sound.SoundCategory;
|
||||||
|
@ -25,9 +22,9 @@ import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
public class GravityDelegate implements Updatable, FlightControl, NbtSerialisable, FlightPredicate, HeightPredicate {
|
public class GravityDelegate implements Updatable, FlightControl, NbtSerialisable, FlightPredicate {
|
||||||
|
|
||||||
private final Pony player;
|
final Pony player;
|
||||||
|
|
||||||
private static final float MAXIMUM_FLIGHT_EXPERIENCE = 1500;
|
private static final float MAXIMUM_FLIGHT_EXPERIENCE = 1500;
|
||||||
|
|
||||||
|
@ -42,10 +39,11 @@ public class GravityDelegate implements Updatable, FlightControl, NbtSerialisabl
|
||||||
|
|
||||||
private float gravity = 0;
|
private float gravity = 0;
|
||||||
|
|
||||||
private float eyeHeight;
|
private final PlayerDimensionsDelegate dimensions;
|
||||||
|
|
||||||
public GravityDelegate(Pony player) {
|
public GravityDelegate(Pony player) {
|
||||||
this.player = player;
|
this.player = player;
|
||||||
|
this.dimensions = new PlayerDimensionsDelegate(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -64,53 +62,12 @@ public class GravityDelegate implements Updatable, FlightControl, NbtSerialisabl
|
||||||
return player.getSpecies().canFly();
|
return player.getSpecies().canFly();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isRainboom(Pony player) {
|
protected boolean isRainboom() {
|
||||||
return Math.sqrt(getHorizontalMotion(player.getOwner())) > 0.4F;
|
return Math.sqrt(getHorizontalMotion(player.getOwner())) > 0.4F;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getEyeHeight() {
|
public PlayerDimensionsDelegate getDimensions() {
|
||||||
return eyeHeight;
|
return dimensions;
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public float getTargetEyeHeight(Pony player) {
|
|
||||||
if (player.hasEffect()) {
|
|
||||||
MagicEffect effect = player.getEffect();
|
|
||||||
if (!effect.isDead() && effect instanceof HeightPredicate) {
|
|
||||||
float val = ((HeightPredicate)effect).getTargetEyeHeight(player);
|
|
||||||
if (val > 0) {
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isFlying && isRainboom(player)) {
|
|
||||||
return 0.5F;
|
|
||||||
}
|
|
||||||
|
|
||||||
EntityPose pose = player.getOwner().getPose();
|
|
||||||
return player.getOwner().getActiveEyeHeight(pose, player.getOwner().getDimensions(pose));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public float getTargetBodyHeight(Pony player) {
|
|
||||||
if (player.hasEffect()) {
|
|
||||||
MagicEffect effect = player.getEffect();
|
|
||||||
if (!effect.isDead() && effect instanceof HeightPredicate) {
|
|
||||||
float val = ((HeightPredicate)effect).getTargetBodyHeight(player);
|
|
||||||
if (val > 0) {
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Player height is reset at this point, so we can use it as our baseline.
|
|
||||||
|
|
||||||
if (isFlying && isRainboom(player)) {
|
|
||||||
return player.getOwner().getHeight() / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return player.getOwner().getHeight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setGraviationConstant(float constant) {
|
public void setGraviationConstant(float constant) {
|
||||||
|
@ -170,26 +127,8 @@ public class GravityDelegate implements Updatable, FlightControl, NbtSerialisabl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float bodyHeight = getTargetBodyHeight(player);
|
if (dimensions.update()) {
|
||||||
eyeHeight = 0;
|
player.getOwner().calculateDimensions();
|
||||||
eyeHeight = getTargetEyeHeight(player);
|
|
||||||
|
|
||||||
if (gravity < 0) {
|
|
||||||
eyeHeight = bodyHeight - eyeHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entity.age > 10) {
|
|
||||||
bodyHeight = player.getInterpolator().interpolate("standingHeight", bodyHeight, 10);
|
|
||||||
eyeHeight = player.getInterpolator().interpolate("eyeHeight", eyeHeight, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
((MixinEntity)entity).setSize(entity.getWidth(), bodyHeight);
|
|
||||||
|
|
||||||
if (gravity < 0) {
|
|
||||||
if (entity.isSneaking()) {
|
|
||||||
//entity.eyeHeight += 0.2F;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!entity.abilities.creativeMode && !entity.isFallFlying()) {
|
if (!entity.abilities.creativeMode && !entity.isFallFlying()) {
|
||||||
|
@ -228,7 +167,7 @@ public class GravityDelegate implements Updatable, FlightControl, NbtSerialisabl
|
||||||
player.addEnergy(2);
|
player.addEnergy(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isRainbooming || (entity.isSneaking() && isRainboom(player))) {
|
if (isRainbooming || (entity.isSneaking() && isRainboom())) {
|
||||||
float forward = 0.5F * flightExperience / MAXIMUM_FLIGHT_EXPERIENCE;
|
float forward = 0.5F * flightExperience / MAXIMUM_FLIGHT_EXPERIENCE;
|
||||||
|
|
||||||
velocity.x += - forward * MathHelper.sin(entity.yaw * 0.017453292F);
|
velocity.x += - forward * MathHelper.sin(entity.yaw * 0.017453292F);
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
package com.minelittlepony.unicopia.entity.player;
|
||||||
|
|
||||||
|
import com.minelittlepony.unicopia.ability.HeightPredicate;
|
||||||
|
import com.minelittlepony.unicopia.magic.MagicEffect;
|
||||||
|
|
||||||
|
import net.minecraft.entity.EntityDimensions;
|
||||||
|
import net.minecraft.entity.EntityPose;
|
||||||
|
|
||||||
|
public final class PlayerDimensionsDelegate {
|
||||||
|
|
||||||
|
private float defaultEyeHeight;
|
||||||
|
private float defaultBodyHeight;
|
||||||
|
|
||||||
|
private float lastTargetEyeHeight;
|
||||||
|
private float lastTargetBodyHeight;
|
||||||
|
|
||||||
|
private final GravityDelegate gravity;
|
||||||
|
|
||||||
|
public PlayerDimensionsDelegate(GravityDelegate gravity) {
|
||||||
|
this.gravity = gravity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getActiveEyeHeight(float original) {
|
||||||
|
defaultEyeHeight = original;
|
||||||
|
return calculateTargetEyeHeightWithGravity(calculateTargetBodyHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntityDimensions getDimensions(EntityPose pos, EntityDimensions dimensions) {
|
||||||
|
defaultBodyHeight = dimensions.height;
|
||||||
|
return EntityDimensions.changing(dimensions.width, calculateTargetBodyHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean update() {
|
||||||
|
float targetBodyHeight = calculateTargetBodyHeight();
|
||||||
|
float targetEyeHeight = calculateTargetEyeHeightWithGravity(targetBodyHeight);
|
||||||
|
|
||||||
|
if (targetEyeHeight != lastTargetEyeHeight || targetBodyHeight != lastTargetBodyHeight) {
|
||||||
|
lastTargetBodyHeight = targetBodyHeight;
|
||||||
|
lastTargetEyeHeight = targetEyeHeight;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private float calculateTargetEyeHeightWithGravity(float targetBodyHeight) {
|
||||||
|
float height = calculateTargetEyeHeight();
|
||||||
|
|
||||||
|
if (gravity.getGravitationConstant() < 0 && gravity.player.getOwner().isSneaking()) {
|
||||||
|
height += 0.2F;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gravity.getGravitationConstant() < 0) {
|
||||||
|
height = targetBodyHeight - height;
|
||||||
|
}
|
||||||
|
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
private float calculateTargetEyeHeight() {
|
||||||
|
if (gravity.player.hasEffect()) {
|
||||||
|
MagicEffect effect = gravity.player.getEffect();
|
||||||
|
if (!effect.isDead() && effect instanceof HeightPredicate) {
|
||||||
|
float val = ((HeightPredicate)effect).getTargetEyeHeight(gravity.player);
|
||||||
|
if (val > 0) {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gravity.isFlying && gravity.isRainboom()) {
|
||||||
|
return 0.5F;
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultEyeHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
private float calculateTargetBodyHeight() {
|
||||||
|
if (gravity.player.hasEffect()) {
|
||||||
|
MagicEffect effect = gravity.player.getEffect();
|
||||||
|
if (!effect.isDead() && effect instanceof HeightPredicate) {
|
||||||
|
float val = ((HeightPredicate)effect).getTargetBodyHeight(gravity.player);
|
||||||
|
if (val > 0) {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gravity.isFlying && gravity.isRainboom()) {
|
||||||
|
return defaultBodyHeight / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultBodyHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -8,7 +8,7 @@ import net.minecraft.advancement.criterion.Criterions;
|
||||||
|
|
||||||
@Mixin(Criterions.class)
|
@Mixin(Criterions.class)
|
||||||
public interface CriterionsRegistry {
|
public interface CriterionsRegistry {
|
||||||
@Invoker
|
@Invoker("register")
|
||||||
static <T extends Criterion<?>> T register(T object) {
|
static <T extends Criterion<?>> T register(T object) {
|
||||||
throw new NullPointerException("mixin y u fail");
|
throw new NullPointerException("mixin y u fail");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
package com.minelittlepony.unicopia.mixin;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
|
||||||
|
|
||||||
import net.minecraft.entity.Entity;
|
|
||||||
|
|
||||||
@Mixin(Entity.class)
|
|
||||||
public interface MixinEntity {
|
|
||||||
@Accessor("setSize")
|
|
||||||
void setSize(float width, float height);
|
|
||||||
}
|
|
|
@ -3,6 +3,7 @@ package com.minelittlepony.unicopia.mixin;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import com.minelittlepony.unicopia.ducks.Farmland;
|
import com.minelittlepony.unicopia.ducks.Farmland;
|
||||||
|
|
||||||
|
@ -19,10 +20,11 @@ abstract class MixinFarmlandBlock extends Block {
|
||||||
method = "setToDirt(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V",
|
method = "setToDirt(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V",
|
||||||
at = @At("HEAD"),
|
at = @At("HEAD"),
|
||||||
cancellable = true)
|
cancellable = true)
|
||||||
public static void setToDirt(BlockState state, World world, BlockPos pos) {
|
private static void setToDirt(BlockState state, World world, BlockPos pos, CallbackInfo info) {
|
||||||
if (state.getBlock() instanceof Farmland) {
|
if (state.getBlock() instanceof Farmland) {
|
||||||
BlockState dirtState = ((Farmland)state.getBlock()).getDirtState(state, world, pos);
|
BlockState dirtState = ((Farmland)state.getBlock()).getDirtState(state, world, pos);
|
||||||
world.setBlockState(pos, pushEntitiesUpBeforeBlockChange(state, dirtState, world, pos));
|
world.setBlockState(pos, pushEntitiesUpBeforeBlockChange(state, dirtState, world, pos));
|
||||||
|
info.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package com.minelittlepony.unicopia.mixin;
|
package com.minelittlepony.unicopia.mixin;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
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 com.minelittlepony.unicopia.util.HoeUtil;
|
import com.minelittlepony.unicopia.util.HoeUtil;
|
||||||
|
|
||||||
|
@ -13,19 +16,15 @@ import net.minecraft.util.ActionResult;
|
||||||
@Mixin(HoeItem.class)
|
@Mixin(HoeItem.class)
|
||||||
abstract class MixinHoeItem extends ToolItem {
|
abstract class MixinHoeItem extends ToolItem {
|
||||||
MixinHoeItem() {super(null, null);}
|
MixinHoeItem() {super(null, null);}
|
||||||
|
@Inject(method = "useOnBlock(Lnet/minecraft/item/ItemUsageContext;)Lnet/minecraft/util/ActionResult;",
|
||||||
@Override
|
at = @At("HEAD"),
|
||||||
public ActionResult useOnBlock(ItemUsageContext context) {
|
cancellable = true)
|
||||||
|
private void onUseOnBlock(ItemUsageContext context, CallbackInfoReturnable<ActionResult> info) {
|
||||||
BlockState state = context.getWorld().getBlockState(context.getBlockPos());
|
BlockState state = context.getWorld().getBlockState(context.getBlockPos());
|
||||||
if (state.getBlock() instanceof HoeUtil.Tillable) {
|
if (state.getBlock() instanceof HoeUtil.Tillable) {
|
||||||
if (!((HoeUtil.Tillable)state.getBlock()).canTill(context)) {
|
if (!((HoeUtil.Tillable)state.getBlock()).canTill(context)) {
|
||||||
return ActionResult.PASS;
|
info.setReturnValue(ActionResult.PASS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.ItemEntity;
|
import net.minecraft.entity.ItemEntity;
|
||||||
|
|
||||||
@Mixin(ItemEntity.class)
|
@Mixin(ItemEntity.class)
|
||||||
public abstract class MixinItemEntity extends Entity implements IItemEntity {
|
abstract class MixinItemEntity extends Entity implements IItemEntity {
|
||||||
|
|
||||||
private final ItemEntityCapabilities caster = create();
|
private final ItemEntityCapabilities caster = create();
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
|
||||||
@Mixin(LivingEntity.class)
|
@Mixin(LivingEntity.class)
|
||||||
public abstract class MixinLivingEntity extends Entity implements PonyContainer<Ponylike> {
|
abstract class MixinLivingEntity extends Entity implements PonyContainer<Ponylike> {
|
||||||
|
|
||||||
private final Ponylike caster = create();
|
private final Ponylike caster = create();
|
||||||
|
|
||||||
|
@ -30,15 +30,15 @@ public abstract class MixinLivingEntity extends Entity implements PonyContainer<
|
||||||
return caster;
|
return caster;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "canSee(Lnet/minecraft/entity/Entity)Z", at = @At("HEAD"))
|
@Inject(method = "canSee(Lnet/minecraft/entity/Entity;)Z", at = @At("HEAD"))
|
||||||
private void onCanSee(Entity other, CallbackInfoReturnable<Boolean> info) {
|
private void onCanSee(Entity other, CallbackInfoReturnable<Boolean> info) {
|
||||||
if (caster.isInvisible()) {
|
if (caster.isInvisible()) {
|
||||||
info.setReturnValue(false);
|
info.setReturnValue(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "method_6040()V", at = @At("HEAD"))
|
@Inject(method = "tickActiveItemStack()V", at = @At("HEAD"))
|
||||||
protected void onFinishUsing(CallbackInfo info) {
|
private void onFinishUsing(CallbackInfo info) {
|
||||||
LivingEntity self = (LivingEntity)(Object)this;
|
LivingEntity self = (LivingEntity)(Object)this;
|
||||||
|
|
||||||
if (!self.getActiveItem().isEmpty() && self.isUsingItem()) {
|
if (!self.getActiveItem().isEmpty() && self.isUsingItem()) {
|
||||||
|
@ -63,7 +63,7 @@ public abstract class MixinLivingEntity extends Entity implements PonyContainer<
|
||||||
caster.onUpdate();
|
caster.onUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "<clinit>()V", at = @At("RETURN"))
|
@Inject(method = "<clinit>()V", at = @At("RETURN"), remap = false)
|
||||||
private static void clinit(CallbackInfo info) {
|
private static void clinit(CallbackInfo info) {
|
||||||
LivingEntityCapabilities.boostrap();
|
LivingEntityCapabilities.boostrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.mixin;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.GameMode;
|
import net.minecraft.world.GameMode;
|
||||||
|
|
||||||
@Mixin(PlayerEntity.class)
|
@Mixin(PlayerEntity.class)
|
||||||
public abstract class MixinPlayerEntity extends LivingEntity implements PonyContainer<Pony> {
|
abstract class MixinPlayerEntity extends LivingEntity implements PonyContainer<Pony> {
|
||||||
private MixinPlayerEntity() { super(null, null); }
|
private MixinPlayerEntity() { super(null, null); }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -32,9 +32,10 @@ public abstract class MixinPlayerEntity extends LivingEntity implements PonyCont
|
||||||
return new PlayerImpl((PlayerEntity)(Object)this);
|
return new PlayerImpl((PlayerEntity)(Object)this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ModifyArg(method = "Lnet/minecraft/entity/LivingEntity;handleFallDamage(FF)V",
|
@ModifyVariable(method = "handleFallDamage(FF)Z",
|
||||||
at = @At("HEAD"),
|
at = @At("HEAD"),
|
||||||
index = 0)
|
ordinal = 0,
|
||||||
|
argsOnly = true)
|
||||||
private float onHandleFallDamage(float distance) {
|
private float onHandleFallDamage(float distance) {
|
||||||
return get().onImpact(distance);
|
return get().onImpact(distance);
|
||||||
}
|
}
|
||||||
|
@ -68,9 +69,13 @@ public abstract class MixinPlayerEntity extends LivingEntity implements PonyCont
|
||||||
at = @At("RETURN"),
|
at = @At("RETURN"),
|
||||||
cancellable = true)
|
cancellable = true)
|
||||||
private void onGetActiveEyeHeight(EntityPose pose, EntityDimensions dimensions, CallbackInfoReturnable<Float> info) {
|
private void onGetActiveEyeHeight(EntityPose pose, EntityDimensions dimensions, CallbackInfoReturnable<Float> info) {
|
||||||
float h = get().getGravity().getEyeHeight();
|
info.setReturnValue(get().getGravity().getDimensions().getActiveEyeHeight(info.getReturnValue()));
|
||||||
if (h != 0) {
|
}
|
||||||
info.setReturnValue(h);
|
|
||||||
}
|
@Inject(method = "getDimensions(Lnet/minecraft/entity/EntityPose;)Lnet/minecraft/entity/EntityDimensions;",
|
||||||
|
at = @At("RETURN"),
|
||||||
|
cancellable = true)
|
||||||
|
public void onGetDimensions(EntityPose pose, CallbackInfoReturnable<EntityDimensions> info) {
|
||||||
|
info.setReturnValue(get().getGravity().getDimensions().getDimensions(pose, info.getReturnValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,8 @@ import net.minecraft.entity.projectile.ProjectileEntity;
|
||||||
import net.minecraft.util.hit.EntityHitResult;
|
import net.minecraft.util.hit.EntityHitResult;
|
||||||
|
|
||||||
@Mixin(ProjectileEntity.class)
|
@Mixin(ProjectileEntity.class)
|
||||||
public abstract class MixinProjectileEntity extends Entity implements Projectile {
|
abstract class MixinProjectileEntity extends Entity implements Projectile {
|
||||||
|
private MixinProjectileEntity() { super(null, null); }
|
||||||
public MixinProjectileEntity() { super(null, null); }
|
|
||||||
|
|
||||||
@Inject(method = "onEntityHit(Lnet/minecraft/util/hit/EntityHitResult;)V",
|
@Inject(method = "onEntityHit(Lnet/minecraft/util/hit/EntityHitResult;)V",
|
||||||
at = @At("HEAD"),
|
at = @At("HEAD"),
|
||||||
|
|
|
@ -1,34 +1,59 @@
|
||||||
package com.minelittlepony.unicopia.mixin.client;
|
package com.minelittlepony.unicopia.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
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;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At.Shift;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import com.minelittlepony.unicopia.entity.player.Pony;
|
import com.minelittlepony.unicopia.entity.player.Pony;
|
||||||
import com.minelittlepony.unicopia.entity.player.PlayerCamera;
|
|
||||||
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.render.Camera;
|
import net.minecraft.client.render.Camera;
|
||||||
|
import net.minecraft.client.util.math.Vector3f;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
|
||||||
@Mixin(Camera.class)
|
@Mixin(Camera.class)
|
||||||
abstract class MixinCamera {
|
abstract class MixinCamera {
|
||||||
@Shadow
|
@ModifyVariable(method = "setRotation(FF)V",
|
||||||
private float pitch;
|
at = @At("HEAD"),
|
||||||
@Shadow
|
ordinal = 0,
|
||||||
private float yaw;
|
argsOnly = true)
|
||||||
|
private float modifyYaw(float yaw) {
|
||||||
@Inject(method = "updateRotation()V", at = @At("HEAD"))
|
|
||||||
private void updateRotation() {
|
|
||||||
PlayerEntity player = MinecraftClient.getInstance().player;
|
PlayerEntity player = MinecraftClient.getInstance().player;
|
||||||
|
|
||||||
if (player != null) {
|
if (player != null && MinecraftClient.getInstance().cameraEntity == player) {
|
||||||
PlayerCamera view = Pony.of(player).getCamera();
|
return Pony.of(player).getCamera().calculateYaw(yaw);
|
||||||
|
}
|
||||||
|
|
||||||
//event.setRoll(view.calculateRoll());
|
return yaw;
|
||||||
pitch = view.calculatePitch(pitch);
|
}
|
||||||
yaw = view.calculateYaw(yaw);
|
|
||||||
|
@ModifyVariable(method = "setRotation(FF)V",
|
||||||
|
at = @At("HEAD"),
|
||||||
|
ordinal = 1,
|
||||||
|
argsOnly = true)
|
||||||
|
private float modifyPitch(float pitch) {
|
||||||
|
PlayerEntity player = MinecraftClient.getInstance().player;
|
||||||
|
|
||||||
|
if (player != null && MinecraftClient.getInstance().cameraEntity == player) {
|
||||||
|
return Pony.of(player).getCamera().calculatePitch(pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "setRotation(FF)V",
|
||||||
|
at = @At(value = "INVOKE",
|
||||||
|
target = "Lnet/minecraft/util/math/Quaternion;set(FFFF)V",
|
||||||
|
shift = Shift.AFTER)
|
||||||
|
)
|
||||||
|
private void onSetRotation(float yaw, float pitch, CallbackInfo info) {
|
||||||
|
PlayerEntity player = MinecraftClient.getInstance().player;
|
||||||
|
|
||||||
|
if (player != null && MinecraftClient.getInstance().cameraEntity == player) {
|
||||||
|
float roll = Pony.of(player).getCamera().calculateRoll();
|
||||||
|
((Camera)(Object)this).getRotation().hamiltonProduct(Vector3f.POSITIVE_Z.getDegreesQuaternion(roll));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,10 @@ import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
|
||||||
@Mixin(EntityRenderDispatcher.class)
|
@Mixin(EntityRenderDispatcher.class)
|
||||||
abstract class MixinEntityRenderDispatcher {
|
abstract class MixinEntityRenderDispatcher {
|
||||||
@Inject(method = "render(Lnet/minecraft/entity/Entity;DDDFFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"))
|
|
||||||
|
private static final String RENDER = "render(Lnet/minecraft/entity/Entity;DDDFFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V";
|
||||||
|
|
||||||
|
@Inject(method = RENDER, at = @At("HEAD"))
|
||||||
private <E extends Entity> void beforeRender(E entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo info) {
|
private <E extends Entity> void beforeRender(E entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo info) {
|
||||||
matrices.push();
|
matrices.push();
|
||||||
|
|
||||||
|
@ -46,7 +49,7 @@ abstract class MixinEntityRenderDispatcher {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "render(Lnet/minecraft/entity/Entity;DDDFFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"))
|
@Inject(method = RENDER, at = @At("HEAD"))
|
||||||
private <E extends Entity> void afterRender(E entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo info) {
|
private <E extends Entity> void afterRender(E entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo info) {
|
||||||
matrices.pop();
|
matrices.pop();
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,8 @@ import net.minecraft.client.input.KeyboardInput;
|
||||||
|
|
||||||
@Mixin(KeyboardInput.class)
|
@Mixin(KeyboardInput.class)
|
||||||
abstract class MixinKeyboardInput extends Input {
|
abstract class MixinKeyboardInput extends Input {
|
||||||
@Inject(method = "tick(ZZ)V", at = @At("RETURN"))
|
@Inject(method = "tick(Z)V", at = @At("RETURN"))
|
||||||
private void onTick(boolean one, boolean two, CallbackInfo info) {
|
private void onTick(boolean strafe, CallbackInfo info) {
|
||||||
Pony player = Pony.of(MinecraftClient.getInstance().player);
|
Pony player = Pony.of(MinecraftClient.getInstance().player);
|
||||||
|
|
||||||
if (player.getGravity().getGravitationConstant() < 0) {
|
if (player.getGravity().getGravitationConstant() < 0) {
|
||||||
|
|
|
@ -16,10 +16,11 @@ import net.minecraft.util.Hand;
|
||||||
import net.minecraft.util.hit.EntityHitResult;
|
import net.minecraft.util.hit.EntityHitResult;
|
||||||
|
|
||||||
@Mixin(MinecraftClient.class)
|
@Mixin(MinecraftClient.class)
|
||||||
public class MixinMinecraftClient {
|
abstract class MixinMinecraftClient {
|
||||||
@Redirect(method = "doItemPick()V", at = @At(
|
@Redirect(method = "doItemPick()V",
|
||||||
value = "INVOKE",
|
at = @At(value = "INVOKE",
|
||||||
target = "Lnet/minecraft/item/SpawnEggItem;forEntity(Lnet/minecraft/entity/EntityType;)Lnet/minecraft/item/SpawnEggItem;"))
|
target = "Lnet/minecraft/item/SpawnEggItem;forEntity(Lnet/minecraft/entity/EntityType;)Lnet/minecraft/item/SpawnEggItem;")
|
||||||
|
)
|
||||||
private SpawnEggItem redirectSpawnEggForEntity(EntityType<?> type) {
|
private SpawnEggItem redirectSpawnEggForEntity(EntityType<?> type) {
|
||||||
|
|
||||||
MinecraftClient self = MinecraftClient.getInstance();
|
MinecraftClient self = MinecraftClient.getInstance();
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package com.minelittlepony.unicopia.mixin.client;
|
package com.minelittlepony.unicopia.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -14,8 +13,6 @@ import net.minecraft.client.Mouse;
|
||||||
|
|
||||||
@Mixin(Mouse.class)
|
@Mixin(Mouse.class)
|
||||||
abstract class MixinMouse {
|
abstract class MixinMouse {
|
||||||
@Shadow
|
|
||||||
private @Final MinecraftClient client;
|
|
||||||
@Shadow
|
@Shadow
|
||||||
private double cursorDeltaX;
|
private double cursorDeltaX;
|
||||||
@Shadow
|
@Shadow
|
||||||
|
@ -23,7 +20,8 @@ abstract class MixinMouse {
|
||||||
|
|
||||||
@Inject(method = "updateMouse()V", at = @At("HEAD"))
|
@Inject(method = "updateMouse()V", at = @At("HEAD"))
|
||||||
private void onUpdateMouse(CallbackInfo info) {
|
private void onUpdateMouse(CallbackInfo info) {
|
||||||
if (Pony.of(client.player).getGravity().getGravitationConstant() < 0) {
|
Pony player = Pony.of(MinecraftClient.getInstance().player);
|
||||||
|
if (player != null&& player.getGravity().getGravitationConstant() < 0) {
|
||||||
cursorDeltaX = -cursorDeltaX;
|
cursorDeltaX = -cursorDeltaX;
|
||||||
cursorDeltaY = -cursorDeltaY;
|
cursorDeltaY = -cursorDeltaY;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,20 +4,23 @@
|
||||||
"package": "com.minelittlepony.unicopia.mixin",
|
"package": "com.minelittlepony.unicopia.mixin",
|
||||||
"refmap": "unicopia.client.mixin.refmap.json",
|
"refmap": "unicopia.client.mixin.refmap.json",
|
||||||
"compatibilityLevel": "JAVA_8",
|
"compatibilityLevel": "JAVA_8",
|
||||||
"main": [
|
"mixins": [
|
||||||
"MixinEntity",
|
"CriterionsRegistry",
|
||||||
"MixinFarmlandBlock",
|
"MixinFarmlandBlock",
|
||||||
"MixinHoeItem",
|
"MixinHoeItem",
|
||||||
"MixinItemEntity",
|
"MixinItemEntity",
|
||||||
"MixinPlayerEntity",
|
"MixinLivingEntity",
|
||||||
"MixinProjectileEntity",
|
"MixinPlayerEntity",
|
||||||
"Walker"
|
"MixinProjectileEntity",
|
||||||
|
"Walker"
|
||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
|
"client.DefaultTexturesRegistry",
|
||||||
"client.MixinCamera",
|
"client.MixinCamera",
|
||||||
"client.MixinEntityRenderDispatcher",
|
"client.MixinEntityRenderDispatcher",
|
||||||
"client.MixinGameRenderer",
|
"client.MixinGameRenderer",
|
||||||
"client.MixinKeyboardInput",
|
"client.MixinKeyboardInput",
|
||||||
|
"client.MixinMinecraftClient",
|
||||||
"client.MixinMouse"
|
"client.MixinMouse"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
|
|
Loading…
Reference in a new issue