Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Вывод минимального количества игроков в конфиг для прохода к Antharas
#1
Здравствуйте, появилась необходимость вывести минимальное количество игроков для входа к Антарасу. Исходники команды First-Team.

Сначала по ID телепорта к Тарасу нашёл его диалог в HTML:
!Heart of Warding:
Доносится очень громкий голос, от которого дрожит все тело:
<font color="LEVEL">Он был брошен с самого рождения.%%
Его мать была обманута детьми.%%
Он спустился на землю,%%
Чтобы умерить ее гнев.Паломник Земли Тьмы!%%
Как Вы смеете бросать вызов Антарасу?</font>
(Бросить вызов Антарасу могут максимум 200 игроков.)
[npc_%objectId%_enter_lair|Переместиться в Гнездо Антараса]


Затем пошёл посмотреть тип NPC и найти его в xml файле, тип был такой:
<set name="type" value="HeartOfWarding" />

Далее я проследовал до sripts/npc/model/NpcTypeInstance.java где NpcTypeInstance = HeartOfWardingUnstance
package npc.model;
import l2ft.gameserver.model.Player;
import l2ft.gameserver.model.instances.NpcInstance;
import l2ft.gameserver.templates.npc.NpcTemplate;
import bosses.AntharasManager;
/**
* @author pchayka
*/
public final class HeartOfWardingInstance extends NpcInstance
{
public HeartOfWardingInstance(int objectId, NpcTemplate template)
{
super(objectId, template);
}
@Override
public void onBypassFeedback(Player player, String command)
{
if(!canBypassCheck(player, this))
return;
if(command.equalsIgnoreCase("enter_lair"))
{
AntharasManager.enterTheLair(player);
return;
}
else
super.onBypassFeedback(player, command);
}
}


Где ясно сказано что нужно выполнять:
if(command.equalsIgnoreCase("enter_lair"))
{
AntharasManager.enterTheLair(player);
return;
}


идём дальше, в AntharasManager, а именно в enterTheLair(player)
public static void enterTheLair(Player player)
{
if(player == null)
return;
// Телепортироваться могут только ЦЦ, не знаю нужно ли но оставлю.
if(player.getParty() == null || !player.getParty().isInCommandChannel())
{
player.sendPacket(Msg.YOU_CANNOT_ENTER_BECAUSE_YOU_ARE_NOT_IN_A_CURRENT_COMMAND_CHANNEL);
return;
}
CommandChannel cc = player.getParty().getCommandChannel();
if(cc.getChannelLeader() != player)
{
player.sendPacket(Msg.ONLY_THE_ALLIANCE_CHANNEL_LEADER_CAN_ATTEMPT_ENTRY);
return;
}
if(cc.getMemberCount() > 200)
{
player.sendMessage("The maximum of 200 players can invade the Antharas Nest");
return;
}
if(getPlayersInside().size() > 200)
{
player.sendMessage("The maximum of 200 players can invade the Antharas Nest");
return;
}
if(_state.getState() != EpicBossState.State.NOTSPAWN)
{
player.sendMessage("Antharas is still reborning. You cannot invade the nest now");
return;
}
if(_entryLocked || _state.getState() == EpicBossState.State.ALIVE)
{
player.sendMessage("Antharas has already been reborned and is being attacked. The entrance is sealed.");
return;
}
// checking every member of CC for the proper conditions
for(Player p : cc)
if(p.isDead() || p.isFlying() || p.isCursedWeaponEquipped() || p.getInventory().getCountOf(PORTAL_STONE) < 1 || !p.isInRange(player, 500))
{
player.sendMessage("Command Channel member " + p.getName() + " doesn't meet the requirements to enter the nest");
return;
}
for(Player p : cc)
p.teleToLocation(TELEPORT_POSITION);
_checkPlayer = ThreadPoolManager.getInstance().scheduleAtFixedDelay(new CheckPlayerIsInCommandChannel(), 1000, 1000);
setAntharasSpawnTask();
}


Есть только проверка на максимальное количество игроков при входе и внутри. Подскажите пожалуйста куда рыть дальше?
Ответ
#2
Код:
if(cc.getMemberCount() < 100)
  {
   player.sendMessage("Чтобы войти нужно минимум 100 человек");
   return;
  }
Но это в любом случае не универсальная проверка.

Лучше всего не запускать Анатараса если меньше такого-то числа, но они могут выйти уже после.
Ответ
#3
А если сделать вот так?

for(Player p : cc) {
if (cc.getMemberCount() >= 4) {
p.teleToLocation(TELEPORT_POSITION);
_checkPlayer = ThreadPoolManager.getInstance().scheduleAtFixedDelay(new CheckPlayerIsInCommandChannel(), 1000, 1000);
setAntharasSpawnTask();
}
}
Ответ
#4
Этот код нелогичен и не решает задачу
Ответ
#5
Этот код спавнит Антараса?

public synchronized static void setAntharasSpawnTask()
{
if(_monsterSpawnTask == null)
_monsterSpawnTask = ThreadPoolManager.getInstance().schedule(new AntharasSpawn(1), FWA_APPTIMEOFANTHARAS);
//_entryLocked = true;
}
Ответ
#6
Да, вызывать его несколько раз нет смысла.

Минимальное количество игроков чтобы он начал спавниться можно сделать лиснером зоны. Но они смогут уйти, т.е. событие будет производиться один раз.
Ответ
#7
А можете дать пример лиснера зоны? Я просто не совсем что значит это словосочетание)))
Ответ
#8
Что значит, откуда стартовать?

Добавлено через 1 час 28 минут
Listener это модуль, который срабатывает когда происходит какое-то событие. Например в зону входит плеер. Это по идее должно быть в любой сборке и это же и используется. Но без знаний явы сложно будет. Только смотреть примеры.
Ответ
#9
Вот к примеру проверка на вход к фринте - @author pchayka, т.е. ваш скрипт, вот где указано минимальное количество для входа.

Это проверка на вход к фринте, тут да же нету проверки на СС.

public void onBypassFeedback(Player player, String command)
{
if(!canBypassCheck(player, this))
return;

if(command.equalsIgnoreCase("request_frintezza"))
{
Reflection r = player.getActiveReflection();
if(r != null)
{
if(player.canReenterInstance(frintezzaIzId))
player.teleToLocation(r.getTeleportLoc(), r);
}
else if(player.canEnterInstance(frintezzaIzId))
{
if(ItemFunctions.removeItem(player, 8073, 1, true) < 1)
{
player.sendPacket(new SystemMessage(SystemMessage.C1S_ITEM_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED).addName(player));
return;
}
ReflectionUtils.enterReflection(player, new Frintezza(), frintezzaIzId);
}
}
else
super.onBypassFeedback(player, command);
}


Добавлено через 6 минут
По поводу листнеров т.е. слушателей.

Вот к примеру как вы говорили слушатель зоны


private ZoneListener _zoneListener = new ZoneListener();


Вот всё что мне удалось найти


public class ZoneListener implements OnZoneEnterLeaveListener
{
@Override
public void onZoneEnter(Zone zone, Creature cha)
{
}

@Override
public void onZoneLeave(Zone zone, Creature cha)
{
if(cha.isNpc() && (cha.getNpcId() == _weakScarletId || cha.getNpcId() == _strongScarletId))
{
cha.teleToLocation(new Location(-87784, -153304, -9176));
((NpcInstance) cha).getAggroList().clear(true);
cha.setCurrentHpMp(cha.getMaxHp(), cha.getMaxMp());
cha.broadcastCharInfo();
}
}
}
Ответ
#10
texport;348940 Написал:Это проверка на вход к фринте, тут да же нету проверки на СС.
Я перерабатывал механизмы данжей в общий модуль. Проверки производятся в родительском коде исходя из данных xml по данжам. Фринта это данж, Антарас - нет.

Код:
@Override
        public void onZoneEnter(Zone zone, Creature cha)
        {
        }
Вот тут и должна быть обработка старта. Но сделать ее надо правильно.
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Вывод хп цели LifeAfterWoW 1 2,012 02-01-2019, 12:01 AM
Последний пост: LifeAfterWoW
  Скупка итемов у игроков ntking 2 2,074 10-19-2018, 12:27 PM
Последний пост: ntking
  Анонс количества убитых Tiat KateKate7912 0 1,204 01-28-2016, 07:38 AM
Последний пост: KateKate7912
  Запрет атаки если присутсвует меньше игроков Rolfer 1 1,535 05-14-2014, 06:25 PM
Последний пост: n3k0nation
  Вывод номерации HTML: аналогично PTS. Injection 6 1,697 07-11-2013, 11:52 PM
Последний пост: Injection
  Вывод пути открытой HTML Noize 4 1,698 04-22-2013, 01:25 PM
Последний пост: Noize
  Вывод В Конфиги Drag0N 5 1,702 04-17-2013, 04:19 PM
Последний пост: Ashe
  l2 феникс подобные сборки игроков отбрасывает назад Munhgauzen 19 4,739 03-18-2013, 10:38 AM
Последний пост: darkevil
  Как включить вывод питоновских логов __init__.py.error.log havoc 0 1,107 09-04-2012, 10:46 PM
Последний пост: havoc
  Выбивает всех игроков NightWar 3 1,726 09-02-2012, 06:04 AM
Последний пост: LestatL

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)