diff --git a/leaf-server/minecraft-patches/features/0166-Multithreaded-Tracker.patch b/leaf-server/minecraft-patches/features/0166-Multithreaded-Tracker.patch index 15ef82a7..231df83c 100644 --- a/leaf-server/minecraft-patches/features/0166-Multithreaded-Tracker.patch +++ b/leaf-server/minecraft-patches/features/0166-Multithreaded-Tracker.patch @@ -616,7 +616,7 @@ index f106373ef3ac4a8685c2939c9e8361688a285913..7df467924d029d6e42b1d0b039cb9272 if (!this.players.isEmpty()) { for (ServerPlayer serverPlayer : Lists.newArrayList(this.players)) { diff --git a/net/minecraft/server/level/ServerEntity.java b/net/minecraft/server/level/ServerEntity.java -index 0dee18df07c979da6125a4e7a955343e44d67ac2..dae07c6c31949c75c810c9260232cccc8160b606 100644 +index 0dee18df07c979da6125a4e7a955343e44d67ac2..f033849629518a2afb60cf5bbf3de5ae7a0ae84c 100644 --- a/net/minecraft/server/level/ServerEntity.java +++ b/net/minecraft/server/level/ServerEntity.java @@ -57,11 +57,13 @@ public class ServerEntity { @@ -641,7 +641,7 @@ index 0dee18df07c979da6125a4e7a955343e44d67ac2..dae07c6c31949c75c810c9260232cccc this.positionCodec.setBase(entity.trackingPosition()); this.lastSentMovement = entity.getDeltaMovement(); this.lastSentYRot = Mth.packDegrees(entity.getYRot()); -@@ -105,204 +108,415 @@ public class ServerEntity { +@@ -105,204 +108,413 @@ public class ServerEntity { // Paper start - fix desync when a player is added to the tracker private boolean forceStateResync; @@ -1044,9 +1044,7 @@ index 0dee18df07c979da6125a4e7a955343e44d67ac2..dae07c6c31949c75c810c9260232cccc + + this.tickCount++; + if (this.entity.hurtMarked) { -+ if (this.entity instanceof ServerPlayer serverPlayer) { -+ ctx.playerVelocity(serverPlayer); -+ } else { ++ if (!(this.entity instanceof ServerPlayer)) { + this.entity.hurtMarked = false; + trackedEntity.leafBroadcastAndSend(ctx, new ClientboundSetEntityMotionPacket(this.entity)); + } @@ -1057,7 +1055,7 @@ index 0dee18df07c979da6125a4e7a955343e44d67ac2..dae07c6c31949c75c810c9260232cccc private Stream mountedOrDismounted(List entities) { return Streams.concat( this.lastPassengers.stream().filter(entity -> !entities.contains(entity)), -@@ -356,6 +570,39 @@ public class ServerEntity { +@@ -356,6 +568,39 @@ public class ServerEntity { this.positionCodec.setBase(this.entity.position()); } @@ -1097,7 +1095,7 @@ index 0dee18df07c979da6125a4e7a955343e44d67ac2..dae07c6c31949c75c810c9260232cccc public void removePairing(ServerPlayer player) { this.entity.stopSeenByPlayer(player); player.connection.send(new ClientboundRemoveEntitiesPacket(this.entity.getId())); -@@ -368,8 +615,23 @@ public class ServerEntity { +@@ -368,8 +613,23 @@ public class ServerEntity { this.entity.startSeenByPlayer(player); } @@ -1121,7 +1119,7 @@ index 0dee18df07c979da6125a4e7a955343e44d67ac2..dae07c6c31949c75c810c9260232cccc // CraftBukkit start - Remove useless error spam, just return // LOGGER.warn("Fetching packet for removed entity {}", this.entity); return; -@@ -407,7 +669,7 @@ public class ServerEntity { +@@ -407,7 +667,7 @@ public class ServerEntity { if (!list.isEmpty()) { consumer.accept(new ClientboundSetEquipmentPacket(this.entity.getId(), list, true)); // Paper - data sanitization } @@ -1130,7 +1128,7 @@ index 0dee18df07c979da6125a4e7a955343e44d67ac2..dae07c6c31949c75c810c9260232cccc } if (!this.entity.getPassengers().isEmpty()) { -@@ -443,6 +705,7 @@ public class ServerEntity { +@@ -443,6 +703,7 @@ public class ServerEntity { return Mth.unpackDegrees(this.lastSentYHeadRot); } @@ -1138,7 +1136,7 @@ index 0dee18df07c979da6125a4e7a955343e44d67ac2..dae07c6c31949c75c810c9260232cccc public void sendDirtyEntityData() { SynchedEntityData entityData = this.entity.getEntityData(); List> list = entityData.packDirty(); -@@ -450,10 +713,12 @@ public class ServerEntity { +@@ -450,10 +711,12 @@ public class ServerEntity { this.trackedDataValues = entityData.getNonDefaultValues(); this.broadcastAndSend(new ClientboundSetEntityDataPacket(this.entity.getId(), list)); } @@ -1151,7 +1149,7 @@ index 0dee18df07c979da6125a4e7a955343e44d67ac2..dae07c6c31949c75c810c9260232cccc // CraftBukkit start - Send scaled max health if (this.entity instanceof ServerPlayer serverPlayer) { serverPlayer.getBukkitEntity().injectScaledMaxHealth(attributesToSync, false); -@@ -462,11 +727,38 @@ public class ServerEntity { +@@ -462,11 +725,38 @@ public class ServerEntity { this.broadcastAndSend(new ClientboundUpdateAttributesPacket(this.entity.getId(), attributesToSync)); } diff --git a/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/AsyncTracker.java b/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/AsyncTracker.java index b70bebfe..d1c6c296 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/AsyncTracker.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/AsyncTracker.java @@ -1,9 +1,13 @@ package org.dreeam.leaf.async.tracker; import ca.spottedleaf.moonrise.patches.chunk_system.level.entity.server.ServerEntityLookup; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; +import org.bukkit.event.player.PlayerVelocityEvent; import org.dreeam.leaf.async.FixedThreadExecutor; import org.dreeam.leaf.config.modules.async.MultithreadedTracker; import org.dreeam.leaf.util.EntitySlice; @@ -32,6 +36,7 @@ public final class AsyncTracker { } public static void tick(ServerLevel world) { + handlePlayerVelocity(world); ServerEntityLookup entityLookup = (ServerEntityLookup) world.moonrise$getEntityLookup(); ca.spottedleaf.moonrise.common.list.ReferenceList trackerEntities = entityLookup.trackerEntities; int trackerEntitiesSize = trackerEntities.size(); @@ -52,6 +57,34 @@ public final class AsyncTracker { world.trackerTask = futures; } + private static void handlePlayerVelocity(ServerLevel world) { + for (ServerPlayer player : world.players()) { + if (!player.hurtMarked) { + continue; + } + player.hurtMarked = false; + boolean cancelled = false; + + org.bukkit.entity.Player player1 = player.getBukkitEntity(); + org.bukkit.util.Vector velocity = player1.getVelocity(); + + PlayerVelocityEvent event = new PlayerVelocityEvent(player1, velocity.clone()); + if (!event.callEvent()) { + cancelled = true; + } else if (velocity != event.getVelocity() && !velocity.equals(event.getVelocity())) { + player1.setVelocity(event.getVelocity()); + } + if (cancelled) { + continue; + } + ChunkMap.TrackedEntity trackedEntity = player.moonrise$getTrackedEntity(); + if (trackedEntity == null) { + continue; + } + trackedEntity.broadcastAndSend(new ClientboundSetEntityMotionPacket(player)); + } + } + public static void onEntitiesTickEnd(ServerLevel world) { Future[] task = world.trackerTask; if (task == null) { diff --git a/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/TrackerCtx.java b/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/TrackerCtx.java index 5689740d..0ad4ee10 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/TrackerCtx.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/TrackerCtx.java @@ -29,7 +29,6 @@ import org.bukkit.event.player.PlayerVelocityEvent; public final class TrackerCtx { private final Reference2ReferenceOpenHashMap>> packets; private final ServerLevel world; - private final ObjectArrayList bukkitVelocityEvent = new ObjectArrayList<>(); private final ObjectArrayList bukkitItemFrames = new ObjectArrayList<>(); private final ObjectArrayList witherBosses = new ObjectArrayList<>(); private final ObjectArrayList paperStopSeen = new ObjectArrayList<>(); @@ -91,20 +90,15 @@ public final class TrackerCtx { bukkitItemFrames.add(itemFrame); } - public void playerVelocity(ServerPlayer player) { - bukkitVelocityEvent.add(player); - } - public void citizensEntity(Entity entity) { pluginEntity.add(entity); } public void send(ServerPlayerConnection connection, Packet packet) { - packets.computeIfAbsent(connection, x -> ReferenceArrayList.wrap(new Packet[16])).add(packet); + packets.computeIfAbsent(connection, x -> ReferenceArrayList.wrap(new Packet[16], 0)).add(packet); } void join(TrackerCtx other) { - bukkitVelocityEvent.addAll(other.bukkitVelocityEvent); bukkitItemFrames.addAll(other.bukkitItemFrames); paperStopSeen.addAll(other.paperStopSeen); paperStartSeen.addAll(other.paperStartSeen); @@ -148,30 +142,6 @@ public final class TrackerCtx { } handlePackets(world, packets, flush); - if (!bukkitVelocityEvent.isEmpty()) { - for (ServerPlayer player : bukkitVelocityEvent) { - if (!world.equals(player.level())) { - continue; - } - boolean cancelled = false; - - org.bukkit.entity.Player player1 = player.getBukkitEntity(); - org.bukkit.util.Vector velocity = player1.getVelocity(); - - PlayerVelocityEvent event = new PlayerVelocityEvent(player1, velocity.clone()); - if (!event.callEvent()) { - cancelled = true; - } else if (!velocity.equals(event.getVelocity())) { - player1.setVelocity(event.getVelocity()); - } - if (!cancelled) { - player.hurtMarked = false; - ChunkMap.TrackedEntity trackedEntity = player.moonrise$getTrackedEntity(); - trackedEntity.leafBroadcastAndSend(this, new ClientboundSetEntityMotionPacket(player)); - } - } - bukkitVelocityEvent.clear(); - } if (!bukkitItemFrames.isEmpty()) { for (ItemFrame itemFrame : bukkitItemFrames) { MapId mapId = itemFrame.cachedMapId; // Paper - Perf: Cache map ids on item frames