Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix char stats and Force (Wave) skills #596

Open
wants to merge 10 commits into
base: master
Choose a base branch
from

Conversation

ze-dom
Copy link
Contributor

@ze-dom ze-dom commented Mar 19, 2025

Fixes:

  • Force/Force Wave/Force Wave Strengthener base and master skills damage
  • All chars PvP/PvM attack and defense rates, max HP/mana/SD
  • DW, MG & Summoner defense multipliers
  • Fenrir damage stats

Discussion
There appears to be some discrepancies between server sources and the S6E3 client:

  • Attack rate (PvM) in client uses normal level, server uses total level ✕
  • Attack rate (PvP) in client uses normal level, server uses total level ✕
  • Defense rate (PvP) in client uses normal level, server uses total level ✕
  • Attack rate (PvM) are calculated in both with the total stats (strength and agility) ✓
  • Attack rate (PvP) in client uses total agility, server uses base agility ✕
  • Defense rate (PvP) in client uses total agility, server uses base agility ✕
  • Fenrir damage in client uses total stats, server uses base stats ✕

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @ze-dom, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

Summary of Changes

This pull request addresses issues with character stats and Force (Wave) skills for the Dark Lord class. It includes changes to attribute combinations for various character classes, focusing on Fenrir damage, attack rates, defense rates, maximum mana/health, and shield-related stats. Additionally, it introduces a new skill, 'Force Wave Streng (scepter with skill)', and adjusts the Force Wave skill itself. The update also includes a data migration to apply these changes to existing game configurations.

Highlights

  • Character Stats Fixes: Corrected attribute combinations for Fenrir damage, attack/defense rates, and maximum mana/health across multiple character classes, ensuring accurate stat calculations.
  • Force (Wave) Skill Adjustments: Modified the Force Wave skill and introduced a new 'Force Wave Streng (scepter with skill)' skill specifically for Dark Lords using scepters with skills, providing a more tailored gameplay experience.
  • Data Migration: Implemented a data migration plugin to apply the stat and skill changes to existing game configurations, ensuring consistency across different game versions.

Changelog

Click here to see the changelog
  • src/GameLogic/PlayerActions/Character/AddMasterPointAction.cs
    • Added a check for skill number 509 (Force Wave Streng) to apply master level up points to the alternate skill 5090.
  • src/GameLogic/PlayerActions/Skills/ForceSkillAction.cs
    • Modified PerformSkillAsync to use ForceWaveSkillId if the player has a scepter equipped with a skill.
  • src/GameLogic/PlayerActions/Skills/ForceWaveStrengSkillAction.cs
    • Created a new ForceWaveStrengSkillAction to handle the force wave strengthener skill of the dark lord.
    • Modified PerformSkillAsync to call the alt master skill which has force wave (not force) as its related skill if there is an equipped scepter with skill.
  • src/GameLogic/SkillList.cs
    • Added constants for ForceWaveStrengSkillId and ForceWaveStrengAltSkillId.
    • Modified AddLearnedSkillAsync to create and add ForceWaveStrengAltSkillEntry when ForceWaveStrengSkillId is learned.
    • Modified AddLearnedSkillAsync to return if the skill number is ForceWaveStrengAltSkillId.
  • src/GameServer/RemoteView/Character/SkillListViewPlugIn.cs
    • Added constant for ForceWaveStrengAltSkillId.
    • Modified BuildSkillList to remove ForceWaveSkillId and ForceWaveStrengAltSkillId from the skill list.
  • src/GameServer/RemoteView/World/ShowSkillAnimationPlugIn.cs
    • Added constants for ForceWaveStrSkillId and ForceWaveStrAltSkillId.
    • Modified ShowSkillAnimationAsync to change skillNumber to ForceSkillId if it is ForceSkillId, and to ForceWaveStrSkillId if it is ForceWaveStrAltSkillId.
  • src/Persistence/Initialization/CharacterClasses/ClassDarkKnight.cs
    • Reordered attribute combinations for clarity.
    • Replaced Stats.Level with Stats.TotalLevel in AttackRatePvm, MaximumMana and MaximumHealth attribute combinations.
    • Replaced Stats.TotalStrength, Stats.TotalAgility, Stats.TotalVitality and Stats.TotalEnergy with Stats.BaseStrength, Stats.BaseAgility, Stats.BaseVitality and Stats.BaseEnergy in FenrirBaseDmg attribute combinations.
    • Moved BaseAttributeValues to the end of the method.
  • src/Persistence/Initialization/CharacterClasses/ClassDarkLord.cs
    • Updated base values for CurrentHealth and CurrentMana.
    • Replaced Stats.Level with Stats.TotalLevel in AttackRatePvm, MaximumMana and MaximumHealth attribute combinations.
    • Replaced Stats.TotalStrength, Stats.TotalAgility, Stats.TotalVitality, Stats.TotalEnergy and Stats.TotalLeadership with Stats.BaseStrength, Stats.BaseAgility, Stats.BaseVitality, Stats.BaseEnergy and Stats.BaseLeadership in FenrirBaseDmg attribute combinations.
  • src/Persistence/Initialization/CharacterClasses/ClassDarkWizard.cs
    • Updated DefenseBase attribute combination.
    • Replaced Stats.Level with Stats.TotalLevel in AttackRatePvm, MaximumMana and MaximumHealth attribute combinations.
    • Replaced Stats.TotalStrength, Stats.TotalAgility, Stats.TotalVitality and Stats.TotalEnergy with Stats.BaseStrength, Stats.BaseAgility, Stats.BaseVitality and Stats.BaseEnergy in FenrirBaseDmg attribute combinations.
  • src/Persistence/Initialization/CharacterClasses/ClassFairyElf.cs
    • Replaced Stats.Level with Stats.TotalLevel in AttackRatePvm, MaximumMana and MaximumHealth attribute combinations.
    • Replaced Stats.TotalStrength, Stats.TotalAgility, Stats.TotalVitality and Stats.TotalEnergy with Stats.BaseStrength, Stats.BaseAgility, Stats.BaseVitality and Stats.BaseEnergy in FenrirBaseDmg attribute combinations.
  • src/Persistence/Initialization/CharacterClasses/ClassMagicGladiator.cs
    • Replaced Stats.Level with Stats.TotalLevel in AttackRatePvm, MaximumMana and MaximumHealth attribute combinations.
    • Added Stats.BaseStrength, Stats.BaseAgility, Stats.BaseVitality and Stats.BaseEnergy in FenrirBaseDmg attribute combinations.
  • src/Persistence/Initialization/CharacterClasses/ClassRageFighter.cs
    • Replaced Stats.Level with Stats.TotalLevel in AttackRatePvm, MaximumMana and MaximumHealth attribute combinations.
    • Replaced Stats.TotalStrength, Stats.TotalAgility, Stats.TotalVitality and Stats.TotalEnergy with Stats.BaseStrength, Stats.BaseAgility, Stats.BaseVitality and Stats.BaseEnergy in FenrirBaseDmg attribute combinations.
  • src/Persistence/Initialization/CharacterClasses/ClassSummoner.cs
    • Updated base values for CurrentMana.
    • Replaced Stats.Level with Stats.TotalLevel in AttackRatePvm, MaximumMana and MaximumHealth attribute combinations.
    • Replaced Stats.TotalStrength, Stats.TotalAgility, Stats.TotalVitality and Stats.TotalEnergy with Stats.BaseStrength, Stats.BaseAgility, Stats.BaseVitality and Stats.BaseEnergy in FenrirBaseDmg attribute combinations.
  • src/Persistence/Initialization/Skills/SkillNumber.cs
    • Added ForceWaveStrengAlt to the SkillNumber enum.
  • src/Persistence/Initialization/Updates/FixCharStatsForceWavePlugIn.cs
    • Created a new plugin to fix character stats and DL Force (Wave) skills.
    • Implemented ApplyAsync to update attribute combinations and create ForceWaveStrengAltSkill.
  • src/Persistence/Initialization/Updates/UpdateVersion.cs
    • Added FixCharStatsForceWavePlugIn to the UpdateVersion enum.
  • src/Persistence/Initialization/VersionSeasonSix/SkillsInitializer.cs
    • Added ForceWaveStrengAlt to the SkillsInitializer.
    • Updated ForceWave skill target range.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.


Did you know?

The concept of 'stats' in online games is heavily influenced by tabletop role-playing games like Dungeons & Dragons, where character attributes determine their abilities and effectiveness.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request addresses issues with character stats and Force (Wave) skills, focusing on Dark Lord and Magic Gladiator classes. The changes involve adjustments to attribute combinations, skill definitions, and stat attributes to align with the intended game mechanics. The introduction of a new skill variant, Force Wave StrengAlt, aims to provide a more nuanced skill system based on equipment. Overall, the changes seem well-structured and aim to improve the game's balance and functionality.

Summary of Findings

  • Conditional Skill Application: The ForceSkillAction and ForceWaveStrengSkillAction classes now conditionally apply skills based on whether a scepter is equipped. This logic could be encapsulated into a separate, reusable method to improve maintainability and readability.
  • Attribute Relationships: Several attribute relationships have been modified across different character classes. It's important to ensure that these changes are thoroughly tested to verify their impact on character balance and gameplay.
  • Skill Initialization: The SkillsInitializer class has been updated to include a new skill, ForceWaveStrengAlt, and modify existing skill definitions. These changes should be carefully reviewed to ensure they align with the intended skill mechanics and character progression.

Merge Readiness

The pull request makes significant changes to character stats and skills, particularly for the Dark Lord class. While the changes appear to be well-structured and address the identified issues, thorough testing is crucial to ensure that they do not introduce unintended side effects or imbalances in the game. I am unable to approve this pull request, and recommend that it not be merged until the changes have been thoroughly tested and any necessary adjustments have been made.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MagicSpeed, 1.0f / 20, Stats.TotalAgility));

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.TotalLevel));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumMana, 0.5f, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumHealth, 2, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumMana, 0.5f, Stats.TotalLevel));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumHealth, 2, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 3, Stats.BaseStrength));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseVitality));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 7, Stats.BaseEnergy));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -102,16 +97,21 @@ protected CharacterClass CreateDarkKnight(CharacterClassNumber number, string na
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumShield, 1.2f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumShield, 1.2f, Stats.TotalStrength));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumShield, 0.5f, Stats.DefenseBase));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumShieldTemp, 2f, Stats.Level, InputOperator.Exponentiate));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumShieldTemp, 2f, Stats.TotalLevel, InputOperator.Exponentiate));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.5f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.5f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.TotalLevel));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 4.5f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 4.5f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.TotalLevel));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.CurrentHealth, 1, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.CurrentMana, 1, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.CurrentHealth, 90, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.CurrentMana, 40, false));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 1.0f / 6, Stats.TotalStrength));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.TotalLevel));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 3, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 0.25f, Stats.TotalStrength));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 1.0f / 10, Stats.TotalLeadership));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumHealth, 3, Stats.TotalVitality));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumMana, 1, Stats.TotalLevel));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumHealth, 1.5f, Stats.TotalLevel));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumHealth, 2, Stats.TotalVitality));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 7, Stats.BaseVitality));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 3, Stats.BaseEnergy));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 3, Stats.BaseLeadership));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.5f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.5f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 4.0f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 4.0f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -48,10 +48,10 @@ protected CharacterClass CreateDarkWizard(CharacterClassNumber number, string na

this.AddCommonAttributeRelationships(result.AttributeCombinations);

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseBase, 1.0f / 10, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseBase, 0.25f, Stats.TotalAgility));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvm, 1.0f / 3, Stats.TotalAgility));

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseStrength));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 7, Stats.BaseVitality));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 3, Stats.BaseEnergy));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.25f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.25f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 4, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 4, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -51,7 +51,7 @@ protected CharacterClass CreateFairyElf(CharacterClassNumber number, string name
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseBase, 1.0f / 10, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvm, 0.25f, Stats.TotalAgility));

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseStrength));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 3, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 7, Stats.BaseVitality));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseEnergy));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.1f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.1f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 0.6f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 0.6f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.Level, 1, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.PointsPerLevelUp, 7, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.BaseStrength, 26, true));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.BaseAgility, 26, true));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.BaseVitality, 26, true));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.BaseEnergy, 16, true));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.BaseEnergy, 26, true));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -57,24 +57,24 @@ protected CharacterClass CreateMagicGladiator(CharacterClassNumber number, strin

this.AddCommonAttributeRelationships(result.AttributeCombinations);

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseBase, 1.0f / 5, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseBase, 0.25f, Stats.TotalAgility));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MagicSpeed, 1.0f / 20, Stats.TotalAgility));

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseVitality));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 7, Stats.BaseEnergy));

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.25f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.25f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3.5f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3.5f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 2.5f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 6, Stats.TotalStrength));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.2f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 1.5f, Stats.TotalLevel));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 1.0f / 5, Stats.TotalEnergy));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3.6f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 2.6f, Stats.TotalLevel));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.TotalLevel));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 1.5f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 0.25f, Stats.TotalStrength));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://github.com/MuSeason6FixTeam/zTeamS6.3/blob/565c579e61f150f6019dee60d22443d30ddfaf42/zGameServer/GameServer/ObjBaseAttack.cpp#L534
However, S6E3 client appears to use:

(Stats.AttackRatePvm, 4.255f, Stats.TotalLevel)
(Stats.AttackRatePvm, 1, Stats.TotalAgility)
(Stats.AttackRatePvm, 1f / 6, Stats.TotalStrength)

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseStrength));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 7, Stats.BaseVitality));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 3, Stats.BaseEnergy));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -44,25 +44,26 @@ private CharacterClass CreateSummoner(CharacterClassNumber number, string name,
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.BaseVitality, 18, true));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.BaseEnergy, 23, true));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.CurrentHealth, 70, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.CurrentMana, 20, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.CurrentMana, 40, false));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.CurrentAbility, 1, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.CurrentShield, 1, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.IsInSafezone, 1, false));
result.StatAttributes.Add(this.CreateStatAttributeDefinition(Stats.Resets, 0, false));

this.AddCommonAttributeRelationships(result.AttributeCombinations);

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseBase, 1.0f / 10, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseBase, 1.0f / 3, Stats.TotalAgility));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.5f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.TotalLevel));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 0.5f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.DefenseRatePvp, 2, Stats.TotalLevel));

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 5, Stats.TotalLevel));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 0.6f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.Level));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3.5f, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvp, 3, Stats.TotalLevel));
Copy link
Contributor Author

@ze-dom ze-dom Mar 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseStrength));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.BaseAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 7, Stats.BaseVitality));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 3, Stats.BaseEnergy));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

skillId = ForceWaveSkillId;
}

await base.PerformSkillAsync(player, target, skillId).ConfigureAwait(false);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -243,6 +243,7 @@ internal enum SkillNumber
BloodAttackStrengthen = 490,
FireBurstStreng = 508,
ForceWaveStreng = 509,
ForceWaveStrengAlt = 5090,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any better idea? 😅

@@ -160,8 +160,7 @@ public override void Initialize()
this.CreateSkill(SkillNumber.IncreaseCriticalDamage, "Increase Critical Damage", CharacterClasses.AllLords, abilityConsumption: 50, manaConsumption: 50, energyRequirement: 102, leadershipRequirement: 300, skillType: SkillType.Buff, skillTarget: SkillTarget.ImplicitParty);
this.CreateSkill(SkillNumber.ElectricSpike, "Electric Spike", CharacterClasses.AllLords, DamageType.Physical, 250, 10, 100, energyRequirement: 126, leadershipRequirement: 340, skillType: SkillType.AreaSkillAutomaticHits);
this.AddAreaSkillSettings(SkillNumber.ElectricSpike, true, 1.5f, 1.5f, 12f, useDeferredHits: true, delayPerOneDistance: TimeSpan.FromMilliseconds(10));
this.CreateSkill(SkillNumber.ForceWave, "Force Wave", CharacterClasses.AllLords, DamageType.Physical, 50, 4, manaConsumption: 10, skillType: SkillType.DirectHit, skillTarget: SkillTarget.ExplicitWithImplicitInRange);
this.AddAreaSkillSettings(SkillNumber.ForceWave, true, 1f, 1f, 4f);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This AreaSkillSettings was not being used. Did you have anything in mind here?

As can be seen here, there are multiple possible targets. The original code sets a specific hit area, which is configured in this binary file. From what I've gathered it appears to be a sort of cone area that spreads from the character.

I've added an implicitTargetRange = 1 below as a workaround. What do you think?


result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 3, Stats.TotalLevel));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 1.25f, Stats.TotalAgility));
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.AttackRatePvm, 1.0f / 6, Stats.TotalStrength));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The S6 source differs from the client, but the S8 source agrees with it. So, possibly a bug that was fixed later.
3×400 + 1,25×2008 + 2022÷6 = 4047
Screenshot from 2025-03-20 17-27-52

@ze-dom ze-dom marked this pull request as ready for review March 20, 2025 18:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant