• SiteAnalyzer, технический и SEO-анализ сайтов

Help me Слетают баффы при телепортаций.

  • Автор темы Автор темы yecgaaj
  • Дата начала Дата начала

yecgaaj

Рядовой
Подскажите где копать что бы исправить эту фигню.
Сборка aion-svn-Unique 5.8 Находиться у меня на диске
Когда персонаж телепортируется с него слетают все бафы, свитки, банки и так далее. В основном это происходит когда персонаж телепортируется в данж. Когда используешь телепортацию гм по нику нпс из одной локи в другую тоже слетают , а когда по самой локе все нормально.
Дайте совет в каком месте это править ?.
 
Когда персонаж телепортируется с него слетают все бафы, свитки, банки и так далее. В основном это происходит когда персонаж телепортируется в данж
В данжи которые сделаны под autogrup так и должно быть(пример дерики арены и т.п). В версиях 5+ и выше они почти все такие.
Каждую версию игры нужно рассматривать в отдельном контексте.

На видео был момент, когда из локации в локацию слетел баф, но там тоже желательно тестировать на обычном персонаже(без админки).
В принципе при желании это всё поправимо.
 
Последнее редактирование:
В данжи которые сделаны под autogrup так и должно быть(пример дерики арены и т.п). В версиях 5+ и выше они почти все такие.
Каждую версию игры нужно рассматривать в отдельном контексте.

На видео был момент, когда из локации в локацию слетел баф, но там тоже желательно тестировать на обычном персонаже(без админки).
В принципе при желании это всё поправимо.
Даже без админ прав все слетает, Хотелось бы это исправить ну или сделать по другому. Скажи в каких файлах это можно изменить. а я уже исправлю.
 
Просто добавлю что есть еще сборка Aion-Dream-master там можно зайти с клиента 5.8 , но проблем таких там нет. Я все копаю TeleportService2 но походу это не там.
 
Просто добавлю что есть еще сборка Aion-Dream-master там можно зайти с клиента 5.8 , но проблем таких там нет. Я все копаю TeleportService2 но походу это не там.
Вот я тоже не помню проблем подобного рода в сборке ENCOM, а это что ты показал одна из её модификаций.
yecgaaj, как вариант, попробуй отключить fasttrack(в этой сборке a_station) a_station.properties и world.properties (gameserver.world.emulate.a.station).
 
Последнее редактирование:
Вот я тоже не помню проблем подобного рода в сборке ENCOM, а это что ты показал одна из её модификаций.
yecgaaj, как вариант, попробуй отключить 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, но чтобы конкретно знать какие эффекты убирать в той или иной карте надо смотреть в клиенте файл 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());
}
 
Это помогло , но это добавляет другой баг, При заходе в данж , на персонажа вешается бафф , после выхода из данжа он не снимается , пока не пройдет время* которое указано на том или инном баффе.
Хотя если смотреть на другие сборки там это реализовано по другому.

// TODO [AT] move
public void onLeaveWorld() {
InstanceService.onLeaveInstance(getOwner());
}

// TODO [AT] move
public void onLeaveWorld() {
InstanceService.onLeaveInstance(getOwner());
}

Если делать так же как и в других , убирая строку: ProtectorConquerorService.getInstance().onLeaveMap(getOwner()); То баг остаётся.
Если лесть глубже в сервис ProtectorConquerorService(Этого сервиса нету в других сборках есть подобный в другой сборке 3.9 SerialKillerService), а там в 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));
}
}
}
}
}

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
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);
}
}

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);
}
}
Это решение самого бафа , что бы оно не исчезало после телепортаций. Но учитывая слова SG Shaiy нужно это делать все по уму.
 
Назад
Сверху