diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/db_installer/sql/game/pets.sql b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/db_installer/sql/game/pets.sql
index 4ffa7cd2b6..58b188bbcd 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/db_installer/sql/game/pets.sql
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/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_4.2_DwellingOfSpirits/dist/game/data/PetTypes.xml b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/PetTypes.xml
index ac8abd26f9..fba419fb50 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/PetTypes.xml
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/PetTypes.xml
@@ -1,171 +1,171 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/PetTypes.xsd b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/PetTypes.xsd
index a5cadaa23a..d39fbea6a5 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/PetTypes.xsd
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/PetTypes.xsd
@@ -8,8 +8,9 @@
-
-
+
+
+
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java
index af2313fb4c..bf5a470a71 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java
@@ -91,7 +91,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;
@@ -366,7 +366,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_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java
index e444792dd0..0dfecabeae 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/PetDataTable.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/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_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/PetTypeData.java
new file mode 100644
index 0000000000..f2c87eb9c8
--- /dev/null
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/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_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/PetTypesListData.java
deleted file mode 100644
index e5c4aede0d..0000000000
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/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_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/PetData.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/PetData.java
index de645c8cd6..05421daeae 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/PetData.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/PetData.java
@@ -47,14 +47,13 @@ public class PetData
private final int _petType;
private final int _index;
private final int _type;
+ private final EvolveLevel _evolveLevel;
public EvolveLevel getEvolveLevel()
{
- return evolveLevel == null ? EvolveLevel.None : evolveLevel;
+ return _evolveLevel == null ? EvolveLevel.None : _evolveLevel;
}
- private final EvolveLevel evolveLevel;
-
public int getIndex()
{
return _index;
@@ -70,9 +69,9 @@ public class PetData
_npcId = npcId;
_itemId = itemId;
_petType = petType;
- this.evolveLevel = evolveLevel;
- this._index = index;
- this._type = type;
+ _evolveLevel = evolveLevel;
+ _index = index;
+ _type = type;
}
/**
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java
index f10148af7e..815737b35e 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/pet/ExEvolvePet.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/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();
}