99#include " api/NativeAPI.h"
1010#include " api/NbtAPI.h"
1111#include " api/PlayerAPI.h"
12+ #include " ll/api/memory/Hook.h"
1213#include " ll/api/memory/Memory.h"
1314#include " ll/api/service/Bedrock.h"
1415#include " lse/api/MoreGlobal.h"
1516#include " mc/common/HitDetection.h"
16- #include " mc/dataloadhelper/DefaultDataLoadHelper.h"
1717#include " mc/deps/core/string/HashedString.h"
1818#include " mc/entity/utilities/ActorDamageCause.h"
19+ #include " mc/entity/utilities/ActorEquipment.h"
20+ #include " mc/entity/utilities/ActorMobilityUtils.h"
1921#include " mc/entity/utilities/ActorType.h"
22+ #include " mc/math/Vec2.h"
23+ #include " mc/nbt/CompoundTag.h"
2024#include " mc/world/SimpleContainer.h"
2125#include " mc/world/actor/ActorDefinitionIdentifier.h"
26+ #include " mc/world/actor/Mob.h"
27+ #include " mc/world/actor/components/SynchedActorDataAccess.h"
28+ #include " mc/world/actor/item/ItemActor.h"
29+ #include " mc/world/actor/player/Player.h"
30+ #include " mc/world/attribute/AttributeInstance.h"
31+ #include " mc/world/attribute/SharedAttributes.h"
2232#include " mc/world/effect/MobEffectInstance.h"
33+ #include " mc/world/level/BlockSource.h"
34+ #include " mc/world/level/IConstBlockSource.h"
35+ #include " mc/world/level/Level.h"
2336#include " mc/world/level/Spawner.h"
2437#include " mc/world/level/block/Block.h"
38+ #include " mc/world/level/material/Material.h"
39+ #include " mc/world/phys/AABB.h"
2540
2641#include < climits>
42+ #include < entt/entt.hpp>
2743#include < magic_enum.hpp>
28- #include < mc/deps/core/string/HashedString.h>
29- #include < mc/entity/EntityContext.h>
30- #include < mc/entity/utilities/ActorEquipment.h>
31- #include < mc/entity/utilities/ActorMobilityUtils.h>
32- #include < mc/nbt/CompoundTag.h>
33- #include < mc/server/ServerPlayer.h>
34- #include < mc/world/actor/Mob.h>
35- #include < mc/world/actor/SynchedActorData.h>
36- #include < mc/world/actor/SynchedActorDataEntityWrapper.h>
37- #include < mc/world/actor/components/SynchedActorDataAccess.h>
38- #include < mc/world/actor/item/ItemActor.h>
39- #include < mc/world/attribute/Attribute.h>
40- #include < mc/world/attribute/AttributeInstance.h>
41- #include < mc/world/attribute/SharedAttributes.h>
42- #include < mc/world/level/BlockSource.h>
43- #include < mc/world/level/IConstBlockSource.h>
44- #include < mc/world/level/Level.h>
45- #include < mc/world/level/biome/Biome.h>
46- #include < mc/world/level/material/Material.h>
47- #include < mc/world/phys/AABB.h>
4844#include < memory>
4945#include < vector>
5046
@@ -189,6 +185,12 @@ ClassDefine<void> ActorDamageCauseBuilder =
189185 .build();
190186
191187// clang-format on
188+ namespace EntityAPIPatch {
189+ std::list<Actor*> validActors;
190+ LL_AUTO_TYPE_INSTANCE_HOOK (ActorDestructorHook, HookPriority::Highest, Actor, " ??1Actor@@UEAA@XZ" , void ) {
191+ validActors.remove (this );
192+ }
193+ } // namespace EntityAPIPatch
192194
193195// 生成函数
194196Local<Object> EntityClass::newEntity (Actor* actor) {
@@ -211,13 +213,23 @@ std::optional<Actor*> EntityClass::tryExtractActor(Local<Value> v) {
211213// 成员函数
212214void EntityClass::set (Actor* actor) {
213215 if (actor) {
214- runtimeId = actor->getRuntimeID ();
216+ mActor = actor;
217+ EntityAPIPatch::validActors.emplace_back (actor);
218+ } else {
219+ mValid = false ;
215220 }
216221}
217222
218223Actor* EntityClass::get () {
219- if (runtimeId) {
220- return ll::service::getLevel ()->getRuntimeEntity (runtimeId);
224+ mValid = false ;
225+ for (Actor* actor : EntityAPIPatch::validActors) {
226+ if (actor == mActor ) {
227+ mValid = true ;
228+ break ;
229+ }
230+ }
231+ if (mActor && mValid ) {
232+ return mActor ;
221233 }
222234 return nullptr ;
223235}
@@ -901,11 +913,10 @@ Local<Value> EntityClass::isPlayer(const Arguments& args) {
901913
902914Local<Value> EntityClass::toPlayer (const Arguments& args) {
903915 try {
904- Player* player = ll::service::getLevel ()->getRuntimePlayer (runtimeId);
905- if (!player) {
916+ if (!mActor || !mValid ) {
906917 return Local<Value>();
907918 }
908- return PlayerClass::newPlayer (player );
919+ return PlayerClass::newPlayer (static_cast <Player*>( mActor ) );
909920 }
910921 CATCH (" Fail in toPlayer!" );
911922}
0 commit comments