Перейти к содержанию
Авторизация  
markblack

Capsuled Item

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

Не работают CapsuledItem.

 

Сделал классы в ItemTemplate. Добавил в парсер. 

Ошибки не вылетают, но и итемы не отрываются, прошу помощи

 

ItemTemplate.java

 

  Показать контент

 

 

ItemParser.java

 

  Показать контент

 

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

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


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

ERROR parser.ItemParser: ItemParser: File: 17000-17099.xml:484 error: Element type "capsuled_items" must be declared.

ERROR parser.ItemParser: ItemParser: File: 17000-17099.xml:485 error: Element type "capsuled_item" must be declared. 

ERROR parser.ItemParser: ItemParser: File: 17000-17099.xml:487 error: The content of element type "etcitem" must match "(set|equip|for|enchant4_skill|cond|skills|triggers|enchant_options)*".

 

Получил данные ошибки, кто подскажет где копать?

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


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

Видимо твой xml документ (17000-17099.xml) содержит DTD, объяви свои элементы capsuled_items, capsuled_item по аналогии, в самом начале файла в !DOCTYPE

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


Ссылка на сообщение
Поделиться на другие сайты
  В 11.05.2015 в 05:35, Nha сказал:

Видимо твой xml документ (17000-17099.xml) содержит DTD, объяви свои элементы capsuled_items, capsuled_item по аналогии, в самом начале файла в !DOCTYPE

Объявил, ошибки ушли, а итемы так и не открываются

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


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

Ок, данные успешно считываются, но дальше? Должна быть реализация хендлера (ItemHandler), который отвечает за использование предмета, если он есть то ошибка там, а если нет, то написать его по примеру имеющихся хендлеров не сложно, если я правильно понимаю что такое "capsuled items"

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


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

Он есть, по сравнению со сборками где это реализовано отличий нету

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


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

Кинь сюда листинг, могу глянуть, если 100% уверенность, что отличий нет, может хендлер не регистрируется? или список ИД капсульных предметов в нем не полный?

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


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

ItemHandler.java

 

  Показать контент

 

 

ItemTemplate.java

 

  Показать контент

 

 

ItemParser.java

 

  Показать контент

 

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

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


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

Немного не то, нужен класс который реализует интерфейс IItemHandler, а ItemHandler.java  это класс, который только регистрирует этот интерфейс. В общем, нужно искать/сделать класс CapsuledItem с интерфейсом IItemHandler. Что за сборка?

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


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

Lostworld (шара)

 

IItemHadler.java

 

  Показать контент

 

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

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


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

Для начала убедись что они верно реализованы (пример проверки: мешок НГ сосок, если откроет то проверяем реализацию остальных).

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


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

У разработчика большая часть реализована в скриптах.

 

Оно не работает 

 

  Показать контент

 

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


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

Глянул сборку, набросал скрипт исходя от твоей реализации

data/scripts/handler/items

package handler.items;


import org.apache.commons.lang3.ArrayUtils;
import org.mmocore.commons.util.Rnd;
import org.mmocore.gameserver.data.xml.holder.ItemHolder;
import org.mmocore.gameserver.model.Playable;
import org.mmocore.gameserver.model.Player;
import org.mmocore.gameserver.model.items.ItemInstance;
import org.mmocore.gameserver.network.l2.components.SystemMsg;
import org.mmocore.gameserver.network.l2.s2c.SystemMessage;
import org.mmocore.gameserver.templates.item.ItemTemplate;
import org.mmocore.gameserver.templates.item.ItemTemplate.CapsuledItem;


public class CapsuledItems extends ScriptItemHandler
{
    @Override
    public boolean useItem(Playable playable, ItemInstance item, boolean ctrl)
    {
        if(playable == null || !playable.isPlayer())
            return false;
        Player player = playable.getPlayer();
                
        if(!player.getInventory().destroyItem(item, 1L))
        {
            player.sendPacket(SystemMsg.INCORRECT_ITEM_COUNT);
            return false;
        }
        player.sendPacket(SystemMessage.removeItems(item.getItemId(), 1));
        for (CapsuledItem ci : item.getTemplate().getCapsuledItems())
        {
            if(Rnd.chance(ci.getChance()))
            {
                ItemInstance obtainItem = player.getInventory().addItem(ci.getItemId(), Rnd.get(ci.getMinCount(), ci.getMaxCount()));
                if (obtainItem != null)
                   player.sendPacket(SystemMessage.obtainItems(obtainItem));
            }
        }
        return true;
    }


    @Override
    public int[] getItemIds()
    {
            int[] items = new int[0];
            for (ItemTemplate item : ItemHolder.getInstance().getAllTemplates())
                if (item.getCapsuledItems().size() > 0)
                    items = ArrayUtils.add(items, item.getItemId());
            return items;
    }
}

 

  • Upvote 1

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


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

убрал public у класса (не запускался)
 

после прогрузки итемов пишет 

  Показать контент

 

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


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

эта ошибка возникает из-за того, что убран public модификатор, зачем его убирать, в смысле не запускался?

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


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

С модификатором

\gameserver\data\scripts\handler\items\Capsuled.java:16,14: The public type CapsuledItems must be defined in its own file

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


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

нужно сделать файл CapsuledItems.java (название совпадает с названием класса)

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


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

package handler.items;

import java.util.List;
import org.mmocore.commons.util.Rnd;
import org.mmocore.gameserver.data.xml.holder.ItemHolder;
import org.mmocore.gameserver.model.Playable;
import org.mmocore.gameserver.model.Player;
import org.mmocore.gameserver.model.items.ItemInstance;
import org.mmocore.gameserver.network.l2.components.SystemMsg;
import org.mmocore.gameserver.network.l2.s2c.SystemMessage;
import org.mmocore.gameserver.templates.item.support.CapsuledItemsContainer;
import org.mmocore.gameserver.utils.ItemFunctions;


public class Capsuled extends ScriptItemHandler
{
@Override
public final int[] getItemIds()
{
return ItemHolder.getInstance().getCapsuledItemIds();
}
@Override
public boolean useItem(Playable playable, ItemInstance item, boolean ctrl)
{
if(playable == null || !playable.isPlayer())
return false;

Player player = (Player) playable;

boolean isCapsuled = item.getTemplate().isCapsuled();

if (!canBeExtracted(player, item))
return false;

if (!useItem(player, item, 1))
return false;

List<CapsuledItemsContainer> extracted_items = item.getTemplate().getCapsuledItems();
boolean random = true;
int sizer = 0;
int maxSize = extracted_items.size();
int preItemId = 0;
int perMinCount = 0;
int perMaxCount = 0;
for(CapsuledItemsContainer extracted : extracted_items)
{
if(extracted.getChance() < 100.0)
{
if(isCapsuled && Rnd.chance(50) && preItemId == 0)
{
preItemId = extracted.getItemId();
perMinCount = extracted.getMinCount();
perMaxCount = extracted.getMaxCount();
}
if(Rnd.chance(extracted.getChance()) && random)
{
ItemFunctions.addItem(player, extracted.getItemId(), Rnd.get(extracted.getMinCount(), extracted.getMaxCount()));
random = false;
}
if(isCapsuled)
{
sizer++;
if(sizer == maxSize && random)
{
ItemFunctions.addItem(player, preItemId, Rnd.get(perMinCount, perMaxCount));
random = false;
}
}
}
else if(extracted.getChance() == 100.0)
ItemFunctions.addItem(player, extracted.getItemId(), Rnd.get(extracted.getMinCount(), extracted.getMaxCount()));
}

return true;
}

private static boolean canBeExtracted(Player player, ItemInstance item)
{
if(player.getWeightPenalty() >= 3 || player.getInventory().getSize() > player.getInventoryLimit() - 10)
{
player.sendPacket(SystemMsg.YOUR_INVENTORY_IS_FULL, new SystemMessage(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addItemName(item.getItemId()));
return false;
}

if(player.isActionsDisabled())
{
player.sendPacket(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS);
return false;
}

if(player.isInTrade())
{
player.sendPacket(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS);
return false;
}

if(player.isInStoreMode())
{
player.sendPacket(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS);
return false;
}

return true;
}

public static boolean useItem(Player player, ItemInstance item, long count)
{
if(player.getInventory().destroyItem(item, count))
{
player.sendPacket(new SystemMessage(SystemMsg.YOU_USE_S1).addItemName(item.getItemId()));
return true;
}

player.sendPacket(SystemMsg.INCORRECT_ITEM_COUNT);
return false;
}
}

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


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

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

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

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

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

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

Войти

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

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

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

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

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