Fix Hanging When No Valid Spawn Point Exists
This commit is contained in:
parent
71946d2087
commit
b71c089fb3
@ -57,6 +57,7 @@
|
||||
* `Text Rendering Fixes` (Enabled By Default)
|
||||
* `Close Editor When Sign Is Destroyed` (Enabled By Default)
|
||||
* `Remove Chest Placement Restrictions` (Enabled By Default)
|
||||
* `Fix Hanging When No Valid Spawn Point Exists` (Enabled By Default)
|
||||
* Existing Functionality (All Enabled By Default)
|
||||
* `Fix Screen Rendering When Hiding HUD`
|
||||
* `Sanitize Usernames`
|
||||
|
@ -135,6 +135,7 @@ CATEGORY Bug Fixes
|
||||
TRUE Close Current Screen On Death
|
||||
TRUE Fix Reloading Textures On Resize
|
||||
TRUE Fix options.txt Loading/Saving
|
||||
TRUE Fix Hanging When No Valid Spawn Point Exists
|
||||
CATEGORY Logging
|
||||
FALSE Log FPS
|
||||
TRUE Log Chat Messages
|
||||
|
@ -468,6 +468,31 @@ static SignTileEntity *SignTileEntity_destructor_injection(SignTileEntity_destru
|
||||
return original(self);
|
||||
}
|
||||
|
||||
// Fix Spawn Point Hanging
|
||||
static constexpr int allowed_spawn_point_tries = 10000;
|
||||
static constexpr int not_finding_spawn_point = -1;
|
||||
static int spawn_point_tries = not_finding_spawn_point;
|
||||
static void Level_setInitialSpawn_or_validateSpawn_injection(Level_setInitialSpawn_t original, Level *self) {
|
||||
spawn_point_tries = allowed_spawn_point_tries;
|
||||
original(self);
|
||||
spawn_point_tries = not_finding_spawn_point;
|
||||
}
|
||||
static int Level_getTopTile_injection(Level_getTopTile_t original, Level *self, int x, int z) {
|
||||
bool actually_check = true;
|
||||
if (spawn_point_tries == 0) {
|
||||
// Give Up Searching
|
||||
actually_check = false;
|
||||
} else if (spawn_point_tries > 0) {
|
||||
// Count Down
|
||||
spawn_point_tries--;
|
||||
}
|
||||
if (actually_check) {
|
||||
return original(self, x, z);
|
||||
} else {
|
||||
return Tile::bedrock->id;
|
||||
}
|
||||
}
|
||||
|
||||
// Init
|
||||
void init_misc() {
|
||||
// Sanitize Username
|
||||
@ -636,6 +661,13 @@ void init_misc() {
|
||||
overwrite_calls(SignTileEntity_destructor_complete, SignTileEntity_destructor_injection);
|
||||
}
|
||||
|
||||
// Fix Hanging When Spawning
|
||||
if (feature_has("Fix Hanging When No Valid Spawn Point Exists", server_enabled)) {
|
||||
overwrite_calls(Level_setInitialSpawn, Level_setInitialSpawn_or_validateSpawn_injection);
|
||||
overwrite_calls(Level_validateSpawn, Level_setInitialSpawn_or_validateSpawn_injection);
|
||||
overwrite_calls(Level_getTopTile, Level_getTopTile_injection);
|
||||
}
|
||||
|
||||
// Disable overwrite_calls() After Minecraft::init
|
||||
misc_run_on_init([](__attribute__((unused)) Minecraft *minecraft) {
|
||||
thunk_enabler = [](__attribute__((unused)) void *a, __attribute__((unused)) void *b) -> void * {
|
||||
|
@ -51,6 +51,8 @@ method bool canSeeSky(int x, int y, int z) = 0xa39b8;
|
||||
method bool isDay() = 0xa3d9c;
|
||||
method int getTopTile(int x, int z) = 0xa2cc8;
|
||||
method BiomeSource *getBiomeSource() = 0xa3c64;
|
||||
method void setInitialSpawn() = 0xa2bf4;
|
||||
method void validateSpawn() = 0xa2d2c;
|
||||
|
||||
virtual-method void tick() = 0x28;
|
||||
virtual-method void updateSleepingPlayerList() = 0x2c;
|
||||
|
Loading…
Reference in New Issue
Block a user