Only interact with the datatracker after it's safe to do so

This commit is contained in:
Sollace 2024-02-27 00:01:22 +00:00
parent ba2e673de7
commit 9c71272def
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
13 changed files with 61 additions and 25 deletions

View file

@ -70,13 +70,17 @@ public class Creature extends Living<LivingEntity> implements WeaklyOwned.Mutabl
public Creature(LivingEntity entity) { public Creature(LivingEntity entity) {
super(entity, EFFECT); super(entity, EFFECT);
physics = new EntityPhysics<>(entity, GRAVITY); physics = new EntityPhysics<>(entity, GRAVITY);
addTicker(physics);
addTicker(this::updateConsumption);
}
@Override
public void initDataTracker() {
super.initDataTracker();
entity.getDataTracker().startTracking(MASTER, owner.toNBT()); entity.getDataTracker().startTracking(MASTER, owner.toNBT());
entity.getDataTracker().startTracking(EATING, 0); entity.getDataTracker().startTracking(EATING, 0);
entity.getDataTracker().startTracking(DISCORDED, false); entity.getDataTracker().startTracking(DISCORDED, false);
entity.getDataTracker().startTracking(SMITTEN, false); entity.getDataTracker().startTracking(SMITTEN, false);
addTicker(physics);
addTicker(this::updateConsumption);
} }
@Override @Override

View file

@ -28,16 +28,8 @@ public class EntityPhysics<T extends Entity> implements Physics, Copyable<Entity
private float lastGravity = 1; private float lastGravity = 1;
public EntityPhysics(T entity, TrackedData<Float> gravity) { public EntityPhysics(T entity, TrackedData<Float> gravity) {
this(entity, gravity, true);
}
public EntityPhysics(T entity, TrackedData<Float> gravity, boolean register) {
this.entity = entity; this.entity = entity;
this.gravity = gravity; this.gravity = gravity;
if (register) {
this.entity.getDataTracker().startTracking(gravity, 1F);
}
} }
@Override @Override

View file

@ -19,6 +19,8 @@ public interface Equine<T extends Entity> extends NbtSerialisable, Tickable, Pro
void setSpecies(Race race); void setSpecies(Race race);
void initDataTracker();
/** /**
* Called at the beginning of an update cycle. * Called at the beginning of an update cycle.
*/ */

View file

@ -41,8 +41,12 @@ public class ItemImpl implements Equine<ItemEntity> {
public ItemImpl(ItemEntity owner) { public ItemImpl(ItemEntity owner) {
this.entity = owner; this.entity = owner;
this.physics = new ItemPhysics(owner); this.physics = new ItemPhysics(owner);
owner.getDataTracker().startTracking(ITEM_GRAVITY, 1F); }
owner.getDataTracker().startTracking(ITEM_RACE, Race.REGISTRY.getId(Race.HUMAN).toString());
@Override
public void initDataTracker() {
entity.getDataTracker().startTracking(ITEM_GRAVITY, 1F);
entity.getDataTracker().startTracking(ITEM_RACE, Race.REGISTRY.getId(Race.HUMAN).toString());
} }
@Override @Override

View file

@ -4,7 +4,7 @@ import net.minecraft.entity.ItemEntity;
class ItemPhysics extends EntityPhysics<ItemEntity> { class ItemPhysics extends EntityPhysics<ItemEntity> {
public ItemPhysics(ItemEntity entity) { public ItemPhysics(ItemEntity entity) {
super(entity, ItemImpl.ITEM_GRAVITY, false); super(entity, ItemImpl.ITEM_GRAVITY);
} }
@Override @Override

View file

@ -111,12 +111,15 @@ public abstract class Living<T extends LivingEntity> implements Equine<T>, Caste
protected Living(T entity, TrackedData<NbtCompound> effect) { protected Living(T entity, TrackedData<NbtCompound> effect) {
this.entity = entity; this.entity = entity;
this.effectDelegate = new EffectSync(this, effect); this.effectDelegate = new EffectSync(this, effect);
this.sneakingHeuristic = addTicker(new Interactable(entity::isSneaking)); this.sneakingHeuristic = addTicker(new Interactable(entity::isSneaking));
this.landedHeuristic = addTicker(new Interactable(entity::isOnGround)); this.landedHeuristic = addTicker(new Interactable(entity::isOnGround));
this.jumpingHeuristic = addTicker(new Interactable(((LivingEntityDuck)entity)::isJumping)); this.jumpingHeuristic = addTicker(new Interactable(((LivingEntityDuck)entity)::isJumping));
}
entity.getDataTracker().startTracking(effect, new NbtCompound()); @Override
public void initDataTracker() {
effectDelegate.initDataTracker();
entity.getDataTracker().startTracking(Creature.GRAVITY, 1F);
entity.getDataTracker().startTracking(CARRIER_ID, Optional.empty()); entity.getDataTracker().startTracking(CARRIER_ID, Optional.empty());
} }

View file

@ -41,12 +41,13 @@ public class Acrobatics implements Tickable, NbtSerialisable {
public Acrobatics(Pony pony) { public Acrobatics(Pony pony) {
this.pony = pony; this.pony = pony;
this.entity = pony.asEntity(); this.entity = pony.asEntity();
entity.getDataTracker().startTracking(HANGING_POSITION, Optional.empty());
pony.addTicker(this::checkDislodge); pony.addTicker(this::checkDislodge);
} }
public void initDataTracker() {
entity.getDataTracker().startTracking(HANGING_POSITION, Optional.empty());
}
public boolean isImmobile() { public boolean isImmobile() {
return isFloppy() && entity.isOnGround(); return isFloppy() && entity.isOnGround();
} }

View file

@ -38,6 +38,10 @@ class ManaContainer implements MagicReserves, Tickable, NbtSerialisable, Copyabl
}); });
} }
public void initDataTracker() {
bars.values().forEach(BarInst::initDataTracker);
}
protected BarInst addBar(String name, BarInst bar) { protected BarInst addBar(String name, BarInst bar) {
bars.put(name, bar); bars.put(name, bar);
return bar; return bar;
@ -164,7 +168,12 @@ class ManaContainer implements MagicReserves, Tickable, NbtSerialisable, Copyabl
this.marker = marker; this.marker = marker;
this.max = max; this.max = max;
this.trailingValue = initial; this.trailingValue = initial;
pony.asEntity().getDataTracker().startTracking(marker, getMax() * initial); this.prevTrailingValue = initial;
this.prevValue = initial;
}
public void initDataTracker() {
pony.asEntity().getDataTracker().startTracking(marker, max * trailingValue);
} }
@Override @Override

View file

@ -21,7 +21,6 @@ class PlayerLevelStore implements Levelled.LevelStore {
this.dataEntry = dataEntry; this.dataEntry = dataEntry;
this.upgradeMana = upgradeMana; this.upgradeMana = upgradeMana;
this.levelUpSound = levelUpSound; this.levelUpSound = levelUpSound;
pony.asEntity().getDataTracker().startTracking(dataEntry, 0);
} }
@Override @Override

View file

@ -125,15 +125,23 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
this.corruption = new PlayerLevelStore(this, CORRUPTION, false, USounds.ENTITY_PLAYER_CORRUPTION); this.corruption = new PlayerLevelStore(this, CORRUPTION, false, USounds.ENTITY_PLAYER_CORRUPTION);
this.mana = addTicker(new ManaContainer(this)); this.mana = addTicker(new ManaContainer(this));
player.getDataTracker().startTracking(RACE, Race.DEFAULT_ID);
player.getDataTracker().startTracking(SUPPRESSED_RACE, Race.DEFAULT_ID);
addTicker(this::updateAnimations); addTicker(this::updateAnimations);
addTicker(this::updateBatPonyAbilities); addTicker(this::updateBatPonyAbilities);
addTicker(this::updateCorruptionDecay); addTicker(this::updateCorruptionDecay);
addTicker(new PlayerAttributes(this)); addTicker(new PlayerAttributes(this));
} }
@Override
public void initDataTracker() {
super.initDataTracker();
acrobatics.initDataTracker();
mana.initDataTracker();
entity.getDataTracker().startTracking(LEVEL, 0);
entity.getDataTracker().startTracking(CORRUPTION, 0);
entity.getDataTracker().startTracking(RACE, Race.DEFAULT_ID);
entity.getDataTracker().startTracking(SUPPRESSED_RACE, Race.DEFAULT_ID);
}
public static void registerAttributes(DefaultAttributeContainer.Builder builder) { public static void registerAttributes(DefaultAttributeContainer.Builder builder) {
builder.add(UEntityAttributes.EXTRA_MINING_SPEED); builder.add(UEntityAttributes.EXTRA_MINING_SPEED);
builder.add(UEntityAttributes.ENTITY_GRAVITY_MODIFIER); builder.add(UEntityAttributes.ENTITY_GRAVITY_MODIFIER);

View file

@ -19,12 +19,14 @@ import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.duck.EntityDuck; import com.minelittlepony.unicopia.entity.duck.EntityDuck;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity; import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.Entity.PositionUpdater; import net.minecraft.entity.Entity.PositionUpdater;
import net.minecraft.entity.Entity.RemovalReason; import net.minecraft.entity.Entity.RemovalReason;
import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluid;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.registry.tag.TagKey; import net.minecraft.registry.tag.TagKey;
import net.minecraft.world.World;
@Mixin(Entity.class) @Mixin(Entity.class)
abstract class MixinEntity implements EntityDuck { abstract class MixinEntity implements EntityDuck {
@ -64,6 +66,14 @@ abstract class MixinEntity implements EntityDuck {
return self.hasVehicle() && self.getVehicle() instanceof LavaAffine affine && affine.isLavaAffine(); return self.hasVehicle() && self.getVehicle() instanceof LavaAffine affine && affine.isLavaAffine();
} }
@Inject(method = "<init>", at = @At(value = "INVOKE", target = "net/minecraft/entity/Entity.initDataTracker()V"))
private void onInstanceInit(EntityType<?> type, World world, CallbackInfo info) {
if (this instanceof Equine.Container c) {
c.get().initDataTracker();
}
}
@Inject(method = "isFireImmune", at = @At("HEAD"), cancellable = true) @Inject(method = "isFireImmune", at = @At("HEAD"), cancellable = true)
private void onIsFireImmune(CallbackInfoReturnable<Boolean> info) { private void onIsFireImmune(CallbackInfoReturnable<Boolean> info) {
if (isLavaAffine() || (this instanceof Equine.Container c) && c.get().getCompositeRace().includes(Race.KIRIN)) { if (isLavaAffine() || (this instanceof Equine.Container c) && c.get().getCompositeRace().includes(Race.KIRIN)) {

View file

@ -43,6 +43,10 @@ public class EffectSync implements SpellContainer, NbtSerialisable {
this.param = param; this.param = param;
} }
public void initDataTracker() {
owner.asEntity().getDataTracker().startTracking(param, new NbtCompound());
}
public boolean tick(Situation situation) { public boolean tick(Situation situation) {
return tick(spell -> { return tick(spell -> {
if (spell.isDying()) { if (spell.isDying()) {

View file

@ -67,7 +67,7 @@ public class MagicProjectileEntity extends ThrownItemEntity implements Caster<Ma
private final EffectSync effectDelegate = new EffectSync(this, EFFECT); private final EffectSync effectDelegate = new EffectSync(this, EFFECT);
private final EntityPhysics<MagicProjectileEntity> physics = new EntityPhysics<>(this, GRAVITY, false); private final EntityPhysics<MagicProjectileEntity> physics = new EntityPhysics<>(this, GRAVITY);
private final EntityReference<Entity> homingTarget = new EntityReference<>(); private final EntityReference<Entity> homingTarget = new EntityReference<>();
private EntityReference<LivingEntity> owner; private EntityReference<LivingEntity> owner;