-
Публикаций
68 -
Зарегистрирован
-
Посещение
-
Отзывы
0%
Сообщения, опубликованные 0000
-
-
Открой любой ГК, посмотри как он реализован, можешь тупо поменять координаты либо по примеру создать ещё одну локацию. Это обычно в бд прописано
-
Решение простое, указан не верный или кривой предмет предмет в шопе(цена), допустим в место id 4037, указан id монеты контрой не существует или не внесён в базу/в патч!
-
3 часа назад, SteveDogs сказал:Решить вопрос с offline Трейдом возможно, но у тебя дальше будут возникать вопросы по спойлу/крафту/квестам по этому это не имеет смысла пвсофт не адаптирован под лоу-рейт или крафт-пвп или мультикрафт сервера.
Понимаю, но основные нужные квесту я проверил пашут на ура, а чтобы все прям вряд ли такой онлайн ещё соберём так что тех что проверил достаточно, и крафт потыкал, рецепт исчезает когда добавляешь его свой список, на некоторых сборка он не исчезает, а у нас исчезает если уровень рецепта не тот, а гномом если уровень тот то все норм. Так что это не так критично, хоть куда ковырять с трейдом можешь подсказать ? уверен у многих этот вопрос возник и уже решено все, будет полезен в дальнейшем ещё кому. Может сборка или есть ядро рабочее скиньте пожалуйста, сам попробую разобраться
-
22 часа назад, SteveDogs сказал:ну во первых мы не знаем какая у тебя сборка, за какую дату как минимум.
во вторых Николай(фокстрот) в свое время выключал специально offline из-за дюпа.Сборка исходники которые в шаре, и что это никак нельзя его норм запустить ? Хочу х100 на pow, знаю щас налетите тип идиот есть люся для этого и тд. но я хочу так. А без офлайн треда на х100 не особо, хотя можно тупо выставить чтобы не восстанавливались, тогда как крафтом заниматься :(
-
Привет всем! Кто знает как исправить офлайн трейд на PW SOFT?
Проблема такая, садишься продавать все нормально, но как только делаешь рестарт не восстанавливает, в гс ошибка. Всех кто посоветует смотреть тему которая посвящена это вопросу, там нету ответа, точнее не работает то что предложно. Кто знает как решить данный вопрос, даже не верится что такая ошибка может быть в сборке которой около 10 лет :(
-
21 час назад, ammy сказал:Нет всплывающего окна ? %class_master_list%
Спойлер<html><title>Class Master</title><body><center><br> <font color="e15800">Смена професси для %classname%</font> <img src="l2ui.squaregray" width="295" height="1"> <table width=295> %classlist% </table> <img src="l2ui.squaregray" width="295" height="1"><br> </center></body></html>
Когда всплывает(команда .classmaster или уровень нужный), то выскакивает это окно.
Ну вообще по идее почти полностью изменен файл L2ClassMasterInstance.java так что окна те что должны по идее
А может кто-то знает про эту функцию в PW SOFT, в конфигах есть во многих шаровых ядрах и в исхонике так же, но она не пашет и вот мучаюсь с этим окном...
JOB_WINDOW = Boolean.parseBoolean(altSettings.getProperty("JobWindow", "False"));
Есть какие то мануалы или pw ядро с этим проф окном у кого нибудь, хотя бы через alt+b, поделитесь пожалуйста или ссылку скиньте!
-
7 минут назад, CalypsoToolz сказал:ну тогда только добавить логирование/дебаг и смотреть на каком моменте останавливается выполнение
Спойлер2020.08.20 00:54:09,817 INFO 1 net.sf.l2j.gameserver.AutoRestart #Auto Restart: scheduled at 5 hour. (1685 minutes remaining.) 2020.08.20 00:54:09,840 SEVERE 264 net.sf.l2j.gameserver.datatables.CustomServerData GameServer [ERROR]: Failed to restore offline traders. Reason: null 2020.08.20 00:54:09,883 INFO 263 net.sf.l2j.gameserver.datatables.FakePlayersTablePlus FakePlayersTablePlus: Cached 6000 players. 2020.08.20 00:54:11,496 WARNING 98 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:54:12,480 WARNING 41 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:54:17,778 CONFIG 266 net.sf.l2j.gameserver.datatables.SpawnTable SpawnTable [XML]: spawned 4 territories. 2020.08.20 00:54:23,011 WARNING 45 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:54:28,594 WARNING 118 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:54:30,139 WARNING 98 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:54:33,273 WARNING 88 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:54:51,963 WARNING 77 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:55:00,044 WARNING 135 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:55:01,558 WARNING 48 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:55:08,532 WARNING 128 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:55:14,795 WARNING 31 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead. 2020.08.20 00:55:16,914 WARNING 97 net.sf.l2j.gameserver.ai.AbstractAI Wrong Delay Set in Npc Walker Functions = 0 secs, using default delay: 0 secs instead.
Ничего не показывает (
вот у меня есть догадка, но это так мысль
старое окно профы имеет вид
<td><center><a action="bypass -h npc_%objectId%_class_master">Получить профессию</a></center></td>
новое такой
<td><center><a action="bypass -h vch_classmaster">Получить профессию</a></center></td>
Может в этом есть что то куда можно ковырнуть, на другом ядре то пашет все
-
Да, вот скрин в игре, выбарешь дальше никакой реакции или ошибок в гс
Спойлер/* * 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 2, 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. * * http://www.gnu.org/copyleft/gpl.html */ package scripts.commands; import java.util.Map; import java.util.logging.Logger; import javolution.util.FastMap; import net.sf.l2j.Config; import scripts.commands.voicedcommandhandlers.*; import net.sf.l2j.util.log.AbstractLogger; /** * This class ... * * @version $Revision: 1.1.4.5 $ $Date: 2005/03/27 15:30:09 $ */ public class VoicedCommandHandler { private static Logger _log = AbstractLogger.getLogger(VoicedCommandHandler.class.getName()); private static VoicedCommandHandler _instance; private Map<String, IVoicedCommandHandler> _datatable; public static VoicedCommandHandler getInstance() { if (_instance == null) { _instance = new VoicedCommandHandler(); } return _instance; } private VoicedCommandHandler() { _datatable = new FastMap<String, IVoicedCommandHandler>(); if (Config.CMD_ADENA_COL) { registerVoicedCommandHandler(new AdenaCol()); } if (Config.CMD_EVENTS) { registerVoicedCommandHandler(new Events()); } if (Config.CMD_MENU) { registerVoicedCommandHandler(new Menu()); } if (Config.ALT_ALLOW_OFFLINE_TRADE) { registerVoicedCommandHandler(new Offline()); } if (Config.L2JMOD_ALLOW_WEDDING) { registerVoicedCommandHandler(new Wedding()); } registerVoicedCommandHandler(new Silence()); registerVoicedCommandHandler(new BlockBuff()); registerVoicedCommandHandler(new Security()); //модераторы registerVoicedCommandHandler(new ModBanChat()); registerVoicedCommandHandler(new ModKick()); registerVoicedCommandHandler(new ModTitle()); registerVoicedCommandHandler(new ModHelp()); registerVoicedCommandHandler(new ModSpecial()); if (Config.ALLOW_CLASS_MASTERS) registerVoicedCommandHandler((IVoicedCommandHandler)new ClassMaster()); _log.config("VoicedCommandHandler: Loaded " + _datatable.size() + " handlers."); } public void registerVoicedCommandHandler(IVoicedCommandHandler handler) { String[] ids = handler.getVoicedCommandList(); for (int i = 0; i < ids.length; i++) { //if (Config.DEBUG) _log.fine("Adding handler for command "+ids[i]); _datatable.put(ids[i], handler); } } public IVoicedCommandHandler getVoicedCommandHandler(String voicedCommand) { String command = voicedCommand; if (voicedCommand.indexOf(" ") != -1) { command = voicedCommand.substring(0, voicedCommand.indexOf(" ")); } //if (Config.DEBUG) //_log.fine("getting handler for command: "+command+" -> "+(_datatable.get(command) != null)); return _datatable.get(command); } /** * @return */ public int size() { return _datatable.size(); } }
-
Полностью, вытащил и закинул(не тупо, а именно вникая что куда). Думаю что зарегистрирован(в игре .classmaster появляется окно) Честно не совсем понял о чем именно речь, в каком файле регистрируется ?
-
Всем привет! Добавил себе в ядро PW фишку которой не хватает .classmaster, все прекрасно при достижении 20/40/80 лвл появляется окно, выбираешь профу ничего не происходит, вообще никаких ошибок не показывает! Даже через кота не хочет братся профа. Извлек скрипт из ядра другого pw, полностью то есть конфиги и тд. успешно скомпил без ошибок! Уже неделю ищу, но никаких зацепок даже.
Кто может хоть чем то помочь, зацепку хотя бы ?
Спойлерpackage scripts.commands.voicedcommandhandlers; import java.util.List; import net.sf.l2j.Config; import net.sf.l2j.Config.EventReward; import net.sf.l2j.gameserver.cache.HtmCache; import net.sf.l2j.gameserver.cache.Static; import net.sf.l2j.gameserver.datatables.CharTemplateTable; import net.sf.l2j.gameserver.datatables.ClassRewardsData; import net.sf.l2j.gameserver.datatables.ItemTable; import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.L2Object; import net.sf.l2j.gameserver.model.PcInventory; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.model.base.ClassId; import net.sf.l2j.gameserver.model.base.ClassLevel; import net.sf.l2j.gameserver.model.base.PlayerClass; import net.sf.l2j.gameserver.model.base.SubClass; import net.sf.l2j.gameserver.network.serverpackets.L2GameServerPacket; import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; import scripts.commands.IVoicedCommandHandler; public class ClassMaster implements IVoicedCommandHandler { private static final String[] VOICED_COMMANDS = new String[] { "classmaster" }; public boolean useVoicedCommand(String command, L2PcInstance player, String target) { if (command.equalsIgnoreCase("classmaster")) { showWelcome(player); } else if (command.startsWith("classmaster_")) { String classmaster = command.substring(12).trim(); if (classmaster.startsWith("changeclass")) { int class_id = Integer.parseInt(classmaster.substring(11).trim()); profList(player, class_id); } else if (classmaster.startsWith("reward")) { int set_id = Integer.parseInt(classmaster.substring(6).trim()); giveReward(player, set_id); } } return true; } private void giveReward(L2PcInstance player, int set_id) { if (!player.getShadeItems()) return; player.setShadeItems(false); PcInventory pcInventory = player.getInventory(); List<ClassRewardsData.ClassReward> classreward = (List<ClassRewardsData.ClassReward>)ClassRewardsData.getInstance().getClassRewards().get(set_id); if (classreward == null) { player.sendCritMessage("Ошибка, набора не существует"); return; } for (ClassRewardsData.ClassReward value : classreward) { L2ItemInstance item = ItemTable.getInstance().createItem("ClassReward", value.id, value.count, player); player.addItem("ClassReward", item, null, true); if (value.equip && item.isEquipable()) pcInventory.equipItem(item); if (value.enchant > 0 && item.canBeEnchanted()) item.setEnchantLevel(value.enchant); } player.sendChanges(); player.sendItems(true); ClassLevel classLevel = PlayerClass.values()[player.getClassId().getId()].getLevel(); if ((classLevel == ClassLevel.Second && player.getLevel() >= 40) || (classLevel == ClassLevel.Third && player.getLevel() >= 76)) useVoicedCommand("classmaster", player, null); } private void showWelcome(L2PcInstance player) { ClassId class_id = player.getClassId(); int class_level = class_id.level(); int new_class_level = class_level + 1; int p_level = player.getLevel(); if (((p_level >= 20 && class_level == 0) || (p_level >= 40 && class_level == 1) || (p_level >= 76 && class_level == 2)) && class_id.getId() < 88) { NpcHtmlMessage htm = new NpcHtmlMessage(0); htm.setFile("data/html/classmaster/ClassList.htm"); StringBuilder html = new StringBuilder(); for (ClassId child : ClassId.values()) { if (child.childOf(class_id) && child.level() == new_class_level) html.append("<tr><td align=center><a action=\"bypass -h vch_classmaster_changeclass ").append(child.getId()).append("\">").append(CharTemplateTable.getClassNameById(child.getId())).append("</a></td></tr>"); } htm.replace("%classname%", CharTemplateTable.getClassNameById(class_id.getId())); htm.replace("%classlist%", html.toString()); player.sendPacket((L2GameServerPacket)htm); } else { switch (class_level) { case 0: player.sendCritMessage("Попробуйте, когда получите 20 уровень."); break; case 1: player.sendCritMessage("Попробуйте, когда получите 40 уровень."); break; case 2: player.sendCritMessage("Попробуйте, когда получите 76 уровень."); break; case 3: player.sendCritMessage("Нет доступных профессий."); break; } } } private void profList(L2PcInstance player, int class_id) { int class_level = player.getClassId().level(); int new_class_level = class_level + 1; int p_level = player.getLevel(); EventReward pay = (EventReward)Config.CLASS_MASTERS_PRICES.get(Integer.valueOf(new_class_level)); if (pay != null) { if (player.getItemCount(pay.id) < pay.count) { player.sendCritMessage("C" + pay.count + " " + ItemTable.getInstance().getTemplate(pay.id).getName()); return; } player.destroyItemByItemId("clasmaster", pay.id, pay.count, (L2Object)player, true); } changeClass(player, class_id); player.checkAllowedSkills(); if (class_id >= 88) { player.sendPacket((L2GameServerPacket)Static.THIRD_CLASS_TRANSFER); } else { player.sendPacket((L2GameServerPacket)Static.CLASS_TRANSFER); } if (Config.REWARD_CLASS) if ((Config.REWARD_FIRST_CLASS && class_level == 0) || (Config.REWARD_SECOND_CLASS && class_level == 1) || (Config.REWARD_THIRD_CLASS && class_level == 2)) { player.setShadeItems(true); NpcHtmlMessage html = NpcHtmlMessage.id(0); String htm = HtmCache.getInstance().getHtm("data/html/classmaster/Up_" + new_class_level + ".htm"); html.setHtml(htm); html.replace("%ClassName%", CharTemplateTable.getClassNameById(player.getClassId().getId())); player.sendPacket((L2GameServerPacket)html); } if ((!Config.REWARD_CLASS && ((new_class_level == 1 && p_level >= 40) || (new_class_level == 2 && p_level >= 76))) || (!Config.REWARD_FIRST_CLASS && class_level == 0) || (!Config.REWARD_SECOND_CLASS && class_level == 1)) showWelcome(player); } private void changeClass(L2PcInstance player, int val) { player.abortAttack(); player.abortCast(); player.setIsParalyzed(true); player.setClassId(val); if (player.isSubClassActive()) { ((SubClass)player.getSubClasses().get(Integer.valueOf(player.getClassIndex()))).setClassId(player.getActiveClass()); } else { player.setBaseClass(player.getActiveClass()); } player.rewardSkills(); player.store(); player.broadcastUserInfo(); player.setIsParalyzed(false); } public String[] getVoicedCommandList() { return VOICED_COMMANDS; } }
Спойлер<html><title>Class Master</title><body><center><br> <font color="e15800">Смена професси для %classname%</font> <img src="l2ui.squaregray" width="295" height="1"> <table width=295> %classlist% </table> <img src="l2ui.squaregray" width="295" height="1"><br> </center></body></html>
-
-
-
Привет всем! Скачал исходник pw, возникли две проблемы кто поможет ?
1) Решил добавить .classmaster, взял другое ядро PW где пашет, все вытащил и добавляю себе, вроде все хорошо, но выдает 1 ошибку, в чем проблема может быть ?
Спойлерinit: [mkdir] Created dir: C:\workspace\5\build [mkdir] Created dir: C:\workspace\5\build\classes compile: [javac] Compiling 1441 source files to C:\workspace\5\build\classes [javac] C:\workspace\5\src\scripts\commands\voicedcommandhandlers\ClassMaster.java:136: error: incompatible types: net.sf.l2j.Config.EventReward cannot be converted to net.sf.l2j.gameserver.model.EventReward [javac] /* 136 */ EventReward pay = (EventReward)Config.CLASS_MASTERS_PRICES.get(Integer.valueOf(new_class_level)); [javac] ^ [javac] Note: Some input files use or override a deprecated API. [javac] Note: Recompile with -Xlint:deprecation for details. [javac] Note: Some input files use unchecked or unsafe operations. [javac] Note: Recompile with -Xlint:unchecked for details. [javac] 1 error BUILD FAILED C:\workspace\5\build.xml:31: Compile failed; see the compiler error output for details.
Спойлер/* */ package scripts.commands.voicedcommandhandlers; /* */ /* */ import java.util.List; /* */ import net.sf.l2j.Config; /* */ import net.sf.l2j.gameserver.cache.HtmCache; /* */ import net.sf.l2j.gameserver.cache.Static; /* */ import net.sf.l2j.gameserver.datatables.CharTemplateTable; /* */ import net.sf.l2j.gameserver.datatables.ClassRewardsData; /* */ import net.sf.l2j.gameserver.datatables.ItemTable; /* */ import net.sf.l2j.gameserver.model.EventReward; /* */ import net.sf.l2j.gameserver.model.L2ItemInstance; /* */ import net.sf.l2j.gameserver.model.L2Object; /* */ import net.sf.l2j.gameserver.model.PcInventory; /* */ import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; /* */ import net.sf.l2j.gameserver.model.base.ClassId; /* */ import net.sf.l2j.gameserver.model.base.ClassLevel; /* */ import net.sf.l2j.gameserver.model.base.PlayerClass; /* */ import net.sf.l2j.gameserver.model.base.SubClass; /* */ import net.sf.l2j.gameserver.network.serverpackets.L2GameServerPacket; /* */ import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; /* */ import scripts.commands.IVoicedCommandHandler; /* */ /* */ public class ClassMaster /* */ implements IVoicedCommandHandler { /* 25 */ private static final String[] VOICED_COMMANDS = new String[] { "classmaster" }; /* */ /* */ /* */ /* */ public boolean useVoicedCommand(String command, L2PcInstance player, String target) { /* 30 */ if (command.equalsIgnoreCase("classmaster")) { /* */ /* 32 */ showWelcome(player); /* */ } /* 34 */ else if (command.startsWith("classmaster_")) { /* */ /* 36 */ String classmaster = command.substring(12).trim(); /* 37 */ if (classmaster.startsWith("changeclass")) { /* */ /* 39 */ int class_id = Integer.parseInt(classmaster.substring(11).trim()); /* 40 */ profList(player, class_id); /* */ } /* 42 */ else if (classmaster.startsWith("reward")) { /* */ /* 44 */ int set_id = Integer.parseInt(classmaster.substring(6).trim()); /* 45 */ giveReward(player, set_id); /* */ } /* */ } /* */ /* 49 */ return true; /* */ } /* */ /* */ /* */ private void giveReward(L2PcInstance player, int set_id) { /* 54 */ if (!player.getShadeItems()) { /* */ return; /* */ } /* 57 */ player.setShadeItems(false); /* */ /* 59 */ PcInventory pcInventory = player.getInventory(); /* */ /* 61 */ List<ClassRewardsData.ClassReward> classreward = (List<ClassRewardsData.ClassReward>)ClassRewardsData.getInstance().getClassRewards().get(set_id); /* */ /* 63 */ if (classreward == null) { /* */ /* 65 */ player.sendCritMessage("Ошибка, набора не существует"); /* */ /* */ return; /* */ } /* 69 */ for (ClassRewardsData.ClassReward value : classreward) { /* */ /* 71 */ L2ItemInstance item = ItemTable.getInstance().createItem("ClassReward", value.id, value.count, player); /* 72 */ player.addItem("ClassReward", item, null, true); /* 73 */ if (value.equip && item.isEquipable()) /* 74 */ pcInventory.equipItem(item); /* 75 */ if (value.enchant > 0 && item.canBeEnchanted()) { /* 76 */ item.setEnchantLevel(value.enchant); /* */ } /* */ } /* 79 */ player.sendChanges(); /* 80 */ player.sendItems(true); /* */ /* 82 */ ClassLevel classLevel = PlayerClass.values()[player.getClassId().getId()].getLevel(); /* 83 */ if ((classLevel == ClassLevel.Second && player.getLevel() >= 40) || (classLevel == ClassLevel.Third && player.getLevel() >= 76)) { /* 84 */ useVoicedCommand("classmaster", player, null); /* */ } /* */ } /* */ /* */ private void showWelcome(L2PcInstance player) { /* 89 */ ClassId class_id = player.getClassId(); /* 90 */ int class_level = class_id.level(); /* 91 */ int new_class_level = class_level + 1; /* 92 */ int p_level = player.getLevel(); /* */ /* 94 */ if (((p_level >= 20 && class_level == 0) || (p_level >= 40 && class_level == 1) || (p_level >= 76 && class_level == 2)) && class_id.getId() < 88) { /* */ /* 96 */ NpcHtmlMessage htm = new NpcHtmlMessage(0); /* 97 */ htm.setFile("classmaster/ClassList.htm"); /* 98 */ StringBuilder html = new StringBuilder(); /* */ /* 100 */ for (ClassId child : ClassId.values()) { /* */ /* 102 */ if (child.childOf(class_id) && child.level() == new_class_level) { /* 103 */ html.append("<tr><td align=center><a action=\"bypass -h vch_classmaster_changeclass ").append(child.getId()).append("\">").append(CharTemplateTable.getClassNameById(child.getId())).append("</a></td></tr>"); /* */ } /* */ } /* 106 */ htm.replace("%classname%", CharTemplateTable.getClassNameById(class_id.getId())); /* 107 */ htm.replace("%classlist%", html.toString()); /* 108 */ player.sendPacket((L2GameServerPacket)htm); /* */ } /* */ else { /* */ /* 112 */ switch (class_level) { /* */ /* */ case 0: /* 115 */ player.sendCritMessage("Попробуйте, когда получите 20 уровень."); /* */ break; /* */ case 1: /* 118 */ player.sendCritMessage("Попробуйте, когда получите 40 уровень."); /* */ break; /* */ case 2: /* 121 */ player.sendCritMessage("Попробуйте, когда получите 76 уровень."); /* */ break; /* */ case 3: /* 124 */ player.sendCritMessage("Нет доступных профессий."); /* */ break; /* */ } /* */ } /* */ } /* */ /* */ /* */ private void profList(L2PcInstance player, int class_id) { /* 132 */ int class_level = player.getClassId().level(); /* 133 */ int new_class_level = class_level + 1; /* 134 */ int p_level = player.getLevel(); /* */ /* 136 */ EventReward pay = (EventReward)Config.CLASS_MASTERS_PRICES.get(Integer.valueOf(new_class_level)); /* 137 */ if (pay != null) { /* */ /* 139 */ if (player.getItemCount(pay.id) < pay.count) { /* */ /* 141 */ player.sendCritMessage("Cтоимость получения профессии " + pay.count + " " + ItemTable.getInstance().getTemplate(pay.id).getName()); /* */ return; /* */ } /* 144 */ player.destroyItemByItemId("clasmaster", pay.id, pay.count, (L2Object)player, true); /* */ } /* */ /* 147 */ changeClass(player, class_id); /* 148 */ player.checkAllowedSkills(); /* */ /* 150 */ if (class_id >= 88) { /* 151 */ player.sendPacket((L2GameServerPacket)Static.THIRD_CLASS_TRANSFER); /* */ } else { /* 153 */ player.sendPacket((L2GameServerPacket)Static.CLASS_TRANSFER); /* */ } /* 155 */ if (Config.REWARD_CLASS) /* */ { /* 157 */ if ((Config.REWARD_FIRST_CLASS && class_level == 0) || (Config.REWARD_SECOND_CLASS && class_level == 1) || (Config.REWARD_THIRD_CLASS && class_level == 2)) { /* */ /* 159 */ player.setShadeItems(true); /* 160 */ NpcHtmlMessage html = NpcHtmlMessage.id(0); /* 161 */ String htm = HtmCache.getInstance().getHtm("classmaster/Up_" + new_class_level + ".htm"); /* 162 */ html.setHtml(htm); /* 163 */ html.replace("%ClassName%", CharTemplateTable.getClassNameById(player.getClassId().getId())); /* 164 */ player.sendPacket((L2GameServerPacket)html); /* */ } /* */ } /* */ /* 168 */ if ((!Config.REWARD_CLASS && ((new_class_level == 1 && p_level >= 40) || (new_class_level == 2 && p_level >= 76))) || (!Config.REWARD_FIRST_CLASS && class_level == 0) || (!Config.REWARD_SECOND_CLASS && class_level == 1)) { /* 169 */ showWelcome(player); /* */ } /* */ } /* */ /* */ private void changeClass(L2PcInstance player, int val) { /* 174 */ player.abortAttack(); /* 175 */ player.abortCast(); /* 176 */ player.setIsParalyzed(true); /* 177 */ player.setClassId(val); /* */ /* 179 */ if (player.isSubClassActive()) { /* 180 */ ((SubClass)player.getSubClasses().get(Integer.valueOf(player.getClassIndex()))).setClassId(player.getActiveClass()); /* */ } else { /* 182 */ player.setBaseClass(player.getActiveClass()); /* */ } /* 184 */ player.rewardSkills(); /* 185 */ player.store(); /* 186 */ player.broadcastUserInfo(); /* 187 */ player.setIsParalyzed(false); /* */ } /* */ /* */ /* */ /* */ public String[] getVoicedCommandList() { /* 193 */ return VOICED_COMMANDS; /* */ } /* */ }
2) В каком именно файле стоит запрет на использование банки НР при смерти ??? хочу ACP доделать(юзается банка НР когда мертв)
Есть ядро с фиксом, но какой именной файл отвечает за запрет на использование банки??
-
Частично решил все
1) Спасибо за скрипт CalypsoToolz, сам разобрался, но плюс дал, надо добавить false. Более того нашел ядро с отдельным HP/MP/CP !
2) Есть приглашение на эвенты EventRegPopUp = True
3) Не нашел решения (
появился вопрос
4) Реально ли добавить проф окно при 20/40/76 без npc, как понял это в ядро надо, нельзя его без ядра реализовать ? или если есть скрипт поделитесь
Спойлерpackage scripts.commands.voicedcommandhandlers; import net.sf.l2j.Config; import net.sf.l2j.gameserver.datatables.SkillTable; import net.sf.l2j.gameserver.model.L2Skill; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.datatables.xml.CharTemplateData; import net.sf.l2j.gameserver.model.base.ClassId; import net.sf.l2j.gameserver.model.base.ClassLevel; import net.sf.l2j.gameserver.model.base.PlayerClass; import net.sf.l2j.gameserver.model.quest.Quest; import net.sf.l2j.gameserver.network.SystemMessageId; import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse; import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; public class ClassMass implements IVoicedCommandHandler { private static final String[] VOICED_COMMANDS = { "classmaster","change_class"}; public boolean useVoicedCommand(String command, L2PcInstance player, String target) { if (command.equalsIgnoreCase("classmaster")) { ClassId classId = player.getClassId(); int jobLevel = 0; int level = player.getLevel(); ClassLevel lvl = PlayerClass.values()[classId.getId()].getLevel(); switch (lvl) { case First:jobLevel = 1;break; case Second:jobLevel = 2;break; case Third:jobLevel = 3;break; default:jobLevel = 4; } if (player.isGM()) showChatWindowChooseClass(player); else if (((level >= 20 && jobLevel == 1) || (level >= 40 && jobLevel == 2)) && Config.ALLOW_CLASS_MASTER) showChatWindow(player, classId.getId()); else if (level >= 76 && Config.ALLOW_CLASS_MASTER && classId.getId() < 88) { for (int i = 0; i < SECONDN_CLASS_IDS.length; i++) { if (classId.getId() == SECONDN_CLASS_IDS) { NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); StringBuilder sb = new StringBuilder(); sb.append("<html><body<table width=200>"); sb.append("<tr><td><center>" + CharTemplateData.getInstance().getClassNameById(player.getClassId().getId()) + " Class Master:</center></td></tr>"); sb.append("<tr><td><br></td></tr>"); sb.append("<tr><td><a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (88 + i) + "\">Advance to " + CharTemplateData.getInstance().getClassNameById(88 + i) + "</a></td></tr>"); sb.append("<tr><td><br></td></tr>"); sb.append("</table></body></html>"); html.setHtml(sb.toString()); player.sendPacket(html); break; } } } else { NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); StringBuilder sb = new StringBuilder(); sb.append("<html><body>"); switch (jobLevel) { case 1: sb.append("Come back here when you reach level 20 to change your class.<br>"); break; case 2: sb.append("Come back here when you reach level 40 to change your class.<br>"); break; case 3: sb.append("There are no more class changes for you.<br>"); break; } for (Quest q : Quest.findAllEvents()) sb.append("Event: <a action=\"bypass -h Quest " + q.getName() + "\">" + q.getDescr() + "</a><br>"); sb.append("</body></html>"); html.setHtml(sb.toString()); player.sendPacket(html); } player.sendPacket(ActionFailed.STATIC_PACKET); } else if (command.startsWith("change_class")) { int val = Integer.parseInt(command.substring(13)); ClassId classId = player.getClassId(); int level = player.getLevel(); int jobLevel = 0; int newJobLevel = 0; ClassLevel lvlnow = PlayerClass.values()[classId.getId()].getLevel(); if (player.isGM()) { changeClass(player, val); player.rewardSkills(); if (val >= 88) player.sendPacket(SystemMessageId.THIRD_CLASS_TRANSFER); else player.sendPacket(SystemMessageId.CLASS_TRANSFER); NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); StringBuilder sb = new StringBuilder(); sb.append("<html><body>"); sb.append("You have now become a <font color=\"LEVEL\">" + CharTemplateData.getInstance().getClassNameById(player.getClassId().getId()) + "</font>."); sb.append("</body></html>"); html.setHtml(sb.toString()); player.sendPacket(html); return; } switch (lvlnow) { case First: jobLevel = 1; break; case Second: jobLevel = 2; break; case Third: jobLevel = 3; break; default: jobLevel = 4; } if (jobLevel == 4) return; // no more job changes ClassLevel lvlnext = PlayerClass.values()[val].getLevel(); switch (lvlnext) { case First: newJobLevel = 1; break; case Second: newJobLevel = 2; break; case Third: newJobLevel = 3; break; default: newJobLevel = 4; } // prevents changing between same level jobs if (newJobLevel != jobLevel + 1) return; if (level < 20 && newJobLevel > 1) return; if (level < 40 && newJobLevel > 2) return; if (level < 75 && newJobLevel > 3) return; changeClass(player, val); player.rewardSkills(); if (val >= 88) player.sendPacket(SystemMessageId.THIRD_CLASS_TRANSFER); // system sound 3rd occupation else player.sendPacket(SystemMessageId.CLASS_TRANSFER); // system sound for 1st and 2nd occupation player.broadcastPacket(new MagicSkillUse(player, player, 5103, 1, 1000, 0)); HtmlShow(player); checks(player); checkAutoEq(player,newJobLevel); } return true; } private void changeClass(L2PcInstance player, int val) { final ClassId currentClassId = player.getClassId(); if (getMinLevel(currentClassId.level()) > player.getLevel()) return; if (!validateClassId(currentClassId, val)) return; player.setClassId(val); if (player.isSubClassActive()){player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass());} else { ClassId classId = ClassId.getClassIdByOrdinal(player.getActiveClass()); if (classId.getParent() != null){while (classId.level() == 0){classId = classId.getParent();}} player.setBaseClass(classId); } player.broadcastUserInfo(); } public String[] getVoicedCommandList(){return VOICED_COMMANDS;} }
-
Всем добра! Сборка ласт PW, подскажите кому не сложно с меня +
1) нужно реализовать ACP, знаю оно есть через ctrl, MP/CP прекрасно работают, но там когда умирает персонаж банка НР юзается быстро без останки
Кто может в этом разобрался или как исправить посоветуйте пожалуйста....
Выдернул скрипт из другой сборки pwsoft, там прекрасно работает! У меня выдает эти ошибки
Как исправить эти ошибки ниже?
2) Есть ли в PW фишка ??? выскакивает приглашение на эвенты или на РБ видел на l2code реализован.
3) Снимается CP когда убивает моб, не критично но есть ли решение ??
---------- 1. ERROR in \AutoCombatPotions.java (at line 107) handler.useItem(player, potions); ^^^^^^^ The method useItem(L2PlayableInstance, L2ItemInstance, boolean) in the type IIte mHandler is not applicable for the arguments (L2PcInstance, L2ItemInstance) ---------- 2. ERROR in \AutoCombatPotions.java (at line 121) handler.useItem(player, potions); ^^^^^^^ The method useItem(L2PlayableInstance, L2ItemInstance, boolean) in the type IIte mHandler is not applicable for the arguments (L2PcInstance, L2ItemInstance) ---------- 3. ERROR in \AutoCombatPotions.java (at line 135) handler.useItem(player, potions); ^^^^^^^ The method useItem(L2PlayableInstance, L2ItemInstance, boolean) in the type IIte mHandler is not applicable for the arguments (L2PcInstance, L2ItemInstance) ---------- 3 problems (3 errors) The method useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance , net.sf.l2j.gameserver.model.L2ItemInstance, boolean) in the type scripts.items .IItemHandler is not applicable for the arguments (net.sf.l2j.gameserver.model.a ctor.instance.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance) The method useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance , net.sf.l2j.gameserver.model.L2ItemInstance, boolean) in the type scripts.items .IItemHandler is not applicable for the arguments (net.sf.l2j.gameserver.model.a ctor.instance.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance) The method useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance , net.sf.l2j.gameserver.model.L2ItemInstance, boolean) in the type scripts.items .IItemHandler is not applicable for the arguments (net.sf.l2j.gameserver.model.a ctor.instance.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance) Failed executing script: C:\12345\server\gameserver\data\scripts\calypso\AutoCom batPotions.java. See AutoCombatPotions.java.error.log for details. ##############################
Вот сам скрипт
package calypso; import java.util.HashMap; import java.util.concurrent.ScheduledFuture; import java.util.logging.Logger; import net.sf.l2j.gameserver.ThreadPoolManager; import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.PcInventory; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import scripts.commands.IVoicedCommandHandler; import scripts.commands.VoicedCommandHandler; import scripts.items.IItemHandler; import scripts.items.ItemHandler; /** * * @author Calypso * */ public class AutoCombatPotions implements IVoicedCommandHandler { private final static Logger _log = Logger.getLogger(AutoCombatPotions.class.getName()); // разрешить юз банок private static boolean ALLOW_CP = true, ALLOW_HP = true, ALLOW_MP = true; // проценты для юза private static int PERCENT_CP = 90, PERCENT_HP = 90, PERCENT_MP = 90; // банки, ищутся в сумке чара, юзается первая попавшаяся private static final int[] CP_POTIONS = { 5592 }, HP_POTIONS = { 1539 }, MP_POTIONS = { 728 }; // как часто запускать поток для юза всех банок (это значение будет максимальной погрешностью) private static long RUN_DELAY = 500; // реюз каждого типа банок (нет смысла устанавливать менее RUN_DELAY) private static long CP_DELAY = 500, HP_DELAY = 15000, MP_DELAY = 1000; // только для премиумов private static boolean ONLY_PREMIUM = false; private static HashMap<Integer, ScheduledFuture<?>> runnedAcps = new HashMap<Integer, ScheduledFuture<?>>(); private static HashMap<String, Long> reuses = new HashMap<String, Long>(); @Override public String[] getVoicedCommandList() { return new String[] { "acpon", "acpoff", "acpof" }; } @Override public boolean useVoicedCommand(String command, L2PcInstance player, String target) { if (player == null) return false; if (command.toLowerCase().equals("acpon")) { if (ONLY_PREMIUM && !player.isPremium()) { player.sendMessage("Only for Premium-players!"); return false; } if (runnedAcps.containsKey(player.getObjectId())) { player.sendMessage("ACP already started!"); return false; } runnedAcps.put(player.getObjectId(), ThreadPoolManager.getInstance() .scheduleAiAtFixedRate(new PotionUseTask(player), RUN_DELAY, RUN_DELAY)); player.sendMessage("ACP success started!"); } else if (command.toLowerCase().equals("acpoff") || command.toLowerCase().equals("acpof")) { if (runnedAcps.containsKey(player.getObjectId())) { cancelTask(player.getObjectId()); player.sendMessage("ACP is stoped!"); return false; } else player.sendMessage("ACP already stoped!"); } return false; } private class PotionUseTask implements Runnable { private L2PcInstance player; private int safeObjId; public PotionUseTask(L2PcInstance player) { this.player = player; safeObjId = player.getObjectId(); } @Override public void run() { try { if (player == null) { _log.info("ACP: player is null!!! WTF? ObjID " + safeObjId); cancelTask(safeObjId); return; } if (player.isOnline() != 1) { cancelTask(safeObjId); return; } PcInventory inv = player.getInventory(); IItemHandler handler = null; L2ItemInstance potions = null; if (ALLOW_CP && checkReuse(safeObjId, "CP")) { potions = getPotionFromInv(inv, "CP"); if (potions != null) { if ((player.getCurrentCp() / player.getMaxCp()) * 100 < PERCENT_CP) { handler = ItemHandler.getInstance().getItemHandler(potions.getItemId()); if (handler != null) { handler.useItem(player, potions); setReuse(safeObjId, "CP"); } } } } if (ALLOW_HP && checkReuse(safeObjId, "HP")) { potions = getPotionFromInv(inv, "HP"); if (potions != null) { if ((player.getCurrentHp() / player.getMaxHp()) * 100 < PERCENT_HP) { handler = ItemHandler.getInstance().getItemHandler(potions.getItemId()); if (handler != null) { handler.useItem(player, potions); setReuse(safeObjId, "HP"); } } } } if (ALLOW_MP && checkReuse(safeObjId, "MP")) { potions = getPotionFromInv(inv, "MP"); if (potions != null) { if ((player.getCurrentMp() / player.getMaxMp()) * 100 < PERCENT_MP) { handler = ItemHandler.getInstance().getItemHandler(potions.getItemId()); if (handler != null) { handler.useItem(player, potions); setReuse(safeObjId, "MP"); } } } } } catch (Exception e) { runnedAcps.get(safeObjId).cancel(false); } } } private boolean checkReuse(int objId, String type) { String pair = String.valueOf(objId) + ":" + type; if(!reuses.containsKey(pair)) return true; long lastUse = reuses.get(pair); if(System.currentTimeMillis() - lastUse >= getReuseForPotion(type)) return true; return false; } private void setReuse(int objId, String type) { String pair = String.valueOf(objId) + ":" + type; reuses.put(pair, System.currentTimeMillis()); } private long getReuseForPotion(String type) { type = type.toLowerCase(); if(type.equals("cp")) return CP_DELAY; if(type.equals("hp")) return HP_DELAY; if(type.equals("mp")) return MP_DELAY; return 0; } private L2ItemInstance getPotionFromInv(PcInventory inv, String type) { L2ItemInstance result = null; int[] search = null; if (type.toLowerCase().equals("cp")) search = CP_POTIONS; if (type.toLowerCase().equals("hp")) search = HP_POTIONS; if (type.toLowerCase().equals("mp")) search = MP_POTIONS; if (search == null) _log.warning( "ACP: getPotionFromInv() == null, invalid potion type or unsetted id of potions! Type: " + type); for (int id : search) { result = inv.getItemByItemId(id); if (result != null) break; } return result; } private void cancelTask(int objId) { runnedAcps.remove(objId).cancel(false); } public static void main(String... arguments) { VoicedCommandHandler.getInstance().registerVoicedCommandHandler(new AutoCombatPotions()); _log.info("### ACP service by Calypso loaded!"); } }
-
Спасибо Phoenix! Реально помог!
Кому интересно или столкнется с подобными, в sw есть кнопка очистить КЕШ, ну и нового пользователя в БД с правами для безопасности.
- 1
-
17 минут назад, Hotaka сказал:а в чем заключается ваше не могу?
На сайте нужна регистрация и чтобы статистика показывала, а она не хочет пишет ошибка базы данных
-
Приветствую всех и за ранее спасибо что откликнулись!
Никак не могу связать базу сервера с сайтом, выдает ошибку 0, если включить показ. ошибок. Перечитал кучу тем и мануалов, все по идее правильно! Реально устал ковырять, поэтому прошу помощи у профи.
Самое странное что все вчера прекрасно работало все и рег и статситика, единственное SSL включил на хосте, хз это влияет или нет...
сразу скажу:
1) Порты 7777, 2106, 3306 открыты смотрел через 2ип, статический IP
2) Sql sw13, залил в базу сервера
3) Ввожу все правильно в админке, ну потому что пару дней назад делал и он прекрасно работал
4) Использую в админке sw пользователя root
кто сможет подсказать?
Ошибка MySQL!
========================
MySQL вернул ошибку:
Номер ошибки:
0 -
Спасибо большое) У вас лучший форум! Можно закрыватьaltsettings.cfg
# Снимать бафф аугмента при снятии пушки? OneAugmentEffect = True
-
Привет народ. сборка pw soft. Не удаляется скилл от лс при снятии пушки, как решить данную проблему, может есть конфиг какой ? сам не нашел вот и прошу помощи!
-
там их нету ну если взять стандартный спавнЯ же написал) таблица не grandboss, а spawnlist или custom_spawnlist, там по ID эпика посмотри)
-
Вот такая таблица есть я ее настроил, а еще есть конфиг в нпс хз где делать и там и там время одинаковое но появляется после смертиВ базе данных, в зависимости как ты их расставлял, Custom_spawn или просто spawn и так далее есть столбей Respawn_delay, он в секундах если я не ошибаюсь, вот там и выставляй
от анонса о пявлении РБ ты ни как не избавишься, для этого нужны исходы, так что даже хз чем тебе помочь)
-
Привет всем. Вопрос как настроить спавн рб сборка pw soft. Каждый раз после рестарта появляется объявление о том что валакас анатарас.... и тд эпики живы, а на деле если тп к никого нету, точнее не все есть. Так вот как сделать чтоб после убийства появлялись через некоторое(заданое) время и не спавнились после рестарта сами ? Сам расствавил рб но если их убить то они сразу ж снова появляются ( Где настроить все это ?
-
ну купить наверно я б сам догадался... По сути что нибудь скажите очень надо! на носу открытие )выкиньте этих котов в урну и приобретите не дорого самый качественный ПРОДУКТ на рынке Л2
- 1
Какая основа PwSoft?
в Ядро сервера
Опубликовано
Играюсь с исходниками pwsoft...
Какая у них основа ? какие сборки подобны или схожи с ним или были взяты за основу и доделаны, допилены, велась какая то работа и тд. ?