How to make Item reuse for Kamaloka

Deazer

Head Developer
Staff member
Example of code:

Code:
package handler.items;

import l2.gameserver.model.Player;
import l2.gameserver.model.items.ItemInstance;
import l2.gameserver.network.l2.s2c.SystemMessage;

public class Kamaloka extends SimpleItemHandler
{
    private static final int[] ITEM_IDS = new int[] { 13010, 13297, 20026, 13011, 13298, 20027, 13012, 13299, 20028 };

    @Override
    public int[] getItemIds()
    {
        return ITEM_IDS;
    }

    @Override
    protected boolean useItemImpl(Player player, ItemInstance item, boolean ctrl)
    {
        int itemId = item.getItemId();

        switch(itemId)
        {
            case 13010:
            case 13297:
            case 20026:
                useItem(player, item, 1);
                player.removeInstanceReusesByGroupId(1);
                break;
            case 13011:
            case 13298:
            case 20027:
                useItem(player, item, 1);
                player.removeInstanceReusesByGroupId(2);
                break;
            case 13012:
            case 13299:
            case 20028:
                useItem(player, item, 1);
                player.removeInstanceReusesByGroupId(3);
                break;
        }
        player.sendPacket(new SystemMessage(SystemMessage.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addItemName(itemId));
        return false;
    }
}

Thus, we can set the removal of the rollback to the instance to which the group belongs.
As example items 13011, 13299, 20028 remove reuse of instances in group 3 - player.removeInstanceReusesByGroupId(3);

The group of instances itself must be specified in the XML file - the path gameserver\data\instances. Parameter sharedReuseGroup="3"

Also you can remove reuse of Instance by ID. Example:
Code:
package handler.items;

import l2.gameserver.model.Player;
import l2.gameserver.model.items.ItemInstance;
import l2.gameserver.network.l2.s2c.SystemMessage;

public class Kamaloka extends SimpleItemHandler
{
    private static final int[] ITEM_IDS = new int[] { 13010, 13297, 20026, 13011, 13298, 20027, 13012, 13299, 20028 };

    @Override
    public int[] getItemIds()
    {
        return ITEM_IDS;
    }

    @Override
    protected boolean useItemImpl(Player player, ItemInstance item, boolean ctrl)
    {
        int itemId = item.getItemId();

        switch(itemId)
        {
            case 13010:
            case 13297:
            case 20026:
                useItem(player, item, 1);
                player.removeInstanceReuse(22);
                break;
            case 13011:
            case 13298:
            case 20027:
                useItem(player, item, 1);
                player.removeInstanceReuse(23);
                break;
            case 13012:
            case 13299:
            case 20028:
                useItem(player, item, 1);
                player.removeInstanceReuse(24);
                break;
        }
        player.sendPacket(new SystemMessage(SystemMessage.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addItemName(itemId));
        return false;
    }
}

Where param player.removeInstanceReuse(24);
this way we can rollback to a specific instance, not a group

How to compile you own code - https://lucera2.com/threads/how-to-add-your-quests-or-subsystems-to-an-assembly.1406/
 
Last edited:
В скрипте нету проверки на откат. Если ты инст не посещал, когда юзаешь свиток он просто у тебя пропадает.
А не пишет к примеру что не выполнены условия

ищу исполнителя, кто может дописать скрипт.$€£
 
В скрипте нету проверки на откат. Если ты инст не посещал, когда юзаешь свиток он просто у тебя пропадает.
А не пишет к примеру что не выполнены условия

ищу исполнителя, кто может дописать скрипт.$€£
я сам завтра допишу под задачу бесплатно
 
В скрипте нету проверки на откат. Если ты инст не посещал, когда юзаешь свиток он просто у тебя пропадает.
А не пишет к примеру что не выполнены условия

ищу исполнителя, кто может дописать скрипт.$€£
реализовали проверку? @Deazer
 
Last edited:
player.sendPacket(new SystemMessage(SystemMessage.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addItemName(itemId)); return false;
вот это вообще не понял к чему? Юзаешь итем, он юзается, а потом пишет что его нельзя заюзать, условия не соблюдены, но он уже заюзался)))
Тут явно где-то пропущена проверка для этого мессаджа.
Этот месадж должен вылазить при невозможности заюзать итем.

И кстати, к этим итемам невозможно применить reuse_delay, тупо не работает почему то
 
реализовали проверку? @Deazer
package handler.items;

import l2.gameserver.model.Player;
import l2.gameserver.model.items.ItemInstance;
import l2.gameserver.network.l2.s2c.SystemMessage;

public class Kamaloka extends SimpleItemHandler {
private static final int[] ITEM_IDS = new int[]{80307, 80449, 80501};

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

protected boolean useItemImpl(Player player, ItemInstance item, boolean ctrl) {
int itemId = item.getItemId();
switch(itemId) {
case 80307:
if(player.getInstanceReuse(79) > 0)
{
useItem(player, item, 1L);
player.removeInstanceReuse(79);
player.sendPacket((new SystemMessage(113)).addItemName(itemId));
}
else
System.out.println("Instance not at reuse");
break;
case 80449:
if(player.getInstanceReuse(73) > 0)
{
useItem(player, item, 1L);
player.removeInstanceReuse(73);
player.sendPacket((new SystemMessage(113)).addItemName(itemId));
}
else
System.out.println("Instance not at reuse");
break;
case 80501:
if(player.getInstanceReuse(84) > 0)
{
useItem(player, item, 1L);
player.removeInstanceReuse(84);
player.sendPacket((new SystemMessage(113)).addItemName(itemId));
}
else
System.out.println("Instance not at reuse");
}
return false;
}
}
 
Как добавить возможность юзать предмет раз в сутки? Из идей пока только привязать к нему способность, но вопрос, работает ли reuse у скилов в таком виде "30 6 * * *"
 
Как добавить возможность юзать предмет раз в сутки? Из идей пока только привязать к нему способность, но вопрос, работает ли reuse у скилов в таком виде "30 6 * * *"
// херню написал))
 
Last edited:
Как добавить возможность юзать предмет раз в сутки? Из идей пока только привязать к нему способность, но вопрос, работает ли reuse у скилов в таком виде "30 6 * * *"
Через коробку делай, а к ней время повторного использования
 
Через коробку делай, а к ней время повторного использования
Спасибо. Сделал, работает


Для тех кто будет искать
В Items делаем коробку
Code:
    <etcitem id="13225" name="Kamaloka (Hall of the Abyss) 1-unit Pack)">
        <!-- By double-clicking it, you will get Blue Talisman - M. Def. (for 1 hour). <Note:>. For items obtained from a chest, there are restrictions regarding movement. -->
        <set name="icon" value="icon.etc_pi_gift_box_i01" />
        <set name="class" value="MISC"/>
        <set name="reuse_type" value="EVERY_DAY_AT_6_30"/>
        <set name="crystal_type" value="NONE"/>
        <set name="stackable" value="true"/>
        <set name="dropable" value="false"/>
        <set name="tradeable" value="false"/>
        <set name="sellable" value="false"/>
        <set name="type" value="MATERIAL"/>
        <set name="weight" value="60"/>
    </etcitem>

В capsule_items.xml делаем содержимое
itemId="13225 - сундук
item id="13297 - билет
Code:
<capsule itemId="13225">
        <item id="13297" min="1" max="1" chance="100."/>
    </capsule>
 
Спасибо. Сделал, работает


Для тех кто будет искать
В Items делаем коробку
Code:
    <etcitem id="13225" name="Kamaloka (Hall of the Abyss) 1-unit Pack)">
        <!-- By double-clicking it, you will get Blue Talisman - M. Def. (for 1 hour). <Note:>. For items obtained from a chest, there are restrictions regarding movement. -->
        <set name="icon" value="icon.etc_pi_gift_box_i01" />
        <set name="class" value="MISC"/>
        <set name="reuse_type" value="EVERY_DAY_AT_6_30"/>
        <set name="crystal_type" value="NONE"/>
        <set name="stackable" value="true"/>
        <set name="dropable" value="false"/>
        <set name="tradeable" value="false"/>
        <set name="sellable" value="false"/>
        <set name="type" value="MATERIAL"/>
        <set name="weight" value="60"/>
    </etcitem>

В capsule_items.xml делаем содержимое
itemId="13225 - сундук
item id="13297 - билет
Code:
<capsule itemId="13225">
        <item id="13297" min="1" max="1" chance="100."/>
    </capsule>
Таким образом можно копить билеты а тратить в один день
 
Таким образом можно копить билеты а тратить в один день
Можно, надо искать как в скриптах реализована работа с сундуком скорее всего, и писать скрипт на кд билета
 
Можно, надо искать как в скриптах реализована работа с сундуком скорее всего, и писать скрипт на кд билета
У меня на птс есть кастомный бокс, который можно юзать 1 раз в сутки. Обрати внимание на время реюза в скиле от этого бокса. ПО аналогии у билета в камалоку тоже есть скил, ставь реюз 86400 и проверь.
skill_begin skill_name=[s_box] skill_id=25064 level=1 operate_type=A1 magic_level=1 self_effect={} effect={{i_restoration_random;{{{{[global_message];2}};25};{{{[global_message];3}};25};{{{[global_message];4}};25};{{{[global_message];5}};25}}}} operate_cond={{op_encumbered;20;10}} is_magic=2 mp_consume2=0 cast_range=-1 effective_range=-1 skill_hit_time=0 skill_cool_time=0 skill_hit_cancel_time=0 reuse_delay=86400 reuse_delay_lock=1 reuse_delay_type=S attribute={attr_none;0} trait={trait_none} effect_point=0 target_type=self affect_scope=single affect_limit={0;0} next_action=none ride_state={@ride_none;@ride_strider;@ride_wyvern;@ride_wolf} multi_class=0 olympiad_use=1 skill_end
 
Через коробку делай, а к ней время повторного использования
Просто если делать предмет как коробку то его можно будет юзать без КД на инст. (В items описываем как коробку, и добавляем в capsule_items.xml с пустым дропом)
 
Незнаю что за велосипед ты изобретаешь, вот тебе код с птс - адаптируешь под яву сам
item_begin etcitem 13010 [pi_kamaloka_holl_of_abyss_ticket] item_type=etcitem slot_bit_type={none} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=5 default_action=action_skill_reduce consume_type=consume_type_stackable initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=0 ex_immediate_effect=0 drop_period=10 duration={-1;0} use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[s_inzone_ticket1] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=paper crystal_type=crystal_free crystal_count=0 is_trade=0 is_drop=0 is_destruct=0 is_private_store=0 keep_type=9 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={} is_olympiad_can_use=1 can_move=1 is_premium=0 item_end
skill_begin skill_name=[s_inzone_ticket1] skill_id=2589 level=1 operate_type=A1 magic_level=1 self_effect={} effect={{i_add_max_entrance_inzone;1;1}} operate_cond={{can_add_max_entrance_inzone;1;1}} is_magic=2 mp_consume2=0 item_consume={[pi_kamaloka_holl_of_abyss_ticket];1} cast_range=-1 effective_range=-1 skill_hit_time=0 skill_cool_time=0 skill_hit_cancel_time=0 reuse_delay=86400 attribute={attr_none;0} trait={trait_none} effect_point=0 target_type=self affect_scope=single affect_limit={0;0} next_action=none ride_state={@ride_none;@ride_strider;@ride_wyvern;@ride_wolf} multi_class=0 olympiad_use=1 skill_end

Принцип простой: В итеме(в твоем случае - билет(выделено красным)) есть скил(выделено синим), который обнуляет инстанс зону, забирая предмет. Ставишь откат скила на 1 сутки (86400 сек)(выделено зеленым) и радуешься. При попытке повторного использование тебе напишет, что скил не готов к использованию и итем нельзя использовать.
 
Незнаю что за велосипед ты изобретаешь, вот тебе код с птс - адаптируешь под яву сам
item_begin etcitem 13010 [pi_kamaloka_holl_of_abyss_ticket] item_type=etcitem slot_bit_type={none} armor_type=none etcitem_type=none delay_share_group=-1 item_multi_skill_list={} recipe_id=0 blessed=0 weight=5 default_action=action_skill_reduce consume_type=consume_type_stackable initial_count=1 soulshot_count=0 spiritshot_count=0 reduced_soulshot={} reduced_spiritshot={} reduced_mp_consume={} immediate_effect=0 ex_immediate_effect=0 drop_period=10 duration={-1;0} use_skill_distime=0 period=0 equip_reuse_delay=0 price=0 default_price=0 item_skill=[s_inzone_ticket1] critical_attack_skill=[none] attack_skill=[none] magic_skill=[none] item_skill_enchanted_four=[none] capsuled_items={} material_type=paper crystal_type=crystal_free crystal_count=0 is_trade=0 is_drop=0 is_destruct=0 is_private_store=0 keep_type=9 physical_damage=0 random_damage=0 weapon_type=none critical=0 hit_modify=0 avoid_modify=0 dual_fhit_rate=0 shield_defense=0 shield_defense_rate=0 attack_range=0 damage_range={} attack_speed=0 reuse_delay=0 mp_consume=0 magical_damage=0 durability=-1 damaged=0 physical_defense=0 magical_defense=0 mp_bonus=0 category={} enchanted=0 base_attribute_attack={none;0} base_attribute_defend={0;0;0;0;0;0} html=[item_default.htm] magic_weapon=0 enchant_enable=0 elemental_enable=0 unequip_skill={} for_npc=0 item_equip_option={} use_condition={} equip_condition={} is_olympiad_can_use=1 can_move=1 is_premium=0 item_end
skill_begin skill_name=[s_inzone_ticket1] skill_id=2589 level=1 operate_type=A1 magic_level=1 self_effect={} effect={{i_add_max_entrance_inzone;1;1}} operate_cond={{can_add_max_entrance_inzone;1;1}} is_magic=2 mp_consume2=0 item_consume={[pi_kamaloka_holl_of_abyss_ticket];1} cast_range=-1 effective_range=-1 skill_hit_time=0 skill_cool_time=0 skill_hit_cancel_time=0 reuse_delay=86400 attribute={attr_none;0} trait={trait_none} effect_point=0 target_type=self affect_scope=single affect_limit={0;0} next_action=none ride_state={@ride_none;@ride_strider;@ride_wyvern;@ride_wolf} multi_class=0 olympiad_use=1 skill_end

Принцип простой: В итеме(в твоем случае - билет(выделено красным)) есть скил(выделено синим), который обнуляет инстанс зону, забирая предмет. Ставишь откат скила на 1 сутки (86400 сек)(выделено зеленым) и радуешься. При попытке повторного использование тебе напишет, что скил не готов к использованию и итем нельзя использовать.
lol что, смотри выше трид, у нас нету никаких у скилов итемов, у нас юзабельный итем, который через скрип обнуляет откат инсты.

и да есть косяк, что у этого итема нельза сделать реюз раз в день
 
и да есть косяк, что у этого итема нельза сделать реюз раз в день
Я еще пороюсь в скриптах, нашел где-то в недрах гейм сервера как раз функцию с откатом предмета раз в сутки. По классике как нашел так и просрал xD Мб смогу прикрутить ее к условию юзнутого билета
 
lol что, смотри выше трид, у нас нету никаких у скилов итемов, у нас юзабельный итем, который через скрип обнуляет откат инсты.

и да есть косяк, что у этого итема нельза сделать реюз раз в день
Удивлен, простите)
 
Nope, ничего не нашел толкового. @Deazer может есть какой-то еще вариант заставить <set name="reuse_type" value="EVERY_DAY_AT_6_30"/> работать не только с сундуками?
 
Back
Top