Class ranking additions.
Contributed by Sero and nasseka.
This commit is contained in:
parent
e16b6f6cb4
commit
509e0cf035
@ -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)
|
||||
|
@ -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. -->
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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. -->
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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. -->
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user