diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java index 4a4aa7c754..c3c19b7379 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java @@ -49,6 +49,7 @@ import org.l2jmobius.gameserver.network.clientpackets.awakening.RequestCallToCha import org.l2jmobius.gameserver.network.clientpackets.ceremonyofchaos.RequestCancelCuriousHouse; import org.l2jmobius.gameserver.network.clientpackets.ceremonyofchaos.RequestCuriousHouseHtml; import org.l2jmobius.gameserver.network.clientpackets.ceremonyofchaos.RequestJoinCuriousHouse; +import org.l2jmobius.gameserver.network.clientpackets.classchange.ExRequestClassChange; import org.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionBuyInfo; import org.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionBuyItem; import org.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionCancel; @@ -467,7 +468,7 @@ public enum ExIncomingPackets implements IIncomingPackets EX_TRY_ENCHANT_ARTIFACT(0x160, null, ConnectionState.IN_GAME), // 152 EX_XIGN_CODE(0x161, null, ConnectionState.IN_GAME), // 152 EX_OPEN_HTML(0x164, ExOpenDimensionalHtml::new, ConnectionState.IN_GAME), // 228 - EX_REQUEST_CLASS_CHANGE(0x165, null, ConnectionState.IN_GAME), // 228 + EX_REQUEST_CLASS_CHANGE(0x165, ExRequestClassChange::new, ConnectionState.IN_GAME), // 228 EX_REQUEST_CLASS_CHANGE_VERIFYING(0x166, null, ConnectionState.IN_GAME), // 228 EX_REQUEST_TELEPORT(0x167, ExRequestTeleport::new, ConnectionState.IN_GAME), // 228 EX_COSTUME_COLLECTION_SKILL_ACTIVE(0x16B, null, ConnectionState.IN_GAME), // 228 diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/classchange/ExRequestClassChange.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/classchange/ExRequestClassChange.java new file mode 100644 index 0000000000..a9d7ffb8ee --- /dev/null +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/classchange/ExRequestClassChange.java @@ -0,0 +1,118 @@ +/* + * 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.network.clientpackets.classchange; + +import org.l2jmobius.Config; +import org.l2jmobius.commons.network.PacketReader; +import org.l2jmobius.gameserver.data.xml.impl.CategoryData; +import org.l2jmobius.gameserver.data.xml.impl.SkillData; +import org.l2jmobius.gameserver.data.xml.impl.SkillTreesData; +import org.l2jmobius.gameserver.enums.CategoryType; +import org.l2jmobius.gameserver.model.SkillLearn; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; +import org.l2jmobius.gameserver.model.base.ClassId; +import org.l2jmobius.gameserver.network.GameClient; +import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; +import org.l2jmobius.gameserver.network.serverpackets.PlaySound; + +/** + * @author Mobius + */ +public class ExRequestClassChange implements IClientIncomingPacket +{ + private int _classId; + + @Override + public boolean read(GameClient client, PacketReader packet) + { + _classId = packet.readD(); + return true; + } + + @Override + public void run(GameClient client) + { + final PlayerInstance player = client.getPlayer(); + if (player == null) + { + return; + } + + boolean properId = false; + for (ClassId cId : player.getClassId().getNextClassIds()) + { + if (cId.getId() == _classId) + { + properId = true; + break; + } + } + if (!properId) + { + LOGGER.warning(player + " tried to change class from " + player.getClassId() + " to " + ClassId.getClassId(_classId) + "."); + return; + } + + boolean canChange = false; + final int playerLevel = player.getLevel(); + if (player.isInCategory(CategoryType.FIRST_CLASS_GROUP) && (playerLevel >= 18)) + { + canChange = CategoryData.getInstance().isInCategory(CategoryType.SECOND_CLASS_GROUP, _classId); + } + else if (player.isInCategory(CategoryType.SECOND_CLASS_GROUP) && (playerLevel >= 38)) + { + canChange = CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, _classId); + } + else if (player.isInCategory(CategoryType.THIRD_CLASS_GROUP) && (playerLevel >= 76)) + { + canChange = CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, _classId); + } + else if (player.isInCategory(CategoryType.FOURTH_CLASS_GROUP) && (playerLevel >= 85)) + { + canChange = CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, _classId); + } + + if (canChange) + { + player.setClassId(_classId); + if (player.isSubClassActive()) + { + player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass()); + } + else + { + player.setBaseClass(player.getActiveClass()); + } + if (player.isInCategory(CategoryType.SIXTH_CLASS_GROUP)) + { + SkillTreesData.getInstance().cleanSkillUponAwakening(player); + for (SkillLearn skill : SkillTreesData.getInstance().getRaceSkillTree(player.getRace())) + { + player.addSkill(SkillData.getInstance().getSkill(skill.getSkillId(), skill.getSkillLevel()), true); + } + } + if (Config.AUTO_LEARN_SKILLS) + { + player.giveAvailableSkills(Config.AUTO_LEARN_FS_SKILLS, Config.AUTO_LEARN_FP_SKILLS, true); + } + player.store(false); // Save player cause if server crashes before this char is saved, he will lose class. + player.broadcastUserInfo(); + player.sendSkillList(); + player.sendPacket(new PlaySound("ItemSound.quest_fanfare_2")); + } + } +} diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/classchange/ExRequestClassChangeUi.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/classchange/ExRequestClassChangeUi.java new file mode 100644 index 0000000000..8203d29460 --- /dev/null +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/classchange/ExRequestClassChangeUi.java @@ -0,0 +1,40 @@ +/* + * 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.network.serverpackets.classchange; + +import org.l2jmobius.commons.network.PacketWriter; +import org.l2jmobius.gameserver.network.OutgoingPackets; +import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; + +/** + * @author Mobius + */ +public class ExRequestClassChangeUi implements IClientOutgoingPacket +{ + public static final ExRequestClassChangeUi STATIC_PACKET = new ExRequestClassChangeUi(); + + public ExRequestClassChangeUi() + { + } + + @Override + public boolean write(PacketWriter packet) + { + OutgoingPackets.EX_REQUEST_CLASS_CHANGE.writeId(packet); + return true; + } +} diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java index 396b0d927c..0f9aec89d0 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java @@ -40,6 +40,7 @@ import org.l2jmobius.gameserver.network.clientpackets.attributechange.SendChange import org.l2jmobius.gameserver.network.clientpackets.ceremonyofchaos.RequestCancelCuriousHouse; import org.l2jmobius.gameserver.network.clientpackets.ceremonyofchaos.RequestCuriousHouseHtml; import org.l2jmobius.gameserver.network.clientpackets.ceremonyofchaos.RequestJoinCuriousHouse; +import org.l2jmobius.gameserver.network.clientpackets.classchange.ExRequestClassChange; import org.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionBuyInfo; import org.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionBuyItem; import org.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionCancel; @@ -457,7 +458,7 @@ public enum ExIncomingPackets implements IIncomingPackets EX_TRY_ENCHANT_ARTIFACT(0x160, null, ConnectionState.IN_GAME), // 152 EX_XIGN_CODE(0x161, null, ConnectionState.IN_GAME), // 152 EX_OPEN_HTML(0x164, ExOpenDimensionalHtml::new, ConnectionState.IN_GAME), // 228 - EX_REQUEST_CLASS_CHANGE(0x165, null, ConnectionState.IN_GAME), // 228 + EX_REQUEST_CLASS_CHANGE(0x165, ExRequestClassChange::new, ConnectionState.IN_GAME), // 228 EX_REQUEST_CLASS_CHANGE_VERIFYING(0x166, null, ConnectionState.IN_GAME), // 228 EX_REQUEST_TELEPORT(0x167, ExRequestTeleport::new, ConnectionState.IN_GAME), // 228 EX_COSTUME_COLLECTION_SKILL_ACTIVE(0x16B, null, ConnectionState.IN_GAME), // 228 diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/classchange/ExRequestClassChange.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/classchange/ExRequestClassChange.java new file mode 100644 index 0000000000..8270d8f7d0 --- /dev/null +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/classchange/ExRequestClassChange.java @@ -0,0 +1,104 @@ +/* + * 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.network.clientpackets.classchange; + +import org.l2jmobius.Config; +import org.l2jmobius.commons.network.PacketReader; +import org.l2jmobius.gameserver.data.xml.impl.CategoryData; +import org.l2jmobius.gameserver.enums.CategoryType; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; +import org.l2jmobius.gameserver.model.base.ClassId; +import org.l2jmobius.gameserver.network.GameClient; +import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; +import org.l2jmobius.gameserver.network.serverpackets.PlaySound; + +/** + * @author Mobius + */ +public class ExRequestClassChange implements IClientIncomingPacket +{ + private int _classId; + + @Override + public boolean read(GameClient client, PacketReader packet) + { + _classId = packet.readD(); + return true; + } + + @Override + public void run(GameClient client) + { + final PlayerInstance player = client.getPlayer(); + if (player == null) + { + return; + } + + boolean properId = false; + for (ClassId cId : player.getClassId().getNextClassIds()) + { + if (cId.getId() == _classId) + { + properId = true; + break; + } + } + if (!properId) + { + LOGGER.warning(player + " tried to change class from " + player.getClassId() + " to " + ClassId.getClassId(_classId) + "!"); + return; + } + + boolean canChange = false; + final int playerLevel = player.getLevel(); + if (player.isInCategory(CategoryType.FIRST_CLASS_GROUP) && (playerLevel >= 18)) + { + canChange = CategoryData.getInstance().isInCategory(CategoryType.SECOND_CLASS_GROUP, _classId); + } + else if (player.isInCategory(CategoryType.SECOND_CLASS_GROUP) && (playerLevel >= 38)) + { + canChange = CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, _classId); + } + else if (player.isInCategory(CategoryType.THIRD_CLASS_GROUP) && (playerLevel >= 76)) + { + canChange = CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, _classId); + } + + if (canChange) + { + player.setClassId(_classId); + if (player.isSubClassActive()) + { + player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass()); + } + else + { + player.setBaseClass(player.getActiveClass()); + } + + if (Config.AUTO_LEARN_SKILLS) + { + player.giveAvailableSkills(Config.AUTO_LEARN_FS_SKILLS, true); + } + player.store(false); // Save player cause if server crashes before this char is saved, he will lose class. + player.broadcastUserInfo(); + player.sendSkillList(); + player.sendPacket(new PlaySound("ItemSound.quest_fanfare_2")); + } + } +} diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/classchange/ExRequestClassChangeUi.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/classchange/ExRequestClassChangeUi.java new file mode 100644 index 0000000000..8203d29460 --- /dev/null +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/classchange/ExRequestClassChangeUi.java @@ -0,0 +1,40 @@ +/* + * 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.network.serverpackets.classchange; + +import org.l2jmobius.commons.network.PacketWriter; +import org.l2jmobius.gameserver.network.OutgoingPackets; +import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; + +/** + * @author Mobius + */ +public class ExRequestClassChangeUi implements IClientOutgoingPacket +{ + public static final ExRequestClassChangeUi STATIC_PACKET = new ExRequestClassChangeUi(); + + public ExRequestClassChangeUi() + { + } + + @Override + public boolean write(PacketWriter packet) + { + OutgoingPackets.EX_REQUEST_CLASS_CHANGE.writeId(packet); + return true; + } +}