Перейти к содержанию
Авторизация  
texport

Enterthelair Antaras

Рекомендуемые сообщения

Появилась необходимость вывести в конфиг количество персонажей для входа к Тарасу и других Боссов. Но при попытке найти, нашёл только проверку на СС. Исходники Firts-Team, м.б. кто подскажет куда копать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ищи НПС для входа, смотри там в ХТМЛи какой запрос идет, и ищи в скриптах этот запрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

вот что в HTML диалоге... Куда дальше следовать я не знаю...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ищеш по айди в xml НПЦ, смотриш какой у него тип, идеш в sripts/npc/model/NpcTypeInstance.java

Изменено пользователем Mifesto

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

<set name="type" value="HeartOfWarding" />

Это тип этого NPC

 

в папке 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();
}

 

Но я не вижу там где показано требуемое количество игроков или СС каналов для входа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как это, в проверках же

 

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

 

Ну тут я понимаю что проверяется на максимальное количество персонажей где getMemberCount() больше 200 говорит что много игроков, а getPlayersInside().size() проверяет сколько игроков уже внутри. А проверки на минимальное количество игроков я не вижу.

 

Попробовал добавить следующее

 

for(Player p : cc) {
	    if (cc.getMemberCount() >= 4) {
		    p.teleToLocation(TELEPORT_POSITION);
		    _checkPlayer = ThreadPoolManager.getInstance().scheduleAtFixedDelay(new CheckPlayerIsInCommandChannel(), 1000, 1000);
		    setAntharasSpawnTask();
	    }

 

Как думаете, так норм?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

даже близко не норм.

 

зачем тебе запускать задачи CheckPlayerIsInCommandChannel и setAntharasSpawnTask столько раз, сколько у тебя народу в кк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задача CheckPlayerIsInCommandChannel запускается при входе на проверку, действительно ли персонаж в СС. А setAntharasSpawnTask спавнит Антараса.

 

private static class CheckPlayerIsInCommandChannel extends RunnableImpl
{
 private int _task = 0;
 private List<Player> _players = getPlayersInside();
@Override
 public void runImpl()
 {
	 for(Player pc : _players)
	 {
		 // Если игрок не в группе и не в Командном Канале
		 if(pc.getParty() == null || (pc.getParty() != null && pc.getParty().getCommandChannel() == null))
			 // То телепортируем в ближайший город
			 pc.teleToClosestTown();
	 }
 }
}

 

public synchronized static void setAntharasSpawnTask()
{
 if(_monsterSpawnTask == null)
	 _monsterSpawnTask = ThreadPoolManager.getInstance().schedule(new AntharasSpawn(1), FWA_APPTIMEOFANTHARAS);
 //_entryLocked = true;
}
Изменено пользователем texport

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...