Merge pull request #8 from sylvessa/fix/random-fixes

Fix flight, entity ids, chunk loading speeds, and autosave ui for dedi removal
This commit is contained in:
kuwa 2026-03-15 21:37:39 +09:00 committed by GitHub
commit 3a91e830f9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 305 additions and 265 deletions

View file

@ -657,7 +657,7 @@ bool MinecraftServer::initServer(int64_t seed, NetworkGameInitData *initData, DW
setFlightAllowed(GetDedicatedServerBool(settings, L"allow-flight", true)); setFlightAllowed(GetDedicatedServerBool(settings, L"allow-flight", true));
// 4J Stu - Enabling flight to stop it kicking us when we use it // 4J Stu - Enabling flight to stop it kicking us when we use it
#ifdef _DEBUG_MENUS_ENABLED #if (defined _DEBUG_MENUS_ENABLED && defined _DEBUG)
setFlightAllowed(true); setFlightAllowed(true);
#endif #endif
@ -1848,8 +1848,9 @@ void MinecraftServer::run(int64_t seed, void *lpParameter)
switch(eAction) switch(eAction)
{ {
case eXuiServerAction_AutoSaveGame: case eXuiServerAction_AutoSaveGame:
#if defined(_XBOX_ONE) || defined(__ORBIS__) #if defined(_XBOX_ONE) || defined(__ORBIS__) || defined(MINECRAFT_SERVER_BUILD)
{ {
#if defined(_XBOX_ONE) || defined(__ORBIS__)
PIXBeginNamedEvent(0, "Autosave"); PIXBeginNamedEvent(0, "Autosave");
// Get the frequency of the timer // Get the frequency of the timer
@ -1860,6 +1861,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter)
// Save the start time // Save the start time
QueryPerformanceCounter(&qwTime); QueryPerformanceCounter(&qwTime);
#endif
if (players != nullptr) if (players != nullptr)
{ {
@ -1873,26 +1875,39 @@ void MinecraftServer::run(int64_t seed, void *lpParameter)
// with the data from the nethers leveldata. // with the data from the nethers leveldata.
// Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting. // Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting.
ServerLevel *level = levels[levels.length - 1 - j]; ServerLevel *level = levels[levels.length - 1 - j];
#if defined(_XBOX_ONE) || defined(__ORBIS__)
PIXBeginNamedEvent(0, "Saving level %d", levels.length - 1 - j); PIXBeginNamedEvent(0, "Saving level %d", levels.length - 1 - j);
#endif
level->save(false, nullptr, true); level->save(false, nullptr, true);
#if defined(_XBOX_ONE) || defined(__ORBIS__)
PIXEndNamedEvent(); PIXEndNamedEvent();
#endif
} }
if (!s_bServerHalted) if (!s_bServerHalted)
{ {
#if defined(_XBOX_ONE) || defined(__ORBIS__)
PIXBeginNamedEvent(0, "Saving game rules"); PIXBeginNamedEvent(0, "Saving game rules");
#endif
saveGameRules(); saveGameRules();
#if defined(_XBOX_ONE) || defined(__ORBIS__)
PIXEndNamedEvent(); PIXEndNamedEvent();
PIXBeginNamedEvent(0, "Save to disc"); PIXBeginNamedEvent(0, "Save to disc");
#endif
levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, true); levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, true);
#if defined(_XBOX_ONE) || defined(__ORBIS__)
PIXEndNamedEvent(); PIXEndNamedEvent();
#endif
} }
#if defined(_XBOX_ONE) || defined(__ORBIS__)
PIXEndNamedEvent(); PIXEndNamedEvent();
QueryPerformanceCounter(&qwNewTime); QueryPerformanceCounter(&qwNewTime);
qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart;
fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart));
app.DebugPrintf("Autosave: Elapsed time %f\n", fElapsedTime); app.DebugPrintf("Autosave: Elapsed time %f\n", fElapsedTime);
#endif
} }
break; break;
#endif #endif
@ -2375,6 +2390,9 @@ bool MinecraftServer::chunkPacketManagement_CanSendTo(INetworkPlayer *player)
{ {
if( player == nullptr ) return false; if( player == nullptr ) return false;
#ifdef MINECRAFT_SERVER_BUILD
return true;
#else
int time = GetTickCount(); int time = GetTickCount();
DWORD currentPlayerCount = g_NetworkManager.GetPlayerCount(); DWORD currentPlayerCount = g_NetworkManager.GetPlayerCount();
if( currentPlayerCount == 0 ) return false; if( currentPlayerCount == 0 ) return false;
@ -2386,6 +2404,7 @@ bool MinecraftServer::chunkPacketManagement_CanSendTo(INetworkPlayer *player)
} }
return false; return false;
#endif
} }
void MinecraftServer::chunkPacketManagement_DidSendTo(INetworkPlayer *player) void MinecraftServer::chunkPacketManagement_DidSendTo(INetworkPlayer *player)

View file

@ -146,7 +146,8 @@ void ServerPlayer::flagEntitiesToBeRemoved(unsigned int *flags, bool *removedFou
if( ( *removedFound ) == false ) if( ( *removedFound ) == false )
{ {
*removedFound = true; *removedFound = true;
memset(flags, 0, 2048/32); // before this left 192 bytes uninitialized!!!!!
memset(flags, 0, (2048 / 32) * sizeof(unsigned int));
} }
for(int index : entitiesToRemove) for(int index : entitiesToRemove)
@ -376,6 +377,9 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks)
// connection->done); // connection->done);
// } // }
#ifdef MINECRAFT_SERVER_BUILD
if (dontDelayChunks || (canSendToPlayer && !connection->done))
#else
if( dontDelayChunks || if( dontDelayChunks ||
(canSendToPlayer && (canSendToPlayer &&
#ifdef _XBOX_ONE #ifdef _XBOX_ONE
@ -390,6 +394,7 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks)
#endif #endif
//(tickCount - lastBrupSendTickCount) > (connection->getNetworkPlayer()->GetCurrentRtt()>>4) && //(tickCount - lastBrupSendTickCount) > (connection->getNetworkPlayer()->GetCurrentRtt()>>4) &&
!connection->done) ) !connection->done) )
#endif
{ {
lastBrupSendTickCount = tickCount; lastBrupSendTickCount = tickCount;
okToSend = true; okToSend = true;

View file

@ -96,9 +96,20 @@ int Entity::getSmallId()
puiUsedFlags++; puiUsedFlags++;
} }
#ifdef MINECRAFT_SERVER_BUILD
// in mc server dedi, a server with 8+ playerrs can cause this to go wack
int fallbackId = Entity::entityCounter++;
if (entityCounter == 0x7ffffff)
{
entityCounter = 2048;
}
return fallbackId;
#else
app.DebugPrintf("Out of small entity Ids... possible leak?\n"); app.DebugPrintf("Out of small entity Ids... possible leak?\n");
__debugbreak(); __debugbreak();
return -1; return -1;
#endif
} }
void Entity::countFlagsForPIX() void Entity::countFlagsForPIX()

View file

@ -16,7 +16,12 @@ using namespace std;
// 4J Stu - This value should be big enough that we don't get any crashes causes by memory overwrites, // 4J Stu - This value should be big enough that we don't get any crashes causes by memory overwrites,
// however it does seem way too large for what is actually needed. Needs further investigation // however it does seem way too large for what is actually needed. Needs further investigation
#ifdef MINECRAFT_SERVER_BUILD
// fixes a crash when 8+ players are present
#define LEVEL_CHUNKS_TO_UPDATE_MAX (32*32*8)
#else
#define LEVEL_CHUNKS_TO_UPDATE_MAX (19*19*8) #define LEVEL_CHUNKS_TO_UPDATE_MAX (19*19*8)
#endif
class Vec3; class Vec3;
class ChunkSource; class ChunkSource;