Перейти к содержанию
Авторизация  
Вова_Елохов

Помогите пож. с телепортом...(как сделать чтоб персонаж мог задать точку тп)

Рекомендуемые сообщения

Всем привет такая ситуация:

 

Хочу вывести нпс в итем (то есть чтоб персонаж мог нажав на итем вызвать нпс)

И чтоб другие персонажи могли делать телепорт в эту точку примерно как на "i-o"

подскажите пожалуйста с какой стороны начинать рыть...

Больше всего интересует как привязать точку телепорта к вызваному нпс...

 

Если кто поможет буду очень признателен!

 

сборка Lucera

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет такая ситуация:

 

Хочу вывести нпс в итем (то есть чтоб персонаж мог нажав на итем вызвать нпс)

И чтоб другие персонажи могли делать телепорт в эту точку примерно как на "i-o"

подскажите пожалуйста с какой стороны начинать рыть...

Больше всего интересует как привязать точку телепорта к вызваному нпс...

 

Если кто поможет буду очень признателен!

 

сборка Lucera

Вызвать нпц то у гнома есть такой скил

А вот на него тп вопрос 1. Кто имеет право на него телепортироватся?

Изменено пользователем terege

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Права будут иметь члены клана либо фракции.

Но для самое сложное это сделать так чтоб сама точка телепорта была закреплена не за месностью а за самим нпс.

с самим призывом нпс все просто, а вот как привязать тп не могу придумать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Права будут иметь члены клана либо фракции.

Но для самое сложное это сделать так чтоб сама точка телепорта была закреплена не за месностью а за самим нпс.

с самим призывом нпс все просто, а вот как привязать тп не могу придумать...

подсказка рой  там де при осаде вызываеш флаг ну лагерь де после смерти ты к неему попадаешь

 

 

 

 

 

 

 

и уточняю раз такое то должен ток лидер вызывать флаг а то будет  хаос  в распознание куда  точна

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В осаде давно роюсь но пока без результатов думал может есть вариант по проще (типо скрипта в квестах) чтоб не лезть в ядро 

 

а про вызов хочу сделать чтоб вызвать мог любой а список куда тп отображался в городе у телепорта (тоесть 5 человек вызвало и появилось 5 тп в списке)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В осаде давно роюсь но пока без результатов думал может есть вариант по проще (типо скрипта в квестах) чтоб не лезть в ядро 

 

а про вызов хочу сделать чтоб вызвать мог любой а список куда тп отображался в городе у телепорта (тоесть 5 человек вызвало и появилось 5 тп в списке)

охо  есть возможность нагрузки на сервер  ну могу я это реализовать но всеравно требуется  ядро

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спавниться нпц в точку

координаты записываются в массив

и из массива достаем их и делаем тп

как вариант.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну я так понимаю нужен скрипт который будет отлавливать координаты определенного нпс и вставлять в гк... может кто посоветует от куда такое добро выдрать из какого квеста?))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а и забыл сказать при убийстве нпс тп у гк должен пропадать, а в массив  они же на постаянку  пропишутся

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спавниться нпц в точку

координаты записываются в массив

и из массива достаем их и делаем тп

как вариант.

вариант не актуален есть проше

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет такая ситуация:

 

Хочу вывести нпс в итем (то есть чтоб персонаж мог нажав на итем вызвать нпс)

И чтоб другие персонажи могли делать телепорт в эту точку примерно как на "i-o"

подскажите пожалуйста с какой стороны начинать рыть...

Больше всего интересует как привязать точку телепорта к вызваному нпс...

 

Если кто поможет буду очень признателен!

 

сборка Lucera

1 ) создать новый инстан нпц

2 ) переопределить методы :

      onSpawn() => спавн нпц тут получаем L2Spawn и отправляем в гк  (динамическая ссылка  L2Spawn  = координаты + жив ли нпц ну или находится в мире ) 

      doDie(L2Character killer) => смерть нпц уведомить гк

     deleteMe() => можно и от сюда уведомить гк что нпц больше нет. (doDie ненужен)

​Способов уйма включая листнеры на события если они конечно есть в сборке

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 ) создать новый инстан нпц

2 ) переопределить методы :

      onSpawn() => спавн нпц тут получаем L2Spawn и отправляем в гк  (динамическая ссылка  L2Spawn  = координаты + жив ли нпц ну или находится в мире ) 

      doDie(L2Character killer) => смерть нпц уведомить гк

     deleteMe() => можно и от сюда уведомить гк что нпц больше нет. (doDie ненужен)

​Способов уйма включая листнеры на события если они конечно есть в сборке

Для создания инстанс нпс нужны координаты (или можно их не вписывать?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для создания инстанс нпс нужны координаты (или можно их не вписывать?)

не правильно ты понял про инстант нпц это вид его клас 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для примера можно посмотреть реализацию клан гейта, правда я не помню - была ли уже эта функция в интерлюде.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понял что нужно создать новый класс в ядре прикрепить его к нпс и геткиперу 

если не трудно расскажите пожалста пошагово как первокласнику что мне и как нужно делать

дело в том что только недавно начал вникать в яву поменять чтото в готовых классах и скриптах могу, а вот свое сделать пока не хватает мозгов(

И еще вопрос чтоб нпс слушался моего класса он задается в БД как Type? 

 

И простите за тупые вопросы  :fool:  просто для новичка это выглядит как китайский алфавит

Изменено пользователем Вова_Елохов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понял что нужно создать новый класс в ядре прикрепить его к нпс и геткиперу 

если не трудно расскажите пожалста пошагово как первокласнику что мне и как нужно делать

дело в том что только недавно начал вникать в яву поменять чтото в готовых классах и скриптах могу, а вот свое сделать пока не хватает мозгов(

И еще вопрос чтоб нпс слушался моего класса он задается в БД как Type? 

 

И простите за тупые вопросы  :fool:  просто для новичка это выглядит как китайский алфавит

вы на верном пути . так как у вас наверно несколько-много объектов ГК  то в ГК делайте статик список тогда список будет один на всех

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Флаг Фракции.

 

ИЗ итема вылазиет нпц, в гк появляются кнопка для тп. к флагу, если флаг исчез или умер, тп проподает.  Тут сделано через фракцию, делайте проверку через клан.

 

 

package custom.faction;

import custom.CustomConfig;
import custom.faction.npc.L2FactionFlag;
import net.sf.l2j.gameserver.idfactory.IdFactory;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
import net.sf.l2j.gameserver.templates.StatsSet;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

public class FactionFlagManager {
    private static Logger log = Logger.getLogger(FactionFlagManager.class.getName());
    private Map<Integer, List<L2FactionFlag>> flags;

    public FactionFlagManager() {

        flags = new HashMap<>();
        flags.put(0, new ArrayList<L2FactionFlag>());
        flags.put(1, new ArrayList<L2FactionFlag>());

        // TODO: Fetch from DB?
        // ...
    }

    public void addFlag(L2FactionFlag flag) {
        flags.get(flag.getFactionId()).add(flag);
    }

    public  void removeFlag(L2FactionFlag flag) {
        if (!flags.containsKey(flag.getFactionId()))
            return;
        flags.get(flag.getFactionId()).remove(flag);
    }

    public List<L2FactionFlag> getFlags(int factionId) {

        return flags.get(factionId);
    }

    public boolean isPlayerAlreadyOwner(L2PcInstance player) {
        for (L2FactionFlag flag : getFlags(player.getFactionId())) {
            if (flag.getOwner() == player) {
                return true;
            }
        }
        return false;
    }

    public static FactionFlagManager getInstance()
    {
        return SingletonHolder._instance;
    }

    private static class SingletonHolder
    {
        protected static final FactionFlagManager _instance = new FactionFlagManager();
    }
}

 

 

package custom.faction.handlers;

import custom.CustomConfig;
import custom.faction.FactionFlagManager;
import custom.faction.FactionSystem;
import custom.faction.npc.L2FactionFlag;
import net.sf.l2j.gameserver.custom.events.tvt.TvTEvent;
import net.sf.l2j.gameserver.datatables.NpcTable;
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.idfactory.IdFactory;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.model.actor.L2Playable;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.model.zone.ZoneId;
import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
import net.sf.l2j.gameserver.network.serverpackets.MagicSkillLaunched;
import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
import net.sf.l2j.gameserver.network.serverpackets.TitleUpdate;
import net.sf.l2j.gameserver.templates.StatsSet;
import net.sf.l2j.gameserver.util.Broadcast;

import java.util.List;


public class FlagSpawnItem implements IItemHandler
{
    @@override
    public void useItem(L2Playable playable, ItemInstance item, boolean forceUse)
    {
        if (!(playable instanceof L2PcInstance))
            return;

        final L2PcInstance activeChar = (L2PcInstance) playable;
        final int itemId = item.getItemId();
        
        if (activeChar.getLevel() < CustomConfig.FLAGS_PLAYER_LVL) {
            activeChar.sendMessage("Флаг доступен игроку с 76 уровня и выше.");
            return;
        }
        
        
        if (activeChar == null || activeChar.isOutlaw()) {
            activeChar.sendMessage("Чтобы поставить флаг, вы должны принять чью-либо сторону.");
            return;
        }
        
        if (TvTEvent.isPlayerParticipant(activeChar.getObjectId())) {
            activeChar.sendMessage("Вы не можете поставить флаг, будучи участником FvF евента.");
            return;
        }

        if (activeChar.isInsideZone(ZoneId.PEACE)) {
            activeChar.sendMessage("Вы не можете поставить флаг, находясь в мирной зоне.");
            return;
        }
        
        if (activeChar.isInsideZone(ZoneId.DANGER)) {
            activeChar.sendMessage("Вы не можете поставить флаг, находясь в Dungeon зоне.");
            return;
        }
        
        if (activeChar.isInOlympiadMode()) {
            activeChar.sendMessage("Вы не можете поставить флаг, находясь на олимпиаде.");
            return;
        }
            
                
        List<L2FactionFlag> flags = FactionFlagManager.getInstance().getFlags(activeChar.getFactionId());
        if (flags != null && flags.size() >= CustomConfig.FLAGS_MAX_COUNT) {
            activeChar.sendMessage("Количество одновременно поставленных флагов превышает максимум.");
            return;
        }

        if (FactionFlagManager.getInstance().isPlayerAlreadyOwner(activeChar)) {
            activeChar.sendMessage("Ваш флаг в данный момент поставлен.");
            return;
        }

        if (!activeChar.getKnownList().getKnownTypeInRadius(L2FactionFlag.class, CustomConfig.FLAGS_SPAWN_RANGE).isEmpty()) {
            activeChar.sendMessage("Где-то поблизости уже поставлен флаг вашей фракции.");
            return;
        }

        final StatsSet npcDat = new StatsSet();
//
//        npcDat.set("id", 35062);
//        npcDat.set("type", "");
//
//        npcDat.set("name", "Respawn flag");
//        npcDat.set("title", activeChar.getFaction().getName());
//
//        npcDat.set("hp", CustomConfig.FLAGS_HP);
//        npcDat.set("mp", 0);
//
//        npcDat.set("radius", 10);
//        npcDat.set("height", 80);
//
//        npcDat.set("pAtk", 0);
//        npcDat.set("mAtk", 0);
//        npcDat.set("pDef", CustomConfig.FLAGS_PDEF);
//        npcDat.set("mDef", CustomConfig.FLAGS_MDEF);
//
//        npcDat.set("runSpd", 0);
//

        final L2FactionFlag flag = new L2FactionFlag(activeChar, IdFactory.getInstance().getNextId(), NpcTable.getInstance().getTemplate(activeChar.getFactionId() == 0 ? 50000 : 50001));
        //System.out.println(flag.getTemplate().getTitle() + " A " + flag.getTitle());
        flag.setCurrentHp(flag.getMaxHp());
        flag.setHeading(activeChar.getHeading());
        flag.spawnMe(activeChar.getX(), activeChar.getY(), activeChar.getZ() + 50);
        flag.setFaction(activeChar.getFaction());
//        flag.setTitle("[" + activeChar.getFaction().getName() + "]");
//
//        flag.broadcastStatusUpdate();
//        flag.broadcastPacket(new TitleUpdate(flag));

        activeChar.setTarget(activeChar);
        Broadcast.toSelfAndKnownPlayers(activeChar, new MagicSkillUse(activeChar, 2046, 1, 1000, 0));
        activeChar.sendPacket(new MagicSkillLaunched(activeChar, 2046, 1));
        activeChar.setIsCastingNow(false);
        FactionFlagManager.getInstance().addFlag(flag);

        activeChar.getFaction().flagMessage("Игрок " + activeChar.getName() + " поставил флаг фракции, теперь союзники могут телепортироваться к нему.");

        activeChar.destroyItem("SpawnFlag", item, 1, activeChar, true);
//        InventoryUpdate iu = new InventoryUpdate();
//        iu.addRemovedItem(item);
//        activeChar.sendPacket(iu);
    }
}

Думаю разберетесь.

 

package custom.faction.npc;

import custom.CustomConfig;
import custom.faction.FactionAvanpostManager;
import custom.faction.FactionFlagManager;
import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.gameserver.ai.CtrlIntention;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.actor.L2Character;
import net.sf.l2j.gameserver.model.actor.L2Npc;
import net.sf.l2j.gameserver.model.actor.instance.L2FactTeleporterInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2TpFlagInstance;
import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
import net.sf.l2j.gameserver.model.entity.FactionMaps;
import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
import net.sf.l2j.gameserver.network.serverpackets.MoveToPawn;
import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;

public class L2FactionFlag extends L2Npc
{
    private final L2PcInstance _player;

    public L2FactionFlag(L2PcInstance player, int objectId, NpcTemplate template)
    {
        super(objectId, template);

        _player = player;
        
        setFaction(_player.getFaction());
        ThreadPoolManager.getInstance().scheduleGeneral(new UnspawnTask(this), CustomConfig.FLAGS_LIFE_TIME * 60 * 1000);
    }

    @@override
    public boolean isAttackable()
    {
        return true;
    }

    @@override
    public boolean isAutoAttackable(L2Character attacker)
    {
        return isEnemy(attacker);
    }

    @@override
    public boolean doDie(L2Character killer)
    {
        if (!super.doDie(killer))
            return false;
        FactionFlagManager.getInstance().removeFlag(this);
        return true;
    }

    @@override
    public void onForcedAttack(L2PcInstance player)
    {
        onAction(player);
    }

    @@override
    public void onAction(L2PcInstance player)
    {
        if (player.getTarget() != this)
            player.setTarget(this);
        else
        {
            if (isAutoAttackable(player) && Math.abs(player.getZ() - getZ()) < 100)
                player.getAI().setIntention(CtrlIntention.ATTACK, this);
            else
            {
                player.sendPacket(new MoveToPawn(player, this, L2Npc.INTERACTION_DISTANCE));
                player.sendPacket(ActionFailed.STATIC_PACKET);
            }
        }
    }

    @@override
    public void reduceCurrentHp(double damage, L2Character attacker, L2Skill skill)
    {
        super.reduceCurrentHp(damage, attacker, skill);
    }

    private class UnspawnTask implements Runnable
    {
        private final L2FactionFlag flag;

        public UnspawnTask(L2FactionFlag flag)
        {
            this.flag = flag;
        }

        @@override
        public void run()
        {
            flag.deleteMe();
        }
    }

    @@override
    public void deleteMe()
    {
        FactionFlagManager.getInstance().removeFlag(this);
        super.deleteMe();
    }

    public L2PcInstance getOwner() {
        return _player;
    }
    

    @@override
    public void showChatWindow(L2PcInstance player)
    {

        StringBuilder timeFlags = new StringBuilder();
        NpcHtmlMessage html = new NpcHtmlMessage(1);

        html.replace("%timeFlags%", timeFlags.toString());

        player.sendPacket(html);
    }
}

Изменено пользователем P1ckw1ck
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Флаг Фракции.

 

ИЗ итема вылазиет нпц, в гк появляются кнопка для тп. к флагу, если флаг исчез или умер, тп проподает.  Тут сделано через фракцию, делайте проверку через клан.

 

 

Думаю разберетесь.

Огромное спасибо!!! 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В осаде давно роюсь но пока без результатов думал может есть вариант по проще (типо скрипта в квестах) чтоб не лезть в ядро

 

а про вызов хочу сделать чтоб вызвать мог любой а список куда тп отображался в городе у телепорта (тоесть 5 человек вызвало и появилось 5 тп в списке)

сделай по принципу саммона варка/саммонеров, призываешь нпц - нпц при призыве кастует скилл на саммон

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...