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_3 = SkillData.getInstance().getSkill(32886, 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)
@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, KAMAEL_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_2);
player.removeSkill(SERVER_RANKING_BENEFIT_3);
player.removeSkill(RACE_RANKING_BENEFIT);
player.removeSkill(CLASS_RANKING_BENEFIT);
// Add global rank skills.
int rank = RankManager.getInstance().getPlayerGlobalRank(player);
@ -143,6 +161,45 @@ public class RankingSkillBonuses extends AbstractNpcAI
}
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)

View File

@ -133,47 +133,271 @@
<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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 id="33135" toLevel="1" name="I'm so mad!">
<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">
<!-- Damage +$s1 for 15 sec. -->
<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 id="33138" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Rogue">
<!-- Damage from behind +$s1 for 15 sec. -->
<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 id="33139" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Archer">
<!-- P. Skill Power +$s1 for 15 sec. -->
<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 id="33140" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Mage">
<!-- M. Skill Power +$s1 for 15 sec. -->
<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 id="33141" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Summoner">
<!-- For 15 sec., P./ M. Atk. +$s1. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 id="33145" toLevel="1" name="Energy Breath">
<!-- 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 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 Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@ -83,6 +83,7 @@ public class RankManager
{
final StatSet player = new StatSet();
final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId);
player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level"));
@ -91,6 +92,7 @@ public class RankManager
player.set("race", race);
loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid");
if (clanId > 0)
{
@ -330,6 +332,20 @@ public class RankManager
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()
{
return SingletonHolder.INSTANCE;

View File

@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId;
private int _type;
private int _race;
private int _class;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC();
_type = packet.readC();
_race = packet.readD();
_class = packet.readD();
return true;
}
@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
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 _scope;
private int _ordinal;
private int _baseclass;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal
_ordinal = packet.readD();
_baseclass = packet.readD();
return true;
}
@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
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 org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope;
@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId;
private final int _type;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_season = season;
_tabId = tabId;
_type = type;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
}
@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{
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
{
@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
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)
{
@ -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()));
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(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet())
{
@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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);
return true;

View File

@ -36,15 +36,17 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final int _group;
private final int _scope;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_group = group;
_scope = scope;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList();
}
@ -59,7 +61,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(_race);
packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0)
if (!_playerList.isEmpty())
{
switch (_group)
{
@ -79,7 +81,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(id); // server rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id2 : _snapshotList.keySet())
{
@ -88,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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(id2); // server rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id3 : _snapshotList.keySet())
{
@ -138,7 +140,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id3); // server rank snapshot
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("race"));
packet.writeD(i); // server rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1;
@ -199,7 +201,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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); // TODO: Check this. nClassRank_Snapshot?
packet.writeD(i); // nClassRank_Snapshot
}
i++;
}
@ -256,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank
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("race"));
packet.writeD(id); // clan rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id2 : _snapshotList.keySet())
{
@ -303,7 +305,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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
{
if (_player.getFriendList().size() > 0)
if (!_player.getFriendList().isEmpty())
{
final Set<Integer> friendList = ConcurrentHashMap.newKeySet();
int count = 1;
@ -354,7 +356,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(id); // friend rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id2 : _snapshotList.keySet())
{
@ -363,7 +365,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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.getRace().ordinal());
packet.writeD(1); // clan rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id : _snapshotList.keySet())
{
@ -402,7 +404,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id); // server 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;
}
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

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_3 = SkillData.getInstance().getSkill(32886, 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)
@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, KAMAEL_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_2);
player.removeSkill(SERVER_RANKING_BENEFIT_3);
player.removeSkill(RACE_RANKING_BENEFIT);
player.removeSkill(CLASS_RANKING_BENEFIT);
// Add global rank skills.
int rank = RankManager.getInstance().getPlayerGlobalRank(player);
@ -143,6 +161,45 @@ public class RankingSkillBonuses extends AbstractNpcAI
}
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)

View File

@ -133,47 +133,271 @@
<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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 id="33135" toLevel="1" name="I'm so mad!">
<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">
<!-- Damage +$s1 for 15 sec. -->
<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 id="33138" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Rogue">
<!-- Damage from behind +$s1 for 15 sec. -->
<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 id="33139" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Archer">
<!-- P. Skill Power +$s1 for 15 sec. -->
<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 id="33140" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Mage">
<!-- M. Skill Power +$s1 for 15 sec. -->
<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 id="33141" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Summoner">
<!-- For 15 sec., P./ M. Atk. +$s1. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 id="33145" toLevel="1" name="Energy Breath">
<!-- 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 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 Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@ -83,6 +83,7 @@ public class RankManager
{
final StatSet player = new StatSet();
final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId);
player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level"));
@ -91,6 +92,7 @@ public class RankManager
player.set("race", race);
loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid");
if (clanId > 0)
{
@ -330,6 +332,20 @@ public class RankManager
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()
{
return SingletonHolder.INSTANCE;

View File

@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId;
private int _type;
private int _race;
private int _class;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC();
_type = packet.readC();
_race = packet.readD();
_class = packet.readD();
return true;
}
@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
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 _scope;
private int _ordinal;
private int _baseclass;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal
_ordinal = packet.readD();
_baseclass = packet.readD();
return true;
}
@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
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 org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope;
@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId;
private final int _type;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_season = season;
_tabId = tabId;
_type = type;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
}
@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{
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
{
@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
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)
{
@ -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()));
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(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet())
{
@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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);
return true;

View File

@ -36,15 +36,17 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final int _group;
private final int _scope;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_group = group;
_scope = scope;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList();
}
@ -59,7 +61,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(_race);
packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0)
if (!_playerList.isEmpty())
{
switch (_group)
{
@ -79,7 +81,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(id); // server rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id2 : _snapshotList.keySet())
{
@ -88,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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(id2); // server rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id3 : _snapshotList.keySet())
{
@ -138,7 +140,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id3); // server rank snapshot
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("race"));
packet.writeD(i); // server rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1;
@ -199,7 +201,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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); // TODO: Check this. nClassRank_Snapshot?
packet.writeD(i); // nClassRank_Snapshot
}
i++;
}
@ -256,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank
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("race"));
packet.writeD(id); // clan rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id2 : _snapshotList.keySet())
{
@ -303,7 +305,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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
{
if (_player.getFriendList().size() > 0)
if (!_player.getFriendList().isEmpty())
{
final Set<Integer> friendList = ConcurrentHashMap.newKeySet();
int count = 1;
@ -354,7 +356,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(id); // friend rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id2 : _snapshotList.keySet())
{
@ -363,7 +365,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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.getRace().ordinal());
packet.writeD(1); // clan rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id : _snapshotList.keySet())
{
@ -402,7 +404,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id); // server 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;
}
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

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_3 = SkillData.getInstance().getSkill(32886, 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)
@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, KAMAEL_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_2);
player.removeSkill(SERVER_RANKING_BENEFIT_3);
player.removeSkill(RACE_RANKING_BENEFIT);
player.removeSkill(CLASS_RANKING_BENEFIT);
// Add global rank skills.
int rank = RankManager.getInstance().getPlayerGlobalRank(player);
@ -143,6 +161,45 @@ public class RankingSkillBonuses extends AbstractNpcAI
}
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)

View File

@ -133,47 +133,271 @@
<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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 id="33135" toLevel="1" name="I'm so mad!">
<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">
<!-- Damage +$s1 for 15 sec. -->
<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 id="33138" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Rogue">
<!-- Damage from behind +$s1 for 15 sec. -->
<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 id="33139" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Archer">
<!-- P. Skill Power +$s1 for 15 sec. -->
<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 id="33140" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Mage">
<!-- M. Skill Power +$s1 for 15 sec. -->
<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 id="33141" toLevel="1" name="Protection of 1st Place in the List of Ranks for Level - Summoner">
<!-- For 15 sec., P./ M. Atk. +$s1. -->
<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 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. -->
<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 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. -->
<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 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. -->
<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 id="33145" toLevel="1" name="Energy Breath">
<!-- 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 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 Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@ -83,6 +83,7 @@ public class RankManager
{
final StatSet player = new StatSet();
final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId);
player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level"));
@ -91,6 +92,7 @@ public class RankManager
player.set("race", race);
loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid");
if (clanId > 0)
{
@ -330,6 +332,20 @@ public class RankManager
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()
{
return SingletonHolder.INSTANCE;

View File

@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId;
private int _type;
private int _race;
private int _class;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC();
_type = packet.readC();
_race = packet.readD();
_class = packet.readD();
return true;
}
@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
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 _scope;
private int _ordinal;
private int _baseclass;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal
_ordinal = packet.readD();
_baseclass = packet.readD();
return true;
}
@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
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 org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope;
@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId;
private final int _type;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_season = season;
_tabId = tabId;
_type = type;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
}
@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{
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
{
@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
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)
{
@ -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()));
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(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet())
{
@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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);
return true;

View File

@ -36,15 +36,17 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final int _group;
private final int _scope;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_group = group;
_scope = scope;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList();
}
@ -59,7 +61,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(_race);
packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0)
if (!_playerList.isEmpty())
{
switch (_group)
{
@ -79,7 +81,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(id); // server rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id2 : _snapshotList.keySet())
{
@ -88,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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(id2); // server rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id3 : _snapshotList.keySet())
{
@ -138,7 +140,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id3); // server rank snapshot
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("race"));
packet.writeD(i); // server rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
final Map<Integer, StatSet> snapshotRaceList = new ConcurrentHashMap<>();
int j = 1;
@ -199,7 +201,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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); // TODO: Check this. nClassRank_Snapshot?
packet.writeD(i); // nClassRank_Snapshot
}
i++;
}
@ -256,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank
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("race"));
packet.writeD(id); // clan rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id2 : _snapshotList.keySet())
{
@ -303,7 +305,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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
{
if (_player.getFriendList().size() > 0)
if (!_player.getFriendList().isEmpty())
{
final Set<Integer> friendList = ConcurrentHashMap.newKeySet();
int count = 1;
@ -354,7 +356,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(player.getInt("classId"));
packet.writeD(player.getInt("race"));
packet.writeD(id); // friend rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id2 : _snapshotList.keySet())
{
@ -363,7 +365,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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.getRace().ordinal());
packet.writeD(1); // clan rank
if (_snapshotList.size() > 0)
if (!_snapshotList.isEmpty())
{
for (Integer id : _snapshotList.keySet())
{
@ -402,7 +404,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id); // server 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;
}
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

View File

@ -28,6 +28,7 @@ public enum RankingCategory
{
SERVER,
RACE,
CLASS,
CLAN,
FRIEND;
@ -43,6 +44,7 @@ public enum RankingCategory
{
return id == 0 ? TOP_100 : SELF;
}
case CLASS:
case CLAN:
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 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 Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@ -83,6 +83,7 @@ public class RankManager
{
final StatSet player = new StatSet();
final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId);
player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level"));
@ -91,6 +92,7 @@ public class RankManager
player.set("race", race);
loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid");
if (clanId > 0)
{
@ -330,6 +332,20 @@ public class RankManager
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()
{
return SingletonHolder.INSTANCE;

View File

@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId;
private int _type;
private int _race;
private int _class;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC();
_type = packet.readC();
_race = packet.readD();
_class = packet.readD();
return true;
}
@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
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 _scope;
private int _ordinal;
private int _baseclass;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal
_ordinal = packet.readD();
_baseclass = packet.readD();
return true;
}
@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
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 org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope;
@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId;
private final int _type;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_season = season;
_tabId = tabId;
_type = type;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
}
@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{
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
{
@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
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)
{
@ -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()));
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(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet())
{
@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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);
return true;

View File

@ -33,20 +33,20 @@ import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
public class ExRankingCharRankers implements IClientOutgoingPacket
{
private final PlayerInstance _player;
private final int _race;
private final int _group;
private final int _scope;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_group = group;
_scope = scope;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList();
}
@ -90,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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(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(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); // TODO: Check this. nClassRank_Snapshot?
packet.writeD(i); // nClassRank_Snapshot
}
i++;
}
@ -258,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank
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(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(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(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;
}
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

View File

@ -28,6 +28,7 @@ public enum RankingCategory
{
SERVER,
RACE,
CLASS,
CLAN,
FRIEND;
@ -43,6 +44,7 @@ public enum RankingCategory
{
return id == 0 ? TOP_100 : SELF;
}
case CLASS:
case CLAN:
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 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 Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@ -94,6 +94,7 @@ public class RankManager
{
final StatSet player = new StatSet();
final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId);
player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level"));
@ -102,6 +103,7 @@ public class RankManager
player.set("race", race);
loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid");
if (clanId > 0)
{
@ -415,6 +417,20 @@ public class RankManager
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()
{
return SingletonHolder.INSTANCE;

View File

@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId;
private int _type;
private int _race;
private int _class;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC();
_type = packet.readC();
_race = packet.readD();
_class = packet.readD();
return true;
}
@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
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 _scope;
private int _ordinal;
private int _baseclass;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal
_ordinal = packet.readD();
_baseclass = packet.readD();
return true;
}
@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
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 org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope;
@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId;
private final int _type;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_season = season;
_tabId = tabId;
_type = type;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
}
@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{
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
{
@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
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)
{
@ -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()));
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(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet())
{
@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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);
return true;

View File

@ -33,20 +33,20 @@ import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
public class ExRankingCharRankers implements IClientOutgoingPacket
{
private final PlayerInstance _player;
private final int _race;
private final int _group;
private final int _scope;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_group = group;
_scope = scope;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList();
}
@ -90,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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(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(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); // TODO: Check this. nClassRank_Snapshot?
packet.writeD(i); // nClassRank_Snapshot
}
i++;
}
@ -258,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank
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(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(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(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;
}
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

View File

@ -28,6 +28,7 @@ public enum RankingCategory
{
SERVER,
RACE,
CLASS,
CLAN,
FRIEND;
@ -43,6 +44,7 @@ public enum RankingCategory
{
return id == 0 ? TOP_100 : SELF;
}
case CLASS:
case CLAN:
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 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 Map<Integer, StatSet> _snapshotList = new ConcurrentHashMap<>();
@ -94,6 +94,7 @@ public class RankManager
{
final StatSet player = new StatSet();
final int charId = rset.getInt("charId");
final int classId = rset.getInt("base_class");
player.set("charId", charId);
player.set("name", rset.getString("char_name"));
player.set("level", rset.getInt("level"));
@ -102,6 +103,7 @@ public class RankManager
player.set("race", race);
loadRaceRank(charId, race, player);
loadClassRank(charId, classId, player);
final int clanId = rset.getInt("clanid");
if (clanId > 0)
{
@ -415,6 +417,20 @@ public class RankManager
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()
{
return SingletonHolder.INSTANCE;

View File

@ -31,6 +31,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
private int _tabId;
private int _type;
private int _race;
private int _class;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -39,6 +40,7 @@ public class RequestPvpRankingList implements IClientIncomingPacket
_tabId = packet.readC();
_type = packet.readC();
_race = packet.readD();
_class = packet.readD();
return true;
}
@ -51,6 +53,6 @@ public class RequestPvpRankingList implements IClientIncomingPacket
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 _scope;
private int _ordinal;
private int _baseclass;
@Override
public boolean read(GameClient client, PacketReader packet)
@ -37,6 +38,7 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
_group = packet.readC(); // Tab Id
_scope = packet.readC(); // All or personal
_ordinal = packet.readD();
_baseclass = packet.readD();
return true;
}
@ -49,6 +51,6 @@ public class RequestRankingCharRankers implements IClientIncomingPacket
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 org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope;
@ -43,16 +44,18 @@ public class ExPvpRankingList implements IClientOutgoingPacket
private final int _tabId;
private final int _type;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_season = season;
_tabId = tabId;
_type = type;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getPvpRankList();
_snapshotList = RankManager.getInstance().getSnapshotPvpRankList();
}
@ -68,7 +71,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
if (!_playerList.isEmpty() && (_type != 255) && (_race != 255))
{
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
{
@ -77,7 +80,7 @@ public class ExPvpRankingList implements IClientOutgoingPacket
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)
{
@ -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()));
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(player.getInt("raceRank")); // race rank
packet.writeD(player.getInt("classRank")); // class rank
for (Integer id2 : _snapshotList.keySet())
{
@ -66,6 +67,8 @@ public class ExRankingCharInfo implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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);
return true;

View File

@ -33,20 +33,20 @@ import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
public class ExRankingCharRankers implements IClientOutgoingPacket
{
private final PlayerInstance _player;
private final int _race;
private final int _group;
private final int _scope;
private final int _race;
private final int _class;
private final Map<Integer, StatSet> _playerList;
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;
_group = group;
_scope = scope;
_race = race;
_class = baseclass;
_playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList();
}
@ -90,7 +90,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
{
packet.writeD(id2); // server 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(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(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); // TODO: Check this. nClassRank_Snapshot?
packet.writeD(i); // nClassRank_Snapshot
}
i++;
}
@ -258,7 +258,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeD(id2); // server rank
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(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(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(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;
}
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