Skip to content

Commit 78b9020

Browse files
committed
fix(citizen-server-impl): prevent entity ownership desync on bucket changes and reduce migration timeout
1 parent 5b20ac4 commit 78b9020

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

code/components/citizen-server-impl/src/state/ServerGameState.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2137,7 +2137,7 @@ void ServerGameState::UpdateEntities()
21372137
else
21382138
{
21392139
// workaround: force-migrate a stuck entity
2140-
if ((time - entity->lastReceivedAt) > 10s)
2140+
if ((time - entity->lastReceivedAt) > 5s)
21412141
{
21422142
if (g_oneSyncForceMigration->GetValue() || fx::IsBigMode())
21432143
{

code/components/citizen-server-impl/src/state/ServerGameState_Scripting.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,6 +1670,31 @@ static void Init()
16701670
playerEntity->routingBucket = bucket;
16711671
}
16721672

1673+
if (oldBucket != bucket)
1674+
{
1675+
auto slotId = client->GetSlotId();
1676+
1677+
std::shared_lock<std::shared_mutex> lock(gameState->m_entityListMutex);
1678+
for (auto& entity : gameState->m_entityList)
1679+
{
1680+
if (!entity || !entity->syncTree)
1681+
{
1682+
continue;
1683+
}
1684+
1685+
if (entity->routingBucket == oldBucket)
1686+
{
1687+
std::lock_guard<std::shared_mutex> _(entity->guidMutex);
1688+
entity->relevantTo.reset(slotId);
1689+
1690+
auto owner = entity->GetClient();
1691+
if (owner && owner == client)
1692+
{
1693+
entity->wantsReassign = true;
1694+
}
1695+
}
1696+
}
1697+
}
16731698

16741699
auto eventManager = resourceManager->GetComponent<fx::ResourceEventManagerComponent>();
16751700
/*NETEV onPlayerBucketChange SERVER

0 commit comments

Comments
 (0)