package events.lastHero;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
import javolution.util.FastList;
import ru.l2gw.gameserver.Announcements;
import ru.l2gw.gameserver.Config;
import ru.l2gw.gameserver.extensions.listeners.L2ZoneEnterLeaveListener;
import ru.l2gw.gameserver.instancemanager.InstanceManager;
import ru.l2gw.gameserver.listener.actor.OnDeathListener;
import ru.l2gw.gameserver.listener.actor.player.OnPlayerExitListener;
import ru.l2gw.gameserver.model.Creature;
import ru.l2gw.gameserver.model.GameObject;
import ru.l2gw.gameserver.model.GameObjectsStorage;
import ru.l2gw.gameserver.model.L2Skill;
import ru.l2gw.gameserver.model.Player;
import ru.l2gw.gameserver.model.Reflection;
import ru.l2gw.gameserver.model.actor.listener.CharListenerList;
import ru.l2gw.gameserver.model.entity.instance.Instance;
import ru.l2gw.gameserver.model.entity.olympiad.Olympiad;
import ru.l2gw.gameserver.model.gmaccess.AdminTemplateManager;
import ru.l2gw.gameserver.model.instances.L2NpcInstance;
import ru.l2gw.gameserver.model.zone.L2Zone;
import ru.l2gw.gameserver.scripts.Functions;
import ru.l2gw.gameserver.scripts.ScriptFile;
import ru.l2gw.gameserver.serverpackets.ExShowScreenMessage;
import ru.l2gw.gameserver.tables.ReflectionTable;
import ru.l2gw.gameserver.tables.SkillTable;
import ru.l2gw.gameserver.util.Files;
import ru.l2gw.gameserver.util.Location;
import events.Capture.Capture;
import events.TvT.TvT;
public class LastHero extends Functions implements ScriptFile, OnPlayerExitListener, OnDeathListener
{
public GameObject self;
public L2NpcInstance npc;
private static FastList<Integer> registered = new FastList<>();
static FastList<Integer> participants = new FastList<>();
private static FastList<Player> emptyList = new FastList<>(0);
private static Instance lastHeroInstance;
static Integer _status = 0;
private static Boolean _running = true;
// Статус запуска
static Boolean _alternate_form = Config.EVENT_LastHero_heroMod;
// Алтернативная формула проведения эвента
private static Boolean _lvlSort = Config.EVENT_LastHero_sortBylvl;
// Заготовка для сортировки по лвлам
private static Integer _time_to_start = Config.EVENT_LastHeroTime;
// Время до начала боя
private static Integer _event_time = Config.EVENT_LastHero_FightTime;
// Продолжительность эвента
private static Integer _bonus_id = Config.EVENT_LastHeroBonusID;
// Продолжительность эвента
private static Integer _bonus_count = Config.EVENT_LastHeroBonusCount;
// Продолжительность эвента
private static String _ann1 = Config.EVENT_LastHero_ruleMsg1;
private static String _ann2 = Config.EVENT_LastHero_ruleMsg2;
private static String _ann3 = Config.EVENT_LastHero_ruleMsg3;
private static String _ann4 = Config.EVENT_LastHero_ruleMsg4;
private static String _invMsg = Config.EVENT_LastHero_msgInv;
private static String _startMsg = Config.EVENT_LastHero_msgStart;
private static String _stopMsg = Config.EVENT_LastHero_msgStopEv;
private static String _missMsg = Config.EVENT_LastHero_msgMiss;
private static String _min_rem = " минут осталось до запуска...";
private static String _event_end = Config.EVENT_LastHero_msgEndEv;
private static String _no_winers = Config.EVENT_LastHero_msgNoWIn;
private static String _die_msg = Config.EVENT_LastHero_msgDie;
private static String _back_msg = Config.EVENT_LastHero_msgTP;
private static String _prep_msg = Config.EVENT_LastHero_msgPrep;
private static String _fight_msg = Config.EVENT_LastHero_msgFight;
private static boolean dispel = Config.EVENT_LastHero_dispel;
static ScheduledFuture<?> _endTask;
private static ScheduledFuture<?> _cycleTask;
private static ZoneListener zoneListener = new ZoneListener();
@Override
public void onLoad()
{
CharListenerList.addGlobal(this);
if (Config.EVENT_LastHero_enabled)
{
long startTime = Config.EVENT_LastHero_cron.timeNextUsage(System.currentTimeMillis());
_log.info("Loaded Event: Last Hero [state: activated] event start: " + new Date(startTime));
_cycleTask = executeTask("events.lastHero.LastHero", "start", new Object[0], startTime - System.currentTimeMillis());
}
else
{
_log.info("Loaded Event: Last Hero [state: deactivated]");
}
}
@Override
public void onReload()
{
}
@Override
public void onShutdown()
{
}
public static boolean isRunned()
{
return _running;
}
public String DialogAppend_31225(Integer val)
{
if (val == 0)
{
Player player = (Player) self;
return Files.read("data/scripts/events/lastHero/31225.html", player);
}
return "";
}
public void start()
{
if (self != null)
{
if (!AdminTemplateManager.checkBoolean("eventMaster", (Player) self))
{
return;
}
}
if (_status != 0)
{
_log.info("Event: Last Hero not started! status: " + _status);
if (self != null)
{
((Player) self).sendMessage("Last Hero is running! status: " + _status);
}
return;
}
_log.info("Event: Last Hero started!");
_status = 1;
_running = false;
_time_to_start = Config.EVENT_LastHeroTime;
participants.clear();
Announcements.getInstance().announceToAll(String.valueOf(_startMsg));
executeTask("events.lastHero.LastHero", "question", new Object[0], 20000L);
executeTask("events.lastHero.LastHero", "announce", new Object[0], 50000L);
}
public static void question()
{
for (Player player : GameObjectsStorage.getAllPlayers())
{
if (checkPlayerCondition(player) && !TvT.isRegistered(player) && !Capture.isRegistered(player))
{
player.scriptRequest(String.valueOf(_invMsg), "events.lastHero.LastHero:addPlayer", new Object[0]);
}
}
}
public static boolean isRegistered(Player player)
{
return Config.EVENT_LastHero_enabled && registered.contains(player.getObjectId());
}
public void addPlayer()
{
if (!(self instanceof Player))
{
return;
}
Player player = (Player) self;
if (_status != 1)
{
player.sendMessage("Нельзя зарегистрироваться на эвент в это время.");
return;
}
if (!checkPlayerCondition(player) || TvT.isRegistered(player) || Capture.isRegistered(player))
{
player.sendMessage("Вы не соответсвуете требования для учестия в эвенте.");
return;
}
if (!registered.contains(player.getObjectId()))
{
player.sendMessage("Вы зарегистрированы для участия в Last Hero.");
registered.add(player.getObjectId());
}
else
{
player.sendMessage("Вы уже зарегистрированы.");
}
}
public static void announce()
{
Announcements a = Announcements.getInstance();
if (registered.size() < Config.EVENT_LastHeroMinParticipants)
{
a.announceToAll(String.valueOf(_stopMsg));
registered.clear();
_log.info("Event: Last Hero no minimum participants.");
rescheduleEvent();
return;
}
if (_time_to_start > 1)
{
_time_to_start--;
a.announceToAll(_time_to_start + _min_rem);
if ((_time_to_start % 3) == 0)
{
a.announceToAll(String.valueOf(_missMsg));
}
executeTask("events.lastHero.LastHero", "announce", new Object[0], 60000L);
}
else
{
a.announceToAll(_prep_msg);
executeTask("events.lastHero.LastHero", "prepare", new Object[0], 5000L);
}
}
public static void prepare()
{
if (!_running)
{
return;
}
teleportPlayersToColiseum();
executeTask("events.lastHero.LastHero", "go", new Object[0], 120000L);
Announcements a = Announcements.getInstance();
a.announceToAll(String.valueOf(_ann1));
a.announceToAll(String.valueOf(_ann2));
a.announceToAll(String.valueOf(_ann3));
a.announceToAll(String.valueOf(_ann4));
}
public static void teleportPlayersToColiseum()
{
_status = 2;
FastList<Player> players = FastList.newInstance();
for (int objectId : registered)
{
Player player = GameObjectsStorage.getPlayer(objectId);
if ((player == null) || player.isInOfflineMode() || player.isInOlympiadMode() || player.inObserverMode() || player.isInDuel() || player.isAlikeDead() || player.isInCombat() || player.isCastingNow() || Olympiad.isRegisteredInComp(player) || (player.getReflection() != 0) || player.isInBoat())
{
continue;
}
participants.add(player.getObjectId());
players.add(player);
}
registered.clear();
if (players.size() < Config.EVENT_LastHeroMinParticipants)
{
participants.clear();
Announcements.getInstance().announceToAll(String.valueOf(_stopMsg));
_log.info("Event: Last Hero no minimum participants.");
FastList.recycle(players);
rescheduleEvent();
return;
}
lastHeroInstance = InstanceManager.getInstance().createNewInstance(-1, emptyList);
lastHeroInstance.getTemplate().getZone().setActive(true, lastHeroInstance.getReflection());
lastHeroInstance.getTemplate().getZone().getListenerEngine().addMethodInvokedListener(zoneListener);
lastHeroInstance.startInstance();
L2Skill nobleSkill = SkillTable.getInstance().getInfo(1323, 1);
L2Skill cancelSkill = SkillTable.getInstance().getInfo(4334, 1);
for (Player player : players)
{
player.block();
if (player.getParty() != null)
{
player.getParty().removePartyMember(player);
}
player.setStablePoint(player.getLoc());
player.teleToLocation(Location.coordsRandomize(149505, 46719, -3417, 0, 0, 500), lastHeroInstance.getReflection());
player.setTeam(2);
if (dispel)
{
List<Creature> targets = new ArrayList<>(1);
targets.add(player);
cancelSkill.useSkill(player, targets);
}
else
{
player.stopEffects("hero");
player.stopEffects("barrier");
player.stopEffects("mystic_immunity");
}
nobleSkill.applyEffects(player, player, false);
if (player.getPet() != null)
{
player.getPet().block();
if (dispel)
{
cancelSkill.applyEffects(player, player.getPet(), false);
}
else
{
player.getPet().stopEffects("hero");
player.getPet().stopEffects("barrier");
player.getPet().stopEffects("mystic_immunity");
}
}
}
FastList.recycle(players);
}
public static void go()
{
_status = 3;
FastList<Player> players = getParticipants();
if (players.size() < Config.EVENT_LastHeroMinParticipants)
{
participants.clear();
Announcements.getInstance().announceToAll(String.valueOf(_stopMsg));
_log.info("Event: Last Hero no minimum participants.");
rescheduleEvent();
FastList.recycle(players);
return;
}
_log.info("Event: Last Hero start battle, participants: " + players.size());
ExShowScreenMessage msg = new ExShowScreenMessage(">> Start FIGHT <<", 3000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER, true);
for (Player player : players)
{
player.unblock();
player.sendPacket(msg);
if (player.getPet() != null)
{
player.getPet().unblock();
}
}
FastList.recycle(players);
Announcements.getInstance().announceToAll(_fight_msg);
_endTask = executeTask("events.lastHero.LastHero", "endBattle", new Object[0], _event_time * 60000L);
}
public static FastList<Player> getParticipants()
{
if (lastHeroInstance == null)
{
return emptyList;
}
Reflection ref = ReflectionTable.getInstance().getById(lastHeroInstance.getReflection());
if (ref == null)
{
return emptyList;
}
FastList<Player> players = FastList.newInstance();
for (GameObject cha : ref.getAllObjects())
{
if ((cha instanceof Player) && !((Player) cha).isDeleting() && ((Player) cha).isOnline() && participants.contains(cha.getObjectId()))
{
players.add((Player) cha);
}
}
return players;
}
public static void endBattle()
{
Announcements a = Announcements.getInstance();
a.announceToAll(_event_end);
_log.info("Event: Last Hero battle end, no winner.");
FastList<Player> players = getParticipants();
for (Player player : players)
{
if (!player.isDead())
{
_log.info("Event: Last Hero live " + player + " at " + player.getLoc() + " visible: " + player.isVisible() + " isHide: " + player.isHide() + " isOnline: " + player.isOnline() + " teleport: " + player.isTeleporting());
}
}
a.announceToAll(_no_winers);
a.announceToAll(_back_msg);
executeTask("events.lastHero.LastHero", "end", new Object[0], 5000L);
rescheduleEvent();
FastList.recycle(players);
if (_endTask != null)
{
_endTask.cancel(false);
}
_endTask = null;
}
public static void end()
{
FastList<Player> players = getParticipants();
for (Player player : players)
{
player.stopEffectsByName("c_fake_death");
if (player.isDead())
{
player.doRevive();
}
player.setCurrentCp(player.getMaxCp());
player.setCurrentHp(player.getMaxHp());
player.setCurrentMp(player.getMaxMp());
player.unsetVar("LH_REWARD");
player.setTeam(0);
player.teleToLocation(player.getStablePoint(), 0);
player.setStablePoint(null);
player.unblock();
if (player.getPet() != null)
{
player.getPet().unblock();
}
}
lastHeroInstance.getTemplate().getZone().getListenerEngine().removeMethodInvokedListener(zoneListener);
lastHeroInstance.getTemplate().getZone().setActive(false, lastHeroInstance.getReflection());
lastHeroInstance.stopInstance();
lastHeroInstance = null;
FastList.recycle(players);
}
@Override
public void onDie(Creature killed, Creature killer)
{
if ((_status == 3) && (killed instanceof Player) && (killed.getReflection() == lastHeroInstance.getReflection()))
{
((Player) killed).sendMessage(_die_msg);
((Player) killed).setTeam(0);
if (!_alternate_form)
{
if ((killer != null) && killer.isPlayer())
{
if (Config.EVENT_LastHeroRate)
{
((Player) killer).addItem("last_hero", _bonus_id, ((Player) killed).getLevel() * _bonus_count, null, true);
}
else
{
((Player) killer).addItem("last_hero", _bonus_id, _bonus_count, null, true);
}
}
}
else if ((killer != null) && (killer.getPlayer() != null))
{
Player player = killer.getPlayer();
int pReward = player.getVarInt("LH_REWARD");
if (Config.EVENT_LastHeroRate)
{
pReward += ((Player) killed).getLevel() * _bonus_count;
}
else
// Give one-time reward to winner, if "Hero Mod" enabled and rate accumulative disabled
if (pReward <= 0)
{
pReward = _bonus_count;
}
player.setVar("LH_REWARD", String.valueOf(pReward));
Player lastHero = getLastHero();
if (lastHero != null)
{
endByWinner(lastHero);
if (_endTask != null)
{
_endTask.cancel(false);
}
_endTask = null;
}
}
}
}
static void endByWinner(Player lastHero)
{
lastHero.addItem("last_hero", _bonus_id, lastHero.getVarInt("LH_REWARD"), null, true);
lastHero.setHero(true);
Announcements a = Announcements.getInstance();
a.announceToAll(lastHero.getName() + " has become a 'Last Hero'!!!");
a.announceToAll(_event_end);
_log.info("Event: Last Hero battle end, winner: " + lastHero + " at " + lastHero.getLoc() + " visible: " + lastHero.isVisible());
a.announceToAll(_back_msg);
executeTask("events.lastHero.LastHero", "end", new Object[0], 5000L);
rescheduleEvent();
}
static Player getLastHero()
{
FastList<Player> players = getParticipants();
Player lastHero = null;
try
{
int liveCount = 0;
for (Player player : players)
{
if (!player.isVisible())
{
_log.info("Event: Last Hero getLastHero: " + player + " at " + player.getLoc() + " visible: " + player.isVisible() + " teleport: " + player.isTeleporting());
}
else if (!player.isDead() && lastHeroInstance.getTemplate().getZone().isInsideZone(player))
{
liveCount++;
lastHero = player;
if (liveCount > 1)
{
lastHero = null;
break;
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
FastList.recycle(players);
}
return lastHero;
}
private static void rescheduleEvent()
{
_status = 0;
_running = false;
if (Config.EVENT_LastHero_enabled)
{
if (_cycleTask != null)
{
_cycleTask.cancel(true);
}
long startTime = Config.EVENT_LastHero_cron.timeNextUsage(System.currentTimeMillis());
_log.info("Event: Last Hero next start: " + new Date(startTime));
_cycleTask = executeTask("events.lastHero.LastHero", "start", new Object[0], startTime - System.currentTimeMillis());
}
}
@Override
public void onPlayerExit(Player player)
{
if ((_status < 2) && registered.contains(player.getObjectId()))
{
registered.remove((Integer) player.getObjectId());
}
else if ((_status >= 2) && participants.contains(player.getObjectId()))
{
participants.remove((Integer) player.getObjectId());
if (_alternate_form)
{
Player lastHero = getLastHero();
if (lastHero != null)
{
endByWinner(lastHero);
if (_endTask != null)
{
_endTask.cancel(true);
}
_endTask = null;
}
}
else
{
FastList<Player> players = getParticipants();
int c = 0;
for (Player participant : players)
{
if (!participant.isDead())
{
c++;
}
}
if (c < 2)
{
endBattle();
}
FastList.recycle(players);
}
}
}
private static class ZoneListener extends L2ZoneEnterLeaveListener
{
public ZoneListener()
{
}
@Override
public void objectEntered(L2Zone zone, Creature object)
{
}
@Override
public void objectLeaved(L2Zone zone, Creature object)
{
if ((object instanceof Player) && (_status >= 2) && participants.contains(object.getObjectId()))
{
_log.info("Event: Last Hero player leaved zone on battle: " + object + " " + object.getLoc());
participants.remove((Integer) object.getObjectId());
if (_alternate_form)
{
Player lastHero = getLastHero();
if (lastHero != null)
{
endByWinner(lastHero);
if (_endTask != null)
{
_endTask.cancel(false);
}
_endTask = null;
}
}
else
{
FastList<Player> players = getParticipants();
int c = 0;
for (Player participant : players)
{
if (!participant.isDead())
{
c++;
}
}
if (c < 2)
{
endBattle();
}
FastList.recycle(players);
}
object.setReflection(0);
object.unblock();
if (object.getPet() != null)
{
object.getPet().unblock();
}
((Player) object).setTeam(0);
}
}
@Override
public void sendZoneStatus(L2Zone zone, Player object)
{
}
}
}
######### NPC Buffer config ############
# Минимальный уровень для бафа
Min_lvl = 1
# Максимальный уровень для бафа
Max_lvl = 99
# Стоимость 1 баффа
price = 5000
# Разрешены бафы во время осад?
Buffer_Siege = false
# Во сколько раз увеличивать бафы по времени(int)
# Данный модификатор бафа относится только к эвенту NPC Buffer
# На модификатор бафов персонаж-персонаж не влияет.
EVENT_BUFFER_MOD=1
######## NPC Buffer config end #########
####### Coffer of Shadows config #######
# Рейт на цену сундучков х1=50к
CofferOfShadowsPriceRate = 1
# Рейт на награды, вещественное число (раньше было эквивалентно RateDropItems)
CofferOfShadowsRewardRate = 1.
##### Coffer of Shadows config end #####
# У классмастеров можно покупать шоты по двойной цене
# отредактировать список можно тут: gameserver\data\classmaster_buylists.xml
CM_SellSS = False
# Мультиселл №1 у классмастеров (продажа за CoL, список создается на свой вкус)
# при использовании DonateShop не актуален
CM_CoLShop = False
#TheFallHarvest (Default 5 = 0.5%)
TFH_POLLEN_CHANCE = 5
#Glittering medal
GLIT_MEDAL_CHANCE = 10
GLIT_GLITTMEDAL_CHANCE = 5
# Минимальный уровень мобов с которых будут падать медальки
GLIT_MIN_MOB_LEVEL = 10
# Максимальная разница в уровнях моба
GLIT_MAX_LEVEL_DIFF = 3
GLIT_EnableRate = true
##### Last Hero #####
LastHero_enabled = true
# ID вещи за каждого убитого (57 - адена)
LastHero_bonus_id = 4037
# Количество вещи за каждого убитого (то, что умножается на уровень убитого)
LastHero_bonus_count = 0
# Время до старта (при каждом запуске, ждем указанное кол-во минут до старта)
LastHero_time = 5
# Домножать на лвл убитого?
LastHero_rate = true
# Продолжительность боя. ПО-умолчанию равен 5 минутам
LastHero_fighttime = 5
#Альтернативный вариант эвента (Hero-mod). При значении true
#награду и статус "Последнего Героя" (аура Героя до первого релогина) получает только победитель,
#тот кто остался в живых. Если в живых осталось более одного
#игрока, то - ничья. Награду не получает никто. При значении равном false - классический эвент, каждый
#игрок,который убил хотя бы одного оппонента получает награду.
LastHero_heroMod = true
# Время запуска ласт хиро, соответсвую формату crontab
LastHero_cron=0 */3 * * *
# Минимальное количество участников
LastHero_MinParticipants = 2
#Аннонсы эвента
LastHero_ruleMsg1= Эвент длится 5 минут.
LastHero_ruleMsg2= Цель - убить как можно больше игроков.
LastHero_ruleMsg3= За победу начисляется 10 CoL!!!
LastHero_ruleMsg3= Старт через 2 минуты, по команде 'FIGHT!!!
LastHero_msgStart = Запущен эвент Last Hero.
LastHero_msgInv = Вы хотите принять участие в эвенте?
LastHero_msgMiss = Пропустившие момент регистрации, могут зарегистрироваться в Alt+B
LastHero_msgStopEv = Эвент отменен, слишком мало участников.
LastHero_msgEndEv = Эвент 'Last Hero' завершен
LastHero_msgNoWIn = Эвент закончился вничью
LastHero_msgDie = Вас убили. Ждите окончания эвента
LastHero_msgTP = Телепортация всех игроков обратно...
LastHero_msgPrep = Боевая готовность...!
LastHero_msgFight = >>> FIGHT!!! <<<
#Заготовка на разделение по уровням персонажей, приглашаемых на эвент. По-умолчанию равно false
LastHero_sortBylvl = false
#Снимать бафы перед началом эвента или не снимать
LastHero_dispel = false
# TvT #
TvT_Enabled = true
# Время на подготовку после телепорта в коллизей в минутах
TvT_PrepareTime = 2
# Время боя, в минутах
TvT_FightTime = 10
# Режим сортировки при формировании комманда
# 0 - случайным образом
# 1 - по счетчику пвп
TvT_TeamRandomType = 1
# Количество экземпляров эвента, под разные уровни.
TvT_EventCount = 1
# Время запуска эвента, соответсвую записи crontab
TvT1_Crontab=30 */3 * * *
# минимальный уровень для регистрации
TvT1_MinLevel = 1
# максимальный уровень для регистрации
TvT1_MaxLevel = 86
# Минимальное количество участников
TvT1_MinParticipants = 2
# Итем ид который дается в награду
TvT1_RewardItemId = 4037
# Количество итемов
TvT1_RewardItemCount = 10
# Персональная награда игроку кто больше всех набил пвп
TvT1_RewardTopPlayerItemId = 4037
TvT1_RewardTopPlayerCount = 10
# Объявление при запуске эвента
TvT1_StartAnnounce = Регистрация на TvT начата, уровни с 1 по 85.
TvT1_RegistrationAnnounce = Окончание TvT регистрации через MIN минут (уровни 1-85).
TvT1_RegistrationEndAnnounce = Регистрация окончена уровни 1-85.
# Снимать бафф при телепорте на стадион
TvT1_Dispel = false
# После телепортации в коллизей объявим правила эвента
# Только для участников эвента
TvT1_RuleAnnounce1 = Эвент длится 10 минут.
TvT1_RuleAnnounce2 = Побеждает комманда больше всех убившая противников.
TvT1_RuleAnnounce3 = Каждый игрок победившей комманды получает 1 CoL.
TvT1_RuleAnnounce4 = Игрок убивший больше всех противников получит 20 CoL.
TvT1_RuleAnnounce5 = Старт эвента через 2 минуты.
TvT1_NoParticipantsAnnounce = TvT отменен, уровни с 1 по 85.
TvT1_WinnerTeamAnnounce = COLOR комманда победила убив KILLS противников, уровни с 1 по 85.
TvT1_NoWinnerTeamAnnounce = TvT закончилось в ничью, уровни с 1 по 85.
TvT1_TopPlayerAnnounce = NAME стал чемпионом TvT, убив KILLS игроков, COLOR комманда.
TvT2_Crontab=30 */3 * * *
TvT2_MinLevel = 51
TvT2_MaxLevel = 86
TvT2_MinParticipants = 2
TvT2_RewardItemId = 4037
TvT2_RewardItemCount = 10
TvT2_RewardTopPlayerItemId = 4037
TvT2_RewardTopPlayerCount = 10
TvT2_StartAnnounce = Регистрация на TvT начата, уровни с 51 по 85.
TvT2_RegistrationAnnounce = Окончание TvT регистрации через MIN минут (уровни 51-85).
TvT2_RegistrationEndAnnounce = Регистрация окончена уровни 51-85.
TvT2_Dispel = false
TvT2_RuleAnnounce1 = Эвент длится 10 минут.
TvT2_RuleAnnounce2 = Побеждает комманда больше всех убившая противников.
TvT2_RuleAnnounce3 = Каждый игрок победившей комманды получает 10 CoL.
TvT2_RuleAnnounce4 = Игрок убивший больше всех противников получит 20 CoL.
TvT2_RuleAnnounce5 = Старт эвента через 2 минуты.
TvT2_NoParticipantsAnnounce = TvT отменен, уровни с 51 по 85.
TvT2_WinnerTeamAnnounce = COLOR комманда победила убив KILLS противников, уровни с 51 по 85.
TvT2_NoWinnerTeamAnnounce = TvT закончилось в ничью, уровни с 51 по 85.
TvT2_TopPlayerAnnounce = NAME стал чемпионом TvT, убив KILLS игроков, COLOR комманда.
# Master of Enchanting Event
# http://www.lineage2.com/archive/2009/06/master_of_encha.html
# Цена за посох Yogi Staff на оффк 1000
MOSStaffPrice = 10
# Цена одного свитка заточки, на оффе 77777
MOSScrollPrice = 777777
# Цена на 24 свитка заточки, можно купить раз в 6 часов с одного акка/hwid, на оффу 6000
MOSScroll24Price = 60000
# Минимальный уровень мобов с которых будут дропаться свитка
MOSMobMinLevel = 20
# Шанс дропа свитков
MOSScrollDropChance = 1.0
# Christmas Gift event
# Новогодний эвент, спавнит елку в адене под которой время от времени появляются подарки.
# Формат списка как у эффекта i_restoration_random т.е.
# <item_id1>,<count1>,<item_id2>,<count2>,...,<item_idN>,<countN>;<chance>; ... etc.
# count задает максимальное количество т.е. 1 + Rnd.get(count)
# Сумма шансов должна быть равна 100%
XmasGiftItems=959,1;10;960,2;90
# Время дропа итемов в секундах (1 час)
XmasGiftDropTime=3600
# Время дропа рандом +/- к XmasGiftDropTime
XmasGiftDropTimeRand=1800
# Настройки ивента Захват
CaptureEnabled=true
# Расписание запуска эвента
CaptureCron=10 */3 * * *
# Фиксированное количество тикетов
CaptureTickets=0
# Тикетов на одного участника эвента
CaptureTicketsPerPlayer=5
# Время эвента в минутах
CaptureEventTime=10
# Время на регистрацию в минутах
CaptureRegistrationTime=10
# Минимальное количество игроков для запуска эвента
CaptureMinParticipants=2
# Максимальное количество участников
CaptureMaxParticipants=54
# Минимальный уровень игрока для участия в эвента
CapturePlayerMinLevel=1
# Максимальный уровень игрока для участия в эвенте
CapturePlayerMaxLevel=99
# Очки начисляемые игрокам в процессе эвенте
# Очки за убийство
CapturePointsKill=100
# Очки за воскрешение других игроков
CapturePointsResurrect=100
# Очки за захват флага
CapturePointsFlagCapture=250
# Очки за атаку флага
CapturePointsFlagAttack=150
# Очки за победу команды
CapturePointsWin=500
# Задержка перед авто ресом в секундах
CaptureResurrectDelay=20
# Проверять HWID при регистрации
CaptureHwidCheck=false
# Коэфф. на хил
CaptureHealRate=0.01
# Итем для обмена на очки
CaptureExchangeItemId=14351
# Курс обмена очков на итемы
CaptureExchangeRate=0.01
Очень старая сборка, я не смог найти в конфиге ничего подобного1. Что говорит лог во время регистрации и в момент, когда должен забирать людей?
2. На сегодняшний день, почти на всех сборках, эти настройки давно выведены в конфиг. Можно поменять с HWID на IP.
После боевой готовности ничего не происходит, так же и с ТВТВ ивент не запускает каким образом? Пишет что-то? Или как будто и не было регистрации?
В коде я тоже не увидел ограничений на участие. Возможно вынесено в какой-то базовый класс.После боевой готовности ничего не происходит, так же и с ТВТ
Имеет ли смысл кидать файл log4j.xml, более похожие настройки там, но я не уверенВ коде я тоже не увидел ограничений на участие. Возможно вынесено в какой-то базовый класс.
Попробуй:
- поискать hwid/ip по всем конфигам и возможно будет общий для всех (либо по названию ограничения что-то типа unique players или запрет окон)
- аналогично по исходникам, там будет точно прям такое название, по контексту думаю можно будет понять
В коде я тоже не увидел ограничений на участие. Возможно вынесено в какой-то базовый класс.
Попробуй:
- поискать hwid/ip по всем конфигам и возможно будет общий для всех (либо по названию ограничения что-то типа unique players или запрет окон)
- аналогично по исходникам, там будет точно прям такое название, по контексту думаю можно будет понять
@ConfigField(config = "events", fieldName = "TvT_CheckHWID", value = "false")
public static boolean EVENT_TvT_CheckHWID;
Возможно у них используется общая настройка. Поиском по конфигам CheckHWID возможно найдешь, где в это поле настраивается и в каком конфиг файле. В l2jeternity, например отдельный конфиг для проверки double sessions. Называется: AllowCheckSessions и в том же конфиге все настройки для проверок ивентов. И да, он может использовать защиту как источник hwid'aКод:@ConfigField(config = "events", fieldName = "TvT_CheckHWID", value = "false") public static boolean EVENT_TvT_CheckHWID;
Нашел в config.java, но про Last Hero ничего нет, именно hwid
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?