Помогите с реализацией...
Уважаемые форумчане!!!
У меня возникла следующая задача : создать итем при даблклике по которому рядом появляется НПЦ , который исчезает через 3 минуты (итем остается).
Мои соображения: можно реализовать как на Java так и через квестовый движек (Pyton).
Проблема: на Pytone не знаю как зарегистрировать itemhandler, а на JAVA не знаю как проспавнить НПЦ с таймером. Вот и застрял... как говориться и ни туда и ни сюда
перерыл кучу примеров но ничего подходящего не нашел....
Помогите кто может!!! Буду рад любым ответам по существу. (предпочтительно JAVA)
Заранее СПАСИБО.
Ищи в ядре скилы призыва самонов, и делай по примеру
не знаю, как для лыжи будет, для ядра на основе ребелиона примерно так:
в импорты добавляешь
import java.util.ArrayList;
import xxxx.gameserver.model.L2Spawn;
import xxxx.extensions.scripts.Functions;
делаешь класс продолжением(extends) класса Functions
Сверху вставляешь
При клике на итем должен вызываться метод 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);
}
А для лыжи все ответы ты можешь найти в классах твт евента, TvTManager и TvTEvent.
В классе TvTEvent ищи метод startParticipation(), а в TvTManager посмотри как используется executeTask.
Я даже толком не знаю... но посмотри различные квесты типо с нажатием итема появляется какой либо рб, NPC... может найдешь что-нить, что тебе поможет!
Поделись только, а то тоже интересно.
filmotechnic: Мои соображения: можно реализовать как на Java так и через квестовый движек (Pyton).
Я бы сделал так:
1. разрешаем игрокам кoманду //spawn_id
2. прикручиваем команду к итему.
Зачем такие сложности?
Сделать спаун нпс не состовляет проблем, а вот удаление его после 3х минут - интересный вопрос.
Как то так
Скил "Приманка" тебе в помощь...и ни какие скрипты не нужны по сути...ну это так в теории. Призывает нпс...удаляется через некоторое время...Привязать скил к итему пару пустяков. Ну и соотвественно настроить его тоже думаю не составит труда, реюз, там время действия и т.д.
А вообще я тут подумал, щас ток дошло. Возми тупо скил у Кузнеца "Призвать Торгового Голема", это как раз то, что тебе нужно 1 в 1. Надо лишь настроить время под себя и присвоить скил к итему. Делов на пару минут.
Вот ещё один вариант для l2jserver:
1. Если нужно, чтобы итем не исчезал, в SummonItems.java делаем новый тип итема, взяв за основу
case 0: // static summons (like Christmas tree) и удалив из него код удаления итема
2. В summon_items.csv описываем итем, НПЦ для вызова, указываем новый тип итема. (м.б. пункты 1-2 можно реализовать и по-другому)
3. Через квестовый движок (на ява или питоне, кому как нравится) регистрируем событие onSpawn для НПЦ, в onSpawn запускаем таймер на нужное время.
4. В onAdvEvent отлавливаем таймер и деспауним НПЦ.
Парни всем спасибо, кто пытался помочь.... сори долго не отвечал, в запой уходил...
Вот даю всё что сделал. там правда ещё одинс скролл телепорта добавил. Но реализацию НПС с деспавном увидите...
Всё проверено - работает :)
Профи прошу не пинать за неоптимальный код...
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;
}
}
молодец, но можно было и так
создать новый класс в хэндлерах
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;
}
}






