Trial setting Moonrise isRealPlayer to true for playerlist NPCs to aid with chunk ticking. Alternative is to create a PlayerChunkLoaderData instance manually

This commit is contained in:
fullwall 2025-01-04 19:10:41 +08:00
parent 8dd8a5ff40
commit d99adbf8d9
2 changed files with 15 additions and 1 deletions

View File

@ -1,4 +1,6 @@
package net.citizensnpcs.nms.v1_21_R3.entity; import java.util.UUID;
package net.citizensnpcs.nms.v1_21_R3.entity;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@ -11,6 +13,7 @@ import com.mojang.authlib.GameProfile;
import net.citizensnpcs.Settings.Setting;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.nms.v1_21_R3.util.NMSImpl;
import net.citizensnpcs.npc.AbstractEntityController;
import net.citizensnpcs.npc.skin.Skin;
import net.citizensnpcs.trait.ScoreboardTrait;
@ -44,6 +47,13 @@ public class HumanController extends AbstractEntityController {
if (skin != null) {
skin.apply(handle);
}
if (NMSImpl.MOONRISE_IS_REAL_PLAYER != null) {
try {
NMSImpl.MOONRISE_IS_REAL_PLAYER.invoke(handle, !npc.shouldRemoveFromPlayerList());
} catch (Throwable e) {
e.printStackTrace();
}
}
Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), () -> {
if (getBukkitEntity() == null || !getBukkitEntity().isValid()
|| getBukkitEntity() != handle.getBukkitEntity())

View File

@ -2707,9 +2707,12 @@ public class NMSImpl implements NMSBridge {
}
private static final MethodHandle ARMADILLO_SCUTE_TIME = NMS.getSetter(Armadillo.class, "cj");
private static final MethodHandle ATTRIBUTE_PROVIDER_MAP = NMS.getFirstGetter(AttributeSupplier.class, Map.class);
private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFirstFinalSetter(AttributeSupplier.class,
Map.class);
private static final MethodHandle ATTRIBUTE_SUPPLIER = NMS.getFirstGetter(AttributeMap.class,
AttributeSupplier.class);
private static final MethodHandle AVAILABLE_BEHAVIORS_BY_PRIORITY = NMS.getGetter(Brain.class, "f");
@ -2757,6 +2760,7 @@ public class NMSImpl implements NMSBridge {
private static MethodHandle META_COMPOUND_TAG;
private static final MethodHandle MINECRAFT_CLIENT = NMS.getFirstGetter(YggdrasilMinecraftSessionService.class,
MinecraftClient.class);
public static final MethodHandle MOONRISE_IS_REAL_PLAYER = NMS.getSetter(ServerPlayer.class, "isRealPlayer", false);
private static final MethodHandle MOVE_CONTROLLER_OPERATION = NMS.getSetter(MoveControl.class, "k");
private static final MethodHandle NAVIGATION_CREATE_PATHFINDER = NMS
.getFirstMethodHandleWithReturnType(PathNavigation.class, true, PathFinder.class, int.class);