Реализация ивента

tzymbal s

Единомышленник
Участник
Сообщения
65
Розыгрыши
0
Репутация
1
Реакции
34
Баллы
178
Хроники
  1. Master Class
Исходники
Присутствуют
Сборка
L2J_Mobius_Essence_8.3_Guardians
приветствую! Столкнулся с проблемой--не берется ивент Balthus Festival..юзаю орден балтуса но не участвую в ивенте..приложу скрипт
Код:
package events.BalthusFestival;

import java.io.File;
import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;

import org.w3c.dom.Document;

import org.l2jmobius.commons.time.SchedulingPattern;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.managers.events.BalthusEventManager;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.item.enums.ItemProcessType;
import org.l2jmobius.gameserver.model.quest.LongTimeEvent;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
import org.l2jmobius.gameserver.network.serverpackets.balthusevent.ExBalthusEvent;

/**
 * @author Index
 */
public class BalthusFestival extends LongTimeEvent implements IXmlReader
{
    // NPC
    private static final int SIBI = 34262;
    // Misc
    private static final SchedulingPattern CRON_PATTERN = new SchedulingPattern("30 6 * * *");
    
    public BalthusFestival()
    {
        addStartNpc(SIBI);
        addFirstTalkId(SIBI);
        addTalkId(SIBI);
        load();
    }
    
    @Override
    public synchronized void load()
    {
        parseDatapackFile("data/scripts/events/BalthusFestival/rewards.xml");
    }
    
    @Override
    public void parseDocument(Document document, File file)
    {
        final BalthusEventManager manager = BalthusEventManager.getInstance();
        manager.setEventPeriod(getEventPeriod());
        forEach(document, "list", listNode ->
        {
            forEach(listNode, "parameters", parametersSet ->
            {
                final StatSet params = new StatSet();
                forEach(parametersSet, "param", paramNode ->
                {
                    final StatSet paramSet = new StatSet(parseAttributes(paramNode));
                    params.set(paramSet.getString("name"), paramSet.getString("value"));
                });
                manager.initParameters(params);
            });
            forEach(listNode, "reward", rewardNode ->
            {
                final StatSet periodSet = new StatSet(parseAttributes(rewardNode));
                final int from = periodSet.getInt("from", 0);
                final int to = periodSet.getInt("to", 0);
                final Entry<Integer, Integer> period = new SimpleEntry<>(from, to);
                forEach(rewardNode, "items", itemsNode ->
                {
                    forEach(itemsNode, "item", itemNode ->
                    {
                        final StatSet itemSet = new StatSet(parseAttributes(itemNode));
                        final int itemId = itemSet.getInt("id", 0);
                        final long itemCount = itemSet.getLong("count", 1L);
                        final double chanceToObtainByPlayer = itemSet.getDouble("chance", 0d);
                        final int enchantLevel = itemSet.getInt("enchant", 0);
                        final double chanceToNextGame = itemSet.getDouble("lotteryChance", 0d);
                        final boolean redeemInAnyCase = itemSet.getBoolean("redeemInAnyCase", false);
                        manager.addRewards(period, itemId, itemCount, chanceToObtainByPlayer, enchantLevel, chanceToNextGame, redeemInAnyCase);
                    });
                });
            });
        });
        manager.init();
    }
    
    @Override
    public String onEvent(String event, Npc npc, Player player)
    {
        switch (event)
        {
            case "34262-1.htm":
            {
                if (BalthusEventManager.getInstance().getDailySupplyItem() != null)
                {
                    return "34262-1.htm";
                }
                
                return "34262-1b.htm";
            }
            case "34262-shop.htm":
            {
                return "34262-shop.htm";
            }
            case "giveSupplyBox":
            {
                final BalthusEventManager manager = BalthusEventManager.getInstance();
                if (manager.getDailySupplyItem() == null)
                {
                    return "34262-1b.htm";
                }
                
                if (player.getLevel() < manager.getMinimumLevel())
                {
                    return "34262-2.htm";
                }
                
                final long lastReceived = player.getVariables().getLong(PlayerVariables.BALTHUS_BAG, 0L);
                if (lastReceived > System.currentTimeMillis())
                {
                    return "34262-3.htm";
                }
                
                if ((manager.getDailySupplyFeeItem() != null) && (player.getInventory().getInventoryItemCount(manager.getDailySupplyFeeItem().getId(), -1) < manager.getDailySupplyFeeItem().getCount()))
                {
                    return "34262-2.htm";
                }
                
                if ((manager.getDailySupplyFeeItem() != null) && !player.destroyItem(ItemProcessType.FEE, player.getInventory().getItemByItemId(manager.getDailySupplyFeeItem().getId()).getObjectId(), manager.getDailySupplyFeeItem().getCount(), npc, true))
                {
                    return "34262-2.htm";
                }
                
                player.addItem(ItemProcessType.REWARD, manager.getDailySupplyItem().getId(), manager.getDailySupplyItem().getCount(), npc, true);
                player.getVariables().set(PlayerVariables.BALTHUS_BAG, CRON_PATTERN.next(System.currentTimeMillis()));
                break;
            }
        }
        
        return super.onEvent(event, npc, player);
    }
    
    @Override
    public String onFirstTalk(Npc npc, Player player)
    {
        player.sendPacket(new NpcHtmlMessage(npc.getObjectId(), 0, getHtm(player, "34262.htm"), 1));
        return null;
    }
    
    @RegisterEvent(EventType.ON_PLAYER_LOGIN)
    @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
    public void onPlayerLogin(OnPlayerLogin event)
    {
        if (!isEventPeriod())
        {
            return;
        }
        
        final Player player = event.getPlayer();
        if (player == null)
        {
            return;
        }
        
        player.sendPacket(new ExBalthusEvent(player));
    }
    
    public static void main(String[] args)
    {
        new BalthusFestival();
    }
}

как я понимаю тут нет обработки события типа -@RegisterEvent(EventType.ON_ITEM_USE)
и логики обработки этого предмета --import org.l2jmobius.gameserver.model.events.impl.item.OnItemUse;
Правильный ли поток моих мыслей?)))
 

Судя по описанию, тут нужно на уровне эффекта реализацию проверять/делать. Сам по себе предмет просто вызывает каст бафа -> баф ложит специальный эффект, который должен решать что делать с ивентом
 
Код:
<skill id="39171" toLevel="1" name="Balthus Knights' Mark">
        <!-- P. Atk. +100. M. Atk. +100. P. Def. +100. M. Def. +100. Acquired XP +30%. Acquired SP +30%. A chance to obtain special supplies. The effect remains after death. You cannot cancel the effect by yourself. -->
        <icon>icon.ev_balthus_token</icon>
        <operateType>A2</operateType>
        <targetType>SELF</targetType>
        <abnormalLevel>1</abnormalLevel>
        <abnormalTime>3600</abnormalTime>
        <abnormalType>CHANGEBODY</abnormalType>
        <abnormalVisualEffect>CHANGESHAPE_TRANSFORM</abnormalVisualEffect>
        <affectScope>SINGLE</affectScope>
        <basicProperty>NONE</basicProperty>
        <blockedInOlympiad>true</blockedInOlympiad>
        <effectPoint>0</effectPoint>
        <hitCancelTime>0</hitCancelTime>
        <hitTime>500</hitTime>
        <isMagic>4</isMagic> <!-- Magic Skill -->
        <itemConsumeCount>1</itemConsumeCount>
        <itemConsumeId>49784</itemConsumeId>
        <magicCriticalRate>5</magicCriticalRate>
        <magicLevel>56</magicLevel>
        <reuseDelay>60000</reuseDelay>
        <stayAfterDeath>true</stayAfterDeath>
        <conditions>
            <condition name="CheckLevel">
                <minLevel>20</minLevel>
            </condition>
        </conditions>
        <effects>
            <effect name="ExpModify">
                <amount>30</amount>
            </effect>
            <effect name="SpModify">
                <amount>30</amount>
            </effect>
            <effect name="PhysicalAttack">
                <amount>100</amount>
                <mode>DIFF</mode>
            </effect>
            <effect name="MagicalAttack">
                <amount>100</amount>
                <mode>DIFF</mode>
            </effect>
            <effect name="PhysicalAttackSpeed">
                <amount>100</amount>
                <mode>DIFF</mode>
            </effect>
            <effect name="MagicalAttackSpeed">
                <amount>100</amount>
                <mode>DIFF</mode>
            </effect>
        </effects>
    </skill>

к сожалению мне это не дает никакой подсказки куда рыть(((
 
Ну вот скилл у тебя скил, добавь к нему новый эффект с вызовом BalthusEventManager.addPlayerToList при старте и BalthusEventManager.removePlayerFromList при завершении. Скорее всего есть еще какие-то условия участия, но я не в контексте.
 
C++:
skill_begin    skill_name=[s_item_ev_balthus_token]    /*[발터스 기사단 일원]*/    skill_id=39171    level=1    operate_type=A2    magic_level=85    special_level=-2    magic_critical_rate=5    change_skill_id=0    self_effect={}    effect={{p_balthus_buff};{p_exp_modify;30};{p_sp_modify;30};{p_hp_regen;{all};20;diff};{p_mp_regen;{all};5;diff}}    end_effect={}    operate_cond={{op_check_abnormal;kalie_buff;1;4}}    is_magic=0    is_double=0    mp_consume2=0    item_consume={[ev_balthus_token];1}    cast_range=-1    effective_range=-1    skill_hit_time=0.5    skill_cool_time=0.5    skill_hit_cancel_time=0.5    reuse_delay=60    activate_rate=-1    lv_bonus_rate=0    basic_property=none    abnormal_time=3600    abnormal_lv=1    abnormal_type=kalie_buff    abnormal_instant=0    no_transfer_abnormal=1    irreplaceable_buff=1    buff_protect_level=31    attribute={attr_none;0}    trait={trait_none}    effect_point=0    target_type=self    affect_scope=single    affect_limit={0;0}    next_action=none    debuff=0    except_restore=1    except_block=0    ride_state={@ride_none;@ride_strider;@ride_wyvern;@ride_wolf}    multi_class=0    olympiad_use=1    npc_notice=0    automatic_use = 0    skill_end
skill_begin    skill_name=[s_item_ev_balthus_high_token]    /*[상급 발터스 기사단 일원]*/    skill_id=39272    level=1    operate_type=A2    magic_level=85    special_level=-2    magic_critical_rate=5    change_skill_id=0    self_effect={}    effect={{p_balthus_buff};{p_exp_modify;20};{p_sp_modify;20}}    end_effect={}    operate_cond={{op_check_abnormal;kalie_buff;1;4}}    is_magic=0    is_double=0    mp_consume2=0    item_consume={[ev_balthus_high_token];1}    cast_range=-1    effective_range=-1    skill_hit_time=0.5    skill_cool_time=0.5    skill_hit_cancel_time=0.5    reuse_delay=60    activate_rate=-1    lv_bonus_rate=0    basic_property=none    abnormal_time=7200    abnormal_lv=2    abnormal_type=kalie_buff    abnormal_instant=0    no_transfer_abnormal=1    irreplaceable_buff=1    buff_protect_level=31    attribute={attr_none;0}    trait={trait_none}    effect_point=0    target_type=self    affect_scope=single    affect_limit={0;0}    next_action=none    debuff=0    except_restore=1    except_block=0    ride_state={@ride_none;@ride_strider;@ride_wyvern;@ride_wolf}    multi_class=0    olympiad_use=1    npc_notice=0    automatic_use = 0    skill_end
 
там приколы мобиусовские.

По ПТС нужно они делают эффект, у которого дёргается метод "при старте эффекта" и "при завершении эффекта".

Я же делал 2 или 3 реализации без эффекта, что видимо было ошибкой.
1 - была при использовании предмета - но из-за того что идёт сначала оповещение о событии, а потом уже логика использования - в 100% случаев эффекта при проверки, не было на чаре.
2 - это по использованию умения - но опять же там оповещалось только начало использование умения, а не момент его применения;
3 - это момент уже фактического применения, но опять же - толи из-за асинхронности, толи из-за бед с башкой - некоторые эффекты не могут быть "наложены" на момент оповещении о событии.

Так что - чтобы точно все получилось - сделайте эффект и добавьте его в скилл.
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…