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

Lineage II
Дискуссии на тему создания, настройки и обслуживания серверов Lineage 2. При поддержке: Премиум услуги по рекламе

Описание темы:при помощи SkillHandlers для феникса

Ответ
Опции темы
Непрочитано 18.02.2012, 18:16   #1
Аватар для Gaikotsu
Герой

Автор темы (Топик Стартер) [share] скилл Trade Zone Teleport

Все думаю знают о оффшорных зонах в сервере на базе феникса, расположенных в 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 код:
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 ISkillHandlerScriptFile
{
    private static final 
int[] _skillIds = { 15001 };
    
    private 
Location _loc = new Location(47890186860, -3480);
    private 
long _ref ReflectionTable.GH;
    
    private class 
TeleportPlayer implements Runnable
    
{
        
L2Player _player;
        
Location _loc;
        
long _ref;
        
        public 
TeleportPlayer(L2Player playerLocation loclong ref)
        {
            
_player player;
            
_loc loc;
            
_ref ref;
        }
        
        @
Override
        
public void run()
        {
            if (
_player != null)
                
_player.teleToLocation(_loc_ref);
        }
        
    }

    @
Override
    
public boolean checkCondition(L2Skill skillL2Character casterL2Character targetboolean forceUse)
    {
        if (!
target.isPlayer())
            return 
false;
        
        
L2Player player = (L2Playertarget;
        
        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 skillL2Character casterGArray<L2Charactertargets)
    {
        for (
L2Character target targets)
        {
            if (!
target.isPlayer())
                continue;
            
            
L2Player player = (L2Playertarget;
            
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 effectL2Character casterL2Character target)
    {
        return 
false;
    }

    @
Override
    
public void onStart(L2Effect effectL2Character casterL2Character target)
    {}

    @
Override
    
public void onExit(L2Effect effectL2Character casterL2Character target)
    {}

    @
Override
    
public boolean onActionTime(L2Effect effectL2Character casterL2Character 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 код:
super.addSkill(SkillTable.getInstance().getInfo(150011)); 
Как добавлять в клиент новые скиллы обяснять не буду - опять же это требует всего лишь базовые познания - разберетесь. Тем более что можно и не добавлять, если вам неважно что там в клиенте будет написано в скилле, то в описании скилла можно просто сделать подмену ид при помощи параметра displayId, чтобы клиент показывал этот скилл другим, существующим в нем.

З.Ы. Ну а те кто разбирается, могут так же зарегать данный скилл на панельку скиллов при создании новых персов, для того чтобы новички сразу видели, что у них есть такой вот удобный способ перемещаться в торговую зону.
Gaikotsu вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 21.02.2012, 06:54   #2
Аватар для Zubastic
ZG troll squad

По умолчанию Re: [share] скилл Trade Zone Teleport

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

По умолчанию Re: [share] скилл Trade Zone Teleport

Цитата:
Сообщение от Zubastic Посмотреть сообщение
Интересная вещь, задам такой вопрос: как я вижу проверки на боевой режим нет, следовательно если нас бьют, то можно улететь в торговую зону, и зачем введен запрет на полет в мирной зоне? В том же флоране хотелось бы улететь в торговую зону закупиться, а нельзя...
Код:
if (!player.isInPeaceZone() || player.isInZone(ZoneType.OlympiadStadia) || player.isInZone(ZoneType.no_escape))
В данной проверке говорится если персонаж НЕ в мирной зоне, на олимпе или в зоне no_escape like Jail. (Читайте код внимательней перед player стоит "!")

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

За пост + думаю будет полезна и удобна в использовании для игроков.
L2CCCP вне форума Отправить сообщение для L2CCCP с помощью ICQ Отправить сообщение для L2CCCP с помощью MSN Отправить сообщение для L2CCCP с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 22.02.2012, 07:54   #4
Аватар для Dizband
ЛК под любые игры

По умолчанию Re: [share] скилл Trade Zone Teleport

Цитата:
Сообщение от L2CCCP Посмотреть сообщение
Как персонаж может драться в мирной зоне?
На вскидку, гремлины - мирная зона. Отлупить нпц можно так же в мирной зоне .
Dizband вне форума Ответить с цитированием
Непрочитано 22.02.2012, 20:44   #5
Аватар для Gaikotsu
Герой

Автор темы (Топик Стартер) Re: [share] скилл Trade Zone Teleport

в пвп смыться от противника при помощи этого скилла нельзя? нельзя. так в чем проблема то тогда?

ну а если кого свербит в одном месте возможность смыться от моба в мирной зоне при помощи этого скилла - ну пусть добавит еще и проверку на то что игрок не в состоянии боя - делов то.
Gaikotsu вне форума Ответить с цитированием
Непрочитано 23.02.2012, 09:23   #6
Аватар для L2CCCP

По умолчанию Re: [share] скилл Trade Zone Teleport

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

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

Проверка на состаяния в бою. (кому нада)
Код:
player.isInCombat()
L2CCCP вне форума Отправить сообщение для L2CCCP с помощью ICQ Отправить сообщение для L2CCCP с помощью MSN Отправить сообщение для L2CCCP с помощью Skype™ Ответить с цитированием
Непрочитано 23.02.2012, 23:34   #7

По умолчанию Re: [share] скилл Trade Zone Teleport

Неплохая задумка.Но лучше тупо засунуть в комьюнити.
__________________
Mangol вне форума Отправить сообщение для Mangol с помощью ICQ Ответить с цитированием
Непрочитано 23.02.2012, 23:58   #8
Аватар для Gaikotsu
Герой

Автор темы (Топик Стартер) Re: [share] скилл Trade Zone Teleport

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

2. можно и в комюнити, но как это не смешно - многие даже там это могут не увидеть - контингент то играющий разный...
Gaikotsu вне форума Ответить с цитированием
Непрочитано 24.02.2012, 00:02   #9

По умолчанию Re: [share] скилл Trade Zone Teleport

Молодец)) Я тебе высказал своё мнение)
__________________
Mangol вне форума Отправить сообщение для Mangol с помощью ICQ Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Teleport lolpwnz Lineage II 6 29.11.2011 18:02
как удалить Teleport guy zlimoon World of WarCraft 3 18.08.2010 23:32
trade zone VNDenisov Lineage II 1 26.07.2009 15:06
Teleport dodok Lineage II 6 02.07.2008 22:02


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

Вверх