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
}