Skip to content

Commit 83e45f1

Browse files
committed
crash fix
1 parent f94cb7d commit 83e45f1

File tree

4 files changed

+105
-3
lines changed

4 files changed

+105
-3
lines changed

Client/mods/deathmatch/logic/CClientGame.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,11 @@ CClientGame::~CClientGame()
426426
// ...and restore the buffer size too
427427
g_pGame->GetStreaming()->SetStreamingBufferSize(g_pClientGame->GetManager()->GetIMGManager()->GetLargestFileSizeBlocks());
428428

429+
// Reset streamer limits
430+
g_pClientGame->GetManager()->GetObjectStreamer()->ResetStreamerLimits();
431+
g_pClientGame->GetManager()->GetObjectStreamer()->ResetStreamerMaxSwaps();
432+
g_pClientGame->GetManager()->GetObjectStreamer()->ResetStreamerFurthestInLimit();
433+
429434
// Reset camera shaking
430435
g_pGame->GetCamera()->SetShakeForce(0.0f);
431436

Client/mods/deathmatch/logic/CClientStreamer.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,6 @@ void CClientStreamer::SetDimension(unsigned short usDimension)
256256
std::vector<CClientStreamElement*> elementsToHide;
257257
std::vector<CClientStreamElement*> elementsToShow;
258258

259-
elementsToHide.reserve(100);
260-
elementsToShow.reserve(100);
261-
262259
// Collect elements from sectors that need to be hidden
263260
auto collectFromRows = [this, &elementsToHide](std::list<CClientStreamSectorRow*>& rowList)
264261
{
@@ -487,6 +484,11 @@ void CClientStreamer::RemoveElementFromSectors(CClientStreamElement* pElement)
487484
return;
488485

489486
OnElementEnterSector(pElement, nullptr);
487+
488+
// Clear row and sector
489+
pElement->SetStreamRow(nullptr);
490+
491+
// Remove from active elements
490492
m_ToStreamOut.remove(pElement);
491493
}
492494

@@ -957,7 +959,12 @@ void CClientStreamer::OnElementEnterSector(CClientStreamElement* pElement, CClie
957959
m_ActiveElements.remove(pElement);
958960
}
959961

962+
// Update the element's sector pointer
960963
pElement->SetStreamSector(pSector);
964+
965+
// If the element no longer has a sector, clear the row pointer too
966+
if (!pSector)
967+
pElement->SetStreamRow(nullptr);
961968
}
962969

963970
void CClientStreamer::OnElementForceStreamIn(CClientStreamElement* pElement)
@@ -1010,6 +1017,9 @@ void CClientStreamer::OnElementDimension(CClientStreamElement* pElement)
10101017
// Stream out if needed
10111018
if (pElement->IsStreamedIn())
10121019
m_ToStreamOut.push_back(pElement);
1020+
1021+
// Clear row pointer
1022+
pElement->SetStreamRow(nullptr);
10131023
}
10141024
}
10151025

Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,13 @@ void CLuaEngineDefs::LoadFunctions()
152152
{"enginePreloadWorldArea", ArgumentParser<EnginePreloadWorldArea>},
153153
{"engineRestreamModel", ArgumentParser<EngineRestreamModel>},
154154
{"engineRestream", ArgumentParser<EngineRestream>},
155+
{"engineStreamingSetLimits", ArgumentParser<EngineStreamingSetLimits>},
156+
{"engineStreamingGetLimits", ArgumentParser<EngineStreamingGetLimits>},
157+
{"engineStreamingResetLimits", ArgumentParser<EngineStreamingResetLimits>},
158+
{"engineStreamingSetMaxSwaps", ArgumentParser<EngineStreamingSetMaxSwaps>},
159+
{"engineStreamingResetMaxSwaps", ArgumentParser<EngineStreamingResetMaxSwaps>},
160+
{"engineStreamingSetFurthestInLimit", ArgumentParser<EngineStreamingSetFurthestInLimit>},
161+
{"engineStreamingResetFurthestInLimit", ArgumentParser<EngineStreamingResetFurthestInLimit>},
155162

156163

157164
// CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics );
@@ -216,6 +223,13 @@ void CLuaEngineDefs::AddClass(lua_State* luaVM)
216223
lua_classfunction(luaVM, "getBufferSize", "engineStreamingGetBufferSize");
217224
lua_classfunction(luaVM, "setBufferSize", "engineStreamingSetBufferSize");
218225
lua_classfunction(luaVM, "restoreBufferSize", "engineStreamingRestoreBufferSize");
226+
lua_classfunction(luaVM, "setLimits", "engineStreamingSetLimits");
227+
lua_classfunction(luaVM, "getLimits", "engineStreamingGetLimits");
228+
lua_classfunction(luaVM, "resetLimits", "engineStreamingResetLimits");
229+
lua_classfunction(luaVM, "setMaxSwaps", "engineStreamingSetMaxSwaps");
230+
lua_classfunction(luaVM, "resetMaxSwaps", "engineStreamingResetMaxSwaps");
231+
lua_classfunction(luaVM, "setFurthestInLimit", "engineStreamingSetFurthestInLimit");
232+
lua_classfunction(luaVM, "resetFurthestInLimit", "engineStreamingResetFurthestInLimit");
219233

220234
lua_classvariable(luaVM, "memorySize", "engineStreamingSetMemorySize", "engineStreamingGetMemorySize");
221235
lua_classvariable(luaVM, "bufferSize", "engineStreamingSetBufferSize", "engineStreamingGetBufferSize");
@@ -2615,3 +2629,68 @@ void CLuaEngineDefs::EngineRestream(std::optional<RestreamOption> option)
26152629
{
26162630
g_pClientGame->Restream(option);
26172631
}
2632+
2633+
void CLuaEngineDefs::EngineStreamingSetLimits(int normalIn, int normalOut, int farIn, int farOut)
2634+
{
2635+
g_pClientGame->GetManager()->GetObjectStreamer()->SetStreamerLimits(normalIn, normalOut, farIn, farOut);
2636+
}
2637+
2638+
int CLuaEngineDefs::EngineStreamingGetLimits(lua_State* luaVM)
2639+
{
2640+
auto* pStreamer = g_pClientGame->GetManager()->GetObjectStreamer();
2641+
int normalIn, normalOut, farIn, farOut, maxSwaps, furthestInLimit;
2642+
pStreamer->GetStreamingLimits(normalIn, normalOut, farIn, farOut, maxSwaps, furthestInLimit);
2643+
2644+
lua_newtable(luaVM);
2645+
2646+
lua_pushstring(luaVM, "normalIn");
2647+
lua_pushnumber(luaVM, normalIn);
2648+
lua_settable(luaVM, -3);
2649+
2650+
lua_pushstring(luaVM, "normalOut");
2651+
lua_pushnumber(luaVM, normalOut);
2652+
lua_settable(luaVM, -3);
2653+
2654+
lua_pushstring(luaVM, "farIn");
2655+
lua_pushnumber(luaVM, farIn);
2656+
lua_settable(luaVM, -3);
2657+
2658+
lua_pushstring(luaVM, "farOut");
2659+
lua_pushnumber(luaVM, farOut);
2660+
lua_settable(luaVM, -3);
2661+
2662+
lua_pushstring(luaVM, "maxSwaps");
2663+
lua_pushnumber(luaVM, maxSwaps);
2664+
lua_settable(luaVM, -3);
2665+
2666+
lua_pushstring(luaVM, "furthestInLimit");
2667+
lua_pushnumber(luaVM, furthestInLimit);
2668+
lua_settable(luaVM, -3);
2669+
2670+
return 1;
2671+
}
2672+
2673+
void CLuaEngineDefs::EngineStreamingResetLimits()
2674+
{
2675+
g_pClientGame->GetManager()->GetObjectStreamer()->ResetStreamerLimits();
2676+
}
2677+
2678+
void CLuaEngineDefs::EngineStreamingSetMaxSwaps(int maxSwaps)
2679+
{
2680+
g_pClientGame->GetManager()->GetObjectStreamer()->SetStreamerMaxSwaps(maxSwaps);
2681+
}
2682+
2683+
void CLuaEngineDefs::EngineStreamingResetMaxSwaps()
2684+
{
2685+
g_pClientGame->GetManager()->GetObjectStreamer()->ResetStreamerMaxSwaps();
2686+
}
2687+
2688+
void CLuaEngineDefs::EngineStreamingSetFurthestInLimit(int limit)
2689+
{
2690+
g_pClientGame->GetManager()->GetObjectStreamer()->SetStreamerFurthestInLimit(limit);
2691+
}
2692+
2693+
void CLuaEngineDefs::EngineStreamingResetFurthestInLimit()
2694+
{
2695+
g_pClientGame->GetManager()->GetObjectStreamer()->ResetStreamerFurthestInLimit();
2696+
}

Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ class CLuaEngineDefs : public CLuaDefs
9999
static bool EngineRestreamModel(std::uint16_t modelId);
100100
static void EngineRestream(std::optional<RestreamOption> option);
101101

102+
static void EngineStreamingSetLimits(int normalIn, int normalOut, int farIn, int farOut);
103+
static int EngineStreamingGetLimits(lua_State* luaVM);
104+
static void EngineStreamingResetLimits();
105+
static void EngineStreamingSetMaxSwaps(int maxSwaps);
106+
static void EngineStreamingResetMaxSwaps();
107+
static void EngineStreamingSetFurthestInLimit(int limit);
108+
static void EngineStreamingResetFurthestInLimit();
109+
102110
private:
103111
static void AddEngineColClass(lua_State* luaVM);
104112
static void AddEngineTxdClass(lua_State* luaVM);

0 commit comments

Comments
 (0)