2016-01-28 14:52:40 +01:00
|
|
|
/** @file
|
|
|
|
|
*
|
|
|
|
|
* @par History
|
|
|
|
|
* - 2009/09/03 MuadDib: Relocation of multi related cpp/h
|
|
|
|
|
*/
|
2015-01-16 19:44:07 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "cgdata.h"
|
|
|
|
|
|
2018-01-29 21:55:48 +01:00
|
|
|
#include <cstddef>
|
2015-01-16 19:44:07 +01:00
|
|
|
|
2018-01-29 21:55:48 +01:00
|
|
|
#include "../containr.h"
|
|
|
|
|
#include "../fnsearch.h"
|
2015-01-16 19:44:07 +01:00
|
|
|
#include "../mobile/npc.h"
|
|
|
|
|
#include "../module/unimod.h"
|
|
|
|
|
#include "../module/uomod.h"
|
2018-01-29 21:55:48 +01:00
|
|
|
#include "../multi/customhouses.h"
|
|
|
|
|
#include "../multi/house.h"
|
|
|
|
|
#include "../multi/multi.h"
|
2015-01-16 19:44:07 +01:00
|
|
|
#include "../uoexec.h"
|
|
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
namespace Pol
|
|
|
|
|
{
|
|
|
|
|
namespace Network
|
|
|
|
|
{
|
|
|
|
|
ClientGameData::ClientGameData()
|
2018-07-31 14:30:29 +02:00
|
|
|
: vendor( nullptr ),
|
2016-02-19 19:26:35 +01:00
|
|
|
gumpmods(),
|
2018-07-31 14:30:29 +02:00
|
|
|
textentry_uoemod( nullptr ),
|
|
|
|
|
target_cursor_uoemod( nullptr ),
|
|
|
|
|
menu_selection_uoemod( nullptr ),
|
|
|
|
|
popup_menu_selection_uoemod( nullptr ),
|
|
|
|
|
prompt_uoemod( nullptr ),
|
|
|
|
|
resurrect_uoemod( nullptr ),
|
|
|
|
|
selcolor_uoemod( nullptr ),
|
|
|
|
|
prompt_uniemod( nullptr ),
|
|
|
|
|
justice_region( nullptr ),
|
2016-02-19 19:26:35 +01:00
|
|
|
lightlevel( 0 ),
|
2018-07-31 14:30:29 +02:00
|
|
|
// light_region(nullptr),
|
|
|
|
|
music_region( nullptr ),
|
|
|
|
|
weather_region( nullptr ),
|
2019-12-28 13:55:25 +01:00
|
|
|
custom_house_serial( 0 ),
|
2021-10-28 23:08:38 +02:00
|
|
|
custom_house_chrserial( 0 ),
|
2023-12-25 22:02:52 +01:00
|
|
|
update_range( Plib::RANGE_VISUAL )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ClientGameData::~ClientGameData()
|
|
|
|
|
{
|
|
|
|
|
clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientGameData::clear()
|
|
|
|
|
{
|
|
|
|
|
while ( !gumpmods.empty() )
|
|
|
|
|
{
|
|
|
|
|
GumpMods::iterator it = gumpmods.begin();
|
|
|
|
|
Module::UOExecutorModule* uoemod = it->second;
|
2020-02-08 09:21:35 +01:00
|
|
|
uoemod->uoexec().revive();
|
2018-07-31 14:30:29 +02:00
|
|
|
uoemod->gump_chr = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
gumpmods.erase( it );
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( textentry_uoemod != nullptr )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2020-02-08 09:21:35 +01:00
|
|
|
textentry_uoemod->uoexec().revive();
|
2018-07-31 14:30:29 +02:00
|
|
|
textentry_uoemod->textentry_chr = nullptr;
|
|
|
|
|
textentry_uoemod = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( menu_selection_uoemod != nullptr )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2020-02-08 09:21:35 +01:00
|
|
|
menu_selection_uoemod->uoexec().revive();
|
2018-07-31 14:30:29 +02:00
|
|
|
menu_selection_uoemod->menu_selection_chr = nullptr;
|
|
|
|
|
menu_selection_uoemod = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( popup_menu_selection_uoemod != nullptr )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2020-02-08 09:21:35 +01:00
|
|
|
popup_menu_selection_uoemod->uoexec().revive();
|
2018-07-31 14:30:29 +02:00
|
|
|
popup_menu_selection_uoemod->popup_menu_selection_chr = nullptr;
|
|
|
|
|
popup_menu_selection_uoemod->popup_menu_selection_above = nullptr;
|
|
|
|
|
popup_menu_selection_uoemod = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( prompt_uoemod != nullptr )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2020-02-08 09:21:35 +01:00
|
|
|
prompt_uoemod->uoexec().revive();
|
2018-07-31 14:30:29 +02:00
|
|
|
prompt_uoemod->prompt_chr = nullptr;
|
|
|
|
|
prompt_uoemod = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( resurrect_uoemod != nullptr )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2020-02-08 09:21:35 +01:00
|
|
|
resurrect_uoemod->uoexec().revive();
|
2018-07-31 14:30:29 +02:00
|
|
|
resurrect_uoemod->resurrect_chr = nullptr;
|
|
|
|
|
resurrect_uoemod = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( selcolor_uoemod != nullptr )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2020-02-08 09:21:35 +01:00
|
|
|
selcolor_uoemod->uoexec().revive();
|
2018-07-31 14:30:29 +02:00
|
|
|
selcolor_uoemod->selcolor_chr = nullptr;
|
|
|
|
|
selcolor_uoemod = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( target_cursor_uoemod != nullptr )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2020-02-08 09:21:35 +01:00
|
|
|
target_cursor_uoemod->uoexec().revive();
|
2018-07-31 14:30:29 +02:00
|
|
|
target_cursor_uoemod->target_cursor_chr = nullptr;
|
|
|
|
|
target_cursor_uoemod = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( prompt_uniemod != nullptr )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2020-02-08 09:21:35 +01:00
|
|
|
prompt_uniemod->uoexec().revive();
|
2018-07-31 14:30:29 +02:00
|
|
|
prompt_uniemod->prompt_chr = nullptr;
|
|
|
|
|
prompt_uniemod = nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
if ( custom_house_serial != 0 )
|
|
|
|
|
{
|
|
|
|
|
Multi::UMulti* multi = Core::system_find_multi( custom_house_serial );
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( multi != nullptr )
|
2015-01-16 19:44:07 +01:00
|
|
|
{
|
2016-02-19 19:26:35 +01:00
|
|
|
Multi::UHouse* house = multi->as_house();
|
2018-07-31 14:30:29 +02:00
|
|
|
if ( house != nullptr )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2019-12-28 13:55:25 +01:00
|
|
|
Mobile::Character* chr = Core::find_character( custom_house_chrserial );
|
|
|
|
|
house->CustomHousesQuit( chr, false /*drop_changes*/, false /*send_pkts*/ );
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
2015-01-16 19:44:07 +01:00
|
|
|
}
|
2016-02-19 19:26:35 +01:00
|
|
|
custom_house_serial = 0;
|
2015-01-16 19:44:07 +01:00
|
|
|
}
|
2019-12-28 13:55:25 +01:00
|
|
|
custom_house_chrserial = 0;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Registers a gumpid for the given module
|
|
|
|
|
void ClientGameData::add_gumpmod( Module::UOExecutorModule* uoemod, u32 gumpid )
|
|
|
|
|
{
|
|
|
|
|
gumpmods[gumpid] = uoemod;
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-31 14:30:29 +02:00
|
|
|
/// Given a gumpid, finds the module that registered it, returns nullptr if not found
|
2016-02-19 19:26:35 +01:00
|
|
|
Module::UOExecutorModule* ClientGameData::find_gumpmod( u32 gumpid )
|
|
|
|
|
{
|
|
|
|
|
GumpMods::iterator it = gumpmods.find( gumpid );
|
|
|
|
|
if ( it == gumpmods.end() )
|
2018-07-31 14:30:29 +02:00
|
|
|
return nullptr;
|
2016-02-19 19:26:35 +01:00
|
|
|
return it->second;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Removes all the registered gumpids for a given module
|
|
|
|
|
void ClientGameData::remove_gumpmods( Module::UOExecutorModule* uoemod )
|
|
|
|
|
{
|
|
|
|
|
for ( GumpMods::const_iterator it = gumpmods.cbegin(); it != gumpmods.cend(); /* no inc here */ )
|
|
|
|
|
if ( it->second == uoemod )
|
|
|
|
|
gumpmods.erase( it++ );
|
|
|
|
|
else
|
|
|
|
|
++it;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t ClientGameData::estimatedSize() const
|
|
|
|
|
{
|
|
|
|
|
size_t size = sizeof( ClientGameData );
|
|
|
|
|
size += 3 * sizeof( void* ) +
|
|
|
|
|
gumpmods.size() * ( sizeof( Module::UOExecutorModule* ) + 3 * sizeof( void* ) );
|
|
|
|
|
return size;
|
|
|
|
|
}
|
2019-12-28 13:55:25 +01:00
|
|
|
} // namespace Network
|
|
|
|
|
} // namespace Pol
|