Comments (5)
PlayerList 在 respawn 方法里是直接:
ServerPlayer serverplayer = new ServerPlayer(this.f_11195_, serverlevel1, p_11237_.m_36316_());
但最终调用进去到 Citizens EntityHumanNPC 的 getHandle 里面是这样的:(它有个强转)
public EntityHumanNPC getHandle() {
return (EntityHumanNPC) this.entity;
}
而 org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer 的 getHandle 是这样:
(在 CraftPlayer 的 teleport 且世界不同时被调用)
@Override
public ServerPlayer getHandle() {
return (ServerPlayer) entity;
}
EntityHumanNPC 继承 net.minecraft.server.level.EntityPlayer (spigot nms)
ServerPlayer 是 (似乎是 forge 的 player 类)
供参考,暂时没想到什么修复方案
from catserver.
突然想到,既然创建时不会报错,感觉可能可以参考创建时的逻辑
了解到 创建时的逻辑是调用 NMS 直接 setBukkitEntity:
HumanController 的 createEntity 返回的是 EntityHumanNPC.getBukkitEntity()
这样在实际 spawn 时就直接用 NMS addBukkitEntity to world 即可正常执行 spawn
故尝试将 CraftEntity 的 getUniqueId 方法从:
@Override
public UUID getUniqueId() {
return getHandle().getUUID();
}
改成如下:
@Override
public UUID getUniqueId() {
Entity handle = getHandle();
if (handle instanceof ServerPlayer) {
return ((ServerPlayer) handle).getBukkitEntity().getUniqueId();
} else {
return handle.getUUID();
}
}
但实际 build 后登录会发现 getUniqueId 存在 StackOverFlow 问题:
(getBukkitEntity 会调用 SimplePluginManager 去 remove WeakHashMap 从而调用 hashCode,而 hashCode 在 CraftPlayer 重写后用到了 getUniqueId)
at org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity.getUniqueId(CraftEntity.java:756) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer.hashCode(CraftPlayer.java:1300) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at java.util.WeakHashMap.hash(WeakHashMap.java:303) ~[?:?]
at java.util.WeakHashMap.remove(WeakHashMap.java:596) ~[?:?]
at org.bukkit.plugin.SimplePluginManager.unsubscribeFromDefaultPerms(SimplePluginManager.java:823) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at org.bukkit.permissions.PermissibleBase.clearPermissions(PermissibleBase.java:183) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at org.bukkit.permissions.PermissibleBase.recalculatePermissions(PermissibleBase.java:159) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at org.bukkit.permissions.PermissibleBase.<init>(PermissibleBase.java:28) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at org.bukkit.craftbukkit.v1_18_R2.entity.CraftHumanEntity.<init>(CraftHumanEntity.java:69) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer.<init>(CraftPlayer.java:145) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity.getEntity(CraftEntity.java:107) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at net.minecraft.world.entity.Entity.getBukkitEntity(Entity.java:264) ~[server-1.18.2-20220404.173914-srg.jar%2354!/:?]
at net.minecraft.world.entity.player.Player.getBukkitEntity(Player.java:2182) ~[server-1.18.2-20220404.173914-srg.jar%2354!/:?]
at net.minecraft.server.level.ServerPlayer.getBukkitEntity(ServerPlayer.java:284) ~[server-1.18.2-20220404.173914-srg.jar%2354!/:?]
at org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity.getUniqueId(CraftEntity.java:756) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
暂时还没想到更好的解决方案
from catserver.
发现 entity 在构造时即传入了 ServerPlayer
故改为
@Override
public UUID getUniqueId() {
if (entity instanceof ServerPlayer) {
return entity.getUUID();
} else {
return getHandle().getUUID();
}
}
可以修正该 issue 的问题,但没修正根本问题,因测试发现后续 其子类 CraftLivingEntity getMaxHealth() 也出现了 getHandle 的 cast 问题,
而后续在继承链修复全部的 getHandle 问题后,其他类又出现问题 org.bukkit.craftbukkit.v1_18_R2.scheduler.CraftTask.run(CraftTask.java:81)
java.lang.ClassCastException: class net.minecraft.server.level.ServerPlayer cannot be cast to class net.citizensnpcs.nms.v1_18_R2.entity.EntityHumanNPC (net.minecraft.server.level.ServerPlayer is in module minecraft@1.18.2 of loader 'TRANSFORMER' @3d7fb838; net.citizensnpcs.nms.v1_18_R2.entity.EntityHumanNPC is in unnamed module of loader org.bukkit.plugin.java.PluginClassLoader @1c95f8ec)
at net.citizensnpcs.nms.v1_18_R2.entity.EntityHumanNPC$PlayerNPC.getHandle(EntityHumanNPC.java:397) ~[?:?]
at net.citizensnpcs.nms.v1_18_R2.entity.EntityHumanNPC$PlayerNPC.getHandle(EntityHumanNPC.java:372) ~[?:?]
at net.citizensnpcs.nms.v1_18_R2.util.NMSImpl.getHandle(NMSImpl.java:2051) ~[?:?]
at net.citizensnpcs.nms.v1_18_R2.util.NMSImpl.isValid(NMSImpl.java:896) ~[?:?]
at net.citizensnpcs.util.NMS.isValid(NMS.java:649) ~[?:?]
at net.citizensnpcs.npc.CitizensNPC.isSpawned(CitizensNPC.java:168) ~[?:?]
at net.citizensnpcs.npc.CitizensNPC.updateFlyableState(CitizensNPC.java:576) ~[?:?]
at net.citizensnpcs.npc.CitizensNPC.isFlyable(CitizensNPC.java:162) ~[?:?]
at net.citizensnpcs.nms.v1_18_R2.entity.EntityHumanNPC.m_7023_(EntityHumanNPC.java:358) ~[?:?]
at net.citizensnpcs.nms.v1_18_R2.entity.EntityHumanNPC.moveWithFallDamage(EntityHumanNPC.java:284) ~[?:?]
at net.citizensnpcs.nms.v1_18_R2.entity.EntityHumanNPC.m_9240_(EntityHumanNPC.java:129) ~[?:?]
at net.citizensnpcs.util.NMS.lambda$playerTicker$2(NMS.java:708) ~[?:?]
at net.citizensnpcs.util.PlayerUpdateTask$PlayerTick.run(PlayerUpdateTask.java:86) ~[?:?]
at net.citizensnpcs.util.PlayerUpdateTask.run(PlayerUpdateTask.java:71) ~[?:?]
at org.bukkit.craftbukkit.v1_18_R2.scheduler.CraftTask.run(CraftTask.java:81) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at org.bukkit.craftbukkit.v1_18_R2.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:416) ~[forge-1.18.2-40.2.14-universal.jar%2359!/:?]
at net.minecraft.server.MinecraftServer.m_5703_(MinecraftServer.java:1198) ~[server-1.18.2-20220404.173914-srg.jar%2354!/:?]
at net.minecraft.server.dedicated.DedicatedServer.m_5703_(DedicatedServer.java:397) ~[server-1.18.2-20220404.173914-srg.jar%2354!/:?]
at net.minecraft.server.MinecraftServer.m_5705_(MinecraftServer.java:1144) ~[server-1.18.2-20220404.173914-srg.jar%2354!/:?]
at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:984) ~[server-1.18.2-20220404.173914-srg.jar%2354!/:?]
at net.minecraft.server.MinecraftServer.m_177918_(MinecraftServer.java:344) ~[server-1.18.2-20220404.173914-srg.jar%2354!/:?]
at java.lang.Thread.run(Thread.java:833) [?:?]
感觉是死胡同
from catserver.
重看两个报错,发现一个相同点:都是从这里来的 task 触发的 cast 问题
org.bukkit.craftbukkit.v1_18_R2.scheduler.CraftTask.run(CraftTask.java:81)
其中 Citizens 的 net.citizensnpcs.api.npc.AbstractNPC 在切世界重生成实体时用的是如下方法:
Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), () -> {
entity.teleport(loc, cause);
}, (long)(delay++));
触发了 craftBukkit 的 CraftTask,delay 过后,runnable 直接执行了 entity.teleport(loc, cause);
而其中的 entity 导致了无法强转
from catserver.
这个你用最新版再测试一遍 理论来说是没问题了 EnderDragonPart那个应该也是
from catserver.
Related Issues (20)
- [1.18.2] LibertyBans插件无法加载 HOT 1
- [1.18.2] 跨世界传送末影龙时崩溃: EnderDragon cannot be cast to EnderDragonPart HOT 1
- [1.16.5] 安装Better End Potato Edition最新版时报错崩溃
- [1.16.5]Catserver,MythicMobs报错
- [1.18.2] 机械动力的动力锯无法将物品放入箱子 HOT 2
- [1.16.5] 不兼容bountifulbaubles HOT 1
- [1.18.2] No explosions HOT 3
- [1.18.2] Issue on player death
- [1.16.5] 玩家重生后重生点丢失
- [1.20.4] 请更新到1.20.4
- [1.20.4] 请更新到1.20.4 HOT 8
- [1.16.5] 请求兼容biggerstacks
- [1.18.2] 请求更新forge版本
- [1.16.5] 放置向北(玩家面向南放置)的贴在方块上的橡木告示牌 报错 HOT 5
- [1.16.5] 请求更新Forge版本 HOT 1
- [1.18.2] lore 与 AttributePlus 在最新构建版本中无法正常使用
- [1.18.2] Custom Npcs模组控制台无法执行插件指令 HOT 1
- [1.16.5] Catserver与citizens2中的path设置寻路点不兼容缺nms方法导致崩服。
- [1.18.2] QuickShop插件无法正常使用
- [1.16.5] ModelEngine not working
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from catserver.