.
This commit is contained in:
parent
63a4f17a76
commit
e9cd803e99
7 changed files with 134 additions and 66 deletions
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue