9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-25 18:09:17 +00:00

send velocity packets before entity tick (#463)

This commit is contained in:
hayanesuru
2025-08-20 14:57:54 +09:00
committed by GitHub
parent e7915c3726
commit d8d1a3cfbc
3 changed files with 43 additions and 42 deletions

View File

@@ -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) {

View File

@@ -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