This commit is contained in:
kento2 2026-06-28 19:01:06 +02:00
parent 6087b98705
commit 63a4f17a76
21 changed files with 484 additions and 27 deletions

1
.idea/gradle.xml generated
View file

@ -17,7 +17,6 @@
</compositeBuild>
</compositeConfiguration>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$/../build-logic" />

104
.idea/workspace.xml generated
View file

@ -5,20 +5,26 @@
</component>
<component name="ChangeListManager">
<list default="true" id="56c685a1-f609-4ffd-a951-849beb2a7f8d" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/../build-logic/.idea/gradle.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/.idea/gradle.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/BaseDependenciesConvention.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/BaseDependenciesConvention.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/DatabaseConvention.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/DatabaseConvention.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/gradle/libs.versions.toml" beforeDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/ChunkPos.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/Range.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/RegionManager.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/event/RegionEvent.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/event/RegionJoinEvent.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/event/RegionLeaveEvent.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/impl/AbstractRegion.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/impl/CuboidRegion.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/impl/CylinderRegion.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/impl/MergedRegion.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/region/impl/Region.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/region/RegionPlayerTracker.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/region/RegionTask.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/gradle.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/gradle.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-api/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/ScrowAPI.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-api/src/main/java/de/kentoj/scrow/bukkit/ScrowAPI.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/CoreImplPlugin.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java" beforeDir="false" afterPath="$PROJECT_DIR$/core-bukkit-impl/src/main/java/de/kentoj/scrow/bukkit/ScrowAPISurface.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-lib/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-lib/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-api/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-api/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/core-velocity-impl/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/core-velocity-impl/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/gradle.properties.kts" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/settings.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/settings.gradle.kts" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -39,6 +45,15 @@
<task path="$PROJECT_DIR$">
<activation />
</task>
<task path="$PROJECT_DIR$/core-lib">
<activation />
</task>
<task path="$PROJECT_DIR$/core-bukkit-impl">
<activation />
</task>
<task path="$PROJECT_DIR$/core-bukkit-api">
<activation />
</task>
<projects_view>
<tree_state>
<expand>
@ -55,14 +70,43 @@
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="core" type="f1a62948:ProjectNode" />
<item name="core" type="2d1252cf:ModuleNode" />
<item name="core-bukkit-api" type="2d1252cf:ModuleNode" />
</path>
<path>
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="core" type="f1a62948:ProjectNode" />
<item name="core" type="2d1252cf:ModuleNode" />
<item name="core-bukkit-api" type="2d1252cf:ModuleNode" />
<item name="Tasks" type="e4a08cd1:TasksNode" />
</path>
<path>
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="core" type="f1a62948:ProjectNode" />
<item name="core" type="2d1252cf:ModuleNode" />
<item name="core-bukkit-api" type="2d1252cf:ModuleNode" />
<item name="Tasks" type="e4a08cd1:TasksNode" />
<item name="build" type="c8890929:TasksNode$1" />
<item name="publishing" type="c8890929:TasksNode$1" />
</path>
<path>
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="core" type="f1a62948:ProjectNode" />
<item name="core" type="2d1252cf:ModuleNode" />
<item name="core-lib" type="2d1252cf:ModuleNode" />
</path>
<path>
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="core" type="f1a62948:ProjectNode" />
<item name="core" type="2d1252cf:ModuleNode" />
<item name="core-lib" type="2d1252cf:ModuleNode" />
<item name="Tasks" type="e4a08cd1:TasksNode" />
</path>
<path>
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="core" type="f1a62948:ProjectNode" />
<item name="core" type="2d1252cf:ModuleNode" />
<item name="core-lib" type="2d1252cf:ModuleNode" />
<item name="Tasks" type="e4a08cd1:TasksNode" />
<item name="publishing" type="c8890929:TasksNode$1" />
</path>
</expand>
<select />
@ -82,7 +126,7 @@
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="GradleScriptDefinitionsStorage" workingDir="$PROJECT_DIR$" gradleHome="$USER_HOME$/.gradle/wrapper/dists/gradle-8.11-bin/c4te04g51qsyw1bxcb929u7br/gradle-8.11" javaHome="/usr/lib/jvm/default-jdk" gradleVersion="8.11" />
<component name="GradleScriptDefinitionsStorage" workingDir="$PROJECT_DIR$" gradleHome="$USER_HOME$/.gradle/wrapper/dists/gradle-8.11-bin/c4te04g51qsyw1bxcb929u7br/gradle-8.11" javaHome="/usr/lib/jvm/openjdk21" gradleVersion="8.11" />
<component name="ProjectColorInfo">{
&quot;customColor&quot;: &quot;&quot;,
&quot;associatedIndex&quot;: 0
@ -97,8 +141,10 @@
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"Gradle.Download Sources.executor": "Run",
"Gradle.core [build].executor": "Run",
"Gradle.core [clean].executor": "Run",
"Gradle.core [publishAllPublicationsToScrowRepository].executor": "Run",
"ModuleVcsDetector.initialDetectionPerformed": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
@ -107,15 +153,18 @@
"kotlin-language-version-configured": "true",
"last_opened_file_path": "/home/a/src/scrow/core/settings.gradle.kts",
"project.structure.last.edited": "Modules",
"project.structure.proportion": "0.0",
"project.structure.side.proportion": "0.0",
"settings.editor.selected.configurable": "configurable.group.appearance"
"project.structure.proportion": "0.15",
"project.structure.side.proportion": "0.6268199",
"settings.editor.selected.configurable": "editor.preferences.smartKeys"
}
}]]></component>
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/build-logic/gradle" />
</key>
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="de.kentoj.scrow.bukkit.region.event" />
</key>
</component>
<component name="RunAnythingCache">
<option name="myCommands">
@ -167,6 +216,28 @@
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
<configuration name="core [publishAllPublicationsToScrowRepository]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="publishAllPublicationsToScrowRepository" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
<configuration default="true" type="JetRunConfigurationType">
<module name="kotlin.scripts.KotlinSettingsScript.build-logic:settings.gradle.kts" />
<method v="2">
@ -181,6 +252,7 @@
<recent_temporary>
<list>
<item itemvalue="Gradle.core [build]" />
<item itemvalue="Gradle.core [publishAllPublicationsToScrowRepository]" />
<item itemvalue="Gradle.core [clean]" />
</list>
</recent_temporary>

View file

@ -1,6 +1,10 @@
group = "de.kentoj.scrow"
version = "1.0.0"
version = "1.0.0-SNAPSHOT"
subprojects {
version = rootProject.version
tasks.withType<Jar> {
archiveVersion = ""
}
}

View file

@ -3,6 +3,7 @@ package de.kentoj.scrow.bukkit;
import de.kentoj.kencommandapi.BukkitKenCommandApi;
import de.kentoj.scrow.bukkit.friends.FriendRequestService;
import de.kentoj.scrow.bukkit.friends.FriendshipService;
import de.kentoj.scrow.bukkit.region.RegionManager;
import de.kentoj.scrowlib.connection.DatabaseConnectionFactory;
import de.kentoj.scrowlib.servermanager.ServerManager;
import io.nats.client.Connection;
@ -19,8 +20,6 @@ public class ScrowAPI {
@Getter
private static DatabaseConnectionFactory dbConFactory;
@Getter
private static BukkitKenCommandApi commandApi;
@Getter
private static Scheduler minecraftScheduler;
@Getter
private static EconomyService economyService;
@ -32,17 +31,16 @@ public class ScrowAPI {
private static Connection nats;
@Getter
private static ServerManager serverManager;
@Getter
private static final RegionManager regionManager = new RegionManager();
@Getter
private static final BukkitKenCommandApi commandApi = new BukkitKenCommandApi();
@ApiStatus.Internal
public static void setEconomyService(EconomyService economyService) {
ScrowAPI.economyService = economyService;
}
@ApiStatus.Internal
public static void setCommandApi(BukkitKenCommandApi commandApi) {
ScrowAPI.commandApi = commandApi;
}
@ApiStatus.Internal
public static void setMinecraftScheduler(Scheduler minecraftScheduler) {
ScrowAPI.minecraftScheduler = minecraftScheduler;

View file

@ -0,0 +1,14 @@
package de.kentoj.scrow.bukkit.region;
import lombok.Value;
import org.bukkit.Chunk;
@Value
public class ChunkPos {
int x;
int z;
public static ChunkPos fromChunk(Chunk chunk) {
return new ChunkPos(chunk.getX(), chunk.getZ());
}
}

View file

@ -0,0 +1,27 @@
package de.kentoj.scrow.bukkit.region;
import lombok.Getter;
@Getter
public final class Range {
private final double min;
private final double max;
public boolean contains(double num) {
return min <= num && num <= max;
}
public double getLength() {
return max - min;
}
public Range(double a, double b) {
if (a < b) {
min = a;
max = b;
} else {
min = b;
max = a;
}
}
}

View file

@ -0,0 +1,42 @@
package de.kentoj.scrow.bukkit.region;
import de.kentoj.scrow.bukkit.region.impl.Region;
import java.util.*;
public class RegionManager {
private final Map<Long, List<UUID>> chunkIndex = new HashMap<>();
private final Map<UUID, Region> regions = new HashMap<>();
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();
}
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);
}
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

@ -0,0 +1,14 @@
package de.kentoj.scrow.bukkit.region.event;
import de.kentoj.scrow.bukkit.region.impl.Region;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
@RequiredArgsConstructor
@Getter
public abstract class RegionEvent extends Event {
private final Region region;
private final Player player;
}

View file

@ -0,0 +1,32 @@
package de.kentoj.scrow.bukkit.region.event;
import de.kentoj.scrow.bukkit.region.impl.Region;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
public class RegionJoinEvent extends RegionEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@Setter
@Getter
private boolean isCancelled;
public RegionJoinEvent(Region region, Player player) {
super(region, player);
}
@Override
public @NotNull HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}

View file

@ -0,0 +1,31 @@
package de.kentoj.scrow.bukkit.region.event;
import de.kentoj.scrow.bukkit.region.impl.Region;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
public class RegionLeaveEvent extends RegionEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@Setter
@Getter
private boolean isCancelled;
public RegionLeaveEvent(Region region, Player player) {
super(region, player);
}
@Override
public @NotNull HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}

View file

@ -0,0 +1,11 @@
package de.kentoj.scrow.bukkit.region.impl;
import lombok.Getter;
import java.util.UUID;
public abstract class AbstractRegion implements Region {
@Getter
private final UUID uuid = UUID.randomUUID();
}

View file

@ -0,0 +1,45 @@
package de.kentoj.scrow.bukkit.region.impl;
import de.kentoj.scrow.bukkit.region.ChunkPos;
import de.kentoj.scrow.bukkit.region.Range;
import org.bukkit.Location;
import java.util.ArrayList;
import java.util.List;
public class CuboidRegion extends AbstractRegion {
private final Range xRange;
private final Range yRange;
private final Range zRange;
public CuboidRegion(Location loc1, Location loc2) {
xRange = new Range(loc1.getX(), loc2.getX());
yRange = new Range(loc1.getY(), loc2.getY());
zRange = new Range(loc1.getY(), loc2.getY());
}
@Override
public boolean isInRegion(Location location) {
return xRange.contains(location.getX())
&& yRange.contains(location.getY())
&& zRange.contains(location.getZ());
}
@Override
public List<ChunkPos> getChunks() {
List<ChunkPos> res = new ArrayList<>();
int minChunkX = (int) Math.floor(xRange.getMin()) << 4;
int maxChunkX = (int) Math.ceil(xRange.getMax()) << 4;
for (int chunkX = minChunkX; chunkX < maxChunkX; chunkX++) {
int minChunkZ = (int) Math.floor(zRange.getMin()) << 4;
int maxChunkZ = (int) Math.ceil(zRange.getMax()) << 4;
for (int chunkZ = minChunkZ; chunkZ < maxChunkZ; chunkZ++) {
res.add(new ChunkPos(chunkX, chunkZ));
}
}
return res;
}
}

View file

@ -0,0 +1,42 @@
package de.kentoj.scrow.bukkit.region.impl;
import de.kentoj.scrow.bukkit.region.ChunkPos;
import lombok.RequiredArgsConstructor;
import org.bukkit.Location;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor
public class CylinderRegion extends AbstractRegion {
private final Location center;
private final double height;
private final double radius;
@Override
public boolean isInRegion(Location location) {
if (location.getY() < center.getY()) return false;
if (location.getY() > center.getY() + height) return false;
double diffX = location.getX() - center.getX();
double diffZ = location.getZ() - center.getZ();
return diffX * diffX + diffZ * diffZ <= radius * radius;
}
@Override
public List<ChunkPos> getChunks() {
List<ChunkPos> res = new ArrayList<>();
int a = (int) Math.ceil(radius / 16);
var centerChunkX = center.getBlockX() >> 4;
var centerChunkZ = center.getBlockZ() >> 4;
for (int x = -a; x <= a; x++) {
for (int z = -a; z <= a; z++) {
res.add(new ChunkPos(centerChunkX + x, centerChunkZ + z));
}
}
return res;
}
}

View file

@ -0,0 +1,39 @@
package de.kentoj.scrow.bukkit.region.impl;
import de.kentoj.scrow.bukkit.region.ChunkPos;
import lombok.RequiredArgsConstructor;
import org.bukkit.Location;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* region consisting of multiple regions
*/
@RequiredArgsConstructor
public class MergedRegion extends AbstractRegion {
private final Region[] regions;
@Override
public boolean isInRegion(Location location) {
for (Region region : regions) {
if (region.isInRegion(location)) return true;
}
return false;
}
@Override
public List<ChunkPos> getChunks() {
return Arrays.stream(regions)
.map(Region::getChunks)
.reduce(new ArrayList<>(), (list, chunks) -> {
list.addAll(chunks);
return list;
})
.stream()
.distinct()
.toList();
}
}

View file

@ -0,0 +1,19 @@
package de.kentoj.scrow.bukkit.region.impl;
import de.kentoj.scrow.bukkit.region.ChunkPos;
import org.bukkit.Location;
import java.util.List;
import java.util.UUID;
public interface Region {
/**
* A random uuid assigned to the Region at creation
*/
UUID getUuid();
boolean isInRegion(Location location);
List<ChunkPos> getChunks();
}

View file

@ -3,6 +3,8 @@ package de.kentoj.scrow.bukkit;
import de.kentoj.scrow.bukkit.crown.CrownCommand;
import de.kentoj.scrow.bukkit.economy.CoinsCommand;
import de.kentoj.scrow.bukkit.friends.command.FriendCommand;
import de.kentoj.scrow.bukkit.region.RegionPlayerTracker;
import de.kentoj.scrow.bukkit.region.RegionTask;
import de.kentoj.scrow.bukkit.server.LobbyCommand;
import de.kentoj.scrow.bukkit.server.PlayCommand;
import org.bukkit.Bukkit;
@ -24,6 +26,8 @@ public class CoreImplPlugin extends JavaPlugin {
ScrowAPI.getCommandApi().register(new LobbyCommand().getRootNode());
}
new RegionTask(new RegionPlayerTracker()).runTaskTimer(this, 10, 10);
registerServer();
}

View file

@ -52,7 +52,6 @@ public class ScrowAPISurface {
new PostgresFriendRequestService(ScrowAPI.getDbConFactory()) : new InMemoryFriendRequestService());
ScrowAPI.setFriendshipService(ScrowAPI.getDbConFactory() != null ?
new PostgresFriendshipService(ScrowAPI.getDbConFactory()) : new InMemoryFriendshipService());
ScrowAPI.setCommandApi(new BukkitKenCommandApi());
}
public static void destroyScrowAPI() {

View file

@ -0,0 +1,28 @@
package de.kentoj.scrow.bukkit.region;
import de.kentoj.scrow.bukkit.region.impl.Region;
import org.bukkit.entity.Player;
import java.util.*;
public class RegionPlayerTracker {
private final Map<UUID, List<UUID>> playersInRegion = new HashMap<>();
public void registerInRegion(Region region, Player player) {
playersInRegion.computeIfAbsent(region.getUuid(), __ -> new ArrayList<>())
.add(player.getUniqueId());
}
public void unregisterInRegion(Region region, Player player) {
var uuids = playersInRegion.get(region.getUuid());
if (uuids == null) return;
uuids.remove(player.getUniqueId());
}
public boolean isInRegion(Region region, Player player) {
var uuids = playersInRegion.get(region.getUuid());
if (uuids == null) return false;
return uuids.contains(player.getUniqueId());
}
}

View file

@ -0,0 +1,36 @@
package de.kentoj.scrow.bukkit.region;
import de.kentoj.scrow.bukkit.ScrowAPI;
import de.kentoj.scrow.bukkit.region.event.RegionJoinEvent;
import de.kentoj.scrow.bukkit.region.event.RegionLeaveEvent;
import de.kentoj.scrow.bukkit.region.impl.Region;
import lombok.RequiredArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitRunnable;
@RequiredArgsConstructor
public class RegionTask extends BukkitRunnable {
private final RegionPlayerTracker playerTracker;
@Override
public void run() {
for (var player : Bukkit.getOnlinePlayers()) {
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());
if (!tracked && inside) {
var ev = new RegionJoinEvent(region, player);
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);
}
}
}
}
}

View file

@ -1,6 +1,7 @@
plugins {
id("java")
id("maven-publish")
id("de.kentoj.scrow.scrow-repository")
id("de.kentoj.scrow.base-dependencies")
id("de.kentoj.scrow.database")
id("de.kentoj.scrow.java-library")

View file

@ -37,4 +37,4 @@ publishing {
from(components["java"])
}
}
}
}