Skip to content

Commit 6ca250f

Browse files
committed
fix: fix entiy seh
1 parent a127e6c commit 6ca250f

File tree

6 files changed

+26
-89
lines changed

6 files changed

+26
-89
lines changed

src/legacy/api/DeviceAPI.cpp

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@ ClassDefine<DeviceClass> DeviceClassBuilder = defineClass<DeviceClass>("LLSE_Dev
3333

3434
//////////////////// Classes ////////////////////
3535

36-
namespace PlayerAPIPatch {
37-
extern std::list<Player*> validPlayers;
38-
}
39-
4036
// 生成函数
4137
Local<Object> DeviceClass::newDevice(Player* player) {
4238
auto newp = new DeviceClass(player);
@@ -46,26 +42,11 @@ Local<Object> DeviceClass::newDevice(Player* player) {
4642
// 成员函数
4743
void DeviceClass::setPlayer(Player* player) {
4844
if (player) {
49-
mPlayer = player;
50-
PlayerAPIPatch::validPlayers.emplace_back(player);
51-
} else {
52-
mValid = false;
45+
mWeakEntity = player->getWeakEntity();
5346
}
5447
}
5548

56-
Player* DeviceClass::getPlayer() {
57-
mValid = false;
58-
for (Player* player : PlayerAPIPatch::validPlayers) {
59-
if (player == mPlayer) {
60-
mValid = true;
61-
break;
62-
}
63-
}
64-
if (mPlayer && mValid) {
65-
return mPlayer;
66-
}
67-
return nullptr;
68-
}
49+
Player* DeviceClass::getPlayer() { return mWeakEntity.tryUnwrap<Player>().as_ptr(); }
6950

7051
Local<Value> DeviceClass::getIP() {
7152
try {
@@ -133,10 +114,8 @@ Local<Value> DeviceClass::getServerAddress() {
133114
if (!player) return Local<Value>();
134115

135116
if (player->isSimulatedPlayer()) String::newString("unknown");
136-
Json::Value& requestJson = ll::service::getServerNetworkHandler()
137-
->fetchConnectionRequest(player->getNetworkIdentifier())
138-
.mRawToken->mDataInfo;
139-
return String::newString(requestJson.get("ServerAddress", "unknown").asString("unknown"));
117+
Json::Value& requestJson = player->getConnectionRequest()->mRawToken->mDataInfo;
118+
return String::newString(requestJson["ServerAddress"].asString("unknown"));
140119
}
141120
CATCH("Fail in getServerAddress!")
142121
}
@@ -146,9 +125,7 @@ Local<Value> DeviceClass::getClientId() {
146125
Player* player = getPlayer();
147126
if (!player) return Local<Value>();
148127

149-
return String::newString(
150-
ll::service::getServerNetworkHandler()->fetchConnectionRequest(player->getNetworkIdentifier()).getDeviceId()
151-
);
128+
return String::newString(player->getConnectionRequest()->getDeviceId());
152129
}
153130
CATCH("Fail in getClientId!")
154131
}
@@ -158,10 +135,8 @@ Local<Value> DeviceClass::getInputMode() {
158135
Player* player = getPlayer();
159136
if (!player) return Local<Value>();
160137

161-
Json::Value& requestJson = ll::service::getServerNetworkHandler()
162-
->fetchConnectionRequest(player->getNetworkIdentifier())
163-
.mRawToken->mDataInfo;
164-
return Number::newNumber(requestJson.get("CurrentInputMode", 0).asInt(0));
138+
Json::Value& requestJson = player->getConnectionRequest()->mRawToken->mDataInfo;
139+
return Number::newNumber(requestJson["CurrentInputMode"].asInt(0));
165140
}
166141
CATCH("Fail in getInputMode!")
167142
}

src/legacy/api/DeviceAPI.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#pragma once
22
#include "api/APIHelp.h"
3+
#include "mc/entity/WeakEntityRef.h"
34
#include "mc/world/ActorRuntimeID.h"
45

56
//////////////////// Classes ////////////////////
67
class Player;
78
class DeviceClass : public ScriptClass {
89
private:
9-
Player* mPlayer;
10-
bool mValid = true;
10+
WeakRef<EntityContext> mWeakEntity;
1111

1212
public:
1313
explicit DeviceClass(Player* player) : ScriptClass(ScriptClass::ConstructFromCpp<DeviceClass>{}) {

src/legacy/api/EntityAPI.cpp

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -185,12 +185,6 @@ ClassDefine<void> ActorDamageCauseBuilder =
185185
.build();
186186

187187
// 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
194188

195189
// 生成函数
196190
Local<Object> EntityClass::newEntity(Actor* actor) {
@@ -213,26 +207,14 @@ std::optional<Actor*> EntityClass::tryExtractActor(Local<Value> v) {
213207
// 成员函数
214208
void EntityClass::set(Actor* actor) {
215209
if (actor) {
216-
mActor = actor;
217-
EntityAPIPatch::validActors.emplace_back(actor);
218-
} else {
219-
mValid = false;
210+
mWeakEntity = actor->getWeakEntity();
220211
}
221212
}
222213

223-
Actor* EntityClass::get() {
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;
233-
}
234-
return nullptr;
235-
}
214+
WeakStorageEntity& WeakStorageEntity::operator=(WeakStorageEntity const&) = default;
215+
WeakStorageEntity::WeakStorageEntity(WeakStorageEntity const&) = default;
216+
217+
Actor* EntityClass::get() { return mWeakEntity.tryUnwrap<Actor>().as_ptr(); }
236218

237219
Local<Value> EntityClass::asPointer(const Arguments& args) {
238220
try {
@@ -913,10 +895,10 @@ Local<Value> EntityClass::isPlayer(const Arguments& args) {
913895

914896
Local<Value> EntityClass::toPlayer(const Arguments& args) {
915897
try {
916-
if (!mActor || !mValid) {
917-
return Local<Value>();
898+
if (auto player = mWeakEntity.tryUnwrap<Player>()) {
899+
return PlayerClass::newPlayer(player);
918900
}
919-
return PlayerClass::newPlayer(static_cast<Player*>(mActor));
901+
return Local<Value>();
920902
}
921903
CATCH("Fail in toPlayer!");
922904
}

src/legacy/api/EntityAPI.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#pragma once
22
#include "api/APIHelp.h"
33
#include "mc/world/ActorRuntimeID.h"
4+
#include "mc/entity/WeakEntityRef.h"
45

56
//////////////////// Classes ////////////////////
67
class Actor;
78
class EntityClass : public ScriptClass {
89
private:
9-
Actor* mActor;
10-
bool mValid = true;
10+
WeakRef<EntityContext> mWeakEntity;
1111

1212
public:
1313
explicit EntityClass(Actor* actor) : ScriptClass(ScriptClass::ConstructFromCpp<EntityClass>{}) { set(actor); }

src/legacy/api/PlayerAPI.cpp

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -718,36 +718,14 @@ Local<Value> McClass::broadcast(const Arguments& args) {
718718
CATCH("Fail in Broadcast!")
719719
}
720720

721-
namespace PlayerAPIPatch {
722-
std::list<Player*> validPlayers;
723-
LL_AUTO_TYPE_INSTANCE_HOOK(PlayerDestructorHook, HookPriority::Highest, Player, "??1Player@@UEAA@XZ", void) {
724-
validPlayers.remove(this);
725-
}
726-
} // namespace PlayerAPIPatch
727-
728721
// 成员函数
729722
void PlayerClass::set(Player* player) {
730723
if (player) {
731-
mPlayer = player;
732-
PlayerAPIPatch::validPlayers.emplace_back(player);
733-
} else {
734-
mValid = false;
724+
mWeakEntity = player->getWeakEntity();
735725
}
736726
}
737727

738-
Player* PlayerClass::get() {
739-
mValid = false;
740-
for (Player* player : PlayerAPIPatch::validPlayers) {
741-
if (player == mPlayer) {
742-
mValid = true;
743-
break;
744-
}
745-
}
746-
if (mPlayer && mValid) {
747-
return mPlayer;
748-
}
749-
return nullptr;
750-
}
728+
Player* PlayerClass::get() { return mWeakEntity.tryUnwrap<Player>().as_ptr(); }
751729

752730
Local<Value> PlayerClass::getName() {
753731
try {
@@ -2060,7 +2038,9 @@ Local<Value> PlayerClass::getBlockStandingOn(const Arguments& args) {
20602038

20612039
Local<Value> PlayerClass::getDevice(const Arguments& args) {
20622040
try {
2063-
return DeviceClass::newDevice(mPlayer);
2041+
Player* player = get();
2042+
if (!player) return Local<Value>();
2043+
return DeviceClass::newDevice(player);
20642044
}
20652045
CATCH("Fail in getDevice!");
20662046
}

src/legacy/api/PlayerAPI.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22
#include "api/APIHelp.h"
3+
#include "mc/entity/WeakEntityRef.h"
34
#include "mc/world/ActorRuntimeID.h"
45

56
class SimulatedPlayer;
@@ -8,8 +9,7 @@ class SimulatedPlayer;
89
class Player;
910
class PlayerClass : public ScriptClass {
1011
private:
11-
Player* mPlayer;
12-
bool mValid = true;
12+
WeakRef<EntityContext> mWeakEntity;
1313

1414
public:
1515
explicit PlayerClass(Player* player);

0 commit comments

Comments
 (0)