mirror of
https://github.com/polserver/polserver
synced 2026-08-13 08:23:08 -04:00
98 lines
2.2 KiB
C++
98 lines
2.2 KiB
C++
/** @file
|
|
*
|
|
* @par History
|
|
*/
|
|
|
|
|
|
#include "uoskills.h"
|
|
|
|
#include <stddef.h>
|
|
|
|
#include "../clib/cfgelem.h"
|
|
#include "../plib/pkg.h"
|
|
#include "globals/uvars.h"
|
|
#include "mobile/attribute.h"
|
|
#include "skillid.h"
|
|
|
|
namespace Pol
|
|
{
|
|
namespace Core
|
|
{
|
|
const UOSkill& GetUOSkill( unsigned skillid )
|
|
{
|
|
if ( skillid < gamestate.uo_skills.size() )
|
|
return gamestate.uo_skills[skillid];
|
|
else
|
|
throw std::runtime_error( "Bad UO Skill ID" );
|
|
}
|
|
|
|
UOSkill::UOSkill( const Plib::Package* pkg, Clib::ConfigElem& elem )
|
|
: inited( true ),
|
|
skillid( strtoul( elem.rest(), nullptr, 10 ) ),
|
|
attributename( elem.remove_string( "Attribute", "" ) ),
|
|
pAttr( nullptr ),
|
|
pkg( pkg )
|
|
{
|
|
if ( skillid >= 500 )
|
|
elem.throw_error( "SkillID must be < 500" );
|
|
|
|
if ( !attributename.empty() )
|
|
{
|
|
bool required = false;
|
|
if ( attributename[0] == '+' )
|
|
{
|
|
required = true;
|
|
attributename = attributename.substr( 1, std::string::npos );
|
|
}
|
|
pAttr = Mobile::Attribute::FindAttribute( attributename );
|
|
if ( !pAttr )
|
|
{
|
|
if ( required )
|
|
{
|
|
elem.throw_error( "Attribute " + attributename + " not found." );
|
|
}
|
|
else
|
|
{
|
|
elem.warn( "Attribute " + attributename + " not found." );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
UOSkill::UOSkill()
|
|
: inited( false ), skillid( 0 ), attributename( "" ), pAttr( nullptr ), pkg( nullptr )
|
|
{
|
|
}
|
|
|
|
size_t UOSkill::estimateSize() const
|
|
{
|
|
return sizeof( UOSkill ) + attributename.capacity();
|
|
}
|
|
|
|
void load_skill_entry( const Plib::Package* pkg, Clib::ConfigElem& elem )
|
|
{
|
|
UOSkill uoskill( pkg, elem );
|
|
|
|
if ( uoskill.skillid >= gamestate.uo_skills.size() )
|
|
gamestate.uo_skills.resize( uoskill.skillid + 1 );
|
|
|
|
if ( gamestate.uo_skills[uoskill.skillid].inited )
|
|
{
|
|
elem.throw_error( "UOSkill " + fmt::FormatInt( uoskill.skillid ).str() +
|
|
" already defined by " + gamestate.uo_skills[uoskill.skillid].pkg->desc() );
|
|
}
|
|
|
|
gamestate.uo_skills[uoskill.skillid] = uoskill;
|
|
}
|
|
|
|
void load_uoskills_cfg()
|
|
{
|
|
gamestate.uo_skills.resize( SKILLID__COUNT );
|
|
Plib::load_packaged_cfgs( "uoskills.cfg", "Skill", load_skill_entry );
|
|
}
|
|
|
|
void clean_skills()
|
|
{
|
|
gamestate.uo_skills.clear();
|
|
}
|
|
} // namespace Core
|
|
} // namespace Pol
|