polserver/pol-core/pol/network/cgdata.cpp

171 lines
4.2 KiB
C++
Raw Permalink Normal View History

/** @file
*
* @par History
* - 2009/09/03 MuadDib: Relocation of multi related cpp/h
*/
#include "cgdata.h"
#include <cstddef>
#include "../containr.h"
#include "../fnsearch.h"
#include "../mobile/npc.h"
#include "../module/unimod.h"
#include "../module/uomod.h"
#include "../multi/customhouses.h"
#include "../multi/house.h"
#include "../multi/multi.h"
#include "../uoexec.h"
namespace Pol
{
namespace Network
{
ClientGameData::ClientGameData()
2018-07-31 14:30:29 +02:00
: vendor( nullptr ),
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 ),
lightlevel( 0 ),
2018-07-31 14:30:29 +02:00
// light_region(nullptr),
music_region( nullptr ),
weather_region( nullptr ),
custom_house_serial( 0 ),
custom_house_chrserial( 0 ),
update_range( Plib::RANGE_VISUAL )
{
}
ClientGameData::~ClientGameData()
{
clear();
}
void ClientGameData::clear()
{
while ( !gumpmods.empty() )
{
GumpMods::iterator it = gumpmods.begin();
Module::UOExecutorModule* uoemod = it->second;
uoemod->uoexec().revive();
2018-07-31 14:30:29 +02:00
uoemod->gump_chr = nullptr;
gumpmods.erase( it );
}
2018-07-31 14:30:29 +02:00
if ( textentry_uoemod != nullptr )
{
textentry_uoemod->uoexec().revive();
2018-07-31 14:30:29 +02:00
textentry_uoemod->textentry_chr = nullptr;
textentry_uoemod = nullptr;
}
2018-07-31 14:30:29 +02:00
if ( menu_selection_uoemod != nullptr )
{
menu_selection_uoemod->uoexec().revive();
2018-07-31 14:30:29 +02:00
menu_selection_uoemod->menu_selection_chr = nullptr;
menu_selection_uoemod = nullptr;
}
2018-07-31 14:30:29 +02:00
if ( popup_menu_selection_uoemod != nullptr )
{
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;
}
2018-07-31 14:30:29 +02:00
if ( prompt_uoemod != nullptr )
{
prompt_uoemod->uoexec().revive();
2018-07-31 14:30:29 +02:00
prompt_uoemod->prompt_chr = nullptr;
prompt_uoemod = nullptr;
}
2018-07-31 14:30:29 +02:00
if ( resurrect_uoemod != nullptr )
{
resurrect_uoemod->uoexec().revive();
2018-07-31 14:30:29 +02:00
resurrect_uoemod->resurrect_chr = nullptr;
resurrect_uoemod = nullptr;
}
2018-07-31 14:30:29 +02:00
if ( selcolor_uoemod != nullptr )
{
selcolor_uoemod->uoexec().revive();
2018-07-31 14:30:29 +02:00
selcolor_uoemod->selcolor_chr = nullptr;
selcolor_uoemod = nullptr;
}
2018-07-31 14:30:29 +02:00
if ( target_cursor_uoemod != nullptr )
{
target_cursor_uoemod->uoexec().revive();
2018-07-31 14:30:29 +02:00
target_cursor_uoemod->target_cursor_chr = nullptr;
target_cursor_uoemod = nullptr;
}
2018-07-31 14:30:29 +02:00
if ( prompt_uniemod != nullptr )
{
prompt_uniemod->uoexec().revive();
2018-07-31 14:30:29 +02:00
prompt_uniemod->prompt_chr = nullptr;
prompt_uniemod = nullptr;
}
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 )
{
Multi::UHouse* house = multi->as_house();
2018-07-31 14:30:29 +02:00
if ( house != nullptr )
{
Mobile::Character* chr = Core::find_character( custom_house_chrserial );
house->CustomHousesQuit( chr, false /*drop_changes*/, false /*send_pkts*/ );
}
}
custom_house_serial = 0;
}
custom_house_chrserial = 0;
}
/// 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
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;
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;
}
} // namespace Network
} // namespace Pol