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(); }