From 9be9578a5e00fc2f1544a9e8e0a86eb009387f9f Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Wed, 19 Oct 2022 21:16:56 +0000 Subject: [PATCH] Implemented pet ranking. --- .../dist/db_installer/sql/game/pets.sql | 2 +- .../dist/game/data/PetTypes.xml | 336 +++++++++--------- .../dist/game/data/xsd/PetTypes.xsd | 5 +- .../org/l2jmobius/gameserver/GameServer.java | 4 +- .../gameserver/data/xml/PetDataTable.java | 48 ++- .../gameserver/data/xml/PetTypeData.java | 114 ++++++ .../gameserver/data/xml/PetTypesListData.java | 85 ----- .../instancemanager/RankManager.java | 31 +- .../clientpackets/pet/ExEvolvePet.java | 24 +- .../ranking/RequestPetRankingList.java | 8 +- .../ranking/ExPetRankingList.java | 39 +- .../dist/db_installer/sql/game/pets.sql | 2 +- .../dist/game/data/PetTypes.xml | 336 +++++++++--------- .../dist/game/data/xsd/PetTypes.xsd | 5 +- .../org/l2jmobius/gameserver/GameServer.java | 4 +- .../gameserver/data/xml/PetDataTable.java | 48 ++- .../gameserver/data/xml/PetTypeData.java | 114 ++++++ .../gameserver/data/xml/PetTypesListData.java | 85 ----- .../instancemanager/RankManager.java | 31 +- .../clientpackets/pet/ExEvolvePet.java | 24 +- .../ranking/RequestPetRankingList.java | 8 +- .../ranking/ExPetRankingList.java | 39 +- 22 files changed, 778 insertions(+), 614 deletions(-) create mode 100644 L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java delete mode 100644 L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java create mode 100644 L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java delete mode 100644 L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/db_installer/sql/game/pets.sql b/L2J_Mobius_Essence_5.2_FrostLord/dist/db_installer/sql/game/pets.sql index 4ffa7cd2b6..58b188bbcd 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/db_installer/sql/game/pets.sql +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/db_installer/sql/game/pets.sql @@ -1,7 +1,7 @@ DROP TABLE IF EXISTS `pets`; CREATE TABLE IF NOT EXISTS `pets` ( `item_obj_id` int(10) unsigned NOT NULL, - `name` varchar(16), + `name` varchar(36), `level` smallint(2) unsigned NOT NULL, `curHp` int(9) unsigned DEFAULT '0', `curMp` int(9) unsigned DEFAULT '0', diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/PetTypes.xml b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/PetTypes.xml index ac8abd26f9..fba419fb50 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/PetTypes.xml +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/PetTypes.xml @@ -1,171 +1,171 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/PetTypes.xsd b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/PetTypes.xsd index a5cadaa23a..d39fbea6a5 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/PetTypes.xsd +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/PetTypes.xsd @@ -8,8 +8,9 @@ - - + + + diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/GameServer.java index 5c326487d0..7d7fd2d72b 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/GameServer.java @@ -93,7 +93,7 @@ import org.l2jmobius.gameserver.data.xml.OptionData; import org.l2jmobius.gameserver.data.xml.PetAcquireList; import org.l2jmobius.gameserver.data.xml.PetDataTable; import org.l2jmobius.gameserver.data.xml.PetSkillData; -import org.l2jmobius.gameserver.data.xml.PetTypesListData; +import org.l2jmobius.gameserver.data.xml.PetTypeData; import org.l2jmobius.gameserver.data.xml.PlayerTemplateData; import org.l2jmobius.gameserver.data.xml.PlayerXpPercentLostData; import org.l2jmobius.gameserver.data.xml.PrimeShopData; @@ -376,7 +376,7 @@ public class GameServer CrestTable.getInstance(); TeleportListData.getInstance(); SharedTeleportManager.getInstance(); - PetTypesListData.getInstance(); + PetTypeData.getInstance(); TeleporterData.getInstance(); TimedHuntingZoneData.getInstance(); MatchingRoomManager.getInstance(); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java index e444792dd0..0dfecabeae 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java @@ -17,6 +17,9 @@ package org.l2jmobius.gameserver.data.xml; import java.io.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -29,16 +32,17 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; +import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.gameserver.enums.EvolveLevel; import org.l2jmobius.gameserver.enums.MountType; import org.l2jmobius.gameserver.model.PetData; import org.l2jmobius.gameserver.model.PetLevelData; import org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.holders.SkillHolder; /** * This class parse and hold all pet parameters.
- * TODO: load and use all pet parameters. * @author Zoey76 (rework) */ public class PetDataTable implements IXmlReader @@ -46,6 +50,7 @@ public class PetDataTable implements IXmlReader private static final Logger LOGGER = Logger.getLogger(PetDataTable.class.getName()); private final Map _pets = new ConcurrentHashMap<>(); + private final Map _petNames = new ConcurrentHashMap<>(); /** * Instantiates a new pet data table. @@ -60,6 +65,26 @@ public class PetDataTable implements IXmlReader { _pets.clear(); parseDatapackDirectory("data/stats/pets", false); + + try (Connection conn = DatabaseFactory.getConnection(); + PreparedStatement ps = conn.prepareStatement("SELECT * FROM pets")) + { + ResultSet rs = ps.executeQuery(); + while (rs.next()) + { + String name = rs.getString("name"); + if (name == null) + { + name = "No name"; + } + _petNames.put(rs.getInt("item_obj_id"), name); + } + } + catch (Exception e) + { + LOGGER.warning(getClass().getSimpleName() + ": Problem loading pet names! " + e); + } + LOGGER.info(getClass().getSimpleName() + ": Loaded " + _pets.size() + " pets."); } @@ -277,6 +302,27 @@ public class PetDataTable implements IXmlReader return _pets.values().stream().filter(petData -> (petData.getItemId() == itemId) && (petData.getEvolveLevel() == evolveLevel)).collect(Collectors.toList()); } + public void setPetName(int objectId, String name) + { + _petNames.put(objectId, name); + } + + public String getPetName(int objectId) + { + return _petNames.getOrDefault(objectId, "No name"); + } + + public String getNameByItemObjectId(int objectId) + { + final String name = getPetName(objectId); + final SkillHolder type = PetTypeData.getInstance().getSkillByName(name); + if (type == null) + { + return ""; + } + return type.getSkillId() + ";" + type.getSkillLevel() + ";" + PetTypeData.getInstance().getIdByName(name); + } + /** * Gets the single instance of PetDataTable. * @return this class unique instance. diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java new file mode 100644 index 0000000000..f2c87eb9c8 --- /dev/null +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java @@ -0,0 +1,114 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.l2jmobius.gameserver.data.xml; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.logging.Logger; + +import org.w3c.dom.Document; + +import org.l2jmobius.commons.util.IXmlReader; +import org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.holders.SkillHolder; + +/** + * @author Mobius + */ +public class PetTypeData implements IXmlReader +{ + private static final Logger LOGGER = Logger.getLogger(PetTypeData.class.getName()); + + private final Map _skills = new HashMap<>(); + private final Map _names = new HashMap<>(); + + protected PetTypeData() + { + load(); + } + + @Override + public void load() + { + _skills.clear(); + parseDatapackFile("data/PetTypes.xml"); + LOGGER.info(getClass().getSimpleName() + ": Loaded " + _skills.size() + " pet types."); + } + + @Override + public void parseDocument(Document doc, File f) + { + forEach(doc, "list", listNode -> forEach(listNode, "pet", petNode -> + { + final StatSet set = new StatSet(parseAttributes(petNode)); + final int id = set.getInt("id"); + _skills.put(id, new SkillHolder(set.getInt("skillId", 0), set.getInt("skillLvl", 0))); + _names.put(id, set.getString("name")); + })); + } + + public SkillHolder getSkillByName(String name) + { + for (Entry entry : _names.entrySet()) + { + if (name.startsWith(entry.getValue())) + { + return _skills.get(entry.getKey()); + } + } + return null; + } + + public int getIdByName(String name) + { + for (Entry entry : _names.entrySet()) + { + if (name.endsWith(entry.getValue())) + { + return entry.getKey(); + } + } + return 0; + } + + public String getNamePrefix(Integer id) + { + return _names.get(id); + } + + public String getRandomName() + { + return _names.entrySet().stream().filter(e -> e.getKey() > 100).findAny().get().getValue(); + } + + public Entry getRandomSkill() + { + return _skills.entrySet().stream().filter(e -> e.getValue().getSkillId() > 0).findAny().get(); + } + + public static PetTypeData getInstance() + { + return PetTypeData.SingletonHolder.INSTANCE; + } + + private static class SingletonHolder + { + protected static final PetTypeData INSTANCE = new PetTypeData(); + } +} diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java deleted file mode 100644 index e5c4aede0d..0000000000 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.l2jmobius.gameserver.data.xml; - -import java.io.File; -import java.util.AbstractMap.SimpleEntry; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.logging.Logger; - -import org.w3c.dom.Document; - -import org.l2jmobius.commons.util.IXmlReader; -import org.l2jmobius.gameserver.model.StatSet; - -/** - * Written by Berezkin Nikolay, on 11.04.2021 - */ -public class PetTypesListData implements IXmlReader -{ - private static final Logger LOGGER = Logger.getLogger(PetTypesListData.class.getName()); - - private final Map> _types = new HashMap<>(); - - protected PetTypesListData() - { - load(); - } - - @Override - public void load() - { - _types.clear(); - parseDatapackFile("data/PetTypes.xml"); - LOGGER.info(getClass().getSimpleName() + ": Loaded " + _types.size() + " pet types."); - } - - @Override - public void parseDocument(Document doc, File f) - { - forEach(doc, "list", listNode -> forEach(listNode, "pet", teleportNode -> - { - final StatSet set = new StatSet(parseAttributes(teleportNode)); - final int petType = set.getInt("id"); - final int skillId = set.getInt("skillId"); - final int skillLvl = set.getInt("skillLvl"); - _types.put(petType, new SimpleEntry<>(skillId, skillLvl)); - })); - } - - public Map> getTypes() - { - return _types; - } - - public Entry getType(int type) - { - return _types.get(type); - } - - public static PetTypesListData getInstance() - { - return PetTypesListData.SingletonHolder.INSTANCE; - } - - private static class SingletonHolder - { - protected static final PetTypesListData INSTANCE = new PetTypesListData(); - } -} diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/instancemanager/RankManager.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/instancemanager/RankManager.java index bdb6d2a7b4..bfe1bccd8e 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/instancemanager/RankManager.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/instancemanager/RankManager.java @@ -29,6 +29,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.PetDataTable; +import org.l2jmobius.gameserver.model.PetData; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.olympiad.Hero; @@ -47,7 +48,7 @@ public class RankManager private static final String SELECT_CHARACTERS = "SELECT charId,char_name,level,race,base_class, clanid FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CHARACTERS_PVP = "SELECT charId,char_name,level,race,base_class, clanid, deaths, kills, pvpkills FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 ORDER BY kills DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; - private static final String SELECT_PETS = "SELECT characters.charId, pets.exp, characters.char_name, pets.level as petLevel, characters.level as charLevel, characters.clanId, pet_evolves.index, pets.item_obj_id FROM characters, pets, pet_evolves WHERE pets.ownerId = characters.charId AND pet_evolves.itemObjId = pets.item_obj_id AND (" + CURRENT_TIME + " - cast(characters.lastAccess as signed) < " + TIME_LIMIT + ") AND characters.accesslevel = 0 AND pets.level > 39 ORDER BY pets.exp DESC, characters.onlinetime DESC LIMIT " + PLAYER_LIMIT; + private static final String SELECT_PETS = "SELECT characters.charId, pets.exp, characters.char_name, pets.level as petLevel, characters.race as char_race, characters.level as char_level, characters.clanId, pet_evolves.index, pet_evolves.level as evolveLevel, pets.item_obj_id, item_id FROM characters, items, pets, pet_evolves WHERE pets.ownerId = characters.charId AND pet_evolves.itemObjId = items.object_id AND pet_evolves.itemObjId = pets.item_obj_id AND (" + CURRENT_TIME + " - cast(characters.lastAccess as signed) < " + TIME_LIMIT + ") AND characters.accesslevel = 0 AND pets.level > 39 ORDER BY pets.exp DESC, characters.onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CLANS = "SELECT characters.level, characters.char_name, clan_data.clan_id, clan_data.clan_level, clan_data.clan_name, clan_data.reputation_score, clan_data.exp FROM characters, clan_data WHERE characters.charId = clan_data.leader_id AND characters.clanid = clan_data.clan_id AND dissolving_expiry_time = 0 ORDER BY exp DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; @@ -232,18 +233,22 @@ public class RankManager int i = 1; while (rset.next()) { - final StatSet player = new StatSet(); - final int charId = rset.getInt("charId"); - player.set("charId", charId); - player.set("name", rset.getString("char_name")); - player.set("level", rset.getInt("charLevel")); - player.set("petLevel", rset.getInt("petLevel")); - player.set("clanName", rset.getInt("clanid") > 0 ? ClanTable.getInstance().getClan(rset.getInt("clanid")).getName() : ""); - player.set("petType", PetDataTable.getInstance().getTypeByIndex(rset.getInt("index"))); - player.set("exp", rset.getLong("exp")); - player.set("controlledItemObjId", rset.getInt("item_obj_id")); - _mainPetList.put(i, player); - i++; + final StatSet pet = new StatSet(); + final int controlledItemObjId = rset.getInt("item_obj_id"); + pet.set("controlledItemObjId", controlledItemObjId); + pet.set("name", PetDataTable.getInstance().getNameByItemObjectId(controlledItemObjId)); + pet.set("ownerId", rset.getInt("charId")); + pet.set("owner_name", rset.getString("char_name")); + pet.set("owner_race", rset.getString("char_race")); + pet.set("owner_level", rset.getInt("char_level")); + pet.set("level", rset.getInt("petLevel")); + pet.set("evolve_level", rset.getInt("evolveLevel")); + pet.set("exp", rset.getLong("exp")); + pet.set("clanName", rset.getInt("clanid") > 0 ? ClanTable.getInstance().getClan(rset.getInt("clanid")).getName() : ""); + final PetData petData = PetDataTable.getInstance().getPetDataByItemId(rset.getInt("item_id")); + pet.set("petType", petData.getType()); + pet.set("npcId", petData.getNpcId()); + _mainPetList.put(i++, pet); } } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java index f10148af7e..815737b35e 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java @@ -2,25 +2,24 @@ package org.l2jmobius.gameserver.network.clientpackets.pet; import java.util.List; import java.util.Map.Entry; -import java.util.stream.Collectors; import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.data.xml.NpcData; import org.l2jmobius.gameserver.data.xml.PetDataTable; -import org.l2jmobius.gameserver.data.xml.PetTypesListData; -import org.l2jmobius.gameserver.data.xml.SkillData; +import org.l2jmobius.gameserver.data.xml.PetTypeData; import org.l2jmobius.gameserver.enums.EvolveLevel; import org.l2jmobius.gameserver.model.PetData; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.instance.Pet; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; /** - * Written by Berezkin Nikolay, on 25.04.2021 + * @author Berezkin Nikolay, Mobius */ public class ExEvolvePet implements IClientIncomingPacket { @@ -79,23 +78,26 @@ public class ExEvolvePet implements IClientIncomingPacket final NpcTemplate npcTemplate = NpcData.getInstance().getTemplate(evolveLevel == EvolveLevel.Second ? pet.getId() + 2 : petData.getNpcId()); final Pet evolved = Pet.spawnPet(npcTemplate, activeChar, controlItem); - if (evolved == null) { return; } + + if (evolveLevel == EvolveLevel.First) + { + final Entry skillType = PetTypeData.getInstance().getRandomSkill(); + final String name = PetTypeData.getInstance().getNamePrefix(skillType.getKey()) + " " + PetTypeData.getInstance().getRandomName(); + evolved.addSkill(skillType.getValue().getSkill()); + evolved.setName(name); + PetDataTable.getInstance().setPetName(controlItem.getObjectId(), name); + } + activeChar.setPet(evolved); evolved.setShowSummonAnimation(true); evolved.setEvolveLevel(evolveLevel); evolved.setRunning(); evolved.storeEvolvedPets(evolveLevel.ordinal(), evolved.getPetData().getIndex(), controlItem.getObjectId()); controlItem.setEnchantLevel(evolved.getLevel()); - if (evolveLevel == EvolveLevel.First) - { - final List>> specialTypes = PetTypesListData.getInstance().getTypes().entrySet().stream().filter(it -> it.getValue().getKey() != 0).collect(Collectors.toList()); - final int randomIndex = Rnd.get(specialTypes.size() - 1); - evolved.addSkill(SkillData.getInstance().getSkill(specialTypes.get(randomIndex).getValue().getKey(), specialTypes.get(randomIndex).getValue().getValue())); - } evolved.spawnMe(pet.getX(), pet.getY(), pet.getZ()); evolved.startFeed(); } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/ranking/RequestPetRankingList.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/ranking/RequestPetRankingList.java index 9e33b16788..b512a75dae 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/ranking/RequestPetRankingList.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/ranking/RequestPetRankingList.java @@ -23,14 +23,14 @@ import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.ranking.ExPetRankingList; /** - * Written by Berezkin Nikolay, on 10.05.2021 + * @author Mobius */ public class RequestPetRankingList implements IClientIncomingPacket { private int _season; private int _tabId; private int _type; - private int _race; + private int _petItemObjectId; @Override public boolean read(GameClient client, PacketReader packet) @@ -38,7 +38,7 @@ public class RequestPetRankingList implements IClientIncomingPacket _season = packet.readC(); _tabId = packet.readC(); _type = packet.readC(); - _race = packet.readD(); + _petItemObjectId = packet.readD(); return true; } @@ -51,6 +51,6 @@ public class RequestPetRankingList implements IClientIncomingPacket return; } - player.sendPacket(new ExPetRankingList(player, _season, _tabId, _type, _race)); + player.sendPacket(new ExPetRankingList(player, _season, _tabId, _type, _petItemObjectId)); } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ranking/ExPetRankingList.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ranking/ExPetRankingList.java index 8fd721e11a..e6038afc05 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ranking/ExPetRankingList.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ranking/ExPetRankingList.java @@ -33,7 +33,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; /** - * Written by Berezkin Nikolay, on 10.05.2021 + * @author Mobius */ public class ExPetRankingList implements IClientOutgoingPacket { @@ -41,17 +41,17 @@ public class ExPetRankingList implements IClientOutgoingPacket private final int _season; private final int _tabId; private final int _type; - private final int _race; + private final int _petItemObjectId; private final Map _playerList; private final Map _snapshotList; - public ExPetRankingList(Player player, int season, int tabId, int type, int race) + public ExPetRankingList(Player player, int season, int tabId, int type, int petItemObjectId) { _player = player; _season = season; _tabId = tabId; _type = type; - _race = race; + _petItemObjectId = petItemObjectId; _playerList = RankManager.getInstance().getPetRankList(); _snapshotList = RankManager.getInstance().getSnapshotPetRankList(); } @@ -62,13 +62,12 @@ public class ExPetRankingList implements IClientOutgoingPacket OutgoingPackets.EX_PET_RANKING_LIST.writeId(packet); packet.writeC(_season); packet.writeC(_tabId); - packet.writeC(_type); - packet.writeD(_race); - packet.writeC(0); - if (!_playerList.isEmpty() && (_type != 255) && (_race != 255)) + packet.writeH(_type); + packet.writeD(_petItemObjectId); + if (!_playerList.isEmpty()) { - final RankingCategory category = RankingCategory.values()[_season]; - writeFilteredRankingData(packet, category, category.getScopeByGroup(_tabId)); + final RankingCategory category = RankingCategory.values()[_tabId]; + writeFilteredRankingData(packet, category, category.getScopeByGroup(_season)); } else { @@ -141,22 +140,22 @@ public class ExPetRankingList implements IClientOutgoingPacket for (Entry data : limited.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList())) { int curRank = rank++; - final StatSet player = data.getValue(); - packet.writeH(0); - packet.writeString(player.getString("name")); - packet.writeString(player.getString("clanName")); - packet.writeD(player.getInt("exp")); - packet.writeH(player.getInt("petType")); - packet.writeH(player.getInt("petLevel")); - packet.writeH(3); - packet.writeH(player.getInt("level")); + final StatSet pet = data.getValue(); + packet.writeString(pet.getString("name")); + packet.writeString(pet.getString("owner_name")); + packet.writeString(pet.getString("clanName")); + packet.writeD(1000000 + pet.getInt("npcId")); + packet.writeH(pet.getInt("petType")); + packet.writeH(pet.getInt("level")); + packet.writeH(pet.getInt("owner_race")); + packet.writeH(pet.getInt("owner_level")); packet.writeD(scope == RankingScope.SELF ? data.getKey() : curRank); // server rank if (!snapshot.isEmpty()) { for (Entry ssData : snapshot.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList())) { final StatSet snapshotData = ssData.getValue(); - if (player.getInt("controlledItemObjId") == snapshotData.getInt("controlledItemObjId")) + if (pet.getInt("controlledItemObjId") == snapshotData.getInt("controlledItemObjId")) { packet.writeD(scope == RankingScope.SELF ? ssData.getKey() : curRank); // server rank snapshot } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/db_installer/sql/game/pets.sql b/L2J_Mobius_Essence_6.2_Vanguard/dist/db_installer/sql/game/pets.sql index 4ffa7cd2b6..58b188bbcd 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/db_installer/sql/game/pets.sql +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/db_installer/sql/game/pets.sql @@ -1,7 +1,7 @@ DROP TABLE IF EXISTS `pets`; CREATE TABLE IF NOT EXISTS `pets` ( `item_obj_id` int(10) unsigned NOT NULL, - `name` varchar(16), + `name` varchar(36), `level` smallint(2) unsigned NOT NULL, `curHp` int(9) unsigned DEFAULT '0', `curMp` int(9) unsigned DEFAULT '0', diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/PetTypes.xml b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/PetTypes.xml index ac8abd26f9..fba419fb50 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/PetTypes.xml +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/PetTypes.xml @@ -1,171 +1,171 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/xsd/PetTypes.xsd b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/xsd/PetTypes.xsd index a5cadaa23a..d39fbea6a5 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/xsd/PetTypes.xsd +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/xsd/PetTypes.xsd @@ -8,8 +8,9 @@ - - + + + diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/GameServer.java index 17cdb1fc1c..d3d4987cf4 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/GameServer.java @@ -96,7 +96,7 @@ import org.l2jmobius.gameserver.data.xml.OptionData; import org.l2jmobius.gameserver.data.xml.PetAcquireList; import org.l2jmobius.gameserver.data.xml.PetDataTable; import org.l2jmobius.gameserver.data.xml.PetSkillData; -import org.l2jmobius.gameserver.data.xml.PetTypesListData; +import org.l2jmobius.gameserver.data.xml.PetTypeData; import org.l2jmobius.gameserver.data.xml.PlayerTemplateData; import org.l2jmobius.gameserver.data.xml.PlayerXpPercentLostData; import org.l2jmobius.gameserver.data.xml.PrimeShopData; @@ -384,7 +384,7 @@ public class GameServer CrestTable.getInstance(); TeleportListData.getInstance(); SharedTeleportManager.getInstance(); - PetTypesListData.getInstance(); + PetTypeData.getInstance(); TeleporterData.getInstance(); TimedHuntingZoneData.getInstance(); MatchingRoomManager.getInstance(); diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java index e444792dd0..0dfecabeae 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java @@ -17,6 +17,9 @@ package org.l2jmobius.gameserver.data.xml; import java.io.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -29,16 +32,17 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; +import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.gameserver.enums.EvolveLevel; import org.l2jmobius.gameserver.enums.MountType; import org.l2jmobius.gameserver.model.PetData; import org.l2jmobius.gameserver.model.PetLevelData; import org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.holders.SkillHolder; /** * This class parse and hold all pet parameters.
- * TODO: load and use all pet parameters. * @author Zoey76 (rework) */ public class PetDataTable implements IXmlReader @@ -46,6 +50,7 @@ public class PetDataTable implements IXmlReader private static final Logger LOGGER = Logger.getLogger(PetDataTable.class.getName()); private final Map _pets = new ConcurrentHashMap<>(); + private final Map _petNames = new ConcurrentHashMap<>(); /** * Instantiates a new pet data table. @@ -60,6 +65,26 @@ public class PetDataTable implements IXmlReader { _pets.clear(); parseDatapackDirectory("data/stats/pets", false); + + try (Connection conn = DatabaseFactory.getConnection(); + PreparedStatement ps = conn.prepareStatement("SELECT * FROM pets")) + { + ResultSet rs = ps.executeQuery(); + while (rs.next()) + { + String name = rs.getString("name"); + if (name == null) + { + name = "No name"; + } + _petNames.put(rs.getInt("item_obj_id"), name); + } + } + catch (Exception e) + { + LOGGER.warning(getClass().getSimpleName() + ": Problem loading pet names! " + e); + } + LOGGER.info(getClass().getSimpleName() + ": Loaded " + _pets.size() + " pets."); } @@ -277,6 +302,27 @@ public class PetDataTable implements IXmlReader return _pets.values().stream().filter(petData -> (petData.getItemId() == itemId) && (petData.getEvolveLevel() == evolveLevel)).collect(Collectors.toList()); } + public void setPetName(int objectId, String name) + { + _petNames.put(objectId, name); + } + + public String getPetName(int objectId) + { + return _petNames.getOrDefault(objectId, "No name"); + } + + public String getNameByItemObjectId(int objectId) + { + final String name = getPetName(objectId); + final SkillHolder type = PetTypeData.getInstance().getSkillByName(name); + if (type == null) + { + return ""; + } + return type.getSkillId() + ";" + type.getSkillLevel() + ";" + PetTypeData.getInstance().getIdByName(name); + } + /** * Gets the single instance of PetDataTable. * @return this class unique instance. diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java new file mode 100644 index 0000000000..f2c87eb9c8 --- /dev/null +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java @@ -0,0 +1,114 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.l2jmobius.gameserver.data.xml; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.logging.Logger; + +import org.w3c.dom.Document; + +import org.l2jmobius.commons.util.IXmlReader; +import org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.holders.SkillHolder; + +/** + * @author Mobius + */ +public class PetTypeData implements IXmlReader +{ + private static final Logger LOGGER = Logger.getLogger(PetTypeData.class.getName()); + + private final Map _skills = new HashMap<>(); + private final Map _names = new HashMap<>(); + + protected PetTypeData() + { + load(); + } + + @Override + public void load() + { + _skills.clear(); + parseDatapackFile("data/PetTypes.xml"); + LOGGER.info(getClass().getSimpleName() + ": Loaded " + _skills.size() + " pet types."); + } + + @Override + public void parseDocument(Document doc, File f) + { + forEach(doc, "list", listNode -> forEach(listNode, "pet", petNode -> + { + final StatSet set = new StatSet(parseAttributes(petNode)); + final int id = set.getInt("id"); + _skills.put(id, new SkillHolder(set.getInt("skillId", 0), set.getInt("skillLvl", 0))); + _names.put(id, set.getString("name")); + })); + } + + public SkillHolder getSkillByName(String name) + { + for (Entry entry : _names.entrySet()) + { + if (name.startsWith(entry.getValue())) + { + return _skills.get(entry.getKey()); + } + } + return null; + } + + public int getIdByName(String name) + { + for (Entry entry : _names.entrySet()) + { + if (name.endsWith(entry.getValue())) + { + return entry.getKey(); + } + } + return 0; + } + + public String getNamePrefix(Integer id) + { + return _names.get(id); + } + + public String getRandomName() + { + return _names.entrySet().stream().filter(e -> e.getKey() > 100).findAny().get().getValue(); + } + + public Entry getRandomSkill() + { + return _skills.entrySet().stream().filter(e -> e.getValue().getSkillId() > 0).findAny().get(); + } + + public static PetTypeData getInstance() + { + return PetTypeData.SingletonHolder.INSTANCE; + } + + private static class SingletonHolder + { + protected static final PetTypeData INSTANCE = new PetTypeData(); + } +} diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java deleted file mode 100644 index e5c4aede0d..0000000000 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.l2jmobius.gameserver.data.xml; - -import java.io.File; -import java.util.AbstractMap.SimpleEntry; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.logging.Logger; - -import org.w3c.dom.Document; - -import org.l2jmobius.commons.util.IXmlReader; -import org.l2jmobius.gameserver.model.StatSet; - -/** - * Written by Berezkin Nikolay, on 11.04.2021 - */ -public class PetTypesListData implements IXmlReader -{ - private static final Logger LOGGER = Logger.getLogger(PetTypesListData.class.getName()); - - private final Map> _types = new HashMap<>(); - - protected PetTypesListData() - { - load(); - } - - @Override - public void load() - { - _types.clear(); - parseDatapackFile("data/PetTypes.xml"); - LOGGER.info(getClass().getSimpleName() + ": Loaded " + _types.size() + " pet types."); - } - - @Override - public void parseDocument(Document doc, File f) - { - forEach(doc, "list", listNode -> forEach(listNode, "pet", teleportNode -> - { - final StatSet set = new StatSet(parseAttributes(teleportNode)); - final int petType = set.getInt("id"); - final int skillId = set.getInt("skillId"); - final int skillLvl = set.getInt("skillLvl"); - _types.put(petType, new SimpleEntry<>(skillId, skillLvl)); - })); - } - - public Map> getTypes() - { - return _types; - } - - public Entry getType(int type) - { - return _types.get(type); - } - - public static PetTypesListData getInstance() - { - return PetTypesListData.SingletonHolder.INSTANCE; - } - - private static class SingletonHolder - { - protected static final PetTypesListData INSTANCE = new PetTypesListData(); - } -} diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/instancemanager/RankManager.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/instancemanager/RankManager.java index bdb6d2a7b4..bfe1bccd8e 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/instancemanager/RankManager.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/instancemanager/RankManager.java @@ -29,6 +29,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.data.sql.ClanTable; import org.l2jmobius.gameserver.data.xml.PetDataTable; +import org.l2jmobius.gameserver.model.PetData; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.olympiad.Hero; @@ -47,7 +48,7 @@ public class RankManager private static final String SELECT_CHARACTERS = "SELECT charId,char_name,level,race,base_class, clanid FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CHARACTERS_PVP = "SELECT charId,char_name,level,race,base_class, clanid, deaths, kills, pvpkills FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 ORDER BY kills DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CHARACTERS_BY_RACE = "SELECT charId FROM characters WHERE (" + CURRENT_TIME + " - cast(lastAccess as signed) < " + TIME_LIMIT + ") AND accesslevel = 0 AND level > 39 AND race = ? ORDER BY exp DESC, onlinetime DESC LIMIT " + PLAYER_LIMIT; - private static final String SELECT_PETS = "SELECT characters.charId, pets.exp, characters.char_name, pets.level as petLevel, characters.level as charLevel, characters.clanId, pet_evolves.index, pets.item_obj_id FROM characters, pets, pet_evolves WHERE pets.ownerId = characters.charId AND pet_evolves.itemObjId = pets.item_obj_id AND (" + CURRENT_TIME + " - cast(characters.lastAccess as signed) < " + TIME_LIMIT + ") AND characters.accesslevel = 0 AND pets.level > 39 ORDER BY pets.exp DESC, characters.onlinetime DESC LIMIT " + PLAYER_LIMIT; + private static final String SELECT_PETS = "SELECT characters.charId, pets.exp, characters.char_name, pets.level as petLevel, characters.race as char_race, characters.level as char_level, characters.clanId, pet_evolves.index, pet_evolves.level as evolveLevel, pets.item_obj_id, item_id FROM characters, items, pets, pet_evolves WHERE pets.ownerId = characters.charId AND pet_evolves.itemObjId = items.object_id AND pet_evolves.itemObjId = pets.item_obj_id AND (" + CURRENT_TIME + " - cast(characters.lastAccess as signed) < " + TIME_LIMIT + ") AND characters.accesslevel = 0 AND pets.level > 39 ORDER BY pets.exp DESC, characters.onlinetime DESC LIMIT " + PLAYER_LIMIT; private static final String SELECT_CLANS = "SELECT characters.level, characters.char_name, clan_data.clan_id, clan_data.clan_level, clan_data.clan_name, clan_data.reputation_score, clan_data.exp FROM characters, clan_data WHERE characters.charId = clan_data.leader_id AND characters.clanid = clan_data.clan_id AND dissolving_expiry_time = 0 ORDER BY exp DESC LIMIT " + PLAYER_LIMIT; private static final String GET_CURRENT_CYCLE_DATA = "SELECT characters.char_name, characters.level, characters.base_class, characters.clanid, olympiad_nobles.charId, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost FROM characters, olympiad_nobles WHERE characters.charId = olympiad_nobles.charId ORDER BY olympiad_nobles.olympiad_points DESC LIMIT " + PLAYER_LIMIT; @@ -232,18 +233,22 @@ public class RankManager int i = 1; while (rset.next()) { - final StatSet player = new StatSet(); - final int charId = rset.getInt("charId"); - player.set("charId", charId); - player.set("name", rset.getString("char_name")); - player.set("level", rset.getInt("charLevel")); - player.set("petLevel", rset.getInt("petLevel")); - player.set("clanName", rset.getInt("clanid") > 0 ? ClanTable.getInstance().getClan(rset.getInt("clanid")).getName() : ""); - player.set("petType", PetDataTable.getInstance().getTypeByIndex(rset.getInt("index"))); - player.set("exp", rset.getLong("exp")); - player.set("controlledItemObjId", rset.getInt("item_obj_id")); - _mainPetList.put(i, player); - i++; + final StatSet pet = new StatSet(); + final int controlledItemObjId = rset.getInt("item_obj_id"); + pet.set("controlledItemObjId", controlledItemObjId); + pet.set("name", PetDataTable.getInstance().getNameByItemObjectId(controlledItemObjId)); + pet.set("ownerId", rset.getInt("charId")); + pet.set("owner_name", rset.getString("char_name")); + pet.set("owner_race", rset.getString("char_race")); + pet.set("owner_level", rset.getInt("char_level")); + pet.set("level", rset.getInt("petLevel")); + pet.set("evolve_level", rset.getInt("evolveLevel")); + pet.set("exp", rset.getLong("exp")); + pet.set("clanName", rset.getInt("clanid") > 0 ? ClanTable.getInstance().getClan(rset.getInt("clanid")).getName() : ""); + final PetData petData = PetDataTable.getInstance().getPetDataByItemId(rset.getInt("item_id")); + pet.set("petType", petData.getType()); + pet.set("npcId", petData.getNpcId()); + _mainPetList.put(i++, pet); } } } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java index f10148af7e..815737b35e 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java @@ -2,25 +2,24 @@ package org.l2jmobius.gameserver.network.clientpackets.pet; import java.util.List; import java.util.Map.Entry; -import java.util.stream.Collectors; import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.data.xml.NpcData; import org.l2jmobius.gameserver.data.xml.PetDataTable; -import org.l2jmobius.gameserver.data.xml.PetTypesListData; -import org.l2jmobius.gameserver.data.xml.SkillData; +import org.l2jmobius.gameserver.data.xml.PetTypeData; import org.l2jmobius.gameserver.enums.EvolveLevel; import org.l2jmobius.gameserver.model.PetData; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.instance.Pet; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; /** - * Written by Berezkin Nikolay, on 25.04.2021 + * @author Berezkin Nikolay, Mobius */ public class ExEvolvePet implements IClientIncomingPacket { @@ -79,23 +78,26 @@ public class ExEvolvePet implements IClientIncomingPacket final NpcTemplate npcTemplate = NpcData.getInstance().getTemplate(evolveLevel == EvolveLevel.Second ? pet.getId() + 2 : petData.getNpcId()); final Pet evolved = Pet.spawnPet(npcTemplate, activeChar, controlItem); - if (evolved == null) { return; } + + if (evolveLevel == EvolveLevel.First) + { + final Entry skillType = PetTypeData.getInstance().getRandomSkill(); + final String name = PetTypeData.getInstance().getNamePrefix(skillType.getKey()) + " " + PetTypeData.getInstance().getRandomName(); + evolved.addSkill(skillType.getValue().getSkill()); + evolved.setName(name); + PetDataTable.getInstance().setPetName(controlItem.getObjectId(), name); + } + activeChar.setPet(evolved); evolved.setShowSummonAnimation(true); evolved.setEvolveLevel(evolveLevel); evolved.setRunning(); evolved.storeEvolvedPets(evolveLevel.ordinal(), evolved.getPetData().getIndex(), controlItem.getObjectId()); controlItem.setEnchantLevel(evolved.getLevel()); - if (evolveLevel == EvolveLevel.First) - { - final List>> specialTypes = PetTypesListData.getInstance().getTypes().entrySet().stream().filter(it -> it.getValue().getKey() != 0).collect(Collectors.toList()); - final int randomIndex = Rnd.get(specialTypes.size() - 1); - evolved.addSkill(SkillData.getInstance().getSkill(specialTypes.get(randomIndex).getValue().getKey(), specialTypes.get(randomIndex).getValue().getValue())); - } evolved.spawnMe(pet.getX(), pet.getY(), pet.getZ()); evolved.startFeed(); } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/ranking/RequestPetRankingList.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/ranking/RequestPetRankingList.java index 9e33b16788..b512a75dae 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/ranking/RequestPetRankingList.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/ranking/RequestPetRankingList.java @@ -23,14 +23,14 @@ import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.serverpackets.ranking.ExPetRankingList; /** - * Written by Berezkin Nikolay, on 10.05.2021 + * @author Mobius */ public class RequestPetRankingList implements IClientIncomingPacket { private int _season; private int _tabId; private int _type; - private int _race; + private int _petItemObjectId; @Override public boolean read(GameClient client, PacketReader packet) @@ -38,7 +38,7 @@ public class RequestPetRankingList implements IClientIncomingPacket _season = packet.readC(); _tabId = packet.readC(); _type = packet.readC(); - _race = packet.readD(); + _petItemObjectId = packet.readD(); return true; } @@ -51,6 +51,6 @@ public class RequestPetRankingList implements IClientIncomingPacket return; } - player.sendPacket(new ExPetRankingList(player, _season, _tabId, _type, _race)); + player.sendPacket(new ExPetRankingList(player, _season, _tabId, _type, _petItemObjectId)); } } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ranking/ExPetRankingList.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ranking/ExPetRankingList.java index 8fd721e11a..e6038afc05 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ranking/ExPetRankingList.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ranking/ExPetRankingList.java @@ -33,7 +33,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; /** - * Written by Berezkin Nikolay, on 10.05.2021 + * @author Mobius */ public class ExPetRankingList implements IClientOutgoingPacket { @@ -41,17 +41,17 @@ public class ExPetRankingList implements IClientOutgoingPacket private final int _season; private final int _tabId; private final int _type; - private final int _race; + private final int _petItemObjectId; private final Map _playerList; private final Map _snapshotList; - public ExPetRankingList(Player player, int season, int tabId, int type, int race) + public ExPetRankingList(Player player, int season, int tabId, int type, int petItemObjectId) { _player = player; _season = season; _tabId = tabId; _type = type; - _race = race; + _petItemObjectId = petItemObjectId; _playerList = RankManager.getInstance().getPetRankList(); _snapshotList = RankManager.getInstance().getSnapshotPetRankList(); } @@ -62,13 +62,12 @@ public class ExPetRankingList implements IClientOutgoingPacket OutgoingPackets.EX_PET_RANKING_LIST.writeId(packet); packet.writeC(_season); packet.writeC(_tabId); - packet.writeC(_type); - packet.writeD(_race); - packet.writeC(0); - if (!_playerList.isEmpty() && (_type != 255) && (_race != 255)) + packet.writeH(_type); + packet.writeD(_petItemObjectId); + if (!_playerList.isEmpty()) { - final RankingCategory category = RankingCategory.values()[_season]; - writeFilteredRankingData(packet, category, category.getScopeByGroup(_tabId)); + final RankingCategory category = RankingCategory.values()[_tabId]; + writeFilteredRankingData(packet, category, category.getScopeByGroup(_season)); } else { @@ -141,22 +140,22 @@ public class ExPetRankingList implements IClientOutgoingPacket for (Entry data : limited.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList())) { int curRank = rank++; - final StatSet player = data.getValue(); - packet.writeH(0); - packet.writeString(player.getString("name")); - packet.writeString(player.getString("clanName")); - packet.writeD(player.getInt("exp")); - packet.writeH(player.getInt("petType")); - packet.writeH(player.getInt("petLevel")); - packet.writeH(3); - packet.writeH(player.getInt("level")); + final StatSet pet = data.getValue(); + packet.writeString(pet.getString("name")); + packet.writeString(pet.getString("owner_name")); + packet.writeString(pet.getString("clanName")); + packet.writeD(1000000 + pet.getInt("npcId")); + packet.writeH(pet.getInt("petType")); + packet.writeH(pet.getInt("level")); + packet.writeH(pet.getInt("owner_race")); + packet.writeH(pet.getInt("owner_level")); packet.writeD(scope == RankingScope.SELF ? data.getKey() : curRank); // server rank if (!snapshot.isEmpty()) { for (Entry ssData : snapshot.stream().sorted(Entry.comparingByKey()).collect(Collectors.toList())) { final StatSet snapshotData = ssData.getValue(); - if (player.getInt("controlledItemObjId") == snapshotData.getInt("controlledItemObjId")) + if (pet.getInt("controlledItemObjId") == snapshotData.getInt("controlledItemObjId")) { packet.writeD(scope == RankingScope.SELF ? ssData.getKey() : curRank); // server rank snapshot }