fix: unable to leave regions when unloaded
This commit is contained in:
parent
e9cd803e99
commit
701a5ff620
6 changed files with 47 additions and 13 deletions
|
|
@ -1,6 +1,7 @@
|
|||
package de.kentoj.scrow.bukkit.region;
|
||||
|
||||
import de.kentoj.scrow.bukkit.region.impl.Region;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
|
|
@ -17,6 +18,11 @@ public class RegionManagerImpl implements RegionManager {
|
|||
return uuids.stream().map(regions::get).toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Region getRegion(UUID regionUuid) {
|
||||
return regions.get(regionUuid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerRegion(Region region) {
|
||||
for (ChunkPos chunkPos : region.getChunks()) {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,13 @@
|
|||
package de.kentoj.scrow.bukkit.region;
|
||||
|
||||
import de.kentoj.scrow.bukkit.ScrowAPI;
|
||||
import de.kentoj.scrow.bukkit.region.impl.Region;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class RegionPlayerTracker {
|
||||
|
||||
|
|
@ -20,6 +24,13 @@ public class RegionPlayerTracker {
|
|||
uuids.remove(player.getUniqueId());
|
||||
}
|
||||
|
||||
public Map<Region, Stream<Player>> getRegionsWithPlayers() {
|
||||
return playersInRegion.entrySet().stream().collect(Collectors.toMap(
|
||||
ent -> ScrowAPI.getRegionManager().getRegion(ent.getKey()),
|
||||
ent -> ent.getValue().stream().map(Bukkit::getPlayer)
|
||||
));
|
||||
}
|
||||
|
||||
public boolean isInRegion(Region region, Player player) {
|
||||
var uuids = playersInRegion.get(region.getUuid());
|
||||
if (uuids == null) return false;
|
||||
|
|
|
|||
|
|
@ -15,9 +15,19 @@ public class RegionTask extends BukkitRunnable {
|
|||
|
||||
@Override
|
||||
public void run() {
|
||||
playerTracker.getRegionsWithPlayers().forEach((region, players) ->
|
||||
players.forEach(player -> {
|
||||
if (!region.isInRegion(player.getLocation())) {
|
||||
var ev = new RegionLeaveEvent(region, player);
|
||||
Bukkit.getPluginManager().callEvent(ev);
|
||||
if (!ev.isCancelled())
|
||||
playerTracker.unregisterInRegion(region, player);
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
for (var player : Bukkit.getOnlinePlayers()) {
|
||||
var regions = ScrowAPI.getREGION_MANAGER_IMPL().getRegions(ChunkPos.fromChunk(player.getLocation().getChunk()));
|
||||
Bukkit.broadcastMessage(player.getName() + " is near " + regions.size() + " regions");
|
||||
var regions = ScrowAPI.getRegionManager().getRegions(ChunkPos.fromChunk(player.getLocation().getChunk()));
|
||||
for (Region region : regions) {
|
||||
var tracked = playerTracker.isInRegion(region, player);
|
||||
var inside = region.isInRegion(player.getLocation());
|
||||
|
|
@ -26,11 +36,6 @@ public class RegionTask extends BukkitRunnable {
|
|||
Bukkit.getPluginManager().callEvent(ev);
|
||||
if (!ev.isCancelled())
|
||||
playerTracker.registerInRegion(region, player);
|
||||
} else if (tracked && !inside) {
|
||||
var ev = new RegionLeaveEvent(region, player);
|
||||
Bukkit.getPluginManager().callEvent(ev);
|
||||
if (!ev.isCancelled())
|
||||
playerTracker.unregisterInRegion(region, player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue