imbaScorn 0 Опубликовано 31 июля, 2013 (изменено) Добрый вечер. Подскажите пожалуйста возможно ли убрать временную зону (5 минут после выхода из камалоки)? <reuse resetReuse="* * * * *" setUponEntry="false" sharedReuseGroup="1"/> Отката инста нет. Но приходится после выхода ждать 5 минут,что бы войти опять. Изменено 31 июля, 2013 пользователем imbaScorn Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
WesteroS 132 Опубликовано 31 июля, 2013 (изменено) если честно, вообще не пойму как связано задание крон/шедулед с тем, что Вы написали это задача выполняемая ежеминутно, и, наверное, проверка на состояние инстанс зоны Вам нужно в инстансменеджере искать (в ядре) значения Изменено 31 июля, 2013 пользователем WesteroS Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 <list> <!-- Gludio Castle Town: NPC Bathis (Level 23) --> <instance id="57" name="Kamaloka, Hall of the Abyss" maxChannels="10" collapseIfEmpty="10" timelimit="30" dispelBuffs="false"> <collapse on-party-dismiss="true" timer="60"/> <level min="18" max="28"/> <party min="2" max="6"/> <return loc="-13930 123748 -3120"/> <teleport loc="-88995 -220764 -7900"/> <remove itemId="0" count="0" necessary="false"/> <give itemId="0" count="0"/> <quest id="0"/> <reuse resetReuse="* * * * *" setUponEntry="false" sharedReuseGroup="1"/> <add_parameters> <param name="tele_device_loc" value="-89000 -220065 -7888"/> </add_parameters> <spawns> <!-- Tomlan Kamos --> <spawn mobId="18554" type="loc"> <coords loc="-88798 -219878 -7900 -7900"/> <coords loc="-88798 -220278 -7900 -7900"/> <coords loc="-89198 -220278 -7900 -7900"/> <coords loc="-89198 -219878 -7900 -7900"/> </spawn> </spawns> </instance> </list> Это xml инстанса самой камалоки. А где искать эту "проверка на состояние инстанс зоны" я не знаю. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 InstantZoneParser.java Но там я ни чего не увидел про время ожидания повторного входа. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 InstantZoneHolder.java package l2ft.gameserver.data.xml.holder; import java.util.ArrayList; import java.util.Collections; import java.util.List; import l2ft.commons.data.xml.AbstractHolder; import l2ft.commons.time.cron.SchedulingPattern; import l2ft.gameserver.model.Player; import l2ft.gameserver.templates.InstantZone; import org.napile.primitive.maps.IntObjectMap; import org.napile.primitive.maps.impl.HashIntObjectMap; public class InstantZoneHolder extends AbstractHolder { private static final InstantZoneHolder _instance = new InstantZoneHolder(); private IntObjectMap _zones = new HashIntObjectMap(); public static InstantZoneHolder getInstance() { return _instance; } public void addInstantZone(InstantZone zone) { _zones.put(zone.getId(), zone); } public InstantZone getInstantZone(int id) { return _zones.get(id); } private SchedulingPattern getResetReuseById(int id) { InstantZone zone = getInstantZone(id); return zone == null ? null : zone.getResetReuse(); } public int getMinutesToNextEntrance(int id, Player player) { SchedulingPattern resetReuse = getResetReuseById(id); if(resetReuse == null) return 0; Long time = null; if(getSharedReuseInstanceIds(id) != null && !getSharedReuseInstanceIds(id).isEmpty()) { List reuses = new ArrayList(); for(int i : getSharedReuseInstanceIds(id)) if(player.getInstanceReuse(i) != null) reuses.add(player.getInstanceReuse(i)); if(!reuses.isEmpty()) { Collections.sort(reuses); time = reuses.get(reuses.size() - 1); } } else time = player.getInstanceReuse(id); if(time == null) return 0; [color=#ff0000]return (int) Math.max((resetReuse.next(time) - System.currentTimeMillis()) / 60000L, 0);[/color] } public List getSharedReuseInstanceIds(int id) { if(getInstantZone(id).getSharedReuseGroup() < 1) return null; List sharedInstanceIds = new ArrayList(); for(InstantZone iz : _zones.values()) if(iz.getSharedReuseGroup() > 0 && getInstantZone(id).getSharedReuseGroup() > 0 && iz.getSharedReuseGroup() == getInstantZone(id).getSharedReuseGroup()) sharedInstanceIds.add(iz.getId()); return sharedInstanceIds; } public List getSharedReuseInstanceIdsByGroup(int groupId) { if(groupId < 1) return null; List sharedInstanceIds = new ArrayList(); for(InstantZone iz : _zones.values()) if(iz.getSharedReuseGroup() > 0 && iz.getSharedReuseGroup() == groupId) sharedInstanceIds.add(iz.getId()); return sharedInstanceIds; } @Override public int size() { return _zones.size(); } @Override public void clear() { _zones.clear(); } } То,что выделено красным это и есть то,что мне нужно? Если да то подскажите что значит 60000L Есть ли какой то конвертор времени? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 60000 если это в милсекундах то это 1 минута но не как ни 5( Помогите разобраться пожалуйста Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
WesteroS 132 Опубликовано 1 августа, 2013 холдер просто парсит значения из xml файлов, он никак не связан с тем, что ты ищешь у тебя во всех зонах так или в какой-то конкретной? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 Ну на HF стандартно 5 минут по идее после инста. Ну я по 3 камам бегал после каждой нужно было ждать,а я хочу убрать это время ожидания. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 return (int) Math.max((resetReuse.next(time) - System.currentTimeMillis()) / 60000L, 0);[/color То есть если я изменю значение 60000L ну скажем на 1 то у меня ни чего не изменится да? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 InstantZoneHolder.java и InstantZoneParser.java нашёл эти два файлы какой из них может мне помочь? Я просто уже всё перерыл. Подскажите как убрать это чёртово время после выхода из инста,что бы можно было сразу в инст входить. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 Может быть найдутся знатоки? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 (изменено) System.currentTimeMillis()) / 60000L, 0); Не помогло Изменено 1 августа, 2013 пользователем imbaScorn Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 Что ни кто не знает где в исходах можно править время отката после инста? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
HECKBuK 229 Опубликовано 1 августа, 2013 Что ни кто не знает где в исходах можно править время отката после инста? 300000 ищи это значение в ядре (можешь даже поиск по файлам всем юзать, с вероятностью в 99% ты найдешь это значение и не одно, дальше только прочесть название класса и понять для чего он Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 (изменено) ThreadPoolManager.java scheduleAtFixedRate(new RunnableImpl() { @Override public void runImpl() { _scheduledExecutor.purge(); _executor.purge(); } }, 300000L, 300000L); } Это оно? Изменено 1 августа, 2013 пользователем imbaScorn Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 (изменено) package l2ft.gameserver; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import l2ft.commons.threading.LoggingRejectedExecutionHandler; import l2ft.commons.threading.PriorityThreadFactory; import l2ft.commons.threading.RunnableImpl; import l2ft.commons.threading.RunnableStatsWrapper; public class ThreadPoolManager { private static final long MAX_DELAY = TimeUnit.NANOSECONDS.toMillis(Long.MAX_VALUE - System.nanoTime()) / 2; private static final ThreadPoolManager _instance = new ThreadPoolManager(); public static ThreadPoolManager getInstance() { return _instance; } private final ScheduledThreadPoolExecutor _scheduledExecutor; private final ThreadPoolExecutor _executor; private boolean _shutdown; private ThreadPoolManager() { _scheduledExecutor = new ScheduledThreadPoolExecutor(Config.SCHEDULED_THREAD_POOL_SIZE, new PriorityThreadFactory("ScheduledThreadPool", Thread.NORM_PRIORITY), new LoggingRejectedExecutionHandler()); _executor = new ThreadPoolExecutor(Config.EXECUTOR_THREAD_POOL_SIZE, Integer.MAX_VALUE, 5L, TimeUnit.SECONDS, new LinkedBlockingQueue(), new PriorityThreadFactory("ThreadPoolExecutor", Thread.NORM_PRIORITY), new LoggingRejectedExecutionHandler()); //Очистка каждые 5 минут scheduleAtFixedRate(new RunnableImpl() { @Override public void runImpl() { _scheduledExecutor.purge(); _executor.purge(); } }, 300000L, 300000L); } private long validate(long delay) { return Math.max(0, Math.min(MAX_DELAY, delay)); } public boolean isShutdown() { return _shutdown; } public Runnable wrap(Runnable r) { return Config.ENABLE_RUNNABLE_STATS ? RunnableStatsWrapper.wrap® : r; } public ScheduledFutureschedule(Runnable r, long delay) { return _scheduledExecutor.schedule(wrap®, validate(delay), TimeUnit.MILLISECONDS); } public ScheduledFuturescheduleAtFixedRate(Runnable r, long initial, long delay) { return _scheduledExecutor.scheduleAtFixedRate(wrap®, validate(initial), validate(delay), TimeUnit.MILLISECONDS); } public ScheduledFuturescheduleAtFixedDelay(Runnable r, long initial, long delay) { return _scheduledExecutor.scheduleWithFixedDelay(wrap®, validate(initial), validate(delay), TimeUnit.MILLISECONDS); } public void execute(Runnable r) { _executor.execute(wrap®); } public void shutdown() throws InterruptedException { _shutdown = true; try { _scheduledExecutor.shutdown(); _scheduledExecutor.awaitTermination(10, TimeUnit.SECONDS); } finally { _executor.shutdown(); _executor.awaitTermination(1, TimeUnit.MINUTES); } } public CharSequence getStats() { StringBuilder list = new StringBuilder(); list.append("ScheduledThreadPool\n"); list.append("=================================================\n"); list.append("\tgetActiveCount: ...... ").append(_scheduledExecutor.getActiveCount()).append("\n"); list.append("\tgetCorePoolSize: ..... ").append(_scheduledExecutor.getCorePoolSize()).append("\n"); list.append("\tgetPoolSize: ......... ").append(_scheduledExecutor.getPoolSize()).append("\n"); list.append("\tgetLargestPoolSize: .. ").append(_scheduledExecutor.getLargestPoolSize()).append("\n"); list.append("\tgetMaximumPoolSize: .. ").append(_scheduledExecutor.getMaximumPoolSize()).append("\n"); list.append("\tgetCompletedTaskCount: ").append(_scheduledExecutor.getCompletedTaskCount()).append("\n"); list.append("\tgetQueuedTaskCount: .. ").append(_scheduledExecutor.getQueue().size()).append("\n"); list.append("\tgetTaskCount: ........ ").append(_scheduledExecutor.getTaskCount()).append("\n"); list.append("ThreadPoolExecutor\n"); list.append("=================================================\n"); list.append("\tgetActiveCount: ...... ").append(_executor.getActiveCount()).append("\n"); list.append("\tgetCorePoolSize: ..... ").append(_executor.getCorePoolSize()).append("\n"); list.append("\tgetPoolSize: ......... ").append(_executor.getPoolSize()).append("\n"); list.append("\tgetLargestPoolSize: .. ").append(_executor.getLargestPoolSize()).append("\n"); list.append("\tgetMaximumPoolSize: .. ").append(_executor.getMaximumPoolSize()).append("\n"); list.append("\tgetCompletedTaskCount: ").append(_executor.getCompletedTaskCount()).append("\n"); list.append("\tgetQueuedTaskCount: .. ").append(_executor.getQueue().size()).append("\n"); list.append("\tgetTaskCount: ........ ").append(_executor.getTaskCount()).append("\n"); return list; } } Изменено 1 августа, 2013 пользователем imbaScorn Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 1 августа, 2013 Это же элементарно! Удивительно, что за столько времени никто не смог помочь: java\l2ft\gameserver\model\instances\ReflectionBossInstance.java private final static int COLLAPSE_AFTER_DEATH_TIME = 0; Жду спасибо 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 1 августа, 2013 Но так все равно будет отображаться сообщение: "Временная зона будет закрыта..." Так что: java\l2ft\gameserver\model\entity\Reflection.java Удаляем: if(message) for(Player pl : getPlayers()) if(pl != null) pl.sendPacket(new SystemMessage(SystemMessage.THIS_DUNGEON_WILL_EXPIRE_IN_S1_MINUTES).addNumber(timeInMinutes)); 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 Огромное спасибо Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 1 августа, 2013 Огромное спасибо Успехов Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imbaScorn 0 Опубликовано 1 августа, 2013 А если нужно сделать 10 или 20 секунд? private final static int COLLAPSE_AFTER_DEATH_TIME = 5; // 5 мин Если ставлю 0.2 не компилит. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 1 августа, 2013 а кто сказал про 5? Если память при мне, то задается время в милисекундах, соответственно 5 минут 60 * 5 * 1000. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 1 августа, 2013 (изменено) А если нужно сделать 10 или 20 секунд? private final static int COLLAPSE_AFTER_DEATH_TIME = 5; // 5 мин Если ставлю 0.2 не компилит. В Reflection.java (путь до файла давал в предыдущих сообщениях) в public void clearReflection(int timeInMinutes, boolean message) меняем следующее: startCollapseTimer(timeInMinutes * 60 * 1000L); Здесь идет умножение того числа на 60 и на 1000. То есть перевод из минут в милисекунды. То есть если Вам нужно сделать, например 20 сек, ставите COLLAPSE_AFTER_DEATH_TIME = 1, а startCollapseTimer(timeInMinutes * 20 * 1000L); Изменено 1 августа, 2013 пользователем BORDIR 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 1 августа, 2013 (изменено) Фактически если нужно меньше минуты, то меняете startCollapseTimer(timeInMinutes * 20 * 1000L); на нужное. Это и будут секунды. Изменено 1 августа, 2013 пользователем BORDIR 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 1 августа, 2013 (изменено) А вообще правильнее все это вынести в конфиг на будущее И переменную COLLAPSE_AFTER_DEATH_TIME сделать либо с плавающей точкой, либо изначально значение в секундах. Но если это на один раз - то это Вам не обязательно (хотя не люблю халтуру) Если есть необходимость - могу помочь вынести в конфиг со всеми удобствами, раз уже занялся Изменено 1 августа, 2013 пользователем BORDIR 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты