diff --git a/.gitignore b/.gitignore index 74819ac..17867fe 100644 --- a/.gitignore +++ b/.gitignore @@ -118,3 +118,5 @@ run/ !gradle-wrapper.jar /gradlew /gradlew.bat + +local.gradle diff --git a/build.gradle b/build.gradle index f324caf..64aa638 100644 --- a/build.gradle +++ b/build.gradle @@ -1,47 +1,36 @@ plugins { - id 'com.github.johnrengelman.shadow' version '8.1.1' id 'java' + id 'com.gradleup.shadow' version "8.3.5" } -group = 'eu.mhsl.craftattack' -version = '1.0' +allprojects { + group = 'de.mhsl.craftattack' + version = '1.0.0' -repositories { - mavenCentral() - maven { - name = "papermc-repo" - url = "https://repo.papermc.io/repository/maven-public/" - } - maven { - name = "sonatype" - url = "https://oss.sonatype.org/content/groups/public/" - } - maven { - url = uri("https://repo.opencollab.dev/main/") + repositories { + mavenCentral() + maven { + name = "papermc-repo" + url = "https://repo.papermc.io/repository/maven-public/" + } + maven { + name = "sonatype" + url = "https://oss.sonatype.org/content/groups/public/" + } + maven { + url = uri("https://repo.opencollab.dev/main/") + } } } -dependencies { - compileOnly 'io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT' - compileOnly 'org.geysermc.floodgate:api:2.2.2-SNAPSHOT' - implementation 'org.apache.httpcomponents:httpclient:4.5.14' - implementation 'com.sparkjava:spark-core:2.9.4' - implementation 'org.reflections:reflections:0.10.2' -} +subprojects { + apply plugin: 'java' + apply plugin: 'com.gradleup.shadow' -def targetJavaVersion = 21 -java { - def javaVersion = JavaVersion.toVersion(targetJavaVersion) - sourceCompatibility = javaVersion - targetCompatibility = javaVersion - if (JavaVersion.current() < javaVersion) { - toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) - } -} - -tasks.withType(JavaCompile).configureEach { - if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) { - options.release = targetJavaVersion + java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } } } @@ -51,18 +40,14 @@ configurations { shadowJar { configurations = [project.configurations.shadowImplementation] + archiveClassifier.set('') + + relocate 'org.apache.httpcomponents', 'eu.mhsl.lib.shadow.httpclient' + relocate 'com.sparkjava', 'eu.mhsl.lib.shadow.spark-core' + + mergeServiceFiles() } -tasks.register('copyJarToServer', Exec) { - dependsOn shadowJar - mustRunAfter shadowJar - - commandLine 'scp', 'build/libs/spawn-1.0-all.jar', 'root@10.20.6.1:/home/minecraft/server/plugins' -} - -tasks.register('copyJarToTestServer', Exec) { - dependsOn shadowJar - mustRunAfter shadowJar - - commandLine 'cp', 'build/libs/spawn-1.0-all.jar', '/home/elias/Dokumente/mcTestServer/plugins/spawn-1.0-all.jar' +if (file("local.gradle").exists()) { + apply from: "local.gradle" } diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 0000000..3129896 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,8 @@ +dependencies { + implementation project(':core') + + compileOnly 'io.papermc.paper:paper-api:1.21.7-R0.1-SNAPSHOT' + compileOnly 'org.geysermc.floodgate:api:2.2.4-SNAPSHOT' + implementation 'org.apache.httpcomponents:httpclient:4.5.14' + implementation 'com.sparkjava:spark-core:2.9.4' +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/api/WebsiteApiUtil.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/CraftAttackApi.java similarity index 85% rename from src/main/java/eu/mhsl/craftattack/spawn/util/api/WebsiteApiUtil.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/api/CraftAttackApi.java index 091c467..ce54750 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/api/WebsiteApiUtil.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/CraftAttackApi.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.util.api; +package eu.mhsl.craftattack.spawn.common.api; -import eu.mhsl.craftattack.spawn.config.Configuration; +import eu.mhsl.craftattack.spawn.core.config.Configuration; import org.apache.http.client.utils.URIBuilder; import org.bukkit.configuration.ConfigurationSection; @@ -8,7 +8,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Objects; -public class WebsiteApiUtil { +public class CraftAttackApi { private final static ConfigurationSection apiConfig = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")); public final static String basePath = apiConfig.getString("baseurl"); public final static String apiSecret = apiConfig.getString("secret"); diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/VaroApi.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/VaroApi.java new file mode 100644 index 0000000..9a93cdf --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/VaroApi.java @@ -0,0 +1,28 @@ +package eu.mhsl.craftattack.spawn.common.api; + +import eu.mhsl.craftattack.spawn.core.config.Configuration; +import org.bukkit.configuration.ConfigurationSection; + +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpRequest; +import java.util.Objects; + +public class VaroApi { + private final static ConfigurationSection apiConfig = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("varoApi")); + public final static String basePath = apiConfig.getString("endpoint"); + public final static String apiSecret = apiConfig.getString("auth"); + + public static URI getBaseUri() { + Objects.requireNonNull(basePath); + try { + return new URI(basePath); + } catch(URISyntaxException e) { + throw new RuntimeException(e); + } + } + + public static void authorizationHeader(HttpRequest.Builder builder) { + builder.header("Authorization", apiSecret); + } +} \ No newline at end of file diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/CraftAttackReportRepository.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/CraftAttackReportRepository.java new file mode 100644 index 0000000..e2bc7b7 --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/CraftAttackReportRepository.java @@ -0,0 +1,27 @@ +package eu.mhsl.craftattack.spawn.common.api.repositories; + +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.common.api.CraftAttackApi; +import java.util.UUID; + +public class CraftAttackReportRepository extends ReportRepository { + public CraftAttackReportRepository() { + super(CraftAttackApi.getBaseUri(), new RequestModifier(CraftAttackApi::withAuthorizationSecret, null)); + } + + public ReqResp queryReports(UUID player) { + return this.get( + "report", + (parameters) -> parameters.addParameter("uuid", player.toString()), + PlayerReports.class + ); + } + + public ReqResp createReport(ReportCreationInfo data) { + return this.post( + "report", + data, + ReportUrl.class + ); + } +} diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/ReportRepository.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/ReportRepository.java new file mode 100644 index 0000000..4ed05cb --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/ReportRepository.java @@ -0,0 +1,42 @@ +package eu.mhsl.craftattack.spawn.common.api.repositories; + +import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; +import eu.mhsl.craftattack.spawn.core.api.client.RepositoryLoader; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.net.URI; +import java.util.List; +import java.util.UUID; + +@RepositoryLoader.Abstraction +public abstract class ReportRepository extends HttpRepository { + public ReportRepository(URI basePath, RequestModifier... baseRequestModifier) { + super(basePath, baseRequestModifier); + } + + public record ReportCreationInfo(@NotNull UUID reporter, @Nullable UUID reported, String reason) { + } + + public record ReportUrl(@NotNull String url) { + } + + public record PlayerReports( + List from_self, + Object to_self + ) { + public record Report( + @Nullable Reporter reported, + @NotNull String subject, + boolean draft, + @NotNull String status, + @NotNull String url + ) { + public record Reporter( + @NotNull String username, + @NotNull String uuid + ) { + } + } + } +} diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/VaroReportRepository.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/VaroReportRepository.java new file mode 100644 index 0000000..8db4e4a --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/api/repositories/VaroReportRepository.java @@ -0,0 +1,45 @@ +package eu.mhsl.craftattack.spawn.common.api.repositories; + +import eu.mhsl.craftattack.spawn.common.api.VaroApi; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import org.apache.commons.lang3.NotImplementedException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class VaroReportRepository extends ReportRepository { + public VaroReportRepository() { + super(VaroApi.getBaseUri(), new RequestModifier(null, VaroApi::authorizationHeader)); + } + + public ReqResp queryReports(UUID player) { + throw new NotImplementedException("Report querying is not supported in Varo!"); + } + + public ReqResp createReport(ReportCreationInfo data) { + return this.post( + "report", + data, + ReportUrl.class + ); + } + + public record StrikeCreationInfo( + @Nullable UUID reporter, // null for automatic creations + @NotNull UUID reported, + @NotNull String reason, + @Nullable String body, + @Nullable String notice, + @Nullable String statement, + int strike_reason_id // internal strike mapping + ) { + } + public ReqResp createStrike(StrikeCreationInfo data) { + return this.put( + "report", + data, + Void.class + ); + } +} diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/debug/Debug.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/debug/Debug.java new file mode 100644 index 0000000..90d1355 --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/debug/Debug.java @@ -0,0 +1,20 @@ +package eu.mhsl.craftattack.spawn.common.appliances.internal.debug; + +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.internal.debug.command.AppliancesCommand; +import eu.mhsl.craftattack.spawn.common.appliances.internal.debug.command.UserInfoCommand; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class Debug extends Appliance { + @Override + @NotNull + protected List> commands() { + return List.of( + new UserInfoCommand(), + new AppliancesCommand() + ); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/debug/command/AppliancesCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/debug/command/AppliancesCommand.java similarity index 90% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/debug/command/AppliancesCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/debug/command/AppliancesCommand.java index 3a81c07..42cbd1b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/debug/command/AppliancesCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/debug/command/AppliancesCommand.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.internal.debug.command; +package eu.mhsl.craftattack.spawn.common.appliances.internal.debug.command; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.internal.debug.Debug; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.internal.debug.Debug; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/debug/command/UserInfoCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/debug/command/UserInfoCommand.java similarity index 93% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/debug/command/UserInfoCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/debug/command/UserInfoCommand.java index fe33aa6..6164c5a 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/debug/command/UserInfoCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/debug/command/UserInfoCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.internal.debug.command; +package eu.mhsl.craftattack.spawn.common.appliances.internal.debug.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.internal.debug.Debug; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.internal.debug.Debug; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/titleClear/TitleClear.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/titleClear/TitleClear.java similarity index 75% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/titleClear/TitleClear.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/titleClear/TitleClear.java index 91c58ca..64cd111 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/titleClear/TitleClear.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/titleClear/TitleClear.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.internal.titleClear; +package eu.mhsl.craftattack.spawn.common.appliances.internal.titleClear; -import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/titleClear/TitleClearListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/titleClear/TitleClearListener.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/titleClear/TitleClearListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/titleClear/TitleClearListener.java index 1841aed..b39dfb1 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/titleClear/TitleClearListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/internal/titleClear/TitleClearListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.internal.titleClear; +package eu.mhsl.craftattack.spawn.common.appliances.internal.titleClear; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/adminMarker/AdminMarker.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/adminMarker/AdminMarker.java new file mode 100644 index 0000000..aae8123 --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/adminMarker/AdminMarker.java @@ -0,0 +1,34 @@ +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.adminMarker; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class AdminMarker extends Appliance implements DisplayName.Colored { + public final static String adminPermission = "admin"; + + @Override + public @Nullable TextColor getNameColor(Player player) { + if(player.hasPermission(adminPermission)) + return TextColor.color(Color.AQUA.asRGB()); // TODO read permission from config + return TextColor.color(Color.WHITE.asRGB()); + } + + @Override + public void httpApi(HttpServer.ApiBuilder apiBuilder) { + apiBuilder.get("isAdmin", request -> { + OfflinePlayer player = Bukkit.getOfflinePlayer(UUID.fromString(request.queryParams("player"))); + Main.logger().info(String.format("Adminstatus requested for %s, response: %s", player.getUniqueId(), player.isOp())); + return player.isOp(); + }); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMention/ChatMention.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMention/ChatMention.java similarity index 87% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMention/ChatMention.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMention/ChatMention.java index 8c08711..964c3d2 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMention/ChatMention.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMention/ChatMention.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.chatMention; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.chatMention; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import net.kyori.adventure.sound.Sound; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMention/ChatMentionListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMention/ChatMentionListener.java similarity index 83% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMention/ChatMentionListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMention/ChatMentionListener.java index 2aeef66..be1fcf5 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMention/ChatMentionListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMention/ChatMentionListener.java @@ -1,10 +1,10 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.chatMention; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.chatMention; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.chatMessages.ChatMessages; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.chatMessages.ChatMessages; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; import io.papermc.paper.event.player.AsyncChatDecorateEvent; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMention/ChatMentionSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMention/ChatMentionSetting.java similarity index 71% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMention/ChatMentionSetting.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMention/ChatMentionSetting.java index 5cbf186..bba73b4 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMention/ChatMentionSetting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMention/ChatMentionSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.chatMention; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.chatMention; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.MultiBoolSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.MultiBoolSetting; import org.bukkit.Material; public class ChatMentionSetting extends MultiBoolSetting implements CategorizedSetting { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMessages/ChatMessages.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessages.java similarity index 83% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMessages/ChatMessages.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessages.java index f2d24f4..664a8ff 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMessages/ChatMessages.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessages.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.chatMessages; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.chatMessages; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMessages/ChatMessagesListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessagesListener.java similarity index 84% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMessages/ChatMessagesListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessagesListener.java index 29ecf21..561c5bf 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMessages/ChatMessagesListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessagesListener.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.chatMessages; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.chatMessages; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.util.IteratorUtil; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; import io.papermc.paper.event.player.AsyncChatEvent; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -30,7 +30,9 @@ class ChatMessagesListener extends ApplianceListener { @EventHandler(priority = EventPriority.HIGH) public void onPlayerJoin(PlayerJoinEvent event) { + boolean wasHidden = event.joinMessage() == null; event.joinMessage(null); + if(wasHidden) return; IteratorUtil.onlinePlayers(player -> { if(!Settings.instance().getSetting(player, Settings.Key.ShowJoinAndLeaveMessages, Boolean.class)) return; player.sendMessage( @@ -43,7 +45,9 @@ class ChatMessagesListener extends ApplianceListener { @EventHandler public void onPlayerLeave(PlayerQuitEvent event) { + boolean wasHidden = event.quitMessage() == null; event.quitMessage(null); + if(wasHidden) return; IteratorUtil.onlinePlayers(player -> { if(!Settings.instance().getSetting(player, Settings.Key.ShowJoinAndLeaveMessages, Boolean.class)) return; player.sendMessage( diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMessages/ShowJoinAndLeaveMessagesSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ShowJoinAndLeaveMessagesSetting.java similarity index 62% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMessages/ShowJoinAndLeaveMessagesSetting.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ShowJoinAndLeaveMessagesSetting.java index 2e3b68b..272d491 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/chatMessages/ShowJoinAndLeaveMessagesSetting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ShowJoinAndLeaveMessagesSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.chatMessages; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.chatMessages; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.BoolSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.BoolSetting; import org.bukkit.Material; public class ShowJoinAndLeaveMessagesSetting extends BoolSetting implements CategorizedSetting { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/displayName/DisplayName.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/displayName/DisplayName.java similarity index 56% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/displayName/DisplayName.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/displayName/DisplayName.java index 5c7df4e..2e9ec2d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/displayName/DisplayName.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/displayName/DisplayName.java @@ -1,14 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.displayName; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.gameplay.outlawed.Outlawed; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.adminMarker.AdminMarker; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.afkTag.AfkTag; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.sleepTag.SleepTag; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.yearRank.YearRank; -import eu.mhsl.craftattack.spawn.util.server.Floodgate; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.util.server.Floodgate; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; @@ -16,11 +11,12 @@ import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Objects; -import java.util.function.Supplier; import java.util.logging.Level; public class DisplayName extends Appliance { @@ -29,18 +25,33 @@ public class DisplayName extends Appliance { Component getNamePrefix(Player player); } + public interface Colored { + @Nullable + TextColor getNameColor(Player player); + } + public void update(Player player) { - TextColor playerColor = this.queryAppliance(AdminMarker.class).getPlayerColor(player); - List> prefixes = List.of( - () -> this.queryAppliance(Outlawed.class), - () -> this.queryAppliance(YearRank.class), - () -> this.queryAppliance(AfkTag.class), - () -> this.queryAppliance(SleepTag.class) + List coloring = Main.instance().getAppliances().stream() + .filter(appliance -> appliance instanceof Colored) + .map(appliance -> (Colored) appliance) + .toList(); + + if(coloring.size() > 1) throw new IllegalStateException( + "There are two or more appliances which provide coloring for player names. This is currently not supported!" ); + TextColor playerColor = coloring.isEmpty() + ? NamedTextColor.WHITE + : coloring.getFirst().getNameColor(player); + + List prefixes = Main.instance().getAppliances().stream() + .filter(appliance -> appliance instanceof Prefixed) + .map(appliance -> (Prefixed) appliance) + .toList(); + ComponentBuilder playerName = Component.text(); prefixes.stream() - .map(prefixed -> prefixed.get().getNamePrefix(player)) + .map(prefixed -> prefixed.getNamePrefix(player)) .filter(Objects::nonNull) .forEach(prefix -> playerName .append(prefix) @@ -72,4 +83,9 @@ public class DisplayName extends Appliance { Main.instance().getLogger().log(Level.SEVERE, e, e::getMessage); } } + + @Override + protected @NotNull List listeners() { + return List.of(new DisplayNameUpdateListener()); + } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/displayName/DisplayNameUpdateListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/displayName/DisplayNameUpdateListener.java similarity index 71% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/displayName/DisplayNameUpdateListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/displayName/DisplayNameUpdateListener.java index b394b05..19e6972 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/displayName/DisplayNameUpdateListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/displayName/DisplayNameUpdateListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.displayName; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/Help.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/Help.java new file mode 100644 index 0000000..a4d997d --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/Help.java @@ -0,0 +1,28 @@ +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help; + +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.command.DiscordCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.command.HelpCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.command.SpawnCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.command.TeamspeakCommand; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class Help extends Appliance { + public Help() { + super("help"); + } + + @Override + @NotNull + protected List> commands() { + return List.of( + new HelpCommand(), + new SpawnCommand(), + new TeamspeakCommand(), + new DiscordCommand() + ); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/DiscordCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/DiscordCommand.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/DiscordCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/DiscordCommand.java index 169f981..3959546 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/DiscordCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/DiscordCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.command; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.Help; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.Help; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/HelpCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/HelpCommand.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/HelpCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/HelpCommand.java index b4cd910..32cc538 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/HelpCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/HelpCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.command; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.Help; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.Help; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/SpawnCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/SpawnCommand.java similarity index 79% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/SpawnCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/SpawnCommand.java index 813ab77..a29aef4 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/SpawnCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/SpawnCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.command; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.Help; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.Help; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/TeamspeakCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/TeamspeakCommand.java similarity index 83% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/TeamspeakCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/TeamspeakCommand.java index 952cd1e..99bb450 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/command/TeamspeakCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/help/command/TeamspeakCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.command; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.Help; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.help.Help; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/Bar.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/Bar.java similarity index 93% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/Bar.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/Bar.java index 2b67577..d98ee51 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/Bar.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/Bar.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; import net.kyori.adventure.util.Ticks; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/InfoBarCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBarCommand.java similarity index 90% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/InfoBarCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBarCommand.java index a631496..4c7ca9c 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/InfoBarCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBarCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/InfoBars.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBars.java similarity index 84% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/InfoBars.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBars.java index eb2c304..b4d4fab 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/InfoBars.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/InfoBars.java @@ -1,11 +1,11 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars.bars.MsptBar; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars.bars.PlayerCounterBar; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars.bars.TpsBar; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.bars.MsptBar; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.bars.PlayerCounterBar; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.bars.TpsBar; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.event.Listener; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/ShowPreviousBarsListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/ShowPreviousBarsListener.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/ShowPreviousBarsListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/ShowPreviousBarsListener.java index f8513fd..401b4ea 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/ShowPreviousBarsListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/ShowPreviousBarsListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/bars/MsptBar.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/MsptBar.java similarity index 83% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/bars/MsptBar.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/MsptBar.java index 2682676..d7e6b87 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/bars/MsptBar.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/MsptBar.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars.bars; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.bars; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars.Bar; -import eu.mhsl.craftattack.spawn.util.statistics.ServerMonitor; -import eu.mhsl.craftattack.spawn.util.text.ColorUtil; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.Bar; +import eu.mhsl.craftattack.spawn.core.util.statistics.ServerMonitor; +import eu.mhsl.craftattack.spawn.core.util.text.ColorUtil; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/bars/PlayerCounterBar.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/PlayerCounterBar.java similarity index 79% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/bars/PlayerCounterBar.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/PlayerCounterBar.java index 550ba13..60743d5 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/bars/PlayerCounterBar.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/PlayerCounterBar.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars.bars; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.bars; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars.Bar; -import eu.mhsl.craftattack.spawn.appliances.tooling.playerlimit.PlayerLimit; -import eu.mhsl.craftattack.spawn.util.text.ColorUtil; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.Bar; +import eu.mhsl.craftattack.spawn.common.appliances.tooling.playerlimit.PlayerLimit; +import eu.mhsl.craftattack.spawn.core.util.text.ColorUtil; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/bars/TpsBar.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/TpsBar.java similarity index 86% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/bars/TpsBar.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/TpsBar.java index 8c88b50..f956508 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/infoBars/bars/TpsBar.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/infoBars/bars/TpsBar.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars.bars; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.bars; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.infoBars.Bar; -import eu.mhsl.craftattack.spawn.util.text.ColorUtil; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.infoBars.Bar; +import eu.mhsl.craftattack.spawn.core.util.text.ColorUtil; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/privateMessage/PrivateMessage.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/privateMessage/PrivateMessage.java similarity index 93% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/privateMessage/PrivateMessage.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/privateMessage/PrivateMessage.java index c3a4e35..a571c53 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/privateMessage/PrivateMessage.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/privateMessage/PrivateMessage.java @@ -1,11 +1,11 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.privateMessage; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.privateMessage; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.chatMessages.ChatMessages; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.privateMessage.commands.PrivateMessageCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.privateMessage.commands.PrivateReplyCommand; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.chatMessages.ChatMessages; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.privateMessage.commands.PrivateMessageCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.privateMessage.commands.PrivateReplyCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/privateMessage/commands/PrivateMessageCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/privateMessage/commands/PrivateMessageCommand.java similarity index 68% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/privateMessage/commands/PrivateMessageCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/privateMessage/commands/PrivateMessageCommand.java index 47d11fe..35df21e 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/privateMessage/commands/PrivateMessageCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/privateMessage/commands/PrivateMessageCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.privateMessage.commands; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.privateMessage.commands; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.privateMessage.PrivateMessage; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.privateMessage.PrivateMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/privateMessage/commands/PrivateReplyCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/privateMessage/commands/PrivateReplyCommand.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/privateMessage/commands/PrivateReplyCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/privateMessage/commands/PrivateReplyCommand.java index f018f0b..18f430c 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/privateMessage/commands/PrivateReplyCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/privateMessage/commands/PrivateReplyCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.privateMessage.commands; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.privateMessage.commands; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.privateMessage.PrivateMessage; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.privateMessage.PrivateMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/report/Report.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/Report.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/report/Report.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/Report.java index 7964e90..9dc1e72 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/report/Report.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/Report.java @@ -1,10 +1,12 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.report; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.report; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.api.client.repositories.ReportRepository; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.api.repositories.ReportRepository; +import eu.mhsl.craftattack.spawn.common.api.repositories.VaroReportRepository; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.common.api.repositories.CraftAttackReportRepository; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; @@ -36,7 +38,7 @@ public class Report extends Appliance { } public void reportToUnknown(@NotNull Player issuer) { - ReportRepository.ReportCreationInfo request = new ReportRepository.ReportCreationInfo(issuer.getUniqueId(), null, ""); + CraftAttackReportRepository.ReportCreationInfo request = new CraftAttackReportRepository.ReportCreationInfo(issuer.getUniqueId(), null, ""); Bukkit.getScheduler().runTaskAsynchronously( Main.instance(), () -> this.createReport(issuer, request) @@ -62,16 +64,17 @@ public class Report extends Appliance { } private void createReport(Player issuer, ReportRepository.ReportCreationInfo reportRequest) { - ReqResp createdReport = this.queryRepository(ReportRepository.class) + ReqResp createdReport = this.queryRepository(VaroReportRepository.class) .createReport(reportRequest); switch(createdReport.status()) { + case 200: // varo-endpoint specific case 201: issuer.sendMessage( Component.text() .append(Component.text("\\/".repeat(20), NamedTextColor.DARK_GRAY)) .appendNewline() - .append(Component.text("⚠ Der Report muss über den folgenden Link fertiggestellt werden!", NamedTextColor.GOLD)) + .append(Component.text("⚠ Der Report muss über den folgenden Link fertiggestellt werden:", NamedTextColor.GOLD)) .appendNewline() .appendNewline() .append( @@ -112,7 +115,7 @@ public class Report extends Appliance { } public void queryReports(Player issuer) { - ReqResp userReports = this.queryRepository(ReportRepository.class) + ReqResp userReports = this.queryRepository(VaroReportRepository.class) .queryReports(issuer.getUniqueId()); if(userReports.status() != 200) { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/report/ReportCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/ReportCommand.java similarity index 90% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/report/ReportCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/ReportCommand.java index 09b1c3b..55802dd 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/report/ReportCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/ReportCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.report; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.report; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/report/ReportsCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/ReportsCommand.java similarity index 72% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/report/ReportsCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/ReportsCommand.java index a748413..a3ea21a 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/report/ReportsCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/report/ReportsCommand.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.report; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.report; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/CategorizedSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/CategorizedSetting.java new file mode 100644 index 0000000..8fa1ad8 --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/CategorizedSetting.java @@ -0,0 +1,5 @@ +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings; + +public interface CategorizedSetting { + SettingCategory category(); +} diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/SettingCategory.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/SettingCategory.java new file mode 100644 index 0000000..0b45420 --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/SettingCategory.java @@ -0,0 +1,7 @@ +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings; + +public enum SettingCategory { + Gameplay, + Visuals, + Misc, +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/Settings.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/Settings.java similarity index 83% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/Settings.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/Settings.java index 02443c6..6bc857f 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/Settings.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/Settings.java @@ -1,11 +1,12 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.Setting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.listeners.OpenSettingsShortcutListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.listeners.SettingsInventoryListener; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.Setting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.listeners.OpenSettingsShortcutListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.listeners.SettingsInventoryListener; +import eu.mhsl.craftattack.spawn.core.util.world.InteractSounds; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -33,6 +34,7 @@ public class Settings extends Appliance { ChatMentions, DoubleDoors, KnockDoors, + BorderWarning } public static Settings instance() { @@ -107,6 +109,9 @@ public class Settings extends Appliance { .filter(setting -> ((CategorizedSetting) setting).category().equals(category)) .toList(); + //skip empty category rows + if(categorizedSettings.isEmpty()) return; + for(int i = 0; i < categorizedSettings.size(); i++) { int slot = row.get() * 9 + i % 9; inventory.setItem(slot, categorizedSettings.get(i).buildItem()); @@ -132,6 +137,7 @@ public class Settings extends Appliance { } player.openInventory(inventory); + InteractSounds.of(player).open(); this.openSettingsInventories.put(player, new OpenSettingsInventory(inventory, settings)); } @@ -139,23 +145,30 @@ public class Settings extends Appliance { int countOfUncategorized = (int) settings.stream() .filter(setting -> !(setting instanceof CategorizedSetting)) .count(); + int invSizeForUncategorized = (int) Math.ceil((double) countOfUncategorized / 9) * 9; - return Arrays.stream(SettingCategory.values()) + int invSizeForCategorized = Arrays.stream(SettingCategory.values()) .map(settingCategory -> settings.stream() .filter(setting -> setting instanceof CategorizedSetting) .map(setting -> (CategorizedSetting) setting) .filter(categorizedSetting -> categorizedSetting.category().equals(settingCategory)) .count()) - .map(itemCount -> itemCount + countOfUncategorized) .map(itemCount -> (int) Math.ceil((double) itemCount / 9)) .reduce(Integer::sum) .orElse(1) * 9; + + int invSize = invSizeForUncategorized + invSizeForCategorized; + if(invSize % 9 != 0) throw new IllegalStateException( + String.format("Failed to calculate settings inventory size. %d is not an multiple of 9", invSize) + ); + return invSize; } public void onSettingsClose(Player player) { if(!this.openSettingsInventories.containsKey(player)) return; this.openSettingsInventories.remove(player); player.updateInventory(); + InteractSounds.of(player).close(); } public boolean hasSettingsNotOpen(Player player) { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/SettingsCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/SettingsCommand.java similarity index 77% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/SettingsCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/SettingsCommand.java index 14b9469..db17156 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/SettingsCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/SettingsCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/SettingsShortcutSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/SettingsShortcutSetting.java similarity index 82% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/SettingsShortcutSetting.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/SettingsShortcutSetting.java index 8c7ff01..4737ba4 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/SettingsShortcutSetting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/SettingsShortcutSetting.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.BoolSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.BoolSetting; import org.bukkit.Material; public class SettingsShortcutSetting extends BoolSetting implements CategorizedSetting { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/ActionSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/ActionSetting.java similarity index 93% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/ActionSetting.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/ActionSetting.java index 81e83ac..573704f 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/ActionSetting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/ActionSetting.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/BoolSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/BoolSetting.java similarity index 92% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/BoolSetting.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/BoolSetting.java index 8f22caf..3386975 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/BoolSetting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/BoolSetting.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.entity.Player; diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/IntegerSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/IntegerSetting.java new file mode 100644 index 0000000..06824da --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/IntegerSetting.java @@ -0,0 +1,103 @@ +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes; + +import com.google.gson.Gson; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public abstract class IntegerSetting extends Setting { + private final List options; + + public IntegerSetting(Settings.Key key, int minimum, int maximum) { + this(key, IntStream.range(minimum, maximum+1).boxed().toList()); + } + + public IntegerSetting(Settings.Key key, List options) { + super(key); + this.options = options; + } + + @Override + public ItemMeta buildMeta(ItemMeta meta) { + Component componentBefore = Component.text(" " + this.fillWithSpaces(this.options.getLast())); + Component componentAfter = Component.text(" " + this.fillWithSpaces(this.options.getFirst())); + int listIndex = this.options.indexOf(this.state); + if(listIndex > 0) componentBefore = Component.text(" " + this.fillWithSpaces(this.options.get(listIndex-1))); + if(listIndex < this.options.size()-1) componentAfter = Component.text(" " + this.fillWithSpaces(this.options.get(listIndex+1))); + + meta.displayName(Component.text(this.title(), NamedTextColor.WHITE)); + List lore = new ArrayList<>(Stream.of( + Component.empty() + .append(Component.text("Wert: ", NamedTextColor.DARK_GRAY)), + Component.empty() + .append(componentBefore.color(NamedTextColor.DARK_GRAY)) + .append(Component.text(" " + this.fillWithSpaces(this.state), NamedTextColor.GREEN)) + .append(componentAfter.color(NamedTextColor.DARK_GRAY)), + Component.empty() + ).toList()); + lore.addAll(this.buildDescription(this.description())); + meta.lore(lore); + return meta; + } + + private String fillWithSpaces(Integer option) { + String optionString = option.toString(); + int optionLength = optionString.length(); + int maxInteger = this.options.stream().mapToInt(value -> value).max().orElse(0); + int maxLength = String.valueOf(maxInteger).length(); + int padding = maxLength - optionLength; + + int padEnd = padding / 2; + int padStart = padding - padEnd; + + optionString = " ".repeat(padStart) + optionString + " ".repeat(padEnd); + return optionString; + } + + @Override + protected void change(Player player, ClickType clickType) { + int elementBefore = this.options.getLast(); + int elementAfter = this.options.getFirst(); + int listIndex = this.options.indexOf(this.state); + if(listIndex > 0) elementBefore = this.options.get(listIndex-1); + if(listIndex < this.options.size()-1) elementAfter = this.options.get(listIndex+1); + + if(clickType.equals(ClickType.LEFT)) this.state = elementBefore; + if(clickType.equals(ClickType.RIGHT)) this.state = elementAfter; + } + + @Override + protected void fromStorage(PersistentDataContainer container) { + this.state = container.has(this.getNamespacedKey()) + ? Integer.valueOf(Objects.requireNonNull(container.get(this.getNamespacedKey(), PersistentDataType.STRING))) + : this.defaultValue(); + + if(!this.options.contains(this.state)) this.state = this.defaultValue(); + } + + @Override + protected void toStorage(PersistentDataContainer container, Integer value) { + container.set(this.getNamespacedKey(), PersistentDataType.STRING, new Gson().toJson(value)); + } + + @Override + public Class dataType() { + return Integer.class; + } + + @Override + public Integer state() { + return this.state; + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/MultiBoolSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/MultiBoolSetting.java similarity index 97% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/MultiBoolSetting.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/MultiBoolSetting.java index 702f8b9..24d3024 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/MultiBoolSetting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/MultiBoolSetting.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes; import com.google.gson.Gson; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.entity.Player; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/SelectSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/SelectSetting.java similarity index 95% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/SelectSetting.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/SelectSetting.java index 4607cf3..4b6a7d6 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/SelectSetting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/SelectSetting.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Material; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/Setting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/Setting.java similarity index 81% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/Setting.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/Setting.java index ee3eadb..296a46b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/datatypes/Setting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/datatypes/Setting.java @@ -1,8 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.util.world.InteractSounds; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; @@ -17,7 +18,7 @@ import org.bukkit.persistence.PersistentDataContainer; import java.util.List; public abstract class Setting { - TDataType state; + protected TDataType state; private final Settings.Key key; public Setting(Settings.Key key) { @@ -37,7 +38,9 @@ public abstract class Setting { } public void triggerChange(Player p, ClickType clickType) { + if(clickType.equals(ClickType.DOUBLE_CLICK)) return; this.change(p, clickType); + InteractSounds.of(p).click(); this.toStorage(p.getPersistentDataContainer(), this.state()); } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/listeners/OpenSettingsShortcutListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/listeners/OpenSettingsShortcutListener.java similarity index 69% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/listeners/OpenSettingsShortcutListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/listeners/OpenSettingsShortcutListener.java index 93b58a3..f73c7fc 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/listeners/OpenSettingsShortcutListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/listeners/OpenSettingsShortcutListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.listeners; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.listeners; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerSwapHandItemsEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/listeners/SettingsInventoryListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/listeners/SettingsInventoryListener.java similarity index 82% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/listeners/SettingsInventoryListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/listeners/SettingsInventoryListener.java index 7a2d06e..d9b5122 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/listeners/SettingsInventoryListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/settings/listeners/SettingsInventoryListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.listeners; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.listeners; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/tablist/Tablist.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/tablist/Tablist.java similarity index 78% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/tablist/Tablist.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/tablist/Tablist.java index e5ccc12..8bc403d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/tablist/Tablist.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/tablist/Tablist.java @@ -1,13 +1,13 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.tablist; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.tablist; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.report.Report; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.util.IteratorUtil; -import eu.mhsl.craftattack.spawn.util.statistics.NetworkMonitor; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; -import eu.mhsl.craftattack.spawn.util.text.RainbowComponent; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.report.Report; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; +import eu.mhsl.craftattack.spawn.core.util.statistics.NetworkMonitor; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.util.text.RainbowComponent; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.util.Ticks; @@ -23,7 +23,8 @@ import java.util.List; public class Tablist extends Appliance { - private final RainbowComponent serverName = new RainbowComponent(" CraftAttack 7 ", 7, 3); + private final String projectTitle = this.localConfig().getString("projectTitle", "Title not configured"); + private final RainbowComponent serverName = new RainbowComponent(String.format(" %s ", this.projectTitle), 7, 3); private NetworkMonitor networkMonitor; private OperatingSystemMXBean systemMonitor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/tablist/TablistListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/tablist/TablistListener.java similarity index 66% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/tablist/TablistListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/tablist/TablistListener.java index c914731..174c7ea 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/tablist/TablistListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/tablist/TablistListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.tablist; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.tablist; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/tablist/TechnicalTablistSetting.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/tablist/TechnicalTablistSetting.java similarity index 62% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/tablist/TechnicalTablistSetting.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/tablist/TechnicalTablistSetting.java index 43cb690..9e69ffa 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/tablist/TechnicalTablistSetting.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/tablist/TechnicalTablistSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.tablist; +package eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.tablist; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.BoolSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.BoolSetting; import org.bukkit.Material; public class TechnicalTablistSetting extends BoolSetting implements CategorizedSetting { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/acInform/AcInform.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/acInform/AcInform.java similarity index 96% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/acInform/AcInform.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/acInform/AcInform.java index c6eae0d..efd5c05 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/acInform/AcInform.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/acInform/AcInform.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.acInform; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.acInform; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/acInform/AcInformCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/acInform/AcInformCommand.java similarity index 81% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/acInform/AcInformCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/acInform/AcInformCommand.java index 091dc70..30bfd9b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/acInform/AcInformCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/acInform/AcInformCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.acInform; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.acInform; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/adminChat/AdminChat.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/adminChat/AdminChat.java similarity index 86% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/adminChat/AdminChat.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/adminChat/AdminChat.java index 30fccca..c3786ce 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/adminChat/AdminChat.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/adminChat/AdminChat.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.adminChat; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.adminChat; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/adminChat/AdminChatCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/adminChat/AdminChatCommand.java similarity index 82% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/adminChat/AdminChatCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/adminChat/AdminChatCommand.java index 8b1de97..dfa9fda 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/adminChat/AdminChatCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/adminChat/AdminChatCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.adminChat; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.adminChat; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/chatMute/ChatMute.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/chatMute/ChatMute.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/chatMute/ChatMute.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/chatMute/ChatMute.java index fcaebd3..0ffe686 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/chatMute/ChatMute.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/chatMute/ChatMute.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.chatMute; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.chatMute; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.event.Listener; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/chatMute/ChatMuteListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/chatMute/ChatMuteListener.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/chatMute/ChatMuteListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/chatMute/ChatMuteListener.java index e6a1cb4..0e57ba2 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/chatMute/ChatMuteListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/chatMute/ChatMuteListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.chatMute; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.chatMute; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.util.text.DataSizeConverter; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.util.text.DataSizeConverter; import io.papermc.paper.event.player.AsyncChatEvent; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/chatMute/MuteCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/chatMute/MuteCommand.java similarity index 90% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/chatMute/MuteCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/chatMute/MuteCommand.java index 0d3324b..f9e3d86 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/chatMute/MuteCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/chatMute/MuteCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.chatMute; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.chatMute; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPrevent.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPrevent.java new file mode 100644 index 0000000..cda488b --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPrevent.java @@ -0,0 +1,63 @@ +package eu.mhsl.craftattack.spawn.common.appliances.tooling.endPrevent; + +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.config.Configuration; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class EndPrevent extends Appliance { + private final String endPreventKey = "endPrevent"; + private State endPreventState; + private final World endWorld = Bukkit.getWorlds().stream().filter(world -> world.getEnvironment().equals(World.Environment.THE_END)).findFirst().orElseThrow(); + + public enum State { + OPEN, + CLOSED, + NO_OUTER + } + + public EndPrevent() { + super("endPrevent"); + this.endPreventState = State.valueOf(this.localConfig().getString(this.endPreventKey, State.OPEN.name())); + this.updateEndBorder(); + } + + private void updateEndBorder() { + if(this.endPreventState == State.NO_OUTER) this.endWorld.getWorldBorder().setSize(500); + if(this.endPreventState == State.OPEN) this.endWorld.getWorldBorder().setSize(this.endWorld.getWorldBorder().getMaxSize()); + } + + public void setEndState(State state) { + this.localConfig().set(this.endPreventKey, state.name()); + Configuration.saveChanges(); + this.endPreventState = state; + this.updateEndBorder(); + } + + public boolean isEndClosed() { + return this.endPreventState.equals(State.CLOSED); + } + + public boolean isOnlyInner() { + return this.endPreventState.equals(State.NO_OUTER); + } + + public State getEndPreventState() { + return this.endPreventState; + } + + @Override + protected @NotNull List listeners() { + return List.of(new EndPreventListener()); + } + + @Override + protected @NotNull List> commands() { + return List.of(new EndPreventCommand()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/endPrevent/EndPreventCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventCommand.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/endPrevent/EndPreventCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventCommand.java index 5401467..0787e81 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/endPrevent/EndPreventCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.endPrevent; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.endPrevent; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; @@ -12,7 +12,11 @@ import java.util.List; import java.util.Map; class EndPreventCommand extends ApplianceCommand { - private final Map arguments = Map.of("preventEnd", true, "allowEnd", false); + private final Map arguments = Map.of( + "preventEnd", EndPrevent.State.CLOSED, + "allowEnd", EndPrevent.State.OPEN, + "onlyInnerEnd", EndPrevent.State.NO_OUTER + ); public EndPreventCommand() { super("endPrevent"); @@ -21,11 +25,11 @@ class EndPreventCommand extends ApplianceCommand { @Override protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception { if(args.length == 1 && this.arguments.containsKey(args[0])) { - this.getAppliance().setEndDisabled(this.arguments.get(args[0])); + this.getAppliance().setEndState(this.arguments.get(args[0])); sender.sendMessage(Component.text("Setting updated!", NamedTextColor.GREEN)); } sender.sendMessage(Component.text( - String.format("The End is %s!", this.getAppliance().isEndDisabled() ? "closed" : "open"), + String.format("The End is now on '%s'!", this.getAppliance().getEndPreventState().name()), NamedTextColor.GOLD )); } diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventListener.java new file mode 100644 index 0000000..1cbb294 --- /dev/null +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventListener.java @@ -0,0 +1,49 @@ +package eu.mhsl.craftattack.spawn.common.appliances.tooling.endPrevent; + +import com.destroystokyo.paper.event.player.PlayerTeleportEndGatewayEvent; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPortalEvent; + +class EndPreventListener extends ApplianceListener { + @EventHandler + public void onEnderEyeInteraction(PlayerInteractEvent event) { + if(event.getClickedBlock() == null) return; + if(!event.getClickedBlock().getType().equals(Material.END_PORTAL_FRAME)) return; + if(event.getItem() == null) return; + if(!event.getItem().getType().equals(Material.ENDER_EYE)) return; + + this.cancelIfClosed(event, event.getPlayer()); + } + + @EventHandler + public void onPlayerPortal(PlayerPortalEvent event) { + if(!event.getTo().getWorld().getEnvironment().equals(World.Environment.THE_END)) return; + + this.cancelIfClosed(event, event.getPlayer()); + } + + @EventHandler + public void onPlayerEndGateway(PlayerTeleportEndGatewayEvent event) { + this.cancelIfOnlyInner(event, event.getPlayer()); + } + + private void cancelIfClosed(Cancellable event, Player p) { + if(!this.getAppliance().isEndClosed()) return; + event.setCancelled(true); + p.sendActionBar(Component.text("Das End ist nicht freigeschaltet!", NamedTextColor.RED)); + } + + private void cancelIfOnlyInner(Cancellable event, Player p) { + if(!this.getAppliance().isOnlyInner()) return; + event.setCancelled(true); + p.sendActionBar(Component.text("Das Outer End ist nicht freigeschaltet!", NamedTextColor.RED)); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/kick/Kick.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/kick/Kick.java similarity index 75% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/kick/Kick.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/kick/Kick.java index 2a9155e..c9b1389 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/kick/Kick.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/kick/Kick.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.kick; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.kick; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/kick/KickCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/kick/KickCommand.java similarity index 88% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/kick/KickCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/kick/KickCommand.java index 3072970..c9edaac 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/kick/KickCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/kick/KickCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.kick; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.kick; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/maintenance/Maintenance.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/maintenance/Maintenance.java similarity index 79% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/maintenance/Maintenance.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/maintenance/Maintenance.java index d47882e..e851a4f 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/maintenance/Maintenance.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/maintenance/Maintenance.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.maintenance; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.maintenance; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.config.Configuration; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.config.Configuration; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/maintenance/MaintenanceCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/maintenance/MaintenanceCommand.java similarity index 90% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/maintenance/MaintenanceCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/maintenance/MaintenanceCommand.java index 3e292d1..11a2ce1 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/maintenance/MaintenanceCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/maintenance/MaintenanceCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.maintenance; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.maintenance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/maintenance/PreventMaintenanceJoinListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/maintenance/PreventMaintenanceJoinListener.java similarity index 78% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/maintenance/PreventMaintenanceJoinListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/maintenance/PreventMaintenanceJoinListener.java index f1c298e..b50671d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/maintenance/PreventMaintenanceJoinListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/maintenance/PreventMaintenanceJoinListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.maintenance; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.maintenance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerLoginEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/panicBan/PanicBan.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/panicBan/PanicBan.java similarity index 85% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/panicBan/PanicBan.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/panicBan/PanicBan.java index 1342941..a0602de 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/panicBan/PanicBan.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/panicBan/PanicBan.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.panicBan; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.panicBan; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Listener; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/panicBan/PanicBanCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/panicBan/PanicBanCommand.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/panicBan/PanicBanCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/panicBan/PanicBanCommand.java index aa74436..445efbb 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/panicBan/PanicBanCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/panicBan/PanicBanCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.panicBan; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.panicBan; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/panicBan/PanicBanJoinListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/panicBan/PanicBanJoinListener.java similarity index 78% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/panicBan/PanicBanJoinListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/panicBan/PanicBanJoinListener.java index aa52aa7..5377fcd 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/panicBan/PanicBanJoinListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/panicBan/PanicBanJoinListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.panicBan; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.panicBan; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/playerlimit/PlayerLimit.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/playerlimit/PlayerLimit.java similarity index 79% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/playerlimit/PlayerLimit.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/playerlimit/PlayerLimit.java index 99b606e..7c83f59 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/playerlimit/PlayerLimit.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/playerlimit/PlayerLimit.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.playerlimit; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.playerlimit; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.config.Configuration; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.config.Configuration; import org.bukkit.Bukkit; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/playerlimit/PlayerLimiterListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/playerlimit/PlayerLimiterListener.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/playerlimit/PlayerLimiterListener.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/playerlimit/PlayerLimiterListener.java index 8a2b804..9af9203 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/playerlimit/PlayerLimiterListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/playerlimit/PlayerLimiterListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.playerlimit; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.playerlimit; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/playerlimit/SetPlayerLimitCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/playerlimit/SetPlayerLimitCommand.java similarity index 87% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/playerlimit/SetPlayerLimitCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/playerlimit/SetPlayerLimitCommand.java index 8d7d87f..75f2403 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/playerlimit/SetPlayerLimitCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/playerlimit/SetPlayerLimitCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.playerlimit; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.playerlimit; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/restart/CancelRestartCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/restart/CancelRestartCommand.java similarity index 77% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/restart/CancelRestartCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/restart/CancelRestartCommand.java index 04d3f2f..eee622c 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/restart/CancelRestartCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/restart/CancelRestartCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.restart; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.restart; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/restart/Restart.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/restart/Restart.java similarity index 84% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/restart/Restart.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/restart/Restart.java index e18d536..8987eae 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/restart/Restart.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/restart/Restart.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.restart; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.restart; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.IteratorUtil; -import eu.mhsl.craftattack.spawn.util.text.Countdown; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; +import eu.mhsl.craftattack.spawn.core.util.text.Countdown; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/restart/ScheduleRestartCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/restart/ScheduleRestartCommand.java similarity index 78% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/restart/ScheduleRestartCommand.java rename to common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/restart/ScheduleRestartCommand.java index d427641..5046bb1 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/restart/ScheduleRestartCommand.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/restart/ScheduleRestartCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.restart; +package eu.mhsl.craftattack.spawn.common.appliances.tooling.restart; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..34337b5 --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,7 @@ +dependencies { + compileOnly 'io.papermc.paper:paper-api:1.21.7-R0.1-SNAPSHOT' + compileOnly 'org.geysermc.floodgate:api:2.2.4-SNAPSHOT' + implementation 'org.apache.httpcomponents:httpclient:4.5.14' + implementation 'com.sparkjava:spark-core:2.9.4' + implementation 'org.reflections:reflections:0.10.2' +} \ No newline at end of file diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/Main.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/Main.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/Main.java index 4c460bb..6eaa8ec 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/Main.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn; +package eu.mhsl.craftattack.spawn.core; -import eu.mhsl.craftattack.spawn.api.client.RepositoryLoader; -import eu.mhsl.craftattack.spawn.api.server.HttpServer; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.config.Configuration; +import eu.mhsl.craftattack.spawn.core.api.client.RepositoryLoader; +import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.config.Configuration; import org.bukkit.Bukkit; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; @@ -16,11 +16,13 @@ import java.util.logging.Level; import java.util.logging.Logger; public final class Main extends JavaPlugin { + public static final String projectPackage = "eu.mhsl.craftattack.spawn"; private static Main instance; private static Logger logger; private List appliances; private RepositoryLoader repositoryLoader; + private Reflections reflections; @Override public void onEnable() { @@ -39,15 +41,15 @@ public final class Main extends JavaPlugin { Configuration.readConfig(); List disabledAppliances = Configuration.pluginConfig.getStringList("disabledAppliances"); + Main.logger().info("Initializing reflections..."); + this.reflections = new Reflections(projectPackage); + Main.logger().info("Loading Repositories..."); this.repositoryLoader = new RepositoryLoader(); Main.logger().info(String.format("Loaded %d repositories!", this.repositoryLoader.getRepositories().size())); Main.logger().info("Loading appliances..."); - Reflections reflections = new Reflections(this.getClass().getPackageName()); - Set> applianceClasses = reflections.getSubTypesOf(Appliance.class); - - this.appliances = applianceClasses.stream() + this.appliances = this.findSubtypesOf(Appliance.class).stream() .filter(applianceClass -> !disabledAppliances.contains(applianceClass.getSimpleName())) .map(applianceClass -> { try { @@ -66,8 +68,10 @@ public final class Main extends JavaPlugin { }); Main.logger().info(String.format("Initialized %d appliances!", this.appliances.size())); - Main.logger().info("Starting HTTP API..."); - new HttpServer(); + if(Configuration.pluginConfig.getBoolean("httpServerEnabled", true)) { + Main.logger().info("Starting HTTP API..."); + new HttpServer(); + } this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); Main.logger().info("Startup complete!"); @@ -95,6 +99,10 @@ public final class Main extends JavaPlugin { .orElseThrow(() -> new RuntimeException(String.format("Appliance %s not loaded or instantiated!", clazz))); } + public Set> findSubtypesOf(Class type) { + return this.reflections.getSubTypesOf(type); + } + @SuppressWarnings("unchecked") public static Class getApplianceType(Class clazz) { return (Class) ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0]; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/api/HttpStatus.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/HttpStatus.java similarity index 91% rename from src/main/java/eu/mhsl/craftattack/spawn/util/api/HttpStatus.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/api/HttpStatus.java index 658cd20..861b267 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/api/HttpStatus.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/HttpStatus.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.api; +package eu.mhsl.craftattack.spawn.core.api; public class HttpStatus { public static final int OK = 200; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/HttpRepository.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/HttpRepository.java similarity index 56% rename from src/main/java/eu/mhsl/craftattack/spawn/api/client/HttpRepository.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/HttpRepository.java index 3cf1e77..ee9eebf 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/client/HttpRepository.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/HttpRepository.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.api.client; +package eu.mhsl.craftattack.spawn.core.api.client; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; import org.apache.http.client.utils.URIBuilder; import org.jetbrains.annotations.Nullable; @@ -10,23 +10,29 @@ import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.util.List; +import java.util.Objects; import java.util.function.Consumer; -@RepositoryLoader.IgnoreRepository +@RepositoryLoader.Abstraction public abstract class HttpRepository extends Repository { - private final Consumer baseUriBuilder; + public record RequestModifier( + @Nullable Consumer uri, + @Nullable Consumer header + ) {} + + private final List baseRequestModifier; public HttpRepository(URI basePath) { - this(basePath, null); + this(basePath, new RequestModifier(null, null)); } - public HttpRepository(URI basePath, @Nullable Consumer baseUriBuilder) { + public HttpRepository(URI basePath, RequestModifier... baseRequestModifier) { super(basePath); - this.baseUriBuilder = baseUriBuilder == null - ? uriBuilder -> { - } - : baseUriBuilder; + this.baseRequestModifier = baseRequestModifier == null + ? List.of() + : List.of(baseRequestModifier); } protected ReqResp post(String command, TInput data, Class outputType) { @@ -39,7 +45,20 @@ public abstract class HttpRepository extends Repository { .POST(HttpRequest.BodyPublishers.ofString(this.gson.toJson(data))) .build(); - return this.execute(request, outputType); + return this.execute(request, outputType, data); + } + + protected ReqResp put(String command, TInput data, Class outputType) { + return this.put(command, parameters -> { + }, data, outputType); + } + + protected ReqResp put(String command, Consumer parameters, TInput data, Class outputType) { + HttpRequest request = this.getRequestBuilder(this.getUri(command, parameters)) + .PUT(HttpRequest.BodyPublishers.ofString(this.gson.toJson(data))) + .build(); + + return this.execute(request, outputType, data); } protected ReqResp get(String command, Class outputType) { @@ -52,13 +71,17 @@ public abstract class HttpRepository extends Repository { .GET() .build(); - return this.execute(request, outputType); + return this.execute(request, outputType, null); } private URI getUri(String command, Consumer parameters) { try { URIBuilder builder = new URIBuilder(this.basePath + "/" + command); - this.baseUriBuilder.accept(builder); + this.baseRequestModifier.stream() + .map(requestModifier -> requestModifier.uri) + .filter(Objects::nonNull) + .forEach(modifier -> modifier.accept(builder)); + parameters.accept(builder); return builder.build(); } catch(URISyntaxException e) { @@ -67,14 +90,27 @@ public abstract class HttpRepository extends Repository { } private HttpRequest.Builder getRequestBuilder(URI endpoint) { - return HttpRequest.newBuilder() + HttpRequest.Builder builder = HttpRequest.newBuilder() .uri(endpoint) .header("User-Agent", Main.instance().getServer().getBukkitVersion()) .header("Content-Type", "application/json"); + + this.baseRequestModifier.stream() + .map(requestModifier -> requestModifier.header) + .filter(Objects::nonNull) + .forEach(modifier -> modifier.accept(builder)); + + return builder; } - private ReqResp execute(HttpRequest request, Class clazz) { + private ReqResp execute(HttpRequest request, Class clazz, Object original) { ReqResp rawResponse = this.sendHttp(request); + Main.logger().info(String.format( + "Request: %s\nRequest-Data: %s\nResponse: %s", + request, + this.gson.toJson(original), + rawResponse + )); return new ReqResp<>(rawResponse.status(), this.gson.fromJson(rawResponse.data(), clazz)); } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/Repository.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/Repository.java similarity index 71% rename from src/main/java/eu/mhsl/craftattack/spawn/api/client/Repository.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/Repository.java index b45e360..09f6422 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/client/Repository.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/Repository.java @@ -1,7 +1,8 @@ -package eu.mhsl.craftattack.spawn.api.client; +package eu.mhsl.craftattack.spawn.core.api.client; import com.google.gson.Gson; -import eu.mhsl.craftattack.spawn.Main; +import com.google.gson.GsonBuilder; +import eu.mhsl.craftattack.spawn.core.Main; import org.bukkit.Bukkit; import java.net.URI; @@ -12,7 +13,9 @@ public abstract class Repository { public Repository(URI basePath) { this.basePath = basePath; - this.gson = new Gson(); + this.gson = new GsonBuilder() + .serializeNulls() + .create(); } protected void validateThread(String commandName) { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/RepositoryLoader.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/RepositoryLoader.java similarity index 82% rename from src/main/java/eu/mhsl/craftattack/spawn/api/client/RepositoryLoader.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/RepositoryLoader.java index 29d6578..f5495db 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/client/RepositoryLoader.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/RepositoryLoader.java @@ -1,5 +1,6 @@ -package eu.mhsl.craftattack.spawn.api.client; +package eu.mhsl.craftattack.spawn.core.api.client; +import eu.mhsl.craftattack.spawn.core.Main; import org.apache.commons.lang3.NotImplementedException; import org.reflections.Reflections; @@ -12,16 +13,19 @@ import java.util.Set; public class RepositoryLoader { private final List repositories; + /** + * Defines a repository as an abstraction and will not be loaded by this RepositoryLoader + */ @Retention(RetentionPolicy.RUNTIME) - public @interface IgnoreRepository { + public @interface Abstraction { } public RepositoryLoader() { - Reflections reflections = new Reflections(this.getClass().getPackageName()); + Reflections reflections = new Reflections(Main.projectPackage); Set> repositories = reflections.getSubTypesOf(Repository.class); this.repositories = repositories.stream() - .filter(repository -> !repository.isAnnotationPresent(IgnoreRepository.class)) + .filter(repository -> !repository.isAnnotationPresent(Abstraction.class)) .map(repository -> { try { return (Repository) repository.getDeclaredConstructor().newInstance(); diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/ReqResp.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/ReqResp.java new file mode 100644 index 0000000..d8f91cb --- /dev/null +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/client/ReqResp.java @@ -0,0 +1,16 @@ +package eu.mhsl.craftattack.spawn.core.api.client; + +import com.google.gson.Gson; +import java.lang.reflect.Type; + +public record ReqResp(int status, TData data) { + public ReqResp convertToTypeToken(Type type) { + var gson = new Gson(); + return new ReqResp<>(this.status, gson.fromJson(gson.toJson(this.data), type)); + } + + @SuppressWarnings("unchecked") + public T cast() { + return (T) this; + } +} \ No newline at end of file diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/server/HttpServer.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/server/HttpServer.java similarity index 94% rename from src/main/java/eu/mhsl/craftattack/spawn/api/server/HttpServer.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/api/server/HttpServer.java index dec1ff9..6c2ba8b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/server/HttpServer.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/api/server/HttpServer.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.api.server; +package eu.mhsl.craftattack.spawn.core.api.server; import com.google.gson.Gson; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import org.bukkit.configuration.ConfigurationSection; import spark.Request; import spark.Spark; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/Appliance.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/Appliance.java similarity index 78% rename from src/main/java/eu/mhsl/craftattack/spawn/appliance/Appliance.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/Appliance.java index 8dfe391..05eb73a 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/Appliance.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/Appliance.java @@ -1,17 +1,19 @@ -package eu.mhsl.craftattack.spawn.appliance; +package eu.mhsl.craftattack.spawn.core.appliance; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.api.client.Repository; -import eu.mhsl.craftattack.spawn.api.server.HttpServer; -import eu.mhsl.craftattack.spawn.config.Configuration; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.client.Repository; +import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; +import eu.mhsl.craftattack.spawn.core.config.Configuration; import org.bukkit.Bukkit; import org.bukkit.command.PluginCommand; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; +import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -104,16 +106,22 @@ public abstract class Appliance { } private void setCommandExecutor(JavaPlugin plugin, String name, ApplianceCommand executor) { - PluginCommand command = plugin.getCommand(name); - if(command != null && executor != null) { + try { + PluginCommand command = this.createPluginCommand(name, plugin); command.setExecutor(executor); command.setTabCompleter(executor); - } else { - Main.logger().warning("Command " + name + " is not specified in plugin.yml!"); - throw new RuntimeException("All commands must be registered in plugin.yml. Missing command: " + name); + plugin.getServer().getCommandMap().register(plugin.getName(), command); + } catch(Exception e) { + throw new RuntimeException(String.format("Failed to register command '%s'", name), e); } } + private PluginCommand createPluginCommand(String name, JavaPlugin plugin) throws Exception { + Constructor constructor = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class); + constructor.setAccessible(true); + return constructor.newInstance(name, plugin); + } + public List getListeners() { return this.listeners; } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/ApplianceCommand.java similarity index 97% rename from src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/ApplianceCommand.java index 4f16c82..0de6055 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/ApplianceCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliance; +package eu.mhsl.craftattack.spawn.core.appliance; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/ApplianceListener.java similarity index 87% rename from src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/ApplianceListener.java index 29eb370..552fe25 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/ApplianceListener.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.appliance; +package eu.mhsl.craftattack.spawn.core.appliance; import org.bukkit.event.Listener; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/CachedApplianceSupplier.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/CachedApplianceSupplier.java similarity index 78% rename from src/main/java/eu/mhsl/craftattack/spawn/appliance/CachedApplianceSupplier.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/CachedApplianceSupplier.java index 72cafe6..08f1801 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/CachedApplianceSupplier.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/CachedApplianceSupplier.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliance; +package eu.mhsl.craftattack.spawn.core.appliance; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; public class CachedApplianceSupplier implements IApplianceSupplier { private final T appliance; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/IApplianceSupplier.java similarity index 62% rename from src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/IApplianceSupplier.java index 8c8bbde..bd390a3 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/appliance/IApplianceSupplier.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.appliance; +package eu.mhsl.craftattack.spawn.core.appliance; public interface IApplianceSupplier { T getAppliance(); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/config/ConfigUtil.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/config/ConfigUtil.java similarity index 95% rename from src/main/java/eu/mhsl/craftattack/spawn/config/ConfigUtil.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/config/ConfigUtil.java index a2cf7b4..014795c 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/config/ConfigUtil.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/config/ConfigUtil.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.config; +package eu.mhsl.craftattack.spawn.core.config; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/config/Configuration.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/config/Configuration.java similarity index 90% rename from src/main/java/eu/mhsl/craftattack/spawn/config/Configuration.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/config/Configuration.java index d7ee8e2..dabd53b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/config/Configuration.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/config/Configuration.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.config; +package eu.mhsl.craftattack.spawn.core.config; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/IteratorUtil.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/IteratorUtil.java similarity index 97% rename from src/main/java/eu/mhsl/craftattack/spawn/util/IteratorUtil.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/IteratorUtil.java index 57b07ad..336724c 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/IteratorUtil.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/IteratorUtil.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util; +package eu.mhsl.craftattack.spawn.core.util; import org.bukkit.Bukkit; import org.bukkit.GameRule; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/NumberUtil.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/NumberUtil.java similarity index 88% rename from src/main/java/eu/mhsl/craftattack/spawn/util/NumberUtil.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/NumberUtil.java index 269effb..9e8cd8d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/NumberUtil.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/NumberUtil.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util; +package eu.mhsl.craftattack.spawn.core.util; public class NumberUtil { public static double map(double oldValue, double oldMin, double oldMax, double newMin, double newMax) { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/entity/DisplayVillager.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/entity/DisplayVillager.java similarity index 92% rename from src/main/java/eu/mhsl/craftattack/spawn/util/entity/DisplayVillager.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/entity/DisplayVillager.java index f3bfc2e..8970b21 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/entity/DisplayVillager.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/entity/DisplayVillager.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.util.entity; +package eu.mhsl.craftattack.spawn.core.util.entity; -import eu.mhsl.craftattack.spawn.config.ConfigUtil; -import eu.mhsl.craftattack.spawn.config.Configuration; -import eu.mhsl.craftattack.spawn.util.world.ChunkUtils; +import eu.mhsl.craftattack.spawn.core.config.ConfigUtil; +import eu.mhsl.craftattack.spawn.core.config.Configuration; +import eu.mhsl.craftattack.spawn.core.util.world.ChunkUtils; import org.bukkit.Location; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.EntityType; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/entity/PlayerUtils.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/entity/PlayerUtils.java similarity index 94% rename from src/main/java/eu/mhsl/craftattack/spawn/util/entity/PlayerUtils.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/entity/PlayerUtils.java index 6e156a5..41c5914 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/entity/PlayerUtils.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/entity/PlayerUtils.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.entity; +package eu.mhsl.craftattack.spawn.core.util.entity; import org.bukkit.Material; import org.bukkit.Statistic; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/inventory/HeadBuilder.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/inventory/HeadBuilder.java similarity index 93% rename from src/main/java/eu/mhsl/craftattack/spawn/util/inventory/HeadBuilder.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/inventory/HeadBuilder.java index 98def19..b0e030e 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/inventory/HeadBuilder.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/inventory/HeadBuilder.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.inventory; +package eu.mhsl.craftattack.spawn.core.util.inventory; import com.destroystokyo.paper.profile.PlayerProfile; import com.destroystokyo.paper.profile.ProfileProperty; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/inventory/ItemBuilder.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/inventory/ItemBuilder.java similarity index 95% rename from src/main/java/eu/mhsl/craftattack/spawn/util/inventory/ItemBuilder.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/inventory/ItemBuilder.java index abcbed8..4349f0a 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/inventory/ItemBuilder.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/inventory/ItemBuilder.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.util.inventory; +package eu.mhsl.craftattack.spawn.core.util.inventory; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Material; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/inventory/PlaceholderItems.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/inventory/PlaceholderItems.java similarity index 87% rename from src/main/java/eu/mhsl/craftattack/spawn/util/inventory/PlaceholderItems.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/inventory/PlaceholderItems.java index 65080f5..2373fbe 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/inventory/PlaceholderItems.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/inventory/PlaceholderItems.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.inventory; +package eu.mhsl.craftattack.spawn.core.util.inventory; import net.kyori.adventure.text.Component; import org.bukkit.Material; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/listener/DismissInventoryOpenFromHolder.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/listener/DismissInventoryOpenFromHolder.java similarity index 92% rename from src/main/java/eu/mhsl/craftattack/spawn/util/listener/DismissInventoryOpenFromHolder.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/listener/DismissInventoryOpenFromHolder.java index 6c798a1..7c0c136 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/listener/DismissInventoryOpenFromHolder.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/listener/DismissInventoryOpenFromHolder.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.listener; +package eu.mhsl.craftattack.spawn.core.util.listener; import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/listener/PlayerInteractAtEntityEventListener.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/listener/PlayerInteractAtEntityEventListener.java similarity index 93% rename from src/main/java/eu/mhsl/craftattack/spawn/util/listener/PlayerInteractAtEntityEventListener.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/listener/PlayerInteractAtEntityEventListener.java index b8c4e7e..c8ff46b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/listener/PlayerInteractAtEntityEventListener.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/listener/PlayerInteractAtEntityEventListener.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.listener; +package eu.mhsl.craftattack.spawn.core.util.listener; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/server/Floodgate.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/server/Floodgate.java similarity index 96% rename from src/main/java/eu/mhsl/craftattack/spawn/util/server/Floodgate.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/server/Floodgate.java index 815137c..b71cc09 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/server/Floodgate.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/server/Floodgate.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.server; +package eu.mhsl.craftattack.spawn.core.util.server; import org.bukkit.entity.Player; import org.geysermc.cumulus.form.SimpleForm; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/server/PluginMessage.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/server/PluginMessage.java similarity index 82% rename from src/main/java/eu/mhsl/craftattack/spawn/util/server/PluginMessage.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/server/PluginMessage.java index 5becb22..333a751 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/server/PluginMessage.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/server/PluginMessage.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.util.server; +package eu.mhsl.craftattack.spawn.core.util.server; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; import org.bukkit.entity.Player; public class PluginMessage { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/statistics/NetworkMonitor.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/statistics/NetworkMonitor.java similarity index 96% rename from src/main/java/eu/mhsl/craftattack/spawn/util/statistics/NetworkMonitor.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/statistics/NetworkMonitor.java index 5ad276f..55a625d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/statistics/NetworkMonitor.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/statistics/NetworkMonitor.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.util.statistics; +package eu.mhsl.craftattack.spawn.core.util.statistics; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; import net.kyori.adventure.util.Ticks; import org.bukkit.Bukkit; import org.bukkit.scheduler.BukkitTask; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/statistics/ServerMonitor.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/statistics/ServerMonitor.java similarity index 82% rename from src/main/java/eu/mhsl/craftattack/spawn/util/statistics/ServerMonitor.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/statistics/ServerMonitor.java index 6c3fc89..9783095 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/statistics/ServerMonitor.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/statistics/ServerMonitor.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.statistics; +package eu.mhsl.craftattack.spawn.core.util.statistics; import org.bukkit.Bukkit; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/text/ColorUtil.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/ColorUtil.java similarity index 87% rename from src/main/java/eu/mhsl/craftattack/spawn/util/text/ColorUtil.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/ColorUtil.java index 2fd9f47..2ee0186 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/text/ColorUtil.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/ColorUtil.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.util.text; +package eu.mhsl.craftattack.spawn.core.util.text; -import eu.mhsl.craftattack.spawn.util.NumberUtil; +import eu.mhsl.craftattack.spawn.core.util.NumberUtil; import net.kyori.adventure.text.format.TextColor; import java.awt.*; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/text/ComponentUtil.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/ComponentUtil.java similarity index 97% rename from src/main/java/eu/mhsl/craftattack/spawn/util/text/ComponentUtil.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/ComponentUtil.java index aa1cbdc..6be7844 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/text/ComponentUtil.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/ComponentUtil.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.util.text; +package eu.mhsl.craftattack.spawn.core.util.text; -import eu.mhsl.craftattack.spawn.util.statistics.NetworkMonitor; -import eu.mhsl.craftattack.spawn.util.statistics.ServerMonitor; +import eu.mhsl.craftattack.spawn.core.util.statistics.NetworkMonitor; +import eu.mhsl.craftattack.spawn.core.util.statistics.ServerMonitor; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/text/Countdown.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/Countdown.java similarity index 86% rename from src/main/java/eu/mhsl/craftattack/spawn/util/text/Countdown.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/Countdown.java index 0b5a8a4..5241120 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/text/Countdown.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/Countdown.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.util.text; +package eu.mhsl.craftattack.spawn.core.util.text; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; @@ -34,12 +34,12 @@ public class Countdown { this.onDone = onDone; this.defaultAnnouncements = count -> { - if(this.current > 60 && this.current % 60 == 0) { - return new AnnouncementData(this.current / 60, "Minuten"); + if(count > 60 && count % 60 == 0) { + return new AnnouncementData(count / 60, "Minuten"); } - if(this.current <= 60 && (this.current <= 10 || this.current % 10 == 0)) { - return new AnnouncementData(this.current, "Sekunden"); + if(count <= 60 && (count <= 10 || count % 10 == 0)) { + return new AnnouncementData(count, "Sekunden"); } return null; @@ -87,11 +87,11 @@ public class Countdown { if(this.isDone()) { this.onDone.run(); - this.cancel(); + this.cancelIfRunning(); } } - public boolean isDone() { + private boolean isDone() { return this.current <= 0; } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/text/DataSizeConverter.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/DataSizeConverter.java similarity index 96% rename from src/main/java/eu/mhsl/craftattack/spawn/util/text/DataSizeConverter.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/DataSizeConverter.java index a987a4b..9399b2f 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/text/DataSizeConverter.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/DataSizeConverter.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.text; +package eu.mhsl.craftattack.spawn.core.util.text; public class DataSizeConverter { public static String convertBytesPerSecond(long bytes) { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/text/DisconnectInfo.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/DisconnectInfo.java similarity index 94% rename from src/main/java/eu/mhsl/craftattack/spawn/util/text/DisconnectInfo.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/DisconnectInfo.java index 2573fbd..bb8212e 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/text/DisconnectInfo.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/DisconnectInfo.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.util.text; +package eu.mhsl.craftattack.spawn.core.util.text; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/text/NumberAbbreviation.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/NumberAbbreviation.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/util/text/NumberAbbreviation.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/NumberAbbreviation.java index c814296..e863382 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/text/NumberAbbreviation.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/NumberAbbreviation.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.text; +package eu.mhsl.craftattack.spawn.core.util.text; public class NumberAbbreviation { public static > String abbreviateNumber(T number) { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/text/RainbowComponent.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/RainbowComponent.java similarity index 94% rename from src/main/java/eu/mhsl/craftattack/spawn/util/text/RainbowComponent.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/RainbowComponent.java index fc3a554..9284671 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/text/RainbowComponent.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/text/RainbowComponent.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.text; +package eu.mhsl.craftattack.spawn.core.util.text; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/world/BlockCycle.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/world/BlockCycle.java similarity index 93% rename from src/main/java/eu/mhsl/craftattack/spawn/util/world/BlockCycle.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/world/BlockCycle.java index 5659299..4c05251 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/world/BlockCycle.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/world/BlockCycle.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.world; +package eu.mhsl.craftattack.spawn.core.util.world; import org.bukkit.Location; import org.bukkit.Material; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/world/ChunkUtils.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/world/ChunkUtils.java similarity index 92% rename from src/main/java/eu/mhsl/craftattack/spawn/util/world/ChunkUtils.java rename to core/src/main/java/eu/mhsl/craftattack/spawn/core/util/world/ChunkUtils.java index 869127d..66fdc60 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/world/ChunkUtils.java +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/world/ChunkUtils.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.util.world; +package eu.mhsl.craftattack.spawn.core.util.world; import org.bukkit.Chunk; import org.bukkit.Location; diff --git a/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/world/InteractSounds.java b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/world/InteractSounds.java new file mode 100644 index 0000000..9c1c7e4 --- /dev/null +++ b/core/src/main/java/eu/mhsl/craftattack/spawn/core/util/world/InteractSounds.java @@ -0,0 +1,45 @@ +package eu.mhsl.craftattack.spawn.core.util.world; + +import io.papermc.paper.registry.TypedKey; +import io.papermc.paper.registry.keys.SoundEventKeys; +import net.kyori.adventure.sound.Sound; +import org.bukkit.entity.Player; + +public class InteractSounds { + private final Player player; + + public static InteractSounds of(Player player) { + return new InteractSounds(player); + } + + private InteractSounds(Player player) { + this.player = player; + } + + private void playSound(TypedKey sound) { + this.player.playSound( + Sound.sound(sound, Sound.Source.PLAYER, 1f, 1f), + Sound.Emitter.self() + ); + } + + public void click() { + this.playSound(SoundEventKeys.UI_BUTTON_CLICK); + } + + public void success() { + this.playSound(SoundEventKeys.ENTITY_PLAYER_LEVELUP); + } + + public void delete() { + this.playSound(SoundEventKeys.ENTITY_SILVERFISH_DEATH); + } + + public void open() { + this.playSound(SoundEventKeys.BLOCK_BARREL_OPEN); + } + + public void close() { + this.playSound(SoundEventKeys.BLOCK_BARREL_CLOSE); + } +} diff --git a/src/main/resources/config.yml b/core/src/main/resources/config.yml similarity index 80% rename from src/main/resources/config.yml rename to core/src/main/resources/config.yml index cb8870b..f254c42 100644 --- a/src/main/resources/config.yml +++ b/core/src/main/resources/config.yml @@ -1,4 +1,5 @@ plugin: + httpServerEnabled: true disabledAppliances: - NameOfApplianceClass @@ -52,6 +53,7 @@ whitelist: overrideIntegrityCheck: false tablist: + projectTitle: "Title" interface: eth0 outlawed: @@ -71,3 +73,17 @@ endPrevent: endDisabled: true spawnpoint: +shrinkingBorder: + minimumSize: 10 + shrinkPerDay: 10 + shrinkTime: 03:00 + +varoApi: + endpoint: "https://mhsl.eu/varo/api" + auth: "Basic xxx" + +varoRank: + winners: + - 00000000-0000-0000-0000-000000000000 + mostKills: + - 00000000-0000-0000-0000-000000000000 diff --git a/core/src/main/resources/plugin.yml b/core/src/main/resources/plugin.yml new file mode 100644 index 0000000..40e86e9 --- /dev/null +++ b/core/src/main/resources/plugin.yml @@ -0,0 +1,12 @@ +name: spawn +description: modular base-plugin for mhsl server projects +version: '0' +api-version: '1.21' +main: eu.mhsl.craftattack.spawn.core.Main +load: POSTWORLD +prefix: mhsl-spawn + +author: MineTec +contributors: [olischma, 28Pupsi28] + +website: https://mhsl.eu/gitea/CraftAttack/spawn \ No newline at end of file diff --git a/craftattack/build.gradle b/craftattack/build.gradle new file mode 100644 index 0000000..be30e01 --- /dev/null +++ b/craftattack/build.gradle @@ -0,0 +1,9 @@ +dependencies { + implementation project(':core') + implementation project(':common') + + compileOnly 'io.papermc.paper:paper-api:1.21.7-R0.1-SNAPSHOT' + compileOnly 'org.geysermc.floodgate:api:2.2.4-SNAPSHOT' + implementation 'org.apache.httpcomponents:httpclient:4.5.14' + implementation 'com.sparkjava:spark-core:2.9.4' +} \ No newline at end of file diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/api/EventApiUtil.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/EventServerApi.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/util/api/EventApiUtil.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/EventServerApi.java index ff69ec5..2be4c9b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/api/EventApiUtil.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/EventServerApi.java @@ -1,13 +1,13 @@ -package eu.mhsl.craftattack.spawn.util.api; +package eu.mhsl.craftattack.spawn.craftattack.api; -import eu.mhsl.craftattack.spawn.config.Configuration; +import eu.mhsl.craftattack.spawn.core.config.Configuration; import org.bukkit.configuration.ConfigurationSection; import java.net.URI; import java.net.URISyntaxException; import java.util.Objects; -public class EventApiUtil { +public class EventServerApi { private final static ConfigurationSection apiConfig = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("event")); public final static String basePath = apiConfig.getString("api"); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/EventRepository.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/EventRepository.java similarity index 65% rename from src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/EventRepository.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/EventRepository.java index b3a6ada..9ddba9f 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/EventRepository.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/EventRepository.java @@ -1,14 +1,14 @@ -package eu.mhsl.craftattack.spawn.api.client.repositories; +package eu.mhsl.craftattack.spawn.craftattack.api.repositories; -import eu.mhsl.craftattack.spawn.api.client.HttpRepository; -import eu.mhsl.craftattack.spawn.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.util.api.EventApiUtil; +import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.craftattack.api.EventServerApi; import java.util.UUID; public class EventRepository extends HttpRepository { public EventRepository() { - super(EventApiUtil.getBaseUri()); + super(EventServerApi.getBaseUri()); } public record CreatedRoom(UUID uuid) { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/FeedbackRepository.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/FeedbackRepository.java similarity index 62% rename from src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/FeedbackRepository.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/FeedbackRepository.java index b896f2f..c1c4da5 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/FeedbackRepository.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/FeedbackRepository.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.api.client.repositories; +package eu.mhsl.craftattack.spawn.craftattack.api.repositories; import com.google.common.reflect.TypeToken; -import eu.mhsl.craftattack.spawn.api.client.HttpRepository; -import eu.mhsl.craftattack.spawn.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.util.api.WebsiteApiUtil; +import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.common.api.CraftAttackApi; import java.lang.reflect.Type; import java.util.List; @@ -12,7 +12,7 @@ import java.util.UUID; public class FeedbackRepository extends HttpRepository { public FeedbackRepository() { - super(WebsiteApiUtil.getBaseUri(), WebsiteApiUtil::withAuthorizationSecret); + super(CraftAttackApi.getBaseUri(), new RequestModifier(CraftAttackApi::withAuthorizationSecret, null)); } public record Request(String event, List users) { @@ -22,6 +22,7 @@ public class FeedbackRepository extends HttpRepository { final Type responseType = new TypeToken>() { }.getType(); ReqResp rawData = this.post("feedback", data, Object.class); + // TODO: use convertToTypeToken from ReqResp return new ReqResp<>(rawData.status(), this.gson.fromJson(this.gson.toJson(rawData.data()), responseType)); } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/WhitelistRepository.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/WhitelistRepository.java similarity index 60% rename from src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/WhitelistRepository.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/WhitelistRepository.java index 9b889f9..1dd100e 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/WhitelistRepository.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/api/repositories/WhitelistRepository.java @@ -1,14 +1,14 @@ -package eu.mhsl.craftattack.spawn.api.client.repositories; +package eu.mhsl.craftattack.spawn.craftattack.api.repositories; -import eu.mhsl.craftattack.spawn.api.client.HttpRepository; -import eu.mhsl.craftattack.spawn.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.util.api.WebsiteApiUtil; +import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.common.api.CraftAttackApi; import java.util.UUID; public class WhitelistRepository extends HttpRepository { public WhitelistRepository() { - super(WebsiteApiUtil.getBaseUri(), WebsiteApiUtil::withAuthorizationSecret); + super(CraftAttackApi.getBaseUri(), new RequestModifier(CraftAttackApi::withAuthorizationSecret, null)); } public record UserData( diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/antiSignEdit/AntiSignEdit.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/antiSignEdit/AntiSignEdit.java similarity index 83% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/antiSignEdit/AntiSignEdit.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/antiSignEdit/AntiSignEdit.java index f490848..7a45797 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/antiSignEdit/AntiSignEdit.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/antiSignEdit/AntiSignEdit.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.antiSignEdit; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.antiSignEdit; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.SelectSetting; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.SelectSetting; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/antiSignEdit/OnSignEditListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/antiSignEdit/OnSignEditListener.java similarity index 78% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/antiSignEdit/OnSignEditListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/antiSignEdit/OnSignEditListener.java index 5196b03..c20bf51 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/antiSignEdit/OnSignEditListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/antiSignEdit/OnSignEditListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.antiSignEdit; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.antiSignEdit; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import io.papermc.paper.event.player.PlayerOpenSignEvent; import org.bukkit.block.sign.SignSide; import org.bukkit.event.EventHandler; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/antiSignEdit/SignEditSetting.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/antiSignEdit/SignEditSetting.java similarity index 75% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/antiSignEdit/SignEditSetting.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/antiSignEdit/SignEditSetting.java index e66988c..b8cddc5 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/antiSignEdit/SignEditSetting.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/antiSignEdit/SignEditSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.antiSignEdit; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.antiSignEdit; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.SelectSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.SelectSetting; import org.bukkit.Material; import org.bukkit.NamespacedKey; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/autoShulker/AutoShulker.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/autoShulker/AutoShulker.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/autoShulker/AutoShulker.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/autoShulker/AutoShulker.java index 8dcd1e4..fe5d956 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/autoShulker/AutoShulker.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/autoShulker/AutoShulker.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.autoShulker; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.autoShulker; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Material; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/autoShulker/AutoShulkerSetting.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/autoShulker/AutoShulkerSetting.java similarity index 76% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/autoShulker/AutoShulkerSetting.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/autoShulker/AutoShulkerSetting.java index 799b00b..3795da6 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/autoShulker/AutoShulkerSetting.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/autoShulker/AutoShulkerSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.autoShulker; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.autoShulker; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.SelectSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.SelectSetting; import org.bukkit.Material; import org.bukkit.NamespacedKey; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/autoShulker/ItemPickupListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/autoShulker/ItemPickupListener.java similarity index 69% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/autoShulker/ItemPickupListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/autoShulker/ItemPickupListener.java index 2775dc5..d6ead8d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/autoShulker/ItemPickupListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/autoShulker/ItemPickupListener.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.autoShulker; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.autoShulker; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.SelectSetting; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.SelectSetting; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityPickupItemEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/Advancements.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/Advancements.java similarity index 76% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/Advancements.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/Advancements.java index 96c7c31..bdb0276 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/Advancements.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/Advancements.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.customAdvancements; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements; public class Advancements { public static String searchTrouble = "search_trouble"; @@ -8,4 +8,5 @@ public class Advancements { public static String start = "start"; public static String winner = "winner"; public static String participateEvent = "participate_event"; + public static String ogMiner = "og_miner"; } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/ApplyPendingAdvancementsListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/ApplyPendingAdvancementsListener.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/ApplyPendingAdvancementsListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/ApplyPendingAdvancementsListener.java index 58bb76b..f066334 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/ApplyPendingAdvancementsListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/ApplyPendingAdvancementsListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.customAdvancements; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/CustomAdvancements.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/CustomAdvancements.java similarity index 92% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/CustomAdvancements.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/CustomAdvancements.java index f7ef1b8..bd90d30 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/CustomAdvancements.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/CustomAdvancements.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.customAdvancements; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.advancement.Advancement; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/CustomAdvancementsListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/CustomAdvancementsListener.java similarity index 92% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/CustomAdvancementsListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/CustomAdvancementsListener.java index 3875a41..8fe3342 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/customAdvancements/CustomAdvancementsListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/customAdvancements/CustomAdvancementsListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.customAdvancements; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/doubleDoor/DoubleDoor.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/doubleDoor/DoubleDoor.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/doubleDoor/DoubleDoor.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/doubleDoor/DoubleDoor.java index b759456..e291abf 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/doubleDoor/DoubleDoor.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/doubleDoor/DoubleDoor.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.doubleDoor; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.doubleDoor; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/doubleDoor/DoubleDoorSetting.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/doubleDoor/DoubleDoorSetting.java similarity index 61% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/doubleDoor/DoubleDoorSetting.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/doubleDoor/DoubleDoorSetting.java index 8c87d46..3d0d610 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/doubleDoor/DoubleDoorSetting.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/doubleDoor/DoubleDoorSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.doubleDoor; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.doubleDoor; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.BoolSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.BoolSetting; import org.bukkit.Material; public class DoubleDoorSetting extends BoolSetting implements CategorizedSetting { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/doubleDoor/OnDoorInteractListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/doubleDoor/OnDoorInteractListener.java similarity index 81% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/doubleDoor/OnDoorInteractListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/doubleDoor/OnDoorInteractListener.java index 031b202..90ecf5f 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/doubleDoor/OnDoorInteractListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/doubleDoor/OnDoorInteractListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.doubleDoor; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.doubleDoor; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/fleischerchest/Fleischerchest.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/fleischerchest/Fleischerchest.java similarity index 83% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/fleischerchest/Fleischerchest.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/fleischerchest/Fleischerchest.java index e744fba..8eed90b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/fleischerchest/Fleischerchest.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/fleischerchest/Fleischerchest.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.fleischerchest; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.fleischerchest; -import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; import org.bukkit.event.Listener; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/fleischerchest/FleischerchestCraftItemListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/fleischerchest/FleischerchestCraftItemListener.java similarity index 79% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/fleischerchest/FleischerchestCraftItemListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/fleischerchest/FleischerchestCraftItemListener.java index 61ce722..eb8c703 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/fleischerchest/FleischerchestCraftItemListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/fleischerchest/FleischerchestCraftItemListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.fleischerchest; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.fleischerchest; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.PrepareItemCraftEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/glowingBerries/GlowingBerries.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/glowingBerries/GlowingBerries.java similarity index 73% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/glowingBerries/GlowingBerries.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/glowingBerries/GlowingBerries.java index d4b51bc..76d32c8 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/glowingBerries/GlowingBerries.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/glowingBerries/GlowingBerries.java @@ -1,6 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.glowingBerries; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.glowingBerries; -import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import io.papermc.paper.registry.keys.SoundEventKeys; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.util.Ticks; import org.bukkit.entity.Player; @@ -23,7 +24,7 @@ public class GlowingBerries extends Appliance { public void letPlayerGlow(Player player) { player.addPotionEffect(glowEffect); - Sound sound = Sound.sound(org.bukkit.Sound.BLOCK_AMETHYST_BLOCK_CHIME.key(), Sound.Source.PLAYER, 1f, 1f); + Sound sound = Sound.sound(SoundEventKeys.BLOCK_AMETHYST_BLOCK_CHIME, Sound.Source.PLAYER, 1f, 1f); player.stopSound(sound); player.playSound(sound, Sound.Emitter.self()); } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/glowingBerries/OnBerryEaten.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/glowingBerries/OnBerryEaten.java similarity index 72% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/glowingBerries/OnBerryEaten.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/glowingBerries/OnBerryEaten.java index 73cd323..00f9ddd 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/glowingBerries/OnBerryEaten.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/glowingBerries/OnBerryEaten.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.glowingBerries; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.glowingBerries; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerItemConsumeEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/hotbarRefill/HotbarRefill.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/hotbarRefill/HotbarRefill.java similarity index 81% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/hotbarRefill/HotbarRefill.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/hotbarRefill/HotbarRefill.java index a5a34d1..1f4ef3d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/hotbarRefill/HotbarRefill.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/hotbarRefill/HotbarRefill.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.hotbarRefill; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.hotbarRefill; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; @@ -44,7 +44,7 @@ public class HotbarRefill extends Appliance { inventory.setItem(itemSlot, secondItem); inventory.setItem(replacementSlot, firstItem); - player.sendActionBar(Component.text("Die Hotbar wurde aufgefüllt", NamedTextColor.GREEN)); + player.sendActionBar(Component.text("Deine Hotbar wurde nachgefüllt \uD83D\uDCE5", NamedTextColor.GREEN)); }, 1); } catch(NoSuchElementException ignored) { } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/hotbarRefill/HotbarRefillListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/hotbarRefill/HotbarRefillListener.java similarity index 85% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/hotbarRefill/HotbarRefillListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/hotbarRefill/HotbarRefillListener.java index f279a59..719939f 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/hotbarRefill/HotbarRefillListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/hotbarRefill/HotbarRefillListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.hotbarRefill; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.hotbarRefill; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -26,7 +26,7 @@ class HotbarRefillListener extends ApplianceListener { ItemStack stackInHand = event.getItemInHand(); if(stackInHand.getAmount() != 1) return; if(stackInHand.getType().getMaxDurability() > 0) return; - if(stackInHand.getType().getMaxStackSize() > 0) return; + if(stackInHand.getType().getMaxStackSize() == 1) return; if(!this.getPlayerSetting(event.getPlayer()).onBlocks()) return; this.getAppliance().handleHotbarChange(event.getPlayer(), stackInHand); @@ -35,15 +35,14 @@ class HotbarRefillListener extends ApplianceListener { @EventHandler public void onPlayerItemBreak(PlayerItemBreakEvent event) { if(!this.getPlayerSetting(event.getPlayer()).onTools()) return; - this.getAppliance().handleHotbarChange(event.getPlayer(), event.getBrokenItem()); } @EventHandler public void onPlayerItemConsume(PlayerItemConsumeEvent event) { if(List.of(Material.POTION, Material.HONEY_BOTTLE).contains(event.getItem().getType())) return; - if(!this.getPlayerSetting(event.getPlayer()).onConsumable()) return; + if(!this.getPlayerSetting(event.getPlayer()).onConsumable()) return; this.getAppliance().handleHotbarChange(event.getPlayer(), event.getItem()); } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/hotbarRefill/HotbarRefillSetting.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/hotbarRefill/HotbarRefillSetting.java similarity index 71% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/hotbarRefill/HotbarRefillSetting.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/hotbarRefill/HotbarRefillSetting.java index b0d2398..eba5c83 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/hotbarRefill/HotbarRefillSetting.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/hotbarRefill/HotbarRefillSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.hotbarRefill; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.hotbarRefill; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.MultiBoolSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.MultiBoolSetting; import org.bukkit.Material; public class HotbarRefillSetting extends MultiBoolSetting implements CategorizedSetting { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/knockDoor/KnockDoor.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/knockDoor/KnockDoor.java similarity index 86% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/knockDoor/KnockDoor.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/knockDoor/KnockDoor.java index cd94f2e..4c7e65b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/knockDoor/KnockDoor.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/knockDoor/KnockDoor.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.knockDoor; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.knockDoor; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.SelectSetting; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.SelectSetting; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.entity.Player; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/knockDoor/KnockDoorListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/knockDoor/KnockDoorListener.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/knockDoor/KnockDoorListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/knockDoor/KnockDoorListener.java index 9b063bd..e1d3cdf 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/knockDoor/KnockDoorListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/knockDoor/KnockDoorListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.knockDoor; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.knockDoor; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.GameMode; import org.bukkit.block.Block; import org.bukkit.block.data.type.Door; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/knockDoor/KnockDoorSetting.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/knockDoor/KnockDoorSetting.java similarity index 75% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/knockDoor/KnockDoorSetting.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/knockDoor/KnockDoorSetting.java index 21c41f1..b137450 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/knockDoor/KnockDoorSetting.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/knockDoor/KnockDoorSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.knockDoor; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.knockDoor; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.SelectSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.SelectSetting; import org.bukkit.Material; import org.bukkit.NamespacedKey; diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlockChangeListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlockChangeListener.java new file mode 100644 index 0000000..41f629e --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlockChangeListener.java @@ -0,0 +1,61 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.minecartBlocks; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Minecart; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.vehicle.VehicleDestroyEvent; +import org.bukkit.event.vehicle.VehicleEnterEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +class MinecartBlockChangeListener extends ApplianceListener { + @EventHandler + public void onInteract(PlayerInteractEntityEvent event) { + if(!event.getPlayer().isSneaking()) return; + if(!(event.getRightClicked() instanceof Minecart minecart)) return; + if(!this.isBasicMinecart(minecart)) return; + if(this.minecartContainsBlock(minecart)) return; + + PlayerInventory playerInv = event.getPlayer().getInventory(); + Material heldBlock = playerInv.getItemInMainHand().getType(); + + if(!heldBlock.isBlock() || !heldBlock.isSolid()) return; + if(!this.getAppliance().isAllowedMaterial(heldBlock)) return; + + minecart.setDisplayBlockData(heldBlock.createBlockData()); + playerInv.removeItem(ItemStack.of(heldBlock)); + this.getAppliance().onBlockPut(event.getPlayer(), heldBlock); + } + + @EventHandler + public void onDestroy(VehicleDestroyEvent event) { + if(!(event.getVehicle() instanceof Minecart minecart)) return; + if(!this.isBasicMinecart(minecart)) return; + + Material containingMaterial = minecart.getDisplayBlockData().getMaterial(); + if(containingMaterial.equals(Material.AIR)) return; + + Location vehicleLocation = event.getVehicle().getLocation(); + vehicleLocation.getWorld().dropItem(vehicleLocation, ItemStack.of(containingMaterial)); + minecart.setDisplayBlockData(null); + } + + @EventHandler + public void onEnter(VehicleEnterEvent event) { + if(!(event.getVehicle() instanceof Minecart minecart)) return; + if(!this.minecartContainsBlock(minecart)) return; + event.setCancelled(true); + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + private boolean isBasicMinecart(Minecart minecart) { + return minecart.getMinecartMaterial().equals(Material.MINECART); + } + + private boolean minecartContainsBlock(Minecart minecart) { + return !minecart.getDisplayBlockData().getMaterial().equals(Material.AIR); + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlocks.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlocks.java new file mode 100644 index 0000000..1cd96a0 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlocks.java @@ -0,0 +1,49 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.minecartBlocks; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements.Advancements; +import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements.CustomAdvancements; +import org.bukkit.Material; +import org.bukkit.block.data.Bisected; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Directional; +import org.bukkit.block.data.Waterlogged; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class MinecartBlocks extends Appliance { + private final List blackListedMaterials = List.of( + Material.COMMAND_BLOCK, + Material.FURNACE, + Material.HOPPER, + Material.TNT, + Material.CHEST, + Material.TRAPPED_CHEST + ); + + public boolean isAllowedMaterial(Material material) { + if(this.blackListedMaterials.contains(material)) return false; + BlockData blockData = material.createBlockData(); + return !( + (blockData instanceof Directional) + || (blockData instanceof Bisected) + || (blockData instanceof Waterlogged) + ); + } + + public void onBlockPut(Player player, Material material) { + if(!material.name().toLowerCase().endsWith("_ore")) return; + Main.instance().getAppliance(CustomAdvancements.class).grantAdvancement(Advancements.ogMiner, player.getUniqueId()); + } + + @Override + protected @NotNull List listeners() { + return List.of( + new MinecartBlockChangeListener() + ); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/OutlawChangeNotPermitted.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/OutlawChangeNotPermitted.java similarity index 64% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/OutlawChangeNotPermitted.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/OutlawChangeNotPermitted.java index 3f42709..605fca3 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/OutlawChangeNotPermitted.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/OutlawChangeNotPermitted.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.outlawed; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.outlawed; class OutlawChangeNotPermitted extends Exception { public OutlawChangeNotPermitted(String message) { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/Outlawed.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/Outlawed.java similarity index 88% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/Outlawed.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/Outlawed.java index 2708b5f..682132e 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/Outlawed.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/Outlawed.java @@ -1,12 +1,12 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.outlawed; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.outlawed; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.displayName.DisplayName; -import eu.mhsl.craftattack.spawn.appliances.tooling.whitelist.Whitelist; -import eu.mhsl.craftattack.spawn.config.Configuration; -import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.whitelist.Whitelist; +import eu.mhsl.craftattack.spawn.core.config.Configuration; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; @@ -48,7 +48,7 @@ public class Outlawed extends Appliance implements DisplayName.Prefixed { ); } - public void switchLawStatus(Player player) throws OutlawChangeNotPermitted { + void switchLawStatus(Player player) throws OutlawChangeNotPermitted { if(this.getLawStatus(player).equals(Status.FORCED)) { throw new OutlawChangeNotPermitted("Dein Vogelfreistatus wurde als Strafe auferlegt und kann daher nicht verändert werden."); } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/OutlawedCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/OutlawedCommand.java similarity index 86% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/OutlawedCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/OutlawedCommand.java index 0834785..6ee8c0c 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/OutlawedCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/OutlawedCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.outlawed; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.outlawed; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/OutlawedReminderListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/OutlawedReminderListener.java similarity index 74% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/OutlawedReminderListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/OutlawedReminderListener.java index 394a966..9f71a13 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/outlawed/OutlawedReminderListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/outlawed/OutlawedReminderListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.outlawed; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.outlawed; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/portableCrafting/OnCraftingTableUseListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/portableCrafting/OnCraftingTableUseListener.java similarity index 77% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/portableCrafting/OnCraftingTableUseListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/portableCrafting/OnCraftingTableUseListener.java index 69033aa..989933d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/portableCrafting/OnCraftingTableUseListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/portableCrafting/OnCraftingTableUseListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.portableCrafting; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.portableCrafting; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.block.Action; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/portableCrafting/PortableCrafting.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/portableCrafting/PortableCrafting.java similarity index 74% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/portableCrafting/PortableCrafting.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/portableCrafting/PortableCrafting.java index 2b91e07..4340dd0 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/portableCrafting/PortableCrafting.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/portableCrafting/PortableCrafting.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.portableCrafting; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.portableCrafting; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/portableCrafting/PortableCraftingSetting.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/portableCrafting/PortableCraftingSetting.java similarity index 62% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/portableCrafting/PortableCraftingSetting.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/portableCrafting/PortableCraftingSetting.java index 8cd7e77..b533bfa 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/portableCrafting/PortableCraftingSetting.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/portableCrafting/PortableCraftingSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.portableCrafting; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.portableCrafting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.BoolSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.BoolSetting; import org.bukkit.Material; public class PortableCraftingSetting extends BoolSetting implements CategorizedSetting { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/snowballKnockback/SnowballKnockback.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/snowballKnockback/SnowballKnockback.java similarity index 79% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/snowballKnockback/SnowballKnockback.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/snowballKnockback/SnowballKnockback.java index 0c92ea2..0f7710a 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/snowballKnockback/SnowballKnockback.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/snowballKnockback/SnowballKnockback.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.snowballKnockback; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.snowballKnockback; -import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.event.Listener; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/snowballKnockback/SnowballKnockbackListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/snowballKnockback/SnowballKnockbackListener.java similarity index 81% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/snowballKnockback/SnowballKnockbackListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/snowballKnockback/SnowballKnockbackListener.java index fe692fa..3a33a37 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/gameplay/snowballKnockback/SnowballKnockbackListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/snowballKnockback/SnowballKnockbackListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.gameplay.snowballKnockback; +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.snowballKnockback; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/afkTag/AfkResetListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/afkTag/AfkResetListener.java similarity index 85% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/afkTag/AfkResetListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/afkTag/AfkResetListener.java index 05906a4..4c33983 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/afkTag/AfkResetListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/afkTag/AfkResetListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.afkTag; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.afkTag; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import io.papermc.paper.event.player.AsyncChatEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerInteractEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/afkTag/AfkTag.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/afkTag/AfkTag.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/afkTag/AfkTag.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/afkTag/AfkTag.java index dd0b0ea..d6bf553 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/afkTag/AfkTag.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/afkTag/AfkTag.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.afkTag; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.afkTag; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.displayName.DisplayName; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/ApplyPendingRewardsListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/ApplyPendingRewardsListener.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/ApplyPendingRewardsListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/ApplyPendingRewardsListener.java index fae533b..05ac3c0 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/ApplyPendingRewardsListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/ApplyPendingRewardsListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.event; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/Event.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/Event.java similarity index 87% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/Event.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/Event.java index 23cefc0..4c37244 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/Event.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/Event.java @@ -1,22 +1,22 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.event; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.api.client.repositories.EventRepository; -import eu.mhsl.craftattack.spawn.api.server.HttpServer; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.gameplay.customAdvancements.Advancements; -import eu.mhsl.craftattack.spawn.appliances.gameplay.customAdvancements.CustomAdvancements; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.command.*; -import eu.mhsl.craftattack.spawn.util.IteratorUtil; -import eu.mhsl.craftattack.spawn.util.api.HttpStatus; -import eu.mhsl.craftattack.spawn.util.entity.DisplayVillager; -import eu.mhsl.craftattack.spawn.util.listener.DismissInventoryOpenFromHolder; -import eu.mhsl.craftattack.spawn.util.listener.PlayerInteractAtEntityEventListener; -import eu.mhsl.craftattack.spawn.util.server.PluginMessage; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; -import eu.mhsl.craftattack.spawn.util.text.Countdown; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.craftattack.api.repositories.EventRepository; +import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements.Advancements; +import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements.CustomAdvancements; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; +import eu.mhsl.craftattack.spawn.core.api.HttpStatus; +import eu.mhsl.craftattack.spawn.core.util.entity.DisplayVillager; +import eu.mhsl.craftattack.spawn.core.util.listener.DismissInventoryOpenFromHolder; +import eu.mhsl.craftattack.spawn.core.util.listener.PlayerInteractAtEntityEventListener; +import eu.mhsl.craftattack.spawn.core.util.server.PluginMessage; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.util.text.Countdown; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.command.*; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventAdvertiseCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventAdvertiseCommand.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventAdvertiseCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventAdvertiseCommand.java index dcf8eeb..78560d9 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventAdvertiseCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventAdvertiseCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.command; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.Event; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.Event; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventCommand.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventCommand.java index 7703ddb..2cdbb6c 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.command; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.Event; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.Event; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventEndSessionCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventEndSessionCommand.java similarity index 66% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventEndSessionCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventEndSessionCommand.java index 838b06a..11e300e 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventEndSessionCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventEndSessionCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.command; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.Event; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.Event; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventOpenSessionCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventOpenSessionCommand.java similarity index 74% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventOpenSessionCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventOpenSessionCommand.java index bbaf9a1..e633640 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/EventOpenSessionCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/EventOpenSessionCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.command; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.Event; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.Event; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/MoveEventVillagerCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/MoveEventVillagerCommand.java similarity index 69% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/MoveEventVillagerCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/MoveEventVillagerCommand.java index 5c94380..ed57da8 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/event/command/MoveEventVillagerCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/event/command/MoveEventVillagerCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.command; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.event.Event; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.event.Event; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/feedback/Feedback.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/Feedback.java similarity index 85% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/feedback/Feedback.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/Feedback.java index a0caef7..b588c96 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/feedback/Feedback.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/Feedback.java @@ -1,11 +1,11 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.feedback; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.feedback; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.api.client.repositories.FeedbackRepository; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.api.HttpStatus; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.craftattack.api.repositories.FeedbackRepository; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.api.HttpStatus; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/feedback/FeedbackCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/FeedbackCommand.java similarity index 75% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/feedback/FeedbackCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/FeedbackCommand.java index 9bb77d9..a95f0b0 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/feedback/FeedbackCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/FeedbackCommand.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.feedback; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.feedback; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/feedback/RequestFeedbackCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/RequestFeedbackCommand.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/feedback/RequestFeedbackCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/RequestFeedbackCommand.java index 7baf8ab..bc5df1c 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/feedback/RequestFeedbackCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/feedback/RequestFeedbackCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.feedback; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.feedback; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/optionLinks/OptionLinks.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/optionLinks/OptionLinks.java similarity index 92% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/optionLinks/OptionLinks.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/optionLinks/OptionLinks.java index 44767ac..7a867be 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/optionLinks/OptionLinks.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/optionLinks/OptionLinks.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.optionLinks; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.optionLinks; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/optionLinks/UpdateLinksListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/optionLinks/UpdateLinksListener.java similarity index 66% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/optionLinks/UpdateLinksListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/optionLinks/UpdateLinksListener.java index 40cc169..b072f47 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/optionLinks/UpdateLinksListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/optionLinks/UpdateLinksListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.optionLinks; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.optionLinks; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/ChangePackCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/ChangePackCommand.java similarity index 79% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/ChangePackCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/ChangePackCommand.java index c7a6e51..768ff35 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/ChangePackCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/ChangePackCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackConfiguration.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackConfiguration.java similarity index 92% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackConfiguration.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackConfiguration.java index 5ea748b..c48642d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackConfiguration.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackConfiguration.java @@ -1,10 +1,10 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import eu.mhsl.craftattack.spawn.appliance.CachedApplianceSupplier; -import eu.mhsl.craftattack.spawn.util.inventory.HeadBuilder; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.appliance.CachedApplianceSupplier; +import eu.mhsl.craftattack.spawn.core.util.inventory.HeadBuilder; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; import net.kyori.adventure.resource.ResourcePackInfo; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackConfigurationInventory.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackConfigurationInventory.java similarity index 93% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackConfigurationInventory.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackConfigurationInventory.java index 4c4e807..c3a4c5a 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackConfigurationInventory.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackConfigurationInventory.java @@ -1,11 +1,11 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.CachedApplianceSupplier; -import eu.mhsl.craftattack.spawn.util.IteratorUtil; -import eu.mhsl.craftattack.spawn.util.inventory.ItemBuilder; -import eu.mhsl.craftattack.spawn.util.inventory.PlaceholderItems; -import eu.mhsl.craftattack.spawn.util.world.InteractSounds; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.CachedApplianceSupplier; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; +import eu.mhsl.craftattack.spawn.core.util.inventory.ItemBuilder; +import eu.mhsl.craftattack.spawn.core.util.inventory.PlaceholderItems; +import eu.mhsl.craftattack.spawn.core.util.world.InteractSounds; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackSelect.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackSelect.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackSelect.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackSelect.java index 7093524..9547ad9 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackSelect.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackSelect.java @@ -1,12 +1,12 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect.listeners.ClickPackInventoryListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect.listeners.ClosePackInventoryListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect.listeners.SetPacksOnJoinListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect.listeners.ClickPackInventoryListener; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect.listeners.ClosePackInventoryListener; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect.listeners.SetPacksOnJoinListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; import net.kyori.adventure.resource.ResourcePackInfo; import net.kyori.adventure.resource.ResourcePackRequest; import net.kyori.adventure.text.Component; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackSelectSetting.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackSelectSetting.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackSelectSetting.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackSelectSetting.java index c7338c7..21dd943 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/PackSelectSetting.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/PackSelectSetting.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.CategorizedSetting; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.SettingCategory; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings.datatypes.ActionSetting; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.ActionSetting; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/ResourcePackInfoFactory.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/ResourcePackInfoFactory.java similarity index 95% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/ResourcePackInfoFactory.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/ResourcePackInfoFactory.java index 36675c8..89a6fb2 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/ResourcePackInfoFactory.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/ResourcePackInfoFactory.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect; -import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.core.Main; import net.kyori.adventure.resource.ResourcePackInfo; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/listeners/ClickPackInventoryListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/listeners/ClickPackInventoryListener.java similarity index 72% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/listeners/ClickPackInventoryListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/listeners/ClickPackInventoryListener.java index 4070f03..d7436a4 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/listeners/ClickPackInventoryListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/listeners/ClickPackInventoryListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect.listeners; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect.listeners; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect.PackSelect; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect.PackSelect; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/listeners/ClosePackInventoryListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/listeners/ClosePackInventoryListener.java similarity index 66% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/listeners/ClosePackInventoryListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/listeners/ClosePackInventoryListener.java index 506ae14..3c58249 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/listeners/ClosePackInventoryListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/listeners/ClosePackInventoryListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect.listeners; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect.listeners; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect.PackSelect; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect.PackSelect; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.InventoryCloseEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/listeners/SetPacksOnJoinListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/listeners/SetPacksOnJoinListener.java similarity index 61% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/listeners/SetPacksOnJoinListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/listeners/SetPacksOnJoinListener.java index 3eb3046..1c5a840 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/packSelect/listeners/SetPacksOnJoinListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/packSelect/listeners/SetPacksOnJoinListener.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect.listeners; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect.listeners; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.packSelect.PackSelect; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.packSelect.PackSelect; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/playtime/Playtime.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/playtime/Playtime.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/playtime/Playtime.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/playtime/Playtime.java index 161d25d..a10e363 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/playtime/Playtime.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/playtime/Playtime.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.playtime; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.playtime; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.text.DataSizeConverter; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.util.text.DataSizeConverter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.util.Ticks; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/playtime/PlaytimeCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/playtime/PlaytimeCommand.java similarity index 85% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/playtime/PlaytimeCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/playtime/PlaytimeCommand.java index 323759c..bf46c02 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/playtime/PlaytimeCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/playtime/PlaytimeCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.playtime; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.playtime; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/sleepTag/SleepStateChangeListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/sleepTag/SleepStateChangeListener.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/sleepTag/SleepStateChangeListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/sleepTag/SleepStateChangeListener.java index d0b4783..ba10173 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/sleepTag/SleepStateChangeListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/sleepTag/SleepStateChangeListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.sleepTag; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.sleepTag; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerBedLeaveEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/sleepTag/SleepTag.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/sleepTag/SleepTag.java similarity index 88% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/sleepTag/SleepTag.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/sleepTag/SleepTag.java index cfcad05..198fbb7 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/sleepTag/SleepTag.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/sleepTag/SleepTag.java @@ -1,8 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.sleepTag; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.sleepTag; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.displayName.DisplayName; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/varoRank/VaroRank.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/varoRank/VaroRank.java new file mode 100644 index 0000000..b7b2abd --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/varoRank/VaroRank.java @@ -0,0 +1,60 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.varoRank; + +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.function.Function; + +public class VaroRank extends Appliance implements DisplayName.Prefixed { + private List winners = new ArrayList<>(); + private List mostKills = new ArrayList<>(); + + private final Component winnerBadge = Component.text("\uD83D\uDC51", NamedTextColor.YELLOW) + .hoverEvent(HoverEvent.showText(Component.text("Hat zusammen mit seinem Team Varo gewonnen"))); + private final Component killBadge = Component.text("\uD83D\uDDE1", NamedTextColor.RED) + .hoverEvent(HoverEvent.showText(Component.text("Hat zusammen mit seinem Team die meisten Kills in Varo"))); + + public VaroRank() { + super("varoRank"); + } + + @Override + public void onEnable() { + Function, List> processUUIDs = list -> list.stream() + .map(String::trim) + .map(UUID::fromString) + .toList(); + + this.winners = processUUIDs.apply(this.localConfig().getStringList("winners")); + this.mostKills = processUUIDs.apply(this.localConfig().getStringList("mostKills")); + } + + @Override + public @Nullable Component getNamePrefix(Player player) { + UUID playerId = player.getUniqueId(); + + boolean isWinner = this.winners.contains(playerId); + boolean hasMostKills = this.mostKills.contains(playerId); + + if (!isWinner && !hasMostKills) { + return null; + } + + return Component.text() + .color(NamedTextColor.GOLD) + .append(Component.text("[")) + .append(isWinner ? this.winnerBadge : Component.empty()) + .append(hasMostKills ? this.killBadge : Component.empty()) + .append(Component.text("]")) + .build(); + } + +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/worldmuseum/MoveWorldMuseumVillagerCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/worldmuseum/MoveWorldMuseumVillagerCommand.java similarity index 78% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/worldmuseum/MoveWorldMuseumVillagerCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/worldmuseum/MoveWorldMuseumVillagerCommand.java index 35d9e77..afcb39b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/worldmuseum/MoveWorldMuseumVillagerCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/worldmuseum/MoveWorldMuseumVillagerCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.worldmuseum; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.worldmuseum; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/worldmuseum/WorldMuseum.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/worldmuseum/WorldMuseum.java similarity index 75% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/worldmuseum/WorldMuseum.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/worldmuseum/WorldMuseum.java index 7c8d90b..1c52b3b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/worldmuseum/WorldMuseum.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/worldmuseum/WorldMuseum.java @@ -1,12 +1,12 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.worldmuseum; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.worldmuseum; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.entity.DisplayVillager; -import eu.mhsl.craftattack.spawn.util.listener.DismissInventoryOpenFromHolder; -import eu.mhsl.craftattack.spawn.util.listener.PlayerInteractAtEntityEventListener; -import eu.mhsl.craftattack.spawn.util.server.PluginMessage; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.util.entity.DisplayVillager; +import eu.mhsl.craftattack.spawn.core.util.listener.DismissInventoryOpenFromHolder; +import eu.mhsl.craftattack.spawn.core.util.listener.PlayerInteractAtEntityEventListener; +import eu.mhsl.craftattack.spawn.core.util.server.PluginMessage; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Location; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/yearRank/YearRank.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/yearRank/YearRank.java similarity index 92% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/yearRank/YearRank.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/yearRank/YearRank.java index f927b02..1fbd937 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/yearRank/YearRank.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/yearRank/YearRank.java @@ -1,9 +1,9 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.yearRank; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.yearRank; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.displayName.DisplayName; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/yearRank/YearRankCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/yearRank/YearRankCommand.java similarity index 76% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/yearRank/YearRankCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/yearRank/YearRankCommand.java index 13529b0..d3a5daf 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/yearRank/YearRankCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/yearRank/YearRankCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.yearRank; +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.yearRank; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiAutoTotem/AntiAutoTotem.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiAutoTotem/AntiAutoTotem.java new file mode 100644 index 0000000..c134629 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiAutoTotem/AntiAutoTotem.java @@ -0,0 +1,62 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.security.antiAutoTotem; + +import eu.mhsl.craftattack.spawn.common.appliances.tooling.acInform.AcInform; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.inventory.PlayerInventory; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.function.Supplier; + +public class AntiAutoTotem extends Appliance { + + public void checkTotemUse(Player player) { + PlayerInventory playerInv = player.getInventory(); + + Supplier> getHeldItems = () -> List.of( + playerInv.getItemInMainHand().getType(), + playerInv.getItemInOffHand().getType() + ); + Function isCurrentlyHoldingTotem = (p) -> getHeldItems.get().contains(Material.TOTEM_OF_UNDYING); + + if(!isCurrentlyHoldingTotem.apply(player)) return; + if(getHeldItems.get().stream().allMatch(material -> material.equals(Material.TOTEM_OF_UNDYING))) return; + + AtomicInteger tickCounter = new AtomicInteger(); + Bukkit.getScheduler().runTaskTimer( + Main.instance(), + (task) -> { + if(tickCounter.incrementAndGet() > 10) { + task.cancel(); + return; + } + + if(isCurrentlyHoldingTotem.apply(player)) { + task.cancel(); + Main.instance().getAppliance(AcInform.class).notifyAdmins( + "internal", + player.getName(), + "antiAutoTotem", + (float) tickCounter.get() + ); + } + }, + 1, + 1 + ); + } + + @Override + protected @NotNull List listeners() { + return List.of( + new OnTotemUseListener() + ); + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiAutoTotem/OnTotemUseListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiAutoTotem/OnTotemUseListener.java new file mode 100644 index 0000000..c2c7ed2 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiAutoTotem/OnTotemUseListener.java @@ -0,0 +1,15 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.security.antiAutoTotem; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityResurrectEvent; + +class OnTotemUseListener extends ApplianceListener { + @EventHandler + public void onTotem(EntityResurrectEvent event) { + if(event.isCancelled()) return; + if(!(event.getEntity() instanceof Player player)) return; + this.getAppliance().checkTotemUse(player); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireControl.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/lightningFireControl/LightningFireControl.java similarity index 73% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireControl.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/lightningFireControl/LightningFireControl.java index 6210c0c..998e5f1 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireControl.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/lightningFireControl/LightningFireControl.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.lightningFireControl; +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.lightningFireControl; -import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import org.bukkit.block.Block; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/lightningFireControl/LightningFireListener.java similarity index 90% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/lightningFireControl/LightningFireListener.java index dfaa1fa..e95f299 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/lightningFireControl/LightningFireListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.lightningFireControl; +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.lightningFireControl; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/ProjectStart.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/ProjectStart.java similarity index 81% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/ProjectStart.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/ProjectStart.java index 951604a..df6832a 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/ProjectStart.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/ProjectStart.java @@ -1,21 +1,21 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.projectStart; +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.gameplay.customAdvancements.Advancements; -import eu.mhsl.craftattack.spawn.appliances.gameplay.customAdvancements.CustomAdvancements; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.command.ProjectStartCancelCommand; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.command.ProjectStartCommand; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.command.ProjectStartResetCommand; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.listener.NoAdvancementsListener; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.listener.PlayerInvincibleListener; -import eu.mhsl.craftattack.spawn.config.Configuration; -import eu.mhsl.craftattack.spawn.util.IteratorUtil; -import eu.mhsl.craftattack.spawn.util.entity.PlayerUtils; -import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; -import eu.mhsl.craftattack.spawn.util.text.Countdown; -import eu.mhsl.craftattack.spawn.util.world.BlockCycle; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements.Advancements; +import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.customAdvancements.CustomAdvancements; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.command.ProjectStartCancelCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.command.ProjectStartCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.command.ProjectStartResetCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.listener.NoAdvancementsListener; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.listener.PlayerInvincibleListener; +import eu.mhsl.craftattack.spawn.core.config.Configuration; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; +import eu.mhsl.craftattack.spawn.core.util.entity.PlayerUtils; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.util.text.Countdown; +import eu.mhsl.craftattack.spawn.core.util.world.BlockCycle; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -59,7 +59,6 @@ public class ProjectStart extends Appliance { private final Map, Boolean> gameRulesAfterStart = Map.ofEntries( entry(GameRule.DO_DAYLIGHT_CYCLE, true), entry(GameRule.DO_INSOMNIA, true), - entry(GameRule.ANNOUNCE_ADVANCEMENTS, true), entry(GameRule.DISABLE_RAIDS, false), entry(GameRule.DO_FIRE_TICK, true), entry(GameRule.DO_ENTITY_DROPS, true), diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/command/ProjectStartCancelCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/command/ProjectStartCancelCommand.java new file mode 100644 index 0000000..6b5c42a --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/command/ProjectStartCancelCommand.java @@ -0,0 +1,25 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.command; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.ProjectStart; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class ProjectStartCancelCommand extends ApplianceCommand { + public ProjectStartCancelCommand() { + super("projectStartCancel"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(this.getAppliance().getCountdown().isRunning()) { + this.getAppliance().cancelCountdown(); + sender.sendMessage(Component.text("Countdown cancelled successfully!").color(NamedTextColor.GREEN)); + } else { + sender.sendMessage(Component.text("Countdown is not running!").color(NamedTextColor.RED)); + } + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/command/ProjectStartCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/command/ProjectStartCommand.java new file mode 100644 index 0000000..d98dc6a --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/command/ProjectStartCommand.java @@ -0,0 +1,30 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.command; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.ProjectStart; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class ProjectStartCommand extends ApplianceCommand { + public ProjectStartCommand() { + super("projectStart"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(!this.getAppliance().isEnabled()) { + sender.sendMessage(Component.text("Countdown not enabled or executed once before!").color(NamedTextColor.RED)); + return; + } + + if(this.getAppliance().getCountdown().isRunning()) { + sender.sendMessage(Component.text("Countdown already running!").color(NamedTextColor.RED)); + return; + } + + this.getAppliance().startCountdown(); + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/command/ProjectStartResetCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/command/ProjectStartResetCommand.java new file mode 100644 index 0000000..c297e5f --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/command/ProjectStartResetCommand.java @@ -0,0 +1,18 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.command; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.ProjectStart; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class ProjectStartResetCommand extends ApplianceCommand { + public ProjectStartResetCommand() { + super("projectStartReset"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + this.getAppliance().restoreBeforeStart(); + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/listener/NoAdvancementsListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/listener/NoAdvancementsListener.java new file mode 100644 index 0000000..f7b3dc5 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/listener/NoAdvancementsListener.java @@ -0,0 +1,22 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.listener; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.ProjectStart; +import org.bukkit.advancement.Advancement; +import org.bukkit.advancement.AdvancementProgress; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerAdvancementDoneEvent; + +public class NoAdvancementsListener extends ApplianceListener { + @EventHandler + public void onAdvancement(PlayerAdvancementDoneEvent event) { + if(!this.getAppliance().isEnabled()) return; + event.message(null); + + Advancement advancement = event.getAdvancement(); + AdvancementProgress progress = event.getPlayer().getAdvancementProgress(advancement); + for(String criteria : progress.getAwardedCriteria()) { + progress.revokeCriteria(criteria); + } + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/listener/PlayerInvincibleListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/listener/PlayerInvincibleListener.java new file mode 100644 index 0000000..e9bb5e6 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/projectStart/listener/PlayerInvincibleListener.java @@ -0,0 +1,27 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.listener; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.projectStart.ProjectStart; +import io.papermc.paper.event.player.PrePlayerAttackEntityEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; + +public class PlayerInvincibleListener extends ApplianceListener { + @EventHandler + public void onDamage(EntityDamageEvent event) { + if(!(event.getEntity() instanceof Player)) return; + if(this.getAppliance().isEnabled()) event.setCancelled(true); + } + + @EventHandler + public void onHunger(FoodLevelChangeEvent event) { + if(this.getAppliance().isEnabled()) event.setCancelled(true); + } + + @EventHandler + public void onHit(PrePlayerAttackEntityEvent event) { + if(this.getAppliance().isEnabled()) event.setCancelled(true); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/spawnpoint/SetSpawnpointCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/spawnpoint/SetSpawnpointCommand.java similarity index 83% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/spawnpoint/SetSpawnpointCommand.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/spawnpoint/SetSpawnpointCommand.java index bf7b694..ad13c8b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/spawnpoint/SetSpawnpointCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/spawnpoint/SetSpawnpointCommand.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.spawnpoint; +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.spawnpoint; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/spawnpoint/SpawnAtSpawnpointListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/spawnpoint/SpawnAtSpawnpointListener.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/spawnpoint/SpawnAtSpawnpointListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/spawnpoint/SpawnAtSpawnpointListener.java index 98f779c..f517d97 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/spawnpoint/SpawnAtSpawnpointListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/spawnpoint/SpawnAtSpawnpointListener.java @@ -1,6 +1,6 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.spawnpoint; +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.spawnpoint; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerRespawnEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/spawnpoint/Spawnpoint.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/spawnpoint/Spawnpoint.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/spawnpoint/Spawnpoint.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/spawnpoint/Spawnpoint.java index fd71f03..8dd37bd 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/spawnpoint/Spawnpoint.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/spawnpoint/Spawnpoint.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.spawnpoint; +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.spawnpoint; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.NamespacedKey; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/whitelist/PlayerJoinListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/PlayerJoinListener.java similarity index 82% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/whitelist/PlayerJoinListener.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/PlayerJoinListener.java index 92131e9..ad9f8fb 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/whitelist/PlayerJoinListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/PlayerJoinListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.whitelist; +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.whitelist; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import org.bukkit.event.EventHandler; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerLoginEvent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/whitelist/Whitelist.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/Whitelist.java similarity index 89% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/whitelist/Whitelist.java rename to craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/Whitelist.java index 6a00293..ee82c86 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/whitelist/Whitelist.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/tooling/whitelist/Whitelist.java @@ -1,14 +1,14 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.whitelist; +package eu.mhsl.craftattack.spawn.craftattack.appliances.tooling.whitelist; -import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.api.client.repositories.WhitelistRepository; -import eu.mhsl.craftattack.spawn.api.server.HttpServer; -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliances.gameplay.outlawed.Outlawed; -import eu.mhsl.craftattack.spawn.util.api.HttpStatus; -import eu.mhsl.craftattack.spawn.util.server.Floodgate; -import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.craftattack.api.repositories.WhitelistRepository; +import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.api.HttpStatus; +import eu.mhsl.craftattack.spawn.core.util.server.Floodgate; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.outlawed.Outlawed; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Listener; diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..d64cd49 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a441313..1af9e09 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf1..1aa94a4 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/gradlew.bat b/gradlew.bat index 25da30d..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. goto fail diff --git a/settings.gradle b/settings.gradle index d602ff8..9efb310 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,7 @@ rootProject.name = 'spawn' + +include 'core' +include 'craftattack' +include 'common' +include 'varo' + diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/ReqResp.java b/src/main/java/eu/mhsl/craftattack/spawn/api/client/ReqResp.java deleted file mode 100644 index 2bb3f3f..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/client/ReqResp.java +++ /dev/null @@ -1,4 +0,0 @@ -package eu.mhsl.craftattack.spawn.api.client; - -public record ReqResp(int status, TData data) { -} \ No newline at end of file diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/ReportRepository.java b/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/ReportRepository.java deleted file mode 100644 index be92875..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/ReportRepository.java +++ /dev/null @@ -1,57 +0,0 @@ -package eu.mhsl.craftattack.spawn.api.client.repositories; - -import eu.mhsl.craftattack.spawn.api.client.HttpRepository; -import eu.mhsl.craftattack.spawn.api.client.ReqResp; -import eu.mhsl.craftattack.spawn.util.api.WebsiteApiUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.UUID; - -public class ReportRepository extends HttpRepository { - public ReportRepository() { - super(WebsiteApiUtil.getBaseUri(), WebsiteApiUtil::withAuthorizationSecret); - } - - public record ReportCreationInfo(@NotNull UUID reporter, @Nullable UUID reported, String reason) { - } - - public record ReportUrl(@NotNull String url) { - } - - public record PlayerReports( - List from_self, - Object to_self - ) { - public record Report( - @Nullable Reporter reported, - @NotNull String subject, - boolean draft, - @NotNull String status, - @NotNull String url - ) { - public record Reporter( - @NotNull String username, - @NotNull String uuid - ) { - } - } - } - - public ReqResp queryReports(UUID player) { - return this.get( - "report", - (parameters) -> parameters.addParameter("uuid", player.toString()), - PlayerReports.class - ); - } - - public ReqResp createReport(ReportCreationInfo data) { - return this.post( - "report", - data, - ReportUrl.class - ); - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/debug/Debug.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/debug/Debug.java deleted file mode 100644 index e5ab922..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/internal/debug/Debug.java +++ /dev/null @@ -1,20 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.internal.debug; - -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.internal.debug.command.AppliancesCommand; -import eu.mhsl.craftattack.spawn.appliances.internal.debug.command.UserInfoCommand; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -public class Debug extends Appliance { - @Override - @NotNull - protected List> commands() { - return List.of( - new UserInfoCommand(), - new AppliancesCommand() - ); - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/adminMarker/AdminMarker.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/adminMarker/AdminMarker.java deleted file mode 100644 index acc5106..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/adminMarker/AdminMarker.java +++ /dev/null @@ -1,14 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.adminMarker; - -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import net.kyori.adventure.text.format.TextColor; -import org.bukkit.Color; -import org.bukkit.entity.Player; - -public class AdminMarker extends Appliance { - public TextColor getPlayerColor(Player player) { - if(player.hasPermission("chatcolor")) - return TextColor.color(Color.AQUA.asRGB()); // TODO read permission from config - return TextColor.color(Color.WHITE.asRGB()); - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/Help.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/Help.java deleted file mode 100644 index 5fb3258..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/help/Help.java +++ /dev/null @@ -1,28 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.help; - -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.command.DiscordCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.command.HelpCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.command.SpawnCommand; -import eu.mhsl.craftattack.spawn.appliances.metaGameplay.help.command.TeamspeakCommand; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -public class Help extends Appliance { - public Help() { - super("help"); - } - - @Override - @NotNull - protected List> commands() { - return List.of( - new HelpCommand(), - new SpawnCommand(), - new TeamspeakCommand(), - new DiscordCommand() - ); - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/CategorizedSetting.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/CategorizedSetting.java deleted file mode 100644 index c8310e0..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/CategorizedSetting.java +++ /dev/null @@ -1,5 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings; - -public interface CategorizedSetting { - SettingCategory category(); -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/SettingCategory.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/SettingCategory.java deleted file mode 100644 index 76de3ac..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/metaGameplay/settings/SettingCategory.java +++ /dev/null @@ -1,7 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.metaGameplay.settings; - -public enum SettingCategory { - Gameplay, - Visuals, - Misc, -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/endPrevent/EndPrevent.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/endPrevent/EndPrevent.java deleted file mode 100644 index 9a92cbd..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/endPrevent/EndPrevent.java +++ /dev/null @@ -1,39 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.endPrevent; - -import eu.mhsl.craftattack.spawn.appliance.Appliance; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.config.Configuration; -import org.bukkit.event.Listener; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -public class EndPrevent extends Appliance { - private final String endDisabledKey = "endDisabled"; - private boolean endDisabled; - - public EndPrevent() { - super("endPrevent"); - this.endDisabled = this.localConfig().getBoolean(this.endDisabledKey); - } - - public void setEndDisabled(boolean disabled) { - this.localConfig().set(this.endDisabledKey, disabled); - Configuration.saveChanges(); - this.endDisabled = disabled; - } - - public boolean isEndDisabled() { - return this.endDisabled; - } - - @Override - protected @NotNull List listeners() { - return List.of(new PreventEnderEyeUseListener()); - } - - @Override - protected @NotNull List> commands() { - return List.of(new EndPreventCommand()); - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/endPrevent/PreventEnderEyeUseListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/endPrevent/PreventEnderEyeUseListener.java deleted file mode 100644 index 4f638d9..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/endPrevent/PreventEnderEyeUseListener.java +++ /dev/null @@ -1,23 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.endPrevent; - -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Material; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerInteractEvent; - -class PreventEnderEyeUseListener extends ApplianceListener { - @EventHandler - public void onEnderEyeInteraction(PlayerInteractEvent event) { - if(event.getClickedBlock() == null) return; - if(!event.getClickedBlock().getType().equals(Material.END_PORTAL_FRAME)) return; - if(event.getItem() == null) return; - if(!event.getItem().getType().equals(Material.ENDER_EYE)) return; - - if(!this.getAppliance().isEndDisabled()) return; - - event.setCancelled(true); - event.getPlayer().sendActionBar(Component.text("Das End ist noch nicht freigeschaltet!", NamedTextColor.RED)); - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/world/InteractSounds.java b/src/main/java/eu/mhsl/craftattack/spawn/util/world/InteractSounds.java deleted file mode 100644 index d49c3c9..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/world/InteractSounds.java +++ /dev/null @@ -1,37 +0,0 @@ -package eu.mhsl.craftattack.spawn.util.world; - -import net.kyori.adventure.key.Key; -import net.kyori.adventure.sound.Sound; -import org.bukkit.entity.Player; - -public class InteractSounds { - private final Player player; - - public static InteractSounds of(Player player) { - return new InteractSounds(player); - } - - private InteractSounds(Player player) { - this.player = player; - } - - private void playSound(org.bukkit.Sound sound) { - this.player.playSound(this.getSound(sound.key()), Sound.Emitter.self()); - } - - private Sound getSound(Key soundKey) { - return Sound.sound(soundKey, Sound.Source.PLAYER, 1f, 1f); - } - - public void click() { - this.playSound(org.bukkit.Sound.UI_BUTTON_CLICK); - } - - public void success() { - this.playSound(org.bukkit.Sound.ENTITY_PLAYER_LEVELUP); - } - - public void delete() { - this.playSound(org.bukkit.Sound.ENTITY_SILVERFISH_DEATH); - } -} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml deleted file mode 100644 index 3d13bc6..0000000 --- a/src/main/resources/plugin.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: spawn -author: olischma, muelleel -version: '1.0' -main: eu.mhsl.craftattack.spawn.Main -api-version: '1.21' -commands: - moveWorldMuseumVillager: - description: Moves world museum villager to current player location and persists location to config - usage: /moveWmVillager - permission: admin - report: - description: Reporte einen Spieler - reports: - description: Von dir erstellte Reports - userinfo: - description: Get UUID from any user - projectStart: - description: Starts project countdown - projectStartCancel: - description: Cancels project countdown - projectStartReset: - description: Resets project countdown - moveEventVillager: - appliances: - event: - eventOpenSession: - eventEndSession: - eventAdvertise: - help: - spawn: - teamspeak: - aliases: [ "ts" ] - discord: - aliases: [ "dc" ] - setPlayerLimit: - scheduleRestart: - cancelRestart: - kick: - panicBan: - vogelfrei: - settings: - texturepack: - maintanance: - yearRank: - msg: - r: - playtime: - adminchat: - aliases: [ "sc" ] - acInform: - infobar: - endPrevent: - feedback: - requestFeedback: - setSpawnpoint: - mute: \ No newline at end of file diff --git a/varo/build.gradle b/varo/build.gradle new file mode 100644 index 0000000..ec631a1 --- /dev/null +++ b/varo/build.gradle @@ -0,0 +1,8 @@ +dependencies { + implementation project(':core') + implementation project(':common') + + compileOnly 'io.papermc.paper:paper-api:1.21.7-R0.1-SNAPSHOT' + implementation 'org.apache.httpcomponents:httpclient:4.5.14' + implementation 'com.sparkjava:spark-core:2.9.4' +} \ No newline at end of file diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/TeamRepository.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/TeamRepository.java new file mode 100644 index 0000000..9208ea2 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/TeamRepository.java @@ -0,0 +1,35 @@ +package eu.mhsl.craftattack.spawn.varo.api.repositories; + +import com.google.common.reflect.TypeToken; +import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.common.api.VaroApi; + +import java.util.List; +import java.util.UUID; + +public class TeamRepository extends HttpRepository { + public TeamRepository() { + super(VaroApi.getBaseUri(), new RequestModifier(null, VaroApi::authorizationHeader)); + } + + public record Team( + String name, + String color, + Object lastJoined, + Object strikeWeight, + List users + ) { + public record User( + UUID uuid, + boolean dead + ) {} + } + + public ReqResp> getTeams() { + var resp = this.get("team", Object.class); + return resp + .convertToTypeToken(new TypeToken>() {}.getType()) + .cast(); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/VaroPlayerRepository.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/VaroPlayerRepository.java new file mode 100644 index 0000000..7f8b750 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/api/repositories/VaroPlayerRepository.java @@ -0,0 +1,19 @@ +package eu.mhsl.craftattack.spawn.varo.api.repositories; + +import eu.mhsl.craftattack.spawn.core.api.client.HttpRepository; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.common.api.VaroApi; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class VaroPlayerRepository extends HttpRepository { + public VaroPlayerRepository() { + super(VaroApi.getBaseUri(), new RequestModifier(null, VaroApi::authorizationHeader)); + } + + public record VaroDeath(UUID user, @Nullable UUID killer, String message) {} + public ReqResp registerDeath(VaroDeath death) { + return this.post("player/death", death, Void.class); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/Task.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/Task.java new file mode 100644 index 0000000..7873eb7 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/Task.java @@ -0,0 +1,6 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks; + +public interface Task { + void stopTask(); + boolean isTaskRunning(); +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/TeamTasks.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/TeamTasks.java new file mode 100644 index 0000000..4a1bf7e --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/TeamTasks.java @@ -0,0 +1,52 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.VaroTeam; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class TeamTasks extends Appliance { + public enum Type { + /** + * Task for kicking Team after the desired Playtime + */ + TIME_KICK, + JOIN_PAIR + } + + private final Map> tasks = new HashMap<>(); + + private Map getTeamTasks(VaroTeam team) { + return this.tasks.computeIfAbsent(team, varoTeam -> new HashMap<>()); + } + + public Map getRunningTeamTasks(VaroTeam team) { + return this.getTeamTasks(team).entrySet().stream() + .filter(entry -> entry.getValue().isTaskRunning()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + public void cancelTeamTasks(VaroTeam team) { + Main.logger().info(String.format("All TeamTasks for Team %s were cancelled: %s", team.name, this.getRunningTeamTasks(team))); + this.getTeamTasks(team).forEach((type, task) -> task.stopTask()); + } + + public void addTask(VaroTeam team, Type type, Task runnable) { + if(this.getTeamTasks(team).containsKey(type) && this.getTeamTasks(team).get(type).isTaskRunning()) { + throw new IllegalStateException(String.format("Task %s for Team %s was already running!", type.name(), team.name)); + } + + this.getTeamTasks(team).put(type, runnable); + } + + @Override + protected @NotNull List> commands() { + return List.of(new TeamTasksCommand()); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/TeamTasksCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/TeamTasksCommand.java new file mode 100644 index 0000000..fd16e83 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/TeamTasksCommand.java @@ -0,0 +1,42 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.stream.Collectors; + +public class TeamTasksCommand extends ApplianceCommand { + public TeamTasksCommand() { + super("teamTasks"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args.length < 1) throw new Error("Please specify Teamname"); + var team = Main.instance().getAppliance(Teams.class).findTeamByName(args[0]); + if(team == null) throw new Error("Team not found!"); + var tasks = this.getAppliance().getRunningTeamTasks(team); + if(tasks.isEmpty()) { + sender.sendMessage("No Tasks found!"); + } else { + sender.sendMessage( + tasks.entrySet() + .stream() + .map(entry -> String.format("%s: %s", entry.getKey().name(), entry.getValue().getClass().getSimpleName())) + .collect(Collectors.joining("\n")) + ); + } + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + var teams = Main.instance().getAppliance(Teams.class).getAllTeams(); + return teams.stream().map(team -> team.name).toList(); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/tasks/BukkitTeamTask.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/tasks/BukkitTeamTask.java new file mode 100644 index 0000000..6ffbdf4 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/tasks/BukkitTeamTask.java @@ -0,0 +1,16 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.tasks; + +import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.Task; +import org.bukkit.scheduler.BukkitTask; + +public abstract class BukkitTeamTask implements Task, BukkitTask { + @Override + public void stopTask() { + this.cancel(); + } + + @Override + public boolean isTaskRunning() { + return !this.isCancelled(); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/tasks/CountdownTeamTask.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/tasks/CountdownTeamTask.java new file mode 100644 index 0000000..0909ee7 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/internal/teamTasks/tasks/CountdownTeamTask.java @@ -0,0 +1,24 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.tasks; + +import eu.mhsl.craftattack.spawn.core.util.text.Countdown; +import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.Task; +import net.kyori.adventure.text.Component; + +import java.util.function.Consumer; +import java.util.function.Function; + +public class CountdownTeamTask extends Countdown implements Task { + public CountdownTeamTask(int countdownFrom, Function announcementBuilder, Consumer announcementConsumer, Runnable onDone) { + super(countdownFrom, announcementBuilder, announcementConsumer, onDone); + } + + @Override + public void stopTask() { + super.cancelIfRunning(); + } + + @Override + public boolean isTaskRunning() { + return super.isRunning(); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/fightDetector/FightDetector.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/fightDetector/FightDetector.java new file mode 100644 index 0000000..00781da --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/fightDetector/FightDetector.java @@ -0,0 +1,99 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.fightDetector; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.VaroTeam; +import net.kyori.adventure.util.Ticks; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class FightDetector extends Appliance { + public static final long FIGHT_TIMEOUT = 60 * 1000; + private static final long BLOCK_RADIUS = 30; + + public final Map fights = new HashMap<>(); + + public FightDetector() { + Bukkit.getScheduler().runTaskTimer( + Main.instance(), + () -> { + var teamFights = this.fights.keySet().stream() + .filter(this::isInFight) + .toList(); + if(teamFights.isEmpty()) return; + Main.logger().info(String.format( + "There are %d Teams in Fight: %s", + teamFights.size(), + teamFights.stream() + .map(varoTeam -> String.format( + "%s[%s]", + varoTeam.name, + varoTeam.members.stream() + .map(member -> member.player.getName()) + .collect(Collectors.joining(",")))) + .collect(Collectors.joining(", ")) + )); + }, + Ticks.TICKS_PER_SECOND * 15, + Ticks.TICKS_PER_SECOND * 15 + ); + + Bukkit.getScheduler().runTaskTimer( + Main.instance(), + this::detectNearbyFights, + Ticks.TICKS_PER_SECOND, + Ticks.TICKS_PER_SECOND + ); + } + + private void detectNearbyFights() { + var players = Bukkit.getOnlinePlayers(); + Bukkit.getScheduler().runTaskAsynchronously(Main.instance(), () -> { + for (Player player : players) { + VaroTeam ownTeam = this.queryAppliance(Teams.class).getTeamFromPlayer(player.getUniqueId()); + if (ownTeam == null) continue; + + for (Player otherPlayer : players) { + if (player.equals(otherPlayer)) continue; + + VaroTeam otherTeam = this.queryAppliance(Teams.class).getTeamFromPlayer(otherPlayer.getUniqueId()); + if (otherTeam == null || ownTeam.equals(otherTeam)) continue; + if(!player.getLocation().getWorld().equals(otherPlayer.getLocation().getWorld())) continue; + + if (player.getLocation().distance(otherPlayer.getLocation()) <= BLOCK_RADIUS) { + this.setInFight(ownTeam); + this.setInFight(otherTeam); + } + } + } + }); + } + + public boolean isInFight(VaroTeam team) { + Long lastFightTime = this.fights.get(team); + if(lastFightTime == null) return false; + return (System.currentTimeMillis() - lastFightTime <= FIGHT_TIMEOUT); + } + + public void setInFight(VaroTeam team) { + this.fights.put(team, System.currentTimeMillis()); + } + public void setInFight(Player player) { + this.setInFight(this.queryAppliance(Teams.class).getTeamFromPlayer(player.getUniqueId())); + } + + @Override + protected @NotNull List listeners() { + return List.of( + new FightOnInteractionListener() + ); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/fightDetector/FightOnInteractionListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/fightDetector/FightOnInteractionListener.java new file mode 100644 index 0000000..d28c8bb --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/fightDetector/FightOnInteractionListener.java @@ -0,0 +1,28 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.fightDetector; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.VaroTeam; +import io.papermc.paper.event.player.PrePlayerAttackEntityEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +class FightOnInteractionListener extends ApplianceListener { + @EventHandler + public void onAttack(PrePlayerAttackEntityEvent event) { + if(!event.willAttack()) return; + + if(event.getAttacked() instanceof Player attackedPlayer) { + Teams teamsAppliance = Main.instance().getAppliance(Teams.class); + VaroTeam attacker = teamsAppliance.getTeamFromPlayer(event.getPlayer().getUniqueId()); + VaroTeam attacked = teamsAppliance.getTeamFromPlayer(event.getAttacked().getUniqueId()); + if(attacked == null) return; + if(attacker == null) return; + if(attacker.equals(attacked)) return; + + this.getAppliance().setInFight(event.getPlayer()); + this.getAppliance().setInFight(attackedPlayer); + } + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenEntityListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenEntityListener.java new file mode 100644 index 0000000..07665c8 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenEntityListener.java @@ -0,0 +1,27 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import net.kyori.adventure.text.Component; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +class ForbiddenEntityListener extends ApplianceListener { + @EventHandler + public void onEntitySpawn(EntitySpawnEvent event) { + if(!this.getAppliance().forbiddenEntities.isForbidden(event.getEntity())) return; + event.setCancelled(true); + } + + @EventHandler + public void onEntityInteraction(PlayerInteractEntityEvent event) { + if(!this.getAppliance().forbiddenEntities.isForbidden(event.getRightClicked())) return; + event.setCancelled(true); + + event.getPlayer().sendActionBar( + Component.text() + .append(Component.text(event.getRightClicked().getName())) + .append(Component.text(" ist eine verbotene Entität!")) + ); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenGroup.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenGroup.java new file mode 100644 index 0000000..9b1b11e --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenGroup.java @@ -0,0 +1,17 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import java.util.Set; +import java.util.function.Function; + +public class ForbiddenGroup { + private final Set> forbiddenT; + + public ForbiddenGroup(Set> forbiddenT) { + this.forbiddenT = forbiddenT; + } + + public boolean isForbidden(TType value) { + return this.forbiddenT.stream() + .anyMatch(test -> test.apply(value)); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java new file mode 100644 index 0000000..97bc71e --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenItems.java @@ -0,0 +1,46 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Villager; +import org.bukkit.event.Listener; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Set; + +public class ForbiddenItems extends Appliance { + public ForbiddenGroup forbiddenMaterials = new ForbiddenGroup<>(Set.of( + (material) -> material.name().startsWith("NETHERITE"), + (material) -> material.equals(Material.TOTEM_OF_UNDYING), + (material) -> material.equals(Material.END_CRYSTAL), + (material) -> material.equals(Material.MACE), + (material) -> material.equals(Material.ENCHANTED_GOLDEN_APPLE) + )); + + public ForbiddenGroup forbiddenEntities = new ForbiddenGroup<>(Set.of( + (entity) -> { + if(!(entity instanceof Villager villager)) return false; + return List.of( + Villager.Profession.LIBRARIAN, + Villager.Profession.ARMORER + ).contains(villager.getProfession()); + } + )); + + public ForbiddenGroup forbiddenPotions = new ForbiddenGroup<>(Set.of( + (potion) -> !potion.getType().equals(PotionEffectType.INSTANT_HEALTH) && potion.getAmplifier() >= 1 // Amplifier starts at 0 + )); + + @Override + protected @NotNull List listeners() { + return List.of( + new ForbiddenMaterialListener(), + new ForbiddenEntityListener(), + new ForbiddenPotionsListener() + ); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java new file mode 100644 index 0000000..f24f15f --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenMaterialListener.java @@ -0,0 +1,49 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.List; +import java.util.Objects; + +class ForbiddenMaterialListener extends ApplianceListener { + @EventHandler + public void onPickup(EntityPickupItemEvent event) { + this.testAndCancel(event, event.getItem().getItemStack().getType(), event.getEntity()); + } + + @EventHandler + public void onInventoryInteraction(InventoryClickEvent event) { + if(event.getCurrentItem() == null) return; + if(List.of(ClickType.DROP, ClickType.CONTROL_DROP).contains(event.getClick())) return; + boolean wasCancelled = this.testAndCancel(event, event.getCurrentItem().getType(), event.getWhoClicked()); + if(wasCancelled) Objects.requireNonNull(event.getClickedInventory()).remove(event.getCurrentItem()); + } + + private boolean testAndCancel(Cancellable event, Material material, Entity entity) { + if(!this.getAppliance().forbiddenMaterials.isForbidden(material)) return false; + event.setCancelled(true); + + if(entity instanceof Player p) { + Component itemName = material.getItemTranslationKey() != null + ? Component.translatable(material.getItemTranslationKey()) + : Component.text(material.name()); + + p.sendActionBar( + Component.text() + .append(itemName) + .append(Component.text(" ist ein verbotener Gegenstand!")) + ); + } + + return true; + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenPotionsListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenPotionsListener.java new file mode 100644 index 0000000..e11a17c --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/forbiddenItems/ForbiddenPotionsListener.java @@ -0,0 +1,54 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.forbiddenItems; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.LingeringPotionSplashEvent; +import org.bukkit.event.entity.PotionSplashEvent; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionEffect; + +import javax.annotation.Nullable; +import java.util.Collection; + +class ForbiddenPotionsListener extends ApplianceListener { + @EventHandler + public void onPotionSplash(PotionSplashEvent event) { + Collection effects = event.getPotion().getEffects(); + + this.testAndCancel(event, effects, null); + } + + @EventHandler + public void onPotionConsume(PlayerItemConsumeEvent event) { + if(!(event.getItem().getItemMeta() instanceof PotionMeta meta)) return; + if(meta.getBasePotionType() == null) return; + Collection effects = meta.getBasePotionType().getPotionEffects(); + + this.testAndCancel(event, effects, event.getPlayer()); + } + + @EventHandler + public void onLingeringPotionSplash(LingeringPotionSplashEvent event) { + if(event.getAreaEffectCloud().getBasePotionType() == null) return; + Collection effects = event.getAreaEffectCloud().getBasePotionType().getPotionEffects(); + + this.testAndCancel(event, effects, null); + } + + private void testAndCancel(Cancellable event, Collection effects, @Nullable Player player) { + if(effects.stream().noneMatch(potionEffect -> this.getAppliance().forbiddenPotions.isForbidden(potionEffect))) return; + + event.setCancelled(true); + + if(player == null) return; + + player.sendActionBar( + Component.text() + .append(Component.text("Das ist ein verbotener Trank!")) + ); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtection.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtection.java new file mode 100644 index 0000000..f2abd06 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtection.java @@ -0,0 +1,85 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.joinProtection; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.util.Ticks; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Listener; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class JoinProtection extends Appliance { + public static final int resistanceDuration = 10; + + static final class Options { + public boolean wasOnGround = false; + public Long joinTime = System.currentTimeMillis(); + } + private final Map protectedPlayers = new HashMap<>(); + + public void addProtection(Player player) { + if(player.isOp()) return; + + this.protectedPlayers.put(player.getUniqueId(), new Options()); + PotionEffect resistance = new PotionEffect(PotionEffectType.RESISTANCE, Ticks.TICKS_PER_SECOND * resistanceDuration, 1); + PotionEffect blindness = new PotionEffect(PotionEffectType.DARKNESS, Ticks.TICKS_PER_SECOND * 3, 1); + player.addPotionEffects(List.of(resistance, blindness)); + + Bukkit.getScheduler().runTaskTimer( + Main.instance(), + this::updateStatus, + Ticks.TICKS_PER_SECOND, + Ticks.TICKS_PER_SECOND + ); + } + + @Nullable JoinProtection.Options getOptions(Player player) { + return this.protectedPlayers.get(player.getUniqueId()); + } + + public boolean isNotProtected(Player player) { + Options options = this.protectedPlayers.get(player.getUniqueId()); + if(options == null) return true; + return options.joinTime <= System.currentTimeMillis() - (resistanceDuration * 1000L); + } + + public void cancelEvent(Player player, Cancellable event) { + if(this.isNotProtected(player)) return; + event.setCancelled(true); + } + + public void updateStatus() { + IteratorUtil.onlinePlayers(player -> { + Options options = this.protectedPlayers.get(player.getUniqueId()); + if(options == null) return; + + if(this.isNotProtected(player)) { + this.protectedPlayers.remove(player.getUniqueId()); + } + + int secondsLeft = Math.abs((int) ((System.currentTimeMillis() - options.joinTime) / 1000) - resistanceDuration); + player.sendActionBar( + Component.text( + secondsLeft > 0 + ? String.format("Du bist in %d Sekunden angreifbar!", secondsLeft) + : "Du bist jetzt angreifbar!", + NamedTextColor.RED + ) + ); + }); + } + + @Override + protected @NotNull List listeners() { + return List.of(new JoinProtectionListener()); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtectionListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtectionListener.java new file mode 100644 index 0000000..12ba92b --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtectionListener.java @@ -0,0 +1,62 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.joinProtection; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.*; + +public class JoinProtectionListener extends ApplianceListener { + @EventHandler + public void onJoin(PlayerJoinEvent event) { + this.getAppliance().addProtection(event.getPlayer()); + } + + @EventHandler + public void onDamage(EntityDamageEvent event) { + if(!(event.getEntity() instanceof Player player)) return; + if(event.getCause().equals(EntityDamageEvent.DamageCause.FALL)) return; + this.getAppliance().cancelEvent(player, event); + } + + @EventHandler + public void onConsume(PlayerItemConsumeEvent event) { + this.getAppliance().cancelEvent(event.getPlayer(), event); + } + + @EventHandler + public void onMove(PlayerMoveEvent event) { + if(!event.hasChangedPosition()) return; + JoinProtection.Options option = this.getAppliance().getOptions(event.getPlayer()); + if(option == null) return; + if(!option.wasOnGround) { + option.wasOnGround = ((LivingEntity) event.getPlayer()).isOnGround(); + return; + } + + this.getAppliance().cancelEvent(event.getPlayer(), event); + } + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + this.getAppliance().cancelEvent(event.getPlayer(), event); + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) { + this.getAppliance().cancelEvent(event.getPlayer(), event); + } + + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { + this.getAppliance().cancelEvent(event.getPlayer(), event); + } + + @EventHandler + public void onFlightChange(PlayerToggleFlightEvent event) { + this.getAppliance().cancelEvent(event.getPlayer(), event); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/netherPrevent/NetherPrevent.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/netherPrevent/NetherPrevent.java new file mode 100644 index 0000000..6bac585 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/netherPrevent/NetherPrevent.java @@ -0,0 +1,16 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.netherPrevent; + +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class NetherPrevent extends Appliance { + @Override + protected @NotNull List listeners() { + return List.of( + new NetherPreventListener() + ); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/netherPrevent/NetherPreventListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/netherPrevent/NetherPreventListener.java new file mode 100644 index 0000000..6963610 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/netherPrevent/NetherPreventListener.java @@ -0,0 +1,13 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.netherPrevent; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.world.PortalCreateEvent; + +public class NetherPreventListener extends ApplianceListener { + @EventHandler + public void onPortalCreate(PortalCreateEvent event) { + if(event.getReason().equals(PortalCreateEvent.CreateReason.NETHER_PAIR)) return; + event.setCancelled(true); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimer.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimer.java new file mode 100644 index 0000000..c88325b --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimer.java @@ -0,0 +1,128 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.config.Configuration; +import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.TeamTasks; +import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.tasks.CountdownTeamTask; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.VaroTeam; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; + +public class PlayTimer extends Appliance { + public static final int PLAYTIME_MINUTES = 30; + + private final Map joinTickets = new HashMap<>(); + private final Path saveFile = Paths.get(Main.instance().getDataFolder().getAbsolutePath() + "/playtime.json"); + + public PlayTimer() { + super("playTimer"); + this.load(); + } + + public void changeEnabled(boolean enabled) { + this.localConfig().set("enableTicketing", enabled); + Configuration.saveChanges(); + } + public boolean isEnabled() { + return this.localConfig().getBoolean("enableTicketing", true); + } + + private void load() { + if (!Files.exists(this.saveFile)) return; + try (Reader reader = Files.newBufferedReader(this.saveFile)) { + Type type = new TypeToken>() {}.getType(); + Map data = new Gson().fromJson(reader, type); + @SuppressWarnings("unchecked") Map ticketMap = (Map) data.get("tickets"); + + if (ticketMap != null) { + for (Map.Entry entry : ticketMap.entrySet()) { + this.joinTickets.put(entry.getKey(), entry.getValue().intValue()); + } + } + } catch (IOException e) { + Main.logger().warning("Failed reading playtime from teams: " + e.getMessage()); + } + } + + private void save() { + try { + Files.createDirectories(this.saveFile.getParent()); + try (Writer writer = Files.newBufferedWriter(this.saveFile)) { + new Gson().toJson(Map.of("tickets", this.joinTickets), writer); + } + } catch (IOException e) { + Main.logger().warning("Failed to save playtime for teams: " + e.getMessage()); + } + } + + public void incrementAll() { + Main.logger().info("Incrementing all PlayTime Tickets by one!"); + this.joinTickets.replaceAll((n, v) -> this.joinTickets.get(n) + 1); + this.save(); + } + public void setTickets(VaroTeam team, int amount) { + this.joinTickets.put(team.name, amount); + this.save(); + } + + public int getTickets(VaroTeam team) { + return this.joinTickets.getOrDefault(team.name, 1); + } + + public boolean tryConsumeTicket(VaroTeam team) { + String teamName = team.name; + + var teamTasks = Main.instance().getAppliance(TeamTasks.class); + boolean isSecond = teamTasks.getRunningTeamTasks(team).containsKey(TeamTasks.Type.JOIN_PAIR); + if(!isSecond) { + int current = this.joinTickets.getOrDefault(teamName, 1); + if (current <= 0) return false; + this.joinTickets.put(teamName, current - 1); + + var task = new CountdownTeamTask(10, announcementData -> null, component -> {}, () -> {}); + task.start(); + teamTasks.addTask(team, TeamTasks.Type.JOIN_PAIR, task); + } + + this.save(); + return true; + } + + + @Override + public void httpApi(HttpServer.ApiBuilder apiBuilder) { + record Ticket(String team, int tickets) {} + apiBuilder.get("tickets", request -> { + String teamName = request.queryParamsSafe("team"); + VaroTeam team = Main.instance().getAppliance(Teams.class).findTeamByName(teamName); + if(team == null) throw new NoSuchElementException("Team not found!"); + + return new Ticket(team.name, this.getTickets(team)); + }); + } + + @Override + protected @NotNull List> commands() { + return List.of( + new PlayTimerCommand(), + new TicketingCommand() + ); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java new file mode 100644 index 0000000..5452453 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java @@ -0,0 +1,95 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.VaroTeam; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.stream.Stream; + +public class PlayTimerCommand extends ApplianceCommand { + public PlayTimerCommand() { + super("playTimer"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (args.length < 3) throw new Error("Usage: playTimer [amount]"); + + String mode = args[0].toLowerCase(); + String identifier = args[1]; + String action = args[2].toLowerCase(); + + Teams teamAppliance = Main.instance().getAppliance(Teams.class); + VaroTeam team = switch (mode) { + case "user" -> { + OfflinePlayer player = Bukkit.getOfflinePlayer(identifier); + yield teamAppliance.getTeamFromPlayer(player.getUniqueId()); + } + case "team" -> teamAppliance.findTeamByName(identifier); + case "incallbyone" -> { + this.getAppliance().incrementAll(); + throw new Error("KEIN FEHLER!: Incremented all Teams by one!"); + } + default -> throw new Error("Ungültiger Modus: " + mode + ". Erlaubt: user | team"); + }; + + if(team == null) throw new Error("Team nicht gefunden."); + + switch (action) { + case "get" -> { + int ticketCount = this.getAppliance().getTickets(team); + sender.sendMessage(String.format("Team %s hat %d tickets!", team.name, ticketCount)); + } + case "set" -> { + if (args.length < 4) throw new Error("Usage: playTimer set "); + int amount = Integer.parseInt(args[3]); + this.getAppliance().setTickets(team, amount); + sender.sendMessage("Tickets wurden gesetzt!"); + } + default -> throw new Error("Ungültige Aktion: " + action + ". Erlaubt: get | set"); + } + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + List teams = Main.instance().getAppliance(Teams.class).getAllTeams(); + + return switch (args.length) { + case 1 -> Stream.of("user", "team", "incAllByOne") + .filter(opt -> opt.startsWith(args[0].toLowerCase())) + .toList(); + + case 2 -> { + if (args[0].equalsIgnoreCase("user")) { + yield Bukkit.getOnlinePlayers().stream() + .map(Player::getName) + .filter(name -> name.toLowerCase().startsWith(args[1].toLowerCase())) + .toList(); + } else if (args[0].equalsIgnoreCase("team")) { + yield teams.stream() + .map(team -> team.name) + .filter(name -> name.toLowerCase().startsWith(args[1].toLowerCase())) + .toList(); + } else { + yield List.of(); + } + } + + case 3 -> Stream.of("get", "set") + .filter(opt -> opt.startsWith(args[2].toLowerCase())) + .toList(); + + default -> List.of(); + }; + } + +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/TicketingCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/TicketingCommand.java new file mode 100644 index 0000000..b253f20 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/TicketingCommand.java @@ -0,0 +1,41 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class TicketingCommand extends ApplianceCommand { + public TicketingCommand() { + super("ticketing"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + sender.sendMessage(String.format("Ticketing was %b", this.getAppliance().isEnabled())); + if(args.length < 1) + throw new Error("Stop Ticketing with 'stop' or start ticketing (now subtracting one) and start team-countdown with 'start'"); + + switch(args[0]) { + case "stop" -> this.getAppliance().changeEnabled(false); + case "start" -> { + this.getAppliance().changeEnabled(true); + Main.instance().getAppliance(Teams.class).getAllTeams().forEach(team -> { + boolean isAllowed = this.getAppliance().tryConsumeTicket(team); + if(!isAllowed) { + Main.logger().warning(String.format("Team %s already on Server, Ticketing got enabled but no Tickets were left! KICKING!", team.name)); + team.kickTeam(); + } + + team.startCountDown(); + }); + sender.sendMessage(String.format("Ticketing (ticket reduction on join) is now %b", this.getAppliance().isEnabled())); + } + default -> sender.sendMessage("Unknown command"); + } + + sender.sendMessage(String.format("Ticketing is now %b", this.getAppliance().isEnabled())); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorder.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorder.java new file mode 100644 index 0000000..74d378b --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorder.java @@ -0,0 +1,110 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.shrinkingBorder; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.config.Configuration; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer.PlayTimer; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldBorder; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.time.LocalTime; +import java.util.*; + +public class ShrinkingBorder extends Appliance { + private final String shrinkPerDayKey = "shrinkPerDay"; + private final String shrinkTimeKey = "shrinkTime"; + private final String minimumSizeKey = "minimumSize"; + public int shrinkPerDay; + public LocalTime shrinkTime; + public int minimumSize; + private final Timer timer = new Timer(); + private final Calendar calendar = Calendar.getInstance(TimeZone.getDefault()); + + private final WorldBorder overworldBorder = Bukkit.getWorlds().stream() + .filter(world -> world.getEnvironment().equals(World.Environment.NORMAL)) + .findFirst().orElseThrow().getWorldBorder(); + private final WorldBorder netherBorder = Bukkit.getWorlds().stream() + .filter(world -> world.getEnvironment().equals(World.Environment.NETHER)) + .findFirst().orElseThrow().getWorldBorder(); + + private class ShrinkBorderTask extends TimerTask { + @Override + public void run() { + Bukkit.getScheduler().runTask(Main.instance(), ShrinkingBorder.this::shrinkBorder); + Main.instance().getAppliance(PlayTimer.class).incrementAll(); + } + } + + @Override + public void onEnable() { + Settings.instance().declareSetting(ShrinkingBorderSetting.class); + } + + public ShrinkingBorder() { + super("shrinkingBorder"); + this.shrinkPerDay = this.localConfig().getInt(this.shrinkPerDayKey, 10); + this.shrinkTime = LocalTime.parse(this.localConfig().getString(this.shrinkTimeKey, LocalTime.of(3, 0, 0).toString())); + this.minimumSize = this.localConfig().getInt(this.minimumSizeKey, 10); + + this.calendar.set(Calendar.HOUR_OF_DAY, this.shrinkTime.getHour()); + this.calendar.set(Calendar.MINUTE, this.shrinkTime.getMinute()); + this.calendar.set(Calendar.SECOND, this.shrinkTime.getSecond()); + + if(this.calendar.getTime().before(new Date(System.currentTimeMillis()))) { + this.calendar.add(Calendar.DAY_OF_MONTH, 1); + } + + this.timer.schedule(new ShrinkBorderTask(), this.calendar.getTime()); + } + + private void shrinkBorder() { + this.overworldBorder.setSize(Math.max(this.overworldBorder.getSize()-this.shrinkPerDay, this.minimumSize)); + this.netherBorder.setSize(Math.max(this.netherBorder.getSize()-this.shrinkPerDay, this.minimumSize)); + + this.calendar.add(Calendar.DAY_OF_MONTH, 1); + this.timer.schedule(new ShrinkBorderTask(), this.calendar.getTime()); + } + + public void changeOption(ShrinkingBorderCommand.Argument option, int value) { + switch (option) { + case MINIMUM_SIZE -> { + this.minimumSize = value; + this.localConfig().set(this.minimumSizeKey, value); + } + case SHRINK_PER_DAY -> { + this.shrinkPerDay = value; + this.localConfig().set(this.shrinkPerDayKey, value); + } + } + Configuration.saveChanges(); + } + + public int getOption(ShrinkingBorderCommand.Argument option) { + switch (option) { + case MINIMUM_SIZE -> { + return this.minimumSize; + } + case SHRINK_PER_DAY -> { + return this.shrinkPerDay; + } + default -> { + return 0; + } + } + } + + @Override + protected @NotNull List> commands() { + return List.of(new ShrinkingBorderCommand()); + } + + @Override + protected @NotNull List listeners() { + return List.of(new ShrinkingBorderListener()); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderCommand.java new file mode 100644 index 0000000..c0cca51 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderCommand.java @@ -0,0 +1,61 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.shrinkingBorder; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; + +public class ShrinkingBorderCommand extends ApplianceCommand { + public enum Argument { + SHRINK_PER_DAY("shrinkPerDay"), + MINIMUM_SIZE("minimumSize"); + + public final String name; + + Argument(String friendlyName) { + this.name = friendlyName; + } + + static Argument fromString(String argument) { + return Arrays.stream(values()).filter(argument1 -> argument1.name.equals(argument)).findFirst().orElseThrow(); + } + } + + public ShrinkingBorderCommand() { + super("shrinkingBorder"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args.length < 1 || args.length > 2) throw new Error("shrinkingBorder command needs one or two arguments"); + if(Arrays.stream(Argument.values()).noneMatch(argument -> argument.name.equals(args[0]))) throw new Error(String.format("argument %s does not exist", args[0])); + Argument option = Argument.fromString(args[0]); + + switch (args.length) { + case 1: + sender.sendMessage(String.format("%s is currently set to %d", args[0], this.getAppliance().getOption(option))); + break; + case 2: + try { + int value = Integer.parseInt(args[1]); + this.getAppliance().changeOption(option, value); + sender.sendMessage(String.format("%s is now set to %d", args[0], this.getAppliance().getOption(option))); + } catch (NumberFormatException e) { + throw new Error("second argument has to be an integer"); + } + break; + default: + throw new Error("shrinkingBorder command needs one or two arguments"); + } + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args.length > 1) return List.of(); + return Arrays.stream(Argument.values()).map(argument -> argument.name).toList(); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderListener.java new file mode 100644 index 0000000..5102828 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderListener.java @@ -0,0 +1,58 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.shrinkingBorder; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.WorldBorder; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerMoveEvent; + +public class ShrinkingBorderListener extends ApplianceListener { + @EventHandler + public void onPlayerMove(PlayerMoveEvent event) { + if(!event.hasChangedPosition()) return; + if(event.getTo().getWorld().getEnvironment().equals(World.Environment.THE_END)) return; + if(this.isSave(event.getTo())) return; + int remainingDays = this.daysUntilBorder(event.getTo()); + + int maxDaysShown = Settings.instance().getSetting(event.getPlayer(), Settings.Key.BorderWarning, Integer.class); + + if(remainingDays > maxDaysShown) return; + + String actionBarText; + if(remainingDays <= 0) { + actionBarText = "Du befindest dich in der Worldborder!"; + } else if(remainingDays == 1) { + actionBarText = "Morgen ist die Worldborder hier! Ausloggen = ☠"; + } else { + actionBarText = String.format("In %d Tagen ist die Worldborder hier!", remainingDays); + } + + event.getPlayer().sendActionBar(Component.text( + actionBarText, + TextColor.color(255, 0, 0) + )); + } + + private int daysUntilBorder(Location playerLocation) { + WorldBorder worldBorder = playerLocation.getWorld().getWorldBorder(); + Location relativeLocation = playerLocation.clone().subtract(worldBorder.getCenter()); + double playerBorderDistanceX = worldBorder.getSize()/2 - Math.abs(relativeLocation.getX()); + double playerBorderDistanceZ = worldBorder.getSize()/2 - Math.abs(relativeLocation.getZ()); + double halfShrinkPerDayX = (double) this.getAppliance().getOption(ShrinkingBorderCommand.Argument.SHRINK_PER_DAY) / 2; + int xSteps = (int) Math.ceil(playerBorderDistanceX / halfShrinkPerDayX); + int zSteps = (int) Math.ceil(playerBorderDistanceZ / halfShrinkPerDayX); + return Math.min(xSteps, zSteps); + } + + private boolean isSave(Location playerLocation) { + WorldBorder worldBorder = playerLocation.getWorld().getWorldBorder(); + Location relativeLocation = playerLocation.clone().subtract(worldBorder.getCenter()); + if(Math.abs(relativeLocation.getX()) > this.getAppliance().getOption(ShrinkingBorderCommand.Argument.MINIMUM_SIZE)) return false; + if(Math.abs(relativeLocation.getZ()) > this.getAppliance().getOption(ShrinkingBorderCommand.Argument.MINIMUM_SIZE)) return false; + return true; + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderSetting.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderSetting.java new file mode 100644 index 0000000..d73c934 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderSetting.java @@ -0,0 +1,43 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.shrinkingBorder; + +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.Settings; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.settings.datatypes.IntegerSetting; +import org.bukkit.Material; + +import java.util.List; + +public class ShrinkingBorderSetting extends IntegerSetting implements CategorizedSetting { + public ShrinkingBorderSetting() { + super( + Settings.Key.BorderWarning, + List.of(0, 1, 2, 3) + ); + } + + @Override + public SettingCategory category() { + return SettingCategory.Gameplay; + } + + @Override + protected String title() { + return "Warnung vor der Worldborder"; + } + + @Override + protected String description() { + return "Warnt vor der Worldborder"; + } + + @Override + protected Material icon() { + return Material.BARRIER; + } + + @Override + protected Integer defaultValue() { + return 2; + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/CordLeak.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/CordLeak.java new file mode 100644 index 0000000..42932ff --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/CordLeak.java @@ -0,0 +1,118 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.strike; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; +import org.bukkit.Bukkit; +import org.bukkit.Location; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Instant; +import java.util.*; + +public class CordLeak { + private static final Path saveFile = Paths.get(Main.instance().getDataFolder().getAbsolutePath(), "cordleak.json"); + private static final Map leaks = new HashMap<>(); + + static { + load(); + } + + private record LocationDto(String world, double x, double y, double z, float yaw, float pitch) { + static LocationDto from(Location loc) { + return new LocationDto(loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + } + + Location toLocation() { + return new Location(Bukkit.getWorld(this.world), this.x, this.y, this.z, this.yaw, this.pitch); + } + } + + public record LeakInfo(Location location, Instant leakedAt) {} + + private record LeakInfoDto(LocationDto location, long leakedAt) { + static LeakInfoDto from(LeakInfo info) { + return new LeakInfoDto(LocationDto.from(info.location), info.leakedAt.toEpochMilli()); + } + + LeakInfo toLeakInfo() { + return new LeakInfo(this.location.toLocation(), Instant.ofEpochMilli(this.leakedAt)); + } + } + + public static void update() { + IteratorUtil.onlinePlayers(player -> { + UUID uuid = player.getUniqueId(); + Location loc = player.getLocation(); + + leaks.compute(uuid, (key, existing) -> { + // Falls bereits geleakt, nicht aktualisieren + if (existing != null && !existing.leakedAt.equals(Instant.EPOCH)) { + return existing; + } + return new LeakInfo(loc, existing != null ? existing.leakedAt : Instant.EPOCH); + }); + }); + Bukkit.getScheduler().runTaskAsynchronously(Main.instance(), CordLeak::save); + } + + public static void markAsLeaked(UUID uuid) { + LeakInfo existing = leaks.get(uuid); + if (existing == null) return; + leaks.put(uuid, new LeakInfo(existing.location, Instant.now())); + Bukkit.getScheduler().runTaskAsynchronously(Main.instance(), CordLeak::save); + } + + public static LeakInfo getLastKnownLocation(UUID uuid) { + return leaks.get(uuid); + } + + public static Map getAllLeaked() { + Map result = new HashMap<>(); + Instant cutoff = Instant.now().minusSeconds(3 * 24 * 60 * 60); // 3 Tage in Sekunden + + for (Map.Entry entry : leaks.entrySet()) { + LeakInfo info = entry.getValue(); + if (info.leakedAt.isAfter(cutoff)) { + result.put(entry.getKey(), info); + } + } + + return result; + } + + private static void load() { + if (!Files.exists(saveFile)) return; + try (Reader reader = Files.newBufferedReader(saveFile)) { + Type type = new TypeToken>() {}.getType(); + Map raw = new Gson().fromJson(reader, type); + for (Map.Entry entry : raw.entrySet()) { + leaks.put(UUID.fromString(entry.getKey()), entry.getValue().toLeakInfo()); + } + } catch (IOException e) { + Main.logger().warning("Failed to load CordLeak data: " + e.getMessage()); + } + } + + private static void save() { + try { + Files.createDirectories(saveFile.getParent()); + Map raw = new HashMap<>(); + for (Map.Entry entry : leaks.entrySet()) { + raw.put(entry.getKey().toString(), LeakInfoDto.from(entry.getValue())); + } + try (Writer writer = Files.newBufferedWriter(saveFile)) { + new Gson().toJson(raw, writer); + } + } catch (IOException e) { + Main.logger().warning("Failed to save CordLeak data: " + e.getMessage()); + } + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/InvClear.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/InvClear.java new file mode 100644 index 0000000..26340ea --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/InvClear.java @@ -0,0 +1,64 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.strike; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import eu.mhsl.craftattack.spawn.core.Main; +import org.bukkit.Bukkit; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; + +public class InvClear { + private static final Path saveFile = Paths.get(Main.instance().getDataFolder().getAbsolutePath(), "invClear.json"); + private static final List players = new ArrayList<>(); + + static { + load(); + } + + public static void add(UUID player) { + Main.logger().info(String.format("Cannot clear inv because Player is offline. Remembering %s", player)); + players.add(player); + Bukkit.getScheduler().runTaskAsynchronously(Main.instance(), InvClear::save); + } + + public static boolean contains(UUID player) { + return players.contains(player); + } + + public static void remove(UUID player) { + players.remove(player); + Bukkit.getScheduler().runTaskAsynchronously(Main.instance(), InvClear::save); + } + + private static void load() { + if (!Files.exists(saveFile)) return; + try (Reader reader = Files.newBufferedReader(saveFile)) { + Type type = new TypeToken>() {}.getType(); + List loaded = new Gson().fromJson(reader, type); + if (loaded != null) { + players.clear(); + players.addAll(loaded); + } + } catch (IOException e) { + Main.logger().warning("Failed to load InvClear data: " + e.getMessage()); + } + } + + private static void save() { + try { + Files.createDirectories(saveFile.getParent()); + try (Writer writer = Files.newBufferedWriter(saveFile)) { + new Gson().toJson(players, writer); + } + } catch (IOException e) { + Main.logger().warning("Failed to save InvClear data: " + e.getMessage()); + } + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/OnStrikeActionListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/OnStrikeActionListener.java new file mode 100644 index 0000000..97b757b --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/OnStrikeActionListener.java @@ -0,0 +1,25 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.strike; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +public class OnStrikeActionListener extends ApplianceListener { + @EventHandler + public void onJoin(PlayerJoinEvent event) { + this.getAppliance().checkJoin(event.getPlayer()); + + var leaks = CordLeak.getAllLeaked(); + var text = Component.text(); + if(!leaks.isEmpty()) { + text.append(Component.text("Geleakte Koordinaten:", NamedTextColor.AQUA)); + leaks.forEach((uuid, leakInfo) -> { + this.getAppliance().appendCordLeak(text, uuid); + }); + + event.getPlayer().sendMessage(text); + } + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/Strike.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/Strike.java new file mode 100644 index 0000000..b33a017 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/strike/Strike.java @@ -0,0 +1,169 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.strike; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.VaroTeam; +import io.papermc.paper.ban.BanListType; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentBuilder; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.util.Ticks; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +public class Strike extends Appliance { + public Strike() { + Bukkit.getScheduler().scheduleSyncRepeatingTask( + Main.instance(), + CordLeak::update, + Ticks.TICKS_PER_SECOND, + Ticks.TICKS_PER_SECOND * 3 + ); + } + + record StrikeInfo(List users, int totalWeight) { + } + @Override + public void httpApi(HttpServer.ApiBuilder apiBuilder) { + apiBuilder.post("update", StrikeInfo.class, (data, request) -> { + Main.instance().getLogger().info(String.format( + "API Triggered Strike-Profile update for %s", + data.users.stream().map(UUID::toString).collect(Collectors.joining(", "))) + ); + this.processUpdate(data); + return HttpServer.nothing; + }); + + apiBuilder.get("cords", req -> { + Map raw = CordLeak.getAllLeaked(); + Map dto = new HashMap<>(); + for (Map.Entry entry : raw.entrySet()) { + dto.put(entry.getKey().toString(), LeakInfoDto.from(entry.getKey(), entry.getValue())); + } + return dto; + }); + } + + record LocationDto(String world, double x, double y, double z, float yaw, float pitch) { + static LocationDto from(Location loc) { + return new LocationDto(loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + } + } + + record LeakInfoDto(String name, LocationDto location, long leakedAt) { + static LeakInfoDto from(UUID uuid, CordLeak.LeakInfo info) { + String name = Bukkit.getOfflinePlayer(uuid).getName(); + return new LeakInfoDto(name, LocationDto.from(info.location()), info.leakedAt().toEpochMilli()); + } + } + + + private void processUpdate(StrikeInfo data) { + try { + VaroTeam select = null; + for(UUID uuid : data.users) { + select = this.queryAppliance(Teams.class).getTeamFromPlayer(uuid); + if(select != null) break; + } + Objects.requireNonNull(select); + VaroTeam team = select; + + if(data.totalWeight < 3) { + team.members.forEach(member -> { + Main.logger().info(String.format("Unbanning player %s because there are less than 3 Strikes!", member.player.getName())); + Bukkit.getBanList(BanListType.PROFILE).pardon(member.player.getPlayerProfile()); + }); + } + + switch(data.totalWeight) { + case 1 -> { + Main.logger().info(String.format("Cord leak for Team %s", team.name)); + + ComponentBuilder text = Component.text(); + IteratorUtil.onlinePlayers(player -> player.sendMessage(Component.text( + String.format("Das Team %s hat einen Strike erhalten. Daher werden folgende Koordinaten des Teams veröffentlicht:", team.name), + NamedTextColor.RED + ))); + + data.users.forEach(uuid -> { + CordLeak.markAsLeaked(uuid); + this.appendCordLeak(text, uuid); + }); + + IteratorUtil.onlinePlayers(p -> p.sendMessage(text)); + } + + case 2 -> team.members.forEach(member -> { + Main.logger().info(String.format("Clearing Inventory of %s", member.player.getName())); + Optional player = Optional.ofNullable(Bukkit.getPlayer(member.player.getUniqueId())); + player.ifPresentOrElse( + p -> p.getInventory().clear(), + () -> InvClear.add(member.player.getUniqueId()) + ); + }); + + case 3 -> { + team.members.forEach(member -> { + Main.logger().info(String.format("Banning player %s because of third Strike!", member.player.getName())); + Bukkit.getBanList(BanListType.PROFILE) + .addBan(member.player.getPlayerProfile(), "projektausschluss", (Date) null, null); + }); + Bukkit.getScheduler().runTask(Main.instance(), () -> team.getOnlinePlayers().forEach(Player::kick)); + } + } + } catch(Exception e) { + Main.logger().warning("Failed to process Strikes: " + e.getMessage()); + Main.logger().throwing("Strike", "process", e); + } + } + + public void appendCordLeak(ComponentBuilder text, UUID playerToLeak) { + OfflinePlayer player = Bukkit.getOfflinePlayer(playerToLeak); + CordLeak.LeakInfo cords = CordLeak.getLastKnownLocation(playerToLeak); + if(cords == null) return; + + String timestamp = DateTimeFormatter.ofPattern("dd.MM HH:mm") + .withZone(ZoneId.of("Europe/Berlin")) + .format(cords.leakedAt()); + + text.appendNewline(); + text.append(Component.text(Objects.requireNonNull(player.getName()), NamedTextColor.DARK_AQUA)); + text.append(Component.text(": ", NamedTextColor.GRAY)); + text.append(Component.text( + String.format( + "(%s) %d, %d, %d - Uhrzeit: %s", + cords.location().getWorld().getName(), + cords.location().getBlockX(), + cords.location().getBlockY(), + cords.location().getBlockZ(), + timestamp + ), + NamedTextColor.AQUA) + ); + } + + public void checkJoin(@NotNull Player player) { + if(InvClear.contains(player.getUniqueId())) { + player.getInventory().clear(); + InvClear.remove(player.getUniqueId()); + } + } + + @Override + protected @NotNull List listeners() { + return List.of(new OnStrikeActionListener()); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/ConnectivityChangeListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/ConnectivityChangeListener.java new file mode 100644 index 0000000..22bc300 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/ConnectivityChangeListener.java @@ -0,0 +1,71 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams; + +import eu.mhsl.craftattack.spawn.common.api.repositories.VaroReportRepository; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer.PlayTimer; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.Objects; + +class ConnectivityChangeListener extends ApplianceListener { + @EventHandler + public void onLogin(AsyncPlayerPreLoginEvent event) { + boolean result = this.getAppliance().canLogin(event.getUniqueId()); + if(!result) { + event.kickMessage(new DisconnectInfo( + "Kein Teilnehmer", + "Du bist nicht als Teilnehmer registriert oder bist ausgeschieden!", + "Sollte dies ein Fehler sein, kontaktiere bitte einen Admin.", + event.getUniqueId() + ).getComponent()); + event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER); + } + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + this.getAppliance().enforceTeamJoin(event.getPlayer()); + } + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + if(event.getReason().equals(PlayerQuitEvent.QuitReason.KICKED)) { + Main.logger().info(String.format( + "Player %s left the Server. The 'teamLeave' enforcement was skipped, since the QuitReason is 'kicked'", + event.getPlayer().getName() + )); + return; + } + + if(event.getPlayer().isOp()) return; + + VaroTeam team = Main.instance().getAppliance(Teams.class).getTeamFromPlayer(event.getPlayer().getUniqueId()); + Objects.requireNonNull(team, "Team not found for player " + event.getPlayer().getUniqueId()); + + if(Main.instance().getAppliance(PlayTimer.class).isEnabled()) { + Main.logger().info(String.format("Team %s got a Strike, because they %s left early!", team.name, event.getPlayer().getName())); + + VaroReportRepository.StrikeCreationInfo report = new VaroReportRepository.StrikeCreationInfo( + null, + event.getPlayer().getUniqueId(), + "early left", + "player left the server too early", + null, + null, + 1 + ); + ReqResp response = Main.instance().getRepositoryLoader().getRepository(VaroReportRepository.class).createStrike(report); + Main.logger().info(String.format("Autostrike response for Team %s: %s", team.name, response)); + } else { + Main.logger().info("Allow ealry leave because PlayTimer is not active!"); + } + + this.getAppliance().enforceTeamLeave(event.getPlayer()); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/TeamListCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/TeamListCommand.java new file mode 100644 index 0000000..31dcf70 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/TeamListCommand.java @@ -0,0 +1,28 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.stream.Collectors; + +public class TeamListCommand extends ApplianceCommand { + public TeamListCommand() { + super("teamList"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + String teams = this.getAppliance().getAllTeams().stream() + .map(team -> { + String members = team.members.stream() + .map(member -> String.format("%s(%s)", member.player.getName(), member.isDead ? "☠" : "♥")) + .collect(Collectors.joining(", ")); + return String.format("%s: %s", team.name, members); + }) + .collect(Collectors.joining("\n")); + + sender.sendMessage(teams); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java new file mode 100644 index 0000000..5970859 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java @@ -0,0 +1,192 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName; +import eu.mhsl.craftattack.spawn.varo.api.repositories.TeamRepository; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.joinProtection.JoinProtection; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer.PlayTimer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.util.Ticks; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class Teams extends Appliance implements DisplayName.Prefixed { + private final List teams = new ArrayList<>(); + + public Teams() { + Bukkit.getScheduler().runTaskTimerAsynchronously( + Main.instance(), + this::refreshTeamList, + 0, + Ticks.TICKS_PER_SECOND * 60 + ); + } + + public void refreshTeamList() { + var updatedTeams = this.queryRepository(TeamRepository.class).getTeams().data(); + + for (var updatedTeam : updatedTeams) { + VaroTeam existingTeam = this.findTeamByName(updatedTeam.name()); + + if (existingTeam != null) { + existingTeam.members = updatedTeam.users().stream() + .map(user -> new VaroTeam.Member(user.uuid(), user.dead())) + .toList(); + existingTeam.color = updatedTeam.color(); + existingTeam.name = updatedTeam.name(); + } else { + VaroTeam newTeam = new VaroTeam( + updatedTeam.users().stream() + .map(user -> new VaroTeam.Member(user.uuid(), user.dead())) + .toList(), + updatedTeam.name(), + updatedTeam.color() + ); + this.teams.add(newTeam); + Main.logger().info("Added missing team to Teams registry: " + newTeam.name); + } + } + } + + public @Nullable VaroTeam findTeamByName(String name) { + for (VaroTeam team : this.teams) { + if (team.name.equals(name)) return team; + } + return null; + } + + public boolean canLogin(UUID playerId) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerId); + if(offlinePlayer.isOp()) { + Main.logger().info(String.format("Allowing player %s to login, because he ist OP!", playerId)); + return true; + } + + Optional team = this.teams.stream() + .filter(varoTeam -> varoTeam.hasMember(playerId) && !Objects.requireNonNull(varoTeam.getMemberById(playerId)).isDead) + .findAny(); + + team.ifPresentOrElse( + found -> Main.logger().info(String.format("Player %s is in Team %s!", playerId, found.name)), + () -> Main.logger().info(String.format("No valid Team found for %s (or he is in a Team but dead)!", playerId)) + ); + return team.isPresent(); + } + + public @Nullable VaroTeam getTeamFromPlayer(UUID playerId) { + return this.teams.stream() + .filter(varoTeam -> varoTeam.hasMember(playerId)) + .findFirst() + .orElse(null); + } + + public List getAllTeams() { + return this.teams; + } + + public void enforceTeamJoin(Player joinedPlayer) { + if(joinedPlayer.isOp()) return; + + DisconnectInfo teamNotCompleteInfo = new DisconnectInfo( + "Teampartner nicht beigetreten", + "Deine Verbindung wurde getrennt, da dein Teampartner keine Verbindung zum Server hergestellt hat!", + "Bitte sorge dafür, dass alle anderen Teammitglieder eine einwandfreie Internetverbindung haben und melde dich im Zweifel bei einem Admin!", + joinedPlayer.getUniqueId() + ); + + DisconnectInfo teamNoPlaytime = new DisconnectInfo( + "Keine Spielzeit verfügbar", + "Deine Verbindung wurde getrennt, da dein Team keine verbleibende Spielzeit auf dem Server hat!", + "Falls dies ein Fehler ist, melde dich bitte bei einem Admin!", + joinedPlayer.getUniqueId() + ); + + VaroTeam team = this.getTeamFromPlayer(joinedPlayer.getUniqueId()); + if(team == null) throw new IllegalStateException("Player must be in a Team"); + + PlayTimer playTimer = Main.instance().getAppliance(PlayTimer.class); + if(playTimer.isEnabled()) { + boolean isAllowed = playTimer.tryConsumeTicket(team); + if(!isAllowed) { + Main.logger().warning(String.format("Team %s joined, but got denied from Ticketing. Team will be kicked!", team.name)); + team.kickTeam(teamNoPlaytime); + return; + } + } else { + Main.logger().info(String.format("Allowing team %s to join, because PlayTimer is not active. Not subtracting from PlayTimer!", team.name)); + } + + int leftTickets = playTimer.getTickets(team); + Main.logger().info(String.format("Player %s joined. There are %d tickets left!", joinedPlayer.getName(), leftTickets)); + String playtimeOverview = String.format( + "Dein Team hat noch %d Beitritte, also %dx%d=%d Minuten übrig.", + leftTickets, + leftTickets, + PlayTimer.PLAYTIME_MINUTES, + leftTickets * PlayTimer.PLAYTIME_MINUTES + ); + joinedPlayer.sendMessage(Component.text( + leftTickets == 0 + ? String.format("Dein Team hat ab jetzt %d Minuten Spielzeit!", PlayTimer.PLAYTIME_MINUTES) + : playtimeOverview, + NamedTextColor.GREEN + )); + + Bukkit.getScheduler().scheduleSyncDelayedTask( + Main.instance(), + () -> team.members.stream() + .filter(member -> !member.isDead) + .filter(member -> { + Player p = Bukkit.getPlayer(member.player.getUniqueId()); + return p == null || !p.isOnline(); + }) + .findAny() + .ifPresentOrElse( + member -> team.kickTeam(teamNotCompleteInfo), + team::startCountDown + ), + Ticks.TICKS_PER_SECOND * (JoinProtection.resistanceDuration / 2) + ); + } + + public void enforceTeamLeave(Player leftPlayer) { + DisconnectInfo disconnectInfo = new DisconnectInfo( + "Dein Teampartner hat den Server vorzeitig verlassen", + "Dein Team erhält daher einen Strike!", + "Bitte bleibt stets die vollen 30 Minuten auf dem Server!", + leftPlayer.getUniqueId() + ); + VaroTeam team = this.getTeamFromPlayer(leftPlayer.getUniqueId()); + if(team != null) team.kickTeam(disconnectInfo); + } + + @Override + public @Nullable Component getNamePrefix(Player player) { + VaroTeam team = this.getTeamFromPlayer(player.getUniqueId()); + return Component.text( + String.format("[%s]", team != null ? team.name : "?"), + TextColor.fromCSSHexString(team != null ? team.color : "#ffffff") + ); + } + + @Override + protected @NotNull List listeners() { + return List.of(new ConnectivityChangeListener()); + } + + @Override + protected @NotNull List> commands() { + return List.of(new TeamListCommand()); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java new file mode 100644 index 0000000..687e461 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java @@ -0,0 +1,141 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.util.text.Countdown; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.TeamTasks; +import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.tasks.CountdownTeamTask; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.fightDetector.FightDetector; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer.PlayTimer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.util.Ticks; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +public class VaroTeam { + public static class Member { + public final OfflinePlayer player; + public boolean isDead; + + public Member(UUID playerId, boolean isDead) { + this.player = Bukkit.getOfflinePlayer(playerId); + this.isDead = isDead; + } + } + + public String name; + public String color; + public List members; + + public VaroTeam(List members, String name, String color) { + this.members = new ArrayList<>(members); + this.name = name; + this.color = color; + } + + public boolean isTeamDead() { + return this.members.stream().allMatch(member -> member.isDead); + } + + public boolean hasMember(UUID uuid) { + return this.members.stream() + .anyMatch(member -> member.player.getUniqueId().equals(uuid)); + } + + public @Nullable Member getMemberById(UUID uuid) { + return this.members.stream() + .filter(member -> member.player.getUniqueId().equals(uuid)) + .findFirst() + .orElse(null); + } + + public void kickTeam() { + this.kickTeam(new DisconnectInfo( + "Unbekannter Fehler", + "Verbindung wurde aufgrund eines unbekannten Grundes getrennt", + "Falls du denkst, dass dies ein Fehler ist, melde dich bei einem Admin!", + UUID.randomUUID() + )); + } + + public List getOnlinePlayers() { + return this.members.stream() + .map(member -> Bukkit.getPlayer(member.player.getUniqueId())) + .filter(Objects::nonNull) + .toList(); + } + + public void startCountDown() { + if(!Main.instance().getAppliance(PlayTimer.class).isEnabled()) { + Main.logger().warning(String.format("PlayTimer for %s not started, because it is deactivated!", this.name)); + return; + } + + Main.logger().info(String.format("Starting Time countdown for Team %s with %d", this.name, PlayTimer.PLAYTIME_MINUTES)); + CountdownTeamTask countdown = new CountdownTeamTask( + 60 * PlayTimer.PLAYTIME_MINUTES, + announcementData -> Component.text( + String.format("Es verbleiben noch %d %s Spielzeit!", announcementData.count(), announcementData.unit()), + NamedTextColor.RED + ), + component -> this.getOnlinePlayers().forEach(player -> player.sendMessage(component)), + this::timeOverKick + ); + countdown.setDefaultAnnouncements(count -> { + if(count > 300) return null; + if(count > 60 && count % 60 == 0) { + return new Countdown.AnnouncementData(count / 60, "Minuten"); + } + + if(count <= 30 && (count <= 10 || count % 10 == 0)) { + return new Countdown.AnnouncementData(count, "Sekunden"); + } + + return null; + }); + countdown.start(); + Main.instance().getAppliance(TeamTasks.class).addTask(this, TeamTasks.Type.TIME_KICK, countdown); + } + + public void kickTeam(DisconnectInfo disconnectInfo) { + this.getOnlinePlayers() + .forEach(player -> player.kick(disconnectInfo.getComponent())); + Main.instance().getAppliance(TeamTasks.class).cancelTeamTasks(this); + } + + public void timeOverKick() { + boolean isInFight = Main.instance().getAppliance(FightDetector.class).isInFight(this); + if(isInFight) { + Main.logger().info(String.format("Cannot kick Team %s because it is in a fight!", this.name)); + this.getOnlinePlayers() + .forEach(player -> player.sendMessage( + "Du befindest dich in einer Kampfhandlung oder in der Nähe eines gegnerischen Teams. Der Kick wird verzögert!" + )); + Bukkit.getScheduler().runTaskLater( + Main.instance(), + this::timeOverKick, + Ticks.TICKS_PER_SECOND * 15 + ); + return; + } + + Main.logger().info(String.format("Kicking Team %s because time is up!", this.name)); + + DisconnectInfo timeOverInfo = new DisconnectInfo( + "Die Zeit ist abgelaufen!", + "Deine Spielzeit ist vorüber. Falls dir noch weitere Zeit zusteht kannst du jetzt eine Pause machen und anschließend erneut beitreten.", + "Falls du Fragen hast, melde dich bitte bei einem Admin!", + UUID.nameUUIDFromBytes("".getBytes()) + ); + + this.kickTeam(timeOverInfo); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/varoDeath/PlayerDeathListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/varoDeath/PlayerDeathListener.java new file mode 100644 index 0000000..f08a6f7 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/varoDeath/PlayerDeathListener.java @@ -0,0 +1,24 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.varoDeath; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; + +import net.kyori.adventure.sound.Sound; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; + +class PlayerDeathListener extends ApplianceListener { + @EventHandler + public void onDeath(PlayerDeathEvent event) { + event.setKeepInventory(false); + this.getAppliance().registerPlayerDeath(event.getPlayer(), event.deathMessage()); + + Sound sound = Sound.sound(builder -> { + builder.pitch(1f); + builder.volume(1f); + builder.source(Sound.Source.MASTER); + builder.type(org.bukkit.Sound.ENTITY_LIGHTNING_BOLT_THUNDER); + }); + IteratorUtil.onlinePlayers(player -> player.playSound(sound)); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/varoDeath/VaroDeath.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/varoDeath/VaroDeath.java new file mode 100644 index 0000000..acfd6dd --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/varoDeath/VaroDeath.java @@ -0,0 +1,53 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.varoDeath; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.api.HttpStatus; +import eu.mhsl.craftattack.spawn.core.api.client.ReqResp; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; +import eu.mhsl.craftattack.spawn.varo.api.repositories.VaroPlayerRepository; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +public class VaroDeath extends Appliance { + public void registerPlayerDeath(Player player, @Nullable Component component) { + String deathMessage = PlainTextComponentSerializer.plainText().serialize(Objects.requireNonNull(component)); + DisconnectInfo disconnectInfo = new DisconnectInfo( + deathMessage, + "Du bist gestorben, und bist daher aus dem Projekt ausgeschieden!", + "Vielen Dank für deine Teilnahme", + player.getUniqueId() + ); + + var death = new VaroPlayerRepository.VaroDeath( + player.getUniqueId(), + Optional.ofNullable(player.getKiller()) + .map(Entity::getUniqueId) + .orElse(null), + deathMessage + ); + + ReqResp response = this.queryRepository(VaroPlayerRepository.class).registerDeath(death); + if(response.status() != HttpStatus.OK) Main.logger().warning(String.format("Failed to send death: %s", response)); + + disconnectInfo.applyKick(player); + Main.instance().getAppliance(Teams.class).refreshTeamList(); + } + + @Override + protected @NotNull List listeners() { + return List.of( + new PlayerDeathListener() + ); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/ProjectStart.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/ProjectStart.java new file mode 100644 index 0000000..ea0b0d0 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/ProjectStart.java @@ -0,0 +1,173 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart; + +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.config.Configuration; +import eu.mhsl.craftattack.spawn.core.util.IteratorUtil; +import eu.mhsl.craftattack.spawn.core.util.entity.PlayerUtils; +import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil; +import eu.mhsl.craftattack.spawn.core.util.text.Countdown; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.command.ProjectStartCancelCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.command.ProjectStartCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.command.ProjectStartResetCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.listener.NoAdvancementsListener; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.listener.PlayerInvincibleListener; +import net.kyori.adventure.sound.Sound; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static java.util.Map.entry; +import static org.bukkit.Sound.MUSIC_DISC_PRECIPICE; + +public class ProjectStart extends Appliance { + private final int startMusicAt = 293; + private final World startWorld = Bukkit.getWorld("world"); + + private final Countdown countdown = new Countdown( + this.localConfig().getInt("countdown"), + this::format, + this::announce, + this::startProject + ); + + private final Map, Boolean> gameRulesAfterStart = Map.ofEntries( + entry(GameRule.DO_DAYLIGHT_CYCLE, true), + entry(GameRule.DO_INSOMNIA, true), + entry(GameRule.DISABLE_RAIDS, false), + entry(GameRule.DO_FIRE_TICK, true), + entry(GameRule.DO_ENTITY_DROPS, true), + entry(GameRule.DO_PATROL_SPAWNING, true), + entry(GameRule.DO_TRADER_SPAWNING, true), + entry(GameRule.DO_WEATHER_CYCLE, true), + entry(GameRule.FALL_DAMAGE, true), + entry(GameRule.FIRE_DAMAGE, true) + ); + + public ProjectStart() { + super("countdown"); + + this.countdown.addCustomAnnouncement( + new Countdown.CustomAnnouncements( + counter -> counter == this.startMusicAt, + counter -> { + Objects.requireNonNull(this.startWorld); + this.startWorld.playSound(new Location(this.startWorld, 152, 77, 179), MUSIC_DISC_PRECIPICE, SoundCategory.RECORDS, 500f, 1f); + } + ) + ); + } + + private Component format(Countdown.AnnouncementData data) { + return Component.text() + .append(ComponentUtil.createRainbowText("Varo", 10)) + .append(Component.text(" startet in ", NamedTextColor.GOLD)) + .append(Component.text(data.count(), NamedTextColor.AQUA)) + .append(Component.text(" " + data.unit() + "!", NamedTextColor.GOLD)) + .build(); + } + + private void announce(Component message) { + IteratorUtil.onlinePlayers(player -> player.sendMessage(message)); + } + + private void resetAdvancements() { + Bukkit.getServer().advancementIterator().forEachRemaining( + advancement -> Bukkit.getOnlinePlayers().forEach( + player -> player.getAdvancementProgress(advancement).getAwardedCriteria().forEach( + criteria -> player.getAdvancementProgress(advancement).revokeCriteria(criteria) + ) + ) + ); + } + + public void startCountdown() { + if(!this.isEnabled()) return; + this.countdown.start(); + } + + public void cancelCountdown() { + this.countdown.cancel(); + this.restoreBeforeStart(); + } + + public void startProject() { + this.setEnabled(false); + + IteratorUtil.worlds(World::getWorldBorder, worldBorder -> worldBorder.setSize(5000)); + IteratorUtil.worlds(world -> IteratorUtil.setGameRules(this.gameRulesAfterStart, false)); + IteratorUtil.worlds(world -> world.setFullTime(0)); + + Bukkit.getOnlinePlayers().forEach(player -> { + player.setFoodLevel(20); + player.setHealth(20); + player.getInventory().clear(); + player.setGameMode(GameMode.SURVIVAL); + player.setExp(0); + player.setLevel(0); + + player.playSound(Sound.sound(org.bukkit.Sound.ITEM_GOAT_HORN_SOUND_5, Sound.Source.MASTER, 500f, 1f)); + + player.sendMessage(Component.text("Viel Spaß bei Varo!", NamedTextColor.GREEN)); + + player.setStatistic(Statistic.TIME_SINCE_REST, 0); + PlayerUtils.resetStatistics(player); + }); + + this.resetAdvancements(); + } + + public void restoreBeforeStart() { + this.setEnabled(true); + + IteratorUtil.onlinePlayers(Player::stopAllSounds); + + IteratorUtil.worlds(World::getWorldBorder, worldBorder -> { + worldBorder.setSize(this.localConfig().getLong("worldborder-before")); + worldBorder.setWarningDistance(0); + worldBorder.setDamageAmount(0); + }); + + IteratorUtil.worlds(world -> world, world -> IteratorUtil.setGameRules(this.gameRulesAfterStart, true)); + this.resetAdvancements(); + } + + public boolean isEnabled() { + return this.localConfig().getBoolean("enabled"); + } + + public void setEnabled(boolean enabled) { + this.localConfig().set("enabled", enabled); + Configuration.saveChanges(); + } + + public Countdown getCountdown() { + return this.countdown; + } + + @Override + @NotNull + protected List listeners() { + return List.of( + new PlayerInvincibleListener(), + new NoAdvancementsListener() + ); + } + + @Override + @NotNull + protected List> commands() { + return List.of( + new ProjectStartCommand(), + new ProjectStartCancelCommand(), + new ProjectStartResetCommand() + ); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/command/ProjectStartCancelCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/command/ProjectStartCancelCommand.java similarity index 79% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/command/ProjectStartCancelCommand.java rename to varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/command/ProjectStartCancelCommand.java index ed7058c..b58042f 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/command/ProjectStartCancelCommand.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/command/ProjectStartCancelCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.command; +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.ProjectStart; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.ProjectStart; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/command/ProjectStartCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/command/ProjectStartCommand.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/command/ProjectStartCommand.java rename to varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/command/ProjectStartCommand.java index 84916fc..921bf10 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/command/ProjectStartCommand.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/command/ProjectStartCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.command; +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.ProjectStart; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.ProjectStart; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/command/ProjectStartResetCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/command/ProjectStartResetCommand.java similarity index 67% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/command/ProjectStartResetCommand.java rename to varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/command/ProjectStartResetCommand.java index ac3aea1..2abfade 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/command/ProjectStartResetCommand.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/command/ProjectStartResetCommand.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.command; +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.command; -import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.ProjectStart; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.ProjectStart; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/listener/NoAdvancementsListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/listener/NoAdvancementsListener.java similarity index 75% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/listener/NoAdvancementsListener.java rename to varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/listener/NoAdvancementsListener.java index bd81c80..ecbb120 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/listener/NoAdvancementsListener.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/listener/NoAdvancementsListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.listener; +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.listener; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.ProjectStart; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.ProjectStart; import org.bukkit.advancement.Advancement; import org.bukkit.advancement.AdvancementProgress; import org.bukkit.event.EventHandler; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/listener/PlayerInvincibleListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/listener/PlayerInvincibleListener.java similarity index 78% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/listener/PlayerInvincibleListener.java rename to varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/listener/PlayerInvincibleListener.java index cf57ac1..829bcc1 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/projectStart/listener/PlayerInvincibleListener.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/projectStart/listener/PlayerInvincibleListener.java @@ -1,7 +1,7 @@ -package eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.listener; +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.listener; -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.tooling.projectStart.ProjectStart; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.varo.appliances.tooling.projectStart.ProjectStart; import io.papermc.paper.event.player.PrePlayerAttackEntityEvent; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/spawnpoint/SetSpawnpointCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/spawnpoint/SetSpawnpointCommand.java new file mode 100644 index 0000000..52c0b71 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/spawnpoint/SetSpawnpointCommand.java @@ -0,0 +1,27 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.spawnpoint; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +class SetSpawnpointCommand extends ApplianceCommand.PlayerChecked { + public SetSpawnpointCommand() { + super("setSpawnpoint"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args.length < 1) throw new Error("Specify playername for the Spawnpoint"); + var location = this.getPlayer().getLocation() + .toBlockLocation() + .add(0.5, 0.5, 0.5); + location.setYaw(0); + location.setPitch(0); + + this.getAppliance().setSpawnpoint(location, args[0]); + sender.sendMessage(Component.text("Spawnpoint updated!", NamedTextColor.GREEN)); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/spawnpoint/SpawnAtSpawnpointListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/spawnpoint/SpawnAtSpawnpointListener.java new file mode 100644 index 0000000..3f8475f --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/spawnpoint/SpawnAtSpawnpointListener.java @@ -0,0 +1,20 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.spawnpoint; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +class SpawnAtSpawnpointListener extends ApplianceListener { + @EventHandler + public void onJoin(PlayerJoinEvent event) { + this.getAppliance().handlePlayerLogin(event.getPlayer()); + } + + @EventHandler + public void onRespawn(PlayerRespawnEvent event) { + if(event.isBedSpawn()) return; + if(event.isAnchorSpawn()) return; + event.setRespawnLocation(this.getAppliance().getSpawnPoint(event.getPlayer())); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/spawnpoint/Spawnpoint.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/spawnpoint/Spawnpoint.java new file mode 100644 index 0000000..1db8b7d --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/spawnpoint/Spawnpoint.java @@ -0,0 +1,105 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.spawnpoint; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; + +public class Spawnpoint extends Appliance { + private static final String namespace = Spawnpoint.class.getSimpleName().toLowerCase(Locale.ROOT); + public static NamespacedKey alreadySpawned = new NamespacedKey(namespace, "alreadySpawned".toLowerCase()); + + private final Path saveFile = Paths.get(Main.instance().getDataFolder().getAbsolutePath() + "/spawnpoints.json"); + + private final Map spawnPoints = new HashMap<>(); + + public Spawnpoint() { + super("spawnpoint"); + this.load(); + } + + private record LocationDto(String world, double x, double y, double z, float yaw, float pitch) { + static LocationDto from(Location loc) { + return new LocationDto(loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + } + + Location toLocation() { + return new Location(Bukkit.getWorld(this.world), this.x, this.y, this.z, this.yaw, this.pitch); + } + } + + private void load() { + if (!Files.exists(this.saveFile)) return; + try (Reader reader = Files.newBufferedReader(this.saveFile)) { + Type type = new TypeToken>() {}.getType(); + Map raw = new Gson().fromJson(reader, type); + for (var entry : raw.entrySet()) { + this.spawnPoints.put(UUID.fromString(entry.getKey()), entry.getValue().toLocation()); + } + } catch (IOException e) { + Main.logger().warning("Failed to load spawnpoints: " + e.getMessage()); + } + } + + private void save() { + try { + Files.createDirectories(this.saveFile.getParent()); + Map raw = new HashMap<>(); + for (var entry : this.spawnPoints.entrySet()) { + raw.put(entry.getKey().toString(), LocationDto.from(entry.getValue())); + } + try (Writer writer = Files.newBufferedWriter(this.saveFile)) { + new Gson().toJson(raw, writer); + } + } catch (IOException e) { + Main.logger().warning("Failed to save spawnpoints: " + e.getMessage()); + } + } + + public void setSpawnpoint(Location location, String playerName) { + UUID uuid = Bukkit.getOfflinePlayer(playerName).getUniqueId(); + this.spawnPoints.put(uuid, location); + this.save(); + } + + public void handlePlayerLogin(Player player) { + PersistentDataContainer dataContainer = player.getPersistentDataContainer(); + if(dataContainer.has(alreadySpawned)) return; + player.teleportAsync(this.spawnPoints.get(player.getUniqueId())); + player.setGameMode(GameMode.SURVIVAL); + dataContainer.set(alreadySpawned, PersistentDataType.BOOLEAN, true); + } + + public Location getSpawnPoint(Player player) { + return this.spawnPoints.get(player.getUniqueId()); + } + + @Override + protected @NotNull List> commands() { + return List.of(new SetSpawnpointCommand()); + } + + @Override + protected @NotNull List listeners() { + return List.of(new SpawnAtSpawnpointListener()); + } +}