From 9f046ff0b7ef71c35bd54d53f9b9be4e17480fe5 Mon Sep 17 00:00:00 2001 From: turleypol Date: Sun, 3 Mar 2024 10:30:33 +0100 Subject: [PATCH] unknown realm defined in startlocations now stops starting the core --- pol-core/pol/create.cpp | 14 +++----------- pol-core/pol/startloc.cpp | 4 ++-- pol-core/pol/startloc.h | 2 +- pol-core/pol/uimport.cpp | 16 ++++++++++++---- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pol-core/pol/create.cpp b/pol-core/pol/create.cpp index 5651b15ad9..e8335a325a 100644 --- a/pol-core/pol/create.cpp +++ b/pol-core/pol/create.cpp @@ -317,9 +317,7 @@ void ClientCreateChar( Network::Client* client, PKTIN_00* msg ) chr->color = cfBEu16( msg->SkinColor ); chr->truecolor = chr->color; - Pos3d coord = gamestate.startlocations[msg->StartIndex]->select_coordinate(); - Realms::Realm* realm = gamestate.startlocations[msg->StartIndex]->realm; - chr->setposition( Pos4d( coord, realm ) ); + chr->setposition( gamestate.startlocations[msg->StartIndex]->select_coordinate() ); chr->facing = Core::FACING_W; chr->position_changed(); @@ -661,10 +659,7 @@ void ClientCreateCharKR( Network::Client* client, PKTIN_8D* msg ) chr->color = cfBEu16( msg->skin_color ); chr->truecolor = chr->color; - Pos3d coord = gamestate.startlocations[0]->select_coordinate(); - Realms::Realm* realm = gamestate.startlocations[0]->realm; - - chr->setposition( Pos4d( coord, realm ) ); + chr->setposition( gamestate.startlocations[0]->select_coordinate() ); chr->position_changed(); chr->facing = Core::FACING_W; @@ -1041,10 +1036,7 @@ void ClientCreateChar70160( Network::Client* client, PKTIN_F8* msg ) chr->color = cfBEu16( msg->SkinColor ); chr->truecolor = chr->color; - Pos3d coord = gamestate.startlocations[msg->StartIndex]->select_coordinate(); - Realms::Realm* realm = gamestate.startlocations[msg->StartIndex]->realm; - - chr->setposition( Pos4d( coord, realm ) ); + chr->setposition( gamestate.startlocations[msg->StartIndex]->select_coordinate() ); chr->position_changed(); chr->facing = Core::FACING_W; diff --git a/pol-core/pol/startloc.cpp b/pol-core/pol/startloc.cpp index a2c739a960..307fcbe484 100644 --- a/pol-core/pol/startloc.cpp +++ b/pol-core/pol/startloc.cpp @@ -12,11 +12,11 @@ namespace Pol { namespace Core { -Pos3d StartingLocation::select_coordinate() const +Pos4d StartingLocation::select_coordinate() const { int sidx = Clib::random_int( static_cast( coords.size() - 1 ) ); - return coords[sidx]; + return Pos4d( coords[sidx], realm ); } size_t StartingLocation::estimateSize() const diff --git a/pol-core/pol/startloc.h b/pol-core/pol/startloc.h index 41318c1d01..9b1128be93 100644 --- a/pol-core/pol/startloc.h +++ b/pol-core/pol/startloc.h @@ -35,7 +35,7 @@ class StartingLocation */ std::vector coords; - Pos3d select_coordinate() const; + Pos4d select_coordinate() const; size_t estimateSize() const; }; } // namespace Core diff --git a/pol-core/pol/uimport.cpp b/pol-core/pol/uimport.cpp index 24b30ae260..42062942a5 100644 --- a/pol-core/pol/uimport.cpp +++ b/pol-core/pol/uimport.cpp @@ -1298,16 +1298,24 @@ void read_starting_locations() loc->desc = elem.remove_string( "DESCRIPTION" ); loc->mapid = elem.remove_ushort( "MAPID", 0 ); loc->cliloc_desc = elem.remove_unsigned( "CLILOC", 1075072 ); - loc->realm = find_realm( elem.remove_string( "REALM", "britannia" ) ); - + auto realmstr = elem.remove_string( "REALM", "britannia" ); + loc->realm = find_realm( realmstr ); + if ( !loc->realm ) + { + ERROR_PRINTLN( "Unknown realm in startloc.cfg: '{}' for city {}, description {}", realmstr, + loc->city, loc->desc ); + throw std::runtime_error( "Configuration file error in startloc.cfg." ); + } std::string coord; while ( elem.remove_prop( "Coordinate", &coord ) ) { int x, y, z; if ( sscanf( coord.c_str(), "%d,%d,%d", &x, &y, &z ) == 3 ) { - loc->coords.push_back( - Pos3d( static_cast( x ), static_cast( y ), static_cast( z ) ) ); + auto pos = Pos3d( Clib::clamp_convert( x ), Clib::clamp_convert( y ), + Clib::clamp_convert( z ) ); + pos.crop( loc->realm ); + loc->coords.emplace_back( std::move( pos ) ); } else {