mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-12 16:14:24 +01:00
Items dropped by batponies whilst hanging from the ceiling no longer copy their gravity
This commit is contained in:
parent
97fa83e42a
commit
077f0b8987
4 changed files with 33 additions and 23 deletions
|
@ -26,9 +26,6 @@ public class PlayerAttributes implements Tickable {
|
||||||
private static final EntityAttributeModifier PEGASUS_REACH =
|
private static final EntityAttributeModifier PEGASUS_REACH =
|
||||||
new EntityAttributeModifier(UUID.fromString("707b50a8-03e8-40f4-8553-ecf67025fd6d"), "Pegasus Reach", 1.5, Operation.ADDITION);
|
new EntityAttributeModifier(UUID.fromString("707b50a8-03e8-40f4-8553-ecf67025fd6d"), "Pegasus Reach", 1.5, Operation.ADDITION);
|
||||||
|
|
||||||
public static final EntityAttributeModifier BAT_HANGING =
|
|
||||||
new EntityAttributeModifier(UUID.fromString("a54f2595-521e-480b-b9d5-6e750577a564"), "Bat Pony Hanging", -2, Operation.MULTIPLY_TOTAL);
|
|
||||||
|
|
||||||
public static final UUID HEALTH_SWAPPING_MODIFIER_ID = UUID.fromString("7b93803e-4b25-11ed-951e-00155d43e0a2");
|
public static final UUID HEALTH_SWAPPING_MODIFIER_ID = UUID.fromString("7b93803e-4b25-11ed-951e-00155d43e0a2");
|
||||||
|
|
||||||
public static EntityAttributeModifier healthChange(float addition) {
|
public static EntityAttributeModifier healthChange(float addition) {
|
||||||
|
|
|
@ -79,6 +79,19 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
|
||||||
return dimensions;
|
return dimensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final float getPersistantGravityModifier() {
|
||||||
|
return super.getGravityModifier();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getGravityModifier() {
|
||||||
|
float modifier = getPersistantGravityModifier();
|
||||||
|
if (pony.isHanging()) {
|
||||||
|
modifier *= -0.05F;
|
||||||
|
}
|
||||||
|
return modifier;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isFlying() {
|
public boolean isFlying() {
|
||||||
return isFlyingSurvival && !entity.isFallFlying() && !entity.hasVehicle();
|
return isFlyingSurvival && !entity.isFallFlying() && !entity.hasVehicle();
|
||||||
|
|
|
@ -40,7 +40,6 @@ import com.mojang.authlib.GameProfile;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.entity.*;
|
import net.minecraft.entity.*;
|
||||||
import net.minecraft.entity.attribute.DefaultAttributeContainer;
|
import net.minecraft.entity.attribute.DefaultAttributeContainer;
|
||||||
import net.minecraft.entity.attribute.EntityAttributeInstance;
|
|
||||||
import net.minecraft.entity.damage.DamageSource;
|
import net.minecraft.entity.damage.DamageSource;
|
||||||
import net.minecraft.entity.damage.EntityDamageSource;
|
import net.minecraft.entity.damage.EntityDamageSource;
|
||||||
import net.minecraft.entity.data.DataTracker;
|
import net.minecraft.entity.data.DataTracker;
|
||||||
|
@ -65,6 +64,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
static final TrackedData<Float> ENERGY = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
static final TrackedData<Float> ENERGY = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
||||||
static final TrackedData<Float> EXHAUSTION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
static final TrackedData<Float> EXHAUSTION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
||||||
static final TrackedData<Float> EXERTION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
static final TrackedData<Float> EXERTION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
||||||
|
static final TrackedData<Optional<BlockPos>> HANGING_POSITION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.OPTIONAL_BLOCK_POS);
|
||||||
static final TrackedData<Float> MANA = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
static final TrackedData<Float> MANA = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
||||||
static final TrackedData<Float> XP = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
static final TrackedData<Float> XP = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT);
|
||||||
static final TrackedData<Integer> LEVEL = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.INTEGER);
|
static final TrackedData<Integer> LEVEL = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.INTEGER);
|
||||||
|
@ -92,7 +92,6 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
private boolean dirty;
|
private boolean dirty;
|
||||||
private boolean speciesPersisted;
|
private boolean speciesPersisted;
|
||||||
|
|
||||||
private Optional<BlockPos> hangingPosition = Optional.empty();
|
|
||||||
private int ticksHanging;
|
private int ticksHanging;
|
||||||
|
|
||||||
private float magicExhaustion = 0;
|
private float magicExhaustion = 0;
|
||||||
|
@ -118,6 +117,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
this.tickers = Lists.newArrayList(gravity, mana, attributes);
|
this.tickers = Lists.newArrayList(gravity, mana, attributes);
|
||||||
|
|
||||||
player.getDataTracker().startTracking(RACE, Race.DEFAULT_ID);
|
player.getDataTracker().startTracking(RACE, Race.DEFAULT_ID);
|
||||||
|
player.getDataTracker().startTracking(HANGING_POSITION, Optional.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void registerAttributes(DefaultAttributeContainer.Builder builder) {
|
public static void registerAttributes(DefaultAttributeContainer.Builder builder) {
|
||||||
|
@ -329,31 +329,27 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<BlockPos> getHangingPosition() {
|
||||||
|
return entity.getDataTracker().get(HANGING_POSITION);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isHanging() {
|
public boolean isHanging() {
|
||||||
return entity.getAttributeInstance(UEntityAttributes.ENTITY_GRAVTY_MODIFIER).hasModifier(PlayerAttributes.BAT_HANGING);
|
return getHangingPosition().isPresent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stopHanging() {
|
public void stopHanging() {
|
||||||
entity.getAttributeInstance(UEntityAttributes.ENTITY_GRAVTY_MODIFIER).removeModifier(PlayerAttributes.BAT_HANGING);
|
entity.getDataTracker().set(HANGING_POSITION, Optional.empty());
|
||||||
entity.calculateDimensions();
|
entity.calculateDimensions();
|
||||||
ticksHanging = 0;
|
ticksHanging = 0;
|
||||||
hangingPosition = Optional.empty();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startHanging(BlockPos pos) {
|
public void startHanging(BlockPos pos) {
|
||||||
hangingPosition = Optional.of(pos);
|
entity.getDataTracker().set(HANGING_POSITION, Optional.of(pos));
|
||||||
EntityAttributeInstance attr = entity.getAttributeInstance(UEntityAttributes.ENTITY_GRAVTY_MODIFIER);
|
|
||||||
|
|
||||||
if (!attr.hasModifier(PlayerAttributes.BAT_HANGING)) {
|
|
||||||
attr.addPersistentModifier(PlayerAttributes.BAT_HANGING);
|
|
||||||
}
|
|
||||||
entity.teleport(pos.getX() + 0.5, pos.getY() - 1, pos.getZ() + 0.5);
|
entity.teleport(pos.getX() + 0.5, pos.getY() - 1, pos.getZ() + 0.5);
|
||||||
entity.setVelocity(Vec3d.ZERO);
|
entity.setVelocity(Vec3d.ZERO);
|
||||||
entity.setSneaking(false);
|
entity.setSneaking(false);
|
||||||
entity.stopFallFlying();
|
entity.stopFallFlying();
|
||||||
getPhysics().cancelFlight(true);
|
getPhysics().cancelFlight(true);
|
||||||
|
|
||||||
setDirty();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canHangAt(BlockPos pos) {
|
public boolean canHangAt(BlockPos pos) {
|
||||||
|
@ -379,7 +375,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
|
|
||||||
if (isHanging()) {
|
if (isHanging()) {
|
||||||
((LivingEntityDuck)entity).setLeaningPitch(0);
|
((LivingEntityDuck)entity).setLeaningPitch(0);
|
||||||
if (!isClient() && (getObservedSpecies() != Race.BAT || (ticksHanging++ > 2 && hangingPosition.filter(getOrigin().down()::equals).filter(this::canHangAt).isEmpty()))) {
|
if (!isClient() && (getObservedSpecies() != Race.BAT || (ticksHanging++ > 2 && getHangingPosition().filter(getOrigin().down()::equals).filter(this::canHangAt).isEmpty()))) {
|
||||||
stopHanging();
|
stopHanging();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -452,6 +448,13 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onDropItem(ItemEntity itemDropped) {
|
||||||
|
Equine.of(itemDropped).ifPresent(eq -> {
|
||||||
|
eq.setSpecies(getSpecies());
|
||||||
|
eq.getPhysics().setBaseGravityModifier(gravity.getPersistantGravityModifier());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public Optional<Float> onImpact(float distance, float damageMultiplier, DamageSource cause) {
|
public Optional<Float> onImpact(float distance, float damageMultiplier, DamageSource cause) {
|
||||||
|
|
||||||
float originalDistance = distance;
|
float originalDistance = distance;
|
||||||
|
@ -556,7 +559,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
compound.putString("playerSpecies", Race.REGISTRY.getId(getActualSpecies()).toString());
|
compound.putString("playerSpecies", Race.REGISTRY.getId(getActualSpecies()).toString());
|
||||||
compound.putFloat("magicExhaustion", magicExhaustion);
|
compound.putFloat("magicExhaustion", magicExhaustion);
|
||||||
compound.putInt("ticksHanging", ticksHanging);
|
compound.putInt("ticksHanging", ticksHanging);
|
||||||
BLOCK_POS.writeOptional("hangingPosition", compound, hangingPosition);
|
BLOCK_POS.writeOptional("hangingPosition", compound, getHangingPosition());
|
||||||
compound.putInt("ticksInSun", ticksInSun);
|
compound.putInt("ticksInSun", ticksInSun);
|
||||||
compound.putBoolean("hasShades", hasShades);
|
compound.putBoolean("hasShades", hasShades);
|
||||||
compound.put("powers", powers.toNBT());
|
compound.put("powers", powers.toNBT());
|
||||||
|
@ -589,7 +592,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
|
|
||||||
magicExhaustion = compound.getFloat("magicExhaustion");
|
magicExhaustion = compound.getFloat("magicExhaustion");
|
||||||
ticksHanging = compound.getInt("ticksHanging");
|
ticksHanging = compound.getInt("ticksHanging");
|
||||||
hangingPosition = NbtSerialisable.BLOCK_POS.readOptional("hangingPosition", compound);
|
entity.getDataTracker().set(HANGING_POSITION, NbtSerialisable.BLOCK_POS.readOptional("hangingPosition", compound));
|
||||||
ticksInSun = compound.getInt("ticksInSun");
|
ticksInSun = compound.getInt("ticksInSun");
|
||||||
hasShades = compound.getBoolean("hasShades");
|
hasShades = compound.getBoolean("hasShades");
|
||||||
|
|
||||||
|
|
|
@ -77,10 +77,7 @@ abstract class MixinPlayerEntity extends LivingEntity implements PonyContainer<P
|
||||||
@Inject(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;",
|
@Inject(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;",
|
||||||
at = @At("RETURN"))
|
at = @At("RETURN"))
|
||||||
private void onDropItem(ItemStack itemStack_1, boolean scatter, boolean retainOwnership, CallbackInfoReturnable<ItemEntity> info) {
|
private void onDropItem(ItemStack itemStack_1, boolean scatter, boolean retainOwnership, CallbackInfoReturnable<ItemEntity> info) {
|
||||||
Equine.of(info.getReturnValue()).ifPresent(eq -> {
|
get().onDropItem(info.getReturnValue());
|
||||||
eq.setSpecies(get().getSpecies());
|
|
||||||
eq.getPhysics().setBaseGravityModifier(get().getPhysics().getGravityModifier());
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "getActiveEyeHeight(Lnet/minecraft/entity/EntityPose;Lnet/minecraft/entity/EntityDimensions;)F",
|
@Inject(method = "getActiveEyeHeight(Lnet/minecraft/entity/EntityPose;Lnet/minecraft/entity/EntityDimensions;)F",
|
||||||
|
|
Loading…
Reference in a new issue