06-25-2013, 07:53 PM
MHard Написал:ну не весь сервер а поток игрока заснет..
ооо, теперь сборки клепают по принципу 1 поток равно игрок?
Задержка после выполнения команды.
|
06-25-2013, 07:53 PM
MHard Написал:ну не весь сервер а поток игрока заснет.. ооо, теперь сборки клепают по принципу 1 поток равно игрок?
06-25-2013, 08:02 PM
[SRC="java"]
/* * Copyright © 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; } }[/SRC]
Fortuna - non penis, in manus non recipe.
06-25-2013, 08:08 PM
Ashe, в самом начале же все перетираешь, жесть/
Потроллил бы уже с putIfAbsent
06-25-2013, 08:13 PM
KID Написал:Ashe, в самом начале же все перетираешь, жесть/ Ты про это ? [SRC="java"]_map.putIfAbsent(activeChar.getObjectId(), new HashMap<String, Long>());[/SRC]
Fortuna - non penis, in manus non recipe.
MHard Написал:ну не весь сервер а поток игрока заснет.заснет не поток игрока, а один из потоков пула, который обрабатывает входящие пакеты Добавлено через 1 минуту с чего вообще тс взял что из-за частого бафа что-то ляжет? KID Написал:ооо, теперь сборки клепают по принципу 1 поток равно игрок? linliss Написал:заснет не поток игрока, а один из потоков пула, который обрабатывает входящие пакеты суть от того что подвиснет один из потоков этих пулов Код: _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)); , не меняется весь сервер не повиснет от заслипливания скрипта,но если вы так уж дословно придираетесь то пусть будет так "зависнет один из потоков обрабатывающий пакеты игрока".
06-25-2013, 09:53 PM
Если я правильно понял суть проблемы, то в баффер создаем мапу:
[src="java"] private Map<Integer, Long> lastUse = new ConcurrentHashMap<>; [/src] в методе "баффа" добавляем проверку: [src="java"] // Проверяем когда последний раз юзали метод, если давно -> добавляем время последнего использования. int charID = player.getObjectId(); long currentTime = System.currentTimeMillis(); if (!lastUse.containsKey(charID ) || lastUse.get(charID) + 100 < currentTime) lastUse.put(charID, currentTime); else // иначе запрещаем использование метода. return; [/src]
Ищу работу: Java-разработчик Skype: ro_0tt
06-25-2013, 10:02 PM
Ro_0TT, не совсем правильно. В бафере есть 2 команды, которые также должны учитываться, либо создавать две карты, либо мой вариант.
Fortuna - non penis, in manus non recipe.
06-25-2013, 11:02 PM
Ashe Написал:Таким способом Вы "повесите" весь сервер. Использовал данный момент когда писал клиенту с 1500 онлайн баффера (по его запросу) ничего кроме этого потока не висло.
06-25-2013, 11:25 PM
Ashe Написал:Ro_0TT, не совсем правильно. В бафере есть 2 команды, которые также должны учитываться, либо создавать две карты, либо мой вариант. По аналогии создать новый объект, в котором будет 2 переменных времени для двух команд. Еще красивее получается.. в этом же объекте проверять время и обновлять его по нужде, а при использование только запрещать использование команд. Ashe Написал:[SRC="java"] Тролинг?) Вы здесь принудительно добавляете данные (заменяя старые), дальнейшие проверки с нею бессмысленны. KID это уже подметил.
Ищу работу: Java-разработчик Skype: ro_0tt
|
« Предыдущая | Следующая »
|