Fix launcher crash when completely missing resume info, port respawn changes by goodly to C client

This commit is contained in:
UnknownShadow200 2019-01-08 20:23:27 +11:00
parent f889ae6223
commit d2fa018b17
3 changed files with 43 additions and 30 deletions

View File

@ -179,9 +179,9 @@ namespace ClassicalSharp.Entities {
Vector3I P = Vector3I.Floor(spawn); Vector3I P = Vector3I.Floor(spawn);
AABB bb; AABB bb;
// Spawn player at highest valid position // Spawn player at highest solid position to match vanilla Minecraft classic
if (Hacks.CanNoclip) { // Only when player can noclip, since this can let you 'clip' to above solid blocks
if (game.World.IsValidPos(P)) { if (Hacks.CanNoclip && game.World.IsValidPos(P)) {
bb = AABB.Make(spawn, Size); bb = AABB.Make(spawn, Size);
for (int y = P.Y; y <= game.World.Height; y++) { for (int y = P.Y; y <= game.World.Height; y++) {
float spawnY = Respawn.HighestFreeY(game, ref bb); float spawnY = Respawn.HighestFreeY(game, ref bb);
@ -194,7 +194,6 @@ namespace ClassicalSharp.Entities {
bb.Min.Y += 1; bb.Max.Y += 1; bb.Min.Y += 1; bb.Max.Y += 1;
} }
} }
}
spawn.Y += 2/16f; spawn.Y += 2/16f;
LocationUpdate update = LocationUpdate.MakePosAndOri(spawn, SpawnRotY, SpawnHeadX, false); LocationUpdate update = LocationUpdate.MakePosAndOri(spawn, SpawnRotY, SpawnHeadX, false);
@ -224,15 +223,16 @@ namespace ClassicalSharp.Entities {
game.Chat.Add("&cCannot set spawn midair when noclip is disabled"); game.Chat.Add("&cCannot set spawn midair when noclip is disabled");
return false; return false;
} }
// Spawn is normally centered to match vanilla Minecraft classic
if (!Hacks.CanNoclip) { if (!Hacks.CanNoclip) {
Spawn.X = Position.X; Spawn = Position;
Spawn.Y = Position.Y;
Spawn.Z = Position.Z;
} else { } else {
Spawn.X = Utils.Floor(Position.X) + 0.5f; Spawn.X = Utils.Floor(Position.X) + 0.5f;
Spawn.Y = Position.Y; Spawn.Y = Position.Y;
Spawn.Z = Utils.Floor(Position.Z) + 0.5f; Spawn.Z = Utils.Floor(Position.Z) + 0.5f;
} }
SpawnRotY = RotY; SpawnRotY = RotY;
SpawnHeadX = HeadX; SpawnHeadX = HeadX;
} }

View File

@ -958,8 +958,9 @@ static void LocalPlayer_DoRespawn(void) {
if (!World_Blocks) return; if (!World_Blocks) return;
Vector3I_Floor(&pos, &spawn); Vector3I_Floor(&pos, &spawn);
/* Spawn player at highest valid position */ /* Spawn player at highest solid position to match vanilla Minecraft classic */
if (World_IsValidPos_3I(pos)) { /* Only when player can noclip, since this can let you 'clip' to above solid blocks */
if (p->Hacks.CanNoclip && World_IsValidPos_3I(pos)) {
AABB_Make(&bb, &spawn, &p->Base.Size); AABB_Make(&bb, &spawn, &p->Base.Size);
for (y = pos.Y; y <= World_Height; y++) { for (y = pos.Y; y <= World_Height; y++) {
spawnY = Respawn_HighestSolidY(&bb); spawnY = Respawn_HighestSolidY(&bb);
@ -1000,9 +1001,21 @@ static bool LocalPlayer_HandleRespawn(void) {
static bool LocalPlayer_HandleSetSpawn(void) { static bool LocalPlayer_HandleSetSpawn(void) {
struct LocalPlayer* p = &LocalPlayer_Instance; struct LocalPlayer* p = &LocalPlayer_Instance;
if (p->Hacks.CanRespawn) { if (p->Hacks.CanRespawn) {
if (!p->Hacks.CanNoclip && !p->Base.OnGround) {
Chat_AddRaw("&cCannot set spawn midair when noclip is disabled");
return false;
}
/* Spawn is normally centered to match vanilla Minecraft classic */
if (!p->Hacks.CanNoclip) {
p->Spawn = p->Base.Position;
} else {
p->Spawn.X = Math_Floor(p->Base.Position.X) + 0.5f; p->Spawn.X = Math_Floor(p->Base.Position.X) + 0.5f;
p->Spawn.Y = p->Base.Position.Y; p->Spawn.Y = p->Base.Position.Y;
p->Spawn.Z = Math_Floor(p->Base.Position.Z) + 0.5f; p->Spawn.Z = Math_Floor(p->Base.Position.Z) + 0.5f;
}
p->SpawnRotY = p->Base.RotY; p->SpawnRotY = p->Base.RotY;
p->SpawnHeadX = p->Base.HeadX; p->SpawnHeadX = p->Base.HeadX;
} }

View File

@ -665,14 +665,14 @@ struct ResumeInfo {
CC_NOINLINE static void MainScreen_GetResume(struct ResumeInfo* info, bool full) { CC_NOINLINE static void MainScreen_GetResume(struct ResumeInfo* info, bool full) {
String_InitArray(info->Server, info->_serverBuffer); String_InitArray(info->Server, info->_serverBuffer);
Options_Get("launcher-server", &info->Server, NULL); Options_Get("launcher-server", &info->Server, "");
String_InitArray(info->User, info->_userBuffer); String_InitArray(info->User, info->_userBuffer);
Options_Get("launcher-username", &info->User, NULL); Options_Get("launcher-username", &info->User, "");
String_InitArray(info->Ip, info->_ipBuffer); String_InitArray(info->Ip, info->_ipBuffer);
Options_Get("launcher-ip", &info->Ip, NULL); Options_Get("launcher-ip", &info->Ip, "");
String_InitArray(info->Port, info->_portBuffer); String_InitArray(info->Port, info->_portBuffer);
Options_Get("launcher-port", &info->Port, NULL); Options_Get("launcher-port", &info->Port, "");
if (!full) return; if (!full) return;
String_InitArray(info->Mppass, info->_mppassBuffer); String_InitArray(info->Mppass, info->_mppassBuffer);
@ -683,7 +683,7 @@ CC_NOINLINE static void MainScreen_GetResume(struct ResumeInfo* info, bool full)
info->Ip.length && info->Port.length; info->Ip.length && info->Port.length;
} }
CC_NOINLINE void MainScreen_Error(struct LWebTask* task, const char* action) { CC_NOINLINE static void MainScreen_Error(struct LWebTask* task, const char* action) {
String str; char strBuffer[STRING_SIZE]; String str; char strBuffer[STRING_SIZE];
struct MainScreen* s = &MainScreen_Instance; struct MainScreen* s = &MainScreen_Instance;