Активный скил проигрывающий музыку.

Тема в разделе "Manuals / Мануалы", создана пользователем DeadPool, 27 авг 2018.

  1. DeadPool

    DeadPool Пляшущий с бубном
    Постоялец

    Регистрация:
    10 ноя 2017
    Сообщения:
    144
    Симпатии:
    79
    Skype:
    poshlya4ok666
    Доброго времени суток, уважаемые форумчане
    Речь пойдет о создании умения, которое будет проигрывать указанный Вами звук клиента из папки Music для First-Team и подобных.
    Итак начнем
    идем по пути в исходниках:
    l2ft\gameserver\skills\skillclasses
    создаем новый класс с названием Sound.java и содержимым:
    Код:
    package l2ft.gameserver.skills.skillclasses;
    
    import java.util.List;
    
    import l2ft.gameserver.model.Creature;
    import l2ft.gameserver.model.Skill;
    import l2ft.gameserver.network.l2.s2c.PlaySound;
    import l2ft.gameserver.templates.StatsSet;
    
    public class Sound extends Skill
    {
        private String _sound;
       
        public Sound(final StatsSet set)
        {
            super(set);
           
            _sound = set.getString("Sound", "");
        }
       
        @Override
        public void useSkill(final Creature activeChar, final List<Creature> targets)
        {
            if(!activeChar.isPlayable())
                return;
            activeChar.getPlayer().sendPacket(new PlaySound(PlaySound.Type.MUSIC, _sound, 0, 0, 0, 0, 0));
        }
    }
    
    сохраняем, далее идем по пути
    l2ft/gameserver/model
    открываем класс Skill.java
    добавляем импорт на наш созданный класс:
    Код:
    import l2ft.gameserver.skills.skillclasses.Sound;
    
    Далее ищем:
    Код:
    public static enum SkillType
    {
         //тут должен быть код, в самый низ нужно добавить вот это:
         SOUND(Sound.class);
         //не забываем в строке выше добавленной заменить ";" на ","
    }
    
    На этом модификация ядра завершена, идем в датапак, в скилы
    Создаем скил такого вида:
    Код:
    <skill id="999999" levels="1" name="Маэстро музыку" >
            <set name="icon" val="BranchSys.icon.br_headphone_i00" />
            <set name="magicLevel" val="1" />
            <set name="target" val="TARGET_SELF" />
            <set name="skillType" val="SOUND" /> <!-- Тип нашего скила -->
            <set name="operateType" val="OP_ACTIVE" /> <!-- Скил обязательно должен быть активным -->
            <set name="Sound" val="nightwish_dead_to_the_world" /> <!-- Название звука из папки клиента music который хотим слушать (без формата, только имя файла) -->
        </skill>
    
    Ну вот и все на этом, дело за малым, отрисовать скил в датниках (skillgrp.dat и skillname-e(ru).dat) клиента и пользоваться
    P.S. кому пригодилось ставим лайки, посмотрим сколько нас помешанных :D

    [ENGLISH]
    Good day, dear forum users
    It's about creating a skill that will play the sound of the client you specified from the Music folder for First-Team and the like.
    So let's start
    go along the path in the source code:
    l2ft\gameserver\skills\skillclasses
    create a new class called Sound.java and content:
    Код:
    package l2ft.gameserver.skills.skillclasses;
    
    import java.util.List;
    
    import l2ft.gameserver.model.Creature;
    import l2ft.gameserver.model.Skill;
    import l2ft.gameserver.network.l2.s2c.PlaySound;
    import l2ft.gameserver.templates.StatsSet;
    
    public class Sound extends Skill
    {
       private String _sound;
       
       public Sound(final StatsSet set)
       {
           super(set);
         
           _sound = set.getString("Sound", "");
       }
       
       @Override
       public void useSkill(final Creature activeChar, final List<Creature> targets)
       {
           if(!activeChar.isPlayable())
               return;
           activeChar.getPlayer().sendPacket(new PlaySound(PlaySound.Type.MUSIC, _sound, 0, 0, 0, 0, 0));
       }
    }
    
    save, then go along the way
    l2ft/gameserver/model
    open the Skill class.java
    add import to our created class:
    Код:
    import l2ft.gameserver.skills.skillclasses.Sound;
    
    Next, look for:
    Код:
    public static enum SkillType
    {
        //here should be code to the bottom you need to add this:
        SOUND(Sound.class);
        //do not forget to replace ";" with the line above ","
    }
    
    On this modification of the kernel is complete, go to datapak, in skills
    Create a skill of this kind:
    Код:
    <skill id="999999" levels="1" name="Maestro music" >
           <set name="icon" val="BranchSys.icon.br_headphone_i00" />
           <set name="magicLevel" val="1" />
           <set name="target" val="TARGET_SELF" />
           <set name="skillType" val="SOUND" /> <!-- Type of our skill -->
           <set name="operateType" val="OP_ACTIVE" /> <!-- A skill necessarily should be active -->
           <set name="Sound" val="nightwish_dead_to_the_world" /> <!-- The name of the sound from the folder of the music client you want to listen to (no format, only the file name) -->
       </skill>
    
    Well, it is small, draw skill in *.dat (skillgrp.dat and skillname-e(ru).dat) of the client and to use
    P. S. who came in handy, put the like, let's see how many of us are addicted
    :D
    P.S.S. Ув. Администраторы и Модераторы, прикрепите пожалуйста к посту выше, не могу отредактировать
     
    #1 DeadPool, 27 авг 2018
    Последнее редактирование модератором: 28 авг 2018
    FoXeG, 4ydo и Maiden7 нравится это.
  2. Gaikotsu

    Gaikotsu Участник

    Регистрация:
    22 май 2018
    Сообщения:
    7
    Симпатии:
    11
    Вобще-то лучше делать на эффекте и в более универсальном виде, чем плодить и так чрезмерно большое количество скилтайпов :)

    Эффект:
    Код:
    package l2p.gameserver.model.skills.effects;
    
    import org.apache.commons.lang3.StringUtils;
    
    import l2p.gameserver.enums.SoundType;
    import l2p.gameserver.model.skills.Effect;
    import l2p.gameserver.network.s2c.PlaySound;
    import l2p.gameserver.stats.Env;
    
    public class EffectPlaySound extends Effect
    {
    	private final String _soundFile;
    	private final SoundType _soundType;
    	private final boolean _stopOnExit;
    
    	public EffectPlaySound(Env env, EffectTemplate template)
    	{
    		super(env, template);
    
    		_soundFile = template.getParams().getString("soundFile", StringUtils.EMPTY);
    		_soundType = template.getParams().getEnum("soundType", SoundType.class, SoundType.MUSIC);
    		_stopOnExit = template.getParams().getBool("stopOnExit", true);
    	}
    
    	@Override
    	public void onStart()
    	{
    		super.onStart();
    
    		if (_effected.isPlayer())
    			_effected.sendPacket(new PlaySound(_soundType, _soundFile, 0, 0, 0, 0, 0));
    	}
    
    	@Override
    	public void onExit()
    	{
    		super.onExit();
    
    		if (_stopOnExit && _effected.isPlayer())
    			_effected.sendPacket(new PlaySound(_soundType, StringUtils.EMPTY, 0, 0, 0, 0, 0));
    	}
    
    	@Override
    	public boolean isHidden()
    	{
    		return true;
    	}
    }
    
    Используемый энум:
    Код:
    package l2p.gameserver.enums;
    
    public enum SoundType
    {
    	SOUND,
    	MUSIC,
    	VOICE
    }
    
    Пример использования:
    Код:
    	<skill id="99999" levels="1" name="Ля-ля-ля">
    		<stat name="icon" value="icon.skill0000" />
    		<stat name="magicType" value="2" />
    		<stat name="magicLevel" value="1" />
    		<stat name="hitTime" value="1500" />
    		<stat name="target" value="SELF" />
    		<stat name="skillType" value="EFFECT" />
    		<stat name="operateType" value="OP_ACTIVE" />
    		<for>
    			<effect name="PlaySound">
    				<def name="soundFile" value="br_music_theme_park" />
    				<def name="soundType" value="MUSIC" />
    			</effect>
    		</for>
    	</skill>
    
     
  3. DeadPool

    DeadPool Пляшущий с бубном
    Постоялец

    Регистрация:
    10 ноя 2017
    Сообщения:
    144
    Симпатии:
    79
    Skype:
    poshlya4ok666
    ну так раз лучше, почему раньше не выложили?
     
  4. OVERLORD

    OVERLORD Активный участник

    Регистрация:
    28 июн 2018
    Сообщения:
    46
    Симпатии:
    27
    Skype:
    078367
    потому что всем лень, тут походу одни кодеры =))) вообще на форме !!
     
    DeadPool нравится это.
  5. Gaikotsu

    Gaikotsu Участник

    Регистрация:
    22 май 2018
    Сообщения:
    7
    Симпатии:
    11
    Я вобще мимо проходил :)
    А вобще - это уж очень примитивные вещи и по моему только самый-самый новичок в программировании не сможет такого сделать.
     
    DeadPool и OVERLORD нравится это.
  6. DeadPool

    DeadPool Пляшущий с бубном
    Постоялец

    Регистрация:
    10 ноя 2017
    Сообщения:
    144
    Симпатии:
    79
    Skype:
    poshlya4ok666
    ну так тут форум администраторов а не программистов, многие не знают как сбросить респаун эпиков, многим и это будет трудно сделать, да и подобное для начинающих и пишут, кто захочет реализует у себя тот или иной вид, кому как по вкусу
     
  7. Gaikotsu

    Gaikotsu Участник

    Регистрация:
    22 май 2018
    Сообщения:
    7
    Симпатии:
    11
    Кстати вдогонку еще - подобная реализация подойдет разве что для чего-то, в чем надо явно заюзать скилл для начала воспроизведения музыки.
    А вот в тех же наушниках, скилл является пассивкой, срабатывающей при одевании этого головного убора и выключающийся при его снятии.
    Пример:
    Код:
    skill_begin    skill_name = [s_br_headphone_music_a]    /* [테마 - 타운] */    skill_id = 21092    level = 1    operate_type = P    magic_level = 1    special_level = 0    magic_critical_rate = 5    change_skill_id = 0    self_effect = {}    effect = {{p_play_music;0}}    multi_class = 0    skill_end
    
    Так что тут реализовывать или через триггеры реагирующие на одевание/снимание и через них автоматом кастовать/стопать скилл по необходимости...
    ... или же пойти более легким путем, и реализовать все через простейший листенер наподобие такого...
    Код:
    package listeners.items;
    
    import gnu.trove.map.hash.TIntIntHashMap;
    import l2p.gameserver.enums.SoundType;
    import l2p.gameserver.listener.item.OnItemEquipListener;
    import l2p.gameserver.model.Playable;
    import l2p.gameserver.model.actor.listener.ItemListenerList;
    import l2p.gameserver.model.items.ItemInstance;
    import l2p.gameserver.network.s2c.PlaySound;
    import l2p.gameserver.scripts.ScriptFile;
    
    /**
     * @author Gaikotsu
     */
    public class Headphone implements ScriptFile
    {
        private static final String[] _music = {
            "br_music_Town",
            "br_music_Hero",
            "br_music_theme_park" };
    
        private static final ItemEquipListener _itemEquipListener = new ItemEquipListener();
        private static final TIntIntHashMap _items = new TIntIntHashMap();
    
        static
        {
            // item id, music id
            _items.put(20613, 0); // Headphone [Town Theme]
            _items.put(20614, 1); // Headphone [Hero Theme]
            _items.put(20615, 2); // Headphone [Theme Theme]
            _items.put(20616, 0); // Headphone [Town Theme: Great Adventurer's Soul Power (7-day)]
            _items.put(20617, 1); // Headphone [Hero Theme: Brave Warrior's Soul Power (7-day)]
            _items.put(20618, 2); // Headphone [Theme Park: Great Wizard's Soul Power (7-day)]
        };
    
        @Override
        public void onLoad()
        {
            ItemListenerList.addGlobal(_itemEquipListener);
        }
    
        @Override
        public void onReload()
        {
            ItemListenerList.removeGlobal(_itemEquipListener);
        }
    
        @Override
        public void onShutdown()
        {}
    
        public static class ItemEquipListener implements OnItemEquipListener
        {
            @Override
            public void onEquip(ItemInstance item, Playable actor)
            {
                actor.sendPacket(new PlaySound(SoundType.MUSIC, _music[_items.get(item.getId())], 0, 0, 0, 0, 0));
            }
    
            @Override
            public void onUnequip(ItemInstance item, Playable actor)
            {
                actor.sendPacket(new PlaySound(SoundType.MUSIC, "", 0, 0, 0, 0, 0));
            }
    
            @Override
            public boolean checkCondition(ItemInstance item)
            {
                return _items.containsKey(item.getId());
            }
        }
    }
    
    P.S. Это листенер, регистрирующийся только на отдельные определенные предметы, если что, а не стандартный листенер equip/unequp в овере, регающийся на все вещи в инвентаре.
    Конечно можно повесить и на стандартный, но кода будет больше, да и смысл дергать такой листенер для всех предметов, когда он нужен всего для нескольких.
     

Партнеры