Задержка после выполнения команды.
Имеется скрипт бафера, как сделать задержку, дабы не флудили бафами и хилами, сервет ляжет :D :redlol:
Вот код: /* * Copyright (C) 2004-2013 L2J DataPack * * This file is part of L2J DataPack. * * L2J DataPack is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * L2J DataPack is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package handlers.bypasshandlers; import java.util.StringTokenizer; import java.util.logging.Level; import com.l2jserver.gameserver.handler.IBypassHandler; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.zone.ZoneId; /** * @author Xaras2 */ public class ArenaBuff implements IBypassHandler { private static final String[] COMMANDS = { "ArenaBuffs", "HPRecovery", "CPRecovery" }; private final int[][] BUFFS = { { // Fighter Buffs 6803, 6804, 6808, 6809, 6811, 6812, 6805, 6806, 6807 }, { // Mage Buffs 6803, 6804, 6808, 6809, 6811, 6812, 6805, 6806, 6807 } }; @Override public boolean useBypass(String command, L2PcInstance activeChar, L2Character target) { if (!target.isNpc()) { return false; } final L2Npc npc = (L2Npc) target; final StringTokenizer st = new StringTokenizer(command); try { String cmd = st.nextToken(); if (cmd.equalsIgnoreCase(COMMANDS[0])) { for (int skillId : BUFFS[activeChar.isMageClass() ? 1 : 0]) { SkillHolder skill = new SkillHolder(skillId, 1); if (skill.getSkill() != null) { npc.setTarget(activeChar); npc.doCast(skill.getSkill()); } } return true; } else if (cmd.equalsIgnoreCase(COMMANDS[1])) //Heal { if (activeChar.isInsideZone(ZoneId.PVP)) // Cannot be used while inside the pvp zone { return false; } SkillHolder skill = new SkillHolder(6817, 1); if (skill.getSkill() != null) { npc.setTarget(activeChar); npc.doCast(skill.getSkill()); } return true; } } catch (Exception e) { _log.log(Level.WARNING, "Exception in " + getClass().getSimpleName(), e); } return false; } @Override public String[] getBypassList() { return COMMANDS; } } |
Re: Задержка после выполнения команды.
Код:
Thread.sleep(ms) Или снова ждете пока сделают за вас? |
Re: Задержка после выполнения команды.
Цитата:
Можно воспользоваться обыкновенным таймером, то есть считывать системное время в переменную при бафе и прибавлять к ней некоторый промежуток времени на который вы хотите запретить повторное использование и проверять перед повторным использованием. Или же можно воспользоваться ThredPoolManager. |
Re: Задержка после выполнения команды.
Цитата:
и тут простым таймером не обойтись, я так понимаю таймер каждому игроку надо делать и в БД сохранять желательно, а то так не дождешся очереди на свой баф. |
Re: Задержка после выполнения команды.
Цитата:
|
Re: Задержка после выполнения команды.
А если баф в отдельный поток и его стопать? Или слишком затратно?
|
Re: Задержка после выполнения команды.
Цитата:
"ArenaBuffs", "HPRecovery", "CPRecovery" на каждую свой массив. + при рестарте сервера откаты пропадают, а если задумка автора делать КД раз в сутки? |
Re: Задержка после выполнения команды.
Команды две, аренабафс и хпрекавер, цпрекавер удалить забыл:)
Ну мне просто нужно сделать задержку хотя бы 30сек. |
Re: Задержка после выполнения команды.
Цитата:
Цитата:
|
Re: Задержка после выполнения команды.
Если рассуждать с точки зрения нагрузки, джентльмены, то выгоднее всего выдавать баффы бессрочно сразу при заходе чара, в пакете EnterWorld, а после смерти не обнулять их.
|
Re: Задержка после выполнения команды.
Цитата:
|
Re: Задержка после выполнения команды.
/* * Copyright (C) 2004-2013 L2J DataPack * * This file is part of L2J DataPack. * * L2J DataPack is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * L2J DataPack is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package handlers.bypasshandlers; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.logging.Level; import com.l2jserver.gameserver.handler.IBypassHandler; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.zone.ZoneId; /** * @author Xaras2 */ public class ArenaBuff implements IBypassHandler { private static ConcurrentMap<Integer, Map<String, Long>> _map = new ConcurrentHashMap<>(); private static final String[] COMMANDS = { "ArenaBuffs", "HPRecovery" }; private final int[][] BUFFS = { { // Fighter Buffs 6803, 6804, 6808, 6809, 6811, 6812, 6805, 6806, 6807 }, { // Mage Buffs 6803, 6804, 6808, 6809, 6811, 6812, 6805, 6806, 6807 } }; @Override public boolean useBypass(String command, L2PcInstance activeChar, L2Character target) { if (!target.isNpc()) { return false; } final L2Npc npc = (L2Npc) target; final StringTokenizer st = new StringTokenizer(command); try { String cmd = st.nextToken(); _map.putIfAbsent(activeChar.getObjectId(), new HashMap<String, Long>()); if (cmd.equalsIgnoreCase(COMMANDS[0])) { if (_map.get(activeChar.getObjectId()).get(cmd) != null) { if (_map.get(activeChar.getObjectId()).get(cmd) > System.currentTimeMillis()) { activeChar.sendMessage("Покури пока, браток."); return false; } _map.get(activeChar.getObjectId()).clear(); } for (int skillId : BUFFS[activeChar.isMageClass() ? 1 : 0]) { SkillHolder skill = new SkillHolder(skillId, 1); if (skill.getSkill() != null) { npc.setTarget(activeChar); npc.doCast(skill.getSkill()); _map.get(activeChar.getObjectId()).put(cmd, System.currentTimeMillis() + 15000); // текущее время + 15 сек задержка } } return true; } else if (cmd.equalsIgnoreCase(COMMANDS[1])) // Heal { if (_map.get(activeChar.getObjectId()).get(cmd) != null) { if (_map.get(activeChar.getObjectId()).get(cmd) > System.currentTimeMillis()) { activeChar.sendMessage("Покури пока, браток."); return false; } _map.get(activeChar.getObjectId()).clear(); } if (activeChar.isInsideZone(ZoneId.PVP)) // Cannot be used while inside the pvp zone { return false; } SkillHolder skill = new SkillHolder(6817, 1); if (skill.getSkill() != null) { npc.setTarget(activeChar); npc.doCast(skill.getSkill()); _map.get(activeChar.getObjectId()).put(cmd, System.currentTimeMillis() + 15000); // текущее время + 15 сек задержка } return true; } } catch (Exception e) { _log.log(Level.WARNING, "Exception in " + getClass().getSimpleName(), e); } return false; } @Override public String[] getBypassList() { return COMMANDS; } } |
Re: Задержка после выполнения команды.
Ashe, в самом начале же все перетираешь, жесть/
Потроллил бы уже с putIfAbsent |
Re: Задержка после выполнения команды.
Цитата:
_map.putIfAbsent(activeChar.getObjectId(), new HashMap<String, Long>()); |
Re: Задержка после выполнения команды.
Цитата:
Добавлено через 1 минуту с чего вообще тс взял что из-за частого бафа что-то ляжет? |
Re: Задержка после выполнения команды.
Цитата:
Цитата:
Код:
_ioPacketsThreadPool = new ThreadPoolExecutor(Config.IO_PACKET_THREAD_CORE_SIZE, Integer.MAX_VALUE, 5L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new PriorityThreadFactory("I/O Packet Pool", Thread.NORM_PRIORITY + 1)); весь сервер не повиснет от заслипливания скрипта,но если вы так уж дословно придираетесь то пусть будет так "зависнет один из потоков обрабатывающий пакеты игрока". |
Re: Задержка после выполнения команды.
Если я правильно понял суть проблемы, то в баффер создаем мапу:
private Map<Integer, Long> lastUse = new ConcurrentHashMap<>;в методе "баффа" добавляем проверку: // Проверяем когда последний раз юзали метод, если давно -> добавляем время последнего использования. int charID = player.getObjectId(); long currentTime = System.currentTimeMillis(); if (!lastUse.containsKey(charID ) || lastUse.get(charID) + 100 < currentTime) lastUse.put(charID, currentTime); else // иначе запрещаем использование метода. return; |
Re: Задержка после выполнения команды.
Ro_0TT, не совсем правильно. В бафере есть 2 команды, которые также должны учитываться, либо создавать две карты, либо мой вариант.
|
Re: Задержка после выполнения команды.
Цитата:
|
Re: Задержка после выполнения команды.
Цитата:
Цитата:
KID это уже подметил. |
Re: Задержка после выполнения команды.
тема вообще бесполезная... автор придумал проблему из ничего...
|
Re: Задержка после выполнения команды.
Цитата:
Добавлено через 4 минуты В любом случае весь этот кусок бафера - просто ужасно написан, пишите по новой, использовать этот код крайне опасно для общего аромата вашего сервера. Использовать concurrent карту для этого дела несколько толсто |
Текущее время: 05:44. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot