polserver/pol-core/bscript/objmembers.h
Fernando Rozenblit 721e4fefe0
Refactor Item states to be explicit instead of implicit (#919)
* extend tests

* more tests for world save

* explicit handle the special layers in wornitem

* add Location variant and relocate() methods

* refactor GottenItem and ensure Chr, not wornitems, is saved

* deflake escript watch test

* dropitem and undo refactoring

* uomod changes

* add more item tests (buy, sell, hair...)

* use location for undoing trade container properly

* rewrite loaddata to use relocate, fixing startup crashes

* do remaining location changes

* fix CI tests

* remove container pointer from item and add wearer() reference

* remove layer writes and explicit intrinsic weapon handling

* add preparing state for fresh items without serial number

* move wornitems to detached state only when it has a serial number

* load corpse items into the correct layer

* do not set a layer on load before the item is equipped

* add more tests to equipped and intrinsic items

* remove layer and substitute with the location()

* add core-changes summary

* mark items as being worn on corpse if they only moved within the corpse

* block Preparing from being reached, just to be sure

* added integrity sweep check

* Reduce direect changes to item location

* Add Item::move_into() and rewrite calling sites

* Fix container slots

* get rid of the slot_index on the item, because Location() already has it

* fix race in test leading to macos issues

* fix dangling pointer

* remove corpse can_equip_list and rely on the GottenItem rules to dress the corpse again

* let item->destroy() detach the item

* make integrity checks fail the tests

* use place_at(item, newpos) for changing item position InWorld

* add boat test for item moved out of boat that should not be visible anymore

* use place_at() in more places

* ensure CreateItemAtLocation really does

* fix Claude instructions

* remove state we didn't need

* fine tuning

* reduce test flakiness
2026-08-10 18:17:53 +00:00

334 lines
7.7 KiB
C++

/** @file
*
* @par History
* - 2005/01/24 Shinigami: added ObjMember character.spyonclient2 to get data from packet 0xd9 (Spy
* on Client 2)
* - 2005/03/09 Shinigami: added Prop Character::Delay_Mod [ms] for WeaponDelay
* - 2005/04/04 Shinigami: added Prop Character::CreatedAt [PolClock]
* - 2005/08/29 Shinigami: character.spyonclient2 renamed to character.clientinfo
* - 2005/10/02 Shinigami: added Prop Script.attached_to and Script.controller
* - 2005/12/09 MuadDib: added member uclang for storing Unicode Language sent during logon.
* - 2006/05/16 Shinigami: added Prop Character.Race [RACE_* Constants] to support Elfs
* - 2007/07/09 Shinigami: added Prop Character.isUOKR [bool] - UO:KR client used?
* - 2008/07/08 Turley: Added character.movemode - returns the MoveMode like given in NPCDesc
* - Added item.stackable - Is item stackable?
* - 2008/12/17 MuadDub: Added item.tile_layer - returns layer entry from tiledata/tiles.cfg
* - 2009/08/06 MuadDib: Removed PasswordOnlyHash support
* - 2009/08/19 Turley: Added character.uo_expansion_client
* - 2009/09/06 Turley: Removed chr.isUOKR added chr.ClientType
* - 2009/10/14 Turley: Added char.deaf() methods & char.deafened member
* - 2011/12/13 Tomi: Boat members MBR_COMPONENT, MBR_HULL, MBR_ROPE, MBR_SAILS, MBR_WHEEL,
* MBR_TILLER, MBR_RUDDER, MBR_STORAGE, MBR_WEAPONSLOT
* - 2012/02/02 Tomi: Multi member MBR_MULTIID
* - 2012/03/26 Tomi: Added MBR_LASTCOORD
* - 2012/04/14 Tomi: Added MBR_FACETID for new map message packet
* - 2012/04/15 Tomi: Added MBR_EDITABLE for maps
* - 2012/06/02 Tomi: Added MBR_ACTIVE_SKILL and MBR_CASTING_SPELL for characters
*/
#ifndef OBJMEMBERS_H
#define OBJMEMBERS_H
#include <fmt/format.h>
namespace Pol::Bscript
{
enum MemberID
{
MBR_X, // uobject //0
MBR_Y, // 1
MBR_Z,
MBR_NAME,
MBR_OBJTYPE,
MBR_GRAPHIC, // 5
MBR_SERIAL,
MBR_COLOR,
MBR_HEIGHT,
MBR_FACING,
MBR_DIRTY, // 10
MBR_WEIGHT,
MBR_MULTI,
MBR_AMOUNT, // item
MBR_LAYER,
MBR_CONTAINER, // 15
MBR_USESCRIPT,
MBR_EQUIPSCRIPT,
MBR_UNEQUIPSCRIPT,
MBR_DESC,
MBR_MOVABLE, // 20
MBR_INVISIBLE,
MBR_DECAYAT,
MBR_SELLPRICE,
MBR_BUYPRICE,
MBR_NEWBIE, // 25
MBR_ITEM_COUNT,
MBR_WARMODE, // character
MBR_GENDER,
MBR_TRUEOBJTYPE,
MBR_TRUECOLOR, // 30
MBR_AR_MOD,
MBR_HIDDEN,
MBR_CONCEALED,
MBR_FROZEN,
MBR_PARALYZED, // 35
MBR_POISONED,
MBR_STEALTHSTEPS,
MBR_SQUELCHED,
MBR_DEAD,
MBR_AR, // 40
MBR_BACKPACK,
MBR_WEAPON,
MBR_SHIELD,
MBR_ACCTNAME,
MBR_ACCT, // 45
MBR_CMDLEVEL,
MBR_CMDLEVELSTR,
MBR_CRIMINAL,
MBR_IP,
MBR_GOLD, // 50
MBR_TITLE_PREFIX,
MBR_TITLE_SUFFIX,
MBR_TITLE_GUILD,
MBR_TITLE_RACE,
MBR_GUILDID, // 55
MBR_GUILD,
MBR_MURDERER,
MBR_ATTACHED,
MBR_CLIENTVERSION,
MBR_REPORTABLES, // 60
MBR_SCRIPT, // npc
MBR_NPCTEMPLATE,
MBR_MASTER,
MBR_PROCESS,
MBR_EVENTMASK, // 65
MBR_SPEECH_COLOR,
MBR_SPEECH_FONT,
MBR_USE_ADJUSTMENTS,
MBR_RUN_SPEED,
MBR_LOCKED, // lockable //70
MBR_CORPSETYPE, // corpse
MBR_TILLERMAN, // boat
MBR_PORTPLANK,
MBR_STARBOARDPLANK,
MBR_HOLD, // 75
MBR_HAS_OFFLINE_MOBILES,
MBR_COMPONENTS, // house
MBR_ITEMS, // multi
MBR_MOBILES,
MBR_XEAST, // map //80
MBR_XWEST,
MBR_YNORTH,
MBR_YSOUTH,
MBR_GUMPWIDTH,
MBR_GUMPHEIGHT, // 85
MBR_ISOPEN, // door
MBR_QUALITY, // equipment
MBR_HP,
MBR_MAXHP_MOD,
MBR_MAXHP, // 90
MBR_DMG_MOD, // weapon
MBR_ATTRIBUTE,
MBR_INTRINSIC,
MBR_HITSCRIPT,
MBR_AR_BASE, // 95
MBR_ONHIT_SCRIPT,
MBR_ENABLED, // account
MBR_BANNED,
MBR_USERNAMEPASSWORDHASH,
MBR_MEMBERS, // guild/party //100
MBR_ALLYGUILDS,
MBR_ENEMYGUILDS,
MBR_PID, // script
MBR_STATE,
MBR_INSTR_CYCLES, // 105
MBR_SLEEP_CYCLES,
MBR_CONSEC_CYCLES,
MBR_PC,
MBR_CALL_DEPTH,
MBR_NUM_GLOBALS, // 110
MBR_VAR_SIZE,
MBR_REALM,
MBR_UO_EXPANSION,
MBR_CUSTOM,
MBR_GLOBALS, // 115
MBR_FOOTPRINT,
MBR_CLIENTINFO,
MBR_DELAY_MOD,
MBR_CREATEDAT,
MBR_OPPONENT, // 120
MBR_CONNECTED,
MBR_ATTACHED_TO,
MBR_CONTROLLER,
MBR_OWNERSERIAL,
MBR_DEFAULTCMDLEVEL, // 125
MBR_UCLANG,
MBR_RACE,
MBR_TRADING_WITH,
MBR_TRADE_CONTAINER,
MBR_ALIGNMENT, // 130
MBR_CURSOR,
MBR_GUMP,
MBR_PROMPT,
MBR_STACKABLE,
MBR_MOVEMODE, // 135
MBR_HITCHANCE_MOD,
MBR_EVASIONCHANCE_MOD,
MBR_TILE_LAYER,
MBR_CLIENTVERSIONDETAIL,
MBR_SAVEONEXIT, // 140
MBR_FIRE_RESIST,
MBR_COLD_RESIST,
MBR_ENERGY_RESIST,
MBR_POISON_RESIST,
MBR_PHYSICAL_RESIST, // 145
MBR_FIRE_RESIST_MOD,
MBR_COLD_RESIST_MOD,
MBR_ENERGY_RESIST_MOD,
MBR_POISON_RESIST_MOD,
MBR_PHYSICAL_RESIST_MOD, // 150
MBR_STATCAP,
MBR_SKILLCAP,
MBR_LUCK,
MBR_FOLLOWERSMAX,
MBR_TITHING, // 155
MBR_FOLLOWERS,
MBR_FIRE_DAMAGE,
MBR_COLD_DAMAGE,
MBR_ENERGY_DAMAGE,
MBR_POISON_DAMAGE, // 160
MBR_PHYSICAL_DAMAGE,
MBR_FIRE_DAMAGE_MOD,
MBR_COLD_DAMAGE_MOD,
MBR_ENERGY_DAMAGE_MOD,
MBR_POISON_DAMAGE_MOD, // 165
MBR_PHYSICAL_DAMAGE_MOD,
MBR_PARTY,
MBR_LEADER,
MBR_PARTYLOOT,
MBR_CANDIDATE_OF_PARTY, // 170
MBR_CANDIDATES,
MBR_MOVECOST_WALK,
MBR_MOVECOST_RUN,
MBR_MOVECOST_WALK_MOUNTED,
MBR_MOVECOST_RUN_MOUNTED, // 175
MBR_AGGRESSORTO,
MBR_LAWFULLYDAMAGED,
MBR_GETGOTTENBY,
MBR_UO_EXPANSION_CLIENT,
MBR_CLIENTTYPE, // 180
MBR_DEAFENED,
MBR_CLIENT,
MBR_TYPE,
MBR_ATTRIBUTES,
MBR_EDITING, // 185
MBR_HOUSEPARTS,
MBR_DOUBLECLICKRANGE,
MBR_MOUNTEDSTEPS,
// New boat stuff start
MBR_ROPE,
MBR_WHEEL, // 190
MBR_HULL,
MBR_TILLER,
MBR_RUDDER,
MBR_SAILS,
MBR_STORAGE, // 195
MBR_WEAPONSLOT,
// New boat stuff end
MBR_MULTIID,
MBR_TRADEWINDOW,
MBR_LASTCOORD,
MBR_FACETID, // 200
MBR_EDITABLE,
MBR_ACTIVE_SKILL,
MBR_CASTING_SPELL,
MBR_CARRYINGCAPACITY_MOD,
MBR_MAX_ITEMS_MOD, // 205
MBR_MAX_WEIGHT_MOD,
MBR_MAX_SLOTS_MOD,
MBR_SPEED_MOD,
MBR_NAME_SUFFIX,
MBR_TEMPORALLY_CRIMINAL, // 210
MBR_LAST_TEXTCOLOR,
MBR_INSURED,
MBR_LAST_ACTIVITY_AT,
MBR_LAST_PACKET_AT,
MBR_HOUSE, // 215
MBR_SPECIFIC_NAME,
MBR_CARRYINGCAPACITY,
MBR_NO_DROP,
MBR_NO_DROP_EXCEPTION,
MBR_PORT, // 220
MBR_LOWER_REAG_COST,
MBR_SPELL_DAMAGE_INCREASE,
MBR_FASTER_CASTING,
MBR_FASTER_CAST_RECOVERY,
MBR_DEFENCE_CHANCE_INCREASE, // 225
MBR_DEFENCE_CHANCE_INCREASE_CAP,
MBR_LOWER_MANA_COST,
MBR_FIRE_RESIST_CAP,
MBR_COLD_RESIST_CAP,
MBR_ENERGY_RESIST_CAP, // 230
MBR_POISON_RESIST_CAP,
MBR_PHYSICAL_RESIST_CAP,
MBR_HIT_CHANCE,
MBR_LOWER_REAG_COST_MOD,
MBR_SPELL_DAMAGE_INCREASE_MOD, // 235
MBR_FASTER_CASTING_MOD,
MBR_FASTER_CAST_RECOVERY_MOD,
MBR_DEFENCE_CHANCE_INCREASE_MOD,
MBR_DEFENCE_CHANCE_INCREASE_CAP_MOD,
MBR_LOWER_MANA_COST_MOD, // 240
MBR_FIRE_RESIST_CAP_MOD,
MBR_COLD_RESIST_CAP_MOD,
MBR_ENERGY_RESIST_CAP_MOD,
MBR_POISON_RESIST_CAP_MOD,
MBR_PHYSICAL_RESIST_CAP_MOD, // 245
MBR_LUCK_MOD,
MBR_HIT_CHANCE_MOD,
MBR_PACKAGE,
MBR_SWING_SPEED_INCREASE,
MBR_SWING_SPEED_INCREASE_MOD, // 250
MBR_EXPORTED_FUNCTIONS,
MBR_DISABLE_INACTIVITY_TIMEOUT,
MBR_CURSED,
MBR_SNOOPSCRIPT,
MBR_CHARACTER_OWNER, // 255
MBR_PARRYCHANCE_MOD,
MBR_PILOT,
MBR_BUFFS,
MBR_WEIGHT_MULTIPLIER_MOD,
MBR_HELD_WEIGHT_MULTIPLIER, // 260
MBR_FUNCTION,
MBR_POSITION_CHANGED_AT,
MBR_MOVED_AT,
MBR_VISUAL_RANGE,
MBR_MIN_ATTACK_RANGE_INCREASE, // 265
MBR_MIN_ATTACK_RANGE_INCREASE_MOD,
MBR_MAX_ATTACK_RANGE_INCREASE,
MBR_MAX_ATTACK_RANGE_INCREASE_MOD,
MBR_ITEMS_DECAY,
MBR_LOGGED_IN, // 270
MBR_EQUIPPED_ITEMS,
};
inline auto format_as( MemberID id )
{
return fmt::underlying( id );
}
struct ObjMember
{
MemberID id;
char code[30];
};
extern ObjMember object_members[];
extern int n_objmembers;
ObjMember* getKnownObjMember( const char* token );
ObjMember* getObjMember( int id );
} // namespace Pol::Bscript
#endif