- Add $inventory->CountItemEquippedByID(item_id) to Perl.
- Add $inventory->HasItemEquippedByID(item_id) to Perl.
- Add inventory:CountItemEquippedByID(item_id) to Lua.
- Add inventory:HasItemEquippedByID(item_id) to Lua
* Fix for illusion wear change
On zone in, mobs with illusions were not displaying correct armor.
* [Bug Fix] Illusions will now properly display armor to other clients when they zone in
better looping
* [Bug Fix] Fix issue where you can set your title to titles you don't have.
* Fixes.
* Fix missing logic check for HasTitle
Co-authored-by: Natedog2012 <jwalters_06@yahoo.com>
* [Skills] Exponential Decay Skill Up Formula
Added an exponential decay skill up formula option.
The current, linear, formula results in negative chances to skill up, which
have been mitigated via a multiplier and minimum of 1%
* [Skills]Configurable Exponential Decay Formala for Skill Up
What this fixes:
The existing formula for determining whether or not to skill up could result
in negative chances, and made an assumption around the number 252.
This would ultimately result in an override that would set the chance to 1.
My fix:
I created 2 new rules:
Character:SkillUpMaximumChancePercentage
Character:SkillUpMinimumChancePercentage
I changed the forumla to:
chance = ((max - min + skill_modification) * (.99^skill)) + min
This results in an exponential decay that starts at skill-modified maximum
and approaches minimum.
I decided that max-min+skill_modification should never be less than min
I also decided to continue to apply the Character:SkillUpModifier rule
post-calculation. I do not really think this is necessary anymore, given
this new formula, but we can discuss removing it.
I chose 25 and 2 as default maximum and minimum based on feel.
Related method signature fix:
Client::mod_increase_skill_chance was changed to return a double and
accept a double as an input for chance. This matches the actual data types
provided while calling the method and eliminates some type coersion and
resultant truncation. Right now, this method doesn't do anything, but in the
future we could implement skill-specific training dummies that accelerate
skill ups. I deduce that this is the purpose of this method call.
* [Skills]Configurable Exponential Decay Formula for Skill Up
What this fixes:
The existing formula for determining whether or not to skill up could result
in negative chances, and made an assumption around the number 252.
This would ultimately result in an override that would set the chance to 1.
My fix:
I created 2 new rules:
Character:SkillUpMaximumChancePercentage
Character:SkillUpMinimumChancePercentage
I changed the forumla to:
chance = ((max - min + skill_modification) * (.99^skill)) + min
This results in an exponential decay that starts at skill-modified maximum
and approaches minimum.
I decided that max-min+skill_modification should never be less than min
I also decided to continue to apply the Character:SkillUpModifier rule
post-calculation. I do not really think this is necessary anymore, given
this new formula, but we can discuss removing it.
I chose 25 and 2 as default maximum and minimum based on feel.
Related method signature fix:
Client::mod_increase_skill_chance was changed to return a double and
accept a double as an input for chance. This matches the actual data types
provided while calling the method and eliminates some type coersion and
resultant truncation. Right now, this method doesn't do anything, but in the
future we could implement skill-specific training dummies that accelerate
skill ups. I deduce that this is the purpose of this method call.
* fixup! [Skills]Configurable Exponential Decay Formula for Skill Up
* fixup! [Skills]Configurable Exponential Decay Formula for Skill Up
* Update client_packet.cpp
* [Bug Fix] Do not allow /open to be used on traps or auras, causes crash
* [Bug Fix] Do not allow /open to be used on traps or auras, causes crash
* test
* complete
* Update effects.cpp
* Update spells.cpp
* Update effects.cpp
* [Spells] Support for bards using Disciplines while casting or /melody.
Support for spell field 'cast not standing' not allow casting from divine aura
* [Spells] Support for bards using Disciplines while casting or /melody.
DA bypass logic for spells with field 'cast_not_standing'
* updates
* stun and mez bypass
* Update spdat.cpp
* Update spdat.cpp
* Update spells.cpp
* test
* complete
* Update effects.cpp
* Update spells.cpp
* Update effects.cpp
* [Spells] Support for bards using Disciplines while casting or /melody.
Support for spell field 'cast not standing' not allow casting from divine aura
* [Spells] Support for bards using Disciplines while casting or /melody.
DA bypass logic for spells with field 'cast_not_standing'
* start of rework
* reworked v2 no timer
* fix
* more mechanics
* Update pets.cpp
* move to pet.cpp
* [Spells] Updates and fixes to Target Locked Pets
* [Spells] Updates and fixes to Target Locked Pets
Removed a conditional that was rendered obsolete by moving the addition of a
mob to the auto haters list to fire after an IsValidXTarget check. This
made an entity_list call unnecessary. [zone/client.cpp]
Removed said unnecessary entity_list call. [zone/client.cpp]
Removed a superfluous call to ProcessXTargetAutoHaters [zone/attack.cpp]
* [Commands] Cleanup #who Command.
- Cleanup messages and logic.
- Add GetAccountStatusMap() and GetAccountStatusName() helpers for account status stuff.
- Use Chat::Who instead of Chat::Magenta so you can more easily see saylinks.
- Add a summon saylink to the list of saylinks so you can summon the player.
* New line.
- Disallows multiple augments via #augmentitem or otherwise.
- Added ItemInstance::ContainsAugmentByID(item_id) helper method for finding an augment in an item instance.
* [Bug Fix] Add range check to OP_PickPocket
* Pickpocket distance is 15 constant according to Mackal
* Re-add wiggle room for distance check due to pathing
* [XTarget] Disallow Corpses in XTarget Auto Slots
Why:
There exists an odd state where corpses will fill up your XTarget window.
This is reproducable using a combination of a pet to kill a mob
and timely feign death to wipe the owner's aggro.
What:
Added an IsCorpse check to IsXTarget.
Added a block to mark corpse XTargets as dirty to ProcessXTargetAutoHaters
* fixup! [XTarget] Disallow Corpses in XTarget Auto Slots
* fixup! [XTarget] Disallow Corpses in XTarget Auto Slots
* [XTarget] Disallow Corpses Code Cleanup
Added some safety, performance, and code readability changes per PR request.
* Change default expansion values for ALL to -1 from 0
* Adjust content_filter_criteria
* Refactor content filtering logic
* Allow flag strings to also just be empty instead of null
* Formatting
* Editor oops
- #guild rename was checking argument count and not allowing you to rename guilds to names that had spaces.
- #killallnpcs was crashing zones when used sometimes due to getting a nullptr somewhere in the loop.
- #worldwide message was using just the first word of the message sent using the command, not all of them.
Why:
Heal Over Time spells honor the Spells:IgnoreSpellDmgLvlRestriction rule,
shouldn't instant heals honor this rule too?
The fix:
Added a check for Spells:IgnoreSpellDmgLvlRestriction in the GetActSpellHealing
method.
* [Shared Tasks] Cross Zone Remove Fix
Why:
The cross_zone_remove_task quest methods were not removing from
shared_task_members database table and were not clearing shared task
cache. This resulted in a situation where a character could not
request other shared tasks.
What:
Shamelessly copied shared task logic from ClientTaskState::CancelTask
into ClientTaskState::RemoveTaskByTaskID
* What:
Instead of copying code from CancelTask into RemoveTaskByTaskID, it is better
for code maintenance to simply call CancelTask from RemoveTaskByTaskID.
This is cleaner.
Note: I chose to be explicit with the remove_from_db parameter, despite true
being the default. I tend to do this to protect from the default value
changing in the future.
* [Shared Tasks] RemoveTaskByTaskID Cleanup
Removed unused variables.
Distinguished log messages for Shared Tasks from regular Tasks.
Added 1 rule per class that defines tracking distance multiplier for that class
Kept the defaults of 12 for ranger, 10 for druid, and 7 for bard
Created 1 method for determining class tracking distance multiplier
Created 1 method for determining if a class can track, based on multiplier
Updated tracking logic to use these methods to determine whether a tracking
packet should and can be sent or not.
* [Bux Fix] Pick Lock was allowing skillups on doors above player skill
* Fixed indentation
* Fix indentation #2 - I am not so bright :(
* Further refine messages for pick lock to match live
* sql to make pot pick locks book pickable by skill 1 and skillup
- Cleanup messages and logic.
- Adds GetGuildNameByID, GetGuildRankName, GetGuildIDByCharacterID, and IsCharacterInGuild helper methods for guild stuff.
- Convert #guild info message to a popup display to tidy it up and make it more legible.
* start
* working
* Update perl_mob.cpp
* updates
* Update perl_mob.cpp
* illusion behavior
* rework start
* fix later
* Update mob.cpp
* rework
* updates
* Update mob.cpp
* update
* gm command updates
* updates
* Update CMakeLists.txt
* [Features] Appearance Effects will now be sent to clients upon zone in. GM commands.
remove debugs
* [Features] Appearance Effects will now be sent to clients upon zone in. GM commands.
perl fix
* [Features] Appearance Effects will now be sent to clients upon zone in. GM commands.
space fix
* [Features] Appearance Effects will now be sent to clients upon zone in. GM commands.
minor fix
* Update CMakeLists.txt
* [Features] Appearance Effects will now be sent to clients upon zone in. GM commands.
cleaned up some inconsistency
* [Features] Appearance Effects will now be sent to clients upon zone in. GM commands.
* New function to reset spellbar in perl/lua ResetCastbarCooldownsBySlot -1 for all slots and anything else to do it by slot number
* Add ResetCastbarCooldownsBySlot / ResetCastbarCooldownsBySpellID / ResetAllCastbarCooldowns
* [Commands] Add #setaltcurrency Command.
- Add #setaltcurrency [Currency ID] [Amount] command to allow you to set a specific alternate currency to a value.
- Add Zone::GetCurrencyID() and Zone::GetCurrencyItemID() helper methods.
- Cleanup loops through zone->AlternateCurrencies.
- Utilize helper methods where necessary.
- Convert old methods parameters and return values from int to uint32 where necessary.
* Typo.
- Add #unmemspell [Spell ID] command to unmemorize a spell by ID from you or your target.
- Add #unmemspells command to unmemorize all spells from you or your target.
- Cleanup #memspell command and change arguments from #memspell [Slot] [Spell ID] to #memspell [Spell ID] [Spell Gem] for easier use.
- Add #memspell [Spell ID] functionality to memorize to first open spell gem if there are any using FindEmptyMemSlot helper method.
- Rename client->FindMemmedSpellByID(spell_id) to FindMemmedSpellBySpellID(spell_id).
- Add client->FindEmptyMemSlot() helper method.
- Add $client->FindEmptyMemSlot() to Perl.
- Add client:FindEmptyMemSlot() to Lua.
- Add $client->FindMemmedSpellBySpellID(spell_id) to Perl.
- Add client:FindMemmedSpellBySpellID(spell_id) to Lua.
- Invisibility vs. Undead and Invisibility vs. Animals were not breaking charm.
- Add Invisibility enumerator.
- Add special identifier for Invisibility vs. Undead and Invisibility vs. Animals.
* [Spells] SPA 310 SE_ReduceReuseTimer will now work on spell recast time
[Spells] SPA 310 SE_ReduceReuseTimer will now work on spell recast time
* [Spells] SPA 310 SE_ReduceReuseTimer will now work on spell recast time
[Spells] SPA 310 SE_ReduceReuseTimer will now work on spell recast time
- Add #removeitem [Item ID] [Amount] command to remove items by amount versus nuking them all, removes all if amount is greater than what you or your target have.
- Add #setendurance [Endurance] command to set an NPC or player's endurance to a specified amount, or to max if the amount is greater than their max.
- Cleanup #endurance command message and logic.
- Add #sethp [Health] command to set an NPC or player's health to a specified amount, or to max if the amount is greater than their max.
- Cleanup #heal command message and logic.
* [Commands] Add #setmana Command.
- Add #setmana [Mana] command to set an NPC or player's mana to a specified amount, or to max if the amount is greater than their max.
- Cleanup #mana command message and logic.
* Update mana.cpp
- Add #petitems command to show a person's pet items if they have access to the command.
- Adds a default false parameter to QueryLoot for NPCs that keeps messages and logic from being ran on pets for no reason.
- Cleaned up message a bit for loot and stuff.
- Remove check for loottable ID when using #npcstats for NPCs that get items from a script or otherwise.
* start
* bind sight fixed
* Update spdat.h
* Update spells.cpp
* Search or jump to… Pull requests Issues Marketplace Explore @KayenEQ EQEmu / Server Public 60 338 290 Code Issues 106 Pull requests 11 Actions Projects 1 Wiki Security Insights [Bug Fix] Bind Sight will now function properly #1825 Open KayenEQ wants to merge 4 commits into EQEmu:master from KayenEQ:bindsightfix2 Open [Bug Fix] Bind Sight will now function properly
* [Commands] Cleanup #zsafecoords Command.
- Cleanup message and logic.
- Add parameter to allow data to be saved to database.
* Typo.
* Update zsafecoords.cpp
* Update zsafecoords.cpp
* [Commands] Cleanup #zheader Command.
- Cleanup message and logic.
- Add parameter to allow versions to be loaded.
- Cleanup parameter name in CFG methods from instance_id to instance_version.
* Update zonedb.cpp
* [Commands] Cleanup #zunderworld Command.
- Cleanup message and logic.
- Add parameter to allow data to be saved to database.
* Update zunderworld.cpp
* [Commands] Cleanup #nukebuffs Command.
- Cleanup messages and logic.
- #nukebuffs now allows you to nuke all, beneficial, or detrimental buffs, also added a help menu.
- Add BuffFadeBeneficial().
- Cleanup logic in some buff fade methods.
- Fix several spots where we were using CalcBonuses() when it was unnecessary, i.e when you fade no buffs you do not need to recalculate bonuses.
* Update spells.cpp
- Cleanup messages and logic.
- Add RULE_INT(Zone, PEQZoneHPRatio, 75, "Required HP Ratio to use #peqzone")
- Modify #peqzone Timer rule to allow it to be disabled.
* Monk AA Spirit of Master Wu sends message even if it grants 0 extra attacks.
* fomatting + put if statement in wrong place.. oops.
* Need to push something to set up my Tortoise Github Auth
* test
* test
* test
* test
* test
* requested changes
* Update special_attacks.cpp
Co-authored-by: Kinglykrab <89047260+Kinglykrab@users.noreply.github.com>
* [Cleanup] Make use of AccountStatus constants wherever status is checked or used.
- Cleanup all instances of SendEmoteMessage.
- Cleanup all instances of SendEmoteMessageRaw.
- Cleanup all instances of MessageStatus.
- Convert Quest API method defaults to use constants.
* Cleanup constant names.
* [Commands] Cleanup #stun Command.
- Cleanup message.
- Add ConvertSecondsToTime() to string_util.h and convert Quest API Methods to use helper.
* Add days to ConvertSecondsToTime() and cleanup logic.
* Cleanup.
* Typo.
* Cleanup.
* Cleanup.
* [Commands] Cleanup #zonelock Command.
- Add support for Zone IDs.
- Cleanup messages and display.
- Fix dangling pointer in ZoneLongName() helper method so name is displayed properly.
* Add account status enum.
* Typo.
* Typo.
* Convert list to constants.
* Cleanup.
* Update command.cpp
* Fix compile.
* Sanitize bad words in server names
* Add config options and enforcement for dev/test servers and servers starting with a special character
* Refine bad word logic
* Add installer to dev/test servers
* Change server prefixes
* Special char prefix
* Formatting
* Remove multi words
* Add server types enum
* Add error constants
* Remove sanitize from world level
* Use strn0cpy
- Add RULE_BOOL(Combat, ArcheryConsumesAmmo, true, "Set to false to disable Archery Ammo Consumption")
- Add RULE_BOOL(Combat, ThrowingConsumesAmmo, true, "Set to false to disable Throwing Ammo Consumption")
* Add player login reply struct
* Use player login reply struct for failed logins
* Use base message struct for login requests
* Refactor server list reply serialization
Use BaseMessage and BaseReplyMessage structs for server list
and add flags for server type and status
* Use reply message struct for login handshake
Remove client version checks, the packets are the same for titanium and rof2
* Use base headers for join server requests
* Log correct server list ip
* Add compressed flag to base message header
Document encrypt type flag more
* Rules to negate /tgb, /autofire, and /melody
Created new rules to negate server and client side effects of commands: /tgb, /autofire, and /melody. These commands are enabled by default and can be disabled to enforce a classic EQ experience if using progression style play for example.
Rules
--------------
RULE_BOOL(Character, EnableBardMelody, true, "Enable Bard /melody by default, to disable change to false for a classic experience.")
RULE_BOOL(Character, EnableRangerAutoFire, true, "Enable Ranger /autofire by default, to disable change to false for a classic experience.")
RULE_BOOL(Character, EnableTGB, true, "Enable /tgb (Target Group Buff) by default, to disable change to false for a classic experience.")
* Removed sql query for rules per Mackal recommendation.
* servertalk server connections will now attempt to parse legacy connections as well as modern ones
* Some fixes for legacy connections
* Change legacy default from local to eqemu
What:
Add toggle for compounding bonuses for lifetap heals.
Why:
When spell damage and heal amount bonuses are scaled to ludicrous
levels, this double dip results in very high heals from
relatively weak lifetaps.
Created new rule: Spells:CompoundLifetapHeals
If true (default):
Apply spell damage bonuses to lifetap damage
Pass that amount through heal bonuses
Heal for this resulting amount
If false:
Apply spell damage bonuses to lifetap damage
Heal for this resulting amount
* [Commands] Cleanup #showskills Command.
- Cleanup display and use GetSkillName() helper method.
* Add optional "all" parameter to show all skills.
* Formatting.
* Formatting.
* Target, not c.
* [Rules] Add Resurrection Sickness rule for Characters/Bots.
- Add RULE_BOOL(Character, UseResurrectionSickness, true, "Use Resurrection Sickness based on Resurrection spell cast, set to false to disable Resurrection Sickness.")
- Add RULE_BOOL(Bots, UseOldRaceRezEffects, false, "Older clients had ID 757 for races with high starting STR, but it doesn't seem used anymore")
- Add RULE_BOOL(Bots, UseResurrectionSickness, true, "Use Resurrection Sickness based on Resurrection spell cast, set to false to disable Resurrection Sickness.")
* Add rules for spell IDs.
* Fix bot health on spawn when resurrection sickness is disabled.
- Formatting.
* Remove 'this' keyword.
- Add #worldwide remove [Spell ID] - Removes a spell from player buffs worldwide.
- Add #worldwide message [Message] - Sends a worldwide message in Chat::Yellow.
- Add #worldwide move [Zone ID] or #worldwide move [Zone Short Name] - Moves every player in the game to the specified zone.
- Add #worldwide moveinstance [Instance ID] - Moves every player in the game to the specified instance.
- All but `#worldwide message` send a message to sender client.
- Cleanup menu and add stats that were not there before.
- Only display some data if necessary (i.e only show loot/money if they have loot/money)
- Add skill name helper method.
- Add faction name helper method.
- Add Charmed stats and other getter methods.
- Cleanup QueryLoot() method.
* [Commands] Add #emptyinventory Command.
- Allows you empty you or your target's inventory completely. (Equipment, General, Bank, and Shared Bank)
- Fixed an issue not allowing quest::removeitem(item_id, quanity) to remove 0 charge items.
- Fixed an issue not allowing eq.remove_item(item_id, quanity) to remove 0 charge items.
* Update command.cpp
* Update client.cpp
- Keeps things tidier.
Perl script was used to get this in order easily.
```pl
my @perl_file_types = (
"bot",
"client",
"doors",
"entity",
"expedition",
"groups",
"hateentry",
"inventory",
"mob",
"npc",
"object",
"perlpacket",
"player_corpse",
"questitem",
"raids",
"spell"
);
foreach my $file_type (sort {$a cmp $b} @perl_file_types) {
my $perl_file = "perl_$file_type.cpp";
open my $client_file, '<', $perl_file or die "Cannot open file_name $perl_file";
{
local $/;
$content = <$client_file>;
}
close $client_file;
open my $perl_data_file, ">", "perl_$file_type\_data.cpp";
my @variables = ();
foreach my $line (split("\n", $content)) {
if ($line=~/newXSproto\(/i) {
$line =~ s/\s+/ /g;
my @line_data = split(/ /, $line);
push(@variables, join(" ", @line_data));
}
}
foreach my $variable (sort {$a cmp $b} @variables) {
$variable =~ s/^ //ig;
print $perl_data_file "\t$variable\n";
}
close $perl_data_file;
}```
* update for SPA 511
* remove debugs, AA implemented
* update
* twinprocfix
* AA procs added
* format update
* update
* proctimer limits
* update
* rename function
renamed function
only check for buffs value > 0, don't need to check for AA's which are negative ID's
* pre merge
* variable updates
* Update spell_effects.cpp
* var rename
update var name to better represent its function.
* updated proc struct
added reuse timer
* reuse timer to spell procs
* updates
* debug remove
* Update mob.cpp
* fix
* merge
* charm target restrictions
* fixed
* Update spells.cpp
* Update spells.cpp
* Update spells.cpp
only send spell bar when we have to, avoid potential exploit.
* logs
* [Quest API] Simplify bulk Scribe and Train logic.
- Add $client->GetFreeDisciplineSlot(starting_slot) to Perl.
- Add $client->ScribeSpells(min_level, max_level) to Perl.
- Add $client->LearnDisciplines(min_level, max_level) to Perl.
- Add client:GetNextAvailableDisciplineSlot(starting_slot) to Lua.
- Add client:ScribeSpells(min_level, max_level) to Lua.
- Add client:LearnDisciplines(min_level, max_level) to Lua.
Convert quest::scribespells() and quest::traindisc() to use new ScribeSpells and LearnDisciplines methods for consistency.
* Update command.cpp
* Add optional rules for itembonuses HealAmt and SpellAmt to scale for DoTs/HoTs
* Fix typo
* Only 1 rulecheck
* Apply +healingitems and +dmgitems after focus effects so they scale properly
* Fix dots / hots to not always use PVPScaling for extra_dmg / extra_healing
Adjust +healamt and +spelldmg to scale over the full duration of the spell, Thanks Kayen
* if for whatever reason the world server is not sending an address, use the local address it sends
* Log when world is sending loginserver info
* Force legacy mode when login host is login.eqemulator.net to avoid misconfigurations at least until things change
* Add human IP translation to log messages
* Sanitize world server name
* Code cleanup and renaming member variables
* More cleanup
* Remove this->
* Validation constants
* Key worldserver lookups by both longname and shortname both
* Update allowed character list
* Fix short_name API response field; add world_id to response
* Shorten receiver verbosity
* Remove unnecessary member variables from database and rename database to m_database
* Adjust MAX_SERVER_VERSION_LENGTH
* Fix indents
* update for SPA 511
* remove debugs, AA implemented
* update
* format update
* rename function
renamed function
only check for buffs value > 0, don't need to check for AA's which are negative ID's
* var rename
update var name to better represent its function.
* new instrument mod spell effect checks
PR split
* format
* Update spdat.cpp
correction, all direct damage spells get modifiers. Made a mistake with the parse, was using wrong mod.
* restriction changes
cure effects can be modified.
decided to keep a list of known effects that are not modified to return false. and will keep the default to be true for anything as to not inhibit custom bard song development
* SE_ProcChance is modified
* Update spdat.cpp
* update
* Update spell_effects.cpp
- Cleans up the rest of the char arrays used when exporting to events.
- Converts all events to use a similar variable name for export `export_string`.
- Needless calls to .c_str() removed.
* pre remove debug
* Update attack.cpp
* Update attack.cpp
* Update attack.cpp
* Update attack.cpp
* apply to temp pets
* format fix
* changed to just use one rule
Merged into NPC's and Pet's into one rule.
- Add $mob->GetHateRandomBot() to Perl.
- Add $mob->GetHateRandomClient() to Perl.
- Add $mob->GetHateRandomNPC() to Perl.
- Add mob:GetHateRandomBot() to Lua.
- Add mob:GetHateRandomClient() to Lua.
- Add mob:GetHateRandomNPC() to Lua.
* Add EVENT_LOOT_ZONE to zone_controller
* Fix porting event_loot_zone to lua API
* Remove extra spacing and remove forced message to allow for scripted responses.
* Allow all script parsing to fire before sending a failed lootitem, add corpse_id
* Only search for zone_controller once
When `Spells:InvisRequiresGroup` was true, you could only cast on Group members, intended functionality is to cast on Group members and/or people in your Raid Group.
* [BugFix] Urgent - Previous fix for TimeSync on static zones broke dynamic zones
* Use local variable instead of inline accessor for consistancy.
Co-authored-by: Noudess <noudess@gmail.com>
* Remove detection of client pets from Sense[Summoned|Undead|Animal]
* Use IsPetOwnerClient() function instead of individual checks
* Add option to exclude client pets from GetClosestMobByBodyType
* Add parameter
Co-authored-by: Noudess <noudess@gmail.com>
* update
* updates
* updates
* update
* update
* Update ruletypes.h
* Apply extra spell dmg
Mob with the reflect effect apply its Extra Spell Damage from item stat to the reflected spell.
Updated portion of formula for extra damage based on live parsing.
* correct formula
This makes the float and integer fields in the doors table not nullable.
The only column this should affect is the buffer column which wasn't
being loaded in the old doors loading query. The other columns weren't
validated but they should still be made not nullable to avoid issues.
This will fix a crash in potimeb which is the only zone that had NULL
values in the buffer column with the current peq database. This column
can be removed in a future followup since it isn't being used anyway.
The include order here was causing a compile error when building with
perl 5.12 due to a bad interaction with the older fmt submodule version
being used
- Add $client->GetIPExemption() to Perl.
- Add $client->GetIPString() to Perl.
- Add $client->SetIPExemption(exemption_amount) to Perl.
- Add client:GetIPExemption() to Lua.
- Add client:GetIPString() to Lua.
- Add client:SetIPExemption(exemption_amount) to Lua.
Will make plugin::IP unnecessary and allow people to get readable IP string easier, as well as set/get IP exemptions from Perl and Lua.
- Add $client->ReadBookByName(booK_name, book_type) to Perl.
- Add client:ReadBookByName(booK_name, book_type) to Lua.
- Allows server operators to put books in to their database and read from their database instead of storing the values in a script, also allows them to read pre-existing books using a script.
- Add quest::isnpcspawned(npc_ids) to Perl.
- Add quest::countspawnednpcs(npc_ids) to Perl.
- Add eq.is_npc_spawned(npc_ids) to Lua.
- Add eq.count_spawned_npcs(npc_ids) to Lua.
* [Dialogue] Add support for Dialogue Window titles.
- Custom title allows defaults to be overridden where necessary, like a leaderboard or something.
- Default target to client in case people want to send Dialogue Windows from current client.
* Fix possible issue with markdown.
- Example: Using the word "title" or using any identifier and forgetting the colon.
Add hash overload to perl CreateExpedition api
This adds an api to perl similar to the Lua api that accepts a reference
to a hash table with expedition creation info
Usage example:
my $expedition_info = {
expedition => { name => "Perl expedition", min_players => 2, max_players => 6 },
instance => { zone => "crushbone", version => 0, duration => 3600 },
compass => { zone => "gfaydark", x => 238, y => 987, z => -24.90 },
safereturn => { zone => "gfaydark", x => 245.84, y => 987.93, z => -27.6, h => 484.0 },
zonein => { x => 479.44, y => -500.18, z => 5.75, h => 421.8 }
};
$client->CreateExpedition($expedition_info);
Syntax for passing directly from a hash:
my %expedition_info = (...);
$client->CreateExpedition(\%expedition_info);
Add CreateTaskDynamicZone api to perl
Usage example:
sub EVENT_TASKACCEPTED {
if ($task_id == 4795) {
my %dz_hash = (
"instance", { zone=>"thundercrest", version => 11 },
"compass", { zone=>"broodlands", x=>1241.88, y=>511.147, z=>23.4192 },
"safereturn", { zone=>"broodlands", x=>1242.0, y=>526.0, z=>27.0, h=>0.0 }
);
$client->CreateTaskDynamicZone($task_id, \%dz_hash)
}
}
Shared tasks start replay timers based on accept time but solo tasks
should start from completion time. Solo tasks on live that have a
non-unlimited duration may require further investigation
* Implement auto saylink injection
* Cover Lua say since it takes a different code path
* [Dialogue] Dialogue Window Middleware (#1526)
* Dialogue window quest dialogue work
* Add rest of DialogueWindow hooks
* Remove spacing
* Add LavaDamage and MinLavaDamage support to ZoneHeader
* Add lava_damage and min_lava_damage to base_zone_repository.h
* Update version.h and utils/sql/git/required/ file
* Correct SQL Query, adjust utils/sql/db_update_manifest.txt to check one column
* Correct manifest
https://github.com/EQEmu/Server/pull/1540#discussion_r714330945
* [Commands] Overhauled #npcedit.
- Added missing columns like untargetable, show_name, exp_mod, etc.
- Put stats in order of column appearance in table within help message and within code.
- Converted StringFormat to fmt::format.
- Added a GetGenderName() helper method.
- Prettified response messages of nearly every #npcedit option.
All tested and ready to go.
Would like input about possibly changing some of the command arguments to match the table column names more closely, example being "spell" should be "npc_spells_id".
* Cleanup.
* Fix indentation.
* [Dialogue] Add support for Dialogue Window buttons.
- Also changes "mysterious" identifier to "{mysterious}".
- Both button names are required for anything to show up, otherwise it defaults to Yes/No similar to Client::SendFullPopup.
* Move SetEntityVariable so responses can override default button response.
* Add negativeid support so you can override button two popup ID.
* Fix log.
* Update dialogue_window.cpp
Convert button names to strings and negativeid to secondrespondid.
* [Quest API] Cross zone and world wide method overhaul.
- Adds support for Character ID, Character Name, and Expedition ID to all cross zone methods that did not have a method.
- Adds worldwide LDoN Updates.
- Shrinks the number of packets and structs from 83 to 17.
No quest functionality will be affected by this, as the only changes are the underlying method used to send the cross zone and world wide data.
* Formatting, organization, and fixing of improper exports.
* Finalize comb through of variable types, update types, etc.
* Merge fixes.
/quit and /exit will now properly parse to EVENT_DISCONNECT so operators can do things on disconnect to these players, previously it only functioned for /camp.
* [Quest API] Add EVENT_CONSIDER to Perl and Lua.
- Exports $entity_id in Perl.
- Exports e.entity_id in Lua.
Allows you to perform events on consider for server operators.
* Missing comma.
* Formatting.
* Add return capability to EVENT_CONSIDER and EVENT_CONSIDER_CORPSE so operators can break out of consider functions.
* [Bug Fix] Resolves issues with improper genders and textures on spells.
Spells will now properly understand their expected gender and texture.
Logic is based on what I saw in a stock PEQ database, can be adjusted if need be.
Any feedback is helpful.
* Made use of GetRaceGenderDefaultHeight() and added all races to their proper conditions.
* Formatting.
* [Quest API] Add corpse->GetLootList() and npc->GetLootList() to Perl and Lua.
- Add $corpse->GetLootList() to Perl.
- Add $npc->GetLootList() to Perl.
- Add corpse:GetLootList() to Lua.
- Add npc:GetLootList() to Lua.
Returns an array of item IDs for use with corpse and NPC methods such as HasItem(item_id), CountItem(item_id), and GetFirstSlotByItemID(item_id).
* Categories.
* Modify Lua to use classes.
* Initial commit
* Push latest
* Update door_manipulation.cpp
* More door work
* More doors work
* Upload notes
* Finalize changes
* Remove comment
* Add missing chat line
* Swapped URI parser with something not using deprecated C++ functions
* Shared tasks WIP; lots of logging; shared tasks and tasks work internally the same for now; lots to cleanup yet
* Update task_manager.cpp
* Add tables
* World message handler
* Zone message handler
* More messaging
* More rearranging
* Task creation work (wip)
* Tweaks
* Decoupled things, added a shared task manager, moved logic to the manager, created the shared task object, now creating a sense of state on creation and members, zero validation, happy path
* Cleanup unnecessary getter
* More work on shared task persistence and state loading
* Add int64 support into repositories
* More state handling, creation loads all tables
* Wrap up shared task state creation and removal
* Move more lookup operations to preloading (memory). Restore shared task state during world bootup
* Implement shared task updates
* Add members other than just leader in task confirmations
* Update shared_task_manager.cpp
* Hook task cancellation for shared task removal (middleware)
* Remove dynamic_zone_id from SharedTasks model in repositories (for now) since we will likely be one to many with DZ objects
* Get members to show up in the window on creation
* Add opcodes, cleanup
* Add opcode handlers
* Split some methods out, self removal of shared task and updating members
* Implement offline shared task sync
* Style changes
* Send memberlist on initial login; implement remove player from shared task window
* Refactorings, cleanup
* Implement make leader in shared tasks window
* Implement add player, sync shared task state after add
* Add opcodes for remaining clients
* Shared task invite dialogue window implementation and response handling (including validation)
* Logging
* Remove comment
* Some cleanup
* Pass NPC context through shared task request logic
* Remove extra SharedTaskMember fields
* Add message constants
* Remove static
* Only use dz for expedition request
This passes expedition creation parameters through DynamicZone instead
of injecting ExpeditionRequest since it can hold creation data now
* Store expedition leader on dz
This shifts to using the leader object that exists in the core dynamic
zone object. It will be moved to the dynamic zone table later with other
columns that should just be on the dz to make loading easier.
Expeditions are probably the only dz type that will use this for window
updates and command auth. Other systems on live do fill the window but
don't keep it updated
* Store expedition name on dz
This uses the name stored on dz (for window packets) instead of
duplicating it. This will be moved completely to dz table later
* Store uuid on dynamic zone
This lets dynamic zones generate the uuid instead of expeditions. Other
dz type systems may want to make use of this. Lockouts should also be
moved to dynamic zones at some point in the future so this will be
necessary for that
* Move expedition db columns to dz
These columns should just belong to the core dynamic zone. This will
simplify loading from the database and in the future a separate
expedition table may no longer be necessary.
* Move window packet methods to dz
It makes more sense for these methods to be in the core
This will also allow support for other systems to use the window, though
live behavior that updates the window for shared task missions when not
in an expedition is likely unintended since it's not updated on changes.
* Store dynamic zone ids on clients
These will now be used for client dynamic zone lookups to remove
dependency on any dz type system caches
* Move member management to dz
This moves server messaging for adding and removing members to internal
dynamic zone methods
Set default dz member status to Unknown
* Move member status caching to dz
This moves world member status caching into internal dz methods
Zone member updates for created expeditions are now async and sent after
world replies with member statuses. Prior to this two memberlist packets
were sent to members in other zones on creation to update statuses.
This also fixes a bug with member statuses being wrong for offline raid
members in the zone that created an expedition. Note that live kicks
offline players out of raids so this is only to support emu behavior.
* Move member status updates to dz
* Set dz member status on all client dzs
This also renames the zone entry dz update method and moves window
update to a dynamic zone method. Eventually expedition components
should just be merged with dz and handled as another dz type
* Save instance safe return on characters
Add character_instance_safereturns table and repository
Previously dz safe return only worked for online characters via the dz
kicktimer or offline characters with a workaround that moved them when
an expedition was deleted. There were various edge cases that would
cause characters to be moved to bind instead (succoring after removal,
camping before kick timer, removed while offline, bulk kickplayers
removal with some offline)
This updates a character's instance safereturn every time they enter a
zone. If a character enters world in an instance that expired or are no
longer part of they'll be moved to their instance safereturn (if the
safereturn data is for the same zone-instance). Bind is still a fallback
This may also be used for non-dz instancing so it's named generically
This removes the expedition MoveMembersToSafeReturn workaround which
deprecates the is_current_member column of dynamic_zone_members and
will be removed in a followup patch.
* Remove is_current_member from dz members
This was only being used in the workaround to move past members to
dz safereturns if they were still inside the dz but not online
* Let dz check leader in world
This moves expedition leader processing in world to the dynamic zone.
This is a step in phasing out the separate expedition class for things
that can run off the dynamic zone core with simple dz type checks
This greatly simplifies checking leader on member and status changes
without needing callbacks. Other dz types that may use the dz leader
object can just handle it directly on the dz the same as expeditions
* Let dz handle member expire warnings
This moves expire warning checks to dz. This will make it easier for
other dz types to issue expire warnings if needed
* Use separate dynamic zone cache
Dynamic zones are no longer member objects of expeditions and have been
placed into their own cache. This was done so other dz types can be
cached without relying on their systems. Client and zone dz Lookups are
now independent of any system
This continues the process of phasing out a separate expedition cache.
Eventually expeditions can just be run directly as dynamic zones
internally with a few dz type checks.
Add dz serialization methods (cereal) for passing server dz creation
Modify #dz list to show cache and database separately. Also adds #dz
cache reload. This command will reload expeditions too since they
currently hold references to the dz in their own zone cache.
Add a dynamic zone processing class to world to process all types and
move expedition processing to it
* Move expedition makeleader processing to dz
* Let dz handle expedition deletions
This removes the need for separate expedition cache in world
This will greatly simplify world dynamic zone caching and processing.
Dynamic zones that are expeditions can just handle this directly. Once
lockouts and other components are completely moved to dynamic zones the
separate expedition cache in zone will also no longer be necessary
* Remove ExpeditionBase class
Since world no longer caches expeditions this will not be necessary
* Fix windows compile
* Implement task dz creation
Prototype dz creation for shared tasks
* Add and remove shared task members from dz
Also keep leader updated (used in choose zone window)
* Fix client crash on failed shared task
* Fix linux compile and warning
* Check client nullptr for dz message
This was accidently removed when expedition makeleader was moved
* Disable dz creation for solo tasks
* Add shared task repository headers to CMakeLists
* Add shared task dynamic zones table
* Add shared task dz database persistence
* Get members from db on shared task dz creation
This fixes a case where removing a member from a shared task dz would
fail if the member's name was empty. This could happen if the shared
task dz was created while a member was offline.
This also changes the dz member removal method to only check id. It
might be possible to change all dz member validations to only check
ids since names are primarily for window updates, but shared task dz
member names need to be non-empty anyway to support possible live-like
dz window usage in the future.
* Add character message methods to world
Add simple and eqstr message methods to ClientList
Add shared task manager methods to message all members or leader
* Add SyncClientSharedTaskState and nested sync strategies to cover M3 work
* Fix whitespace
* Implement task request cooldown timer
This implements the task request cooldown (15 seconds) that live uses
when a task is accepted. This will also need to be set when shared
tasks are offered (likely due to additional group/raid validations)
* Implement shared task selector validation
This implements the validation and filtering that occurs before the task
selection window is sent to a client for shared tasks
To keep things live-like, task selectors that contain a shared task will
be run through shared task validation and drop non-shared tasks. Live
doesn't mix types in task selections and this makes validation simpler.
Also note that live sends shared task selectors via a different opcode
than solo tasks but that has not been implemented yet
* Add separate shared task select opcodes
Live uses separate opcodes for solo and shared task selection windows
* Convert ActivityType to enum class
* Refactor task selector serialization
This adds serializer methods to task and task objective structs for the
task selection windows. This combines the duplicate task selector
methods to reduce code duplication and simplify serialization
* Add shared task selector
This sends shared task selection window using the shared task specific
opcode and adds an opcode handler for shared task accepts which are sent
by client in response to setting selection window to shared task type.
* Refactor task objective serialization
This adds a serialization method to the task objective struct for
serializing objectives in the window list and combines the separate
client-based methods to reduce duplicated code.
* Add task level spread and player count columns
* Implement shared task accept validation
This adds a common method for shared task character request queries
* Add task replay and request timer columns
* Add character task timers table
* Use shared task accept time on clients
This overrides client task accept time with shared task's creation time.
This is needed for accurate window task timers and lockout messages
especially for characters added to shared tasks post creation
* Implement task timer lockouts
This implements replay and request task timers for solo and shared tasks
* Add solo and shared task timer validation
* Remove logging of padding array
This gets interpreted as a c string which may not be null terminated
* Implement /kickplayers task
This also fixes current CancelTask behavior for leader which was
performing kickplayers functionality through the remove task button
* Implement /taskquit command
* Implement shared task invite validation
Remove active invitation before invite accept validation
* Remove local client db persistence during SyncClientSharedTaskRemoveLocalIfNotExists
* Add missing accept time arg to assign task
* Only validate non-zero task invite requirements
* Fix task error log crash
* Separate task cooldown timer messaging
* Use method to check for client shared task
* Avoid unneeded task invite validation query
Only need to query character data for levels for non-zero level spread
* Implement /tasktimers command
May want to add some type of throttled caching mechanism for this in
the future
* Add /tasktimers rate limiter
* Intercept shared task completion; more work to come
* Change SharedTaskActivityState and SharedTasks time objects to datetime
* Add updated_time updates to SharedTaskActivities
* Mark shared tasks as complete when all activities are completed
* Save a database query on shared task completion and use the active record in memory
* Don't record shared task completions to the quest log
* Implement RecordSharedTaskCompletion, add tables, repositories
* Update shared_task_manager.cpp
* Update shared_task_manager.cpp
* Add shared task replay timers
This is still not feature complete. On live any past members that ever
joined the shared task will receive a replay timer when it's completed
* Create FindCharactersInSharedTasks that searches through memory
* Remove namespace shorthand and formatting
* More minor cleanup
* Implement PurgeAllSharedTasks via #task command
* Add #task purgetimers
* Decrease m_keepalive time between processes
* Remove type ordering in /tasktimer query
* Add comment for task packet reward multiplier
This is likely a reward multiplier that changes text color based on
value to represent any scaled bonus or penalty
* Add replay timers to past members
This implements the live behavior that adds replay timers to any
previous member of a shared task. This likely exists to avoid possible
exploits.
Shared task member history is stored in memory and is used to assign
replay timers. This history will be lost on world crashes or restarts
but is simpler than saving past member state in database.
This also makes world send shared task replay timer messages since
past members need to be messaged now
* Move PurgeTaskTimers client method to tasks.cpp
* Remove dz members when purging shared tasks
Server dz states need to be updated before shared tasks are deleted
* Use exact name in shared task invites
This removes the wildcards from shared task invite character queries
which was sometimes selecting the wrong character
Taskadd validation is called even for invalid characters to allow for
proper messages to occur
* Clear declined active shared task invitations
This also notifies leader for declined shared task invites
* Store shared task member names
This adds back the character name field to SharedTaskMember. This should
make serialization easier in the future and reduce database lookups when
names are needed for /task commands
* Implement /taskplayerlist command
* Replace queries with member name lookups
Now that shared task members store names these queries are unnecessary
This also adds not-a-member messages for /taskremove and /taskmakeleader
* Implement shared task member change packet
This avoids sending the full member list to members when a single member
is added or removed and lets the client generate chat messages for it.
* Serialize shared task member list from world
This uses cereal to serialize the full member list from world and
removes the zone query workarounds
* Initialize client task state array
This was causing sql query errors on client state reloads
The client task information array was uninitialized resulting in being
filled with 0xcdcdcdcd values in msvc debug builds. Under release builds
this may have resulted in indeterminate values
A better fix would be to refactor some of this legacy code
* Add shared task command messages
Add messages for non-leader task commands
This adds taskadd, taskremove, taskmakeleader, and taskquit messages
The leader receives double messages for taskremove like live due to the
client generated message as well as the explicit one. It also receives
double server messages if the leader /taskremoves self.
* Replace some task messages with eqstrs
This also updates to use live colors
* Avoid shared task invite leader lookup query
Since member names are stored now this query is also unnecessary
* Avoid reloading client state on shared task accept
This was unnecessarily reloading client task state when added to a
shared task.
This also resulted in all active tasks being resent to shared task
members on creation. The shared task itself is the only task that
needs to be sent which is handled by AcceptNewTask.
* Remove active shared task invite on zone
Live doesn't re-send shared task invites after zoning like it does for
expeditions so there's no need to keep these around. This fixes active
invitations never getting reset on characters that zone or go offline.
* Choose new shared task leader if leader removed
* Add separate shared task kickplayers method
* Enable EVENT_CAST_ON for clients
This will be required for a shared task objective (The Creator) in DoN
* Revert "Avoid reloading client state on shared task accept"
This reverts commit 3af14fee2de8b109ffb6c2b2fc67731e1531a665.
Without this clients added to a task after some objectives have been
completed don't get updated state. Will need to investigate this later
* Disallow looting inside a dz by non-members
Non-members of a dynamic zone should not be allowed to loot npcs inside
it. This should have been disabled for expeditions already but was still
allowed due to an oversight (or live behavior changed). This is less
critical for shared tasks since members can be added and removed at will
without leaving a dz but still an important feature.
* Change load where criteria
* Increase task completion emote column size
* Use eqstr for task item reward message
* Implement radiant and ebon crystal rewards
This adds reward columns for radiant and ebon crystals to the tasks
table and updates task description serialization
* Send task completion emote before rewards
This matches live and makes it a little easier to see item rewards when
tasks have a long completion emote. This also changes it to send via the
same normal message opcode that live uses.
* Do not send a shared task in completed task history
* Allow EVENT_TASK_STAGE_COMPLETE for quest goals
This invokes event_task_stage_complete for task elements flagged with a
quest controlled goal method. It should be expected behavior that a
completed task stage always fires this event even if a quest controls it
* Add SyncSharedTaskZoneClientDoneCountState
* Swap return for continue in this case
* Formatting
* Simplify
* Formatting
* Formatting
* Formatting
* Remove errant check
* Formatting, add setter for shared tasks
* Remove debugging
* Comments in PR
* More PR follow up
* Formatting
* Cleanup
* Update packet comments
* Comments
* More cleanup
* Send command error message if not in shared task
/taskadd is the only command with this feedback on live. Newer live
clients also generate this instead of the server sending the message
* Implement expire_time on SharedTask object and add a purge on world bootup
* Comment
* Add SyncClientSharedTaskStateToLocal where clients fall out of sync and no longer have a task locally
* Clamp shared task activity updates to max done count and discard updates out of bounds
* Fix packet send
* Revert packet send
* Adjust clamping OOO for completed time check. Add completed tables to purge truncation
* Refactor kill update logic so that shared task kill updates only update one client instead of all clients
* Cleanup how we're checking for active tasks
* Forward task sets that contain shared tasks
This forwards task sets that contain a shared task to shared task
selector validation like normal task selectors
* Change eqstr for empty solo task offers
This is the message live appears to use if all task offers are filtered
out by solo task validation
* Fix max active tasks client message
This message starts at the third argument. It was maybe intended to be
an npc say message but live just sends it as a normal eqstr with the
first two arguments nulled.
* Load client task state after zoning complete
This fixes a possible race where a character removed from a shared task
while zoning would be stuck with an incorrect character activities state
after zoning was completed.
This was caused by the character loading task state to early on zone
entry but never receiving the remove player message from world since
they are missing from the world cle until zoning is completed.
Loading client state after zone connection is completed makes sure the
client has the latest state and available to the world cle
* Send message to clients removed while zoning
This message should usually only be sent to characters that were
removed from a shared task while zoning but will occur for any sync
state removals where a message wouldn't have already occured.
* Post rebase fix
* HG comment for checking active task
* Addressing HG comments around zeroing out a shared task id
* Remove errant comment
* Post rebase database manifest updates
* Update eqemu_logsys_log_aliases.h
* More rebase catches
* Bump database version for last commit
Co-authored-by: hg <4683435+hgtw@users.noreply.github.com>
* Remove HP update throttling and increase HP update resolution and accuracy
* Make some log statements detail
* Add better logging messages
* Remove old self update throttle block check preventing updates to self
- Added quest::getitemstat(item_id, stat_identifier) to Perl.
- Added quest::getspellstat(spell_id, stat_identifier, slot) to Perl.
- Added eq.get_item_stat(item_id, stat_identifier) to Lua.
- Added eq.get_spell_stat(spell_id, stat_identifier, slot) to Lua.
Wasn't sure where to put the GetItemStatValue() method so I put it in inventory profile, I can move it wherever is preferred.
These additions will allow people to grab item and spell stat values in plugins without needing a mob object.
* [Cheat Detection] Anti-Cheat reimplementation
* minor patch fixes
* ceiling to server side runspeed
Warp(LT) was picking up a bunch of expected 6.2 but it was reported back as 6.5, this should help reduce the amount of false positives we get
* use ceil instead of std::ceilf for linux
* boat false positive fix
* stopping the double detection
* fixes and cleanup
* auto merge tricked me...
* dummy divide by 0 checks
this should prevent anyone from setting Zone:MQWarpDetectionDistanceFactor to 0 and causing a crash.
* Formatting
* encapsulation to its own class and clean up
* more detections
* typo
* OP_UnderWorld implmentation
* Update client_packet.h
* Syntax changes, formatting, cleanup
* preventing crashes due to invalid packet size
* typos and clearer logic
* seperated the catagory for cheats
* Updated MQGhost for more detail
Co-authored-by: Akkadius <akkadius1@gmail.com>
- Add $npc->HasItem(item_id) to Perl.
- Add $npc->CountItem(item_id) to Perl.
- Add $npc->GetItemIDBySlot(loot_slot) to Perl.
- Add $npc->GetFirstSlotByItemID(item_id) to Perl.
- Add $corpse->HasItem(item_id) to Perl.
- Add $corpse->CountItem(item_id) to Perl.
- Add $corpse->GetItemIDBySlot(loot_slot) to Perl.
- Add $corpse->GetFirstSlotByItemID(item_id) to Perl.
- Add npc:HasItem(item_id) to Lua.
- Add npc:CountItem(item_id) to Lua.
- Add npc:GetItemIDBySlot(loot_slot) to Lua.
- Add npc:GetFirstSlotByItemID(item_id) to Lua.
- Add corpse:HasItem(item_id) to Lua.
- Add corpse:CountItem(item_id) to Lua.
- Add corpse:GetItemIDBySlot(loot_slot) to Lua.
- Add corpse:GetFirstSlotByItemID(item_id) to Lua.
These methods will allow server operators to view the loot a current has in a slot, the first slot found by item ID, count the item by ID, and see if the NPC has the item.
With that functionality you could build a custom loot system and modify loot more dynamically.
- Shared bank charges were being set to int8 on select, meaning any item that stacks over 127 would break if put in shared bank, causing loss of items.
* Remove security from servertalk connections
* Remove the two hello steps before handshake that are now obsolete out
* Revert "Remove the two hello steps before handshake that are now obsolete out"
This reverts commit 32d61ea238.
* Keep old values for enums
* Use downgrade security handshake for backwards compat
* Send handshake instead of hello to fast connect
* Add connect callback so it will actually work
* Implemented SPA 390 SE_FcTimerLockout
Implemented
SPA 390 SE_FcTimerLockout
This focus limited effect sets any spell that meets the criteria of the of the focus limits to be a on recast timer.
Base value: recast duration in milliseconds.
Note: This focus can only be applied from spells (not item or AA)
Note: Although reinforced by the server, to appear visually correct both server side and client side spell values need to match (ie. need to matching spells_new values).
Example spell: Suppression of Fire ID 16973.
Sets any fire spell in the clients spell bar to a 2 second recast when the client is affect by the spell.
* Formatting
* Use range based for
Co-authored-by: Akkadius <akkadius1@gmail.com>
* shield ability initial work
* updates
* update
* updates
* Update client_process.cpp
* major updates
optimized
pet support
perl support
* updates
* minor update
* fix merge error
* requested changes
* variable fix
* optimization
* minor update
* Revert "optimization"
This reverts commit 27e11e758b.
* fix
reset variables on shield_target if shielder dies or zones during shielding.
* edge case fix
Catch and fix situations where shield target doesn't have shielder variable cleared. Can occur if shielder . uses ability when target is not in combat then zones.
* combined packet and mob function
Shield now uses a common pathway through ShieldAbility, added parameters to perl function
* Addressing formatting for Kayen
* Fix function typo
Co-authored-by: Akkadius <akkadius1@gmail.com>
Implemented
SE_Worn_Endurance_Regen_Cap 489
modify worn item regen cap
base: amt, limit: none, max: none
Also added support to allow item mana regen cap to check item and spell bonuses.
* Implemented SPA 504 and 506
SE_Damage_Taken_Position_Amt 506 // implemented - modify melee damage by amt if dmg taken from Front or Behind
SE_Melee_Damage_Position_Amt 504 // implemented - modify melee damage by amt if done from Front or Behind
* fix, description updates
* Update spdat.h
* Work started on SPA 476
defines
* bonus structure add
bonus structure set up
* updates spa476
updates spa476
* spell bonus now functional
spell bonus working well.
* major update with debug messages
aa, item and spell now working
* Pre clean up, effect implemented
working for AA, spells, items, all checked for stacking issues.
* removed debug messages
removed debug messages
* spdat description added
spdat description added
* minor fix
removed debug shout
removed unneeded code check.
* syntax updates, minor fixes
syntax updates, minor fixes
* syntax fixes
syntax fixes
* improvements to code
moved function to check at swap item. Easier to manage and more live like behavior. Required minor adjustment
Still working on AA toggle.
* updates to aa buy, functionalish
* Syntax / Formatting
* Add break / default to switch
* updates
* completed v2
* Major revisions
Main function check moved to when items are swapped and out of when ever bonus are recalculated.
AA Toggle and data structure now more accurate to live.
* Update aa.cpp
* debug removed
* implemented SE_Buy_AA_Rank
Closer to live.
* Update aa.cpp
broadening AA toggle to be more general use.
* improved various checks
aa toggle is now broadly implemented to be usable with any passive effect.
Co-authored-by: Akkadius <akkadius1@gmail.com>
* SPIndex fix for mislabeled spell
SPIndex fix for mislabeled spell
All other SPIndex variables were checked again without any additional errors found.
* spdat h merge fix
* Implemented SPA Duration Pct
Implemented new spell effects
SE_Duration_HP_Pct 524
SE_Duration_Mana_Pct 525
SE_Duration_Endurance_Pct 526
Consumes 'base1' % of your maximum health/mana/endurance every 6 seconds. 'max' is maximum amount that can be consumed per tic.
Additional Functionality
Can be used as a heal/gain % by setting the base1 value to a positive.
* Implemented SPA Instant Mana/End pct
Fixes for SPA 524-526
Implemented
SE_Instant_Mana_Pct 522
SE_Instant_Endurance_Pct 523
Extracts 'base1' percent of your maximum mana/endurance, or 'max', whichever is lower.
* Implemented: SPA 521 EndAbsorbPctDmg
Implemented
SE_Endurance_Absorb_Pct_Damage 521
Absorb Damage using Endurance: base1 % (base2 End per 1 HP)
Note: Both base1 and base2 need to be divided by 100 for actually value
* Implemented SE_HealthTransfer 509
Implemented
SE_Health_Transfer 509
'life burn'
Consume base2 % of Hit Points to Damage for base % of Hit Points
Can be used for heal
Act of Valor
* Implemented SPA 515,516,518,496
Implemented
SE_AC_Avoidance_Max_Percent 515
SE_AC_Mitigation_Max_Percent 516
SE_Attack_Accuracy_Max_Percent 518
Above are stackable defense and offensive mods
SE_Critical_Melee_Damage_Mod_Max 496 - This is a non stackable melee critical modifier
* Implemented SPA 503 , 505
SE_Melee_Damage_Position_Mod 503
define SE_Damage_Taken_Position_Mod 505
SPA 503 increase/decreases melee damage by percent base1 based on your position base2 0=back 1=front
SPA 504 increase/decreases melee damage taken by percent base1 based on your position base2 0=back 1=front
* Implemented 467,468
Implemented
SE_DS_Mitigation_Amount 467
SE_DS_Mitigation_Percentage 468
Reduce incoming DS by amt or percentage. base1 is value, if a reduction is desired it should be set to negative for both.
* Fixes
Formula fixes
* Update spdat.h
Added spa descriptions.
* Implemented SPA 469, 470
Implemented
SE_Chance_Best_in_Spell_Grp 469 Chance to cast highest scribed spell within a spell group. All base2 spells share roll chance, only 1 cast.
SE_Trigger_Best_in_Spell_Grp 470
Chance to cast highest scribed spell within a spell group. Each spell has own chance.
Additional Changes:
Rewrote TrySpellTrigger function used for SPA 340 since it incorporates SPA 469. Improved code so that chance of spell being triggered should be more accurate statistically.
* Implemented SPA 474, 494
Implemented
SE_Pet_Crit_Melee_Damage_Pct_Owner 474 - Gives pets a critical melee damage modifier from the owner
SE_Pet_Add_Atk 494 - Gives pet a ATK bonus from the owner
Fixed SE_PetMeleeMitigation 397 - The bonus was not being calculated
* Implemented SPA 465,477,478
Implemented
SE_PC_Pet_AE_Rampage 465
Chance for pet to AE rampage with a damage modifier
SE_Hatelist_To_Top_Index 477
Chance to be put on top of RAMPAGE list
SE_Hatelist_To_Tail_Index 478
Chance to be put on bottom of RAMPAGE list
* Implemented
Implemented
SE_Fearstun 502
Stun with a max level limit. Normal stun restrictions don't apply. Base1 duration, base2 PC duration, max is level limit
SE_TwinCastBlocker 39
Previously unused spell effect that is now used on live. Simply, if this effect is present in a spell then the spell can not be twin cast.
* Implemented SPA 483
Implemented
Fc_Spell_Damage_Pct_IncomingPC 483
- Focus effect that modifies iby percent incoming spell damage on the target.
Base1= min Base2= max. Final percent is random between max and min each time focus is applied from a spell cast.
Note: Written to stack with similar functioning focus SPA 269 SE_FcSpellVulnerability.
* Implemented SPA 484
Implemented
SE_Fc_Spell_Damage_Amt_IncomingPC 484 // focus effect that modifies incoming spell damage by flat amount. Consider it a debuff that adds damage to incoming spells. Positive value to add additional damage.
* Implemented SPA 481, 485,486,512
Implemented
SE_Fc_Cast_Spell_On_Land 481
Focus effect that is checked when a spell is cast on a target, if target has this focus effect and all limiting criteria are met, then the target will cast a spell as specified by the focus. Can be given a roll chance for success. Base1=Chance, Base2=Spellid
Note: This spell has a huge amount of potential applications. See 'Alliance' type spells on live. (ie live spell 50247)
Implemented associated focus limits seen in live spells.
SE_Ff_CasterClass 485
- Caster of spell on target with a focus effect that is checked by incoming spells must be specified class or classes.
SE_Ff_Same_Caster 486 -Caster of spell on target with a focus effect that is checked by incoming spells 0=Must be different caster 1=Must be same caster
The following is an associated effect seen with SPA 481
SE_Proc_Timer_Modifier 512
This provides a way to rate limit the amount of spell triggers generated by SPA 481. For example after 1 successful spell trigger no additional spells can be triggered for 1.5 seconds. Ie. Base=1 and Base2 1500.
Written in a flexible format to allow scaling of multiple different buffs with this effect at same time.
* Stacking fixes for new effects
Stacking fixes for new effects.
* merge with upstream master
merge and update up spdat.h
* Update spdat.h
* Fix for bolt spell targeting self if target zone/died while casting.
Fix for bolt spell targeting self if target zone/died while casting. Despite the name being "ST_TargetOptional", this target type is reserved for projectile spells which all require a target, thus should be treated like any other targeted spell.
* Implemented new focus and limits
SE_Fc_Amplify_Mod 507 @Fc, On Caster, damage-heal-dot mod pct, base: pct
SE_Fc_Amplify_Amt 508
@Fc, On Caster, damage-heal-dot mod flat amt, base: amt
SE_Fc_ResistIncoming 510 implemented, @Fc, On Target, resist modifier, base: amt
SE_Fc_CastTimeMod2 500
@Fc, On Caster, cast time mod pct, base: pct
SE_Fc_CastTimeAmt 501
@Fc, On Caster, cast time mod flat amt, base: milliseconds
SE_Ff_DurationMax 495
@Ff, Max duration of spell that can be focused, base: tics
SE_Ff_ReuseTimeMin 490
@Ff, Minimum recast time of a spell that can be focused, base: recast time
SE_Ff_ReuseTimeMax 491
@Ff, Max recast time of a spell that can be focused, base: recast time
SE_Ff_Endurance_Min 492
@Ff, Minimum endurance cost of a spell that can be focused, base: endurance cost
SE_Ff_Endurance_Max 493
@Ff, Max endurance cost of a spell that can be focused, base: endurance cost
SE_Ff_Value_Min 479
@Ff, Minimum base value of a spell that can be focused, base: spells to be focused base1 value
SE_Ff_Value_Max 480
@Ff, Max base value of a spell that can be focused, base: spells to be focused base1 value
SE_Ff_Override_NotFocusable 460 @Fc, Allow spell to be focused event if flagged with 'not_focusable' in spell table, base: 1
Added basic focus and limit descriptions to source.
* Update spell_effects.cpp
hotfix
* fix for SE_Ff_Override_Notfocusable
Fix for SE_Ff_Override_Notfocusable
Logic was not correct. Changed where spell field 'not_focusable' makes check to properly account for this effect.
* Update to SE_Fc_CastTimeMod2
Update to SE_Fc_CastTimeMod2
Found sources that show it can reduce cast time to instant. Rewrote formulas to account for such.
* fix
unintentional change, reverted back.
* fixed missing break statements
fixed missing break statements
* update to IsFocusLimit
missing limit cases added to IsFocusLimit
* Format CalcFocusEffect
* Revert "Format CalcFocusEffect"
This reverts commit e5b81791ee.
* Revert "Revert "Format CalcFocusEffect""
This reverts commit a1ce29a875.
* Post merge fixes
* More post merge adjustments
* Another post merge change
* Add LimitResist constants back
* Swap int16's for 32's
* int32 fix
Co-authored-by: Akkadius <akkadius1@gmail.com>
* Update for SPA403 and 404
Update
SPA SE_LimitSpellClass: 403
SPA SE_LimitSpellSubclass: 404
Now use spell table values from column 221 and 222 respectively.
Unknown what the values mean in these fields, but at least live spells work properly.
Added FocusLImitInclude Enum to improved focus effect function readability.
* Formatting
Co-authored-by: Akkadius <akkadius1@gmail.com>
* Recoded SE_TriggerOnCast Focus effect
Recoded SE_TriggerOnCast focus effect to be consistent with how all other focuses are checked. No longer an arbitrary limit as to number of a focus effects of this type you can have.
* new command: resetdisc_timer
usage: #resetdisc_timer [all | timer_id]
* syntax fixes
syntax improvements
* minor fix
changed numhits check
* Update spell_effects.cpp
* added better support for spell procs that don't require target.
* syntax
* Formatting and syntax tweaks
Co-authored-by: Akkadius <akkadius1@gmail.com>
Need to increase from int16 to int32 when calculating focus due it causing issues with returning spell ids for some effects which can easily be over the int16 limit. CalcAAFocus and CalcFocusEffect were doing all math in int16 also, no reason not to increase to int32.
* Bug fix for AOE Harmony/Lull type spells.
Fixed bug with SPA 30 SE_SE_ChangeFrenzyRad and SPA 86 SE_Harmony allowing those spells to affect NPC's above their level restrictions when cast as a 'Targeted AE' spell (ie. Harmony, Wake of Tranquility) when the targeted NPC was bellow level restricted range, but the NPC's next to them were above it.
As coded now, the adjacent NPC's if over level limit will still get the buff applied to them BUT will not get any benefits from the buff.
This bug was originally reported by: Isaaru
* Live like behavior
Implemented the live like behavior, if this case occurs on live, the buff is not applied to the targets over the level limit and "Your target looks unaffected" message is given.
* code optimization
code optimization
* Implemented SPA 498 and 499
Implemented
SE_AddExtraAttackPct_1h_Primary 498 , gives your double attacks a percent chance to perform an extra attack with 1-handed primary weapon, base: chance, limit: amt attacks max: none
SE_AddExtraAttackPct_1h_Secondary 499 gives your double attacks a percent chance to perform an extra attack with 1-handed secondary weapon, base: chance, limit: amt attacks max: none
Added limit functionality to similar effect SPA 266
SPA 266 will now be calculated to take highest percent value when applying bonus. (was additive, which does not seem correct based on AA data)
* Update attack.cpp
code update
* Update bonuses.cpp
code update
* Update spdat.h
added commas
* Update spell_effects.cpp
fix to remove unknown spa message
Co-authored-by: Michael Cook (mackal) <mcook@mackal.net>
Fixed spell projectiles whose angle was not being calculated correctly.
Significantly improved all projectile timings. At least up to range of 300 should see more accurate timings for damage/effects occurring upon projectile impact. Will be noticed most significantly for all spell projectiles and for longer range archery.
* Fix issue #1469 - remove unused variable in perl_client
* Add SetGMStatus to LUA, clean up naming in client.cpp to be consistent with the perl/lua naming, remove unneeded return in void function
* Delete PERL_CLIENT.ipch
* Implemented SPA Duration Pct
Implemented new spell effects
SE_Duration_HP_Pct 524
SE_Duration_Mana_Pct 525
SE_Duration_Endurance_Pct 526
Consumes 'base1' % of your maximum health/mana/endurance every 6 seconds. 'max' is maximum amount that can be consumed per tic.
Additional Functionality
Can be used as a heal/gain % by setting the base1 value to a positive.
* Implemented SPA Instant Mana/End pct
Fixes for SPA 524-526
Implemented
SE_Instant_Mana_Pct 522
SE_Instant_Endurance_Pct 523
Extracts 'base1' percent of your maximum mana/endurance, or 'max', whichever is lower.
* Implemented: SPA 521 EndAbsorbPctDmg
Implemented
SE_Endurance_Absorb_Pct_Damage 521
Absorb Damage using Endurance: base1 % (base2 End per 1 HP)
Note: Both base1 and base2 need to be divided by 100 for actually value
* Implemented SE_HealthTransfer 509
Implemented
SE_Health_Transfer 509
'life burn'
Consume base2 % of Hit Points to Damage for base % of Hit Points
Can be used for heal
Act of Valor
* Implemented SPA 515,516,518,496
Implemented
SE_AC_Avoidance_Max_Percent 515
SE_AC_Mitigation_Max_Percent 516
SE_Attack_Accuracy_Max_Percent 518
Above are stackable defense and offensive mods
SE_Critical_Melee_Damage_Mod_Max 496 - This is a non stackable melee critical modifier
* Implemented SPA 503 , 505
SE_Melee_Damage_Position_Mod 503
define SE_Damage_Taken_Position_Mod 505
SPA 503 increase/decreases melee damage by percent base1 based on your position base2 0=back 1=front
SPA 504 increase/decreases melee damage taken by percent base1 based on your position base2 0=back 1=front
* Implemented 467,468
Implemented
SE_DS_Mitigation_Amount 467
SE_DS_Mitigation_Percentage 468
Reduce incoming DS by amt or percentage. base1 is value, if a reduction is desired it should be set to negative for both.
* Fixes
Formula fixes
* Update spdat.h
Added spa descriptions.
* Implemented SPA 469, 470
Implemented
SE_Chance_Best_in_Spell_Grp 469 Chance to cast highest scribed spell within a spell group. All base2 spells share roll chance, only 1 cast.
SE_Trigger_Best_in_Spell_Grp 470
Chance to cast highest scribed spell within a spell group. Each spell has own chance.
Additional Changes:
Rewrote TrySpellTrigger function used for SPA 340 since it incorporates SPA 469. Improved code so that chance of spell being triggered should be more accurate statistically.
* Implemented SPA 474, 494
Implemented
SE_Pet_Crit_Melee_Damage_Pct_Owner 474 - Gives pets a critical melee damage modifier from the owner
SE_Pet_Add_Atk 494 - Gives pet a ATK bonus from the owner
Fixed SE_PetMeleeMitigation 397 - The bonus was not being calculated
* Implemented SPA 465,477,478
Implemented
SE_PC_Pet_AE_Rampage 465
Chance for pet to AE rampage with a damage modifier
SE_Hatelist_To_Top_Index 477
Chance to be put on top of RAMPAGE list
SE_Hatelist_To_Tail_Index 478
Chance to be put on bottom of RAMPAGE list
* Implemented
Implemented
SE_Fearstun 502
Stun with a max level limit. Normal stun restrictions don't apply. Base1 duration, base2 PC duration, max is level limit
SE_TwinCastBlocker 39
Previously unused spell effect that is now used on live. Simply, if this effect is present in a spell then the spell can not be twin cast.
* Implemented SPA 483
Implemented
Fc_Spell_Damage_Pct_IncomingPC 483
- Focus effect that modifies iby percent incoming spell damage on the target.
Base1= min Base2= max. Final percent is random between max and min each time focus is applied from a spell cast.
Note: Written to stack with similar functioning focus SPA 269 SE_FcSpellVulnerability.
* Implemented SPA 484
Implemented
SE_Fc_Spell_Damage_Amt_IncomingPC 484 // focus effect that modifies incoming spell damage by flat amount. Consider it a debuff that adds damage to incoming spells. Positive value to add additional damage.
* Implemented SPA 481, 485,486,512
Implemented
SE_Fc_Cast_Spell_On_Land 481
Focus effect that is checked when a spell is cast on a target, if target has this focus effect and all limiting criteria are met, then the target will cast a spell as specified by the focus. Can be given a roll chance for success. Base1=Chance, Base2=Spellid
Note: This spell has a huge amount of potential applications. See 'Alliance' type spells on live. (ie live spell 50247)
Implemented associated focus limits seen in live spells.
SE_Ff_CasterClass 485
- Caster of spell on target with a focus effect that is checked by incoming spells must be specified class or classes.
SE_Ff_Same_Caster 486 -Caster of spell on target with a focus effect that is checked by incoming spells 0=Must be different caster 1=Must be same caster
The following is an associated effect seen with SPA 481
SE_Proc_Timer_Modifier 512
This provides a way to rate limit the amount of spell triggers generated by SPA 481. For example after 1 successful spell trigger no additional spells can be triggered for 1.5 seconds. Ie. Base=1 and Base2 1500.
Written in a flexible format to allow scaling of multiple different buffs with this effect at same time.
* Stacking fixes for new effects
Stacking fixes for new effects.
* merge with upstream master
merge and update up spdat.h
* Update spdat.h
* Fix for bolt spell targeting self if target zone/died while casting.
Fix for bolt spell targeting self if target zone/died while casting. Despite the name being "ST_TargetOptional", this target type is reserved for projectile spells which all require a target, thus should be treated like any other targeted spell.
Also included is an additive lagged fibonacci generator that should is
very similar to EQ's. Also added BIASED_INT_DIST in case someone wants
to use "bad" int distribution to more closely match EQ as well.
An option to set a custom engine (just in case people would like to play
with other std engines) is available.
There is also support for GCC's SIMD accelerated extension to std random
engines.
All these options are hidden behind advanced options in CMake since
they're rather advanced knobs.
* Implemented SPA Duration Pct
Implemented new spell effects
SE_Duration_HP_Pct 524
SE_Duration_Mana_Pct 525
SE_Duration_Endurance_Pct 526
Consumes 'base1' % of your maximum health/mana/endurance every 6 seconds. 'max' is maximum amount that can be consumed per tic.
Additional Functionality
Can be used as a heal/gain % by setting the base1 value to a positive.
* Implemented SPA Instant Mana/End pct
Fixes for SPA 524-526
Implemented
SE_Instant_Mana_Pct 522
SE_Instant_Endurance_Pct 523
Extracts 'base1' percent of your maximum mana/endurance, or 'max', whichever is lower.
* Implemented: SPA 521 EndAbsorbPctDmg
Implemented
SE_Endurance_Absorb_Pct_Damage 521
Absorb Damage using Endurance: base1 % (base2 End per 1 HP)
Note: Both base1 and base2 need to be divided by 100 for actually value
* Implemented SE_HealthTransfer 509
Implemented
SE_Health_Transfer 509
'life burn'
Consume base2 % of Hit Points to Damage for base % of Hit Points
Can be used for heal
Act of Valor
* Implemented SPA 515,516,518,496
Implemented
SE_AC_Avoidance_Max_Percent 515
SE_AC_Mitigation_Max_Percent 516
SE_Attack_Accuracy_Max_Percent 518
Above are stackable defense and offensive mods
SE_Critical_Melee_Damage_Mod_Max 496 - This is a non stackable melee critical modifier
* Implemented SPA 503 , 505
SE_Melee_Damage_Position_Mod 503
define SE_Damage_Taken_Position_Mod 505
SPA 503 increase/decreases melee damage by percent base1 based on your position base2 0=back 1=front
SPA 504 increase/decreases melee damage taken by percent base1 based on your position base2 0=back 1=front
* Implemented 467,468
Implemented
SE_DS_Mitigation_Amount 467
SE_DS_Mitigation_Percentage 468
Reduce incoming DS by amt or percentage. base1 is value, if a reduction is desired it should be set to negative for both.
* Fixes
Formula fixes
* Update spdat.h
Added spa descriptions.
* Fixes for PR
removed debug shouts
fixed description issue
* [Commands] Make #maxskills work on target.
* Update command.cpp
* don't code when you first wake up... doesn't end well...
* another typo brought to you by lack of coffee
* Add defines (commented) for further known SPAs
Added as comments since that appears what we were doing. This just gets
us caught up to dev post.
* More SPAs
Move the newer stuff added that was recently to the same place all of
our previous spell IDs were defined.
Either of these solutions were good, but I went with defines since it
was less changes
I also added a bunch of stuff the client has hardcoded behavior for, but
not currently implemented by us.
The removed stuff from the command_castspell were reused on live, so I
figured it was best to remove them from the restrictions since they are
no longer test spells
* [Quest API] Add CanRaceEquipItem(item_id) to Perl/Lua.
- Add $mob->CanRaceEquipItem(item_id) to Perl.
- Add mob:CanClassEquipItem(item_id) to Lua.
- Add mob:CanRaceEquipItem(item_id) to Lua.
* Use constants.
Co-authored-by: Chris Miles <akkadius1@gmail.com>
- Add quest::getinventoryslotname(slot_id) to Perl.
- Add eq.get_inventory_slot_name(slot_id) to Lua.
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* Update syntax for new httplib and run on own thread
* Only log if path is set in request
* Auto install tool table if does not exist locally
* Add lore and has item checks to reduce verbosity and errors
* Formatting
* Remove test code from test command
- #summonitem will now properly take item augments from an item link when used as a link for summoning.
- #summonitem help message and command message will now list proper argument list.
- #giveitem will now allow item links like #summonitem with the same functionality level.
- #giveitem help message and command message will now list proper argument list.
- #giveitem small fix where there were 2 checks for argument count at 7, meaning final argument count (8) did not work.
- #grid add will no longer let you put in a duplicate grid.
- Grid nodes now spawn with invul/immune to damage.
- Grid nodes now set an entity variable "grid_id" on spawn.
- This allows grid nodes to be specifically despawned by "grid_id" entity variable, meaning you can view multiple grids at once and not despawn them all accidentally.
- #grid hide will despawn your targeted NPC's Grid nodes.
- #grid add, #grid show, #grid delete, and #grid hide send messages to let GM know what's going on.
- #wp add and #wp delete now send messages to let the GM know what's going on.
- #wpadd now send messages to let the GM know what's going on.
- Add client:Popup(title, text, popup_id, negative_id, button_type, duration, button_name_one, button_name_two, sound_controls) to Lua.
- There is no overload for only using button_name_one, as the SendFullPopup requires both button names to be set.
* Allow any bag type 51 to be used for Trader
Most commonly this would allow the different color satchels to be used in Trader mode.
PEQ database has 1 item (Yellow Trader's Satchel Token - 35037) marked as type 51, but otherwise only the proper bags are already set.
Bonus of removing the hard-coded ID from source.
* Updated
Fixed where I missed it in a couple more spots too.
* Update bonuses.cpp
* Revert some "fixes", clean some code up
* Use RaceGender default height data for when calculating size during SendIllusionPacket which should alleviate some inconsistencies for new clients zoning in and seeing the entity
* Some code cleanup
* [Commands] Add #findclass [search criteria] command.
- Allows GMs to find a class by name or ID.
- Modify some verbiage in command messages that were improper.
* Update find functions to use strings instead of chars.
* [Commands] Add #viewzoneloot [item id] command.
- Allows GMs to search for a specific item across all the loot currently available on the spawned NPCs in the zone.
- Specifying item ID 0 will allow GMs to see all the droppable items, I tested in Sanctus Seru (a huge zone) and it sent approximately 1,200 messages, which didn't lag or desync my client.
* Adjustments.
* Adjustments.
* [Quest API] Add optional clean name parameter to getnpcnamebyid in Perl/Lua.
- Allows Server Operators to grab the clean name without having to clean it up in their Perl/Lua.
* Convert from a parameter to a method.
* Add safer method.
* Convert to proper type.
* [Pets] Unhardcode Beastlord pet values.
- Create a Beastlord pets table to allow server operators to easily customize Beastlord pets without a source modification.
* Add table to schema.
* [Bug Fix] NPC not breaking charm correctly
#947 and #905
fixes the issue with charm breaking and spells being cast after to cause a faction war. this removes dots to stop faction wars also.
dot removal part needs better testing to ensure it works as intended
* Remove this-> since it is implied
* Update spell_effects.cpp
* clear all this->
* pMob to mob
* Added rule Spells:PreventFactionWarOnCharmBreak
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* strict spawn_events now take into account EQ minute.
This should fixed the eqtime spawn condition from falling behind.
* change a log to logspawns and add a comment in ExecEvent function.
* moved the comment to the note paramenter in the rule for last commit.
This fixes an edge case where a player could be made leader when added
to an expedition that only had a single member previously.
If a leader in a two-member expedition quit (forcing a leader change)
and the new leader went offline while throttled, a leader change flag
would be set until a non-leader was available. The first added member
would then be made the new leader.
This could also potentially occur on world startup due to the initial
throttle timer state but member statuses aren't processed there yet
* [Bots] Remove hardcoded race-class combinations from bots.
- Allows server operators to directly influence via a database table the classes a specific bot race can be.
- Previously this was hardcoded and required a source modification to do.
- Allowed races, classes, and genders have been removed due to redundancy at this point.
* Remove const cast and modify saylink definition.
* fix for charges not being sold correctly
https://github.com/EQEmu/Server/issues/1350 this fixes this issue
* Update client_packet.cpp
* Update zone.cpp
this completes the fix for all charge items being sold to merchants
* code opmizations
could probably be fixed up better but this is a little cleaner
* Update snake_casing
Co-authored-by: Chris Miles <akkadius1@gmail.com>
This moves members from expeditions so other systems can use them
Replace expedition_members table with dynamic_zone_members
Move 'EnableInDynamicZoneStatus' rule to DynamicZone namespace
Modify #dz list to show dz members (not instance players) and type name
Move various queries to repository methods
Remove the overloads that don't make sense (bots probably doesn't make
sense either, but too lazy)
Fix the formulas
Removed the Spells:MaxCastTimeReduction rule since this is HARDCODED in
the client so it doesn't really make sense to have it as a customization
point. If you want to hack the client, change the hardcode as well I
guess.
* [Bug Fix] EntityList::AESpell fix for Pacify / Mez
this fixes AE pacify / Mez spells only landing on 4 when it shouldn't have a cap
* Update effects.cpp
added constants
* Update effects.cpp
opmization thanks to @mackal
* Update effects.cpp
this fixes the unlimited issue
* added Spells:AOEMaxTargets to rules
incase a server doesn't want there to be a absolute unlimited AOE targeting for spells
* Update ruletypes.h
This starts some changes that move storage of things from expeditions to
dynamic zone class so other systems can possibly use them. This will also
make it easier to move window packet creation methods to DynamicZone.
For now these will remain on the expeditions table in the database. This
can be re-evaluated once other components are moved and seeing how other
systems may want to handle their player requirements.
* #list npcs Goto option now goes to higher Z if npc selected is a boat.
Makes using #list npcs and using the goto button more useful when NPC is a boat, as normal Z will put you in the water.
* Use ?: instead of bool multiply
* Update command.cpp
* [Installer] $ENV support
Add support for passing in installation variables instead of install_variables.txt.
In particular:
- EQEMU_SERVER_SKIP_UPDATE
- EQEMU_SERVER_SKIP_MAPS_UPDATE
Both work the same as files with the same name.
- MYSQL_DATABASE
- MYSQL_USER
- MYSQL_PASSWORD
All get read into the same $installation_variables collection, and are still overridden by any values found in installation_variables.txt
- MYSQL_HOST
Added to the list of $installation_variables, supported in installation_variables.txt, and overrides the default host for where the database lives (allowing it to be a separate container)
- MYSQL_ROOT_PASSWORD
If set, will use "root" as the user for DROP/CREATE DATABASE calls, to prevent requiring the "eq" user requiring more permission than is given by default with the MySql/MariaDB containers.
* [Installer] new_server_with_bots
Enabling bots requires both updated binaries and some database scripts. Fetching source and compiling the code is the longest part of setting up a new server. If you know you want bots, rather than having to do it twice, we can just accept an option to do it all at the same time.
* [Installer] Git/Source/Build optimizations
Source code is the same for bot/non-bot, so switch to a common directory for source and separate directories for build.
If the source directory already exists with a .git subfolder, rather than attempt to re-clone, instead do a git pull to still get the latest code. Helps when using a shared volume but rebuilding containers.
* [Installer] Formatting / Cleanup
Fixed some indentation, added an existing option to the utility script output, removed some excess newlines, and moved a debug output to help identifying errors.
World now caches and tracks member statuses so it can send them to zones
that request them on startup. Prior to this the cle would be searched in
world for every zone startup caching request, now it's only searched once
when a new expedition is created.
Bulk loading statuses removed since it would only be needed on world
startup now and likely have no clients in the client list anyway.
This also lets world choose non-linkdead members on expedition leader
changes and better detect when a leader change needs to occur
* Rename dz member id field
The name of the struct is enough to make this implicit
* Rename dz member enum and struct
Rename ExpeditionMember to DynamicZoneMember
Rename ExpeditionMemberStatus to DynamicZoneMemberStatus
* Rename dz window packet structs
This makes it more clear the window may be used by any dynamic zone
system not just expeditions (live missions fill the window when
player doesn't have an active expedition).
* Rename dz window packet fields
* Fix calls to GetSafePoints to not pass null_ptr as zonename
* Fix GetSafePoints to check and deal will nullptr being sent as short_zone_name
* Remove unintentinal formatting change
* Fix some typos/cut-n-paste errors I assume
Co-authored-by: Noudess <noudess@gmail.com>
* Add character-specific zone-based experience modifiers.
This will allow server operators to give players individual experience modifiers (regular and AA).
Zone ID 0 will server as a global modifier for players, if no rows are found the modifier defaults to 1.0 so experience is neither increased nor decreased.
Setting a zone-specific modifier will override the zone ID 0 global modifier.
Requires a SQL update: sql/git/required/2021_04_11_character_exp_modifiers.sql
- Add quest::getaaexpmodifierbycharid(character_id, zone_id) to Perl.
- Add eq.get_aa_exp_modifier_by_char_id(character_id, zone_id) to Lua.
- Add quest::getexpmodifierbycharid(character_id, zone_id) to Perl.
- Add eq.get_exp_modifier_by_char_id(character_id, zone_id) to Lua.
- Add quest::setaaexpmodifierbycharid(character_id, zone_id, aa_modifier) to Perl.
- Add eq.set_aa_exp_modifier_by_char_id(character_id, zone_id, aa_modifier) to Lua.
- Add quest::setexpmodifierbycharid(character_id, zone_id, exp_modifier) to Perl.
- Add eq.set_exp_modifier_by_char_id(character_id, zone_id, exp_modifier) to Lua.
- Add $client->GetAAEXPModifier(character_id, zone_id) to Perl.
- Add client:GetAAEXPModifier(character_id, zone_id) to Lua.
- Add $client->GetEXPModifier(character_id, zone_id) to Perl.
- Add client:GetEXPModifier(character_id, zone_id) to Lua.
- Add $client->SetAAEXPModifier(zone_id, aa_modifier) to Perl.
- Add client:SetAAEXPModifier(zone_id, aa_modifier) to Lua.
- Add $client->SetEXPModifier(zone_id, exp_modifier) to Perl.
- Add client:SetEXPModifier(zone_id, exp_modifier) to Lua.
* Removed unneeded [].
* Fix variable name,
* Fix variable name.
* Fix version.h.
* Rename 2021_04_11_character_exp_modifiers.sql to 2021_04_23_character_exp_modifiers.sql
* Update db_update_manifest.txt
* Add HTML color tag method to Perl and Lua.
- Add quest::gethexcolorcode(color_name) to Perl.
- Add eq.get_hex_color_code(color_name) to Lua.
Full color list here: https://pastebin.com/rUYKr1ye
* Convert to static and use strcasecmp over strcmp.
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* Switch the 2 split calls to SplitString
* Nuke duplicate split in favor of SplitString #1263
* Add a test for SplitString
* Optimize SplitString
Benchmarking:
--------------------------------------------------------------
Benchmark Time CPU Iterations
--------------------------------------------------------------
bench_oldsplit 5201 ns 5201 ns 129500
bench_split 1269 ns 1269 ns 548906
This is splitting a VERY long SpecialAbilities string. This is ~75%
speed up.
* For as long as I can remember people have had issues with zoning in, facing the wrong way, and walking through a zone line.
With this we will be able to set zone's safe heading as well as preserve heading on summon (NPC or GM) and teleports between zones.
This affects several pre-existing quest methods and extends their parameters to allow for the addition of heading.
The following functions have had heading added.
Lua
- client:SetBindPoint()
- client:SetStartZone()
Perl
- $client->SetBindPoint()
- $client->SetStartZone()
- quest::rebind()
SetStartZone parameter list was fixed also.
This converts some pre-existing methods from glm::vec3() to glm::vec4() and has an overload where necessary to use a glm::vec3() method versus glm::vec4() method.
This shouldn't affect any pre-existing servers and will allow PEQ and others to document safe headings for zones properly.
* Removed possible memory leaks.
* Fix SQL.
* Fix client message.
* Fix debug log.
* Fix log message.
* Fix call in rebind overload.
* Fix floats.
* Add default to column.
* Add rule 'GM:MinStatusToBypassLockedServer'
Default Status: 100
Description: Players >= this status can log in to the server even when it is locked
* Add rule 'GM:MinStatusToBypassLockedServer'
Default Status: 100
Description: Players >= this status can log in to the server even when it is locked
Add common expedition base class
Use repository for zone and world expedition caching
World now stores members and leader as Member objects instead of ids
This improves readability of the caching methods and lets world cache
expedition dzs and members like zone. World also now caches expeditions
as unique_ptr which will be necessary for future dz callback lambdas
that capture 'this' so addresses don't change on cache vector resizes.
Using search_deliminated_string here is significantly faster than
splitting, most likely because of dynamic memory management
Some tests on my system:
----------------------------------------------------
Benchmark Time CPU Iterations
----------------------------------------------------
bench_split 864 ns 864 ns 807922
bench_search 35 ns 35 ns 20265205
This test was a case where the string was present somewhere in the
middle which gave a ~96% speed up
----------------------------------------------------
Benchmark Time CPU Iterations
----------------------------------------------------
bench_split 936 ns 936 ns 725518
bench_search 61 ns 61 ns 11156359
This test was when the string was not present, which will be the vast
majority of times this is actually checked, was ~93% speed up
* Added a check to stop Bard song for Mezz/Stun
* Cleaned Song stun / mezz stop
* Update client_process.cpp
* removed bard check & added else where
* code clean up
Co-authored-by: ProducerZekServer <go@away.com>
This isn't the exactly the right way, but it's behavior is much closer
to live than current for Solon's Song of the Sirens (725), the other
bard charms don't repulse due to mana cost
* Bards song with a mana cost shouldn't repulse
* Bard songs with SE_TemporaryPets shouldn't repulse
This is mostly just an issue with Vet AAs, the actually songs have a
recast, so are already handled
* SE_Familiar should be prevented as well
This creates an abstract class in common so zone and world can share
most of the implementation. World now has access to the same dz data and
api as zone.
Rename CharacterChange to AddRemoveCharacter for clarity
Rename GetRemainingDuration to GetDurationRemaining for consistency
Move dynamic zone queries to custom repository methods
Move early empty shutdown and process rate rules to DynamicZone scope
This decouples the expired status check from expeditions into an
internal dz method that can be called by its owning system
- Add quest::GetZoneShortName(zone_id) to Perl.
- Add quest::GetZoneLongNameByID(zone_id) to Perl.
- Add eq.get_zone_id_by_name(zone_name) to Lua.
- Add eq.get_zone_short_name_by_id(zone_id) to Lua.
- Add eq.get_zone_long_name_by_id(zone_id) to Lua.
- Add eq.get_zone_long_name_by_name(zone_name) to Lua.
* Fix x/y offsets from client to reflect EQ x/y instead of boat heading x/y
* Use std version of math calls and reduce the # of calls
* Remove errant instrumentation
Co-authored-by: Noudess <noudess@gmail.com>
Use internal dz messages to process duration and location changes
Add world DynamicZone class (later this will inherit from a base)
Add FindDynamicZoneByID to get dz from zone and world system caches
Only zone requires to be linked to lua, so let's not link EVERYTHING.
There is probably more clean up we could do, but I know for a fact Lua
is only used by zone.
This probably has some measurable benefits that probably don't really
matter that much :)
Move ExpeditionLockoutTimer to common
This simplifies expedition request conflict checks and uses repository
for the queries instead of processing the query result directly.
* Update command.cpp
Fixed typo in the command description.
* Bugfix for #flymode zone crash
Bugfix for #flymode zone crash when invalid values are passed. Also, when entering #flymode without parameters, the correct syntax is now displayed.
* Changed as requested
This fixes unnecessary leader processing on mass dzquits
Also marks leader dirty for empty expeditions in case something goes
wrong (shouldn't be possible after 62e480fe)
* Rename dynamic zone source files
* Store description and leader name on dz
Removes the DynamicZoneInfo struct used for switch list window. This
data can be stored on DynamicZone and kept updated by its owning system
* Separate create compass packet method
Cleanup MarkSingleCompassLoc
==2317==ERROR: AddressSanitizer: heap-use-after-free on address 0x6170000633c0 at pc 0x55ed1d8e8d8b bp 0x7ffda4bef580 sp 0x7ffda4bef578
WRITE of size 8 at 0x6170000633c0 thread T0
#0 0x55ed1d8e8d8a in Group::SetLeader(Mob*) ../zone/groups.h:80
#1 0x55ed1d8e8d8a in Group::DisbandGroup(bool) ../zone/groups.cpp:1016
ASan didn't like this
I don't think these are actually causing any real problems, ASan
complains about them though since it's kind of a code smell I guess and
a potential source of problems. But our case is fine, so cast to silence
them.
Basically, EntityList::RemoveAllEncounters is called before ReloadQuests
resulting in stale pointers in the lua_encounters map.
We just have to remove the entry from the map.
* Update zlibng
* Set cmake path more directly in zlibng to hopefully fix an issue with the build on drone
* I'm dumb, missing / in path
* Mackal helps with a dumb gitignore issue
* Adding all the files, not sure what's ignoring them and im tired of looking
* Some tweaks to zlibng build to hopefully get it to build properly. works on msvc now
* Add a std::string overload for Database::SetMQDetectionFlag
* Replace calls to MakeAnyLenString in client_packet.cpp
At least the SetMQDetectionFlag ones
* Replace MakeAnyLenString calls in client_process
At least SetMQDectectionFlag ones
* Replace MakeAnyLenString in embparser
fmtlib actually is gross here, oh well.
* Replace MakeAnyLenString in merc
* Replace MakeAnyLenString in inventory
Also if'd out an unfinished implementation of Client::GetItemLinkHash
* Replace AppendAnyLenString in zonelist
* Replace AppendAnyLenString in zonelist
* Replace MakeAnyLenString in clientlist
* Nuke MakeAnyLenString/AppendAnyLenString
* Fix formatting string in zonelist
* Convert common/eq_limits.cpp to use make_unique
* Convert common/net/console_server.cpp to use make_unique
* Convert common/net/servertalk_client_connection.cpp to use make_unique
* Convert common/net/servertalk_legacy_client_connection.cpp to use make_unique
* Convert common/net/servertalk_server.cpp to use make_unique
* Convert common/net/websocket_server.cpp to use make_unique
* Convert common/net/websocket_server_connection.cpp to use make_unique
* Convert common/shareddb.cpp to use make_unique
* Convert eqlaunch/worldserver.cpp to use make_unique
* Convert loginserver/server_manager.cpp to use make_unique
* Convert loginserver/world_server.cpp to use make_unique
* Convert queryserv/worldserver.cpp to use make_unique
* Convert ucs/worldserver.cpp to use make_unique
* Convert world/clientlist.cpp to use make_unique
* Convert world/expedition.cpp to use make_unique
* Convert world/launcher_link.cpp to use make_unique
* Convert world/login_server.cpp to use make_unique
* Convert world/main.cpp to use make_unique
* Convert world/ucs.cpp to use make_unique
* Convert world/web_interface.cpp to use make_unique
* Convert world/zonelist.cpp to use make_unique
* Convert world/zoneserver.cpp to use make_unique
* Convert zone/client.cpp to use make_unique
* Convert zone/corpse.cpp to use make_unique
* Convert zone/dynamiczone.cpp to use make_unique
* Convert zone/expedition.cpp to use make_unique
* Convert zone/main.cpp to use make_unique
* Convert zone/mob_ai.cpp to use make_unique
* Convert zone/mob_movement_manager.cpp to use make_unique
* Convert zone/pathfinder_nav_mesh.cpp to use make_unique
* Convert zone/worldserver.cpp to use make_unique
It should be fine to init further down after the early returns.
This wasn't really a leak that affected performance, but mainly moving
to shutup valgrind
These cases probably are exceedingly rare, but they still need to be
accounted for. (As in, I don't think anyone has run into these cases too
often to cause problems)
* Add a separate FindLuaJit.cmake
* Remove LuaJit from our modified FindLua51.cmake
* Make use of the new FindLuaJit
The reason for splitting them up like this is so we can have a
preference for LuaJIT that's not determined by the search order in
FindLua51.cmake as well as giving the server operators the choice to
prefer normal Lua with the EQEMU_PREFER_LUA cmake option
* Insert repository improvements
* Remove no longer necessary code, remove license banner since we have a license at the repo level
* Update template comments
* Add rule configuration for letting animals open doors or not
* Handle one more spot
* Make adjustments and add mob property that serves as a check as to whether a mob entity can open doors or not
* Push attribute to mob window
* Update perl_client.cpp
Added category tags for client methods.
* Update perl_client.cpp
Now with less iis! (Thanks KK)
* Update perl_client.cpp
Now with fewer slashes!
* Update perl_client.cpp
Now with fewer tabs!
- Add $client->GetInventory() to Perl.
- Export Lua Inventory methods to Perl.
- Add quest::createitem(item_id, charges, augment_one, augment_two, augment_three, augment_four, augment_five, augment_six, attuned) to Perl so you can return a ItemInstance for testing purposes.
RandomPath has been changed to the following behavior:
* When stopped at a waypoint, it will now use the waypoint's pause timer if it is non-zero. If it is zero, it will use the first waypoint's pause timer if that is non-zero. If both are zero it will use 38 seconds. Previously it would always use the first waypoint's pause timer if it was non-zero. This new way is what it should have been from the start, really.
* If any waypoint is flagged as a centerpoint, then the NPCs will always return to that first randomly selected centerpoint waypoint after moving. I.e. every other move will be to the first waypoint if the bool is set.
If any waypoint has a negative number (-1, -10, etc) in the pause timer. It will not be included in the waypoints to be random. Instead the npc will just path through it everytime. This is useful for a path to only select a small area to pause at before returning to it's centerpoints or another random waypoints in between it.
- IMMUNE_DAMAGE_CLIENT (47)
Immune to all damage except NPC damage.
- IMMUNE_DAMAGE_NPC (48)
Immune to all damage except Client damage.
- IMMUNE_AGGRO_CLIENT (49)
Immune to aggro by a Client.
- IMMUNE_AGGRO_NPC (50)
Immune to aggro by an NPC, clients must attack directly to gain aggro, allows pet only boss mechanics and stuff.
Noticed the Gitbook documentation listed SendFullPopup not Popup2 due to parsing the Perl croaks in the files, causing people not to be able to find the proper way to send a full popup window.
- Add quest::message(color, message) to Perl.
- Add eq.message(color, message) to Lua.
- Add quest::whisper(message) to Perl.
- Add eq.whisper(message) to Lua.
These methods allow you to use implied client references. The whisper method also converts a widely used plugin in Perl to a Perl and Lua method that works on both Clients and NPCs.
Only shows 1 or max stack size of item for summoning items. Also resolves the issues some people were having where this command would summon an item with 1 charge instead of max charges because 1 was supplied as charges. In my experience most people who summon items like this want either one item or a full stack of an item and the summon size here is relative to the current item's stack size. Also shows name first instead of ID so the formatting is better.
The NPC pointer held by Spawn2 wasn't reset if the npc was depopped
without a respawn timer by #depop commands or depop(false) quest apis.
If the NPC was part of a spawn condition then the condition would try
to dereference that pointer (which gets deleted) on condition change.
Fixes regression from b08dc02a (PR #1051)
The normal door list sent on zone entry caused unopenable double doors
on clients if an api respawned them while the client was zoning. This
waits until the client finishes zoning and has received the initial
door list before sending any despawn/respawn packets.
Moves corpses to graveyard when an expired instance shuts down.
Zones without a graveyard move them to non-instance version instead.
Fixes player corpses being left inside instances that expire
before graveyards process or in instances without a graveyard
Added public/private class for oldleadername so we can save the previous leader name when the entity is destroyed then allow us to transfer leadership.
Adjusted DelmemberOOZ and in zone functions to include removal of the old leader when disbanding.
This is an experimental change which allows members to log in at the
safe return if they were offline when the expedition was deleted.
Prior to this they would log in at bind instead
Partially reverts commit 32c69d235d
Removed expedition members are no longer hard deleted from db
This removes the is_pending column from character lockouts table
Synchronizing character lockout timers with the expedition's when zoning
into the dynamic zone simplifies adding missing lockouts to new members.
This also matches live behavior that replaces any character lockout
timers from another expedition with ones from the current expedition
This should eliminate race conditions caused by zones trying to set
a leader when members in different zones quit at the same time
Zone still detects when leader goes offline to trigger a change
since it's easier than having world process expedition member status
updates and perform expedition lookups
It isn't necessary to send this packet to current members when a new
expedition member is added. The member list packet changes the current
player count on the window
This fixes unnecessary packets and compass updates being sent for
invited members and better matches live's packet update pattern
This also fixes duplicate updates being sent to the added member
Live only sends a MemberListName update for members added through a
swap (player count doesn't change). For members added through an
invite it sends expedition info and a full member list update
A full member list update is sent for both cases in this patch. This
is because MemberListName currently always adds members with status
"unknown". This is either due to unknown packet fields or a change
in future clients
This exposes dynamic zone ids for any future changes and will make it
easier to preserve historic dz and expedition data. This also cleans up
some dynamic zone creation for expedition requests
When purging instances the expedition table is no longer updated
since dynamic zone ids are not re-used like instance ids are
Update #dz list commands to show dz id
Add GetDynamicZoneID and get_expedition_by_dz_id quest apis
Add 60s to lockout times sent to clients. Lockout timers
are rounded down to the nearest minute when displayed
This replaces the lockout leeway rule with better behavior
All expedition members are notified not just those in dz
This will only work if the dz is running. It might make more sense to
move this to client or world processing so members are notified even if
the zone instance isn't running
This is a breaking api change
eq.get_expedition_by_instance_id(instance_id) is replaced with
eq.get_expedition_by_zone_instance(zone_id, instance_id)
This replaces the FindCachedExpeditionByInstanceID method of
obtaining expeditions via instance id with a new method that
requires the dz zone id as well
This more accurately matches live for the new behavior introduced
in the September 16, 2020 patch. All members of a raid/group are
still checked for conflicts and the truncation is only allowed if
there are none.
It might make sense to add a rule for this since ignoring members
that would exceed the expedition max from the start makes it more
convenient to create expeditions. Members that wouldn't be added
anyway don't really need their conflicts checked.
Add client GetDynamicZones method to provide a single method to get all
associated client dynamic zones
Refactor compass update and MovePCDynamicZone to use this method
instead of searching for client dzs separately
Add optional disable message arg to MovePCDynamicZone
Also supports reducing lockout duration
Add Expedition::AddLockoutDuration
Add Client::AddExpeditionLockoutDuration
Some expeditions require adding to existing lockout durations
during progression. These add the specified seconds to individual
member lockout timers instead of setting a static duration based on
internal expedition lockout like UpdateLockoutDuration.
Add Group and Raid method DoesAnyMemberHaveExpeditionLockout
This is required by some expeditions that perform a manual check for
custom dialogue (Ikkinz group expeditions)
This implements the new behavior from live's September 16, 2020
(test server's September 8, 2020) patch
Expeditions can be created even when the client's group or raid
exceeds the expedition's max player requirement. Members are added
until the max player count is reached and the rest are ignored.
Raid members are added ordered by their raid group number with
ungrouped members having the lowest priority
Rename expedition request method ValidateMembers to CanMembersJoin
Change some expedition messages to System color (live changes)
Increases default from 15 minutes to 25 minutes
This compensates for current default graveyard timer code. Otherwise
instances may shutdown before graveyards can process any corpses.
A better fix needs implemented later to deal with corpses inside
expired dynamic zone/instances. Zones without graveyards should move
corpses to the non-instance version and zones with graveyards should
somehow still be processed (maybe offloaded to world?)
This was loading the dz from database to get safe return data every time
a client's dz removal timer triggered
Add the Zone::GetDynamicZone() method so zones that are dz instances can
find the data from the cache of any dz systems
On live, new expedition leaders are only notified if made leader from
the /dzmakeleader command (or from ui). This rule makes it so the new
leader is always messaged on a leader change for cases where previous
leader goes offline or quits
This prevents toggling to offline state before setting to and from
linkdead status. Without this change, a new expedition leader will be
chosen as soon as the current leader goes linkdead. On live an
expedition leader retains leadership while linkdead
Only choose an online member as new leader on leader changes
Keep leader online status updated in zone expedition caches
Currently this will also trigger a leader change if the leader goes
linkdead. On live the character retains leadership while linkdead
and a new one is only chosen once kicked offline
Set expedition's instance id NULL instead of deleting it from the
database when instances are deleted. Only expedition functions
should delete expeditions
This fixes a regression caused by removing foreign key constraints
The expedition_details row was being deleted and not the corresponding
expedition_members and expedition_lockouts rows. Any characters inside
the members table could no longer join expeditions
Remove logging unsanitized input
Make unsigned comparison not compare < 0
Cleanup some FormatName and string usage. Some of these strings could
probably be moved instead
Remove unnecessary expedition lookup in a world message handler
Add static expedition methods to add or remove character lockouts
Add CreateLockout static helper to ExpeditionLockoutTimer
Refactor existing character lockout removal to allow removal of lockouts
for offline characters (was only used by #dz lockouts remove command)
Fix #dz list member count
Remove extra cross zone message server opcode and struct. Existing
function already exists for normal messages
Group CZClientMessageString struct with other CZ structs
Some live expeditions update a lockout's duration during progression
The current AddLockout method replaces lockout timers. This updates the
expiration of an existing lockout by modifying the original duration
Only members are updated and not the internal expedition timer by
default. This is so new members receive the original duration like live
Add SetLootEventByNPCTypeID and SetLootEventBySpawnID quest apis
These associate events with npcs or entities inside the dz to prevent
them from being looted by characters that didn't receive the event
lockout from the current expedition.
This fixes an exploit that allowed a player that already had a lockout
from another expedition being added to loot after the event is complete
Instead of allowing all previous members to bypass a replay timer
conflict, only allow if expedition uuid of the lockout matches
This fixes an exploit for expeditions that add delayed replay timers.
Members could be part of an expedition on creation and then quit to form
another expedition. They could then always be re-invited to the original
expedition even with a conflicting replay timer lockout.
Breaking change to the current API
has_replay_timer column removed from expedition_details table
This argument is unnecessary and just creates confusion. Expedition
replay timers use a hardcoded name precisely for this purpose and
those lockouts are already being checked on creation requests.
Ignore expired state of replay timers when assigning to new members
This fixes a regression from a previous change that stopped assigning
expired lockouts to new members. Only expired event timers should be
ignored for new members. Replay Timers should always be added with a
a fresh lockout
Live requires characters that quit an expedition to zone out before
being re-added. This is probably to avoid exploiting max player
requirements by constantly swapping players in and out
Delete pending lockouts of members on expedition creation
Delete pending lockouts when all members removed from expedition
This fixes an edge case where members could incorrectly be assigned
pending lockouts that were never cleared from the database (from a
server crash or other situation) after entering another dz.
Small cleanup of logic and unused variables
Rename LoadValidationData to LoadMembersForCreateRequest
Remove unnecessary early string building for members query
Remove unnecessary lockout expired check for leader messages
This optimizes character status requests by only sending a single
bulk request to world for characters in all expeditions instead of
sending a separate request for each expedition on zone startup
This optimizes caching all expeditions by loading dynamic zone data and
expedition members in bulk instead of for each expedition separately.
This reduces the number of queries from 1+2n to 3 total.
Expedition members are now joined in the initial query since empty
expeditions aren't cached anyway. Optional internal lockouts for all
cached expeditions are loaded in a single bulk query afterwards.
Dynamic Zone data is also loaded as a single bulk query afterwards to
simplify processing and keep dz database logic separated. It might be
worth investigating if joining dz data in the initial expeditions load
query is worth refactoring for.
This fixes an edge case with client invites sometimes failing because
an expired lockout hasn't been removed from client yet
Clients no longer receive expired lockouts from expeditions when joining
Make quest compass a vec3 to remove include dependency
Quest compass location doesn't require a zone id since it can only be
set in the zone that it's drawn in. Drop the DynamicZoneLocation member
and forward declare to remove the dependency on header.
Move ExpeditionInvite struct to zone common header
Including expedition.h in client.h just to use the ExpeditionInvite struct
is an unnecessary header dependency that increases incremental build time.
This allows expedition classes to be forward declared in client header.
Since world now tracks empty expeditions it can determine when to
shutdown dynamic zone instances when the rule is enabled rather than
letting zones do it.
Zones are no longer able to delete expeditions. World now tracks empty
expeditions in cache and only deletes them when it detects an
expedition's dynamic zone instance has no more clients inside.
This fixes an exploit where lockouts couldn't be applied to expeditions
after all members were removed because zones were deleting the expedition
immediately. Clients still inside the dz were able to complete events
before being kicked from the instance while not having an expedition.
Expeditions are no longer purged from database in the world purge
instance timer to avoid a possible race with this new system
This implements a small cache in world to track expedition states.
This fixes expired expeditions being left in zone caches unless the
expedition's dz instance was running to detect it (or unless an
expedition was deleted via a client using /kickplayers). This was also
leaving clients in a ghost expedition that no longer actually existed
Not all expeditions with a replay timer lockout add it to newly
added members automatically
This adds the Expedition::SetReplayLockoutOnMemberJoin(bool) method
to the quest api so it can be disabled
Fixes insertion in MySQL older than 5.7.7 and MariaDB older than 10.2.2
that limit indexes to 767 bytes. This may be a temporary fix until
future refactoring
Add expedition's remaining dz time to expedition list
Move #dz destroy to a #dz expedition subcommand
Add success or failure messages to destroy command
Add optional UpdateExpireTime parameter
This is currently only used when an expedition becomes empty to make
dynamic zone instances shutdown earlier. For that it should only update
if new time is less than remaining time
Checking the cache on member removal here isn't reliable due to race
with cross zone message
If a zone removes a member at the same time as another zone, neither zone
can know if the expedition will be empty via cache unless it processes the
world message from the other zone's member removal first.
This allows expedition creation to be passed via Lua tables
This also allows for compass, safereturn, and/or zone in location data
of dynamic zones to be set on expedition creation from lua api
Usage example:
local instance_info = {
"anguish", 0, 21600,
compass = { 300, 1353.15, 1712.19, 109.001 },
safereturn = { 300, 1349.13, 1715.00, 123.81, 0 },
zonein = { -9, -2466, -79, 0 }
}
local expedition_info = { "Anguish, the Fallen Palace", 6, 54, true }
local dz = e.other:CreateExpedition(instance_info, expedition_info)
Adds a rule for leeway with expired lockouts during creation requests
The client removes lockout timers with under 60s remaining from the
window. This allows a small leeway to compensate so players don't
request an expedition that has visually hidden lockouts.
Clears client expedition info immediately if removed inside dynamic zone
Live clears expedition info from clients removed inside a dz on the same
timer used for removals, even if the client zones before it triggers.
This is problematic to mimic and not worth the effort
Get group leader name from Client if possible and ask database otherwise
Group::GetLeaderName() is unreliable and broken for groups formed across
zones. The correct leader name is needed here to avoid any possible
exploits with an invalid leader bypassing lockout checks.
Add optional argument to CreateExpedition to disable conflict messages
Some live expeditions like anguish use a timeout to prevent excessive
leader conflict messages while still performing a creation request
Compass updates get data from the expedition cache so it needs to be
cached first.
Currently this doesn't affect anything because compass isn't sent to
CreateExpedition and has to be set post-creation. In the future this
will make the order of client messages more live accurate though
This is live like and prevents possible exploiting by dropping
expedition before a lockout. Clients will continue receiving lockouts
until they leave the zone or are kicked via timer
Add DynamicZone sql table schema
Add DynamicZones logging category
Modify CreateExpedition to take DynamicZone and ExpeditionRequest objects
Implement DynamicZone compass, safereturn, and zone-in coordinates.
Implement live-like DynamicZone instance kick timer for removed members
Implement updating multiple client compasses (supports existing quest compass)
fix: Send client compass update after entering zones to clear existing compass
Implement Client::MovePCDynamicZone to invoke DynamicZoneSwitchListWnd
when entering a zone where client has multiple dynamic zones assigned
Implement OP_DzChooseZoneReply handling
Add Lua api methods for expedition's associated dynamic zone
Add #dz list gm command to list current DynamicZone instances from database
Add Expeditions logging category
Add handlers for all Dynamic Zone/Expedition related opcodes
Add FormatName string_util function to format character names
Add Zone::IsZone helper method
Add cross zone MessageString support with variable parameters
Add static Client method helpers for cross zone messaging
Add #dz gm command to debug expedition cache for current zone
- Add $client->SetRadiantCrystals(value) to Perl.
- Add $client->SetEbonCrystals(value) to Perl.
- Add client:SetRadiantCrystals(value) to Lua.
- Add client:SetEbonCrystals(value) to Lua.
Co-authored-by: Chris Miles <akkadius1@gmail.com>
* Update NewZone_Structs
* Update packet translators for NewZone_Struct
* Add OP_UnderWorld OPcodes
These aren't implemented yet, but I thought it would be good to document
them. This sends up just entity ID and location when you fall
underworld. This could possibly be used to check for someone screwing
with zone data locally to warp or something I guess.
* Add database fields
* Removed the erroneous message of a DoT "landing" when a mob dies from that DoT
* Set spell=-1 on Death struct for NPCs. It was causing extra DoT msg.
* Remove whitespace
Co-authored-by: Noudess <noudess@gmail.com>
Added a new questAPI GetSpellIDByBookSlot to allow for sorting spellbooks by various attributes (level, type, etc). Allows to determine which spell is in what book slot.
* Create drone config
* Tweak config
* Update .drone.yml
* Garbage commit to run another build
* Bring cores down
* Fix formatting from https://github.com/EQEmu/Server/pull/1142
* Add tests line
* Change directory to build before running the unit tests
* Remove tests dir
* Avoid double build on PR's
* Testing build settings
* IP limit and account session limit refactor - uses responses built into loginserver
* Fix an issue where teleport nodes with 0.0f as a value were added to routes when pathing.
* Scanning optimizations this more properly applies idle / moving scanning algorithms and applies update_others when a client is moving
* Fix bots
* Perform a self and other scan when npc's pop
* Fix scenarios where quest calls to SendIllusion also update internal values so that new clients that zone in see the correct appearance
* Typo [skip ci]
Per January 15th 2003 Patch Notes:
"NPCs will now notice Druid and Shaman Percentage Heal spells in a manner similar to traditional healing spells."
Added SE_PercetalHeal to the same CheckHealAggroAmount as SE_CurrentHP to be similar to traditional healing spells.
When the group is disbanded, set the leader to null.
When setting a new raid leader, make sure we have a new raid leader. If we don't, avoid a crash and disband the raid. It's better than zones falling apart, and will resolve itself on the next VerifyRaid call.
If a member zones, set the leader pointer to nullptr. This fixes an issue where the leader pointer is freed later (MemberZoned normally cleans up the Client object), but referenced by other entities, allowing the leader to be used in the same server process tick, post-cleanup - as the leader won't exist.
Incomplete descriptions added as far as the function was clear to me. Tried to standardize the words used in the descriptions. Corrected a few orthographic problems. Added some words to existing descriptions to make them more understandable. Some rules which were not used anymore are deleted.
* Compile on Freebsd
Small changes needed for compilation on Freebsd. Note that you'll have
to pass -DEQEMU_BUILD_ZLIB=OFF on the cmake command line. The bundled
zlib-ng does not build on Freebsd even though mainline zlib-ng does.
* Fix build errors: typo
This maybe in older clients as well, but I couldn't verify it and those
clients never did anything with this field so it doesn't matter.
MQ2 calls this SubClass, but we call the field it's a "sub" of Type so I
figured we'd call it SubType.
We still need to rename the DB field and handle it server side etc
* Fix errant merchant full issues, add logging for later use
* Rename merchant list dump more clearly
* spaces around '='
* Added line spacing,
Co-authored-by: Noudess <noudess@gmail.com>
* Addresses #1036
* Cleaned up if statement formatting
* Using Mob::GetOwnerOrSelf() now, which accounts for the edge case
NB: The Mob::SpellOnTarget() and Mob::CommonDamage() methods really
should be looked at and spell logic combined somehow. Both have if
statements that dodge around the other's conditions to decide which
method sends the CombatDamage_Struct packet
* Cache EntityList::GetRaidByClient
* Adjustments [skip ci]
* Update entity [skip ci]
* More cleanup [skip ci]
* More tweaks [skip ci]
* Cleanup [skip ci]
* Fix bugs with UCS reconnection on crash / exit, not adding soft deleted characters, put main loop on UV lib
* Reduce log spam that should be debugging; send keepalives to clients so that they properly prune from the connection list
* Shutdown the eventloop to properly shutdown the zone versus calling a hard exit
This fixes the problem, but I believe someone with better knowledge of the client than I can find a more "correct" solution.
Posted as a PR per @joligario to solve it for now. Was also asked to put SE_Invisibility in there so that this "hack" is a catch all.
If you already ran the previous SQL, use this instead:
ALTER TABLE `npc_types` CHANGE `always_aggros_foes` `always_aggro` TINYINT(1) NOT NULL DEFAULT '0';
This still doesn't add support for /autosplit in a raid, how should that
work?
This changes the Raid::SplitMoney to take a group ID and fails when
provided with RAID_GROUPLESS. This does change behavior, but I'm not
sure if it was ever used so ...
It's not guaranteed that deflate output will be smaller than the input.
In some cases zlib-ng (Z_BEST_SPEED) compression is causing packets to
increase in size and exceed m_max_packet_size. This results in the
packets never being fully received by the client.
Currently this is most reproducible in the spell_book section of the
OP_PlayerProfile message. After using #scribespells this portion of the
player profile has a lot of incrementing spellids which may be affecting
the compression algorithm. The client never processes the player profile
(MSG_SEND_PC) message and times out on zone entry.
This isn't necessarily a bug with zlib-ng since it inflates back to the
original input and normal zlib could do this too, but the current netcode
doesn't handle this.
This is a field in the packet, live only uses this for Lay on Hands
Currently I didn't add this to the packet since it has 0 effect on the
client.
We could move this field to aa_ranks which would give more flexibility
for custom servers, but no one said they wanted it there.
We do this in GlobalLootEntry::PassesRules since we want to check if the
hot zone status changes during run time
Value can be null, if null it's not checked. If the value is 0 the zone
must not be a hot zone (I guess one might want that) and if it's not 0,
the zone must be a hot zone
You can now use it to summon up to 8 items ex:
`e.other:QuestReward(e.self, {items = {28745, 28092}, exp = 250})`
This expands the version that takes a table. The new item is a table (in
the main table) called items, which needs to be auto keyed like the
example above. If you also provide the old itemid key, it will be
ignored if the items is there.
This fix only impacts those that use the model field in npc_types to override race on the client.
GetModel() returns model if set, otherwise race.
As a refresher, the model field is there so the server can still see a mob as its base race for things like bane, while the client can use a new model.
FixZ needs to know about this.
Refactors consent to be more live accurate
Message sent to owner and receiver for each zone a corpse is in
Corpses now store consent list instead of clients holding corpse list
Consent throttling added
Message strings and colors updated
Removed reporting invalid consent targets
Changed the wandertype IDs to an enum so we know what we're looking at.
Added new pathgrid type 8 (GridRandomCenterPoint). (SQL required) This new type causes a NPC to alternate between a random waypoint in grid_entries and a random waypoint marked with the new centerpoint column set to true. If no waypoints are marked as a centerpoint, this wandertype will not work. There is no numbering requirement or limit for centerpoints. You can have as many as you need.
New spawngroup field: wp_spawns (SQL required). Added a new spawngroup field, which is a boolean that if true changes the behavior of spawngroups this way: If the spawnpoint in the spawngroup has a grid, the NPC will spawn at a random waypoint location taken from its grid instead of the spawnpoint location.
New randompath behavior: The randompath grid type will now use the closest waypoint as its current waypoint on spawning. This allows multiple spawn locations to use the same grid without having the undesirable behavior of walking to the first waypoint through walls and ignoring waypoint nodes. NPC::GetClosestWaypoint() was renamed to NPC::GetClosestWaypoints() as it was filling a list of multiple waypoints. a new method NPC::GetClosestWaypoint() returns a single waypoint in the form of an integer.
"command":"mkdir -p bin && cd bin && wget https://codeload.github.com/Akkadius/EQEmuMaps/zip/master -O maps.zip && unzip -o maps.zip && rm ./maps -rf && mv EQEmuMaps-master maps && rm maps.zip",
"group":{
"kind":"build",
"isDefault":true
},
"problemMatcher":[
"$gcc"
]
},
{
"label":"download quests",
"type":"shell",
"command":"mkdir -p bin && cd bin && cd server && git -C ./quests pull 2> /dev/null || git clone https://github.com/ProjectEQ/projecteqquests.git quests",
"group":{
"kind":"build",
"isDefault":true
},
"problemMatcher":[
"$gcc"
]
},
{
"label":"download eqemu_config",
"type":"shell",
"command":"mkdir -p bin && cd bin && wget --no-check-certificate https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/eqemu_config_docker.json -O eqemu_config.json",
"group":{
"kind":"build",
"isDefault":true
},
"problemMatcher":[
"$gcc"
]
},
{
"label":"rebuild database (mariadb must be started)",
"type":"shell",
"command":"mkdir -p bin && cd bin && docker run -i --rm --privileged -v ${HOST_PROJECT_PATH}/bin:/src --network=eqemu -it eqemu/server:0.0.3 bash -c './eqemu_server.pl source_peq_db && ./eqemu_server.pl check_db_updates && ./eqemu_server.pl linux_login_server_setup'",
We expect contributors and community members to act professionally and respectfully, and we expect our forums and Discord channels to be dignified environments that expand the community and enhance the learning experience for new members.
Specifically:
* Respect people, their ideas, and their work.
* Be kind. Be courteous. Be welcoming.
* Listen. Consider and acknowledge people's points before responding.
* Be respectful of differing viewpoints and experience levels.
* Accept constructive criticism and work together toward decisions.
* Focus on what is best for the community and users.
Examples of unacceptable behavior by participants include:
* The use of violent threats, trolling, insulting/derogatory comments, abusive or discriminatory language, or personal attacks.
* Public or private harassment.
* Publishing others' private information, such as a physical or electronic address, without explicit permission.
* Conduct which could reasonably be considered inappropriate in a professional setting.
* Advocating for or encouraging any of the above behaviors.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, forum posts, Discord messages, and other contributions that are not aligned with this code of conduct.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project.
#define AT_FindBits 46 // set FindBits, whatever those are!
#define AT_TextureType 48 // TextureType
#define AT_FacePick 49 // Turns off face pick window? maybe ...
#define AT_AntiCheat 51 // sent by the client randomly telling the server how long since last action has occured
#define AT_GuildShow 52 // this is what MQ2 call sit, not sure
#define AT_Offline 53 // Offline mode
@@ -197,6 +198,492 @@ namespace Chat {
constuint16Stun=340;
};
// generation SQL:
// SELECT CONCAT(' constexpr uint16 ', UPPER(short_name), ' = ' , zoneidnumber, '; // ', long_name) from zone group by zoneidnumber ORDER BY zoneidnumber;
namespaceZones{
constexpruint16QEYNOS=1;// South Qeynos
constexpruint16QEYNOS2=2;// North Qeynos
constexpruint16QRG=3;// The Surefall Glade
constexpruint16QEYTOQRG=4;// The Qeynos Hills
constexpruint16HIGHPASS=5;// Highpass Hold
constexpruint16HIGHKEEP=6;// High Keep
constexpruint16FREPORTN=8;// North Freeport
constexpruint16FREPORTW=9;// West Freeport
constexpruint16FREPORTE=10;// East Freeport
constexpruint16RUNNYEYE=11;// The Liberated Citadel of Runnyeye
constexpruint16QEY2HH1=12;// The Western Plains of Karana
constexpruint16NORTHKARANA=13;// The Northern Plains of Karana
constexpruint16SOUTHKARANA=14;// The Southern Plains of Karana
constexpruint16EASTKARANA=15;// Eastern Plains of Karana
constexpruint16BEHOLDER=16;// Gorge of King Xorbb
constexpruint16BLACKBURROW=17;// Blackburrow
constexpruint16PAW=18;// The Lair of the Splitpaw
constexpruint16RIVERVALE=19;// Rivervale
constexpruint16KITHICOR=20;// Kithicor Forest
constexpruint16COMMONS=21;// West Commonlands
constexpruint16ECOMMONS=22;// East Commonlands
constexpruint16ERUDNINT=23;// The Erudin Palace
constexpruint16ERUDNEXT=24;// Erudin
constexpruint16NEKTULOS=25;// The Nektulos Forest
constexpruint16CSHOME=26;// Sunset Home
constexpruint16LAVASTORM=27;// The Lavastorm Mountains
UF::spells::SPELL_GEM_COUNT,// client translators are setup to allow the max value a client supports..however, the top 4 indices are not valid in this case
UF::spells::SPELL_GEM_COUNT,// client translators are setup to allow the max value a client supports..however, the top 4 indices are not valid in this case
/*0344*/floatbounding_radius;// used in melee, overrides calc
/*0347*/uint8IsMercenary;
/*0348*/EQEmu::TintProfileequipment_tint;
/*0348*/EQ::TintProfileequipment_tint;
/*0384*/uint8lfg;// 0=off, 1=lfg on
/*0385*/
@@ -373,13 +375,18 @@ struct NewZone_Struct {
/*0686*/uint16zone_instance;
/*0688*/uint32unknown688;
/*0692*/uint8unknown692[8];
// Titanium doesn't have a translator, but we can still safely add stuff under here without issues since client memcpy's only what it knows
// Just wastes some bandwidth sending to tit clients /shrug
/*0700*/floatfog_density;
/*0704*/uint32SuspendBuffs;
/*0708*/uint32FastRegenHP;
/*0712*/uint32FastRegenMana;
/*0716*/uint32FastRegenEndurance;
/*0720*/uint32NPCAggroMaxDist;
/*0724*/
/*0724*/uint32underworld_teleport_index;// > 0 teleports w/ zone point index, invalid succors, if this value is 0, it prevents you from running off edges that would end up underworld
/*0728*/uint32LavaDamage;// Seen 50
/*0732*/uint32MinLavaDamage;// Seen 10
/*0736*/
};
/*
@@ -441,6 +448,7 @@ struct ManaChange_Struct
/*08*/uint32spell_id;
/*12*/uint8keepcasting;// won't stop the cast. Change mana while casting?
/*13*/uint8padding[3];// client doesn't read it, garbage data seems like
/*16*/int32slot;// -1 normal, otherwise clear ETA and GCD
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.