BadStealth 11 Опубликовано 12 марта, 2016 Ребят голову уже всю сломал. В общем восстановил ивент Trick Of Trans, все нормально спавнится и удаляется. Но вот сундуки открыть с помощью ключа никак не могу. И скил к ключу прописал и все остальное. Никак- при использовании ключа получаю агр от сундука. Но как сделать чтобы при использовании скила ключа- сундук умирал. т.е. .doDie. Может кто доработать код- чтобы при использовании скила ключа- сундуки умирали. package events.TrickOfTrans; import l2p.Config; import l2p.extensions.scripts.Functions; import l2p.extensions.scripts.ScriptFile; import l2p.gameserver.Announcements; import l2p.gameserver.model.L2Character; import l2p.gameserver.model.L2Player; import l2p.gameserver.model.L2Spawn; import l2p.util.Files; import l2p.util.GArray; import l2p.util.Rnd; import java.util.logging.Logger; import l2p.gameserver.model.instances.L2NpcInstance; import l2p.extensions.scripts.ScriptEventType; import l2p.gameserver.cache.Msg; import l2p.gameserver.model.L2ObjectsStorage; import l2p.gameserver.model.instances.L2MonsterInstance; import l2p.util.Util; import l2p.gameserver.model.L2Skill; import l2p.gameserver.tables.SkillTable; /** * Development by L2Phoenix * Trick Of Transmutation Event */ public class TrickOfTrans extends Functions implements ScriptFile { private static final Logger _log = Logger.getLogger(TrickOfTrans.class.getName()); // Эвент Менеджеры private static final int EVENT_MANAGER_ID = 32132; // Alchemist\'s Servitor private static final int CHESTS_ID = 13036; // Alchemist\'s Chest // Рецепты private static final int RED_PSTC = 9162; // Red Philosopher''s Stone Transmutation Circle private static final int BLUE_PSTC = 9163; // Blue Philosopher''s Stone Transmutation Circle private static final int ORANGE_PSTC = 9164; // Orange Philosopher''s Stone Transmutation Circle private static final int BLACK_PSTC = 9165; // Black Philosopher''s Stone Transmutation Circle private static final int WHITE_PSTC = 9166; // White Philosopher''s Stone Transmutation Circle private static final int GREEN_PSTC = 9167; // Green Philosopher''s Stone Transmutation Circle // Награды private static final int RED_PSTC_R = 9171; // Red Philosopher''s Stone private static final int BLUE_PSTC_R = 9172; // Blue Philosopher''s Stone private static final int ORANGE_PSTC_R = 9173; // Orange Philosopher''s Stone private static final int BLACK_PSTC_R = 9174; // Black Philosopher''s Stone private static final int WHITE_PSTC_R = 9175; // White Philosopher''s Stone private static final int GREEN_PSTC_R = 9176; // Green Philosopher''s Stone // Ключ private static final int A_CHEST_KEY = 9205; // Alchemist''s Chest Key // Ингридиенты private static final int PhilosophersStoneOre = 9168; // Philosopher''s Stone Ore private static final int PhilosophersStoneOreMax = 17; // Максимальное Кол-во private static final int PhilosophersStoneConversionFormula = 9169; // Philosopher''s Stone Conversion Formula private static final int MagicReagents = 9170; // Magic Reagents private static final int MagicReagentsMax = 30; // Максимальное Кол-во private static GArray<L2Spawn> _em_spawns = new GArray<L2Spawn>(); private static GArray<L2Spawn> _ch_spawns = new GArray<L2Spawn>(); private static boolean _active = false; @Override public void onLoad() { if(isActive()) { _active = true; spawnEventManagers(); // addEventId(ScriptEventType.ON_DIE); // addEventId(ScriptEventType.ON_ENTER_WORLD); System.out.println("Loaded Event: Trick of Trnasmutation [state: activated]"); } else { System.out.println("Loaded Event: Trick of Trnasmutation [state: deactivated]"); } } /*** Читает статус эвента из базы.***/ private static boolean isActive() { return IsActive("trickoftrans"); } /*** Запускает эвент***/ public void startEvent() { L2Player player = (L2Player) getSelf(); if(!player.getPlayerAccess().IsEventGm) { return; } if(SetActive("trickoftrans", true)) { // addEventId(ScriptEventType.ON_DIE); // addEventId(ScriptEventType.ON_ENTER_WORLD); spawnEventManagers(); System.out.println("Event: 'Trick of Transmutation' started."); Announcements.getInstance().announceByCustomMessage("scripts.events.TrickOfTrans.AnnounceEventStarted", null); } else { player.sendMessage("Event: 'Trick of Transmutation' already started."); } _active = true; show(Files.read("data/html/admin/events.htm", player), player); } /*** Останавливает эвент***/ public void stopEvent() { L2Player player = (L2Player) getSelf(); if(!player.getPlayerAccess().IsEventGm) { return; } if(SetActive("trickoftrans", false)) { // removeEventId(ScriptEventType.ON_DIE); // removeEventId(ScriptEventType.ON_ENTER_WORLD); unSpawnEventManagers(); System.out.println("Event: 'Trick of Transmutation' stopped."); Announcements.getInstance().announceByCustomMessage("scripts.events.TrickOfTrans.AnnounceEventStoped", null); } else { player.sendMessage("Event: 'Trick of Transmutation' not started."); } _active = false; show(Files.read("data/html/admin/events.htm", player), player); } /*** Анонсируется при заходе игроком в мир***/ // @Override public static void OnPlayerEnter(int objectId) { if(_active) { L2Player player = L2ObjectsStorage.getPlayer(objectId); Announcements.getInstance().announceToPlayerByCustomMessage(player, "scripts.events.TrickOfTrans.AnnounceEventStarted", null); } } /*** Спавнит эвент менеджеров***/ private void spawnEventManagers() { // Эвент Менеджер final int EVENT_MANAGERS[][] = { { 147992, 28616, -2295, 0 }, // Aden { 81919, 148290, -3472, 51432 }, // Giran { 18293, 145208, -3081, 6470 }, // Dion { -14694, 122699, -3122, 0 }, // Gludio { -81634, 150275, -3155, 15863 } // Gludin }; // Сундуки final int CHESTS[][] = { {148081, 28614, -2274, 2059 }, // Aden { 147918, 28615, -2295, 31471 }, // Aden { 147998, 28534, -2274, 49152 }, // Aden { 148053, 28550, -2274, 55621 }, // Aden { 147945, 28563, -2274, 40159 }, // Aden { 82012, 148286, -3472, 61567 }, // Giran { 81822, 148287, -3493, 29413 }, // Giran { 81917, 148207, -3493, 49152 }, // Giran { 81978, 148228, -3472, 53988 }, // Giran { 81851, 148238, -3472, 40960 }, // Giran { 18343, 145253, -3096, 7449 }, // Dion { 18284, 145274, -3090, 19740 }, // Dion { 18351, 145186, -3089, 61312 }, // Dion { 18228, 145265, -3079, 21674 }, // Dion { 18317, 145140, -3078, 55285 }, // Dion { -14584, 122694, -3122, 65082 }, // Gludio { -14610, 122756, -3143, 13029 }, // Gludio { -14628, 122627, -3122, 50632 }, // Gludio { -14697, 122607, -3143, 48408 }, // Gludio { -14686, 122787, -3122, 12416 }, // Gludio { -81745, 150275, -3134, 32768 }, // Gludin { -81520, 150275, -3134, 0 }, // Gludin { -81628, 150379, -3134, 16025 }, // Gludin { -81696, 150347, -3155, 22854 }, // Gludin { -81559, 150332, -3134, 3356 }, // Gludin }; SpawnNPCs(EVENT_MANAGER_ID, EVENT_MANAGERS, _em_spawns); SpawnNPCs(CHESTS_ID, CHESTS, _ch_spawns); } /*** Удаляет спавн эвент менеджеров***/ private void unSpawnEventManagers() { deSpawnNPCs(_em_spawns); deSpawnNPCs(_ch_spawns); } @Override public void onReload() { unSpawnEventManagers(); } @Override public void onShutdown() { unSpawnEventManagers(); } /*** Обработчик смерти мобов, управляющий эвентовым дропом***/ // @Override public static void OnDie(final L2Character cha, final L2Character killer) { if(_active && SimpleCheckDrop(cha, killer) && Rnd.get(1000) <= Config.EVENT_TRICK_OF_TRANS_CHANCE * killer.getPlayer().getRateItems() * Config.RATE_DROP_ITEMS * ((L2NpcInstance) cha).getTemplate().rateHp) ((L2NpcInstance) cha).dropItem(killer.getPlayer(), A_CHEST_KEY, 1); } public void accept() { L2Player player = (L2Player) getSelf(); if(!player.isQuestContinuationPossible(true)) { return; } if(!player.findRecipe(RED_PSTC_R)) { addItem(player, RED_PSTC, 1); } if(!player.findRecipe(BLACK_PSTC_R)) { addItem(player, BLACK_PSTC, 1); } if(!player.findRecipe(BLUE_PSTC_R)) { addItem(player, BLUE_PSTC, 1); } if(!player.findRecipe(GREEN_PSTC_R)) { addItem(player, GREEN_PSTC, 1); } if(!player.findRecipe(ORANGE_PSTC_R)) { addItem(player, ORANGE_PSTC, 1); } if(!player.findRecipe(WHITE_PSTC_R)) { addItem(player, WHITE_PSTC, 1); } if(player.getVar("lang@") == null || player.getVar("lang@").equals("en")) { show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_01.htm", player), player); } else { show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_01_ru.htm", player), player); } } public void open() { L2Player player = (L2Player) getSelf(); if(getItemCount(player, A_CHEST_KEY) > 0) { removeItem(player, A_CHEST_KEY, 1); addItem(player, PhilosophersStoneOre, Rnd.get(1, PhilosophersStoneOreMax)); addItem(player, MagicReagents, Rnd.get(1, MagicReagentsMax)); if(Rnd.chance(80)) { addItem(player, PhilosophersStoneConversionFormula, 1); } if(player.getVar("lang@") == null || player.getVar("lang@").equals("en")) { show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_02.htm", player), player); } else { show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_02_ru.htm", player), player); } } else if(player.getVar("lang@") == null || player.getVar("lang@").equals("en")) { show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_03.htm", player), player); } else { show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_03_ru.htm", player), player); } } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BadStealth 11 Опубликовано 12 марта, 2016 ID скилла == 2322 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 12 марта, 2016 первый вариант: сундуку написать отдельное аи, в котором обрабатывать событие onEvtSeeSpell второй вариант: нафиг скилл в ключе - просто навешать на ключ хэндлер и в нем делать все что нужно Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BadStealth 11 Опубликовано 13 марта, 2016 (изменено) Посмотрел как реализовано в другой сборке и переделал по себя. Но вот чего не могу понять так это что за level package events.TrickOfTrans; import l2p.extensions.scripts.Functions; import l2p.gameserver.ai.Fighter; import l2p.gameserver.model.L2Skill; import l2p.gameserver.model.L2Character; import l2p.gameserver.model.L2Player; import l2p.gameserver.model.instances.L2NpcInstance; import l2p.gameserver.tables.SkillTable; import l2p.util.Files; import l2p.util.Rnd; import l2p.gameserver.model.instances.L2MonsterInstance; import l2p.gameserver.model.instances.L2SpecialMonsterInstance; /** * @ * @date 16.12.2010 * @time 14:46:26 */ public class AlchemistChest extends Fighter { // Рецепты private static final int RED_PSTC = 9162; // Red Philosopher''s Stone Transmutation Circle private static final int BLUE_PSTC = 9163; // Blue Philosopher''s Stone Transmutation Circle private static final int ORANGE_PSTC = 9164; // Orange Philosopher''s Stone Transmutation Circle private static final int BLACK_PSTC = 9165; // Black Philosopher''s Stone Transmutation Circle private static final int WHITE_PSTC = 9166; // White Philosopher''s Stone Transmutation Circle private static final int GREEN_PSTC = 9167; // Green Philosopher''s Stone Transmutation Circle // Ингридиенты private static final int PhilosophersStoneOre = 9168; // Philosopher''s Stone Ore private static final int PhilosophersStoneOreMax = 17; // Максимальное Кол-во private static final int PhilosophersStoneConversionFormula = 9169; // Philosopher''s Stone Conversion Formula private static final int MagicReagents = 9170; // Magic Reagents private static final int MagicReagentsMax = 30; // Максимальное Кол-во private static final int A_CHEST_KEY = 9205; // Alchemist''s Chest Key private static final int[] lowDrop = new int[] { RED_PSTC, BLUE_PSTC, ORANGE_PSTC, BLACK_PSTC, WHITE_PSTC, GREEN_PSTC, PhilosophersStoneConversionFormula }; public AlchemistChest(L2Character actor) { super(actor); } @Override protected void onEvtSeeSpell(L2Skill skill, L2Character caster) { L2NpcInstance actor = getActor(); if(actor == null || actor.isDead() || skill == null || !caster.isPlayer()) return; L2Player player = caster.getPlayer(); int level = player.getLevel(); if(skill.getId() == 2322) { actor.doDie(player); if(Rnd.chance(30)) { switch (Rnd.get(3)) { case 0: Functions.addItem(player, lowDrop[Rnd.get(7)], 1); break; case 1: Functions.addItem(player, MagicReagents, Rnd.get(1, MagicReagentsMax)); break; case 2: Functions.addItem(player, PhilosophersStoneOre, Rnd.get(1, PhilosophersStoneOreMax)); break; } Functions.show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_02_ru.htm", player), player, null); } else if(Rnd.chance(70)) { // что за формула? оО int count = 20000 + level / 20 * 2500;//было 25000 слишком много адены давало; int rr = Rnd.get(count) / 3; count = count + rr - count / 6; Functions.addItem(player, 57, count); } } else if(level > 60) { Functions.show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_03.htm", player), player, null); actor.doCast(SkillTable.getInstance().getInfo(264, 1), player, true); actor.doCast(SkillTable.getInstance().getInfo(1068, 2), player, true); actor.doCast(SkillTable.getInstance().getInfo(1036, 2), player, true); actor.doCast(SkillTable.getInstance().getInfo(1311, 3), player, true); } else if(level > 70) { Functions.show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_03.htm", player), player, null); actor.doCast(SkillTable.getInstance().getInfo(1068, 3), player, true); actor.doCast(SkillTable.getInstance().getInfo(1311, 6), player, true); actor.doCast(SkillTable.getInstance().getInfo(1310, 2), player, true); } else if(level > 80) { Functions.show(Files.read("data/scripts/events/TrickOfTrans/TrickOfTrans_03.htm", player), player, null); actor.doCast(SkillTable.getInstance().getInfo(1310, 4), player, true); actor.doCast(SkillTable.getInstance().getInfo(1308, 3), player, true); actor.doCast(SkillTable.getInstance().getInfo(310, 1), player, true); actor.doCast(SkillTable.getInstance().getInfo(275, 1), player, true); actor.doCast(SkillTable.getInstance().getInfo(1261, 1), player, true); } super.onEvtSeeSpell(skill, caster); } } За что отвечают эти else if(level > 70) Я думал за уровень перса- но нет ничего не происходит. Менял уровень и ничего. И там должно выводиться сообщение что нельзя открыть без ключа. Но чет я ничего не понял как оно должно работать. Изменено 13 марта, 2016 пользователем BadStealth Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты