Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
[share] скилл Trade Zone Teleport
#1
Все думаю знают о оффшорных зонах в сервере на базе феникса, расположенных в Giran Harbor и Parnasus. Достаточно удобные места для того чтобы сосредоточить всю торговлю в одном месте.

По умолчанию туда можно попасть, выбрав нужный пункт для перемещения у любого ГК в городах.
Так же можно создать 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()
{}
}
Доступ к скиллу игрокам можно сделать 2 способами:

1. Добавить всем в изучаемые скиллы.
2. Добавлять скилл игрокам автоматически при их входе в игру.

Про первый вариант объяснять что и как не буду - и так все просто и понятно.
Ну а второй делается тоже достаточно просто: в классе L2Player находим метод restoreSkills() и добавляем где нибудь в конец этого метода строчку
PHP код:
<?php 
super
.addSkill(SkillTable.getInstance().getInfo(15001, 1));

Как добавлять в клиент новые скиллы обяснять не буду - опять же это требует всего лишь базовые познания - разберетесь. Тем более что можно и не добавлять, если вам неважно что там в клиенте будет написано в скилле, то в описании скилла можно просто сделать подмену ид при помощи параметра displayId, чтобы клиент показывал этот скилл другим, существующим в нем.

З.Ы. Ну а те кто разбирается, могут так же зарегать данный скилл на панельку скиллов при создании новых персов, для того чтобы новички сразу видели, что у них есть такой вот удобный способ перемещаться в торговую зону.
Ответ
#2
Интересная вещь, задам такой вопрос: как я вижу проверки на боевой режим нет, следовательно если нас бьют, то можно улететь в торговую зону, и зачем введен запрет на полет в мирной зоне? В том же флоране хотелось бы улететь в торговую зону закупиться, а нельзя...
Ответ
#3
Zubastic Написал:Интересная вещь, задам такой вопрос: как я вижу проверки на боевой режим нет, следовательно если нас бьют, то можно улететь в торговую зону, и зачем введен запрет на полет в мирной зоне? В том же флоране хотелось бы улететь в торговую зону закупиться, а нельзя...

Код:
if (!player.isInPeaceZone() || player.isInZone(ZoneType.OlympiadStadia) || player.isInZone(ZoneType.no_escape))

В данной проверке говорится если персонаж НЕ в мирной зоне, на олимпе или в зоне no_escape like Jail. (Читайте код внимательней перед player стоит "!")

Как персонаж может драться в мирной зоне?
Не вижу смысла пихать множество проверок имхо то что есть уже более чем достаточно.

За пост + думаю будет полезна и удобна в использовании для игроков.
Ответ
#4
L2CCCP;166553 Написал:Как персонаж может драться в мирной зоне?
На вскидку, гремлины - мирная зона. Отлупить нпц можно так же в мирной зоне Wink.
Ответ
#5
в пвп смыться от противника при помощи этого скилла нельзя? нельзя. так в чем проблема то тогда?

ну а если кого свербит в одном месте возможность смыться от моба в мирной зоне при помощи этого скилла - ну пусть добавит еще и проверку на то что игрок не в состоянии боя - делов то.
Ответ
#6
n0nam3 Написал:На вскидку, гремлины - мирная зона. Отлупить нпц можно так же в мирной зоне Wink.

Имел в виду с персонажем Smile

А так да махать руками можно везде :redlol:

Проверка на состаяния в бою. (кому нада)
Код:
player.isInCombat()
Ответ
#7
Неплохая задумка.Но лучше тупо засунуть в комьюнити.
Smile
Ответ
#8
1. это лишь пример того, что при помощи хэндлеров для скиллов можно делать все что захочется - реализовать любое поведение какого нибудь нестандартного скилла, не добавляя для этого в ядро новые типы и эффекты скиллов.

2. можно и в комюнити, но как это не смешно - многие даже там это могут не увидеть - контингент то играющий разный...
Ответ
#9
Молодец)) Я тебе высказал своё мнение)
Smile
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  [Share] PTS Vanganth - Classic Interlude P110 zoumhs 0 1,537 05-13-2023, 05:04 PM
Последний пост: zoumhs
  Share Gracia Final Off Euro Deazer 424 256,262 07-10-2022, 07:20 PM
Последний пост: JIecTap
  Удаляется скилл после рестарта перса ntking 2 1,632 09-10-2018, 04:47 PM
Последний пост: ntking
  [share] lin][info 2.3 [Lindvior] Gaikotsu 0 1,828 09-22-2017, 08:40 PM
Последний пост: Gaikotsu
  Перестал работать скилл "Печать правителя" ntking 6 2,634 05-23-2017, 10:51 PM
Последний пост: Zubastic
  [share] Родильная Комната (Nursery) Gaikotsu 6 2,968 03-23-2017, 11:39 AM
Последний пост: Gaikotsu
  NPC Agument Trade Skill M1xF1ght 0 987 11-17-2015, 05:57 PM
Последний пост: M1xF1ght
  [Share] Silentium Interlude (Last source) Dеmon 77 20,286 12-10-2014, 01:01 AM
Последний пост: kingzor
  [Хелп] Одеть 5 предметов - получить скилл Empatic 4 1,469 07-05-2014, 03:39 PM
Последний пост: Empatic
  [EPIC SHARE] BBS Advanced Buffer OneThunder 9 3,614 04-28-2014, 11:35 AM
Последний пост: OneThunder

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


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