diff --git a/.gitignore b/.gitignore index fd49b50..bcc7045 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,5 @@ manifest.mf javadoc # run-server folders -proxies/*/run +**/run/ +!src/**/run/ diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 0ed72af..e322424 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -1,11 +1,9 @@ -description = "Api functions for valiobungee" - - -java { - withJavadocJar() - withSourcesJar() +plugins { + `maven-publish` } +description = "Api functions for valiobungee" + dependencies { testImplementation(libs.testing.juipter) } @@ -14,3 +12,12 @@ tasks.test { useJUnitPlatform() } + +publishing { + publications { + create("maven") { + from(components["java"]) + } + } +} + diff --git a/api/src/main/java/net/limework/valiobungee/api/entity/NetworkPlayer.java b/api/src/main/java/net/limework/valiobungee/api/entity/NetworkPlayer.java index bf4ef46..771973b 100644 --- a/api/src/main/java/net/limework/valiobungee/api/entity/NetworkPlayer.java +++ b/api/src/main/java/net/limework/valiobungee/api/entity/NetworkPlayer.java @@ -15,8 +15,6 @@ */ package net.limework.valiobungee.api.entity; -import java.util.UUID; - /** * Network player. * @@ -24,13 +22,18 @@ import java.util.UUID; * @since 1.0.0 */ public interface NetworkPlayer { - /** - * @return player unique id - */ - UUID getUUID(); - /** * @return proxy player on */ NetworkProxy getProxy(); + + /** + * @return true when player is on the same proxy + */ + boolean isLocal(); + + /** + * @return true when a player is online on the network + */ + boolean isOnline(); } diff --git a/api/src/main/java/net/limework/valiobungee/api/entity/NetworkProxy.java b/api/src/main/java/net/limework/valiobungee/api/entity/NetworkProxy.java index b3183bd..45aea81 100644 --- a/api/src/main/java/net/limework/valiobungee/api/entity/NetworkProxy.java +++ b/api/src/main/java/net/limework/valiobungee/api/entity/NetworkProxy.java @@ -40,7 +40,7 @@ public interface NetworkProxy { Set getProxyPlayers(); /** - * @return returns true if this object is proxy on it + * @return returns true if this NetworkProxy is the same proxy */ boolean isMe(); } diff --git a/api/src/main/java/net/limework/valiobungee/api/entity/UUIDPlayer.java b/api/src/main/java/net/limework/valiobungee/api/entity/UUIDPlayer.java new file mode 100644 index 0000000..14caa88 --- /dev/null +++ b/api/src/main/java/net/limework/valiobungee/api/entity/UUIDPlayer.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2026 ValioBungee contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.limework.valiobungee.api.entity; + +import java.util.UUID; + +/** + * Network player. that uses UUID as an ID + * + * @author Ham1255 + * @since 1.0.0 + */ +public interface UUIDPlayer { + /** + * @return player unique id + */ + UUID getUniqueId(); +} diff --git a/api/velocity/build.gradle.kts b/api/velocity/build.gradle.kts index 36dcb28..e94afdc 100644 --- a/api/velocity/build.gradle.kts +++ b/api/velocity/build.gradle.kts @@ -1,5 +1,4 @@ plugins { - `java-library` `maven-publish` } @@ -10,10 +9,6 @@ dependencies { description = "ValioBungee Velocity API" -java { - withJavadocJar() - withSourcesJar() -} tasks { withType { @@ -27,17 +22,6 @@ tasks { val apiDocs = File(rootProject.projectDir, "api/build/docs/javadoc") //options.linksOffline("https://ci.limework.net/ValioBungee/api/build/docs/javadoc", apiDocs.path) } - compileJava { - options.encoding = Charsets.UTF_8.name() - options.release.set(21) // required by velocity - } - javadoc { - options.encoding = Charsets.UTF_8.name() - } - processResources { - filteringCharset = Charsets.UTF_8.name() - } - } publishing { diff --git a/api/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/VelocityNetworkPlayer.java b/api/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/VelocityNetworkPlayer.java index d0a40db..1546561 100644 --- a/api/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/VelocityNetworkPlayer.java +++ b/api/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/VelocityNetworkPlayer.java @@ -15,12 +15,21 @@ */ package net.limework.valiobungee.velocity.api.entities; +import com.velocitypowered.api.proxy.Player; +import java.util.Optional; import net.limework.valiobungee.api.entity.NetworkPlayer; +import net.limework.valiobungee.api.entity.UUIDPlayer; /** - * Velocity Network player. + * Velocity Network player. hold specific stuff for velocity platform * * @author Ham1255 * @since 1.0.0 */ -public interface VelocityNetworkPlayer extends NetworkPlayer {} +public interface VelocityNetworkPlayer extends NetworkPlayer, UUIDPlayer { + + /** + * @return an optional that contains a player if he is on the same proxy + */ + Optional getHandle(); +} diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 38432a5..25c93e8 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -17,17 +17,13 @@ sourceSets { } } -java { - withJavadocJar() - withSourcesJar() -} + dependencies { api(project(":valiobungee-api")) api(libs.protobuf) api(libs.caffeine) api(libs.slf4j) - api(libs.redisson) testImplementation(libs.testing.juipter) testImplementation(libs.testing.slf4j.simple) } diff --git a/core/redisson/build.gradle.kts b/core/redisson/build.gradle.kts new file mode 100644 index 0000000..33a30fd --- /dev/null +++ b/core/redisson/build.gradle.kts @@ -0,0 +1,10 @@ + +dependencies { + compileOnly(project(":valiobungee-core")) + +} + +description = "ValioBungee Redisson implementation" + + + diff --git a/core/src/main/java/net/limework/valiobungee/core/ProxyNetworkManager.java b/core/src/main/java/net/limework/valiobungee/core/ProxyNetworkManager.java index 58543c3..20c29db 100644 --- a/core/src/main/java/net/limework/valiobungee/core/ProxyNetworkManager.java +++ b/core/src/main/java/net/limework/valiobungee/core/ProxyNetworkManager.java @@ -23,7 +23,12 @@ import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.RemovalCause; import com.github.benmanes.caffeine.cache.RemovalListener; import java.time.Duration; +import java.util.Optional; +import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import net.limework.valiobungee.api.entity.NetworkProxy; import net.limework.valiobungee.core.proto.messages.*; import net.limework.valiobungee.core.util.logging.LogProviderFactory; import org.slf4j.Logger; @@ -104,6 +109,22 @@ public abstract class ProxyNetworkManager { .build(); } + // return self only if no other proxies + public Set getNetworkProxies() { + return Stream.concat( + this.heartbeats.asMap().values().stream() + .map(h -> platform.proxyPlatformCreator(h.getSender().getProxyId())), + Stream.of(platform.getLocalProxy())) + .collect(Collectors.toSet()); + } + + public Optional getNetworkProxy(String id) { + if (platform.networkId().equals(id)) return Optional.of(platform.proxyPlatformCreator(id)); + if (!this.heartbeats.asMap().containsKey(id)) return Optional.empty(); + return Optional.of( + platform.proxyPlatformCreator(this.heartbeats.asMap().get(id).getSender().getProxyId())); + } + protected abstract void publishDeathPayload(); protected abstract void publishHeartbeatPayload(); diff --git a/core/src/main/java/net/limework/valiobungee/core/ValioBungeePlatform.java b/core/src/main/java/net/limework/valiobungee/core/ValioBungeePlatform.java index 9d9ddba..ff01f0c 100644 --- a/core/src/main/java/net/limework/valiobungee/core/ValioBungeePlatform.java +++ b/core/src/main/java/net/limework/valiobungee/core/ValioBungeePlatform.java @@ -19,6 +19,7 @@ package net.limework.valiobungee.core; import net.limework.valiobungee.api.ValioBungeeAPI; +import net.limework.valiobungee.api.entity.NetworkProxy; public interface ValioBungeePlatform extends ValioBungeeAPI { @@ -32,6 +33,8 @@ public interface ValioBungeePlatform extends ValioBungeeAPI { ProxyNetworkManager proxyNetworkManager(); + NetworkProxy proxyPlatformCreator(String id); + @Override default String getGitCommit() { return ConstantVariables.GIT_COMMIT; diff --git a/core/src/main/java/net/limework/valiobungee/core/api/entities/AbstractNetworkPlayer.java b/core/src/main/java/net/limework/valiobungee/core/api/entities/AbstractUUIDNetworkPlayer.java similarity index 81% rename from core/src/main/java/net/limework/valiobungee/core/api/entities/AbstractNetworkPlayer.java rename to core/src/main/java/net/limework/valiobungee/core/api/entities/AbstractUUIDNetworkPlayer.java index a11ac25..c71c9fc 100644 --- a/core/src/main/java/net/limework/valiobungee/core/api/entities/AbstractNetworkPlayer.java +++ b/core/src/main/java/net/limework/valiobungee/core/api/entities/AbstractUUIDNetworkPlayer.java @@ -22,22 +22,23 @@ import java.util.Objects; import java.util.UUID; import net.limework.valiobungee.api.entity.NetworkPlayer; import net.limework.valiobungee.api.entity.NetworkProxy; +import net.limework.valiobungee.api.entity.UUIDPlayer; import net.limework.valiobungee.core.ValioBungeePlatform; -public abstract class AbstractNetworkPlayer implements NetworkPlayer { +public abstract class AbstractUUIDNetworkPlayer implements NetworkPlayer, UUIDPlayer { private final ValioBungeePlatform platform; private final UUID uuid; private final NetworkProxy proxy; - public AbstractNetworkPlayer(ValioBungeePlatform platform, UUID uuid, NetworkProxy proxy) { + public AbstractUUIDNetworkPlayer(ValioBungeePlatform platform, UUID uuid, NetworkProxy proxy) { this.platform = platform; this.uuid = uuid; this.proxy = proxy; } @Override - public UUID getUUID() { + public UUID getUniqueId() { return this.uuid; } @@ -48,7 +49,7 @@ public abstract class AbstractNetworkPlayer implements NetworkPlayer { @Override public boolean equals(Object o) { - if (!(o instanceof AbstractNetworkPlayer that)) return false; + if (!(o instanceof AbstractUUIDNetworkPlayer that)) return false; return Objects.equals(uuid, that.uuid) && Objects.equals(proxy, that.proxy); } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dd8d046..185a29b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,7 +19,7 @@ indragit = "net.kyori.indra.git:4.0.0" shadow = "com.gradleup.shadow:9.3.1" spotless = "com.diffplug.spotless:8.2.0" protobuf = { id = "com.google.protobuf", version.ref = "protobuf-plugin" } -run-velocity = { id = "xyz.jpenilla.run-velocity", version = "2.3.1" } +run-velocity = { id = "xyz.jpenilla.run-velocity", version = "3.0.2" } [libraries] # protobuf diff --git a/settings.gradle.kts b/settings.gradle.kts index 6c26135..a5125f8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,16 +8,21 @@ pluginManagement { rootProject.name = "ValioBungee" -fun configureProject(name: String) { +fun configureRootProjects(name: String) { val projectName = ":valiobungee-$name" configureProject(projectName, name) } -fun configureAPIProject(name: String) { +fun configureAPISubProject(name: String) { val projectName = ":valiobungee-$name-api" configureProject(projectName, "api/$name") } +fun configureCoreSubProject(name: String) { + val projectName = ":valiobungee-core-$name" + configureProject(projectName, "core/$name") +} + fun configureProject(name: String, path: String) { include(name) project(name).projectDir = file(path) @@ -34,9 +39,11 @@ dependencyResolutionManagement { } // main project stuff -sequenceOf("api", "core", "velocity").forEach { configureProject(it) } +sequenceOf("api", "core", "velocity").forEach { configureRootProjects(it) } +// core data implementations +sequenceOf("redisson").forEach { configureCoreSubProject(it) } // api -sequenceOf("velocity").forEach { configureAPIProject(it) } +sequenceOf("velocity").forEach { configureAPISubProject(it) } // RedisBunggee Project // configureProject(":RedisBungee-API", "redisbungee/api") diff --git a/velocity/build.gradle.kts b/velocity/build.gradle.kts index 863ab8d..1975c70 100644 --- a/velocity/build.gradle.kts +++ b/velocity/build.gradle.kts @@ -14,22 +14,9 @@ dependencies { description = "ValioBungee Velocity implementation" -java { - withSourcesJar() -} - tasks { runVelocity { velocityVersion(libs.versions.velocity.get()) } - compileJava { - options.encoding = Charsets.UTF_8.name() - options.release.set(21) // required by velocity - } - processResources { - filteringCharset = Charsets.UTF_8.name() - } - - } diff --git a/velocity/src/main/java/net/limework/valiobungee/velocity/VelocityValioBungeePlugin.java b/velocity/src/main/java/net/limework/valiobungee/velocity/VelocityValioBungeePlugin.java index 870cd1e..0c40a81 100644 --- a/velocity/src/main/java/net/limework/valiobungee/velocity/VelocityValioBungeePlugin.java +++ b/velocity/src/main/java/net/limework/valiobungee/velocity/VelocityValioBungeePlugin.java @@ -18,6 +18,10 @@ */ package net.limework.valiobungee.velocity; +import com.google.inject.Inject; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; @@ -25,12 +29,16 @@ import java.nio.file.Path; import java.util.Optional; import java.util.Set; import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; import net.limework.valiobungee.api.entity.NetworkPlayer; import net.limework.valiobungee.api.entity.NetworkProxy; import net.limework.valiobungee.core.ConstantVariables; import net.limework.valiobungee.core.ProxyNetworkManager; import net.limework.valiobungee.core.ValioBungeePlatform; import net.limework.valiobungee.core.util.logging.LogProviderFactory; +import net.limework.valiobungee.velocity.api.TestProxyNetworkManager; +import net.limework.valiobungee.velocity.api.entities.ImplVelocityNetworkPlayer; import net.limework.valiobungee.velocity.api.entities.ImplVelocityNetworkProxy; import org.slf4j.Logger; @@ -47,6 +55,7 @@ public class VelocityValioBungeePlugin implements ValioBungeePlatform { private final Path dataFolder; private final ProxyNetworkManager proxyNetworkManager; + @Inject public VelocityValioBungeePlugin( ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) { this.server = server; @@ -54,9 +63,20 @@ public class VelocityValioBungeePlugin implements ValioBungeePlatform { this.dataFolder = dataDirectory; // init logging LogProviderFactory.register(logger); - this.proxyNetworkManager = null; + this.proxyNetworkManager = new TestProxyNetworkManager(this); } + @Subscribe(priority = Short.MAX_VALUE) // this really important so MAKE IT MAX + public void onProxyInitializeEvent(ProxyInitializeEvent event) { + logger.info( + "initializing ValioBungee for {} platform, version {}", + platformProxyVendor(), + ConstantVariables.VERSION); + } + + @Subscribe(priority = Short.MIN_VALUE) // this really import so Make it AT LOWEST + public void onProxyShutdownEvent(ProxyShutdownEvent event) {} + @Override public int localOnlinePlayers() { return this.server.getPlayerCount(); @@ -72,9 +92,16 @@ public class VelocityValioBungeePlugin implements ValioBungeePlatform { return this.proxyNetworkManager; } + @Override + public NetworkProxy proxyPlatformCreator(String id) { + return new ImplVelocityNetworkProxy(this, id); + } + + private final String id = "test-ido-" + ThreadLocalRandom.current().nextInt(10); + @Override public String proxyId() { - return "test-ido"; + return id; } @Override @@ -90,9 +117,7 @@ public class VelocityValioBungeePlugin implements ValioBungeePlatform { @Override public Optional getNetworkProxy(String id) { - if (this.proxyId().equals(id)) return Optional.of(getLocalProxy()); - logger.warn("not implemented api call returned as Optional empty"); - return Optional.empty(); + return this.proxyNetworkManager.getNetworkProxy(id); } @Override @@ -102,14 +127,15 @@ public class VelocityValioBungeePlugin implements ValioBungeePlatform { @Override public Set getNetworkProxies() { - logger.warn("not implemented api call returned as Optional empty"); - return Set.of(); + return proxyNetworkManager.getNetworkProxies(); } @Override public Set getLocalProxyPlayers() { - logger.warn("not implemented api call returned as Optional empty"); - return Set.of(); + NetworkProxy proxy = getLocalProxy(); + return this.server.getAllPlayers().stream() + .map(p -> new ImplVelocityNetworkPlayer(this, p.getUniqueId(), getLocalProxy(), p)) + .collect(Collectors.toSet()); } @Override diff --git a/velocity/src/main/java/net/limework/valiobungee/velocity/api/TestProxyNetworkManager.java b/velocity/src/main/java/net/limework/valiobungee/velocity/api/TestProxyNetworkManager.java new file mode 100644 index 0000000..bbab894 --- /dev/null +++ b/velocity/src/main/java/net/limework/valiobungee/velocity/api/TestProxyNetworkManager.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2026 ValioBungee contributors + * + * This file is part of ValioBungee. + * + * ValioBungee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ValioBungee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ValioBungee. If not, see . + */ +package net.limework.valiobungee.velocity.api; + +import net.limework.valiobungee.core.ProxyNetworkManager; +import net.limework.valiobungee.core.ValioBungeePlatform; + +public class TestProxyNetworkManager extends ProxyNetworkManager { + public TestProxyNetworkManager(ValioBungeePlatform platform) { + super(platform); + } + + @Override + protected void publishDeathPayload() {} + + @Override + protected void publishHeartbeatPayload() {} + + @Override + public void init() {} + + @Override + public void close() {} +} diff --git a/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/ImplVelocityNetworkPlayer.java b/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/ImplVelocityNetworkPlayer.java index 35b38e7..0a31d16 100644 --- a/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/ImplVelocityNetworkPlayer.java +++ b/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/ImplVelocityNetworkPlayer.java @@ -18,13 +18,40 @@ */ package net.limework.valiobungee.velocity.api.entities; +import com.velocitypowered.api.proxy.Player; +import java.util.Optional; import java.util.UUID; import net.limework.valiobungee.api.entity.NetworkProxy; import net.limework.valiobungee.core.ValioBungeePlatform; -import net.limework.valiobungee.core.api.entities.AbstractNetworkPlayer; +import net.limework.valiobungee.core.api.entities.AbstractUUIDNetworkPlayer; +import net.limework.valiobungee.core.util.logging.LogProviderFactory; -public class ImplVelocityNetworkPlayer extends AbstractNetworkPlayer { - public ImplVelocityNetworkPlayer(ValioBungeePlatform platform, UUID uuid, NetworkProxy proxy) { +public class ImplVelocityNetworkPlayer extends AbstractUUIDNetworkPlayer + implements VelocityNetworkPlayer { + private final Player handle; + + public ImplVelocityNetworkPlayer( + ValioBungeePlatform platform, UUID uuid, NetworkProxy proxy, Player handle) { super(platform, uuid, proxy); + this.handle = handle; + } + + @Override + public Optional getHandle() { + return Optional.ofNullable(handle); + } + + @Override + public boolean isLocal() { + return handle != null; + } + + @Override + public boolean isOnline() { + if (isLocal()) { + return handle.isActive(); + } + LogProviderFactory.get().warn("NOT IMPLEMENTED IS ONLINE for Velocity network player"); + return false; } } diff --git a/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/ImplVelocityNetworkProxy.java b/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/ImplVelocityNetworkProxy.java index 33ece49..fb9f985 100644 --- a/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/ImplVelocityNetworkProxy.java +++ b/velocity/src/main/java/net/limework/valiobungee/velocity/api/entities/ImplVelocityNetworkProxy.java @@ -23,7 +23,7 @@ import net.limework.valiobungee.api.entity.NetworkPlayer; import net.limework.valiobungee.core.api.entities.AbstractNetworkProxy; import net.limework.valiobungee.velocity.VelocityValioBungeePlugin; -public class ImplVelocityNetworkProxy extends AbstractNetworkProxy { +public class ImplVelocityNetworkProxy extends AbstractNetworkProxy implements VelocityNetworkProxy { public ImplVelocityNetworkProxy(VelocityValioBungeePlugin platform, String proxyId) { super(platform, proxyId);