Подскажите где копать что бы исправить эту фигню. Сборка aion-svn-Unique 5.8 Находиться у меня на Please login or register to view links Когда персонаж телепортируется с него слетают все бафы, свитки, банки и так далее. В основном это происходит когда персонаж телепортируется в данж. Когда используешь телепортацию гм по нику нпс из одной локи в другую тоже слетают , а когда по самой локе все нормально. Дайте совет в каком месте это править ?.
В данжи которые сделаны под autogrup так и должно быть(пример дерики арены и т.п). В версиях 5+ и выше они почти все такие. Каждую версию игры нужно рассматривать в отдельном контексте. На видео был момент, когда из локации в локацию слетел баф, но там тоже желательно тестировать на обычном персонаже(без админки). В принципе при желании это всё поправимо.
Даже без админ прав все слетает, Хотелось бы это исправить ну или сделать по другому. Скажи в каких файлах это можно изменить. а я уже исправлю.
Просто добавлю что есть еще сборка Aion-Dream-master там можно зайти с клиента 5.8 , но проблем таких там нет. Я все копаю TeleportService2 но походу это не там.
Вот я тоже не помню проблем подобного рода в сборке ENCOM, а это что ты показал одна из её модификаций. Please login or register to view links, как вариант, попробуй отключить fasttrack(в этой сборке a_station) a_station.properties и world.properties (gameserver.world.emulate.a.station).
Насколько помню обычно ставят удаление бафов в PlayerController, но чтобы конкретно знать какие эффекты убирать в той или иной карте надо смотреть в клиенте файл WorldId.xml, там есть атрибут skill_prohibit_set_id, потом смотришь client_skill_prohibit.xml, в нём указаны скиллы какие удаляются при телепорте на карты или выходе с карты, в общем по изучайте. Также есть файл в котором указаны предметы которые должны удалятся при выходе с карты или в ходе client_item_prohibit.xml. Возможно в старых версиях точно не помню с каких нет таких файлов, но по моему с версии 2,7 они есть.
Спасибо за описание того как это должно работать , но это пока не мой уровень. Но благодаря вам я нашел как исправить хотя бы исчизание бафоф. в PlayerController Закомментировал строку и перестало пропадать. // TODO [AT] move public void onLeaveWorld() { ProtectorConquerorService.getInstance().onLeaveMap(getOwner()); //InstanceService.onLeaveInstance(getOwner()); }
Это помогло , но это добавляет другой баг, При заходе в данж , на персонажа вешается бафф , после выхода из данжа он не снимается , пока не пройдет время* которое указано на том или инном баффе. Хотя если смотреть на другие сборки там это реализовано по другому. Спойлер: Ger // TODO [AT] move public void onLeaveWorld() { InstanceService.onLeaveInstance(getOwner()); } Спойлер: Dreams // TODO [AT] move public void onLeaveWorld() { InstanceService.onLeaveInstance(getOwner()); } Если делать так же как и в других , убирая строку: ProtectorConquerorService.getInstance().onLeaveMap(getOwner()); То баг остаётся. Если лесть глубже в сервис ProtectorConquerorService(Этого сервиса нету в других сборках есть подобный в другой сборке 3.9 SerialKillerService), а там в onLeaveMap Спойлер: ProtectorConquerorService(onLeaveMap) public void onLeaveMap(Player player) { int worldId = player.getWorldId(); if (!isHandledWorld(worldId)) { return; } if (!isEnemyWorld(player)) { //Protector. Protector info = player.getProtectorInfo(); FastList<Player> kill = new FastList<Player>(); FastMap<Integer, Player> guards = getWorldProtector(worldId); kill.addAll(guards.values()); guards.remove(player.getObjectId()); if (info.getRank() > 0) { info.setRank(0); protectorBuff.endEffect(player); for (Player victim: World.getInstance().getWorldMap(worldId).getWorldMapInstanceById(player.getInstanceId()).getPlayersInside()) { if (!player.getRace().equals(victim.getRace())) { PacketSendUtility.sendPacket(victim, new SM_CONQUEROR_PROTECTOR(kill)); } } } } else if (isEnemyWorld(player)) { //Conqueror. Conqueror info = player.getConquerorInfo(); FastList<Player> kill = new FastList<Player>(); FastMap<Integer, Player> killers = getWorldConqueror(worldId); kill.addAll(killers.values()); killers.remove(player.getObjectId()); if (info.getRank() > 0) { info.setRank(0); conquerorBuff.endEffect(player); for (Player victim : World.getInstance().getWorldMap(worldId).getWorldMapInstanceById(player.getInstanceId()).getPlayersInside()) { if (!player.getRace().equals(victim.getRace())) { PacketSendUtility.sendPacket(victim, new SM_CONQUEROR_PROTECTOR(kill)); } } } } } Спойлер: SerialKillerService(onLeaveMap) public void onLeaveMap(Player player) { int worldId = player.getWorldId(); if (!isHandledWorld(worldId)) { return; } if (isEnemyWorld(player)) { SerialKiller info = player.getSKInfo(); FastList<Player> kill = new FastList<Player>(); FastMap<Integer, Player> killers = getWorldKillers(worldId); kill.addAll(killers.values()); killers.remove(player.getObjectId()); if (info.getRank() > 0) { info.setRank(0); for (Player victim : World.getInstance().getWorldMap(worldId). getWorldMapInstanceById(player.getInstanceId()).getPlayersInside()) { if (!player.getRace().equals(victim.getRace())) { PacketSendUtility.sendPacket(victim, new SM_SERIAL_KILLER(kill)); } } } } } Между ними есть разница в сервисе ProtectorConquerorService имеется разделения на Protector и Conqueror. А SerialKillerService а тут один аля реализован легче. Короче мне не понять (.
Хе, делаю быстрее чем думаю . В общем моей голове нет покоя , лиж-бы усложнить все себе, оказалось все намного проще ... InstanceService.onLeaveInstance Спойлер: InstanceService(onLeaveInstance) Было public static void onLeaveInstance(Player player) { player.getPosition().getWorldMapInstance().getInstanceHandler().onLeaveInstance(player); for (Item item : player.getInventory().getItems()) { if (item.getItemTemplate().getOwnershipWorld() == player.getWorldId()) { player.getInventory().decreaseByObjectId(item.getObjectId(), item.getItemCount()); } for (Effect ef: player.getEffectController().getAbnormalEffects()) { DispelCategoryType category = ef.getSkillTemplate().getDispelCategory(); if (category == DispelCategoryType.NONE || category == DispelCategoryType.ALL || category == DispelCategoryType.BUFF || category == DispelCategoryType.DEBUFF || category == DispelCategoryType.DEBUFF_MENTAL || category == DispelCategoryType.DEBUFF_PHYSICAL || category == DispelCategoryType.EXTRA || category == DispelCategoryType.NEVER || category == DispelCategoryType.NPC_BUFF || category == DispelCategoryType.NPC_DEBUFF_PHYSICAL || category == DispelCategoryType.STUN) { ef.endEffect(); player.getEffectController().clearEffect(ef); } } if (AutoGroupConfig.AUTO_GROUP_ENABLED) { AutoGroupService.getInstance().onLeaveInstance(player); } } Спойлер: InstanceService(onLeaveInstance) Стало public static void onLeaveInstance(Player player) { player.getPosition().getWorldMapInstance().getInstanceHandler().onLeaveInstance(player); for (Item item : player.getInventory().getItems()) { if (item.getItemTemplate().getOwnershipWorld() == player.getWorldId()) { player.getInventory().decreaseByObjectId(item.getObjectId(), item.getItemCount()); } } if (AutoGroupConfig.AUTO_GROUP_ENABLED) { AutoGroupService.getInstance().onLeaveInstance(player); } } Это решение самого бафа , что бы оно не исчезало после телепортаций. Но учитывая слова Please login or register to view links нужно это делать все по уму.