pvpgate 11 Опубликовано 8 сентября, 2018 Всем привет, подскажите пожалуйста, как сделать сервис для вставки определенного ЛС в оружие (например экипированое, чтоб не ковырять интерфайс), за адену/другую валюту? Сборка лостворлд. Может подобное реализовано и можно сделать в датапаке? Если нет, то в какую сторону копать в ядре? Или может кто-то делал подобное? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
MeRDox 60 Опубликовано 8 сентября, 2018 package services; import java.util.Collection; import org.mmocore.commons.dao.JdbcEntityState; import org.mmocore.gameserver.data.htm.HtmCache; import org.mmocore.gameserver.data.xml.holder.OptionDataHolder; import org.mmocore.gameserver.model.Player; import org.mmocore.gameserver.model.actor.instances.player.ShortCut; import org.mmocore.gameserver.model.instances.NpcInstance; import org.mmocore.gameserver.model.items.Inventory; import org.mmocore.gameserver.model.items.ItemInstance; import org.mmocore.gameserver.network.l2.components.HtmlMessage; import org.mmocore.gameserver.network.l2.s2c.InventoryUpdate; import org.mmocore.gameserver.network.l2.s2c.ShortCutRegister; import org.mmocore.gameserver.skills.SkillEntry; import org.mmocore.gameserver.templates.OptionDataTemplate; import org.mmocore.gameserver.templates.augmentation.AugmentationFilter; import org.mmocore.gameserver.templates.augmentation.AugmentationInfo; import org.mmocore.gameserver.utils.Util; import org.mmocore.gameserver.handler.bypass.Bypass; import org.napile.primitive.maps.IntObjectMap; public class Augmentation { private static final int _id = 4356; private static final long _count = 50; @Bypass("augment.task") public void task(Player player, NpcInstance npc, String[] arg) { if(arg.length < 1) { showMainMenu(player, 0, 0); return; } String command = arg[0]; int _page = 0; int _filter = 0; if(command.equals("menu")) { _page = 1; _filter = Integer.parseInt(arg[1]); } else if(command.equals("page")) { _page = Integer.parseInt(arg[1]); _filter = Integer.parseInt(arg[2]); } else if(command.equals("put")) { try { if(player.isInStoreMode() || player.isProcessingRequest() || player.isInTrade()) { player.sendMessage("You cannot edit augmentation because you are on store mode"); return; } ItemInstance targetItem = player.getInventory().getItemByObjectId(player.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND)); if(targetItem == null) { player.sendMessage("You doesn't have any weapon equipped"); return; } if(!targetItem.getTemplate().getAugmentationInfos().isEmpty()) { int augId = Integer.parseInt(arg[1]); OptionDataTemplate augment = OptionDataHolder.getInstance().getTemplate(augId); if(augment != null && Util.getPay(player, _id, _count, true)) { IntObjectMap<AugmentationInfo> augmentationInfos = targetItem.getTemplate().getAugmentationInfos(); AugmentationInfo augmentationInfo = augmentationInfos.get(16167); int[] options = new int[2]; options[0] = augmentationInfo.randomOption(targetItem.getTemplate())[0]; options[1] = augment.getId(); player.getInventory().unEquipItem(targetItem); targetItem.setAugmentation(augId, options); targetItem.setJdbcState(JdbcEntityState.UPDATED); targetItem.update(); player.getInventory().equipItem(targetItem); player.sendPacket(new InventoryUpdate().addModifiedItem(targetItem)); for(ShortCut sc : player.getAllShortCuts()) { if(sc.getId() == targetItem.getObjectId() && sc.getType() == ShortCut.TYPE_ITEM) player.sendPacket(new ShortCutRegister(player, sc)); } player.sendChanges(); } } else player.sendMessage("Error: Augmentation for this item is empty!"); } catch(Exception e) { e.printStackTrace(); player.sendMessage("Error."); } } showMainMenu(player, _page, _filter); } private AugmentationFilter getFilter(int id) { switch(id) { case 2: return AugmentationFilter.ACTIVE_SKILL; case 3: return AugmentationFilter.PASSIVE_SKILL; case 4: return AugmentationFilter.CHANCE_SKILL; case 5: return AugmentationFilter.STATS; default: return AugmentationFilter.NONE; } } private void showMainMenu(Player player, int _page, int _filter) { if(_page < 1) { HtmlMessage html = new HtmlMessage(5); html.setFile("scripts/services/Augmentations/index.htm"); player.sendPacket(html); return; } Collection<OptionDataTemplate> augmentations = OptionDataHolder.getInstance().getUniqueOptions(getFilter(_filter)); if(augmentations.isEmpty()) { showMainMenu(player, _page, _filter); player.sendMessage("Augmentation list is empty. Try with another filter"); return; } HtmlMessage html = new HtmlMessage(5); html.setFile("scripts/services/Augmentations/list.htm"); String template = HtmCache.getInstance().getHtml("scripts/services/Augmentations/template.htm", player); String block = ""; String list = ""; StringBuilder pagesHtm = new StringBuilder(); int maxPage = (int) Math.ceil(augmentations.size() / 7.); _page = Math.min(_page, maxPage); int page = 1; int count = 0; boolean lastColor = true; for(int i = Math.max(maxPage - _page < 3 ? maxPage - 6 : _page - 3, 1); i <= maxPage; i++) { if(i == _page) pagesHtm.append("<td background=L2UI_ct1.button_df><button action=\"\" value=\"" + i + "\" width=38 height=20 back=\"\" fore=\"\"></td>"); else pagesHtm.append("<td><button action=\"bypass -h htmbypass_augment.task page " + i + " " + _filter + "\" value=\"" + i + "\" width=34 height=20 back=L2UI_ct1.button_df fore=L2UI_ct1.button_df></td>"); count++; if(count >= 6) break; } count = 0; for(OptionDataTemplate augm : augmentations) { count++; if(count >= 7) { count = 0; page++; } else { if(page > _page) break; if(page == _page) { SkillEntry skill = !augm.getTriggerList().isEmpty() ? augm.getTriggerList().get(0).getSkill() : (!augm.getSkills().isEmpty() ? augm.getSkills().get(0) : null); block = template; block = block.replace("{bypass}", "bypass -h htmbypass_augment.task put " + augm.getId() + " " + _filter); String name = ""; if(skill != null) name = skill.getName().length() > 28 ? skill.getName().substring(0, 28) : skill.getName(); else { name = "+1 "; switch(augm.getId()) { case 16341: name += "STR"; break; case 16342: name += "CON"; break; case 16343: name += "INT"; break; case 16344: name += "MEN"; break; default: name += "(Id:" + augm.getId() + ")"; break; } } block = block.replace("{name}", name); block = block.replace("{icon}", skill != null ? skill.getTemplate().getIcon() : "icon.skill5041"); block = block.replace("{color}", lastColor ? "222222" : "333333"); block = block.replace("{price}", Util.formatAdena(_count) + " " + Util.getItemName(_id)); list += block; lastColor = !lastColor; } } } html.replace("%pages%", pagesHtm.toString()); html.replace("%augs%", list); player.sendPacket(html); } } 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 8 сентября, 2018 1 час назад, MeRDox сказал: Скрыть контент package services; import java.util.Collection; import org.mmocore.commons.dao.JdbcEntityState; import org.mmocore.gameserver.data.htm.HtmCache; import org.mmocore.gameserver.data.xml.holder.OptionDataHolder; import org.mmocore.gameserver.model.Player; import org.mmocore.gameserver.model.actor.instances.player.ShortCut; import org.mmocore.gameserver.model.instances.NpcInstance; import org.mmocore.gameserver.model.items.Inventory; import org.mmocore.gameserver.model.items.ItemInstance; import org.mmocore.gameserver.network.l2.components.HtmlMessage; import org.mmocore.gameserver.network.l2.s2c.InventoryUpdate; import org.mmocore.gameserver.network.l2.s2c.ShortCutRegister; import org.mmocore.gameserver.skills.SkillEntry; import org.mmocore.gameserver.templates.OptionDataTemplate; import org.mmocore.gameserver.templates.augmentation.AugmentationFilter; import org.mmocore.gameserver.templates.augmentation.AugmentationInfo; import org.mmocore.gameserver.utils.Util; import org.mmocore.gameserver.handler.bypass.Bypass; import org.napile.primitive.maps.IntObjectMap; public class Augmentation { private static final int _id = 4356; private static final long _count = 50; @Bypass("augment.task") public void task(Player player, NpcInstance npc, String[] arg) { if(arg.length < 1) { showMainMenu(player, 0, 0); return; } String command = arg[0]; int _page = 0; int _filter = 0; if(command.equals("menu")) { _page = 1; _filter = Integer.parseInt(arg[1]); } else if(command.equals("page")) { _page = Integer.parseInt(arg[1]); _filter = Integer.parseInt(arg[2]); } else if(command.equals("put")) { try { if(player.isInStoreMode() || player.isProcessingRequest() || player.isInTrade()) { player.sendMessage("You cannot edit augmentation because you are on store mode"); return; } ItemInstance targetItem = player.getInventory().getItemByObjectId(player.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND)); if(targetItem == null) { player.sendMessage("You doesn't have any weapon equipped"); return; } if(!targetItem.getTemplate().getAugmentationInfos().isEmpty()) { int augId = Integer.parseInt(arg[1]); OptionDataTemplate augment = OptionDataHolder.getInstance().getTemplate(augId); if(augment != null && Util.getPay(player, _id, _count, true)) { IntObjectMap<AugmentationInfo> augmentationInfos = targetItem.getTemplate().getAugmentationInfos(); AugmentationInfo augmentationInfo = augmentationInfos.get(16167); int[] options = new int[2]; options[0] = augmentationInfo.randomOption(targetItem.getTemplate())[0]; options[1] = augment.getId(); player.getInventory().unEquipItem(targetItem); targetItem.setAugmentation(augId, options); targetItem.setJdbcState(JdbcEntityState.UPDATED); targetItem.update(); player.getInventory().equipItem(targetItem); player.sendPacket(new InventoryUpdate().addModifiedItem(targetItem)); for(ShortCut sc : player.getAllShortCuts()) { if(sc.getId() == targetItem.getObjectId() && sc.getType() == ShortCut.TYPE_ITEM) player.sendPacket(new ShortCutRegister(player, sc)); } player.sendChanges(); } } else player.sendMessage("Error: Augmentation for this item is empty!"); } catch(Exception e) { e.printStackTrace(); player.sendMessage("Error."); } } showMainMenu(player, _page, _filter); } private AugmentationFilter getFilter(int id) { switch(id) { case 2: return AugmentationFilter.ACTIVE_SKILL; case 3: return AugmentationFilter.PASSIVE_SKILL; case 4: return AugmentationFilter.CHANCE_SKILL; case 5: return AugmentationFilter.STATS; default: return AugmentationFilter.NONE; } } private void showMainMenu(Player player, int _page, int _filter) { if(_page < 1) { HtmlMessage html = new HtmlMessage(5); html.setFile("scripts/services/Augmentations/index.htm"); player.sendPacket(html); return; } Collection<OptionDataTemplate> augmentations = OptionDataHolder.getInstance().getUniqueOptions(getFilter(_filter)); if(augmentations.isEmpty()) { showMainMenu(player, _page, _filter); player.sendMessage("Augmentation list is empty. Try with another filter"); return; } HtmlMessage html = new HtmlMessage(5); html.setFile("scripts/services/Augmentations/list.htm"); String template = HtmCache.getInstance().getHtml("scripts/services/Augmentations/template.htm", player); String block = ""; String list = ""; StringBuilder pagesHtm = new StringBuilder(); int maxPage = (int) Math.ceil(augmentations.size() / 7.); _page = Math.min(_page, maxPage); int page = 1; int count = 0; boolean lastColor = true; for(int i = Math.max(maxPage - _page < 3 ? maxPage - 6 : _page - 3, 1); i <= maxPage; i++) { if(i == _page) pagesHtm.append("<td background=L2UI_ct1.button_df><button action=\"\" value=\"" + i + "\" width=38 height=20 back=\"\" fore=\"\"></td>"); else pagesHtm.append("<td><button action=\"bypass -h htmbypass_augment.task page " + i + " " + _filter + "\" value=\"" + i + "\" width=34 height=20 back=L2UI_ct1.button_df fore=L2UI_ct1.button_df></td>"); count++; if(count >= 6) break; } count = 0; for(OptionDataTemplate augm : augmentations) { count++; if(count >= 7) { count = 0; page++; } else { if(page > _page) break; if(page == _page) { SkillEntry skill = !augm.getTriggerList().isEmpty() ? augm.getTriggerList().get(0).getSkill() : (!augm.getSkills().isEmpty() ? augm.getSkills().get(0) : null); block = template; block = block.replace("{bypass}", "bypass -h htmbypass_augment.task put " + augm.getId() + " " + _filter); String name = ""; if(skill != null) name = skill.getName().length() > 28 ? skill.getName().substring(0, 28) : skill.getName(); else { name = "+1 "; switch(augm.getId()) { case 16341: name += "STR"; break; case 16342: name += "CON"; break; case 16343: name += "INT"; break; case 16344: name += "MEN"; break; default: name += "(Id:" + augm.getId() + ")"; break; } } block = block.replace("{name}", name); block = block.replace("{icon}", skill != null ? skill.getTemplate().getIcon() : "icon.skill5041"); block = block.replace("{color}", lastColor ? "222222" : "333333"); block = block.replace("{price}", Util.formatAdena(_count) + " " + Util.getItemName(_id)); list += block; lastColor = !lastColor; } } } html.replace("%pages%", pagesHtm.toString()); html.replace("%augs%", list); player.sendPacket(html); } } Спасибо, а можешь скинуть AugmentationFilter.java, который тут import org.mmocore.gameserver.templates.augmentation.AugmentationFilter ? У меня в augmentation есть AugmentationInfo, а Filter нет Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Rovskoi 14 Опубликовано 9 сентября, 2018 там скорее всего обычный энум из case 2: return AugmentationFilter.ACTIVE_SKILL; case 3: return AugmentationFilter.PASSIVE_SKILL; case 4: return AugmentationFilter.CHANCE_SKILL; case 5: return AugmentationFilter.STATS; default: return AugmentationFilter.NONE; Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
MeRDox 60 Опубликовано 9 сентября, 2018 47 минут назад, Rovskoi сказал: там скорее всего обычный энум из case 2: return AugmentationFilter.ACTIVE_SKILL; case 3: return AugmentationFilter.PASSIVE_SKILL; case 4: return AugmentationFilter.CHANCE_SKILL; case 5: return AugmentationFilter.STATS; default: return AugmentationFilter.NONE; все верно Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pvpgate 11 Опубликовано 9 сентября, 2018 2 часа назад, MeRDox сказал: все верно а что в нем? Скинь свой если можешь, или пример И еще, Util.getItemName() ты дописывал? У меня в Util нет такого метода Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты