Доброго времени суток, уважаемые форумчане Речь пойдет о создании умения, которое будет проигрывать указанный Вами звук клиента из папки 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. кому пригодилось ставим лайки, посмотрим сколько нас помешанных [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 P.S.S. Ув. Администраторы и Модераторы, прикрепите пожалуйста к посту выше, не могу отредактировать
Вобще-то лучше делать на эффекте и в более универсальном виде, чем плодить и так чрезмерно большое количество скилтайпов Эффект: Код: 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>
Я вобще мимо проходил А вобще - это уж очень примитивные вещи и по моему только самый-самый новичок в программировании не сможет такого сделать.
ну так тут форум администраторов а не программистов, многие не знают как сбросить респаун эпиков, многим и это будет трудно сделать, да и подобное для начинающих и пишут, кто захочет реализует у себя тот или иной вид, кому как по вкусу
Кстати вдогонку еще - подобная реализация подойдет разве что для чего-то, в чем надо явно заюзать скилл для начала воспроизведения музыки. А вот в тех же наушниках, скилл является пассивкой, срабатывающей при одевании этого головного убора и выключающийся при его снятии. Пример: Код: 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 в овере, регающийся на все вещи в инвентаре. Конечно можно повесить и на стандартный, но кода будет больше, да и смысл дергать такой листенер для всех предметов, когда он нужен всего для нескольких.