W WildDead Heir Sep 26, 2023 #2 ScheduledFuture и ExShowScreenMessage ? или по другому реализация? CastorTroy said: View attachment 2907 Подробности в ЛС Click to expand...
ScheduledFuture и ExShowScreenMessage ? или по другому реализация? CastorTroy said: View attachment 2907 Подробности в ЛС Click to expand...
ammy Heir Sep 26, 2023 #4 ### Eclipse Workspace Patch 1.0 #P Index: java/net/sf/l2j/gameserver/model/zone/type/TownZone.java =================================================================== --- java/net/sf/l2j/gameserver/model/zone/type/TownZone.java (revision 3) +++ java/net/sf/l2j/gameserver/model/zone/type/TownZone.java (working copy) @@ -1,10 +1,18 @@ package net.sf.l2j.gameserver.model.zone.type; +import java.util.Collection; +import java.util.concurrent.ScheduledFuture; +import java.util.stream.Collectors; + +import net.sf.l2j.commons.concurrent.ThreadPool; + import net.sf.l2j.Config; import net.sf.l2j.gameserver.model.actor.Creature; import net.sf.l2j.gameserver.model.actor.instance.Player; import net.sf.l2j.gameserver.model.zone.SpawnZoneType; import net.sf.l2j.gameserver.model.zone.ZoneId; +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage; +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS; /** * A zone extending {@link SpawnZoneType}, used by towns. A town zone is generally associated to a castle for taxes. @@ -13,6 +21,8 @@ { private int _townId; private int _castleId; + protected ScheduledFuture<?> _counterTask = null; + protected int _timer = 5 * 60; private boolean _isPeaceZone = true; @@ -37,6 +47,9 @@ @Override protected void onEnter(Creature character) { + if (character instanceof Player && _counterTask == null) + _counterTask = startCounter(); + if (Config.ZONE_TOWN == 1 && character instanceof Player && ((Player) character).getSiegeState() != 0) return; @@ -46,6 +59,11 @@ character.setInsideZone(ZoneId.TOWN, true); } + private ScheduledFuture<?> startCounter() + { + return ThreadPool.scheduleAtFixedRate(new Counter(), 1000, 1000); + } + @Override protected void onExit(Creature character) { @@ -53,6 +71,9 @@ character.setInsideZone(ZoneId.PEACE, false); character.setInsideZone(ZoneId.TOWN, false); + + if (getPlayers().size() < 1) + resetCounter(); } @Override @@ -75,8 +96,49 @@ return _castleId; } + public Collection<Player> getPlayers() + { + return getCharacters().stream().filter(pl -> pl instanceof Player).map(cr -> (Player) cr).collect(Collectors.toList()); + } + public final boolean isPeaceZone() { return _isPeaceZone; } + + protected void resetCounter() + { + if (_counterTask != null) + { + _counterTask.cancel(true); + _counterTask = null; + } + _timer = 5 * 60; + } + + class Counter implements Runnable + { + + protected Counter() + { + } + + @Override + public void run() + { + if (_timer < 1) + { + resetCounter(); + return; + } + for (Player player : getPlayers()) + { + int minutes = _timer / 60; + int second = _timer % 60; + String timing = ((minutes < 10) ? ("0" + minutes) : minutes) + ":" + ((second < 10) ? ("0" + second) : second); + player.sendPacket(new ExShowScreenMessage("Next town at : " + timing, 1100, SMPOS.TOP_CENTER, false)); + } + _timer--; + } + } } \ No newline at end of file
### Eclipse Workspace Patch 1.0 #P Index: java/net/sf/l2j/gameserver/model/zone/type/TownZone.java =================================================================== --- java/net/sf/l2j/gameserver/model/zone/type/TownZone.java (revision 3) +++ java/net/sf/l2j/gameserver/model/zone/type/TownZone.java (working copy) @@ -1,10 +1,18 @@ package net.sf.l2j.gameserver.model.zone.type; +import java.util.Collection; +import java.util.concurrent.ScheduledFuture; +import java.util.stream.Collectors; + +import net.sf.l2j.commons.concurrent.ThreadPool; + import net.sf.l2j.Config; import net.sf.l2j.gameserver.model.actor.Creature; import net.sf.l2j.gameserver.model.actor.instance.Player; import net.sf.l2j.gameserver.model.zone.SpawnZoneType; import net.sf.l2j.gameserver.model.zone.ZoneId; +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage; +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS; /** * A zone extending {@link SpawnZoneType}, used by towns. A town zone is generally associated to a castle for taxes. @@ -13,6 +21,8 @@ { private int _townId; private int _castleId; + protected ScheduledFuture<?> _counterTask = null; + protected int _timer = 5 * 60; private boolean _isPeaceZone = true; @@ -37,6 +47,9 @@ @Override protected void onEnter(Creature character) { + if (character instanceof Player && _counterTask == null) + _counterTask = startCounter(); + if (Config.ZONE_TOWN == 1 && character instanceof Player && ((Player) character).getSiegeState() != 0) return; @@ -46,6 +59,11 @@ character.setInsideZone(ZoneId.TOWN, true); } + private ScheduledFuture<?> startCounter() + { + return ThreadPool.scheduleAtFixedRate(new Counter(), 1000, 1000); + } + @Override protected void onExit(Creature character) { @@ -53,6 +71,9 @@ character.setInsideZone(ZoneId.PEACE, false); character.setInsideZone(ZoneId.TOWN, false); + + if (getPlayers().size() < 1) + resetCounter(); } @Override @@ -75,8 +96,49 @@ return _castleId; } + public Collection<Player> getPlayers() + { + return getCharacters().stream().filter(pl -> pl instanceof Player).map(cr -> (Player) cr).collect(Collectors.toList()); + } + public final boolean isPeaceZone() { return _isPeaceZone; } + + protected void resetCounter() + { + if (_counterTask != null) + { + _counterTask.cancel(true); + _counterTask = null; + } + _timer = 5 * 60; + } + + class Counter implements Runnable + { + + protected Counter() + { + } + + @Override + public void run() + { + if (_timer < 1) + { + resetCounter(); + return; + } + for (Player player : getPlayers()) + { + int minutes = _timer / 60; + int second = _timer % 60; + String timing = ((minutes < 10) ? ("0" + minutes) : minutes) + ":" + ((second < 10) ? ("0" + second) : second); + player.sendPacket(new ExShowScreenMessage("Next town at : " + timing, 1100, SMPOS.TOP_CENTER, false)); + } + _timer--; + } + } } \ No newline at end of file
W WildDead Heir Sep 26, 2023 #5 ammy said: ### Eclipse Workspace Patch 1.0 #P Index: java/net/sf/l2j/gameserver/model/zone/type/TownZone.java =================================================================== --- java/net/sf/l2j/gameserver/model/zone/type/TownZone.java (revision 3) +++ java/net/sf/l2j/gameserver/model/zone/type/TownZone.java (working copy) @@ -1,10 +1,18 @@ package net.sf.l2j.gameserver.model.zone.type; +import java.util.Collection; +import java.util.concurrent.ScheduledFuture; +import java.util.stream.Collectors; + +import net.sf.l2j.commons.concurrent.ThreadPool; + import net.sf.l2j.Config; import net.sf.l2j.gameserver.model.actor.Creature; import net.sf.l2j.gameserver.model.actor.instance.Player; import net.sf.l2j.gameserver.model.zone.SpawnZoneType; import net.sf.l2j.gameserver.model.zone.ZoneId; +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage; +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS; /** * A zone extending {@link SpawnZoneType}, used by towns. A town zone is generally associated to a castle for taxes. @@ -13,6 +21,8 @@ { private int _townId; private int _castleId; + protected ScheduledFuture<?> _counterTask = null; + protected int _timer = 5 * 60; private boolean _isPeaceZone = true; @@ -37,6 +47,9 @@ @Override protected void onEnter(Creature character) { + if (character instanceof Player && _counterTask == null) + _counterTask = startCounter(); + if (Config.ZONE_TOWN == 1 && character instanceof Player && ((Player) character).getSiegeState() != 0) return; @@ -46,6 +59,11 @@ character.setInsideZone(ZoneId.TOWN, true); } + private ScheduledFuture<?> startCounter() + { + return ThreadPool.scheduleAtFixedRate(new Counter(), 1000, 1000); + } + @Override protected void onExit(Creature character) { @@ -53,6 +71,9 @@ character.setInsideZone(ZoneId.PEACE, false); character.setInsideZone(ZoneId.TOWN, false); + + if (getPlayers().size() < 1) + resetCounter(); } @Override @@ -75,8 +96,49 @@ return _castleId; } + public Collection<Player> getPlayers() + { + return getCharacters().stream().filter(pl -> pl instanceof Player).map(cr -> (Player) cr).collect(Collectors.toList()); + } + public final boolean isPeaceZone() { return _isPeaceZone; } + + protected void resetCounter() + { + if (_counterTask != null) + { + _counterTask.cancel(true); + _counterTask = null; + } + _timer = 5 * 60; + } + + class Counter implements Runnable + { + + protected Counter() + { + } + + @Override + public void run() + { + if (_timer < 1) + { + resetCounter(); + return; + } + for (Player player : getPlayers()) + { + int minutes = _timer / 60; + int second = _timer % 60; + String timing = ((minutes < 10) ? ("0" + minutes) : minutes) + ":" + ((second < 10) ? ("0" + second) : second); + player.sendPacket(new ExShowScreenMessage("Next town at : " + timing, 1100, SMPOS.TOP_CENTER, false)); + } + _timer--; + } + } } \ No newline at end of file Click to expand... Если уж взял с ммодева хоть бы указал ссылкой) И под тег код запихнул)
ammy said: ### Eclipse Workspace Patch 1.0 #P Index: java/net/sf/l2j/gameserver/model/zone/type/TownZone.java =================================================================== --- java/net/sf/l2j/gameserver/model/zone/type/TownZone.java (revision 3) +++ java/net/sf/l2j/gameserver/model/zone/type/TownZone.java (working copy) @@ -1,10 +1,18 @@ package net.sf.l2j.gameserver.model.zone.type; +import java.util.Collection; +import java.util.concurrent.ScheduledFuture; +import java.util.stream.Collectors; + +import net.sf.l2j.commons.concurrent.ThreadPool; + import net.sf.l2j.Config; import net.sf.l2j.gameserver.model.actor.Creature; import net.sf.l2j.gameserver.model.actor.instance.Player; import net.sf.l2j.gameserver.model.zone.SpawnZoneType; import net.sf.l2j.gameserver.model.zone.ZoneId; +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage; +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS; /** * A zone extending {@link SpawnZoneType}, used by towns. A town zone is generally associated to a castle for taxes. @@ -13,6 +21,8 @@ { private int _townId; private int _castleId; + protected ScheduledFuture<?> _counterTask = null; + protected int _timer = 5 * 60; private boolean _isPeaceZone = true; @@ -37,6 +47,9 @@ @Override protected void onEnter(Creature character) { + if (character instanceof Player && _counterTask == null) + _counterTask = startCounter(); + if (Config.ZONE_TOWN == 1 && character instanceof Player && ((Player) character).getSiegeState() != 0) return; @@ -46,6 +59,11 @@ character.setInsideZone(ZoneId.TOWN, true); } + private ScheduledFuture<?> startCounter() + { + return ThreadPool.scheduleAtFixedRate(new Counter(), 1000, 1000); + } + @Override protected void onExit(Creature character) { @@ -53,6 +71,9 @@ character.setInsideZone(ZoneId.PEACE, false); character.setInsideZone(ZoneId.TOWN, false); + + if (getPlayers().size() < 1) + resetCounter(); } @Override @@ -75,8 +96,49 @@ return _castleId; } + public Collection<Player> getPlayers() + { + return getCharacters().stream().filter(pl -> pl instanceof Player).map(cr -> (Player) cr).collect(Collectors.toList()); + } + public final boolean isPeaceZone() { return _isPeaceZone; } + + protected void resetCounter() + { + if (_counterTask != null) + { + _counterTask.cancel(true); + _counterTask = null; + } + _timer = 5 * 60; + } + + class Counter implements Runnable + { + + protected Counter() + { + } + + @Override + public void run() + { + if (_timer < 1) + { + resetCounter(); + return; + } + for (Player player : getPlayers()) + { + int minutes = _timer / 60; + int second = _timer % 60; + String timing = ((minutes < 10) ? ("0" + minutes) : minutes) + ":" + ((second < 10) ? ("0" + second) : second); + player.sendPacket(new ExShowScreenMessage("Next town at : " + timing, 1100, SMPOS.TOP_CENTER, false)); + } + _timer--; + } + } } \ No newline at end of file Click to expand... Если уж взял с ммодева хоть бы указал ссылкой) И под тег код запихнул)