mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-27 10:59:16 +00:00
send velocity packets before entity tick (#463)
This commit is contained in:
@@ -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<Entity> mountedOrDismounted(List<Entity> 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<SynchedEntityData.DataValue<?>> 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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Entity> 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<TrackerCtx>[] task = world.trackerTask;
|
||||
if (task == null) {
|
||||
|
||||
@@ -29,7 +29,6 @@ import org.bukkit.event.player.PlayerVelocityEvent;
|
||||
public final class TrackerCtx {
|
||||
private final Reference2ReferenceOpenHashMap<ServerPlayerConnection, ReferenceArrayList<Packet<? super ClientGamePacketListener>>> packets;
|
||||
private final ServerLevel world;
|
||||
private final ObjectArrayList<ServerPlayer> bukkitVelocityEvent = new ObjectArrayList<>();
|
||||
private final ObjectArrayList<ItemFrame> bukkitItemFrames = new ObjectArrayList<>();
|
||||
private final ObjectArrayList<BossEvent> witherBosses = new ObjectArrayList<>();
|
||||
private final ObjectArrayList<PaperStopSeen> 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<? super ClientGamePacketListener> 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
|
||||
|
||||
Reference in New Issue
Block a user