Move physics logic into the physics class and properly reset navigation/eye level when gravity changes

This commit is contained in:
Sollace 2021-02-23 19:02:23 +02:00
parent 8f75122d79
commit ca1fda7de2
7 changed files with 98 additions and 62 deletions

View file

@ -31,7 +31,7 @@ public class Creature extends Living<LivingEntity> {
public static void boostrap() {} public static void boostrap() {}
private final Physics physics = new EntityPhysics<>(this, GRAVITY); private final EntityPhysics<Creature> physics = new EntityPhysics<>(this, GRAVITY);
public Creature(LivingEntity entity) { public Creature(LivingEntity entity) {
super(entity, EFFECT); super(entity, EFFECT);
@ -52,6 +52,13 @@ public class Creature extends Living<LivingEntity> {
builder.add(PlayerAttributes.ENTITY_GRAVTY_MODIFIER); builder.add(PlayerAttributes.ENTITY_GRAVTY_MODIFIER);
} }
@Override
public void tick() {
super.tick();
physics.tick();
}
@Override @Override
public Race getSpecies() { public Race getSpecies() {
return Race.HUMAN; return Race.HUMAN;

View file

@ -10,21 +10,26 @@ import net.minecraft.block.BlockState;
import net.minecraft.block.FenceGateBlock; import net.minecraft.block.FenceGateBlock;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedData;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.particle.BlockStateParticleEffect; import net.minecraft.particle.BlockStateParticleEffect;
import net.minecraft.particle.ParticleTypes; import net.minecraft.particle.ParticleTypes;
import net.minecraft.tag.BlockTags; import net.minecraft.tag.BlockTags;
import net.minecraft.util.Tickable;
import net.minecraft.util.math.BlockPos; 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 EntityPhysics<T extends Owned<? extends Entity>> implements Physics, Copieable<EntityPhysics<T>> { public class EntityPhysics<T extends Owned<? extends Entity>> implements Physics, Copieable<EntityPhysics<T>>, Tickable {
private final TrackedData<Float> gravity; private final TrackedData<Float> gravity;
protected final T pony; protected final T pony;
private float lastGravity = 1;
public EntityPhysics(T pony, TrackedData<Float> gravity) { public EntityPhysics(T pony, TrackedData<Float> gravity) {
this(pony, gravity, true); this(pony, gravity, true);
} }
@ -38,6 +43,37 @@ public class EntityPhysics<T extends Owned<? extends Entity>> implements Physics
} }
} }
@Override
public void tick() {
Entity entity = pony.getMaster();
if (isGravityNegative()) {
if (entity.getY() > entity.world.getHeight() + 64) {
entity.damage(DamageSource.OUT_OF_WORLD, 4.0F);
}
entity.setOnGround(!entity.world.isAir(new BlockPos(entity.getX(), Math.floor(entity.getBoundingBox().maxY + 0.25), entity.getZ())));
}
float gravity = this.getGravityModifier();
if (gravity != lastGravity) {
lastGravity = gravity;
onGravitychanged();
}
}
protected void onGravitychanged() {
Entity entity = pony.getMaster();
entity.calculateDimensions();
if (!entity.world.isClient && entity instanceof MobEntity) {
((MobEntity)entity).getNavigation().stop();
((MobEntity)entity).setTarget(null);
}
}
@Override @Override
public boolean isFlying() { public boolean isFlying() {
return false; return false;
@ -135,4 +171,5 @@ public class EntityPhysics<T extends Owned<? extends Entity>> implements Physics
public void fromNBT(CompoundTag compound) { public void fromNBT(CompoundTag compound) {
setBaseGravityModifier(compound.getFloat("gravity")); setBaseGravityModifier(compound.getFloat("gravity"));
} }
} }

View file

@ -8,7 +8,6 @@ import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
import com.minelittlepony.unicopia.util.VecHelper; import com.minelittlepony.unicopia.util.VecHelper;
import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity; import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.MovementType; import net.minecraft.entity.MovementType;
import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.DataTracker;
@ -21,16 +20,15 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleEffect;
import net.minecraft.particle.ParticleTypes; import net.minecraft.particle.ParticleTypes;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.Tickable;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> { public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> {
private static final TrackedData<Integer> ITEM_RACE = DataTracker.registerData(ItemEntity.class, TrackedDataHandlerRegistry.INTEGER); private static final TrackedData<Integer> ITEM_RACE = DataTracker.registerData(ItemEntity.class, TrackedDataHandlerRegistry.INTEGER);
private static final TrackedData<Float> ITEM_GRAVITY = DataTracker.registerData(ItemEntity.class, TrackedDataHandlerRegistry.FLOAT); static final TrackedData<Float> ITEM_GRAVITY = DataTracker.registerData(ItemEntity.class, TrackedDataHandlerRegistry.FLOAT);
private final ItemEntity owner; private final ItemEntity owner;
private final ItemPhysics physics = new ItemPhysics(); private final ItemPhysics physics = new ItemPhysics(this);
private Race serverRace; private Race serverRace;
@ -141,49 +139,6 @@ public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> {
ActionResult onGroundTick(IItemEntity entity); ActionResult onGroundTick(IItemEntity entity);
} }
class ItemPhysics extends EntityPhysics<ItemImpl> implements Tickable {
private float serverGravity;
public ItemPhysics() {
super(ItemImpl.this, ITEM_GRAVITY, false);
}
@Override
public void tick() {
if (!owner.world.isClient) {
float gravity = getBaseGravityModifier();
if (gravity != serverGravity) {
serverGravity = gravity;
setBaseGravityModifier(gravity == 0 ? 1 : gravity * 2);
setBaseGravityModifier(gravity);
}
}
if (isGravityNegative() && !owner.getStack().isEmpty()) {
owner.setNoGravity(true);
owner.addVelocity(
0,
0.04
+ calcGravity(-0.04D), // apply our own
0
);
if (!owner.isOnGround()
|| Entity.squaredHorizontalLength(owner.getVelocity()) > 9.999999747378752E-6D) {
float above = 0.98f;
if (owner.verticalCollision) {
above *= owner.world.getBlockState(owner.getBlockPos().up()).getBlock().getSlipperiness();
//above /= 9;
}
owner.setVelocity(owner.getVelocity().multiply(above, 1, above));
}
}
}
}
public interface ClingyItem { public interface ClingyItem {
ClingyItem DEFAULT = stack -> { ClingyItem DEFAULT = stack -> {
return EnchantmentHelper.getLevel(UEnchantments.CLINGY, stack) > 0; return EnchantmentHelper.getLevel(UEnchantments.CLINGY, stack) > 0;

View file

@ -0,0 +1,48 @@
package com.minelittlepony.unicopia.entity;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity;
class ItemPhysics extends EntityPhysics<ItemImpl> {
public ItemPhysics(ItemImpl itemImpl) {
super(itemImpl, ItemImpl.ITEM_GRAVITY, false);
}
@Override
public void tick() {
super.tick();
ItemEntity owner = pony.getMaster();
if (isGravityNegative() && !owner.getStack().isEmpty()) {
owner.setNoGravity(true);
owner.addVelocity(
0,
0.04
+ calcGravity(-0.04D), // apply our own
0
);
if (!owner.isOnGround()
|| Entity.squaredHorizontalLength(owner.getVelocity()) > 9.999999747378752E-6D) {
float above = 0.98f;
if (owner.verticalCollision) {
above *= owner.world.getBlockState(owner.getBlockPos().up()).getBlock().getSlipperiness();
//above /= 9;
}
owner.setVelocity(owner.getVelocity().multiply(above, 1, above));
}
}
}
@Override
protected void onGravitychanged() {
if (!pony.getMaster().world.isClient) {
float gravity = this.getBaseGravityModifier();
setBaseGravityModifier(gravity == 0 ? 1 : gravity * 2);
setBaseGravityModifier(gravity);
}
}
}

View file

@ -19,7 +19,6 @@ import net.minecraft.entity.projectile.ProjectileEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
public abstract class Living<T extends LivingEntity> implements Equine<T>, Caster<T> { public abstract class Living<T extends LivingEntity> implements Equine<T>, Caster<T> {
@ -97,13 +96,6 @@ public abstract class Living<T extends LivingEntity> implements Equine<T>, Caste
prevSneaking = entity.isSneaking(); prevSneaking = entity.isSneaking();
prevLanded = entity.isOnGround(); prevLanded = entity.isOnGround();
if (getPhysics().isGravityNegative() && entity.getY() > entity.world.getHeight() + 64) {
entity.damage(DamageSource.OUT_OF_WORLD, 4.0F);
}
if (getPhysics().isGravityNegative()) {
entity.setOnGround(!entity.world.isAir(new BlockPos(entity.getX(), Math.floor(entity.getBoundingBox().maxY + 0.25), entity.getZ())));
}
enchants.tick(); enchants.tick();
} }

View file

@ -64,6 +64,8 @@ public class PlayerPhysics extends EntityPhysics<Pony> implements Tickable, Moti
@Override @Override
public void tick() { public void tick() {
super.tick();
if (wallHitCooldown > 0) { if (wallHitCooldown > 0) {
wallHitCooldown--; wallHitCooldown--;
} }

View file

@ -5,7 +5,6 @@ import java.util.Map;
import com.google.common.collect.HashMultimap; import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.minelittlepony.unicopia.AwaitTickQueue;
import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.Living;
import net.minecraft.enchantment.EnchantmentTarget; import net.minecraft.enchantment.EnchantmentTarget;
@ -44,7 +43,6 @@ public class AttributedEnchantment extends SimpleEnchantment {
instance.removeModifier(modifier.getId()); instance.removeModifier(modifier.getId());
instance.addPersistentModifier(modifier); instance.addPersistentModifier(modifier);
}); });
entity.calculateDimensions();
} }
} }
@ -57,9 +55,6 @@ public class AttributedEnchantment extends SimpleEnchantment {
instance.tryRemoveModifier(modifierSupplier.get(user, 1).getId()); instance.tryRemoveModifier(modifierSupplier.get(user, 1).getId());
}); });
user.getEnchants().remove(this); user.getEnchants().remove(this);
AwaitTickQueue.scheduleTask(entity.world, w -> {
entity.calculateDimensions();
}, 1);
} }
public void getModifiers(Living<?> user, int level, Map<EquipmentSlot, Multimap<EntityAttribute, EntityAttributeModifier>> output) { public void getModifiers(Living<?> user, int level, Map<EquipmentSlot, Multimap<EntityAttribute, EntityAttributeModifier>> output) {