Partial ranking class fix and adjustments.

This commit is contained in:
MobiusDevelopment 2021-05-23 16:52:09 +00:00
parent 2ba37c2cf1
commit 9d51a3b26f
10 changed files with 270 additions and 96 deletions

View File

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

View File

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

View File

@ -20,9 +20,11 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory; import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope; import org.l2jmobius.gameserver.enums.RankingScope;
@ -40,16 +42,16 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final PlayerInstance _player; private final PlayerInstance _player;
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race; private final int _ordinal;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int ordinal)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _ordinal = ordinal;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@ -61,13 +63,13 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeC(_group); packet.writeC(_group);
packet.writeC(_scope); packet.writeC(_scope);
packet.writeD(_race); packet.writeD(_ordinal);
packet.writeD(_player.getClassId().getId()); packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0) if (_playerList.size() > 0)
{ {
final RankingCategory category = RankingCategory.values()[_group]; final RankingCategory category = RankingCategory.values()[_group];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_scope), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_scope));
} }
else else
{ {
@ -76,34 +78,78 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope)
{ {
switch (category) switch (category)
{ {
case SERVER -> writeScopeData(packet, scope, new ArrayList<>(_playerList.entrySet()), new ArrayList<>(_snapshotList.entrySet())); case SERVER:
case RACE -> writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()));
case CLAN -> writeScopeData(packet, scope, _player.getClan() == null ? Collections.emptyList() : _playerList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()), _player.getClan() == null ? Collections.emptyList() : _snapshotList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()));
case FRIEND -> 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()));
}
}
private void writeScopeData(PacketWriter packet, RankingScope scope, List<Map.Entry<Integer, StatSet>> list, List<Map.Entry<Integer, StatSet>> snapshot)
{ {
writeScopeData(packet, scope, new ArrayList<>(_playerList.entrySet()), new ArrayList<>(_snapshotList.entrySet()));
break;
}
case RACE:
{
final Race race = Race.values()[_ordinal];
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()));
break;
}
case CLASS: // TODO: Check if this works.
{
final ClassId classId = ClassId.getClassId(_ordinal);
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == classId.getId()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == classId.getId()).collect(Collectors.toList()));
break;
}
case CLAN:
{
writeScopeData(packet, scope, _player.getClan() == null ? Collections.emptyList() : _playerList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()), _player.getClan() == null ? Collections.emptyList() : _snapshotList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()));
break;
}
case FRIEND:
{
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;
}
}
}
Map.Entry<Integer, StatSet> playerData = list.stream().filter(it -> it.getValue().getInt("charId", 0) == _player.getObjectId()).findFirst().orElse(null); private void writeScopeData(PacketWriter packet, RankingScope scope, List<Entry<Integer, StatSet>> list, List<Entry<Integer, StatSet>> snapshot)
{
Entry<Integer, StatSet> playerData = list.stream().filter(it -> it.getValue().getInt("charId", 0) == _player.getObjectId()).findFirst().orElse(null);
final int indexOf = list.indexOf(playerData); final int indexOf = list.indexOf(playerData);
final List<Map.Entry<Integer, StatSet>> limited = switch (scope)
final List<Entry<Integer, StatSet>> limited;
switch (scope)
{ {
case TOP_100 -> list.stream().limit(100).collect(Collectors.toList()); case TOP_100:
case ALL -> list; {
case TOP_150 -> list.stream().limit(150).collect(Collectors.toList()); limited = list.stream().limit(100).collect(Collectors.toList());
case SELF -> playerData == null ? Collections.emptyList() : list.subList(Math.max(0, indexOf - 10), Math.min(list.size(), indexOf + 10)); break;
}; }
case ALL:
{
limited = list;
break;
}
case TOP_150:
{
limited = list.stream().limit(150).collect(Collectors.toList());
break;
}
case SELF:
{
limited = playerData == null ? Collections.emptyList() : list.subList(Math.max(0, indexOf - 10), Math.min(list.size(), indexOf + 10));
break;
}
default:
{
limited = Collections.emptyList();
}
}
packet.writeD(limited.size()); packet.writeD(limited.size());
int rank = 1; int rank = 1;
for (Map.Entry<Integer, StatSet> data : limited.stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList())) for (Entry<Integer, StatSet> data : limited.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList()))
{ {
int curRank = rank++; int curRank = rank++;
final StatSet player = data.getValue(); final StatSet player = data.getValue();
@ -116,7 +162,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
if (snapshot.size() > 0) if (snapshot.size() > 0)
{ {
int snapshotRank = 1; int snapshotRank = 1;
for (Map.Entry<Integer, StatSet> ssData : snapshot.stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList())) for (Entry<Integer, StatSet> ssData : snapshot.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList()))
{ {
final StatSet snapshotData = ssData.getValue(); final StatSet snapshotData = ssData.getValue();
if (player.getInt("charId") == snapshotData.getInt("charId")) if (player.getInt("charId") == snapshotData.getInt("charId"))

View File

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

View File

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

View File

@ -20,9 +20,11 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RankingCategory; import org.l2jmobius.gameserver.enums.RankingCategory;
import org.l2jmobius.gameserver.enums.RankingScope; import org.l2jmobius.gameserver.enums.RankingScope;
@ -40,16 +42,16 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final PlayerInstance _player; private final PlayerInstance _player;
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race; private final int _ordinal;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int ordinal)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _ordinal = ordinal;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@ -61,13 +63,13 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeC(_group); packet.writeC(_group);
packet.writeC(_scope); packet.writeC(_scope);
packet.writeD(_race); packet.writeD(_ordinal);
packet.writeD(_player.getClassId().getId()); packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0) if (_playerList.size() > 0)
{ {
final RankingCategory category = RankingCategory.values()[_group]; final RankingCategory category = RankingCategory.values()[_group];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_scope), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_scope));
} }
else else
{ {
@ -76,34 +78,78 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope)
{ {
switch (category) switch (category)
{ {
case SERVER -> writeScopeData(packet, scope, new ArrayList<>(_playerList.entrySet()), new ArrayList<>(_snapshotList.entrySet())); case SERVER:
case RACE -> writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()));
case CLAN -> writeScopeData(packet, scope, _player.getClan() == null ? Collections.emptyList() : _playerList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()), _player.getClan() == null ? Collections.emptyList() : _snapshotList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()));
case FRIEND -> 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()));
}
}
private void writeScopeData(PacketWriter packet, RankingScope scope, List<Map.Entry<Integer, StatSet>> list, List<Map.Entry<Integer, StatSet>> snapshot)
{ {
writeScopeData(packet, scope, new ArrayList<>(_playerList.entrySet()), new ArrayList<>(_snapshotList.entrySet()));
break;
}
case RACE:
{
final Race race = Race.values()[_ordinal];
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()));
break;
}
case CLASS: // TODO: Check if this works.
{
final ClassId classId = ClassId.getClassId(_ordinal);
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == classId.getId()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("classId") == classId.getId()).collect(Collectors.toList()));
break;
}
case CLAN:
{
writeScopeData(packet, scope, _player.getClan() == null ? Collections.emptyList() : _playerList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()), _player.getClan() == null ? Collections.emptyList() : _snapshotList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()));
break;
}
case FRIEND:
{
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;
}
}
}
Map.Entry<Integer, StatSet> playerData = list.stream().filter(it -> it.getValue().getInt("charId", 0) == _player.getObjectId()).findFirst().orElse(null); private void writeScopeData(PacketWriter packet, RankingScope scope, List<Entry<Integer, StatSet>> list, List<Entry<Integer, StatSet>> snapshot)
{
Entry<Integer, StatSet> playerData = list.stream().filter(it -> it.getValue().getInt("charId", 0) == _player.getObjectId()).findFirst().orElse(null);
final int indexOf = list.indexOf(playerData); final int indexOf = list.indexOf(playerData);
final List<Map.Entry<Integer, StatSet>> limited = switch (scope)
final List<Entry<Integer, StatSet>> limited;
switch (scope)
{ {
case TOP_100 -> list.stream().limit(100).collect(Collectors.toList()); case TOP_100:
case ALL -> list; {
case TOP_150 -> list.stream().limit(150).collect(Collectors.toList()); limited = list.stream().limit(100).collect(Collectors.toList());
case SELF -> playerData == null ? Collections.emptyList() : list.subList(Math.max(0, indexOf - 10), Math.min(list.size(), indexOf + 10)); break;
}; }
case ALL:
{
limited = list;
break;
}
case TOP_150:
{
limited = list.stream().limit(150).collect(Collectors.toList());
break;
}
case SELF:
{
limited = playerData == null ? Collections.emptyList() : list.subList(Math.max(0, indexOf - 10), Math.min(list.size(), indexOf + 10));
break;
}
default:
{
limited = Collections.emptyList();
}
}
packet.writeD(limited.size()); packet.writeD(limited.size());
int rank = 1; int rank = 1;
for (Map.Entry<Integer, StatSet> data : limited.stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList())) for (Entry<Integer, StatSet> data : limited.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList()))
{ {
int curRank = rank++; int curRank = rank++;
final StatSet player = data.getValue(); final StatSet player = data.getValue();
@ -116,7 +162,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
if (snapshot.size() > 0) if (snapshot.size() > 0)
{ {
int snapshotRank = 1; int snapshotRank = 1;
for (Map.Entry<Integer, StatSet> ssData : snapshot.stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList())) for (Entry<Integer, StatSet> ssData : snapshot.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList()))
{ {
final StatSet snapshotData = ssData.getValue(); final StatSet snapshotData = ssData.getValue();
if (player.getInt("charId") == snapshotData.getInt("charId")) if (player.getInt("charId") == snapshotData.getInt("charId"))

View File

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

View File

@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
@ -40,16 +41,16 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final PlayerInstance _player; private final PlayerInstance _player;
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race; private final int _ordinal;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int ordinal)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _ordinal = ordinal;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@ -61,13 +62,13 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeC(_group); packet.writeC(_group);
packet.writeC(_scope); packet.writeC(_scope);
packet.writeD(_race); packet.writeD(_ordinal);
packet.writeD(_player.getClassId().getId()); packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0) if (_playerList.size() > 0)
{ {
final RankingCategory category = RankingCategory.values()[_group]; final RankingCategory category = RankingCategory.values()[_group];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_scope), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_scope));
} }
else else
{ {
@ -76,34 +77,72 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope)
{ {
switch (category) switch (category)
{ {
case SERVER -> writeScopeData(packet, scope, new ArrayList<>(_playerList.entrySet()), new ArrayList<>(_snapshotList.entrySet())); case SERVER:
case RACE -> writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()));
case CLAN -> writeScopeData(packet, scope, _player.getClan() == null ? Collections.emptyList() : _playerList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()), _player.getClan() == null ? Collections.emptyList() : _snapshotList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()));
case FRIEND -> 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()));
}
}
private void writeScopeData(PacketWriter packet, RankingScope scope, List<Map.Entry<Integer, StatSet>> list, List<Map.Entry<Integer, StatSet>> snapshot)
{ {
writeScopeData(packet, scope, new ArrayList<>(_playerList.entrySet()), new ArrayList<>(_snapshotList.entrySet()));
break;
}
case RACE:
{
final Race race = Race.values()[_ordinal];
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()));
break;
}
case CLAN:
{
writeScopeData(packet, scope, _player.getClan() == null ? Collections.emptyList() : _playerList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()), _player.getClan() == null ? Collections.emptyList() : _snapshotList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()));
break;
}
case FRIEND:
{
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;
}
}
}
Map.Entry<Integer, StatSet> playerData = list.stream().filter(it -> it.getValue().getInt("charId", 0) == _player.getObjectId()).findFirst().orElse(null); private void writeScopeData(PacketWriter packet, RankingScope scope, List<Entry<Integer, StatSet>> list, List<Entry<Integer, StatSet>> snapshot)
{
Entry<Integer, StatSet> playerData = list.stream().filter(it -> it.getValue().getInt("charId", 0) == _player.getObjectId()).findFirst().orElse(null);
final int indexOf = list.indexOf(playerData); final int indexOf = list.indexOf(playerData);
final List<Map.Entry<Integer, StatSet>> limited = switch (scope)
final List<Entry<Integer, StatSet>> limited;
switch (scope)
{ {
case TOP_100 -> list.stream().limit(100).collect(Collectors.toList()); case TOP_100:
case ALL -> list; {
case TOP_150 -> list.stream().limit(150).collect(Collectors.toList()); limited = list.stream().limit(100).collect(Collectors.toList());
case SELF -> playerData == null ? Collections.emptyList() : list.subList(Math.max(0, indexOf - 10), Math.min(list.size(), indexOf + 10)); break;
}; }
case ALL:
{
limited = list;
break;
}
case TOP_150:
{
limited = list.stream().limit(150).collect(Collectors.toList());
break;
}
case SELF:
{
limited = playerData == null ? Collections.emptyList() : list.subList(Math.max(0, indexOf - 10), Math.min(list.size(), indexOf + 10));
break;
}
default:
{
limited = Collections.emptyList();
}
}
packet.writeD(limited.size()); packet.writeD(limited.size());
int rank = 1; int rank = 1;
for (Map.Entry<Integer, StatSet> data : limited.stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList())) for (Entry<Integer, StatSet> data : limited.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList()))
{ {
int curRank = rank++; int curRank = rank++;
final StatSet player = data.getValue(); final StatSet player = data.getValue();
@ -116,7 +155,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
if (snapshot.size() > 0) if (snapshot.size() > 0)
{ {
int snapshotRank = 1; int snapshotRank = 1;
for (Map.Entry<Integer, StatSet> ssData : snapshot.stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList())) for (Entry<Integer, StatSet> ssData : snapshot.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList()))
{ {
final StatSet snapshotData = ssData.getValue(); final StatSet snapshotData = ssData.getValue();
if (player.getInt("charId") == snapshotData.getInt("charId")) if (player.getInt("charId") == snapshotData.getInt("charId"))

View File

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

View File

@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
@ -40,16 +41,16 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
private final PlayerInstance _player; private final PlayerInstance _player;
private final int _group; private final int _group;
private final int _scope; private final int _scope;
private final int _race; private final int _ordinal;
private final Map<Integer, StatSet> _playerList; private final Map<Integer, StatSet> _playerList;
private final Map<Integer, StatSet> _snapshotList; private final Map<Integer, StatSet> _snapshotList;
public ExRankingCharRankers(PlayerInstance player, int group, int scope, int race) public ExRankingCharRankers(PlayerInstance player, int group, int scope, int ordinal)
{ {
_player = player; _player = player;
_group = group; _group = group;
_scope = scope; _scope = scope;
_race = race; _ordinal = ordinal;
_playerList = RankManager.getInstance().getRankList(); _playerList = RankManager.getInstance().getRankList();
_snapshotList = RankManager.getInstance().getSnapshotList(); _snapshotList = RankManager.getInstance().getSnapshotList();
} }
@ -61,13 +62,13 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
packet.writeC(_group); packet.writeC(_group);
packet.writeC(_scope); packet.writeC(_scope);
packet.writeD(_race); packet.writeD(_ordinal);
packet.writeD(_player.getClassId().getId()); packet.writeD(_player.getClassId().getId());
if (_playerList.size() > 0) if (_playerList.size() > 0)
{ {
final RankingCategory category = RankingCategory.values()[_group]; final RankingCategory category = RankingCategory.values()[_group];
writeFilteredRankingData(packet, category, category.getScopeByGroup(_scope), Race.values()[_race]); writeFilteredRankingData(packet, category, category.getScopeByGroup(_scope));
} }
else else
{ {
@ -76,34 +77,72 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
return true; return true;
} }
private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope, Race race) private void writeFilteredRankingData(PacketWriter packet, RankingCategory category, RankingScope scope)
{ {
switch (category) switch (category)
{ {
case SERVER -> writeScopeData(packet, scope, new ArrayList<>(_playerList.entrySet()), new ArrayList<>(_snapshotList.entrySet())); case SERVER:
case RACE -> writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()));
case CLAN -> writeScopeData(packet, scope, _player.getClan() == null ? Collections.emptyList() : _playerList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()), _player.getClan() == null ? Collections.emptyList() : _snapshotList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()));
case FRIEND -> 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()));
}
}
private void writeScopeData(PacketWriter packet, RankingScope scope, List<Map.Entry<Integer, StatSet>> list, List<Map.Entry<Integer, StatSet>> snapshot)
{ {
writeScopeData(packet, scope, new ArrayList<>(_playerList.entrySet()), new ArrayList<>(_snapshotList.entrySet()));
break;
}
case RACE:
{
final Race race = Race.values()[_ordinal];
writeScopeData(packet, scope, _playerList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()), _snapshotList.entrySet().stream().filter(it -> it.getValue().getInt("race") == race.ordinal()).collect(Collectors.toList()));
break;
}
case CLAN:
{
writeScopeData(packet, scope, _player.getClan() == null ? Collections.emptyList() : _playerList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()), _player.getClan() == null ? Collections.emptyList() : _snapshotList.entrySet().stream().filter(it -> it.getValue().getString("clanName").equals(_player.getClan().getName())).collect(Collectors.toList()));
break;
}
case FRIEND:
{
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;
}
}
}
Map.Entry<Integer, StatSet> playerData = list.stream().filter(it -> it.getValue().getInt("charId", 0) == _player.getObjectId()).findFirst().orElse(null); private void writeScopeData(PacketWriter packet, RankingScope scope, List<Entry<Integer, StatSet>> list, List<Entry<Integer, StatSet>> snapshot)
{
Entry<Integer, StatSet> playerData = list.stream().filter(it -> it.getValue().getInt("charId", 0) == _player.getObjectId()).findFirst().orElse(null);
final int indexOf = list.indexOf(playerData); final int indexOf = list.indexOf(playerData);
final List<Map.Entry<Integer, StatSet>> limited = switch (scope)
final List<Entry<Integer, StatSet>> limited;
switch (scope)
{ {
case TOP_100 -> list.stream().limit(100).collect(Collectors.toList()); case TOP_100:
case ALL -> list; {
case TOP_150 -> list.stream().limit(150).collect(Collectors.toList()); limited = list.stream().limit(100).collect(Collectors.toList());
case SELF -> playerData == null ? Collections.emptyList() : list.subList(Math.max(0, indexOf - 10), Math.min(list.size(), indexOf + 10)); break;
}; }
case ALL:
{
limited = list;
break;
}
case TOP_150:
{
limited = list.stream().limit(150).collect(Collectors.toList());
break;
}
case SELF:
{
limited = playerData == null ? Collections.emptyList() : list.subList(Math.max(0, indexOf - 10), Math.min(list.size(), indexOf + 10));
break;
}
default:
{
limited = Collections.emptyList();
}
}
packet.writeD(limited.size()); packet.writeD(limited.size());
int rank = 1; int rank = 1;
for (Map.Entry<Integer, StatSet> data : limited.stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList())) for (Entry<Integer, StatSet> data : limited.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList()))
{ {
int curRank = rank++; int curRank = rank++;
final StatSet player = data.getValue(); final StatSet player = data.getValue();
@ -116,7 +155,7 @@ public class ExRankingCharRankers implements IClientOutgoingPacket
if (snapshot.size() > 0) if (snapshot.size() > 0)
{ {
int snapshotRank = 1; int snapshotRank = 1;
for (Map.Entry<Integer, StatSet> ssData : snapshot.stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList())) for (Entry<Integer, StatSet> ssData : snapshot.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList()))
{ {
final StatSet snapshotData = ssData.getValue(); final StatSet snapshotData = ssData.getValue();
if (player.getInt("charId") == snapshotData.getInt("charId")) if (player.getInt("charId") == snapshotData.getInt("charId"))