Skip to content

Commit a9ef4d7

Browse files
committed
https://github.com/kbengine/kbengine/issues/162
关服销毁实体时,最后销毁space实体
1 parent 6acb889 commit a9ef4d7

File tree

1 file changed

+29
-3
lines changed

1 file changed

+29
-3
lines changed

kbe/src/server/cellapp/cellapp.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ bool Cellapp::canShutdown()
8484
Entities<Entity>::ENTITYS_MAP::iterator iter = entities.begin();
8585
for(; iter != entities.end(); iter++)
8686
{
87-
if(static_cast<Entity*>(iter->second.get())->baseMailbox() != NULL)
87+
Entity* pEntity = static_cast<Entity*>(iter->second.get());
88+
if(pEntity->baseMailbox() != NULL &&
89+
pEntity->scriptModule()->isPersistent())
8890
{
8991
lastShutdownFailReason_ = "destroyHasBaseEntitys";
9092
return false;
@@ -102,15 +104,25 @@ void Cellapp::onShutdown(bool first)
102104
int count = g_serverConfig.getCellApp().perSecsDestroyEntitySize;
103105
Entities<Entity>::ENTITYS_MAP& entities = this->pEntities()->getEntities();
104106

107+
std::vector<Entity*> vecs;
108+
105109
while(count > 0)
106110
{
107111
bool done = false;
108112
Entities<Entity>::ENTITYS_MAP::iterator iter = entities.begin();
109113
for(; iter != entities.end(); iter++)
110114
{
111-
if(static_cast<Entity*>(iter->second.get())->baseMailbox() != NULL &&
112-
static_cast<Entity*>(iter->second.get())->scriptModule()->isPersistent())
115+
Entity* pEntity = static_cast<Entity*>(iter->second.get());
116+
if(pEntity->baseMailbox() != NULL &&
117+
pEntity->scriptModule()->isPersistent())
113118
{
119+
Space* space = Spaces::findSpace(pEntity->spaceID());
120+
if(space && space->creatorID() == pEntity->id())
121+
{
122+
vecs.push_back(pEntity);
123+
continue;
124+
}
125+
114126
this->destroyEntity(static_cast<Entity*>(iter->second.get())->id(), true);
115127

116128
count--;
@@ -119,6 +131,20 @@ void Cellapp::onShutdown(bool first)
119131
}
120132
}
121133

134+
// 如果count等于perSecsDestroyEntitySize说明上面已经没有可处理的东西了
135+
// 剩下的应该都是space,可以开始销毁了
136+
if(g_serverConfig.getCellApp().perSecsDestroyEntitySize == count && vecs.size() > 0)
137+
{
138+
std::vector<Entity*>::iterator iter1 = vecs.begin();
139+
for(; iter1 != vecs.end(); iter1++)
140+
{
141+
this->destroyEntity(static_cast<Entity*>(*iter1)->id(), true);
142+
143+
count--;
144+
done = true;
145+
}
146+
}
147+
122148
if(!done)
123149
break;
124150
}

0 commit comments

Comments
 (0)