-
Notifications
You must be signed in to change notification settings - Fork 352
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
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this 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
-
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. ↩
There was a problem hiding this 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)); |
There was a problem hiding this comment.
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, the S6E3 client uses just the normal level.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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/ObjAttack.cpp#L488
https://github.com/kyleruss/emu-server/blob/202856a74c905c203b9b2795fd161f564ca8b257/GameServer/Source/ObjAttack.cpp#L526
However, the S6E3 client seems to use the total stats for the skill dmg display. Let me know what you think.
@@ -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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
However, the S6E3 client uses the total agility and normal level..
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)); |
There was a problem hiding this comment.
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#L709
https://github.com/kyleruss/emu-server/blob/202856a74c905c203b9b2795fd161f564ca8b257/GameServer/Source/ObjBaseAttack.cpp#L740
However, the S6E3 client uses the total agility and normal level.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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#L529
https://github.com/kyleruss/emu-server/blob/202856a74c905c203b9b2795fd161f564ca8b257/GameServer/Source/ObjBaseAttack.cpp#L581
However, it is the previous multipliers that the S6E3 client seems to use (the extra 3000 was from MST skill).
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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/ObjCalCharacter.cpp#L890
https://github.com/kyleruss/emu-server/blob/202856a74c905c203b9b2795fd161f564ca8b257/GameServer/Source/ObjCalCharacter.cpp#L809
However, it is the previous multiplier that the S6E3 client seems to use.
Checking the main 5.2 sources, the switch default case for the client is 5, while in the server is 4 😅
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)); |
There was a problem hiding this comment.
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)); | ||
|
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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#L797
https://github.com/kyleruss/emu-server/blob/202856a74c905c203b9b2795fd161f564ca8b257/GameServer/Source/ObjBaseAttack.cpp#L799
Agree with the S6E3 client (see shot below):
2008×0,2 + 400×1,5 = 1001
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)); |
There was a problem hiding this comment.
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#L733
https://github.com/kyleruss/emu-server/blob/202856a74c905c203b9b2795fd161f564ca8b257/GameServer/Source/ObjBaseAttack.cpp#L764
Agree with the S6E3 client (see shot above):
3,6×2008 + 2,6×400 = 8268,8
|
||
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agrees with the S6E3 client (see shot below):
2000 / 3 = 666,6
|
||
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)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agrees with the S6E3 client (see shot below):
0,5×2000 + 2×400 = 1800
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Force is the basic skill that comes with DL. Force Wave is the scepter skill, which is basically the same but has higher damage and hits multiple targets.
https://github.com/MuSeason6FixTeam/zTeamS6.3/blob/565c579e61f150f6019dee60d22443d30ddfaf42/zGameServer/GameServer/ObjAttack.cpp#L2825
https://github.com/MuSeason6FixTeam/zTeamS6.3/blob/565c579e61f150f6019dee60d22443d30ddfaf42/zGameServer/common/zzzitem.cpp#L2056
https://github.com/MuSeason6FixTeam/zTeamS6.3/blob/565c579e61f150f6019dee60d22443d30ddfaf42/zGameServer/GameServer/ObjCalCharacter.cpp#L381
@@ -243,6 +243,7 @@ internal enum SkillNumber | |||
BloodAttackStrengthen = 490, | |||
FireBurstStreng = 508, | |||
ForceWaveStreng = 509, | |||
ForceWaveStrengAlt = 5090, |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixes:
Discussion
There appears to be some discrepancies between server sources and the S6E3 client: