Class ranking additions.

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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