Fixed an issue where characters in different world instances could shove each-other when moving
Fixed server crash related to using incorrect argument for REGSPAWN command
Fixed an issue where characters would not get world changes updated properly in some older (5.x) client versions
UOX3 will now attempt to resist being closed if a world-save is in progress, to avoid corruption of worldfile data
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)
Reorganized teleport.scp file with logical groupings by map and area for easier maintenance
All teleport locations in teleport.scp without a source/target world specified will now work for both Felucca and Trammel facets
Deleted ustring.cpp/ustring.h from repository and removed last few straggling references to these Teleport locations from teleport.scp are now sorted upon initial load, and no longer require being sorted in the file itself (punt)
Modified handling of CONT and PACKITEM tags loaded from worldfiles to no longer corrupt pointers (punt)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
Additional work done to modernize string handling in CPacketReceive.cpp, CPacketReceive.h, CPacketSend.cpp, CPacketSend.h, cScript.cpp, gumps.cpp (punt)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
Exposed a (read-only) JS property for characters to fetch their hunger rate. Uses race's hunger rate if defined, otherwise uses HUNGERRATE form uox.ini:
.hungerRate // Seconds between becoming hungrier
Updated 'get command to allow retrieving a character's hungerRate property
Added some details to console during UOX3 startup about which IPs and Ports UOX3 is listening to
Added new JS event that triggers when a player clicks on the Quest button in the paperdoll. Triggers from character script if present, or global script if not:
onQuestGump( pUser )
Added new JS event that triggers when player toggles a special move from a combat book. See packet 0xBF, subCmd 0x19 in packet guides for details on the special moves, whose IDs range from 0x00 to 0x1D:
onSpecialMove( pUser, abilityID )
Fixed invalid ID for items [0x0174] and [0x0175] in dfndata/items/building/walls/stone_walls.dfn
Updated FileSize() function in regions.cpp to fetch file size using std::filesystem::file_size() instead of creating an input stream, opening a file and then trying to seek the last position in the file
Added findNearbyObjects() function to findfuncs.cpp, to find all objects (characters and items) of CBaseObject class near a specified location
Improved performance when initializing multis on startup; now checks for items near multis, instead of checking for multis near every single item!
Improved performance when loading items and characters from worldfiles during startup; around 33% faster for release builds, around ~50% faster when running in debug mode through visual studio (punt)
Updated createSection() in ssection.cpp to use std::string and StringUtility functions instead of UString, and added some error handling (punt)
Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
Added new helper function to get amount of minutes that have passed since midnight 01/01/1970 UTC - GetMinutesSinceEpoch()
Converted wTimeBan property of CAccountBlock from UI16 to UI32
Added check during login for timeban account property. If a timeban is in place, player will be unable to login until after the ban is over.
Added JS property for Account JS Object:
.timeban // Time in minutes that user is banned
Updated .get command to allow retrieving timeban value from account of player characters
Updated .set command to allow setting timeban value on account of player characters. If set to higher than 0, player will also be marked as banned, and disconnected
Added two new commands in js/commands/targeting/disconnect.js:
'ban [durationInMinutes] // Ban targeted player for specified duration in minutes, or for a default 24 hours if no duration is specified
'unban // Unban targeted player
Updated 'tweak command (js/commands/targeting/tweak.js) to support viewing and modifying .timeban account property
Updated dictionary files with additional messages used in relation to banning/unbanning players
Option to define how much memory JS engine should be allowed to allocate before last-ditch GC kicks in has been moved from engine.dat to a new UOX.INI setting under [server]. Note that too low values can lead to server instability, especially if doing a lot of JS engine reloads, so default value has been increased from 16 to 256 MB per JS Runtime:
JSENGINESIZE=256 // gcMaxBytes limit in MB per JS Runtime. Must be between 16 and 4095
Reduced stackchunksize value provided for JS_NewContext from 0x500000 to the recommended default of 8192
Updated how players are paid for completing NPC escort quests; instead of hard-coded random amount between 0-600 gold, the reward is now based partly on the NPC escort's fame, and partly on the amount of gold the NPC is carrying. The formula for quest rewards thus look like this: rewardAmount = (( totalFame / 100 ) * 50 ) + ( totalGold * 0.25 )
Fixed healthbars of nearby characters not showing correctly for players who have just logged in. Cause seems to have been UOX3 reading more bytes from network buffer than required when (not) handling packets 0xB5 and 0xFB. Added basic handling of these packets to avoid that problem.
Fixed an issue where UOX3 would send full status updates (packet 0x11) for each character on the screen, rather than just sending the minimum required for each character. Client doesn't need to know the weight of an NPC, or how much gold an opponent player is carrying!
Fixed an issue with tooltips for characters and/or items not always appearing, caused by UOX3 not responding correctly to certain tooltip requests (packet 0xD6)
Added support for packet 0xE2 (New Character Animation, used to play animations in client v7.0.0.0+) via cEffects::PlayNewCharacterAnimation( CChar *mChar, UI16 actionID, UI16 subActionID, UI08 subSubActionID )
Added support for new animation packet in JS Character method DoAction() using a second parameter that specifies animation variation, which if present forces server to send new animation packet instead of old. This means the 'action/npcaction commands can now be used to play animations on gargoyles/humans in client v7.0.0.0+ using the following syntax: 'action [action subAction]
Created new enums for character actions and sub-actions, and updated code to refer to these instead of using "magic" numbers
Added new options in UOX.INI under [settings] section:
FORCENEWANIMATIONPACKET=0/1 // If enabled (default), forces the use of the new animation packet for playing various character animations for both NPCs in general and for player characters connected with client v7.0.0.0+
Updated various actions performed by players and NPCs to use new animation packet (combat, spellcasting, mining) if connected with client v7.0.0.0+ and ini setting to force new animation packet is enabled
Added basic support for gargoyle flying ability. Can now use flying ability itself to enter/exit flying state, and the state change will also get sent to nearby players. Flying players are treated the same way as mounted players; polymorph spells will auto-dismounts mounted/flying player, same rules for stealth applies to flying as riding, etc.
Exposed Character property to JS engine:
.isFlying // returns true if character is flying
Moved Orc and Ratman races from RACE 1 and 2 to RACE 22 and 23 in dfndata/race/races.dfn to make room for two new player races, that are applied to new player characters during character creation:
[RACE 1] - Elf
[RACE 2] - Gargoyle
Updated orcs and ratmen in dfndata/npc/humanoids.dfn with race IDs 22 and 23 respectively
Added items in dfndata/items/skills/tools/cooking.dfn to item menu under Skills > Tools > Cooking
Fixed an issue where moving items around within a container at max item capacity was not allowed
The GM command 'set can now modify a character's current mana using 'set mana #
Added JS command to get specific object property values (using same property names as 'set command):
'get [objectProperty]
Exposed Item/Character properties to JS:
.oldX // Previous X coordinate for object
.oldY // Previous Y coordinate for object
.oldZ // Previous Z coordinate for object
Exposed Character properties to JS:
.mana // Character's current amount of mana
Updated version of Winsock requested by UOX3 from 2.0 to 2.2
Exposed timer for updating NPC flags to [timers] section of UOX.INI:
NPCFLAGUPDATETIMER=5 // Interval in seconds between each time NPC flags are updated. Default adjusted down from 30 to 5 seconds
Fixed an issue where UOX3 was trying to output some debug/warning messages to console using the wrong console method
Made some small tweaks to NPC pathfinding to make NPCs more likely to pick a new target location when their old one is blocked
Added HP DFN tag to guard NPCs to prevent them from spawning with half health
Removed -lstdc++fs from Makefile and replaced with special instructions for users of gcc below v9.x
Fixed a buffer overrun issue with tiledata item names
Eliminated a bunch of compilation warnings in VS2017
Updated JS Method CreateDFNItem to allow creating items without referencing a socket/character. Syntax:
var myItem = CreateDFNItem( null, null, itemSectionID, amount, "ITEM", false, worldNumber, instanceID );
Added functional chessboard that operates on standard chess rules. Pieces cannot be removed from the board, snap to the chessboard grid when dropped, are subject to movement restrictions per chesspiece, will capture opponent pieces if landing on their square. Board can be reset by dragging king-piece off to the side of the board (js/item/gameboards.js and js/item/chesspiece.js)
Added functional checkerboard, with pieces that cannot be removed, can only move in diagonals, can jump across opponent pieces to capture them. Board can be reset by ??? (js/item/gameboards.js and js/item/checkerpiece.js)
Using the 'go command without any additional parameters will now open the GM travel menu (js/commands/go.js)
Added new option in UOX.INI under [settings] section:
MAPDIFFSENABLED=0/1 // If enabled, server will attempt to load diff files, and send "Enable Map-diff files" packet to client to also load these. Disabled by default.
Server no longer loads map/statics diff files by default, nor does it send packet to client to request loading these files, as only client versions below 7.0.8.2 will actively load these files. Can be re-enabled with new UOX.INI setting mentioned above!
Fixed incorrect ID for gargish dagger in CHandleCombat::getWeaponType()
Added missing weapon entries in CHandleCombat::getWeaponType(): bladed whip, barbed whip, spiked whip, gargish talwar
Fixed an issue that would show the end part of some tiledata names as garbled text instead of cutting off the text(!) at 20 characters
Fixed an issue with advanced character creation template when using ClassicUO client, which sends a profession value of 255 instead of 0 when no profession template has been selected.
Fixed an issue where clones of NPCs that can split in combat didn't get the NPC flag correctly set
Guild titles are now removed for players who leave their guilds
Enabled closing some hard-coded gump menus using right-click (howto, guild, towns, wholist, addmenu, craftmenu, info)
Fixed an issue where adding base items using 'add [itemID] would sometimes get false positive hits from harditems.dfn, depending on the length of the itemID
Fixed an issue where items added using 'add [itemID] would not get names applied properly from harditems.dfn
Item/NPC DFN tag GET can now inherit a random parent by adding additional values separated by spaces. Syntax:
GET=parent1 parent2 parent3 (etc)
Fixed an issue where NPC backpacks would not have the max item capacity set properly
Added new properties for CItem objects (also exposed as JS Item Properties):
maxRange // max distance a ranged weapon can fire at (replaces ARCHERRANGE ini setting)
baseRange // base distance throwing weapons (when implemented) can be used at
Added support for new Item DFN tag that replaces global UOX.INI setting ARCHERRANGE:
MAXRANGE=# // Specifies max range of ranged weapon
Added support for new Item/NPC DFN tags to support randomizing elemental resistances:
RESISTFIRE=#/# # // Set NPC's poison resistance; fixed or random value
RESISTCOLD=#/# # // Set NPC's poison resistance; fixed or random value
RESISTLIGHTNING=#/# # // Set NPC's poison resistance; fixed or random value
RESISTPOISON=#/# # // Set NPC's poison resistance; fixed or random value
Added support for two new DFN tags in dfndata/race/races.dfn that can be used to allow/ban lists of equipment for specific races
ALLOWEQUIPLIST=#
BANEQUIPLIST=#
Added support for new section in dfndata/race/races.dfn - [EQUIPLIST #], which can be used to define lists of equipment that is whitelisted or banned for specific races.
Fixed a bug that would report incorrect weight in tooltips for Item/NPC spawner objects
ScriptSections are now reapplied for items bought by players from NPC vendors
Fixed an issue where players could drop an item on the ground and other players would still see the item after it was picked up, because of a failed distance check vs old location coordinates (in pack) instead of vs current location on ground
Fixed a bug with players being able to use last-target macro to target objects picked up and held by other players on their cursor
Updated all references to "devinelock" to be "divinelock" instead - this includes the name of the JS Item property
Fixed house commands triggering (useless) targeting cursors for players onboard boats
Changed default statcap in UOX.INI from 325 to 225
Fixed a out-of-range error for players attempting to combine ore inside their own backpack
Fixed various issues with distance checks and container checks when using/target objects
Added optional 4th "hue" parameter to AddGump JS method
Added JS Function to get total amount of accounts on server - GetAccountCount()
Added JS Function to get total amount of players online - GetPlayerCount()
onSwing JS Event can now trigger in scripts attached to items, not just items attached to characters
Added some JS Functions to expose some hard-coded constants to JS scripts:
BASEITEMSERIAL() // Base item serial
INVALIDSERIAL() // Invalid serial
INVALIDID() // Invalid ID
INVALIDCOLOUR() // Invalid colour
Fixed an issue where JS character property .colour would modify origSkin property instead of colour
Fixed an issue where JS character property .guildTitle returned the name of the character instead of the guild title
Character JS property .poison can now also be used to set a character's poisoned level, not just read it
Exposed Item property to JS engine:
.ac // armour class for item (0-128). Primarily used for setting race-restrictions for equippable items, i.e. race X cannot equip items of armour class Y.
.def // defensive value of item (Physical resistance post-AoS, AR in older UO)
// NOTE: The following properties don't actually do anything yet, but can still be used in custom JS scripts if desired
.resistCold // Cold resistance of item 0-1000, where 1000 equals 100.0%
.resistHeat // Heat/Fire resistance of item 0-1000, where 1000 equals 100.0%
.resistLight // Light resistance of item 0-1000, where 1000 equals 100.0%
.resistLightning // Energy/Lightning resistance of item 0-1000, where 1000 equals 100.0%
.resistPoison // Poison resistance of item 0-1000, where 1000 equals 100.0%
.resistRain // Rain resistance of item 0-1000, where 1000 equals 100.0%
.resistSnow // Snow resistance of item 0-1000, where 1000 equals 100.0%
.damageHeat // Weapon deals Heat/Fire elemental damage (true/false)
.damageCold // Weapon deals Cold elemental damage (true/false)
.damageLight // Weapon deals Light elemental damage (true/false)
.damageLightning // Weapon deals Lightning elemental damage (true/false)
.damagePoison // Weapon deals Poison elemental damage (true/false)
.damageRain // Weapon deals Rain/Water elemental damage (true/false)
.damageSnow // Weapon deals Snow/Ice elemental damage (true/false)
Added new UOX.INI setting under [server] to enable/disable shard response to ConnectUO server polling (disabled by default)
Sub-commands are no longer included when registering packets to be overloaded via RegisterPacket function, as that part was never fully implemented. Packet-hook scripts can be setup for specific packet IDs, but any sub-command checking will need to be done in the script itself
JS Packet Method GetDWord() now uses JS_NewNumberValue instead of INT_TO_JSVAL to read from the socket buffer, to better handle large numbers, which could previously be returned with wrong values.
JS Function CalcItemFromSer() now uses a JS_GetStringBytes() and str_value() combo instead of JSVAL_TO_INT() to read the data provided in the function argument. This allows JS scripts to provide item serials to the function directly without needing to split it into four parts first (though that still works)
Fixed issue where JS properties for multis didn't always return correct values
The 'set command can now be used to set the armour class of items ('set ac #)
Reimplemented 'tweak command in JS engine (js/commands/targeting/tweak.js) - can be used to view and modify properties of characters, character skills, items, multis and regions (target ground)
Added placeholder packet-hook script (js/server/network/0xf1_connectUoServerPoll.js) to handle responses to ConnectUO server polling. By default this script does nothing, but serves as a placeholder for drop-in replacement scripts generated specifically for each shard by the ConnectUO service.
Updated some commands to support an alternate STATIC keyword (can also be ommitted) to add base items:
'add static itemID
'tile static itemID
Updated some commands with support for randomization. Provided itemID will be randomized based on provided rndValue:
/js/commands/targeting/add.js:
'add itemID rndValue
cmdtable.cpp and targeting.cpp:
'tile itemID rndValue
'tile itemID x1 x2 y1 y2 z rndValue
Updated js/commands/custom/repeatingcmds.js to support 'm delete as an alias for 'rremove
Added 'props as an alias for the 'tweak command
Added 'teleport as an alias for the 'tele command (js/commands/targeting/tele.js)
Added 'shavehair and 'shavebeard as aliases for 'kill hair and 'kill beard (js/commands/targeting/kill.js)
Added 'noinvul and 'mortal aliases for the 'invul false command (js/commands/custom/misc-cmds.js)
Added 'immortal and 'invul (without parameter) as aliases for the 'invul true command
Added 'bringtopack as an alias of 'movetobag command (js/commands/targeting/movetobag.js)
Updated check for cancelling of target cursor in various JS scripts
Minor updates to various JS scripts
Fixed issue where some item definitions in dfndata/harditems/harditems.dfn and dfndata/items/building/lighting.dfn used comma instead of space as delimiter for the VALUE tag, which thus never got applied
Updated all NPC definitions to let NPCs spawn facing in random directions
Fixed an issue with the 'tweak command that would set an item's movable property instead of type if used on non-spawnerobjects
Fixed an issue with the 'tweak command that would trigger the wrong gump dialog when attempting to set an item's name, name2 and creator properties
Fixed an issue with the 'tweak command where clicking ok in gump dialog with no value entered would reset chosen property to default value
Fixed an issue with tradetimestamp for houses
Fixed an issue with 'teleport and 'telestuff commands that could cause character to end up outside of map when using ClassicUO client
Updated JS command set to support setting language for player characters directly instead of getting it from UO client - though it will still attempt to do this if selected language is ZERO. Useful for testing multiple languages, and also opens up for possibility of letting players/GMs choose a language manually!
Updated a bunch of .js files to use the proper .language socket property instead of the erroneous .Language!
Updated warning messages printed in UOX3 when attempting to inherit an invalid/non-existent item or character script entry using the GET tag, to also include the name of the script entry being inherited
Added new tag for ore types in skills.dfn that determines default chance of finding a particular ore (can be overridden via OREPREFS tag in regions.dfn):
ORECHANCE - takes a value from 0 to 1000, where 1000 equals 100.0%
Added default ORECHANCE values for each ore type in skills.dfn, based on estimated chance of finding these ore types around the era of Publish 15/16 in Official UO
OREPREFS tag in regions.dfn now uses [sectionName] of ore type from skills.dfn instead of actual name of the ore
OREPREFS tag in regions.dfn now uses comma as separator instead of space. New syntax: OREPREFS=[oreType,oreChance]
Added chance of getting different ore sizes when mining
Added functionality to combine and transform larger ores into smaller ores by double-clicking some ore and targeting other ore instead of a forge
Added functionality to return different amount of ingots when smelting ore, based on the size of ore being melted
Fixed a bug introduced in 0.99.3 that would set invalid values for certain properties on newly created items and NPCs if the tag for that property in the DFNs accepted random values, but only supplied one value. Example: Amount=1, vs Amount=10 20. As part of the fix for this, added sanity checking for all item and character DFN tags that accept two values.
Fixed weapon damage not appearing in status gump
Fixed a spidermonkey compilation issue with xcode 12.0.1/Apple clang v 12.0.0 (clang-1200.0.32.2) (punt)
Added missing layer tag to fishing pole items in DFNs (dragon slayer)
Added missing item definitions for wooden kite shields (0x1b78 and 0x1b79) based on coloured ingots
Added house addon deeds for bear rugs (dragon slayer)
Updated dictionary files with various new strings related to mining
Undid dictionary rename from ENG to ENU and FRE to FRA; these are not actual language codes, but groups of language codes - ENU covers all English language codes, FRA covers all French ones.
Refined build notes
Updated Debug Information Format for Debug x64 platform in VS project properties to Program Database for Edit and Continue
Minor fix for a half-broken system (automatic adding of items to add-menu) that needs to be revamped or removed
Commented out some thread-locking code that was causing UOX3 to crash under certain circumstances
Fixed a few cases of threads sleeping for microseconds instead of milliseconds
Replaced all calls to UOXSleep with direct call to std::this_thread::sleep_for(), and removed UOXSleep function from funcdecl.h
Fixed an issue with "Gold" ore/ingot type, which was mislabelled as "Golden" in the ORE_LIST section of skills.dfn
Fixed an issue where crafting skills might consume the wrong resource if additional resources of the same ID but different color were present in player's backpack
Improved AmbientFootsteps feature so footstep sounds are played more in tune with character movement
AmbientFootsteps now also play for NPC movement
Changed how code handles randomizing between MINTIME and MAXTIME values from region spawners; now multiplies values by 60 (to get seconds) before randomizing, instead of after, to make use of full range of seconds between the values (which are in minutes)
Adjusted default global NPC movement speeds in [speedup} section of uox.ini to use less extreme values
Added a DEBUGMOVEMULTIPLIER define in cChar.cpp used to multiply NPC movement delays by the specified value (1.75 by default) when running UOX3 in debug mode, due to reduced server performance in debug mode
Documentation updates:
Added section on DFN tags for Character, Item, Region, SpawnRegion and Weather DFNs.
Added Feature documentation for Mining and customizable ores
Added More details in feature documentation for Spawn Regions
Updated feature documentation for Dictionaries
Added more details in UOX3 history section
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>
Improvements to handling of UOP format; now takes a cleaner approach, loads files faster (punt)
Fixed a issue in JS/COMMANDS/TARGETING/add.js that would display 'undefined' in system message when adding raw/base items
Updated default jail time in JS/COMMANDS/TARGETING/jail.js (and in code) from 100000 seconds to 86400 seconds (24 hours)
All references in code and scripts to "midi" changed to "music", to reflect fact that modern clients don't actually even have midi files. This change covers both GM commands, DFN tags in regions.dfn and JS methods/properties.
Added new socket property for storing temporary int in JS - tempInt2
Added new socket property for storing temporary object in JS - tempObj2
Expanded XGO command in JS/COMMANDS/TARGETING/x.js to support optional world and instance parameters
Fixed an issue that prevented characters from vanishing from the the sight of players when teleporting to a different instance
Added support for ClassicUO client's WorldMap tracking packet (0xf0) for guildmembers/partymembers. This is the same packet as Razor uses for feature negotiation, so merged the handling of those two packets together into CPIKrriosClientSpecial, which can also be extended to handle other uses of this packet.
Added new UOX.INI setting whether shard should respond to ClassicUO client's WorldMap tracking packets for guildmembers/partymembers
CLASSICUOMAPTRACKER=0
Added support (UOPInterface.cpp/hpp) for loading map files in UOP format, allowing UOX3 to use
map files from clients up to at least v7.0.86.2 without requiring files to be converted to
mul format first. Loading of UOP files is slower than for equivalent mul files, but after
startup, the performance of lookups remains the same for both (punt)
Updated TWEAK, INFO in code and ISTATS, CSTATS in gumps.js to display 4-digit hex-ids for IDs
consistently in the format of 0x####
Fixed issue that would disconnect ClassicUO users if they used WorldMap feature in the client,
via CPIKrriosClientSpecial() handler in CPacketReceive.cpp/h, which will handle all things
packet 0xF0. As of yet it doesn't respond correctly to the WorldMap-related version of the
packet, but at least it no longer disconnects this client from the server.
Embraced the usage of R32, R64, SI16, UI16, SI32, UI32, SI64 and UI64 typedef aliases as replacement for built-in types throughout the sourcecode:
typedef float R32;
typedef double R64;
typedef signed char SI08;
typedef unsigned char UI08;
typedef signed short int SI16;
typedef unsigned short int UI16;
typedef signed int SI32;
typedef unsigned int UI32;
typedef signed long long SI64;
typedef unsigned long long UI64;
As part of this process, UI32 was redefined from unsigned long int to unsigned int, and SI32 from signed long int to signed int to ensure the size of variables using these remain the same (32bit) across both Windows, Linux and MacOS for both 32bit and 64bit platforms
Replaced instances of toLong() with toInt(), and toULong() to toUInt()
Replaced instances of "long" and "int" with SI32 where possible
Replaced instances of "unsigned long" and "unsigned int" with UI32 where possible
Replaced instances of "float" with R32 where possible
Added support for feature negotiation with Razor, AssistUO and other assistant tools that support this feature via new UOX.INI settings:
ASSISTANTNEGOTIATION=0 // If enabled (1), sends a request (packet 0xF0) to negotiate features with assistant tools upon login. Defaults to (0)
KICKONASSISTANTSILENCE=0 // If enabled (1), disconnects clients that don't respond (with packet 0xF0) to request via assistant tool within 30 seconds. Defaults to (0)
Added new section at bottom of UOX.INI to allow shard admins to control which assistant features get disabled:
[disabled assistant features]
{
AF_FILTERWEATHER=0 // Weather Filter
AF_FILTERLIGHT=0 // Light Filter
AF_SMARTTARGET=0 // Smart Last Target
AF_RANGEDTARGET=0 // Range Check Last Target
AF_AUTOOPENDOORS=0 // Automatically Open Doors
AF_DEQUIPONCAST=0 // Unequip Weapon on spell cast
AF_AUTOPOTIONEQUIP=0 // Un/Re-equip weapon on potion use
AF_POISONEDCHECKS=0 // Block heal If poisoned/Macro IIf Poisoned condition/Heal or Cure self
AF_LOOPEDMACROS=0 // Disallow Looping macros, For loops, and macros that call other macros
AF_USEONCEAGENT=0 // The use once agent
AF_RESTOCKAGENT=0 // The restock agent
AF_SELLAGENT=0 // The sell agent
AF_BUYAGENT=0 // The buy agent
AF_POTIONHOTKEYS=0 // All potion hotkeys
AF_RANDOMTARGETS=0 // All random target hotkeys (Not target next, last target, target self)
AF_CLOSESTTARGETS=0 // All closest target hotkeys
AF_OVERHEADHEALTH=0 // Health and Mana/Stam messages shown over player's heads
AF_AUTOLOOTAGENT=0 // (AssistUO only) The autoloot agent
AF_BONECUTTERAGENT=0 // (AssistUO only) The bone cutter agent
AF_JSCRIPTMACROS=0 // (AssistUO only) Javascript macro engine
AF_AUTOREMOUNT=0 // (AssistUO only) Auto remount after dismount
AF_ALL=0 // All features
}
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
Added new JS Gump Methods:
AddPicInPic( x, y, gumpID, width, height, spriteX, spriteY ) // Add sprite image in dialogs, requires client v7.0.80.0 or above
AddImageProperty( serial ) // Add properties(?) of a specific item
Fixed a server crash related to world saves, where items being cleaned up were not being removed properly from the MapRegions they were in, resulting in a crash when attempting to save non-existent items out to the worldfiles.
Fixed an issue that could cause GMs to become permanently squelched
Fixed an issue where the newStatus parameter for the onFlagChange JS event was overwritten with oldStatus, and oldStatus parameter was never set
Updated onDeath JS Event to include a second parameter - iCorpse:
onDeath( pDeath, iCorpse ) // iCorpse is a reference to the newly created corpse of pDead
Disabled detailed logging of spells loaded from spells.dfn on startup - was causing unnecessary slowdown
Removed void Wiping( CSocket *s ) from cmdtable.cpp - unused and unreferenced function without a definition
Removed handling of IT_KEY doubleclicking in code, as this is now handled in JS
Removed bool isDoorBlocked( CItem *door ) from cPlayerAction.cpp - unused and unreferenced function without a definition
Removed void CorpseTarget( CSocket *s ) from targeting.cpp - now handled in JS
Removed broken cannon loading and spelldamage code - this should be done in JS instead
Items that initiate a target cursor on use are now stored in tempObj property of player's socket, and distance to these items are checked again after player targets something
House and boat deeds must now be in the player's inventory in order to successfully place a house or boat
Fixed superfluous arugment passed to switchGobletID function in js/server/resource/pitchers.js
Removed some duplicate/unused local variables in js/commands/custom/misc-cmd.js
Removed an unused local variable in js/commands/targeting/dupe.js
Fixed an issue with setting item type through the SET command
Fixed an issue where the number of arrows or bolts in player's inventory was potentially miscalculated in js/item/archerybutte.js
Fixed issue where pickpocket-dummy item visuals potentially didn't get updated properly in js/item/pickpocketdip.js
Fixed an unreachable return statement in js/npc/ai/stablemaster.js
Fixed incorrect ID for gargish maul in js/server/data/weapontypes.js
Added some missing variable declarations in js/commands/custom/repeatingcmds.js, js/commands/delid.js, js/commands/targeting/hide.js, js/item/food.js, js/item/key.js, js/npc/ai/stablemaster.js
Added additional ClientVersion enum values to start implementing support for clients above 7.0.24.0. Ini settings disabled by default.
Updated packet 0x78 to always send item colour for clients above 7.0.33.1, which also fixes rendering of items on paperdoll for these clients
Client requests sent by the Bandage Self macro (packet 0xBF, subcommand 0x2C) can now be handled in the JS engine via the onUseBandageMacro( socket, targetChar, bandageItem ) JS event (JS Docs updated with details).
Removed a restriction on speech that prevented onSpeech JS event from triggering based on speech from dead player characters
Fixed hairs and beards not being restored properly on player characters after dying and being resurrected (and then relogging)
Resolved an issue with uninitialized struct members
Removed some redundant conditional checks
Made the boolean part of JS function RegisterSkill( <skillnum>, <bool> ) actually work; can now be used to disable/enable JS-implemented skills
Fixed a bug with cHTMLTemplate::Process() where the same expression was used for both branches of a ternary operator
Various minor cleanups; removed some unused variables, addressed some potential portability issues