bura 0 Опубликовано 19 ноября, 2018 Всем кто читает здоровья и счастье желаю, К вопросу, я отредактировал код от банковой системы в L2Jmobius удачно до места уничтожения предметаИД(57), при попытки выполнить код дальше выводит ошибки =( Отредактированный код. Спойлер /* * 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 <http://www.gnu.org/licenses/>. */ package handlers.voicedcommandhandlers; import com.l2jmobius.Config; import com.l2jmobius.gameserver.handler.IVoicedCommandHandler; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.util.BuilderUtil; import com.l2jmobius.gameserver.data.xml.impl.ExperienceData; import com.l2jmobius.gameserver.model.L2Object; import com.l2jmobius.gameserver.model.actor.L2Playable; /** * This class trades Gold Bars for Adena and vice versa. * @author ЫыЫ */ public class Banking implements IVoicedCommandHandler { private static final String[] _voicedCommands = { "bank", "withdraw", "deposit", "delevel" }; @Override public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params) { if (command.equals("bank")) { activeChar.sendMessage(".deposit (" + Config.BANKING_SYSTEM_ADENA + " Adena = " + Config.BANKING_SYSTEM_GOLDBARS + " Goldbar) / .withdraw (" + Config.BANKING_SYSTEM_GOLDBARS + " Goldbar = " + Config.BANKING_SYSTEM_ADENA + " Adena)"); } Убрал лишнию часть кода для вставки в форум else if (command.equals("delevel")) { if (activeChar.getInventory().getInventoryItemCount(57, 0) >= 500) { if (!activeChar.reduceAdena("Adena", 500, activeChar, false)) { return false; } activeChar.getInventory().updateDatabase(); activeChar.sendMessage("Thank you, you have reduced your to " + 1 + " level, and " + 500 + " less Adena."); final L2Object targetChar = activeChar.getTarget(); final L2PcInstance targetPlayer = (L2PcInstance) targetChar; int blvl = activeChar.getLevel(); int dlvl = 1; /*comm delevel to 1*/ int clvl = blvl - dlvl; byte lvl = (byte)clvl; targetPlayer.getStat().setLevel(lvl); } else { activeChar.sendMessage("You do not have enough Adena to delevel, you need " + 500 + " Adena."); } } return true; } @Override public String[] getVoicedCommandList() { return _voicedCommands; } } Лог выполнения GameServer Спойлер 19/11 17:18:19] GameServer: Started, using 623 of 3993 MB total memory. [19/11 17:18:19] GameServer: Geodata use 241 MB of memory. [19/11 17:18:19] GameServer: Maximum number of connected players is 2000. [19/11 17:18:19] GameServer: Server loaded in 66 seconds. [19/11 17:18:20] ClientNetworkManager: Listening on 192.168.1.8:7778 [19/11 17:18:20] LoginServerThread: Connecting to login on 192.168.1.8:9014 [19/11 17:18:20] LoginServerThread: Registered on login as Server 5: Erica Exception for: [Character: Avatar[268462926] - Account: qasw - IP: 192.168.1.8] on packet.run: Say2 java.lang.NullPointerException at handlers.voicedcommandhandlers.Banking.useVoicedCommand(Banking.java:101) at handlers.chathandlers.ChatGeneral.handleChat(ChatGeneral.java:67) at com.l2jmobius.gameserver.network.clientpackets.Say2.run(Say2.java:223) at com.l2jmobius.gameserver.network.clientpackets.Say2.run(Say2.java:44) at com.l2jmobius.gameserver.network.L2GameClient.channelRead0(L2GameClient.java:136) at com.l2jmobius.gameserver.network.L2GameClient.channelRead0(L2GameClient.java:63) at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:103) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1342) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:934) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138) at java.lang.Thread.run(Unknown Source) Ссылка на сборку click ME! P.S. Думаю не правильно написан данный кусок кода final L2Object targetChar = activeChar.getTarget(); final L2PcInstance targetPlayer = (L2PcInstance) targetChar; int blvl = activeChar.getLevel(); int dlvl = 1; /*comm delevel to 1*/ int clvl = blvl - dlvl; byte lvl = (byte)clvl; targetPlayer.getStat().setLevel(lvl); Без данной части кода работает , гы сдерает 500 аден Также под рукой нет самих исходников, для полного разбора что-да как, другие сборки не предлагать ПЖЛ Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
CalypsoToolz 451 Опубликовано 19 ноября, 2018 (изменено) Ошибка скорее всего возникает при попытке получить таргет игрока (вероятно не удачный копипаст, ибо не логично что делевел идёт не на используемого игрока) А вообще, ответ на 101 строке скрипта Изменено 19 ноября, 2018 пользователем CalypsoToolz Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
bura 0 Опубликовано 19 ноября, 2018 2 часа назад, CalypsoToolz сказал: Ошибка скорее всего возникает при попытке получить таргет игрока (вероятно не удачный копипаст, ибо не логично что делевел идёт не на используемого игрока) А вообще, ответ на 101 строке скрипта Дак, я тоже понял это позже и фикснул =) activeChar.getStat().setLevel(lvl); Обнаружено, что лвл падает , но опыт который был накоплен в течении периода развития персонажа не уменьшается. Нужно как-то подстроить activeChar.getStat().removeExpAndSp((activeChar.getExp() - Experience.LEVEL[activeChar.getStat().getLevel() - 1]), 0); Есть у кого желание помочь ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
bura 0 Опубликовано 19 ноября, 2018 (изменено) Дак еще разработал делевел на принципе команды setLevel(lvl) Спойлер /* * 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 <http://www.gnu.org/licenses/>. */ package handlers.voicedcommandhandlers; import java.util.StringTokenizer; import com.l2jmobius.Config; import com.l2jmobius.gameserver.handler.IVoicedCommandHandler; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.util.BuilderUtil; import com.l2jmobius.gameserver.data.xml.impl.ExperienceData; import com.l2jmobius.gameserver.model.L2Object; import com.l2jmobius.gameserver.model.actor.L2Playable; /** * This class trades Gold Bars for Adena and vice versa. * @author Ahmed */ public class Banking implements IVoicedCommandHandler { private static final String[] _voicedCommands = { "delevel40", "delevel45", "delevel50", "delevel55", "delevel60", "delevel65" }; @Override public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params) { if (command.equals("delevel40")) { final StringTokenizer st = new StringTokenizer(command, " "); final String actualCommand = st.nextToken(); // Get actual command if (activeChar.getInventory().getInventoryItemCount(57, 0) >= 500) { if (!activeChar.reduceAdena("Adena", 500, activeChar, false)) { return false; } activeChar.getInventory().updateDatabase(); activeChar.sendMessage("Thank you, you have reduced your to " + 1 + " level, and " + 500 + " less Adena."); String val = "40"; final byte lvl = Byte.parseByte(val); activeChar.getStat().setLevel(lvl); } else { activeChar.sendMessage("You do not have enough Adena to delevel, you need " + 500 + " Adena."); } } return true; } @Override public String[] getVoicedCommandList() { return _voicedCommands; } } На этом принципе можно как-то долго сделать дешманский "delevel" с кучами предусмотренных условий от багов setLevel() -а, но легче будет если подстроить под себя: activeChar.getStat().removeExpAndSp((activeChar.getExp() - Experience.LEVEL[activeChar.getStat().getLevel() - 1]), 0); Изменено 19 ноября, 2018 пользователем bura "targetPlayer.getStat().setLevel(lvl);" - замена на "activeChar.getStat().setLevel(lvl);" Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
bura 0 Опубликовано 19 ноября, 2018 Дак 3 минуты назад, bura сказал: Дак еще разработал делевел на принципе команды setLevel(lvl) Длинный код (Показать контент) /* * 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 <http://www.gnu.org/licenses/>. */ package handlers.voicedcommandhandlers; import java.util.StringTokenizer; import com.l2jmobius.Config; import com.l2jmobius.gameserver.handler.IVoicedCommandHandler; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.util.BuilderUtil; import com.l2jmobius.gameserver.data.xml.impl.ExperienceData; import com.l2jmobius.gameserver.model.L2Object; import com.l2jmobius.gameserver.model.actor.L2Playable; /** * This class trades Gold Bars for Adena and vice versa. * @author Ahmed */ public class Banking implements IVoicedCommandHandler { private static final String[] _voicedCommands = { "delevel40", "delevel45", "delevel50", "delevel55", "delevel60", "delevel65" }; @Override public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params) { if (command.equals("delevel40")) { final StringTokenizer st = new StringTokenizer(command, " "); final String actualCommand = st.nextToken(); // Get actual command if (activeChar.getInventory().getInventoryItemCount(57, 0) >= 500) { if (!activeChar.reduceAdena("Adena", 500, activeChar, false)) { return false; } activeChar.getInventory().updateDatabase(); activeChar.sendMessage("Thank you, you have reduced your to " + 1 + " level, and " + 500 + " less Adena."); String val = "40"; final byte lvl = Byte.parseByte(val); activeChar.getStat().setLevel(lvl); } else { activeChar.sendMessage("You do not have enough Adena to delevel, you need " + 500 + " Adena."); } } return true; } @Override public String[] getVoicedCommandList() { return _voicedCommands; } } На этом принципе можно как-то долго сделать дешманский "delevel" с кучами предусмотренных условий от багов setLevel() -а, но легче будет если подстроить под себя: activeChar.getStat().removeExpAndSp((activeChar.getExp() - Experience.LEVEL[activeChar.getStat().getLevel() - 1]), 0); Спойлер ERROR: C:\Users\NoName\Desktop\L2J_Mobius_Classic_2.2_Antharas\game — копия\data\scripts\handlers\voicedcommandhandlers\Banking.java, Line 61, Column 46 code: 33554515 message: Experience cannot be resolved to a variable at com.l2jmobius.gameserver.scripting.java.JavaExecutionContext.executeScripts(JavaExecutionContext.java:176) at com.l2jmobius.gameserver.scripting.java.JavaExecutionContext.executeScript(JavaExecutionContext.java:248) at com.l2jmobius.gameserver.scripting.ScriptEngineManager.executeScript(ScriptEngineManager.java:363) at com.l2jmobius.gameserver.scripting.ScriptEngineManager.executeMasterHandler(ScriptEngineManager.java:240) at com.l2jmobius.gameserver.GameServer.<init>(GameServer.java:360) at com.l2jmobius.gameserver.GameServer.main(GameServer.java:481) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
bura 0 Опубликовано 19 ноября, 2018 (изменено) /* * 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 <http://www.gnu.org/licenses/>. */ package handlers.voicedcommandhandlers; import com.l2jmobius.Config; import com.l2jmobius.gameserver.handler.IVoicedCommandHandler; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; /** * This class trades Gold Bars for Adena and vice versa. * @author Ahmed */ public class Banking implements IVoicedCommandHandler { private static final String[] _voicedCommands = { "delevel" }; @Override public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params) { if (command.equals("delevel")) { if (activeChar.getInventory().getInventoryItemCount(57, 0) >= 1000000) { if (!activeChar.reduceAdena("Adena", 1000000, activeChar, false)) { return false; } activeChar.getInventory().updateDatabase(); activeChar.sendMessage("Thank you, you have reduced your to " + 1 + " level, and " + 1000000 + " less Adena."); int blvl = activeChar.getLevel(); int dlvl = 1; int clvl = blvl - dlvl; byte lvl = (byte)clvl; activeChar.getStat().setLevel(lvl); activeChar.setExp(ExperienceData.getInstance().getExpForLevel(lvl)); activeChar.broadcastUserInfo(); } else { activeChar.sendMessage("You do not have enough Adena to delevel, you need " + 1000000 + " Adena."); } } return true; } @Override public String[] getVoicedCommandList() { return _voicedCommands; } } Изменено 19 ноября, 2018 пользователем bura Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
bura 0 Опубликовано 19 ноября, 2018 (изменено) Команда работает , слив есть , надо доработать для не получения бан чата Спойлер import com.l2jmobius.gameserver.handler.IVoicedCommandHandler; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.util.BuilderUtil; import com.l2jmobius.gameserver.data.xml.impl.ExperienceData; import com.l2jmobius.gameserver.model.L2Object; import com.l2jmobius.gameserver.model.actor.L2Playable; Изменено 19 ноября, 2018 пользователем bura Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты