This commit is contained in:
kento2 2026-06-28 21:01:09 +02:00
parent 63a4f17a76
commit e9cd803e99
7 changed files with 134 additions and 66 deletions

View file

@ -7,6 +7,7 @@ import de.kentoj.scrow.bukkit.friends.friendship.InMemoryFriendshipService;
import de.kentoj.scrow.bukkit.friends.friendship.PostgresFriendshipService;
import de.kentoj.scrow.bukkit.friends.request.InMemoryFriendRequestService;
import de.kentoj.scrow.bukkit.friends.request.PostgresFriendRequestService;
import de.kentoj.scrow.bukkit.region.RegionManagerImpl;
import de.kentoj.scrowlib.connection.DatabaseConnectionFactoryImpl;
import de.kentoj.scrowlib.servermanager.ServerManagerImpl;
import io.nats.client.Nats;
@ -45,6 +46,7 @@ public class ScrowAPISurface {
ScrowAPI.setDbConFactory(new DatabaseConnectionFactoryImpl(factory));
}
ScrowAPI.setRegionManager(new RegionManagerImpl());
ScrowAPI.setServerManager(new ServerManagerImpl(ScrowAPI.getNats()));
ScrowAPI.setEconomyService(ScrowAPI.getDbConFactory() != null ?
new PostgresEconomyService(ScrowAPI.getDbConFactory()) : new InMemoryEconomyService());

View file

@ -0,0 +1,45 @@
package de.kentoj.scrow.bukkit.region;
import de.kentoj.scrow.bukkit.region.impl.Region;
import java.util.*;
public class RegionManagerImpl implements RegionManager {
private final Map<Long, List<UUID>> chunkIndex = new HashMap<>();
private final Map<UUID, Region> regions = new HashMap<>();
@Override
public List<Region> getRegions(ChunkPos chunkPos) {
long key = toKey(chunkPos.getX(), chunkPos.getZ());
var uuids = chunkIndex.get(key);
if (uuids == null) return Collections.emptyList();
return uuids.stream().map(regions::get).toList();
}
@Override
public void registerRegion(Region region) {
for (ChunkPos chunkPos : region.getChunks()) {
var key = toKey(chunkPos.getX(), chunkPos.getZ());
chunkIndex.computeIfAbsent(key, __ -> new ArrayList<>())
.add(region.getUuid());
}
regions.put(region.getUuid(), region);
}
@Override
public void unregisterRegion(Region region) {
for (ChunkPos chunkPos : region.getChunks()) {
var key = toKey(chunkPos.getX(), chunkPos.getZ());
var list = chunkIndex.get(key);
if (list == null) return;
list.remove(region.getUuid());
}
regions.remove(region.getUuid());
}
public long toKey(int x, int z) {
// chatgpt
return (((long) x) << 32) ^ (z & 0xffffffffL);
}
}

View file

@ -16,14 +16,16 @@ public class RegionTask extends BukkitRunnable {
@Override
public void run() {
for (var player : Bukkit.getOnlinePlayers()) {
var regions = ScrowAPI.getRegionManager().getRegions(ChunkPos.fromChunk(player.getLocation().getChunk()));
var regions = ScrowAPI.getREGION_MANAGER_IMPL().getRegions(ChunkPos.fromChunk(player.getLocation().getChunk()));
Bukkit.broadcastMessage(player.getName() + " is near " + regions.size() + " regions");
for (Region region : regions) {
var tracked = playerTracker.isInRegion(region, player);
var inside = region.isInRegion(player.getLocation());
if (!tracked && inside) {
var ev = new RegionJoinEvent(region, player);
Bukkit.getPluginManager().callEvent(ev);
if (!ev.isCancelled()) playerTracker.registerInRegion(region, player);
if (!ev.isCancelled())
playerTracker.registerInRegion(region, player);
} else if (tracked && !inside) {
var ev = new RegionLeaveEvent(region, player);
Bukkit.getPluginManager().callEvent(ev);