diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java index dd6af2cc..b8c88516 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java @@ -64,7 +64,6 @@ public class ChangelingDisguiseAbility extends ChangelingFeedAbility { } player.calculateDimensions(); - iplayer.setDirty(); return true; } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ToggleFlightAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ToggleFlightAbility.java index caa3c701..66aa0050 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ToggleFlightAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ToggleFlightAbility.java @@ -65,7 +65,6 @@ public class ToggleFlightAbility implements Ability { } else { player.getPhysics().cancelFlight(true); } - player.setDirty(); player.setAnimation(Animation.SPREAD_WINGS, Animation.Recipient.ANYONE); return true; } diff --git a/src/main/java/com/minelittlepony/unicopia/command/GravityCommand.java b/src/main/java/com/minelittlepony/unicopia/command/GravityCommand.java index c5249dcb..a97272e9 100644 --- a/src/main/java/com/minelittlepony/unicopia/command/GravityCommand.java +++ b/src/main/java/com/minelittlepony/unicopia/command/GravityCommand.java @@ -48,7 +48,6 @@ class GravityCommand { static int set(ServerCommandSource source, Collection targets, float gravity, boolean isSelf) { List affected = targets.stream().map(Living::living).filter(Objects::nonNull).map(l -> { l.getPhysics().setBaseGravityModifier(gravity); - l.setDirty(); if (l.asEntity() instanceof PlayerEntity player) { if (source.getEntity() == player) { player.sendMessage(Text.translatable("commands.gravity.set.self", gravity)); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index 0ea9bc46..f5c82baf 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -31,7 +31,6 @@ import com.minelittlepony.unicopia.input.Interactable; import com.minelittlepony.unicopia.item.GlassesItem; import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; -import com.minelittlepony.unicopia.network.datasync.Transmittable; import com.minelittlepony.unicopia.network.track.DataTracker; import com.minelittlepony.unicopia.network.track.DataTrackerManager; import com.minelittlepony.unicopia.network.track.Trackable; @@ -74,7 +73,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -public abstract class Living implements Equine, Caster, Transmittable { +public abstract class Living implements Equine, Caster { protected final T entity; private final SpellInventory spells; @@ -479,9 +478,6 @@ public abstract class Living implements Equine, Caste return MathHelper.clamp(level / (float)maxLevel, 0, 1); } - @Override - public void setDirty() {} - @Override public void toNBT(NbtCompound compound) { enchants.toNBT(compound); @@ -498,12 +494,10 @@ public abstract class Living implements Equine, Caste fromSynchronizedNbt(compound); } - @Override public void toSyncronisedNbt(NbtCompound compound) { compound.put("armour", armour.toNBT()); } - @Override public void fromSynchronizedNbt(NbtCompound compound) { armour.fromNBT(compound.getCompound("armour")); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java index 2721193c..836ce227 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -232,9 +232,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickab entity.calculateDimensions(); } - if (!pony.isClient()) { - pony.setDirty(); - } + pony.setDirty(); } public double getHorizontalMotion() { @@ -621,6 +619,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickab thrustScale = 0; descentRate = 0; entity.calculateDimensions(); + pony.setDirty(); if (entity.isOnGround() || !force) { //BlockState steppingState = pony.asEntity().getSteppingBlockState(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index b5f18c77..c876668e 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -175,6 +175,7 @@ public class Pony extends Living implements Copyable, Update animation.animation().getSound().ifPresent(sound -> { playSound(sound, sound == USounds.ENTITY_PLAYER_WOLOLO ? 0.1F : 0.9F, 1); }); + setDirty(); } } @@ -314,7 +315,7 @@ public class Pony extends Living implements Copyable, Update return getSpecies().getAffinity(); } - @Override + @Deprecated public void setDirty() { dirty = true; } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java index 5c390078..79cfab5b 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java @@ -1,17 +1,12 @@ package com.minelittlepony.unicopia.network; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.util.serialization.PacketCodec; import com.sollace.fabwork.api.packets.HandledPacket; -import io.netty.buffer.ByteBufInputStream; -import io.netty.buffer.ByteBufOutputStream; import net.minecraft.network.PacketByteBuf; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtIo; /** * Sent to the client to update various data pertaining to a particular player. @@ -26,11 +21,7 @@ public class MsgPlayerCapabilities implements HandledPacket { MsgPlayerCapabilities(PacketByteBuf buffer) { playerId = buffer.readInt(); - try (InputStream in = new ByteBufInputStream(buffer)) { - compoundTag = NbtIo.readCompressed(in); - } catch (IOException e) { - throw new RuntimeException(e); - } + compoundTag = PacketCodec.COMPRESSED_NBT.read(buffer); } public MsgPlayerCapabilities(Pony player) { @@ -42,10 +33,7 @@ public class MsgPlayerCapabilities implements HandledPacket { @Override public void toBuffer(PacketByteBuf buffer) { buffer.writeInt(playerId); - try (OutputStream out = new ByteBufOutputStream(buffer)) { - NbtIo.writeCompressed(compoundTag, out); - } catch (IOException e) { - } + PacketCodec.COMPRESSED_NBT.write(buffer, compoundTag); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/network/datasync/Transmittable.java b/src/main/java/com/minelittlepony/unicopia/network/datasync/Transmittable.java deleted file mode 100644 index 8895bd77..00000000 --- a/src/main/java/com/minelittlepony/unicopia/network/datasync/Transmittable.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.minelittlepony.unicopia.network.datasync; - -import net.minecraft.nbt.NbtCompound; - -public interface Transmittable { - void setDirty(); - - void toSyncronisedNbt(NbtCompound compound); - - void fromSynchronizedNbt(NbtCompound compound); -} diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java b/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java index 517dccd9..22e9335d 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.network.track; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import org.jetbrains.annotations.Nullable; +import java.util.Optional; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -75,30 +75,31 @@ public class DataTracker { } } - synchronized void getInitialPairs(List output) { + synchronized Optional getInitialPairs() { + initial = false; + dirtyIndices = new IntOpenHashSet(); updateTrackables(); - output.add(new MsgTrackedValues.TrackerEntries(id, true, codecs)); + return Optional.of(new MsgTrackedValues.TrackerEntries(id, true, codecs)); } - @Nullable - synchronized void getDirtyPairs(List output) { + synchronized Optional getDirtyPairs() { if (initial) { - initial = false; - dirtyIndices = new IntOpenHashSet(); - getInitialPairs(output); - } else { - updateTrackables(); - - if (!dirtyIndices.isEmpty()) { - IntSet toSend = dirtyIndices; - dirtyIndices = new IntOpenHashSet(); - List> pairs = new ArrayList<>(); - for (int i : toSend) { - pairs.add(codecs.get(i)); - } - output.add(new MsgTrackedValues.TrackerEntries(id, false, pairs)); - } + return getInitialPairs(); } + + updateTrackables(); + + if (dirtyIndices.isEmpty()) { + return Optional.empty(); + } + + IntSet toSend = dirtyIndices; + dirtyIndices = new IntOpenHashSet(); + List> pairs = new ArrayList<>(); + for (int i : toSend) { + pairs.add(codecs.get(i)); + } + return Optional.of(new MsgTrackedValues.TrackerEntries(id, false, pairs)); } synchronized void load(MsgTrackedValues.TrackerEntries values) { diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java b/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java index f2058a78..3b199346 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java @@ -1,7 +1,7 @@ package com.minelittlepony.unicopia.network.track; -import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Supplier; @@ -19,7 +19,6 @@ public class DataTrackerManager { final boolean isClient; private final List trackers = new ObjectArrayList<>(); private final List> objectTrackers = new ObjectArrayList<>(); - private final List packetEmitters = new ObjectArrayList<>(); @Nullable @@ -44,12 +43,32 @@ public class DataTrackerManager { public synchronized DataTracker checkoutTracker() { DataTracker tracker = new DataTracker(this, trackers.size()); trackers.add(tracker); + packetEmitters.add((sender, initial) -> { + var update = initial ? tracker.getInitialPairs() : tracker.getDirtyPairs(); + if (update.isPresent()) { + sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(new MsgTrackedValues( + entity.getId(), + Optional.empty(), + update + ))); + } + }); return tracker; } public synchronized ObjectTracker checkoutTracker(Supplier objFunction) { ObjectTracker tracker = new ObjectTracker<>(objectTrackers.size(), objFunction); objectTrackers.add(tracker); + packetEmitters.add((sender, initial) -> { + var update = initial ? tracker.getInitialPairs() : tracker.getDirtyPairs(); + if (update.isPresent()) { + sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(new MsgTrackedValues( + entity.getId(), + update, + Optional.empty() + ))); + } + }); return tracker; } @@ -58,25 +77,6 @@ public class DataTrackerManager { for (var emitter : packetEmitters) { emitter.sendPackets(sender, false); } - - if (trackers.isEmpty() && objectTrackers.isEmpty()) { - return; - } - - List toTransmit = new ArrayList<>(); - List objToTransmit = new ArrayList<>(); - - for (var entry : trackers) entry.getDirtyPairs(toTransmit); - for (var entry : objectTrackers) entry.getDirtyPairs(objToTransmit); - - if (!toTransmit.isEmpty() || !objToTransmit.isEmpty()) { - MsgTrackedValues packet = new MsgTrackedValues( - entity.getId(), - objToTransmit, - toTransmit - ); - sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(packet)); - } } } @@ -86,41 +86,22 @@ public class DataTrackerManager { for (var emitter : packetEmitters) { emitter.sendPackets((Consumer)sender, true); } - - if (trackers.isEmpty() && objectTrackers.isEmpty()) { - return; - } - - List toTransmit = new ArrayList<>(); - List objToTransmit = new ArrayList<>(); - - for (var entry : trackers) entry.getInitialPairs(toTransmit); - for (var entry : objectTrackers) entry.getInitialPairs(objToTransmit); - - if (!toTransmit.isEmpty() || !objToTransmit.isEmpty()) { - MsgTrackedValues packet = new MsgTrackedValues( - entity.getId(), - objToTransmit, - toTransmit - ); - sender.accept(Channel.SERVER_TRACKED_ENTITY_DATA.toPacket(packet)); - } } } synchronized void load(MsgTrackedValues packet) { - for (var update : packet.updatedTrackers()) { + packet.updatedTrackers().ifPresent(update -> { DataTracker tracker = trackers.get(update.id()); if (tracker != null) { tracker.load(update); } - } - for (var update : packet.updatedObjects()) { + }); + packet.updatedObjects().ifPresent(update -> { ObjectTracker tracker = objectTrackers.get(update.id()); if (tracker != null) { tracker.load(update); } - } + }); } public interface PacketEmitter { diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java b/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java index 2a2800fb..a8483855 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java @@ -5,9 +5,11 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; +import com.minelittlepony.unicopia.util.serialization.PacketCodec; import com.sollace.fabwork.api.packets.HandledPacket; import net.minecraft.entity.Entity; @@ -17,22 +19,22 @@ import net.minecraft.network.PacketByteBuf; public record MsgTrackedValues( int owner, - List updatedObjects, - List updatedTrackers + Optional updatedObjects, + Optional updatedTrackers ) implements HandledPacket { public MsgTrackedValues(PacketByteBuf buffer) { this( buffer.readInt(), - buffer.readCollection(ArrayList::new, TrackerObjects::new), - buffer.readCollection(ArrayList::new, TrackerEntries::new) + buffer.readOptional(TrackerObjects::new), + buffer.readOptional(TrackerEntries::new) ); } @Override public void toBuffer(PacketByteBuf buffer) { buffer.writeInt(owner); - buffer.writeCollection(updatedObjects, (buf, obj) -> obj.write(buf)); - buffer.writeCollection(updatedTrackers, (buf, tracker) -> tracker.write(buf)); + buffer.writeOptional(updatedObjects, (buf, obj) -> obj.write(buf)); + buffer.writeOptional(updatedTrackers, (buf, tracker) -> tracker.write(buf)); } @Override @@ -48,14 +50,15 @@ public record MsgTrackedValues( this( buffer.readInt(), buffer.readCollection(HashSet::new, PacketByteBuf::readUuid), - buffer.readMap(HashMap::new, PacketByteBuf::readUuid, PacketByteBuf::readNbt) + buffer.readMap(HashMap::new, PacketByteBuf::readUuid, PacketCodec.NBT::read) ); + } public void write(PacketByteBuf buffer) { buffer.writeInt(id); buffer.writeCollection(removedValues, PacketByteBuf::writeUuid); - buffer.writeMap(values, PacketByteBuf::writeUuid, PacketByteBuf::writeNbt); + buffer.writeMap(values, PacketByteBuf::writeUuid, PacketCodec.NBT::write); } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java b/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java index b6e3ec57..6a1e6005 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java @@ -3,8 +3,8 @@ package com.minelittlepony.unicopia.network.track; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.function.Supplier; @@ -73,18 +73,20 @@ public class ObjectTracker implements NbtSerialisable quickAccess = Map.copyOf(trackedObjects); } - synchronized void getInitialPairs(List output) { - if (!trackedObjects.isEmpty()) { - Map trackableCompounds = new HashMap<>(); - quickAccess.entrySet().forEach(object -> { - trackableCompounds.put(object.getKey(), object.getValue().toTrackedNbt()); - }); - - output.add(new MsgTrackedValues.TrackerObjects(id, Set.of(), trackableCompounds)); + synchronized Optional getInitialPairs() { + if (trackedObjects.isEmpty()) { + return Optional.empty(); } + + Map trackableCompounds = new HashMap<>(); + quickAccess.entrySet().forEach(object -> { + trackableCompounds.put(object.getKey(), object.getValue().toTrackedNbt()); + }); + + return Optional.of(new MsgTrackedValues.TrackerObjects(id, Set.of(), trackableCompounds)); } - synchronized void getDirtyPairs(List output) { + synchronized Optional getDirtyPairs() { if (!trackedObjects.isEmpty()) { Map trackableCompounds = new HashMap<>(); Set removedTrackableObjects = new HashSet<>(); @@ -100,9 +102,11 @@ public class ObjectTracker implements NbtSerialisable quickAccess = Map.copyOf(trackedObjects); if (!trackableCompounds.isEmpty() || !removedTrackableObjects.isEmpty()) { - output.add(new MsgTrackedValues.TrackerObjects(id, removedTrackableObjects, trackableCompounds)); + return Optional.of(new MsgTrackedValues.TrackerObjects(id, removedTrackableObjects, trackableCompounds)); } } + + return Optional.empty(); } synchronized void load(MsgTrackedValues.TrackerObjects objects) { diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/TrackableDataType.java b/src/main/java/com/minelittlepony/unicopia/network/track/TrackableDataType.java index 620edcca..e106081f 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/TrackableDataType.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/TrackableDataType.java @@ -22,6 +22,7 @@ public record TrackableDataType(int id, PacketCodec codec) { public static final TrackableDataType BOOLEAN = of(new Identifier("boolean"), PacketCodec.BOOLEAN); public static final TrackableDataType UUID = of(new Identifier("uuid"), PacketCodec.UUID); public static final TrackableDataType NBT = of(new Identifier("nbt"), PacketCodec.NBT); + public static final TrackableDataType COMPRESSED_NBT = of(new Identifier("compressed_nbt"), PacketCodec.COMPRESSED_NBT); public static final TrackableDataType> OPTIONAL_POS = of(new Identifier("optional_pos"), PacketCodec.OPTIONAL_POS); public static final TrackableDataType RACE = TrackableDataType.of(Unicopia.id("race"), PacketCodec.ofRegistry(Race.REGISTRY)); diff --git a/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodec.java b/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodec.java index a20a6b51..b4674ba1 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodec.java +++ b/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodec.java @@ -1,5 +1,8 @@ package com.minelittlepony.unicopia.util.serialization; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.util.Optional; import java.util.UUID; import java.util.function.BiConsumer; @@ -7,7 +10,10 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtIo; import net.minecraft.network.PacketByteBuf; import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; @@ -27,6 +33,18 @@ public record PacketCodec(PacketByteBuf.PacketReader reader, PacketByteBuf public static final PacketCodec IDENTIFIER = STRING.xMap(Identifier::new, Identifier::toString); public static final PacketCodec NBT = new PacketCodec<>(PacketByteBuf::readNbt, PacketByteBuf::writeNbt); + public static final PacketCodec COMPRESSED_NBT = new PacketCodec<>(buffer -> { + try (InputStream in = new ByteBufInputStream(buffer)) { + return NbtIo.readCompressed(in); + } catch (IOException e) { + throw new RuntimeException(e); + } + }, (buffer, nbt) -> { + try (OutputStream out = new ByteBufOutputStream(buffer)) { + NbtIo.writeCompressed(nbt, out); + } catch (IOException e) { + } + }); public static final PacketCodec POS = new PacketCodec<>(PacketByteBuf::readBlockPos, PacketByteBuf::writeBlockPos); public static final PacketCodec> OPTIONAL_POS = POS.asOptional();