Skip to content
La2Base
Home
DownloadsWikiForumFAQ
Search
ruen
Sign up Login
HomeFilesWikiLogin
  • Home
  • Downloads
  • Wiki
  • FAQ
  • Contact Us
  • About
  • Rules
  • Privacy
  • Terms of Service

© 2026 la2base.com · All rights reserved

ruen
Forum/Форум для новичков[JAVA]/Помогите с реализацией...
Search

Помогите с реализацией...

14 replies284 viewsCurrently viewing: 1
filmotechnic
filmotechnic

User

Бывалый

Posts: 140

На форуме с: 01/01/2008

Репутация: +66

Рейтинг: 0

· 01/10/2010, 09:25 PM

Уважаемые форумчане!!!

У меня возникла следующая задача : создать итем при даблклике по которому рядом появляется НПЦ , который исчезает через 3 минуты (итем остается).


Мои соображения: можно реализовать как на Java так и через квестовый движек (Pyton).

Проблема: на Pytone не знаю как зарегистрировать itemhandler, а на JAVA не знаю как проспавнить НПЦ с таймером. Вот и застрял... как говориться и ни туда и ни сюда
перерыл кучу примеров но ничего подходящего не нашел....

Помогите кто может!!! Буду рад любым ответам по существу. (предпочтительно JAVA)
Заранее СПАСИБО.

0
filmotechnic
filmotechnic

User

Бывалый

Posts: 140

На форуме с: 01/01/2008

Репутация: +66

Рейтинг: 0

· 01/12/2010, 04:18 PM

UP!!!


Неужели не осталось програмистов на ла2базе ???

0
A
Akumu
· 01/12/2010, 04:37 PM

Ищи в ядре скилы призыва самонов, и делай по примеру

0
Ragnarok
Ragnarok

User

Участник

Posts: 73

На форуме с: 05/28/2009

Репутация: +22

Рейтинг: 0

· 01/12/2010, 04:45 PM

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

Код
import events.Helper;
import java.util.ArrayList;
import xxxx.gameserver.model.L2Spawn;
import xxxx.extensions.scripts.Functions;

делаешь класс продолжением(extends) класса Functions
Сверху вставляешь
Код
    private static ArrayList<L2Spawn> _spawns         = new ArrayList<L2Spawn>();

При клике на итем должен вызываться метод spawnEventManagers()
Код
   public void spawnEventManagers(){
        
        Helper.SpawnNPCs(REGISTER, LOCR, _spawns);//(npcId, int[][](x,y,z,heading), _spawns)
                executeTask("events.Base.Base", "despawneventmanagers", new Object[0], 180000);//3 минуты

    }
    
    public void despawneventmanagers(){
        
        Helper.deSpawnNPCs(_spawns);
    }

0
S
sterser
· 01/12/2010, 05:06 PM

А для лыжи все ответы ты можешь найти в классах твт евента, TvTManager и TvTEvent.
В классе TvTEvent ищи метод startParticipation(), а в TvTManager посмотри как используется executeTask.

0
Кирилл
Кирилл

User

Участник

Posts: 31

На форуме с: 07/11/2008

Рейтинг: 0

· 01/12/2010, 05:20 PM

Я даже толком не знаю... но посмотри различные квесты типо с нажатием итема появляется какой либо рб, NPC... может найдешь что-нить, что тебе поможет!

Поделись только, а то тоже интересно.

0
segal
segal

User

Бывалый

Posts: 317

На форуме с: 11/03/2008

Репутация: +242

Рейтинг: 0

· 01/12/2010, 05:55 PM

filmotechnic: Мои соображения: можно реализовать как на Java так и через квестовый движек (Pyton).

Я бы сделал так:
1. разрешаем игрокам кoманду //spawn_id
2. прикручиваем команду к итему.

0
S
sterser
· 01/12/2010, 05:58 PM

Зачем такие сложности?
Сделать спаун нпс не состовляет проблем, а вот удаление его после 3х минут - интересный вопрос.

0
A
Akumu
· 01/12/2010, 06:17 PM

Код
ThreadPoolManager.getInstance().scheduleGeneral(new unSummon(activeChar, petSummon), 180000);


Как то так

0
F
FloMotion
· 01/12/2010, 07:14 PM

Скил "Приманка" тебе в помощь...и ни какие скрипты не нужны по сути...ну это так в теории. Призывает нпс...удаляется через некоторое время...Привязать скил к итему пару пустяков. Ну и соотвественно настроить его тоже думаю не составит труда, реюз, там время действия и т.д.
А вообще я тут подумал, щас ток дошло. Возми тупо скил у Кузнеца "Призвать Торгового Голема", это как раз то, что тебе нужно 1 в 1. Надо лишь настроить время под себя и присвоить скил к итему. Делов на пару минут.

0
V
VlLight
· 01/12/2010, 09:05 PM

Вот ещё один вариант для l2jserver:
1. Если нужно, чтобы итем не исчезал, в SummonItems.java делаем новый тип итема, взяв за основу
case 0: // static summons (like Christmas tree) и удалив из него код удаления итема

2. В summon_items.csv описываем итем, НПЦ для вызова, указываем новый тип итема. (м.б. пункты 1-2 можно реализовать и по-другому)

3. Через квестовый движок (на ява или питоне, кому как нравится) регистрируем событие onSpawn для НПЦ, в onSpawn запускаем таймер на нужное время.

4. В onAdvEvent отлавливаем таймер и деспауним НПЦ.

0
filmotechnic
filmotechnic

User

Бывалый

Posts: 140

На форуме с: 01/01/2008

Репутация: +66

Рейтинг: 0

· 01/15/2010, 10:54 PM

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

Вот даю всё что сделал. там правда ещё одинс скролл телепорта добавил. Но реализацию НПС с деспавном увидите...
Всё проверено - работает :)

Профи прошу не пинать за неоптимальный код...

Код
package items;
import java.util.logging.Logger;
import net.sf.l2j.gameserver.datatables.SkillTable;
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.handler.ItemHandler;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.serverpackets.ActionFailed;
import net.sf.l2j.gameserver.serverpackets.MagicSkillUse;
import net.sf.l2j.gameserver.serverpackets.SystemMessage;
import net.sf.l2j.gameserver.templates.L2NpcTemplate;
import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.gameserver.datatables.NpcTable;
import net.sf.l2j.gameserver.model.L2Spawn;
import net.sf.l2j.gameserver.serverpackets.InventoryUpdate;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.util.Rnd;


public class eventtp implements IItemHandler
{
    private static final int[] ITEM_IDS = { 11006, 11007};
    
    public eventtp()
    {
        ItemHandler.getInstance().registerItemHandler(this);
    }


    public void useItem(L2PlayableInstance playable, L2ItemInstance item)
       {
        L2PcInstance activeChar;
        if (playable instanceof L2PcInstance)
            activeChar = (L2PcInstance)playable;
        else if (playable instanceof L2PetInstance)
            activeChar = ((L2PetInstance)playable).getOwner();
        else
            return;

        if (activeChar.isAllSkillsDisabled())
        {
            activeChar.sendPacket(ActionFailed.STATIC_PACKET);
            return;
        }

        int itemId = item.getItemId();

           if (itemId >= 11006 && itemId <= 11007)
           {
               if (!playable.destroyItem("Consume", item.getObjectId(), 1, null, false))
                return;
               switch(itemId)
            {
                case 11006: // Spawn The Buffer
                     int x = activeChar.getX();
                     int y = activeChar.getY();
                     int z = activeChar.getZ();
                     int num = 1;
                     int time = 3; //minutes to npc despawn
                     addMySpawn(50000,x,y,z,30000,true,time*60000);
                     L2ItemInstance refreshitem = activeChar.getInventory().addItem("Refresh", itemId, num, activeChar, null);
                     InventoryUpdate iu = new InventoryUpdate();
                     iu.addItem(refreshitem);
                     activeChar.sendPacket(iu);
                    break;
                case 11007: // Event Teleport
                    activeChar.teleToLocation(9745, 15606, -4574, true);
                    break;                
                default:
                    break;
            }
               return;
           }

        // for the rest, there are no extra conditions
        if (!playable.destroyItem("Consume", item.getObjectId(), 1, null, false))
            return;
       }
    
    public L2NpcInstance addMySpawn(int npcId, int x, int y, int z,int heading, boolean randomOffset, int despawnDelay)
    {
        L2NpcInstance result = null;
        try
        {
            L2NpcTemplate template = NpcTable.getInstance().getTemplate(npcId);
            if (template != null)
            {
                if ((x == 0) && (y == 0))
                {
                    return null;
                }
                if (randomOffset)
                {
                    int offset;
                    offset = Rnd.get(2);
                    if (offset == 0) {offset = -1;}
                    offset *= Rnd.get(30, 60);
                    x += offset;

                    offset = Rnd.get(2);
                    if (offset == 0) {offset = -1;}
                    offset *= Rnd.get(30, 60);
                    y += offset;
                }      
                L2Spawn spawn = new L2Spawn(template);
                spawn.setHeading(heading);
                spawn.setLocx(x);
                spawn.setLocy(y);
                spawn.setLocz(z+20);
                spawn.stopRespawn();
                result = spawn.spawnOne();

                if (despawnDelay > 0)
                    ThreadPoolManager.getInstance().scheduleGeneral(new DeSpawnScheduleTimerTask(result), despawnDelay);
                
                return result;
            }
        }
        catch (Exception e1)
        {
            _log.warning("Could not spawn Npc " + npcId);
        }
          
        return null;
    }
    
    public class DeSpawnScheduleTimerTask implements Runnable
    {
        L2NpcInstance _npc = null;
        public DeSpawnScheduleTimerTask(L2NpcInstance npc)
        {
            _npc = npc;
        }
        
        public void run()
        {
           _npc.onDecay();
        }
    }
    
    protected static final Logger _log = Logger.getLogger(eventtp.class.getName());
    
    public int[] getItemIds()
    {
        return ITEM_IDS;
    }

}

0
Lex
Lex

User

Бывалый

Posts: 250

На форуме с: 12/20/2007

Репутация: +125

Рейтинг: 0

· 01/16/2010, 05:36 PM

молодец, но можно было и так

Раскрывающийся текст

создать новый класс в хэндлерах

package net.sf.l2j.gameserver.handler.itemhandlers;

import net.sf.l2j.gameserver.ThreadPoolManager;
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.L2ItemInstance;
import net.sf.l2j.gameserver.model.L2Spawn;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.serverpackets.SystemMessage;
import net.sf.l2j.gameserver.templates.L2NpcTemplate;

/**
* @author .rattyx
*
*/
public class VendettaItem implements IItemHandler
{
public class DeSpawnScheduleTimerTask implements Runnable
{
L2Spawn spawnedPlant = null;

public DeSpawnScheduleTimerTask(L2Spawn spawn)
{
spawnedPlant = spawn;
}

public void run()
{
try
{
spawnedPlant.getLastSpawn().decayMe();
} catch (Throwable t)
{
}
}
}

private static int[] _itemIds = { Итем который будет нужен для вызова НПС};
private static int[] _npcIds = { ID НПСа };
private static int[] _npcLifeTime = { Сколько времени нпс будет жить в милисекундах };

public void useItem(L2PlayableInstance playable, L2ItemInstance item)
{
L2PcInstance activeChar = (L2PcInstance) playable;
L2NpcTemplate template1 = null;
int lifeTime = 0;
int itemId = item.getItemId();
for (int i = 0; i < _itemIds.length; i++)
{
if (_itemIds == itemId)
{
template1 = NpcTable.getInstance().getTemplate(_npcIds);
lifeTime = _npcLifeTime;
break;
}
}
if (template1 == null)
return;
try
{
L2Spawn spawn = new L2Spawn(template1);
spawn.setId(IdFactory.getInstance().getNextId());
spawn.setLocx(activeChar.getX());
spawn.setLocy(activeChar.getY());
spawn.setLocz(activeChar.getZ());
L2World.getInstance().storeObject(spawn.spawnOne());
ThreadPoolManager.getInstance().scheduleGeneral(new DeSpawnScheduleTimerTask(spawn), lifeTime);
activeChar.destroyItem("Consume", item.getObjectId(), 1, null, false);
} catch (Exception e) \\Эту строку можно и удалить если не хотите удаление вещи при юзание его
{
SystemMessage sm = new SystemMessage(SystemMessageId.S1_S2);
sm.addString("Exception in useItem() of VendettaItem.java");
activeChar.sendPacket(sm);
}
}

public int[] getItemIds()
{
return _itemIds;
}
}

0
DeadAdsl
DeadAdsl

User

Ветеран

Posts: 1208

На форуме с: 12/21/2007

Репутация: +592

Рейтинг: 0

· 01/16/2010, 06:06 PM

Закрыто

— Заболел

0
Topic is closed for replies