Skip to content

Commit f03ba95

Browse files
committed
https://github.com/kbengine/kbengine/issues/163
fixed:快速移动一个实体到avatarAOI范围内然后快速离开有一些异常情况。
1 parent 174647d commit f03ba95

File tree

7 files changed

+32
-18
lines changed

7 files changed

+32
-18
lines changed

kbe/src/lib/client_lib/clientobjectbase.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,7 @@ void ClientObjectBase::onEntityLeaveWorldOptimized(Network::Channel * pChannel,
860860
//-------------------------------------------------------------------------------------
861861
void ClientObjectBase::onEntityLeaveWorld(Network::Channel * pChannel, ENTITY_ID eid)
862862
{
863+
bufferedCreateEntityMessage_.erase(eid);
863864
client::Entity* entity = pEntities_->find(eid);
864865
if(entity == NULL)
865866
{
@@ -1764,6 +1765,7 @@ void ClientObjectBase::clearSpace(bool isAll)
17641765

17651766
pEntityIDAliasIDList_.clear();
17661767
spacedatas_.clear();
1768+
bufferedCreateEntityMessage_.clear();
17671769

17681770
isLoadedGeometry_ = false;
17691771
spaceID_ = 0;

kbe/src/server/cellapp/cellapp.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ along with KBEngine. If not, see <http://www.gnu.org/licenses/>.
3535
#include "server/telnet_server.hpp"
3636
#include "dbmgr/dbmgr_interface.hpp"
3737
#include "navigation/navigation.hpp"
38+
#include "client_lib/client_interface.hpp"
3839

3940
#include "../../server/baseappmgr/baseappmgr_interface.hpp"
4041
#include "../../server/cellappmgr/cellappmgr_interface.hpp"
@@ -1533,7 +1534,7 @@ PyObject* Cellapp::__py_address(PyObject* self, PyObject* args)
15331534
}
15341535

15351536
//-------------------------------------------------------------------------------------
1536-
void Cellapp::reqTeleportToTheCellApp(Network::Channel* pChannel, MemoryStream& s)
1537+
void Cellapp::reqTeleportToCellApp(Network::Channel* pChannel, MemoryStream& s)
15371538
{
15381539
size_t rpos = s.rpos();
15391540

@@ -1556,14 +1557,14 @@ void Cellapp::reqTeleportToTheCellApp(Network::Channel* pChannel, MemoryStream&
15561557
s.rpos(rpos);
15571558

15581559
Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject();
1559-
(*pBundle).newMessage(CellappInterface::reqTeleportToTheCellAppCB);
1560+
(*pBundle).newMessage(CellappInterface::reqTeleportToCellAppCB);
15601561
(*pBundle) << teleportEntityID;
15611562
(*pBundle) << success;
15621563
(*pBundle).append(&s);
15631564
pBundle->send(this->networkInterface(), pChannel);
15641565
Network::Bundle::ObjPool().reclaimObject(pBundle);
15651566

1566-
ERROR_MSG(fmt::format("Cellapp::reqTeleportToTheCellApp: not found refEntity({}), spaceID({}), reqTeleportEntity({})!\n",
1567+
ERROR_MSG(fmt::format("Cellapp::reqTeleportToCellApp: not found refEntity({}), spaceID({}), reqTeleportEntity({})!\n",
15671568
nearbyMBRefID, spaceID, teleportEntityID));
15681569

15691570
s.opfini();
@@ -1576,14 +1577,14 @@ void Cellapp::reqTeleportToTheCellApp(Network::Channel* pChannel, MemoryStream&
15761577
s.rpos(rpos);
15771578

15781579
Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject();
1579-
(*pBundle).newMessage(CellappInterface::reqTeleportToTheCellAppCB);
1580+
(*pBundle).newMessage(CellappInterface::reqTeleportToCellAppCB);
15801581
(*pBundle) << teleportEntityID;
15811582
(*pBundle) << success;
15821583
(*pBundle).append(&s);
15831584
pBundle->send(this->networkInterface(), pChannel);
15841585
Network::Bundle::ObjPool().reclaimObject(pBundle);
15851586

1586-
ERROR_MSG(fmt::format("Cellapp::reqTeleportToTheCellApp: not found space({}), reqTeleportEntity({})!\n", spaceID, teleportEntityID));
1587+
ERROR_MSG(fmt::format("Cellapp::reqTeleportToCellApp: not found space({}), reqTeleportEntity({})!\n", spaceID, teleportEntityID));
15871588
s.opfini();
15881589
return;
15891590
}
@@ -1595,14 +1596,14 @@ void Cellapp::reqTeleportToTheCellApp(Network::Channel* pChannel, MemoryStream&
15951596
s.rpos(rpos);
15961597

15971598
Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject();
1598-
(*pBundle).newMessage(CellappInterface::reqTeleportToTheCellAppCB);
1599+
(*pBundle).newMessage(CellappInterface::reqTeleportToCellAppCB);
15991600
(*pBundle) << teleportEntityID;
16001601
(*pBundle) << success;
16011602
(*pBundle).append(&s);
16021603
pBundle->send(this->networkInterface(), pChannel);
16031604
Network::Bundle::ObjPool().reclaimObject(pBundle);
16041605

1605-
ERROR_MSG(fmt::format("Cellapp::reqTeleportToTheCellApp: create reqTeleportEntity({}) is error!\n", teleportEntityID));
1606+
ERROR_MSG(fmt::format("Cellapp::reqTeleportToCellApp: create reqTeleportEntity({}) is error!\n", teleportEntityID));
16061607
s.opfini();
16071608
return;
16081609
}
@@ -1620,6 +1621,16 @@ void Cellapp::reqTeleportToTheCellApp(Network::Channel* pChannel, MemoryStream&
16201621
e->spaceID(space->id());
16211622
e->setPositionAndDirection(pos, dir);
16221623

1624+
// 进入新space之前必须通知客户端leaveSpace
1625+
Network::Bundle* pSendBundle = Network::Bundle::ObjPool().createObject();
1626+
Network::Bundle* pForwardBundle = Network::Bundle::ObjPool().createObject();
1627+
(*pForwardBundle).newMessage(ClientInterface::onEntityLeaveSpace);
1628+
(*pForwardBundle) << e->id();
1629+
NETWORK_ENTITY_MESSAGE_FORWARD_CLIENT(e->id(), (*pSendBundle), (*pForwardBundle));
1630+
e->clientMailbox()->postMail(pSendBundle);
1631+
Network::Bundle::ObjPool().reclaimObject(pForwardBundle);
1632+
1633+
// 进入新的space中
16231634
space->addEntityAndEnterWorld(e);
16241635

16251636
Entity* nearbyMBRef = Cellapp::getSingleton().findEntity(nearbyMBRefID);
@@ -1629,7 +1640,7 @@ void Cellapp::reqTeleportToTheCellApp(Network::Channel* pChannel, MemoryStream&
16291640

16301641
{
16311642
Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject();
1632-
(*pBundle).newMessage(CellappInterface::reqTeleportToTheCellAppCB);
1643+
(*pBundle).newMessage(CellappInterface::reqTeleportToCellAppCB);
16331644
(*pBundle) << g_componentID;
16341645
(*pBundle) << teleportEntityID;
16351646
(*pBundle) << success;
@@ -1639,7 +1650,7 @@ void Cellapp::reqTeleportToTheCellApp(Network::Channel* pChannel, MemoryStream&
16391650
}
16401651

16411652
//-------------------------------------------------------------------------------------
1642-
void Cellapp::reqTeleportToTheCellAppCB(Network::Channel* pChannel, MemoryStream& s)
1653+
void Cellapp::reqTeleportToCellAppCB(Network::Channel* pChannel, MemoryStream& s)
16431654
{
16441655
ENTITY_ID nearbyMBRefID = 0, teleportEntityID = 0;
16451656
bool success;
@@ -1653,7 +1664,7 @@ void Cellapp::reqTeleportToTheCellAppCB(Network::Channel* pChannel, MemoryStream
16531664
{
16541665
if(!success)
16551666
{
1656-
ERROR_MSG(fmt::format("Cellapp::reqTeleportToTheCellAppCB: not found reqTeleportEntity({}), lose entity!\n",
1667+
ERROR_MSG(fmt::format("Cellapp::reqTeleportToCellAppCB: not found reqTeleportEntity({}), lose entity!\n",
16571668
teleportEntityID));
16581669

16591670
s.opfini();

kbe/src/server/cellapp/cellapp.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,8 @@ class Cellapp: public EntityApp<Entity>,
233233
网络接口
234234
另一个cellapp的entity要teleport到本cellapp上的space中
235235
*/
236-
void reqTeleportToTheCellApp(Network::Channel* pChannel, MemoryStream& s);
237-
void reqTeleportToTheCellAppCB(Network::Channel* pChannel, MemoryStream& s);
236+
void reqTeleportToCellApp(Network::Channel* pChannel, MemoryStream& s);
237+
void reqTeleportToCellAppCB(Network::Channel* pChannel, MemoryStream& s);
238238

239239
/**
240240
获取和设置ghost管理器

kbe/src/server/cellapp/cellapp_interface.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,10 @@ NETWORK_INTERFACE_DECLARE_BEGIN(CellappInterface)
155155
CELLAPP_MESSAGE_DECLARE_STREAM(startProfile, NETWORK_VARIABLE_MESSAGE)
156156

157157
// 请求teleport到当前cellapp上
158-
CELLAPP_MESSAGE_DECLARE_STREAM(reqTeleportToTheCellApp, NETWORK_VARIABLE_MESSAGE)
158+
CELLAPP_MESSAGE_DECLARE_STREAM(reqTeleportToCellApp, NETWORK_VARIABLE_MESSAGE)
159159

160160
// entity传送到目的cellapp上的space之后, 返回给之前cellapp的回调
161-
CELLAPP_MESSAGE_DECLARE_STREAM(reqTeleportToTheCellAppCB, NETWORK_VARIABLE_MESSAGE)
161+
CELLAPP_MESSAGE_DECLARE_STREAM(reqTeleportToCellAppCB, NETWORK_VARIABLE_MESSAGE)
162162

163163
// real请求更新属性到ghost
164164
CELLAPP_MESSAGE_DECLARE_STREAM(onUpdateGhostPropertys, NETWORK_VARIABLE_MESSAGE)

kbe/src/server/cellapp/entity.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2486,7 +2486,7 @@ void Entity::onTeleportRefMailbox(EntityMailbox* nearbyMBRef, Position3D& pos, D
24862486
{
24872487
// 我们需要将entity打包发往目的cellapp
24882488
Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject();
2489-
(*pBundle).newMessage(CellappInterface::reqTeleportToTheCellApp);
2489+
(*pBundle).newMessage(CellappInterface::reqTeleportToCellApp);
24902490
(*pBundle) << id();
24912491
(*pBundle) << nearbyMBRef->id();
24922492
(*pBundle) << spaceID();

kbe/src/server/cellapp/space.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,9 @@ void Space::removeEntity(Entity* pEntity)
270270
//-------------------------------------------------------------------------------------
271271
void Space::_onEnterWorld(Entity* pEntity)
272272
{
273+
if(!pEntity->isReal() || !pEntity->scriptModule()->hasClient())
274+
return;
275+
273276
if(pEntity->hasWitness())
274277
{
275278
pEntity->pWitness()->onEnterSpace(this);
@@ -300,7 +303,7 @@ void Space::onEntityAttachWitness(Entity* pEntity)
300303
//-------------------------------------------------------------------------------------
301304
void Space::onLeaveWorld(Entity* pEntity)
302305
{
303-
if(!pEntity->scriptModule()->hasClient())
306+
if(!pEntity->isReal() || !pEntity->scriptModule()->hasClient())
304307
return;
305308

306309
// 向其他人客户端广播自己的离开

kbe/src/server/cellapp/witness.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,9 +403,7 @@ void Witness::onLeaveSpace(Space* pSpace)
403403
Network::Bundle* pSendBundle = Network::Bundle::ObjPool().createObject();
404404
Network::Bundle* pForwardBundle = Network::Bundle::ObjPool().createObject();
405405

406-
407406
(*pForwardBundle).newMessage(ClientInterface::onEntityLeaveSpace);
408-
409407
(*pForwardBundle) << pEntity_->id();
410408

411409
NETWORK_ENTITY_MESSAGE_FORWARD_CLIENT(pEntity_->id(), (*pSendBundle), (*pForwardBundle));

0 commit comments

Comments
 (0)