uox3/source/cBaseObject.h

399 lines
12 KiB
C
Raw Permalink Normal View History

//o------------------------------------------------------------------------------------------------o
Instance-support and misc code cleanup Misc code and documentation cleanup: Updated and standardized function comment blocks throughout entire codebase Grouped getters and setters together in pairs and documented them as one Removed empty and/or non-useful information from comment blocks Removed unused function from cItem.cpp/h - IncID() - formerly used to change IDs for doors Added new feature - Instances Objects (characters, items, multis, spawnregions) can now make use of a 5th parameter to determine their location in the game world. In addition to the traditional X, Y, Z and WORLDNUMBER parameters, a new one has been added - INSTANCEID - that allows objects to exist at the same coordinates in the same world, but in different "dimensions". Code has been updated in multiple places to support this, and a default instanceID of 0 is assumed if nothing else is specified. Added support for new DFN tag in town regions, spawn regions and locations - INSTANCEID (defaults to 0 if not present) Added support for another start location parameter after worldNum in UOX.INI representing instanceID (defaults to 0 if not present) Updated TWEAK menu to include WorldNumber and instanceID Fixed BaseWeight option in TWEAK menu Updated CBase_Teleport - now takes an optional 5th parameter instanceID Updated SE_SpawnNPC now takes an optional 5th parameter - instanceID Updated SE_FindMulti now takes an optional 5th parameter - instanceID Updated SE_GetItem now takes an optional 5th parameter - instanceID Updated SE_FindItem now takes an optional 6th parameter - instanceID Added new JS property for Items, Characters, Regions: .instanceID Added JS property for Regions: .members - returns comma-separated list of town member serials Updated JS scripts making use of the above-mentioned JS Methods/Functions Updated dictionaries with new tweak menu entry texts Exposed SpawnRegions to JS engine, and updated JS docs with details: SpawnRegion JS Functions IterateOverSpawnRegions() GetSpawnRegion( spawnRegNum ) GetSpawnRegionCount() SpawnRegion JS Properties name regionNum itemList npcList item npc maxItems maxNpcs itemCount npcCount onlyOutside prefZ x1 y1 x2 y2 world instanceID minTime maxTime call
2020-08-08 13:57:15 +08:00
//| File - cBaseObject.h
//o------------------------------------------------------------------------------------------------o
Instance-support and misc code cleanup Misc code and documentation cleanup: Updated and standardized function comment blocks throughout entire codebase Grouped getters and setters together in pairs and documented them as one Removed empty and/or non-useful information from comment blocks Removed unused function from cItem.cpp/h - IncID() - formerly used to change IDs for doors Added new feature - Instances Objects (characters, items, multis, spawnregions) can now make use of a 5th parameter to determine their location in the game world. In addition to the traditional X, Y, Z and WORLDNUMBER parameters, a new one has been added - INSTANCEID - that allows objects to exist at the same coordinates in the same world, but in different "dimensions". Code has been updated in multiple places to support this, and a default instanceID of 0 is assumed if nothing else is specified. Added support for new DFN tag in town regions, spawn regions and locations - INSTANCEID (defaults to 0 if not present) Added support for another start location parameter after worldNum in UOX.INI representing instanceID (defaults to 0 if not present) Updated TWEAK menu to include WorldNumber and instanceID Fixed BaseWeight option in TWEAK menu Updated CBase_Teleport - now takes an optional 5th parameter instanceID Updated SE_SpawnNPC now takes an optional 5th parameter - instanceID Updated SE_FindMulti now takes an optional 5th parameter - instanceID Updated SE_GetItem now takes an optional 5th parameter - instanceID Updated SE_FindItem now takes an optional 6th parameter - instanceID Added new JS property for Items, Characters, Regions: .instanceID Added JS property for Regions: .members - returns comma-separated list of town member serials Updated JS scripts making use of the above-mentioned JS Methods/Functions Updated dictionaries with new tweak menu entry texts Exposed SpawnRegions to JS engine, and updated JS docs with details: SpawnRegion JS Functions IterateOverSpawnRegions() GetSpawnRegion( spawnRegNum ) GetSpawnRegionCount() SpawnRegion JS Properties name regionNum itemList npcList item npc maxItems maxNpcs itemCount npcCount onlyOutside prefZ x1 y1 x2 y2 world instanceID minTime maxTime call
2020-08-08 13:57:15 +08:00
//| Purpose - Defines the property specifications for the base object class
//o------------------------------------------------------------------------------------------------o
2002-04-07 20:53:41 +00:00
#ifndef __CBO_H__
#define __CBO_H__
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt) Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri) Updated SpiderMonkey from v1.6.0 to v1.7.0 Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri) Added StringUtility file with general common string manipulation functions (punt) Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt) Overall code cleanup to remove/replace platform-dependent code (punt) Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt) Replaced usage of char in many places with std::string (punt) Started process of replacing UString usage with functions provided through StringUtility instead (punt) Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt) Replaced platform specific time handling by using cross-platform chrono library (punt) Removed UOX namespace to reduce complexity (punt) Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt) Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt) Removed some platform specific files like uoxlinux.h, which is no longer required (punt) Removed legacy crash protection code, and removed support for cluox (punt) Removed legacy "support" for Borland compiler (punt) Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri) Removed legacy BUILD folder with outdated compilation instructions (Xuri) Removed old Changelog file (merged into Changelog.txt) (Xuri) Fixed a pointer bug for items in multis on world load (punt) Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt) Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt) Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt) Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt) Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt) Added some new commands to js/commands/custom/misc-cmd.js (Xuri) cont // Targeted item will be made a container, set to nondecay and movable 2 endfight // Targeted character (and character being fought) will stop fighting getmulti // Get multiObject for targeted item finditem // Find item at layer X movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen) Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri) Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
#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
};
2002-04-07 20:53:41 +00:00
//o------------------------------------------------------------------------------------------------o
Instance-support and misc code cleanup Misc code and documentation cleanup: Updated and standardized function comment blocks throughout entire codebase Grouped getters and setters together in pairs and documented them as one Removed empty and/or non-useful information from comment blocks Removed unused function from cItem.cpp/h - IncID() - formerly used to change IDs for doors Added new feature - Instances Objects (characters, items, multis, spawnregions) can now make use of a 5th parameter to determine their location in the game world. In addition to the traditional X, Y, Z and WORLDNUMBER parameters, a new one has been added - INSTANCEID - that allows objects to exist at the same coordinates in the same world, but in different "dimensions". Code has been updated in multiple places to support this, and a default instanceID of 0 is assumed if nothing else is specified. Added support for new DFN tag in town regions, spawn regions and locations - INSTANCEID (defaults to 0 if not present) Added support for another start location parameter after worldNum in UOX.INI representing instanceID (defaults to 0 if not present) Updated TWEAK menu to include WorldNumber and instanceID Fixed BaseWeight option in TWEAK menu Updated CBase_Teleport - now takes an optional 5th parameter instanceID Updated SE_SpawnNPC now takes an optional 5th parameter - instanceID Updated SE_FindMulti now takes an optional 5th parameter - instanceID Updated SE_GetItem now takes an optional 5th parameter - instanceID Updated SE_FindItem now takes an optional 6th parameter - instanceID Added new JS property for Items, Characters, Regions: .instanceID Added JS property for Regions: .members - returns comma-separated list of town member serials Updated JS scripts making use of the above-mentioned JS Methods/Functions Updated dictionaries with new tweak menu entry texts Exposed SpawnRegions to JS engine, and updated JS docs with details: SpawnRegion JS Functions IterateOverSpawnRegions() GetSpawnRegion( spawnRegNum ) GetSpawnRegionCount() SpawnRegion JS Properties name regionNum itemList npcList item npc maxItems maxNpcs itemCount npcCount onlyOutside prefZ x1 y1 x2 y2 world instanceID minTime maxTime call
2020-08-08 13:57:15 +08:00
//| Class - class CBaseObject
//o------------------------------------------------------------------------------------------------o
Instance-support and misc code cleanup Misc code and documentation cleanup: Updated and standardized function comment blocks throughout entire codebase Grouped getters and setters together in pairs and documented them as one Removed empty and/or non-useful information from comment blocks Removed unused function from cItem.cpp/h - IncID() - formerly used to change IDs for doors Added new feature - Instances Objects (characters, items, multis, spawnregions) can now make use of a 5th parameter to determine their location in the game world. In addition to the traditional X, Y, Z and WORLDNUMBER parameters, a new one has been added - INSTANCEID - that allows objects to exist at the same coordinates in the same world, but in different "dimensions". Code has been updated in multiple places to support this, and a default instanceID of 0 is assumed if nothing else is specified. Added support for new DFN tag in town regions, spawn regions and locations - INSTANCEID (defaults to 0 if not present) Added support for another start location parameter after worldNum in UOX.INI representing instanceID (defaults to 0 if not present) Updated TWEAK menu to include WorldNumber and instanceID Fixed BaseWeight option in TWEAK menu Updated CBase_Teleport - now takes an optional 5th parameter instanceID Updated SE_SpawnNPC now takes an optional 5th parameter - instanceID Updated SE_FindMulti now takes an optional 5th parameter - instanceID Updated SE_GetItem now takes an optional 5th parameter - instanceID Updated SE_FindItem now takes an optional 6th parameter - instanceID Added new JS property for Items, Characters, Regions: .instanceID Added JS property for Regions: .members - returns comma-separated list of town member serials Updated JS scripts making use of the above-mentioned JS Methods/Functions Updated dictionaries with new tweak menu entry texts Exposed SpawnRegions to JS engine, and updated JS docs with details: SpawnRegion JS Functions IterateOverSpawnRegions() GetSpawnRegion( spawnRegNum ) GetSpawnRegionCount() SpawnRegion JS Properties name regionNum itemList npcList item npc maxItems maxNpcs itemCount npcCount onlyOutside prefZ x1 y1 x2 y2 world instanceID minTime maxTime call
2020-08-08 13:57:15 +08:00
//| Purpose - BaseObject class with common, shared properties for all object types
//o------------------------------------------------------------------------------------------------o
class CBaseObject
2002-04-07 20:53:41 +00:00
{
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;
Rework of passive stat regeneration Updated code calculating passive health, stamina and mana regeneration for characters, based on new UOX.INI settings and bonuses from characters/items/races Added three new Character/Item/Race DFN tags to grant bonus health/stamina/mana regeneration: HEALTHREGENBONUS=# // 10 bonus points equates to 0.01 extra hp regen per second, independent of era STAMINAREGENBONUS=# // 10 bonus points equates to 0.05 extra stamina regen per second MANAREGENBONUS=# // 10 bonus point equates to 0.1 extra mana regen per second ...also available as JS Properties: .healthRegenBonus .staminaRegenBonus .manaRegenBonus Updated get/set JS commands to allow getting/setting regen bonuses for health, stamina and mana Updated races.dfn to include default +2 health regen bonus for humans, and +2 mana regen bonus for gargoyles. Added new UOX.INI settings under [Skills and Stats] section: HEALTHREGENMODE=1 // 0 = no passive health regen, 1 = default passive health regen STAMINAREGENMODE=1 // 0 = no passive stamina regen, 1 = default passive stamina regen (LBR or below), 2 = AoS or beyond, 3 = SA and beyond MANAREGENMODE=1 // 0 = no passive mana regen, 1 = default passive mana regen (LBR or below), 2 = AoS (Pub17), 3 = AoS/SE (Pub18 and beyond), 4 = ML, 5 = KR, 6 = SA and beyond HEALTHREGENCAP=# // Max cap for Health Regeneration Bonus stat per character STAMINAREGENCAP=# // Max cap for Stamina Regeneration Bonus stat per character MANAREGENCAP=# // Max cap for Mana Regeneration Bonus stat per character Added new UOX.INI section ([default race bonuses]) with the following new settings for the 3 default playable races (only used if nothing else specified in races.dfn): HUMANHEALTHREGENBONUS=0 // default health regen bonus for human race (2 from ML expansion onwards) HUMANSTAMINAREGENBONUS=0 // default stamina regen bonus for human race HUMANMANAREGENBONUS=0 // default mana regen bonus for human race ELFHEALTHREGENBONUS=0 // default health regen bonus for elf race ELFSTAMINAREGENBONUS=0 // default stamina regen bonus for elf race ELFMANAREGENBONUS=0 // default mana regen bonus for elf race GARGOYLEHEALTHREGENBONUS=0 // default health regen bonus for gargoyle race GARGOYLESTAMINAREGENBONUS=0 // default stamina regen bonus for gargoyle race GARGOYLEMANAREGENBONUS=0 // default mana regen bonus for gargoyle race (2 from SA expansion onwards) Updated UOX3 Documentation with new feature section on Stat Regeneration with details on stat regeneration rules and recommended settings per UO era Added support for Medable armors (have no effect on meditation skill and/or passive regen of mana when worn) and Mage Armors (can turn non-medable armor into medable armor) These properties are defined per armor piece using the first and second bits of the MORE property: MORE=0x1 0x0 0x0 0x0 // Medable Armor MORE=0x0 0x1 0x0 0x0 // Mage Armor The following armor types have been marked as medable by default: leather armor, leather ninja armor, leather samurai armor, leaf armor, gargish cloth armor, gargish leather armor and all hats and masks Updated JS Method .Defense() to support optional fourth and fifth parameters - excludeMedableArmor (true/false) and includeShield (true/false) Updated CalfDef function to support including shields in the calculations, and updated mana regen code to include shields when checking for equipped armor Updated Meditation skill JS script to exclude medable armor from armor check, include shields, and apply different rules for active meditation depending on mana regen mode Updated stat window to include defensive rating of shields (based on Parrying skill) and/or elemental resistances (if enabled in ini) Added a new property to CRace class, which is automatically set and incremented as UOX3 loads in races from races.dfn: raceID Added new Getters/Setters for CRace class to retrieve ID of a specific Race object Updated JS property .id for Race JS Object to return new race ID instead of iterating through list of races to compare race object and return index Reloading DFNs now also reloads Races
2025-04-20 06:05:44 +08:00
SI16 healthRegenBonus;
SI16 staminaRegenBonus;
SI16 manaRegenBonus;
SI16 luck;
2024-06-14 14:38:03 -05:00
SI16 hitChance;
SI16 defenseChance;
VisibleTypes visible;
SI16 hiDamage;
SI16 loDamage;
SI32 weight;
SI16 mana;
SI16 stamina;
2024-06-16 01:37:31 -05:00
SI16 swingSpeedIncrease;
SI16 damageIncrease;
SI16 healthLeech;
SI16 staminaLeech;
SI16 manaLeech;
2025-03-09 20:50:32 -05:00
SI32 tithing;
UI16 scriptTrig;
SI16 st2;
SI16 dx2;
SI16 in2;
2024-06-16 18:57:27 -05:00
SI16 healthBonus;
SI16 staminaBonus;
SI16 manaBonus;
mutable SI32 FilePosition;
SERIAL tempMulti;
std::string name;
std::string sectionId;
Minor JS revamp - multiple scripts per object! Added TryParseJSVal() helper function in cScript.cpp, used to parse jsval values returned from script events. Provides results matching 0 (0, false), 1 (1, true) or any specific int value returned from script. JS events updated to use new TryParseJSVal helper function (no change in behaviour): onDecay, onResurrect, onCommand, onBuyFromVendor, onSellToVendor, onPickup, onCharDoubleClick, onSkillGump, onUseBandageMacro, onCombatStart, onCombatEnd, onDeathBlow, onBuy, onSell JS events with slight change of behaviour after update to use TryParseJSVal: onDrop, onDropItemOnItem, onDropItemOnNpc - previously, a blank or non-existent return value would be treated the same as a return true. This will now be treated as a return false. Update scripts accordingly! JS events updated to support return values from scripts: onCollide, onTalk, onSnooped, OnHungerChange Return false or nothing to prevent hard code from running Return true to allow hard code to run like normal onStolenFrom, onAISliver, onLightChange, onVirtueGumpPress, onQuestGump, onSpecialMove, onSwing, onClick, onHouseCommand, onSellToVendor, onSkillCheck, onSpellGain, onSpellLoss Return false to allow hard code and other scripts with event to run like normal Return true to prevent hard code and other scripts with event from running onSteal Return false or nothing to allow hard code and other scripts with event to run like normal Return true to prevent hard code and onStolenFrom event from running (theft failed?) Return 2 to prevent hard code, but allow onStolenFrom event to run (theft succeeded, but handled in script?) onLeaving, onEntrance, onEquip, onUnequip, onEnterEvadeState, onSoldToVendor, onBoughtFromVendor, onSpellSuccess, onSpellTarget, onFlagChange, onDeath Return false or nothing to allow other scripts with event to run like normal Return true to prevent other scripts with event from running Added new JS events that run prior to items being equipped/unequipped, with support for return values: onEquipAttempt( pEquipper, iEquipping ) onUnequipAttempt( pEquipper, iUnequipping ) Return false or nothing to reject attempt to equip/unequip item, and prevent hard-code or other scripts with event from running Return true to allow hard code to run like normal Added new JS event that runs prior to onSnooped event, for character doing the snooping: onSnoopAttempt( snooped, snooper ) Return false or nothing to prevent hard code and other snooping-related events from running Return true to allow hard code and other snooping-related events to run like normal Updated onSnooped JS event to accept return values: Return true when success state is true to prevent other scripts with event from running Return true when success state is false to prevent hard code and other scripts with event from running Updated onClick JS event to also run for characters with event attached (return 1 to prevent showing hard-coded name for whatever object is clicked) Updated onSteal JS event to include a third parameter, an object reference for the target of the theft Added support for assigning multiple JS scripts per object (item, multi, char, region). Any time a scriptID is added to an object, the list of such IDs for that object will be sorted from lowest to highest scriptID, which also determines the execution order for the scripts. Note that if the same JS event is present in several scripts assigned to an object, each of those events will trigger, unless the rules about return values for said event prevent this DFNs for Items, Multis, Characters and Regions can now contain multiple SCRIPT=scriptID tags per definition. Each such SCRIPT tag will be applied to the object in question, then sorted from lowest to highest scriptID by server. Added new JS property for Items, Multis, Characters and Regions: .scriptTriggers // If used to get property, will return array object with all script IDs assigned to object. If used to set property, will add script ID to existing list of script IDs for object. Modified JS property for Items, Multis, Characters and Regions, which for backwards compatibility functions similar to in older versions: .scripttrigger // If used to get property, will return last script ID in list of script IDs assigned to object. If used to set property, will clear list of script IDs and assign only the new ID Added new JS Methods for Items, Multis, Characters and Regions: .AddScriptTrigger( scriptID ) // Adds a new scriptID to list of scripts assigned to object .RemoveScriptTrigger( scriptID ) // Remove a specific scriptID from object (0 = remove all) Moved SETSCPTRIG command from code to JS (js/commands/targeting/scptrig.js), and supplemented it with some additional commands: GETSCPTRIG // List out all scriptIDs assigned to object SETSCPTRIG scriptID // Clears list of scriptIDs for object, then assigns the specified scriptID ADDSCPTRIG scriptID // Adds specified scriptID to list of scriptsIDs assigned to object REMOVESCPTRIG scriptID // Removes specified scriptID from list of scriptIDs assigned to object (0 = remove all)
2021-05-25 19:37:52 +08:00
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;
2002-04-07 20:53:41 +00:00
void RemoveFromMulti( bool fireTrigger = true );
void AddToMulti( bool fireTrigger = true );
std::bitset<8> objSettings;
2002-04-07 20:53:41 +00:00
UI16 resistances[WEATHNUM];
2002-04-07 20:53:41 +00:00
SERIAL tempContainerSerial;
2002-04-07 20:53:41 +00:00
UOX3 0.99.5b Fixed an issue where karma titles would inadvertently have the space behind the title trimmed before being displayed in paperdoll, resulting in erroneous display of title + name there Fixed an issue with a cooking script (js/skill/cooking/cooking.js) where sweet dough would not get consumed properly on cooking (Dragon Slayer) Updated C++ function calcRegionFromXY to work with CBaseObject instead of CChar, so it also works for Items Items now have current town region stored as an object property during runtime. This is calculated on load, when container property is updated, and when an item is picked up or dropped. The region is also accessible via the (read-only) JS Item property .region Added new JS Event to allow capturing button presses from the old-school gump displayed by client via packet 0x76, which was originally used by the old-school crafting menus in T2A. The requirement for this to work is that the gump in question must have a gumpID between 0x4000 and 0xffff (which can be set when manually creating a packet with this ID via JS), and the Event itself must be in the global script: onScrollingGumpPress( pSock, gumpID, buttonID ) Added new JS Event to allow better control over which names UOX3 sends to the client for characters: onNameRequest( myObj, requestedBy ) // return custom string, or return empty string/nothing/true/false to use default name Updated JS Events to also work for Items (previously only worked for Characters) onLightChange( myObj, lightLevel ) onTempChange( myObj, temp ) onWeatherChange( myObj, weatherType ) Adjusted default temperature for town regions with no weather systems defined from 0 to 20 degrees Celsius Updated some JS scripts (fishing.js, baking.js and cooking.js) to make use of GetTempTag/SetTempTag rather than GetTag/SetTag Added cancel-checks to targeting functions in command script for add-commands (js/commands/targeting/add.js) Updated get command script (js/commands/targeting/get.js) to allow retrieving region ID and name using 'get region Updated misc command script (js/commands/custom/misc-cmd.js) to add 'gettemptag and 'settemptag commands, used to retrieve/set temporary custom tags from/on objects Fixed a bug where Spirit Speak skill would be checked for race languages even if the race had LANGUAGEMIN defined as 0 (or not defined at all) Fixed an issue where players using regular UO client would get stuck in a black void after teleporting between worlds, by adding an additional character refresh after the teleport Fixed an issue where crafting tools for Blacksmithing and Carpentry would attempt to fetch the value of an incorrectly named INI setting to handle durability loss for the tools Added new setting under [settings] section of UOX.INI to control whether it should be possible to craft weapons from coloured ingots or not: CRAFTCOLOUREDWEAPONS=0/1 // If enabled(1), players can craft coloured weapons. Defaults to disabled(0) Fixed an issue where the correct ingots were not consumed when attempting to craft items using colored ingots Fixed a rogue debug message leftover in the scissor script
2022-02-13 22:49:37 +08:00
bool nameRequestActive;
2023-07-08 14:25:04 -04:00
//std::string origin; // Stores expansion item originates from
UI08 origin; // Stores expansion item originates from
UOX3 0.99.5b Fixed an issue where karma titles would inadvertently have the space behind the title trimmed before being displayed in paperdoll, resulting in erroneous display of title + name there Fixed an issue with a cooking script (js/skill/cooking/cooking.js) where sweet dough would not get consumed properly on cooking (Dragon Slayer) Updated C++ function calcRegionFromXY to work with CBaseObject instead of CChar, so it also works for Items Items now have current town region stored as an object property during runtime. This is calculated on load, when container property is updated, and when an item is picked up or dropped. The region is also accessible via the (read-only) JS Item property .region Added new JS Event to allow capturing button presses from the old-school gump displayed by client via packet 0x76, which was originally used by the old-school crafting menus in T2A. The requirement for this to work is that the gump in question must have a gumpID between 0x4000 and 0xffff (which can be set when manually creating a packet with this ID via JS), and the Event itself must be in the global script: onScrollingGumpPress( pSock, gumpID, buttonID ) Added new JS Event to allow better control over which names UOX3 sends to the client for characters: onNameRequest( myObj, requestedBy ) // return custom string, or return empty string/nothing/true/false to use default name Updated JS Events to also work for Items (previously only worked for Characters) onLightChange( myObj, lightLevel ) onTempChange( myObj, temp ) onWeatherChange( myObj, weatherType ) Adjusted default temperature for town regions with no weather systems defined from 0 to 20 degrees Celsius Updated some JS scripts (fishing.js, baking.js and cooking.js) to make use of GetTempTag/SetTempTag rather than GetTag/SetTag Added cancel-checks to targeting functions in command script for add-commands (js/commands/targeting/add.js) Updated get command script (js/commands/targeting/get.js) to allow retrieving region ID and name using 'get region Updated misc command script (js/commands/custom/misc-cmd.js) to add 'gettemptag and 'settemptag commands, used to retrieve/set temporary custom tags from/on objects Fixed a bug where Spirit Speak skill would be checked for race languages even if the race had LANGUAGEMIN defined as 0 (or not defined at all) Fixed an issue where players using regular UO client would get stuck in a black void after teleporting between worlds, by adding an additional character refresh after the teleport Fixed an issue where crafting tools for Blacksmithing and Carpentry would attempt to fetch the value of an incorrectly named INI setting to handle durability loss for the tools Added new setting under [settings] section of UOX.INI to control whether it should be possible to craft weapons from coloured ingots or not: CRAFTCOLOUREDWEAPONS=0/1 // If enabled(1), players can craft coloured weapons. Defaults to disabled(0) Fixed an issue where the correct ingots were not consumed when attempting to craft items using colored ingots Fixed a rogue debug message leftover in the scissor script
2022-02-13 22:49:37 +08:00
void CopyData( CBaseObject *target );
public:
2002-04-07 20:53:41 +00:00
Point3_st GetOldLocation( void );
2002-04-07 20:53:41 +00:00
size_t GetNumTags( void ) const;
UOX3 0.99.6-RC4 Fixed an issue that prevented onBuyFromVendor() and onBoughtFromVendor() JS Events from triggering when attached to NPC shopkeepers Fixed an issue with help gump that prevented password management section from working as intended (js/server/misc/helpgump.js) Fixed an issue where UOX3 would fail to load pre-HS multi.mul files Added chess board to Misc->Games add menu (dfndata/items/ItemMenu.bulk.dfn) Fixed an issue with 'move (alias for 'telestuff) command that referenced the wrong variable name (js/commands/targeting/tele.js) When a player is teleported via the GM 'wholist menu, any pets within range are now also brought along for the ride Consolidated error-reporting for JS Functions, Object Methods and Object Properties to provide more context (scriptID, filename, line number) when something goes wrong Added some missing shield IDs (0xA649, 0xA64A, 0xA831, 0xA832) to IsShieldType() function MAXRANGE item property previously only worked for ranged weapons; now it works for melee weapons too, and potentially allows melee weapons with combat range longer than 1 tile MAXRANGE item property can now be used to define max combat range for melee weapons Fixed an issue (non-critical) with .PlaceInPack() JS Method that would cause UOX3 to try adding items marked for deletion to refreshQueue and spam console with errors Added missing AI scripts to summoned Blade Spirits and Energy Vortexes (dfndata/npc/magicsummon.dfn) Fixed an issue with weight calculation for hireling backpacks (js/npc/ai/hireling.js) Fixed an issue with the 'fix command, which would in most cases set character's Z to -1 regardless of location, but now adheres to map elevation instead Fixed an issue with Pack AI (js/npc/ai/pack_ai.js) that prevented pack members from attacking target correctly (thanks Dragon Slayer) Fixed an issue with DoesMapBlock JS Function that incorrectly checked for 6 function arguments, when it actually requires 8 Fixed an issue with DoesDynamicBlock JS Function that incorrectly checked for 8 function arguments, when it actually requires 9 Fixed an issue with runebook script (js/item/runebook.js) that prevented players from being able to use recall charges without having spellbook with spell in inventory Fixed issues with placement of tall items on ground/floor, and with stacking of items in houses Fixed incorrect alias for woodland armor (dfndata/items/gear/armor/other/armor/wood.dfn - thanks Dragon Slayer) Fixed a critical issue with script context sometimes changing while executing a script, because of events in other scripts being triggered. Affected scripts can be safeguarded against this by the addition of a dummy callback function anywhere in the script: function _restorecontext_() {} Fixed an issue with non-animal pets not gaining loyalty when being fed (thanks Dragon Slayer) Added new JS Object Methods for Chars/Items/Multis to fetch list of custom tags associated with object: .GetTagMap() // Gets list of persistent custom tags associated with object .GetTempTagMap() // Gets list of temporary custom tags associated with object Added new JS commands ('GETTAGMAP and 'GETTEMPTAGMAP) that spits out details of custom tags associated with targeted object (js/commands/custom/misc-cmd.js) Added new JS command ('USEITEM) that acts as a short-cut for double-clicking on targeted item (js/commands/custom/misc-cmd.js) Updated 'ADD # and 'ADD ITEM # JS commands to support targeting a container directly and adding the new item inside (js/commands/targeting/add.js) Updated axe script to only perform lumberjacking skill-check when there's still wood available in a given area, and to play appropriate animations for Gargoyle players (js/item/axe.js) Updated script for gameboards to make generated pieces newbiefied so they won't appear on ground if board decays (js/item/gameboards.js) Updated script for stablemasters to avoid relying on global variables (js/npc/ai/stablemaster.js) Updated names of items crafted with runic hammers to include the material name of the hammers used to craft them (js/skill/craft/crafting_complete.js) Fixed a small issue with Detect Hidden skill that would return the wrong message if players found anyone hiding nearby (js/skill/detecthidden.js) Fixed an issue that prevented tile overrides in dfndata/maps/tiles.dfn from loading properly Added entries for a couple of walls with missing no-shoot flags to tile overrides in dfndata/maps/tiles.dfn Updated JS Method .SoundEffect() to support optional third argument (creatureSoundNum) to play creature-defined sounds from dfndata/creatures/creatures.dfn. New syntax: .SoundEffect( soundID, allHear[, creatureSoundNum] ) // 0=SOUND_STARTATTACK, 1=SOUND_IDLE, 2=SOUND_ATTACK, 3=SOUND_DEFEND, 4=SOUND_DIE Added new Character JS Methods: .SetRandomName( nameListID ) // apply a random name from specified namelist to character .FindItemSection( sectionID ) // find item in player's backpack with specified sectionID Added new Socket JS Method: .OpenContainer() // Opens specified container for socket
2023-05-30 01:47:26 +08:00
auto GetTagMap() const -> const TAGMAP2;
auto GetTempTagMap() const -> const TAGMAP2;
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt) Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri) Updated SpiderMonkey from v1.6.0 to v1.7.0 Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri) Added StringUtility file with general common string manipulation functions (punt) Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt) Overall code cleanup to remove/replace platform-dependent code (punt) Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt) Replaced usage of char in many places with std::string (punt) Started process of replacing UString usage with functions provided through StringUtility instead (punt) Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt) Replaced platform specific time handling by using cross-platform chrono library (punt) Removed UOX namespace to reduce complexity (punt) Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt) Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt) Removed some platform specific files like uoxlinux.h, which is no longer required (punt) Removed legacy crash protection code, and removed support for cluox (punt) Removed legacy "support" for Borland compiler (punt) Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri) Removed legacy BUILD folder with outdated compilation instructions (Xuri) Removed old Changelog file (merged into Changelog.txt) (Xuri) Fixed a pointer bug for items in multis on world load (punt) Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt) Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt) Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt) Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt) Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt) Added some new commands to js/commands/custom/misc-cmd.js (Xuri) cont // Targeted item will be made a container, set to nondecay and movable 2 endfight // Targeted character (and character being fought) will stop fighting getmulti // Get multiObject for targeted item finditem // Find item at layer X movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen) Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri) Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
TAGMAPOBJECT GetTag( std::string tagname ) const;
void SetTag( std::string tagname, TAGMAPOBJECT tagval );
2002-04-07 20:53:41 +00:00
TAGMAPOBJECT GetTempTag( std::string tempTagName ) const;
0.99.4x Fixed an issue where the color of NPC corpse names would not always match up with the NPC's flag color Fixed a bug where the baseRange and maxRange properties of ranged weapons would not get saved to world files. These values are now saved in the format of RANGE=baseRange,maxRange Changed the way items are added to containers, to ensure that the order in which the items are displayed to the player always reflects the order in which they were added; now the most recent item added/moved in a container will always be rendered on top of older items. Made adjustments to how items are randomly added to containers; should use more of a given container gump's available area now Exposed Item property to JS engine, which contains serial of the creator of an item: .creator // contains serial of the creator of an item. If set, maker's marks will show up in the item's tooltip Fixed an issue where JS engine would lose track of script context if one script used CreateDFNItem() or SpawnNPC() functions and the new objects had events that triggered upon creation. UOX3 now restores the original script context at the tail end of these functions. Added new JS Event to allow inserting custom tooltip text for objects, which will be displayed in tooltips right after the object name. Any text returned from the event will be displayed, and the text can make use of the same HTML tags as gumps to make changes to color, font, etc. onTooltip( myObj ) // Triggers for objects right before the object's tooltip properties are sent to client Updated 'tweak and 'set commands to refresh item being modified if movable state of item changes, so the change is reflected in nearby clients Fixed an issue with NPC vendors and items bought from players not being properly removed from the vendor's "bought container" when players buy them again Ported Item Identification skill from code to JS (js/skill/itemid.js) and removed hard-coded version Implemented magic item generator in JS (js/item/magic_item.js). When this script is attached to an NPC, it has a chance to generate magic weapons, armors, wands/staffs and rings as loot on the NPC's corpse when slain. The chance of getting quality magical items increases with the fame level of the NPC in question. The types of magical items generated follows the pattern of such items as implemented in UO prior to the AoS expansion. Examples: exceedingly accurate war hammer of vanquishing substantial, accurate axe of power and Daemon's Breath silver long sword massive platemail arms of Protection metal shield of defense durable ringmail tunic of guarding All magic items have a chance to have spell effects attached (with rings/wands being guaranteed to have these), with a limited amount of charges available. For weapons, these effects activate on successful hits in combat, while for armors they activate on equip, and then periodically as long as the item is worn. Rings and wands/staffs have to be manually activated and targeted - with the exception of rings of invisibility, which activate the moment you equip them! Related scripts: js/item/magic_armor_equipeffects.js js/item/magic_weapon_accbonus.js js/item/magic_weapon_equip.js js/item/magic_weapon_spell_attack.js The magic item loot generation script has been attached to a number of different NPCs, all of which now have a chance to drop magic items as loot when defeated. A bonus magical item - the glacial staff - has also been implemented (js/item/magic_glacial_staff.js), and has a chance to drop as loot from Giant Ice Serpents! Fixed an issue with CustomTarget where the target message would not be displayed if the cursorType parameter was provided Fixed bug with 'rename command, which referenced a non-existing variable that caused a script crash Added additional object properties to 'get and 'set commands: .shouldSave // Determines if an item should be saved in worldfiles or not .baseRange // Determines the base range of a ranged weapon, less than which it becomes less effective .maxRange // Determines the max range of a ranged weapon, beyond which it cannot reach its target The feature that allows stats like Strength, Dexterity and Intelligence to provide bonuses to skill checks has been turned into a UOX.INI setting, which is disabled by default. The bonuses have also been nerfed; they will no longer contribute more to the success of a skill check than the actual skill being checked! STATSAFFECTSKILLCHECKS=0/1 // If enabled, stats can provide bonuses to skill checks based on the weighting for those stats as setup in dfndata/skills/skills.dfn Updated damage tracking code to include the type of damage that was dealt (PHYSICAl vs HEAT vs COLD, etc) Updated Character JS Method Damage() to include a new parameter that can specify the type of damage that was dealt to the character. The new parameter must always be included if other optional parameters are used. Note that updates might be required for scripts making use of this method.Updated syntax: .Damage( amount ) .Damage( amount, damageType ) .Damage( amount, damageType, attacker ) .Damage( amount, damageType, attacker, doRepsys ) Supported damageTypes: PHYSICAL = 1 LIGHT = 2 RAIN = 3 COLD = 4 HEAT = 5 LIGHTNING = 6 // magic damage POISON = 7 SNOW = 8 Updated JS Event OnDamage to include an additional parameter that describes the type of damage that was dealt. New syntax: onDamage( damaged, attacker, damageValue, damageType ) Updated JS Event OnSpellTarget to allow rejecting a spell being cast on a target by returning a value of 2 from the script Split the character priv flag for magic reflection into a temporary one (one-time magic reflection spell) and a permanent one (innate permanent reflection ability). The temporary effect is put in place by Magic Reflection spell, and is removed after a successful spell reflect. The permanent one is an innate ability of a character and is not removed even after a spell is reflected. Added new Character JS property to get/set state of a character's permanent magic reflect ability: .permanentMagicReflect // 0 = disable, 1 = enable Added special abilities/effects for the following NPCs: Acid Elementals now have a chance to damage the melee weapons of their attackers Dull Copper Elementals now explode on death Shadow Iron Elemental is immune to targeted spell damage Copper Elementals have permanent magic reflect, and reflect some physical damage back at their attacker Bronze Elementals deal passive area damage to nearby players every 5 to 10 seconds Valorite Elementals have permanent magic reflect, reflect some physical damage back at their attacker Snow/Ice Elementals deal passive area damage to nearby players every 5 to 10 seconds Lava Serpents deal passive area damage to nearby players every 5 to 10 seconds Phoenixes deal passive area damage to nearby players every 5 to 10 seconds Pixies have a chance to cast a random spell upon receiving a death blow: Bless (target) Curse (target) Explosion (target) Greater Poison (target) Greater Heal (self, prevents death) Ethereal Warriors will now resurrect dead players with positive karma Ethereal Warriors now have a chance to drain target's health, stamina or mana on hit Fire Breath special ability added to the following NPCs, with the random ability damage scaling with the NPCs current health: Hell Cat, 5 to 8 dmg at max health Fire Steed, 6 to 9 dmg at max health Hell Hounds, 8 to 11 dmg at max health Lava Lizard, 8 to 11 dmg at max health Predator Hell Cat, 9 to 14 dmg at max health Sea Serpent, 11 to 17 dmg at max health Swamp Dragon, 15 to 22 dmg at max health Armored Swamp Dragon, 15 to 22 dmg at max health Fire Gargoyle, 20 to 30 dmg at max health Deep Sea Serpent, 21 to 32 dmg at max health Serpentine Dragon, 22 to 32 dmg at max health Drake (Gray), 22 to 32 dmg at max health Drake (Red), 22 to 32 dmg at max health Nightmare, 26 to 39 dmg at max health Dark Steed, 26 to 39 dmg at max health Silver Steed, 26 to 39 dmg at max health Kraken, 39 to 59 dmg at max health Dragon (Red), 41 to 62 dmg at max health Dragon (Gray), 41 to 62 dmg at max health Shadow Wyrm, 50 to 75 dmg at max health Reptalon, 51 to 77 dmg at max health Skeletal Dragon, 52 to 77 dmg at max health Ancient Wyrm, 60 to 90 dmg at max health Update stats, skills and loot for all currently implemented NPCs Removed an ancient piece of code that prevented corpses from being generated for various elementals and blade spirits on death. This was originally put in place because these creatures had no corpses, and would replace it with a backpack instead, but these creatures now all have corpses in all client versions supported by UOX3 Updated potions script (js/item/potion.js) with updated formula for amount of hitpoints healed by healing potions, and added restrictions for using them when at full health and/or if poisoned (Dragon Slayer) Fixed a bug where creatures (and humans, if FORCENEWANIMATIONPACKET was disabled in uox.ini) would play animations with wrong frame count, causing the animations to either freeze for a few frames at the end, or get cut off a couple of frames early Implemented bonus hit chance for Archery skill, based on mention of such a bonus in Publish 5 patch notes and related UO House of Commons chat. This has been exposed as a UOX.INI setting where this bonus can be tweaked: ARCHERYHITBONUS=10 // Bonus hit chance for Archery skill added to regular hit chance in combat. Defaults to 10% Implemented optional extra delay between moving and being able to shoot with ranged weapons in combat (in addition to whatever delay is there due to speed of the ranged weapon). This is exposed as a UOX.INI setting: ARCHERYSHOOTDELAY=0.5 // Minimum delay in seconds from a player stops moving until they can start to fire their ranged weapon. Defaults to 0.5s Fixed a bug where players who never entered combat mode could fire ranged weapons while moving Updated Add-menu with some improvements for usability: Menu now directly on the Objects (previously "Shard") tab for quicker access, with a small welcome text and quick-link button for UOX3 docs Settings tab contains some (persistent, will be saved with character) options for how the Add-menu behaves, along with a few quick-access buttons to some useful commands. Available options: Option to add chosen item at specific location instead of in GM's backpack Option to add chosen item repeatedly until cancelled Option to automatically reopen Add-menu on last menu that was open when a selection is made Option to force decayable state of all added items to either off (doesn't decay), on (decays) or nothing (use item default) Option to force movable state of all added items to either off (not movable), on (movable) or nothing (use item default) Added a Home button at the bottom of the menu, that takes the user back to the front page of the Add-menu regardless of which menu page they're on Updated Character/Socket JS Method SysMessage() with an optional parameter to specify the color used to display the system message. Updated syntax: .SysMessage( "Text" ) // Display "Text" to user as a system message with default system message color from ini .SysMessage( "Text %s %s", txtArg1, txtArg2 ) // Display "Text" to player with string arguments injected into text .SysMessage( txtColor, "Text" ) // Display "Text" to user with a specified color .SysMessage( txtColor, "Text %s %s", txtArg1, txtArg2 ) // Combination of text color, text and string arguments Fixed a bug where hair/beard items could show up inside corpses Fixed a bug where items could sometimes vanish (visually) from containers when bouncing back because player was not able to pick them up Fixed a bug where players would be unable to pick up a freely movable item from a locked down container Updated handling of item bouncing on pickup to use UOX3 dictionary messages instead of hard-coded client messages Added support for new Dictionary language: dictionary.POL - Polish (SERVERLANGUAGE=8 in uox.ini, or client language 83 if SERVERLANGUAGE is set to 0) Added taming restrictions for Unicorn, Ki-Rin and Cu Sidhe (js/skill/taming.js) Added modification of some creatures stats after they've been tamed (js/skill/taming.js) Added restrictions for who can ride certain creatures (Unicorn, Ki-Rin, Cu Sidhe) Updated words of power for Meteor Swarm spell to follow the same logic as other spells using Kal (Summon): Kal Des Flam Ylem Added new Item/Character JS Methods to get/set temporary custom tags which don't persist across worldsaves (or across reconnects, for players): .GetTempTag( "tagName" ) .SetTempTag( "tagName", tagValue ) When applying HPMAX, STAMINAMAX AND MANAMAX DFN tags to new NPCs, their current HP, STAMINA and MANA properties will now be automatically updated to match Fixed a server crash caused by empty speech messages sent from certain clients Fixed a bug that prevented teleport locations in Felucca/Trammel from working properly Updated calculations in code for duration and damage of existing poison strengths (1 - Lesser, 2 - Normal, 3 - Greater, 4 - Deadly) to match with ~Publish 15 (LBR/pre-AoS), and added another poison strength for monster usage (5 - Lethal) The strength of the Poison and Poison Field spells is now based on the average of the caster's Magery and Poisoning skills, the distance from the target (Poison spell only) and the target's Resisting Spells skill. If caster is further away than 2 tiles from target, the poison strength always equals Lesser Poison, otherwise the following rules apply: If caster's combined skill is higher than 100.0, poison strength equals Greater Poison, with 5% chance of Deadly Poison (if Poison spell) or Deadly Poison (if Poison Field spell) If caster's combined skill is higher than 70.2, poison strength equals Greater Poison If caster's combined skill is higher than 30.2, poison strength equals Normal Poison If caster's combined skill is 30.2 or lower, poison strength equals Lesser Poison If target resists spell, poison strength is reduced by 1 level, unless it's already at the lowest level Fixed an issue that would would let players move faster than they should have been allowed to Fixed misc issues with Party System: Mana and Stamina should now update for Party Members when added to the party, when going in/out of range and when their stats update while in range Players who get disconnected or relog should now find themselves back in the same party they were in previously Added system messages to inform party members about updates to their party, and to let invited players know they've successfully joined a party (or rejoined, if relogging) World saves now operate on the principle of only saving changes done since the last world save. Combined with the fact that NPCs in UOX3 are only active if there are players in the same/neighbouring map regions, shard owners may expect to see a decrease in world save times ranging from ~11% to ~99%, depending on how active and how spread out their player base is. If no changes have taken place since last save, saves are virtually instantaneous!
2021-09-20 21:35:17 +08:00
void SetTempTag( std::string tempTagName, TAGMAPOBJECT tagVal );
void SetResist( UI16 newValue, WeatherType damage );
UI16 GetResist( WeatherType damage ) const;
2002-04-07 20:53:41 +00:00
void SetTitle( std::string newtitle );
std::string GetTitle( void ) const;
UOX3 0.99.6-RC3 Updated Item DFNs with ORIGIN and SECTIONID tags for relevant items Added JS Function to make comparing eras (based on object origin or server settings) easier: EraStringToNum( eraString ) // Takes an era string (uo, t2a, uor, td, lbr, aos, etc) and returns an int Updated some JS scripts to use EraStringToNum() for era comparisons (potionkeg.js) Default CORESHARDERA setting is now LBR Removed PUB15 as a separate "era" - it's identical to late stage LBR anyway: Removed support for GETPUB15 tag Added support for GETUO tag for items/NPCs: GETUO=<sectionID> // Inherit DFN section if core shard era is Ultima Online (original release, before T2A) Rewrote portions of MsgBoardQuestEscortCreate() function in msgboard.cpp to ensure only escort regions within same world as NPC can be selected as destinations Increased maximum number of possible escort regions that can exist from 255 to 65535 Added region definitions for all shrines in Britannia (Fel & Trammel), and marked them as valid destinations for NPC escorts (uox3/regions/regions.dfn) Moved bankers from vendor to human DFN files, and made them inherit basehuman instead of basevendor - since they are not vendors To address an issue with escorted NPCs not timing out and vanishing if they are left in a "dormant" area of the world with no player activity, the NPCs are marked as "always awake" the moment they arrive at their destination. Note that the uox.ini setting ALLOWAWAKENPCS needs to be enabled for this to work. Fixed an issue where spawnsection of spawners did not show up correctly in tweak menu Fixed an issue where the generic Orc AI script didn't have a return true at end of onDamage() event, which prevented all orcs from taking damage in combat (js/npc/ai/monster/orc.js) Moved Anatomy skill-check in healing script (js/skill/healing.js) from onCallback1() function to onTimer() to prevent the skill-check from being spammable Added mount ID for Frost Mite in creatures.dfn, allowing it to be used as mount Exposed the following character properties to JS engine, which can be used to view/adjust the permanent hair/beard options for a character: .hairStyle .hairColour .beardStyle .beardColour Updated 'kill hair, 'shavehair, 'shavebeard and 'remove commands to clear permanent hair/beard colour and style properties in addition to removing the item itself Added a GM override to let GMs place as many houses as they want (js/server/house/houseDeed.js) Fixed an issue where attempting to sell items to NPC shopkeepers could result in client crashing Added a new JS Event: onMultiLogout( iMulti, cPlayer ) // Handles players logging out while inside multis Updated house script (js/server/house/house.js) with onMultiLogout event, which allows owners (always) and co-owners/friends/guests (if option enabled in uox.ini) to safely log out inside the house (without getting booted). Added a "keyless" option for interacting with locked doors (js/item/doors.js) of player-owned houses, which lets owners/co-owners/friends/guests of a house use locked doors in the house without requiring a key in their backpack, if the options for that are enabled in UOX.INI. Enabled for owners/co-owners and friends by default (but not for guests) Note that if option to safely log out is enabled, but keyless option is NOT enabled, then the server will check if the player has a key to the house in their backpack, and eject them from the house upon logging out if not. This is to make sure players don't get stuck inside a house they can't get out of because they lack the rights to open doors etc. Added new UOX.INI options, under the [houses] section: SAFECOOWNERLOGOUT=1 // Allow co-owners to safely and instantly log out inside house SAFEFRIENDLOGOUT=1 // Allow friends to safely and instantly log out inside house SAFEGUESTLOGOUT=1 // Allow guests to safely and instantly log out inside house KEYLESSOWNERACCESS=1 // Allow owner of house to use locked doors in house without key in pack KEYLESSCOOWNERACCESS=1 // Allow co-owners of house to use locked doors in house without key in pack KEYLESSFRIENDACCESS=1 // Allow friends of house to use locked doors in house without key in pack KEYLESSGUESTACCESS=0 // Allow guests of house to use locked doors in house without key in pack Fixed NOHAIR tag from races.dfn not being loaded correctly
2023-03-04 22:50:55 +08:00
//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 );
2002-04-07 20:53:41 +00:00
virtual ~CBaseObject();
Numerous changes with focus on feature and stability parity across Windows, Linux and MacOS platforms Added new Makefile that handles compiling UOX3 and Spidermonkey on both Linux and MacOS (punt) Added VS solution (SpiderMonkey.sln) and VC++ project files for compiling SpiderMonkey on Windows (Xuri) Updated SpiderMonkey from v1.6.0 to v1.7.0 Added optimization flag -O2 for release build in CMakeLists.txt in project root (Xuri) Added StringUtility file with general common string manipulation functions (punt) Updated RandomNum function to use a "seedless" random number generator from C++11 instead of the old C rand() function. (punt) Overall code cleanup to remove/replace platform-dependent code (punt) Replaced potentially unsafe usage of C string stuff like sprintf, vsprintf, vsnprintf, strncat, strcpy and strlen throughout the code with calls to a format() function containing only a single, safe use of vsnprintf, ensuring there's a single place of failure if there's anything to fix and and making it easy to potentially replace this with std::format from C++20 when the time comes. (punt) Replaced usage of char in many places with std::string (punt) Started process of replacing UString usage with functions provided through StringUtility instead (punt) Replaced platform specific fileIO handling in Windows/Linux with cross-platform C++17 standard std::filesystem (punt) Replaced platform specific time handling by using cross-platform chrono library (punt) Removed UOX namespace to reduce complexity (punt) Elimitated template code approach to singletons for more modern c++ constructs, removing dependices in the process (punt) Removed ODBC support; it hasn't been touched since the initial implementation in 2008, and there is a lack of someone to maintain the code. (punt) Removed some platform specific files like uoxlinux.h, which is no longer required (punt) Removed legacy crash protection code, and removed support for cluox (punt) Removed legacy "support" for Borland compiler (punt) Removed legacy VC++ 6 Workspace/Project files, VS2005 Solution/Project files, as these are no longer supported (Xuri) Removed legacy BUILD folder with outdated compilation instructions (Xuri) Removed old Changelog file (merged into Changelog.txt) (Xuri) Fixed a pointer bug for items in multis on world load (punt) Fixed a dictionary related issue that caused segmentation faults on Linux/MacOS (punt) Fixed an issue with callbacks to JS scripts that caused segmentation faults on Linux/MacOS (punt) Paths in uox.ini should now load properly on all platforms regardless of whether those paths use slashes or backslashes, and whether or not they end in a slash/backslash. (punt) Moved to c++17 style of threading, and got rid of threadsafeobject.cpp/h (punt) Replaced parsing of UOX.INI tags with a system that's more easily maintainable (punt) Added some new commands to js/commands/custom/misc-cmd.js (Xuri) cont // Targeted item will be made a container, set to nondecay and movable 2 endfight // Targeted character (and character being fought) will stop fighting getmulti // Get multiObject for targeted item finditem // Find item at layer X movespeed // Set movement speed of target player (0x0 Normal, 0x1 Mounted, 0x2 Slow (walk only), 0x3 Hybrid ("jog"?), 0x4 Frozen) Added new HTML based documentation in docs folder, and removed many old legacy docs that are either incorporated into this document already or no longer relevant for the current UOX3 version (Xuri) Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2020-09-07 18:09:55 +08:00
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 );
UOX3 0.99.6-RC6 Removed arbitrary and hidden restrictions on refreshing list of online players shown with 'wholist command Fixed an issue where player ghosts that get teleported would not see themselves get updated to new location Fixed a server crash from clients disconnecting while running server in debug mode Improved how container updates are sent to players; now only sends to clients that have actually opened the container, and who are still within range Added more information about UO data files being loaded during server startup Enhanced the GM 'add menu to allow clicking directly on images of items/npcs to add them, and adjusted size of menus to accommodate this Fixed an issue with fleeing NPCs that could cause them to attempt to flee across time and space, regardless of distance to target/attacker in combat Added NPC AI that runs away from players if they get too close (even outside combat). Applied to hind, rabbits, squirrels, ferrets and various birds by default: AI_ANIMAL_SCARED (aitype 12) Fixed issues with NPCs fleeing forever, or getting stuck in flee/don't flee loop, by introducing max fleeing distance (50 tiles) and cooldown (30 sec) on fleeing Updated onNameRequest JS Event to include third parameter with origin of name request, so script responses can be tailored appropriately: onNameRequest( myObj, requestedBy, requestSource ) Potential values for requestSource: 0 - Speech/System Messages 1 - Guild Menus 2 - Stat Window (self) 3 - Stat Window (other) 4 - Tooltip 5 - Paperdoll Journal 6 - Paperdoll 7 - Single Click / All-Names 8 - System 9 - Secure Trade Window Added Adaptive Performance System (APS) that dynamically adjust how often NPC AI/movement is checked based on overall shard performance. If performance drops below defined threshold, UOX3 gradually slows down checks for NPC AI/movement to prioritize player movement/speech/command responsiveness. If performance climbs back up above threshold, slowdowns are gradually removed. The following UOX.INI options have been added under [system] category to support this system: APSPERFTHRESHOLD=50 // Performance threshold (measured in simulation cycles/sec) below which the APS kicks in APSINTERVAL=100 // How often (in milliseconds) the APS checks performance and makes adjustments (if needed) to balance out shard performance APSDELAYSTEP=50 // How much the delay timer is modified by (in milliseconds) each time APS makes adjustments APSDELAYMAXCAP=2000 // Max amount of of delay APS can introduce for NPC AI/movement handling when attempting to restore shard performance Added new JS Methods for Region objects: .GetOrePrefs( oreType ) // Get ore preference data for ore type found in town region. Returned as an array containing the following data: orePrefData -> [ oreName, // name of ore color, // color of ore minskill, // min skill to mine ore ingotName, // name of ingot created from ore makemenu, // makemenu entry for crafting something from ingot oreChance, // default global chance of finding this ore type scriptID // script attached to mined ore ], orePrefChance // Chance of finding this ore type in given town region .GetOreChance() // Get base chance of finding any ore in town region Moved Mining skill plus gravedigging feature from hard code to scripts (js/skill/mining.js) to make it easier to maintain and/or customize, and removed hard coded variants Gravedigging now relies on the ore resource system behind the scenes to restrict how often graves in a given area can be dug up Fixed some incorrect references to .worldNumber Character property in misc scripts (should be .worldnumber) Made some "hard-scripted" system messages in misc scripts use dictionary system instead Added spawn region for banker NPCs in Serpent's Hold (dfndata/spawn/felucca/spawn_town_serpents_hold.dfn, dfndata/spawn/trammel/spawn_town_serpents_hold.dfn) Fixed region definition of Ocllo to actually cover the entire town (dfndata/regions/regions.dfn) Added numerous additional locations accessible with 'goplace # command, for key locations in Ilshenar, Malas, Tokuno Islands and Ter Mur (dfndata/location/location.dfn) Revised travel-menu portion of GM menu (shortcut: 'travel) to include more travel options based on new locations (dfndata/items/travelmenu.dfn and travelmenu.bulk.dfn) Fixed an issue where NPCs could attempt to attack targets in other worlds/instances Added new JS Event that triggers for characters who are about to deal damage in combat. Complimentary to onDamage, which triggers for chars receiving damage: onDamageDeal( dmgDealer, dmgReceiver, damageValue, damageType ) Added new JS Event that can trigger in global script upon creation of new player chars. Note that this will trigger in place of onCreateDFN event for player characters: onCreatePlayer( pChar ) Added new JS Event that triggers for characters selecting a target with a spell. Complimentary to onSpellTarget, which triggers for targets selected with a spell: onSpellTargetSelect( caster, target, spellNum ) Updated onCombatStart and onCombatEnd JS Events to also trigger for the other party in combat Updated onPickup JS Event to include a third parameter - the potential container item was picked up from. Event now also triggers event in scripts attached to said containers: onPickup( iPickedUp, pChar, iCont ) Added tracking of total playtime per individual character, and per account across all characters, and exposed these properties to JS engine: .totalPlayTime // Account property, total playtime across all chars .playTime // Character property, total playtime on given character only Added new player-accessible command ('playtime) to spit out the playtime of current character/account as a whole (js/commands/playtime.js) Implemented first version of Young Player System: Replaced the UNUSED9 account flag with YOUNG, to be used by Young/New Player System Added new JS Account property that gets/sets whether player account is considered Young: .isYoung Added new Char timers: TIMER_YOUNGHEAL // Restricts how often Young players are healed by NPC healers TIMER_YOUNGMESSAGE // Restricts how often Young players are warned about dangerous looking monsters in overworld Updated GM commands 'get and 'set to get/set .isYoung property of player's account (js/commands/targeting/get.js and set.js) Added new UOX.INI setting to enable/disable Young Player System (enabled by default): YOUNGPLAYERSYSTEM=1 If Young Player System is enabled, all newly created player accounts are automatically marked with Young flag Added new script to handle various restrictions and functions related to Young characters (js/player/young_player.js): Young characters will have [Young] displayed over their head Young characters will have their Young status checked and verified on every login + every stat/skill gain, to revoke the Young status if any of the following is true: Account has a total playtime of more than 40 hours Any character has more than 350 total (base) skill points Any character has more than 70 skill points in a single skill Any character has more than 150 total stat points Any character has more than 80 stat points in a single stat Young characters can renounce their Young status manually by saying the words "I renounce my young player status" Young characters get two additional items upon creation: a new player ticket (can be combined with any other players new player ticket for both players to get a reward) a sextant (shows Young players directions to nearest moongate/bank regardless of where they are, as long as outdoors) Young characters cannot target other player characters with hostile spells or skills Young characters cannot be the target of other player characters' hostile spells or skills Young characters can only cast beneficial spells upon themselves or other Young characters Young characters can only be the target of beneficial spells from other Young players Young players (and their pets/followers) cannot attack or harm any other players (or their pets/followers), nor themselves be attacked or harmed by any other players (or their pets/followers), whether from combat, spells, skills or items Young players don't lose any of their items on death, and are teleported to the nearest healer upon death with all their items intact Young players receive a warning upon entering dungeons that monsters there will be hostile Updated global script (js/server/global.js) to: Check/Verify Young status of players upon login Attach young player script on login/creation for players on Young accounts Give specific items to Young players upon creation Added new script (js/item/corpse.js) that is assigned to all freshly created corpses. This script handles restrictions related to Young players interactions with corpses, and the interactions of other players with corpses of Young players Updated JS Method .Carve() to return true/false depending on whether carving a corpse was successful Updated Healer AI in code to heal nearby injured Young players Updated Evil AI and Evil Caster AI in code to avoid selecting Young players as targets in combat outside of dungeons Added a new section to UOX.INI - [young player starting locations] - that can be used to define starting locations for Young players. If only one such location is provided, all players start there. Otherwise, it matches the same starting location setup as the regular one - with one entry per town in Britannia. Restricted transferring and/or friending of pets (code) and hirelings (hirelings.js) between Young and non-Young players Restricted Young players from recalling or gating to Felucca facet Young players can instantly logout from anywhere, at any time
2023-07-01 20:02:40 +08:00
std::string GetNameRequest( CChar *nameRequester, UI08 requestSource );
std::string GetName( void ) const;
void SetName( std::string newName );
2002-04-07 20:53:41 +00:00
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;
2002-04-07 20:53:41 +00:00
Rework of passive stat regeneration Updated code calculating passive health, stamina and mana regeneration for characters, based on new UOX.INI settings and bonuses from characters/items/races Added three new Character/Item/Race DFN tags to grant bonus health/stamina/mana regeneration: HEALTHREGENBONUS=# // 10 bonus points equates to 0.01 extra hp regen per second, independent of era STAMINAREGENBONUS=# // 10 bonus points equates to 0.05 extra stamina regen per second MANAREGENBONUS=# // 10 bonus point equates to 0.1 extra mana regen per second ...also available as JS Properties: .healthRegenBonus .staminaRegenBonus .manaRegenBonus Updated get/set JS commands to allow getting/setting regen bonuses for health, stamina and mana Updated races.dfn to include default +2 health regen bonus for humans, and +2 mana regen bonus for gargoyles. Added new UOX.INI settings under [Skills and Stats] section: HEALTHREGENMODE=1 // 0 = no passive health regen, 1 = default passive health regen STAMINAREGENMODE=1 // 0 = no passive stamina regen, 1 = default passive stamina regen (LBR or below), 2 = AoS or beyond, 3 = SA and beyond MANAREGENMODE=1 // 0 = no passive mana regen, 1 = default passive mana regen (LBR or below), 2 = AoS (Pub17), 3 = AoS/SE (Pub18 and beyond), 4 = ML, 5 = KR, 6 = SA and beyond HEALTHREGENCAP=# // Max cap for Health Regeneration Bonus stat per character STAMINAREGENCAP=# // Max cap for Stamina Regeneration Bonus stat per character MANAREGENCAP=# // Max cap for Mana Regeneration Bonus stat per character Added new UOX.INI section ([default race bonuses]) with the following new settings for the 3 default playable races (only used if nothing else specified in races.dfn): HUMANHEALTHREGENBONUS=0 // default health regen bonus for human race (2 from ML expansion onwards) HUMANSTAMINAREGENBONUS=0 // default stamina regen bonus for human race HUMANMANAREGENBONUS=0 // default mana regen bonus for human race ELFHEALTHREGENBONUS=0 // default health regen bonus for elf race ELFSTAMINAREGENBONUS=0 // default stamina regen bonus for elf race ELFMANAREGENBONUS=0 // default mana regen bonus for elf race GARGOYLEHEALTHREGENBONUS=0 // default health regen bonus for gargoyle race GARGOYLESTAMINAREGENBONUS=0 // default stamina regen bonus for gargoyle race GARGOYLEMANAREGENBONUS=0 // default mana regen bonus for gargoyle race (2 from SA expansion onwards) Updated UOX3 Documentation with new feature section on Stat Regeneration with details on stat regeneration rules and recommended settings per UO era Added support for Medable armors (have no effect on meditation skill and/or passive regen of mana when worn) and Mage Armors (can turn non-medable armor into medable armor) These properties are defined per armor piece using the first and second bits of the MORE property: MORE=0x1 0x0 0x0 0x0 // Medable Armor MORE=0x0 0x1 0x0 0x0 // Mage Armor The following armor types have been marked as medable by default: leather armor, leather ninja armor, leather samurai armor, leaf armor, gargish cloth armor, gargish leather armor and all hats and masks Updated JS Method .Defense() to support optional fourth and fifth parameters - excludeMedableArmor (true/false) and includeShield (true/false) Updated CalfDef function to support including shields in the calculations, and updated mana regen code to include shields when checking for equipped armor Updated Meditation skill JS script to exclude medable armor from armor check, include shields, and apply different rules for active meditation depending on mana regen mode Updated stat window to include defensive rating of shields (based on Parrying skill) and/or elemental resistances (if enabled in ini) Added a new property to CRace class, which is automatically set and incremented as UOX3 loads in races from races.dfn: raceID Added new Getters/Setters for CRace class to retrieve ID of a specific Race object Updated JS property .id for Race JS Object to return new race ID instead of iterating through list of races to compare race object and return index Reloading DFNs now also reloads Races
2025-04-20 06:05:44 +08:00
virtual SI16 GetHealthRegenBonus( void ) const;
virtual SI16 GetStaminaRegenBonus( void ) const;
virtual SI16 GetManaRegenBonus( void ) const;
2024-04-30 13:46:57 -05:00
virtual void SetStrength( SI16 newValue );
virtual void SetDexterity( SI16 newValue );
virtual void SetIntelligence( SI16 newValue );
virtual void SetHP( SI16 newValue );
void IncHP( SI16 amtToChange );
Rework of passive stat regeneration Updated code calculating passive health, stamina and mana regeneration for characters, based on new UOX.INI settings and bonuses from characters/items/races Added three new Character/Item/Race DFN tags to grant bonus health/stamina/mana regeneration: HEALTHREGENBONUS=# // 10 bonus points equates to 0.01 extra hp regen per second, independent of era STAMINAREGENBONUS=# // 10 bonus points equates to 0.05 extra stamina regen per second MANAREGENBONUS=# // 10 bonus point equates to 0.1 extra mana regen per second ...also available as JS Properties: .healthRegenBonus .staminaRegenBonus .manaRegenBonus Updated get/set JS commands to allow getting/setting regen bonuses for health, stamina and mana Updated races.dfn to include default +2 health regen bonus for humans, and +2 mana regen bonus for gargoyles. Added new UOX.INI settings under [Skills and Stats] section: HEALTHREGENMODE=1 // 0 = no passive health regen, 1 = default passive health regen STAMINAREGENMODE=1 // 0 = no passive stamina regen, 1 = default passive stamina regen (LBR or below), 2 = AoS or beyond, 3 = SA and beyond MANAREGENMODE=1 // 0 = no passive mana regen, 1 = default passive mana regen (LBR or below), 2 = AoS (Pub17), 3 = AoS/SE (Pub18 and beyond), 4 = ML, 5 = KR, 6 = SA and beyond HEALTHREGENCAP=# // Max cap for Health Regeneration Bonus stat per character STAMINAREGENCAP=# // Max cap for Stamina Regeneration Bonus stat per character MANAREGENCAP=# // Max cap for Mana Regeneration Bonus stat per character Added new UOX.INI section ([default race bonuses]) with the following new settings for the 3 default playable races (only used if nothing else specified in races.dfn): HUMANHEALTHREGENBONUS=0 // default health regen bonus for human race (2 from ML expansion onwards) HUMANSTAMINAREGENBONUS=0 // default stamina regen bonus for human race HUMANMANAREGENBONUS=0 // default mana regen bonus for human race ELFHEALTHREGENBONUS=0 // default health regen bonus for elf race ELFSTAMINAREGENBONUS=0 // default stamina regen bonus for elf race ELFMANAREGENBONUS=0 // default mana regen bonus for elf race GARGOYLEHEALTHREGENBONUS=0 // default health regen bonus for gargoyle race GARGOYLESTAMINAREGENBONUS=0 // default stamina regen bonus for gargoyle race GARGOYLEMANAREGENBONUS=0 // default mana regen bonus for gargoyle race (2 from SA expansion onwards) Updated UOX3 Documentation with new feature section on Stat Regeneration with details on stat regeneration rules and recommended settings per UO era Added support for Medable armors (have no effect on meditation skill and/or passive regen of mana when worn) and Mage Armors (can turn non-medable armor into medable armor) These properties are defined per armor piece using the first and second bits of the MORE property: MORE=0x1 0x0 0x0 0x0 // Medable Armor MORE=0x0 0x1 0x0 0x0 // Mage Armor The following armor types have been marked as medable by default: leather armor, leather ninja armor, leather samurai armor, leaf armor, gargish cloth armor, gargish leather armor and all hats and masks Updated JS Method .Defense() to support optional fourth and fifth parameters - excludeMedableArmor (true/false) and includeShield (true/false) Updated CalfDef function to support including shields in the calculations, and updated mana regen code to include shields when checking for equipped armor Updated Meditation skill JS script to exclude medable armor from armor check, include shields, and apply different rules for active meditation depending on mana regen mode Updated stat window to include defensive rating of shields (based on Parrying skill) and/or elemental resistances (if enabled in ini) Added a new property to CRace class, which is automatically set and incremented as UOX3 loads in races from races.dfn: raceID Added new Getters/Setters for CRace class to retrieve ID of a specific Race object Updated JS property .id for Race JS Object to return new race ID instead of iterating through list of races to compare race object and return index Reloading DFNs now also reloads Races
2025-04-20 06:05:44 +08:00
virtual void SetHealthRegenBonus( SI16 newValue );
virtual void SetStaminaRegenBonus( SI16 newValue );
virtual void SetManaRegenBonus( SI16 newValue );
2024-06-16 01:37:31 -05:00
virtual SI16 GetSwingSpeedIncrease( void ) const;
virtual void SetSwingSpeedIncrease( SI16 newValue );
2025-03-09 20:50:32 -05:00
virtual SI32 GetTithing( void ) const;
virtual void SetTithing( SI32 newValue );
2025-03-08 21:10:37 -06:00
2024-06-16 01:37:31 -05:00
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 );
2024-06-14 14:38:03 -05:00
virtual SI16 GetHitChance( void ) const;
virtual void SetHitChance( SI16 newValue );
virtual SI16 GetDefenseChance( void ) const;
virtual void SetDefenseChance( SI16 newValue );
2024-04-30 13:46:57 -05:00
void SetDir( UI08 newDir, bool sendUpdate = true );
UI08 GetDir( void ) const;
2002-04-07 20:53:41 +00:00
void SetVisible( VisibleTypes newValue );
VisibleTypes GetVisible( void ) const;
2002-04-07 20:53:41 +00:00
ObjectType GetObjType( void ) const;
virtual bool CanBeObjType( ObjectType toCompare ) const;
2002-04-07 20:53:41 +00:00
SI16 GetHiDamage( void ) const;
SI16 GetLoDamage( void ) const;
2002-04-07 20:53:41 +00:00
void SetHiDamage( SI16 newValue );
void SetLoDamage( SI16 newValue );
2002-04-07 20:53:41 +00:00
Minor JS revamp - multiple scripts per object! Added TryParseJSVal() helper function in cScript.cpp, used to parse jsval values returned from script events. Provides results matching 0 (0, false), 1 (1, true) or any specific int value returned from script. JS events updated to use new TryParseJSVal helper function (no change in behaviour): onDecay, onResurrect, onCommand, onBuyFromVendor, onSellToVendor, onPickup, onCharDoubleClick, onSkillGump, onUseBandageMacro, onCombatStart, onCombatEnd, onDeathBlow, onBuy, onSell JS events with slight change of behaviour after update to use TryParseJSVal: onDrop, onDropItemOnItem, onDropItemOnNpc - previously, a blank or non-existent return value would be treated the same as a return true. This will now be treated as a return false. Update scripts accordingly! JS events updated to support return values from scripts: onCollide, onTalk, onSnooped, OnHungerChange Return false or nothing to prevent hard code from running Return true to allow hard code to run like normal onStolenFrom, onAISliver, onLightChange, onVirtueGumpPress, onQuestGump, onSpecialMove, onSwing, onClick, onHouseCommand, onSellToVendor, onSkillCheck, onSpellGain, onSpellLoss Return false to allow hard code and other scripts with event to run like normal Return true to prevent hard code and other scripts with event from running onSteal Return false or nothing to allow hard code and other scripts with event to run like normal Return true to prevent hard code and onStolenFrom event from running (theft failed?) Return 2 to prevent hard code, but allow onStolenFrom event to run (theft succeeded, but handled in script?) onLeaving, onEntrance, onEquip, onUnequip, onEnterEvadeState, onSoldToVendor, onBoughtFromVendor, onSpellSuccess, onSpellTarget, onFlagChange, onDeath Return false or nothing to allow other scripts with event to run like normal Return true to prevent other scripts with event from running Added new JS events that run prior to items being equipped/unequipped, with support for return values: onEquipAttempt( pEquipper, iEquipping ) onUnequipAttempt( pEquipper, iUnequipping ) Return false or nothing to reject attempt to equip/unequip item, and prevent hard-code or other scripts with event from running Return true to allow hard code to run like normal Added new JS event that runs prior to onSnooped event, for character doing the snooping: onSnoopAttempt( snooped, snooper ) Return false or nothing to prevent hard code and other snooping-related events from running Return true to allow hard code and other snooping-related events to run like normal Updated onSnooped JS event to accept return values: Return true when success state is true to prevent other scripts with event from running Return true when success state is false to prevent hard code and other scripts with event from running Updated onClick JS event to also run for characters with event attached (return 1 to prevent showing hard-coded name for whatever object is clicked) Updated onSteal JS event to include a third parameter, an object reference for the target of the theft Added support for assigning multiple JS scripts per object (item, multi, char, region). Any time a scriptID is added to an object, the list of such IDs for that object will be sorted from lowest to highest scriptID, which also determines the execution order for the scripts. Note that if the same JS event is present in several scripts assigned to an object, each of those events will trigger, unless the rules about return values for said event prevent this DFNs for Items, Multis, Characters and Regions can now contain multiple SCRIPT=scriptID tags per definition. Each such SCRIPT tag will be applied to the object in question, then sorted from lowest to highest scriptID by server. Added new JS property for Items, Multis, Characters and Regions: .scriptTriggers // If used to get property, will return array object with all script IDs assigned to object. If used to set property, will add script ID to existing list of script IDs for object. Modified JS property for Items, Multis, Characters and Regions, which for backwards compatibility functions similar to in older versions: .scripttrigger // If used to get property, will return last script ID in list of script IDs assigned to object. If used to set property, will clear list of script IDs and assign only the new ID Added new JS Methods for Items, Multis, Characters and Regions: .AddScriptTrigger( scriptID ) // Adds a new scriptID to list of scripts assigned to object .RemoveScriptTrigger( scriptID ) // Remove a specific scriptID from object (0 = remove all) Moved SETSCPTRIG command from code to JS (js/commands/targeting/scptrig.js), and supplemented it with some additional commands: GETSCPTRIG // List out all scriptIDs assigned to object SETSCPTRIG scriptID // Clears list of scriptIDs for object, then assigns the specified scriptID ADDSCPTRIG scriptID // Adds specified scriptID to list of scriptsIDs assigned to object REMOVESCPTRIG scriptID // Removes specified scriptID from list of scriptIDs assigned to object (0 = remove all)
2021-05-25 19:37:52 +08:00
std::vector<UI16> GetScriptTriggers( void );
void AddScriptTrigger( UI16 newValue );
bool HasScriptTrigger( UI16 newValue );
Minor JS revamp - multiple scripts per object! Added TryParseJSVal() helper function in cScript.cpp, used to parse jsval values returned from script events. Provides results matching 0 (0, false), 1 (1, true) or any specific int value returned from script. JS events updated to use new TryParseJSVal helper function (no change in behaviour): onDecay, onResurrect, onCommand, onBuyFromVendor, onSellToVendor, onPickup, onCharDoubleClick, onSkillGump, onUseBandageMacro, onCombatStart, onCombatEnd, onDeathBlow, onBuy, onSell JS events with slight change of behaviour after update to use TryParseJSVal: onDrop, onDropItemOnItem, onDropItemOnNpc - previously, a blank or non-existent return value would be treated the same as a return true. This will now be treated as a return false. Update scripts accordingly! JS events updated to support return values from scripts: onCollide, onTalk, onSnooped, OnHungerChange Return false or nothing to prevent hard code from running Return true to allow hard code to run like normal onStolenFrom, onAISliver, onLightChange, onVirtueGumpPress, onQuestGump, onSpecialMove, onSwing, onClick, onHouseCommand, onSellToVendor, onSkillCheck, onSpellGain, onSpellLoss Return false to allow hard code and other scripts with event to run like normal Return true to prevent hard code and other scripts with event from running onSteal Return false or nothing to allow hard code and other scripts with event to run like normal Return true to prevent hard code and onStolenFrom event from running (theft failed?) Return 2 to prevent hard code, but allow onStolenFrom event to run (theft succeeded, but handled in script?) onLeaving, onEntrance, onEquip, onUnequip, onEnterEvadeState, onSoldToVendor, onBoughtFromVendor, onSpellSuccess, onSpellTarget, onFlagChange, onDeath Return false or nothing to allow other scripts with event to run like normal Return true to prevent other scripts with event from running Added new JS events that run prior to items being equipped/unequipped, with support for return values: onEquipAttempt( pEquipper, iEquipping ) onUnequipAttempt( pEquipper, iUnequipping ) Return false or nothing to reject attempt to equip/unequip item, and prevent hard-code or other scripts with event from running Return true to allow hard code to run like normal Added new JS event that runs prior to onSnooped event, for character doing the snooping: onSnoopAttempt( snooped, snooper ) Return false or nothing to prevent hard code and other snooping-related events from running Return true to allow hard code and other snooping-related events to run like normal Updated onSnooped JS event to accept return values: Return true when success state is true to prevent other scripts with event from running Return true when success state is false to prevent hard code and other scripts with event from running Updated onClick JS event to also run for characters with event attached (return 1 to prevent showing hard-coded name for whatever object is clicked) Updated onSteal JS event to include a third parameter, an object reference for the target of the theft Added support for assigning multiple JS scripts per object (item, multi, char, region). Any time a scriptID is added to an object, the list of such IDs for that object will be sorted from lowest to highest scriptID, which also determines the execution order for the scripts. Note that if the same JS event is present in several scripts assigned to an object, each of those events will trigger, unless the rules about return values for said event prevent this DFNs for Items, Multis, Characters and Regions can now contain multiple SCRIPT=scriptID tags per definition. Each such SCRIPT tag will be applied to the object in question, then sorted from lowest to highest scriptID by server. Added new JS property for Items, Multis, Characters and Regions: .scriptTriggers // If used to get property, will return array object with all script IDs assigned to object. If used to set property, will add script ID to existing list of script IDs for object. Modified JS property for Items, Multis, Characters and Regions, which for backwards compatibility functions similar to in older versions: .scripttrigger // If used to get property, will return last script ID in list of script IDs assigned to object. If used to set property, will clear list of script IDs and assign only the new ID Added new JS Methods for Items, Multis, Characters and Regions: .AddScriptTrigger( scriptID ) // Adds a new scriptID to list of scripts assigned to object .RemoveScriptTrigger( scriptID ) // Remove a specific scriptID from object (0 = remove all) Moved SETSCPTRIG command from code to JS (js/commands/targeting/scptrig.js), and supplemented it with some additional commands: GETSCPTRIG // List out all scriptIDs assigned to object SETSCPTRIG scriptID // Clears list of scriptIDs for object, then assigns the specified scriptID ADDSCPTRIG scriptID // Adds specified scriptID to list of scriptsIDs assigned to object REMOVESCPTRIG scriptID // Removes specified scriptID from list of scriptIDs assigned to object (0 = remove all)
2021-05-25 19:37:52 +08:00
void RemoveScriptTrigger( UI16 newValue );
void ClearScriptTriggers( void );
2002-04-07 20:53:41 +00:00
SI16 GetStrength2( void ) const;
SI16 GetDexterity2( void ) const;
SI16 GetIntelligence2( void ) const;
2002-04-07 20:53:41 +00:00
virtual void SetStrength2( SI16 nVal );
virtual void SetDexterity2( SI16 nVal );
virtual void SetIntelligence2( SI16 nVal );
2002-04-07 20:53:41 +00:00
void IncStrength( SI16 toInc = 1 );
void IncDexterity( SI16 toInc = 1 );
void IncIntelligence( SI16 toInc = 1 );
2002-04-07 20:53:41 +00:00
Rework of passive stat regeneration Updated code calculating passive health, stamina and mana regeneration for characters, based on new UOX.INI settings and bonuses from characters/items/races Added three new Character/Item/Race DFN tags to grant bonus health/stamina/mana regeneration: HEALTHREGENBONUS=# // 10 bonus points equates to 0.01 extra hp regen per second, independent of era STAMINAREGENBONUS=# // 10 bonus points equates to 0.05 extra stamina regen per second MANAREGENBONUS=# // 10 bonus point equates to 0.1 extra mana regen per second ...also available as JS Properties: .healthRegenBonus .staminaRegenBonus .manaRegenBonus Updated get/set JS commands to allow getting/setting regen bonuses for health, stamina and mana Updated races.dfn to include default +2 health regen bonus for humans, and +2 mana regen bonus for gargoyles. Added new UOX.INI settings under [Skills and Stats] section: HEALTHREGENMODE=1 // 0 = no passive health regen, 1 = default passive health regen STAMINAREGENMODE=1 // 0 = no passive stamina regen, 1 = default passive stamina regen (LBR or below), 2 = AoS or beyond, 3 = SA and beyond MANAREGENMODE=1 // 0 = no passive mana regen, 1 = default passive mana regen (LBR or below), 2 = AoS (Pub17), 3 = AoS/SE (Pub18 and beyond), 4 = ML, 5 = KR, 6 = SA and beyond HEALTHREGENCAP=# // Max cap for Health Regeneration Bonus stat per character STAMINAREGENCAP=# // Max cap for Stamina Regeneration Bonus stat per character MANAREGENCAP=# // Max cap for Mana Regeneration Bonus stat per character Added new UOX.INI section ([default race bonuses]) with the following new settings for the 3 default playable races (only used if nothing else specified in races.dfn): HUMANHEALTHREGENBONUS=0 // default health regen bonus for human race (2 from ML expansion onwards) HUMANSTAMINAREGENBONUS=0 // default stamina regen bonus for human race HUMANMANAREGENBONUS=0 // default mana regen bonus for human race ELFHEALTHREGENBONUS=0 // default health regen bonus for elf race ELFSTAMINAREGENBONUS=0 // default stamina regen bonus for elf race ELFMANAREGENBONUS=0 // default mana regen bonus for elf race GARGOYLEHEALTHREGENBONUS=0 // default health regen bonus for gargoyle race GARGOYLESTAMINAREGENBONUS=0 // default stamina regen bonus for gargoyle race GARGOYLEMANAREGENBONUS=0 // default mana regen bonus for gargoyle race (2 from SA expansion onwards) Updated UOX3 Documentation with new feature section on Stat Regeneration with details on stat regeneration rules and recommended settings per UO era Added support for Medable armors (have no effect on meditation skill and/or passive regen of mana when worn) and Mage Armors (can turn non-medable armor into medable armor) These properties are defined per armor piece using the first and second bits of the MORE property: MORE=0x1 0x0 0x0 0x0 // Medable Armor MORE=0x0 0x1 0x0 0x0 // Mage Armor The following armor types have been marked as medable by default: leather armor, leather ninja armor, leather samurai armor, leaf armor, gargish cloth armor, gargish leather armor and all hats and masks Updated JS Method .Defense() to support optional fourth and fifth parameters - excludeMedableArmor (true/false) and includeShield (true/false) Updated CalfDef function to support including shields in the calculations, and updated mana regen code to include shields when checking for equipped armor Updated Meditation skill JS script to exclude medable armor from armor check, include shields, and apply different rules for active meditation depending on mana regen mode Updated stat window to include defensive rating of shields (based on Parrying skill) and/or elemental resistances (if enabled in ini) Added a new property to CRace class, which is automatically set and incremented as UOX3 loads in races from races.dfn: raceID Added new Getters/Setters for CRace class to retrieve ID of a specific Race object Updated JS property .id for Race JS Object to return new race ID instead of iterating through list of races to compare race object and return index Reloading DFNs now also reloads Races
2025-04-20 06:05:44 +08:00
void IncHealthRegenBonus( SI16 toInc = 1 );
void IncStaminaRegenBonus( SI16 toInc = 1 );
void IncManaRegenBonus( SI16 toInc = 1 );
2024-04-30 13:46:57 -05:00
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 );
2024-06-14 14:38:03 -05:00
void IncHitChance( SI16 toInc = 1 );
void IncDefenseChance( SI16 toInc = 1 );
2025-03-09 20:50:32 -05:00
void IncTithing( SI32 toInc = 1 );
2025-03-08 21:10:37 -06:00
2024-06-16 18:57:27 -05:00
SI16 GetHealthBonus( void ) const;
virtual void SetHealthBonus( SI16 nVal );
2024-05-13 19:01:20 -05:00
2024-06-16 18:57:27 -05:00
SI16 GetStaminaBonus( void ) const;
virtual void SetStaminaBonus( SI16 nVal );
2024-05-13 19:01:20 -05:00
2024-06-16 18:57:27 -05:00
SI16 GetManaBonus( void ) const;
virtual void SetManaBonus( SI16 nVal );
2024-05-13 19:01:20 -05:00
virtual void PostLoadProcessing( void );
virtual bool LoadRemnants( void ) = 0;
2002-04-07 20:53:41 +00:00
UI08 WorldNumber( void ) const;
void WorldNumber( UI08 value );
2002-04-07 20:53:41 +00:00
UI16 GetInstanceId( void ) const;
void SetInstanceId( UI16 value );
Instance-support and misc code cleanup Misc code and documentation cleanup: Updated and standardized function comment blocks throughout entire codebase Grouped getters and setters together in pairs and documented them as one Removed empty and/or non-useful information from comment blocks Removed unused function from cItem.cpp/h - IncID() - formerly used to change IDs for doors Added new feature - Instances Objects (characters, items, multis, spawnregions) can now make use of a 5th parameter to determine their location in the game world. In addition to the traditional X, Y, Z and WORLDNUMBER parameters, a new one has been added - INSTANCEID - that allows objects to exist at the same coordinates in the same world, but in different "dimensions". Code has been updated in multiple places to support this, and a default instanceID of 0 is assumed if nothing else is specified. Added support for new DFN tag in town regions, spawn regions and locations - INSTANCEID (defaults to 0 if not present) Added support for another start location parameter after worldNum in UOX.INI representing instanceID (defaults to 0 if not present) Updated TWEAK menu to include WorldNumber and instanceID Fixed BaseWeight option in TWEAK menu Updated CBase_Teleport - now takes an optional 5th parameter instanceID Updated SE_SpawnNPC now takes an optional 5th parameter - instanceID Updated SE_FindMulti now takes an optional 5th parameter - instanceID Updated SE_GetItem now takes an optional 5th parameter - instanceID Updated SE_FindItem now takes an optional 6th parameter - instanceID Added new JS property for Items, Characters, Regions: .instanceID Added JS property for Regions: .members - returns comma-separated list of town member serials Updated JS scripts making use of the above-mentioned JS Methods/Functions Updated dictionaries with new tweak menu entry texts Exposed SpawnRegions to JS engine, and updated JS docs with details: SpawnRegion JS Functions IterateOverSpawnRegions() GetSpawnRegion( spawnRegNum ) GetSpawnRegionCount() SpawnRegion JS Properties name regionNum itemList npcList item npc maxItems maxNpcs itemCount npcCount onlyOutside prefZ x1 y1 x2 y2 world instanceID minTime maxTime call
2020-08-08 13:57:15 +08:00
UI16 GetSubRegion( void ) const;
void SetSubRegion( UI16 value );
UI08 GetPoisoned( void ) const;
virtual void SetPoisoned( UI08 newValue );
2002-04-07 20:53:41 +00:00
SERIAL GetPoisonedBy( void ) const;
virtual void SetPoisonedBy( SERIAL newValue );
SI16 GetCarve( void ) const;
void SetCarve( SI16 newValue );
2002-04-07 20:53:41 +00:00
Small update Fixed an issue with an internal movement check that prevented characters from moving in valid map areas in Felucca/Trammel from X 6144 to X 7168 Fixed an issue where .instanceID property was misspelled in 'xgo GM command script, causing characters to be teleported to an out of bounds area where they would no longer be saved (js/commands/targeting/x.js) Added some additional error-checking to .Teleport()/.SetLocation() JS Method to prevent script-accidents from sending characters out of bounds. Updated Poisoning skill to add poison-charges to weapons being poisoned. Charges are consumed when applying poison in combat (js/skill/poisoning.js) Updated combat code to consume poison-charges if a poisoned weapon is used to poison an opponent Updated shoplists for Blacksmiths and Weaponsmiths - they now buy/sell longswords (dfndata/items/shoplist.dfn) Updated MageShopping shoplist for mage vendors - they now buy/sell mass curse scrolls (dfndata/items/shoplist.dfn) Added new Spawn Region DFN tag that can specify which era or eras of UO (Multiple comma-separated entries supported) a given spawn region is valid for. Spawn region not valid for core shard era will be ignored. Syntax: ERAS=UO,T2A,UOR,LBR,AOS,SE,ML,SA,HS,TOL Added new Spawn Region DFN tag that allows using another spawn region as a "parent". All properties of this parent will be inherited except for these, which are ignored: ERAS, NPCLIST, ITEMLIST, NPC and ITEM. Syntax for new tag: GET=# // Inherit a specified spawn region Added spawn region for animal trainer vendor in Vesper stable Added spawn region for fur trader/tanner vendors in The Best Hides of Britain Added spawn region for spinner vendor in The Lord's Clothier's and The Right Fit shops in Britain Added spawn region for tanner NPC to Nujel'm Tannery (and fixed leatherworker spawn region for same area) Added spawn regions for banker NPCs in East Bank of Britain, First Bank of Moonglow, Jhelom Bank and Jeweler, Bank of Skara Brae Added spawn regions for stables, tailor and blacksmith inside Castle British Added spawn regions for mage shops, mage guilds and farm houses in Moonglow Added spawn regions for misc vendors and townfolk in multiple cities Added spawn regions for Fire Island Updated spawn regions for Dagger Isle/Ice Island Added spawn regions for forests and jungles in southern Britannia and on various islands including Bucc's Den, Moonglow, Serpent's Hold, and misc unpopulated islands Added spawn regions for area east of Skara Brae, around Hedge Maze and south of Britain Added spawn regions for wandering healers outside every dungeon entrance in Britannia and Lost Lands Re-integrated ocean spawn regions for ocean creatures (dolphin, walrus, water elemental, sea serpent) from the original community-based spawn file Added reagent spawns in overworld spawn regions in Britannia/Lost Lands Added special reagent spawns in swamp areas Added additional overworld spawn regions in Britannia/Lost Lands Added spawn regions for Khaldun dungeon that spawn some new and some old NPCs: Old: Zombies, skeletons, skeletal mages, skeletal knights, ancient liches New: Cursed (and named) NPCs, shadowfiends, zealots of khaldun (knights/summoners), tentacles of the harrower Updated size and positions of some existing overworld spawn regions Fixed incorrect spawn region size for small island south of Trinsic Added switch/door puzzle functionality in Khaldun dungeon using new switch/door combo script (js/item/dungeons/switch_door_combo.js) Added "smart objects" in Khaldun dungeon that activate when you come close enough (js/item/dungeons/smart_activate_item.js) Added teleport locations within Khaldun dungeon (js/teleport.scp) Added custom AIs to existing NPC spawning in Khaldun dungeon: Ancient Lich (summons other undead, and can turn into one of them for disguise) Added DFN entries for new NPCs spawning in Khaldun dungeon, some with custom AIs: [tentacles_of_the_harrower] -> Tentacles of the Harrower (life steal) [shadowfiend] -> Shadowfiends (seek out and reveal hidden players) [zealot_knight]/[zealot_summoner] -> Zealots of Khaldun (turn into undead on death, male/female variants) [cursed] -> Cursed (male/female variants) [spectralarmor] -> Spectral Armor Added DFN entries for new (named) NPCs spawning in Khaldun dungeon: [lysander_gathenwale] -> Lysander Gathenwale [grimmoch_drummel] -> Grimmoch Drummel [morg_bergen] -> Morg Bergen [tavara_sewel] -> Tavara Sewel Added new NPC DFN entries: [leatherworker] -> alias for male/female leatherworker vendors [mapmaker] -> alias for male/female mapmaker vendors Added new Race DFN entries: [RACE 29] -> Cursed (enemies of RACE 30) [RACE 30] -> Zealots (enemies of RACE 29) Added new book DFN entries for Khaldun journals of Lysander, Tavara and Grimmoch - available as loot from the respective NPCs (dfndata/misc/books.dfn and dfndata/items/misc/books.dfn) Added 25% chance for hit-animations and hit-SFX to play for targets in combat, instead of playing every time - can get very spammy Monsters with actual weapons equipped (like Ophidian Enforcer with Halberd/Bardiche) will now get appropriate combat SFX for hitting with that weapon Updated Healing skill to base cure/resurrection skill requirements on the calculated skill, rather than base skill (js/skill/healing.js) Fixed an issue where healing with bandages and dying in the process would not properly reset the healing-related tags and skills used Updated healing script to show a resurrection confirmation menu for players targeted with bandages for resurrect (js/skill/healing.js) All skill usage states now reset on death, to prevent cases of players being "busy" while trying to use skills that got stuck due to script bugs. The 'regspawn GM command now supports a new parameter called "max". Updated command syntax: 'regspawn # // perform a single respawn cycle in a specific spawn region 'regspawn all // perform a single respawn cycle across all spawn regions 'regspawn max // respawn ALL spawn regions to MAX capacity in one go Added new UOX.INI setting that determines the maximum range at which NPCs can initiate attacks on players/NPCs (the old MAXRANGE=10 setting now instead defines max range at which players can initiate attacks on players/NPCs): MAXNPCAGGRORANGE=10 Optimized performance by significantly reducing the number of line-of-sight checks performed by characters, especially in combat scenarios, or when evaluating potential targets for NPC AIs. The amount of checks done is also affected by the new ini setting for max aggro range. Fixed an issue where both NPC and player characters would instantly drop one hunger level (from 6 to 5) upon creation since hungerrate was not initialized until after first hunger-event Updated character priv property from UI16 to UI32, and added a new flag that determines if fame/karma title is hidden for character: HIDEFAMEKARMATITLE (0x10000) NPCs will no longer aggro other NPCs if the Z difference between them is greater or equal to 20 (i.e. they're on different floors), unless both are using ranged weapons and both are in range Fixed an issue where players could get discounts from shopkeepers even though neither player nor shopkeeper were members of a NPC guild (js/npc/ai/shopkeeper.js) Fixed an issue where the "premium" a player would get when selling items to a shopkeeper in the same NPC guild as them would be 110% extra on top of the item's value, instead of the intended 10% (js/npc/ai/shopkeeper.js) (Thanks, cobrag0318!) Added missing tall straw hat to tailoring crafting scripts (Thanks, Dragon Slayer!) Improved error reporting during compilation of individual scripts being reloaded - will now show more context and line number onCombatEnd JS Event now also triggers when NPCs ignore their target and/or evade during combat Updated 'decorate command to support saving/loading custom tags on items for world templates. These are stored after a @ symbol in the world template, each custom tag separated by a | symbol, and with each custom tag saved using this syntax: key$type$value Updated resource-harvesting scripts to use script-specific global (const) variables, to avoid interference between different scripts (js/server/resource/*) Added new resource-harvesting scripts and added spawn regions for these in fields on farms all over Britannia/Lost Lands cabbages (js/server/resource/cabbages.js) canteloupes (js/server/resource/canteloupes.js) carrots (js/server/resource/carrots.js) garlic (js/server/resource/garlic.js) gourds (js/server/resource/gourds.js) honeydew melons (js/server/resource/honeydewmelon.js) onions (js/server/resource/onions.js) pumpkins (js/server/resource/pumpkins.js) squashes (js/server/resource/squashes.js) turnips (js/server/resource/turnips.js) watermelons (js/server/resource/watermelon.js) Updated CSpawnRegion::FindItemSpotToSpawn() function in cSpawnRegion.cpp to prevent duplicate spawning of exact same item in exact same location Updated sectionid of all potion and scroll aliases to match main item, so they'll get correctly picked up by NPC shopkeepers (dfndata/items/magic/potions.dfn and scrolls.dfn) Specified sectionid for backpacks, so it also gets applied to packs added using the alias [backpack] (dfndata/items/misc/provisions.dfn) Fixed a code issue that prevented players from selling empty containers to NPC shopkeepers willing to buy such containers Fixed an issue where field-spells (wall of stone, poison field, etc) would ignore dynamic/static items that should block these Fixed an issue where field-spells could be cast into houses from the outside by standing next to a wall and targeting self Fixed a War/Peace-mode desync between client and server by having server always notify client (using war-toggle packet) when the "at war" flag is toggled for player character Fixed an issue with hiding skill that wouldn't allow player to hide after having acquired self as target in combat (through spellcasting, for instance) (Thanks, Dragon Slayer!) Fixed an issue where mana/reagents were consumed and skillcheck performed before all spellcast-validations had succeeded, resulting in the occasional loss of reagents/mana when spellcasting was disallowed (code and js/magic/clumsy.js and level1targ.js) Fixed an issue with lack of criminal-flagging for casting of hostile spells scripted in JS (clumsy, magic arrow, feeblemind) vs blue targets (js/magic/clumsy.js and level1targ.js) Fixed some issues with Line-of-Sight checking code that returned incorrect results, which amongst other things affected spellcasting in areas with uneven terrain Fixed some issues with movement code and climbing of ladders, in particular the rope ladder in the 2-story log cabin. Code now sets a "is climbing" flag when character steps onto a rope ladder, and uses that to help resolve some edge cases, and then unsets it when they step off. Renamed section headers of some map-items in DFNs from "locationname" to "locationnamemap" for clarity (example: "britain" to "britainmap") Fixed broken "map wrapping" when sailing to edges of map in Felucca or Trammel Fixed a server crash related to attempts at reading data from invalid map tiles
2025-06-27 08:40:02 +08:00
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 );
Boat fixes, spawn region fixes, travel spell options, exception fix Fixed an issue with CChar::RemoveAllObjectsFromSight(), which failed to remove nearby multis from sight, leading to ghost images when changing worlds/instances Added check for other multis when sailing - boats will now collide with other boats! Added check for dynamic items when sailing - boats will now collide with blocking objects Added "wrapping" support for maps 0 and 1 when sailing, meaning a ship can sail around the world in both N/S and E/W directions. Added new [magic] section in uox.ini with the following settings: TRAVELSPELLSFROMBOATKEYS=1 // Toggle being able to travel via Recall and Gate spells directly to a boat via its key TRAVELSPELLSWHILEOVERWEIGHT=0 // Toggle being able to travel via Recall and Gate spells when overweight MARKRUNESINMULTIS=1 // Toggle being able to mark runes while inside multis. If enabled, runes marked inside multis will be associated with the multi in question, rather than a specific set of coordinates. If multi no longer exists, travelling to it via Recall or Gate will be impossible TRAVELSPELLSBETWEENWORLD=0 // Toggle being able to travel via Recall and Gate spells from one facet to another TRAVELSPELLSWHILEAGGRESSOR=0 // Toggle being able to travel via Recall and Gate spells when marked as an aggressor (if attacked an innocent first, or if criminal) Fixed an exception that would only rear its head when running UOX3 in debug mode, by adding new function void CBaseObject::RemoveFromRefreshQueue(), which when called from the end of the Cleanup() process for an object will ensure it's removed from the refreshQueue (thanks giwo!) Fixed several issues with the regional spawning system: NPCs would quite often get created, only to be deleted shortly after because the system failed to find a valid spawn location. This part of the system has now been rewritten to look for a valid spawn location before actually spawning the NPC, to avoid unnecessary creation/deletion of characters Spawn system would not continue looking for a valid spawn location past the first failure (when it was supposed to make 100 attempts before giving up) Spawn system would not look for valid water tiles for ocean-based/amphibian creatures if valid land tiles could not be found. As a result, amphibian creatures that could have spawned on either land or water would only ever spawn on land. DoesMapBlock() function checked for TF_BLOCKING tile flag before it checked if waterwalking was allowed and if tile had TF_WET flag. As a result, no purely ocean-based creatures would spawn at all because no valid spawn locations could ever be found
2021-06-23 08:52:03 +08:00
void RemoveFromRefreshQueue( void );
2002-04-07 20:53:41 +00:00
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;
UOX3 0.99.5b Fixed an issue where karma titles would inadvertently have the space behind the title trimmed before being displayed in paperdoll, resulting in erroneous display of title + name there Fixed an issue with a cooking script (js/skill/cooking/cooking.js) where sweet dough would not get consumed properly on cooking (Dragon Slayer) Updated C++ function calcRegionFromXY to work with CBaseObject instead of CChar, so it also works for Items Items now have current town region stored as an object property during runtime. This is calculated on load, when container property is updated, and when an item is picked up or dropped. The region is also accessible via the (read-only) JS Item property .region Added new JS Event to allow capturing button presses from the old-school gump displayed by client via packet 0x76, which was originally used by the old-school crafting menus in T2A. The requirement for this to work is that the gump in question must have a gumpID between 0x4000 and 0xffff (which can be set when manually creating a packet with this ID via JS), and the Event itself must be in the global script: onScrollingGumpPress( pSock, gumpID, buttonID ) Added new JS Event to allow better control over which names UOX3 sends to the client for characters: onNameRequest( myObj, requestedBy ) // return custom string, or return empty string/nothing/true/false to use default name Updated JS Events to also work for Items (previously only worked for Characters) onLightChange( myObj, lightLevel ) onTempChange( myObj, temp ) onWeatherChange( myObj, weatherType ) Adjusted default temperature for town regions with no weather systems defined from 0 to 20 degrees Celsius Updated some JS scripts (fishing.js, baking.js and cooking.js) to make use of GetTempTag/SetTempTag rather than GetTag/SetTag Added cancel-checks to targeting functions in command script for add-commands (js/commands/targeting/add.js) Updated get command script (js/commands/targeting/get.js) to allow retrieving region ID and name using 'get region Updated misc command script (js/commands/custom/misc-cmd.js) to add 'gettemptag and 'settemptag commands, used to retrieve/set temporary custom tags from/on objects Fixed a bug where Spirit Speak skill would be checked for race languages even if the race had LANGUAGEMIN defined as 0 (or not defined at all) Fixed an issue where players using regular UO client would get stuck in a black void after teleporting between worlds, by adding an additional character refresh after the teleport Fixed an issue where crafting tools for Blacksmithing and Carpentry would attempt to fetch the value of an incorrectly named INI setting to handle durability loss for the tools Added new setting under [settings] section of UOX.INI to control whether it should be possible to craft weapons from coloured ingots or not: CRAFTCOLOUREDWEAPONS=0/1 // If enabled(1), players can craft coloured weapons. Defaults to disabled(0) Fixed an issue where the correct ingots were not consumed when attempting to craft items using colored ingots Fixed a rogue debug message leftover in the scissor script
2022-02-13 22:49:37 +08:00
bool NameRequestActive( void ) const;
2002-04-07 20:53:41 +00:00
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 );
First iteration of support for damageable items/multis Removed RemoveFromSight() from CItem::Update() in cItem.cpp, to address flickering issues with animated items, and for smoother updates of items on boats when sailing. Added new flag in CBaseObject - damageable - which determines if an Item or Multi should be considered a damageable object. Added new DFN tag for Items and Multis to mark objects as damageable objects DAMAGEABLE=0/1 // If enabled, allows client to display healthbar for object, using object's hp/maxhp values as basis. Note that any changes to a damageable object's health will not be reflected in the client until a stat update has been sent. Added new JS Property for Items and Multis and Characters to get/set an object's damageable flag .isDamageable // 1 or 0 Added new JS Method for Items, Multis and Characters to force an update of the object's health bar to nearby players: .UpdateStats( statType ) // statType can be 0 (Health, only one that works for items), 1 (Mana) or 2 (Stamina) Updated DFN entries for training dummies (dfndata/items/houseaddons/house_addons.dfn) to include DAMAGEABLE=1 and HP=100 tags, and also updated script for training dummies (js/item/trainingdummy.js) with some extra features for dummies marked as damageable: Show damage numbers over the training dummy when hit Update health of training dummy based on damage received when hit Restore health of training dummy to max after 4 seconds of inactivity Updated 'fullstats and 'heal commands (js/commands/targeting/stats.js) to support restoring the health of a damageable object Updated 'get (js/commands/targeting/get.js) and 'set (js/commands/targeting/set.js) commands to support getting and setting the damageable flag on objects Updated updateStats() in uox3.cpp to work with CBaseObject instead of CChar Updated statwindow() in CSocket.cpp to work with CBaseObject instead of CChar Updated CPUpdateStat in CPacketSend.cpp to work with CBaseObject instead of CChar, to support sending packet 0xA1 to client for Items/Multis Updated CPStatWindow in CPacketSend.cpp to work with CBaseObject instead of CChar, to support sending packet 0x11 to client for Items/Multis Fixed an issue with outgoing packet 0x11 where a character's current HP might sometimes incorrectly be displayed as zero Updated CPNewObjectInfo in CPacketSend.cpp to send object information packet 0xF3 to client with datatype set to 0x03 for Items/Multis marked as damageable objects, to enable the client's ability to display health-bars for these items. Fixed an issue with JS Method for Items - .Refresh() - which previously did nothing, but now instead sends an update of item to all sockets in range
2021-06-03 06:14:56 +08:00
void SetDamageable( bool newValue );
UOX3 0.99.5b Fixed an issue where karma titles would inadvertently have the space behind the title trimmed before being displayed in paperdoll, resulting in erroneous display of title + name there Fixed an issue with a cooking script (js/skill/cooking/cooking.js) where sweet dough would not get consumed properly on cooking (Dragon Slayer) Updated C++ function calcRegionFromXY to work with CBaseObject instead of CChar, so it also works for Items Items now have current town region stored as an object property during runtime. This is calculated on load, when container property is updated, and when an item is picked up or dropped. The region is also accessible via the (read-only) JS Item property .region Added new JS Event to allow capturing button presses from the old-school gump displayed by client via packet 0x76, which was originally used by the old-school crafting menus in T2A. The requirement for this to work is that the gump in question must have a gumpID between 0x4000 and 0xffff (which can be set when manually creating a packet with this ID via JS), and the Event itself must be in the global script: onScrollingGumpPress( pSock, gumpID, buttonID ) Added new JS Event to allow better control over which names UOX3 sends to the client for characters: onNameRequest( myObj, requestedBy ) // return custom string, or return empty string/nothing/true/false to use default name Updated JS Events to also work for Items (previously only worked for Characters) onLightChange( myObj, lightLevel ) onTempChange( myObj, temp ) onWeatherChange( myObj, weatherType ) Adjusted default temperature for town regions with no weather systems defined from 0 to 20 degrees Celsius Updated some JS scripts (fishing.js, baking.js and cooking.js) to make use of GetTempTag/SetTempTag rather than GetTag/SetTag Added cancel-checks to targeting functions in command script for add-commands (js/commands/targeting/add.js) Updated get command script (js/commands/targeting/get.js) to allow retrieving region ID and name using 'get region Updated misc command script (js/commands/custom/misc-cmd.js) to add 'gettemptag and 'settemptag commands, used to retrieve/set temporary custom tags from/on objects Fixed a bug where Spirit Speak skill would be checked for race languages even if the race had LANGUAGEMIN defined as 0 (or not defined at all) Fixed an issue where players using regular UO client would get stuck in a black void after teleporting between worlds, by adding an additional character refresh after the teleport Fixed an issue where crafting tools for Blacksmithing and Carpentry would attempt to fetch the value of an incorrectly named INI setting to handle durability loss for the tools Added new setting under [settings] section of UOX.INI to control whether it should be possible to craft weapons from coloured ingots or not: CRAFTCOLOUREDWEAPONS=0/1 // If enabled(1), players can craft coloured weapons. Defaults to disabled(0) Fixed an issue where the correct ingots were not consumed when attempting to craft items using colored ingots Fixed a rogue debug message leftover in the scissor script
2022-02-13 22:49:37 +08:00
void NameRequestActive( bool newValue );
2002-04-07 20:53:41 +00:00
SI16 GetFame( void ) const;
void SetFame( SI16 value );
void SetKarma( SI16 value );
SI16 GetKarma( void ) const;
void SetKills( SI16 value );
SI16 GetKills( void ) const;
2002-04-07 20:53:41 +00:00
};
#endif