uox3/source/cBaseObject.h
Xoduz 2e0af73968 Poison fixes
Fixed an issue with poison damage in combat where the poison resist of the attacker was checked instead of that of the defender
Fixed an issue where the poison details in tooltip of an item would only be visible when equipped, and not visible when kept in backpack
Fixed an issue where if a weapon was destroyed due to corrosion damage, it would not unset the poison strength on the character who wielded it
Added new Character/Item property to track the source (serial) of poison applied to an object. This is available as a JS Char/Item property:
	.poisonedBy // serial of character who applied poison to an object. Set to 0xFFFFFFFF/SE_INVALIDSERIAL() to clear
Updated all code and scripts related to setting/unsetting poison effect on objects to also update the .poisonedBy property
Serial of character who poisoned a character who died while poisoned is now stored on the corpse
Added third optional parameter to Character JS Method .SetPoisoned() that can be used to specify source char of applied poison. New syntax:
	.SetPoisoned( poisonLevel, wearOffTime[, poisonSourceChar ])
2025-07-04 01:17:04 +08:00

398 lines
12 KiB
C++

//o------------------------------------------------------------------------------------------------o
//| File - cBaseObject.h
//o------------------------------------------------------------------------------------------------o
//| Purpose - Defines the property specifications for the base object class
//o------------------------------------------------------------------------------------------------o
#ifndef __CBO_H__
#define __CBO_H__
#include "typedefs.h"
#include "uoxstruct.h"
enum TAGMAPOBJECT_TYPE
{
TAGMAP_TYPE_INT = 0,
TAGMAP_TYPE_STRING,
TAGMAP_TYPE_BOOL
};
typedef struct __TAGMAP_STRUCT__
{
UI08 m_ObjectType;
SI32 m_IntValue;
bool m_Destroy;
std::string m_StringValue;
} TAGMAPOBJECT, *LPTAGMAPOBJECT;
typedef std::map<std::string, TAGMAPOBJECT> TAGMAP2;
typedef std::map<std::string, TAGMAPOBJECT>::iterator TAGMAP2_ITERATOR;
typedef std::map<std::string, TAGMAPOBJECT>::const_iterator TAGMAP2_CITERATOR;
enum UpdateTypes
{
UT_UPDATE = 0,
UT_LOCATION,
UT_HITPOINTS,
UT_STAMINA,
UT_MANA,
UT_HIDE,
UT_STATWINDOW,
UT_COUNT
};
//o------------------------------------------------------------------------------------------------o
//| Class - class CBaseObject
//o------------------------------------------------------------------------------------------------o
//| Purpose - BaseObject class with common, shared properties for all object types
//o------------------------------------------------------------------------------------------------o
class CBaseObject
{
protected:
TAGMAP2 tags;
TAGMAP2 tempTags;
std::string title;
ObjectType objType;
RACEID race;
SI16 x;
SI16 y;
SI08 z;
UI16 id;
UI16 colour;
UI08 dir;
SERIAL serial;
CMultiObj *multis;
SERIAL spawnSerial;
SERIAL owner;
UI08 worldNumber;
UI16 instanceId;
SI16 strength;
SI16 dexterity;
SI16 intelligence;
SI16 hitpoints;
SI16 healthRegenBonus;
SI16 staminaRegenBonus;
SI16 manaRegenBonus;
SI16 luck;
SI16 hitChance;
SI16 defenseChance;
VisibleTypes visible;
SI16 hiDamage;
SI16 loDamage;
SI32 weight;
SI16 mana;
SI16 stamina;
SI16 swingSpeedIncrease;
SI16 damageIncrease;
SI16 healthLeech;
SI16 staminaLeech;
SI16 manaLeech;
SI32 tithing;
UI16 scriptTrig;
SI16 st2;
SI16 dx2;
SI16 in2;
SI16 healthBonus;
SI16 staminaBonus;
SI16 manaBonus;
mutable SI32 FilePosition;
SERIAL tempMulti;
std::string name;
std::string sectionId;
std::vector<UI16> scriptTriggers;
UI08 poisoned;
SERIAL poisonedBy;
SI16 carve; // Carve.dfn entry
SI16 oldLocX;
SI16 oldLocY;
SI08 oldLocZ;
SI16 oldTargLocX;
SI16 oldTargLocY;
SI16 fame;
SI16 karma;
SI16 kills;
UI16 subRegion;
void RemoveFromMulti( bool fireTrigger = true );
void AddToMulti( bool fireTrigger = true );
std::bitset<8> objSettings;
UI16 resistances[WEATHNUM];
SERIAL tempContainerSerial;
bool nameRequestActive;
//std::string origin; // Stores expansion item originates from
UI08 origin; // Stores expansion item originates from
void CopyData( CBaseObject *target );
public:
Point3_st GetOldLocation( void );
size_t GetNumTags( void ) const;
auto GetTagMap() const -> const TAGMAP2;
auto GetTempTagMap() const -> const TAGMAP2;
TAGMAPOBJECT GetTag( std::string tagname ) const;
void SetTag( std::string tagname, TAGMAPOBJECT tagval );
TAGMAPOBJECT GetTempTag( std::string tempTagName ) const;
void SetTempTag( std::string tempTagName, TAGMAPOBJECT tagVal );
void SetResist( UI16 newValue, WeatherType damage );
UI16 GetResist( WeatherType damage ) const;
void SetTitle( std::string newtitle );
std::string GetTitle( void ) const;
//void SetOrigin( std::string newOrigin );
//std::string GetOrigin( void ) const;
void SetOrigin( UI08 value );
UI08 GetOrigin() const;
virtual void SetMana( SI16 mn );
SI16 GetMana( void ) const;
virtual void SetStamina( SI16 stam );
SI16 GetStamina( void ) const;
SI32 GetFilePosition( void ) const;
SI32 SetFilePosition( SI32 filepos );
virtual ~CBaseObject();
CBaseObject( void );
SI16 GetOldTargLocX( void ) const;
SI16 GetOldTargLocY( void ) const;
SI16 GetX( void ) const;
SI16 GetY( void ) const;
SI08 GetZ( void ) const;
Point3_st GetLocation( void ) const;
void SetOldTargLocX( SI16 newvalue );
void SetOldTargLocY( SI16 newvalue );
void SetX( SI16 newValue );
void SetY( SI16 newValue );
void SetZ( SI08 newValue );
void WalkXY( SI16 newX, SI16 newY );
virtual void SetOldLocation( SI16 newX, SI16 newY, SI08 newZ ) = 0;
virtual void SetLocation( SI16 newX, SI16 newY, SI08 newZ, UI08 world, UI16 instanceId ) = 0;
virtual void SetLocation( SI16 newX, SI16 newY, SI08 newZ ) = 0;
virtual void SetLocation( const CBaseObject *toSet ) = 0;
UI16 GetId( void ) const;
UI16 GetColour( void ) const;
UI08 GetId( UI08 part ) const;
UI08 GetColour( UI08 part ) const;
void SetId( UI16 newValue );
void SetColour( UI16 newValue );
void SetId( UI08 newValue, UI08 part );
SI32 GetWeight( void ) const;
virtual void SetWeight( SI32 newVal, bool doWeightUpdate = true ) = 0;
SERIAL GetSerial( void ) const;
SERIAL GetSpawn( void ) const;
SERIAL GetOwner( void ) const;
SERIAL GetMulti( void ) const;
CMultiObj * GetMultiObj( void ) const;
CSpawnItem * GetSpawnObj( void ) const;
CChar * GetOwnerObj( void ) const;
UI08 GetSerial( UI08 part ) const;
UI08 GetSpawn( UI08 part ) const;
void SetMulti( SERIAL newSerial, bool fireTrigger = true );
void SetMulti( CMultiObj *newMulti, bool fireTrigger = true );
void SetSerial( SERIAL newSerial );
void SetSpawn( SERIAL newSpawn );
virtual void SetOwner( CChar *newOwner );
virtual bool Save( std::ostream &outStream ) = 0;
virtual bool DumpHeader( std::ostream &outStream ) const = 0;
virtual bool DumpBody( std::ostream &outStream ) const;
bool DumpFooter( std::ostream &outStream ) const;
bool Load( std::istream &inStream );
virtual bool HandleLine( std::string &UTag, std::string &data );
RACEID GetRace( void ) const;
void SetRace( RACEID newValue );
std::string GetNameRequest( CChar *nameRequester, UI08 requestSource );
std::string GetName( void ) const;
void SetName( std::string newName );
std::string GetSectionId( void ) const;
void SetSectionId( std::string newSectionID );
virtual SI16 GetStrength( void ) const;
virtual SI16 GetDexterity( void ) const;
virtual SI16 GetIntelligence( void ) const;
SI16 GetHP( void ) const;
virtual SI16 GetHealthRegenBonus( void ) const;
virtual SI16 GetStaminaRegenBonus( void ) const;
virtual SI16 GetManaRegenBonus( void ) const;
virtual void SetStrength( SI16 newValue );
virtual void SetDexterity( SI16 newValue );
virtual void SetIntelligence( SI16 newValue );
virtual void SetHP( SI16 newValue );
void IncHP( SI16 amtToChange );
virtual void SetHealthRegenBonus( SI16 newValue );
virtual void SetStaminaRegenBonus( SI16 newValue );
virtual void SetManaRegenBonus( SI16 newValue );
virtual SI16 GetSwingSpeedIncrease( void ) const;
virtual void SetSwingSpeedIncrease( SI16 newValue );
virtual SI32 GetTithing( void ) const;
virtual void SetTithing( SI32 newValue );
void IncSwingSpeedIncrease( SI16 toInc = 1 );
virtual SI16 GetDamageIncrease( void ) const;
virtual void SetDamageIncrease( SI16 newValue );
void IncDamageIncrease( SI16 toInc = 1 );
virtual SI16 GetLuck( void ) const;
virtual void SetLuck( SI16 newValue );
virtual SI16 GetHitChance( void ) const;
virtual void SetHitChance( SI16 newValue );
virtual SI16 GetDefenseChance( void ) const;
virtual void SetDefenseChance( SI16 newValue );
void SetDir( UI08 newDir, bool sendUpdate = true );
UI08 GetDir( void ) const;
void SetVisible( VisibleTypes newValue );
VisibleTypes GetVisible( void ) const;
ObjectType GetObjType( void ) const;
virtual bool CanBeObjType( ObjectType toCompare ) const;
SI16 GetHiDamage( void ) const;
SI16 GetLoDamage( void ) const;
void SetHiDamage( SI16 newValue );
void SetLoDamage( SI16 newValue );
std::vector<UI16> GetScriptTriggers( void );
void AddScriptTrigger( UI16 newValue );
bool HasScriptTrigger( UI16 newValue );
void RemoveScriptTrigger( UI16 newValue );
void ClearScriptTriggers( void );
SI16 GetStrength2( void ) const;
SI16 GetDexterity2( void ) const;
SI16 GetIntelligence2( void ) const;
virtual void SetStrength2( SI16 nVal );
virtual void SetDexterity2( SI16 nVal );
virtual void SetIntelligence2( SI16 nVal );
void IncStrength( SI16 toInc = 1 );
void IncDexterity( SI16 toInc = 1 );
void IncIntelligence( SI16 toInc = 1 );
void IncHealthRegenBonus( SI16 toInc = 1 );
void IncStaminaRegenBonus( SI16 toInc = 1 );
void IncManaRegenBonus( SI16 toInc = 1 );
SI16 GetHealthLeech( void ) const;
virtual void SetHealthLeech( SI16 nVal );
SI16 GetStaminaLeech( void ) const;
virtual void SetStaminaLeech( SI16 nVal );
SI16 GetManaLeech( void ) const;
virtual void SetManaLeech( SI16 nVal );
void IncHealthLeech( SI16 toInc = 1 );
void IncStaminaLeech( SI16 toInc = 1 );
void IncManaLeech( SI16 toInc = 1 );
void IncLuck( SI16 toInc = 1 );
void IncHitChance( SI16 toInc = 1 );
void IncDefenseChance( SI16 toInc = 1 );
void IncTithing( SI32 toInc = 1 );
SI16 GetHealthBonus( void ) const;
virtual void SetHealthBonus( SI16 nVal );
SI16 GetStaminaBonus( void ) const;
virtual void SetStaminaBonus( SI16 nVal );
SI16 GetManaBonus( void ) const;
virtual void SetManaBonus( SI16 nVal );
virtual void PostLoadProcessing( void );
virtual bool LoadRemnants( void ) = 0;
UI08 WorldNumber( void ) const;
void WorldNumber( UI08 value );
UI16 GetInstanceId( void ) const;
void SetInstanceId( UI16 value );
UI16 GetSubRegion( void ) const;
void SetSubRegion( UI16 value );
UI08 GetPoisoned( void ) const;
virtual void SetPoisoned( UI08 newValue );
SERIAL GetPoisonedBy( void ) const;
virtual void SetPoisonedBy( SERIAL newValue );
SI16 GetCarve( void ) const;
void SetCarve( SI16 newValue );
virtual void Update( CSocket *mSock = nullptr, bool drawGamePlayer = false, bool sendToSelf = true, bool triggerInRangeEvent = false ) = 0;
virtual void SendToSocket( CSocket *mSock, bool drawGamePlayer = false ) = 0;
virtual void Dirty( UpdateTypes updateType );
void RemoveFromRefreshQueue( void );
virtual void Delete( void ) = 0;
virtual void Cleanup( void );
virtual void RemoveSelfFromOwner( void ) = 0;
virtual void AddSelfToOwner( void ) = 0;
bool IsFree( void ) const;
bool IsDeleted( void ) const;
bool IsPostLoaded( void ) const;
bool IsSpawned( void ) const;
bool ShouldSave( void ) const;
bool IsDisabled( void ) const;
bool IsWipeable( void ) const;
bool IsDamageable( void ) const;
bool NameRequestActive( void ) const;
void SetFree( bool newVal );
void SetDeleted( bool newVal );
void SetPostLoaded( bool newVal );
void SetSpawned( bool newVal );
void ShouldSave( bool newVal );
void SetDisabled( bool newVal );
void SetWipeable( bool newValue );
void SetDamageable( bool newValue );
void NameRequestActive( bool newValue );
SI16 GetFame( void ) const;
void SetFame( SI16 value );
void SetKarma( SI16 value );
SI16 GetKarma( void ) const;
void SetKills( SI16 value );
SI16 GetKills( void ) const;
};
#endif