Class ranking additions.

Contributed by Sero and nasseka.
This commit is contained in:
MobiusDevelopment
2021-07-10 22:40:35 +00:00
parent e16b6f6cb4
commit 509e0cf035
45 changed files with 2742 additions and 174 deletions

View File

@@ -48,6 +48,15 @@ public class RankingSkillBonuses extends AbstractNpcAI
private static final Skill SERVER_RANKING_BENEFIT_2 = SkillData.getInstance().getSkill(32885, 1); private static final Skill SERVER_RANKING_BENEFIT_2 = SkillData.getInstance().getSkill(32885, 1);
private static final Skill SERVER_RANKING_BENEFIT_3 = SkillData.getInstance().getSkill(32886, 1); private static final Skill SERVER_RANKING_BENEFIT_3 = SkillData.getInstance().getSkill(32886, 1);
private static final Skill RACE_RANKING_BENEFIT = SkillData.getInstance().getSkill(32887, 1); private static final Skill RACE_RANKING_BENEFIT = SkillData.getInstance().getSkill(32887, 1);
private static final Skill CLASS_RANKING_BENEFIT = SkillData.getInstance().getSkill(33134, 1);
private static final Skill SIGEL_RANK_BENEFIT = SkillData.getInstance().getSkill(33126, 1);
private static final Skill WARRIOR_RANK_BENEFIT = SkillData.getInstance().getSkill(33127, 1);
private static final Skill ROGUE_RANK_BENEFIT = SkillData.getInstance().getSkill(33128, 1);
private static final Skill ARCHER_RANK_BENEFIT = SkillData.getInstance().getSkill(33129, 1);
private static final Skill ISS_RANK_BENEFIT = SkillData.getInstance().getSkill(33130, 1);
private static final Skill FEOH_RANK_BENEFIT = SkillData.getInstance().getSkill(33131, 1);
private static final Skill SUMMONER_RANK_BENEFIT = SkillData.getInstance().getSkill(33132, 1);
private static final Skill HEALER_RANK_BENEFIT = SkillData.getInstance().getSkill(33133, 1);
@RegisterEvent(EventType.ON_PLAYER_LOGIN) @RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
@@ -70,10 +79,19 @@ public class RankingSkillBonuses extends AbstractNpcAI
player.getEffectList().stopSkillEffects(true, DWARF_LEVEL_RANKING_1ST_CLASS); player.getEffectList().stopSkillEffects(true, DWARF_LEVEL_RANKING_1ST_CLASS);
player.getEffectList().stopSkillEffects(true, KAMAEL_LEVEL_RANKING_1ST_CLASS); player.getEffectList().stopSkillEffects(true, KAMAEL_LEVEL_RANKING_1ST_CLASS);
player.getEffectList().stopSkillEffects(true, ERTHEIA_LEVEL_RANKING_1ST_CLASS); player.getEffectList().stopSkillEffects(true, ERTHEIA_LEVEL_RANKING_1ST_CLASS);
player.getEffectList().stopSkillEffects(true, SIGEL_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, WARRIOR_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, ROGUE_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, ARCHER_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, ISS_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, FEOH_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, SUMMONER_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, HEALER_RANK_BENEFIT);
player.removeSkill(SERVER_RANKING_BENEFIT_1); player.removeSkill(SERVER_RANKING_BENEFIT_1);
player.removeSkill(SERVER_RANKING_BENEFIT_2); player.removeSkill(SERVER_RANKING_BENEFIT_2);
player.removeSkill(SERVER_RANKING_BENEFIT_3); player.removeSkill(SERVER_RANKING_BENEFIT_3);
player.removeSkill(RACE_RANKING_BENEFIT); player.removeSkill(RACE_RANKING_BENEFIT);
player.removeSkill(CLASS_RANKING_BENEFIT);
// Add global rank skills. // Add global rank skills.
int rank = RankManager.getInstance().getPlayerGlobalRank(player); int rank = RankManager.getInstance().getPlayerGlobalRank(player);
@@ -143,6 +161,45 @@ public class RankingSkillBonuses extends AbstractNpcAI
} }
player.addSkill(RACE_RANKING_BENEFIT, false); player.addSkill(RACE_RANKING_BENEFIT, false);
} }
// Apply class rank effects.
final int classRank = RankManager.getInstance().getPlayerClassRank(player);
if ((classRank > 0) && (classRank <= 10))
{
if ((player.getBaseClass() >= 148) && (player.getBaseClass() <= 151))
{
SIGEL_RANK_BENEFIT.applyEffects(player, player);
}
else if (((player.getBaseClass() >= 152) && (player.getBaseClass() <= 157)) || (player.getBaseClass() == 188))
{
WARRIOR_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 158) && (player.getBaseClass() <= 161))
{
ROGUE_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 162) && (player.getBaseClass() <= 165))
{
ARCHER_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 171) && (player.getBaseClass() <= 175))
{
ISS_RANK_BENEFIT.applyEffects(player, player);
}
else if (((player.getBaseClass() >= 166) && (player.getBaseClass() <= 170)) || (player.getBaseClass() == 189))
{
FEOH_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 176) && (player.getBaseClass() <= 178))
{
SUMMONER_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 179) && (player.getBaseClass() <= 181))
{
HEALER_RANK_BENEFIT.applyEffects(player, player);
}
player.addSkill(CLASS_RANKING_BENEFIT, false);
}
} }
public static void main(String[] args) public static void main(String[] args)

View File

@@ -133,47 +133,271 @@
<skill id="33126" toLevel="1" name="1st Place in the List of Ranks for Level Among Knights"> <skill id="33126" toLevel="1" name="1st Place in the List of Ranks for Level Among Knights">
<!-- Bonus for the 1-10th places in the list of ranks for level among knights. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Nine Aegis skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- Bonus for the 1-10th places in the list of ranks for level among knights. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Nine Aegis skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33142</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10024</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33127" toLevel="1" name="1st Place in the List of Ranks for Level Among Warriors"> <skill id="33127" toLevel="1" name="1st Place in the List of Ranks for Level Among Warriors">
<!-- Bonus for the 1-10th places in the list of ranks for level among warriors. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. --> <!-- Bonus for the 1-10th places in the list of ranks for level among warriors. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33137</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10274</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33137</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30520</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33128" toLevel="1" name="1st Place in the List of Ranks for Level Among Rogues"> <skill id="33128" toLevel="1" name="1st Place in the List of Ranks for Level Among Rogues">
<!-- Bonus for the 1-10th places in the list of ranks for level among rogues. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Final Ultimate Evasion skill is used, damage from behind +1% for 15 sec. --> <!-- Bonus for the 1-10th places in the list of ranks for level among rogues. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Final Ultimate Evasion skill is used, damage from behind +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33138</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10520</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33129" toLevel="1" name="1st Place in the List of Ranks for Level Among Archers"> <skill id="33129" toLevel="1" name="1st Place in the List of Ranks for Level Among Archers">
<!-- Bonus for the 1-10th places in the list of ranks for level among archers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. --> <!-- Bonus for the 1-10th places in the list of ranks for level among archers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33139</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10783</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33130" toLevel="1" name="1st Place in the List of Ranks for Level Among Enchanters"> <skill id="33130" toLevel="1" name="1st Place in the List of Ranks for Level Among Enchanters">
<!-- Bonus for the 1-10th places in the list of ranks for level among enchanters. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Blessing Barrier skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- Bonus for the 1-10th places in the list of ranks for level among enchanters. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Blessing Barrier skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33143</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11621</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33131" toLevel="1" name="1st Place in the List of Ranks for Level Among Mages"> <skill id="33131" toLevel="1" name="1st Place in the List of Ranks for Level Among Mages">
<!-- Bonus for the 1-10th places in the list of ranks for level among mages. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. --> <!-- Bonus for the 1-10th places in the list of ranks for level among mages. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11068</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30855</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30016</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30860</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33132" toLevel="1" name="1st Place in the List of Ranks for Level Among Summoners"> <skill id="33132" toLevel="1" name="1st Place in the List of Ranks for Level Among Summoners">
<!-- Bonus for the 1-10th places in the level rankings among summoners. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. --> <!-- Bonus for the 1-10th places in the level rankings among summoners. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33141</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11274</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33133" toLevel="1" name="1st Place in the List of Ranks for Level Among Healers"> <skill id="33133" toLevel="1" name="1st Place in the List of Ranks for Level Among Healers">
<!-- Bonus for the 1-10th places in the list of ranks for level among healers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Celestial Protection skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- Bonus for the 1-10th places in the list of ranks for level among healers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Celestial Protection skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33144</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11759</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33134" toLevel="1" name="Bonus for Rank Among Classes"> <skill id="33134" toLevel="1" name="Bonus for Rank Among Classes">
<!-- <Basic effect> Speed +3, Attribute Attack +30, Attribute Resistance +30. <Class effect> Knights: When the Nine Aegis skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Warriors: When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. Rogues: When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. Archers: When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. Enchanters: When the Blessing Barrier skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Mages: When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. Summoners: When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. Healers: When the Celestial Protection skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- <Basic effect> Speed +3, Attribute Attack +30, Attribute Resistance +30. <Class effect> Knights: When the Nine Aegis skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Warriors: When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. Rogues: When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. Archers: When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. Enchanters: When the Blessing Barrier skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Mages: When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. Summoners: When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. Healers: When the Celestial Protection skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>P</operateType>
<effects>
<effect name="Speed">
<amount>3</amount>
<mode>DIFF</mode>
</effect>
<effect name="AttackAttributeAdd">
<amount>30</amount>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>FIRE</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>WATER</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>WIND</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>EARTH</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>HOLY</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>DARK</attribute>
</effect>
</effects>
</skill> </skill>
<skill id="33135" toLevel="1" name="I'm so mad!"> <skill id="33135" toLevel="1" name="I'm so mad!">
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
@@ -187,42 +411,321 @@
<skill id="33137" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Warrior"> <skill id="33137" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Warrior">
<!-- Damage +$s1 for 15 sec. --> <!-- Damage +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>1</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>1</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>1</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>1</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>1</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>1</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33138" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Rogue"> <skill id="33138" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Rogue">
<!-- Damage from behind +$s1 for 15 sec. --> <!-- Damage from behind +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="RearDamage">
<amount>1</amount>
<mode>PER</mode>
<position>BACK</position>
</effect>
</effects>
</skill> </skill>
<skill id="33139" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Archer"> <skill id="33139" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Archer">
<!-- P. Skill Power +$s1 for 15 sec. --> <!-- P. Skill Power +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PhysicalSkillPower">
<amount>1</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33140" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Mage"> <skill id="33140" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Mage">
<!-- M. Skill Power +$s1 for 15 sec. --> <!-- M. Skill Power +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="MagicalSkillPower">
<amount>1</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33141" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Summoner"> <skill id="33141" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Summoner">
<!-- For 15 sec., P./ M. Atk. +$s1. --> <!-- For 15 sec., P./ M. Atk. +$s1. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PAtk">
<amount>3</amount>
<mode>PER</mode>
</effect>
<effect name="MAtk">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33142" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Knight"> <skill id="33142" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Knight">
<!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. --> <!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalLevel>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</abnormalLevel>
<abnormalTime>15</abnormalTime>
<affectRange>1000</affectRange>
<targetType>SELF</targetType>
<affectScope>PARTY</affectScope>
<affectObject>FRIEND</affectObject>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33143" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Enchanter"> <skill id="33143" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Enchanter">
<!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. --> <!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalLevel>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</abnormalLevel>
<abnormalTime>15</abnormalTime>
<affectRange>1000</affectRange>
<targetType>SELF</targetType>
<affectScope>PARTY</affectScope>
<affectObject>FRIEND</affectObject>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33144" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Healer"> <skill id="33144" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Healer">
<!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. --> <!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalLevel>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</abnormalLevel>
<abnormalTime>15</abnormalTime>
<affectRange>1000</affectRange>
<targetType>SELF</targetType>
<affectScope>PARTY</affectScope>
<affectObject>FRIEND</affectObject>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33145" toLevel="1" name="Energy Breath"> <skill id="33145" toLevel="1" name="Energy Breath">
<!-- A standard attack of a monster that uses long-range magic attacks. --> <!-- A standard attack of a monster that uses long-range magic attacks. -->

View File

@@ -49,7 +49,7 @@ public class RankManager
private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 84 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 84 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CHARACTERS_BY_CLASS = "SELECT characters.charId, olympiad_nobles.olympiad_points FROM characters, olympiad_nobles WHERE olympiad_nobles.charId = characters.charId AND characters.base_class = ? ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CHARACTERS_BY_CLASS = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 84 AND characters.base_class = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>(); private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>();
private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>(); private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@@ -83,6 +83,7 @@ public class RankManager
{ {
final StatSet player = new StatSet(); final StatSet player = new StatSet();
final int charId = rset.getInt("charId"); final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId); player.set("charId", charId);
player.set("name", rset.getString("char_name")); player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level")); player.set("level", rset.getInt("level"));
@@ -91,6 +92,7 @@ public class RankManager
player.set("race", race); player.set("race", race);
loadRaceRank(charId, race, player); loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid"); final int clanId = rset.getInt("clanid");
if (clanId > 0) if (clanId > 0)
{ {
@@ -330,6 +332,20 @@ public class RankManager
return 0; return 0;
} }
public int getPlayerClassRank(PlayerInstance player)
{
final int playerOid = player.getObjectId();
for (StatSet stats : _mainList.values())
{
if (stats.getInt("charId") != playerOid)
{
continue;
}
return stats.getInt("classRank");
}
return 0;
}
public static RankManager getInstance() public static RankManager getInstance()
{ {
return SingletonHolder.INSTANCE; return SingletonHolder.INSTANCE;

View File

@@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId; private int _tabId;
private int _type; private int _type;
private int _race; private int _race;
private int _class;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC(); _tabId = packet.readC();
_type = packet.readC(); _type = packet.readC();
_race = packet.readD(); _race = packet.readD();
_class = packet.readD();
return true; return true;
} }
@@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race)); player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race, _class));
} }
} }

View File

@@ -30,6 +30,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
private int _group; private int _group;
private int _scope; private int _scope;
private int _ordinal; private int _ordinal;
private int _baseclass;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id _group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal _scope = packet.readC(); // All or personal
_ordinal = packet.readD(); _ordinal = packet.readD();
_baseclass = packet.readD();
return true; return true;
} }
@@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal)); player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal, _baseclass));
} }
} }

View File

@@ -24,6 +24,7 @@ import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory; import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope; import org.l2jmobius.gameserver.enums.RankingScope;
@@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId; private final int _tabId;
private final int _type; private final int _type;
private final int _race; private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race) public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race, int baseclass)
{ {
_player = player; _player = player;
_season = season; _season = season;
_tabId = tabId; _tabId = tabId;
_type = type; _type = type;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList(); _playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList(); _snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
} }
@@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255)) if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{ {
final RankingCategory category = RankingCategory.values()[_tabId]; final RankingCategory category = RankingCategory.values()[_tabId];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race], ClassId.values()[_class]);
} }
else else
{ {
@@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race, ClassId baseclass)
{ {
switch (category) switch (category)
{ {
@@ -101,6 +104,11 @@ public class ExPvpRankingList implements IClientOutgoingPacket
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList())); writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()));
break; break;
} }
case CLASS:
{
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()));
break;
}
} }
} }

View File

@@ -58,6 +58,7 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank packet.writeD(id); // server rank
packet.writeD(player.getInt("raceRank")); // race rank packet.writeD(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot
packet.writeD(snapshot.getInt("classRank")); // class rank snapshot
packet.writeD(0);
packet.writeD(0); packet.writeD(0);
packet.writeD(0); packet.writeD(0);
return true; return true;

View File

@@ -36,15 +36,17 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race; private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race, int baseclass)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@@ -59,7 +61,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(_race); packet.writeD(_race);
packet.writeD(_player.getClassId().getId()); packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0) if (!_playerList.isEmpty())
{ {
switch (_group) switch (_group)
{ {
@@ -79,7 +81,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(id); // server rank packet.writeD(id); // server rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -88,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -129,7 +131,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(plr.getInt("race")); packet.writeD(plr.getInt("race"));
packet.writeD(id2); // server rank packet.writeD(id2); // server rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id3 : _snapshotList.keySet()) for (Integer id3 : _snapshotList.keySet())
{ {
@@ -138,7 +140,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id3); // server rank snapshot packet.writeD(id3); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); packet.writeD(snapshot.getInt("raceRank", 0));
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -179,7 +181,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(i); // server rank packet.writeD(i); // server rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>(); final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1; int j = 1;
@@ -199,7 +201,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -207,7 +209,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(i); packet.writeD(i);
packet.writeD(i); packet.writeD(i);
packet.writeD(i); // TODO: Check this. nClassRank_Snapshot? packet.writeD(i); // nClassRank_Snapshot
} }
i++; i++;
} }
@@ -256,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank packet.writeD(id2); // server rank
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); // TODO: Check this. nClassRank_Snapshot? packet.writeD(id2); // nClassRank_Snapshot
} }
} }
} }
@@ -294,7 +296,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(id); // clan rank packet.writeD(id); // clan rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -303,7 +305,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -323,7 +325,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
} }
case 3: // friend case 3: // friend
{ {
if (_player.getFriendList().size() > 0) if (!_player.getFriendList().isEmpty())
{ {
final Set<Integer> friendList = ConcurrentHashMap.newKeySet(); final Set<Integer> friendList = ConcurrentHashMap.newKeySet();
int count = 1; int count = 1;
@@ -354,7 +356,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(id); // friend rank packet.writeD(id); // friend rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -363,7 +365,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -393,7 +395,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(_player.getBaseClass()); packet.writeD(_player.getBaseClass());
packet.writeD(_player.getRace().ordinal()); packet.writeD(_player.getRace().ordinal());
packet.writeD(1); // clan rank packet.writeD(1); // clan rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id : _snapshotList.keySet()) for (Integer id : _snapshotList.keySet())
{ {
@@ -402,7 +404,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank snapshot packet.writeD(id); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -415,6 +417,121 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
} }
break; break;
} }
case 4: // class
{
if (_scope == 0) // all
{
int count = 0;
for (int i = 1; i <= _playerList.size(); i++)
{
final StatSet player = _playerList.get(i);
if (_class == player.getInt("classId"))
{
count++;
}
}
packet.writeD(count > 100 ? 100 : count);
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet player = _playerList.get(id);
if (_class == player.getInt("classId"))
{
packet.writeString(player.getString("name"));
packet.writeString(player.getString("clanName"));
packet.writeD(player.getInt("level"));
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(i); // server rank
if (_snapshotList.size() > 0)
{
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1;
for (Integer id2 : _snapshotList.keySet())
{
final StatSet snapshot = _snapshotList.get(id2);
if (_class == snapshot.getInt("classId"))
{
snapshotRaceList.put(j, _snapshotList.get(id2));
j++;
}
}
for (Integer id2 : snapshotRaceList.keySet())
{
final StatSet snapshot = snapshotRaceList.get(id2);
if (player.getInt("charId") == snapshot.getInt("charId"))
{
packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
}
}
}
else
{
packet.writeD(i);
packet.writeD(i);
packet.writeD(i); // nClassRank_Snapshot?
}
i++;
}
}
}
else
{
boolean found = false;
final Map<Integer, StatSet> raceList = new ConcurrentHashMap<>();
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet set = _playerList.get(id);
if (_player.getBaseClass() == set.getInt("classId"))
{
raceList.put(i, _playerList.get(id));
i++;
}
}
for (Integer id : raceList.keySet())
{
final StatSet player = raceList.get(id);
if (player.getInt("charId") == _player.getObjectId())
{
found = true;
final int first = id > 10 ? (id - 9) : 1;
final int last = raceList.size() >= (id + 10) ? id + 10 : id + (raceList.size() - id);
if (first == 1)
{
packet.writeD(last - (first - 1));
}
else
{
packet.writeD(last - first);
}
for (int id2 = first; id2 <= last; id2++)
{
final StatSet plr = raceList.get(id2);
packet.writeString(plr.getString("name"));
packet.writeString(plr.getString("clanName"));
packet.writeD(plr.getInt("level"));
packet.writeD(plr.getInt("classId"));
packet.writeD(plr.getInt("race"));
packet.writeD(id2); // server rank
packet.writeD(id2);
packet.writeD(id2);
packet.writeD(id2); // nClassRank_Snapshot?
}
}
}
if (!found)
{
packet.writeD(0);
}
}
break;
}
} }
} }
else else

View File

@@ -48,6 +48,15 @@ public class RankingSkillBonuses extends AbstractNpcAI
private static final Skill SERVER_RANKING_BENEFIT_2 = SkillData.getInstance().getSkill(32885, 1); private static final Skill SERVER_RANKING_BENEFIT_2 = SkillData.getInstance().getSkill(32885, 1);
private static final Skill SERVER_RANKING_BENEFIT_3 = SkillData.getInstance().getSkill(32886, 1); private static final Skill SERVER_RANKING_BENEFIT_3 = SkillData.getInstance().getSkill(32886, 1);
private static final Skill RACE_RANKING_BENEFIT = SkillData.getInstance().getSkill(32887, 1); private static final Skill RACE_RANKING_BENEFIT = SkillData.getInstance().getSkill(32887, 1);
private static final Skill CLASS_RANKING_BENEFIT = SkillData.getInstance().getSkill(33134, 1);
private static final Skill SIGEL_RANK_BENEFIT = SkillData.getInstance().getSkill(33126, 1);
private static final Skill WARRIOR_RANK_BENEFIT = SkillData.getInstance().getSkill(33127, 1);
private static final Skill ROGUE_RANK_BENEFIT = SkillData.getInstance().getSkill(33128, 1);
private static final Skill ARCHER_RANK_BENEFIT = SkillData.getInstance().getSkill(33129, 1);
private static final Skill ISS_RANK_BENEFIT = SkillData.getInstance().getSkill(33130, 1);
private static final Skill FEOH_RANK_BENEFIT = SkillData.getInstance().getSkill(33131, 1);
private static final Skill SUMMONER_RANK_BENEFIT = SkillData.getInstance().getSkill(33132, 1);
private static final Skill HEALER_RANK_BENEFIT = SkillData.getInstance().getSkill(33133, 1);
@RegisterEvent(EventType.ON_PLAYER_LOGIN) @RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
@@ -70,10 +79,19 @@ public class RankingSkillBonuses extends AbstractNpcAI
player.getEffectList().stopSkillEffects(true, DWARF_LEVEL_RANKING_1ST_CLASS); player.getEffectList().stopSkillEffects(true, DWARF_LEVEL_RANKING_1ST_CLASS);
player.getEffectList().stopSkillEffects(true, KAMAEL_LEVEL_RANKING_1ST_CLASS); player.getEffectList().stopSkillEffects(true, KAMAEL_LEVEL_RANKING_1ST_CLASS);
player.getEffectList().stopSkillEffects(true, ERTHEIA_LEVEL_RANKING_1ST_CLASS); player.getEffectList().stopSkillEffects(true, ERTHEIA_LEVEL_RANKING_1ST_CLASS);
player.getEffectList().stopSkillEffects(true, SIGEL_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, WARRIOR_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, ROGUE_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, ARCHER_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, ISS_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, FEOH_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, SUMMONER_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, HEALER_RANK_BENEFIT);
player.removeSkill(SERVER_RANKING_BENEFIT_1); player.removeSkill(SERVER_RANKING_BENEFIT_1);
player.removeSkill(SERVER_RANKING_BENEFIT_2); player.removeSkill(SERVER_RANKING_BENEFIT_2);
player.removeSkill(SERVER_RANKING_BENEFIT_3); player.removeSkill(SERVER_RANKING_BENEFIT_3);
player.removeSkill(RACE_RANKING_BENEFIT); player.removeSkill(RACE_RANKING_BENEFIT);
player.removeSkill(CLASS_RANKING_BENEFIT);
// Add global rank skills. // Add global rank skills.
int rank = RankManager.getInstance().getPlayerGlobalRank(player); int rank = RankManager.getInstance().getPlayerGlobalRank(player);
@@ -143,6 +161,45 @@ public class RankingSkillBonuses extends AbstractNpcAI
} }
player.addSkill(RACE_RANKING_BENEFIT, false); player.addSkill(RACE_RANKING_BENEFIT, false);
} }
// Apply class rank effects.
final int classRank = RankManager.getInstance().getPlayerClassRank(player);
if ((classRank > 0) && (classRank <= 10))
{
if ((player.getBaseClass() >= 148) && (player.getBaseClass() <= 151))
{
SIGEL_RANK_BENEFIT.applyEffects(player, player);
}
else if (((player.getBaseClass() >= 152) && (player.getBaseClass() <= 157)) || (player.getBaseClass() == 188))
{
WARRIOR_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 158) && (player.getBaseClass() <= 161))
{
ROGUE_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 162) && (player.getBaseClass() <= 165))
{
ARCHER_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 171) && (player.getBaseClass() <= 175))
{
ISS_RANK_BENEFIT.applyEffects(player, player);
}
else if (((player.getBaseClass() >= 166) && (player.getBaseClass() <= 170)) || (player.getBaseClass() == 189))
{
FEOH_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 176) && (player.getBaseClass() <= 178))
{
SUMMONER_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 179) && (player.getBaseClass() <= 181))
{
HEALER_RANK_BENEFIT.applyEffects(player, player);
}
player.addSkill(CLASS_RANKING_BENEFIT, false);
}
} }
public static void main(String[] args) public static void main(String[] args)

View File

@@ -133,47 +133,271 @@
<skill id="33126" toLevel="1" name="1st Place in the List of Ranks for Level Among Knights"> <skill id="33126" toLevel="1" name="1st Place in the List of Ranks for Level Among Knights">
<!-- Bonus for the 1st-10th place in the server level rankings among Knights. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Nine Aegis skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Knights. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Nine Aegis skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33142</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10024</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33127" toLevel="1" name="1st Place in the List of Ranks for Level Among Warriors"> <skill id="33127" toLevel="1" name="1st Place in the List of Ranks for Level Among Warriors">
<!-- Bonus for the 1st-10th place in the server level rankings among Warriors. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Warriors. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33137</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10274</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33137</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30520</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33128" toLevel="1" name="1st Place in the List of Ranks for Level Among Rogues"> <skill id="33128" toLevel="1" name="1st Place in the List of Ranks for Level Among Rogues">
<!-- Bonus for the 1st-10th place in the server level rankings among Rogues. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Rogues. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33138</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10520</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33129" toLevel="1" name="1st Place in the List of Ranks for Level Among Archers"> <skill id="33129" toLevel="1" name="1st Place in the List of Ranks for Level Among Archers">
<!-- Bonus for the 1st-10th place in the server level rankings among Archers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Archers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33139</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10783</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33130" toLevel="1" name="1st Place in the List of Ranks for Level Among Enchanters"> <skill id="33130" toLevel="1" name="1st Place in the List of Ranks for Level Among Enchanters">
<!-- Bonus for the 1st-10th place in the server level rankings among Enchanters. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Blessing Barrier skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Enchanters. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Blessing Barrier skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33143</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11621</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33131" toLevel="1" name="1st Place in the List of Ranks for Level Among Mages"> <skill id="33131" toLevel="1" name="1st Place in the List of Ranks for Level Among Mages">
<!-- Bonus for the 1st-10th place in the server level rankings among Mages. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Mages. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11068</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30855</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30016</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30860</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33132" toLevel="1" name="1st Place in the List of Ranks for Level Among Summoners"> <skill id="33132" toLevel="1" name="1st Place in the List of Ranks for Level Among Summoners">
<!-- Bonus for the 1st-10th place in the server level rankings among Summoners. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Summoners. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33141</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11274</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33133" toLevel="1" name="1st Place in the List of Ranks for Level Among Healers"> <skill id="33133" toLevel="1" name="1st Place in the List of Ranks for Level Among Healers">
<!-- Bonus for the 1st-10th place in the server level rankings among Healers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Celestial Protection skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Healers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Celestial Protection skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33144</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11759</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33134" toLevel="1" name="Bonus for Rank Among Classes"> <skill id="33134" toLevel="1" name="Bonus for Rank Among Classes">
<!-- <Basic effect> Speed +3, Attribute Attack +30, Attribute Resistance +30. <Class effect> Knights: When the Nine Aegis skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Warriors: When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. Rogues: When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. Archers: When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. Enchanters: When the Blessing Barrier skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Mages: When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. Summoners: When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. Healers: When the Celestial Protection skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- <Basic effect> Speed +3, Attribute Attack +30, Attribute Resistance +30. <Class effect> Knights: When the Nine Aegis skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Warriors: When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. Rogues: When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. Archers: When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. Enchanters: When the Blessing Barrier skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Mages: When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. Summoners: When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. Healers: When the Celestial Protection skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>P</operateType>
<effects>
<effect name="Speed">
<amount>3</amount>
<mode>DIFF</mode>
</effect>
<effect name="AttackAttributeAdd">
<amount>30</amount>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>FIRE</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>WATER</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>WIND</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>EARTH</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>HOLY</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>DARK</attribute>
</effect>
</effects>
</skill> </skill>
<skill id="33135" toLevel="1" name="I'm so mad!"> <skill id="33135" toLevel="1" name="I'm so mad!">
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
@@ -187,42 +411,321 @@
<skill id="33137" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Warrior"> <skill id="33137" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Warrior">
<!-- Damage +$s1 for 15 sec. --> <!-- Damage +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>1</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>1</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>1</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>1</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>1</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>1</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33138" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Rogue"> <skill id="33138" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Rogue">
<!-- Damage from behind +$s1 for 15 sec. --> <!-- Damage from behind +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="RearDamage">
<amount>1</amount>
<mode>PER</mode>
<position>BACK</position>
</effect>
</effects>
</skill> </skill>
<skill id="33139" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Archer"> <skill id="33139" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Archer">
<!-- P. Skill Power +$s1 for 15 sec. --> <!-- P. Skill Power +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PhysicalSkillPower">
<amount>1</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33140" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Mage"> <skill id="33140" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Mage">
<!-- M. Skill Power +$s1 for 15 sec. --> <!-- M. Skill Power +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="MagicalSkillPower">
<amount>1</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33141" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Summoner"> <skill id="33141" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Summoner">
<!-- For 15 sec., P./ M. Atk. +$s1. --> <!-- For 15 sec., P./ M. Atk. +$s1. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PAtk">
<amount>3</amount>
<mode>PER</mode>
</effect>
<effect name="MAtk">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33142" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Knight"> <skill id="33142" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Knight">
<!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. --> <!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalLevel>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</abnormalLevel>
<abnormalTime>15</abnormalTime>
<affectRange>1000</affectRange>
<targetType>SELF</targetType>
<affectScope>PARTY</affectScope>
<affectObject>FRIEND</affectObject>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33143" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Enchanter"> <skill id="33143" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Enchanter">
<!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. --> <!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalLevel>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</abnormalLevel>
<abnormalTime>15</abnormalTime>
<affectRange>1000</affectRange>
<targetType>SELF</targetType>
<affectScope>PARTY</affectScope>
<affectObject>FRIEND</affectObject>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33144" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Healer"> <skill id="33144" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Healer">
<!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. --> <!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalLevel>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</abnormalLevel>
<abnormalTime>15</abnormalTime>
<affectRange>1000</affectRange>
<targetType>SELF</targetType>
<affectScope>PARTY</affectScope>
<affectObject>FRIEND</affectObject>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33145" toLevel="1" name="Energy Breath"> <skill id="33145" toLevel="1" name="Energy Breath">
<!-- A standard attack of a monster that uses long-range magic attacks. --> <!-- A standard attack of a monster that uses long-range magic attacks. -->

View File

@@ -49,7 +49,7 @@ public class RankManager
private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 84 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 84 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CHARACTERS_BY_CLASS = "SELECT characters.charId, olympiad_nobles.olympiad_points FROM characters, olympiad_nobles WHERE olympiad_nobles.charId = characters.charId AND characters.base_class = ? ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CHARACTERS_BY_CLASS = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 84 AND characters.base_class = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>(); private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>();
private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>(); private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@@ -83,6 +83,7 @@ public class RankManager
{ {
final StatSet player = new StatSet(); final StatSet player = new StatSet();
final int charId = rset.getInt("charId"); final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId); player.set("charId", charId);
player.set("name", rset.getString("char_name")); player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level")); player.set("level", rset.getInt("level"));
@@ -91,6 +92,7 @@ public class RankManager
player.set("race", race); player.set("race", race);
loadRaceRank(charId, race, player); loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid"); final int clanId = rset.getInt("clanid");
if (clanId > 0) if (clanId > 0)
{ {
@@ -330,6 +332,20 @@ public class RankManager
return 0; return 0;
} }
public int getPlayerClassRank(PlayerInstance player)
{
final int playerOid = player.getObjectId();
for (StatSet stats : _mainList.values())
{
if (stats.getInt("charId") != playerOid)
{
continue;
}
return stats.getInt("classRank");
}
return 0;
}
public static RankManager getInstance() public static RankManager getInstance()
{ {
return SingletonHolder.INSTANCE; return SingletonHolder.INSTANCE;

View File

@@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId; private int _tabId;
private int _type; private int _type;
private int _race; private int _race;
private int _class;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC(); _tabId = packet.readC();
_type = packet.readC(); _type = packet.readC();
_race = packet.readD(); _race = packet.readD();
_class = packet.readD();
return true; return true;
} }
@@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race)); player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race, _class));
} }
} }

View File

@@ -30,6 +30,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
private int _group; private int _group;
private int _scope; private int _scope;
private int _ordinal; private int _ordinal;
private int _baseclass;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id _group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal _scope = packet.readC(); // All or personal
_ordinal = packet.readD(); _ordinal = packet.readD();
_baseclass = packet.readD();
return true; return true;
} }
@@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal)); player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal, _baseclass));
} }
} }

View File

@@ -24,6 +24,7 @@ import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory; import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope; import org.l2jmobius.gameserver.enums.RankingScope;
@@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId; private final int _tabId;
private final int _type; private final int _type;
private final int _race; private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race) public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race, int baseclass)
{ {
_player = player; _player = player;
_season = season; _season = season;
_tabId = tabId; _tabId = tabId;
_type = type; _type = type;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList(); _playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList(); _snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
} }
@@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255)) if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{ {
final RankingCategory category = RankingCategory.values()[_tabId]; final RankingCategory category = RankingCategory.values()[_tabId];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race], ClassId.values()[_class]);
} }
else else
{ {
@@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race, ClassId baseclass)
{ {
switch (category) switch (category)
{ {
@@ -101,6 +104,11 @@ public class ExPvpRankingList implements IClientOutgoingPacket
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList())); writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()));
break; break;
} }
case CLASS:
{
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()));
break;
}
} }
} }

View File

@@ -58,6 +58,7 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank packet.writeD(id); // server rank
packet.writeD(player.getInt("raceRank")); // race rank packet.writeD(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot
packet.writeD(snapshot.getInt("classRank")); // class rank snapshot
packet.writeD(0);
packet.writeD(0); packet.writeD(0);
packet.writeD(0); packet.writeD(0);
return true; return true;

View File

@@ -36,15 +36,17 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race; private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race, int baseclass)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@@ -59,7 +61,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(_race); packet.writeD(_race);
packet.writeD(_player.getClassId().getId()); packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0) if (!_playerList.isEmpty())
{ {
switch (_group) switch (_group)
{ {
@@ -79,7 +81,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(id); // server rank packet.writeD(id); // server rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -88,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -129,7 +131,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(plr.getInt("race")); packet.writeD(plr.getInt("race"));
packet.writeD(id2); // server rank packet.writeD(id2); // server rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id3 : _snapshotList.keySet()) for (Integer id3 : _snapshotList.keySet())
{ {
@@ -138,7 +140,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id3); // server rank snapshot packet.writeD(id3); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); packet.writeD(snapshot.getInt("raceRank", 0));
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -179,7 +181,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(i); // server rank packet.writeD(i); // server rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>(); final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1; int j = 1;
@@ -199,7 +201,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -207,7 +209,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(i); packet.writeD(i);
packet.writeD(i); packet.writeD(i);
packet.writeD(i); // TODO: Check this. nClassRank_Snapshot? packet.writeD(i); // nClassRank_Snapshot
} }
i++; i++;
} }
@@ -256,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank packet.writeD(id2); // server rank
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); // TODO: Check this. nClassRank_Snapshot? packet.writeD(id2); // nClassRank_Snapshot
} }
} }
} }
@@ -294,7 +296,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(id); // clan rank packet.writeD(id); // clan rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -303,7 +305,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -323,7 +325,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
} }
case 3: // friend case 3: // friend
{ {
if (_player.getFriendList().size() > 0) if (!_player.getFriendList().isEmpty())
{ {
final Set<Integer> friendList = ConcurrentHashMap.newKeySet(); final Set<Integer> friendList = ConcurrentHashMap.newKeySet();
int count = 1; int count = 1;
@@ -354,7 +356,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(id); // friend rank packet.writeD(id); // friend rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -363,7 +365,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -393,7 +395,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(_player.getBaseClass()); packet.writeD(_player.getBaseClass());
packet.writeD(_player.getRace().ordinal()); packet.writeD(_player.getRace().ordinal());
packet.writeD(1); // clan rank packet.writeD(1); // clan rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id : _snapshotList.keySet()) for (Integer id : _snapshotList.keySet())
{ {
@@ -402,7 +404,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank snapshot packet.writeD(id); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -415,6 +417,121 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
} }
break; break;
} }
case 4: // class
{
if (_scope == 0) // all
{
int count = 0;
for (int i = 1; i <= _playerList.size(); i++)
{
final StatSet player = _playerList.get(i);
if (_class == player.getInt("classId"))
{
count++;
}
}
packet.writeD(count > 100 ? 100 : count);
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet player = _playerList.get(id);
if (_class == player.getInt("classId"))
{
packet.writeString(player.getString("name"));
packet.writeString(player.getString("clanName"));
packet.writeD(player.getInt("level"));
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(i); // server rank
if (_snapshotList.size() > 0)
{
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1;
for (Integer id2 : _snapshotList.keySet())
{
final StatSet snapshot = _snapshotList.get(id2);
if (_class == snapshot.getInt("classId"))
{
snapshotRaceList.put(j, _snapshotList.get(id2));
j++;
}
}
for (Integer id2 : snapshotRaceList.keySet())
{
final StatSet snapshot = snapshotRaceList.get(id2);
if (player.getInt("charId") == snapshot.getInt("charId"))
{
packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
}
}
}
else
{
packet.writeD(i);
packet.writeD(i);
packet.writeD(i); // nClassRank_Snapshot?
}
i++;
}
}
}
else
{
boolean found = false;
final Map<Integer, StatSet> raceList = new ConcurrentHashMap<>();
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet set = _playerList.get(id);
if (_player.getBaseClass() == set.getInt("classId"))
{
raceList.put(i, _playerList.get(id));
i++;
}
}
for (Integer id : raceList.keySet())
{
final StatSet player = raceList.get(id);
if (player.getInt("charId") == _player.getObjectId())
{
found = true;
final int first = id > 10 ? (id - 9) : 1;
final int last = raceList.size() >= (id + 10) ? id + 10 : id + (raceList.size() - id);
if (first == 1)
{
packet.writeD(last - (first - 1));
}
else
{
packet.writeD(last - first);
}
for (int id2 = first; id2 <= last; id2++)
{
final StatSet plr = raceList.get(id2);
packet.writeString(plr.getString("name"));
packet.writeString(plr.getString("clanName"));
packet.writeD(plr.getInt("level"));
packet.writeD(plr.getInt("classId"));
packet.writeD(plr.getInt("race"));
packet.writeD(id2); // server rank
packet.writeD(id2);
packet.writeD(id2);
packet.writeD(id2); // nClassRank_Snapshot?
}
}
}
if (!found)
{
packet.writeD(0);
}
}
break;
}
} }
} }
else else

View File

@@ -48,6 +48,15 @@ public class RankingSkillBonuses extends AbstractNpcAI
private static final Skill SERVER_RANKING_BENEFIT_2 = SkillData.getInstance().getSkill(32885, 1); private static final Skill SERVER_RANKING_BENEFIT_2 = SkillData.getInstance().getSkill(32885, 1);
private static final Skill SERVER_RANKING_BENEFIT_3 = SkillData.getInstance().getSkill(32886, 1); private static final Skill SERVER_RANKING_BENEFIT_3 = SkillData.getInstance().getSkill(32886, 1);
private static final Skill RACE_RANKING_BENEFIT = SkillData.getInstance().getSkill(32887, 1); private static final Skill RACE_RANKING_BENEFIT = SkillData.getInstance().getSkill(32887, 1);
private static final Skill CLASS_RANKING_BENEFIT = SkillData.getInstance().getSkill(33134, 1);
private static final Skill SIGEL_RANK_BENEFIT = SkillData.getInstance().getSkill(33126, 1);
private static final Skill WARRIOR_RANK_BENEFIT = SkillData.getInstance().getSkill(33127, 1);
private static final Skill ROGUE_RANK_BENEFIT = SkillData.getInstance().getSkill(33128, 1);
private static final Skill ARCHER_RANK_BENEFIT = SkillData.getInstance().getSkill(33129, 1);
private static final Skill ISS_RANK_BENEFIT = SkillData.getInstance().getSkill(33130, 1);
private static final Skill FEOH_RANK_BENEFIT = SkillData.getInstance().getSkill(33131, 1);
private static final Skill SUMMONER_RANK_BENEFIT = SkillData.getInstance().getSkill(33132, 1);
private static final Skill HEALER_RANK_BENEFIT = SkillData.getInstance().getSkill(33133, 1);
@RegisterEvent(EventType.ON_PLAYER_LOGIN) @RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
@@ -70,10 +79,19 @@ public class RankingSkillBonuses extends AbstractNpcAI
player.getEffectList().stopSkillEffects(true, DWARF_LEVEL_RANKING_1ST_CLASS); player.getEffectList().stopSkillEffects(true, DWARF_LEVEL_RANKING_1ST_CLASS);
player.getEffectList().stopSkillEffects(true, KAMAEL_LEVEL_RANKING_1ST_CLASS); player.getEffectList().stopSkillEffects(true, KAMAEL_LEVEL_RANKING_1ST_CLASS);
player.getEffectList().stopSkillEffects(true, ERTHEIA_LEVEL_RANKING_1ST_CLASS); player.getEffectList().stopSkillEffects(true, ERTHEIA_LEVEL_RANKING_1ST_CLASS);
player.getEffectList().stopSkillEffects(true, SIGEL_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, WARRIOR_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, ROGUE_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, ARCHER_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, ISS_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, FEOH_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, SUMMONER_RANK_BENEFIT);
player.getEffectList().stopSkillEffects(true, HEALER_RANK_BENEFIT);
player.removeSkill(SERVER_RANKING_BENEFIT_1); player.removeSkill(SERVER_RANKING_BENEFIT_1);
player.removeSkill(SERVER_RANKING_BENEFIT_2); player.removeSkill(SERVER_RANKING_BENEFIT_2);
player.removeSkill(SERVER_RANKING_BENEFIT_3); player.removeSkill(SERVER_RANKING_BENEFIT_3);
player.removeSkill(RACE_RANKING_BENEFIT); player.removeSkill(RACE_RANKING_BENEFIT);
player.removeSkill(CLASS_RANKING_BENEFIT);
// Add global rank skills. // Add global rank skills.
int rank = RankManager.getInstance().getPlayerGlobalRank(player); int rank = RankManager.getInstance().getPlayerGlobalRank(player);
@@ -143,6 +161,45 @@ public class RankingSkillBonuses extends AbstractNpcAI
} }
player.addSkill(RACE_RANKING_BENEFIT, false); player.addSkill(RACE_RANKING_BENEFIT, false);
} }
// Apply class rank effects.
final int classRank = RankManager.getInstance().getPlayerClassRank(player);
if ((classRank > 0) && (classRank <= 10))
{
if ((player.getBaseClass() >= 148) && (player.getBaseClass() <= 151))
{
SIGEL_RANK_BENEFIT.applyEffects(player, player);
}
else if (((player.getBaseClass() >= 152) && (player.getBaseClass() <= 157)) || (player.getBaseClass() == 188))
{
WARRIOR_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 158) && (player.getBaseClass() <= 161))
{
ROGUE_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 162) && (player.getBaseClass() <= 165))
{
ARCHER_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 171) && (player.getBaseClass() <= 175))
{
ISS_RANK_BENEFIT.applyEffects(player, player);
}
else if (((player.getBaseClass() >= 166) && (player.getBaseClass() <= 170)) || (player.getBaseClass() == 189))
{
FEOH_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 176) && (player.getBaseClass() <= 178))
{
SUMMONER_RANK_BENEFIT.applyEffects(player, player);
}
else if ((player.getBaseClass() >= 179) && (player.getBaseClass() <= 181))
{
HEALER_RANK_BENEFIT.applyEffects(player, player);
}
player.addSkill(CLASS_RANKING_BENEFIT, false);
}
} }
public static void main(String[] args) public static void main(String[] args)

View File

@@ -133,47 +133,271 @@
<skill id="33126" toLevel="1" name="1st Place in the List of Ranks for Level Among Knights"> <skill id="33126" toLevel="1" name="1st Place in the List of Ranks for Level Among Knights">
<!-- Bonus for the 1st-10th place in the server level rankings among Knights. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Nine Aegis skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Knights. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Nine Aegis skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33142</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10024</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33127" toLevel="1" name="1st Place in the List of Ranks for Level Among Warriors"> <skill id="33127" toLevel="1" name="1st Place in the List of Ranks for Level Among Warriors">
<!-- Bonus for the 1st-10th place in the server level rankings among Warriors. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Warriors. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33137</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10274</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33137</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30520</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33128" toLevel="1" name="1st Place in the List of Ranks for Level Among Rogues"> <skill id="33128" toLevel="1" name="1st Place in the List of Ranks for Level Among Rogues">
<!-- Bonus for the 1st-10th place in the server level rankings among Rogues. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Rogues. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33138</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10520</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33129" toLevel="1" name="1st Place in the List of Ranks for Level Among Archers"> <skill id="33129" toLevel="1" name="1st Place in the List of Ranks for Level Among Archers">
<!-- Bonus for the 1st-10th place in the server level rankings among Archers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Archers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33139</skillId>
<skillLevel>1</skillLevel>
<castSkillId>10783</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33130" toLevel="1" name="1st Place in the List of Ranks for Level Among Enchanters"> <skill id="33130" toLevel="1" name="1st Place in the List of Ranks for Level Among Enchanters">
<!-- Bonus for the 1st-10th place in the server level rankings among Enchanters. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Blessing Barrier skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Enchanters. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Blessing Barrier skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33143</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11621</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33131" toLevel="1" name="1st Place in the List of Ranks for Level Among Mages"> <skill id="33131" toLevel="1" name="1st Place in the List of Ranks for Level Among Mages">
<!-- Bonus for the 1st-10th place in the server level rankings among Mages. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Mages. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11068</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30855</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30016</castSkillId>
<targetType>SELF</targetType>
</effect>
<effect name="TriggerSkillBySkill">
<skillId>33140</skillId>
<skillLevel>1</skillLevel>
<castSkillId>30860</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33132" toLevel="1" name="1st Place in the List of Ranks for Level Among Summoners"> <skill id="33132" toLevel="1" name="1st Place in the List of Ranks for Level Among Summoners">
<!-- Bonus for the 1st-10th place in the server level rankings among Summoners. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Summoners. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<canBeDispelled>false</canBeDispelled>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33141</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11274</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33133" toLevel="1" name="1st Place in the List of Ranks for Level Among Healers"> <skill id="33133" toLevel="1" name="1st Place in the List of Ranks for Level Among Healers">
<!-- Bonus for the 1st-10th place in the server level rankings among Healers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Celestial Protection skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- Bonus for the 1st-10th place in the server level rankings among Healers. Speed +3, Attribute Attack +30, Attribute Resistance +30. When the Celestial Protection skill is used, a character and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<effectPoint>100</effectPoint>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<specialLevel>-2</specialLevel>
<hitCancelTime>0</hitCancelTime>
<magicLevel>-2</magicLevel>
<abnormalLevel>1</abnormalLevel>
<abnormalTime>-1</abnormalTime>
<irreplacableBuff>true</irreplacableBuff>
<isMagic>2</isMagic>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="TriggerSkillBySkill">
<skillId>33144</skillId>
<skillLevel>1</skillLevel>
<castSkillId>11759</castSkillId>
<targetType>SELF</targetType>
</effect>
</effects>
</skill> </skill>
<skill id="33134" toLevel="1" name="Bonus for Rank Among Classes"> <skill id="33134" toLevel="1" name="Bonus for Rank Among Classes">
<!-- <Basic effect> Speed +3, Attribute Attack +30, Attribute Resistance +30. <Class effect> Knights: When the Nine Aegis skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Warriors: When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. Rogues: When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. Archers: When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. Enchanters: When the Blessing Barrier skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Mages: When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. Summoners: When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. Healers: When the Celestial Protection skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. --> <!-- <Basic effect> Speed +3, Attribute Attack +30, Attribute Resistance +30. <Class effect> Knights: When the Nine Aegis skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Warriors: When the Berserker/ Steel Mind skill is used, damage +1% for 15 sec. Rogues: When the Final Ultimate Evasion skill is used, backstab damage +1% for 15 sec. Archers: When the Mind's Eye skill is used, P. Skill Power +1% for 15 sec. Enchanters: When the Blessing Barrier skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. Mages: When the Burst Casting/ Superior Burst Casting/ Eye of the Storm/ Eye of the Windstorm skill is used, M. Skill Power +1% for 15 sec. Summoners: When the Summon Barrier skill is used, P./ M. Atk. +3% for 15 sec. Healers: When the Celestial Protection skill is used, a character's and party members' damage +1% (3 stages at max) for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>P</operateType>
<effects>
<effect name="Speed">
<amount>3</amount>
<mode>DIFF</mode>
</effect>
<effect name="AttackAttributeAdd">
<amount>30</amount>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>FIRE</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>WATER</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>WIND</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>EARTH</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>HOLY</attribute>
</effect>
<effect name="DefenceAttribute">
<amount>30</amount>
<attribute>DARK</attribute>
</effect>
</effects>
</skill> </skill>
<skill id="33135" toLevel="1" name="I'm so mad!"> <skill id="33135" toLevel="1" name="I'm so mad!">
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
@@ -187,42 +411,321 @@
<skill id="33137" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Warrior"> <skill id="33137" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Warrior">
<!-- Damage +$s1 for 15 sec. --> <!-- Damage +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>1</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>1</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>1</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>1</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>1</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>1</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33138" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Rogue"> <skill id="33138" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Rogue">
<!-- Damage from behind +$s1 for 15 sec. --> <!-- Damage from behind +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="RearDamage">
<amount>1</amount>
<mode>PER</mode>
<position>BACK</position>
</effect>
</effects>
</skill> </skill>
<skill id="33139" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Archer"> <skill id="33139" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Archer">
<!-- P. Skill Power +$s1 for 15 sec. --> <!-- P. Skill Power +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PhysicalSkillPower">
<amount>1</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33140" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Mage"> <skill id="33140" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Mage">
<!-- M. Skill Power +$s1 for 15 sec. --> <!-- M. Skill Power +$s1 for 15 sec. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="MagicalSkillPower">
<amount>1</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33141" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Summoner"> <skill id="33141" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Summoner">
<!-- For 15 sec., P./ M. Atk. +$s1. --> <!-- For 15 sec., P./ M. Atk. +$s1. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalTime>15</abnormalTime>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PAtk">
<amount>3</amount>
<mode>PER</mode>
</effect>
<effect name="MAtk">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33142" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Knight"> <skill id="33142" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Knight">
<!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. --> <!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalLevel>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</abnormalLevel>
<abnormalTime>15</abnormalTime>
<affectRange>1000</affectRange>
<targetType>SELF</targetType>
<affectScope>PARTY</affectScope>
<affectObject>FRIEND</affectObject>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33143" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Enchanter"> <skill id="33143" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Enchanter">
<!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. --> <!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalLevel>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</abnormalLevel>
<abnormalTime>15</abnormalTime>
<affectRange>1000</affectRange>
<targetType>SELF</targetType>
<affectScope>PARTY</affectScope>
<affectObject>FRIEND</affectObject>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33144" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Healer"> <skill id="33144" toLevel="3" name="Blessing of 1st Place in the List of Ranks for Level: Stage 1 - Healer">
<!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. --> <!-- Damage +$s1 for 15 sec. Effects stack up to 3 stages. -->
<icon>icon.skill0000</icon> <icon>icon.skill0000</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<abnormalLevel>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</abnormalLevel>
<abnormalTime>15</abnormalTime>
<affectRange>1000</affectRange>
<targetType>SELF</targetType>
<affectScope>PARTY</affectScope>
<affectObject>FRIEND</affectObject>
<basicProperty>NONE</basicProperty>
<magicCriticalRate>5</magicCriticalRate>
<reuseDelay>20000</reuseDelay>
<isMagic>4</isMagic>
<effects>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<type>ENEMY_ALL</type>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="33145" toLevel="1" name="Energy Breath"> <skill id="33145" toLevel="1" name="Energy Breath">
<!-- A standard attack of a monster that uses long-range magic attacks. --> <!-- A standard attack of a monster that uses long-range magic attacks. -->

View File

@@ -49,7 +49,7 @@ public class RankManager
private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 84 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 84 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CHARACTERS_BY_CLASS = "SELECT characters.charId, olympiad_nobles.olympiad_points FROM characters, olympiad_nobles WHERE olympiad_nobles.charId = characters.charId AND characters.base_class = ? ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CHARACTERS_BY_CLASS = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 84 AND characters.base_class = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>(); private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>();
private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>(); private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@@ -83,6 +83,7 @@ public class RankManager
{ {
final StatSet player = new StatSet(); final StatSet player = new StatSet();
final int charId = rset.getInt("charId"); final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId); player.set("charId", charId);
player.set("name", rset.getString("char_name")); player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level")); player.set("level", rset.getInt("level"));
@@ -91,6 +92,7 @@ public class RankManager
player.set("race", race); player.set("race", race);
loadRaceRank(charId, race, player); loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid"); final int clanId = rset.getInt("clanid");
if (clanId > 0) if (clanId > 0)
{ {
@@ -330,6 +332,20 @@ public class RankManager
return 0; return 0;
} }
public int getPlayerClassRank(PlayerInstance player)
{
final int playerOid = player.getObjectId();
for (StatSet stats : _mainList.values())
{
if (stats.getInt("charId") != playerOid)
{
continue;
}
return stats.getInt("classRank");
}
return 0;
}
public static RankManager getInstance() public static RankManager getInstance()
{ {
return SingletonHolder.INSTANCE; return SingletonHolder.INSTANCE;

View File

@@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId; private int _tabId;
private int _type; private int _type;
private int _race; private int _race;
private int _class;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC(); _tabId = packet.readC();
_type = packet.readC(); _type = packet.readC();
_race = packet.readD(); _race = packet.readD();
_class = packet.readD();
return true; return true;
} }
@@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race)); player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race, _class));
} }
} }

View File

@@ -30,6 +30,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
private int _group; private int _group;
private int _scope; private int _scope;
private int _ordinal; private int _ordinal;
private int _baseclass;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id _group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal _scope = packet.readC(); // All or personal
_ordinal = packet.readD(); _ordinal = packet.readD();
_baseclass = packet.readD();
return true; return true;
} }
@@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal)); player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal, _baseclass));
} }
} }

View File

@@ -24,6 +24,7 @@ import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory; import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope; import org.l2jmobius.gameserver.enums.RankingScope;
@@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId; private final int _tabId;
private final int _type; private final int _type;
private final int _race; private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race) public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race, int baseclass)
{ {
_player = player; _player = player;
_season = season; _season = season;
_tabId = tabId; _tabId = tabId;
_type = type; _type = type;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList(); _playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList(); _snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
} }
@@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255)) if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{ {
final RankingCategory category = RankingCategory.values()[_tabId]; final RankingCategory category = RankingCategory.values()[_tabId];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race], ClassId.values()[_class]);
} }
else else
{ {
@@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race, ClassId baseclass)
{ {
switch (category) switch (category)
{ {
@@ -101,6 +104,11 @@ public class ExPvpRankingList implements IClientOutgoingPacket
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList())); writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()));
break; break;
} }
case CLASS:
{
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()));
break;
}
} }
} }

View File

@@ -58,6 +58,7 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank packet.writeD(id); // server rank
packet.writeD(player.getInt("raceRank")); // race rank packet.writeD(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot
packet.writeD(snapshot.getInt("classRank")); // class rank snapshot
packet.writeD(0);
packet.writeD(0); packet.writeD(0);
packet.writeD(0); packet.writeD(0);
return true; return true;

View File

@@ -36,15 +36,17 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race; private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race, int baseclass)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@@ -59,7 +61,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(_race); packet.writeD(_race);
packet.writeD(_player.getClassId().getId()); packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0) if (!_playerList.isEmpty())
{ {
switch (_group) switch (_group)
{ {
@@ -79,7 +81,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(id); // server rank packet.writeD(id); // server rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -88,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -129,7 +131,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(plr.getInt("race")); packet.writeD(plr.getInt("race"));
packet.writeD(id2); // server rank packet.writeD(id2); // server rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id3 : _snapshotList.keySet()) for (Integer id3 : _snapshotList.keySet())
{ {
@@ -138,7 +140,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id3); // server rank snapshot packet.writeD(id3); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); packet.writeD(snapshot.getInt("raceRank", 0));
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -179,7 +181,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(i); // server rank packet.writeD(i); // server rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>(); final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1; int j = 1;
@@ -199,7 +201,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -207,7 +209,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(i); packet.writeD(i);
packet.writeD(i); packet.writeD(i);
packet.writeD(i); // TODO: Check this. nClassRank_Snapshot? packet.writeD(i); // nClassRank_Snapshot
} }
i++; i++;
} }
@@ -256,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank packet.writeD(id2); // server rank
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); // TODO: Check this. nClassRank_Snapshot? packet.writeD(id2); // nClassRank_Snapshot
} }
} }
} }
@@ -294,7 +296,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(id); // clan rank packet.writeD(id); // clan rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -303,7 +305,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -323,7 +325,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
} }
case 3: // friend case 3: // friend
{ {
if (_player.getFriendList().size() > 0) if (!_player.getFriendList().isEmpty())
{ {
final Set<Integer> friendList = ConcurrentHashMap.newKeySet(); final Set<Integer> friendList = ConcurrentHashMap.newKeySet();
int count = 1; int count = 1;
@@ -354,7 +356,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId")); packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race")); packet.writeD(player.getInt("race"));
packet.writeD(id); // friend rank packet.writeD(id); // friend rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -363,7 +365,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -393,7 +395,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(_player.getBaseClass()); packet.writeD(_player.getBaseClass());
packet.writeD(_player.getRace().ordinal()); packet.writeD(_player.getRace().ordinal());
packet.writeD(1); // clan rank packet.writeD(1); // clan rank
if (_snapshotList.size() > 0) if (!_snapshotList.isEmpty())
{ {
for (Integer id : _snapshotList.keySet()) for (Integer id : _snapshotList.keySet())
{ {
@@ -402,7 +404,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank snapshot packet.writeD(id); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -415,6 +417,121 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
} }
break; break;
} }
case 4: // class
{
if (_scope == 0) // all
{
int count = 0;
for (int i = 1; i <= _playerList.size(); i++)
{
final StatSet player = _playerList.get(i);
if (_class == player.getInt("classId"))
{
count++;
}
}
packet.writeD(count > 100 ? 100 : count);
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet player = _playerList.get(id);
if (_class == player.getInt("classId"))
{
packet.writeString(player.getString("name"));
packet.writeString(player.getString("clanName"));
packet.writeD(player.getInt("level"));
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(i); // server rank
if (_snapshotList.size() > 0)
{
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1;
for (Integer id2 : _snapshotList.keySet())
{
final StatSet snapshot = _snapshotList.get(id2);
if (_class == snapshot.getInt("classId"))
{
snapshotRaceList.put(j, _snapshotList.get(id2));
j++;
}
}
for (Integer id2 : snapshotRaceList.keySet())
{
final StatSet snapshot = snapshotRaceList.get(id2);
if (player.getInt("charId") == snapshot.getInt("charId"))
{
packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
}
}
}
else
{
packet.writeD(i);
packet.writeD(i);
packet.writeD(i); // nClassRank_Snapshot?
}
i++;
}
}
}
else
{
boolean found = false;
final Map<Integer, StatSet> raceList = new ConcurrentHashMap<>();
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet set = _playerList.get(id);
if (_player.getBaseClass() == set.getInt("classId"))
{
raceList.put(i, _playerList.get(id));
i++;
}
}
for (Integer id : raceList.keySet())
{
final StatSet player = raceList.get(id);
if (player.getInt("charId") == _player.getObjectId())
{
found = true;
final int first = id > 10 ? (id - 9) : 1;
final int last = raceList.size() >= (id + 10) ? id + 10 : id + (raceList.size() - id);
if (first == 1)
{
packet.writeD(last - (first - 1));
}
else
{
packet.writeD(last - first);
}
for (int id2 = first; id2 <= last; id2++)
{
final StatSet plr = raceList.get(id2);
packet.writeString(plr.getString("name"));
packet.writeString(plr.getString("clanName"));
packet.writeD(plr.getInt("level"));
packet.writeD(plr.getInt("classId"));
packet.writeD(plr.getInt("race"));
packet.writeD(id2); // server rank
packet.writeD(id2);
packet.writeD(id2);
packet.writeD(id2); // nClassRank_Snapshot?
}
}
}
if (!found)
{
packet.writeD(0);
}
}
break;
}
} }
} }
else else

View File

@@ -28,6 +28,7 @@ public enum RankingCategory
{ {
SERVER, SERVER,
RACE, RACE,
CLASS,
CLAN, CLAN,
FRIEND; FRIEND;
@@ -43,6 +44,7 @@ public enum RankingCategory
{ {
return id == 0 ? TOP_100 : SELF; return id == 0 ? TOP_100 : SELF;
} }
case CLASS:
case CLAN: case CLAN:
case FRIEND: case FRIEND:
{ {

View File

@@ -49,7 +49,7 @@ public class RankManager
private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CHARACTERS_BY_CLASS = "SELECT characters.charId, olympiad_nobles.olympiad_points FROM characters, olympiad_nobles WHERE olympiad_nobles.charId = characters.charId AND characters.base_class = ? ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CHARACTERS_BY_CLASS = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 AND characters.base_class = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>(); private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>();
private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>(); private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@@ -83,6 +83,7 @@ public class RankManager
{ {
final StatSet player = new StatSet(); final StatSet player = new StatSet();
final int charId = rset.getInt("charId"); final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId); player.set("charId", charId);
player.set("name", rset.getString("char_name")); player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level")); player.set("level", rset.getInt("level"));
@@ -91,6 +92,7 @@ public class RankManager
player.set("race", race); player.set("race", race);
loadRaceRank(charId, race, player); loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid"); final int clanId = rset.getInt("clanid");
if (clanId > 0) if (clanId > 0)
{ {
@@ -330,6 +332,20 @@ public class RankManager
return 0; return 0;
} }
public int getPlayerClassRank(PlayerInstance player)
{
final int playerOid = player.getObjectId();
for (StatSet stats : _mainList.values())
{
if (stats.getInt("charId") != playerOid)
{
continue;
}
return stats.getInt("classRank");
}
return 0;
}
public static RankManager getInstance() public static RankManager getInstance()
{ {
return SingletonHolder.INSTANCE; return SingletonHolder.INSTANCE;

View File

@@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId; private int _tabId;
private int _type; private int _type;
private int _race; private int _race;
private int _class;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC(); _tabId = packet.readC();
_type = packet.readC(); _type = packet.readC();
_race = packet.readD(); _race = packet.readD();
_class = packet.readD();
return true; return true;
} }
@@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race)); player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race, _class));
} }
} }

View File

@@ -30,6 +30,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
private int _group; private int _group;
private int _scope; private int _scope;
private int _ordinal; private int _ordinal;
private int _baseclass;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id _group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal _scope = packet.readC(); // All or personal
_ordinal = packet.readD(); _ordinal = packet.readD();
_baseclass = packet.readD();
return true; return true;
} }
@@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal)); player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal, _baseclass));
} }
} }

View File

@@ -24,6 +24,7 @@ import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory; import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope; import org.l2jmobius.gameserver.enums.RankingScope;
@@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId; private final int _tabId;
private final int _type; private final int _type;
private final int _race; private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race) public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race, int baseclass)
{ {
_player = player; _player = player;
_season = season; _season = season;
_tabId = tabId; _tabId = tabId;
_type = type; _type = type;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList(); _playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList(); _snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
} }
@@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255)) if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{ {
final RankingCategory category = RankingCategory.values()[_tabId]; final RankingCategory category = RankingCategory.values()[_tabId];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race], ClassId.values()[_class]);
} }
else else
{ {
@@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race, ClassId baseclass)
{ {
switch (category) switch (category)
{ {
@@ -101,6 +104,11 @@ public class ExPvpRankingList implements IClientOutgoingPacket
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList())); writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()));
break; break;
} }
case CLASS:
{
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()));
break;
}
} }
} }

View File

@@ -58,6 +58,7 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank packet.writeD(id); // server rank
packet.writeD(player.getInt("raceRank")); // race rank packet.writeD(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot
packet.writeD(snapshot.getInt("classRank")); // class rank snapshot
packet.writeD(0);
packet.writeD(0); packet.writeD(0);
packet.writeD(0); packet.writeD(0);
return true; return true;

View File

@@ -33,20 +33,20 @@ import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
public class ExRankingCharRankers implements IClientOutgoingPacket public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final int _race;
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race, int baseclass)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@@ -90,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -140,7 +140,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id3); // server rank snapshot packet.writeD(id3); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); packet.writeD(snapshot.getInt("raceRank", 0));
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -201,7 +201,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -209,7 +209,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(i); packet.writeD(i);
packet.writeD(i); packet.writeD(i);
packet.writeD(i); // TODO: Check this. nClassRank_Snapshot? packet.writeD(i); // nClassRank_Snapshot
} }
i++; i++;
} }
@@ -258,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank packet.writeD(id2); // server rank
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); // TODO: Check this. nClassRank_Snapshot? packet.writeD(id2); // nClassRank_Snapshot
} }
} }
} }
@@ -305,7 +305,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -365,7 +365,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -404,7 +404,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank snapshot packet.writeD(id); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -417,6 +417,121 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
} }
break; break;
} }
case 4: // class
{
if (_scope == 0) // all
{
int count = 0;
for (int i = 1; i <= _playerList.size(); i++)
{
final StatSet player = _playerList.get(i);
if (_class == player.getInt("classId"))
{
count++;
}
}
packet.writeD(count > 100 ? 100 : count);
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet player = _playerList.get(id);
if (_class == player.getInt("classId"))
{
packet.writeString(player.getString("name"));
packet.writeString(player.getString("clanName"));
packet.writeD(player.getInt("level"));
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(i); // server rank
if (_snapshotList.size() > 0)
{
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1;
for (Integer id2 : _snapshotList.keySet())
{
final StatSet snapshot = _snapshotList.get(id2);
if (_class == snapshot.getInt("classId"))
{
snapshotRaceList.put(j, _snapshotList.get(id2));
j++;
}
}
for (Integer id2 : snapshotRaceList.keySet())
{
final StatSet snapshot = snapshotRaceList.get(id2);
if (player.getInt("charId") == snapshot.getInt("charId"))
{
packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
}
}
}
else
{
packet.writeD(i);
packet.writeD(i);
packet.writeD(i); // nClassRank_Snapshot?
}
i++;
}
}
}
else
{
boolean found = false;
final Map<Integer, StatSet> raceList = new ConcurrentHashMap<>();
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet set = _playerList.get(id);
if (_player.getBaseClass() == set.getInt("classId"))
{
raceList.put(i, _playerList.get(id));
i++;
}
}
for (Integer id : raceList.keySet())
{
final StatSet player = raceList.get(id);
if (player.getInt("charId") == _player.getObjectId())
{
found = true;
final int first = id > 10 ? (id - 9) : 1;
final int last = raceList.size() >= (id + 10) ? id + 10 : id + (raceList.size() - id);
if (first == 1)
{
packet.writeD(last - (first - 1));
}
else
{
packet.writeD(last - first);
}
for (int id2 = first; id2 <= last; id2++)
{
final StatSet plr = raceList.get(id2);
packet.writeString(plr.getString("name"));
packet.writeString(plr.getString("clanName"));
packet.writeD(plr.getInt("level"));
packet.writeD(plr.getInt("classId"));
packet.writeD(plr.getInt("race"));
packet.writeD(id2); // server rank
packet.writeD(id2);
packet.writeD(id2);
packet.writeD(id2); // nClassRank_Snapshot?
}
}
}
if (!found)
{
packet.writeD(0);
}
}
break;
}
} }
} }
else else

View File

@@ -28,6 +28,7 @@ public enum RankingCategory
{ {
SERVER, SERVER,
RACE, RACE,
CLASS,
CLAN, CLAN,
FRIEND; FRIEND;
@@ -43,6 +44,7 @@ public enum RankingCategory
{ {
return id == 0 ? TOP_100 : SELF; return id == 0 ? TOP_100 : SELF;
} }
case CLASS:
case CLAN: case CLAN:
case FRIEND: case FRIEND:
{ {

View File

@@ -52,7 +52,7 @@ public class RankManager
private static final String SELECT_CLANS = "SELECT characters.level, characters.char_name, clan_data.clan_id, clan_data.clan_level, clan_data.clan_name, clan_data.reputation_score, clan_data.exp FROM characters, clan_data WHERE characters.charId = clan_data.leader_id AND characters.clanid = clan_data.clan_id AND dissolving_expiry_time = 0 ORDER BY exp DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CLANS = "SELECT characters.level, characters.char_name, clan_data.clan_id, clan_data.clan_level, clan_data.clan_name, clan_data.reputation_score, clan_data.exp FROM characters, clan_data WHERE characters.charId = clan_data.leader_id AND characters.clanid = clan_data.clan_id AND dissolving_expiry_time = 0 ORDER BY exp DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CHARACTERS_BY_CLASS = "SELECT characters.charId, olympiad_nobles.olympiad_points FROM characters, olympiad_nobles WHERE olympiad_nobles.charId = characters.charId AND characters.base_class = ? ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CHARACTERS_BY_CLASS = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 AND characters.base_class = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>(); private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>();
private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>(); private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@@ -94,6 +94,7 @@ public class RankManager
{ {
final StatSet player = new StatSet(); final StatSet player = new StatSet();
final int charId = rset.getInt("charId"); final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId); player.set("charId", charId);
player.set("name", rset.getString("char_name")); player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level")); player.set("level", rset.getInt("level"));
@@ -102,6 +103,7 @@ public class RankManager
player.set("race", race); player.set("race", race);
loadRaceRank(charId, race, player); loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid"); final int clanId = rset.getInt("clanid");
if (clanId > 0) if (clanId > 0)
{ {
@@ -415,6 +417,20 @@ public class RankManager
return 0; return 0;
} }
public int getPlayerClassRank(PlayerInstance player)
{
final int playerOid = player.getObjectId();
for (StatSet stats : _mainList.values())
{
if (stats.getInt("charId") != playerOid)
{
continue;
}
return stats.getInt("classRank");
}
return 0;
}
public static RankManager getInstance() public static RankManager getInstance()
{ {
return SingletonHolder.INSTANCE; return SingletonHolder.INSTANCE;

View File

@@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId; private int _tabId;
private int _type; private int _type;
private int _race; private int _race;
private int _class;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC(); _tabId = packet.readC();
_type = packet.readC(); _type = packet.readC();
_race = packet.readD(); _race = packet.readD();
_class = packet.readD();
return true; return true;
} }
@@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race)); player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race, _class));
} }
} }

View File

@@ -30,6 +30,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
private int _group; private int _group;
private int _scope; private int _scope;
private int _ordinal; private int _ordinal;
private int _baseclass;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id _group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal _scope = packet.readC(); // All or personal
_ordinal = packet.readD(); _ordinal = packet.readD();
_baseclass = packet.readD();
return true; return true;
} }
@@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal)); player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal, _baseclass));
} }
} }

View File

@@ -24,6 +24,7 @@ import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory; import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope; import org.l2jmobius.gameserver.enums.RankingScope;
@@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId; private final int _tabId;
private final int _type; private final int _type;
private final int _race; private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race) public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race, int baseclass)
{ {
_player = player; _player = player;
_season = season; _season = season;
_tabId = tabId; _tabId = tabId;
_type = type; _type = type;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList(); _playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList(); _snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
} }
@@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255)) if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{ {
final RankingCategory category = RankingCategory.values()[_tabId]; final RankingCategory category = RankingCategory.values()[_tabId];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race], ClassId.values()[_class]);
} }
else else
{ {
@@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race, ClassId baseclass)
{ {
switch (category) switch (category)
{ {
@@ -101,6 +104,11 @@ public class ExPvpRankingList implements IClientOutgoingPacket
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList())); writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()));
break; break;
} }
case CLASS:
{
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()));
break;
}
} }
} }

View File

@@ -58,6 +58,7 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank packet.writeD(id); // server rank
packet.writeD(player.getInt("raceRank")); // race rank packet.writeD(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot
packet.writeD(snapshot.getInt("classRank")); // class rank snapshot
packet.writeD(0);
packet.writeD(0); packet.writeD(0);
packet.writeD(0); packet.writeD(0);
return true; return true;

View File

@@ -33,20 +33,20 @@ import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
public class ExRankingCharRankers implements IClientOutgoingPacket public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final int _race;
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race, int baseclass)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@@ -90,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -140,7 +140,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id3); // server rank snapshot packet.writeD(id3); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); packet.writeD(snapshot.getInt("raceRank", 0));
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -201,7 +201,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -209,7 +209,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(i); packet.writeD(i);
packet.writeD(i); packet.writeD(i);
packet.writeD(i); // TODO: Check this. nClassRank_Snapshot? packet.writeD(i); // nClassRank_Snapshot
} }
i++; i++;
} }
@@ -258,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank packet.writeD(id2); // server rank
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); // TODO: Check this. nClassRank_Snapshot? packet.writeD(id2); // nClassRank_Snapshot
} }
} }
} }
@@ -305,7 +305,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -365,7 +365,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -404,7 +404,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank snapshot packet.writeD(id); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -417,6 +417,121 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
} }
break; break;
} }
case 4: // class
{
if (_scope == 0) // all
{
int count = 0;
for (int i = 1; i <= _playerList.size(); i++)
{
final StatSet player = _playerList.get(i);
if (_class == player.getInt("classId"))
{
count++;
}
}
packet.writeD(count > 100 ? 100 : count);
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet player = _playerList.get(id);
if (_class == player.getInt("classId"))
{
packet.writeString(player.getString("name"));
packet.writeString(player.getString("clanName"));
packet.writeD(player.getInt("level"));
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(i); // server rank
if (_snapshotList.size() > 0)
{
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1;
for (Integer id2 : _snapshotList.keySet())
{
final StatSet snapshot = _snapshotList.get(id2);
if (_class == snapshot.getInt("classId"))
{
snapshotRaceList.put(j, _snapshotList.get(id2));
j++;
}
}
for (Integer id2 : snapshotRaceList.keySet())
{
final StatSet snapshot = snapshotRaceList.get(id2);
if (player.getInt("charId") == snapshot.getInt("charId"))
{
packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
}
}
}
else
{
packet.writeD(i);
packet.writeD(i);
packet.writeD(i); // nClassRank_Snapshot?
}
i++;
}
}
}
else
{
boolean found = false;
final Map<Integer, StatSet> raceList = new ConcurrentHashMap<>();
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet set = _playerList.get(id);
if (_player.getBaseClass() == set.getInt("classId"))
{
raceList.put(i, _playerList.get(id));
i++;
}
}
for (Integer id : raceList.keySet())
{
final StatSet player = raceList.get(id);
if (player.getInt("charId") == _player.getObjectId())
{
found = true;
final int first = id > 10 ? (id - 9) : 1;
final int last = raceList.size() >= (id + 10) ? id + 10 : id + (raceList.size() - id);
if (first == 1)
{
packet.writeD(last - (first - 1));
}
else
{
packet.writeD(last - first);
}
for (int id2 = first; id2 <= last; id2++)
{
final StatSet plr = raceList.get(id2);
packet.writeString(plr.getString("name"));
packet.writeString(plr.getString("clanName"));
packet.writeD(plr.getInt("level"));
packet.writeD(plr.getInt("classId"));
packet.writeD(plr.getInt("race"));
packet.writeD(id2); // server rank
packet.writeD(id2);
packet.writeD(id2);
packet.writeD(id2); // nClassRank_Snapshot?
}
}
}
if (!found)
{
packet.writeD(0);
}
}
break;
}
} }
} }
else else

View File

@@ -28,6 +28,7 @@ public enum RankingCategory
{ {
SERVER, SERVER,
RACE, RACE,
CLASS,
CLAN, CLAN,
FRIEND; FRIEND;
@@ -43,6 +44,7 @@ public enum RankingCategory
{ {
return id == 0 ? TOP_100 : SELF; return id == 0 ? TOP_100 : SELF;
} }
case CLASS:
case CLAN: case CLAN:
case FRIEND: case FRIEND:
{ {

View File

@@ -52,7 +52,7 @@ public class RankManager
private static final String SELECT_CLANS = "SELECT characters.level, characters.char_name, clan_data.clan_id, clan_data.clan_level, clan_data.clan_name, clan_data.reputation_score, clan_data.exp FROM characters, clan_data WHERE characters.charId = clan_data.leader_id AND characters.clanid = clan_data.clan_id AND dissolving_expiry_time = 0 ORDER BY exp DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CLANS = "SELECT characters.level, characters.char_name, clan_data.clan_id, clan_data.clan_level, clan_data.clan_name, clan_data.reputation_score, clan_data.exp FROM characters, clan_data WHERE characters.charId = clan_data.leader_id AND characters.clanid = clan_data.clan_id AND dissolving_expiry_time = 0 ORDER BY exp DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT;
private static final String GET_CHARACTERS_BY_CLASS = "SELECT characters.charId, olympiad_nobles.olympiad_points FROM characters, olympiad_nobles WHERE olympiad_nobles.charId = characters.charId AND characters.base_class = ? ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CHARACTERS_BY_CLASS = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 AND characters.base_class = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT;
private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>(); private final Map<Integer, StatSet> _mainList = new ConcurrentHashMap<>();
private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>(); private Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@@ -94,6 +94,7 @@ public class RankManager
{ {
final StatSet player = new StatSet(); final StatSet player = new StatSet();
final int charId = rset.getInt("charId"); final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId); player.set("charId", charId);
player.set("name", rset.getString("char_name")); player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level")); player.set("level", rset.getInt("level"));
@@ -102,6 +103,7 @@ public class RankManager
player.set("race", race); player.set("race", race);
loadRaceRank(charId, race, player); loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid"); final int clanId = rset.getInt("clanid");
if (clanId > 0) if (clanId > 0)
{ {
@@ -415,6 +417,20 @@ public class RankManager
return 0; return 0;
} }
public int getPlayerClassRank(PlayerInstance player)
{
final int playerOid = player.getObjectId();
for (StatSet stats : _mainList.values())
{
if (stats.getInt("charId") != playerOid)
{
continue;
}
return stats.getInt("classRank");
}
return 0;
}
public static RankManager getInstance() public static RankManager getInstance()
{ {
return SingletonHolder.INSTANCE; return SingletonHolder.INSTANCE;

View File

@@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId; private int _tabId;
private int _type; private int _type;
private int _race; private int _race;
private int _class;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC(); _tabId = packet.readC();
_type = packet.readC(); _type = packet.readC();
_race = packet.readD(); _race = packet.readD();
_class = packet.readD();
return true; return true;
} }
@@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race)); player.sendPacket(new ExPvpRankingList(player, _season, _tabId, _type, _race, _class));
} }
} }

View File

@@ -30,6 +30,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
private int _group; private int _group;
private int _scope; private int _scope;
private int _ordinal; private int _ordinal;
private int _baseclass;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
@@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id _group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal _scope = packet.readC(); // All or personal
_ordinal = packet.readD(); _ordinal = packet.readD();
_baseclass = packet.readD();
return true; return true;
} }
@@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
return; return;
} }
player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal)); player.sendPacket(new ExRankingCharRankers(player, _group, _scope, _ordinal, _baseclass));
} }
} }

View File

@@ -24,6 +24,7 @@ import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory; import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope; import org.l2jmobius.gameserver.enums.RankingScope;
@@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId; private final int _tabId;
private final int _type; private final int _type;
private final int _race; private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race) public ExPvpRankingList(PlayerInstance player, int season, int tabId, int type, int race, int baseclass)
{ {
_player = player; _player = player;
_season = season; _season = season;
_tabId = tabId; _tabId = tabId;
_type = type; _type = type;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList(); _playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList(); _snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
} }
@@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255)) if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{ {
final RankingCategory category = RankingCategory.values()[_tabId]; final RankingCategory category = RankingCategory.values()[_tabId];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_type), Race.values()[_race], ClassId.values()[_class]);
} }
else else
{ {
@@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race, ClassId baseclass)
{ {
switch (category) switch (category)
{ {
@@ -101,6 +104,11 @@ public class ExPvpRankingList implements IClientOutgoingPacket
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList())); writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> _player.getFriendList().contains(it.getValue().getInt("charId"))).collect(Collectors.toList()));
break; break;
} }
case CLASS:
{
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == baseclass.ordinal()).collect(Collectors.toList()));
break;
}
} }
} }

View File

@@ -58,6 +58,7 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank packet.writeD(id); // server rank
packet.writeD(player.getInt("raceRank")); // race rank packet.writeD(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet()) for (Integer id2 : _snapshotList.keySet())
{ {
@@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot packet.writeD(snapshot.getInt("raceRank")); // race rank snapshot
packet.writeD(snapshot.getInt("classRank")); // class rank snapshot
packet.writeD(0);
packet.writeD(0); packet.writeD(0);
packet.writeD(0); packet.writeD(0);
return true; return true;

View File

@@ -33,20 +33,20 @@ import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
public class ExRankingCharRankers implements IClientOutgoingPacket public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final int _race;
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race, int baseclass)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@@ -90,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -140,7 +140,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id3); // server rank snapshot packet.writeD(id3); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); packet.writeD(snapshot.getInt("raceRank", 0));
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -201,7 +201,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -209,7 +209,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(i); packet.writeD(i);
packet.writeD(i); packet.writeD(i);
packet.writeD(i); // TODO: Check this. nClassRank_Snapshot? packet.writeD(i); // nClassRank_Snapshot
} }
i++; i++;
} }
@@ -258,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank packet.writeD(id2); // server rank
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); packet.writeD(id2);
packet.writeD(id2); // TODO: Check this. nClassRank_Snapshot? packet.writeD(id2); // nClassRank_Snapshot
} }
} }
} }
@@ -305,7 +305,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -365,7 +365,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id2); // server rank snapshot packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -404,7 +404,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{ {
packet.writeD(id); // server rank snapshot packet.writeD(id); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(0); // TODO: nClassRank_Snapshot packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
} }
} }
} }
@@ -417,6 +417,121 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
} }
break; break;
} }
case 4: // class
{
if (_scope == 0) // all
{
int count = 0;
for (int i = 1; i <= _playerList.size(); i++)
{
final StatSet player = _playerList.get(i);
if (_class == player.getInt("classId"))
{
count++;
}
}
packet.writeD(count > 100 ? 100 : count);
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet player = _playerList.get(id);
if (_class == player.getInt("classId"))
{
packet.writeString(player.getString("name"));
packet.writeString(player.getString("clanName"));
packet.writeD(player.getInt("level"));
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(i); // server rank
if (_snapshotList.size() > 0)
{
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1;
for (Integer id2 : _snapshotList.keySet())
{
final StatSet snapshot = _snapshotList.get(id2);
if (_class == snapshot.getInt("classId"))
{
snapshotRaceList.put(j, _snapshotList.get(id2));
j++;
}
}
for (Integer id2 : snapshotRaceList.keySet())
{
final StatSet snapshot = snapshotRaceList.get(id2);
if (player.getInt("charId") == snapshot.getInt("charId"))
{
packet.writeD(id2); // server rank snapshot
packet.writeD(snapshot.getInt("raceRank", 0)); // race rank snapshot
packet.writeD(snapshot.getInt("classRank", 0)); // nClassRank_Snapshot
}
}
}
else
{
packet.writeD(i);
packet.writeD(i);
packet.writeD(i); // nClassRank_Snapshot?
}
i++;
}
}
}
else
{
boolean found = false;
final Map<Integer, StatSet> raceList = new ConcurrentHashMap<>();
int i = 1;
for (Integer id : _playerList.keySet())
{
final StatSet set = _playerList.get(id);
if (_player.getBaseClass() == set.getInt("classId"))
{
raceList.put(i, _playerList.get(id));
i++;
}
}
for (Integer id : raceList.keySet())
{
final StatSet player = raceList.get(id);
if (player.getInt("charId") == _player.getObjectId())
{
found = true;
final int first = id > 10 ? (id - 9) : 1;
final int last = raceList.size() >= (id + 10) ? id + 10 : id + (raceList.size() - id);
if (first == 1)
{
packet.writeD(last - (first - 1));
}
else
{
packet.writeD(last - first);
}
for (int id2 = first; id2 <= last; id2++)
{
final StatSet plr = raceList.get(id2);
packet.writeString(plr.getString("name"));
packet.writeString(plr.getString("clanName"));
packet.writeD(plr.getInt("level"));
packet.writeD(plr.getInt("classId"));
packet.writeD(plr.getInt("race"));
packet.writeD(id2); // server rank
packet.writeD(id2);
packet.writeD(id2);
packet.writeD(id2); // nClassRank_Snapshot?
}
}
}
if (!found)
{
packet.writeD(0);
}
}
break;
}
} }
} }
else else