From 3f5efab632343097a845c503d2ebadd2edaaf375 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:29:39 -0500 Subject: [PATCH 01/84] Lower Requirements Propertie Added AOS Lower Requirement propertie. --- data/js/commands/targeting/get.js | 3 +++ data/js/commands/targeting/set.js | 4 ++++ source/CPacketSend.cpp | 11 ++++++++++- source/Changelog.txt | 3 +++ source/UOXJSPropertyEnums.h | 1 + source/UOXJSPropertyFuncs.cpp | 2 ++ source/UOXJSPropertySpecs.h | 1 + source/cBaseObject.cpp | 21 +++++++++++++++++++++ source/cBaseObject.h | 4 ++++ source/cItem.cpp | 7 +++++++ source/cPlayerAction.cpp | 3 ++- source/items.cpp | 4 +++- source/ssection.cpp | 2 ++ source/ssection.h | 1 + 14 files changed, 64 insertions(+), 3 deletions(-) diff --git a/data/js/commands/targeting/get.js b/data/js/commands/targeting/get.js index 365d3a2b3..2804da034 100644 --- a/data/js/commands/targeting/get.js +++ b/data/js/commands/targeting/get.js @@ -319,6 +319,9 @@ function HandleGetItem( socket, ourItem, uKey ) case "RESISTPOISON": socket.SysMessage( ourObj.Resist( 7 )); break; + case "LOWERSTATREQ": + socket.SysMessage( ourObj.lowerStatReq ); + break; case "ARMORCLASS": case "ARMOURCLASS": case "AC": diff --git a/data/js/commands/targeting/set.js b/data/js/commands/targeting/set.js index e9b4f3226..9abe4d36c 100644 --- a/data/js/commands/targeting/set.js +++ b/data/js/commands/targeting/set.js @@ -98,6 +98,10 @@ function onCallback0( socket, ourObj ) ourObj.Resist( 7, nVal ); okMsg( socket ); break; + case "LOWERSTATREQ": + ourItem.lowerStatReq = nVal; + okMsg( socket ); + break; case "HP": case "HEALTH": ourObj.health = nVal; diff --git a/source/CPacketSend.cpp b/source/CPacketSend.cpp index e1d8ee4ca..5684336e0 100644 --- a/source/CPacketSend.cpp +++ b/source/CPacketSend.cpp @@ -7657,12 +7657,21 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou FinalizeData( tempEntry, totalStringLen ); } - if( cItem.GetStrength() > 1 ) + const SI16 strReq = (cItem.GetStrength() * (100 - cItem.GetLowerStatReq())) / 100; + + if( strReq > 0 ) { tempEntry.stringNum = 1061170; // strength requirement ~1_val~ tempEntry.ourText = oldstrutil::number( cItem.GetStrength() ); FinalizeData( tempEntry, totalStringLen ); } + + if( cItem.GetLowerStatReq() > 0 ) + { + tempEntry.stringNum = 1060435; // lower requirements ~1_val~% + tempEntry.ourText = oldstrutil::number( cItem.GetLowerStatReq() ); + FinalizeData( tempEntry, totalStringLen ); + } } } diff --git a/source/Changelog.txt b/source/Changelog.txt index 1d779c15f..35333948e 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,6 @@ +30/04/2024 - Dragon Slayer/Xuri/Maarc + Added AOS Lower Requirement propertie. + 27/04/2024 - Dragon Slayer/Xuri Fixed an issue where non-corpse containers - including treasure chests in dungeons - would decay and leave all their contents on the ground. Converted LOOTDECAYSWITHCORPSE ini setting to two new settings, one for player corpses, one for NPC corpses: diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h index af309d496..e4019b194 100644 --- a/source/UOXJSPropertyEnums.h +++ b/source/UOXJSPropertyEnums.h @@ -445,6 +445,7 @@ enum CI_Properties CIP_DECAYTIME, CIP_LODAMAGE, CIP_HIDAMAGE, + CIP_LOWERSTATREQ, CIP_AC, CIP_DEF, CIP_RESISTCOLD, diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index 3823356f9..734a6e32f 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -676,6 +676,7 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN )); break; case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW )); break; case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break; + case CIP_LOWERSTATREQ: *vp = INT_TO_JSVAL( gPriv->GetLowerStatReq() ); break; case CIP_NAME2: tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() ); *vp = STRING_TO_JSVAL( tString ); @@ -1321,6 +1322,7 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; + case CIP_LOWERSTATREQ: gPriv->SetLowerStatReq( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h index 3149dc0ec..123111cdb 100644 --- a/source/UOXJSPropertySpecs.h +++ b/source/UOXJSPropertySpecs.h @@ -477,6 +477,7 @@ inline JSPropertySpec CItemProps[] = { "damagePoison", CIP_DAMAGEPOISON, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "damageRain", CIP_DAMAGERAIN, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "damageSnow", CIP_DAMAGESNOW, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "lowerStateReq", CIP_LOWERSTATREQ, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "name2", CIP_NAME2, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "isChar", CIP_ISCHAR, JSPROP_ENUMPERMRO, nullptr, nullptr }, { "isItem", CIP_ISITEM, JSPROP_ENUMPERMRO, nullptr, nullptr }, diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 506c247ac..82435c442 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -1036,6 +1036,27 @@ void CBaseObject::IncHP( SI16 amtToChange ) SetHP( hitpoints + amtToChange ); } +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetLowerStatReq() +//| CBaseObject::GetLowerStatReq() +//| Date - 30 April, 2024 +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the Stat Requirements of the object +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetLowerStatReq( void ) const +{ + return lowerStatReq; +} +void CBaseObject::SetLowerStatReq( SI16 newValue ) +{ + lowerStatReq = newValue; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::GetDir() //| CBaseObject::SetDir() diff --git a/source/cBaseObject.h b/source/cBaseObject.h index 638e826f7..84c38ee70 100644 --- a/source/cBaseObject.h +++ b/source/cBaseObject.h @@ -69,6 +69,7 @@ class CBaseObject SI16 dexterity; SI16 intelligence; SI16 hitpoints; + SI16 lowerStatReq; VisibleTypes visible; SI16 hiDamage; SI16 loDamage; @@ -256,6 +257,9 @@ class CBaseObject void IncDexterity( SI16 toInc = 1 ); void IncIntelligence( SI16 toInc = 1 ); + virtual SI16 GetLowerStatReq( void ) const; + virtual void SetLowerStatReq( SI16 newValue ); + virtual void PostLoadProcessing( void ); virtual bool LoadRemnants( void ) = 0; diff --git a/source/cItem.cpp b/source/cItem.cpp index 3c6523d5d..4987e294e 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1660,6 +1660,7 @@ auto CItem::CopyData( CItem *target ) -> void target->SetMaxRange( GetMaxRange() ); target->SetMaxUses( GetMaxUses() ); target->SetUsesLeft( GetUsesLeft() ); + target->SetLowerStatReq( GetLowerStatReq() ); target->SetStealable( GetStealable() ); // Set damage types on new item @@ -1739,6 +1740,7 @@ bool CItem::DumpBody( std::ostream &outStream ) const outStream << "Speed=" + std::to_string( GetSpeed() ) + newLine; outStream << "Movable=" + std::to_string( GetMovable() ) + newLine; outStream << "Priv=" + std::to_string( GetPriv() ) + newLine; + outStream << "LowerStatReq=" + std::to_string( GetLowerStatReq() ) + newLine; outStream << "Value=" + std::to_string( GetBuyValue() ) + "," + std::to_string( GetSellValue() ) + "," + std::to_string( GetVendorPrice() ) + newLine; outStream << "Restock=" + std::to_string( GetRestock() ) + newLine; outStream << "AC=" + std::to_string( GetArmourClass() ) + newLine; @@ -1922,6 +1924,11 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) SetWeatherDamage( LIGHTNING, static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 ); rValue = true; } + if( UTag == "LOWERSTATREQ" ) + { + SetLowerStatReq( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); + rValue = true; + } break; case 'M': if( UTag == "MAXITEMS" ) diff --git a/source/cPlayerAction.cpp b/source/cPlayerAction.cpp index d667a6598..63357d2aa 100644 --- a/source/cPlayerAction.cpp +++ b/source/cPlayerAction.cpp @@ -698,7 +698,8 @@ bool CPIEquipItem::Handle( void ) if( k == ourChar ) { bool canWear = false; - if( i->GetStrength() > k->GetStrength() ) + const SI16 scaledStrength = ( i->GetStrength() * ( 100 - i->GetLowerStatReq() )) / 100; + if( scaledStrength > k->GetStrength() ) { tSock->SysMessage( 1188 ); // You are not strong enough to use that. (NOTE: Should these messages use color 0x096a to stand out and replicate hard coded client message?) } diff --git a/source/items.cpp b/source/items.cpp index 1cd4a2aaf..c2be6ca94 100644 --- a/source/items.cpp +++ b/source/items.cpp @@ -356,6 +356,7 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect case DFNTAG_LAYER: applyTo->SetLayer( static_cast( ndata )); break; case DFNTAG_LIGHT: applyTo->SetWeatherDamage( LIGHT, ndata != 0 ); break; case DFNTAG_LIGHTNING: applyTo->SetWeatherDamage( LIGHTNING, ndata != 0 ); break; + case DFNTAG_LOWERSTATREQ: applyTo->SetLowerStatReq( static_cast( ndata )); break; case DFNTAG_MAXHP: applyTo->SetMaxHP( static_cast( ndata )); break; case DFNTAG_MAXITEMS: applyTo->SetMaxItems( static_cast( ndata )); break; case DFNTAG_MAXRANGE: applyTo->SetMaxRange( static_cast( ndata )); break; @@ -1820,7 +1821,8 @@ void cItem::CheckEquipment( CChar *p ) { if( ValidateObject( i )) { - if( i->GetStrength() > StrengthToCompare )//if strength required > character's strength + const SI16 scaledStrength = ( i->GetStrength() * ( 100 - i->GetLowerStatReq() )) / 100; + if( scaledStrength > StrengthToCompare )//if strength required > character's strength { itemsToUnequip.push_back( i ); } diff --git a/source/ssection.cpp b/source/ssection.cpp index c2a563b47..21fe0b936 100644 --- a/source/ssection.cpp +++ b/source/ssection.cpp @@ -130,6 +130,7 @@ const UI08 dfnDataTypes[DFNTAG_COUNTOFTAGS] = DFN_NUMERIC, // DFNTAG_LAYER, DFN_NUMERIC, // DFNTAG_LIGHT, DFN_NUMERIC, // DFNTAG_LIGHTNING, + DFN_NUMERIC, // DFNTAG_LOWERSTATREQ, DFN_NUMERIC, // DFNTAG_LOCKPICKING, DFN_NUMERIC, // DFNTAG_LODAMAGE, DFN_UPPERSTRING, // DFNTAG_LOOT, @@ -389,6 +390,7 @@ const std::map strToDFNTag {"LAYER"s, DFNTAG_LAYER}, {"LIGHT"s, DFNTAG_LIGHT}, {"LIGHTNING"s, DFNTAG_LIGHTNING}, + {"LOWERSTATREQ"s, DFNTAG_LOWERSTATREQ}, {"LOCKPICKING"s, DFNTAG_LOCKPICKING}, {"LODAMAGE"s, DFNTAG_LODAMAGE}, {"LOOT"s, DFNTAG_LOOT}, diff --git a/source/ssection.h b/source/ssection.h index a2a660aec..f97d60cc0 100644 --- a/source/ssection.h +++ b/source/ssection.h @@ -137,6 +137,7 @@ enum DFNTAGS DFNTAG_LAYER, DFNTAG_LIGHT, DFNTAG_LIGHTNING, + DFNTAG_LOWERSTATREQ, DFNTAG_LOCKPICKING, DFNTAG_LODAMAGE, DFNTAG_LOOT, From fc5556d4d1e8be85651357f261f37bb85aed1480 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:56:24 -0500 Subject: [PATCH 02/84] Update Changelog.txt --- source/Changelog.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/Changelog.txt b/source/Changelog.txt index 35333948e..09cb71bb8 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,5 +1,6 @@ 30/04/2024 - Dragon Slayer/Xuri/Maarc - Added AOS Lower Requirement propertie. + Added AOS Lower Requirement property. + -Lower Requirements - Lowers the strength requirements to wear an object. 27/04/2024 - Dragon Slayer/Xuri Fixed an issue where non-corpse containers - including treasure chests in dungeons - would decay and leave all their contents on the ground. From d3c58c9b1f7adf693978a636f6d5342ebc814b0f Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:58:43 -0500 Subject: [PATCH 03/84] Update Changelog.txt --- source/Changelog.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Changelog.txt b/source/Changelog.txt index 09cb71bb8..0e31e1a75 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,6 +1,6 @@ 30/04/2024 - Dragon Slayer/Xuri/Maarc - Added AOS Lower Requirement property. - -Lower Requirements - Lowers the strength requirements to wear an object. + Added Support for new AOS property tag. + -LOWERSTATREQ - Lowers the strength requirements to wear an object. 27/04/2024 - Dragon Slayer/Xuri Fixed an issue where non-corpse containers - including treasure chests in dungeons - would decay and leave all their contents on the ground. From cf0e117bbd32c52f9f8c04ea423da9d345af9368 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 5 May 2024 13:37:36 -0500 Subject: [PATCH 04/84] Spawner Gump This gives spawners a gump to edit them, You do not have to use it but very nice if your not wanting to mess with a lot of set commands. --- data/dfndata/items/gmmenu/spawners.dfn | 1 + data/js/jse_fileassociations.scp | 1 + data/js/server/misc/spawnergump.js | 248 +++++++++++++++++++++++++ 3 files changed, 250 insertions(+) create mode 100644 data/js/server/misc/spawnergump.js diff --git a/data/dfndata/items/gmmenu/spawners.dfn b/data/dfndata/items/gmmenu/spawners.dfn index 342ebcb4f..46b622016 100644 --- a/data/dfndata/items/gmmenu/spawners.dfn +++ b/data/dfndata/items/gmmenu/spawners.dfn @@ -7,6 +7,7 @@ interval=1 5 visible=1 decay=0 movable=2 +script=2204 } [orcspawn] diff --git a/data/js/jse_fileassociations.scp b/data/js/jse_fileassociations.scp index 2cbb8e3d5..a2fd7630c 100644 --- a/data/js/jse_fileassociations.scp +++ b/data/js/jse_fileassociations.scp @@ -98,6 +98,7 @@ 2201=server/misc/hint_tooltip.js 2202=server/misc/warning_trigger.js 2203=server/misc/charges_left_tooltip.js +2204=server/misc/spawnergump.js // Server Data [2500-2749] 2500=server/data/weapontypes.js diff --git a/data/js/server/misc/spawnergump.js b/data/js/server/misc/spawnergump.js new file mode 100644 index 000000000..83f22e612 --- /dev/null +++ b/data/js/server/misc/spawnergump.js @@ -0,0 +1,248 @@ +function onUseChecked( pUser, iUsed ) +{ + var socket = pUser.socket; + socket.tempObj = iUsed; + var gumpID = 5037 + 0xffff; + + if( socket && iUsed && iUsed.isItem ) + { + socket.CloseGump( gumpID, 0 ); + spawnerGump( socket, pUser, iUsed ); + } + + return false; +} + +function spawnerGump( socket, pUser, iUsed ) +{ + var spawner = new Gump; + var powerState = ""; + var spawnName = ""; + if( iUsed.sectionalist == true ) + { + powerState = "Enabled"; + if( iUsed.type == 61 ) + { + spawnName = "Item List" + } + else + spawnName = "Npc List" + } + else + { + powerState = "Disabled"; + if( iUsed.type == 61 ) + { + spawnName = "Item" + } + else + spawnName = "Npc" + } + + var typeName = ""; + switch( iUsed.type ) + { + case 61: typeName = "Item"; break + case 62: typeName = "Npc"; break + case 125: typeName = "Escort"; break + } + + var amountLabel = ( iUsed.type != 61 ) ? "Amount" : "Spawn Item DFN"; + var applyLabel = "Apply"; + var minLabel = "Min:"; + var maxLabel = "Max:"; + + spawner.AddPage( 0 ); + + spawner.AddBackground( 40, 80, 413, 134, 5054 ); + spawner.AddCheckerTrans( 40, 80, 413, 134 ); + spawner.AddPicture( 50, 100, 7956 ); + + if( iUsed.type != 61 ) + { + spawner.AddHTMLGump( 310, 100, 178, 22, false, false, amountLabel ); + spawner.AddHTMLGump( 90, 100, 203, 22, false, false, "Spawn " + spawnName + " DFN" ); + + spawner.AddHTMLGump( 255, 155, 140, 22, false, false, "Rename" ); + + spawner.AddButton( 50, 180, 4005, 4007, 1, 0, 1 ); + spawner.AddHTMLGump( 90, 180, 140, 22, false, false, applyLabel ); + + spawner.AddHTMLGump( 80, 152, 140, 22, false, false, minLabel ); + spawner.AddHTMLGump( 160, 152, 140, 22, false, false, maxLabel ); + + spawner.AddCheckbox( 130, 180, 2152, 0, 1 ); + spawner.AddHTMLGump( 160, 185, 140, 22, false, false, "Spawnlist: " + powerState + "" ); + spawner.AddCheckbox( 300, 180, 2152, 0, 2 ); + spawner.AddHTMLGump( 330, 185, 140, 22, false, false, "Spawn Type: " + typeName + "" ); + spawner.AddBackground( 80, 120, 201, 28, 5120 ); + spawner.AddBackground( 305, 120, 134, 28, 5120 ); + spawner.AddBackground( 105, 150, 50, 25, 5120 ); + spawner.AddBackground( 190, 150, 50, 25, 5120 ); + spawner.AddBackground(305, 152, 134, 28, 5120); + + spawner.AddText( 90, 125, 0, iUsed.spawnsection ); + spawner.AddText( 315, 125, 0, iUsed.amount ); + spawner.AddText( 110, 155, 0, iUsed.mininterval ); + spawner.AddText( 195, 155, 0, iUsed.maxinterval ); + spawner.AddText(310, 152, 0, iUsed.name); + + spawner.AddTextEntry( 90, 125, 178, 20, 1153, 0, 8, iUsed.spawnsection ); + spawner.AddTextEntry( 315, 125, 115, 20, 1153, 0, 9, iUsed.amount ); + spawner.AddTextEntry( 110, 155, 40, 20, 1153, 0, 10, iUsed.mininterval ); + spawner.AddTextEntry( 195, 155, 40, 20, 1153, 0, 11, iUsed.maxinterval ); + spawner.AddTextEntry(310, 152, 140, 25, 1153, 0, 12, iUsed.name); + } + else + { + spawner.AddHTMLGump( 90, 100, 203, 22, false, false, "Spawn " + spawnName + " DFN" ); + spawner.AddHTMLGump( 255, 155, 140, 22, false, false, "Rename" ); + spawner.AddButton( 50, 180, 4005, 4007, 1, 0, 1 ); + spawner.AddHTMLGump( 90, 180, 140, 22, false, false, applyLabel ); + + spawner.AddHTMLGump( 80, 152, 140, 22, false, false, minLabel ); + spawner.AddHTMLGump( 160, 152, 140, 22, false, false, maxLabel ); + + spawner.AddCheckbox( 130, 180, 2152, 0, 1 ); + spawner.AddHTMLGump( 160, 185, 140, 22, false, false, "Spawnlist: " + powerState + "" ); + spawner.AddCheckbox( 300, 180, 2152, 0, 2 ); + spawner.AddHTMLGump( 330, 185, 140, 22, false, false, "Spawn Type: " + typeName + "" ); + + spawner.AddBackground( 80, 120, 201, 28, 5120 ); + spawner.AddBackground( 105, 150, 50, 25, 5120 ); + spawner.AddBackground( 190, 150, 50, 25, 5120 ); + spawner.AddBackground(305, 152, 134, 28, 5120); + + spawner.AddText( 90, 125, 0, iUsed.spawnsection ); + spawner.AddText( 110, 155, 0, iUsed.mininterval ); + spawner.AddText( 195, 155, 0, iUsed.maxinterval ); + spawner.AddText( 310, 152, 0, iUsed.name ); + + spawner.AddTextEntry( 90, 125, 178, 20, 1153, 0, 11, iUsed.spawnsection ); + spawner.AddTextEntry( 110, 155, 40, 20, 1153, 0, 13, iUsed.maxinterval ); + spawner.AddTextEntry( 195, 155, 40, 20, 1153, 0, 12, iUsed.mininterval ); + spawner.AddTextEntry( 310, 152, 140, 25, 1153, 0, 10, iUsed.name ); + + } + spawner.Send( socket ); + spawner.Free(); +} + +function onGumpPress( socket, pButton, gumpData ) +{ + var pUser = socket.currentChar; + var iUsed = socket.tempObj; + + var spawn = gumpData.getEdit( 0 ); + if( iUsed.type != 61 ) + { + var num = gumpData.getEdit( 1 ); + var min = gumpData.getEdit( 2 ); + var max = gumpData.getEdit( 3 ); + var name = gumpData.getEdit( 4 ); + } + else + { + var min = gumpData.getEdit( 1 ); + var max = gumpData.getEdit( 2 ); + var name = gumpData.getEdit( 3 ); + } + var OtherButton = gumpData.getButton( 0 ); + switch( pButton ) + { + case 0: + break; + case 1: + if( iUsed.type != 61 ) + { + iUsed.spawnsection = spawn; + iUsed.amount = num; + iUsed.mininterval = min; + iUsed.maxinterval = max; + } + else + { + iUsed.spawnsection = spawn; + iUsed.mininterval = min; + iUsed.maxinterval = max; + } + + if( name == null || name == " " ) + { + socket.SysMessage(GetDictionaryEntry(9270, socket.language)); // That name is too short, or no name was entered. + } + else if( name.length > 50 ) + { + pSocket.SysMessage(GetDictionaryEntry(9271, pSocket.language)); // That name is too long. Maximum 50 chars. + } + else + { + iUsed.name = name; + } + + switch( OtherButton ) + { + case 1: + if( iUsed.sectionalist == true ) + { + pUser.SysMessage( "You have disabled the spawn list. You can now add single NPCs." ); + iUsed.sectionalist = false; + } + else + { + pUser.SysMessage( "You have enabled the spawn list. It will now only accept NPC lists." ); + iUsed.sectionalist = true; + } + break; + case 2: + var typeTransitions = { + 61: { nextType: 62, message: "Changed Type to Npc", resetAmount: false }, + 62: { nextType: 125, message: "Changed Type to Escort", resetAmount: false }, + 125: { nextType: 61, message: "Changed Type to Item", resetAmount: true } + }; + + var currentTransition = typeTransitions[iUsed.type]; + if( currentTransition ) + { + iUsed.type = currentTransition.nextType; + if( currentTransition.resetAmount ) + { + iUsed.amount = 0; + } + pUser.SysMessage( currentTransition.message ); + } + break; + } + spawnerGump( socket, pUser, iUsed ); + break; + } +} + +function onTooltip( spawner ) +{ + var typeName = ""; + switch( spawner.type ) + { + case 61: typeName = "Item"; break + case 62: typeName = "Npc"; break + case 125: typeName = "Escort"; break + } + var powerState = ""; + if( spawner.sectionalist == true ) + { + powerState = "Enabled"; + } + else + { + powerState = "Disabled"; + } + + var tooltipText = ""; + tooltipText = "Spawn DFN: " + spawner.spawnsection; + tooltipText += "\n" + "Spawn Type: " + typeName; + tooltipText += "\n" + "Spawn List: " + powerState; + tooltipText += "\n" + "Amount: " + "" + spawner.amount + ""; + tooltipText += "\n" + "Min Interval: " + "" + spawner.mininterval + "" + " Max Interval: " + "" + spawner.maxinterval + ""; + tooltipText += "\n" + "Region: " + "" + spawner.region.name + ""; + return tooltipText; +} \ No newline at end of file From ade31480e36f251d22811705929565fbd5f24356 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 5 May 2024 13:39:58 -0500 Subject: [PATCH 05/84] Update Changelog.txt --- source/Changelog.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/Changelog.txt b/source/Changelog.txt index 1d779c15f..662e7ac84 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,6 @@ +5/05/2024 - Dragon Slayer + Added Spawner Gump and attached to the base_spawner, just another option for making editing spawners without using commands. (js spawnergump) + 27/04/2024 - Dragon Slayer/Xuri Fixed an issue where non-corpse containers - including treasure chests in dungeons - would decay and leave all their contents on the ground. Converted LOOTDECAYSWITHCORPSE ini setting to two new settings, one for player corpses, one for NPC corpses: From 63a0eeca9ea675d801745a624acd16699479efd8 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 5 May 2024 15:50:36 -0500 Subject: [PATCH 06/84] Update Changelog.txt --- source/Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Changelog.txt b/source/Changelog.txt index 662e7ac84..adb63ea9e 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,5 +1,6 @@ 5/05/2024 - Dragon Slayer Added Spawner Gump and attached to the base_spawner, just another option for making editing spawners without using commands. (js spawnergump) + -Just double click any spawner you create from the addmenu or add from spawners.dfn file, gump will appear if you create a spawner with commands you would have to attach the script directly to it. 27/04/2024 - Dragon Slayer/Xuri Fixed an issue where non-corpse containers - including treasure chests in dungeons - would decay and leave all their contents on the ground. From 199ca5ae42e4ac6874e71d1f5c03294a9159440c Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 5 May 2024 17:01:18 -0500 Subject: [PATCH 07/84] Update spawnergump.js --- data/js/server/misc/spawnergump.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/js/server/misc/spawnergump.js b/data/js/server/misc/spawnergump.js index 83f22e612..9174ff9e7 100644 --- a/data/js/server/misc/spawnergump.js +++ b/data/js/server/misc/spawnergump.js @@ -185,12 +185,12 @@ function onGumpPress( socket, pButton, gumpData ) case 1: if( iUsed.sectionalist == true ) { - pUser.SysMessage( "You have disabled the spawn list. You can now add single NPCs." ); + pUser.SysMessage( "You have disabled the spawn list. You can now add single DFN." ); iUsed.sectionalist = false; } else { - pUser.SysMessage( "You have enabled the spawn list. It will now only accept NPC lists." ); + pUser.SysMessage( "You have enabled the spawn list. It will now only accept DFN lists." ); iUsed.sectionalist = true; } break; From 94156fe62d589b08d51cc8b890b6d8dd3e696913 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Thu, 9 May 2024 20:04:33 -0500 Subject: [PATCH 08/84] fixed small detail --- source/cItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/cItem.cpp b/source/cItem.cpp index 4987e294e..816b95a44 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1924,7 +1924,7 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) SetWeatherDamage( LIGHTNING, static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 ); rValue = true; } - if( UTag == "LOWERSTATREQ" ) + else if( UTag == "LOWERSTATREQ" ) { SetLowerStatReq( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); rValue = true; From 18b338bb795644b915db3278197b1fe6eeef6667 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sat, 11 May 2024 20:17:11 -0500 Subject: [PATCH 09/84] Fixed cast --- source/UOXJSPropertyFuncs.cpp | 2 +- source/cItem.cpp | 2 +- source/items.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index 734a6e32f..71b9860ef 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -1322,7 +1322,7 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; - case CIP_LOWERSTATREQ: gPriv->SetLowerStatReq( static_cast( encaps.toInt() )); break; + case CIP_LOWERSTATREQ: gPriv->SetLowerStatReq( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/cItem.cpp b/source/cItem.cpp index 816b95a44..6f8eb1ca4 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1926,7 +1926,7 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) } else if( UTag == "LOWERSTATREQ" ) { - SetLowerStatReq( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); + SetLowerStatReq( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); rValue = true; } break; diff --git a/source/items.cpp b/source/items.cpp index c2be6ca94..6cc3d7664 100644 --- a/source/items.cpp +++ b/source/items.cpp @@ -356,7 +356,7 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect case DFNTAG_LAYER: applyTo->SetLayer( static_cast( ndata )); break; case DFNTAG_LIGHT: applyTo->SetWeatherDamage( LIGHT, ndata != 0 ); break; case DFNTAG_LIGHTNING: applyTo->SetWeatherDamage( LIGHTNING, ndata != 0 ); break; - case DFNTAG_LOWERSTATREQ: applyTo->SetLowerStatReq( static_cast( ndata )); break; + case DFNTAG_LOWERSTATREQ: applyTo->SetLowerStatReq( static_cast( ndata )); break; case DFNTAG_MAXHP: applyTo->SetMaxHP( static_cast( ndata )); break; case DFNTAG_MAXITEMS: applyTo->SetMaxItems( static_cast( ndata )); break; case DFNTAG_MAXRANGE: applyTo->SetMaxRange( static_cast( ndata )); break; From 2cec24c9891ec802e8259fefd4faab4074df993f Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Mon, 13 May 2024 19:01:20 -0500 Subject: [PATCH 10/84] Three New AOS properties --- source/CPacketSend.cpp | 21 ++++++++++++ source/Changelog.txt | 7 ++++ source/UOXJSPropertyEnums.h | 3 ++ source/UOXJSPropertyFuncs.cpp | 6 ++++ source/UOXJSPropertySpecs.h | 3 ++ source/cBaseObject.cpp | 63 +++++++++++++++++++++++++++++++++++ source/cBaseObject.h | 12 +++++++ source/cChar.cpp | 9 +++++ source/cItem.cpp | 21 ++++++++++++ source/items.cpp | 3 ++ source/ssection.cpp | 6 ++++ source/ssection.h | 3 ++ 12 files changed, 157 insertions(+) diff --git a/source/CPacketSend.cpp b/source/CPacketSend.cpp index e1d8ee4ca..dfcf7cd62 100644 --- a/source/CPacketSend.cpp +++ b/source/CPacketSend.cpp @@ -7657,6 +7657,27 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou FinalizeData( tempEntry, totalStringLen ); } + if( cItem.GetBonusHits() > 0 ) + { + tempEntry.stringNum = 1060431; // hit point increase ~1_val~ + tempEntry.ourText = oldstrutil::number( cItem.GetBonusHits() ); + FinalizeData( tempEntry, totalStringLen ); + } + + if( cItem.GetBonusStam() > 0 ) + { + tempEntry.stringNum = 1060484; // stamina increase ~1_val~ + tempEntry.ourText = oldstrutil::number( cItem.GetBonusStam() ); + FinalizeData( tempEntry, totalStringLen ); + } + + if( cItem.GetBonusMana() > 0 ) + { + tempEntry.stringNum = 1060439; // mana increase ~1_val~ + tempEntry.ourText = oldstrutil::number( cItem.GetBonusMana() ); + FinalizeData( tempEntry, totalStringLen ); + } + if( cItem.GetStrength() > 1 ) { tempEntry.stringNum = 1061170; // strength requirement ~1_val~ diff --git a/source/Changelog.txt b/source/Changelog.txt index 1d779c15f..c695610cd 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,10 @@ +13/05/2024 - Dragon Slayer + Added three More AOS Props + -BONUSHITS=# + -BONUSMANA=# + -BONUSSTAM=# + Add this properties to any weapon/armor/jewlery will give the player more hp/mana/stam why its equiped. depending on number you add with it + 27/04/2024 - Dragon Slayer/Xuri Fixed an issue where non-corpse containers - including treasure chests in dungeons - would decay and leave all their contents on the ground. Converted LOOTDECAYSWITHCORPSE ini setting to two new settings, one for player corpses, one for NPC corpses: diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h index af309d496..f7f187903 100644 --- a/source/UOXJSPropertyEnums.h +++ b/source/UOXJSPropertyEnums.h @@ -516,6 +516,9 @@ enum CI_Properties CIP_ISCONTTYPE, CIP_CARVESECTION, CIP_SPEED, + CIP_BONUSHITS, + CIP_BONUSSTAM, + CIP_BONUSMANA, CIP_MULTI, CIP_AMMOID, CIP_AMMOHUE, diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index 3823356f9..a492f112a 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -676,6 +676,9 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN )); break; case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW )); break; case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break; + case CIP_BONUSHITS: *vp = INT_TO_JSVAL( gPriv->GetBonusHits() ); break; + case CIP_BONUSSTAM: *vp = INT_TO_JSVAL( gPriv->GetBonusStam() ); break; + case CIP_BONUSMANA: *vp = INT_TO_JSVAL( gPriv->GetBonusMana() ); break; case CIP_NAME2: tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() ); *vp = STRING_TO_JSVAL( tString ); @@ -1321,6 +1324,9 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; + case CIP_BONUSHITS: gPriv->SetBonusHits( static_cast( encaps.toInt() )); break; + case CIP_BONUSSTAM: gPriv->SetBonusStam( static_cast( encaps.toInt() )); break; + case CIP_BONUSMANA: gPriv->SetBonusMana( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h index 3149dc0ec..c5a8c8039 100644 --- a/source/UOXJSPropertySpecs.h +++ b/source/UOXJSPropertySpecs.h @@ -535,6 +535,9 @@ inline JSPropertySpec CItemProps[] = { "ammoFXHue", CIP_AMMOFXHUE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "ammoFXRender", CIP_AMMOFXRENDER, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "speed", CIP_SPEED, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "bonusHits", CIP_BONUSHITS, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "bonusStam", CIP_BONUSSTAM, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "bonusMana", CIP_BONUSMANA, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "multi", CIP_MULTI, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "maxRange", CIP_MAXRANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "baseRange", CIP_BASERANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 506c247ac..51cbb80ae 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -1631,6 +1631,69 @@ void CBaseObject::SetIntelligence2( SI16 nVal ) } } +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetBonusHits() +//| CBaseObject::SetBonusHits() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the health max var associated with the object. For chars, it's the +//| bonuses (via armour and such) +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetBonusHits( void ) const +{ + return bonusHits; +} +void CBaseObject::SetBonusHits( SI16 nVal ) +{ + bonusHits = nVal; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetBonusStam() +//| CBaseObject::SetBonusStam() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the stamina max var associated with the object. For chars, it's the +//| bonuses (via armour and such) +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetBonusStam( void ) const +{ + return bonusStam; +} +void CBaseObject::SetBonusStam( SI16 nVal ) +{ + bonusStam = nVal; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetBonusMana() +//| CBaseObject::SetBonusMana() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the Mana max var associated with the object. For chars, it's the +//| bonuses (via armour and such) +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetBonusMana( void ) const +{ + return bonusMana; +} +void CBaseObject::SetBonusMana( SI16 nVal ) +{ + bonusMana = nVal; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::IncStrength() //o------------------------------------------------------------------------------------------------o diff --git a/source/cBaseObject.h b/source/cBaseObject.h index 638e826f7..15563feca 100644 --- a/source/cBaseObject.h +++ b/source/cBaseObject.h @@ -79,6 +79,9 @@ class CBaseObject SI16 st2; SI16 dx2; SI16 in2; + SI16 bonusHits; + SI16 bonusStam; + SI16 bonusMana; mutable SI32 FilePosition; SERIAL tempMulti; std::string name; @@ -256,6 +259,15 @@ class CBaseObject void IncDexterity( SI16 toInc = 1 ); void IncIntelligence( SI16 toInc = 1 ); + SI16 GetBonusHits( void ) const; + virtual void SetBonusHits( SI16 nVal ); + + SI16 GetBonusStam( void ) const; + virtual void SetBonusStam( SI16 nVal ); + + SI16 GetBonusMana( void ) const; + virtual void SetBonusMana( SI16 nVal ); + virtual void PostLoadProcessing( void ); virtual bool LoadRemnants( void ) = 0; diff --git a/source/cChar.cpp b/source/cChar.cpp index 7aa03f6fa..6e4d4f6d2 100644 --- a/source/cChar.cpp +++ b/source/cChar.cpp @@ -2920,6 +2920,10 @@ bool CChar::WearItem( CItem *toWear ) IncDexterity2( itemLayers[tLayer]->GetDexterity2() ); IncIntelligence2( itemLayers[tLayer]->GetIntelligence2() ); + SetFixedMaxHP( GetMaxHP() + itemLayers[tLayer]->GetBonusHits()); + SetFixedMaxStam( GetMaxStam() + itemLayers[tLayer]->GetBonusStam()); + SetFixedMaxMana( GetMaxMana() + itemLayers[tLayer]->GetBonusMana()); + if( toWear->IsPostLoaded() ) { if( itemLayers[tLayer]->GetPoisoned() ) @@ -2979,6 +2983,11 @@ bool CChar::TakeOffItem( ItemLayers Layer ) IncStrength2( -itemLayers[Layer]->GetStrength2() ); IncDexterity2( -itemLayers[Layer]->GetDexterity2() ); IncIntelligence2( -itemLayers[Layer]->GetIntelligence2() ); + + SetFixedMaxHP( GetMaxHP() -itemLayers[Layer]->GetBonusHits()); + SetFixedMaxStam( GetMaxStam() -itemLayers[Layer]->GetBonusStam()); + SetFixedMaxMana( GetMaxMana() -itemLayers[Layer]->GetBonusMana()); + if( itemLayers[Layer]->GetPoisoned() ) { if( itemLayers[Layer]->GetPoisoned() > GetPoisoned() ) diff --git a/source/cItem.cpp b/source/cItem.cpp index 3c6523d5d..45850e6f7 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1654,6 +1654,9 @@ auto CItem::CopyData( CItem *target ) -> void target->SetWeightMax( GetWeightMax() ); target->SetBaseWeight( GetBaseWeight() ); target->SetMaxItems( GetMaxItems() ); + target->SetBonusHits( GetBonusHits() ); + target->SetBonusStam( GetBonusStam() ); + target->SetBonusMana( GetBonusMana() ); //target->SetWipeable( IsWipeable() ); target->SetPriv( GetPriv() ); target->SetBaseRange( GetBaseRange() ); @@ -1737,6 +1740,9 @@ bool CItem::DumpBody( std::ostream &outStream ) const outStream << "MaxItems=" + std::to_string( GetMaxItems() ) + newLine; outStream << "MaxHP=" + std::to_string( GetMaxHP() ) + newLine; outStream << "Speed=" + std::to_string( GetSpeed() ) + newLine; + outStream << "BonusHits=" + std::to_string( GetBonusHits() ) + newLine; + outStream << "BonusStam=" + std::to_string( GetBonusStam() ) + newLine; + outStream << "BonusMana=" + std::to_string( GetBonusMana() ) + newLine; outStream << "Movable=" + std::to_string( GetMovable() ) + newLine; outStream << "Priv=" + std::to_string( GetPriv() ) + newLine; outStream << "Value=" + std::to_string( GetBuyValue() ) + "," + std::to_string( GetSellValue() ) + "," + std::to_string( GetVendorPrice() ) + newLine; @@ -1820,6 +1826,21 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) bools = static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )); rValue = true; } + else if( UTag == "BONUSHITS" ) + { + SetBonusHits( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); + rValue = true; + } + else if( UTag == "BONUSSTAM" ) + { + SetBonusStam( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); + rValue = true; + } + else if( UTag == "BONUSMANA" ) + { + SetBonusMana( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); + rValue = true; + } break; case 'C': if( UTag == "CONT" ) diff --git a/source/items.cpp b/source/items.cpp index 1cd4a2aaf..3bb17bb66 100644 --- a/source/items.cpp +++ b/source/items.cpp @@ -139,6 +139,9 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect break; case DFNTAG_AC: applyTo->SetArmourClass( static_cast( ndata )); break; case DFNTAG_BASERANGE: applyTo->SetBaseRange( static_cast( ndata )); break; + case DFNTAG_BONUSHITS: applyTo->SetBonusHits( static_cast( ndata )); break; + case DFNTAG_BONUSSTAM: applyTo->SetBonusStam( static_cast( ndata )); break; + case DFNTAG_BONUSMANA: applyTo->SetBonusMana( static_cast( ndata )); break; case DFNTAG_CREATOR: applyTo->SetCreator( ndata ); break; case DFNTAG_COLOUR: applyTo->SetColour( static_cast( ndata )); break; case DFNTAG_COLOURLIST: applyTo->SetColour( AddRandomColor( cdata )); break; diff --git a/source/ssection.cpp b/source/ssection.cpp index c2a563b47..dbfc8a475 100644 --- a/source/ssection.cpp +++ b/source/ssection.cpp @@ -215,6 +215,9 @@ const UI08 dfnDataTypes[DFNTAG_COUNTOFTAGS] = DFN_STRING, // DFNTAG_SPAWNOBJ, DFN_STRING, // DFNTAG_SPAWNOBJLIST, DFN_NUMERIC, // DFNTAG_SPD, + DFN_NUMERIC, // DFNTAG_BONUSHITS, + DFN_NUMERIC, // DFNTAG_BONUSSTAM, + DFN_NUMERIC, // DFNTAG_BONUSMANA, DFN_STRING, // DFNTAG_SPELLS, DFN_DOUBLENUMERIC, // DFNTAG_SPELLWEAVING, DFN_DOUBLENUMERIC, // DFNTAG_SPIRITSPEAK, @@ -283,6 +286,9 @@ const std::map strToDFNTag {"BLACKSMITHING"s, DFNTAG_BLACKSMITHING}, {"BOWCRAFT"s, DFNTAG_BOWCRAFT}, {"BUSHIDO"s, DFNTAG_BUSHIDO}, + {"BONUSHITS"s, DFNTAG_BONUSHITS}, + {"BONUSSTAM"s, DFNTAG_BONUSSTAM}, + {"BONUSMANA"s, DFNTAG_BONUSMANA}, {"CAMPING"s, DFNTAG_CAMPING}, {"CARPENTRY"s, DFNTAG_CARPENTRY}, {"CARTOGRAPHY"s, DFNTAG_CARTOGRAPHY}, diff --git a/source/ssection.h b/source/ssection.h index a2a660aec..8ffc1edc9 100644 --- a/source/ssection.h +++ b/source/ssection.h @@ -222,6 +222,9 @@ enum DFNTAGS DFNTAG_SPAWNOBJ, DFNTAG_SPAWNOBJLIST, DFNTAG_SPD, + DFNTAG_BONUSHITS, + DFNTAG_BONUSSTAM, + DFNTAG_BONUSMANA, DFNTAG_SPELLS, DFNTAG_SPELLWEAVING, DFNTAG_SPIRITSPEAK, From 230fa75b4131624ddaac382d1550abcf61dbb2d4 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 26 May 2024 00:16:03 -0500 Subject: [PATCH 11/84] Update cItem.cpp --- source/cItem.cpp | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/source/cItem.cpp b/source/cItem.cpp index 45850e6f7..c345ecdc2 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1740,9 +1740,7 @@ bool CItem::DumpBody( std::ostream &outStream ) const outStream << "MaxItems=" + std::to_string( GetMaxItems() ) + newLine; outStream << "MaxHP=" + std::to_string( GetMaxHP() ) + newLine; outStream << "Speed=" + std::to_string( GetSpeed() ) + newLine; - outStream << "BonusHits=" + std::to_string( GetBonusHits() ) + newLine; - outStream << "BonusStam=" + std::to_string( GetBonusStam() ) + newLine; - outStream << "BonusMana=" + std::to_string( GetBonusMana() ) + newLine; + outStream << "BonusStats=" + std::to_string( GetBonusHits() ) + "," + std::to_string( GetBonusStam() ) + "," + std::to_string( GetBonusMana() ) + newLine; outStream << "Movable=" + std::to_string( GetMovable() ) + newLine; outStream << "Priv=" + std::to_string( GetPriv() ) + newLine; outStream << "Value=" + std::to_string( GetBuyValue() ) + "," + std::to_string( GetSellValue() ) + "," + std::to_string( GetVendorPrice() ) + newLine; @@ -1826,20 +1824,12 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) bools = static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )); rValue = true; } - else if( UTag == "BONUSHITS" ) + else if( UTag == "BONUSSTATS" ) { - SetBonusHits( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); - rValue = true; - } - else if( UTag == "BONUSSTAM" ) - { - SetBonusStam( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); - rValue = true; - } - else if( UTag == "BONUSMANA" ) - { - SetBonusMana( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); - rValue = true; + SetBonusHits( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[0], "//" )), nullptr, 0 ))); + SetBonusStam( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[1], "//" )), nullptr, 0 ))); + SetBonusMana( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[2], "//" )), nullptr, 0 ))); + rValue = true; } break; case 'C': From a32f192b1f6d9b3b674b58fff3f2e5ac0fec6f4b Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Mon, 27 May 2024 15:08:23 -0500 Subject: [PATCH 12/84] Fixed the Bonus add ons Now they will not save on world save --- source/cChar.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++------ source/cChar.h | 9 +++++ 2 files changed, 89 insertions(+), 11 deletions(-) diff --git a/source/cChar.cpp b/source/cChar.cpp index 6e4d4f6d2..530053021 100644 --- a/source/cChar.cpp +++ b/source/cChar.cpp @@ -2920,9 +2920,9 @@ bool CChar::WearItem( CItem *toWear ) IncDexterity2( itemLayers[tLayer]->GetDexterity2() ); IncIntelligence2( itemLayers[tLayer]->GetIntelligence2() ); - SetFixedMaxHP( GetMaxHP() + itemLayers[tLayer]->GetBonusHits()); - SetFixedMaxStam( GetMaxStam() + itemLayers[tLayer]->GetBonusStam()); - SetFixedMaxMana( GetMaxMana() + itemLayers[tLayer]->GetBonusMana()); + IncBonusHits( itemLayers[tLayer]->GetBonusHits() ); + IncBonusStam( itemLayers[tLayer]->GetBonusStam() ); + IncBonusMana( itemLayers[tLayer]->GetBonusMana() ); if( toWear->IsPostLoaded() ) { @@ -2984,9 +2984,9 @@ bool CChar::TakeOffItem( ItemLayers Layer ) IncDexterity2( -itemLayers[Layer]->GetDexterity2() ); IncIntelligence2( -itemLayers[Layer]->GetIntelligence2() ); - SetFixedMaxHP( GetMaxHP() -itemLayers[Layer]->GetBonusHits()); - SetFixedMaxStam( GetMaxStam() -itemLayers[Layer]->GetBonusStam()); - SetFixedMaxMana( GetMaxMana() -itemLayers[Layer]->GetBonusMana()); + IncBonusHits( -itemLayers[Layer]->GetBonusHits() ); + IncBonusStam( -itemLayers[Layer]->GetBonusStam() ); + IncBonusMana( -itemLayers[Layer]->GetBonusMana() ); if( itemLayers[Layer]->GetPoisoned() ) { @@ -3796,7 +3796,7 @@ UI16 CChar::GetMaxHP( void ) oldRace = GetRace(); } - return maxHP; + return maxHP + GetBonusHits(); } void CChar::SetMaxHP( UI16 newmaxhp, UI16 newoldstr, RACEID newoldrace ) { @@ -3839,7 +3839,7 @@ void CChar::SetFixedMaxHP( SI16 newmaxhp ) SI16 CChar::GetMaxMana( void ) { if(( maxMana_oldint != GetIntelligence() || oldRace != GetRace() ) && !GetMaxManaFixed() ) - //if int/race changed since last calculation, recalculate maxHp + //if int/race changed since last calculation, recalculate maxMana { CRace *pRace = Races->Race( GetRace() ); @@ -3856,7 +3856,7 @@ SI16 CChar::GetMaxMana( void ) oldRace = GetRace(); } - return maxMana; + return maxMana + GetBonusMana(); } void CChar::SetMaxMana( SI16 newmaxmana, UI16 newoldint, RACEID newoldrace ) { @@ -3898,7 +3898,7 @@ void CChar::SetFixedMaxMana( SI16 newmaxmana ) //o------------------------------------------------------------------------------------------------o SI16 CChar::GetMaxStam( void ) { - // If dex/race changed since last calculation, recalculate maxHp + // If dex/race changed since last calculation, recalculate maxStam if(( maxStam_olddex != GetDexterity() || oldRace != GetRace() ) && !GetMaxStamFixed() ) { CRace *pRace = Races->Race( GetRace() ); @@ -3916,7 +3916,7 @@ SI16 CChar::GetMaxStam( void ) oldRace = GetRace(); } - return maxStam; + return maxStam + GetBonusStam(); } void CChar::SetMaxStam( SI16 newmaxstam, UI16 newolddex, RACEID newoldrace ) { @@ -5602,6 +5602,75 @@ void CChar::SetIntelligence2( SI16 nVal ) UpdateRegion(); } +//o------------------------------------------------------------------------------------------------o +//| Function - CChar::SetBonusHits() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Sets bonus Hits stat for character +//o------------------------------------------------------------------------------------------------o +void CChar::SetBonusHits( SI16 nVal ) +{ + CBaseObject::SetBonusHits( nVal ); + Dirty( UT_HITPOINTS ); + UpdateRegion(); +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CChar::SetBonusStam() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Sets bonus Stam stat for character +//o------------------------------------------------------------------------------------------------o +void CChar::SetBonusStam( SI16 nVal ) +{ + CBaseObject::SetBonusStam( nVal ); + Dirty( UT_STAMINA ); + UpdateRegion(); +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CChar::SetBonusMana() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Sets bonus Mana stat for character +//o------------------------------------------------------------------------------------------------o +void CChar::SetBonusMana( SI16 nVal ) +{ + CBaseObject::SetBonusMana( nVal ); + Dirty( UT_MANA ); + UpdateRegion(); +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CChar::IncBonusHits() +//| Date - 26 May 2024 +//o------------------------------------------------------------------------------------------------o +//| Purpose - Increments GetBonusHits (modifications) by toAdd +//o------------------------------------------------------------------------------------------------o +void CChar::IncBonusHits( SI16 toAdd ) +{ + SetBonusHits( static_cast( GetBonusHits() + toAdd )); +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CChar::IncBonusStam() +//| Date - 26 May 2024 +//o------------------------------------------------------------------------------------------------o +//| Purpose - Increments GetBonusStam (modifications) by toAdd +//o------------------------------------------------------------------------------------------------o +void CChar::IncBonusStam( SI16 toAdd ) +{ + SetBonusStam( static_cast( GetBonusStam() + toAdd )); +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CChar::IncBonusMana() +//| Date - 26 May 2024 +//o------------------------------------------------------------------------------------------------o +//| Purpose - Increments GetBonusMana (modifications) by toAdd +//o------------------------------------------------------------------------------------------------o +void CChar::IncBonusMana( SI16 toAdd ) +{ + SetBonusMana( static_cast( GetBonusMana() + toAdd )); +} + //o------------------------------------------------------------------------------------------------o //| Function - CChar::IncStamina() //o------------------------------------------------------------------------------------------------o diff --git a/source/cChar.h b/source/cChar.h index ed4cc90ba..3156340ff 100644 --- a/source/cChar.h +++ b/source/cChar.h @@ -628,6 +628,15 @@ class CChar : public CBaseObject virtual void SetStrength2( SI16 newValue ) override; virtual void SetDexterity2( SI16 newValue ) override; virtual void SetIntelligence2( SI16 newValue ) override; + + virtual void SetBonusHits( SI16 newValue ) override; + virtual void SetBonusStam( SI16 newValue ) override; + virtual void SetBonusMana( SI16 newValue ) override; + + void IncBonusHits( SI16 toAdd = 1 ); + void IncBonusStam( SI16 toAdd = 1 ); + void IncBonusMana( SI16 toAdd = 1 ); + void IncStamina( SI16 toInc ); void IncMana( SI16 toInc ); void SetMaxLoyalty( UI16 newMaxLoyalty ); From 12d3e6686ae8e4f9dae14143b4b0365ff927db10 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Mon, 27 May 2024 16:58:40 -0500 Subject: [PATCH 13/84] Missing Wand ID's --- data/js/server/data/weapontypes.js | 4 ++++ source/Changelog.txt | 3 +++ source/combat.cpp | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/data/js/server/data/weapontypes.js b/data/js/server/data/weapontypes.js index 42fe15a2b..0a6940e56 100644 --- a/data/js/server/data/weapontypes.js +++ b/data/js/server/data/weapontypes.js @@ -208,6 +208,10 @@ function GetWeaponType( mChar, itemID ) case 0x48B3: //gargish axe - SA weaponType = "TWOHND_AXES"; break; // Default Maces + case 0x0DF2: // Wand + case 0x0DF3: // Wand + case 0x0DF4: // Wand + case 0x0DF5: // Wand case 0x0FB4: //sledge hammer case 0x0FB5: //sledge hammer case 0x0F5C: //mace diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..424b6f5f6 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,6 @@ +27/05/2024 - Dragon Slayer + Added Missing Wand ID's to combat weapon type in core and in js. + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. diff --git a/source/combat.cpp b/source/combat.cpp index 8817d7b3d..b38953b35 100644 --- a/source/combat.cpp +++ b/source/combat.cpp @@ -801,6 +801,10 @@ UI08 CHandleCombat::GetWeaponType( CItem *i ) case 0x48B3: //gargish axe - SA return TWOHND_AXES; // Default Maces + case 0x0DF2: // Wand + case 0x0DF3: // Wand + case 0x0DF4: // Wand + case 0x0DF5: // Wand case 0x13E3: //smith's hammer case 0x13E4: //smith's hammer case 0x13B3: //club From e7c87950800fad4fdd5ec02e67a5a5ac3c845f13 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Wed, 29 May 2024 14:07:29 -0500 Subject: [PATCH 14/84] Fixed House Addons in Homes House add-on deeds are now returned when an add-on is present in the house. --- data/js/server/house/houseCommands.js | 11 ++++++++++- source/Changelog.txt | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/data/js/server/house/houseCommands.js b/data/js/server/house/houseCommands.js index e27bef044..2c7afd3f3 100644 --- a/data/js/server/house/houseCommands.js +++ b/data/js/server/house/houseCommands.js @@ -1522,8 +1522,17 @@ function DemolishHouse( pSocket, iMulti ) iMulti.RemoveTrashCont( itemInHouse ); itemInHouse.Delete(); } - else if( itemInHouse.movable == 2 ) // items placed as part of the house itself like forge/anvil in smithy + else if( itemInHouse.movable == 2 || itemInHouse.GetTag( "deed" )) // items placed as part of the house itself like forge/anvil in smithy or the addon deed { + var addonDeed = itemInHouse.GetTag( "deed" ); + if( addonDeed ) + { + var newDeed = CreateDFNItem( pSocket, pSocket.currentChar, addonDeed, 1, "ITEM", true ); + if( newDeed ) + { + pSocket.SysMessage( GetDictionaryEntry( 1970, pSocket.language )); // A deed for the house add-on has been placed in your backpack. + } + } itemInHouse.Delete(); } else if( itemInHouse.isLockedDown ) diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..43a0869d2 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,6 @@ +29/05/2024 - Dragon Slayer + House add-on deeds are now returned when an add-on is present in the house. + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. From 7735b0ce567b05812a5484657ca64613c02aa994 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Wed, 29 May 2024 14:08:34 -0500 Subject: [PATCH 15/84] Update Changelog.txt --- source/Changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Changelog.txt b/source/Changelog.txt index 43a0869d2..016465bc7 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,5 +1,5 @@ 29/05/2024 - Dragon Slayer - House add-on deeds are now returned when an add-on is present in the house. + House add-on deeds are now returned when an add-on is present in the house on demolish. 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. From f0189f361dcbbc89fba5d2ed619c95ca0a275232 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sat, 8 Jun 2024 20:38:02 -0500 Subject: [PATCH 16/84] Fixed Expansion Settings Fixed Accepting bods, When the expansion is to to lbr or later. --- data/js/npc/ai/vendor_bdo_dispenser.js | 2 +- source/Changelog.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/data/js/npc/ai/vendor_bdo_dispenser.js b/data/js/npc/ai/vendor_bdo_dispenser.js index 0b5739539..9d069ea22 100644 --- a/data/js/npc/ai/vendor_bdo_dispenser.js +++ b/data/js/npc/ai/vendor_bdo_dispenser.js @@ -302,7 +302,7 @@ function onSpeech( myString, pUser, myNPC ) { if( CheckBodTimers( pUser, myNPC.GetTag( "bodType" ) )) { - if( EraStringToNum( GetServerSetting( "CoreShardEra" )) <= EraStringToNum( "lbr" )) + if( EraStringToNum( GetServerSetting( "CoreShardEra" )) >= EraStringToNum( "lbr" )) { myNPC.SetTimer( Timer.MOVETIME, 1000 ); // Pause NPC in their tracks for a second myNPC.TurnToward( pUser ); diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..c8413e9c6 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,6 @@ +6/06/2024 - Dragon Slayer + Fixed Accepting bods, When the expansion is to to lbr or later. + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. From 90c9a5f8354b98ac932d96b11bf7487125fbe49b Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Tue, 11 Jun 2024 23:31:55 -0500 Subject: [PATCH 17/84] Small Fixes to Get Fixed items handling correct target Added Getting the resist on chars --- data/js/commands/targeting/get.js | 36 ++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/data/js/commands/targeting/get.js b/data/js/commands/targeting/get.js index 365d3a2b3..b07305bd5 100644 --- a/data/js/commands/targeting/get.js +++ b/data/js/commands/targeting/get.js @@ -294,30 +294,27 @@ function HandleGetItem( socket, ourItem, uKey ) case "DESC": socket.SysMessage( ourItem.desc ); break; - case "DEF": - socket.SysMessage( ourItem.Resist( 1 )); - break; case "DEF": case "RESISTARMOR": - socket.SysMessage( ourObj.Resist( 1 )); + socket.SysMessage( ourItem.Resist( 1 )); break; case "RESISTLIGHT": - socket.SysMessage( ourObj.Resist( 2 )); + socket.SysMessage( ourItem.Resist( 2 )); break; case "RESISTWATER": - socket.SysMessage( ourObj.Resist( 3 )); + socket.SysMessage( ourItem.Resist( 3 )); break; case "RESISTCOLD": - socket.SysMessage( ourObj.Resist( 4 )); + socket.SysMessage( ourItem.Resist( 4 )); break; case "RESISTFIRE": - socket.SysMessage( ourObj.Resist( 5 )); + socket.SysMessage( ourItem.Resist( 5 )); break; case "RESISTENERGY": - socket.SysMessage( ourObj.Resist( 6 )); + socket.SysMessage( ourItem.Resist( 6 )); break; case "RESISTPOISON": - socket.SysMessage( ourObj.Resist( 7 )); + socket.SysMessage( ourItem.Resist( 7 )); break; case "ARMORCLASS": case "ARMOURCLASS": @@ -598,8 +595,27 @@ function HandleGetChar( socket, ourChar, uKey ) break; case "ARMOUR": case "ARMOR": + case "RESISTARMOR": socket.SysMessage( ourChar.Resist( 1 )); break; + case "RESISTLIGHT": + socket.SysMessage( ourChar.Resist( 2 )); + break; + case "RESISTWATER": + socket.SysMessage( ourChar.Resist( 3 )); + break; + case "RESISTCOLD": + socket.SysMessage( ourChar.Resist( 4 )); + break; + case "RESISTFIRE": + socket.SysMessage( ourChar.Resist( 5 )); + break; + case "RESISTENERGY": + socket.SysMessage( ourChar.Resist( 6 )); + break; + case "RESISTPOISON": + socket.SysMessage( ourChar.Resist( 7 )); + break; case "MAXHP": socket.SysMessage( ourChar.maxhp ); break; From 363ce296c459a21253c67b783fe85e2ef91c2786 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:38:03 -0500 Subject: [PATCH 18/84] Hit/Defense Chance Properties --- source/CPacketSend.cpp | 14 ++++++++ source/UOXJSPropertyEnums.h | 2 ++ source/UOXJSPropertyFuncs.cpp | 4 +++ source/UOXJSPropertySpecs.h | 2 ++ source/cBaseObject.cpp | 62 +++++++++++++++++++++++++++++++++++ source/cBaseObject.h | 11 +++++++ source/cChar.cpp | 7 ++++ source/cItem.cpp | 14 ++++++++ source/combat.cpp | 6 ++-- source/items.cpp | 2 ++ source/ssection.cpp | 4 +++ source/ssection.h | 2 ++ 12 files changed, 127 insertions(+), 3 deletions(-) diff --git a/source/CPacketSend.cpp b/source/CPacketSend.cpp index e1d8ee4ca..04d145b29 100644 --- a/source/CPacketSend.cpp +++ b/source/CPacketSend.cpp @@ -7657,6 +7657,20 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou FinalizeData( tempEntry, totalStringLen ); } + if( cItem.GetHitChance() > 0 ) + { + tempEntry.stringNum = 1060415; // hit chance increase ~1_val~% + tempEntry.ourText = oldstrutil::number( cItem.GetHitChance() ); + FinalizeData( tempEntry, totalStringLen ); + } + + if( cItem.GetDefenseChance() > 0 ) + { + tempEntry.stringNum = 1060408; // defense chance increase ~1_val~% + tempEntry.ourText = oldstrutil::number( cItem.GetDefenseChance() ); + FinalizeData( tempEntry, totalStringLen ); + } + if( cItem.GetStrength() > 1 ) { tempEntry.stringNum = 1061170; // strength requirement ~1_val~ diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h index af309d496..f471df16e 100644 --- a/source/UOXJSPropertyEnums.h +++ b/source/UOXJSPropertyEnums.h @@ -461,6 +461,8 @@ enum CI_Properties CIP_DAMAGEPOISON, CIP_DAMAGERAIN, CIP_DAMAGESNOW, + CIP_HITCHANCE, + CIP_DEFENSECHANCE, CIP_NAME2, CIP_ISITEM, CIP_ISCHAR, diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index 3823356f9..02ff0cbb2 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -676,6 +676,8 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN )); break; case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW )); break; case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break; + case CIP_HITCHANCE: *vp = INT_TO_JSVAL( gPriv->GetHitChance() ); break; + case CIP_DEFENSECHANCE: *vp = INT_TO_JSVAL( gPriv->GetDefenseChance() ); break; case CIP_NAME2: tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() ); *vp = STRING_TO_JSVAL( tString ); @@ -1321,6 +1323,8 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; + case CIP_HITCHANCE: gPriv->SetHitChance( static_cast( encaps.toInt() )); break; + case CIP_DEFENSECHANCE: gPriv->SetDefenseChance( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h index 3149dc0ec..b77c023aa 100644 --- a/source/UOXJSPropertySpecs.h +++ b/source/UOXJSPropertySpecs.h @@ -535,6 +535,8 @@ inline JSPropertySpec CItemProps[] = { "ammoFXHue", CIP_AMMOFXHUE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "ammoFXRender", CIP_AMMOFXRENDER, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "speed", CIP_SPEED, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "hitChance", CIP_HITCHANCE, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "defenseChance", CIP_DEFENSECHANCE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "multi", CIP_MULTI, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "maxRange", CIP_MAXRANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "baseRange", CIP_BASERANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 506c247ac..bfb143b5d 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -1036,6 +1036,48 @@ void CBaseObject::IncHP( SI16 amtToChange ) SetHP( hitpoints + amtToChange ); } +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetHitChance() +//| CBaseObject::SetHitChance() +//| Date - 14 June, 2024 +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the Defense Chance of the Item Equiped +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetHitChance( void ) const +{ + return hitChance; +} +void CBaseObject::SetHitChance( SI16 newValue ) +{ + hitChance = newValue; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetDefenseChance() +//| CBaseObject::SetDefenseChance() +//| Date - 14 June, 2024 +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the Defense Chance of the Item Equiped +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetDefenseChance( void ) const +{ + return defenseChance; +} +void CBaseObject::SetDefenseChance( SI16 newValue ) +{ + defenseChance = newValue; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::GetDir() //| CBaseObject::SetDir() @@ -1661,6 +1703,26 @@ void CBaseObject::IncIntelligence( SI16 toInc ) SetIntelligence( intelligence + toInc ); } +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::IncHitChance() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Increments the object's Hit Chance value +//o------------------------------------------------------------------------------------------------o +void CBaseObject::IncHitChance( SI16 toInc ) +{ + SetHitChance( hitChance + toInc ); +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::IncDefenseChance() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Increments the object's Hit Chance value +//o------------------------------------------------------------------------------------------------o +void CBaseObject::IncDefenseChance( SI16 toInc ) +{ + SetDefenseChance( defenseChance + toInc ); +} + //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::DumpFooter() //o------------------------------------------------------------------------------------------------o diff --git a/source/cBaseObject.h b/source/cBaseObject.h index 638e826f7..4b5c66329 100644 --- a/source/cBaseObject.h +++ b/source/cBaseObject.h @@ -69,6 +69,8 @@ class CBaseObject SI16 dexterity; SI16 intelligence; SI16 hitpoints; + SI16 hitChance; + SI16 defenseChance; VisibleTypes visible; SI16 hiDamage; SI16 loDamage; @@ -223,6 +225,12 @@ class CBaseObject virtual void SetHP( SI16 newValue ); void IncHP( SI16 amtToChange ); + virtual SI16 GetHitChance( void ) const; + virtual void SetHitChance( SI16 newValue ); + + virtual SI16 GetDefenseChance( void ) const; + virtual void SetDefenseChance( SI16 newValue ); + void SetDir( UI08 newDir, bool sendUpdate = true ); UI08 GetDir( void ) const; @@ -256,6 +264,9 @@ class CBaseObject void IncDexterity( SI16 toInc = 1 ); void IncIntelligence( SI16 toInc = 1 ); + void IncHitChance( SI16 toInc = 1 ); + void IncDefenseChance( SI16 toInc = 1 ); + virtual void PostLoadProcessing( void ); virtual bool LoadRemnants( void ) = 0; diff --git a/source/cChar.cpp b/source/cChar.cpp index 7aa03f6fa..6bb36cb56 100644 --- a/source/cChar.cpp +++ b/source/cChar.cpp @@ -2920,6 +2920,9 @@ bool CChar::WearItem( CItem *toWear ) IncDexterity2( itemLayers[tLayer]->GetDexterity2() ); IncIntelligence2( itemLayers[tLayer]->GetIntelligence2() ); + IncHitChance( itemLayers[tLayer]->GetHitChance() ); + IncDefenseChance( itemLayers[tLayer]->GetDefenseChance() ); + if( toWear->IsPostLoaded() ) { if( itemLayers[tLayer]->GetPoisoned() ) @@ -2979,6 +2982,10 @@ bool CChar::TakeOffItem( ItemLayers Layer ) IncStrength2( -itemLayers[Layer]->GetStrength2() ); IncDexterity2( -itemLayers[Layer]->GetDexterity2() ); IncIntelligence2( -itemLayers[Layer]->GetIntelligence2() ); + + IncHitChance( -itemLayers[Layer]->GetHitChance() ); + IncDefenseChance( -itemLayers[Layer]->GetDefenseChance() ); + if( itemLayers[Layer]->GetPoisoned() ) { if( itemLayers[Layer]->GetPoisoned() > GetPoisoned() ) diff --git a/source/cItem.cpp b/source/cItem.cpp index 3c6523d5d..5843cfb86 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1638,6 +1638,8 @@ auto CItem::CopyData( CItem *target ) -> void target->SetRndValueRate( GetRndValueRate() ); target->SetSpawn( GetSpawn() ); target->SetSpeed( GetSpeed() ); + target->SetHitChance( GetHitChance() ); + target->SetDefenseChance( GetDefenseChance() ); target->SetSpell( 0, GetSpell( 0 )); target->SetSpell( 1, GetSpell( 1 )); target->SetSpell( 2, GetSpell( 2 )); @@ -1736,6 +1738,8 @@ bool CItem::DumpBody( std::ostream &outStream ) const outStream << "BaseWeight=" + std::to_string( GetBaseWeight() ) + newLine; outStream << "MaxItems=" + std::to_string( GetMaxItems() ) + newLine; outStream << "MaxHP=" + std::to_string( GetMaxHP() ) + newLine; + outStream << "HitChance=" + std::to_string( GetHitChance() ) + newLine; + outStream << "DefenseChance=" + std::to_string( GetDefenseChance() ) + newLine; outStream << "Speed=" + std::to_string( GetSpeed() ) + newLine; outStream << "Movable=" + std::to_string( GetMovable() ) + newLine; outStream << "Priv=" + std::to_string( GetPriv() ) + newLine; @@ -1859,6 +1863,11 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) SetDye( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 ); rValue = true; } + else if( UTag == "DEFENSECHANCE" ) + { + SetDefenseChance( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); + rValue = true; + } break; case 'E': if( UTag == "ENTRYMADEFROM" ) @@ -1905,6 +1914,11 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) SetWeatherDamage( HEAT, static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 ); rValue = true; } + else if( UTag == "HITCHANCE" ) + { + SetHitChance( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); + rValue = true; + } break; case 'L': if( UTag == "LAYER" ) diff --git a/source/combat.cpp b/source/combat.cpp index 8817d7b3d..066e3e80e 100644 --- a/source/combat.cpp +++ b/source/combat.cpp @@ -2883,9 +2883,9 @@ bool CHandleCombat::HandleCombat( CSocket *mSock, CChar& mChar, CChar *ourTarg ) maxAttHitChanceBonus = 50; } - // Fetch bonuses to hitChance/defenseChance from AoS item properties, when implemented - //attHitChanceBonus = GetAttackerHitChanceBonus(); - //defDefenseChanceBonus = GetDefenderDefenseChanceBonus(); + // Fetch bonuses to hitChance/defenseChance from AoS item properties + attHitChanceBonus = mChar.GetHitChance(); + defDefenseChanceBonus = mChar.GetDefenseChance(); R32 attackerHitChance = ( static_cast( attackSkill / 10 ) + 20 ) * ( 100 + std::min( attHitChanceBonus, static_cast( maxAttHitChanceBonus ))); R32 defenderDefenseChance = ( static_cast( defendSkill / 10 ) + 20 ) * ( 100 + std::min( defDefenseChanceBonus, static_cast( 45 ))); diff --git a/source/items.cpp b/source/items.cpp index 1cd4a2aaf..5c4726c11 100644 --- a/source/items.cpp +++ b/source/items.cpp @@ -229,6 +229,7 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect case DFNTAG_DISPELLABLE: applyTo->SetDispellable( true ); break; case DFNTAG_DISABLED: applyTo->SetDisabled( ndata != 0 ); break; case DFNTAG_DOORFLAG: break; + case DFNTAG_DEFENSECHANCE: applyTo->SetDefenseChance( static_cast( ndata )); break; case DFNTAG_GOOD: applyTo->SetGood( static_cast( ndata )); break; case DFNTAG_GLOW: applyTo->SetGlow( ndata ); break; case DFNTAG_GLOWBC: applyTo->SetGlowColour( static_cast( ndata )); break; @@ -338,6 +339,7 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect } break; case DFNTAG_HIDAMAGE: applyTo->SetHiDamage( static_cast( ndata )); break; + case DFNTAG_HITCHANCE: applyTo->SetHitChance( static_cast( ndata )); break; case DFNTAG_HEAT: applyTo->SetWeatherDamage( HEAT, ndata != 0 ); break; case DFNTAG_ID: // applyTo->SetId( static_cast( ndata )); break; if( ssecs.size() == 1 ) diff --git a/source/ssection.cpp b/source/ssection.cpp index c2a563b47..73bb2e94b 100644 --- a/source/ssection.cpp +++ b/source/ssection.cpp @@ -66,6 +66,7 @@ const UI08 dfnDataTypes[DFNTAG_COUNTOFTAGS] = DFN_NUMERIC, // DFNTAG_DOORFLAG, DFN_NUMERIC, // DFNTAG_DYE, DFN_NUMERIC, // DFNTAG_DYEBEARD, + DFN_NUMERIC, // DFNTAG_DEFENSECHANCE, DFN_NUMERIC, // DFNTAG_DYEHAIR, DFN_STRING, // DFNTAG_ELEMENTRESIST, DFN_STRING, // DFNTAG_ERBONUS, @@ -111,6 +112,7 @@ const UI08 dfnDataTypes[DFNTAG_COUNTOFTAGS] = DFN_NUMERIC, // DFNTAG_HEAT, DFN_DOUBLENUMERIC, // DFNTAG_HERDING, DFN_NUMERIC, // DFNTAG_HIDAMAGE, + DFN_NUMERIC, // DFNTAG_HITCHANCE, DFN_DOUBLENUMERIC, // DFNTAG_HIDING, DFN_NODATA, // DFNTAG_HIRELING, DFN_DOUBLENUMERIC, // DFNTAG_HP, @@ -321,6 +323,7 @@ const std::map strToDFNTag {"DYEABLE"s, DFNTAG_DYE}, {"DYEHAIR"s, DFNTAG_DYEHAIR}, {"DYEBEARD"s, DFNTAG_DYEBEARD}, + {"DEFENSECHANCE"s, DFNTAG_DEFENSECHANCE}, {"ELEMENTRESIST"s, DFNTAG_ELEMENTRESIST}, {"ERBONUS"s, DFNTAG_ERBONUS}, {"EMOTECOLOR"s, DFNTAG_EMOTECOLOUR}, @@ -366,6 +369,7 @@ const std::map strToDFNTag {"HEAT"s, DFNTAG_HEAT}, {"HERDING"s, DFNTAG_HERDING}, {"HIDAMAGE"s, DFNTAG_HIDAMAGE}, + {"HITCHANCE"s, DFNTAG_HITCHANCE}, {"HIDING"s, DFNTAG_HIDING}, {"HIRELING"s, DFNTAG_HIRELING}, {"HP"s, DFNTAG_HP}, diff --git a/source/ssection.h b/source/ssection.h index a2a660aec..beaa359ab 100644 --- a/source/ssection.h +++ b/source/ssection.h @@ -71,6 +71,7 @@ enum DFNTAGS DFNTAG_DISPELLABLE, DFNTAG_DISABLED, DFNTAG_DOORFLAG, + DFNTAG_DEFENSECHANCE, DFNTAG_DYE, DFNTAG_DYEBEARD, DFNTAG_DYEHAIR, @@ -118,6 +119,7 @@ enum DFNTAGS DFNTAG_HEAT, DFNTAG_HERDING, DFNTAG_HIDAMAGE, + DFNTAG_HITCHANCE, DFNTAG_HIDING, DFNTAG_HIRELING, DFNTAG_HP, From 8863f5de2726fbc5e34a1e56f229063a0935c1d1 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:42:36 -0500 Subject: [PATCH 19/84] Changelog --- source/Changelog.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..348b45e14 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,9 @@ +14/06/2024 - Dragon Slayer + Added two new DFN tags for Items: + HITCHANCE=# // Increases the player's chance to hit a target with wrestling, melee and ranged weapons. + DEFENSECHANCE=# // Increases the wearer's chance that his opponents' swings (or arrows/bolts) will miss. + These are also available as JS Engine object properties: .hitChance, .defenseChance + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. From 3e7e8bccb3a378c4220bb9a46664a3aa1d78a5e0 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 01:37:31 -0500 Subject: [PATCH 20/84] Swing Speed Increase --- source/CPacketSend.cpp | 17 ++++++++++++++++- source/SEFunctions.cpp | 3 +++ source/UOXJSPropertyEnums.h | 2 +- source/UOXJSPropertyFuncs.cpp | 2 ++ source/UOXJSPropertySpecs.h | 1 + source/cBaseObject.cpp | 31 +++++++++++++++++++++++++++++++ source/cBaseObject.h | 6 ++++++ source/cChar.cpp | 5 +++++ source/cItem.cpp | 6 ++++++ source/cServerData.cpp | 22 ++++++++++++++++++++-- source/cServerData.h | 4 ++++ source/combat.cpp | 31 ++++++++++++++++++++++++++++--- source/items.cpp | 1 + source/ssection.cpp | 2 ++ source/ssection.h | 1 + 15 files changed, 127 insertions(+), 7 deletions(-) diff --git a/source/CPacketSend.cpp b/source/CPacketSend.cpp index e1d8ee4ca..5dcb5536f 100644 --- a/source/CPacketSend.cpp +++ b/source/CPacketSend.cpp @@ -7544,7 +7544,15 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou if( cItem.GetSpeed() > 0 ) { tempEntry.stringNum = 1061167; // weapon speed ~1_val~ - tempEntry.ourText = oldstrutil::number( cItem.GetSpeed() ); + if( cwmWorldState->ServerData()->ExpansionCoreShardEra() >= ER_ML ) + { + R64 wpnSpeedInSeconds = std::round(( 40000.0 / ( 200 * cItem.GetSpeed() ) * 0.5 ) * 10 ) / 10; + tempEntry.ourText = oldstrutil::format( "%.1fs", wpnSpeedInSeconds ); + } + else + { + tempEntry.ourText = oldstrutil::number( cItem.GetSpeed() ); + } FinalizeData( tempEntry, totalStringLen ); } @@ -7657,6 +7665,13 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou FinalizeData( tempEntry, totalStringLen ); } + if( cItem.GetSwingSpeedIncrease() > 0 ) + { + tempEntry.stringNum = 1060486; // swing speed increase ~1_val~% + tempEntry.ourText = oldstrutil::number( cItem.GetSwingSpeedIncrease() ); + FinalizeData( tempEntry, totalStringLen ); + } + if( cItem.GetStrength() > 1 ) { tempEntry.stringNum = 1061170; // strength requirement ~1_val~ diff --git a/source/SEFunctions.cpp b/source/SEFunctions.cpp index 1700d8e55..6ec92ec01 100644 --- a/source/SEFunctions.cpp +++ b/source/SEFunctions.cpp @@ -5086,6 +5086,9 @@ JSBool SE_GetServerSetting( JSContext *cx, [[maybe_unused]] JSObject *obj, uintN case 349: // LOOTDECAYSWITHPLAYERCORPSE *rval = BOOLEAN_TO_JSVAL( cwmWorldState->ServerData()->NpcCorpseLootDecay() ); break; + case 353: // SWINGSPEEDINCREASECAP + *rval = INT_TO_JSVAL( static_cast( cwmWorldState->ServerData()->SwingSpeedIncreaseCap() )); + break; default: ScriptError( cx, "GetServerSetting: Invalid server setting name provided" ); return false; diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h index af309d496..5e32536e1 100644 --- a/source/UOXJSPropertyEnums.h +++ b/source/UOXJSPropertyEnums.h @@ -533,7 +533,7 @@ enum CI_Properties CIP_ISITEMHELD, CIP_SECTIONID, CIP_STEALABLE, - + CIP_SWINGSPEEDINCREASE, CIP_LOCKDDOWNS, CIP_MAXLOCKDOWNS, CIP_TRASHCONTAINERS, diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index 3823356f9..3a57d8bba 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -675,6 +675,7 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGEPOISON: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( POISON )); break; case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN )); break; case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW )); break; + case CIP_SWINGSPEEDINCREASE: *vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() ); break; case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break; case CIP_NAME2: tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() ); @@ -1321,6 +1322,7 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; + case CIP_SWINGSPEEDINCREASE: gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h index 3149dc0ec..e918979d4 100644 --- a/source/UOXJSPropertySpecs.h +++ b/source/UOXJSPropertySpecs.h @@ -535,6 +535,7 @@ inline JSPropertySpec CItemProps[] = { "ammoFXHue", CIP_AMMOFXHUE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "ammoFXRender", CIP_AMMOFXRENDER, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "speed", CIP_SPEED, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "swingSpeedIncrease", CIP_SWINGSPEEDINCREASE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "multi", CIP_MULTI, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "maxRange", CIP_MAXRANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "baseRange", CIP_BASERANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 506c247ac..19ee8c438 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -1568,6 +1568,27 @@ Point3_st CBaseObject::GetLocation( void ) const return Point3_st( x, y, z ); } +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetSwingSpeedIncrease() +//| CBaseObject::SetSwingSpeedIncrease() +//| Date - 14 June, 2024 +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the swing speed increase of the Item Equiped +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetSwingSpeedIncrease( void ) const +{ + return swingSpeedIncrease; +} +void CBaseObject::SetSwingSpeedIncrease( SI16 newValue ) +{ + swingSpeedIncrease = newValue; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::GetStrength2() //| CBaseObject::SetStrength2() @@ -1661,6 +1682,16 @@ void CBaseObject::IncIntelligence( SI16 toInc ) SetIntelligence( intelligence + toInc ); } +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::IncSwingSpeedIncrease() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Increments the object's swing speed value +//o------------------------------------------------------------------------------------------------o +void CBaseObject::IncSwingSpeedIncrease( SI16 toInc ) +{ + SetSwingSpeedIncrease( swingSpeedIncrease + toInc ); +} + //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::DumpFooter() //o------------------------------------------------------------------------------------------------o diff --git a/source/cBaseObject.h b/source/cBaseObject.h index 638e826f7..e2f8a5377 100644 --- a/source/cBaseObject.h +++ b/source/cBaseObject.h @@ -75,6 +75,7 @@ class CBaseObject SI32 weight; SI16 mana; SI16 stamina; + SI16 swingSpeedIncrease; UI16 scriptTrig; SI16 st2; SI16 dx2; @@ -223,6 +224,11 @@ class CBaseObject virtual void SetHP( SI16 newValue ); void IncHP( SI16 amtToChange ); + virtual SI16 GetSwingSpeedIncrease( void ) const; + virtual void SetSwingSpeedIncrease( SI16 newValue ); + + void IncSwingSpeedIncrease( SI16 toInc = 1 ); + void SetDir( UI08 newDir, bool sendUpdate = true ); UI08 GetDir( void ) const; diff --git a/source/cChar.cpp b/source/cChar.cpp index 7aa03f6fa..182409af1 100644 --- a/source/cChar.cpp +++ b/source/cChar.cpp @@ -2920,6 +2920,8 @@ bool CChar::WearItem( CItem *toWear ) IncDexterity2( itemLayers[tLayer]->GetDexterity2() ); IncIntelligence2( itemLayers[tLayer]->GetIntelligence2() ); + IncSwingSpeedIncrease( itemLayers[tLayer]->GetSwingSpeedIncrease() ); + if( toWear->IsPostLoaded() ) { if( itemLayers[tLayer]->GetPoisoned() ) @@ -2979,6 +2981,9 @@ bool CChar::TakeOffItem( ItemLayers Layer ) IncStrength2( -itemLayers[Layer]->GetStrength2() ); IncDexterity2( -itemLayers[Layer]->GetDexterity2() ); IncIntelligence2( -itemLayers[Layer]->GetIntelligence2() ); + + IncSwingSpeedIncrease( -itemLayers[Layer]->GetSwingSpeedIncrease() ); + if( itemLayers[Layer]->GetPoisoned() ) { if( itemLayers[Layer]->GetPoisoned() > GetPoisoned() ) diff --git a/source/cItem.cpp b/source/cItem.cpp index 3c6523d5d..2bc30a458 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1743,6 +1743,7 @@ bool CItem::DumpBody( std::ostream &outStream ) const outStream << "Restock=" + std::to_string( GetRestock() ) + newLine; outStream << "AC=" + std::to_string( GetArmourClass() ) + newLine; outStream << "Rank=" + std::to_string( GetRank() ) + newLine; + outStream << "SwingSpeedIncrease=" + std::to_string( GetSwingSpeedIncrease() ) + newLine; outStream << "Sk_Made=" + std::to_string( GetMadeWith() ) + newLine; outStream << "Bools=" + std::to_string(( bools.to_ulong() )) + newLine; outStream << "Good=" + std::to_string( GetGood() ) + newLine; @@ -2127,6 +2128,11 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) SetStealable( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); rValue = true; } + else if( UTag == "SWINGSPEEDINCREASE" ) + { + SetSwingSpeedIncrease( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); + rValue = true; + } break; case 'T': if( UTag == "TYPE" ) diff --git a/source/cServerData.cpp b/source/cServerData.cpp index 3f57745a8..178453137 100644 --- a/source/cServerData.cpp +++ b/source/cServerData.cpp @@ -369,7 +369,8 @@ const std::map CServerData::uox3IniCaseValue {"SECRETSHARDKEY"s, 346}, {"MOONGATEFACETS"s, 347}, {"AUTOUNEQUIPPEDCASTING"s, 348}, - {"LOOTDECAYSWITHNPCCORPSE"s, 349} + {"LOOTDECAYSWITHNPCCORPSE"s, 349}, + {"SWINGSPEEDINCREASECAP"s, 353} }; constexpr auto MAX_TRACKINGTARGETS = 128; constexpr auto SKILLTOTALCAP = 7000; @@ -5196,7 +5197,7 @@ auto CServerData::SaveIni( const std::string &filename ) -> bool ofsOutput << "SHOWITEMRESISTSTATS=" << ( ShowItemResistStats() ? 1 : 0 ) << '\n'; ofsOutput << "SHOWWEAPONDAMAGETYPES=" << ( ShowWeaponDamageTypes() ? 1 : 0 ) << '\n'; ofsOutput << "WEAPONDAMAGEBONUSTYPE=" << static_cast( WeaponDamageBonusType() ) << '\n'; - + ofsOutput << "WEAPONSWINGSPEEDINCREASECAP=" << SwingSpeedIncreaseCap() << '\n'; ofsOutput << "}" << '\n'; ofsOutput << '\n' << "[magic]" << '\n' << "{" << '\n'; @@ -5395,6 +5396,20 @@ auto CServerData::TrackingRedisplayTime( UI16 value ) -> void trackingMsgRedisplayTimer = value; } +//o------------------------------------------------------------------------------------------------o +//| Function - CServerData::SwingSpeedIncreaseCap() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the for swing speed cap propertie +//o------------------------------------------------------------------------------------------------o +auto CServerData::SwingSpeedIncreaseCap() const -> SI16 +{ + return swingSpeedIncreaseCap; +} +auto CServerData::SwingSpeedIncreaseCap( SI16 value ) -> void +{ + swingSpeedIncreaseCap = value; +} + //o------------------------------------------------------------------------------------------------o //| Function - CServerData::ParseIni() @@ -6565,6 +6580,9 @@ auto CServerData::HandleLine( const std::string& tag, const std::string& value ) case 349: // LOOTDECAYSWITHNPCCORPSE NpcCorpseLootDecay( static_cast( std::stoul( value, nullptr, 0 )) != 0 ); break; + case 353: // SWINGSPEEDINCREASE + SwingSpeedIncreaseCap( std::stof( value )); + break; default: rValue = false; break; diff --git a/source/cServerData.h b/source/cServerData.h index d770645c8..3abf534e0 100644 --- a/source/cServerData.h +++ b/source/cServerData.h @@ -400,6 +400,7 @@ class CServerData SI16 combatNpcBaseFleeAt; // % of HP where an NPC will flee, if it's not defined for them SI16 combatNpcBaseReattackAt; // % of HP where an NPC will resume attacking SI16 combatAttackStamina; // Amount of stamina lost when hitting an opponent + SI16 swingSpeedIncreaseCap; // The Cap for swing speed property // Start & Location Settings std::vector<__STARTLOCATIONDATA__> startlocations; @@ -953,6 +954,9 @@ class CServerData auto BODsFromCraftedItemsOnly( bool value ) -> void; auto BODsFromCraftedItemsOnly() const -> bool; + auto SwingSpeedIncreaseCap( SI16 value ) -> void; + SI16 SwingSpeedIncreaseCap() const; + auto MaxControlSlots( UI08 value ) -> void; UI08 MaxControlSlots() const; diff --git a/source/combat.cpp b/source/combat.cpp index 8817d7b3d..60430b5a5 100644 --- a/source/combat.cpp +++ b/source/combat.cpp @@ -3429,8 +3429,10 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar ) getDelay = static_cast( static_cast( std::min( statOffset, static_cast( 100 ))) + 100 ); } + SI32 speedBonus = 0; SI32 getOffset = 0; - SI32 baseValue = 15000; + SI32 baseValue = (cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR) ? 15000 : + ((cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_AOS) ? 80000 : 40000); CChar *ourTarg = mChar->GetTarg(); @@ -3455,18 +3457,41 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar ) } } + speedBonus = mChar->GetSwingSpeedIncrease(); + + // Swing Speed Increase Cap per AOS + if ( speedBonus > cwmWorldState->ServerData()->SwingSpeedIncreaseCap() ) + { + speedBonus = cwmWorldState->ServerData()->SwingSpeedIncreaseCap(); + } + //Allow faster strikes on fleeing targets if( ValidateObject( ourTarg )) { if( ourTarg->GetNpcWander() == WT_FLEE || ourTarg->GetNpcWander() == WT_SCARED ) { - baseValue = 10000; + baseValue = cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR ? 10000 : 53333; } } R32 globalAttackSpeed = cwmWorldState->ServerData()->GlobalAttackSpeed(); //Defaults to 1.0 - getDelay = ( baseValue / ( getDelay * getOffset )) / globalAttackSpeed; + if( cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR ) + { + // Weapon swing delay in LBR and earlier + getDelay = baseValue / ( getDelay * getOffset * ( 1 + speedBonus / static_cast( 10 ) )) / globalAttackSpeed; + } + else if( cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_AOS ) + { + // Weapon swing delay in AOS or later + getDelay = ( baseValue / ( getDelay * getOffset * ( 1 + speedBonus / static_cast( 10 ) )) / 4 - 0.5 ) / globalAttackSpeed; + } + else + { + // Weapon swing delay in ML or later + getDelay = ( baseValue / ( getDelay * getOffset * ( 1 + speedBonus / static_cast( 10 ) )) * 0.5 ) / globalAttackSpeed; + } + return getDelay; } diff --git a/source/items.cpp b/source/items.cpp index 1cd4a2aaf..6dc07ae74 100644 --- a/source/items.cpp +++ b/source/items.cpp @@ -548,6 +548,7 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect case DFNTAG_RAIN: applyTo->SetWeatherDamage( RAIN, ndata != 0 ); break; case DFNTAG_SECTIONID: applyTo->SetSectionId( cdata ); break; case DFNTAG_SK_MADE: applyTo->SetMadeWith( static_cast( ndata )); break; + case DFNTAG_SWINGSPEEDINCREASE : applyTo->SetSwingSpeedIncrease( static_cast( ndata )); break; case DFNTAG_SPD: applyTo->SetSpeed( static_cast( ndata )); break; case DFNTAG_STRENGTH: applyTo->SetStrength( static_cast( ndata )); break; case DFNTAG_STRADD: applyTo->SetStrength2( static_cast( ndata )); break; diff --git a/source/ssection.cpp b/source/ssection.cpp index c2a563b47..cbe738b27 100644 --- a/source/ssection.cpp +++ b/source/ssection.cpp @@ -228,6 +228,7 @@ const UI08 dfnDataTypes[DFNTAG_COUNTOFTAGS] = DFN_DOUBLENUMERIC, // DFNTAG_STEALING, DFN_DOUBLENUMERIC, // DFNTAG_STEALTH, DFN_DOUBLENUMERIC, // DFNTAG_SWORDSMANSHIP, + DFN_NUMERIC, // DFNTAG_SWINGSPEEDINCREASE, DFN_DOUBLENUMERIC, // DFNTAG_TACTICS, DFN_DOUBLENUMERIC, // DFNTAG_TAILORING, DFN_DOUBLENUMERIC, // DFNTAG_TAMING, @@ -491,6 +492,7 @@ const std::map strToDFNTag {"STEALING"s, DFNTAG_STEALING}, {"STEALTH"s, DFNTAG_STEALTH}, {"SWORDSMANSHIP"s, DFNTAG_SWORDSMANSHIP}, + {"SWINGSPEEDINCREASE"s, DFNTAG_SWINGSPEEDINCREASE}, {"TACTICS"s, DFNTAG_TACTICS}, {"TAILORING"s, DFNTAG_TAILORING}, {"TAMING"s, DFNTAG_TAMING}, diff --git a/source/ssection.h b/source/ssection.h index a2a660aec..f709d5fc8 100644 --- a/source/ssection.h +++ b/source/ssection.h @@ -221,6 +221,7 @@ enum DFNTAGS DFNTAG_SPATTACK, DFNTAG_SPAWNOBJ, DFNTAG_SPAWNOBJLIST, + DFNTAG_SWINGSPEEDINCREASE, DFNTAG_SPD, DFNTAG_SPELLS, DFNTAG_SPELLWEAVING, From da987195c6f5a18c40de1e6ccf39629aa19a36ed Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 01:42:02 -0500 Subject: [PATCH 21/84] changelog --- source/Changelog.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..df389bf4b 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,10 @@ +16/06/2024 - Dragon Slayer/Xuri + Added new DFN tags for Items: + SWINGSPEEDINCREASE=# // increases the rate at which a character uses his or her melee weapon. The rapidity of a character's attack is affected by the base speed of the weapon used, the amount of Stamina possessed, and the amount of SSI his or her items impart. Barehanded combatants swing at the fastest Weapon Base Speed possible. + These are also available as JS Engine object properties: .swingSpeedIncrease + Added INI Settings: + SWINGSPEEDINCREASECAP=# // Max cap for for swing speed increase a char can have. + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. From 59c2ba633ae38940a67893720ff7aaed94cd9bbe Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:00:40 -0500 Subject: [PATCH 22/84] small format changes --- source/Changelog.txt | 7 +++++-- source/UOXJSPropertyEnums.h | 2 +- source/UOXJSPropertyFuncs.cpp | 4 ++-- source/UOXJSPropertySpecs.h | 2 +- source/items.cpp | 2 +- source/ssection.cpp | 2 +- source/ssection.h | 2 +- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/source/Changelog.txt b/source/Changelog.txt index df389bf4b..a7927a9ec 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,9 +1,12 @@ 16/06/2024 - Dragon Slayer/Xuri Added new DFN tags for Items: - SWINGSPEEDINCREASE=# // increases the rate at which a character uses his or her melee weapon. The rapidity of a character's attack is affected by the base speed of the weapon used, the amount of Stamina possessed, and the amount of SSI his or her items impart. Barehanded combatants swing at the fastest Weapon Base Speed possible. - These are also available as JS Engine object properties: .swingSpeedIncrease + SPEEDINCREASE=# // item property that increases base weapon swing speed by the specified percentage + These are also available as JS Engine object properties: .speedIncrease Added INI Settings: SWINGSPEEDINCREASECAP=# // Max cap for for swing speed increase a char can have. + Combat code updated with era-specific weapon swing speed calculations for different eras (LBR or earlier/AoS/ML onwards). + Note that speeds are still defined with flat values in DFNs regardless of era, but for ML and beyond speed + will be displayed as swing delay in seconds in item tooltip. 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h index 5e32536e1..f18ed8069 100644 --- a/source/UOXJSPropertyEnums.h +++ b/source/UOXJSPropertyEnums.h @@ -516,6 +516,7 @@ enum CI_Properties CIP_ISCONTTYPE, CIP_CARVESECTION, CIP_SPEED, + CIP_SPDINCREASE, CIP_MULTI, CIP_AMMOID, CIP_AMMOHUE, @@ -533,7 +534,6 @@ enum CI_Properties CIP_ISITEMHELD, CIP_SECTIONID, CIP_STEALABLE, - CIP_SWINGSPEEDINCREASE, CIP_LOCKDDOWNS, CIP_MAXLOCKDOWNS, CIP_TRASHCONTAINERS, diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index 3a57d8bba..95c21f73b 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -675,7 +675,7 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGEPOISON: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( POISON )); break; case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN )); break; case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW )); break; - case CIP_SWINGSPEEDINCREASE: *vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() ); break; + case CIP_SPDINCREASE: *vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() ); break; case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break; case CIP_NAME2: tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() ); @@ -1322,7 +1322,7 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; - case CIP_SWINGSPEEDINCREASE: gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() )); break; + case CIP_SPDINCREASE: gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h index e918979d4..d8128f877 100644 --- a/source/UOXJSPropertySpecs.h +++ b/source/UOXJSPropertySpecs.h @@ -535,7 +535,7 @@ inline JSPropertySpec CItemProps[] = { "ammoFXHue", CIP_AMMOFXHUE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "ammoFXRender", CIP_AMMOFXRENDER, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "speed", CIP_SPEED, JSPROP_ENUMANDPERM, nullptr, nullptr }, - { "swingSpeedIncrease", CIP_SWINGSPEEDINCREASE, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "speedIncrease", CIP_SPDINCREASE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "multi", CIP_MULTI, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "maxRange", CIP_MAXRANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "baseRange", CIP_BASERANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, diff --git a/source/items.cpp b/source/items.cpp index 6dc07ae74..c116c984a 100644 --- a/source/items.cpp +++ b/source/items.cpp @@ -548,7 +548,7 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect case DFNTAG_RAIN: applyTo->SetWeatherDamage( RAIN, ndata != 0 ); break; case DFNTAG_SECTIONID: applyTo->SetSectionId( cdata ); break; case DFNTAG_SK_MADE: applyTo->SetMadeWith( static_cast( ndata )); break; - case DFNTAG_SWINGSPEEDINCREASE : applyTo->SetSwingSpeedIncrease( static_cast( ndata )); break; + case DFNTAG_SPDINCREASE : applyTo->SetSwingSpeedIncrease( static_cast( ndata )); break; case DFNTAG_SPD: applyTo->SetSpeed( static_cast( ndata )); break; case DFNTAG_STRENGTH: applyTo->SetStrength( static_cast( ndata )); break; case DFNTAG_STRADD: applyTo->SetStrength2( static_cast( ndata )); break; diff --git a/source/ssection.cpp b/source/ssection.cpp index cbe738b27..9c3834663 100644 --- a/source/ssection.cpp +++ b/source/ssection.cpp @@ -476,6 +476,7 @@ const std::map strToDFNTag {"SPAWNOBJLIST"s, DFNTAG_SPAWNOBJLIST}, {"SPD"s, DFNTAG_SPD}, {"SPEED"s, DFNTAG_SPD}, + {"SPDINCREASE"s, DFNTAG_SPDINCREASE}, {"SPELLS"s, DFNTAG_SPELLS}, {"SPELLWEAVING"s, DFNTAG_SPELLWEAVING}, {"SPIRITSPEAK"s, DFNTAG_SPIRITSPEAK}, @@ -492,7 +493,6 @@ const std::map strToDFNTag {"STEALING"s, DFNTAG_STEALING}, {"STEALTH"s, DFNTAG_STEALTH}, {"SWORDSMANSHIP"s, DFNTAG_SWORDSMANSHIP}, - {"SWINGSPEEDINCREASE"s, DFNTAG_SWINGSPEEDINCREASE}, {"TACTICS"s, DFNTAG_TACTICS}, {"TAILORING"s, DFNTAG_TAILORING}, {"TAMING"s, DFNTAG_TAMING}, diff --git a/source/ssection.h b/source/ssection.h index f709d5fc8..d98927e49 100644 --- a/source/ssection.h +++ b/source/ssection.h @@ -221,7 +221,7 @@ enum DFNTAGS DFNTAG_SPATTACK, DFNTAG_SPAWNOBJ, DFNTAG_SPAWNOBJLIST, - DFNTAG_SWINGSPEEDINCREASE, + DFNTAG_SPDINCREASE, DFNTAG_SPD, DFNTAG_SPELLS, DFNTAG_SPELLWEAVING, From 28a5fd34a3b60038864801394071b3e20bb10d75 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:01:55 -0500 Subject: [PATCH 23/84] Update cBaseObject.cpp --- source/cBaseObject.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 19ee8c438..968938e18 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -1571,7 +1571,6 @@ Point3_st CBaseObject::GetLocation( void ) const //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::GetSwingSpeedIncrease() //| CBaseObject::SetSwingSpeedIncrease() -//| Date - 14 June, 2024 //o------------------------------------------------------------------------------------------------o //| Purpose - Gets/Sets the swing speed increase of the Item Equiped //o------------------------------------------------------------------------------------------------o From 77dcb511a30990b97dd9f08bd981f837d3dac218 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:03:22 -0500 Subject: [PATCH 24/84] Update cBaseObject.cpp --- source/cBaseObject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 968938e18..c4280e2c4 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -1572,7 +1572,7 @@ Point3_st CBaseObject::GetLocation( void ) const //| Function - CBaseObject::GetSwingSpeedIncrease() //| CBaseObject::SetSwingSpeedIncrease() //o------------------------------------------------------------------------------------------------o -//| Purpose - Gets/Sets the swing speed increase of the Item Equiped +//| Purpose - Gets/Sets the weapon swing speed increase in percentage for item //o------------------------------------------------------------------------------------------------o SI16 CBaseObject::GetSwingSpeedIncrease( void ) const { From b63ceaeeb6445e113199dc61d4bbb7367f1fb576 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:04:48 -0500 Subject: [PATCH 25/84] Update cBaseObject.cpp --- source/cBaseObject.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index bfb143b5d..b0e7a538f 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -1039,7 +1039,6 @@ void CBaseObject::IncHP( SI16 amtToChange ) //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::GetHitChance() //| CBaseObject::SetHitChance() -//| Date - 14 June, 2024 //o------------------------------------------------------------------------------------------------o //| Purpose - Gets/Sets the Defense Chance of the Item Equiped //o------------------------------------------------------------------------------------------------o @@ -1060,7 +1059,6 @@ void CBaseObject::SetHitChance( SI16 newValue ) //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::GetDefenseChance() //| CBaseObject::SetDefenseChance() -//| Date - 14 June, 2024 //o------------------------------------------------------------------------------------------------o //| Purpose - Gets/Sets the Defense Chance of the Item Equiped //o------------------------------------------------------------------------------------------------o From 81425cc261acd54604922c9b8bec347f65a5233a Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:14:38 -0500 Subject: [PATCH 26/84] fixed Era --- source/cBaseObject.cpp | 2 +- source/combat.cpp | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index c4280e2c4..1ce12d3e4 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -1572,7 +1572,7 @@ Point3_st CBaseObject::GetLocation( void ) const //| Function - CBaseObject::GetSwingSpeedIncrease() //| CBaseObject::SetSwingSpeedIncrease() //o------------------------------------------------------------------------------------------------o -//| Purpose - Gets/Sets the weapon swing speed increase in percentage for item +//| Purpose - Gets/Sets the item's Swing Speed Increase property (in percentage), which adjusts the base swing speed of the equipped weapon //o------------------------------------------------------------------------------------------------o SI16 CBaseObject::GetSwingSpeedIncrease( void ) const { diff --git a/source/combat.cpp b/source/combat.cpp index 60430b5a5..29049dc28 100644 --- a/source/combat.cpp +++ b/source/combat.cpp @@ -3431,8 +3431,8 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar ) SI32 speedBonus = 0; SI32 getOffset = 0; - SI32 baseValue = (cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR) ? 15000 : - ((cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_AOS) ? 80000 : 40000); + SI32 baseValue = ( cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR ) ? 15000 : + (( cwmWorldState->ServerData()->ExpansionCoreShardEra() < ER_ML ) ? 80000 : 40000 ); CChar *ourTarg = mChar->GetTarg(); @@ -3470,7 +3470,8 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar ) { if( ourTarg->GetNpcWander() == WT_FLEE || ourTarg->GetNpcWander() == WT_SCARED ) { - baseValue = cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR ? 10000 : 53333; + baseValue = ( cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR ) ? 10000 : + (( cwmWorldState->ServerData()->ExpansionCoreShardEra() < ER_ML ) ? 53333 : 26680 ); } } @@ -3481,9 +3482,9 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar ) // Weapon swing delay in LBR and earlier getDelay = baseValue / ( getDelay * getOffset * ( 1 + speedBonus / static_cast( 10 ) )) / globalAttackSpeed; } - else if( cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_AOS ) + else if( cwmWorldState->ServerData()->ExpansionCoreShardEra() < ER_ML ) { - // Weapon swing delay in AOS or later + // Weapon swing delay in SE and earlier getDelay = ( baseValue / ( getDelay * getOffset * ( 1 + speedBonus / static_cast( 10 ) )) / 4 - 0.5 ) / globalAttackSpeed; } else From dba9daedd53ac7318cbce35a232d05a900fd459d Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:25:57 -0500 Subject: [PATCH 27/84] format changes --- source/UOXJSPropertyEnums.h | 2 +- source/UOXJSPropertyFuncs.cpp | 4 ++-- source/UOXJSPropertySpecs.h | 2 +- source/cItem.cpp | 2 +- source/items.cpp | 2 +- source/ssection.cpp | 2 +- source/ssection.h | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h index f18ed8069..ed8bb09f4 100644 --- a/source/UOXJSPropertyEnums.h +++ b/source/UOXJSPropertyEnums.h @@ -516,7 +516,7 @@ enum CI_Properties CIP_ISCONTTYPE, CIP_CARVESECTION, CIP_SPEED, - CIP_SPDINCREASE, + CIP_SPEEDINCREASE , CIP_MULTI, CIP_AMMOID, CIP_AMMOHUE, diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index 95c21f73b..a5fb92713 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -675,7 +675,7 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGEPOISON: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( POISON )); break; case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN )); break; case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW )); break; - case CIP_SPDINCREASE: *vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() ); break; + case CIP_SPEEDINCREASE : *vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() ); break; case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break; case CIP_NAME2: tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() ); @@ -1322,7 +1322,7 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; - case CIP_SPDINCREASE: gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() )); break; + case CIP_SPEEDINCREASE : gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h index d8128f877..710cd317e 100644 --- a/source/UOXJSPropertySpecs.h +++ b/source/UOXJSPropertySpecs.h @@ -535,7 +535,7 @@ inline JSPropertySpec CItemProps[] = { "ammoFXHue", CIP_AMMOFXHUE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "ammoFXRender", CIP_AMMOFXRENDER, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "speed", CIP_SPEED, JSPROP_ENUMANDPERM, nullptr, nullptr }, - { "speedIncrease", CIP_SPDINCREASE, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "speedIncrease", CIP_SPEEDINCREASE , JSPROP_ENUMANDPERM, nullptr, nullptr }, { "multi", CIP_MULTI, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "maxRange", CIP_MAXRANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "baseRange", CIP_BASERANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, diff --git a/source/cItem.cpp b/source/cItem.cpp index 2bc30a458..eacbfa112 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1743,7 +1743,7 @@ bool CItem::DumpBody( std::ostream &outStream ) const outStream << "Restock=" + std::to_string( GetRestock() ) + newLine; outStream << "AC=" + std::to_string( GetArmourClass() ) + newLine; outStream << "Rank=" + std::to_string( GetRank() ) + newLine; - outStream << "SwingSpeedIncrease=" + std::to_string( GetSwingSpeedIncrease() ) + newLine; + outStream << "SpeedIncrease=" + std::to_string( GetSwingSpeedIncrease() ) + newLine; outStream << "Sk_Made=" + std::to_string( GetMadeWith() ) + newLine; outStream << "Bools=" + std::to_string(( bools.to_ulong() )) + newLine; outStream << "Good=" + std::to_string( GetGood() ) + newLine; diff --git a/source/items.cpp b/source/items.cpp index c116c984a..d8f687c7a 100644 --- a/source/items.cpp +++ b/source/items.cpp @@ -548,7 +548,7 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect case DFNTAG_RAIN: applyTo->SetWeatherDamage( RAIN, ndata != 0 ); break; case DFNTAG_SECTIONID: applyTo->SetSectionId( cdata ); break; case DFNTAG_SK_MADE: applyTo->SetMadeWith( static_cast( ndata )); break; - case DFNTAG_SPDINCREASE : applyTo->SetSwingSpeedIncrease( static_cast( ndata )); break; + case DFNTAG_SPEEDINCREASE: applyTo->SetSwingSpeedIncrease( static_cast( ndata )); break; case DFNTAG_SPD: applyTo->SetSpeed( static_cast( ndata )); break; case DFNTAG_STRENGTH: applyTo->SetStrength( static_cast( ndata )); break; case DFNTAG_STRADD: applyTo->SetStrength2( static_cast( ndata )); break; diff --git a/source/ssection.cpp b/source/ssection.cpp index 9c3834663..896203365 100644 --- a/source/ssection.cpp +++ b/source/ssection.cpp @@ -476,7 +476,7 @@ const std::map strToDFNTag {"SPAWNOBJLIST"s, DFNTAG_SPAWNOBJLIST}, {"SPD"s, DFNTAG_SPD}, {"SPEED"s, DFNTAG_SPD}, - {"SPDINCREASE"s, DFNTAG_SPDINCREASE}, + {"SPEEDINCREASE"s, DFNTAG_SPEEDINCREASE}, {"SPELLS"s, DFNTAG_SPELLS}, {"SPELLWEAVING"s, DFNTAG_SPELLWEAVING}, {"SPIRITSPEAK"s, DFNTAG_SPIRITSPEAK}, diff --git a/source/ssection.h b/source/ssection.h index d98927e49..7ac508971 100644 --- a/source/ssection.h +++ b/source/ssection.h @@ -221,7 +221,7 @@ enum DFNTAGS DFNTAG_SPATTACK, DFNTAG_SPAWNOBJ, DFNTAG_SPAWNOBJLIST, - DFNTAG_SPDINCREASE, + DFNTAG_SPEEDINCREASE, DFNTAG_SPD, DFNTAG_SPELLS, DFNTAG_SPELLWEAVING, From ced101feebf28ddebf690c9f94c2efd0daba553a Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:33:09 -0500 Subject: [PATCH 28/84] fixes --- source/UOXJSPropertyFuncs.cpp | 4 ++-- source/combat.cpp | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index a5fb92713..0ba5ed693 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -675,7 +675,7 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGEPOISON: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( POISON )); break; case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN )); break; case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW )); break; - case CIP_SPEEDINCREASE : *vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() ); break; + case CIP_SPEEDINCREASE: *vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() ); break; case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break; case CIP_NAME2: tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() ); @@ -1322,7 +1322,7 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; - case CIP_SPEEDINCREASE : gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() )); break; + case CIP_SPEEDINCREASE: gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/combat.cpp b/source/combat.cpp index 29049dc28..1c0369ec9 100644 --- a/source/combat.cpp +++ b/source/combat.cpp @@ -3429,7 +3429,6 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar ) getDelay = static_cast( static_cast( std::min( statOffset, static_cast( 100 ))) + 100 ); } - SI32 speedBonus = 0; SI32 getOffset = 0; SI32 baseValue = ( cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR ) ? 15000 : (( cwmWorldState->ServerData()->ExpansionCoreShardEra() < ER_ML ) ? 80000 : 40000 ); @@ -3457,7 +3456,7 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar ) } } - speedBonus = mChar->GetSwingSpeedIncrease(); + SI32 speedBonus = mChar->GetSwingSpeedIncrease(); // Swing Speed Increase Cap per AOS if ( speedBonus > cwmWorldState->ServerData()->SwingSpeedIncreaseCap() ) From 1abd8a0826728de5e326a8228bfe5b937fc91ed4 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:38:42 -0500 Subject: [PATCH 29/84] Update cBaseObject.cpp --- source/cBaseObject.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 1ce12d3e4..f0263f163 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -94,6 +94,7 @@ const SI16 DEFBASE_KILLS = 0; const UI16 DEFBASE_RESIST = 0; const bool DEFBASE_NAMEREQUESTACTIVE = 0; const ExpansionRuleset DEFBASE_ORIGIN = ER_UO; +const SI16 DEFBASE_SWINGSPEEDINCREASE = 0; //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject constructor @@ -110,7 +111,8 @@ loDamage( DEFBASE_LODAMAGE ), weight( DEFBASE_WEIGHT ), mana( DEFBASE_MANA ), stamina( DEFBASE_STAMINA ), scriptTrig( DEFBASE_SCPTRIG ), st2( DEFBASE_STR2 ), dx2( DEFBASE_DEX2 ), in2( DEFBASE_INT2 ), FilePosition( DEFBASE_FP ), poisoned( DEFBASE_POISONED ), carve( DEFBASE_CARVE ), oldLocX( 0 ), oldLocY( 0 ), oldLocZ( 0 ), oldTargLocX( 0 ), oldTargLocY( 0 ), -fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ) +fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ), +swingSpeedIncrease( DEFBASE_SWINGSPEEDINCREASE ) { multis = nullptr; tempMulti = INVALIDSERIAL; From f6989ca218146962e9cef0f932fffd0e1d13cd3c Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 02:48:12 -0500 Subject: [PATCH 30/84] Update cBaseObject.cpp --- source/cBaseObject.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index b0e7a538f..9eedebfff 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -94,6 +94,8 @@ const SI16 DEFBASE_KILLS = 0; const UI16 DEFBASE_RESIST = 0; const bool DEFBASE_NAMEREQUESTACTIVE = 0; const ExpansionRuleset DEFBASE_ORIGIN = ER_UO; +const SI16 DEFBASE_HITCHANCE = 0; +const SI16 DEFBASE_DEFENSECHANCE = 0; //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject constructor @@ -110,7 +112,8 @@ loDamage( DEFBASE_LODAMAGE ), weight( DEFBASE_WEIGHT ), mana( DEFBASE_MANA ), stamina( DEFBASE_STAMINA ), scriptTrig( DEFBASE_SCPTRIG ), st2( DEFBASE_STR2 ), dx2( DEFBASE_DEX2 ), in2( DEFBASE_INT2 ), FilePosition( DEFBASE_FP ), poisoned( DEFBASE_POISONED ), carve( DEFBASE_CARVE ), oldLocX( 0 ), oldLocY( 0 ), oldLocZ( 0 ), oldTargLocX( 0 ), oldTargLocY( 0 ), -fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ) +fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ), +hitChance( DEFBASE_HITCHANCE ), defenseChance( DEFBASE_DEFENSECHANCE ) { multis = nullptr; tempMulti = INVALIDSERIAL; From 6e4c88bafea71ad2e5b3d53c44d7d6e2887d36e9 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 11:59:45 -0500 Subject: [PATCH 31/84] Update cBaseObject.cpp --- source/cBaseObject.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 82435c442..f9c8da3cc 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -94,6 +94,7 @@ const SI16 DEFBASE_KILLS = 0; const UI16 DEFBASE_RESIST = 0; const bool DEFBASE_NAMEREQUESTACTIVE = 0; const ExpansionRuleset DEFBASE_ORIGIN = ER_UO; +const SI16 DEFBASE_LOWERSTATREQ = 0; //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject constructor @@ -110,7 +111,8 @@ loDamage( DEFBASE_LODAMAGE ), weight( DEFBASE_WEIGHT ), mana( DEFBASE_MANA ), stamina( DEFBASE_STAMINA ), scriptTrig( DEFBASE_SCPTRIG ), st2( DEFBASE_STR2 ), dx2( DEFBASE_DEX2 ), in2( DEFBASE_INT2 ), FilePosition( DEFBASE_FP ), poisoned( DEFBASE_POISONED ), carve( DEFBASE_CARVE ), oldLocX( 0 ), oldLocY( 0 ), oldLocZ( 0 ), oldTargLocX( 0 ), oldTargLocY( 0 ), -fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ) +fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ), +lowerStatReq( DEFBASE_LOWERSTATREQ ) { multis = nullptr; tempMulti = INVALIDSERIAL; From e514b688a9e91776da581aa98858476f1ec286bb Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 12:00:52 -0500 Subject: [PATCH 32/84] Update cBaseObject.cpp --- source/cBaseObject.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 51cbb80ae..abeb8590f 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -94,6 +94,9 @@ const SI16 DEFBASE_KILLS = 0; const UI16 DEFBASE_RESIST = 0; const bool DEFBASE_NAMEREQUESTACTIVE = 0; const ExpansionRuleset DEFBASE_ORIGIN = ER_UO; +const SI16 DEFBASE_BONUSHEALTH = 0; +const SI16 DEFBASE_BONUSSTAMINA = 0; +const SI16 DEFBASE_BONUSMANA = 0; //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject constructor @@ -110,7 +113,8 @@ loDamage( DEFBASE_LODAMAGE ), weight( DEFBASE_WEIGHT ), mana( DEFBASE_MANA ), stamina( DEFBASE_STAMINA ), scriptTrig( DEFBASE_SCPTRIG ), st2( DEFBASE_STR2 ), dx2( DEFBASE_DEX2 ), in2( DEFBASE_INT2 ), FilePosition( DEFBASE_FP ), poisoned( DEFBASE_POISONED ), carve( DEFBASE_CARVE ), oldLocX( 0 ), oldLocY( 0 ), oldLocZ( 0 ), oldTargLocX( 0 ), oldTargLocY( 0 ), -fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ) +fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ), +bonusHits( DEFBASE_BONUSHEALTH ),bonusStam( DEFBASE_BONUSSTAMINA ), bonusMana( DEFBASE_BONUSMANA ) { multis = nullptr; tempMulti = INVALIDSERIAL; From 2694dbc502d90e85eb5a94009a372c8766b5fa1d Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 18:57:27 -0500 Subject: [PATCH 33/84] Match uox3 Style --- source/CPacketSend.cpp | 12 ++++---- source/UOXJSPropertyEnums.h | 6 ++-- source/UOXJSPropertyFuncs.cpp | 12 ++++---- source/UOXJSPropertySpecs.h | 6 ++-- source/cBaseObject.cpp | 44 +++++++++++++-------------- source/cBaseObject.h | 18 +++++------ source/cChar.cpp | 57 +++++++++++++++++------------------ source/cChar.h | 12 ++++---- source/cItem.cpp | 14 ++++----- source/items.cpp | 6 ++-- source/ssection.cpp | 12 ++++---- source/ssection.h | 6 ++-- 12 files changed, 102 insertions(+), 103 deletions(-) diff --git a/source/CPacketSend.cpp b/source/CPacketSend.cpp index dfcf7cd62..c95dbf5fd 100644 --- a/source/CPacketSend.cpp +++ b/source/CPacketSend.cpp @@ -7657,24 +7657,24 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou FinalizeData( tempEntry, totalStringLen ); } - if( cItem.GetBonusHits() > 0 ) + if( cItem.GetHealthBonus() > 0 ) { tempEntry.stringNum = 1060431; // hit point increase ~1_val~ - tempEntry.ourText = oldstrutil::number( cItem.GetBonusHits() ); + tempEntry.ourText = oldstrutil::number( cItem.GetHealthBonus() ); FinalizeData( tempEntry, totalStringLen ); } - if( cItem.GetBonusStam() > 0 ) + if( cItem.GetStaminaBonus() > 0 ) { tempEntry.stringNum = 1060484; // stamina increase ~1_val~ - tempEntry.ourText = oldstrutil::number( cItem.GetBonusStam() ); + tempEntry.ourText = oldstrutil::number( cItem.GetStaminaBonus() ); FinalizeData( tempEntry, totalStringLen ); } - if( cItem.GetBonusMana() > 0 ) + if( cItem.GetManaBonus() > 0 ) { tempEntry.stringNum = 1060439; // mana increase ~1_val~ - tempEntry.ourText = oldstrutil::number( cItem.GetBonusMana() ); + tempEntry.ourText = oldstrutil::number( cItem.GetManaBonus() ); FinalizeData( tempEntry, totalStringLen ); } diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h index f7f187903..2b4bf3091 100644 --- a/source/UOXJSPropertyEnums.h +++ b/source/UOXJSPropertyEnums.h @@ -516,9 +516,9 @@ enum CI_Properties CIP_ISCONTTYPE, CIP_CARVESECTION, CIP_SPEED, - CIP_BONUSHITS, - CIP_BONUSSTAM, - CIP_BONUSMANA, + CIP_HEALTHBONUS, + CIP_STAMINABONUS, + CIP_MANABONUS, CIP_MULTI, CIP_AMMOID, CIP_AMMOHUE, diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index a492f112a..8771f2688 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -676,9 +676,9 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN )); break; case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW )); break; case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break; - case CIP_BONUSHITS: *vp = INT_TO_JSVAL( gPriv->GetBonusHits() ); break; - case CIP_BONUSSTAM: *vp = INT_TO_JSVAL( gPriv->GetBonusStam() ); break; - case CIP_BONUSMANA: *vp = INT_TO_JSVAL( gPriv->GetBonusMana() ); break; + case CIP_HEALTHBONUS: *vp = INT_TO_JSVAL( gPriv->GetHealthBonus() ); break; + case CIP_STAMINABONUS: *vp = INT_TO_JSVAL( gPriv->GetStaminaBonus() ); break; + case CIP_MANABONUS: *vp = INT_TO_JSVAL( gPriv->GetManaBonus() ); break; case CIP_NAME2: tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() ); *vp = STRING_TO_JSVAL( tString ); @@ -1324,9 +1324,9 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; - case CIP_BONUSHITS: gPriv->SetBonusHits( static_cast( encaps.toInt() )); break; - case CIP_BONUSSTAM: gPriv->SetBonusStam( static_cast( encaps.toInt() )); break; - case CIP_BONUSMANA: gPriv->SetBonusMana( static_cast( encaps.toInt() )); break; + case CIP_HEALTHBONUS: gPriv->SetHealthBonus( static_cast( encaps.toInt() )); break; + case CIP_STAMINABONUS: gPriv->SetStaminaBonus( static_cast( encaps.toInt() )); break; + case CIP_MANABONUS: gPriv->SetManaBonus( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h index c5a8c8039..8b33d4bc8 100644 --- a/source/UOXJSPropertySpecs.h +++ b/source/UOXJSPropertySpecs.h @@ -535,9 +535,9 @@ inline JSPropertySpec CItemProps[] = { "ammoFXHue", CIP_AMMOFXHUE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "ammoFXRender", CIP_AMMOFXRENDER, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "speed", CIP_SPEED, JSPROP_ENUMANDPERM, nullptr, nullptr }, - { "bonusHits", CIP_BONUSHITS, JSPROP_ENUMANDPERM, nullptr, nullptr }, - { "bonusStam", CIP_BONUSSTAM, JSPROP_ENUMANDPERM, nullptr, nullptr }, - { "bonusMana", CIP_BONUSMANA, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "healthBonus", CIP_HEALTHBONUS, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "staminaBonus", CIP_STAMINABONUS, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "manaBonus", CIP_MANABONUS, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "multi", CIP_MULTI, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "maxRange", CIP_MAXRANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "baseRange", CIP_BASERANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index abeb8590f..131f0417b 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -94,9 +94,9 @@ const SI16 DEFBASE_KILLS = 0; const UI16 DEFBASE_RESIST = 0; const bool DEFBASE_NAMEREQUESTACTIVE = 0; const ExpansionRuleset DEFBASE_ORIGIN = ER_UO; -const SI16 DEFBASE_BONUSHEALTH = 0; -const SI16 DEFBASE_BONUSSTAMINA = 0; -const SI16 DEFBASE_BONUSMANA = 0; +const SI16 DEFBASE_HEALTHBONUS = 0; +const SI16 DEFBASE_STAMINABONOS = 0; +const SI16 DEFBASE_MANABONUS = 0; //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject constructor @@ -114,7 +114,7 @@ mana( DEFBASE_MANA ), stamina( DEFBASE_STAMINA ), scriptTrig( DEFBASE_SCPTRIG ), in2( DEFBASE_INT2 ), FilePosition( DEFBASE_FP ), poisoned( DEFBASE_POISONED ), carve( DEFBASE_CARVE ), oldLocX( 0 ), oldLocY( 0 ), oldLocZ( 0 ), oldTargLocX( 0 ), oldTargLocY( 0 ), fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ), -bonusHits( DEFBASE_BONUSHEALTH ),bonusStam( DEFBASE_BONUSSTAMINA ), bonusMana( DEFBASE_BONUSMANA ) +healthBonus( DEFBASE_HEALTHBONUS ),staminaBonus( DEFBASE_STAMINABONOS ), manaBonus( DEFBASE_MANABONUS ) { multis = nullptr; tempMulti = INVALIDSERIAL; @@ -1636,19 +1636,19 @@ void CBaseObject::SetIntelligence2( SI16 nVal ) } //o------------------------------------------------------------------------------------------------o -//| Function - CBaseObject::GetBonusHits() -//| CBaseObject::SetBonusHits() +//| Function - CBaseObject::GetHealthBonus() +//| CBaseObject::SetHealthBonus() //o------------------------------------------------------------------------------------------------o //| Purpose - Gets/Sets the health max var associated with the object. For chars, it's the //| bonuses (via armour and such) //o------------------------------------------------------------------------------------------------o -SI16 CBaseObject::GetBonusHits( void ) const +SI16 CBaseObject::GetHealthBonus( void ) const { - return bonusHits; + return healthBonus; } -void CBaseObject::SetBonusHits( SI16 nVal ) +void CBaseObject::SetHealthBonus( SI16 nVal ) { - bonusHits = nVal; + healthBonus = nVal; if( CanBeObjType( OT_ITEM )) { @@ -1657,19 +1657,19 @@ void CBaseObject::SetBonusHits( SI16 nVal ) } //o------------------------------------------------------------------------------------------------o -//| Function - CBaseObject::GetBonusStam() -//| CBaseObject::SetBonusStam() +//| Function - CBaseObject::GetStaminaBonus() +//| CBaseObject::SetStaminaBonus() //o------------------------------------------------------------------------------------------------o //| Purpose - Gets/Sets the stamina max var associated with the object. For chars, it's the //| bonuses (via armour and such) //o------------------------------------------------------------------------------------------------o -SI16 CBaseObject::GetBonusStam( void ) const +SI16 CBaseObject::GetStaminaBonus( void ) const { - return bonusStam; + return staminaBonus; } -void CBaseObject::SetBonusStam( SI16 nVal ) +void CBaseObject::SetStaminaBonus( SI16 nVal ) { - bonusStam = nVal; + staminaBonus = nVal; if( CanBeObjType( OT_ITEM )) { @@ -1678,19 +1678,19 @@ void CBaseObject::SetBonusStam( SI16 nVal ) } //o------------------------------------------------------------------------------------------------o -//| Function - CBaseObject::GetBonusMana() -//| CBaseObject::SetBonusMana() +//| Function - CBaseObject::GetManaBonus() +//| CBaseObject::SetManaBonus() //o------------------------------------------------------------------------------------------------o //| Purpose - Gets/Sets the Mana max var associated with the object. For chars, it's the //| bonuses (via armour and such) //o------------------------------------------------------------------------------------------------o -SI16 CBaseObject::GetBonusMana( void ) const +SI16 CBaseObject::GetManaBonus( void ) const { - return bonusMana; + return manaBonus; } -void CBaseObject::SetBonusMana( SI16 nVal ) +void CBaseObject::SetManaBonus( SI16 nVal ) { - bonusMana = nVal; + manaBonus = nVal; if( CanBeObjType( OT_ITEM )) { diff --git a/source/cBaseObject.h b/source/cBaseObject.h index 15563feca..b3c7e98f9 100644 --- a/source/cBaseObject.h +++ b/source/cBaseObject.h @@ -79,9 +79,9 @@ class CBaseObject SI16 st2; SI16 dx2; SI16 in2; - SI16 bonusHits; - SI16 bonusStam; - SI16 bonusMana; + SI16 healthBonus; + SI16 staminaBonus; + SI16 manaBonus; mutable SI32 FilePosition; SERIAL tempMulti; std::string name; @@ -259,14 +259,14 @@ class CBaseObject void IncDexterity( SI16 toInc = 1 ); void IncIntelligence( SI16 toInc = 1 ); - SI16 GetBonusHits( void ) const; - virtual void SetBonusHits( SI16 nVal ); + SI16 GetHealthBonus( void ) const; + virtual void SetHealthBonus( SI16 nVal ); - SI16 GetBonusStam( void ) const; - virtual void SetBonusStam( SI16 nVal ); + SI16 GetStaminaBonus( void ) const; + virtual void SetStaminaBonus( SI16 nVal ); - SI16 GetBonusMana( void ) const; - virtual void SetBonusMana( SI16 nVal ); + SI16 GetManaBonus( void ) const; + virtual void SetManaBonus( SI16 nVal ); virtual void PostLoadProcessing( void ); virtual bool LoadRemnants( void ) = 0; diff --git a/source/cChar.cpp b/source/cChar.cpp index 530053021..bcd9e90f6 100644 --- a/source/cChar.cpp +++ b/source/cChar.cpp @@ -2920,9 +2920,9 @@ bool CChar::WearItem( CItem *toWear ) IncDexterity2( itemLayers[tLayer]->GetDexterity2() ); IncIntelligence2( itemLayers[tLayer]->GetIntelligence2() ); - IncBonusHits( itemLayers[tLayer]->GetBonusHits() ); - IncBonusStam( itemLayers[tLayer]->GetBonusStam() ); - IncBonusMana( itemLayers[tLayer]->GetBonusMana() ); + IncHealthBonus( itemLayers[tLayer]->GetHealthBonus() ); + IncStaminaBonus( itemLayers[tLayer]->GetStaminaBonus() ); + IncManaBonus( itemLayers[tLayer]->GetManaBonus() ); if( toWear->IsPostLoaded() ) { @@ -2984,9 +2984,9 @@ bool CChar::TakeOffItem( ItemLayers Layer ) IncDexterity2( -itemLayers[Layer]->GetDexterity2() ); IncIntelligence2( -itemLayers[Layer]->GetIntelligence2() ); - IncBonusHits( -itemLayers[Layer]->GetBonusHits() ); - IncBonusStam( -itemLayers[Layer]->GetBonusStam() ); - IncBonusMana( -itemLayers[Layer]->GetBonusMana() ); + IncHealthBonus( -itemLayers[Layer]->GetHealthBonus() ); + IncStaminaBonus( -itemLayers[Layer]->GetStaminaBonus() ); + IncManaBonus( -itemLayers[Layer]->GetManaBonus() ); if( itemLayers[Layer]->GetPoisoned() ) { @@ -3796,7 +3796,7 @@ UI16 CChar::GetMaxHP( void ) oldRace = GetRace(); } - return maxHP + GetBonusHits(); + return maxHP + GetHealthBonus(); } void CChar::SetMaxHP( UI16 newmaxhp, UI16 newoldstr, RACEID newoldrace ) { @@ -3856,7 +3856,7 @@ SI16 CChar::GetMaxMana( void ) oldRace = GetRace(); } - return maxMana + GetBonusMana(); + return maxMana + GetManaBonus(); } void CChar::SetMaxMana( SI16 newmaxmana, UI16 newoldint, RACEID newoldrace ) { @@ -3916,7 +3916,7 @@ SI16 CChar::GetMaxStam( void ) oldRace = GetRace(); } - return maxStam + GetBonusStam(); + return maxStam + GetStaminaBonus(); } void CChar::SetMaxStam( SI16 newmaxstam, UI16 newolddex, RACEID newoldrace ) { @@ -5603,72 +5603,71 @@ void CChar::SetIntelligence2( SI16 nVal ) } //o------------------------------------------------------------------------------------------------o -//| Function - CChar::SetBonusHits() +//| Function - CChar::SetHealthBonus() //o------------------------------------------------------------------------------------------------o //| Purpose - Sets bonus Hits stat for character //o------------------------------------------------------------------------------------------------o -void CChar::SetBonusHits( SI16 nVal ) +void CChar::SetHealthBonus( SI16 nVal ) { - CBaseObject::SetBonusHits( nVal ); + CBaseObject::SetHealthBonus( nVal ); Dirty( UT_HITPOINTS ); UpdateRegion(); } //o------------------------------------------------------------------------------------------------o -//| Function - CChar::SetBonusStam() +//| Function - CChar::SetStaminaBonus() //o------------------------------------------------------------------------------------------------o //| Purpose - Sets bonus Stam stat for character //o------------------------------------------------------------------------------------------------o -void CChar::SetBonusStam( SI16 nVal ) +void CChar::SetStaminaBonus( SI16 nVal ) { - CBaseObject::SetBonusStam( nVal ); + CBaseObject::SetStaminaBonus( nVal ); Dirty( UT_STAMINA ); UpdateRegion(); } //o------------------------------------------------------------------------------------------------o -//| Function - CChar::SetBonusMana() +//| Function - CChar::SetManaBonus() //o------------------------------------------------------------------------------------------------o //| Purpose - Sets bonus Mana stat for character //o------------------------------------------------------------------------------------------------o -void CChar::SetBonusMana( SI16 nVal ) +void CChar::SetManaBonus( SI16 nVal ) { - CBaseObject::SetBonusMana( nVal ); + CBaseObject::SetManaBonus( nVal ); Dirty( UT_MANA ); UpdateRegion(); } //o------------------------------------------------------------------------------------------------o -//| Function - CChar::IncBonusHits() -//| Date - 26 May 2024 +//| Function - CChar::IncHealthBonus() //o------------------------------------------------------------------------------------------------o -//| Purpose - Increments GetBonusHits (modifications) by toAdd +//| Purpose - Increments GetHealthBonus (modifications) by toAdd //o------------------------------------------------------------------------------------------------o -void CChar::IncBonusHits( SI16 toAdd ) +void CChar::IncHealthBonus( SI16 toAdd ) { - SetBonusHits( static_cast( GetBonusHits() + toAdd )); + SetHealthBonus( static_cast( GetHealthBonus() + toAdd )); } //o------------------------------------------------------------------------------------------------o -//| Function - CChar::IncBonusStam() +//| Function - CChar::IncStaminaBonus() //| Date - 26 May 2024 //o------------------------------------------------------------------------------------------------o //| Purpose - Increments GetBonusStam (modifications) by toAdd //o------------------------------------------------------------------------------------------------o -void CChar::IncBonusStam( SI16 toAdd ) +void CChar::IncStaminaBonus( SI16 toAdd ) { - SetBonusStam( static_cast( GetBonusStam() + toAdd )); + SetStaminaBonus( static_cast( GetStaminaBonus() + toAdd )); } //o------------------------------------------------------------------------------------------------o -//| Function - CChar::IncBonusMana() +//| Function - CChar::IncManaBonus() //| Date - 26 May 2024 //o------------------------------------------------------------------------------------------------o //| Purpose - Increments GetBonusMana (modifications) by toAdd //o------------------------------------------------------------------------------------------------o -void CChar::IncBonusMana( SI16 toAdd ) +void CChar::IncManaBonus( SI16 toAdd ) { - SetBonusMana( static_cast( GetBonusMana() + toAdd )); + SetManaBonus( static_cast( GetManaBonus() + toAdd )); } //o------------------------------------------------------------------------------------------------o diff --git a/source/cChar.h b/source/cChar.h index 3156340ff..ae387a58c 100644 --- a/source/cChar.h +++ b/source/cChar.h @@ -629,13 +629,13 @@ class CChar : public CBaseObject virtual void SetDexterity2( SI16 newValue ) override; virtual void SetIntelligence2( SI16 newValue ) override; - virtual void SetBonusHits( SI16 newValue ) override; - virtual void SetBonusStam( SI16 newValue ) override; - virtual void SetBonusMana( SI16 newValue ) override; + virtual void SetHealthBonus( SI16 newValue ) override; + virtual void SetStaminaBonus( SI16 newValue ) override; + virtual void SetManaBonus( SI16 newValue ) override; - void IncBonusHits( SI16 toAdd = 1 ); - void IncBonusStam( SI16 toAdd = 1 ); - void IncBonusMana( SI16 toAdd = 1 ); + void IncHealthBonus( SI16 toAdd = 1 ); + void IncStaminaBonus( SI16 toAdd = 1 ); + void IncManaBonus( SI16 toAdd = 1 ); void IncStamina( SI16 toInc ); void IncMana( SI16 toInc ); diff --git a/source/cItem.cpp b/source/cItem.cpp index c345ecdc2..e19ff45d1 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1654,9 +1654,9 @@ auto CItem::CopyData( CItem *target ) -> void target->SetWeightMax( GetWeightMax() ); target->SetBaseWeight( GetBaseWeight() ); target->SetMaxItems( GetMaxItems() ); - target->SetBonusHits( GetBonusHits() ); - target->SetBonusStam( GetBonusStam() ); - target->SetBonusMana( GetBonusMana() ); + target->SetHealthBonus( GetHealthBonus() ); + target->SetStaminaBonus( GetStaminaBonus() ); + target->SetManaBonus( GetManaBonus() ); //target->SetWipeable( IsWipeable() ); target->SetPriv( GetPriv() ); target->SetBaseRange( GetBaseRange() ); @@ -1740,7 +1740,7 @@ bool CItem::DumpBody( std::ostream &outStream ) const outStream << "MaxItems=" + std::to_string( GetMaxItems() ) + newLine; outStream << "MaxHP=" + std::to_string( GetMaxHP() ) + newLine; outStream << "Speed=" + std::to_string( GetSpeed() ) + newLine; - outStream << "BonusStats=" + std::to_string( GetBonusHits() ) + "," + std::to_string( GetBonusStam() ) + "," + std::to_string( GetBonusMana() ) + newLine; + outStream << "BonusStats=" + std::to_string( GetHealthBonus() ) + "," + std::to_string( GetStaminaBonus() ) + "," + std::to_string( GetManaBonus() ) + newLine; outStream << "Movable=" + std::to_string( GetMovable() ) + newLine; outStream << "Priv=" + std::to_string( GetPriv() ) + newLine; outStream << "Value=" + std::to_string( GetBuyValue() ) + "," + std::to_string( GetSellValue() ) + "," + std::to_string( GetVendorPrice() ) + newLine; @@ -1826,9 +1826,9 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) } else if( UTag == "BONUSSTATS" ) { - SetBonusHits( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[0], "//" )), nullptr, 0 ))); - SetBonusStam( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[1], "//" )), nullptr, 0 ))); - SetBonusMana( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[2], "//" )), nullptr, 0 ))); + SetHealthBonus( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[0], "//" )), nullptr, 0 ))); + SetStaminaBonus( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[1], "//" )), nullptr, 0 ))); + SetManaBonus( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[2], "//" )), nullptr, 0 ))); rValue = true; } break; diff --git a/source/items.cpp b/source/items.cpp index 3bb17bb66..60c6468b7 100644 --- a/source/items.cpp +++ b/source/items.cpp @@ -139,9 +139,9 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect break; case DFNTAG_AC: applyTo->SetArmourClass( static_cast( ndata )); break; case DFNTAG_BASERANGE: applyTo->SetBaseRange( static_cast( ndata )); break; - case DFNTAG_BONUSHITS: applyTo->SetBonusHits( static_cast( ndata )); break; - case DFNTAG_BONUSSTAM: applyTo->SetBonusStam( static_cast( ndata )); break; - case DFNTAG_BONUSMANA: applyTo->SetBonusMana( static_cast( ndata )); break; + case DFNTAG_HEALTHBONUS: applyTo->SetHealthBonus( static_cast( ndata )); break; + case DFNTAG_STAMINABONUS: applyTo->SetStaminaBonus( static_cast( ndata )); break; + case DFNTAG_MANABONUS: applyTo->SetManaBonus( static_cast( ndata )); break; case DFNTAG_CREATOR: applyTo->SetCreator( ndata ); break; case DFNTAG_COLOUR: applyTo->SetColour( static_cast( ndata )); break; case DFNTAG_COLOURLIST: applyTo->SetColour( AddRandomColor( cdata )); break; diff --git a/source/ssection.cpp b/source/ssection.cpp index dbfc8a475..52f73da5d 100644 --- a/source/ssection.cpp +++ b/source/ssection.cpp @@ -215,9 +215,9 @@ const UI08 dfnDataTypes[DFNTAG_COUNTOFTAGS] = DFN_STRING, // DFNTAG_SPAWNOBJ, DFN_STRING, // DFNTAG_SPAWNOBJLIST, DFN_NUMERIC, // DFNTAG_SPD, - DFN_NUMERIC, // DFNTAG_BONUSHITS, - DFN_NUMERIC, // DFNTAG_BONUSSTAM, - DFN_NUMERIC, // DFNTAG_BONUSMANA, + DFN_NUMERIC, // DFNTAG_HEALTHBONUS, + DFN_NUMERIC, // DFNTAG_STAMINABONUS, + DFN_NUMERIC, // DFNTAG_MANABONUS, DFN_STRING, // DFNTAG_SPELLS, DFN_DOUBLENUMERIC, // DFNTAG_SPELLWEAVING, DFN_DOUBLENUMERIC, // DFNTAG_SPIRITSPEAK, @@ -286,9 +286,9 @@ const std::map strToDFNTag {"BLACKSMITHING"s, DFNTAG_BLACKSMITHING}, {"BOWCRAFT"s, DFNTAG_BOWCRAFT}, {"BUSHIDO"s, DFNTAG_BUSHIDO}, - {"BONUSHITS"s, DFNTAG_BONUSHITS}, - {"BONUSSTAM"s, DFNTAG_BONUSSTAM}, - {"BONUSMANA"s, DFNTAG_BONUSMANA}, + {"HEALTHBONUS"s, DFNTAG_HEALTHBONUS}, + {"STAMINABONUS"s, DFNTAG_STAMINABONUS}, + {"MANABONUS"s, DFNTAG_MANABONUS}, {"CAMPING"s, DFNTAG_CAMPING}, {"CARPENTRY"s, DFNTAG_CARPENTRY}, {"CARTOGRAPHY"s, DFNTAG_CARTOGRAPHY}, diff --git a/source/ssection.h b/source/ssection.h index 8ffc1edc9..ca227c23b 100644 --- a/source/ssection.h +++ b/source/ssection.h @@ -222,9 +222,9 @@ enum DFNTAGS DFNTAG_SPAWNOBJ, DFNTAG_SPAWNOBJLIST, DFNTAG_SPD, - DFNTAG_BONUSHITS, - DFNTAG_BONUSSTAM, - DFNTAG_BONUSMANA, + DFNTAG_HEALTHBONUS, + DFNTAG_STAMINABONUS, + DFNTAG_MANABONUS, DFNTAG_SPELLS, DFNTAG_SPELLWEAVING, DFNTAG_SPIRITSPEAK, From 7c101e668290939e1fe3956163b02b1c16934c47 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 18:58:24 -0500 Subject: [PATCH 34/84] Update Changelog.txt --- source/Changelog.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Changelog.txt b/source/Changelog.txt index c695610cd..61554e478 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,8 +1,8 @@ 13/05/2024 - Dragon Slayer Added three More AOS Props - -BONUSHITS=# - -BONUSMANA=# - -BONUSSTAM=# + -HEALTHBONUS=# + -MANABONUS=# + -STAMINABONUS=# Add this properties to any weapon/armor/jewlery will give the player more hp/mana/stam why its equiped. depending on number you add with it 27/04/2024 - Dragon Slayer/Xuri From c8bceabc303c0ab2e05383f8d409dd9c72f64086 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 16 Jun 2024 19:00:03 -0500 Subject: [PATCH 35/84] Update Changelog.txt --- source/Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Changelog.txt b/source/Changelog.txt index 61554e478..eb4a9d532 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -4,6 +4,7 @@ -MANABONUS=# -STAMINABONUS=# Add this properties to any weapon/armor/jewlery will give the player more hp/mana/stam why its equiped. depending on number you add with it + These are also available as JS Engine object properties: .healthBonus, .staminaBonus, .manaBonus 27/04/2024 - Dragon Slayer/Xuri Fixed an issue where non-corpse containers - including treasure chests in dungeons - would decay and leave all their contents on the ground. From da9267ac987cc2a09e51208a74e9a93fd454c4fd Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Tue, 18 Jun 2024 18:28:50 -0500 Subject: [PATCH 36/84] Added AOS Leech Properties --- data/js/combat/leechstats.js | 60 ++++++++++++++++++++ data/js/jse_fileassociations.scp | 1 + source/CPacketSend.cpp | 22 ++++++++ source/UOXJSPropertyEnums.h | 4 +- source/UOXJSPropertyFuncs.cpp | 6 ++ source/UOXJSPropertySpecs.h | 3 + source/cBaseObject.cpp | 96 +++++++++++++++++++++++++++++++- source/cBaseObject.h | 16 ++++++ source/cChar.cpp | 8 +++ source/cItem.cpp | 11 ++++ source/items.cpp | 3 + source/ssection.cpp | 6 ++ source/ssection.h | 3 + 13 files changed, 237 insertions(+), 2 deletions(-) create mode 100644 data/js/combat/leechstats.js diff --git a/data/js/combat/leechstats.js b/data/js/combat/leechstats.js new file mode 100644 index 000000000..6663958ba --- /dev/null +++ b/data/js/combat/leechstats.js @@ -0,0 +1,60 @@ +function onEquip( pEquipper, iEquipped ) +{ + pEquipper.AddScriptTrigger( 7003 ); +} + +// Remove script trigger on unequip +function onUnequip( pUnequipper, iUnequipped ) +{ + pUnequipper.RemoveScriptTrigger( 7003 ); +} + +function onDamageDeal( attacker, damaged, damageValue, damageType ) +{ + // Fetch weapon in main hand or secondary hand + var iWeapon = attacker.FindItemLayer( 0x01 ); + if( !ValidateObject( iWeapon )) + { + iWeapon = attacker.FindItemLayer( 0x02 ); + } + + if( ValidateObject( iWeapon )) + { // Apply leech effects based on weapon properties + ApplyLeech( attacker, damaged, damageValue, iWeapon, 'healthLeech', 30 ); + ApplyLeech( attacker, damaged, damageValue, iWeapon, 'staminaLeech', 100 ); + ApplyLeech( attacker, damaged, damageValue, iWeapon, 'manaLeech', 40 ); + } + + return true; +} + +function ApplyLeech( attacker, damaged, damageValue, weapon, leechType, multiplier ) +{ + // Get the leech amount for the specified leech type from the weapon + var leechAmount = weapon[ leechType ]; + if( leechAmount > 0 ) + { // Calculate the minimum and maximum leech values + var minLeech = Math.round( damageValue * ( leechAmount / 100 ) * ( multiplier/100 )); + var maxLeech = Math.round( ( ( weapon.speed / 100 ) * 2500 ) / ( 100 + weapon.speedIncrease )); + var leechAmt = RandomNumber( minLeech, maxLeech ); + + // Apply the leech effect based on the leech type + switch( leechType ) + { + case 'healthLeech': + attacker.Heal( leechAmt ); + damaged.health -= leechAmt; + break; + case 'staminaLeech': + attacker.stamina += leechAmt; + damaged.stamina -= leechAmt; + break; + case 'manaLeech': + attacker.mana += leechAmt; + damaged.mana -= leechAmt; + break; + } + + attacker.SoundEffect( 0x44D, true ); + } +} \ No newline at end of file diff --git a/data/js/jse_fileassociations.scp b/data/js/jse_fileassociations.scp index 2cbb8e3d5..7b16b631a 100644 --- a/data/js/jse_fileassociations.scp +++ b/data/js/jse_fileassociations.scp @@ -329,6 +329,7 @@ // Combat Scripts [7000-7499] //------------------------------------------- 7000=combat/peacemake_effect.js +7003=combat/leechstats.js //------------------------------------------- // Misc Player Scripts [8000-8499] diff --git a/source/CPacketSend.cpp b/source/CPacketSend.cpp index e1d8ee4ca..28f3a2a40 100644 --- a/source/CPacketSend.cpp +++ b/source/CPacketSend.cpp @@ -7465,6 +7465,28 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou tempEntry.ourText = oldstrutil::number( cItem.GetTempVar( CITV_MOREZ )); FinalizeData( tempEntry, totalStringLen ); } + + if( cItem.GetManaLeech() > 0 ) + { + tempEntry.stringNum = 1060427; // hit mana leech ~1_val~% + tempEntry.ourText = oldstrutil::number( cItem.GetManaLeech() ); + FinalizeData( tempEntry, totalStringLen ); + } + + if( cItem.GetStaminaLeech() > 0 ) + { + tempEntry.stringNum = 1060430; // hit stamina leech ~1_val~% + tempEntry.ourText = oldstrutil::number( cItem.GetStaminaLeech() ); + FinalizeData( tempEntry, totalStringLen ); + } + + if( cItem.GetHealthLeech() > 0 ) + { + tempEntry.stringNum = 1060422; // hit life leech ~1_val~% + tempEntry.ourText = oldstrutil::number( cItem.GetHealthLeech() ); + FinalizeData( tempEntry, totalStringLen ); + } + if( cItem.GetType() == IT_SPELLCHANNELING ) { tempEntry.stringNum = 1060482; // spell channeling diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h index af309d496..ada680894 100644 --- a/source/UOXJSPropertyEnums.h +++ b/source/UOXJSPropertyEnums.h @@ -495,7 +495,9 @@ enum CI_Properties CIP_SECTIONALIST, CIP_MININTERVAL, CIP_MAXINTERVAL, - + CIP_HEALTHLEECH, + CIP_STAMINALEECH, + CIP_MANALEECH, CIP_ISNEWBIE, CIP_ISDISPELLABLE, CIP_MADEWITH, diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp index 3823356f9..2e210e2d0 100644 --- a/source/UOXJSPropertyFuncs.cpp +++ b/source/UOXJSPropertyFuncs.cpp @@ -676,6 +676,9 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN )); break; case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW )); break; case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break; + case CIP_HEALTHLEECH: *vp = INT_TO_JSVAL( gPriv->GetHealthLeech() ); break; + case CIP_STAMINALEECH: *vp = INT_TO_JSVAL( gPriv->GetStaminaLeech() ); break; + case CIP_MANALEECH: *vp = INT_TO_JSVAL( gPriv->GetManaLeech() ); break; case CIP_NAME2: tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() ); *vp = STRING_TO_JSVAL( tString ); @@ -1321,6 +1324,9 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break; case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break; case CIP_SPEED: gPriv->SetSpeed( static_cast( encaps.toInt() )); break; + case CIP_HEALTHLEECH: gPriv->SetHealthLeech( static_cast( encaps.toInt() )); break; + case CIP_STAMINALEECH: gPriv->SetStaminaLeech( static_cast( encaps.toInt() )); break; + case CIP_MANALEECH: gPriv->SetManaLeech( static_cast( encaps.toInt() )); break; case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break; case CIP_RACE: gPriv->SetRace( static_cast( encaps.toInt() )); break; case CIP_MAXHP: gPriv->SetMaxHP( static_cast( encaps.toInt() )); break; diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h index 3149dc0ec..15795c036 100644 --- a/source/UOXJSPropertySpecs.h +++ b/source/UOXJSPropertySpecs.h @@ -535,6 +535,9 @@ inline JSPropertySpec CItemProps[] = { "ammoFXHue", CIP_AMMOFXHUE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "ammoFXRender", CIP_AMMOFXRENDER, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "speed", CIP_SPEED, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "healthLeech", CIP_HEALTHLEECH, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "staminaLeech", CIP_STAMINALEECH, JSPROP_ENUMANDPERM, nullptr, nullptr }, + { "manaLeech", CIP_MANALEECH, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "multi", CIP_MULTI, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "maxRange", CIP_MAXRANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, { "baseRange", CIP_BASERANGE, JSPROP_ENUMANDPERM, nullptr, nullptr }, diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp index 506c247ac..2c5ce0b89 100644 --- a/source/cBaseObject.cpp +++ b/source/cBaseObject.cpp @@ -94,6 +94,9 @@ const SI16 DEFBASE_KILLS = 0; const UI16 DEFBASE_RESIST = 0; const bool DEFBASE_NAMEREQUESTACTIVE = 0; const ExpansionRuleset DEFBASE_ORIGIN = ER_UO; +const SI16 DEFBASE_HEALTHLEECH = 0; +const SI16 DEFBASE_STAMINALEECH = 0; +const SI16 DEFBASE_MANALEECH = 0; //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject constructor @@ -110,7 +113,8 @@ loDamage( DEFBASE_LODAMAGE ), weight( DEFBASE_WEIGHT ), mana( DEFBASE_MANA ), stamina( DEFBASE_STAMINA ), scriptTrig( DEFBASE_SCPTRIG ), st2( DEFBASE_STR2 ), dx2( DEFBASE_DEX2 ), in2( DEFBASE_INT2 ), FilePosition( DEFBASE_FP ), poisoned( DEFBASE_POISONED ), carve( DEFBASE_CARVE ), oldLocX( 0 ), oldLocY( 0 ), oldLocZ( 0 ), oldTargLocX( 0 ), oldTargLocY( 0 ), -fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ) +fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ), +healthLeech( DEFBASE_HEALTHLEECH ), staminaLeech( DEFBASE_STAMINALEECH ), manaLeech( DEFBASE_MANALEECH ) { multis = nullptr; tempMulti = INVALIDSERIAL; @@ -1631,6 +1635,66 @@ void CBaseObject::SetIntelligence2( SI16 nVal ) } } +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetHealthLeech() +//| CBaseObject::SetHealthLeech() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the Health Leech +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetHealthLeech( void ) const +{ + return healthLeech; +} +void CBaseObject::SetHealthLeech( SI16 nVal ) +{ + healthLeech = nVal; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetStaminaLeech() +//| CBaseObject::SetStaminaLeech() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the Stamina Leech +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetStaminaLeech( void ) const +{ + return staminaLeech; +} +void CBaseObject::SetStaminaLeech( SI16 nVal ) +{ + staminaLeech = nVal; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::GetManaLeech() +//| CBaseObject::SetManaLeech() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Gets/Sets the Mana Leech +//o------------------------------------------------------------------------------------------------o +SI16 CBaseObject::GetManaLeech( void ) const +{ + return manaLeech; +} +void CBaseObject::SetManaLeech( SI16 nVal ) +{ + manaLeech = nVal; + + if( CanBeObjType( OT_ITEM )) + { + ( static_cast( this ))->UpdateRegion(); + } +} + //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::IncStrength() //o------------------------------------------------------------------------------------------------o @@ -1661,6 +1725,36 @@ void CBaseObject::IncIntelligence( SI16 toInc ) SetIntelligence( intelligence + toInc ); } +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::IncHealthLeech() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Increments the object's Health Leech Points value +//o------------------------------------------------------------------------------------------------o +void CBaseObject::IncHealthLeech( SI16 toInc ) +{ + SetHealthLeech( healthLeech + toInc ); +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::IncStaminaLeech() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Increments the object's Stamina Leech Points value +//o------------------------------------------------------------------------------------------------o +void CBaseObject::IncStaminaLeech( SI16 toInc ) +{ + SetStaminaLeech( staminaLeech + toInc ); +} + +//o------------------------------------------------------------------------------------------------o +//| Function - CBaseObject::IncManaLeech() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Increments the object's Mana Leech Points value +//o------------------------------------------------------------------------------------------------o +void CBaseObject::IncManaLeech( SI16 toInc ) +{ + SetManaLeech( manaLeech + toInc ); +} + //o------------------------------------------------------------------------------------------------o //| Function - CBaseObject::DumpFooter() //o------------------------------------------------------------------------------------------------o diff --git a/source/cBaseObject.h b/source/cBaseObject.h index 638e826f7..316cd2530 100644 --- a/source/cBaseObject.h +++ b/source/cBaseObject.h @@ -75,6 +75,9 @@ class CBaseObject SI32 weight; SI16 mana; SI16 stamina; + SI16 healthLeech; + SI16 staminaLeech; + SI16 manaLeech; UI16 scriptTrig; SI16 st2; SI16 dx2; @@ -256,6 +259,19 @@ class CBaseObject void IncDexterity( SI16 toInc = 1 ); void IncIntelligence( SI16 toInc = 1 ); + SI16 GetHealthLeech( void ) const; + virtual void SetHealthLeech( SI16 nVal ); + + SI16 GetStaminaLeech( void ) const; + virtual void SetStaminaLeech( SI16 nVal ); + + SI16 GetManaLeech( void ) const; + virtual void SetManaLeech( SI16 nVal ); + + void IncHealthLeech( SI16 toInc = 1 ); + void IncStaminaLeech( SI16 toInc = 1 ); + void IncManaLeech( SI16 toInc = 1 ); + virtual void PostLoadProcessing( void ); virtual bool LoadRemnants( void ) = 0; diff --git a/source/cChar.cpp b/source/cChar.cpp index 7aa03f6fa..439a72527 100644 --- a/source/cChar.cpp +++ b/source/cChar.cpp @@ -2920,6 +2920,10 @@ bool CChar::WearItem( CItem *toWear ) IncDexterity2( itemLayers[tLayer]->GetDexterity2() ); IncIntelligence2( itemLayers[tLayer]->GetIntelligence2() ); + IncHealthLeech( itemLayers[tLayer]->GetHealthLeech() ); + IncStaminaLeech( itemLayers[tLayer]->GetStaminaLeech() ); + IncManaLeech( itemLayers[tLayer]->GetManaLeech() ); + if( toWear->IsPostLoaded() ) { if( itemLayers[tLayer]->GetPoisoned() ) @@ -2979,6 +2983,10 @@ bool CChar::TakeOffItem( ItemLayers Layer ) IncStrength2( -itemLayers[Layer]->GetStrength2() ); IncDexterity2( -itemLayers[Layer]->GetDexterity2() ); IncIntelligence2( -itemLayers[Layer]->GetIntelligence2() ); + + IncHealthLeech( -itemLayers[Layer]->GetHealthLeech() ); + IncStaminaLeech( -itemLayers[Layer]->GetStaminaLeech() ); + IncManaLeech( -itemLayers[Layer]->GetManaLeech() ); if( itemLayers[Layer]->GetPoisoned() ) { if( itemLayers[Layer]->GetPoisoned() > GetPoisoned() ) diff --git a/source/cItem.cpp b/source/cItem.cpp index 3c6523d5d..672ece4dd 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -1644,6 +1644,9 @@ auto CItem::CopyData( CItem *target ) -> void target->SetStamina( GetStamina() ); target->SetStrength( GetStrength() ); target->SetStrength2( GetStrength2() ); + target->SetHealthLeech( GetHealthLeech() ); + target->SetStaminaLeech( GetStaminaLeech() ); + target->SetManaLeech( GetManaLeech() ); target->SetTitle( GetTitle() ); target->SetType( GetType() ); target->SetBuyValue( GetBuyValue() ); @@ -1739,6 +1742,7 @@ bool CItem::DumpBody( std::ostream &outStream ) const outStream << "Speed=" + std::to_string( GetSpeed() ) + newLine; outStream << "Movable=" + std::to_string( GetMovable() ) + newLine; outStream << "Priv=" + std::to_string( GetPriv() ) + newLine; + outStream << "LeechStats=" + std::to_string( GetHealthLeech() ) + "," + std::to_string( GetStaminaLeech() ) + "," + std::to_string( GetManaLeech() ) + newLine; outStream << "Value=" + std::to_string( GetBuyValue() ) + "," + std::to_string( GetSellValue() ) + "," + std::to_string( GetVendorPrice() ) + newLine; outStream << "Restock=" + std::to_string( GetRestock() ) + newLine; outStream << "AC=" + std::to_string( GetArmourClass() ) + newLine; @@ -1922,6 +1926,13 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) SetWeatherDamage( LIGHTNING, static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 ); rValue = true; } + else if( UTag == "LEECHSTATS" ) + { + SetHealthLeech( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[0], "//" )), nullptr, 0 ))); + SetStaminaLeech( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[1], "//" )), nullptr, 0 ))); + SetManaLeech( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( csecs[2], "//" )), nullptr, 0 ))); + rValue = true; + } break; case 'M': if( UTag == "MAXITEMS" ) diff --git a/source/items.cpp b/source/items.cpp index 1cd4a2aaf..a3cec1199 100644 --- a/source/items.cpp +++ b/source/items.cpp @@ -138,6 +138,9 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect } break; case DFNTAG_AC: applyTo->SetArmourClass( static_cast( ndata )); break; + case DFNTAG_HEALTHLEECH: applyTo->SetHealthLeech( static_cast( ndata )); break; + case DFNTAG_STAMINALEECH: applyTo->SetStaminaLeech( static_cast( ndata )); break; + case DFNTAG_MANALEECH: applyTo->SetManaLeech( static_cast( ndata )); break; case DFNTAG_BASERANGE: applyTo->SetBaseRange( static_cast( ndata )); break; case DFNTAG_CREATOR: applyTo->SetCreator( ndata ); break; case DFNTAG_COLOUR: applyTo->SetColour( static_cast( ndata )); break; diff --git a/source/ssection.cpp b/source/ssection.cpp index c2a563b47..2ed0d8b70 100644 --- a/source/ssection.cpp +++ b/source/ssection.cpp @@ -115,6 +115,7 @@ const UI08 dfnDataTypes[DFNTAG_COUNTOFTAGS] = DFN_NODATA, // DFNTAG_HIRELING, DFN_DOUBLENUMERIC, // DFNTAG_HP, DFN_DOUBLENUMERIC, // DFNTAG_HPMAX, + DFN_NUMERIC, // DFNTAG_HEALTHLEECH, DFN_UPPERSTRING, // DFNTAG_ID, DFN_DOUBLENUMERIC, // DFNTAG_IMBUING, DFN_NUMERIC, // DFNTAG_INTADD, @@ -140,6 +141,7 @@ const UI08 dfnDataTypes[DFNTAG_COUNTOFTAGS] = DFN_DOUBLENUMERIC, // DFNTAG_MAGICRESISTANCE, DFN_DOUBLENUMERIC, // DFNTAG_MANA, DFN_DOUBLENUMERIC, // DFNTAG_MANAMAX, + DFN_NUMERIC, // DFNTAG_MANALEECH, DFN_NUMERIC, // DFNTAG_MAXHP, DFN_NUMERIC, // DFNTAG_MAXITEMS, DFN_NUMERIC, // DFNTAG_MAXLOYALTY, @@ -222,6 +224,7 @@ const UI08 dfnDataTypes[DFNTAG_COUNTOFTAGS] = DFN_NUMERIC, // DFNTAG_SPLITCHANCE, DFN_DOUBLENUMERIC, // DFNTAG_STAMINA, DFN_DOUBLENUMERIC, // DFNTAG_STAMINAMAX, + DFN_NUMERIC, // DFNTAG_STAMINALEECH, DFN_DOUBLENUMERIC, // DFNTAG_STRENGTH, DFN_NUMERIC, // DFNTAG_STRADD, DFN_NUMERIC, // DFNTAG_STEALABLE, @@ -370,6 +373,7 @@ const std::map strToDFNTag {"HIRELING"s, DFNTAG_HIRELING}, {"HP"s, DFNTAG_HP}, {"HPMAX"s, DFNTAG_HPMAX}, + {"HEALTHLEECH"s, DFNTAG_HEALTHLEECH}, {"ID"s, DFNTAG_ID}, {"IMBUING"s, DFNTAG_IMBUING}, {"IN"s, DFNTAG_INTELLIGENCE}, @@ -399,6 +403,7 @@ const std::map strToDFNTag {"MAGICRESISTANCE"s, DFNTAG_MAGICRESISTANCE}, {"MANA"s, DFNTAG_MANA}, {"MANAMAX"s, DFNTAG_MANAMAX}, + {"MANALEECH"s, DFNTAG_MANALEECH}, {"MAXHP"s, DFNTAG_MAXHP}, {"MAXITEMS"s, DFNTAG_MAXITEMS}, {"MAXLOYALTY"s, DFNTAG_MAXLOYALTY}, @@ -483,6 +488,7 @@ const std::map strToDFNTag {"ST"s, DFNTAG_STRENGTH}, {"STAMINA"s, DFNTAG_STAMINA}, {"STAMINAMAX"s, DFNTAG_STAMINAMAX}, + {"STAMINALEECH"s, DFNTAG_STAMINALEECH}, {"STR"s, DFNTAG_STRENGTH}, {"STRENGTH"s, DFNTAG_STRENGTH}, {"ST2"s, DFNTAG_STRADD}, diff --git a/source/ssection.h b/source/ssection.h index a2a660aec..be29b8d36 100644 --- a/source/ssection.h +++ b/source/ssection.h @@ -122,6 +122,7 @@ enum DFNTAGS DFNTAG_HIRELING, DFNTAG_HP, DFNTAG_HPMAX, + DFNTAG_HEALTHLEECH, DFNTAG_ID, DFNTAG_IMBUING, DFNTAG_INTADD, @@ -147,6 +148,7 @@ enum DFNTAGS DFNTAG_MAGICRESISTANCE, DFNTAG_MANA, DFNTAG_MANAMAX, + DFNTAG_MANALEECH, DFNTAG_MAXHP, DFNTAG_MAXITEMS, DFNTAG_MAXLOYALTY, @@ -229,6 +231,7 @@ enum DFNTAGS DFNTAG_SPLITCHANCE, DFNTAG_STAMINA, DFNTAG_STAMINAMAX, + DFNTAG_STAMINALEECH, DFNTAG_STRENGTH, DFNTAG_STRADD, DFNTAG_STEALABLE, From 03c2ba6dc03a5c130d097f25e9356677410e6ccb Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Tue, 18 Jun 2024 18:36:04 -0500 Subject: [PATCH 37/84] changelog --- source/Changelog.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..ca3c53f46 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,12 @@ +18/06/2024 - Dragon Slayer + Added three new DFN tags for Items: + HEALTHLEECH=# // It gives an attacker the ability to leech health from his opponent every time he successfully delivers a hit adds it to himself. + STAMINALEECH=# // It gives an attacker the ability to leech Stamina from his opponent every time he successfully delivers a hit adds it to himself. + MANALEECH=# // It gives an attacker the ability to leech Mana from his opponent every time he successfully delivers a hit adds it to himself. + These are also available as JS Engine object properties: .healthLeech, .staminaLeech and .manaLeech + Added leechstats.js file that controls the combat for the properties. (script 7003) + To add this script to a weapon only. add in SCRIPT=7003, HEALTHLEECH=# or STAMINALEECH=# or MANALEECH=# it can also be all three on the weapon. + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. From d7417c89ff04edea2ee4b59d2e97ebf7b402e042 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sat, 22 Jun 2024 17:00:04 -0500 Subject: [PATCH 38/84] Update cItem.cpp --- source/cItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/cItem.cpp b/source/cItem.cpp index eacbfa112..44b28b56f 100644 --- a/source/cItem.cpp +++ b/source/cItem.cpp @@ -2128,7 +2128,7 @@ bool CItem::HandleLine( std::string &UTag, std::string &data ) SetStealable( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); rValue = true; } - else if( UTag == "SWINGSPEEDINCREASE" ) + else if( UTag == "SPEEDINCREASE" ) { SetSwingSpeedIncrease( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 ))); rValue = true; From d28b8daf166b51c599972fdf055e0c652b1f9cbd Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sat, 22 Jun 2024 17:53:00 -0500 Subject: [PATCH 39/84] Update leechstats.js --- data/js/combat/leechstats.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/data/js/combat/leechstats.js b/data/js/combat/leechstats.js index 6663958ba..fc1086fdf 100644 --- a/data/js/combat/leechstats.js +++ b/data/js/combat/leechstats.js @@ -31,27 +31,23 @@ function onDamageDeal( attacker, damaged, damageValue, damageType ) function ApplyLeech( attacker, damaged, damageValue, weapon, leechType, multiplier ) { // Get the leech amount for the specified leech type from the weapon - var leechAmount = weapon[ leechType ]; - if( leechAmount > 0 ) - { // Calculate the minimum and maximum leech values - var minLeech = Math.round( damageValue * ( leechAmount / 100 ) * ( multiplier/100 )); - var maxLeech = Math.round( ( ( weapon.speed / 100 ) * 2500 ) / ( 100 + weapon.speedIncrease )); - var leechAmt = RandomNumber( minLeech, maxLeech ); + var leechPercentVal = weapon[ leechType ]; + if( leechPercentVal > 0 ) + { + // Calculate the percent of health restored to the attacker + var leechAmt = Math.round( damageValue * ( leechPercentVal / 100 ) * ( multiplier/100 )); // Apply the leech effect based on the leech type switch( leechType ) { case 'healthLeech': attacker.Heal( leechAmt ); - damaged.health -= leechAmt; break; case 'staminaLeech': attacker.stamina += leechAmt; - damaged.stamina -= leechAmt; break; case 'manaLeech': attacker.mana += leechAmt; - damaged.mana -= leechAmt; break; } From 91dd7b936da0bc58c2037b711ef1f30777f98edb Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Thu, 4 Jul 2024 17:43:22 -0500 Subject: [PATCH 40/84] Cleaver ID added Missing Cleaver ID out of the jse_objectassionations.scp --- data/js/jse_objectassociations.scp | 2 ++ source/Changelog.txt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/data/js/jse_objectassociations.scp b/data/js/jse_objectassociations.scp index 93f7c41d5..25cce9751 100644 --- a/data/js/jse_objectassociations.scp +++ b/data/js/jse_objectassociations.scp @@ -580,6 +580,8 @@ 0x10a4=15007 // Swords +0x0EC2=5009 //cleaver +0x0EC3=5009 //cleaver 0x0EC4=5009 //skinning knife 0x0EC5=5009 //skinning knife 0x0F60=5009 //longsword diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..8fa5103ab 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,5 @@ +4/07/2024 - Dragon Slayer + Fixed Cleaver ID missing in the jse_objectassociations.scp or carving corpses 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. From 11b863f2f89d8032f2ffa1870b947e6675cd7a0b Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 7 Jul 2024 14:21:32 -0500 Subject: [PATCH 41/84] Requried Free Hand Added Requirement to drink potion hand has to be free, This can be disabled within the potion.js file by switching the reqfreehand to false. --- data/dictionaries/dictionary.CSY | 1 + data/dictionaries/dictionary.ENG | 1 + data/dictionaries/dictionary.FRE | 1 + data/dictionaries/dictionary.GER | 1 + data/dictionaries/dictionary.ITA | 1 + data/dictionaries/dictionary.POL | 1 + data/dictionaries/dictionary.PTG | 1 + data/dictionaries/dictionary.SPA | 1 + data/dictionaries/dictionary.ZRO | 1 + data/js/item/potion.js | 13 ++++++++++++- source/Changelog.txt | 3 +++ 11 files changed, 24 insertions(+), 1 deletion(-) diff --git a/data/dictionaries/dictionary.CSY b/data/dictionaries/dictionary.CSY index d19756c34..e88385024 100644 --- a/data/dictionaries/dictionary.CSY +++ b/data/dictionaries/dictionary.CSY @@ -3431,6 +3431,7 @@ 6301=Z této knihy se může učit pouze velmistr alchymista. 6302=Tyto informace jste se již dozvěděli. 6303=Naučili jste se vyrábět předměty ze skla. K výrobě těchto předmětů budete muset najít horníky, kteří budou těžit jemný písek. +6304=Musíte mít volnou ruku, abyste mohli pít lektvar. // [7000-7499] AI Scripts 7000=Jsi zločinec a nemáš přístup ke své bankovní schránce. 7001=Který předmět si přeješ uložit do své bankovní schránky? diff --git a/data/dictionaries/dictionary.ENG b/data/dictionaries/dictionary.ENG index c3dc18d54..89e08c4fc 100644 --- a/data/dictionaries/dictionary.ENG +++ b/data/dictionaries/dictionary.ENG @@ -3431,6 +3431,7 @@ 6301=Only a Grandmaster Alchemist can learn from this book. 6302=You have already learned this information. 6303=You have learned to make items from glass. You will need to find miners to mine fine sand for you to make these items. +6304=You must have a free hand to drink a potion. // [7000-7499] AI Scripts 7000=Thou art a criminal and cannot access thy bank box. 7001=Which item do you wish to deposit in your bank box? diff --git a/data/dictionaries/dictionary.FRE b/data/dictionaries/dictionary.FRE index 9465437b6..c76cb9ff6 100644 --- a/data/dictionaries/dictionary.FRE +++ b/data/dictionaries/dictionary.FRE @@ -3595,6 +3595,7 @@ 6301=Seul un grand maître alchimiste peut apprendre de ce livre. 6302=Vous avez déjà appris cette information. 6303=Vous avez appris à fabriquer des objets en verre. Vous devrez trouver des mineurs pour extraire du sable fin pour fabriquer ces objets. +6304=Vous devez avoir les mains libres pour boire une potion. // [7000-7499] AI Scripts 7000=Tu es un criminel et tu ne peux pas accéder à ton coffre de banque. 7001=Quel objet souhaitez-vous déposer dans votre coffret bancaire ? diff --git a/data/dictionaries/dictionary.GER b/data/dictionaries/dictionary.GER index 2376f9a36..3bbec8e76 100644 --- a/data/dictionaries/dictionary.GER +++ b/data/dictionaries/dictionary.GER @@ -3431,6 +3431,7 @@ 6301=Nur ein Großmeister-Alchemist kann aus diesem Buch lernen. 6302=Sie haben diese Informationen bereits erfahren. 6303=Du hast gelernt, Gegenstände aus Glas herzustellen. Sie müssen Bergleute finden, die feinen Sand abbauen, damit Sie diese Gegenstände herstellen können. +6304=Sie müssen freie Hand haben, um einen Trank zu trinken. // [7000-7499] AI Scripts 7000=Du bist ein Verbrecher und kannst nicht auf dein Bankschließfach zugreifen. 7001=Welchen Gegenstand möchten Sie in Ihr Bankschließfach einzahlen? diff --git a/data/dictionaries/dictionary.ITA b/data/dictionaries/dictionary.ITA index 882528064..9b354469d 100644 --- a/data/dictionaries/dictionary.ITA +++ b/data/dictionaries/dictionary.ITA @@ -3431,6 +3431,7 @@ 6301=Solo un Grande Maestro Alchimista può imparare da questo libro. 6302=Hai già appreso questa informazione. 6303=Hai imparato a creare oggetti in vetro. Dovrai trovare minatori che estraggano sabbia fine per poter realizzare questi oggetti. +6304=Devi avere una mano libera per bere una pozione. // [7000-7499] AI Scripts 7000=Tu sei un criminale e non puoi accedere alla tua cassaforte. 7001=Quale oggetto desidera depositare nella sua cassetta di sicurezza? diff --git a/data/dictionaries/dictionary.POL b/data/dictionaries/dictionary.POL index 144ca3bbf..7f920c33f 100644 --- a/data/dictionaries/dictionary.POL +++ b/data/dictionaries/dictionary.POL @@ -3431,6 +3431,7 @@ 6301=Tylko Wielki Mistrz Alchemik może uczyć się z tej książki. 6302=Te informacje już znasz. 6303=Nauczyłeś się robić przedmioty ze szkła. Będziesz musiał znaleźć górników, którzy wydobędą drobny piasek, aby móc wyprodukować te przedmioty. +6304=Musisz mieć wolną rękę, żeby wypić miksturę. // [7000-7499] AI Scripts 7000=Jesteś przestępcą i nie masz dostępu do swojej skrytki bankowej. 7001=Którą pozycję chcesz umieścić w swojej skrytce bankowej? diff --git a/data/dictionaries/dictionary.PTG b/data/dictionaries/dictionary.PTG index 416dcad46..0c550f077 100644 --- a/data/dictionaries/dictionary.PTG +++ b/data/dictionaries/dictionary.PTG @@ -3431,6 +3431,7 @@ 6301=Apenas um Grão-Mestre Alquimista pode aprender com este livro. 6302=Você já aprendeu esta informação. 6303=Você aprendeu a fazer itens de vidro. Você precisará encontrar mineiros para extrair areia fina para fazer esses itens. +6304=Você deve ter a mão livre para beber uma poção. // [7000-7499] AI Scripts 7000=Tu és um criminoso e não podes aceder à tua caixa bancária. 7001=Que artigo deseja depositar na sua caixa bancária? diff --git a/data/dictionaries/dictionary.SPA b/data/dictionaries/dictionary.SPA index aa5807812..488b7e7e2 100644 --- a/data/dictionaries/dictionary.SPA +++ b/data/dictionaries/dictionary.SPA @@ -3431,6 +3431,7 @@ 6301=Sólo un Gran Maestro Alquimista puede aprender de este libro. 6302=Ya has aprendido esta información. 6303=Has aprendido a fabricar objetos de vidrio. Necesitará encontrar mineros que extraigan arena fina para poder fabricar estos artículos. +6304=Debes tener las manos libres para beber una poción. // [7000-7499] Guiones de IA 7000=Eres un delincuente y no puedes acceder a tu caja bancaria. 7001=¿Qué artículo desea depositar en su caja? diff --git a/data/dictionaries/dictionary.ZRO b/data/dictionaries/dictionary.ZRO index 5792f2860..b6eb4041c 100644 --- a/data/dictionaries/dictionary.ZRO +++ b/data/dictionaries/dictionary.ZRO @@ -3426,6 +3426,7 @@ 6301=Only a Grandmaster Alchemist can learn from this book. 6302=You have already learned this information. 6303=You have learned to make items from glass. You will need to find miners to mine fine sand for you to make these items. +6304=You must have a free hand to drink a potion. // [7000-7499] AI Scripts 7000=Thou art a criminal and cannot access thy bank box. 7001=Which item do you wish to deposit in your bank box? diff --git a/data/js/item/potion.js b/data/js/item/potion.js index d92697cfb..efbda987e 100644 --- a/data/js/item/potion.js +++ b/data/js/item/potion.js @@ -6,14 +6,25 @@ const alchemyBonusModifier = parseInt( GetServerSetting( "AlchemyBonusModifier" // Other settings const randomizePotionCountdown = false; // If true, add/remove +1/-1 seconds to explosion potion countdowns +const ReqFreeHands = true; function onUseChecked( pUser, iUsed ) { var socket = pUser.socket; - if ( pUser.visible == 1 || pUser.visible == 2 ) + var itemRHand = pUser.FindItemLayer( 0x01 ); + var itemLHand = pUser.FindItemLayer( 0x02 ); + + if( ReqFreeHands && ( itemRHand != null || itemLHand != null ) ) + { + socket.SysMessage( GetDictionaryEntry( 6304, socket.language ) );// You must have a free hand to drink a potion. + return false; + } + + if( pUser.visible == 1 || pUser.visible == 2 ) { pUser.visible = 0; } + if( socket && iUsed && iUsed.isItem ) { if( pUser.isUsingPotion ) diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..01d3b26f8 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,6 @@ +7/07/2024 - Dragon Slayer + Added Required Free Hand (js potion). + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. From 405780398614aad5b3e63924c9a07761bbe5639c Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Tue, 16 Jul 2024 19:23:06 -0500 Subject: [PATCH 42/84] Gumps.cpp Fallback for older clients that don't support buttontileart --- source/Changelog.txt | 3 +++ source/gumps.cpp | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..681511311 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,6 @@ +16/07/2024 - Xuri + Fixed Fallback for older clients that don't support buttontileart (gumps.cpp) + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. diff --git a/source/gumps.cpp b/source/gumps.cpp index c655634d2..68d8ca7a3 100644 --- a/source/gumps.cpp +++ b/source/gumps.cpp @@ -669,10 +669,21 @@ void BuildAddMenuGump( CSocket *s, UI16 m ) if( tag.data()[0] != '<' && tag.data()[0] != ' ' ) // it actually has a picture, well bugger me! :> { // Draw a frame for the item to make it stand out a touch more. - toSend.addCommand( oldstrutil::format( "checkertrans %u %u %u %u", xOffset + 7, yOffset + 9, 110, 110 )); - toSend.addCommand( oldstrutil::format( "buttontileart %u %u 0x0a9f 0x0aa1 %u %u %u %u %u %u %u", xOffset, yOffset, 1, 0, buttonnum, std::stoi( tag, nullptr, 0 ), 0, 25, 25 )); - toSend.addCommand( oldstrutil::format( "tooltip 1042971 @%s@", data.c_str() )); - toSend.addCommand( oldstrutil::format( "croppedtext %u %u %u %u %u %u", xOffset + 15, yOffset + 85, 100, 20, 50, linenum++ )); + if( s->ClientVerShort() <= CVS_6000 ) + { + // Fallback for older clients that don't support buttontileart + toSend.addCommand( oldstrutil::format("resizepic %u %u %u %u %u", xOffset, yOffset, 0x53, 65, 100 )); + toSend.addCommand( oldstrutil::format("checkertrans %u %u %u %u", xOffset + 7, yOffset + 9, 52, 82 )); + toSend.addCommand( oldstrutil::format("tilepic %u %u %i", xOffset + 5, yOffset + 10, std::stoi(tag, nullptr, 0) )); + toSend.addCommand( oldstrutil::format("croppedtext %u %u %u %u %u %u", xOffset, yOffset + 65, 65, 20, 55, linenum++ )); + } + else + { + toSend.addCommand( oldstrutil::format( "checkertrans %u %u %u %u", xOffset + 7, yOffset + 9, 110, 110 )); + toSend.addCommand( oldstrutil::format( "buttontileart %u %u 0x0a9f 0x0aa1 %u %u %u %u %u %u %u", xOffset, yOffset, 1, 0, buttonnum, std::stoi( tag, nullptr, 0 ), 0, 25, 25 )); + toSend.addCommand( oldstrutil::format( "tooltip 1042971 @%s@", data.c_str() )); + toSend.addCommand( oldstrutil::format( "croppedtext %u %u %u %u %u %u", xOffset + 15, yOffset + 85, 100, 20, 50, linenum++ )); + } toSend.addText( data ); xOffset += XOFFSET; if( xOffset > 640 ) From 35bbb0a6886ab8a92a09f7401549f4dbdd6454ea Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sat, 27 Jul 2024 12:14:42 -0500 Subject: [PATCH 43/84] Update gumps.cpp --- source/gumps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/gumps.cpp b/source/gumps.cpp index 68d8ca7a3..2218a6828 100644 --- a/source/gumps.cpp +++ b/source/gumps.cpp @@ -669,7 +669,7 @@ void BuildAddMenuGump( CSocket *s, UI16 m ) if( tag.data()[0] != '<' && tag.data()[0] != ' ' ) // it actually has a picture, well bugger me! :> { // Draw a frame for the item to make it stand out a touch more. - if( s->ClientVerShort() <= CVS_6000 ) + if( s->ClientVerShort() <= CVS_70160 ) { // Fallback for older clients that don't support buttontileart toSend.addCommand( oldstrutil::format("resizepic %u %u %u %u %u", xOffset, yOffset, 0x53, 65, 100 )); From 8b11fa7eed93b2627e19ba10dbc1fbc039a6a113 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 4 Aug 2024 18:45:55 -0500 Subject: [PATCH 44/84] skillcheck magery Added Run a skillcheck for NPC to give them a chance to gain skill - if that option is enabled in ini (xuri) --- source/Changelog.txt | 3 +++ source/magic.cpp | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..3da6c65ac 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,6 @@ +4/8/2024 - Dragon Slayer + Added Run a skillcheck for NPC to give them a chance to gain skill - if that option is enabled in ini (xuri) + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. diff --git a/source/magic.cpp b/source/magic.cpp index d04ab3f97..11918c522 100644 --- a/source/magic.cpp +++ b/source/magic.cpp @@ -4499,6 +4499,11 @@ void CMagic::CastSpell( CSocket *s, CChar *caster ) caster->StopSpell(); return; } + else if( caster->IsNpc() ) + { + // Run a skillcheck for NPC to give them a chance to gain skill - if that option is enabled in ini + Skills->CheckSkill( caster, MAGERY, lowSkill, highSkill ); + } if( curSpell > 63 && static_cast(curSpell) <= spellCount && spellCount <= 70 ) { From 1e038b1b9b4ab04cbf600a5687ffdb34be543ea8 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Mon, 5 Aug 2024 10:46:27 -0500 Subject: [PATCH 45/84] target fix --- data/js/magic/level1targ.js | 1 + 1 file changed, 1 insertion(+) diff --git a/data/js/magic/level1targ.js b/data/js/magic/level1targ.js index a79f92a3c..d8dabced1 100644 --- a/data/js/magic/level1targ.js +++ b/data/js/magic/level1targ.js @@ -95,6 +95,7 @@ function ItemInHandCheck( mChar, mSock, spellType ) } } } + return true; } function onSpellCast( mSock, mChar, directCast, spellNum ) From 96bda4af3f29489e26e768b757ec2e6dc562dfc8 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Mon, 5 Aug 2024 12:29:52 -0500 Subject: [PATCH 46/84] Fixes cooking Fixes duped dictonary number fixed corrected items needed for sweet dough and dough --- data/dictionaries/dictionary.CSY | 2 +- data/dictionaries/dictionary.ENG | 2 +- data/dictionaries/dictionary.FRE | 2 +- data/dictionaries/dictionary.GER | 2 +- data/dictionaries/dictionary.ITA | 2 +- data/dictionaries/dictionary.POL | 2 +- data/dictionaries/dictionary.PTG | 2 +- data/dictionaries/dictionary.SPA | 2 +- data/dictionaries/dictionary.ZRO | 2 +- data/js/skill/craft/cooking.js | 2 +- data/js/skill/craft/itemdetailgump.js | 4 ++-- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/data/dictionaries/dictionary.CSY b/data/dictionaries/dictionary.CSY index d19756c34..c73b6389a 100644 --- a/data/dictionaries/dictionary.CSY +++ b/data/dictionaries/dictionary.CSY @@ -4679,7 +4679,6 @@ 11619=chlebový bochník 11620=pánev sušenek 11621=koláč -11622=muffiny 11622=pečený quiche 11623=pečený masový koláč 11624=pizza s uzeninou @@ -4715,6 +4714,7 @@ 11654=Pro přípravu jídla musíte být v blízkosti zdroje tepla. 11655=Musíte být v blízkosti mlýna, abyste mohli vyrábět mouku. 11656=Musíte být v blízkosti pece, abyste mohli péct jídlo. +11657=muffiny // 11801 - 12000 Dovednost řemeslné výroby // Strana 1 - Dřevěné předměty 11801=Náprava diff --git a/data/dictionaries/dictionary.ENG b/data/dictionaries/dictionary.ENG index c3dc18d54..727ceb1b6 100644 --- a/data/dictionaries/dictionary.ENG +++ b/data/dictionaries/dictionary.ENG @@ -4679,7 +4679,6 @@ 11619=bread loaf 11620=pan of cookies 11621=cake -11622=muffins 11622=baked quiche 11623=baked meat pie 11624=sausage pizza @@ -4715,6 +4714,7 @@ 11654=You must be near a heat source to cook food. 11655=You must be near a mill to create flour. 11656=You must be near an oven to bake food. +11657=muffins // 11801 - 12000 Tinkering Crafting Skill // Page 1 - Wooden Items 11801=Axle diff --git a/data/dictionaries/dictionary.FRE b/data/dictionaries/dictionary.FRE index 9465437b6..0ff49ad3e 100644 --- a/data/dictionaries/dictionary.FRE +++ b/data/dictionaries/dictionary.FRE @@ -4835,7 +4835,6 @@ 11619=miche de pain 11620=panier de biscuits 11621=gâteau -11622=muffins 11622=quiche au four 11623=tarte à la viande cuite au four 11624=pizza à la saucisse @@ -4871,6 +4870,7 @@ 11654=Il faut être près d'une source de chaleur pour cuire les aliments. 11655=Il faut être près d'un moulin pour créer de la farine. 11656=Il faut être près d'un four pour cuire des aliments. +11657=muffins // 11801 - 12000 Compétence en artisanat de bricolage // Page 1 - Objets en bois 11801=Axe diff --git a/data/dictionaries/dictionary.GER b/data/dictionaries/dictionary.GER index 2376f9a36..4bd6e227e 100644 --- a/data/dictionaries/dictionary.GER +++ b/data/dictionaries/dictionary.GER @@ -4679,7 +4679,6 @@ 11619=Brotlaib 11620=Keksdose 11621=Kuchen -11622=Muffins 11622=gebackene Quiche 11623=gebackene Fleischpastete 11624=Wurstpizza @@ -4715,6 +4714,7 @@ 11654=Du musst in der Nähe einer Wärmequelle sein, um Essen zu kochen. 11655=Du musst in der Nähe einer Mühle sein, um Mehl herzustellen. 11656=Du musst in der Nähe eines Ofens sein, um Essen zu backen. +11657=Muffins // 11801 - 12000 Handwerkliches Geschick // Seite 1 - Hölzerne Gegenstände 11801=Achse diff --git a/data/dictionaries/dictionary.ITA b/data/dictionaries/dictionary.ITA index 882528064..3e731fe9f 100644 --- a/data/dictionaries/dictionary.ITA +++ b/data/dictionaries/dictionary.ITA @@ -4679,7 +4679,6 @@ 11619=pagnotta di pane 11620=torta di biscotti 11621=torta -11622=muffin 11622=quiche al forno 11623=pasticcio di carne al forno 11624=pizza con salsiccia @@ -4715,6 +4714,7 @@ 11654=Devi essere vicino a una fonte di calore per cucinare il cibo. 11655=Devi essere vicino a un mulino per creare farina. 11656=Devi essere vicino a un forno per cuocere il cibo. +11657=muffin // 11801 - 12000 Abilità Artigianato Tinkering // Pagina 1 - Oggetti in legno 11801=Assale diff --git a/data/dictionaries/dictionary.POL b/data/dictionaries/dictionary.POL index 144ca3bbf..377632cee 100644 --- a/data/dictionaries/dictionary.POL +++ b/data/dictionaries/dictionary.POL @@ -4679,7 +4679,6 @@ 11619=bochenek chleba 11620=panka ciasteczek 11621=ciasto -11622=muffiny 11622=pieczony quiche 11623=pieczony placek z mięsem 11624=pizza z kiełbasą @@ -4715,6 +4714,7 @@ 11654=Musisz być w pobliżu źródła ciepła, aby gotować jedzenie. 11655=Musisz być w pobliżu młyna, aby wytworzyć mąkę. 11656=Musisz być w pobliżu piekarnika, aby upiec jedzenie. +11657=muffiny // 11801 - 12000 Umiejętność majsterkowania // Strona 1 - Przedmioty z drewna 11801=Oś diff --git a/data/dictionaries/dictionary.PTG b/data/dictionaries/dictionary.PTG index 416dcad46..07e6b7efc 100644 --- a/data/dictionaries/dictionary.PTG +++ b/data/dictionaries/dictionary.PTG @@ -4679,7 +4679,6 @@ 11619=pão de pão 11620=panha de biscoitos 11621=bolo -11622=muffins 11622=quiché cozido 11623=torta de carne assada 11624=sausage pizza @@ -4715,6 +4714,7 @@ 11654=É preciso estar perto de uma fonte de calor para cozinhar os alimentos. 11655=Tem de estar perto de um moinho para criar farinha. 11656=Tem de estar perto de um forno para cozer alimentos. +11657=muffins // 11801 - 12000 Habilidade de Artesanato de Sininho // Página 1 - Artigos de madeira 11801=Eixo diff --git a/data/dictionaries/dictionary.SPA b/data/dictionaries/dictionary.SPA index aa5807812..5aabd7d66 100644 --- a/data/dictionaries/dictionary.SPA +++ b/data/dictionaries/dictionary.SPA @@ -4679,7 +4679,6 @@ 11619=pan de pan 11620=pan de galletas 11621=pastel -11622=magdalenas 11622=quiche al horno 11623=pastel de carne al horno 11624=pizza de salchicha @@ -4715,6 +4714,7 @@ 11654=Debes estar cerca de una fuente de calor para cocinar los alimentos. 11655=Debes estar cerca de un molino para crear harina. 11656=Debes estar cerca de un horno para cocer alimentos. +11657=magdalenas // 11801 - 12000 Habilidad de Artesanía // Página 1 - Artículos de madera 11801=Eje diff --git a/data/dictionaries/dictionary.ZRO b/data/dictionaries/dictionary.ZRO index 5792f2860..33e71a7de 100644 --- a/data/dictionaries/dictionary.ZRO +++ b/data/dictionaries/dictionary.ZRO @@ -4674,7 +4674,6 @@ 11619=bread loaf 11620=pan of cookies 11621=cake -11622=muffins 11622=baked quiche 11623=baked meat pie 11624=sausage pizza @@ -4710,6 +4709,7 @@ 11654=You must be near a heat source to cook food. 11655=You must be near a mill to create flour. 11656=You must be near an oven to bake food. +11657=muffins // 11801 - 12000 Tinkering Crafting Skill // Page 1 - Wooden Items 11801=Axle diff --git a/data/js/skill/craft/cooking.js b/data/js/skill/craft/cooking.js index 654533e8a..1ce12dd8f 100644 --- a/data/js/skill/craft/cooking.js +++ b/data/js/skill/craft/cooking.js @@ -21,7 +21,7 @@ const myPage = [ [ 11611, 11612, 11613, 11614, 11615, 11616, 11617, 11618 ], // Page 3 - Baking - [ 11619, 11620, 11621, 11622, 11623, 11624, 11625, 11626, 11627, 11628, 11629 ], + [11619, 11620, 11621, 11657, 11622, 11623, 11624, 11625, 11626, 11627, 11628, 11629 ], // Page 4 - Barbecue [ 11630, 11631, 11632, 11633, 11634, 11635 ] diff --git a/data/js/skill/craft/itemdetailgump.js b/data/js/skill/craft/itemdetailgump.js index 0f4e1ad20..7ddbe18ee 100644 --- a/data/js/skill/craft/itemdetailgump.js +++ b/data/js/skill/craft/itemdetailgump.js @@ -1525,12 +1525,12 @@ function ItemDetailGump( pUser ) break; case 1501: // Dough createEntry = CreateEntries[1501]; - HARVEST = [11637, 11639]; + HARVEST = [11637, 11638]; mainSkill = parseInt( pUser.skills.cooking ); break; case 1502: // Sweet Dough createEntry = CreateEntries[1502]; - HARVEST = [11607, 11638]; + HARVEST = [11607, 11639]; mainSkill = parseInt( pUser.skills.cooking ); break; case 1503: // Cake Mix From 5d7ea2bbb625a5f1de5ee1381e95acfbcb3e8bb0 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:38:17 -0500 Subject: [PATCH 47/84] update lootlists Missing lootlists for treasure maps --- data/dfndata/items/lootlists.dfn | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/data/dfndata/items/lootlists.dfn b/data/dfndata/items/lootlists.dfn index 7a62a53fd..0638b0eee 100644 --- a/data/dfndata/items/lootlists.dfn +++ b/data/dfndata/items/lootlists.dfn @@ -962,4 +962,53 @@ 100|PaintedPlagueMask 100|PaintedDaemonMask 100|PaintedEvilClownMask +} + +// Treasure Map Level 0 +[LOOTLIST TreasureMapLvl0Loot] +{//approximately 1% +990|blank +10|treasuremaplvl0 +} + +// Treasure Map Level 1 +[LOOTLIST TreasureMapLvl1Loot] +{//approximately 1% +990|blank +10|treasuremaplvl1 +} + +// Treasure Map Level 2 +[LOOTLIST TreasureMapLvl2Loot] +{//approximately 1% +990|blank +10|treasuremaplvl2 +} + +// Treasure Map Level 3 +[LOOTLIST TreasureMapLvl3Loot] +{//approximately 1% +990|blank +10|treasuremaplvl3 +} + +// Treasure Map Level 4 +[LOOTLIST TreasureMapLvl4Loot] +{//approximately 1% +990|blank +10|treasuremaplvl4 +} + +// Treasure Map Level 5 +[LOOTLIST TreasureMapLvl5Loot] +{//approximately 1% +990|blank +10|treasuremaplvl5 +} + +// Treasure Map Level 6 +[LOOTLIST TreasureMapLvl6Loot] +{//approximately 1% +990|blank +10|treasuremaplvl6 } \ No newline at end of file From 16a2b4a822881c75f73a6e7082a28e57458b2fb4 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Wed, 21 Aug 2024 19:15:13 -0500 Subject: [PATCH 48/84] just small details cleanup remove couple extra test msgs and fixed spacing --- data/js/item/holidays/addondeedgump.js | 2 +- data/js/item/holidays/candy.js | 2 -- data/js/item/holidays/halloweenmasks.js | 2 +- data/js/item/holidays/headonaspike.js | 6 +++--- data/js/item/holidays/holidaypottedplant.js | 8 ++++---- data/js/item/holidays/pumpkins.js | 20 ++++++++++---------- data/js/item/holidays/snowpile.js | 6 +++--- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/data/js/item/holidays/addondeedgump.js b/data/js/item/holidays/addondeedgump.js index 36e94e3e3..1f0851f6e 100644 --- a/data/js/item/holidays/addondeedgump.js +++ b/data/js/item/holidays/addondeedgump.js @@ -181,7 +181,7 @@ function CheckForNearbyDoors( myTarget, itemToCheck, pSocket ) } } - if( myTarget.DistanceTo(itemToCheck) <= 2 ) + if( myTarget.DistanceTo( itemToCheck ) <= 2 ) { return true; } diff --git a/data/js/item/holidays/candy.js b/data/js/item/holidays/candy.js index cbe3cdae9..ed007641a 100644 --- a/data/js/item/holidays/candy.js +++ b/data/js/item/holidays/candy.js @@ -18,7 +18,6 @@ function onUseChecked(pUser, iUsed) } else { - socket.SysMessage("test 1"); if( Acidity <= 30 ) { pUser.SetTempTag( "Acidity", Acidity += 5 ); @@ -26,7 +25,6 @@ function onUseChecked(pUser, iUsed) if ( Toothach == 0) { - socket.SysMessage("test 2"); pUser.SetTempTag( "toothach", 1 ); pUser.StartTimer( 1000, 0, true ); } diff --git a/data/js/item/holidays/halloweenmasks.js b/data/js/item/holidays/halloweenmasks.js index ac1919dd4..f1f031843 100644 --- a/data/js/item/holidays/halloweenmasks.js +++ b/data/js/item/holidays/halloweenmasks.js @@ -3,7 +3,7 @@ function onCreateDFN( objMade, objType ) if( objType == 0 ) { var maskname = ""; - switch(objMade.GetTag( "paintedmask" )) + switch( objMade.GetTag( "paintedmask" )) { case 1: maskname = "A Evil Clown Mask"; break; case 2: maskname = "A Daemon Mask"; break; diff --git a/data/js/item/holidays/headonaspike.js b/data/js/item/holidays/headonaspike.js index 8da857603..44b8b6192 100644 --- a/data/js/item/holidays/headonaspike.js +++ b/data/js/item/holidays/headonaspike.js @@ -4,7 +4,7 @@ function onUseChecked( pUser, iUsed ) var headspike = new Gump; var head = 0; - switch (iUsed.sectionID) + switch( iUsed.sectionID ) { case "MrsTroubleMakersHeadOnASpike": head = 30522; break; case "BrutrinsHeadOnASpike": head = 30522; break; @@ -20,7 +20,7 @@ function onUseChecked( pUser, iUsed ) default: head = 30522; } - headspike.AddGump(100, 100, head); - headspike.Send(pUser); + headspike.AddGump( 100, 100, head ); + headspike.Send( pUser ); headspike.Free(); } \ No newline at end of file diff --git a/data/js/item/holidays/holidaypottedplant.js b/data/js/item/holidays/holidaypottedplant.js index 0cc81122f..df0948203 100644 --- a/data/js/item/holidays/holidaypottedplant.js +++ b/data/js/item/holidays/holidaypottedplant.js @@ -11,14 +11,14 @@ function onUseChecked( pUser, iUsed ) PottedPlantGump( pUser, iUsed ); } -function PottedPlantGump(pUser, iUsed) +function PottedPlantGump( pUser, iUsed ) { var socket = pUser.socket; socket.tempObj = iUsed; var pottedPlant = new Gump; pottedPlant.AddPage( 0 ); - pottedPlant.AddBackground(0, 0, 360, 195, 0xA28); + pottedPlant.AddBackground( 0, 0, 360, 195, 0xA28 ); pottedPlant.AddPage( 1 ); pottedPlant.AddText( 45, 15, 0, "Choose a Potted Plant:" ); @@ -35,7 +35,7 @@ function PottedPlantGump(pUser, iUsed) pottedPlant.Free(); } -function onGumpPress(pSock, pButton, gumpData) +function onGumpPress( pSock, pButton, gumpData ) { var pUser = pSock.currentChar; var iUsed = pSock.tempObj; @@ -48,7 +48,7 @@ function onGumpPress(pSock, pButton, gumpData) } var pottedplant = ""; - if ( pButton >= 1 && pButton <= 5 ) + if( pButton >= 1 && pButton <= 5 ) { var plantIds = [0x11C8, 0x11C9, 0x11CA, 0x11CB, 0x11CC]; pottedplant = "0x" + ( plantIds[pButton - 1] ).toString( 16 ); diff --git a/data/js/item/holidays/pumpkins.js b/data/js/item/holidays/pumpkins.js index e63df2678..68cb883a8 100644 --- a/data/js/item/holidays/pumpkins.js +++ b/data/js/item/holidays/pumpkins.js @@ -16,7 +16,7 @@ function onCreateDFN( objMade, objType ) if( objMade.id == 0x0C6A || objMade.id == 0x0C6B ) { - objMade.weight = Math.floor(Math.random() * ( 2500 - 1200 + 1 ) + 1200); + objMade.weight = Math.floor( Math.random() * ( 2500 - 1200 + 1 ) + 1200 ); } else if( objMade.id == 0x0C6C ) { @@ -72,22 +72,22 @@ function onUseChecked( pUser, iUsed ) // Randomize countdown length, if enabled if( randomizePumpkinCountdown ) { - iUsed.speed = RandomNumber(iUsed.speed - 1, iUsed.speed + 1); + iUsed.speed = RandomNumber( iUsed.speed - 1, iUsed.speed + 1 ); } // Item's speed forms the basis of the countdownTime var countdownTime = iUsed.speed * 1000; // Start the initial timer that shows the first number over the character/object's head - iUsed.StartTimer(200, 1, true); + iUsed.StartTimer( 200, 1, true ); // Start timers with IDs from 2, and count until we reach item's speed + 1 var iCount = 2; - for (iCount = 2; iCount < (iUsed.speed + 2); iCount++) + for( iCount = 2; iCount < ( iUsed.speed + 2 ); iCount++ ) { - iUsed.StartTimer((iCount - 1) * 1000, iCount, true); + iUsed.StartTimer(( iCount - 1) * 1000, iCount, true ); } - socket.CustomTarget(0, GetDictionaryEntry(1348, socket.language)); //Now would be a good time to throw it! + socket.CustomTarget( 0, GetDictionaryEntry( 1348, socket.language )); //Now would be a good time to throw it! } return false; } @@ -96,7 +96,7 @@ function onCallback0( socket, ourObj ) { var mChar = socket.currentChar; var iUsed = socket.tempObj; - if ( mChar && mChar.isChar && iUsed && iUsed.isItem ) + if( mChar && mChar.isChar && iUsed && iUsed.isItem ) { var StrangeByte = socket.GetWord( 1 ); if( StrangeByte == 0 && ourObj ) @@ -107,7 +107,7 @@ function onCallback0( socket, ourObj ) iUsed.container = null; iUsed.Teleport( ourObj ); } - else + else { socket.SysMessage( GetDictionaryEntry( 1646, socket.language )); // You cannot see that @@ -252,7 +252,7 @@ function ApplyExplosionDamage( timerObj, targetChar ) return; // Deal damage, and do criminal check for source character! - targetChar.Damage(RandomNumber( timerObj.lodamage, timerObj.hidamage ), 5, sourceChar, true ); + targetChar.Damage( RandomNumber( timerObj.lodamage, timerObj.hidamage ), 5, sourceChar, true ); // If target is an NPC, make them attack the person who threw the potion! if( targetChar.npc && targetChar.target == null && targetChar.atWar == false ) @@ -299,7 +299,7 @@ function onPickup( iPickedUp, pGrabber, containerObj ) else if( iPickedUp.GetTag( "Named" ) == 0 ) { iPickedUp.name = pGrabber.name + " Pumpkin"; - iPickedUp.SetTag("Named", 1); + iPickedUp.SetTag( "Named", 1 ); } } return true; diff --git a/data/js/item/holidays/snowpile.js b/data/js/item/holidays/snowpile.js index c2e92ecc9..58d289745 100644 --- a/data/js/item/holidays/snowpile.js +++ b/data/js/item/holidays/snowpile.js @@ -59,7 +59,7 @@ function onCallback0( socket, myTarget ) pUser.visible = 0; } - if (!socket.GetWord(1) && myTarget.isChar && myTarget.socket ) + if( !socket.GetWord( 1 ) && myTarget.isChar && myTarget.socket ) { pUser.DoAction( 0x9 ); pUser.SoundEffect( 0x145, true ); @@ -73,10 +73,10 @@ function onCallback0( socket, myTarget ) } } -function onTimer( pUser, timerID ) +function onTimer( pUser, timerID ) { var socket = pUser.socket; - if( pUser.visible == 1 || pUser.visible == 2 ) + if( pUser.visible == 1 || pUser.visible == 2 ) { pUser.visible = 0; } From 5724bb8c11f57be5b0db4e87d4c32df796f9b023 Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Sat, 7 Dec 2024 12:45:18 -0600 Subject: [PATCH 49/84] Updaed 0xf1 packet The packet now reflects the current CUO Web Ping and remains backward compatible with older ping statuses. --- .../network/0xf1_freeshardServerPoll.js | 42 +++++++++++++++++-- source/Changelog.txt | 3 ++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/data/js/server/network/0xf1_freeshardServerPoll.js b/data/js/server/network/0xf1_freeshardServerPoll.js index 4b278c240..33e2f1434 100644 --- a/data/js/server/network/0xf1_freeshardServerPoll.js +++ b/data/js/server/network/0xf1_freeshardServerPoll.js @@ -1,6 +1,6 @@ // Handler for Freeshard Server Poll requests from // CUO Web (https://play.classicuo.org) -// Last Updated: 5. September, 2022 +// Last Updated: 3. Decemeber, 2024 function PacketRegistration() { @@ -27,7 +27,18 @@ function onPacketReceive( pSocket, packetNum, subCommand ) else { Console.Print( "Freeshard Server Poll Packet detected, responding..." ); - SendServerPollInfo( pSocket ); + SendServerPollInfoCompact( pSocket ); + } + break; + case 0xFF: + if( !GetServerSetting( "FREESHARDSERVERPOLL" )) + { + Console.Print( "Freeshard Server Poll Packet detected; response disabled via FREESHARDPOLL ini-setting.\n" ); + } + else + { + Console.Print( "Freeshard Server Poll Packet detected, responding..." ); + SendServerPollInfoExtended( pSocket ); } break; default: @@ -36,7 +47,7 @@ function onPacketReceive( pSocket, packetNum, subCommand ) return; } -function SendServerPollInfo( pSocket ) +function SendServerPollInfoCompact( pSocket ) { var uptime = Math.floor( GetCurrentClock() / 1000 ) - Math.floor( GetStartTime() / 1000 ); var totalAccounts = GetAccountCount(); @@ -55,8 +66,31 @@ function SendServerPollInfo( pSocket ) toSend.WriteLong( 15, uptime ); // Server Uptime toSend.WriteLong( 19, memoryHigh ); // Max memory usage - no need to send toSend.WriteLong( 23, memoryLow ); // Min memory usage - no need to send - pSocket.Send( toSend ); + pSocket.Send(toSend); toSend.Free(); Console.Print( "Done!\n" ); Console.Log( "Response sent to Freeshard Server Poll Packet (totalOnline: " + totalOnline + ", upTimeInSeconds: " + uptime ); } + +function SendServerPollInfoExtended( pSocket ) +{ + var protocolVersion = 2; + var shardName = GetServerSetting( "SERVERNAME" ); + var uptime = Math.floor( GetCurrentClock() / 1000 ) - Math.floor( GetStartTime() / 1000 ); + var totalOnline = GetPlayerCount(); + var totalItems = 0; + var totalChars = 0; + var totalMemory = 0; + var statsStr = "UOX3, Name=" + shardName + ", Age=" + Math.round( uptime / 60 / 60 ) + ", Clients=" + totalOnline + ", Items=" + totalItems + ", Chars=" + totalChars + ", Mem=" + totalMemory + "K, Ver=" + protocolVersion; + var toSend = new Packet; + + toSend.ReserveSize( statsStr.length + 2 ); + toSend.WriteByte( 0, 0x53 ); // PacketID + toSend.WriteShort( 1, statsStr.length ); // Length + toSend.WriteString( 3, statsStr, statsStr.length ); + toSend.WriteByte( statsStr.length + 1, 0x00 ); // null terminated + pSocket.Send( toSend ); + toSend.Free(); + Console.Print( "Done!\n" ); + Console.Log( "Response sent to Freeshard Server Poll Packet (totalOnline: " + totalOnline + ", upTimeInSeconds: " + uptime ); +} \ No newline at end of file diff --git a/source/Changelog.txt b/source/Changelog.txt index f64afbc32..205fd42de 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -1,3 +1,6 @@ +07/12/2024 - Dragon Slayer +Updated the packet 0xf1 to reflect the current CUO Web Ping while maintaining backward compatibility with older ping statuses. (0xf1_freeshardServerPoll.js) (Thanks Karasho and Xuri) + 1/05/2024 - Dragon Slayer/Xuri Fixed AutoUnequipAttempt function in clumsy.js, createfood.js level1target.js, will no longer fail on casting and return to hardcode. Fixed createfood to check for reagents on cast. From 45405e9db4b1cb02ced7151c946ae373e4cb939c Mon Sep 17 00:00:00 2001 From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com> Date: Fri, 20 Dec 2024 20:04:43 -0600 Subject: [PATCH 50/84] onSpellTargetSelect, two parameters corrected onSpellTargetSelect had two parameters are in the wrong order in docs now been corerected. (Thanks Xuri --- docs/jsdocs.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/jsdocs.html b/docs/jsdocs.html index 8dbe347a8..8665ea36c 100644 --- a/docs/jsdocs.html +++ b/docs/jsdocs.html @@ -4018,7 +4018,7 @@

January 9th, 2022

Prototype

-

function onSpellTargetSelect( pCaster, myTarget, spellID )

+

function onSpellTargetSelect( myTarget, pCaster, spellID )

Purpose

@@ -4043,7 +4043,7 @@

January 9th, 2022

Example of usage

// Script attached to an NPC that's immune to magic, where event returns 2 to reject spell being cast
-function onSpellTargetSelect( pCaster, myTarget, spellID )
+function onSpellTargetSelect( myTarget, pCaster, spellID )
 {
 	var socket = pCaster.socket;
 	if( socket != null )

From bc3cfdbe2e7a42a4bfbd217cecb2c71eaa145041 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Tue, 14 Jan 2025 21:24:23 -0600
Subject: [PATCH 51/84] Update to Speed Increase

This now works on the chars as well as items, After reading more on this and finding it out it was part of the chars not just a  new tag for items.
---
 data/js/commands/targeting/set.js | 7 +++++++
 source/UOXJSPropertyEnums.h       | 1 +
 source/UOXJSPropertyFuncs.cpp     | 2 ++
 source/UOXJSPropertySpecs.h       | 1 +
 source/cChar.cpp                  | 7 +++++++
 5 files changed, 18 insertions(+)

diff --git a/data/js/commands/targeting/set.js b/data/js/commands/targeting/set.js
index e9b4f3226..ce7e87172 100644
--- a/data/js/commands/targeting/set.js
+++ b/data/js/commands/targeting/set.js
@@ -169,6 +169,13 @@ function onCallback0( socket, ourObj )
 		ourObj.tempdex = nVal;
 		okMsg( socket );
 		break;
+	case "SPEEDINC":
+	case "SPEEDINCREASE":
+	case "SWINGSPEEDINC":
+	case "SWINGSPEEDINCREASE":
+		ourObj.speedIncrease = nVal;
+		okMsg( socket );
+		break;
 	case "WIPABLE":
 	case "WIPEABLE":
 		ourObj.wipable = ( nVal == 1 );
diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h
index ed8bb09f4..38467649f 100644
--- a/source/UOXJSPropertyEnums.h
+++ b/source/UOXJSPropertyEnums.h
@@ -339,6 +339,7 @@ enum CC_Properties
 	CCP_SPAWNSERIAL,
 	CCP_SPATTACK,
 	CCP_SPDELAY,
+	CCP_SPEEDINCREASE,
 	CCP_AITYPE,
 	CCP_SPLIT,
 	CCP_SPLITCHANCE,
diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp
index 0ba5ed693..7342ff71e 100644
--- a/source/UOXJSPropertyFuncs.cpp
+++ b/source/UOXJSPropertyFuncs.cpp
@@ -1996,6 +1996,7 @@ JSBool CCharacterProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsva
 			case CCP_HOUSEICONS:	*vp = BOOLEAN_TO_JSVAL( gPriv->ViewHouseAsIcon() );			break;
 			case CCP_SPATTACK:		*vp = INT_TO_JSVAL( gPriv->GetSpAttack() );					break;
 			case CCP_SPDELAY:		*vp = INT_TO_JSVAL( gPriv->GetSpDelay() );					break;
+			case CCP_SPEEDINCREASE:	*vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() );		break;
 			case CCP_AITYPE:		*vp = INT_TO_JSVAL( gPriv->GetNpcAiType() );				break;
 			case CCP_SPLIT:			*vp = INT_TO_JSVAL( gPriv->GetSplit() );					break;
 			case CCP_SPLITCHANCE:	*vp = INT_TO_JSVAL( gPriv->GetSplitChance() );				break;
@@ -2501,6 +2502,7 @@ JSBool CCharacterProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsva
 			case CCP_HOUSEICONS:	gPriv->SetViewHouseAsIcon( encaps.toBool() );				break;
 			case CCP_SPATTACK:		gPriv->SetSpAttack( static_cast( encaps.toInt() ));	break;
 			case CCP_SPDELAY:		gPriv->SetSpDelay( static_cast( encaps.toInt() ));	break;
+			case CCP_SPEEDINCREASE:	gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() ));		break;
 			case CCP_AITYPE:		gPriv->SetNPCAiType( static_cast( encaps.toInt() ));	break;
 			case CCP_SPLIT:			gPriv->SetSplit( static_cast( encaps.toInt() ));		break;
 			case CCP_SPLITCHANCE:	gPriv->SetSplitChance( static_cast( encaps.toInt() ));break;
diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h
index 710cd317e..4e53b84be 100644
--- a/source/UOXJSPropertySpecs.h
+++ b/source/UOXJSPropertySpecs.h
@@ -357,6 +357,7 @@ inline JSPropertySpec CCharacterProps[] =
 	{ "houseicons",		CCP_HOUSEICONS,		JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "spattack",		CCP_SPATTACK,		JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "spdelay",		CCP_SPDELAY,		JSPROP_ENUMANDPERM, nullptr, nullptr },
+	{ "speedIncrease",	CCP_SPEEDINCREASE,	JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "aitype",			CCP_AITYPE,			JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "split",			CCP_SPLIT,			JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "splitchance",	CCP_SPLITCHANCE,	JSPROP_ENUMANDPERM, nullptr, nullptr },
diff --git a/source/cChar.cpp b/source/cChar.cpp
index 182409af1..2767609dc 100644
--- a/source/cChar.cpp
+++ b/source/cChar.cpp
@@ -2398,6 +2398,7 @@ void CChar::CopyData( CChar *target )
 	target->SetDisabled( IsDisabled() );
 	target->SetCanHire( CanBeHired() );
 	target->SetCanTrain( CanTrain() );
+	target->SetSwingSpeedIncrease( GetSwingSpeedIncrease() );
 	target->SetLastOn( GetLastOn() );
 	target->SetLastOnSecs( GetLastOnSecs() );
 	target->SetPlayTime( GetPlayTime() );
@@ -3139,6 +3140,7 @@ bool CChar::DumpBody( std::ostream &outStream ) const
 	//-------------------------------------------------------------------------------------------
 	outStream << "CanRun=" + std::to_string((( CanRun() && IsNpc() ) ? 1 : 0 )) + newLine;
 	outStream << "CanAttack=" + std::to_string(( GetCanAttack() ? 1 : 0 )) + newLine;
+	outStream << "SpeedInc=" + std::to_string( GetSwingSpeedIncrease() ) + newLine;
 	outStream << "AllMove=" + std::to_string(( AllMove() ? 1 : 0 )) + newLine;
 	outStream << "IsNpc=" + std::to_string(( IsNpc() ? 1 : 0 )) + newLine;
 	outStream << "IsShop=" + std::to_string(( IsShop() ? 1 : 0 )) + newLine;
@@ -4822,6 +4824,11 @@ bool CChar::HandleLine( std::string &UTag, std::string &data )
 					SetEmoteColour( static_cast( std::stoul (oldstrutil::trim( oldstrutil::removeTrailing( csecs[1], "//" )), nullptr, 0 )));
 					rValue = true;
 				}
+				else if( UTag == "SPEEDINC" )
+				{
+					SetSwingSpeedIncrease( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
+					rValue = true;
+				}
 				else if( UTag == "STABLED" )
 				{
 					SetStabled( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 );

From cd35741ff276118143e46d1f023851059bc20a36 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Tue, 14 Jan 2025 21:44:16 -0600
Subject: [PATCH 52/84] Update

Updated so they work directly on chars for the DCI and HCI just like retail AOS
---
 source/UOXJSPropertyEnums.h   |  2 ++
 source/UOXJSPropertyFuncs.cpp |  4 ++++
 source/UOXJSPropertySpecs.h   |  2 ++
 source/cChar.cpp              | 16 +++++++++++++++-
 4 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h
index f471df16e..a99bd3628 100644
--- a/source/UOXJSPropertyEnums.h
+++ b/source/UOXJSPropertyEnums.h
@@ -339,6 +339,8 @@ enum CC_Properties
 	CCP_SPAWNSERIAL,
 	CCP_SPATTACK,
 	CCP_SPDELAY,
+	CCP_HITCHANCE,
+	CCP_DEFENSECHANCE,
 	CCP_AITYPE,
 	CCP_SPLIT,
 	CCP_SPLITCHANCE,
diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp
index 02ff0cbb2..ef170971c 100644
--- a/source/UOXJSPropertyFuncs.cpp
+++ b/source/UOXJSPropertyFuncs.cpp
@@ -1998,6 +1998,8 @@ JSBool CCharacterProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsva
 			case CCP_HOUSEICONS:	*vp = BOOLEAN_TO_JSVAL( gPriv->ViewHouseAsIcon() );			break;
 			case CCP_SPATTACK:		*vp = INT_TO_JSVAL( gPriv->GetSpAttack() );					break;
 			case CCP_SPDELAY:		*vp = INT_TO_JSVAL( gPriv->GetSpDelay() );					break;
+			case CCP_HITCHANCE:		*vp = INT_TO_JSVAL( gPriv->GetHitChance() );				break;
+			case CCP_DEFENSECHANCE:	*vp = INT_TO_JSVAL( gPriv->GetDefenseChance() );			break;
 			case CCP_AITYPE:		*vp = INT_TO_JSVAL( gPriv->GetNpcAiType() );				break;
 			case CCP_SPLIT:			*vp = INT_TO_JSVAL( gPriv->GetSplit() );					break;
 			case CCP_SPLITCHANCE:	*vp = INT_TO_JSVAL( gPriv->GetSplitChance() );				break;
@@ -2503,6 +2505,8 @@ JSBool CCharacterProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsva
 			case CCP_HOUSEICONS:	gPriv->SetViewHouseAsIcon( encaps.toBool() );				break;
 			case CCP_SPATTACK:		gPriv->SetSpAttack( static_cast( encaps.toInt() ));	break;
 			case CCP_SPDELAY:		gPriv->SetSpDelay( static_cast( encaps.toInt() ));	break;
+			case CCP_HITCHANCE:		gPriv->SetHitChance( static_cast( encaps.toInt() ));	break;
+			case CCP_DEFENSECHANCE:	gPriv->SetDefenseChance( static_cast( encaps.toInt() ));	break;
 			case CCP_AITYPE:		gPriv->SetNPCAiType( static_cast( encaps.toInt() ));	break;
 			case CCP_SPLIT:			gPriv->SetSplit( static_cast( encaps.toInt() ));		break;
 			case CCP_SPLITCHANCE:	gPriv->SetSplitChance( static_cast( encaps.toInt() ));break;
diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h
index b77c023aa..1585d151a 100644
--- a/source/UOXJSPropertySpecs.h
+++ b/source/UOXJSPropertySpecs.h
@@ -357,6 +357,8 @@ inline JSPropertySpec CCharacterProps[] =
 	{ "houseicons",		CCP_HOUSEICONS,		JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "spattack",		CCP_SPATTACK,		JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "spdelay",		CCP_SPDELAY,		JSPROP_ENUMANDPERM, nullptr, nullptr },
+	{ "hitChance",		CCP_HITCHANCE,		JSPROP_ENUMANDPERM, nullptr, nullptr },
+	{ "defenseChance",	CCP_DEFENSECHANCE,	JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "aitype",			CCP_AITYPE,			JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "split",			CCP_SPLIT,			JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "splitchance",	CCP_SPLITCHANCE,	JSPROP_ENUMANDPERM, nullptr, nullptr },
diff --git a/source/cChar.cpp b/source/cChar.cpp
index 6bb36cb56..eb70922f6 100644
--- a/source/cChar.cpp
+++ b/source/cChar.cpp
@@ -2411,6 +2411,8 @@ void CChar::CopyData( CChar *target )
 	target->SetNextAct( nextAct );
 	target->SetSquelched( GetSquelched() );
 	target->SetMeditating( IsMeditating() );
+	target->SetHitChance( GetHitChance() );
+	target->SetDefenseChance( GetDefenseChance() );
 	target->SetStealth( stealth );
 	target->SetRunning( running );
 	target->SetRace( GetRace() );
@@ -3141,6 +3143,8 @@ bool CChar::DumpBody( std::ostream &outStream ) const
 	//-------------------------------------------------------------------------------------------
 	outStream << "CanRun=" + std::to_string((( CanRun() && IsNpc() ) ? 1 : 0 )) + newLine;
 	outStream << "CanAttack=" + std::to_string(( GetCanAttack() ? 1 : 0 )) + newLine;
+	outStream << "HitChance=" + std::to_string( GetHitChance() ) + newLine;
+	outStream << "DefChance=" + std::to_string( GetDefenseChance() ) + newLine;
 	outStream << "AllMove=" + std::to_string(( AllMove() ? 1 : 0 )) + newLine;
 	outStream << "IsNpc=" + std::to_string(( IsNpc() ? 1 : 0 )) + newLine;
 	outStream << "IsShop=" + std::to_string(( IsShop() ? 1 : 0 )) + newLine;
@@ -4379,6 +4383,11 @@ bool CChar::HandleLine( std::string &UTag, std::string &data )
 					SetDead(( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 ));
 					rValue = true;
 				}
+				else if( UTag == "DEFCHANCE" )
+				{
+					SetDefenseChance( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
+					rValue = true;
+				}
 				break;
 			case 'E':
 				if( UTag == "EMOTION" )
@@ -4467,7 +4476,12 @@ bool CChar::HandleLine( std::string &UTag, std::string &data )
 				}
 				break;
 			case 'H':
-				if( UTag == "HUNGER" )
+				if( UTag == "HITCHANCE" )
+				{
+					SetHitChance( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
+					rValue = true;
+				}
+				else if( UTag == "HUNGER" )
 				{
 					SetHunger( static_cast( std::stoi( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
 					rValue = true;

From b82b9dcc6005fde43380c592cf208a925fe51c97 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Tue, 14 Jan 2025 22:16:11 -0600
Subject: [PATCH 53/84] update

---
 data/js/commands/targeting/get.js | 3 +++
 data/js/commands/targeting/set.js | 5 +----
 source/UOXJSPropertyEnums.h       | 4 ++--
 source/UOXJSPropertyFuncs.cpp     | 8 ++++----
 source/UOXJSPropertySpecs.h       | 4 ++--
 source/cBaseObject.cpp            | 7 ++++---
 source/cChar.cpp                  | 4 ++--
 source/cItem.cpp                  | 5 +++--
 8 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/data/js/commands/targeting/get.js b/data/js/commands/targeting/get.js
index 365d3a2b3..8f3e3e691 100644
--- a/data/js/commands/targeting/get.js
+++ b/data/js/commands/targeting/get.js
@@ -169,6 +169,9 @@ function onCallback0( socket, ourObj )
 	case "SECTIONID":
 		socket.SysMessage( ourObj.sectionID );
 		break;
+	case "SWINGSPEEDINC":
+		socket.SysMessage( swingSpeedIncrease );
+		break;
 	case "SHOULDSAVE":
 		socket.SysMessage( ourObj.shouldSave );
 		break;
diff --git a/data/js/commands/targeting/set.js b/data/js/commands/targeting/set.js
index ce7e87172..9bd3cc0bb 100644
--- a/data/js/commands/targeting/set.js
+++ b/data/js/commands/targeting/set.js
@@ -169,11 +169,8 @@ function onCallback0( socket, ourObj )
 		ourObj.tempdex = nVal;
 		okMsg( socket );
 		break;
-	case "SPEEDINC":
-	case "SPEEDINCREASE":
 	case "SWINGSPEEDINC":
-	case "SWINGSPEEDINCREASE":
-		ourObj.speedIncrease = nVal;
+		ourObj.swingSpeedIncrease = nVal;
 		okMsg( socket );
 		break;
 	case "WIPABLE":
diff --git a/source/UOXJSPropertyEnums.h b/source/UOXJSPropertyEnums.h
index 38467649f..23e9c5062 100644
--- a/source/UOXJSPropertyEnums.h
+++ b/source/UOXJSPropertyEnums.h
@@ -339,7 +339,7 @@ enum CC_Properties
 	CCP_SPAWNSERIAL,
 	CCP_SPATTACK,
 	CCP_SPDELAY,
-	CCP_SPEEDINCREASE,
+	CCP_SWINGSPEEDINCREASE,
 	CCP_AITYPE,
 	CCP_SPLIT,
 	CCP_SPLITCHANCE,
@@ -517,7 +517,7 @@ enum CI_Properties
 	CIP_ISCONTTYPE,
 	CIP_CARVESECTION,
 	CIP_SPEED,
-	CIP_SPEEDINCREASE  ,
+	CIP_SWINGSPEEDINCREASE,
 	CIP_MULTI,
 	CIP_AMMOID,
 	CIP_AMMOHUE,
diff --git a/source/UOXJSPropertyFuncs.cpp b/source/UOXJSPropertyFuncs.cpp
index 7342ff71e..6da1688db 100644
--- a/source/UOXJSPropertyFuncs.cpp
+++ b/source/UOXJSPropertyFuncs.cpp
@@ -675,7 +675,7 @@ JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp
 			case CIP_DAMAGEPOISON:		*vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( POISON ));	break;
 			case CIP_DAMAGERAIN:		*vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN ));	break;
 			case CIP_DAMAGESNOW:		*vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW ));	break;
-			case CIP_SPEEDINCREASE:	*vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() );			break;
+			case CIP_SWINGSPEEDINCREASE:	*vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() );			break;
 			case CIP_SPEED:			*vp = INT_TO_JSVAL( gPriv->GetSpeed() );			break;
 			case CIP_NAME2:
 				tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() );
@@ -1322,7 +1322,7 @@ JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp
 			case CIP_DAMAGERAIN:	gPriv->SetWeatherDamage( RAIN, encaps.toBool() );			break;
 			case CIP_DAMAGESNOW:	gPriv->SetWeatherDamage( SNOW, encaps.toBool() );			break;
 			case CIP_SPEED:			gPriv->SetSpeed( static_cast( encaps.toInt() ));		break;
-			case CIP_SPEEDINCREASE:	gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() ));	break;
+			case CIP_SWINGSPEEDINCREASE:	gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() ));	break;
 			case CIP_NAME2:			gPriv->SetName2( encaps.toString() );						break;
 			case CIP_RACE:			gPriv->SetRace( static_cast( encaps.toInt() ));		break;
 			case CIP_MAXHP:			gPriv->SetMaxHP( static_cast( encaps.toInt() ));		break;
@@ -1996,7 +1996,7 @@ JSBool CCharacterProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsva
 			case CCP_HOUSEICONS:	*vp = BOOLEAN_TO_JSVAL( gPriv->ViewHouseAsIcon() );			break;
 			case CCP_SPATTACK:		*vp = INT_TO_JSVAL( gPriv->GetSpAttack() );					break;
 			case CCP_SPDELAY:		*vp = INT_TO_JSVAL( gPriv->GetSpDelay() );					break;
-			case CCP_SPEEDINCREASE:	*vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() );		break;
+			case CCP_SWINGSPEEDINCREASE:	*vp = INT_TO_JSVAL( gPriv->GetSwingSpeedIncrease() );		break;
 			case CCP_AITYPE:		*vp = INT_TO_JSVAL( gPriv->GetNpcAiType() );				break;
 			case CCP_SPLIT:			*vp = INT_TO_JSVAL( gPriv->GetSplit() );					break;
 			case CCP_SPLITCHANCE:	*vp = INT_TO_JSVAL( gPriv->GetSplitChance() );				break;
@@ -2502,7 +2502,7 @@ JSBool CCharacterProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsva
 			case CCP_HOUSEICONS:	gPriv->SetViewHouseAsIcon( encaps.toBool() );				break;
 			case CCP_SPATTACK:		gPriv->SetSpAttack( static_cast( encaps.toInt() ));	break;
 			case CCP_SPDELAY:		gPriv->SetSpDelay( static_cast( encaps.toInt() ));	break;
-			case CCP_SPEEDINCREASE:	gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() ));		break;
+			case CCP_SWINGSPEEDINCREASE:	gPriv->SetSwingSpeedIncrease( static_cast( encaps.toInt() ));		break;
 			case CCP_AITYPE:		gPriv->SetNPCAiType( static_cast( encaps.toInt() ));	break;
 			case CCP_SPLIT:			gPriv->SetSplit( static_cast( encaps.toInt() ));		break;
 			case CCP_SPLITCHANCE:	gPriv->SetSplitChance( static_cast( encaps.toInt() ));break;
diff --git a/source/UOXJSPropertySpecs.h b/source/UOXJSPropertySpecs.h
index 4e53b84be..07374bd3f 100644
--- a/source/UOXJSPropertySpecs.h
+++ b/source/UOXJSPropertySpecs.h
@@ -357,7 +357,7 @@ inline JSPropertySpec CCharacterProps[] =
 	{ "houseicons",		CCP_HOUSEICONS,		JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "spattack",		CCP_SPATTACK,		JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "spdelay",		CCP_SPDELAY,		JSPROP_ENUMANDPERM, nullptr, nullptr },
-	{ "speedIncrease",	CCP_SPEEDINCREASE,	JSPROP_ENUMANDPERM, nullptr, nullptr },
+	{ "swingSpeedIncrease",	CCP_SWINGSPEEDINCREASE,	JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "aitype",			CCP_AITYPE,			JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "split",			CCP_SPLIT,			JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "splitchance",	CCP_SPLITCHANCE,	JSPROP_ENUMANDPERM, nullptr, nullptr },
@@ -536,7 +536,7 @@ inline JSPropertySpec CItemProps[] =
 	{ "ammoFXHue",		CIP_AMMOFXHUE,		JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "ammoFXRender",	CIP_AMMOFXRENDER,	JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "speed",			CIP_SPEED,			JSPROP_ENUMANDPERM, nullptr, nullptr },
-	{ "speedIncrease",		CIP_SPEEDINCREASE ,		JSPROP_ENUMANDPERM, nullptr, nullptr },
+	{ "swingSpeedIncrease",		CIP_SWINGSPEEDINCREASE ,		JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "multi",			CIP_MULTI,			JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "maxRange",		CIP_MAXRANGE,		JSPROP_ENUMANDPERM, nullptr, nullptr },
 	{ "baseRange",		CIP_BASERANGE,		JSPROP_ENUMANDPERM, nullptr, nullptr },
diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp
index f0263f163..1fccdb2e5 100644
--- a/source/cBaseObject.cpp
+++ b/source/cBaseObject.cpp
@@ -1572,9 +1572,10 @@ Point3_st CBaseObject::GetLocation( void ) const
 
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject::GetSwingSpeedIncrease()
-//|					CBaseObject::SetSwingSpeedIncrease()
+//|					CBaseObject::SetSwingSpeedBonus()
 //o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the item's Swing Speed Increase  property (in percentage), which adjusts the base swing speed of the equipped weapon
+//|	Purpose		-	Gets/Sets the item's Swing Speed Bonus property (in percentage), which 
+//|					adjusts the base swing speed of the equipped weapon, or characters
 //o------------------------------------------------------------------------------------------------o
 SI16 CBaseObject::GetSwingSpeedIncrease( void ) const
 {
@@ -1686,7 +1687,7 @@ void CBaseObject::IncIntelligence( SI16 toInc )
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject::IncSwingSpeedIncrease()
 //o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Increments the object's swing speed value
+//|	Purpose		-	Increments the object's swing speed bonus value
 //o------------------------------------------------------------------------------------------------o
 void CBaseObject::IncSwingSpeedIncrease( SI16 toInc )
 {
diff --git a/source/cChar.cpp b/source/cChar.cpp
index 2767609dc..9092667c1 100644
--- a/source/cChar.cpp
+++ b/source/cChar.cpp
@@ -3140,7 +3140,7 @@ bool CChar::DumpBody( std::ostream &outStream ) const
 	//-------------------------------------------------------------------------------------------
 	outStream << "CanRun=" + std::to_string((( CanRun() && IsNpc() ) ? 1 : 0 )) + newLine;
 	outStream << "CanAttack=" + std::to_string(( GetCanAttack() ? 1 : 0 )) + newLine;
-	outStream << "SpeedInc=" + std::to_string( GetSwingSpeedIncrease() ) + newLine;
+	outStream << "SwingSpeedInc=" + std::to_string( GetSwingSpeedIncrease() ) + newLine;
 	outStream << "AllMove=" + std::to_string(( AllMove() ? 1 : 0 )) + newLine;
 	outStream << "IsNpc=" + std::to_string(( IsNpc() ? 1 : 0 )) + newLine;
 	outStream << "IsShop=" + std::to_string(( IsShop() ? 1 : 0 )) + newLine;
@@ -4824,7 +4824,7 @@ bool CChar::HandleLine( std::string &UTag, std::string &data )
 					SetEmoteColour( static_cast( std::stoul (oldstrutil::trim( oldstrutil::removeTrailing( csecs[1], "//" )), nullptr, 0 )));
 					rValue = true;
 				}
-				else if( UTag == "SPEEDINC" )
+				else if( UTag == "SWINGSPEEDINCREASE" )
 				{
 					SetSwingSpeedIncrease( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
 					rValue = true;
diff --git a/source/cItem.cpp b/source/cItem.cpp
index 44b28b56f..c6d4e3114 100644
--- a/source/cItem.cpp
+++ b/source/cItem.cpp
@@ -1644,6 +1644,7 @@ auto CItem::CopyData( CItem *target ) -> void
 	target->SetStamina( GetStamina() );
 	target->SetStrength( GetStrength() );
 	target->SetStrength2( GetStrength2() );
+	target->SetSwingSpeedIncrease( GetSwingSpeedIncrease() );
 	target->SetTitle( GetTitle() );
 	target->SetType( GetType() );
 	target->SetBuyValue( GetBuyValue() );
@@ -1743,7 +1744,7 @@ bool CItem::DumpBody( std::ostream &outStream ) const
 	outStream << "Restock=" + std::to_string( GetRestock() ) + newLine;
 	outStream << "AC=" + std::to_string( GetArmourClass() ) + newLine;
 	outStream << "Rank=" + std::to_string( GetRank() ) + newLine;
-	outStream << "SpeedIncrease=" + std::to_string( GetSwingSpeedIncrease() ) + newLine;
+	outStream << "SwingSpeedInc=" + std::to_string( GetSwingSpeedIncrease() ) + newLine;
 	outStream << "Sk_Made=" + std::to_string( GetMadeWith() ) + newLine;
 	outStream << "Bools=" + std::to_string(( bools.to_ulong() )) + newLine;
 	outStream << "Good=" + std::to_string( GetGood() ) + newLine;
@@ -2128,7 +2129,7 @@ bool CItem::HandleLine( std::string &UTag, std::string &data )
 					SetStealable( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
 					rValue = true;
 				}
-				else if( UTag == "SPEEDINCREASE" )
+				else if( UTag == "SWINGSPEEDINCREASE" )
 				{
 					SetSwingSpeedIncrease( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
 					rValue = true;

From 481f716f6ea1cdbd2684005141160cb41a44faac Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Tue, 14 Jan 2025 22:32:25 -0600
Subject: [PATCH 54/84] update

---
 source/items.cpp    | 2 +-
 source/npcs.cpp     | 1 +
 source/ssection.cpp | 2 +-
 source/ssection.h   | 2 +-
 4 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/source/items.cpp b/source/items.cpp
index d8f687c7a..b100a143d 100644
--- a/source/items.cpp
+++ b/source/items.cpp
@@ -548,7 +548,7 @@ auto ApplyItemSection( CItem *applyTo, CScriptSection *toApply, std::string sect
 			case DFNTAG_RAIN:			applyTo->SetWeatherDamage( RAIN, ndata != 0 );			break;
 			case DFNTAG_SECTIONID:		applyTo->SetSectionId( cdata );							break;
 			case DFNTAG_SK_MADE:		applyTo->SetMadeWith( static_cast( ndata ));		break;
-			case DFNTAG_SPEEDINCREASE:	applyTo->SetSwingSpeedIncrease( static_cast( ndata ));		break;
+			case DFNTAG_SWINGSPEEDINCREASE:	applyTo->SetSwingSpeedIncrease( static_cast( ndata ));		break;
 			case DFNTAG_SPD:			applyTo->SetSpeed( static_cast( ndata ));			break;
 			case DFNTAG_STRENGTH:		applyTo->SetStrength( static_cast( ndata ));		break;
 			case DFNTAG_STRADD:			applyTo->SetStrength2( static_cast( ndata ));		break;
diff --git a/source/npcs.cpp b/source/npcs.cpp
index 36005b420..0f8400f7d 100644
--- a/source/npcs.cpp
+++ b/source/npcs.cpp
@@ -1583,6 +1583,7 @@ auto CCharStuff::ApplyNpcSection( CChar *applyTo, CScriptSection *NpcCreation, s
 			case DFNTAG_PEACEMAKING:		skillToSet = PEACEMAKING;				break;
 			case DFNTAG_PROVOCATION:		skillToSet = PROVOCATION;				break;
 			case DFNTAG_POISONING:			skillToSet = POISONING;					break;
+			case DFNTAG_SWINGSPEEDINCREASE:	applyTo->SetSwingSpeedIncrease( static_cast( ndata ));		break;
 			case DFNTAG_RESISTFIRE:
 				if( ndata >= 0 )
 				{
diff --git a/source/ssection.cpp b/source/ssection.cpp
index 896203365..9729c867a 100644
--- a/source/ssection.cpp
+++ b/source/ssection.cpp
@@ -476,7 +476,7 @@ const std::map strToDFNTag
 	{"SPAWNOBJLIST"s,		DFNTAG_SPAWNOBJLIST},
 	{"SPD"s,				DFNTAG_SPD},
 	{"SPEED"s,				DFNTAG_SPD},
-	{"SPEEDINCREASE"s,		DFNTAG_SPEEDINCREASE},
+	{"SWINGSPEEDINCREASE"s,	DFNTAG_SWINGSPEEDINCREASE},
 	{"SPELLS"s,				DFNTAG_SPELLS},
 	{"SPELLWEAVING"s,		DFNTAG_SPELLWEAVING},
 	{"SPIRITSPEAK"s,		DFNTAG_SPIRITSPEAK},
diff --git a/source/ssection.h b/source/ssection.h
index 7ac508971..f709d5fc8 100644
--- a/source/ssection.h
+++ b/source/ssection.h
@@ -221,7 +221,7 @@ enum DFNTAGS
 	DFNTAG_SPATTACK,
 	DFNTAG_SPAWNOBJ,
 	DFNTAG_SPAWNOBJLIST,
-	DFNTAG_SPEEDINCREASE,
+	DFNTAG_SWINGSPEEDINCREASE,
 	DFNTAG_SPD,
 	DFNTAG_SPELLS,
 	DFNTAG_SPELLWEAVING,

From 171770910361850ac2e0854b52e26b053e27cf0e Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Tue, 14 Jan 2025 23:04:16 -0600
Subject: [PATCH 55/84] Fixed Weapon Swing Delay

Now you can create a curse state with he swing delay to help balance them magic weapons
---
 source/combat.cpp | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/source/combat.cpp b/source/combat.cpp
index 1c0369ec9..9d0627316 100644
--- a/source/combat.cpp
+++ b/source/combat.cpp
@@ -3476,20 +3476,27 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar )
 
 	R32 globalAttackSpeed = cwmWorldState->ServerData()->GlobalAttackSpeed(); //Defaults to 1.0
 
+	R32 speedFactor = 1 + speedBonus / 10.0f;
+
+	// Prevent zero or negative multipliers
+	if( speedFactor < 0.1f )
+		speedFactor = 0.1f;
+
+
 	if( cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR )
 	{
 		// Weapon swing delay in LBR and earlier
-		getDelay = baseValue / ( getDelay * getOffset * ( 1 + speedBonus / static_cast( 10 ) )) / globalAttackSpeed;
+		getDelay = baseValue / ( getDelay * getOffset * speedFactor ) / globalAttackSpeed;
 	}
 	else if( cwmWorldState->ServerData()->ExpansionCoreShardEra() < ER_ML )
 	{
-		// Weapon swing delay in SE and earlier
-		getDelay = ( baseValue / ( getDelay * getOffset * ( 1 + speedBonus / static_cast( 10 ) )) / 4 - 0.5 ) / globalAttackSpeed;
+		// Weapon swing delay in SE or earlier
+		getDelay = ( baseValue / ( getDelay * getOffset * speedFactor ) / 4 - 0.5 ) / globalAttackSpeed;
 	}
 	else
 	{
 		// Weapon swing delay in ML or later
-		getDelay = ( baseValue / ( getDelay * getOffset * ( 1 + speedBonus / static_cast( 10 ) )) * 0.5 ) / globalAttackSpeed;
+		getDelay = ( baseValue / ( getDelay * getOffset * speedFactor ) * 0.5 ) / globalAttackSpeed;
 	}
 
 	return getDelay;

From 9b9f90d8b0a94efb6da4a33fdb96f6afdabdf73e Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Tue, 14 Jan 2025 23:28:03 -0600
Subject: [PATCH 56/84] update

---
 source/cBaseObject.cpp |  4 ++--
 source/cChar.cpp       |  2 +-
 source/combat.cpp      | 12 +++++++++---
 source/npcs.cpp        |  2 ++
 4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp
index 9eedebfff..e98c3c693 100644
--- a/source/cBaseObject.cpp
+++ b/source/cBaseObject.cpp
@@ -1043,7 +1043,7 @@ void CBaseObject::IncHP( SI16 amtToChange )
 //|	Function	-	CBaseObject::GetHitChance()
 //|					CBaseObject::SetHitChance()
 //o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the Defense Chance of the Item Equiped
+//|	Purpose		-	Gets/Sets the Defense Chance of the Item(s) Equiped or Character
 //o------------------------------------------------------------------------------------------------o
 SI16 CBaseObject::GetHitChance( void ) const
 {
@@ -1063,7 +1063,7 @@ void CBaseObject::SetHitChance( SI16 newValue )
 //|	Function	-	CBaseObject::GetDefenseChance()
 //|					CBaseObject::SetDefenseChance()
 //o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the Defense Chance of the Item Equiped
+//|	Purpose		-	Gets/Sets the Defense Chance of the Item(s) Equiped or Character
 //o------------------------------------------------------------------------------------------------o
 SI16 CBaseObject::GetDefenseChance( void ) const
 {
diff --git a/source/cChar.cpp b/source/cChar.cpp
index eb70922f6..3ae819d15 100644
--- a/source/cChar.cpp
+++ b/source/cChar.cpp
@@ -4383,7 +4383,7 @@ bool CChar::HandleLine( std::string &UTag, std::string &data )
 					SetDead(( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 ));
 					rValue = true;
 				}
-				else if( UTag == "DEFCHANCE" )
+				else if( UTag == "DEFENSECHANCE" )
 				{
 					SetDefenseChance( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
 					rValue = true;
diff --git a/source/combat.cpp b/source/combat.cpp
index 066e3e80e..256f04c3c 100644
--- a/source/combat.cpp
+++ b/source/combat.cpp
@@ -2877,18 +2877,24 @@ bool CHandleCombat::HandleCombat( CSocket *mSock, CChar& mChar, CChar *ourTarg )
 				R32 attHitChanceBonus = 0;
 				R32 defDefenseChanceBonus = 0;
 				R32 maxAttHitChanceBonus = 45;
+
 				if( cwmWorldState->ServerData()->ExpansionCombatHitChance() >= ER_SA && mChar.GetBodyType() == BT_GARGOYLE )
 				{
 					// If attacker is a Gargoyle player, and ExpansionCombatHitChance is ER_SA or higher, use 50 as hitchance bonus cap instead of 45
 					maxAttHitChanceBonus = 50;
 				}
 				
-				// Fetch bonuses to hitChance/defenseChance from AoS item properties
+				// Fetch bonuses to hitChance/defenseChance from AoS item properties or characters
 				attHitChanceBonus = mChar.GetHitChance();
 				defDefenseChanceBonus = mChar.GetDefenseChance();
 
-				R32 attackerHitChance = ( static_cast( attackSkill / 10 ) + 20 ) * ( 100 + std::min( attHitChanceBonus, static_cast( maxAttHitChanceBonus )));
-				R32 defenderDefenseChance = ( static_cast( defendSkill / 10 ) + 20 ) * ( 100 + std::min( defDefenseChanceBonus, static_cast( 45 )));
+				// Clamp to ensure valid bonus ranges (e.g., no multiplier below 1)
+				R32 effectiveAttHitChanceBonus = std::max(-99.0f, std::min( attHitChanceBonus, maxAttHitChanceBonus )); // Cap at -99 and maxAttHitChanceBonus
+				R32 effectiveDefDefenseChanceBonus = std::max(-99.0f, std::min( defDefenseChanceBonus, 45.0f )); // Cap at -99 and 45
+
+				// Calculate the attacker's hit chance and defender's defense chance
+				R32 attackerHitChance = ( static_cast( attackSkill / 10 ) + 20 ) * ( 100 + effectiveAttHitChanceBonus );
+				R32 defenderDefenseChance = ( static_cast( defendSkill / 10 ) + 20 ) * ( 100 + effectiveDefDefenseChanceBonus );
 				hitChance = ( attackerHitChance / ( defenderDefenseChance * 2 )) * 100;
 
 				// Always leave at least 2% chance to hit
diff --git a/source/npcs.cpp b/source/npcs.cpp
index 36005b420..a749b95aa 100644
--- a/source/npcs.cpp
+++ b/source/npcs.cpp
@@ -1541,6 +1541,8 @@ auto CCharStuff::ApplyNpcSection( CChar *applyTo, CScriptSection *NpcCreation, s
 			case DFNTAG_NAMELIST:			SetRandomName( applyTo, cdata );		break;
 			case DFNTAG_NECROMANCY:			skillToSet = NECROMANCY;				break;
 			case DFNTAG_NINJITSU:			skillToSet = NINJITSU;					break;
+			case DFNTAG_HITCHANCE:			applyTo->SetHitChance( static_cast( ndata ));		break;
+			case DFNTAG_DEFENSECHANCE:		applyTo->SetDefenseChance( static_cast( ndata ));		break;
 			case DFNTAG_NPCWANDER:
 				if( !isGate )
 				{

From 41c7ee467664ed3242d8c40603f4be83e8e4a571 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Thu, 16 Jan 2025 18:36:53 -0600
Subject: [PATCH 57/84] Moved Leech Props

Moved Leech props to just items
---
 source/cBaseObject.cpp | 96 +-----------------------------------------
 source/cBaseObject.h   | 16 -------
 source/cItem.cpp       | 83 +++++++++++++++++++++++++++++++++++-
 source/cItem.h         | 16 +++++++
 4 files changed, 99 insertions(+), 112 deletions(-)

diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp
index 2c5ce0b89..506c247ac 100644
--- a/source/cBaseObject.cpp
+++ b/source/cBaseObject.cpp
@@ -94,9 +94,6 @@ const SI16			DEFBASE_KILLS		= 0;
 const UI16			DEFBASE_RESIST 		= 0;
 const bool			DEFBASE_NAMEREQUESTACTIVE = 0;
 const ExpansionRuleset	DEFBASE_ORIGIN	= ER_UO;
-const SI16			DEFBASE_HEALTHLEECH = 0;
-const SI16			DEFBASE_STAMINALEECH = 0;
-const SI16			DEFBASE_MANALEECH = 0;
 
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject constructor
@@ -113,8 +110,7 @@ loDamage( DEFBASE_LODAMAGE ), weight( DEFBASE_WEIGHT ),
 mana( DEFBASE_MANA ), stamina( DEFBASE_STAMINA ), scriptTrig( DEFBASE_SCPTRIG ), st2( DEFBASE_STR2 ), dx2( DEFBASE_DEX2 ),
 in2( DEFBASE_INT2 ), FilePosition( DEFBASE_FP ),
 poisoned( DEFBASE_POISONED ), carve( DEFBASE_CARVE ), oldLocX( 0 ), oldLocY( 0 ), oldLocZ( 0 ), oldTargLocX( 0 ), oldTargLocY( 0 ),
-fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ),
-healthLeech( DEFBASE_HEALTHLEECH ), staminaLeech( DEFBASE_STAMINALEECH ), manaLeech( DEFBASE_MANALEECH )
+fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN )
 {
 	multis = nullptr;
 	tempMulti = INVALIDSERIAL;
@@ -1635,66 +1631,6 @@ void CBaseObject::SetIntelligence2( SI16 nVal )
 	}
 }
 
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CBaseObject::GetHealthLeech()
-//|					CBaseObject::SetHealthLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the Health Leech
-//o------------------------------------------------------------------------------------------------o
-SI16 CBaseObject::GetHealthLeech( void ) const
-{
-	return healthLeech;
-}
-void CBaseObject::SetHealthLeech( SI16 nVal )
-{
-	healthLeech = nVal;
-
-	if( CanBeObjType( OT_ITEM ))
-	{
-		( static_cast( this ))->UpdateRegion();
-	}
-}
-
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CBaseObject::GetStaminaLeech()
-//|					CBaseObject::SetStaminaLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the Stamina Leech
-//o------------------------------------------------------------------------------------------------o
-SI16 CBaseObject::GetStaminaLeech( void ) const
-{
-	return staminaLeech;
-}
-void CBaseObject::SetStaminaLeech( SI16 nVal )
-{
-	staminaLeech = nVal;
-
-	if( CanBeObjType( OT_ITEM ))
-	{
-		( static_cast( this ))->UpdateRegion();
-	}
-}
-
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CBaseObject::GetManaLeech()
-//|					CBaseObject::SetManaLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the Mana Leech
-//o------------------------------------------------------------------------------------------------o
-SI16 CBaseObject::GetManaLeech( void ) const
-{
-	return manaLeech;
-}
-void CBaseObject::SetManaLeech( SI16 nVal )
-{
-	manaLeech = nVal;
-
-	if( CanBeObjType( OT_ITEM ))
-	{
-		( static_cast( this ))->UpdateRegion();
-	}
-}
-
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject::IncStrength()
 //o------------------------------------------------------------------------------------------------o
@@ -1725,36 +1661,6 @@ void CBaseObject::IncIntelligence( SI16 toInc )
 	SetIntelligence( intelligence + toInc );
 }
 
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CBaseObject::IncHealthLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Increments the object's Health Leech Points value
-//o------------------------------------------------------------------------------------------------o
-void CBaseObject::IncHealthLeech( SI16 toInc )
-{
-	SetHealthLeech( healthLeech + toInc );
-}
-
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CBaseObject::IncStaminaLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Increments the object's Stamina Leech Points value
-//o------------------------------------------------------------------------------------------------o
-void CBaseObject::IncStaminaLeech( SI16 toInc )
-{
-	SetStaminaLeech( staminaLeech + toInc );
-}
-
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CBaseObject::IncManaLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Increments the object's Mana Leech Points value
-//o------------------------------------------------------------------------------------------------o
-void CBaseObject::IncManaLeech( SI16 toInc )
-{
-	SetManaLeech( manaLeech + toInc );
-}
-
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject::DumpFooter()
 //o------------------------------------------------------------------------------------------------o
diff --git a/source/cBaseObject.h b/source/cBaseObject.h
index 316cd2530..638e826f7 100644
--- a/source/cBaseObject.h
+++ b/source/cBaseObject.h
@@ -75,9 +75,6 @@ class CBaseObject
 	SI32				weight;
 	SI16				mana;
 	SI16				stamina;
-	SI16				healthLeech;
-	SI16				staminaLeech;
-	SI16				manaLeech;
 	UI16				scriptTrig;
 	SI16				st2;
 	SI16				dx2;
@@ -259,19 +256,6 @@ class CBaseObject
 	void					IncDexterity( SI16 toInc = 1 );
 	void					IncIntelligence( SI16 toInc = 1 );
 
-	SI16					GetHealthLeech( void ) const;
-	virtual void			SetHealthLeech( SI16 nVal );
-
-	SI16					GetStaminaLeech( void ) const;
-	virtual void			SetStaminaLeech( SI16 nVal );
-
-	SI16					GetManaLeech( void ) const;
-	virtual void			SetManaLeech( SI16 nVal );
-
-	void					IncHealthLeech( SI16 toInc = 1 );
-	void					IncStaminaLeech( SI16 toInc = 1 );
-	void					IncManaLeech( SI16 toInc = 1 );
-
 	virtual void			PostLoadProcessing( void );
 	virtual bool			LoadRemnants( void ) = 0;
 
diff --git a/source/cItem.cpp b/source/cItem.cpp
index 672ece4dd..45559d0a9 100644
--- a/source/cItem.cpp
+++ b/source/cItem.cpp
@@ -93,6 +93,9 @@ const UI16			DEFITEM_MAXUSES			= 0;
 const UI16			DEFITEM_REGIONNUM 		= 255;
 const UI16			DEFITEM_TEMPLASTTRADED	= 0;
 const SI08			DEFITEM_STEALABLE	 	= 1;
+const SI16			DEFITEM_HEALTHLEECH		= 0;
+const SI16			DEFITEM_STAMINALEECH	= 0;
+const SI16			DEFITEM_MANALEECH		= 0;
 
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CItem()
@@ -107,7 +110,7 @@ spd( DEFITEM_SPEED ), maxHp( DEFITEM_MAXHP ), amount( DEFITEM_AMOUNT ),
 layer( DEFITEM_LAYER ), type( DEFITEM_TYPE ), offspell( DEFITEM_OFFSPELL ), entryMadeFrom( DEFITEM_ENTRYMADEFROM ),
 creator( DEFITEM_CREATOR ), gridLoc( DEFITEM_GRIDLOC ), weightMax( DEFITEM_WEIGHTMAX ), baseWeight( DEFITEM_BASEWEIGHT ), maxItems( DEFITEM_MAXITEMS ),
 maxRange( DEFITEM_MAXRANGE ), baseRange( DEFITEM_BASERANGE ), maxUses( DEFITEM_MAXUSES ), usesLeft( DEFITEM_USESLEFT ), regionNum( DEFITEM_REGIONNUM ), 
-tempLastTraded( DEFITEM_TEMPLASTTRADED ), stealable( DEFITEM_STEALABLE )
+tempLastTraded( DEFITEM_TEMPLASTTRADED ), stealable( DEFITEM_STEALABLE ), healthLeech( DEFITEM_HEALTHLEECH ), staminaLeech( DEFITEM_STAMINALEECH ), manaLeech( DEFITEM_MANALEECH )
 {
 	spells[0]	= spells[1] = spells[2] = 0;
 	value[0]	= value[1] = value[2] = 0;
@@ -542,6 +545,54 @@ auto CItem::SetSpawnerList( bool newValue ) -> void
 	UpdateRegion();
 }
 
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CItem::GetHealthLeech()
+//|					CItem::SetHealthLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Gets/Sets the Health Leech
+//o------------------------------------------------------------------------------------------------o
+SI16 CItem::GetHealthLeech( void ) const
+{
+	return healthLeech;
+}
+void CItem::SetHealthLeech( SI16 nVal )
+{
+	healthLeech = nVal;
+	UpdateRegion();
+}
+
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CItem::GetStaminaLeech()
+//|					CItem::SetStaminaLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Gets/Sets the Stamina Leech
+//o------------------------------------------------------------------------------------------------o
+SI16 CItem::GetStaminaLeech( void ) const
+{
+	return staminaLeech;
+}
+void CItem::SetStaminaLeech( SI16 nVal )
+{
+	staminaLeech = nVal;
+	UpdateRegion();
+}
+
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CItem::GetManaLeech()
+//|					CItem::SetManaLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Gets/Sets the Mana Leech
+//o------------------------------------------------------------------------------------------------o
+SI16 CItem::GetManaLeech( void ) const
+{
+	return manaLeech;
+}
+void CItem::SetManaLeech( SI16 nVal )
+{
+	manaLeech = nVal;
+	UpdateRegion();
+}
+
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CItem::GetName2()
 //|					CItem::SetName2()
@@ -1340,6 +1391,36 @@ auto CItem::SetWeightMax( SI32 newValue ) -> void
 	UpdateRegion();
 }
 
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CItem::IncHealthLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Increments the object's Health Leech Points value
+//o------------------------------------------------------------------------------------------------o
+void CItem::IncHealthLeech( SI16 toInc )
+{
+	SetHealthLeech( healthLeech + toInc );
+}
+
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CItem::IncStaminaLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Increments the object's Stamina Leech Points value
+//o------------------------------------------------------------------------------------------------o
+void CItem::IncStaminaLeech( SI16 toInc )
+{
+	SetStaminaLeech( staminaLeech + toInc );
+}
+
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CItem::IncManaLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Increments the object's Mana Leech Points value
+//o------------------------------------------------------------------------------------------------o
+void CItem::IncManaLeech( SI16 toInc )
+{
+	SetManaLeech( manaLeech + toInc );
+}
+
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CItem::GetBaseWeight()
 //|					CItem::SetBaseWeight()
diff --git a/source/cItem.h b/source/cItem.h
index 3a3b60e5d..542aa62d6 100644
--- a/source/cItem.h
+++ b/source/cItem.h
@@ -41,6 +41,9 @@ class CItem : public CBaseObject
 	TIMERVAL		decayTime;
 	UI08			spd;			// The speed of the weapon
 	UI16			maxHp;			// Max number of hit points an item can have.
+	SI16			healthLeech;
+	SI16			staminaLeech;
+	SI16			manaLeech;
 	UI16			amount;			// Amount of items in pile
 	ItemLayers		layer;			// Layer if equipped on paperdoll
 	ItemTypes		type;			// For things that do special things on doubleclicking
@@ -166,6 +169,19 @@ class CItem : public CBaseObject
 
 	auto			InDungeon() -> bool;
 
+	virtual SI16	GetHealthLeech( void ) const;
+	virtual void	SetHealthLeech( SI16 nVal );
+
+	virtual SI16	GetStaminaLeech( void ) const;
+	virtual void	SetStaminaLeech( SI16 nVal );
+
+	virtual SI16	GetManaLeech( void ) const;
+	virtual void	SetManaLeech( SI16 nVal );
+
+	void			IncHealthLeech( SI16 toInc = 1 );
+	void			IncStaminaLeech( SI16 toInc = 1 );
+	void			IncManaLeech( SI16 toInc = 1 );
+
 	auto			GetLayer() const -> ItemLayers;
 	auto			SetLayer( ItemLayers newValue ) -> void;
 

From 6583a518dfbafc305a5adf4aad156478dedd849d Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Thu, 16 Jan 2025 19:09:59 -0600
Subject: [PATCH 58/84] Revert "Moved Leech Props"

This reverts commit 41c7ee467664ed3242d8c40603f4be83e8e4a571.
---
 source/cBaseObject.cpp | 96 +++++++++++++++++++++++++++++++++++++++++-
 source/cBaseObject.h   | 16 +++++++
 source/cItem.cpp       | 83 +-----------------------------------
 source/cItem.h         | 16 -------
 4 files changed, 112 insertions(+), 99 deletions(-)

diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp
index 506c247ac..2c5ce0b89 100644
--- a/source/cBaseObject.cpp
+++ b/source/cBaseObject.cpp
@@ -94,6 +94,9 @@ const SI16			DEFBASE_KILLS		= 0;
 const UI16			DEFBASE_RESIST 		= 0;
 const bool			DEFBASE_NAMEREQUESTACTIVE = 0;
 const ExpansionRuleset	DEFBASE_ORIGIN	= ER_UO;
+const SI16			DEFBASE_HEALTHLEECH = 0;
+const SI16			DEFBASE_STAMINALEECH = 0;
+const SI16			DEFBASE_MANALEECH = 0;
 
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject constructor
@@ -110,7 +113,8 @@ loDamage( DEFBASE_LODAMAGE ), weight( DEFBASE_WEIGHT ),
 mana( DEFBASE_MANA ), stamina( DEFBASE_STAMINA ), scriptTrig( DEFBASE_SCPTRIG ), st2( DEFBASE_STR2 ), dx2( DEFBASE_DEX2 ),
 in2( DEFBASE_INT2 ), FilePosition( DEFBASE_FP ),
 poisoned( DEFBASE_POISONED ), carve( DEFBASE_CARVE ), oldLocX( 0 ), oldLocY( 0 ), oldLocZ( 0 ), oldTargLocX( 0 ), oldTargLocY( 0 ),
-fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN )
+fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ),
+healthLeech( DEFBASE_HEALTHLEECH ), staminaLeech( DEFBASE_STAMINALEECH ), manaLeech( DEFBASE_MANALEECH )
 {
 	multis = nullptr;
 	tempMulti = INVALIDSERIAL;
@@ -1631,6 +1635,66 @@ void CBaseObject::SetIntelligence2( SI16 nVal )
 	}
 }
 
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CBaseObject::GetHealthLeech()
+//|					CBaseObject::SetHealthLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Gets/Sets the Health Leech
+//o------------------------------------------------------------------------------------------------o
+SI16 CBaseObject::GetHealthLeech( void ) const
+{
+	return healthLeech;
+}
+void CBaseObject::SetHealthLeech( SI16 nVal )
+{
+	healthLeech = nVal;
+
+	if( CanBeObjType( OT_ITEM ))
+	{
+		( static_cast( this ))->UpdateRegion();
+	}
+}
+
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CBaseObject::GetStaminaLeech()
+//|					CBaseObject::SetStaminaLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Gets/Sets the Stamina Leech
+//o------------------------------------------------------------------------------------------------o
+SI16 CBaseObject::GetStaminaLeech( void ) const
+{
+	return staminaLeech;
+}
+void CBaseObject::SetStaminaLeech( SI16 nVal )
+{
+	staminaLeech = nVal;
+
+	if( CanBeObjType( OT_ITEM ))
+	{
+		( static_cast( this ))->UpdateRegion();
+	}
+}
+
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CBaseObject::GetManaLeech()
+//|					CBaseObject::SetManaLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Gets/Sets the Mana Leech
+//o------------------------------------------------------------------------------------------------o
+SI16 CBaseObject::GetManaLeech( void ) const
+{
+	return manaLeech;
+}
+void CBaseObject::SetManaLeech( SI16 nVal )
+{
+	manaLeech = nVal;
+
+	if( CanBeObjType( OT_ITEM ))
+	{
+		( static_cast( this ))->UpdateRegion();
+	}
+}
+
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject::IncStrength()
 //o------------------------------------------------------------------------------------------------o
@@ -1661,6 +1725,36 @@ void CBaseObject::IncIntelligence( SI16 toInc )
 	SetIntelligence( intelligence + toInc );
 }
 
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CBaseObject::IncHealthLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Increments the object's Health Leech Points value
+//o------------------------------------------------------------------------------------------------o
+void CBaseObject::IncHealthLeech( SI16 toInc )
+{
+	SetHealthLeech( healthLeech + toInc );
+}
+
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CBaseObject::IncStaminaLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Increments the object's Stamina Leech Points value
+//o------------------------------------------------------------------------------------------------o
+void CBaseObject::IncStaminaLeech( SI16 toInc )
+{
+	SetStaminaLeech( staminaLeech + toInc );
+}
+
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CBaseObject::IncManaLeech()
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Increments the object's Mana Leech Points value
+//o------------------------------------------------------------------------------------------------o
+void CBaseObject::IncManaLeech( SI16 toInc )
+{
+	SetManaLeech( manaLeech + toInc );
+}
+
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject::DumpFooter()
 //o------------------------------------------------------------------------------------------------o
diff --git a/source/cBaseObject.h b/source/cBaseObject.h
index 638e826f7..316cd2530 100644
--- a/source/cBaseObject.h
+++ b/source/cBaseObject.h
@@ -75,6 +75,9 @@ class CBaseObject
 	SI32				weight;
 	SI16				mana;
 	SI16				stamina;
+	SI16				healthLeech;
+	SI16				staminaLeech;
+	SI16				manaLeech;
 	UI16				scriptTrig;
 	SI16				st2;
 	SI16				dx2;
@@ -256,6 +259,19 @@ class CBaseObject
 	void					IncDexterity( SI16 toInc = 1 );
 	void					IncIntelligence( SI16 toInc = 1 );
 
+	SI16					GetHealthLeech( void ) const;
+	virtual void			SetHealthLeech( SI16 nVal );
+
+	SI16					GetStaminaLeech( void ) const;
+	virtual void			SetStaminaLeech( SI16 nVal );
+
+	SI16					GetManaLeech( void ) const;
+	virtual void			SetManaLeech( SI16 nVal );
+
+	void					IncHealthLeech( SI16 toInc = 1 );
+	void					IncStaminaLeech( SI16 toInc = 1 );
+	void					IncManaLeech( SI16 toInc = 1 );
+
 	virtual void			PostLoadProcessing( void );
 	virtual bool			LoadRemnants( void ) = 0;
 
diff --git a/source/cItem.cpp b/source/cItem.cpp
index 45559d0a9..672ece4dd 100644
--- a/source/cItem.cpp
+++ b/source/cItem.cpp
@@ -93,9 +93,6 @@ const UI16			DEFITEM_MAXUSES			= 0;
 const UI16			DEFITEM_REGIONNUM 		= 255;
 const UI16			DEFITEM_TEMPLASTTRADED	= 0;
 const SI08			DEFITEM_STEALABLE	 	= 1;
-const SI16			DEFITEM_HEALTHLEECH		= 0;
-const SI16			DEFITEM_STAMINALEECH	= 0;
-const SI16			DEFITEM_MANALEECH		= 0;
 
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CItem()
@@ -110,7 +107,7 @@ spd( DEFITEM_SPEED ), maxHp( DEFITEM_MAXHP ), amount( DEFITEM_AMOUNT ),
 layer( DEFITEM_LAYER ), type( DEFITEM_TYPE ), offspell( DEFITEM_OFFSPELL ), entryMadeFrom( DEFITEM_ENTRYMADEFROM ),
 creator( DEFITEM_CREATOR ), gridLoc( DEFITEM_GRIDLOC ), weightMax( DEFITEM_WEIGHTMAX ), baseWeight( DEFITEM_BASEWEIGHT ), maxItems( DEFITEM_MAXITEMS ),
 maxRange( DEFITEM_MAXRANGE ), baseRange( DEFITEM_BASERANGE ), maxUses( DEFITEM_MAXUSES ), usesLeft( DEFITEM_USESLEFT ), regionNum( DEFITEM_REGIONNUM ), 
-tempLastTraded( DEFITEM_TEMPLASTTRADED ), stealable( DEFITEM_STEALABLE ), healthLeech( DEFITEM_HEALTHLEECH ), staminaLeech( DEFITEM_STAMINALEECH ), manaLeech( DEFITEM_MANALEECH )
+tempLastTraded( DEFITEM_TEMPLASTTRADED ), stealable( DEFITEM_STEALABLE )
 {
 	spells[0]	= spells[1] = spells[2] = 0;
 	value[0]	= value[1] = value[2] = 0;
@@ -545,54 +542,6 @@ auto CItem::SetSpawnerList( bool newValue ) -> void
 	UpdateRegion();
 }
 
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CItem::GetHealthLeech()
-//|					CItem::SetHealthLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the Health Leech
-//o------------------------------------------------------------------------------------------------o
-SI16 CItem::GetHealthLeech( void ) const
-{
-	return healthLeech;
-}
-void CItem::SetHealthLeech( SI16 nVal )
-{
-	healthLeech = nVal;
-	UpdateRegion();
-}
-
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CItem::GetStaminaLeech()
-//|					CItem::SetStaminaLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the Stamina Leech
-//o------------------------------------------------------------------------------------------------o
-SI16 CItem::GetStaminaLeech( void ) const
-{
-	return staminaLeech;
-}
-void CItem::SetStaminaLeech( SI16 nVal )
-{
-	staminaLeech = nVal;
-	UpdateRegion();
-}
-
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CItem::GetManaLeech()
-//|					CItem::SetManaLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the Mana Leech
-//o------------------------------------------------------------------------------------------------o
-SI16 CItem::GetManaLeech( void ) const
-{
-	return manaLeech;
-}
-void CItem::SetManaLeech( SI16 nVal )
-{
-	manaLeech = nVal;
-	UpdateRegion();
-}
-
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CItem::GetName2()
 //|					CItem::SetName2()
@@ -1391,36 +1340,6 @@ auto CItem::SetWeightMax( SI32 newValue ) -> void
 	UpdateRegion();
 }
 
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CItem::IncHealthLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Increments the object's Health Leech Points value
-//o------------------------------------------------------------------------------------------------o
-void CItem::IncHealthLeech( SI16 toInc )
-{
-	SetHealthLeech( healthLeech + toInc );
-}
-
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CItem::IncStaminaLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Increments the object's Stamina Leech Points value
-//o------------------------------------------------------------------------------------------------o
-void CItem::IncStaminaLeech( SI16 toInc )
-{
-	SetStaminaLeech( staminaLeech + toInc );
-}
-
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CItem::IncManaLeech()
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Increments the object's Mana Leech Points value
-//o------------------------------------------------------------------------------------------------o
-void CItem::IncManaLeech( SI16 toInc )
-{
-	SetManaLeech( manaLeech + toInc );
-}
-
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CItem::GetBaseWeight()
 //|					CItem::SetBaseWeight()
diff --git a/source/cItem.h b/source/cItem.h
index 542aa62d6..3a3b60e5d 100644
--- a/source/cItem.h
+++ b/source/cItem.h
@@ -41,9 +41,6 @@ class CItem : public CBaseObject
 	TIMERVAL		decayTime;
 	UI08			spd;			// The speed of the weapon
 	UI16			maxHp;			// Max number of hit points an item can have.
-	SI16			healthLeech;
-	SI16			staminaLeech;
-	SI16			manaLeech;
 	UI16			amount;			// Amount of items in pile
 	ItemLayers		layer;			// Layer if equipped on paperdoll
 	ItemTypes		type;			// For things that do special things on doubleclicking
@@ -169,19 +166,6 @@ class CItem : public CBaseObject
 
 	auto			InDungeon() -> bool;
 
-	virtual SI16	GetHealthLeech( void ) const;
-	virtual void	SetHealthLeech( SI16 nVal );
-
-	virtual SI16	GetStaminaLeech( void ) const;
-	virtual void	SetStaminaLeech( SI16 nVal );
-
-	virtual SI16	GetManaLeech( void ) const;
-	virtual void	SetManaLeech( SI16 nVal );
-
-	void			IncHealthLeech( SI16 toInc = 1 );
-	void			IncStaminaLeech( SI16 toInc = 1 );
-	void			IncManaLeech( SI16 toInc = 1 );
-
 	auto			GetLayer() const -> ItemLayers;
 	auto			SetLayer( ItemLayers newValue ) -> void;
 

From 14ac6f5060d4454b7638b1a7e9839f0597ed91a5 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Thu, 16 Jan 2025 23:55:15 -0600
Subject: [PATCH 59/84] update

Moved to citems from cbaseobjects sinc ethis can only be added to items.
---
 source/cBaseObject.cpp | 25 +------------------------
 source/cBaseObject.h   |  4 ----
 source/cItem.cpp       | 20 +++++++++++++++++++-
 source/cItem.h         |  4 ++++
 4 files changed, 24 insertions(+), 29 deletions(-)

diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp
index f9c8da3cc..506c247ac 100644
--- a/source/cBaseObject.cpp
+++ b/source/cBaseObject.cpp
@@ -94,7 +94,6 @@ const SI16			DEFBASE_KILLS		= 0;
 const UI16			DEFBASE_RESIST 		= 0;
 const bool			DEFBASE_NAMEREQUESTACTIVE = 0;
 const ExpansionRuleset	DEFBASE_ORIGIN	= ER_UO;
-const SI16			DEFBASE_LOWERSTATREQ = 0;
 
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject constructor
@@ -111,8 +110,7 @@ loDamage( DEFBASE_LODAMAGE ), weight( DEFBASE_WEIGHT ),
 mana( DEFBASE_MANA ), stamina( DEFBASE_STAMINA ), scriptTrig( DEFBASE_SCPTRIG ), st2( DEFBASE_STR2 ), dx2( DEFBASE_DEX2 ),
 in2( DEFBASE_INT2 ), FilePosition( DEFBASE_FP ),
 poisoned( DEFBASE_POISONED ), carve( DEFBASE_CARVE ), oldLocX( 0 ), oldLocY( 0 ), oldLocZ( 0 ), oldTargLocX( 0 ), oldTargLocY( 0 ),
-fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN ),
-lowerStatReq( DEFBASE_LOWERSTATREQ )
+fame( DEFBASE_FAME ), karma( DEFBASE_KARMA ), kills( DEFBASE_KILLS ), subRegion( DEFBASE_SUBREGION ), nameRequestActive( DEFBASE_NAMEREQUESTACTIVE ), origin( DEFBASE_ORIGIN )
 {
 	multis = nullptr;
 	tempMulti = INVALIDSERIAL;
@@ -1038,27 +1036,6 @@ void CBaseObject::IncHP( SI16 amtToChange )
 	SetHP( hitpoints + amtToChange );
 }
 
-//o------------------------------------------------------------------------------------------------o
-//|	Function	-	CBaseObject::GetLowerStatReq()
-//|					CBaseObject::GetLowerStatReq()
-//|	Date		-	30 April, 2024
-//o------------------------------------------------------------------------------------------------o
-//|	Purpose		-	Gets/Sets the Stat Requirements of the object
-//o------------------------------------------------------------------------------------------------o
-SI16 CBaseObject::GetLowerStatReq( void ) const
-{
-	return lowerStatReq;
-}
-void CBaseObject::SetLowerStatReq( SI16 newValue )
-{
-	lowerStatReq = newValue;
-
-	if( CanBeObjType( OT_ITEM ))
-	{
-		( static_cast( this ))->UpdateRegion();
-	}
-}
-
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CBaseObject::GetDir()
 //|					CBaseObject::SetDir()
diff --git a/source/cBaseObject.h b/source/cBaseObject.h
index 84c38ee70..638e826f7 100644
--- a/source/cBaseObject.h
+++ b/source/cBaseObject.h
@@ -69,7 +69,6 @@ class CBaseObject
 	SI16				dexterity;
 	SI16				intelligence;
 	SI16				hitpoints;
-	SI16				lowerStatReq;
 	VisibleTypes		visible;
 	SI16				hiDamage;
 	SI16				loDamage;
@@ -257,9 +256,6 @@ class CBaseObject
 	void					IncDexterity( SI16 toInc = 1 );
 	void					IncIntelligence( SI16 toInc = 1 );
 
-	virtual SI16			GetLowerStatReq( void ) const;
-	virtual void			SetLowerStatReq( SI16 newValue );
-
 	virtual void			PostLoadProcessing( void );
 	virtual bool			LoadRemnants( void ) = 0;
 
diff --git a/source/cItem.cpp b/source/cItem.cpp
index 2303fc7e1..7f12f11d2 100644
--- a/source/cItem.cpp
+++ b/source/cItem.cpp
@@ -94,6 +94,7 @@ const UI16			DEFITEM_REGIONNUM 		= 255;
 const UI16			DEFITEM_TEMPLASTTRADED	= 0;
 const SI08			DEFITEM_STEALABLE	 	= 1;
 const SI16			DEFITEM_ARTIFACTRARITY = 0;
+const SI16			DEFITEM_LOWERSTATREQ	= 0;
 
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CItem()
@@ -108,7 +109,7 @@ spd( DEFITEM_SPEED ), maxHp( DEFITEM_MAXHP ), amount( DEFITEM_AMOUNT ),
 layer( DEFITEM_LAYER ), type( DEFITEM_TYPE ), offspell( DEFITEM_OFFSPELL ), entryMadeFrom( DEFITEM_ENTRYMADEFROM ),
 creator( DEFITEM_CREATOR ), gridLoc( DEFITEM_GRIDLOC ), weightMax( DEFITEM_WEIGHTMAX ), baseWeight( DEFITEM_BASEWEIGHT ), maxItems( DEFITEM_MAXITEMS ),
 maxRange( DEFITEM_MAXRANGE ), baseRange( DEFITEM_BASERANGE ), maxUses( DEFITEM_MAXUSES ), usesLeft( DEFITEM_USESLEFT ), regionNum( DEFITEM_REGIONNUM ), 
-tempLastTraded( DEFITEM_TEMPLASTTRADED ), stealable( DEFITEM_STEALABLE ), artifactRarity(DEFITEM_ARTIFACTRARITY)
+tempLastTraded( DEFITEM_TEMPLASTTRADED ), stealable( DEFITEM_STEALABLE ), artifactRarity( DEFITEM_ARTIFACTRARITY ), lowerStatReq( DEFITEM_LOWERSTATREQ )
 {
 	spells[0]	= spells[1] = spells[2] = 0;
 	value[0]	= value[1] = value[2] = 0;
@@ -560,6 +561,23 @@ void CItem::SetArtifactRarity( SI16 newValue )
 	UpdateRegion();
 }
 
+//o------------------------------------------------------------------------------------------------o
+//|	Function	-	CItem::GetLowerStatReq()
+//|					CItem::GetLowerStatReq()
+//|	Date		-	30 April, 2024
+//o------------------------------------------------------------------------------------------------o
+//|	Purpose		-	Gets/Sets the Stat Requirements of the object
+//o------------------------------------------------------------------------------------------------o
+SI16 CItem::GetLowerStatReq( void ) const
+{
+	return lowerStatReq;
+}
+void CItem::SetLowerStatReq( SI16 newValue )
+{
+	lowerStatReq = newValue;
+	UpdateRegion();
+}
+
 //o------------------------------------------------------------------------------------------------o
 //|	Function	-	CItem::GetName2()
 //|					CItem::SetName2()
diff --git a/source/cItem.h b/source/cItem.h
index 4b220999e..62c7cb13a 100644
--- a/source/cItem.h
+++ b/source/cItem.h
@@ -49,6 +49,7 @@ class CItem : public CBaseObject
 	SERIAL			creator;		// Store the serial of the player made this item
 	SI08			gridLoc;
 	SI16			artifactRarity;
+	SI16			lowerStatReq;
 	SI32			weightMax;		// Maximum weight a container can hold
 	SI32			baseWeight;		// Base weight of item. Applied when item is created for the first time, based on weight. Primarily used to determine base weight of containers
 	UI16			maxItems;		// Maximum amount of items a container can hold
@@ -114,6 +115,9 @@ class CItem : public CBaseObject
 	virtual SI16	GetArtifactRarity(void) const;
 	virtual void	SetArtifactRarity(SI16 newValue);
 
+	SI16			GetLowerStatReq( void ) const;
+	void			SetLowerStatReq( SI16 newValue );
+
 	auto			GetStealable() const -> UI08;
 	auto			SetStealable( UI08 newValue ) -> void;
 

From b2906b41d885db51a4f5c0449e80d85e861ef289 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Thu, 16 Jan 2025 23:59:28 -0600
Subject: [PATCH 60/84] Update spawners.dfn

---
 data/dfndata/items/gmmenu/spawners.dfn | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/data/dfndata/items/gmmenu/spawners.dfn b/data/dfndata/items/gmmenu/spawners.dfn
index 46b622016..a5fc82e11 100644
--- a/data/dfndata/items/gmmenu/spawners.dfn
+++ b/data/dfndata/items/gmmenu/spawners.dfn
@@ -7,7 +7,7 @@ interval=1 5
 visible=1
 decay=0
 movable=2
-script=2204
+script=2205
 }
 
 [orcspawn]

From 127da5ccb8d4936e2c49a234e8a7b4160a4517da Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Sat, 18 Jan 2025 13:25:57 -0600
Subject: [PATCH 61/84] fix

---
 source/cChar.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/cChar.cpp b/source/cChar.cpp
index 3ae819d15..eb70922f6 100644
--- a/source/cChar.cpp
+++ b/source/cChar.cpp
@@ -4383,7 +4383,7 @@ bool CChar::HandleLine( std::string &UTag, std::string &data )
 					SetDead(( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 ));
 					rValue = true;
 				}
-				else if( UTag == "DEFENSECHANCE" )
+				else if( UTag == "DEFCHANCE" )
 				{
 					SetDefenseChance( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
 					rValue = true;

From f7f42efb76fd718ff3c104640481cbbdf963ea4d Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Sat, 18 Jan 2025 13:27:19 -0600
Subject: [PATCH 62/84] fix

---
 source/cChar.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/cChar.cpp b/source/cChar.cpp
index 9092667c1..d98359c8b 100644
--- a/source/cChar.cpp
+++ b/source/cChar.cpp
@@ -4824,7 +4824,7 @@ bool CChar::HandleLine( std::string &UTag, std::string &data )
 					SetEmoteColour( static_cast( std::stoul (oldstrutil::trim( oldstrutil::removeTrailing( csecs[1], "//" )), nullptr, 0 )));
 					rValue = true;
 				}
-				else if( UTag == "SWINGSPEEDINCREASE" )
+				else if( UTag == "SWINGSPEEDINC" )
 				{
 					SetSwingSpeedIncrease( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
 					rValue = true;

From 492ef70fcb4360c70e7932558df7e47c96808fde Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Tue, 21 Jan 2025 13:58:04 -0600
Subject: [PATCH 63/84] Fix for Defense

Neg Damage Does not take into account the attacker skill no longer. Only the Armor perc
---
 source/combat.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/combat.cpp b/source/combat.cpp
index 8817d7b3d..4c56399c9 100644
--- a/source/combat.cpp
+++ b/source/combat.cpp
@@ -2645,7 +2645,7 @@ SI16 CHandleCombat::ApplyDefenseModifiers( WeatherType damageType, CChar *mChar,
 
 	if( getDef > 0 )
 	{
-		damage -= static_cast(( static_cast( getDef ) * static_cast( attSkill )) / 750 );
+		damage -= static_cast( getDef );
 	}
 
 	return static_cast( std::round( damage ));

From 544327d441c16b85c136d3d0ddb21e77da6ad600 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Tue, 21 Jan 2025 21:54:13 -0600
Subject: [PATCH 64/84] changelog

---
 source/Changelog.txt | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/source/Changelog.txt b/source/Changelog.txt
index b0801d426..36abce5fe 100644
--- a/source/Changelog.txt
+++ b/source/Changelog.txt
@@ -1,3 +1,6 @@
+21/01/2025 - Dragon Slayer
+	Removed the skill check for damage being adjusted at the end. (combat.cpp)
+
 13/05/2024 - Dragon Slayer
 	Added New Shield Type 107 so shield ID's no longer have to be in hard code for shields to work properly
 

From df556d9d7bf0a2a8decefd61a872689f6ec557bb Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Tue, 21 Jan 2025 22:03:04 -0600
Subject: [PATCH 65/84] Fixed

Fixed swingspeed to set all settings in base object because works in items and chars.
---
 source/cBaseObject.cpp | 8 +++++++-
 source/cChar.cpp       | 7 -------
 source/cItem.cpp       | 7 -------
 3 files changed, 7 insertions(+), 15 deletions(-)

diff --git a/source/cBaseObject.cpp b/source/cBaseObject.cpp
index 1fccdb2e5..1a05618ee 100644
--- a/source/cBaseObject.cpp
+++ b/source/cBaseObject.cpp
@@ -795,6 +795,7 @@ bool CBaseObject::DumpBody( std::ostream &outStream ) const
 	outStream << "Intelligence=" + std::to_string( intelligence ) + "," + std::to_string( temp_in2 ) + newLine;
 	outStream << "Strength=" + std::to_string( strength ) + "," + std::to_string( temp_st2 ) + newLine;
 	outStream << "HitPoints=" + std::to_string( hitpoints ) + newLine;
+	outStream << "SwingSpeedInc=" + std::to_string( GetSwingSpeedIncrease() ) + newLine;
 	outStream << "Race=" + std::to_string( race ) + newLine;
 	outStream << "Visible=" + std::to_string( visible ) + newLine;
 	outStream << "Disabled=" << ( IsDisabled() ? "1" : "0" ) << newLine;
@@ -2055,6 +2056,11 @@ bool CBaseObject::HandleLine( std::string &UTag, std::string &data )
 			{
 				st2	= oldstrutil::value( data );
 			}
+			else if( UTag == "SWINGSPEEDINC" )
+			{
+				SetSwingSpeedIncrease( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
+				rValue = true;
+			}
 			else if( UTag == "SCPTRIG" )
 			{
 				//scriptTrig	= oldstrutil::value(data);
@@ -2577,7 +2583,7 @@ void CBaseObject::CopyData( CBaseObject *target )
 	target->SetIntelligence2( GetIntelligence2() );
 	target->SetPoisoned( GetPoisoned() );
 	target->SetWeight( GetWeight() );
-
+	target->SetSwingSpeedIncrease( GetSwingSpeedIncrease() );
 	target->SetKarma( karma );
 	target->SetFame( fame );
 	target->SetKills( kills );
diff --git a/source/cChar.cpp b/source/cChar.cpp
index d98359c8b..182409af1 100644
--- a/source/cChar.cpp
+++ b/source/cChar.cpp
@@ -2398,7 +2398,6 @@ void CChar::CopyData( CChar *target )
 	target->SetDisabled( IsDisabled() );
 	target->SetCanHire( CanBeHired() );
 	target->SetCanTrain( CanTrain() );
-	target->SetSwingSpeedIncrease( GetSwingSpeedIncrease() );
 	target->SetLastOn( GetLastOn() );
 	target->SetLastOnSecs( GetLastOnSecs() );
 	target->SetPlayTime( GetPlayTime() );
@@ -3140,7 +3139,6 @@ bool CChar::DumpBody( std::ostream &outStream ) const
 	//-------------------------------------------------------------------------------------------
 	outStream << "CanRun=" + std::to_string((( CanRun() && IsNpc() ) ? 1 : 0 )) + newLine;
 	outStream << "CanAttack=" + std::to_string(( GetCanAttack() ? 1 : 0 )) + newLine;
-	outStream << "SwingSpeedInc=" + std::to_string( GetSwingSpeedIncrease() ) + newLine;
 	outStream << "AllMove=" + std::to_string(( AllMove() ? 1 : 0 )) + newLine;
 	outStream << "IsNpc=" + std::to_string(( IsNpc() ? 1 : 0 )) + newLine;
 	outStream << "IsShop=" + std::to_string(( IsShop() ? 1 : 0 )) + newLine;
@@ -4824,11 +4822,6 @@ bool CChar::HandleLine( std::string &UTag, std::string &data )
 					SetEmoteColour( static_cast( std::stoul (oldstrutil::trim( oldstrutil::removeTrailing( csecs[1], "//" )), nullptr, 0 )));
 					rValue = true;
 				}
-				else if( UTag == "SWINGSPEEDINC" )
-				{
-					SetSwingSpeedIncrease( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
-					rValue = true;
-				}
 				else if( UTag == "STABLED" )
 				{
 					SetStabled( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )) == 1 );
diff --git a/source/cItem.cpp b/source/cItem.cpp
index a1ff0d832..3a2acd106 100644
--- a/source/cItem.cpp
+++ b/source/cItem.cpp
@@ -1661,7 +1661,6 @@ auto CItem::CopyData( CItem *target ) -> void
 	target->SetStamina( GetStamina() );
 	target->SetStrength( GetStrength() );
 	target->SetStrength2( GetStrength2() );
-	target->SetSwingSpeedIncrease( GetSwingSpeedIncrease() );
 	target->SetTitle( GetTitle() );
 	target->SetType( GetType() );
 	target->SetBuyValue( GetBuyValue() );
@@ -1762,7 +1761,6 @@ bool CItem::DumpBody( std::ostream &outStream ) const
 	outStream << "Restock=" + std::to_string( GetRestock() ) + newLine;
 	outStream << "AC=" + std::to_string( GetArmourClass() ) + newLine;
 	outStream << "Rank=" + std::to_string( GetRank() ) + newLine;
-	outStream << "SwingSpeedInc=" + std::to_string( GetSwingSpeedIncrease() ) + newLine;
 	outStream << "Sk_Made=" + std::to_string( GetMadeWith() ) + newLine;
 	outStream << "Bools=" + std::to_string(( bools.to_ulong() )) + newLine;
 	outStream << "Good=" + std::to_string( GetGood() ) + newLine;
@@ -2152,11 +2150,6 @@ bool CItem::HandleLine( std::string &UTag, std::string &data )
 					SetStealable( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
 					rValue = true;
 				}
-				else if( UTag == "SWINGSPEEDINCREASE" )
-				{
-					SetSwingSpeedIncrease( static_cast( std::stoul( oldstrutil::trim( oldstrutil::removeTrailing( data, "//" )), nullptr, 0 )));
-					rValue = true;
-				}
 				break;
 			case 'T':
 				if( UTag == "TYPE" )

From 95fa7a8ee139648e7729c657f9c36a8d8ccaf3b4 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 10:46:05 -0600
Subject: [PATCH 66/84] Update Changelog.txt

---
 source/Changelog.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/Changelog.txt b/source/Changelog.txt
index 36abce5fe..ed820bfda 100644
--- a/source/Changelog.txt
+++ b/source/Changelog.txt
@@ -1,5 +1,5 @@
 21/01/2025 - Dragon Slayer
-	Removed the skill check for damage being adjusted at the end. (combat.cpp)
+	Fixed damage dealt in combat was incorrectly modified while applying defense modifiers. (combat.cpp)
 
 13/05/2024 - Dragon Slayer
 	Added New Shield Type 107 so shield ID's no longer have to be in hard code for shields to work properly

From 647cb3e0013dcf0ffb18fa4dbe0f9298359c5dd3 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 18:21:39 -0600
Subject: [PATCH 67/84] gm check

---
 data/js/server/misc/spawnergump.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/data/js/server/misc/spawnergump.js b/data/js/server/misc/spawnergump.js
index 9174ff9e7..0767c3eb7 100644
--- a/data/js/server/misc/spawnergump.js
+++ b/data/js/server/misc/spawnergump.js
@@ -4,7 +4,7 @@ function onUseChecked( pUser, iUsed )
 	socket.tempObj = iUsed;
 	var gumpID = 5037 + 0xffff;
 
-	if( socket && iUsed && iUsed.isItem )
+	if( socket && iUsed && iUsed.isItem && pUser.isGM )
 	{
 		socket.CloseGump( gumpID, 0 );
 		spawnerGump( socket, pUser, iUsed );

From 6dbc2357610d47c2e2a945848b7800f48d2ea0a4 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 18:37:44 -0600
Subject: [PATCH 68/84] Update cPlayerAction.cpp

---
 source/cPlayerAction.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/source/cPlayerAction.cpp b/source/cPlayerAction.cpp
index f21845c0a..960bac22a 100644
--- a/source/cPlayerAction.cpp
+++ b/source/cPlayerAction.cpp
@@ -699,15 +699,18 @@ bool CPIEquipItem::Handle( void )
 	{
 		bool canWear = false;
 		const SI16 scaledStrength = ( i->GetStrength() * ( 100 - i->GetLowerStatReq() )) / 100;
+		const SI16 scaledDexterity = (i->GetDexterity() * (100 - i->GetLowerStatReq())) / 100;
+		const SI16 scaledIntelligence = (i->GetIntelligence() * (100 - i->GetLowerStatReq())) / 100;
+
 		if( scaledStrength > k->GetStrength() )
 		{
 			tSock->SysMessage( 1188 ); // You are not strong enough to use that. (NOTE: Should these messages use color 0x096a to stand out and replicate hard coded client message?)
 		}
-		else if( i->GetDexterity() > k->GetDexterity() )
+		else if( scaledDexterity > k->GetDexterity() )
 		{
 			tSock->SysMessage( 1189 ); // You are not agile enough to use that.
 		}
-		else if( i->GetIntelligence() > k->GetIntelligence() )
+		else if( scaledIntelligence > k->GetIntelligence() )
 		{
 			tSock->SysMessage( 1190 ); // You are not smart enough to use that.
 		}

From e44fbef0da0f3c9b37f33c35657e0803a3243e10 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 18:38:49 -0600
Subject: [PATCH 69/84] Update cPlayerAction.cpp

---
 source/cPlayerAction.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/source/cPlayerAction.cpp b/source/cPlayerAction.cpp
index 960bac22a..cf4b217c2 100644
--- a/source/cPlayerAction.cpp
+++ b/source/cPlayerAction.cpp
@@ -699,8 +699,8 @@ bool CPIEquipItem::Handle( void )
 	{
 		bool canWear = false;
 		const SI16 scaledStrength = ( i->GetStrength() * ( 100 - i->GetLowerStatReq() )) / 100;
-		const SI16 scaledDexterity = (i->GetDexterity() * (100 - i->GetLowerStatReq())) / 100;
-		const SI16 scaledIntelligence = (i->GetIntelligence() * (100 - i->GetLowerStatReq())) / 100;
+		const SI16 scaledDexterity = ( i->GetDexterity() * ( 100 - i->GetLowerStatReq() )) / 100;
+		const SI16 scaledIntelligence = ( i->GetIntelligence() * ( 100 - i->GetLowerStatReq() )) / 100;
 
 		if( scaledStrength > k->GetStrength() )
 		{

From 0bf54f87db7d21a189e1f8a4094cb1fcb5223cce Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 18:50:38 -0600
Subject: [PATCH 70/84] Update Changelog.txt

---
 source/Changelog.txt | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/source/Changelog.txt b/source/Changelog.txt
index b0801d426..fb3168ad2 100644
--- a/source/Changelog.txt
+++ b/source/Changelog.txt
@@ -1,6 +1,10 @@
 13/05/2024 - Dragon Slayer
 	Added New Shield Type 107 so shield ID's no longer have to be in hard code for shields to work properly
 
+11/05/2024 - Dragon Slayer
+	Fixed items handling correct target for resists.
+	Added Getting the resists on chars.
+
 09/05/2024 - Dragon Slayer
 	Added ArtifactRarity AOS Property for items
 	-ARTIFACTRARITY=#

From 493d237163e6672e11b6640c3b78bf81782d65ef Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 18:56:21 -0600
Subject: [PATCH 71/84] small change

---
 source/Changelog.txt | 4 ++--
 source/combat.cpp    | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/source/Changelog.txt b/source/Changelog.txt
index f487f8433..75e646e18 100644
--- a/source/Changelog.txt
+++ b/source/Changelog.txt
@@ -1,6 +1,6 @@
 16/06/2024 - Dragon Slayer/Xuri
-	Added new DFN tags for Items:
-		SPEEDINCREASE=# 		// item property that increases base weapon swing speed by the specified percentage
+	Added new DFN tags for Items and Chars:
+		SPEEDINCREASE=# 		// item and char property that increases base weapon swing speed by the specified percentage
 	These are also available as JS Engine object properties: .speedIncrease
 	Added INI Settings:
 		SWINGSPEEDINCREASECAP=#  	// Max cap for for swing speed increase a char can have.
diff --git a/source/combat.cpp b/source/combat.cpp
index 9d0627316..611fd9295 100644
--- a/source/combat.cpp
+++ b/source/combat.cpp
@@ -3486,7 +3486,7 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar )
 	if( cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR )
 	{
 		// Weapon swing delay in LBR and earlier
-		getDelay = baseValue / ( getDelay * getOffset * speedFactor ) / globalAttackSpeed;
+		getDelay = baseValue / ( getDelay * getOffset * speedBonus ) / globalAttackSpeed;
 	}
 	else if( cwmWorldState->ServerData()->ExpansionCoreShardEra() < ER_ML )
 	{

From 43994ae32fcd1d3042b32861e81ffd93aaa01503 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 18:58:22 -0600
Subject: [PATCH 72/84] Update Changelog.txt

---
 source/Changelog.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/Changelog.txt b/source/Changelog.txt
index 9dd5101eb..e7e495b9e 100644
--- a/source/Changelog.txt
+++ b/source/Changelog.txt
@@ -1,6 +1,6 @@
 
 7/07/2024 - Dragon Slayer
-	Added Required Free Hand (js potion).
+	Added Requirement to drink potion hand has to be free, This can be disabled within the potion.js file by switching the reqfreehand to false. (js potion).
   
 13/05/2024 - Dragon Slayer
 	Added New Shield Type 107 so shield ID's no longer have to be in hard code for shields to work properly

From 40df40bc22d6361856bfaa632085d81d9a0032bb Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 19:03:15 -0600
Subject: [PATCH 73/84] tab fix

---
 source/gumps.cpp | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/source/gumps.cpp b/source/gumps.cpp
index 2218a6828..3b2d56cb0 100644
--- a/source/gumps.cpp
+++ b/source/gumps.cpp
@@ -670,20 +670,20 @@ void BuildAddMenuGump( CSocket *s, UI16 m )
 			{
 				// Draw a frame for the item to make it stand out a touch more.
 				if( s->ClientVerShort() <= CVS_70160 )
-                {
-                    // Fallback for older clients that don't support buttontileart
-                    toSend.addCommand( oldstrutil::format("resizepic %u %u %u %u %u", xOffset, yOffset, 0x53, 65, 100 ));
-                    toSend.addCommand( oldstrutil::format("checkertrans %u %u %u %u", xOffset + 7, yOffset + 9, 52, 82 ));
-                    toSend.addCommand( oldstrutil::format("tilepic %u %u %i", xOffset + 5, yOffset + 10, std::stoi(tag, nullptr, 0) ));
-                    toSend.addCommand( oldstrutil::format("croppedtext %u %u %u %u %u %u", xOffset, yOffset + 65, 65, 20, 55, linenum++ ));
-                }
-                else
-                {
-                    toSend.addCommand( oldstrutil::format( "checkertrans %u %u %u %u", xOffset + 7, yOffset + 9, 110, 110 ));
-                    toSend.addCommand( oldstrutil::format( "buttontileart %u %u 0x0a9f 0x0aa1 %u %u %u %u %u %u %u", xOffset, yOffset, 1, 0, buttonnum, std::stoi( tag, nullptr, 0 ), 0, 25, 25 ));
-                    toSend.addCommand( oldstrutil::format( "tooltip 1042971 @%s@", data.c_str() ));
-                    toSend.addCommand( oldstrutil::format( "croppedtext %u %u %u %u %u %u", xOffset + 15, yOffset + 85, 100, 20, 50, linenum++ ));
-                }
+				{
+					// Fallback for older clients that don't support buttontileart
+					toSend.addCommand( oldstrutil::format("resizepic %u %u %u %u %u", xOffset, yOffset, 0x53, 65, 100 ));
+					toSend.addCommand( oldstrutil::format("checkertrans %u %u %u %u", xOffset + 7, yOffset + 9, 52, 82 ));
+					toSend.addCommand( oldstrutil::format("tilepic %u %u %i", xOffset + 5, yOffset + 10, std::stoi(tag, nullptr, 0) ));
+					toSend.addCommand( oldstrutil::format("croppedtext %u %u %u %u %u %u", xOffset, yOffset + 65, 65, 20, 55, linenum++ ));
+				}
+				else
+				{
+					toSend.addCommand( oldstrutil::format( "checkertrans %u %u %u %u", xOffset + 7, yOffset + 9, 110, 110 ));
+					toSend.addCommand( oldstrutil::format( "buttontileart %u %u 0x0a9f 0x0aa1 %u %u %u %u %u %u %u", xOffset, yOffset, 1, 0, buttonnum, std::stoi( tag, nullptr, 0 ), 0, 25, 25 ));
+					toSend.addCommand( oldstrutil::format( "tooltip 1042971 @%s@", data.c_str() ));
+					toSend.addCommand( oldstrutil::format( "croppedtext %u %u %u %u %u %u", xOffset + 15, yOffset + 85, 100, 20, 50, linenum++ ));
+				}
 				toSend.addText( data );
 				xOffset += XOFFSET;
 				if( xOffset > 640 )

From 9e7321b930477d99c6387d737bb00aebf31ebeb9 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 19:04:52 -0600
Subject: [PATCH 74/84] tab fix

---
 source/magic.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/source/magic.cpp b/source/magic.cpp
index 11918c522..7d49c6461 100644
--- a/source/magic.cpp
+++ b/source/magic.cpp
@@ -4500,10 +4500,10 @@ void CMagic::CastSpell( CSocket *s, CChar *caster )
 		return;
 	}
 	else if( caster->IsNpc() )
-    {
-        // Run a skillcheck for NPC to give them a chance to gain skill - if that option is enabled in ini
-        Skills->CheckSkill( caster, MAGERY, lowSkill, highSkill );
-    }
+	{
+		// Run a skillcheck for NPC to give them a chance to gain skill - if that option is enabled in ini
+		Skills->CheckSkill( caster, MAGERY, lowSkill, highSkill );
+	}
 
 	if( curSpell > 63 && static_cast(curSpell) <= spellCount && spellCount <= 70 )
 	{

From 7b553d852d41a95d3261c24ee52d030e0fa97e21 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Fri, 24 Jan 2025 19:07:35 -0600
Subject: [PATCH 75/84] Update Changelog.txt

---
 source/Changelog.txt | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/source/Changelog.txt b/source/Changelog.txt
index b0801d426..4757a4bea 100644
--- a/source/Changelog.txt
+++ b/source/Changelog.txt
@@ -1,3 +1,8 @@
+05/08/2024 - Dragon Slayer Update
+	Resolved an issue with cooking functionality.
+	Fixed a duplicated dictionary number.
+	Corrected the required items for crafting sweet dough and regular dough.
+
 13/05/2024 - Dragon Slayer
 	Added New Shield Type 107 so shield ID's no longer have to be in hard code for shields to work properly
 

From 2ca6b335c7abc88ff1db84576bfdbc3a584d60aa Mon Sep 17 00:00:00 2001
From: Geir Ove Alnes 
Date: Sat, 25 Jan 2025 15:29:21 +0800
Subject: [PATCH 76/84] Update Changelog.txt

---
 source/Changelog.txt | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/source/Changelog.txt b/source/Changelog.txt
index fb3168ad2..f62b29102 100644
--- a/source/Changelog.txt
+++ b/source/Changelog.txt
@@ -2,8 +2,7 @@
 	Added New Shield Type 107 so shield ID's no longer have to be in hard code for shields to work properly
 
 11/05/2024 - Dragon Slayer
-	Fixed items handling correct target for resists.
-	Added Getting the resists on chars.
+	Updated 'get command (js/commands/targeting/get.js) to use correct object reference when getting resist values for items, and added support for getting resist values for chars
 
 09/05/2024 - Dragon Slayer
 	Added ArtifactRarity AOS Property for items

From f9b3a33723507f982780a9f4ff5393daaab5677c Mon Sep 17 00:00:00 2001
From: Geir Ove Alnes 
Date: Sat, 25 Jan 2025 17:03:25 +0800
Subject: [PATCH 77/84] Update Changelog.txt

---
 source/Changelog.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/Changelog.txt b/source/Changelog.txt
index b21847d8b..02b53eb87 100644
--- a/source/Changelog.txt
+++ b/source/Changelog.txt
@@ -1,5 +1,5 @@
 12/08/2024 - Dragon Slayer
-	Flipped Imbuing and Mysticism Skill around.
+	Fixed an issue where Imbuing and Mysticism skills were listed in wrong order in skills.dfn and enums.h
 
 4/07/2024 - Dragon Slayer
 	Fixed Cleaver ID missing in the jse_objectassociations.scp for carving corpses

From 1ef451f7168b2ffea8a32932ee2a797a46a3bf34 Mon Sep 17 00:00:00 2001
From: Geir Ove Alnes 
Date: Sat, 25 Jan 2025 17:16:46 +0800
Subject: [PATCH 78/84] Update Changelog.txt

---
 source/Changelog.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/Changelog.txt b/source/Changelog.txt
index 4cb968502..c9dea30cf 100644
--- a/source/Changelog.txt
+++ b/source/Changelog.txt
@@ -1,5 +1,5 @@
 07/12/2024 - Dragon Slayer
-Updated the packet 0xf1 to reflect the current CUO Web Ping while maintaining backward compatibility with older ping statuses. (0xf1_freeshardServerPoll.js) (Thanks Karasho and Xuri)
+	Updated the packet 0xf1 to reflect the current CUO Web Ping while maintaining backward compatibility with older ping statuses. (0xf1_freeshardServerPoll.js) (Thanks Karasho and Xuri)
 
 12/08/2024 - Dragon Slayer
 	Fixed an issue where Imbuing and Mysticism skills were listed in wrong order in skills.dfn and enums.h

From 7115b64d448e47feae4b6df10496a3c8f729131d Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Sat, 25 Jan 2025 08:05:47 -0600
Subject: [PATCH 79/84] fixed

---
 data/js/server/misc/spawnergump.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/data/js/server/misc/spawnergump.js b/data/js/server/misc/spawnergump.js
index 0767c3eb7..449f219a7 100644
--- a/data/js/server/misc/spawnergump.js
+++ b/data/js/server/misc/spawnergump.js
@@ -1,11 +1,11 @@
 function onUseChecked( pUser, iUsed )
 {
 	var socket = pUser.socket;
-	socket.tempObj = iUsed;
 	var gumpID = 5037 + 0xffff;
 
 	if( socket && iUsed && iUsed.isItem && pUser.isGM )
 	{
+		socket.tempObj = iUsed;
 		socket.CloseGump( gumpID, 0 );
 		spawnerGump( socket, pUser, iUsed );
 	}

From d45a00e3ae30e0a1a6e47c0ce40a3496590f1359 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Sat, 25 Jan 2025 08:13:53 -0600
Subject: [PATCH 80/84] Update combat.cpp

---
 source/combat.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/combat.cpp b/source/combat.cpp
index 611fd9295..9d0627316 100644
--- a/source/combat.cpp
+++ b/source/combat.cpp
@@ -3486,7 +3486,7 @@ R32 CHandleCombat::GetCombatTimeout( CChar *mChar )
 	if( cwmWorldState->ServerData()->ExpansionCoreShardEra() <= ER_LBR )
 	{
 		// Weapon swing delay in LBR and earlier
-		getDelay = baseValue / ( getDelay * getOffset * speedBonus ) / globalAttackSpeed;
+		getDelay = baseValue / ( getDelay * getOffset * speedFactor ) / globalAttackSpeed;
 	}
 	else if( cwmWorldState->ServerData()->ExpansionCoreShardEra() < ER_ML )
 	{

From 38f1ee598f2445a4815fa313de5d76350815214b Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Sat, 25 Jan 2025 09:33:08 -0600
Subject: [PATCH 81/84] Update cServerData.cpp

---
 source/cServerData.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/source/cServerData.cpp b/source/cServerData.cpp
index 178453137..baebacaf7 100644
--- a/source/cServerData.cpp
+++ b/source/cServerData.cpp
@@ -724,6 +724,7 @@ auto CServerData::ResetDefaults() -> void
 	PetCombatTraining( true );
 	HirelingCombatTraining( true );
 	NpcCombatTraining( false );
+	SwingSpeedIncreaseCap( 60 );
 	WeaponDamageBonusType( 2 );
 
 	CheckPetControlDifficulty( true );

From 0070ce2deb947fbfdf458ea28632e0bfa4a3b556 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Sat, 25 Jan 2025 10:24:37 -0600
Subject: [PATCH 82/84] Added Int & Dex

Added Int and Dex Tooltips
---
 source/CPacketSend.cpp | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/source/CPacketSend.cpp b/source/CPacketSend.cpp
index 4f7ae8872..7abc58253 100644
--- a/source/CPacketSend.cpp
+++ b/source/CPacketSend.cpp
@@ -7665,7 +7665,9 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou
 				FinalizeData( tempEntry, totalStringLen );
 			}
 
-			const SI16 strReq = (cItem.GetStrength() * (100 - cItem.GetLowerStatReq())) / 100;
+			const SI16 strReq = ( cItem.GetStrength() * ( 100 - cItem.GetLowerStatReq() )) / 100;
+			const SI16 dexReq = ( cItem.GetDexterity() * ( 100 - cItem.GetLowerStatReq() )) / 100;
+			const SI16 intReq = ( cItem.GetIntelligence() * ( 100 - cItem.GetLowerStatReq() )) / 100;
 
 			if( strReq > 0 )
 			{
@@ -7674,6 +7676,20 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou
 				FinalizeData( tempEntry, totalStringLen );
 			}
 
+			if( dexReq > 0 )
+			{
+				tempEntry.stringNum = 1042971; // ~1_NOTHING~
+				tempEntry.ourText = oldstrutil::format( "dexterity requirement %s", oldstrutil::number( cItem.GetDexterity()).c_str() );
+				FinalizeData( tempEntry, totalStringLen );
+			}
+
+			if( intReq > 0 )
+			{
+				tempEntry.stringNum = 1042971; // ~1_NOTHING~
+				tempEntry.ourText = oldstrutil::format( "intelligence requirement %s", oldstrutil::number( cItem.GetIntelligence()).c_str() );
+				FinalizeData( tempEntry, totalStringLen );
+			}
+
 			if( cItem.GetLowerStatReq() > 0 )
 			{
 				tempEntry.stringNum = 1060435; // lower requirements ~1_val~%

From 4c31ee700bd84111d6c8a91d0a397634beb54ec3 Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Sat, 25 Jan 2025 11:43:20 -0600
Subject: [PATCH 83/84] Update CPacketSend.cpp

---
 source/CPacketSend.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/source/CPacketSend.cpp b/source/CPacketSend.cpp
index 7abc58253..95fe21701 100644
--- a/source/CPacketSend.cpp
+++ b/source/CPacketSend.cpp
@@ -7672,21 +7672,21 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou
 			if( strReq > 0 )
 			{
 				tempEntry.stringNum = 1061170; // strength requirement ~1_val~
-				tempEntry.ourText = oldstrutil::number( cItem.GetStrength() );
+				tempEntry.ourText = oldstrutil::number( strReq );
 				FinalizeData( tempEntry, totalStringLen );
 			}
 
 			if( dexReq > 0 )
 			{
 				tempEntry.stringNum = 1042971; // ~1_NOTHING~
-				tempEntry.ourText = oldstrutil::format( "dexterity requirement %s", oldstrutil::number( cItem.GetDexterity()).c_str() );
+				tempEntry.ourText = oldstrutil::format( "dexterity requirement %s", oldstrutil::number( dexReq ).c_str() );
 				FinalizeData( tempEntry, totalStringLen );
 			}
 
 			if( intReq > 0 )
 			{
 				tempEntry.stringNum = 1042971; // ~1_NOTHING~
-				tempEntry.ourText = oldstrutil::format( "intelligence requirement %s", oldstrutil::number( cItem.GetIntelligence()).c_str() );
+				tempEntry.ourText = oldstrutil::format( "intelligence requirement %s", oldstrutil::number( intReq ).c_str() );
 				FinalizeData( tempEntry, totalStringLen );
 			}
 

From 0c9dd2d29950ee0d19bf2b9de2d591744b91eabf Mon Sep 17 00:00:00 2001
From: Dragon Slayer <85514184+DragonSlayer62@users.noreply.github.com>
Date: Sat, 25 Jan 2025 11:55:51 -0600
Subject: [PATCH 84/84] Update CPacketSend.cpp

---
 source/CPacketSend.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/CPacketSend.cpp b/source/CPacketSend.cpp
index e1e1520be..448966e33 100644
--- a/source/CPacketSend.cpp
+++ b/source/CPacketSend.cpp
@@ -7702,7 +7702,7 @@ void CPToolTip::CopyItemData( CItem& cItem, size_t &totalStringLen, bool addAmou
 				FinalizeData( tempEntry, totalStringLen );
 			}
 
-      if( cItem.GetHitChance() > 0 )
+			if( cItem.GetHitChance() > 0 )
 			{
 				tempEntry.stringNum = 1060415; // hit chance increase ~1_val~%
 				tempEntry.ourText = oldstrutil::number( cItem.GetHitChance() );