Fix EGS sheet rebuild crashes

This commit is contained in:
kaetemi 2014-09-23 13:54:02 +02:00
parent 4a95333992
commit 32c0f2d7f7
2 changed files with 46 additions and 48 deletions

View file

@ -237,24 +237,12 @@ void SItemSpecialEffects::serial(class NLMISC::IStream &f)
//-------------------------------------------------------------- //--------------------------------------------------------------
// init() // init()
//-------------------------------------------------------------- //--------------------------------------------------------------
void CStaticItem::init() void CStaticItem::init(bool doDelete)
{ {
Family = ITEMFAMILY::UNDEFINED; Family = ITEMFAMILY::UNDEFINED;
Type = ITEM_TYPE::UNDEFINED; Type = ITEM_TYPE::UNDEFINED;
Armor = NULL; clearPtrs(doDelete);
MeleeWeapon = NULL;
RangeWeapon = NULL;
Ammo = NULL;
Shield = NULL;
TamingTool = NULL;
Mp = NULL;
GuildOption = NULL;
Cosmetics = NULL;
ItemServiceData = NULL;
ConsumableItem = NULL;
XpCatalyser = NULL;
CommandTicket = NULL;
Skill = SKILLS::unknown; Skill = SKILLS::unknown;
MinSkill = 0; MinSkill = 0;
@ -287,16 +275,54 @@ void CStaticItem::init()
RequiredCharacQualityFactor = 0.0f; RequiredCharacQualityFactor = 0.0f;
RequiredCharacQualityOffset = 0; RequiredCharacQualityOffset = 0;
ItemSpecialEffects = NULL;
} // init // } // init //
// ***************************************************************************
void CStaticItem::clearPtrs(bool doDelete)
{
if (doDelete)
{
delete Armor;
delete MeleeWeapon;
delete RangeWeapon;
delete Ammo;
delete Shield;
delete TamingTool;
delete Mp;
delete GuildOption;
delete Cosmetics;
delete ItemServiceData;
delete ConsumableItem;
delete XpCatalyser;
delete CommandTicket;
delete ItemSpecialEffects;
}
Armor = NULL;
MeleeWeapon = NULL;
RangeWeapon = NULL;
Ammo = NULL;
Shield = NULL;
TamingTool = NULL;
Mp = NULL;
GuildOption = NULL;
Cosmetics = NULL;
ItemServiceData = NULL;
ConsumableItem = NULL;
XpCatalyser = NULL;
CommandTicket = NULL;
ItemSpecialEffects = NULL;
}
//-------------------------------------------------------------- //--------------------------------------------------------------
// copy constructor // copy constructor
//-------------------------------------------------------------- //--------------------------------------------------------------
CStaticItem::CStaticItem( const CStaticItem& itm ) CStaticItem::CStaticItem( const CStaticItem& itm )
{ {
clearPtrs(false);
*this = itm; *this = itm;
if(itm.Armor) if(itm.Armor)
{ {
@ -1443,6 +1469,9 @@ void CStaticItem::readGeorges (const NLMISC::CSmartPtr<NLGEORGES::UForm> &form,
if (form == NULL) if (form == NULL)
return; return;
// Clear pointers to previous data
clearPtrs(true);
// Get the root node, always exist // Get the root node, always exist
UFormElm &root = form->getRootNode (); UFormElm &root = form->getRootNode ();
@ -1993,37 +2022,6 @@ float CStaticItem::getBaseWeight() const
} }
#endif #endif
// ***************************************************************************
void CStaticItem::clearPtrs(bool doDelete)
{
if(doDelete)
{
if (Ammo != NULL ) delete Ammo;
if (Armor != NULL ) delete Armor;
if (MeleeWeapon != NULL ) delete MeleeWeapon;
if (RangeWeapon != NULL ) delete RangeWeapon;
if (Cosmetics != NULL ) delete Cosmetics;
if (Mp != NULL ) delete Mp;
if (GuildOption != NULL ) delete GuildOption;
if (Shield != NULL ) delete Shield;
if (TamingTool != NULL) delete TamingTool;
if (ItemServiceData != NULL) delete ItemServiceData;
if (CommandTicket != NULL) delete CommandTicket;
}
Ammo = NULL;
Armor = NULL;
MeleeWeapon = NULL;
RangeWeapon = NULL;
Cosmetics = NULL;
Mp = NULL;
GuildOption = NULL;
Shield = NULL;
TamingTool = NULL;
ItemServiceData = NULL;
CommandTicket = NULL;
}
uint32 CStaticItem::getMaxStackSize() const uint32 CStaticItem::getMaxStackSize() const
{ {

View file

@ -812,13 +812,13 @@ public:
public: public:
/// Constructor /// Constructor
CStaticItem() { init(); } CStaticItem() { init(false); }
/// copy constructor /// copy constructor
CStaticItem( const CStaticItem& itm ); CStaticItem( const CStaticItem& itm );
/// init method /// init method
void init(); void init(bool doDelete = true);
/// destructor /// destructor
virtual ~CStaticItem(); virtual ~CStaticItem();