02-18-2012, 06:16 PM
Все думаю знают о оффшорных зонах в сервере на базе феникса, расположенных в Giran Harbor и Parnasus. Достаточно удобные места для того чтобы сосредоточить всю торговлю в одном месте.
По умолчанию туда можно попасть, выбрав нужный пункт для перемещения у любого ГК в городах.
Так же можно создать voiced-команду, перемещающую туда и обратно.
Но есть еще более user-friendly метод - почему бы не добавить игрокам скилл, который это будет делать?
Ниже я покажу как это сделать при помощи хэндлеров для скиллов, реализацию которых я выкладывал под новый год - http://forum.zone-game.info/showthread.php?p=154354 .
Про сами хэндлеры все написано в теме, ссылку на которую я привел выше.
А вот сам скилл для перемещения туда и обратно:
и хэндлер для него:
Доступ к скиллу игрокам можно сделать 2 способами:По умолчанию туда можно попасть, выбрав нужный пункт для перемещения у любого ГК в городах.
Так же можно создать voiced-команду, перемещающую туда и обратно.
Но есть еще более user-friendly метод - почему бы не добавить игрокам скилл, который это будет делать?
Ниже я покажу как это сделать при помощи хэндлеров для скиллов, реализацию которых я выкладывал под новый год - http://forum.zone-game.info/showthread.php?p=154354 .
Про сами хэндлеры все написано в теме, ссылку на которую я привел выше.
А вот сам скилл для перемещения туда и обратно:
Код:
<skill id="15001" levels="1" name="Teleport to Trade Zone (Giran Harbor)" >
<set name="target" val="TARGET_SELF" />
<set name="skillType" val="HANDLER" />
<set name="operateType" val="OP_ACTIVE" />
<set name="isReuseDelayPermanent" val="true" />
<for />
</skill>
Код:
INSERT INTO `skills` (`id`, `level`, `learn`, `name`, `icon`, `description`, `operate_type`, `is_magic`, `mp_consume`, `hp_consume`, `cast_range`, `hit_time`, `power`, `effect`, `enchant`, `reuse`) VALUES (15001, 1, 0, 'Teleport to Trade Zone (Giran Harbor)', 'icon.skill0000', 'none', 5, 0, 0, 0, -2, 1000, 0, 0, '', 10000);
PHP код:
<?php
package handlers.skills;
import l2p.Config;
import l2p.common.ThreadPoolManager;
import l2p.extensions.scripts.ScriptFile;
import l2p.gameserver.cache.Msg;
import l2p.gameserver.handler.ISkillHandler;
import l2p.gameserver.handler.SkillHandler;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.L2Effect;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.L2Skill;
import l2p.gameserver.model.L2Zone.ZoneType;
import l2p.gameserver.tables.ReflectionTable;
import l2p.util.GArray;
import l2p.util.Location;
/**
* Умение для перемещения в торговую зону порта Гирана и обратно
*
* @author Gaikotsu
*/
public class TradeZoneTeleport implements ISkillHandler, ScriptFile
{
private static final int[] _skillIds = { 15001 };
private Location _loc = new Location(47890, 186860, -3480);
private long _ref = ReflectionTable.GH;
private class TeleportPlayer implements Runnable
{
L2Player _player;
Location _loc;
long _ref;
public TeleportPlayer(L2Player player, Location loc, long ref)
{
_player = player;
_loc = loc;
_ref = ref;
}
@Override
public void run()
{
if (_player != null)
_player.teleToLocation(_loc, _ref);
}
}
@Override
public boolean checkCondition(L2Skill skill, L2Character caster, L2Character target, boolean forceUse)
{
if (!target.isPlayer())
return false;
L2Player player = (L2Player) target;
if (!Config.SERVICES_GIRAN_HARBOR_ENABLED)
{
player.sendMessage("Торговая зона в порту Гирана выключена, команду нельзя использовать.");
return false;
}
if (!player.isInPeaceZone() || player.isInZone(ZoneType.OlympiadStadia) || player.isInZone(ZoneType.no_escape))
{
player.sendMessage("Вы не можете использовать эту команду здесь.");
return false;
}
if (player.getReflection().getId() != ReflectionTable.DEFAULT && player.getReflection().getId() != _ref)
{
player.sendMessage("Эту команду можно использовать только в базовом измерении и в измерении торговой зоны порта Гирана.");
return false;
}
return true;
}
@Override
public boolean isUseAdditionalCheck()
{
return true;
}
@Override
public boolean isOffensive()
{
return false;
}
@Override
public void useSkill(L2Skill skill, L2Character caster, GArray<L2Character> targets)
{
for (L2Character target : targets)
{
if (!target.isPlayer())
continue;
L2Player player = (L2Player) target;
String coords = player.getVar("offshoreBackCoords");
if (player.getPet() != null && player.getPet().isSiegeWeapon())
player.getPet().unSummon();
if (player.isInZone(ZoneType.offshore))
{
if (coords != null && !coords.equals(""))
{
player.unsetVar("offshoreBackCoords");
ThreadPoolManager.getInstance().scheduleGeneral(new TeleportPlayer(player, new Location(coords), ReflectionTable.DEFAULT), 1000);
}
else
player.sendPacket(Msg.NOTHING_HAPPENED);
}
else
{
player.setVar("offshoreBackCoords", player.getLoc().toXYZString());
ThreadPoolManager.getInstance().scheduleGeneral(new TeleportPlayer(player, _loc, _ref), 1000);
}
}
}
@Override
public boolean checkCondition(L2Effect effect, L2Character caster, L2Character target)
{
return false;
}
@Override
public void onStart(L2Effect effect, L2Character caster, L2Character target)
{}
@Override
public void onExit(L2Effect effect, L2Character caster, L2Character target)
{}
@Override
public boolean onActionTime(L2Effect effect, L2Character caster, L2Character target)
{
return false;
}
@Override
public int[] getSkillIds()
{
return _skillIds;
}
@Override
public void onLoad()
{
SkillHandler.getInstance().registerSkillHandler(this);
}
@Override
public void onReload()
{}
@Override
public void onShutdown()
{}
}
1. Добавить всем в изучаемые скиллы.
2. Добавлять скилл игрокам автоматически при их входе в игру.
Про первый вариант объяснять что и как не буду - и так все просто и понятно.
Ну а второй делается тоже достаточно просто: в классе L2Player находим метод restoreSkills() и добавляем где нибудь в конец этого метода строчку
PHP код:
<?php
super.addSkill(SkillTable.getInstance().getInfo(15001, 1));