Банки на ивентах - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Работа со скриптами

Работа со скриптами Помощь в редактировании и написании квестов к Java серверам, а так же эвентов.

Ответ
Опции темы
Непрочитано 29.07.2012, 00:15   #1
Пользователь

Автор темы (Топик Стартер) Банки на ивентах

Доброй ночи уважаемые. Подскажите как можно запретить юзать банки на ивентах? ресать?

Вот пример моего твт:
Код:
package events.TvT;

import java.util.concurrent.ScheduledFuture;
import java.util.logging.Logger;

import l2p.Config;
import l2p.common.ThreadPoolManager;
import l2p.extensions.listeners.L2ZoneEnterLeaveListener;
import l2p.extensions.multilang.CustomMessage;
import l2p.extensions.scripts.Functions;
import l2p.extensions.scripts.ScriptFile;
import l2p.gameserver.Announcements;
import l2p.gameserver.clientpackets.Say2C;
import l2p.gameserver.instancemanager.CastleManager;
import l2p.gameserver.instancemanager.ServerVariables;
import l2p.gameserver.instancemanager.ZoneManager;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.L2Object;
import l2p.gameserver.model.L2ObjectsStorage;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.L2Skill;
import l2p.gameserver.model.L2Territory;
import l2p.gameserver.model.L2Zone;
import l2p.gameserver.model.L2Zone.ZoneType;
import l2p.gameserver.model.entity.olympiad.Olympiad;
import l2p.gameserver.model.entity.residence.Castle;
import l2p.gameserver.model.entity.siege.territory.TerritorySiege;
import l2p.gameserver.serverpackets.Revive;
import l2p.gameserver.tables.DoorTable;
import l2p.gameserver.tables.SkillTable;
import l2p.gameserver.skills.AbnormalEffect;
import l2p.util.Files;
import l2p.util.GArray;
import l2p.util.GCSArray;
import l2p.util.Location;
import l2p.util.Rnd;
import l2p.util.Util;

public class TvT extends Functions implements ScriptFile
{
	private static Logger _log = Logger.getLogger(TvT.class.getName());

	public class StartTask implements Runnable
	{
		public void run()
		{
			if(!_active)
				return;

			if(isPvPEventStarted())
			{
				_log.info("TvT not started: another event is already running");
				return;
			}

			if(!Rnd.chance(Config.EVENT_TvTChanceToStart))
			{
				_log.fine("TvT not started: chance");
				return;
			}

			if(TerritorySiege.isInProgress())
			{
				_log.fine("TvT not started: TerritorySiege in progress");
				return;
			}

			for(Castle c : CastleManager.getInstance().getCastles().values())
				if(c.getSiege() != null && c.getSiege().isInProgress())
				{
					_log.fine("TvT not started: CastleSiege in progress");
					return;
				}

			start(new String[] { "6", "0" });
		}
	}

	private static ScheduledFuture<?> _startTask;

	private static GCSArray<Long> players_list1 = new GCSArray<Long>();
	private static GCSArray<Long> players_list2 = new GCSArray<Long>();
	private static GCSArray<Long> live_list1 = new GCSArray<Long>();
	private static GCSArray<Long> live_list2 = new GCSArray<Long>();

	private static boolean _isRegistrationActive = false;
	private static int _status = 0;
	private static int _time_to_start;
	private static int _category;
	private static int _minLevel;
	private static int _maxLevel;
	private static int _autoContinue = 0;

	private static ScheduledFuture<?> _endTask;

	private static L2Zone _zone = ZoneManager.getInstance().getZoneByIndex(ZoneType.OlympiadStadia, 4, true);
	ZoneListener _zoneListener = new ZoneListener();

	private static L2Territory team1loc = new L2Territory(11000001);
	private static L2Territory team2loc = new L2Territory(11000002);

	public void onLoad()
	{
		_zone.getListenerEngine().addMethodInvokedListener(_zoneListener);

		team1loc.add(149878, 47505, -3408, -3308);
		team1loc.add(150262, 47513, -3408, -3308);
		team1loc.add(150502, 47233, -3408, -3308);
		team1loc.add(150507, 46300, -3408, -3308);
		team1loc.add(150256, 46002, -3408, -3308);
		team1loc.add(149903, 46005, -3408, -3308);

		team2loc.add(149027, 46005, -3408, -3308);
		team2loc.add(148686, 46003, -3408, -3308);
		team2loc.add(148448, 46302, -3408, -3308);
		team2loc.add(148449, 47231, -3408, -3308);
		team2loc.add(148712, 47516, -3408, -3308);
		team2loc.add(149014, 47527, -3408, -3308);

		_startTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new StartTask(), 3600000, 3600000);

		_active = ServerVariables.getString("TvT", "off").equalsIgnoreCase("on");

		_log.fine("Loaded Event: TvT");
	}

	public void onReload()
	{
		_zone.getListenerEngine().removeMethodInvokedListener(_zoneListener);
		_startTask.cancel(true);
	}

	public void onShutdown()
	{
		onReload();
	}

	private static boolean _active = false;

	private static boolean isActive()
	{
		return _active;
	}

	public void activateEvent()
	{
		L2Player player = (L2Player) getSelf();
		if(!player.getPlayerAccess().IsEventGm)
			return;

		if(!isActive())
		{
			if(_startTask == null)
				_startTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new StartTask(), 3600000, 3600000);
			ServerVariables.set("TvT", "on");
			_log.info("Event 'TvT' activated.");
			Announcements.getInstance().announceByCustomMessage("scripts.events.TvT.AnnounceEventStarted", null);
		}
		else
			player.sendMessage("Event 'TvT' already active.");

		_active = true;

		show(Files.read("data/html/admin/events.htm", player), player);
	}

	public void deactivateEvent()
	{
		L2Player player = (L2Player) getSelf();
		if(!player.getPlayerAccess().IsEventGm)
			return;

		if(isActive())
		{
			if(_startTask != null)
			{
				_startTask.cancel(true);
				_startTask = null;
			}
			ServerVariables.unset("TvT");
			_log.info("Event 'TvT' deactivated.");
			Announcements.getInstance().announceByCustomMessage("scripts.events.TvT.AnnounceEventStoped", null);
		}
		else
			player.sendMessage("Event 'TvT' not active.");

		_active = false;

		show(Files.read("data/html/admin/events.htm", player), player);
	}

	public static boolean isRunned()
	{
		return _isRegistrationActive || _status > 0;
	}

	public String DialogAppend_31225(Integer val)
	{
		if(val == 0)
		{
			L2Player player = (L2Player) getSelf();
			return Files.read("data/scripts/events/TvT/31225.html", player);
		}
		return "";
	}

	public static int getMinLevelForCategory(int category)
	{
		switch(category)
		{
			case 1:
				return 20;
			case 2:
				return 30;
			case 3:
				return 40;
			case 4:
				return 52;
			case 5:
				return 62;
			case 6:
				return 76;
		}
		return 0;
	}

	public static int getMaxLevelForCategory(int category)
	{
		switch(category)
		{
			case 1:
				return 29;
			case 2:
				return 39;
			case 3:
				return 51;
			case 4:
				return 61;
			case 5:
				return 75;
			case 6:
				return 85;
		}
		return 0;
	}

	public static int getCategory(int level)
	{
		if(level >= 20 && level <= 29)
			return 1;
		else if(level >= 30 && level <= 39)
			return 2;
		else if(level >= 40 && level <= 51)
			return 3;
		else if(level >= 52 && level <= 61)
			return 4;
		else if(level >= 62 && level <= 75)
			return 5;
		else if(level >= 76)
			return 6;
		return 0;
	}

	public void start(String[] var)
	{
		L2Player player = (L2Player) getSelf();
		if(var.length != 2)
		{
			show(new CustomMessage("common.Error", player), player);
			return;
		}

		Integer category;
		Integer autoContinue;
		try
		{
			category = Integer.valueOf(var[0]);
			autoContinue = Integer.valueOf(var[1]);
		}
		catch(Exception e)
		{
			show(new CustomMessage("common.Error", player), player);
			return;
		}

		_category = category;
		_autoContinue = autoContinue;

		if(_category == -1)
		{
			_minLevel = 1;
			_maxLevel = 85;
		}
		else
		{
			_minLevel = getMinLevelForCategory(_category);
			_maxLevel = getMaxLevelForCategory(_category);
		}

		if(_endTask != null)
		{
			show(new CustomMessage("common.TryLater", player), player);
			return;
		}

		_status = 0;
		_isRegistrationActive = true;
		_time_to_start = Config.EVENT_TvTTime;

		players_list1 = new GCSArray<Long>();
		players_list2 = new GCSArray<Long>();
		live_list1 = new GCSArray<Long>();
		live_list2 = new GCSArray<Long>();

		String[] param = { String.valueOf(_time_to_start), String.valueOf(_minLevel), String.valueOf(_maxLevel) };
		sayToAll("scripts.events.TvT.AnnouncePreStart", param);

		executeTask("events.TvT.TvT", "question", new Object[0], 10000);
		executeTask("events.TvT.TvT", "announce", new Object[0], 60000);
	}

	public static void sayToAll(String address, String[] replacements)
	{
		Announcements.getInstance().announceByCustomMessage(address, replacements, Say2C.CRITICAL_ANNOUNCEMENT);
	}

	public static void question()
	{
		for(L2Player player : L2ObjectsStorage.getAllPlayersForIterate())
			if(player != null && player.getLevel() >= _minLevel && player.getLevel() <= _maxLevel && player.getReflection().getId() <= 0 && !player.isInOlympiadMode() && !player.isReviveRequested())
				player.scriptRequest(new CustomMessage("scripts.events.TvT.AskPlayer", player).toString(), "events.TvT.TvT:addPlayer", new Object[0]);
	}

	public static void announce()
	{
		if(players_list1.isEmpty() || players_list2.isEmpty())
		{
			sayToAll("scripts.events.TvT.AnnounceEventCancelled", null);
			_isRegistrationActive = false;
			_status = 0;
			executeTask("events.TvT.TvT", "autoContinue", new Object[0], 10000);
			return;
		}

		if(_time_to_start > 1)
		{
			_time_to_start--;
			String[] param = { String.valueOf(_time_to_start), String.valueOf(_minLevel), String.valueOf(_maxLevel) };
			sayToAll("scripts.events.TvT.AnnouncePreStart", param);
			executeTask("events.TvT.TvT", "announce", new Object[0], 60000);
		}
		else
		{
			_status = 1;
			_isRegistrationActive = false;
			sayToAll("scripts.events.TvT.AnnounceEventStarting", null);
			executeTask("events.TvT.TvT", "prepare", new Object[0], 5000);
		}
	}

	public void addPlayer()
	{
		L2Player player = (L2Player) getSelf();
		if(player == null || !checkPlayer(player, true))
			return;

		int team = 0, size1 = players_list1.size(), size2 = players_list2.size();

		if(size1 > size2)
			team = 2;
		else if(size1 < size2)
			team = 1;
		else
			team = Rnd.get(1, 2);

		if(team == 1)
		{
			players_list1.add(player.getStoredId());
			live_list1.add(player.getStoredId());
			show(new CustomMessage("scripts.events.TvT.Registered", player), player);
		}
		else if(team == 2)
		{
			players_list2.add(player.getStoredId());
			live_list2.add(player.getStoredId());
			show(new CustomMessage("scripts.events.TvT.Registered", player), player);
		}
		else
			_log.info("WTF??? Command id 0 in TvT...");
	}

	public static boolean checkPlayer(L2Player player, boolean first)
	{
		if(first && !_isRegistrationActive)
		{
			show(new CustomMessage("scripts.events.Late", player), player);
			return false;
		}

		if(first && players_list1.contains(player.getStoredId()))
		{
			players_list1.remove(player.getStoredId());
			show(new CustomMessage("scripts.events.CtF.Cancelled", player), player);
			return false;
		}
		if(first && players_list2.contains(player.getStoredId()))
		{
			players_list2.remove(player.getStoredId());
			show(new CustomMessage("scripts.events.CtF.Cancelled", player), player);
			return false;
		}

		if(player.getLevel() < _minLevel || player.getLevel() > _maxLevel)
		{
			show(new CustomMessage("scripts.events.TvT.CancelledLevel", player), player);
			return false;
		}

		if(player.isMounted())
		{
			show(new CustomMessage("scripts.events.TvT.Cancelled", player), player);
			return false;
		}

		if(player.getDuel() != null)
		{
			show(new CustomMessage("scripts.events.TvT.CancelledDuel", player), player);
			return false;
		}

		if(player.getTeam() != 0)
		{
			show(new CustomMessage("scripts.events.TvT.CancelledOtherEvent", player), player);
			return false;
		}

		if(player.getOlympiadGameId() > 0 || player.isInZoneOlympiad() || first && Olympiad.isRegistered(player))
		{
			show(new CustomMessage("scripts.events.TvT.CancelledOlympiad", player), player);
			return false;
		}

		if(player.isInParty() && player.getParty().isInDimensionalRift())
		{
			show(new CustomMessage("scripts.events.TvT.CancelledOtherEvent", player), player);
			return false;
		}

		if(player.isTeleporting())
		{
			show(new CustomMessage("scripts.events.TvT.CancelledTeleport", player), player);
			return false;
		}

		if (player.getTransformation() != 0)
		{
			player.sendMessage("Нельзя участвовать в трансформации!");
			return false;
		}

		if (player.isCursedWeaponEquipped())
		{
			player.sendMessage("Нельзя участвовать в эвенте с демоническим оружием!");
			return false;
		}
		if (player.getReflection().getId() > 0)
		{
			player.sendMessage("Вы находитесь в инстансе, регистрация запрещена!");
			return false;
		}
		return true;
	}

	public static void prepare()
	{
		DoorTable.getInstance().getDoor(24190002).closeMe();
		DoorTable.getInstance().getDoor(24190003).closeMe();

		cleanPlayers();
		clearArena();

		executeTask("events.TvT.TvT", "ressurectPlayers", new Object[0], 1000);
		executeTask("events.TvT.TvT", "healPlayers", new Object[0], 2000);
		executeTask("events.TvT.TvT", "saveBackCoords", new Object[0], 3000);
		executeTask("events.TvT.TvT", "paralyzePlayers", new Object[0], 4000);
		executeTask("events.TvT.TvT", "teleportPlayersToColiseum", new Object[0], 5000);
		executeTask("events.TvT.TvT", "go", new Object[0], 60000);

		sayToAll("scripts.events.TvT.AnnounceFinalCountdown", null);
	}

	public static void go()
	{
		_status = 2;
		upParalyzePlayers();
		checkLive();
		clearArena();
		sayToAll("scripts.events.TvT.AnnounceFight", null);
		_endTask = executeTask("events.TvT.TvT", "endBattle", new Object[0], 300000);
	}

	public static void endBattle()
	{
		DoorTable.getInstance().getDoor(24190002).openMe();
		DoorTable.getInstance().getDoor(24190003).openMe();

		_status = 0;
		removeAura();
		if(live_list1.isEmpty())
		{
			sayToAll("scripts.events.TvT.AnnounceFinishedBlueWins", null);
			giveItemsToWinner(false, true, 1);
		}
		else if(live_list2.isEmpty())
		{
			sayToAll("scripts.events.TvT.AnnounceFinishedRedWins", null);
			giveItemsToWinner(true, false, 1);
		}
		else if(live_list1.size() < live_list2.size())
		{
			sayToAll("scripts.events.TvT.AnnounceFinishedBlueWins", null);
			giveItemsToWinner(false, true, 1);
		}
		else if(live_list1.size() > live_list2.size())
		{
			sayToAll("scripts.events.TvT.AnnounceFinishedRedWins", null);
			giveItemsToWinner(true, false, 1);
		}
		else if(live_list1.size() == live_list2.size())
		{
			sayToAll("scripts.events.TvT.AnnounceFinishedDraw", null);
			giveItemsToWinner(true, true, 0.5);
		}

		sayToAll("scripts.events.TvT.AnnounceEnd", null);
		executeTask("events.TvT.TvT", "end", new Object[0], 30000);
		_isRegistrationActive = false;
		if(_endTask != null)
		{
			_endTask.cancel(false);
			_endTask = null;
		}
	}

	public static void end()
	{
		executeTask("events.TvT.TvT", "ressurectPlayers", new Object[0], 1000);
		executeTask("events.TvT.TvT", "healPlayers", new Object[0], 2000);
		executeTask("events.TvT.TvT", "teleportPlayersToSavedCoords", new Object[0], 3000);
		executeTask("events.TvT.TvT", "autoContinue", new Object[0], 10000);
	}

	public void autoContinue()
	{
		live_list1.clear();
		live_list2.clear();
		players_list1.clear();
		players_list2.clear();

		if(_autoContinue > 0)
		{
			if(_autoContinue >= 6)
			{
				_autoContinue = 0;
				return;
			}
			start(new String[] { "" + (_autoContinue + 1), "" + (_autoContinue + 1) });
		}
	}

	public static void giveItemsToWinner(boolean team1, boolean team2, double rate)
	{
		if(team1)
			for(L2Player player : getPlayers(players_list1))
				addItem(player, Config.EVENT_TvTItemID, Math.round((Config.EVENT_TvT_rate ? player.getLevel() : 1) * Config.EVENT_TvTItemCOUNT * rate));
		if(team2)
			for(L2Player player : getPlayers(players_list2))
				addItem(player, Config.EVENT_TvTItemID, Math.round((Config.EVENT_TvT_rate ? player.getLevel() : 1) * Config.EVENT_TvTItemCOUNT * rate));
	}

	public static void saveBackCoords()
	{
		for(L2Player player : getPlayers(players_list1))
			player.setVar("TvT_backCoords", player.getX() + " " + player.getY() + " " + player.getZ() + " " + player.getReflection().getId());
		for(L2Player player : getPlayers(players_list2))
			player.setVar("TvT_backCoords", player.getX() + " " + player.getY() + " " + player.getZ() + " " + player.getReflection().getId());
	}

	public static void teleportPlayersToColiseum()
	{
		for(L2Player player : getPlayers(players_list1))
		{
			unRide(player);
			unSummonPet(player, true);
			int[] pos = team1loc.getRandomPoint();
			player.teleToLocation(pos[0], pos[1], pos[2], 0);
		}
		for(L2Player player : getPlayers(players_list2))
		{
			unRide(player);
			unSummonPet(player, true);
			int[] pos = team2loc.getRandomPoint();
			player.teleToLocation(pos[0], pos[1], pos[2], 0);
		}
	}

	public static void teleportPlayersToSavedCoords()
	{
		for(L2Player player : getPlayers(players_list1))
			try
			{
				String var = player.getVar("TvT_backCoords");
				if(var == null || var.equals(""))
					continue;
				String[] coords = var.split(" ");
				if(coords.length != 4)
					continue;
				player.teleToLocation(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(coords[2]), Long.parseLong(coords[3]));
				player.unsetVar("TvT_backCoords");
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		for(L2Player player : getPlayers(players_list2))
			try
			{
				String var = player.getVar("TvT_backCoords");
				if(var == null || var.equals(""))
					continue;
				String[] coords = var.split(" ");
				if(coords.length != 4)
					continue;
				player.teleToLocation(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(coords[2]), Integer.parseInt(coords[3]));
				player.unsetVar("TvT_backCoords");
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
	}

	public static void paralyzePlayers()
	{
		L2Skill revengeSkill = SkillTable.getInstance().getInfo(L2Skill.SKILL_RAID_CURSE, 1);
		for(L2Player player : getPlayers(players_list1))
		{
			player.getEffectList().stopEffect(L2Skill.SKILL_MYSTIC_IMMUNITY);
			player.setParalyzed(true);	
			player.getEffectList().stopAllEffects();			
			revengeSkill.getEffects(player, player, false, false);
			if(player.getPet() != null)
			{
				revengeSkill.getEffects(player, player.getPet(), false, false);
				player.getPet().setParalyzed(true);
			}	
		}
		for(L2Player player : getPlayers(players_list2))
		{
			player.getEffectList().stopEffect(L2Skill.SKILL_MYSTIC_IMMUNITY);
			player.setParalyzed(true);
			player.getEffectList().stopAllEffects();
			revengeSkill.getEffects(player, player, false, false);
			if(player.getPet() != null)
			{
				revengeSkill.getEffects(player, player.getPet(), false, false);
				player.getPet().setParalyzed(true);
			}	
		}
	}

	public static void upParalyzePlayers()
	{
		for(L2Player player : getPlayers(players_list1))
		{
			player.getEffectList().stopEffect(L2Skill.SKILL_RAID_CURSE);
			player.setParalyzed(false);
			if(player.getPet() != null)
			{
				player.getPet().getEffectList().stopEffect(L2Skill.SKILL_RAID_CURSE);
				player.getPet().setParalyzed(false);
			}	

			if(player.getParty() != null)
				player.getParty().oustPartyMember(player);
		}
		for(L2Player player : getPlayers(players_list2))
		{
			player.getEffectList().stopEffect(L2Skill.SKILL_RAID_CURSE);
			player.setParalyzed(false);
			if(player.getPet() != null)
			{
				player.getPet().getEffectList().stopEffect(L2Skill.SKILL_RAID_CURSE);
				player.getPet().setParalyzed(false);
			}	

			if(player.getParty() != null)
				player.getParty().oustPartyMember(player);
		}
	}

	public static void ressurectPlayers()
	{
		for(L2Player player : getPlayers(players_list1))
			if(player.isDead())
			{
				player.restoreExp();
				player.setCurrentCp(player.getMaxCp());
				player.setCurrentHp(player.getMaxHp(), true);
				player.setCurrentMp(player.getMaxMp());
				player.broadcastPacket(new Revive(player));
			}
		for(L2Player player : getPlayers(players_list2))
			if(player.isDead())
			{
				player.restoreExp();
				player.setCurrentCp(player.getMaxCp());
				player.setCurrentHp(player.getMaxHp(), true);
				player.setCurrentMp(player.getMaxMp());
				player.broadcastPacket(new Revive(player));
			}
	}

	public static void healPlayers()
	{
		for(L2Player player : getPlayers(players_list1))
		{
			player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp());
			player.setCurrentCp(player.getMaxCp());
		}
		for(L2Player player : getPlayers(players_list2))
		{
			player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp());
			player.setCurrentCp(player.getMaxCp());
		}
	}

	public static void cleanPlayers()
	{
		for(L2Player player : getPlayers(players_list1))
			if(!checkPlayer(player, false))
				removePlayer(player);
		for(L2Player player : getPlayers(players_list2))
			if(!checkPlayer(player, false))
				removePlayer(player);
	}

	public static void checkLive()
	{
		GCSArray<Long> new_live_list1 = new GCSArray<Long>();
		GCSArray<Long> new_live_list2 = new GCSArray<Long>();

		for(Long storeId : live_list1)
		{
			L2Player player = L2ObjectsStorage.getAsPlayer(storeId);
			if(player != null)
				new_live_list1.add(storeId);
		}

		for(Long storeId : live_list2)
		{
			L2Player player = L2ObjectsStorage.getAsPlayer(storeId);
			if(player != null)
				new_live_list2.add(storeId);
		}

		live_list1 = new_live_list1;
		live_list2 = new_live_list2;

		for(L2Player player : getPlayers(live_list1))
			if(player.isInZone(_zone) && !player.isDead() && player.isConnected() && !player.isLogoutStarted())
				player.setTeam(2, true);
			else
				loosePlayer(player);

		for(L2Player player : getPlayers(live_list2))
			if(player.isInZone(_zone) && !player.isDead() && player.isConnected() && !player.isLogoutStarted())
				player.setTeam(1, true);
			else
				loosePlayer(player);

		if(live_list1.size() < 1 || live_list2.size() < 1)
			endBattle();
	}

	public static void removeAura()
	{
		for(L2Player player : getPlayers(live_list1))
			player.setTeam(0, true);
		for(L2Player player : getPlayers(live_list2))
			player.setTeam(0, true);
	}

	public static void clearArena()
	{
		for(L2Object obj : _zone.getObjects())
			if(obj != null)
			{
				L2Player player = obj.getPlayer();
				if(player != null && !live_list1.contains(player.getStoredId()) && !live_list2.contains(player.getStoredId()))
					player.teleToLocation(147451, 46728, -3410);
			}
	}

	public static void OnDie(L2Character self, L2Character killer)
	{
		if(_status > 1 && self != null && self.isPlayer() && self.getTeam() > 0 && (live_list1.contains(self.getStoredId()) || live_list2.contains(self.getStoredId())))
		{
			loosePlayer((L2Player) self);
			checkLive();
		}
	}

	public static Location OnEscape(L2Player player)
	{
		if(_status > 1 && player != null && player.getTeam() > 0 && (live_list1.contains(player.getStoredId()) || live_list2.contains(player.getStoredId())))
		{
			removePlayer(player);
			checkLive();
		}
		return null;
	}

	public static void OnPlayerExit(L2Player player)
	{
		if(player == null || player.getTeam() < 1)
			return;

		// Вышел или вылетел во время регистрации
		if(_status == 0 && _isRegistrationActive && player.getTeam() > 0 && (live_list1.contains(player.getStoredId()) || live_list2.contains(player.getStoredId())))
		{
			removePlayer(player);
			return;
		}

		// Вышел или вылетел во время телепортации
		if(_status == 1 && (live_list1.contains(player.getStoredId()) || live_list2.contains(player.getStoredId())))
		{
			removePlayer(player);

			try
			{
				String var = player.getVar("TvT_backCoords");
				if(var == null || var.equals(""))
					return;
				String[] coords = var.split(" ");
				if(coords.length != 4)
					return;
				player.teleToLocation(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]), Integer.parseInt(coords[2]), Integer.parseInt(coords[3]));
				player.unsetVar("TvT_backCoords");
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}

			return;
		}

		// Вышел или вылетел во время эвента
		OnEscape(player);
	}

	private class ZoneListener extends L2ZoneEnterLeaveListener
	{
		@Override
		public void objectEntered(L2Zone zone, L2Object object)
		{
			if(object == null)
				return;
			L2Player player = object.getPlayer();
			if(_status > 0 && player != null && !live_list1.contains(player.getStoredId()) && !live_list2.contains(player.getStoredId()))
				ThreadPoolManager.getInstance().scheduleGeneral(new TeleportTask((L2Character) object, new Location(147451, 46728, -3410)), 3000);
		}

		@Override
		public void objectLeaved(L2Zone zone, L2Object object)
		{
			if(object == null)
				return;
			L2Player player = object.getPlayer();
			if(_status > 1 && player != null && player.getTeam() > 0 && (live_list1.contains(player.getStoredId()) || live_list2.contains(player.getStoredId())))
			{
				double angle = Util.convertHeadingToDegree(object.getHeading()); // угол в градусах
				double radian = Math.toRadians(angle - 90); // угол в радианах
				int x = (int) (object.getX() + 50 * Math.sin(radian));
				int y = (int) (object.getY() - 50 * Math.cos(radian));
				int z = object.getZ();
				ThreadPoolManager.getInstance().scheduleGeneral(new TeleportTask((L2Character) object, new Location(x, y, z)), 3000);
			}
		}
	}

	public class TeleportTask implements Runnable
	{
		Location loc;
		L2Character target;

		public TeleportTask(L2Character target, Location loc)
		{
			this.target = target;
			this.loc = loc;
			target.startStunning();
		}

		public void run()
		{
			target.stopStunning();
			target.teleToLocation(loc);
		}
	}

	private static void loosePlayer(L2Player player)
	{
		if(player != null)
		{
			live_list1.remove(player.getStoredId());
			live_list2.remove(player.getStoredId());
			player.setTeam(0, true);
			show(new CustomMessage("scripts.events.TvT.YouLose", player), player);
		}
	}

	private static void removePlayer(L2Player player)
	{
		if(player != null)
		{
			live_list1.remove(player.getStoredId());
			live_list2.remove(player.getStoredId());
			players_list1.remove(player.getStoredId());
			players_list2.remove(player.getStoredId());
			player.setTeam(0, true);
		}
	}

	private static GArray<L2Player> getPlayers(GCSArray<Long> list)
	{
		GArray<L2Player> result = new GArray<L2Player>();
		for(Long storeId : list)
		{
			L2Player player = L2ObjectsStorage.getAsPlayer(storeId);
			if(player != null)
				result.add(player);
		}
		return result;
	}
}
LDD вне форума Ответить с цитированием
Непрочитано 29.07.2012, 00:22   #2
Аватар для L2CCCP

По умолчанию Re: Банки на ивентах

Во первых добавить проверку на ивенте персонаж или нет, добавить условие с запретом использования определённых скилов в момент прибывания на ивенте.
L2CCCP вне форума Отправить сообщение для L2CCCP с помощью ICQ Отправить сообщение для L2CCCP с помощью MSN Отправить сообщение для L2CCCP с помощью Skype™ Ответить с цитированием
Непрочитано 29.07.2012, 00:22   #3
Аватар для Visor

По умолчанию Re: Банки на ивентах

Варианта вижу 2 штуки
1) завести в эвент юз итемов и юз скилов - это нужно кроме того что прописать в эвенте что будет происходить, но еще и направить из ядра сюда ход
2) в обработке юза и скила сделать проверку на конкретно этот эвент и отказать - это все ядре, в самом эвенте в таком случае ничего писать не нужно

Я у себя систему масс эвентов таким образом написал, что легко контролировать юз банок и т.д.
__________________
L2Emu Enterprise Server
Visor вне форума Отправить сообщение для Visor с помощью ICQ Отправить сообщение для Visor с помощью Skype™ Ответить с цитированием
Непрочитано 29.07.2012, 02:07   #4
Аватар для L2CCCP

По умолчанию Re: Банки на ивентах

Цитата:
Сообщение от Visor Посмотреть сообщение
Варианта вижу 2 штуки
1) завести в эвент юз итемов и юз скилов - это нужно кроме того что прописать в эвенте что будет происходить, но еще и направить из ядра сюда ход
2) в обработке юза и скила сделать проверку на конкретно этот эвент и отказать - это все ядре, в самом эвенте в таком случае ничего писать не нужно

Я у себя систему масс эвентов таким образом написал, что легко контролировать юз банок и т.д.
а не легче добавить одну проверку на то на ивенте ли или нет для всех ивентов сразу?).
к примеру: В сам ивент в момент телепорта после команды player.teleToLocation(блабла); добавить переменную player.setInEvent(True);

В класс Player добавить обработчик данного параметра, а там уже в креатуре добавить обработчик запрета скилов.

Код:
	boolean zapretnijSkil4eg = false;

	if(getPlayer() != null && getPlayer().setInEvent())
		{ 
			for(String skillId : списька запретных скилов)
		{ 
	if(skill.getId() == Integer.parseInt(skillId)) 
		zapretnijSkil4eg = true; 
	else continue;

	if(zapretnijSkil4eg) 
		{ 
			this.getPlayer().sendMessage(Fuck You); 
			return;
		}
Еврика должно работать. у нас на подобии этого реализовано.
L2CCCP вне форума Отправить сообщение для L2CCCP с помощью ICQ Отправить сообщение для L2CCCP с помощью MSN Отправить сообщение для L2CCCP с помощью Skype™ Ответить с цитированием
Непрочитано 29.07.2012, 02:09   #5
Аватар для Ro_0TT
Супергерой

По умолчанию Re: Банки на ивентах

Цитата:
Сообщение от L2CCCP Посмотреть сообщение
а не легче добавить одну проверку на то на ивенте ли или нет для всех ивентов сразу?).
к примеру: В сам ивент в момент телепорта после команды player.teleToLocation(блабла); добавить переменную player.setInEvent(True);

В класс Player добавить обработчик данного параметра, а там уже в креатуре добавить обработчик запрета скилов.

boolean zapretnijSkil4eg = false;

if(getPlayer() != null && getPlayer().setInEvent())
{
for(String skillId : списька запретных скилов)
{
if(skill.getId() == Integer.parseInt(skillId))
zapretnijSkil4eg = true;
else continue;
}
}
if(zapretnijSkil4eg)
{
this.getPlayer().sendMessage(Fuck You);
return;
}

Еврика должно работать. у нас на подобии этого реализовано.
Потому, что это не правильно. Правильно - добавлять листнеры, подключать нужный скрипт к ним и обрабаывать.
__________________
Ищу работу: Java-разработчик Skype: ro_0tt
Ro_0TT вне форума Отправить сообщение для Ro_0TT с помощью ICQ Отправить сообщение для Ro_0TT с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 29.07.2012, 02:17   #6
Аватар для Visor

Lightbulb Re: Банки на ивентах

Цитата:
Сообщение от L2CCCP Посмотреть сообщение
а не легче добавить одну проверку на то на ивенте ли или нет для всех ивентов сразу?).
Легче конечно, но может человек хочет только для этого ивента)
У меня в энрпрайсе добавлены проверки для всех ивентов на рес, а для итемов уже не помню - можно докинуть еще конфиг в систему масс ивентов - одной больше одной меньше - для конструктора ивентов не особо напряжно.

Добавлено через 5 минут
Цитата:
Сообщение от Ro_0TT Посмотреть сообщение
Потому, что это не правильно. Правильно - добавлять листнеры, подключать нужный скрипт к ним и обрабаывать.
Это так кажется, не всегда стоит идти по пути листенеров - порой проще разделять предметные области.

Вот к примеру - вы же не говорите "чего в базе так много таблиц по сохранению данных чаров, параметров всяческих, а ведь можно их скрутить все в 4 таблицы". Об этом вы просто не знаете, что можно проектировать базы данных иначе.

Такая же фигня с серверами л2 - можно все скрутить еще туже по типизациям и абстракциям, а не какие-то листенеры тулить. Но вы пока не представляете как это делать. Поэтому не нужно критиковать других, если вы на 100% не уверены что это наиболее оптимальное решение.
__________________
L2Emu Enterprise Server

Последний раз редактировалось Visor; 29.07.2012 в 02:25. Причина: Добавлено сообщение
Visor вне форума Отправить сообщение для Visor с помощью ICQ Отправить сообщение для Visor с помощью Skype™ Ответить с цитированием
Непрочитано 29.07.2012, 02:28   #7
Аватар для Ro_0TT
Супергерой

По умолчанию Re: Банки на ивентах

Цитата:
Сообщение от Visor Посмотреть сообщение
Это так кажется, не всегда стоит идти по пути листенеров - порой проще разделять предметные области.

Вот к примеру - вы же не говорите "чего в базе так много таблиц по сохранению данных чаров, параметров всяческих, а ведь можно их скрутить все в 4 таблицы". Об этом вы просто не знаете, что можно проектировать базы данных иначе.

Такая же фигня с серверами л2 - можно все скрутить еще туже по типизациям и абстракциям, а не какие-то листенеры тулить. Но вы пока не представляете как это делать. Поэтому не нужно критиковать других, если вы на 100% не уверены что это наиболее оптимальное решение.
Возможно и правы, просто я привык работать и учится, по прицепу "Разделяй и властвуй", поэтому считаю очень не красивым использовать проверку в месте, где она будет нужна очень редко.
__________________
Ищу работу: Java-разработчик Skype: ro_0tt
Ro_0TT вне форума Отправить сообщение для Ro_0TT с помощью ICQ Отправить сообщение для Ro_0TT с помощью Skype™ Ответить с цитированием
Непрочитано 29.07.2012, 12:58   #8
Аватар для Visor

По умолчанию Re: Банки на ивентах

ТС предложили несколько вариантов - пусть делает любой - какой сможет)
__________________
L2Emu Enterprise Server
Visor вне форума Отправить сообщение для Visor с помощью ICQ Отправить сообщение для Visor с помощью Skype™ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Банки MP ahmet94 Работа со скриптами 2 14.04.2012 01:17
хп и мп банки JFS Lineage II 7 26.03.2012 15:42
СР и МР банки. leone Работа со скриптами 3 04.05.2011 14:37
Банки KarameJIka Lineage II 6 30.04.2010 07:19


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 18:31. Часовой пояс GMT +3.

Вверх