Commit graph

182 commits

Author SHA1 Message Date
Xoduz
2265f52202 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
Xoduz
4110086944 UString to std::tsring
More UString instances replaced by std::string and associates (punt)

Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2021-04-24 04:21:57 +08:00
Xoduz
0bee2f33b5 0.99.4h
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>
2021-04-23 02:13:17 +08:00
Xoduz
2445f39564 0.99.4g
Completed implementation of onDecay JS event, which was not actually hooked up to anything! Can now be used to interrupt decay for items. Returning false will prevent code from deleting the decaying item, while returning true will continue running the decay code as normal.
Fixed an issue with .brkPeaceChance JS Character property, which erroneously called on the GetBrkPeaceChanceGain()/SetBrkPeaceChanceGain() functions instead of GetBrkPeaceChance()/SetBrkPeaceChance()
Fixed issue with loading of UOP map files that was introduced in a previous commit while attempting to get rid of some warnings when compiling UOX3 on Windows!
2021-04-19 01:11:25 +08:00
Xoduz
69c20fbc42 Added ability to ban/unban players
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
2021-04-17 17:28:12 +08:00
Xoduz
9ea15ac7b3 Fixes for Console behaviour on Linux and Windows, addition of JS properties for user accounts
Fixed long-standing issue with UOX3 console not resetting terminal properly after shutdown on Linux, after updating cConsole.cpp/h to conform to standard unix terminal commands/settings for certain features (punt)
Fixed an issue that could cause a crash on Windows when attempting to broadcast system messages from the UOX3 console (punt)
Fixed an issue that prevented text input in UOX3 console for system broadcasts from being displayed on Linux and MacOS (punt)
Added support for new JS Object - IUE_ACCOUNT - which can be accessed via character property .account. The following account properties have been exposed to the JS engine:
	.id 				// Account ID (Read-Only)
	.username 			// Account Username (Read-Only)
	.flags 				// Flags set on account (Read-Only)
	.comment 			// Comment/contact info
	.character1 		// Character in account slot 1 (Read-Only)
	.character2 		// Character in account slot 2 (Read-Only)
	.character3 		// Character in account slot 3 (Read-Only)
	.character4 		// Character in account slot 4 (Read-Only)
	.character5 		// Character in account slot 5 (Read-Only)
	.character6 		// Character in account slot 6 (Read-Only)
	.character7 		// Character in account slot 7 (Read-Only)
	.currentChar 		// Currently logged in character (if any) (Read-Only)
	.lastIP 			// Last IP used to connect to account (Read-Only)
	// Flag shortcuts
	.isBanned 			// Is account banned?
	.isSuspended 		// Is account suspended?
	.isPublic			// Is comment/contact info to be considered public info?
	.isOnline			// Is account online?
	.isSlot1Blocked 	// Is character slot 1 blocked?
	.isSlot2Blocked 	// Is character slot 2 blocked?
	.isSlot3Blocked 	// Is character slot 3 blocked?
	.isSlot4Blocked 	// Is character slot 4 blocked?
	.isSlot5Blocked 	// Is character slot 5 blocked?
	.isSlot6Blocked 	// Is character slot 6 blocked?
	.isSlot7Blocked 	// Is character slot 7 blocked?
	.unused9 			// Unused flag
	.unused10 			// Unused flag
	.isSeer 			// Is account marked as Seer account?
	.isCounselor 		// Is account marked as Counselor account?
	.isGM 				// Is account marked as GM account?
Fixed 'addaccount command - can now once again be used to add a new user account to the server from in-game. See accounts.adm for info on available flags. Syntax:
	'addaccount [username] [password] [(optional)flags]
Updated 'get command to allow retrieving certain account properties for targeted player characters:
	username, flags, comment, character1, character2, character3, character4, character5, character6, character7, lastIP, isBanned, isSuspended, isPublic, isOnline, isSlot1Blocked, isSlot2Blocked, isSlot3Blocked, isSlot4Blocked, isSlot5Blocked, isSlot6Blocked, isSlot7Blocked, unused9, unused10, isSeer, isCounselor and isGM
Updated 'set command to allow setting certain account properties for targeted player characters:
	comment, password, isBanned, isSuspended, isPublic, isOnline, isSlot1Blocked, isSlot2Blocked, isSlot3Blocked, isSlot4Blocked, isSlot5Blocked, isSlot6Blocked, isSlot7Blocked, unused9, unused10, isSeer, isCounselor, isGM
Updated 'tweak command to allow viewing and modifying of certain account properties for targeted player characters
	Note that any changes to account properties will not go into effect until a worldsave or manual save of accounts via console has taken place.

Co-Authored-By: Charles Kerr <punt1959@users.noreply.github.com>
2021-04-16 21:14:50 +08:00
Xoduz
5381092ddd JS Region Properties and misc
Fixed a casting issue that prevented SEFunctions.cpp from compiling on Linux
Added additional Region/Townregion JS properties. These (and other properties) can be viewed and modified using the 'tweak command, but changes are not permanently saved and will only be valid as long as the server stays running:
	.id 				// Region ID
	.scripttrigger 		// Script-trigger associated with region
	.numGuards 			// Number of guards associated with town (if any) in region
	.taxes 				// Gold reserves of town (if any) in region
	.reserves 			// Resource reserves for town (if any) in region
	.appearance 		// Appearance - 0 = Spring, 1 = Summer, 2 = Autumn, 3 = Winter, 4 = Desolation, 5 = Unknown
	.music 				// Music assigned to region in regions.dfn
	.weather 			// Weather ID assigned to region in regions.dfn
	.owner 				// Name of owner of guards in the region
A JS function was added previously, but not mentioned in the changelog:
	GetTownRegion( regionID ) // Takes one parameter, regionID, and returns a region object
2021-04-14 21:12:59 +08:00
Xoduz
c76a41215f 0.99.4e
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)
2021-04-08 18:54:15 +08:00
Xoduz
8c2c1de962 0.99.4d
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
2021-03-22 05:59:20 +08:00
Xoduz
77901a697c Various teleport fixes - v0.99.4c
Exposed Item properties to JS Engine:
	.dexterity // dexterity required to equip item
	.intelligence // intelligence required to equip item
Fixed issue where changing worldnumber of an item via tweak command would not remove the item from sight of nearby players in the original location
Fixed issue where characters teleporting to a new world would sometimes not be removed from sight of nearby players in the original location
Fixed issue where being released from jail cells to a location in a different world would not send map change packet
Fixed issue where changing worldnumber of a player character via tweak command would not send map change packet
Fixed issue where teleporting GM/Counselor to a player's location when responding to a help request would not send map change packet
Fixed issue where recalling off a recall rune in a different world would not send map change packet
Fixed issue where using travel menu or 'go place # command would not send map change packet when going to a location in a different world
When marking recall runes, they will now get a hue reflecting the facet they were marked in (UOX3/js/commands/targeting/magic.js)
Tooltips for recall runes will now show the name of the facet they were marked in, with facet names being pulled from entries 1975 to 1980 in the dictionary files
2020-11-19 05:04:34 +08:00
Xoduz
ce17a71e85 Misc Pathfinding fixes and other things - v0.99.4b
Fixed an issue with NPC trainers where they would list incorrectly the available skills players could train
Fixed an issue where house key could not be used to open locked doors if key was not contained in root of player's backpack (UOX3/js/item/doors.js)
When NPCs in wanderTypes WT_BOX, WT_CIRCLE or WT_FREE are blocked too many times from moving by other characters, they will now pause for 60 seconds before attempting to move again
Exposed .oldWanderType NPC property to JS engine, and updated 'set command to also update this property when manually changing NPC wanderType
Reduced max attempts at calculating path for NPCs in wanderTypes WT_BOX, WT_CIRCLE or WT_FREE to 25 steps, unless they are evading and attempting to move back into their original wander box/circle
NPCs who enter "evasion" state because they are unable to find a valid path to an attacker will now have their health reset to maximum, to prevent an exploit to take down any NPCs without risk of taking any damage in return
JS Methods WalkTo() and RunTo() now actually make use of the provided maxSteps parameter when advanced pathfinding is enabled; previously it would default to 500 steps.
Added new JS event that triggers when an NPC enters evasion state in combat due to being unable to reach their target
	onEnterEvadeState( mNPC, enemyChar ) // enemyChar would be the character they are unable to reach
Added a new command - 'cure - that can cure a targeted character of any poisons (UOX3/js/commands/targeting/stats.js)
NPCs of same race will no longer attack one another if hit by each other's AoE spells
Fixed an issue with NPC pathfinding in combat that prevented ranged NPCs from closing in on their targets when losing LoS
Spellcasting NPCs that cannot pathfind all the way to their target in combat will now attempt to pathfind to an area near the target instead
Fixed an issue that prevented tiller-men from being correctly associated with their boats after a server restart
Fixed an issue with combat where ranged characters could shoot bows further than the allowed max range for archery specified in uox.ini
2020-11-15 02:59:45 +08:00
Xoduz
d7ac5c3218 Housing Revamp and more
Updated JS SysMessage function to accept up to 10 extra, optional arguments, which can be used with dictionary messages that require additional parameters like %s or %i
Added new type of house privilege in cMultiObj.cpp to keep track of friends of the multi - HOUSEPRIV_FRIEND - which is stored during worldsaves as one or more Friend=<player serial> tags in house.wsc
Added new type of house privilege in cMultiObj.cpp to keep track of guests of the multi - HOUSEPRIV_GUEST - which is stored during worldsaves as one or more Guest=<player serial> tags in house.wsc
When items are created for houses upon house placement, a reference to the multi's serial is now stored in the house sign's MORE property to allow easier tracking of which house a particular sign belongs to
Added tracking of new, persistent properties for houses via cMultiObj.cpp/h:
	lockdowns, secure containers, vendors, guests, friends, owners, ban location, public status, number of visits, timestamps
Added a multitude of  new methods in cMultiObj.cpp/h to assist in improving the functionality of houses
Added new tags for houses in house.dfn (default values applied if tag not specified):
	MAXSECURECONTAINERS=4 - Max amount of secure containers allowed in a multi
	MAXLOCKDOWNS=256 - Max amount of lockdowns allowed in a multi
	MAXVENDORS=10 - Max amount of vendors allowed in a multi
	MAXBANS=50 - Max amount of bans in a multi's ban list
	MAXFRIENDS=50 - Max amount of friends in a multi's friend list
	MAXGUESTS=50 - Max amount of guests in a multi's guest list
	MAXOWNERS=8 - Max amount of owners and co-owners in a multi's owner list
	MAXTRASHCONTAINERS=1 - Max amount of trash containers allowed in multi
	SCRIPT=<scriptID> - Assign a JS script-ID directly to a multi
	FRONTDOOR - indicates that a door is the front door of a house. Cannot be locked in public houses!
	INTERIORDOOR - indicates that a door is an interior door of a house. Can be locked in public houses.
	BANX - Location X offset for multi's ban location, if not used, will try to use SE corner of multi instead
	BANY - Location Y offset for multi's ban location, if not used, will try to use SE corner of multi instead
Added JS Event:
	onHouseCommand( tSock, multiObj, cmdID ) - For handling spoken house commands via JS scripts attached to multi.
Updated JS Events:
	onEntrance() - can now trigger both for multi being entered and/or object entering
	onLeaving() - can now trigger both for multi being left and/or object entering
	onSpeech() - can now also trigger for items (in addition to chars) with event & script attached, if UOX.INI setting ITEMSDETECTSPEECH is enabled
Added JS Multi methods:
	.IsBoat() - Returns whether the item (or multi) is a boat
	.IsOwner( playerToCheck ) - Returns whether a player is the owner of a multi
	.IsOnOwnerList( playerToCheck ) - Returns whether a player is on the (co-)owner list of a multi
	.IsOnFriendList( playerToCheck ) - Returns whether a player is on the friend list of a multi
	.IsOnGuestList( playerToCheck ) - Returns whether a player is on the guest list of a multi
	.IsOnBanList( playerToCheck ) - Returns whether a player is on the ban list of a multi
	.AddToFriendList( playertoAdd ) - Adds player to the friend list of a multi
	.RemoveFromFriendList( playertoRemove ) - Removes player from the friend list of a multi
	.AddToGuestList( playertoAdd ) - Adds player to the guest list of a multi
	.RemoveFromGuestList( playertoRemove ) - Removes player from the guest list of a multi
	.ClearOwnerList() - Clears all entries from a multi's (co-)owner list
	.ClearFriendList() - Clears all entries from a multi's friend list
	.ClearGuestList() - Clears all entries from a multi's guest list
	.ClearBanList() - Clears all entries from a multi's ban list
	.SecureContainer( itemToSecure ) - Secures a container in a multi
	.UnsecureContainer( itemToUnsecure ) - Unsecures a container in a multi
	.IsSecureContainer( itemToCheck ) - Checks if specified item is a secure container in a multi
	.LockDownItem( itemToLockDown) - Locks down an item in a multi
	.ReleaseItem( itemToRelease ) - Releases a locked down item in a multi
	.KillKeys() - Deletes ALL keys associated with a multi
	.AddTrashCont( itemToAdd ) - Add trash container to multi's list of trash containers
	.RemoveTrashCont( itemToRemove ) - Remove trash container from multi's list of trash containers
Added JS Item (Multi only) properties:
	.lockdowns - Get the number of lockdowns in a multi
	.maxLockdowns - Get/Set the max number of lockdowns allowed in a multi
	.secureContainers - Get the number of secure containers in a multi
	.maxSecureContainers - Get/Set the max number of secure containers allowed in a multi
	.trashContainers - Get the number of trash containers in a multi
	.maxTrashContainers - Get/Set the max number of trash containers allowed in a multi
	.friends - Get the number of friends in a multi's friend list
	.maxFriends - Get/Set the max number of friends allowed in a multi's friend list
	.guests - Get the number of guests in a multi's guest list
	.maxGuests - Get/Set the max number of guests allowed in a multi's guest list
	.owners - Get the number of owners in a multi's owner list
	.maxOwners - Get/Set the max number of owners allowed in a multi's owner list
	.bans - Get the number of banned players in a multi's ban list
	.maxBans - Get/Set the max number of banned players allowed in a multi's ban list
	.vendors - Get the number of player vendors in a multi
	.maxVendors - Get the max number of player vendors allowed in a multi
	.deed - Get the item sectionID for deed used to place multi
	.isPublic - Get/Set the private/public state of a multi
	.buildTimestamp - Get the timestamp for when the house was originally placed
	.tradeTimestamp - Get the timestamp for when the house was last traded to another player
	.banX - Get/Set the ban location X offset for the multi
	.banY - Get/Set the ban location Y offset for the multi
Added JS Character properties:
	.multi = Get/Set the multi object the character is in
	.accountNum = Get the account number the character belongs to
	.housesOwned = Get a count of houses owned by the character
	.housesCoOwned = Get a count of houses co-owned by the character
Updated JS cBaseObject Methods .FirstItem(), .NextItem() and .FinishedItems() to also support iterating through items in multis
Updated JS multi Methods .FirstChar(), .NextChar() and .FinishedChars() to support an additional parameter to specify what kind of characters to loop through:
	"default" or no parameter - all characters inside the multi
	"owner" - players on multi's owner list
	"friend" - players on multi's friend list
	"guest" - players on multi's guest list
	"banned" - players on multi's ban list
Added new INI tags to a new section of uox.ini called [houses]
	DECAYTIMERINHOUSE=3600 // Decay timer in seconds for non-locked down items inside houses
	PROTECTPRIVATEHOUSES=1 // Toggles whether private houses will automatically boot unauthorized visitors (1) or not (0)
	TRACKHOUSESPERACCOUNT=1 // Toggles whether to track (and restrict) house ownership per account (1) or per character (0)
	MAXHOUSESOWNABLE=1 // Specifies the max amount of houses a player can own per account/char, depending on how house ownership is tracked
	MAXHOUSESCOOWNABLE=10 // Specifies the max amount of houses a player can co-own per character
	CANOWNANDCOOWNHOUSES=1 // Toggles whether players can own and co-own houses at the same time
	COOWNHOUSESONSAMEACCOUNT=1 // Toggles whether characters on same account as house owner will be treated as co-owners
Added new INI tags in [settings] section of uox.ini:
	ITEMSDETECTSPEECH=0 // If enabled, server will search for nearby items with onSpeech JS event running whenever a character speaks. Disabled by default.
	MAXPLAYERPACKITEMS=125 // Defines max item capacity for player (and NPC) backpacks. Defaults to 125.
Moved most of the existing house functionality to JS and expanded upon it to reach feature parity with houses in regular UO around Publish 15/16, with various extras thrown in for good measure and all functionality being customizable:
	js/server/house/house.js (15000) - handles detection of house commands and characters entering/leaving houses
	js/server/house/houseSign.js (15001) - contains and handles all house-related gumps/menus and what is shown when players interact with house sign
	js/server/house/houseCommands.js (15002) - handles functionality of house commands and other functionality such as transfer of ownership, demolishing house, etc.
	js/server/house/houseDeed.js (15003) - handles initial rules that allow/disallow placement of additional houses for players
	All house-related menus now fully handled through JS
	All house commands and other functionality now fully handled through JS
	Removed redundant hard-coded house functionality
	Implemented Co-owners, friends, guests for houses, with access rules in place for entry, lockdowns, house commands, etc.
	Implemented Private and Public houses
	Implemented Secure Containers and Trash Barrels
	Definable max lockdowns, secure containers, player vendors, bans, friends, guests, owners, trash containers and more - per house type
	JS scripts can now be attached directly to houses
	Doors in houses can be marked as front doors or interior doors, and will be treated differently with regards to private and public houses
	Added new item to dfndata/items/containers/misc.dfn - [trashbarrel]
	Added new JS script (js/items/trashbarrel.js) with trash barrel functionality for houses. Trash barrels that are marked as secure containers are only accessible by owners, co-owners and friends of the house. Various options available at top of script.
	Updated js/items/axe.js to support chopping up trash barrels and house add-ons in houses owned by the player
	Fixed an issue with house doors being left behind after demolishing houses while their doors were open
	Fixed an issue where GMs could be banned from player houses
	Added Line of Sight checks to speech, to give players some privacy in their own homes
	Updated house placement code to more accurately check for other multis, dynamic and static objects when placing houses; now requires free space around each house that cannot be blocked by other houses or items that can block player movement, and disallows placement of houses on roads
	Updated house placement code to move characters blocking house placement to SE corner of the house
	Updated house placement code to disallow placing houses in guarded regions, or in dungeons
	Added new DFN tag for regions to enable/disable player houses in specific regions: HOUSING=0/1
	Added new region (247) that covers path to Valley of Eodon in Felucca
	Added new region (248) that covers Valley of Eodon in Ter-Mur, with player housing disabled
	Added new region (249) that covers entire T2A lands, with player housing disabled
	Updated SPACEX and SPACEY values for all houses in dfndata/house/house.dfn to match updated house placement code
	Added new JS property to Regions that can be used to determine or change state of player housing in a region: .canPlaceHouse()
	Updated rules for usage of dye tubs to dye locked down items; now only house owners or co-owners may dye locked down items
	Updated rules for usage of the following locked down items in a house, which are now only usable by house owners and co-owners
		Dyes, Guildstone Deeds, Recall Runes (renaming), Rename Deeds, Townstone Deeds, House Deeds, Boat Models, Player Vendor Deeds, Ore, Hair Dye
	Updated rules for usage of the following locked down items in a house, which are now only usable by house owners, co-owners	and friends:
		Keys, Dye Tubs, Magic Scrolls, Fireworks Wands, Magic Wands, Smithing Tools, Mining Tools, Fishing Poles
	Updated item lockdown rules to allow locking down (and releasing) items in a container as long as the container is locked down, and to only allow releasing a locked down container if it's empty of locked down items
	Updated item lockdown rules to only allow locking down movement-blocking items further than 2 tiles away from doors
	Updated rules for releasing items in houses - now the house owner can release any locked down items, co-owners can release items locked down by themselves or by friends, while friends can release only items locked down by themselves
	Added some feedback to player about why their attempted house placement failed
	Items added by GMs directly into multis will now decay based on the house-specific decay timer instead of the regular one
	Fixed an issue that could cause items to almost instantly decay after being released from lockdown in a house
	Placing house add-ons now properly takes into account SPACEX and SPACEY values when checking if they can fit in selected area of houses
	Re-added SPACEX and SPACEY values for Pentagram and Loom house add-ons
	House add-ons can now be converted back into house add-on deeds by chopping them with an axe
	Added new item type - IT_HOUSEADDON (201) - used by house add-ons placed in player houses
	Fixed a bug where keys would stop working after being added to a keyring, and would turn into blank keys upon release from the keyring
	Added visitor count for public player houses, which keeps track of how many visits a public house has received, with each player counted max 1 time every 24 hours
	Fixed an issue with FindPlayersInOldVisrange() where it didn't take into account that players could see buildings further away than the standard update range. This could cause players to see ghost images of buildings if they were at the "right" distance when the building was being demolished
	Added NODECAY tag to all signs and doors in dfndata/house/house.dfn
	Added FRONTDOOR or INTERIORDOOR (as appropriate) to all doors in dfndata/house/house.dfn
	Added BANX and BANY to specify ban location for some houses in dfndata/house/house.dfn instead of relying on finding SE corner automatically
	Implemented strongboxes (js/server/house/strongbox.js) for co-owners of a house, which can be placed with the house command "i wish to place a strongbox". Max capacity is 25 items
Updated 'REMOVE command to take an optional parameter - itemID. If supplied, the command will remove all items with this itemID from a targeted container
Fixed a bug when checking if dynamic items were blocking valid spawn locations for NPCs, some function arguments were in the wrong order!
Improved code that finds valid spawn locations for items and NPCs spawned via spawn regions. As server gradually builds up lists of valid spawn locations per region over time, it will start using these lists more often, rather than always look for brand new spawn locations.
Fixed a bug with CMulHandler::CheckStaticFlag() that prevented NPCs from spawning inside buildings with no static floors!
Fixed an issue with repeating commands that prevented GMs from being able to cancel them when using the ClassicUO client
Exposed character property .accountNum to JS engine
Extended CDataList class to include a Clear() method for clearing lists
Updated JS File method .Open() to support an optional, third argument - subFolderName - that defines in which sub-folder of UOX3/shared/ to store/look for a file. If no third argument is supplied, UOX3 will default to using the shared folder itself.
Updated JS File method .Length() to return a value of -1 for files that don't exist
Added new code function, exposed to JS engine with same parameters, which simply checks if a given tile ID has a specific flag
	bool CheckTileFlag( UI16 itemID, TILEFLAG flagToCheck )
Added JS function used to find the root container of an item (if any)
	FindRootContainer( itemSerial )
	FindRootContainer( item )
Added new JS function that allows deleting files from UOX3/shared/ folder or subfolders of shared folder. If no subFolderName is provided, looks for file directly in shared folder itself. Restrictions on file- and folder-names apply.
	bool DeleteFile( fileName, subFolderName )
Added new JS functions for checking if a specific client or server feature is enabled. See documentation for full list of client/server features.
	GetClientFeature( bitNum ) // Returns true if specified client feature is enabled on server
	GetServerFeature( bitNum ) // Returns true if specified server feature is enabled on server
Added new JS function for returning the value of almost any server setting from UOX.INI
	GetServerSetting( settingNameInDoubleQuotes )
Updated JS function DoesDynamicBlock() with two new parameters - checkOnlyMultis and checkOnlyNonMultis
Updated JS function DoesMapBlock() with two new parameters - checkMultiPlacement and checkForRoad
Fixed an issue where a LoS check would prevent players from accessing containers in their own backpack
Added new functions in findfuncs.cpp to make it easier to find items near another object or location:
	findNearbyItems( object, distance )
	findNearbyItems( x, y, worldNumber, instanceID, distance )
Added new Item property - maxItems - used by containers to determine their max item capacity
Added new Item property - totalItemCount - used to get total item count in a container (including sub-containers)
Added check for max item capacity when creating new items that are added to a character's backpack - items will be created below character's feet if backpack is full!
Added new DFN tag for items, used by containers to determine item capacity for a given container:
	MAXITEMS=# // 125 is the default for all containers if not set
Added new JS Item properties:
	.maxItems // gets/sets item capacity for a given container
	.totalItemCount // gets total item count in a container, including sub-containers
Updated item tooltips for containers to show accurate total item count, as well as to display max item capacity
Fixed a bug where picking up items from a non-locked down pile of items on the floor inside a multi could cause the remaining pile to be seen as no longer inside the multi, disallowing locking it back down and causing it to decay based on regular decay timer instead of house-specific one
Updated JS command set to allow setting poison-level on items ('set poison #) and hunger-level on characters ('set hunger #)
Fixed an issue with js/item/food.js that prevented poisoned food from poisoning characters when eaten
Fixed an issue with js/skill/poisoning.js that prevented players from poisoning food!
Updated various JS scripts and hardcoded targeting functions to disallow the targeting of locked down resources using skills and tools
Updated JS Method TextMessage() to support three extra, optional parameters. Note that if one optional parameter is included, all preceding optional parameters are also required!
	speechTarget - What kind of target is this message intended for?
		0 - Only visible for sender and receiver of message
		1 - Visible to all players in range
		2 - Visible to all NPCs and players in range
		3 - Visible to all PCs everywhere + NPCs in range
		4 - Visible to all PCs everywhere (broadcast)
		5 - Only visible for the receiver of the message
	speechTargetSerial - The serial of the receiver of the message, used if speechTarget is 0 or 5
	speechFontType - The type of font to display the text in. Defaults to normal.
	    0 - Bold
	    1 - Normal with shadow
	    2 - Bold with shadow
	    3 - Normal
	    4 - Gothic
	    5 - Italic
	    6 - Small, dark
	    7 - Colourful
	    8 - Runic (only works with CAPS)
	    9 - Small, light
Added timestamp to worldsaves in console, to make it easier to see when a particular world-save was done
Added info about compiler/environment displayed at the top of the UOX3 console during startup
Updated dictionary files with new messages primarily related to housing
2020-11-04 02:00:37 +08:00
Xoduz
fc5e0f18e8 Exposed various map and statics related functions to JS engine
Updated JS item properties MORE, MOREX, MOREY, MOREZ and SERIAL, and character property SERIAL, to pass values to JS scripts using JS_NewNumberValue() instead of INT_TO_JSVAL if the property value cannot fit inside JSVAL (checked with INT_FITS_IN_JSVAL)
Added support in CResponse.cpp for client trigger word for securing containers in houses - TW_HOUSESECURE
Updated CMulHandler::CheckStaticFlag() to match with statics that cover/extend across the specified Z coordinate, not just ones that have the same base Z level
Updated CMulHandler::DoesMapBlock() to not deem map tiles as blocking if they are more than 16 Z (height of a character) higher than the specified Z coordinate to check
Exposed method for finding corners of a multi to JS engine:
	.GetMultiCorner( cornerID ) - Gets coordinates for specified corner of multi (0 = NW, 1 = NE, 2 = SW, 3 = SE)
Exposed various functions related to map, statics and multis to JS engine:
	CalcMultiFromSer( serial ) - Find a multi from a provided serial
	GetMapElevation( x, y, z, world) - Returns the map elevation at specified coordinates
	IsInBuilding( x, y, z, world, instance, checkHeight ) - Returns true if the specified location is inside a static building (underneath static items), or if player is inside a multi. If the checkHeight argument is true, player is only deemed inside a multi if there are multi-items above the player's head. If player is in a courtyard/on a rooftop, they will be deemed to be NOT in the building. checkHeight is not used for the static part of the function.
	CheckStaticFlag( x, y, z, world, tileFlagID ) - Checks to see if any statics at given coordinates has specified tile flag
	DoesStaticBlock( x, y, z, world, checkWater ) - Checks if statics at/above given location blocks characters
	DoesDynamicBlock( x, y, z, world, instance, checkWater, waterWalk ) - Checks if dynamics at/above given location blocks characters
	DoesMapBlock( x, y, z, world, checkWater, waterWalk ) - Checks if map tile at/above given location blocks characters
2020-10-05 23:12:34 +08:00
Xoduz
166d3b0119 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
Xoduz
93f306ca48 Improvements to UOP handling, misc fixes
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
2020-08-24 04:25:36 +08:00
Xoduz
3e8006c648 Code cleanup
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
2020-08-12 23:46:33 +08:00
Xoduz
68e5fdcdb2 Misc minor improvements
Added an FX playing for successful uses of the parrying skill
Successfully parrying an attack will send a sysmessage to the player informing them of their feat, if DISPLAYHITMSG is enabled in UOX.INI
Updated dictionary files with new entry about blocking attacks using parrying skill
Fixed placing a house addon teleporting player to the location of the addon
Added support for TELEPORT tag to regions.dfn. If set to 0, use of the Teleport spell is not allowed in a given region. Defaults to 1 if not specified.
Exposed canTeleport JS property for regions
Updated regions.dfn to disable usage of Teleport spell within level 3 of the Wisp dungeon
Updated regions.dfn to enable usage of RECALL spell in city/dungeon of Wind (so players can recall out of there)
Added missing UOX.INI settings for feature negotation, as mentioned in previous commit!
2020-08-11 22:19:08 +08:00
Xoduz
342385d2f2 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
Xoduz
12c3e8f0b4 Some JS Spell fixes
Corrected name of spell JS property AGRESSIVESPELL to AGGRESSIVESPELL
Updated clumsy.js and level1targ.js with corrected names for aggressiveSpell and canCastAggressive JS properties, and added checks for isSafeZone region JS property
Commented out hardcoded versions of spells that have been ported to JS
2018-09-23 01:34:52 +08:00
Xoduz
10a7235b28 Added support for SAFEZONE in regions.dfn
Disabled SAFESEH linker option for debug build to enable "Edit and Continue" mode in Visual Studio
	Disabled loading of PRIV tag from regions.wsc, as it is currently unused (meant for townstones) and prevents loading certain updates to regions.dfn file
	Added support for SAFEZONE tag to regions.dfn. No hostile actions are allowed within zones where this tag is set to 1
	Added combat, spellcasting, stealing and snooping checks for safe zone
	Added safe zone check to damage portion of explosion potion
	Exposed isSafeZone JS property for characters
	Updated potion.js, provocation.js and enticement.js to check for safe zones
2018-09-17 00:38:10 +08:00
Xoduz
d6a98f4f64 Syncing repositories
Syncing repository with openuo sf repository
2018-09-08 18:08:48 +08:00
Geir Ove Alnes
e1d376a1fd Updating CVS to bring it up to speed with latest UOX3 version - 0.99.2 2012-11-03 18:11:04 +00:00
Matthew Randall
afc0c8e0ac Added:
-JS Get/Set "vulnerable" handlers for character properties (Abaddon)
  -willHunger with Get/Set HungerStatus() wrappers to CChar class (can now
   selectively stop a character/creature from continuing to hunger)
  -JS Get/Set "willhunger" handlers for character properties Changed:
  Linux compile fixes (thanks Malketh)
	Hash.h warning fixed (thanks Philantrop)
	Fixes to getRootPack() and getPackOwner()
	Removed many #includes from the global scope, including them in the specific files that need them
		This should greatly reduce compile time and filesize, along with the need to recompile after altering most headers
	Removed the linux ifdefs around typedefd function declarations, this should work with gcc 3.2
	Moved global loading functions into a new cFileIO() class to take them out of global scope
	Fixed an issue causing items to not be sent to the client (thanks Malketh)
	Moved some global structs into the CWorldMain class
	Fixed a bug causing a crash on character / item creation
	Moved all effects stuff into its own class to take it out of global scope
	Changed the variable CChar::region to CChar::regionNum to avoid conflicts with the cTownRegion region[] indexes
	Moved getbestskill(), isHuman(), and inDungeon() into the CChar class to remove them from global scope
	Took npcSimpleAttackTarget() out of global scope
	Rewrote restock() to make use of restockNPC()
	Changed the typedef'd iterator in hash.h to HASHITERATOR to kill a Linux warning
	Renamed cEffects::soundeffect() to PlaySound() and removed unneeded overloads
	Fixed a bug causing executebatch to be set with locationcount data
	Rewrote cEffects::bgsound()
	Documented sounds.cpp
	Misc minor cleanups / fixes
Removed:
	sendItemsInRange() (CChar::Teleport() does the same thing)
	Many #includes that were not being used
	deathMenu()
	respawnnow() and moved all of its code into command_respawn()
	one instance of cEffects::scpSoundEffect() and renamed the other to PlaySound()

3/13/2003
Changed
	Fixed an issue allowing the server to not have a dictionary.ZRO (which would cause a crash when a dictionary entry was called with no language)
	Fixed an issue causing the server to puke when it attempted a restart
	Moved SpawnRandomItem() into cItem class
	Moved SpawnRandomMonster() into cCharHandle class
	Broke necro.dfn into fishing.dfn and digging.dfn
	Made better use of SpawnRandomItem() and SpawnRandomMonster()

3/12/2003
Added:
	CPOpenGump and CPSpeech packet class to remove some global vars (Note these are pretty basic classes and someone
		with a better understanding of how we handle sending/recieving packets could probably expand these to make better use of them)
Changed:
	Moved many global vars into the CWorldMain() class
	Cleaned ResetVars() in uox3.cpp as ResetDefaults() in CWorldMain() now handles much of that
	Added a check to ensure text wasn't sent twice in talking(), should fix double-speech
	Cleaned up cmdtable.cpp removing a couple duplicate entries, etc
	Changed target() to only require 4 values (as the first two were always 0 and 1)
	Removed many unneeded typedefs and globals
	Went through cServerData() and noted unused server.ini entries
	Moved title1(), title2(), and title3() to cClick.cpp since that is their only usage, made use
		of MAX_TITLE to ensure we wouldn't overrun the buffers, and renamed them matching what title they were

3/11/2003
Changed:
	Fixed a potentially very serious bugs with how containers were being set upon loading the world
	Fixed possible re-adding of weight to containers and characters at load
	Fixed a bug causing equipped items that were not weapons to take damage in combat
	Minor cleanups / warning fixes / Linux compatability issues (punt)

3/7/2003
Overhauls/Additions/Major Changes
Changed:

Tweaks/Object Conversions/Misc Small Changes
Changed:
	Changed CItem::Get/SetLayer() to a UI08
	Fixed a bug in speech causing you to see your own text twice
	Fixed a nasty crash bug
2003-03-23 10:18:02 +00:00
Matthew Randall
16ba505535 Mainly little smallish fixes. I think this covered double speech, and in valid speech when actually in range(not sure). And just general little code cleanups 2003-03-08 06:51:01 +00:00
Matthew Randall
aad0b7121e *** empty log message *** 2003-03-05 02:29:44 +00:00
Matthew Randall
e70346fe4d *** empty log message *** 2003-01-24 17:55:29 +00:00
Matthew Randall
410ba459be *** empty log message *** 2003-01-24 17:38:23 +00:00
Matthew Randall
9f36833ad0 *** empty log message *** 2003-01-24 17:30:58 +00:00
Matthew Randall
d19a881a76 Some small ownership fixes - Xuri 2003-01-23 08:35:29 +00:00
Matthew Randall
08d17d80c6 -Added Support for Ownership stuffs - Xuri 2003-01-22 16:02:00 +00:00
Matthew Randall
54e38f1b78 Ok, got some of the DTL implementation in, however it isn't completed, so it has not been #define'd. Accounts will be first to get tested, based on accounts test, further support will be embedded within the server.
----
Added SEGumpData support,
2003-01-21 15:59:30 +00:00
duckhead
d0b22bd8b8 Imported Sources 2002-04-07 20:53:41 +00:00