Перейти к содержанию
Авторизация  
Руслан_Миндубаев

Выполнение команды при использовании предмета

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

Здравствуйте, нужна помощь. Хочу понять как выполнить команду при использовании предмета. Например свиток, который будет призывать босса командой //spawn npc_id. Или какое-либо другое действо. Такое вообще реально? Сурки есть, подскажите куда копать

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


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

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

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


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

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

через итемхендлер проще запилить

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


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

т.е. лезть в сурки и искать эти методы и там handler"е отлавливать? Я правильно понял?

че отлавливать, о чем речь?

Написать новый скрипт для предмета, не?

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


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

че отлавливать, о чем речь?

Написать новый скрипт для предмета, не?

 

че отлавливать, о чем речь?

Написать новый скрипт для предмета, не?

package l2p.gameserver.handler.items;

import l2p.commons.data.xml.AbstractHolder;
import l2p.gameserver.data.xml.holder.ItemHolder;
import l2p.gameserver.templates.item.ItemTemplate;

public class ItemHandler extends AbstractHolder {

    private static final ItemHandler _instance = new ItemHandler();

    public static ItemHandler getInstance() {
        return _instance;
    }

    private ItemHandler() {
        //
    }

    public void registerItemHandler(IItemHandler handler) {
        int[] ids = handler.getItemIds();
        for (int itemId : ids) {
            ItemTemplate template = ItemHolder.getInstance().getTemplate(itemId);
            if (template == null) {
                warn("Item not found: " + itemId + " handler: " + handler.getClass().getSimpleName());
            } else if (template.getHandler() != IItemHandler.NULL) {
                warn("Duplicate handler for item: " + itemId + "(" + template.getHandler().getClass().getSimpleName() + "," + handler.getClass().getSimpleName() + ")");
            } else {
                template.setHandler(handler);
            }
        }
    }

    @[member='override']
    public int size() {
        return 0;
    }

    @[member='override']
    public void clear() {
    }
}

Я не особо шарю, этот handler не содержит сами команды же, как я понял...

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


Ссылка на сообщение
Поделиться на другие сайты
package l2p.gameserver.handler.items;

import l2p.commons.data.xml.AbstractHolder;
import l2p.gameserver.data.xml.holder.ItemHolder;
import l2p.gameserver.templates.item.ItemTemplate;

public class ItemHandler extends AbstractHolder {

    private static final ItemHandler _instance = new ItemHandler();

    public static ItemHandler getInstance() {
        return _instance;
    }

    private ItemHandler() {
        //
    }

    public void registerItemHandler(IItemHandler handler) {
        int[] ids = handler.getItemIds();
        for (int itemId : ids) {
            ItemTemplate template = ItemHolder.getInstance().getTemplate(itemId);
            if (template == null) {
                warn("Item not found: " + itemId + " handler: " + handler.getClass().getSimpleName());
            } else if (template.getHandler() != IItemHandler.NULL) {
                warn("Duplicate handler for item: " + itemId + "(" + template.getHandler().getClass().getSimpleName() + "," + handler.getClass().getSimpleName() + ")");
            } else {
                template.setHandler(handler);
            }
        }
    }

    @[member='override']
    public int size() {
        return 0;
    }

    @[member='override']
    public void clear() {
    }
}

Я не особо шарю, этот handler не содержит сами команды же, как я понял...

 

я туплю просто, посмотрю как с сборке что работает и только потом полезу делать, спасибо)

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


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

Как-т так, хз. Без команд правда, лень заморачиватся.

package handler.items.action;

import handler.items.SimpleItemHandler;
import ru.jopacode.gameserver.model.Player;
import ru.jopacode.gameserver.model.items.ItemInstance;
import ru.jopacode.gameserver.network.l2.components.SystemMsg;
import ru.jopacode.gameserver.network.l2.s2c.SystemMessage2;
import ru.jopacode.gameserver.utils.NpcUtils;

/**
* @[member='Authority'] smile10
* @[member='datextt'] 27 июн. 2017 г.
* @team https://jpcd.ru = jopacode.ru
* @НА ПИВАС КИДАТЬ СЮДА : R160347353229
* 
*/
public class action_summonnpc_item extends SimpleItemHandler {

	private static final int NPC1 = 29068;
	private static final int NPC2 = 29028;
	
	private static final int ITEM_ID[]  = {
			4037,
			4356
	};
	
	@[member='override']
	public int[] getItemIds() {
		return ITEM_ID;
	}

	@[member='override']
	protected boolean useItemImpl(Player player, ItemInstance item, boolean ctrl) {
		if(player == null || !player.isPlayer())
			return false;
		int itemId = item.getItemId();
		if(!canConsume(player, item))
			return false;
		switch(itemId)
		{
		case 4037:
			if(!player.getInventory().destroyItem(item, 1))
			{
				player.sendActionFailed();
				player.sendMessage(player.isLangRus() ? "Не соблюдены условия!" : "Conditions not met!");
				return false;
			}
			use4037(player, ctrl);
		case 4356:
			if(!player.getInventory().destroyItem(item, 1))
			{
				player.sendActionFailed();
				player.sendMessage(player.isLangRus() ? "Не соблюдены условия!" : "Conditions not met!");
				return false;
			}
			use4356(player, ctrl);
		}
		
		return false;
	}
	
	private void use4037(Player player, boolean ctrl) {
		NpcUtils.spawnSingle(NPC1, player.getLoc());
		player.sendMessage("Вы призвали какую-то е***ю х***ю, зачем вы клацали кнопочки.");
	} 
	private void use4356(Player player, boolean ctrl) {
		NpcUtils.spawnSingle(NPC2, player.getLoc());
		player.sendMessage("Вам было мало одной х***и и призвали вторую, лолкек.");
	} 
	
	public static boolean canConsume(Player player, ItemInstance item) {
		if(player.getWeightPenalty() >= 3 || player.getInventory().getSize() > player.getInventoryLimit() - 20) {
			player.sendPacket(SystemMsg.YOUR_INVENTORY_IS_FULL, new SystemMessage2(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addItemName(item.getItemId()));
			return false;
		}
		return true;
	}

}

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

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


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

Вариант с войскомандой. Собстна ничё сверхсложного.

package handler.voicecommands;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ru.jopacode.gameserver.handler.voicecommands.IVoicedCommandHandler;
import ru.jopacode.gameserver.handler.voicecommands.VoicedCommandHandler;
import ru.jopacode.gameserver.listener.script.OnInitScriptListener;
import ru.jopacode.gameserver.model.Player;
import ru.jopacode.gameserver.network.l2.components.SystemMsg;
import ru.jopacode.gameserver.utils.NpcUtils;

/**
* @[member='Authority'] smile10
* @[member='datextt'] 27 июн. 2017 г.
* @team https://jpcd.ru = jopacode.ru
* @НА ПИВАС КИДАТЬ СЮДА : R160347353229
*/
public class voicedspawner implements IVoicedCommandHandler, OnInitScriptListener {
	
	private static final Logger _log = LoggerFactory.getLogger(voicedspawner.class);
	private static final boolean state_enable = true; //вкл/выкл
	private static final long reuseTime = 30 * 60000; // 30 минут
	private static final int NPC1 = 29068;
	private Map<Integer, Long> _lastusetime = new HashMap<Integer, Long>();
	
	private final String[] _commandList = new String[] {
			"gospawn"
	};
	
	@[member='override']
	public void onInit() {
		VoicedCommandHandler.getInstance().registerVoicedCommandHandler(this);
		_log.info("VoicedSpawner loaded. State: " + !state_enable);
	}

	@[member='override']
	public boolean useVoicedCommand(String command, Player activeChar, String target) {
			if(!state_enable)
				return false;
			if (activeChar == null || activeChar.isDead() || !activeChar.isPlayer()) {
				activeChar.sendPacket(SystemMsg.CANNOT_USE);
				return false;
			}
			if(_lastusetime.containsKey(activeChar.getObjectId()))
			{
				final long _timeAfterPreviousUse = System.currentTimeMillis() - _lastusetime.get(activeChar.getObjectId());
				if(_timeAfterPreviousUse < reuseTime)
				{
					activeChar.sendMessage("Разрешено использовать раз в " + reuseTime + " минут. До следующего использования " + (reuseTime - _timeAfterPreviousUse) / 60000 + " минут");
					return false;
				}
				else
				{
					_lastusetime.remove(activeChar.getObjectId());
					_lastusetime.put(activeChar.getObjectId(), System.currentTimeMillis());
				}
			}
			else
				_lastusetime.put(activeChar.getObjectId(), System.currentTimeMillis());
				 NpcUtils.spawnSingle(NPC1, activeChar.getLoc());
		return false;
	}

	@[member='override']
	public String[] getVoicedCommandList() {
		return _commandList;
	}

}

  • Upvote 1

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


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

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

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

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

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

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

Войти

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

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

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

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

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