diff --git a/authenticator/build.gradle.kts b/authenticator/build.gradle.kts index 42fad8e3..e284cb17 100644 --- a/authenticator/build.gradle.kts +++ b/authenticator/build.gradle.kts @@ -12,7 +12,7 @@ repositories { } dependencies { -// compileOnly("net.md-5:bungeecord-api:1.20-R0.1-SNAPSHOT") + compileOnly("net.md-5:bungeecord-api:1.19-R0.1-SNAPSHOT") compileOnly("org.projectlombok:lombok:1.18.30") annotationProcessor("org.projectlombok:lombok:1.18.30") implementation("org.mindrot:jbcrypt:0.4") diff --git a/authenticator/src/main/java/com/eul4/authenticator/util/MessageUtil.java b/authenticator/src/main/java/com/eul4/authenticator/util/MessageUtil.java index e24e21fc..ee6b7b54 100644 --- a/authenticator/src/main/java/com/eul4/authenticator/util/MessageUtil.java +++ b/authenticator/src/main/java/com/eul4/authenticator/util/MessageUtil.java @@ -11,7 +11,7 @@ public class MessageUtil { private static final String UNEXPECTED_ERROR = """ Ocorreu um erro inesperado! - Reporte isto para algum ADM no discord!"""; + Reporte isto para algum admin no discord!"""; public static void sendUnexpectedErrorMessage(CommandSender sender) { diff --git a/build.gradle.kts b/build.gradle.kts index 2afaeb08..58d4e0a7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,336 +21,16 @@ tasks.withType { options.encoding = "UTF-8" } -val bashPath = project.property("bash.path") as String -val user = project.property("remote.user") as String -val hostname = project.property("remote.hostname") as String -val resetTown: Boolean = project.findProperty("resetTowns")?.toString()?.toBoolean() ?: false -val containerName = project.findProperty("containerName")?.toString() -val pluginDirectory = project.findProperty("pluginDir")?.toString() -val buildFileParent = fixPath(buildFile.parent) -val rootDirPath = fixPath(rootDir.absolutePath) +tasks.register("deployPlugin") { + group = "deployment" + description = "Executa o script deployPlugin.sh" - -task("resetTownsLocal") -{ - doLast { - val process = ProcessBuilder(bashPath, "-c", "${rootDirPath}/reset-towns-local.sh").start() - val exitCode = process.waitFor() - val errorMessage = process.errorStream.bufferedReader().use { it.readText() - } - - if(exitCode != 0) - { - throw GradleException("Failed to reset towns!\n" + - "$errorMessage\n" + - "(exit code: ${process.exitValue()})") - } - } -} - -task("resetTownsRemote") -{ - doLast { - val process = ProcessBuilder(bashPath, "-c", "${rootDirPath}/reset-towns-remote.sh $user $hostname").start() - val exitCode = process.waitFor() - val errorMessage = process.errorStream.bufferedReader().use { it.readText() } - - if(exitCode != 0) - { - throw GradleException("Failed to reset towns!\n" + - "$errorMessage\n" + - "(exit code: ${process.exitValue()})") - } - } -} - -task("stopLocal") -{ - doLast { - val process = ProcessBuilder(bashPath, "-c", "${buildFileParent}/stop-local.sh").start() - val exitCode = process.waitFor() - val errorMessage = process.errorStream.bufferedReader().use { it.readText() } - - if(exitCode == 1) - { - println("WARN: $errorMessage") - } - else if(exitCode != 0) - { - throw GradleException("Failed to stop server!\n" + - "$errorMessage\n" + - "(exit code: ${process.exitValue()})") - } - else - { - while(!isLocalContainerStopped()) - { - println("Sleeping 1s... Waiting container to stop.") - Thread.sleep(1000L) - } - - println("Container stopped!") - } - } -} - -task("startLocal") -{ - doLast { - val process = ProcessBuilder(bashPath, "-c", "docker compose up -d").start() - - if(process.waitFor() != 0) - { - val errorMessage = process.errorStream.bufferedReader().use { it.readText() } - throw GradleException("Failed to start server!\n" + - "$errorMessage\n" + - "(exit code: ${process.exitValue()})") - } - } -} - -task("stopRemote") -{ - doLast { - val process = ProcessBuilder(bashPath, "-c", "${buildFileParent}/stop-remote.sh $user $hostname $containerName").start() - val exitCode = process.waitFor() - val errorMessage = process.errorStream.bufferedReader().use { it.readText() } - - if(exitCode == 1) - { - println("WARN: $errorMessage") - } - else if(exitCode != 0) - { - throw GradleException("Failed to stop server!\n" + - "$errorMessage\n" + - "(exit code: ${process.exitValue()})") - } - else - { - while(!isRemoteContainerStopped()) - { - println("Sleeping 1s... Waiting container to stop.") - Thread.sleep(1000L) - } - - println("Container stopped!") - } - } -} - -task("startRemote") -{ - doLast { - val process = ProcessBuilder(bashPath, "-c", "${buildFileParent}/start-remote.sh $user $hostname $containerName").start() - - if(process.waitFor() != 0) - { - val errorMessage = process.errorStream.bufferedReader().use { it.readText() } - throw GradleException("Failed to start server!\n" + - "$errorMessage\n" + - "(exit code: ${process.exitValue()})") - } - } -} - -configure(subprojects.filter { it.name == "plugin" || it.name == "plugin-validator" || it.name == "authenticator" || it.name == "plugin2" }) { - this.afterEvaluate { - fun getFinalJarAbsolutePath(): String = fixPath(tasks.shadowJar.get().archiveFile.get().asFile.absolutePath) - - task("cpLocal") - { - doLast { - val buildPath = getFinalJarAbsolutePath() - val cpProcess = ProcessBuilder(bashPath, "-c", "${rootDirPath}/cp.sh $buildPath ${rootDir.absolutePath}").start() - - if(cpProcess.waitFor() != 0) - { - val errorMessage = cpProcess.errorStream.bufferedReader().use { it.readText() } - throw GradleException("Failed to cp ${this@configure.name}!\n" + - "$errorMessage\n" + - "(exit code: ${cpProcess.exitValue()})") - } - } - - } - - task("scpRemote") - { - doLast { - val scpProcess = ProcessBuilder(bashPath, "-c", "${rootDirPath}/scp.sh ${getFinalJarAbsolutePath()} $user $hostname $pluginDirectory").start() - - println("${rootDirPath}/scp.sh ${getFinalJarAbsolutePath()} $user $hostname $pluginDirectory") - - if (scpProcess.waitFor() != 0) - { - val errorMessage = scpProcess.errorStream.bufferedReader().use { it.readText() } - throw GradleException("Failed to scp ${this@configure.name}!\n" + - "$errorMessage\n" + - "(exit code: ${scpProcess.exitValue()})") - } - } - } - - task("deployLocal") - { - val stopLocalTask = rootProject.tasks.named("stopLocal") - val cpLocalTask = tasks.named("cpLocal") - val startLocalTask = rootProject.tasks.named("startLocal") - val resetTownsLocalTask = rootProject.tasks.named("resetTownsLocal") - - dependsOn(tasks.clean, tasks.build, stopLocalTask, cpLocalTask, startLocalTask) - - if(resetTown) - { - dependsOn(resetTownsLocalTask) - } - - tasks.build { - mustRunAfter(tasks.clean) - } - - stopLocalTask { - mustRunAfter(tasks.build) - } - - if(resetTown) - { - resetTownsLocalTask { - mustRunAfter(stopLocalTask) - } - - cpLocalTask { - mustRunAfter(resetTownsLocalTask) - } - } - else - { - cpLocalTask { - mustRunAfter(stopLocalTask) - } - } - - startLocalTask { - mustRunAfter(cpLocalTask) - } - } - - task("deployRemote") - { - val stopRemoteTask = rootProject.tasks.named("stopRemote") - val scpRemoteTask = tasks.named("scpRemote") - val startRemoteTask = rootProject.tasks.named("startRemote") - val resetTownsRemoteTask = rootProject.tasks.named("resetTownsRemote") - - dependsOn(tasks.clean, tasks.build, stopRemoteTask, scpRemoteTask, startRemoteTask) - - if(resetTown) - { - dependsOn(resetTownsRemoteTask) - } - - tasks.build.configure { - mustRunAfter(tasks.clean) - } - - stopRemoteTask.configure { - mustRunAfter(tasks.build) - } - - scpRemoteTask.configure { - mustRunAfter(stopRemoteTask) - } - - if(resetTown) - { - resetTownsRemoteTask { - mustRunAfter(stopRemoteTask) - } - - scpRemoteTask { - mustRunAfter(resetTownsRemoteTask) - } - } - else - { - scpRemoteTask { - mustRunAfter(stopRemoteTask) - } - } - - startRemoteTask.configure { - mustRunAfter(scpRemoteTask) - } - } - } -} - -fun isRemoteContainerStopped(): Boolean -{ - val bashPath = project.property("bash.path") as String - val process = ProcessBuilder(bashPath, "-c", "${rootDirPath}/check-remote-container.sh $user $hostname $containerName").start() - - return process.waitFor() != 0 + commandLine("C:/Program Files/Git/bin/bash.exe", "./deployPlugin.sh") } -fun isLocalContainerStopped(): Boolean -{ - val bashPath = project.property("bash.path") as String - val process = ProcessBuilder(bashPath, "-c", "${rootDirPath}/check-container.sh").start() +tasks.register("deployAuth") { + group = "deployment" + description = "Executa o script deployAuth.sh" - return process.waitFor() != 0 + commandLine("C:/Program Files/Git/bin/bash.exe", "./deployAuth.sh") } - -task("deployAllLocal") -{ - val plugin = project("plugin") - val pluginValidator = project("plugin-validator") - - val stopLocalTask = tasks.named("stopLocal") - val startLocalTask = tasks.named("startLocal") - - dependsOn(tasks.clean, tasks.build, stopLocalTask, startLocalTask) - - tasks.build.configure { - mustRunAfter(tasks.clean) - } - - stopLocalTask.configure { - mustRunAfter(tasks.build) - } - - plugin.afterEvaluate { - val cpPluginTask = plugin.tasks.named("cpLocal") - this@task.dependsOn(cpPluginTask) - - pluginValidator.afterEvaluate { - val cpPluginValidatorTask = pluginValidator.tasks.named("cpLocal") - this@task.dependsOn(cpPluginValidatorTask) - - cpPluginTask.configure { - mustRunAfter(cpPluginValidatorTask) - } - - startLocalTask.configure { - mustRunAfter(cpPluginTask) - } - } - } -} - -tasks.build { - dependsOn(subprojects.map { it.tasks.build }) -} - -fun fixPath(path: String): String -{ - if(path.startsWith("C:")) - { - return path.replace("\\","/").replace("C:","/c") - } - else - { - return path; - } -} \ No newline at end of file diff --git a/check-container.sh b/check-container.sh deleted file mode 100755 index 5f3ee5bd..00000000 --- a/check-container.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -CONTAINER_NAME="cidade-virtual" - -STATUS=$(docker inspect -f '{{.State.Running}}' $CONTAINER_NAME 2>/dev/null) - -if [ $? -eq 0 ] && [ "$STATUS" == "true" ]; then - echo "O container $CONTAINER_NAME está em execução." - exit 0 -else - echo "O container $CONTAINER_NAME não está em execução." - exit 1 -fi \ No newline at end of file diff --git a/check-remote-container.sh b/check-remote-container.sh deleted file mode 100755 index 2db4edf6..00000000 --- a/check-remote-container.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -ssh -t "$1"@"$2" /bin/bash -ic "check-container\ $3" diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 24232c12..fbe6248e 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -17,7 +17,6 @@ repositories { dependencies { paperweight.devBundle("com.eul4", "1.21.1-R0.1-SNAPSHOT") - compileOnlyApi("io.papermc.paper:paper-bundler:1.21.1-R0.1-SNAPSHOT-mojmap") compileOnlyApi("com.comphenix.protocol:ProtocolLib:5.1.0") compileOnly("org.projectlombok:lombok:1.18.30") annotationProcessor("org.projectlombok:lombok:1.18.30") diff --git a/common/src/main/java/com/eul4/common/externalizer/filer/Filer.java b/common/src/main/java/com/eul4/common/externalizer/filer/Filer.java index 3988a264..e96ea337 100644 --- a/common/src/main/java/com/eul4/common/externalizer/filer/Filer.java +++ b/common/src/main/java/com/eul4/common/externalizer/filer/Filer.java @@ -5,7 +5,9 @@ import com.eul4.common.type.player.ObjectType; import lombok.RequiredArgsConstructor; -import java.io.*; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; import java.util.HashMap; import java.util.Map; diff --git a/common/src/main/java/com/eul4/common/externalizer/reader/BigDecimalReader.java b/common/src/main/java/com/eul4/common/externalizer/reader/BigDecimalReader.java new file mode 100644 index 00000000..7b9af555 --- /dev/null +++ b/common/src/main/java/com/eul4/common/externalizer/reader/BigDecimalReader.java @@ -0,0 +1,54 @@ +package com.eul4.common.externalizer.reader; + +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.type.player.CommonObjectType; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.wrapper.Readable; +import com.eul4.common.wrapper.Reader; +import lombok.Getter; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; + +public class BigDecimalReader extends ObjectReader +{ + @Getter + private final Reader reader; + private final Readable readable; + + public BigDecimalReader(Readers readers) throws InvalidVersionException + { + super(readers, BigDecimal.class); + + final ObjectType objectType = CommonObjectType.BIG_DECIMAL; + final byte version = readers.getVersions().get(objectType); + + switch(version) + { + case 0: + this.reader = Reader.identity(); + this.readable = this::readableVersion0; + break; + default: + throw new InvalidVersionException("Invalid " + objectType + " version: " + version); + } + } + + private BigDecimal readableVersion0() throws IOException + { + int lenght = in.readInt(); + byte[] unscaledValueBytes = new byte[lenght]; + in.readFully(unscaledValueBytes); + int scale = in.readInt(); + + BigInteger unscaledValue = new BigInteger(unscaledValueBytes); + return new BigDecimal(unscaledValue, scale); + } + + public BigDecimal readReference() throws IOException, ClassNotFoundException + { + return super.readReference(readable); + } +} diff --git a/common/src/main/java/com/eul4/common/externalizer/writer/BigDecimalWriter.java b/common/src/main/java/com/eul4/common/externalizer/writer/BigDecimalWriter.java new file mode 100644 index 00000000..39eaa029 --- /dev/null +++ b/common/src/main/java/com/eul4/common/externalizer/writer/BigDecimalWriter.java @@ -0,0 +1,24 @@ +package com.eul4.common.externalizer.writer; + +import com.eul4.common.type.player.Writers; + +import java.io.IOException; +import java.math.BigDecimal; + +public class BigDecimalWriter extends ObjectWriter +{ + public BigDecimalWriter(Writers writers) + { + super(writers, BigDecimal.class); + } + + @Override + protected void writeObject(BigDecimal bigDecimal) throws IOException + { + byte[] unscaledValueBytes = bigDecimal.unscaledValue().toByteArray(); + + out.writeInt(unscaledValueBytes.length); + out.write(unscaledValueBytes); + out.writeInt(bigDecimal.scale()); + } +} diff --git a/common/src/main/java/com/eul4/common/hologram/Hologram.java b/common/src/main/java/com/eul4/common/hologram/Hologram.java index 8a03b623..f4e31d6b 100644 --- a/common/src/main/java/com/eul4/common/hologram/Hologram.java +++ b/common/src/main/java/com/eul4/common/hologram/Hologram.java @@ -2,7 +2,9 @@ import com.eul4.common.Common; import com.eul4.common.i18n.Message; +import com.eul4.common.i18n.MessageArgs; import com.eul4.common.i18n.ResourceBundleHandler; +import com.eul4.common.i18n.TranslatableMessage; import com.eul4.common.util.ThreadUtil; import lombok.Getter; import lombok.Setter; @@ -154,34 +156,36 @@ public class TranslatedHologramLine @Setter private ArmorStand armorStand; - private Message message; - private Object[] args; + private MessageArgs messageArgs; public TranslatedHologramLine(ArmorStand armorStand) { this.armorStand = Objects.requireNonNull(armorStand); } - public void setMessageAndArgs(Message message, Object... args) + public void setMessageAndArgs(TranslatableMessage translatableMessage, Object... args) { - this.message = message; - this.args = args; + setMessageAndArgs(translatableMessage.withArgs(args)); + } + + public void setMessageAndArgs(MessageArgs messageArgs) + { + this.messageArgs = messageArgs; - this.armorStand.customName(message.translate(ResourceBundleHandler.DEFAULT_LOCALE, args)); + this.armorStand.customName(messageArgs.translate(ResourceBundleHandler.DEFAULT_LOCALE)); } public void setCustomName(Component component) { - this.message = null; - this.args = null; + this.messageArgs = null; this.armorStand.customName(component); } public String translate(Locale locale) { - return LegacyComponentSerializer.legacySection().serialize(message == null + return LegacyComponentSerializer.legacySection().serialize(messageArgs == null ? this.armorStand.customName() - : message.translate(locale, args)); + : messageArgs.translate(locale)); } public Common getPlugin() diff --git a/common/src/main/java/com/eul4/common/i18n/CommonMessage.java b/common/src/main/java/com/eul4/common/i18n/CommonMessage.java index 7648f29e..27737d56 100644 --- a/common/src/main/java/com/eul4/common/i18n/CommonMessage.java +++ b/common/src/main/java/com/eul4/common/i18n/CommonMessage.java @@ -90,6 +90,9 @@ public enum CommonMessage implements Message CONFIRM("confirm"), CANCEL("cancel"), + + EXAMPLE("example"), + CAN_NOT_PERFORM("can-not-perform", empty().color(RED)), SCOREBOARD_ENABLED("command.scoreboard.enabled", empty().color(GREEN)), SCOREBOARD_DISABLED("command.scoreboard.disabled", empty().color(GREEN)), diff --git a/common/src/main/java/com/eul4/common/service/MessageableService.java b/common/src/main/java/com/eul4/common/service/MessageableService.java index b4beb7cf..72f15caa 100644 --- a/common/src/main/java/com/eul4/common/service/MessageableService.java +++ b/common/src/main/java/com/eul4/common/service/MessageableService.java @@ -1,7 +1,10 @@ package com.eul4.common.service; import com.eul4.common.Common; +import com.eul4.common.i18n.MessageArgs; import com.eul4.common.i18n.Messageable; +import com.eul4.common.i18n.TranslatableMessage; +import com.eul4.common.model.player.CommonPlayer; import lombok.RequiredArgsConstructor; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; @@ -10,6 +13,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + @RequiredArgsConstructor public class MessageableService { @@ -38,4 +45,38 @@ else if(commandSender instanceof Player player) return plugin.getDeafenMessageable(); } + + public List getMessageables() + { + List messageables = new ArrayList<>(); + + messageables.add(plugin.getConsole()); + messageables.addAll(plugin.getPlayerManager().getAll()); + + return messageables; + } + + public void broadcastMessage(MessageArgs messageArgs, Consumer bonusAction) + { + broadcastMessage(messageArgs, null, bonusAction); + } + + public void broadcastMessage + ( + MessageArgs messageArgs, + @Nullable String permission, + @Nullable Consumer bonusAction + ) + { + plugin.getConsole().sendMessage(messageArgs); + + for(CommonPlayer commonPlayer : plugin.getPlayerManager().getAll()) + { + if(permission == null || commonPlayer.hasPermission(permission)) + { + commonPlayer.sendMessage(messageArgs); + bonusAction.accept(commonPlayer.getPlayer()); + } + } + } } diff --git a/common/src/main/java/com/eul4/common/type/player/CommonExternalizerType.java b/common/src/main/java/com/eul4/common/type/player/CommonExternalizerType.java index 40f90c30..83a79ba3 100644 --- a/common/src/main/java/com/eul4/common/type/player/CommonExternalizerType.java +++ b/common/src/main/java/com/eul4/common/type/player/CommonExternalizerType.java @@ -11,6 +11,7 @@ @Getter public enum CommonExternalizerType implements ExternalizerType { + BIG_DECIMAL(BigDecimalReader::new, BigDecimalReader.class, BigDecimalWriter::new, BigDecimalWriter.class), BLOCK_VECTOR(BlockVectorReader::new, BlockVectorReader.class, BlockVectorWriter::new, BlockVectorWriter.class), BLOCK(BlockReader::new, BlockReader.class, BlockWriter::new, BlockWriter.class), CHUNK(ChunkReader::new, ChunkReader.class, ChunkWriter::new, ChunkWriter.class), diff --git a/common/src/main/java/com/eul4/common/type/player/CommonObjectType.java b/common/src/main/java/com/eul4/common/type/player/CommonObjectType.java index e78e4410..d63ebdaf 100644 --- a/common/src/main/java/com/eul4/common/type/player/CommonObjectType.java +++ b/common/src/main/java/com/eul4/common/type/player/CommonObjectType.java @@ -2,11 +2,14 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.ToString; @RequiredArgsConstructor +@ToString @Getter public enum CommonObjectType implements ObjectType { + BIG_DECIMAL((byte) 0, CommonExternalizerType.BIG_DECIMAL), BLOCK((byte) 0, CommonExternalizerType.BLOCK), BLOCK_VECTOR((byte) 0, CommonExternalizerType.BLOCK_VECTOR), CHUNK((byte) 0, CommonExternalizerType.CHUNK), diff --git a/common/src/main/java/com/eul4/common/type/player/ObjectType.java b/common/src/main/java/com/eul4/common/type/player/ObjectType.java index 3c6fa3c8..7f4878e2 100644 --- a/common/src/main/java/com/eul4/common/type/player/ObjectType.java +++ b/common/src/main/java/com/eul4/common/type/player/ObjectType.java @@ -4,4 +4,5 @@ public interface ObjectType { ExternalizerType getExternalizerType(); byte getVersion(); + String name(); } diff --git a/common/src/main/java/com/eul4/common/util/BigDecimalUtil.java b/common/src/main/java/com/eul4/common/util/BigDecimalUtil.java new file mode 100644 index 00000000..3d04b890 --- /dev/null +++ b/common/src/main/java/com/eul4/common/util/BigDecimalUtil.java @@ -0,0 +1,38 @@ +package com.eul4.common.util; + +import com.eul4.common.exception.NumberFormatException; + +import java.math.BigDecimal; +import java.math.MathContext; + +public class BigDecimalUtil +{ + public static BigDecimal ONE_CENT = new BigDecimal("0.01"); + + public static BigDecimal max(BigDecimal a, BigDecimal b) + { + return a.compareTo(b) > 0 ? a : b; + } + + public static BigDecimal min(BigDecimal a, BigDecimal b) + { + return a.compareTo(b) < 0 ? a : b; + } + + public static BigDecimal newBigDecimal(String s) + { + return newBigDecimal(s, MathContext.UNLIMITED); + } + + public static BigDecimal newBigDecimal(String s, MathContext mathContext) + { + try + { + return new BigDecimal(s, mathContext); + } + catch(java.lang.NumberFormatException e) + { + throw new NumberFormatException(e); + } + } +} diff --git a/common/src/main/java/com/eul4/common/util/CommonMessageUtil.java b/common/src/main/java/com/eul4/common/util/CommonMessageUtil.java index 0b3c6976..361eaea5 100644 --- a/common/src/main/java/com/eul4/common/util/CommonMessageUtil.java +++ b/common/src/main/java/com/eul4/common/util/CommonMessageUtil.java @@ -33,7 +33,7 @@ public static Component playerName(Object arg) public static Component displayName(Object arg) { - return arg instanceof OfflinePlayer offlinePlayer + return arg == null ? text(UNKNOWN) : arg instanceof OfflinePlayer offlinePlayer ? getOfflinePlayerDisplayName(offlinePlayer) : argToComponent(arg); } @@ -65,6 +65,13 @@ public static Component inParentheses(Object arg) .append(text(")")); } + public static Component argToComponent(Object arg, String prefix, String suffix) + { + return text(prefix) + .append(argToComponent(arg)) + .append(text(suffix)); + } + public static Optional getArgument(Object[] args, int index) { try @@ -87,6 +94,16 @@ public static Component argToComponent(Object arg, Locale locale) return argToComponent(arg); } + public static Component decimalToComponent(Object decimal, DecimalFormat decimalFormat) + { + return text(decimalFormat.format(decimal)); + } + + public static Component decimalToComponent(Object decimal, String pattern, Locale locale) + { + return decimalToComponent(decimal, new DecimalFormat(pattern, new DecimalFormatSymbols(locale))); + } + public static Component argToComponent(Object arg) { return arg instanceof Component component ? component : text(arg.toString()); diff --git a/common/src/main/java/com/eul4/common/util/CommonWordUtil.java b/common/src/main/java/com/eul4/common/util/CommonWordUtil.java index bbeba2d0..f2a8e787 100644 --- a/common/src/main/java/com/eul4/common/util/CommonWordUtil.java +++ b/common/src/main/java/com/eul4/common/util/CommonWordUtil.java @@ -6,6 +6,21 @@ public class CommonWordUtil { public static final String COLON = ":"; + public static String inParentheses(String word) + { + return "(" + word + ")"; + } + + public static String toUpperCaseAndConcatColon(String word) + { + return word.toUpperCase().concat(COLON); + } + + public static String concatColon(String word) + { + return word.concat(COLON); + } + public static String capitalizeAndConcatColon(String word) { return WordUtils.capitalize(word).concat(COLON); diff --git a/common/src/main/java/com/eul4/common/util/DecimalFormatUtil.java b/common/src/main/java/com/eul4/common/util/DecimalFormatUtil.java new file mode 100644 index 00000000..a5ebaae2 --- /dev/null +++ b/common/src/main/java/com/eul4/common/util/DecimalFormatUtil.java @@ -0,0 +1,35 @@ +package com.eul4.common.util; + +import com.eul4.common.exception.NumberFormatException; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.text.DecimalFormat; +import java.text.ParseException; + +public class DecimalFormatUtil +{ + public static Number parse(DecimalFormat decimalFormat, Number number) + { + return parse(decimalFormat, decimalFormat.format(number), number); + } + + public static Number parse(DecimalFormat decimalFormat, String source, Number defaultNumber) + { + return parse(decimalFormat, true, source, defaultNumber); + } + + public static Number parse(DecimalFormat decimalFormat, boolean isBigDecimal, String source, Number defaultNumber) + { + decimalFormat.setParseBigDecimal(isBigDecimal); + + try + { + return decimalFormat.parse(source); + } + catch(ParseException e) + { + return defaultNumber; + } + } +} diff --git a/common/src/main/java/com/eul4/common/util/ThreadUtil.java b/common/src/main/java/com/eul4/common/util/ThreadUtil.java index b5798a71..b905c3b7 100644 --- a/common/src/main/java/com/eul4/common/util/ThreadUtil.java +++ b/common/src/main/java/com/eul4/common/util/ThreadUtil.java @@ -64,4 +64,10 @@ public static void runSynchronously(Plugin plugin, Runnable runnable) plugin.getServer().getScheduler().runTask(plugin, runnable); } } + + @SneakyThrows + public static void sneakySleep(long millis) + { + Thread.sleep(millis); + } } diff --git a/common/src/main/resources/common_pt_BR.properties b/common/src/main/resources/common_pt_BR.properties index f53c1b71..948f22dc 100644 --- a/common/src/main/resources/common_pt_BR.properties +++ b/common/src/main/resources/common_pt_BR.properties @@ -19,6 +19,8 @@ seconds-char=s confirm=confirmar cancel=cancelar +example=exemplo + you-do-not-have-permission=Você não tem permissão. command.build.enabled=Modo construtor ativado. diff --git a/common/src/main/resources/common_rich_message_pt_BR.properties b/common/src/main/resources/common_rich_message_pt_BR.properties index 64a7fbaf..429e6aad 100644 --- a/common/src/main/resources/common_rich_message_pt_BR.properties +++ b/common/src/main/resources/common_rich_message_pt_BR.properties @@ -1,6 +1,6 @@ command.reply.status=\ - Você está conversando com o(a) .\n\ - Para respondê-lo(a) use: + Você está conversando com o(a) .
\ + To reply, use: page.group-group.title= Grupos page.group-user.title= Usuários diff --git a/cp.sh b/cp.sh deleted file mode 100755 index 298401c2..00000000 --- a/cp.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -cp "$1" "$2"/local/cidade-virtual/server/plugins \ No newline at end of file diff --git a/deployAuth.sh b/deployAuth.sh new file mode 100644 index 00000000..161a0f4a --- /dev/null +++ b/deployAuth.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +USERNAME=cruzapi +HOSTNAME=192.168.1.34 +CONTAINER_NAME=proxy + +AUTH_PATH="$SCRIPT_DIR/authenticator/build/libs/authenticator-1.0-SNAPSHOT-all.jar" + +TARGET_DIR="~/cidade-virtual/proxy/plugins" + +#Build plugin +./gradlew authenticator:clean authenticator:build || exit 1 + +#Stop remote container gracefully +ssh -t $USERNAME@$HOSTNAME /bin/bash -ic "stop\ $CONTAINER_NAME" + +#Wait remote container to stop +while ssh -t "$USERNAME"@"$HOSTNAME" /bin/bash -ic "check-container\ $CONTAINER_NAME"; do + echo "Waiting \"$CONTAINER_NAME\" container to stop..." + sleep 1 +done + +echo "\"$CONTAINER_NAME\" container stopped!" + +#Copy plugin to remote +scp "$AUTH_PATH" "$USERNAME@$HOSTNAME:$TARGET_DIR" + +#Start remote container +if ssh -t "$USERNAME@$HOSTNAME" /bin/bash -ic "docker\ start\ $CONTAINER_NAME"; then + echo "\"$CONTAINER_NAME\" container has been started!" +else + echo "Failed to start \"$CONTAINER_NAME\" container!" +fi diff --git a/deployPlugin.sh b/deployPlugin.sh new file mode 100644 index 00000000..14de6c7a --- /dev/null +++ b/deployPlugin.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +SCRIPT_DIR=$(dirname "$(realpath "$0")") +USERNAME=cruzapi +HOSTNAME=192.168.1.34 +CONTAINER_NAME=cidade-virtual + +PLUGIN_PATH="$SCRIPT_DIR/plugin/build/libs/plugin-1.0-SNAPSHOT-dev-all.jar" + +TARGET_DIR="~/cidade-virtual/server/plugins" + +#Build plugin +./gradlew plugin:clean plugin:build || exit 1 + +#Stop remote container gracefully +ssh -t $USERNAME@$HOSTNAME /bin/bash -ic "stop\ $CONTAINER_NAME" + +#Wait remote container to stop +while ssh -t "$USERNAME"@"$HOSTNAME" /bin/bash -ic "check-container\ $CONTAINER_NAME"; do + echo "Waiting \"$CONTAINER_NAME\" container to stop..." + sleep 1 +done + +echo "\"$CONTAINER_NAME\" container stopped!" + +#Copy plugin to remote +scp "$PLUGIN_PATH" "$USERNAME@$HOSTNAME:$TARGET_DIR" + +#Start remote container +if ssh -t "$USERNAME@$HOSTNAME" /bin/bash -ic "docker\ start\ $CONTAINER_NAME"; then + echo "\"$CONTAINER_NAME\" container has been started!" +else + echo "Failed to start \"$CONTAINER_NAME\" container!" +fi diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 01028d83..780a17ac 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sun Mar 10 14:05:03 BRT 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index a5df9121..a41d43e3 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -18,7 +18,6 @@ repositories { dependencies { implementation(project(":common")) -// paperweight.paperDevBundle("1.21.1-R0.1-SNAPSHOT") paperweight.devBundle("com.eul4", "1.21.1-R0.1-SNAPSHOT") implementation(platform("com.intellectualsites.bom:bom-newest:1.46")) implementation(project(mapOf("path" to ":plugin-validator"))) // Ref: https://github.com/IntellectualSites/bom @@ -32,10 +31,10 @@ tasks.shadowJar { mergeServiceFiles() archiveClassifier = null - - dependencies { - include(project(":common")) - } +// +// dependencies { +// include(project(":common")) +// } } tasks.build { diff --git a/plugin/config/town_hall_rule.yml b/plugin/config/town_hall_rule.yml index a5f5608c..4a73a648 100644 --- a/plugin/config/town_hall_rule.yml +++ b/plugin/config/town_hall_rule.yml @@ -17,6 +17,7 @@ CANNON: 1 like_capacity: 100 dislike_capacity: 100 + crown_capacity: '1000' 2: price: @@ -37,6 +38,7 @@ CANNON: 2 like_capacity: 200 dislike_capacity: 200 + crown_capacity: '2000' 3: price: @@ -57,6 +59,7 @@ CANNON: 3 like_capacity: 300 dislike_capacity: 300 + crown_capacity: '3000' 4: price: @@ -77,6 +80,7 @@ CANNON: 4 like_capacity: 400 dislike_capacity: 400 + crown_capacity: '4000' 5: price: @@ -97,6 +101,7 @@ CANNON: 5 like_capacity: 500 dislike_capacity: 500 + crown_capacity: '5000' 6: price: @@ -117,6 +122,7 @@ CANNON: 6 like_capacity: 600 dislike_capacity: 600 + crown_capacity: '6000' 7: price: @@ -137,6 +143,7 @@ CANNON: 7 like_capacity: 700 dislike_capacity: 700 + crown_capacity: '7000' 8: price: @@ -157,6 +164,7 @@ CANNON: 8 like_capacity: 800 dislike_capacity: 800 + crown_capacity: '8000' 9: price: @@ -177,6 +185,7 @@ CANNON: 9 like_capacity: 900 dislike_capacity: 900 + crown_capacity: '9000' 10: price: @@ -197,3 +206,4 @@ CANNON: 10 like_capacity: 1000 dislike_capacity: 1000 + crown_capacity: '10000' diff --git a/plugin/src/main/java/com/eul4/Main.java b/plugin/src/main/java/com/eul4/Main.java index 46979865..6df77b1d 100644 --- a/plugin/src/main/java/com/eul4/Main.java +++ b/plugin/src/main/java/com/eul4/Main.java @@ -9,9 +9,7 @@ import com.eul4.common.type.player.CommonWorldType; import com.eul4.common.util.FileUtil; import com.eul4.enums.Rarity; -import com.eul4.externalizer.filer.BlockDataFiler; -import com.eul4.externalizer.filer.PlayerDataFiler; -import com.eul4.externalizer.filer.TownsFiler; +import com.eul4.externalizer.filer.*; import com.eul4.i18n.PluginBundleBaseName; import com.eul4.interceptor.HeartParticleInterceptor; import com.eul4.interceptor.HideEnchantInterceptor; @@ -28,6 +26,7 @@ import com.eul4.listener.scoreboard.AnalyzerScoreboardListener; import com.eul4.listener.scoreboard.TownScoreboardListener; import com.eul4.listener.structure.ArmoryListener; +import com.eul4.listener.structure.TransactionResourceStructureListener; import com.eul4.listener.world.CommonLevelListener; import com.eul4.listener.world.RaidLevelListener; import com.eul4.listener.world.VanillaLevelListener; @@ -35,7 +34,7 @@ import com.eul4.model.town.structure.Structure; import com.eul4.rule.Rule; import com.eul4.rule.attribute.*; -import com.eul4.rule.serializer.*; +import com.eul4.rule.serializer.rule.*; import com.eul4.service.*; import com.eul4.task.AutoBroadcastTask; import com.eul4.task.RarityBossBarTask; @@ -47,7 +46,6 @@ import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import lombok.Getter; import lombok.SneakyThrows; -import net.kyori.adventure.key.Key; import net.kyori.adventure.translation.GlobalTranslator; import net.kyori.adventure.translation.TranslationRegistry; import org.bukkit.NamespacedKey; @@ -76,6 +74,7 @@ public class Main extends Common private DislikeGeneratorRuleSerializer dislikeGeneratorRuleSerializer; private LikeDepositRuleSerializer likeDepositRuleSerializer; private DislikeDepositRuleSerializer dislikeDepositRuleSerializer; + private CrownDepositRuleSerializer crownDepositRuleSerializer; private ArmoryRuleSerializer armoryRuleSerializer; private CannonRuleSerializer cannonRuleSerializer; private TurretRuleSerializer turretRuleSerializer; @@ -85,6 +84,7 @@ public class Main extends Common private Rule dislikeGeneratorRule; private Rule likeDepositRule; private Rule dislikeDepositRule; + private Rule crownDepositRule; private Rule armoryRule; private Rule cannonRule; private Rule turretRule; @@ -98,10 +98,15 @@ public class Main extends Common private OreMinedAlertListener oreMinedAlertListener; private BlockDataFiler blockDataFiler; + private CrownInfoFiler crownInfoFiler; private PlayerDataFiler playerDataFiler; + private RawMaterialMapFiler rawMaterialMapFiler; private TownsFiler townsFiler; private MacroidService macroidService; + private MarketDataManager marketDataManager; + private TransactionManager transactionManager; + private TycoonManager tycoonManager; private PluginManager pluginManager; @@ -147,6 +152,11 @@ private void enablePlugin() reloadRules(); townManager.loadTowns(); + rawMaterialMapFiler.load(); + crownInfoFiler.load(); + marketDataManager.registerDerivatives(); + + tycoonManager.updateTycoon(); pasteCorruptedTowns(); @@ -169,6 +179,7 @@ public void reloadRules() var dislikeGeneratorRule = dislikeGeneratorRuleSerializer.load(); var likeDepositRule = likeDepositRuleSerializer.load(); var dislikeDepositRule = dislikeDepositRuleSerializer.load(); + var crownDepositRule = crownDepositRuleSerializer.load(); var armoryRule = armoryRuleSerializer.load(); var cannonRule = cannonRuleSerializer.load(); var turretRule = turretRuleSerializer.load(); @@ -178,6 +189,7 @@ public void reloadRules() this.dislikeGeneratorRule = dislikeGeneratorRule; this.likeDepositRule = likeDepositRule; this.dislikeDepositRule = dislikeDepositRule; + this.crownDepositRule = crownDepositRule; this.armoryRule = armoryRule; this.cannonRule = cannonRule; this.turretRule = turretRule; @@ -187,7 +199,9 @@ public void reloadRules() private void registerFilers() { + crownInfoFiler = new CrownInfoFiler(this); playerDataFiler = new PlayerDataFiler(this); + rawMaterialMapFiler = new RawMaterialMapFiler(this); townsFiler = new TownsFiler(this); } @@ -202,6 +216,9 @@ private void registerServices() structureDamageCalculator = new StructureDamageCalculator(this); macroidService = new MacroidService(this); + marketDataManager = new MarketDataManager(this); + transactionManager = new TransactionManager(this); + tycoonManager = new TycoonManager(this); } private void registerRuleSerializers() @@ -211,6 +228,7 @@ private void registerRuleSerializers() dislikeGeneratorRuleSerializer = new DislikeGeneratorRuleSerializer(this); likeDepositRuleSerializer = new LikeDepositRuleSerializer(this); dislikeDepositRuleSerializer = new DislikeDepositRuleSerializer(this); + crownDepositRuleSerializer = new CrownDepositRuleSerializer(this); armoryRuleSerializer = new ArmoryRuleSerializer(this); cannonRuleSerializer = new CannonRuleSerializer(this); turretRuleSerializer = new TurretRuleSerializer(this); @@ -245,6 +263,7 @@ private void registerCommands() registerCommand(new AdminCommand(this), AdminCommand.NAME_AND_ALIASES); registerCommand(new BalanceCommand(this), BalanceCommand.NAME_AND_ALIASES); + registerCommand(new BaltopCommand(this), BaltopCommand.NAME_AND_ALIASES); registerCommand(new DebugCommand(this), DebugCommand.NAME_AND_ALIASES); registerCommand(buyStructureCommand = new BuyStructureCommand(this), BuyStructureCommand.NAME_AND_ALIASES); registerCommand(new DelHomeCommand(this), DelHomeCommand.NAME_AND_ALIASES); @@ -253,9 +272,13 @@ private void registerCommands() registerCommand(new MacroidCommand(this), MacroidCommand.NAME_AND_ALIASES); registerCommand(new MuteBroadcastCommand(this), MuteBroadcastCommand.NAME_AND_ALIASES); registerCommand(new NewbieCommand(this), NewbieCommand.NAME_AND_ALIASES); + registerCommand(new PayCommand(this), PayCommand.NAME_AND_ALIASES); + registerCommand(new PriceCommand(this), PriceCommand.NAME_AND_ALIASES); registerCommand(new RaidCommand(this), RaidCommand.NAME_AND_ALIASES); + registerCommand(new RawMaterialCommand(this), RawMaterialCommand.NAME_AND_ALIASES); registerCommand(attackCommand = new AttackCommand(this), AttackCommand.NAME_AND_ALIASES); registerCommand(new ReloadRuleCommand(this), ReloadRuleCommand.NAME_AND_ALIASES); + registerCommand(new SellCommand(this), SellCommand.NAME_AND_ALIASES); registerCommand(new SetHomeCommand(this), SetHomeCommand.NAME_AND_ALIASES); registerCommand(new SetRarityCommand(this), SetRarityCommand.NAME_AND_ALIASES); registerCommand(new SpawnCommand(this), SpawnCommand.NAME_AND_ALIASES); @@ -408,6 +431,7 @@ private void registerListeners() pluginManager.registerEvents(new TownAttackListener(this), this); pluginManager.registerEvents(new TownListener(this), this); pluginManager.registerEvents(new TownSaveListener(this), this); + pluginManager.registerEvents(new TycoonListener(this), this); pluginManager.registerEvents(new VillagerRarityListener(this), this); pluginManager.registerEvents(new ItemBuilderListener(this), this); pluginManager.registerEvents(itemDamageAttributeListener = new ItemDamageAttributeListener(this), this); @@ -417,6 +441,7 @@ private void registerListeners() pluginManager.registerEvents(new PlayerConsumeItemRarityListener(this), this); pluginManager.registerEvents(new PlayerLoaderListener(this), this); pluginManager.registerEvents(new PlayerManagerListener(this), this); + pluginManager.registerEvents(new PluginFilerListener(this), this); pluginManager.registerEvents(new SmithingRarityListener(this), this); pluginManager.registerEvents(new SpawnProtectionListener(this), this); pluginManager.registerEvents(new StructureGrowRarityListener(this), this); @@ -484,6 +509,7 @@ private void registerScoreboardListeners() private void registerStructureListeners() { pluginManager.registerEvents(new ArmoryListener(this), this); + pluginManager.registerEvents(new TransactionResourceStructureListener(this), this); } private void registerWorldListeners() @@ -548,6 +574,8 @@ public void onDisable() townsFiler.saveTowns(); playerDataFiler.saveMemoryPlayers(); + rawMaterialMapFiler.save(); + crownInfoFiler.save(); getServer().getWorlds().forEach(blockDataFiler::saveChunks); getLogger().info("Plugin disabled."); diff --git a/plugin/src/main/java/com/eul4/StructureType.java b/plugin/src/main/java/com/eul4/StructureType.java index bb68390d..ce39a839 100644 --- a/plugin/src/main/java/com/eul4/StructureType.java +++ b/plugin/src/main/java/com/eul4/StructureType.java @@ -151,6 +151,21 @@ public enum StructureType Material.SMOOTH_STONE ), + CROWN_DEPOSIT + ( + CraftCrownDeposit.class, + CraftCrownDeposit::new, + CraftCrownDeposit::new, + CrownDepositWriter.class, + CrownDepositReader.class, + CraftCrownDepositGui::new, + Main::getCrownDepositRule, + NamedTextColor.GOLD, + PluginMessage.STRUCTURE_CROWN_DEPOSIT_NAME, + PluginMessage.STRUCTURE_CROWN_DEPOSIT_UPGRADE_PREVIEW_LORE, + Material.GOLD_BLOCK + ), + ; private final Class structureClass; diff --git a/plugin/src/main/java/com/eul4/calculator/BigDecimalCalculator.java b/plugin/src/main/java/com/eul4/calculator/BigDecimalCalculator.java new file mode 100644 index 00000000..ecef36be --- /dev/null +++ b/plugin/src/main/java/com/eul4/calculator/BigDecimalCalculator.java @@ -0,0 +1,31 @@ +package com.eul4.calculator; + +import java.math.BigDecimal; + +public class BigDecimalCalculator extends Calculator +{ + public static BigDecimalCalculator INSTANCE = new BigDecimalCalculator(); + + private BigDecimalCalculator() + { + + } + + @Override + public BigDecimal getZeroSample() + { + return BigDecimal.ZERO; + } + + @Override + public BigDecimal add(BigDecimal augend, BigDecimal addend) + { + return augend.add(addend); + } + + @Override + public BigDecimal subtract(BigDecimal minuend, BigDecimal subtrahend) + { + return minuend.subtract(subtrahend); + } +} diff --git a/plugin/src/main/java/com/eul4/calculator/Calculator.java b/plugin/src/main/java/com/eul4/calculator/Calculator.java new file mode 100644 index 00000000..3868e5ab --- /dev/null +++ b/plugin/src/main/java/com/eul4/calculator/Calculator.java @@ -0,0 +1,8 @@ +package com.eul4.calculator; + +public abstract class Calculator> +{ + public abstract N getZeroSample(); + public abstract N add(N augend, N addend); + public abstract N subtract(N minuend, N subtrahend); +} diff --git a/plugin/src/main/java/com/eul4/command/AdminCommand.java b/plugin/src/main/java/com/eul4/command/AdminCommand.java index a844ba24..0ca0b99c 100644 --- a/plugin/src/main/java/com/eul4/command/AdminCommand.java +++ b/plugin/src/main/java/com/eul4/command/AdminCommand.java @@ -5,7 +5,7 @@ import com.eul4.common.model.player.CommonPlayer; import com.eul4.common.type.player.PlayerType; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.Admin; +import com.eul4.model.player.physical.Admin; import com.eul4.type.player.PhysicalPlayerType; import com.eul4.world.RaidWorld; import lombok.RequiredArgsConstructor; diff --git a/plugin/src/main/java/com/eul4/command/AttackCommand.java b/plugin/src/main/java/com/eul4/command/AttackCommand.java index 3becf748..3d03b17c 100644 --- a/plugin/src/main/java/com/eul4/command/AttackCommand.java +++ b/plugin/src/main/java/com/eul4/command/AttackCommand.java @@ -1,8 +1,8 @@ package com.eul4.command; import com.eul4.Main; -import com.eul4.model.player.RaidAnalyzer; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.spiritual.RaidAnalyzer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.type.player.SpiritualPlayerType; import lombok.RequiredArgsConstructor; import org.bukkit.command.Command; diff --git a/plugin/src/main/java/com/eul4/command/BalanceCommand.java b/plugin/src/main/java/com/eul4/command/BalanceCommand.java index bfd9d3d4..c60f0e7d 100644 --- a/plugin/src/main/java/com/eul4/command/BalanceCommand.java +++ b/plugin/src/main/java/com/eul4/command/BalanceCommand.java @@ -1,6 +1,7 @@ package com.eul4.command; import com.eul4.Main; +import com.eul4.i18n.PluginRichMessage; import com.eul4.model.player.PluginPlayer; import com.eul4.model.town.Town; import lombok.RequiredArgsConstructor; @@ -11,9 +12,7 @@ import java.util.Collections; import java.util.List; -import java.util.Set; -import static com.eul4.i18n.PluginMessage.COMMAND_BALANCE; import static com.eul4.i18n.PluginMessage.COMMAND_BALANCE_TRY_TOWN_COMMAND; @RequiredArgsConstructor @@ -47,7 +46,7 @@ public boolean onCommand(CommandSender commandSender, Command command, String s, return false; } - pluginPlayer.sendMessage(COMMAND_BALANCE, town); + pluginPlayer.sendMessage(PluginRichMessage.COMMAND_BALANCE_$TOWN, town); return true; } } diff --git a/plugin/src/main/java/com/eul4/command/BaltopCommand.java b/plugin/src/main/java/com/eul4/command/BaltopCommand.java new file mode 100644 index 00000000..d931417a --- /dev/null +++ b/plugin/src/main/java/com/eul4/command/BaltopCommand.java @@ -0,0 +1,101 @@ +package com.eul4.command; + +import com.eul4.Main; +import com.eul4.common.util.ThreadUtil; +import com.eul4.i18n.PluginMessage; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.town.Town; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; + +import java.math.BigDecimal; +import java.util.*; + +@RequiredArgsConstructor +public class BaltopCommand implements TabExecutor +{ + public static final String COMMAND_NAME = "baltop"; + public static final String[] NAME_AND_ALIASES = new String[] { COMMAND_NAME }; + + private final Set waitingComputation = new HashSet<>(); + + private final Main plugin; + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) + { + return Collections.emptyList(); + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String aliases, String[] args) + { + if(!(commandSender instanceof Player player)) + { + return false; + } + + PluginPlayer pluginPlayer = (PluginPlayer) plugin.getPlayerManager().get(player); + + if(args.length == 0) + { + if(!waitingComputation.add(player.getUniqueId())) + { + return false; + } + + pluginPlayer.sendMessage(PluginMessage.COMMAND_BALTOP_WAIT_COMPUTATION); + + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> + { + ThreadUtil.sneakySleep(1500L); + List playerBalances = plugin.getTownManager() + .getTowns() + .values() + .stream() + .map(PlayerBalance::new) + .sorted(PlayerBalance.getBaltopComparator()) + .toList(); + + pluginPlayer.sendMessage(PluginMessage.COMMAND_BALTOP_$LIST, playerBalances); + waitingComputation.remove(player.getUniqueId()); + }); + return true; + } + else + { + pluginPlayer.sendMessage(PluginMessage.GENERIC_COMMAND_NOARGS_USE_$ALIASES, aliases); + return false; + } + } + + @RequiredArgsConstructor + @Getter + public static class PlayerBalance + { + private final OfflinePlayer offlinePlayer; + private final BigDecimal balance; + + public PlayerBalance(Town town) + { + this.offlinePlayer = town.getOwner(); + this.balance = town.getCalculatedCrownBalance(); + } + + private static Comparator getBaltopComparator() + { + return (p1, p2) -> + { + final int reverseBalanceComparation = p2.balance.compareTo(p1.balance); + final int nameComparation = p1.offlinePlayer.getName().compareTo(p2.offlinePlayer.getName()); + + return reverseBalanceComparation != 0 ? reverseBalanceComparation : nameComparation; + }; + } + } +} diff --git a/plugin/src/main/java/com/eul4/command/BuyStructureCommand.java b/plugin/src/main/java/com/eul4/command/BuyStructureCommand.java index 3652814f..d86462ef 100644 --- a/plugin/src/main/java/com/eul4/command/BuyStructureCommand.java +++ b/plugin/src/main/java/com/eul4/command/BuyStructureCommand.java @@ -10,9 +10,8 @@ import com.eul4.exception.StructureLimitException; import com.eul4.exception.StructureNotForSaleException; import com.eul4.i18n.PluginMessage; -import com.eul4.model.inventory.craft.CraftStructureShopGui; -import com.eul4.model.player.BuyStructurePerformer; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.performer.BuyStructurePerformer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import lombok.RequiredArgsConstructor; diff --git a/plugin/src/main/java/com/eul4/command/DebugCommand.java b/plugin/src/main/java/com/eul4/command/DebugCommand.java index c62f6df9..95221a5d 100644 --- a/plugin/src/main/java/com/eul4/command/DebugCommand.java +++ b/plugin/src/main/java/com/eul4/command/DebugCommand.java @@ -5,7 +5,9 @@ import com.eul4.common.i18n.Messageable; import com.eul4.common.world.CommonWorld; import com.eul4.enums.Rarity; +import com.eul4.holder.CapacitatedCrownHolder; import com.eul4.model.player.PluginPlayer; +import com.eul4.model.town.Town; import com.eul4.service.BlockData; import com.google.common.collect.Multimap; import lombok.RequiredArgsConstructor; @@ -64,7 +66,11 @@ public boolean onCommand(@NotNull CommandSender commandSender, if(args.length == 0) { - + CapacitatedCrownHolder capacitatedCrownHolder = pluginPlayer.getTown().getTownHall().getCapacitatedCrownHolder(); + Town town = pluginPlayer.getTown(); + + player.sendMessage("TownHallCrownHolder: " + capacitatedCrownHolder.getBalance() + "/" + capacitatedCrownHolder.getCapacity()); + player.sendMessage("Total: " + town.getCalculatedCrownBalance() + "/" + town.calculateCrownCapacity()); } else if(args.length == 2 && args[0].equalsIgnoreCase("goto")) { diff --git a/plugin/src/main/java/com/eul4/command/DelHomeCommand.java b/plugin/src/main/java/com/eul4/command/DelHomeCommand.java index ab48a80b..fff8cefb 100644 --- a/plugin/src/main/java/com/eul4/command/DelHomeCommand.java +++ b/plugin/src/main/java/com/eul4/command/DelHomeCommand.java @@ -2,8 +2,7 @@ import com.eul4.Main; import com.eul4.common.i18n.CommonMessage; -import com.eul4.model.player.DelHomePerformer; -import com.eul4.model.player.HomeTabCompleter; +import com.eul4.model.player.performer.DelHomePerformer; import com.eul4.model.player.PluginPlayer; import lombok.RequiredArgsConstructor; import org.bukkit.command.Command; diff --git a/plugin/src/main/java/com/eul4/command/HomeCommand.java b/plugin/src/main/java/com/eul4/command/HomeCommand.java index 765f7039..f662a67c 100644 --- a/plugin/src/main/java/com/eul4/command/HomeCommand.java +++ b/plugin/src/main/java/com/eul4/command/HomeCommand.java @@ -2,7 +2,7 @@ import com.eul4.Main; import com.eul4.common.i18n.CommonMessage; -import com.eul4.model.player.HomePerformer; +import com.eul4.model.player.performer.HomePerformer; import com.eul4.model.player.PluginPlayer; import lombok.RequiredArgsConstructor; import org.bukkit.command.Command; diff --git a/plugin/src/main/java/com/eul4/command/NewbieCommand.java b/plugin/src/main/java/com/eul4/command/NewbieCommand.java index 18cc03ec..d483f876 100644 --- a/plugin/src/main/java/com/eul4/command/NewbieCommand.java +++ b/plugin/src/main/java/com/eul4/command/NewbieCommand.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.common.i18n.CommonMessage; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.NewbiePerformer; +import com.eul4.model.player.performer.NewbiePerformer; import com.eul4.model.player.PluginPlayer; import lombok.RequiredArgsConstructor; import org.bukkit.command.Command; diff --git a/plugin/src/main/java/com/eul4/command/PayCommand.java b/plugin/src/main/java/com/eul4/command/PayCommand.java new file mode 100644 index 00000000..459f9afb --- /dev/null +++ b/plugin/src/main/java/com/eul4/command/PayCommand.java @@ -0,0 +1,62 @@ +package com.eul4.command; + +import com.eul4.Main; +import com.eul4.common.i18n.CommonMessage; +import com.eul4.model.player.performer.PayPerformer; +import com.eul4.model.player.PluginPlayer; +import lombok.RequiredArgsConstructor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; + +import java.util.Collections; +import java.util.List; + +@RequiredArgsConstructor +public class PayCommand implements TabExecutor +{ + public static final String COMMAND_NAME = "pay"; + public static final String[] NAME_AND_ALIASES = new String[] { COMMAND_NAME, "pagar" }; + + private final Main plugin; + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] args) + { + if(!(commandSender instanceof Player player)) + { + return Collections.emptyList(); + } + + PluginPlayer pluginPlayer = (PluginPlayer) plugin.getPlayerManager().get(player); + + if(pluginPlayer instanceof PayPerformer payPerformer) + { + return payPerformer.onPayTabComplete(args); + } + + return Collections.emptyList(); + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String aliases, String[] args) + { + if(!(commandSender instanceof Player player)) + { + return false; + } + + PluginPlayer pluginPlayer = (PluginPlayer) plugin.getPlayerManager().get(player); + + if(pluginPlayer instanceof PayPerformer payPerformer) + { + return payPerformer.performPay(aliases, args); + } + else + { + pluginPlayer.sendMessage(CommonMessage.CAN_NOT_PERFORM); + return false; + } + } +} diff --git a/plugin/src/main/java/com/eul4/command/PriceCommand.java b/plugin/src/main/java/com/eul4/command/PriceCommand.java new file mode 100644 index 00000000..c5a1ba13 --- /dev/null +++ b/plugin/src/main/java/com/eul4/command/PriceCommand.java @@ -0,0 +1,84 @@ +package com.eul4.command; + +import com.eul4.Main; +import com.eul4.exception.InvalidCryptoInfoException; +import com.eul4.exception.MaterialNotForSaleException; +import com.eul4.i18n.PluginMessage; +import com.eul4.model.player.PluginPlayer; +import com.eul4.service.MarketDataManager; +import com.eul4.wrapper.CryptoInfo; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.math.BigDecimal; +import java.util.Collections; +import java.util.List; + +public class PriceCommand implements TabExecutor +{ + public static final String COMMAND_NAME = "price"; + public static final String[] NAME_AND_ALIASES = new String[] { COMMAND_NAME, "preço" }; + + private final Main plugin; + + private final MarketDataManager marketDataManager; + + public PriceCommand(Main plugin) + { + this.plugin = plugin; + this.marketDataManager = plugin.getMarketDataManager(); + } + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) + { + return Collections.emptyList(); + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String aliases, String[] args) + { + if(!(commandSender instanceof Player player)) + { + return true; + } + + PluginPlayer pluginPlayer = (PluginPlayer) plugin.getPlayerManager().get(player); + + if(args.length == 0) + { + ItemStack item = player.getInventory().getItemInMainHand(); + Material material = item.getType(); + + if(material.isEmpty()) + { + pluginPlayer.sendMessage(PluginMessage.COMMAND_SELL_NEED_HOLD_ITEM); + return false; + } + + try + { + BigDecimal price = marketDataManager.calculatePrice(material); + pluginPlayer.sendMessage(PluginMessage.COMMAND_PRICE_UNIT_PRICE_$MATERIAL_$PRICE, + Component.translatable(material.translationKey()), + price); + return true; + } + catch(MaterialNotForSaleException | InvalidCryptoInfoException e) + { + pluginPlayer.sendMessage(PluginMessage.COMMAND_SELL_ITEM_NOT_FOR_SALE); + return false; + } + } + else + { + pluginPlayer.sendMessage(PluginMessage.COMMAND_PRICE_USE_$ALIASES, aliases); + return false; + } + } +} diff --git a/plugin/src/main/java/com/eul4/command/RaidCommand.java b/plugin/src/main/java/com/eul4/command/RaidCommand.java index 01c33bd8..3f8cc28f 100644 --- a/plugin/src/main/java/com/eul4/command/RaidCommand.java +++ b/plugin/src/main/java/com/eul4/command/RaidCommand.java @@ -4,7 +4,7 @@ import com.eul4.common.i18n.CommonMessage; import com.eul4.i18n.PluginMessage; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.RaidPerformer; +import com.eul4.model.player.performer.RaidPerformer; import lombok.RequiredArgsConstructor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/plugin/src/main/java/com/eul4/command/RawMaterialCommand.java b/plugin/src/main/java/com/eul4/command/RawMaterialCommand.java new file mode 100644 index 00000000..5a96f97a --- /dev/null +++ b/plugin/src/main/java/com/eul4/command/RawMaterialCommand.java @@ -0,0 +1,176 @@ +package com.eul4.command; + +import com.eul4.Main; +import com.eul4.common.i18n.Messageable; +import com.eul4.exception.InvalidCryptoInfoException; +import com.eul4.service.MarketDataManager; +import com.eul4.wrapper.CryptoInfo; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static com.eul4.common.i18n.CommonMessage.YOU_DO_NOT_HAVE_PERMISSION; + +public class RawMaterialCommand implements TabExecutor +{ + public static final String COMMAND_NAME = "raw-material"; + private static final String PERMISSION = "command." + COMMAND_NAME; + public static final String[] NAME_AND_ALIASES = new String[] { COMMAND_NAME }; + + private final Main plugin; + + private final MarketDataManager marketDataManager; + + public RawMaterialCommand(Main plugin) + { + this.plugin = plugin; + this.marketDataManager = plugin.getMarketDataManager(); + } + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] args) + { + if(!plugin.getPermissionService().hasPermission(commandSender, PERMISSION)) + { + return Collections.emptyList(); + } + + if(args.length == 1) + { + List suggestions = new ArrayList<>(); + + for(Material material : Material.values()) + { + if(material.name().startsWith(args[0].toUpperCase())) + { + suggestions.add(material.name()); + } + } + + return suggestions; + } + + return Collections.emptyList(); + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String aliases, String[] args) + { + Messageable messageable = plugin.getMessageableService().getMessageable(commandSender); + + if(!plugin.getPermissionService().hasPermission(commandSender, PERMISSION)) + { + messageable.sendMessage(YOU_DO_NOT_HAVE_PERMISSION); + return false; + } + + if(args.length == 1) + { + Material material = Material.getMaterial(args[0].toUpperCase()); + + if(material == null) + { + commandSender.sendMessage("Material not found."); + return false; + } + + if(!marketDataManager.getRawMaterialMap().containsKey(material)) + { + commandSender.sendMessage("RawMaterial not found."); + return false; + } + + CryptoInfo cryptoInfo = marketDataManager.getRawMaterialMap().get(material).getCryptoInfo(); + + commandSender.sendMessage("cap: " + cryptoInfo.getMarketCap()); + commandSender.sendMessage("supply: " + cryptoInfo.getCirculatingSupply()); + + try + { + commandSender.sendMessage("price: " + cryptoInfo.calculatePrice()); + return true; + } + catch(InvalidCryptoInfoException e) + { + return false; + } + } + else if(args.length == 3) + { + Material material = Material.getMaterial(args[0].toUpperCase()); + + if(material == null) + { + commandSender.sendMessage("Material not found."); + return false; + } + + try + { + BigDecimal value = new BigDecimal(args[2]); + + if(!marketDataManager.getRawMaterialMap().containsKey(material)) + { + commandSender.sendMessage("RawMaterial not found."); + return false; + } + + CryptoInfo cryptoInfo = marketDataManager.getRawMaterialMap().get(material).getCryptoInfo(); + + if(args[1].equalsIgnoreCase("cap")) + { + BigDecimal newMarketCap = value.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO + : cryptoInfo.getMarketCap().add(value); + + if(newMarketCap.compareTo(BigDecimal.ZERO) < 0) + { + commandSender.sendMessage("Negative Exception"); + return false; + } + + cryptoInfo.setMarketCap(newMarketCap); + commandSender.sendMessage("newMarketCap: " + newMarketCap); + return true; + } + else if(args[1].equalsIgnoreCase("supply")) + { + BigDecimal newCirculatingSupply = value.compareTo(BigDecimal.ZERO) == 0 + ? BigDecimal.ZERO + : cryptoInfo.getCirculatingSupply().add(value); + + if(newCirculatingSupply.compareTo(BigDecimal.ZERO) < 0) + { + commandSender.sendMessage("Negative Exception"); + return false; + } + + cryptoInfo.setCirculatingSupply(newCirculatingSupply); + commandSender.sendMessage("newCirculatingSupply: " + newCirculatingSupply); + return true; + } + else + { + commandSender.sendMessage("Wrong usage."); + return false; + } + } + catch(NumberFormatException e) + { + commandSender.sendMessage("NumberFormatException."); + return false; + } + } + else + { + commandSender.sendMessage("Wrong usage."); + return false; + } + } +} diff --git a/plugin/src/main/java/com/eul4/command/SellCommand.java b/plugin/src/main/java/com/eul4/command/SellCommand.java new file mode 100644 index 00000000..789d1555 --- /dev/null +++ b/plugin/src/main/java/com/eul4/command/SellCommand.java @@ -0,0 +1,107 @@ +package com.eul4.command; + +import com.eul4.Main; +import com.eul4.calculator.BigDecimalCalculator; +import com.eul4.economy.ItemStackTransaction; +import com.eul4.exception.InvalidCryptoInfoException; +import com.eul4.exception.MaterialNotForSaleException; +import com.eul4.exception.OperationException; +import com.eul4.exception.OverCapacityException; +import com.eul4.i18n.PluginMessage; +import com.eul4.model.player.PluginPlayer; +import com.eul4.service.MarketDataManager; +import com.eul4.util.RarityUtil; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.math.BigDecimal; +import java.util.Collections; +import java.util.List; + +public class SellCommand implements TabExecutor +{ + public static final String COMMAND_NAME = "sell"; + public static final String[] NAME_AND_ALIASES = new String[] { COMMAND_NAME, "vender" }; + + private final Main plugin; + + private final MarketDataManager marketDataManager; + + public SellCommand(Main plugin) + { + this.plugin = plugin; + this.marketDataManager = plugin.getMarketDataManager(); + } + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) + { + return Collections.emptyList(); + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String aliases, String[] args) + { + if(!(commandSender instanceof Player player)) + { + return true; + } + + PluginPlayer pluginPlayer = (PluginPlayer) plugin.getPlayerManager().get(player); + + if(args.length == 0) + { + ItemStack item = player.getInventory().getItemInMainHand(); + Material material = item.getType(); + int slot = player.getInventory().getHeldItemSlot(); + + if(material.isEmpty()) + { + pluginPlayer.sendMessage(PluginMessage.COMMAND_SELL_NEED_HOLD_ITEM); + return false; + } + + try + { + ItemStackTransaction itemStackTransaction = marketDataManager + .createItemStackTransaction(pluginPlayer, slot); + itemStackTransaction.execute(); + BigDecimal total = itemStackTransaction.getTransaction().calculateTotal(BigDecimalCalculator.INSTANCE); + + pluginPlayer.sendMessage + ( + PluginMessage.COMMAND_SELL_SOLD_$MATERIAL_$AMOUNT_$VALUE_$RARITY, + material, + itemStackTransaction.getAmountToConsume(), + total, + RarityUtil.getRarity(item) + ); + return true; + } + catch(MaterialNotForSaleException | InvalidCryptoInfoException e) + { + pluginPlayer.sendMessage(PluginMessage.COMMAND_SELL_ITEM_NOT_FOR_SALE); + return false; + } + catch(OverCapacityException e) + { + pluginPlayer.sendMessage(PluginMessage.CROWN_DEPOSITS_INSUFFICIENT_CAPACITY); + return false; + } + catch(OperationException e) + { + pluginPlayer.sendMessage(PluginMessage.EXCEPTION_OPERATION); + return false; + } + } + else + { + pluginPlayer.sendMessage(PluginMessage.COMMAND_SELL_USE_$ALIASES, aliases); + return false; + } + } +} diff --git a/plugin/src/main/java/com/eul4/command/SetHomeCommand.java b/plugin/src/main/java/com/eul4/command/SetHomeCommand.java index 6dd8c17f..20bdfb7b 100644 --- a/plugin/src/main/java/com/eul4/command/SetHomeCommand.java +++ b/plugin/src/main/java/com/eul4/command/SetHomeCommand.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.common.i18n.CommonMessage; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.SetHomePerformer; +import com.eul4.model.player.performer.SetHomePerformer; import lombok.RequiredArgsConstructor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/plugin/src/main/java/com/eul4/command/SpawnCommand.java b/plugin/src/main/java/com/eul4/command/SpawnCommand.java index 3fbfb841..7169d5c3 100644 --- a/plugin/src/main/java/com/eul4/command/SpawnCommand.java +++ b/plugin/src/main/java/com/eul4/command/SpawnCommand.java @@ -4,7 +4,7 @@ import com.eul4.common.i18n.CommonMessage; import com.eul4.common.model.player.CommonPlayer; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.SpawnPerformer; +import com.eul4.model.player.performer.SpawnPerformer; import lombok.RequiredArgsConstructor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/plugin/src/main/java/com/eul4/command/TestCommand.java b/plugin/src/main/java/com/eul4/command/TestCommand.java index a3d304ad..9cf0676e 100644 --- a/plugin/src/main/java/com/eul4/command/TestCommand.java +++ b/plugin/src/main/java/com/eul4/command/TestCommand.java @@ -5,7 +5,7 @@ import com.eul4.common.i18n.Messageable; import com.eul4.item.ContaintmentPickaxe; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.type.PluginWorldType; import lombok.RequiredArgsConstructor; @@ -34,7 +34,6 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/plugin/src/main/java/com/eul4/command/TownCommand.java b/plugin/src/main/java/com/eul4/command/TownCommand.java index d725edfa..c176bb4a 100644 --- a/plugin/src/main/java/com/eul4/command/TownCommand.java +++ b/plugin/src/main/java/com/eul4/command/TownCommand.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.common.i18n.CommonMessage; import com.eul4.common.model.player.CommonPlayer; -import com.eul4.model.player.TownPerformer; +import com.eul4.model.player.performer.TownPerformer; import lombok.RequiredArgsConstructor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/plugin/src/main/java/com/eul4/currency/CrownCurrency.java b/plugin/src/main/java/com/eul4/currency/CrownCurrency.java new file mode 100644 index 00000000..3558f978 --- /dev/null +++ b/plugin/src/main/java/com/eul4/currency/CrownCurrency.java @@ -0,0 +1,7 @@ +package com.eul4.currency; + +import java.math.BigDecimal; + +public class CrownCurrency implements Currency +{ +} diff --git a/plugin/src/main/java/com/eul4/currency/Currency.java b/plugin/src/main/java/com/eul4/currency/Currency.java new file mode 100644 index 00000000..6a233097 --- /dev/null +++ b/plugin/src/main/java/com/eul4/currency/Currency.java @@ -0,0 +1,6 @@ +package com.eul4.currency; + +public interface Currency +{ + +} diff --git a/plugin/src/main/java/com/eul4/economy/ItemStackTransaction.java b/plugin/src/main/java/com/eul4/economy/ItemStackTransaction.java new file mode 100644 index 00000000..0fcacf3d --- /dev/null +++ b/plugin/src/main/java/com/eul4/economy/ItemStackTransaction.java @@ -0,0 +1,85 @@ +package com.eul4.economy; + +import com.eul4.exception.OperationException; +import com.google.common.base.Preconditions; +import lombok.Getter; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +public class ItemStackTransaction> +{ + @Getter + private final Transaction transaction; + + private final Inventory inventory; + private final int slot; + + @Getter + private final int amountToConsume; + + private final ItemStack originalItemStack; + private final ItemStack consumedItemStack; + + private boolean executed; + private boolean rollbacked; + + public ItemStackTransaction(Transaction transaction, Inventory inventory, int slot, final int amountToConsume) + { + Preconditions.checkArgument(amountToConsume >= 0); + + this.transaction = transaction; + this.inventory = inventory; + this.slot = slot; + this.originalItemStack = inventory.getItem(slot); + + Preconditions.checkArgument(originalItemStack.getAmount() >= amountToConsume); + + this.consumedItemStack = originalItemStack.clone().subtract(amountToConsume); + this.amountToConsume = amountToConsume; + } + + public void execute() throws OperationException + { + if(executed) + { + return; + } + + executed = true; + + try + { + inventory.setItem(slot, consumedItemStack); + transaction.execute(); + } + catch(Exception e) + { + tryRollback(); + } + } + + private void tryRollback() + { + try + { + rollback(); + } + catch(Exception e) + { + e.printStackTrace();//TODO log + } + } + + private void rollback() throws OperationException + { + if(!executed || rollbacked) + { + return; + } + + rollbacked = true; + + transaction.rollback(); + inventory.setItem(slot, originalItemStack); + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/economy/Transaction.java b/plugin/src/main/java/com/eul4/economy/Transaction.java new file mode 100644 index 00000000..6b081d61 --- /dev/null +++ b/plugin/src/main/java/com/eul4/economy/Transaction.java @@ -0,0 +1,119 @@ +package com.eul4.economy; + +import com.eul4.calculator.Calculator; +import com.eul4.event.TransactionExecuteEvent; +import com.eul4.exception.OperationException; +import com.eul4.holder.Holder; +import lombok.Getter; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Transaction> +{ + @Getter + private final List> transferList; + + private boolean executed; + private boolean rollbacked; + + public Transaction(List> transferList) + { + this.transferList = transferList; + } + + public boolean tryExecuteSilenty() + { + try + { + execute(); + return true; + } + catch(Exception e) + { + tryRollback(); + return false; + } + } + + public void tryExecute() throws OperationException + { + try + { + execute(); + } + catch(Exception e) + { + tryRollback(); + + if(e instanceof OperationException operationException) + { + throw operationException; + } + } + } + + void execute() throws OperationException + { + if(executed) + { + return; + } + + executed = true; + + for(Transfer transfer : transferList) + { + transfer.execute(); + } + + new TransactionExecuteEvent(this).callEvent(); + } + + private void tryRollback() + { + try + { + rollback(); + } + catch(Exception e) + { + e.printStackTrace();//TODO log + } + } + + void rollback() throws OperationException + { + if(!executed || rollbacked) + { + return; + } + + rollbacked = true; + + for(Transfer transfer : transferList) + { + transfer.rollback(); + } + } + + public Set> getInvolvedHolders() + { + Set> involvedHolders = new HashSet<>(); + + for(Transfer transfer : transferList) + { + involvedHolders.add(transfer.getHolderFrom()); + involvedHolders.add(transfer.getHolderTo()); + } + + return involvedHolders; + } + + public N calculateTotal(Calculator calculator) + { + return transferList.stream().map(Transfer::getAmount) + .reduce(calculator.getZeroSample(), calculator::add); + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/economy/Transfer.java b/plugin/src/main/java/com/eul4/economy/Transfer.java new file mode 100644 index 00000000..d68f3ad9 --- /dev/null +++ b/plugin/src/main/java/com/eul4/economy/Transfer.java @@ -0,0 +1,60 @@ +package com.eul4.economy; + +import com.eul4.exception.OperationException; +import com.eul4.holder.Holder; +import lombok.Getter; + +public class Transfer> +{ + @Getter + private final Holder holderFrom; + @Getter + private final Holder holderTo; + @Getter + private final N amount; + + private boolean executed; + private boolean rollbacked; + + private N oldHolderFromBalance; + private N oldHolderToBalance; + + public Transfer + ( + Holder holderFrom, + Holder holderTo, + N amount + ) + { + this.holderFrom = holderFrom; + this.holderTo = holderTo; + this.amount = amount; + } + + void execute() throws OperationException + { + if(executed) + { + return; + } + + executed = true; + + oldHolderFromBalance = holderFrom.getBalance(); + oldHolderToBalance = holderTo.getBalance(); + holderFrom.subtract(amount); + holderTo.add(amount); + } + + void rollback() throws OperationException + { + if(!executed || rollbacked) + { + return; + } + + rollbacked = true; + holderFrom.setBalance(oldHolderFromBalance); + holderTo.setBalance(oldHolderToBalance); + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/enums/Currency.java b/plugin/src/main/java/com/eul4/enums/Currency.java index 2efe9805..e057e40d 100644 --- a/plugin/src/main/java/com/eul4/enums/Currency.java +++ b/plugin/src/main/java/com/eul4/enums/Currency.java @@ -1,23 +1,118 @@ package com.eul4.enums; import com.eul4.common.i18n.Message; +import com.eul4.common.util.DecimalFormatUtil; import com.eul4.i18n.PluginMessage; import lombok.Getter; import lombok.RequiredArgsConstructor; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; -import static net.kyori.adventure.text.format.NamedTextColor.GREEN; -import static net.kyori.adventure.text.format.NamedTextColor.RED; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; +import java.util.ResourceBundle; + +import static net.kyori.adventure.text.format.NamedTextColor.*; +import static net.kyori.adventure.text.format.Style.style; @RequiredArgsConstructor @Getter public enum Currency { - LIKE(PluginMessage.LIKES, Component.empty().color(GREEN)), - DISLIKE(PluginMessage.DISLIKES, Component.empty().color(RED)), + LIKE(PluginMessage.LIKES, PluginMessage.LIKES, style(GREEN)) + { + @Override + public DecimalFormat getDecimalFormat(Locale locale) + { + DecimalFormat decimalFormat = new DecimalFormat("0", new DecimalFormatSymbols(locale)); + + decimalFormat.setGroupingSize(3); + decimalFormat.setGroupingUsed(true); + + return decimalFormat; + } + }, + + DISLIKE(PluginMessage.DISLIKES, PluginMessage.DISLIKES, style(RED)) + { + @Override + public DecimalFormat getDecimalFormat(Locale locale) + { + DecimalFormat decimalFormat = new DecimalFormat("0", new DecimalFormatSymbols(locale)); + + decimalFormat.setGroupingSize(3); + decimalFormat.setGroupingUsed(true); + + return decimalFormat; + } + }, + + CROWN(PluginMessage.CROWN, PluginMessage.CROWNS, style(YELLOW)) + { + @Override + public DecimalFormat getDecimalFormat(Locale locale) + { + DecimalFormat decimalFormat = new DecimalFormat("0.00"); + + decimalFormat.setDecimalFormatSymbols(new DecimalFormatSymbols(locale)); + decimalFormat.setGroupingSize(3); + decimalFormat.setGroupingUsed(true); + + return decimalFormat; + } + + @Override + public DecimalFormat getAccurateDecimalFormat(Locale locale) + { + DecimalFormat decimalFormat = new DecimalFormat("0.00######"); + + decimalFormat.setDecimalFormatSymbols(new DecimalFormatSymbols(locale)); + decimalFormat.setGroupingSize(3); + decimalFormat.setGroupingUsed(true); + + return decimalFormat; + } + }, ; + private final Message singularWord; private final Message pluralWord; - private final Component baseComponent; + private final Style style; + + public String format(Number number, Locale locale) + { + return getDecimalFormat(locale).format(number); + } + + public Message getWordFor(Number number, Locale locale) + { + return getWordFor(number, getDecimalFormat(locale)); + } + + public Message getWordFor(Number number, DecimalFormat decimalFormat) + { + return getWordFor(DecimalFormatUtil.parse(decimalFormat, number)); + } + + public Message getWordFor(Number number) + { + return number.doubleValue() == 1.0D ? singularWord : pluralWord; + } + + public abstract DecimalFormat getDecimalFormat(Locale locale); + + public final DecimalFormat getAccurateDecimalFormat(ResourceBundle bundle) + { + return getAccurateDecimalFormat(bundle.getLocale()); + } + + public DecimalFormat getAccurateDecimalFormat(Locale locale) + { + return getDecimalFormat(locale); + } + + public final DecimalFormat getDecimalFormat(ResourceBundle bundle) + { + return getDecimalFormat(bundle.getLocale()); + } } diff --git a/plugin/src/main/java/com/eul4/enums/ItemBuilder.java b/plugin/src/main/java/com/eul4/enums/ItemBuilder.java index 2b97a87a..4b5c4bcb 100644 --- a/plugin/src/main/java/com/eul4/enums/ItemBuilder.java +++ b/plugin/src/main/java/com/eul4/enums/ItemBuilder.java @@ -2,9 +2,10 @@ import com.eul4.StructureType; import com.eul4.common.constant.CommonNamespacedKey; -import com.eul4.common.i18n.Message; +import com.eul4.common.i18n.TranslatableMessage; import com.eul4.common.model.player.CommonPlayer; import com.eul4.i18n.PluginMessage; +import com.eul4.i18n.PluginRichMessage; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.bukkit.Material; @@ -58,6 +59,15 @@ public enum ItemBuilder PluginMessage.STRUCTURE_DISLIKE_DEPOSIT_SHOP_PREVIEW_ATTRIBUTES, PluginMessage.STRUCTURE_DISLIKE_DEPOSIT_SHOP_LORE), + CROWN_DEPOSIT((itemBuilder, commonPlayer) -> + { + ItemStack item = ItemStack.of(Material.GOLD_BLOCK); + setItemBuilderTag(item, itemBuilder, commonPlayer); + return item; + }, StructureType.CROWN_DEPOSIT, + PluginMessage.STRUCTURE_CROWN_DEPOSIT_SHOP_PREVIEW_ATTRIBUTES, + PluginRichMessage.STRUCTURE_CROWN_DEPOSIT_SHOP_LORE), + ARMORY((itemBuilder, commonPlayer) -> { ItemStack item = new ItemStack(Material.IRON_BLOCK); @@ -89,8 +99,8 @@ public enum ItemBuilder private final BiFunction itemStackFunction; private final StructureType structureType; - private final Message shopPreviewAttributesMessage; - private final Message shopLoreMessage; + private final TranslatableMessage shopPreviewAttributesMessage; + private final TranslatableMessage shopLoreMessage; public ItemStack getItem(CommonPlayer commonPlayer) { diff --git a/plugin/src/main/java/com/eul4/event/AnalyzingTownEvent.java b/plugin/src/main/java/com/eul4/event/AnalyzingTownEvent.java index c6789bb1..5706d248 100644 --- a/plugin/src/main/java/com/eul4/event/AnalyzingTownEvent.java +++ b/plugin/src/main/java/com/eul4/event/AnalyzingTownEvent.java @@ -1,6 +1,6 @@ package com.eul4.event; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.bukkit.event.Event; diff --git a/plugin/src/main/java/com/eul4/event/CrownChangeEvent.java b/plugin/src/main/java/com/eul4/event/CrownChangeEvent.java new file mode 100644 index 00000000..56088131 --- /dev/null +++ b/plugin/src/main/java/com/eul4/event/CrownChangeEvent.java @@ -0,0 +1,34 @@ +package com.eul4.event; + +import com.eul4.model.town.Town; +import lombok.Getter; +import org.bukkit.event.HandlerList; + +import java.math.BigDecimal; + +@Getter +public class CrownChangeEvent extends TownEvent +{ + private static final HandlerList HANDLER = new HandlerList(); + + private final BigDecimal oldCrowns; + private final BigDecimal newCrowns; + + public CrownChangeEvent(Town town, BigDecimal oldCrowns, BigDecimal newCrowns) + { + super(town); + this.oldCrowns = oldCrowns; + this.newCrowns = newCrowns; + } + + public static HandlerList getHandlerList() + { + return HANDLER; + } + + @Override + public HandlerList getHandlers() + { + return HANDLER; + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/event/DislikeChangeEvent.java b/plugin/src/main/java/com/eul4/event/DislikeChangeEvent.java index 125cf954..6c12e509 100644 --- a/plugin/src/main/java/com/eul4/event/DislikeChangeEvent.java +++ b/plugin/src/main/java/com/eul4/event/DislikeChangeEvent.java @@ -2,20 +2,23 @@ import com.eul4.model.town.Town; import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @Getter -@RequiredArgsConstructor -public class DislikeChangeEvent extends Event +public class DislikeChangeEvent extends TownEvent { private static final HandlerList HANDLER = new HandlerList(); - private final Town town; private final int oldDislikes; private final int newDislikes; + public DislikeChangeEvent(Town town, int oldDislikes, int newDislikes) + { + super(town); + this.oldDislikes = oldDislikes; + this.newDislikes = newDislikes; + } + public static HandlerList getHandlerList() { return HANDLER; diff --git a/plugin/src/main/java/com/eul4/event/GenerateDislikeEvent.java b/plugin/src/main/java/com/eul4/event/GenerateDislikeEvent.java index ab4dd85a..6a76766f 100644 --- a/plugin/src/main/java/com/eul4/event/GenerateDislikeEvent.java +++ b/plugin/src/main/java/com/eul4/event/GenerateDislikeEvent.java @@ -2,17 +2,17 @@ import com.eul4.model.town.Town; import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @Getter -@RequiredArgsConstructor -public class GenerateDislikeEvent extends Event +public class GenerateDislikeEvent extends TownEvent { private static final HandlerList HANDLER = new HandlerList(); - private final Town town; + public GenerateDislikeEvent(Town town) + { + super(town); + } public static HandlerList getHandlerList() { diff --git a/plugin/src/main/java/com/eul4/event/GenerateLikeEvent.java b/plugin/src/main/java/com/eul4/event/GenerateLikeEvent.java index 9def4a95..136d2b73 100644 --- a/plugin/src/main/java/com/eul4/event/GenerateLikeEvent.java +++ b/plugin/src/main/java/com/eul4/event/GenerateLikeEvent.java @@ -2,17 +2,17 @@ import com.eul4.model.town.Town; import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @Getter -@RequiredArgsConstructor -public class GenerateLikeEvent extends Event +public class GenerateLikeEvent extends TownEvent { private static final HandlerList HANDLER = new HandlerList(); - private final Town town; + public GenerateLikeEvent(Town town) + { + super(town); + } public static HandlerList getHandlerList() { diff --git a/plugin/src/main/java/com/eul4/event/GeneratorsCapacityChangeEvent.java b/plugin/src/main/java/com/eul4/event/GeneratorsCapacityChangeEvent.java index 8000a854..451c4262 100644 --- a/plugin/src/main/java/com/eul4/event/GeneratorsCapacityChangeEvent.java +++ b/plugin/src/main/java/com/eul4/event/GeneratorsCapacityChangeEvent.java @@ -2,17 +2,17 @@ import com.eul4.model.town.Town; import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @Getter -@RequiredArgsConstructor -public class GeneratorsCapacityChangeEvent extends Event +public class GeneratorsCapacityChangeEvent extends TownEvent { private static final HandlerList HANDLER = new HandlerList(); - private final Town town; + public GeneratorsCapacityChangeEvent(Town town) + { + super(town); + } public static HandlerList getHandlerList() { diff --git a/plugin/src/main/java/com/eul4/event/LikeChangeEvent.java b/plugin/src/main/java/com/eul4/event/LikeChangeEvent.java index ba0e137a..486c58bd 100644 --- a/plugin/src/main/java/com/eul4/event/LikeChangeEvent.java +++ b/plugin/src/main/java/com/eul4/event/LikeChangeEvent.java @@ -1,23 +1,24 @@ package com.eul4.event; import com.eul4.model.town.Town; -import com.eul4.model.town.structure.Structure; import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -import org.bukkit.plugin.Plugin; @Getter -@RequiredArgsConstructor -public class LikeChangeEvent extends Event +public class LikeChangeEvent extends TownEvent { private static final HandlerList HANDLER = new HandlerList(); - private final Town town; private final int oldLikes; private final int newLikes; + public LikeChangeEvent(Town town, int oldLikes, int newLikes) + { + super(town); + this.oldLikes = oldLikes; + this.newLikes = newLikes; + } + public static HandlerList getHandlerList() { return HANDLER; diff --git a/plugin/src/main/java/com/eul4/event/StructureDestroyEvent.java b/plugin/src/main/java/com/eul4/event/StructureDestroyEvent.java new file mode 100644 index 00000000..a8c0440b --- /dev/null +++ b/plugin/src/main/java/com/eul4/event/StructureDestroyEvent.java @@ -0,0 +1,28 @@ +package com.eul4.event; + +import com.eul4.model.town.structure.Structure; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +@Getter +@RequiredArgsConstructor +public class StructureDestroyEvent extends Event +{ + private static final HandlerList HANDLER = new HandlerList(); + + private final Structure structure; + + public static HandlerList getHandlerList() + { + return HANDLER; + } + + @Override + public @NotNull HandlerList getHandlers() + { + return HANDLER; + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/event/TownCapacityChangeEvent.java b/plugin/src/main/java/com/eul4/event/TownCapacityChangeEvent.java index aaa0d814..299ad033 100644 --- a/plugin/src/main/java/com/eul4/event/TownCapacityChangeEvent.java +++ b/plugin/src/main/java/com/eul4/event/TownCapacityChangeEvent.java @@ -2,17 +2,17 @@ import com.eul4.model.town.Town; import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @Getter -@RequiredArgsConstructor -public class TownCapacityChangeEvent extends Event +public class TownCapacityChangeEvent extends TownEvent { private static final HandlerList HANDLER = new HandlerList(); - private final Town town; + public TownCapacityChangeEvent(Town town) + { + super(town); + } public static HandlerList getHandlerList() { diff --git a/plugin/src/main/java/com/eul4/event/TownEvent.java b/plugin/src/main/java/com/eul4/event/TownEvent.java new file mode 100644 index 00000000..191ea53f --- /dev/null +++ b/plugin/src/main/java/com/eul4/event/TownEvent.java @@ -0,0 +1,14 @@ +package com.eul4.event; + +import com.eul4.model.town.Town; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +@Getter +@RequiredArgsConstructor +public abstract class TownEvent extends Event +{ + protected final Town town; +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/event/TownHardnessChangeEvent.java b/plugin/src/main/java/com/eul4/event/TownHardnessChangeEvent.java index 11dde41b..0bb1c4e2 100644 --- a/plugin/src/main/java/com/eul4/event/TownHardnessChangeEvent.java +++ b/plugin/src/main/java/com/eul4/event/TownHardnessChangeEvent.java @@ -2,17 +2,17 @@ import com.eul4.model.town.Town; import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @Getter -@RequiredArgsConstructor -public class TownHardnessChangeEvent extends Event +public class TownHardnessChangeEvent extends TownEvent { private static final HandlerList HANDLER = new HandlerList(); - private final Town town; + public TownHardnessChangeEvent(Town town) + { + super(town); + } public static HandlerList getHandlerList() { diff --git a/plugin/src/main/java/com/eul4/event/TransactionExecuteEvent.java b/plugin/src/main/java/com/eul4/event/TransactionExecuteEvent.java new file mode 100644 index 00000000..b2339b35 --- /dev/null +++ b/plugin/src/main/java/com/eul4/event/TransactionExecuteEvent.java @@ -0,0 +1,27 @@ +package com.eul4.event; + +import com.eul4.economy.Transaction; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +@Getter +@RequiredArgsConstructor +public class TransactionExecuteEvent extends Event +{ + private static final HandlerList HANDLER = new HandlerList(); + + private final Transaction transaction; + + public static HandlerList getHandlerList() + { + return HANDLER; + } + + @Override + public HandlerList getHandlers() + { + return HANDLER; + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/event/TransactionalResourceStructureStealEvent.java b/plugin/src/main/java/com/eul4/event/TransactionalResourceStructureStealEvent.java new file mode 100644 index 00000000..43cfa097 --- /dev/null +++ b/plugin/src/main/java/com/eul4/event/TransactionalResourceStructureStealEvent.java @@ -0,0 +1,35 @@ +package com.eul4.event; + +import com.eul4.model.town.structure.Structure; +import com.eul4.model.town.structure.TransactionalResourceStructure; +import com.eul4.wrapper.TransactionalResource; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +@Getter +@RequiredArgsConstructor +public class TransactionalResourceStructureStealEvent extends Event +{ + private static final HandlerList HANDLER = new HandlerList(); + + private final TransactionalResource transactionalResource; + + public TransactionalResourceStructure getStructure() + { + return transactionalResource.getStructure(); + } + + public static HandlerList getHandlerList() + { + return HANDLER; + } + + @Override + public @NotNull HandlerList getHandlers() + { + return HANDLER; + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/exception/InvalidCryptoInfoException.java b/plugin/src/main/java/com/eul4/exception/InvalidCryptoInfoException.java new file mode 100644 index 00000000..2dee13a1 --- /dev/null +++ b/plugin/src/main/java/com/eul4/exception/InvalidCryptoInfoException.java @@ -0,0 +1,9 @@ +package com.eul4.exception; + +import lombok.experimental.StandardException; + +@StandardException +public class InvalidCryptoInfoException extends Exception +{ + +} diff --git a/plugin/src/main/java/com/eul4/exception/MaterialNotForSaleException.java b/plugin/src/main/java/com/eul4/exception/MaterialNotForSaleException.java new file mode 100644 index 00000000..6c8551f9 --- /dev/null +++ b/plugin/src/main/java/com/eul4/exception/MaterialNotForSaleException.java @@ -0,0 +1,9 @@ +package com.eul4.exception; + +import lombok.experimental.StandardException; + +@StandardException +public class MaterialNotForSaleException extends Exception +{ + +} diff --git a/plugin/src/main/java/com/eul4/exception/NegativeBalanceException.java b/plugin/src/main/java/com/eul4/exception/NegativeBalanceException.java new file mode 100644 index 00000000..85cd0e86 --- /dev/null +++ b/plugin/src/main/java/com/eul4/exception/NegativeBalanceException.java @@ -0,0 +1,9 @@ +package com.eul4.exception; + +import lombok.experimental.StandardException; + +@StandardException +public class NegativeBalanceException extends OperationException +{ + +} diff --git a/plugin/src/main/java/com/eul4/exception/OperationException.java b/plugin/src/main/java/com/eul4/exception/OperationException.java new file mode 100644 index 00000000..553ab162 --- /dev/null +++ b/plugin/src/main/java/com/eul4/exception/OperationException.java @@ -0,0 +1,8 @@ +package com.eul4.exception; + +import lombok.experimental.StandardException; + +@StandardException +public abstract class OperationException extends Exception +{ +} diff --git a/plugin/src/main/java/com/eul4/exception/OverCapacityException.java b/plugin/src/main/java/com/eul4/exception/OverCapacityException.java new file mode 100644 index 00000000..eb7a18e0 --- /dev/null +++ b/plugin/src/main/java/com/eul4/exception/OverCapacityException.java @@ -0,0 +1,9 @@ +package com.eul4.exception; + +import lombok.experimental.StandardException; + +@StandardException +public class OverCapacityException extends OperationException +{ + +} diff --git a/plugin/src/main/java/com/eul4/externalizer/filer/CrownInfoFiler.java b/plugin/src/main/java/com/eul4/externalizer/filer/CrownInfoFiler.java new file mode 100644 index 00000000..06e62890 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/filer/CrownInfoFiler.java @@ -0,0 +1,128 @@ +package com.eul4.externalizer.filer; + +import com.eul4.Main; +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.type.player.CommonObjectType; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.type.player.Writers; +import com.eul4.common.util.FileUtil; +import com.eul4.externalizer.reader.CrownInfoReader; +import com.eul4.externalizer.writer.CrownInfoWriter; +import com.eul4.type.player.PluginObjectType; +import com.eul4.wrapper.CrownInfo; + +import java.io.*; +import java.text.MessageFormat; +import java.util.logging.Level; + +public class CrownInfoFiler extends PluginFiler +{ + private static final byte VERSION = 0; + + private static final ObjectType[] + + OBJECT_TYPES_V0 = new ObjectType[] + { + CommonObjectType.BIG_DECIMAL, + CommonObjectType.OBJECT, + CommonObjectType.UUID, + PluginObjectType.CROWN_INFO, + PluginObjectType.UNLIMITED_CROWN_HOLDER, + }; + + private CrownInfo crownInfo; + + public CrownInfoFiler(Main plugin) + { + super(plugin, VERSION); + } + + public void save() + { + File tmp = null; + + try + { + File file = plugin.getDataFileManager().createCrownInfoFileIfNotExists(); + tmp = new File(file.getParent(), "." + file.getName() + ".tmp"); + + try + ( + FileOutputStream fileOut = new FileOutputStream(tmp); + DataOutputStream out = new DataOutputStream(fileOut) + ) + { + Writers.of(plugin, out, writeVersions(out)) + .getWriter(CrownInfoWriter.class) + .writeReferenceNotNull(crownInfo); + out.flush(); + } + + if(tmp.renameTo(file)) + { + plugin.getLogger().info(MessageFormat.format("File {0} saved! length={1}", + file.getName(), + file.length())); + } + else + { + throw new IOException("Failed to replace the old " + file.getName() + " file with the new one."); + } + } + catch(Exception e) + { + plugin.getLogger().log(Level.SEVERE, "Failed to create CrownInfo file.", e); + } + finally + { + FileUtil.deleteTempFile(tmp, plugin.getLogger()); + } + } + + public void load() throws Exception + { + if(crownInfo != null) + { + throw new Exception("CrownInfo is already loaded."); + } + + final File file = plugin.getDataFileManager().getCrownInfoFile(); + + if(!file.exists() || file.length() == 0L) + { + plugin.getLogger().warning(MessageFormat.format("{0} file is empty or not exists! Loading empty CrownInfo!", file.getName())); + this.crownInfo = new CrownInfo(plugin); + return; + } + + try + ( + FileInputStream fileIn = new FileInputStream(file); + DataInputStream in = new DataInputStream(fileIn) + ) + { + this.crownInfo = Readers.of(plugin, in, readVersions(in)) + .getReader(CrownInfoReader.class) + .readReference(plugin); + plugin.getLogger().info(MessageFormat.format("CrownInfo data loaded! crownInfo={0}", crownInfo)); + } + catch(Exception e) + { + throw new Exception("Failed to load CrownInfo!", e); + } + } + + @Override + protected ObjectType[] getObjectTypes(byte version) throws InvalidVersionException + { + return switch(version) + { + case 0 -> OBJECT_TYPES_V0; + default -> throw new InvalidVersionException(MessageFormat.format( + "Invalid {0} version: {1}", + getClass().getSimpleName(), + version)); + }; + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/filer/RawMaterialMapFiler.java b/plugin/src/main/java/com/eul4/externalizer/filer/RawMaterialMapFiler.java new file mode 100644 index 00000000..ae2b9b7a --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/filer/RawMaterialMapFiler.java @@ -0,0 +1,133 @@ +package com.eul4.externalizer.filer; + +import com.eul4.Main; +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.type.player.CommonObjectType; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.type.player.Writers; +import com.eul4.common.util.FileUtil; +import com.eul4.externalizer.reader.RawMaterialMapReader; +import com.eul4.externalizer.writer.RawMaterialMapWriter; +import com.eul4.type.player.PluginObjectType; +import com.eul4.wrapper.RawMaterialMap; +import com.google.common.io.ByteStreams; +import lombok.Getter; + +import java.io.*; +import java.text.MessageFormat; +import java.util.logging.Level; + +public class RawMaterialMapFiler extends PluginFiler +{ + private static final byte VERSION = 0; + + private static final ObjectType[] + + OBJECT_TYPES_V0 = new ObjectType[] + { + CommonObjectType.BIG_DECIMAL, + CommonObjectType.OBJECT, + PluginObjectType.CRYPTO_INFO, + PluginObjectType.RAW_MATERIAL, + PluginObjectType.RAW_MATERIAL_MAP, + }; + + @Getter + private RawMaterialMap rawMaterialMap; + + public RawMaterialMapFiler(Main plugin) + { + super(plugin, VERSION); + } + + public void save() + { + File tmp = null; + + try + { + File file = plugin.getDataFileManager().createRawMaterialMapFileIfNotExists(); + tmp = new File(file.getParent(), "." + file.getName() + ".tmp"); + + try + ( + FileOutputStream fileOut = new FileOutputStream(tmp); + BufferedOutputStream bufferedOut = new BufferedOutputStream(fileOut, BUFFER_SIZE); + DataOutputStream out = new DataOutputStream(bufferedOut); + ) + { + Writers.of(plugin, out, writeVersions(out)) + .getWriter(RawMaterialMapWriter.class) + .writeReferenceNotNull(rawMaterialMap); + out.flush(); + } + + if(tmp.renameTo(file)) + { + plugin.getLogger().info(MessageFormat.format("File {0} saved! length={1}", + file.getName(), + file.length())); + } + else + { + throw new IOException("Failed to replace the old " + file.getName() + " file with the new one."); + } + } + catch(Exception e) + { + plugin.getLogger().log(Level.SEVERE, "Failed to create raw_material_map.dat file.", e); + } + finally + { + FileUtil.deleteTempFile(tmp, plugin.getLogger()); + } + } + + public void load() throws Exception + { + if(rawMaterialMap != null) + { + throw new Exception("RawMaterialMap is already loaded."); + } + + final File file = plugin.getDataFileManager().getRawMaterialMapFile(); + + if(!file.exists() || file.length() == 0L) + { + plugin.getLogger().warning(MessageFormat.format("{0} file is empty or not exists! Loading empty RawMaterialMap!", file.getName())); + this.rawMaterialMap = new RawMaterialMap(); + return; + } + + try + ( + FileInputStream fileInputStream = new FileInputStream(file); + BufferedInputStream bufferedIn = new BufferedInputStream(fileInputStream); + DataInputStream in = new DataInputStream(bufferedIn); + ) + { + this.rawMaterialMap = Readers.of(plugin, in, readVersions(in)) + .getReader(RawMaterialMapReader.class) + .readReference(); + plugin.getLogger().info(MessageFormat.format("RawMaterialMap data loaded! size={0}", rawMaterialMap.getMap().size())); + } + catch(Exception e) + { + throw new Exception("Failed to load RawMaterialMap!", e); + } + } + + @Override + protected ObjectType[] getObjectTypes(byte version) throws InvalidVersionException + { + return switch(version) + { + case 0 -> OBJECT_TYPES_V0; + default -> throw new InvalidVersionException(MessageFormat.format( + "Invalid {0} version: {1}", + getClass().getSimpleName(), + version)); + }; + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/filer/TownsFiler.java b/plugin/src/main/java/com/eul4/externalizer/filer/TownsFiler.java index a01a8e27..038d9a6f 100644 --- a/plugin/src/main/java/com/eul4/externalizer/filer/TownsFiler.java +++ b/plugin/src/main/java/com/eul4/externalizer/filer/TownsFiler.java @@ -19,7 +19,7 @@ public class TownsFiler extends PluginFiler { - private static final byte VERSION = 1; + private static final byte VERSION = 3; private static final ObjectType[] OBJECT_TYPES_V0 = new ObjectType[] { @@ -53,11 +53,86 @@ public class TownsFiler extends PluginFiler PluginObjectType.TOWN_TILE_MAP, PluginObjectType.TOWN_TILE, PluginObjectType.TURRET, - }; + }, + + OBJECT_TYPES_V1 = new ObjectType[] + { + CommonObjectType.BLOCK, + CommonObjectType.CHUNK, + CommonObjectType.ENTITY, + CommonObjectType.HOLOGRAM, + CommonObjectType.INVENTORY, + CommonObjectType.ITEM_STACK, + CommonObjectType.LOCATION, + CommonObjectType.OBJECT, + CommonObjectType.TRANSLATED_HOLOGRAM_LINE, + PluginObjectType.ARMORY, + PluginObjectType.BOUGHT_TILE_MAP_BY_DEPTH, + PluginObjectType.CANNON, + PluginObjectType.DEPOSIT, + PluginObjectType.DISLIKE_DEPOSIT, + PluginObjectType.DISLIKE_GENERATOR, + PluginObjectType.GENERATOR, + PluginObjectType.GENERIC_STRUCTURE, + PluginObjectType.LIKE_DEPOSIT, + PluginObjectType.LIKE_GENERATOR, + PluginObjectType.STRUCTURE, + PluginObjectType.STRUCTURE_MAP, + PluginObjectType.TOWN_BLOCK_MAP, + PluginObjectType.TOWN_BLOCK, + PluginObjectType.TOWN_BLOCK_SET, + PluginObjectType.TOWN_HALL, + PluginObjectType.TOWN_MAP, + PluginObjectType.TOWN, + PluginObjectType.TOWN_TILE_MAP, + PluginObjectType.TOWN_TILE, + PluginObjectType.TURRET, + PluginObjectType.VECTOR_3, + }, + + OBJECT_TYPES_V2 = new ObjectType[] + { + CommonObjectType.BLOCK, + CommonObjectType.BIG_DECIMAL, + CommonObjectType.CHUNK, + CommonObjectType.ENTITY, + CommonObjectType.HOLOGRAM, + CommonObjectType.INVENTORY, + CommonObjectType.ITEM_STACK, + CommonObjectType.LOCATION, + CommonObjectType.OBJECT, + CommonObjectType.TRANSLATED_HOLOGRAM_LINE, + PluginObjectType.ARMORY, + PluginObjectType.BOUGHT_TILE_MAP_BY_DEPTH, + PluginObjectType.CANNON, + PluginObjectType.CAPACITATED_CROWN_HOLDER, + PluginObjectType.CROWN_DEPOSIT, + PluginObjectType.DEPOSIT, + PluginObjectType.DISLIKE_DEPOSIT, + PluginObjectType.DISLIKE_GENERATOR, + PluginObjectType.GENERATOR, + PluginObjectType.GENERIC_STRUCTURE, + PluginObjectType.LIKE_DEPOSIT, + PluginObjectType.LIKE_GENERATOR, + PluginObjectType.PHYSICAL_DEPOSIT, + PluginObjectType.STRUCTURE, + PluginObjectType.STRUCTURE_MAP, + PluginObjectType.TOWN_BLOCK_MAP, + PluginObjectType.TOWN_BLOCK, + PluginObjectType.TOWN_BLOCK_SET, + PluginObjectType.TOWN_HALL, + PluginObjectType.TOWN_MAP, + PluginObjectType.TOWN, + PluginObjectType.TOWN_TILE_MAP, + PluginObjectType.TOWN_TILE, + PluginObjectType.TURRET, + PluginObjectType.VECTOR_3, + }, - private static final ObjectType[] OBJECT_TYPES_V1 = new ObjectType[] + OBJECT_TYPES_V3 = new ObjectType[] { CommonObjectType.BLOCK, + CommonObjectType.BIG_DECIMAL, CommonObjectType.CHUNK, CommonObjectType.ENTITY, CommonObjectType.HOLOGRAM, @@ -66,9 +141,12 @@ public class TownsFiler extends PluginFiler CommonObjectType.LOCATION, CommonObjectType.OBJECT, CommonObjectType.TRANSLATED_HOLOGRAM_LINE, + CommonObjectType.UUID, PluginObjectType.ARMORY, PluginObjectType.BOUGHT_TILE_MAP_BY_DEPTH, PluginObjectType.CANNON, + PluginObjectType.CAPACITATED_CROWN_HOLDER, + PluginObjectType.CROWN_DEPOSIT, PluginObjectType.DEPOSIT, PluginObjectType.DISLIKE_DEPOSIT, PluginObjectType.DISLIKE_GENERATOR, @@ -76,6 +154,7 @@ public class TownsFiler extends PluginFiler PluginObjectType.GENERIC_STRUCTURE, PluginObjectType.LIKE_DEPOSIT, PluginObjectType.LIKE_GENERATOR, + PluginObjectType.PHYSICAL_DEPOSIT, PluginObjectType.STRUCTURE, PluginObjectType.STRUCTURE_MAP, PluginObjectType.TOWN_BLOCK_MAP, @@ -216,6 +295,8 @@ protected ObjectType[] getObjectTypes(byte version) throws InvalidVersionExcepti { case 0 -> OBJECT_TYPES_V0; case 1 -> OBJECT_TYPES_V1; + case 2 -> OBJECT_TYPES_V2; + case 3 -> OBJECT_TYPES_V3; default -> throw new InvalidVersionException(MessageFormat.format( "Invalid {0} version: {1}", getClass().getSimpleName(), diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/AdminReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/AdminReader.java index 2f364f32..fed14ba6 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/AdminReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/AdminReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftAdmin; -import com.eul4.model.player.Admin; +import com.eul4.model.player.physical.Admin; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/AttackerReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/AttackerReader.java index 51695fd1..91b37150 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/AttackerReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/AttackerReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftAttacker; -import com.eul4.model.player.Attacker; +import com.eul4.model.player.spiritual.Attacker; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/BoughtTileMapByDepthReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/BoughtTileMapByDepthReader.java index e90f95e7..0e67ff19 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/BoughtTileMapByDepthReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/BoughtTileMapByDepthReader.java @@ -8,7 +8,6 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.town.Town; -import com.eul4.model.town.TownBlock; import com.eul4.type.player.PluginObjectType; import com.eul4.wrapper.BoughtTileMapByDepth; import lombok.Getter; @@ -43,7 +42,7 @@ private Readable parameterizedReadableVersion0(Town town) { return () -> { - BoughtTileMapByDepth boughtTileMapByDepth = new BoughtTileMapByDepth(town.getOwnerUUID()); + BoughtTileMapByDepth boughtTileMapByDepth = new BoughtTileMapByDepth(town.getOwnerUniqueId()); int size = in.readInt(); diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/CapacitatedCrownHolderReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/CapacitatedCrownHolderReader.java new file mode 100644 index 00000000..f06f9d21 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/reader/CapacitatedCrownHolderReader.java @@ -0,0 +1,61 @@ +package com.eul4.externalizer.reader; + +import com.eul4.Main; +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.externalizer.reader.BigDecimalReader; +import com.eul4.common.externalizer.reader.ObjectReader; +import com.eul4.common.externalizer.reader.UUIDReader; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.wrapper.ParameterizedReadable; +import com.eul4.common.wrapper.Readable; +import com.eul4.common.wrapper.Reader; +import com.eul4.holder.CapacitatedCrownHolder; +import com.eul4.type.player.PluginObjectType; +import lombok.Getter; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.UUID; + +public class CapacitatedCrownHolderReader extends ObjectReader +{ + @Getter + private final Reader reader; + private final ParameterizedReadable parameterizedReadable; + + public CapacitatedCrownHolderReader(Readers readers) throws InvalidVersionException + { + super(readers, CapacitatedCrownHolder.class); + + final ObjectType objectType = PluginObjectType.CAPACITATED_CROWN_HOLDER; + final byte version = readers.getVersions().get(objectType); + + switch(version) + { + case 0: + this.reader = Reader.identity(); + this.parameterizedReadable = this::parameterizedReadableVersion0; + break; + default: + throw new InvalidVersionException("Invalid " + objectType + " version: " + version); + } + } + + private Readable parameterizedReadableVersion0(Main plugin) + { + return () -> + { + UUID townUniqueId = readers.getReader(UUIDReader.class).readReference(); + UUID structureUniqueId = readers.getReader(UUIDReader.class).readReference(); + BigDecimal balance = readers.getReader(BigDecimalReader.class).readReference(); + + return new CapacitatedCrownHolder(plugin, townUniqueId, structureUniqueId, balance); + }; + } + + public CapacitatedCrownHolder readReference(Main plugin) throws IOException, ClassNotFoundException + { + return super.readReference(parameterizedReadable.getReadable(plugin)); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/CheckpointStepEnumReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/CheckpointStepEnumReader.java index db89e6b9..eb0e1e93 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/CheckpointStepEnumReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/CheckpointStepEnumReader.java @@ -1,19 +1,14 @@ package com.eul4.externalizer.reader; -import com.eul4.Main; -import com.eul4.common.Common; import com.eul4.common.exception.InvalidVersionException; import com.eul4.common.externalizer.reader.ObjectReader; import com.eul4.common.type.player.ObjectType; import com.eul4.common.type.player.Readers; import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; -import com.eul4.model.craft.player.CraftTutorialTownPlayer; -import com.eul4.model.player.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.type.player.PluginObjectType; import lombok.Getter; -import org.bukkit.entity.Player; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/CrownDepositReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/CrownDepositReader.java new file mode 100644 index 00000000..daf36b54 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/reader/CrownDepositReader.java @@ -0,0 +1,60 @@ +package com.eul4.externalizer.reader; + +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.wrapper.ParameterizedReadable; +import com.eul4.common.wrapper.Readable; +import com.eul4.common.wrapper.Reader; +import com.eul4.model.craft.town.structure.CraftCrownDeposit; +import com.eul4.model.town.Town; +import com.eul4.model.town.structure.CrownDeposit; +import com.eul4.type.player.PluginObjectType; +import lombok.Getter; + +import java.io.IOException; +import java.math.BigDecimal; + +@Getter +public class CrownDepositReader extends PhysicalDepositReader +{ + private final Reader reader; + private final ParameterizedReadable parameterizedReadable; + + public CrownDepositReader(Readers readers) throws InvalidVersionException + { + super(readers, CrownDeposit.class); + + final ObjectType objectType = PluginObjectType.CROWN_DEPOSIT; + final byte version = readers.getVersions().get(objectType); + + switch(version) + { + case 0: + this.reader = this::readerVersion0; + this.parameterizedReadable = this::parameterizedReadableVersion0; + break; + default: + throw new InvalidVersionException("Invalid " + objectType + " version: " + version); + } + } + + private void readerVersion0(CrownDeposit crownDeposit) throws IOException, ClassNotFoundException + { + super.getReader().readObject(crownDeposit); + + crownDeposit.setHolder(readers.getReader(CapacitatedCrownHolderReader.class) + .readReference(crownDeposit.getTown().getPlugin())); + } + + private Readable parameterizedReadableVersion0(Town town) + { + return () -> new CraftCrownDeposit(town); + } + + @Override + public CrownDeposit readReference(Town town) throws IOException, ClassNotFoundException + { + return super.readReference(parameterizedReadable.getReadable(town)); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/CrownInfoReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/CrownInfoReader.java new file mode 100644 index 00000000..ebfb0b8b --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/reader/CrownInfoReader.java @@ -0,0 +1,62 @@ +package com.eul4.externalizer.reader; + +import com.eul4.Main; +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.externalizer.reader.ObjectReader; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.wrapper.ParameterizedReadable; +import com.eul4.common.wrapper.Readable; +import com.eul4.common.wrapper.Reader; +import com.eul4.holder.UnlimitedCrownHolder; +import com.eul4.type.player.PluginObjectType; +import com.eul4.wrapper.CrownInfo; +import lombok.Getter; + +import java.io.IOException; + +public class CrownInfoReader extends ObjectReader +{ + @Getter + private final Reader reader; + private final ParameterizedReadable parameterizedReadable; + + public CrownInfoReader(Readers readers) throws InvalidVersionException + { + super(readers, CrownInfo.class); + + final ObjectType objectType = PluginObjectType.CROWN_INFO; + final byte version = readers.getVersions().get(objectType); + + switch(version) + { + case 0: + this.reader = Reader.identity(); + this.parameterizedReadable = this::parameterizedReadableVersion0; + break; + default: + throw new InvalidVersionException("Invalid " + objectType + " version: " + version); + } + } + + private Readable parameterizedReadableVersion0(Main plugin) + { + return () -> + { + UnlimitedCrownHolderReader unlimitedCrownHolderReader = readers + .getReader(UnlimitedCrownHolderReader.class); + + UnlimitedCrownHolder serverTreasure = unlimitedCrownHolderReader.readReference(plugin); + UnlimitedCrownHolder jackpot = unlimitedCrownHolderReader.readReference(plugin); + UnlimitedCrownHolder townHallVault = unlimitedCrownHolderReader.readReference(plugin); + UnlimitedCrownHolder eul4Insights = unlimitedCrownHolderReader.readReference(plugin); + + return new CrownInfo(serverTreasure, jackpot, townHallVault, eul4Insights); + }; + } + + public CrownInfo readReference(Main plugin) throws IOException, ClassNotFoundException + { + return super.readReference(parameterizedReadable.getReadable(plugin)); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/CryptoInfoReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/CryptoInfoReader.java new file mode 100644 index 00000000..0e1903fe --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/reader/CryptoInfoReader.java @@ -0,0 +1,55 @@ +package com.eul4.externalizer.reader; + +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.externalizer.reader.BigDecimalReader; +import com.eul4.common.externalizer.reader.ObjectReader; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.wrapper.Readable; +import com.eul4.common.wrapper.Reader; +import com.eul4.type.player.PluginObjectType; +import com.eul4.wrapper.CryptoInfo; +import lombok.Getter; + +import java.io.IOException; +import java.math.BigDecimal; + +public class CryptoInfoReader extends ObjectReader +{ + @Getter + private final Reader reader; + private final Readable readable; + + public CryptoInfoReader(Readers readers) throws InvalidVersionException + { + super(readers, CryptoInfo.class); + + final ObjectType objectType = PluginObjectType.CRYPTO_INFO; + final byte version = readers.getVersions().get(objectType); + + switch(version) + { + case 0: + this.reader = Reader.identity(); + this.readable = this::readableVersion0; + break; + default: + throw new InvalidVersionException("Invalid " + objectType + " version: " + version); + } + } + + private CryptoInfo readableVersion0() throws IOException, ClassNotFoundException + { + BigDecimalReader bigDecimalReader = readers.getReader(BigDecimalReader.class); + + BigDecimal marketCap = bigDecimalReader.readReference(); + BigDecimal circulatingSupply = bigDecimalReader.readReference(); + + return new CryptoInfo(marketCap, circulatingSupply); + } + + public CryptoInfo readReference() throws IOException, ClassNotFoundException + { + return super.readReference(readable); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/DefenderReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/DefenderReader.java index d4273265..6cf79e1b 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/DefenderReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/DefenderReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftDefender; -import com.eul4.model.player.Defender; +import com.eul4.model.player.spiritual.Defender; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/DefenderSpectatorReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/DefenderSpectatorReader.java index 4a328c85..8b1e9a53 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/DefenderSpectatorReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/DefenderSpectatorReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftDefenderSpectator; -import com.eul4.model.player.DefenderSpectator; +import com.eul4.model.player.spiritual.DefenderSpectator; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/InventoryOrganizerPlayerReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/InventoryOrganizerPlayerReader.java index 6c749782..19ea17f7 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/InventoryOrganizerPlayerReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/InventoryOrganizerPlayerReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftInventoryOrganizerPlayer; -import com.eul4.model.player.InventoryOrganizerPlayer; +import com.eul4.model.player.spiritual.InventoryOrganizerPlayer; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/PhysicalDepositReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/PhysicalDepositReader.java new file mode 100644 index 00000000..e322dc41 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/reader/PhysicalDepositReader.java @@ -0,0 +1,39 @@ +package com.eul4.externalizer.reader; + +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.wrapper.Reader; +import com.eul4.model.town.structure.PhysicalDeposit; +import com.eul4.type.player.PluginObjectType; +import lombok.Getter; + +import java.io.IOException; + +@Getter +public abstract class PhysicalDepositReader, D extends PhysicalDeposit> extends StructureReader +{ + private final Reader reader; + + public PhysicalDepositReader(Readers readers, Class type) throws InvalidVersionException + { + super(readers, type); + + final ObjectType objectType = PluginObjectType.PHYSICAL_DEPOSIT; + final byte version = readers.getVersions().get(objectType); + + switch(version) + { + case 0: + this.reader = this::readerVersion0; + break; + default: + throw new InvalidVersionException("Invalid " + objectType + " version: " + version); + } + } + + private void readerVersion0(D physicalDeposit) throws IOException, ClassNotFoundException + { + super.getReader().readObject(physicalDeposit); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/RaidAnalyzerReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/RaidAnalyzerReader.java index 213712e2..83c0ce7f 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/RaidAnalyzerReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/RaidAnalyzerReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftRaidAnalyzer; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/RaidSpectatorReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/RaidSpectatorReader.java index 2e1f043e..3bbb20d0 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/RaidSpectatorReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/RaidSpectatorReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftRaidSpectator; -import com.eul4.model.player.RaidSpectator; +import com.eul4.model.player.spiritual.RaidSpectator; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/RawMaterialMapReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/RawMaterialMapReader.java new file mode 100644 index 00000000..092d589c --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/reader/RawMaterialMapReader.java @@ -0,0 +1,62 @@ +package com.eul4.externalizer.reader; + +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.externalizer.reader.ObjectReader; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.wrapper.Readable; +import com.eul4.common.wrapper.Reader; +import com.eul4.type.player.PluginObjectType; +import com.eul4.wrapper.CryptoInfo; +import com.eul4.wrapper.RawMaterial; +import com.eul4.wrapper.RawMaterialMap; +import lombok.Getter; +import org.bukkit.Material; + +import java.io.IOException; + +public class RawMaterialMapReader extends ObjectReader +{ + @Getter + private final Reader reader; + private final Readable readable; + + public RawMaterialMapReader(Readers readers) throws InvalidVersionException + { + super(readers, RawMaterialMap.class); + + final ObjectType objectType = PluginObjectType.RAW_MATERIAL_MAP; + final byte version = readers.getVersions().get(objectType); + + switch(version) + { + case 0: + this.reader = Reader.identity(); + this.readable = this::readableVersion0; + break; + default: + throw new InvalidVersionException("Invalid " + objectType + " version: " + version); + } + } + + private RawMaterialMap readableVersion0() throws IOException, ClassNotFoundException + { + RawMaterialReader rawMaterialReader = readers.getReader(RawMaterialReader.class); + + RawMaterialMap rawMaterialMap = new RawMaterialMap(); + + int size = in.readInt(); + + for(int i = 0; i < size; i++) + { + rawMaterialMap.put(rawMaterialReader.readReference()); + } + + return rawMaterialMap; + } + + public RawMaterialMap readReference() throws IOException, ClassNotFoundException + { + return super.readReference(readable); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/RawMaterialReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/RawMaterialReader.java new file mode 100644 index 00000000..cacecc77 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/reader/RawMaterialReader.java @@ -0,0 +1,57 @@ +package com.eul4.externalizer.reader; + +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.externalizer.reader.BigDecimalReader; +import com.eul4.common.externalizer.reader.ObjectReader; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.wrapper.Readable; +import com.eul4.common.wrapper.Reader; +import com.eul4.type.player.PluginObjectType; +import com.eul4.wrapper.CryptoInfo; +import com.eul4.wrapper.RawMaterial; +import lombok.Getter; +import org.bukkit.Material; + +import java.io.IOException; +import java.math.BigDecimal; + +public class RawMaterialReader extends ObjectReader +{ + @Getter + private final Reader reader; + private final Readable readable; + + public RawMaterialReader(Readers readers) throws InvalidVersionException + { + super(readers, RawMaterial.class); + + final ObjectType objectType = PluginObjectType.RAW_MATERIAL; + final byte version = readers.getVersions().get(objectType); + + switch(version) + { + case 0: + this.reader = Reader.identity(); + this.readable = this::readableVersion0; + break; + default: + throw new InvalidVersionException("Invalid " + objectType + " version: " + version); + } + } + + private RawMaterial readableVersion0() throws IOException, ClassNotFoundException + { + CryptoInfoReader cryptoInfoReader = readers.getReader(CryptoInfoReader.class); + + Material material = Material.getMaterial(in.readUTF()); + CryptoInfo cryptoInfo = cryptoInfoReader.readReference(); + + return new RawMaterial(material, cryptoInfo); + } + + public RawMaterial readReference() throws IOException, ClassNotFoundException + { + return super.readReference(readable); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/SpawnPlayerReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/SpawnPlayerReader.java index ae8d4c0e..2fc2dd08 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/SpawnPlayerReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/SpawnPlayerReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftSpawnPlayer; -import com.eul4.model.player.SpawnPlayer; +import com.eul4.model.player.physical.SpawnPlayer; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/StructureMapReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/StructureMapReader.java index ad3e5312..3750cc7b 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/StructureMapReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/StructureMapReader.java @@ -43,7 +43,7 @@ private Readable parameterizedReadableVersion0(Town town) { return () -> { - StructureMap structureMap = new StructureMap(town.getOwnerUUID()); + StructureMap structureMap = new StructureMap(town.getOwnerUniqueId()); int size = in.readInt(); diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/TownHallReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/TownHallReader.java index 62770184..84cd52d0 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/TownHallReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/TownHallReader.java @@ -34,6 +34,10 @@ public TownHallReader(Readers readers) throws InvalidVersionException this.reader = this::readerVersion0; this.parameterizedReadable = this::parameterizedReadableVersion0; break; + case 1: + this.reader = this::readerVersion1; + this.parameterizedReadable = this::parameterizedReadableVersion0; + break; default: throw new InvalidVersionException("Invalid " + objectType + " version: " + version); } @@ -42,6 +46,16 @@ public TownHallReader(Readers readers) throws InvalidVersionException private void readerVersion0(TownHall townHall) throws IOException, ClassNotFoundException { super.getReader().readObject(townHall); + + townHall.setDefaultCapacitatedCrownHolder(); + } + + private void readerVersion1(TownHall townHall) throws IOException, ClassNotFoundException + { + super.getReader().readObject(townHall); + + townHall.setCapacitatedCrownHolder(readers.getReader(CapacitatedCrownHolderReader.class) + .readReference(townHall.getTown().getPlugin())); } private Readable parameterizedReadableVersion0(Town town) diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/TownMapReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/TownMapReader.java index a255226c..e58f1faf 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/TownMapReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/TownMapReader.java @@ -50,7 +50,7 @@ private Readable parameterizedReadableVersion0(Main plugin) for(int i = 0; i < size; i++) { Town town = readers.getReader(TownReader.class).readReference(plugin); - towns.put(town.getOwnerUUID(), town); + towns.put(town.getOwnerUniqueId(), town); } return towns; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/TownPlayerReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/TownPlayerReader.java index ded89250..f1b6da8f 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/TownPlayerReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/TownPlayerReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftTownPlayer; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/TownReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/TownReader.java index 6bceaf25..6c066e73 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/TownReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/TownReader.java @@ -5,6 +5,7 @@ import com.eul4.common.externalizer.reader.BlockReader; import com.eul4.common.externalizer.reader.EntityReader; import com.eul4.common.externalizer.reader.ObjectReader; +import com.eul4.common.externalizer.reader.UUIDReader; import com.eul4.common.type.player.ObjectType; import com.eul4.common.type.player.Readers; import com.eul4.common.wrapper.ParameterizedReadable; @@ -50,6 +51,10 @@ public TownReader(Readers readers) throws InvalidVersionException this.reader = this::readerVersion3; this.parameterizedReadable = this::parameterizedReadableVersion0; break; + case 4: + this.reader = this::readerVersion3; + this.parameterizedReadable = this::parameterizedReadableVersion1; + break; default: throw new InvalidVersionException("Invalid " + objectType + " version: " + version); } @@ -62,6 +67,16 @@ private Readable parameterizedReadableVersion0(Main plugin) plugin); } + private Readable parameterizedReadableVersion1(Main plugin) + { + UUIDReader uuidReader = readers.getReader(UUIDReader.class); + + return () -> new CraftTown(uuidReader.readReference(), + uuidReader.readReference(), + readers.getReader(BlockReader.class).readReference(plugin), + plugin); + } + private void readerVersion0(Town town) throws IOException, ClassNotFoundException { town.setTownBlockMap(readers.getReader(TownBlockMapReader.class).readReference(town)); diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/TutorialTownPlayerReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/TutorialTownPlayerReader.java index d3f1c93b..8e49d3db 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/TutorialTownPlayerReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/TutorialTownPlayerReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftTutorialTownPlayer; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/UnlimitedCrownHolderReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/UnlimitedCrownHolderReader.java new file mode 100644 index 00000000..c3fa0307 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/reader/UnlimitedCrownHolderReader.java @@ -0,0 +1,60 @@ +package com.eul4.externalizer.reader; + +import com.eul4.Main; +import com.eul4.common.exception.InvalidVersionException; +import com.eul4.common.externalizer.reader.BigDecimalReader; +import com.eul4.common.externalizer.reader.ObjectReader; +import com.eul4.common.externalizer.reader.UUIDReader; +import com.eul4.common.type.player.ObjectType; +import com.eul4.common.type.player.Readers; +import com.eul4.common.wrapper.ParameterizedReadable; +import com.eul4.common.wrapper.Readable; +import com.eul4.common.wrapper.Reader; +import com.eul4.holder.UnlimitedCrownHolder; +import com.eul4.type.player.PluginObjectType; +import lombok.Getter; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.UUID; + +public class UnlimitedCrownHolderReader extends ObjectReader +{ + @Getter + private final Reader reader; + private final ParameterizedReadable parameterizedReadable; + + public UnlimitedCrownHolderReader(Readers readers) throws InvalidVersionException + { + super(readers, UnlimitedCrownHolder.class); + + final ObjectType objectType = PluginObjectType.UNLIMITED_CROWN_HOLDER; + final byte version = readers.getVersions().get(objectType); + + switch(version) + { + case 0: + this.reader = Reader.identity(); + this.parameterizedReadable = this::parameterizedReadableVersion0; + break; + default: + throw new InvalidVersionException("Invalid " + objectType + " version: " + version); + } + } + + private Readable parameterizedReadableVersion0(Main plugin) + { + return () -> + { + UUID uniqueId = readers.getReader(UUIDReader.class).readReference(); + BigDecimal balance = readers.getReader(BigDecimalReader.class).readReference(); + + return new UnlimitedCrownHolder(plugin, uniqueId, balance); + }; + } + + public UnlimitedCrownHolder readReference(Main plugin) throws IOException, ClassNotFoundException + { + return super.readReference(parameterizedReadable.getReadable(plugin)); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/reader/VanillaPlayerReader.java b/plugin/src/main/java/com/eul4/externalizer/reader/VanillaPlayerReader.java index 7a0920ec..f06a576a 100644 --- a/plugin/src/main/java/com/eul4/externalizer/reader/VanillaPlayerReader.java +++ b/plugin/src/main/java/com/eul4/externalizer/reader/VanillaPlayerReader.java @@ -9,7 +9,7 @@ import com.eul4.common.wrapper.Readable; import com.eul4.common.wrapper.Reader; import com.eul4.model.craft.player.CraftVanillaPlayer; -import com.eul4.model.player.VanillaPlayer; +import com.eul4.model.player.physical.VanillaPlayer; import com.eul4.type.player.PluginObjectType; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/AdminWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/AdminWriter.java index db319a93..4027d742 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/AdminWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/AdminWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.Admin; +import com.eul4.model.player.physical.Admin; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/AttackerWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/AttackerWriter.java index 710922f2..3b6dca35 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/AttackerWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/AttackerWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.Attacker; +import com.eul4.model.player.spiritual.Attacker; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/CapacitatedCrownHolderWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/CapacitatedCrownHolderWriter.java new file mode 100644 index 00000000..a233aae4 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/writer/CapacitatedCrownHolderWriter.java @@ -0,0 +1,28 @@ +package com.eul4.externalizer.writer; + +import com.eul4.common.externalizer.writer.BigDecimalWriter; +import com.eul4.common.externalizer.writer.ObjectWriter; +import com.eul4.common.externalizer.writer.UUIDWriter; +import com.eul4.common.type.player.Writers; +import com.eul4.holder.CapacitatedCrownHolder; + +import java.io.IOException; + +public class CapacitatedCrownHolderWriter extends ObjectWriter +{ + public CapacitatedCrownHolderWriter(Writers writers) + { + super(writers, CapacitatedCrownHolder.class); + } + + @Override + protected void writeObject(CapacitatedCrownHolder capacitatedCrownHolder) throws IOException + { + UUIDWriter uuidWriter = writers.getWriter(UUIDWriter.class); + BigDecimalWriter bigDecimalWriter = writers.getWriter(BigDecimalWriter.class); + + uuidWriter.writeReferenceNotNull(capacitatedCrownHolder.getTownUniqueId()); + uuidWriter.writeReferenceNotNull(capacitatedCrownHolder.getStructureUniqueId()); + bigDecimalWriter.writeReferenceNotNull(capacitatedCrownHolder.getBalance()); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/CrownDepositWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/CrownDepositWriter.java new file mode 100644 index 00000000..ebf84333 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/writer/CrownDepositWriter.java @@ -0,0 +1,25 @@ +package com.eul4.externalizer.writer; + +import com.eul4.common.type.player.Writers; +import com.eul4.model.town.structure.CrownDeposit; +import com.eul4.model.town.structure.LikeDeposit; + +import java.io.IOException; +import java.math.BigDecimal; + +public class CrownDepositWriter extends PhysicalDepositWriter +{ + public CrownDepositWriter(Writers writers) + { + super(writers, CrownDeposit.class); + } + + @Override + protected void writeObject(CrownDeposit crownDeposit) throws IOException + { + super.writeObject(crownDeposit); + + writers.getWriter(CapacitatedCrownHolderWriter.class) + .writeReferenceNotNull(crownDeposit.getCapacitatedCrownHolder()); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/CrownInfoWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/CrownInfoWriter.java new file mode 100644 index 00000000..98e2b81b --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/writer/CrownInfoWriter.java @@ -0,0 +1,29 @@ +package com.eul4.externalizer.writer; + +import com.eul4.common.externalizer.writer.BigDecimalWriter; +import com.eul4.common.externalizer.writer.ObjectWriter; +import com.eul4.common.type.player.Writers; +import com.eul4.wrapper.CrownInfo; +import com.eul4.wrapper.CryptoInfo; + +import java.io.IOException; + +public class CrownInfoWriter extends ObjectWriter +{ + public CrownInfoWriter(Writers writers) + { + super(writers, CrownInfo.class); + } + + @Override + protected void writeObject(CrownInfo crownInfo) throws IOException + { + UnlimitedCrownHolderWriter unlimitedCrownHolderWriter = writers + .getWriter(UnlimitedCrownHolderWriter.class); + + unlimitedCrownHolderWriter.writeReferenceNotNull(crownInfo.getServerTreasure()); + unlimitedCrownHolderWriter.writeReferenceNotNull(crownInfo.getJackpot()); + unlimitedCrownHolderWriter.writeReferenceNotNull(crownInfo.getTownHallVault()); + unlimitedCrownHolderWriter.writeReferenceNotNull(crownInfo.getEul4Insights()); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/CryptoInfoWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/CryptoInfoWriter.java new file mode 100644 index 00000000..a1ccbde2 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/writer/CryptoInfoWriter.java @@ -0,0 +1,25 @@ +package com.eul4.externalizer.writer; + +import com.eul4.common.externalizer.writer.BigDecimalWriter; +import com.eul4.common.externalizer.writer.ObjectWriter; +import com.eul4.common.type.player.Writers; +import com.eul4.wrapper.CryptoInfo; + +import java.io.IOException; + +public class CryptoInfoWriter extends ObjectWriter +{ + public CryptoInfoWriter(Writers writers) + { + super(writers, CryptoInfo.class); + } + + @Override + protected void writeObject(CryptoInfo cryptoInfo) throws IOException + { + BigDecimalWriter bigDecimalWriter = writers.getWriter(BigDecimalWriter.class); + + bigDecimalWriter.writeReferenceNotNull(cryptoInfo.getMarketCap()); + bigDecimalWriter.writeReferenceNotNull(cryptoInfo.getCirculatingSupply()); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/DefenderSpectatorWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/DefenderSpectatorWriter.java index 1a370324..a0faf112 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/DefenderSpectatorWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/DefenderSpectatorWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.DefenderSpectator; +import com.eul4.model.player.spiritual.DefenderSpectator; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/DefenderWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/DefenderWriter.java index 3ef9158b..8c709d3c 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/DefenderWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/DefenderWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.Defender; +import com.eul4.model.player.spiritual.Defender; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/InventoryOrganizerPlayerWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/InventoryOrganizerPlayerWriter.java index 067afecb..b0706766 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/InventoryOrganizerPlayerWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/InventoryOrganizerPlayerWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.InventoryOrganizerPlayer; +import com.eul4.model.player.spiritual.InventoryOrganizerPlayer; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/PhysicalDepositWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/PhysicalDepositWriter.java new file mode 100644 index 00000000..b4c6d950 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/writer/PhysicalDepositWriter.java @@ -0,0 +1,20 @@ +package com.eul4.externalizer.writer; + +import com.eul4.common.type.player.Writers; +import com.eul4.model.town.structure.PhysicalDeposit; + +import java.io.IOException; + +public abstract class PhysicalDepositWriter, D extends PhysicalDeposit> extends StructureWriter +{ + public PhysicalDepositWriter(Writers writers, Class type) + { + super(writers, type); + } + + @Override + protected void writeObject(D physicalDeposit) throws IOException + { + super.writeObject(physicalDeposit); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/RaidAnalyzerWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/RaidAnalyzerWriter.java index 52da339e..b372c915 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/RaidAnalyzerWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/RaidAnalyzerWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/RaidSpectatorWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/RaidSpectatorWriter.java index c0d4bbe7..361a6d5f 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/RaidSpectatorWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/RaidSpectatorWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.RaidSpectator; +import com.eul4.model.player.spiritual.RaidSpectator; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/RawMaterialMapWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/RawMaterialMapWriter.java new file mode 100644 index 00000000..966038bd --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/writer/RawMaterialMapWriter.java @@ -0,0 +1,33 @@ +package com.eul4.externalizer.writer; + +import com.eul4.common.externalizer.writer.ObjectWriter; +import com.eul4.common.type.player.Writers; +import com.eul4.wrapper.RawMaterial; +import com.eul4.wrapper.RawMaterialMap; +import org.bukkit.Material; + +import java.io.IOException; +import java.util.HashMap; + +public class RawMaterialMapWriter extends ObjectWriter +{ + public RawMaterialMapWriter(Writers writers) + { + super(writers, RawMaterialMap.class); + } + + @Override + protected void writeObject(RawMaterialMap rawMaterialMap) throws IOException + { + RawMaterialWriter rawMaterialWriter = writers.getWriter(RawMaterialWriter.class); + + HashMap map = rawMaterialMap.getMap(); + + out.writeInt(map.size()); + + for(RawMaterial rawMaterial : map.values()) + { + rawMaterialWriter.writeReference(rawMaterial); + } + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/RawMaterialWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/RawMaterialWriter.java new file mode 100644 index 00000000..6e131729 --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/writer/RawMaterialWriter.java @@ -0,0 +1,28 @@ +package com.eul4.externalizer.writer; + +import com.eul4.common.externalizer.writer.ObjectWriter; +import com.eul4.common.type.player.Writers; +import com.eul4.wrapper.RawMaterial; +import com.sk89q.worldedit.math.Vector3; +import org.bukkit.Material; + +import java.io.IOException; + +public class RawMaterialWriter extends ObjectWriter +{ + public RawMaterialWriter(Writers writers) + { + super(writers, RawMaterial.class); + } + + @Override + protected void writeObject(RawMaterial rawMaterial) throws IOException + { + CryptoInfoWriter cryptoInfoWriter = writers.getWriter(CryptoInfoWriter.class); + + Material material = rawMaterial.getMaterial(); + + out.writeUTF(material.name()); + cryptoInfoWriter.writeReference(rawMaterial.getCryptoInfo()); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/SpawnPlayerWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/SpawnPlayerWriter.java index b0717f68..7496739c 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/SpawnPlayerWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/SpawnPlayerWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.SpawnPlayer; +import com.eul4.model.player.physical.SpawnPlayer; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/TownHallWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/TownHallWriter.java index cb5047a8..4c3d28e2 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/TownHallWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/TownHallWriter.java @@ -16,5 +16,7 @@ public TownHallWriter(Writers writers) protected void writeObject(TownHall townHall) throws IOException { super.writeObject(townHall); + + writers.getWriter(CapacitatedCrownHolderWriter.class).writeReferenceNotNull(townHall.getCapacitatedCrownHolder()); } } diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/TownPlayerWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/TownPlayerWriter.java index 3edf52a3..e836702f 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/TownPlayerWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/TownPlayerWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/TownWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/TownWriter.java index d74432f3..443abb11 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/TownWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/TownWriter.java @@ -3,6 +3,7 @@ import com.eul4.common.externalizer.writer.BlockWriter; import com.eul4.common.externalizer.writer.EntityWriter; import com.eul4.common.externalizer.writer.ObjectWriter; +import com.eul4.common.externalizer.writer.UUIDWriter; import com.eul4.common.type.player.Writers; import com.eul4.model.town.Town; @@ -18,8 +19,10 @@ public TownWriter(Writers writers) @Override protected void writeObject(Town town) throws IOException { - out.writeLong(town.getOwnerUUID().getMostSignificantBits()); - out.writeLong(town.getOwnerUUID().getLeastSignificantBits()); + UUIDWriter uuidWriter = writers.getWriter(UUIDWriter.class); + + uuidWriter.writeReferenceNotNull(town.getTownUniqueId()); + uuidWriter.writeReferenceNotNull(town.getOwnerUniqueId()); writers.getWriter(BlockWriter.class).writeReference(town.getBlock()); writers.getWriter(TownBlockMapWriter.class).writeReference(town.getTownBlockMap()); diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/TutorialTownPlayerWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/TutorialTownPlayerWriter.java index 0c2cce75..7d6e0975 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/TutorialTownPlayerWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/TutorialTownPlayerWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/UnlimitedCrownHolderWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/UnlimitedCrownHolderWriter.java new file mode 100644 index 00000000..3949158e --- /dev/null +++ b/plugin/src/main/java/com/eul4/externalizer/writer/UnlimitedCrownHolderWriter.java @@ -0,0 +1,27 @@ +package com.eul4.externalizer.writer; + +import com.eul4.common.externalizer.writer.BigDecimalWriter; +import com.eul4.common.externalizer.writer.ObjectWriter; +import com.eul4.common.externalizer.writer.UUIDWriter; +import com.eul4.common.type.player.Writers; +import com.eul4.holder.UnlimitedCrownHolder; + +import java.io.IOException; + +public class UnlimitedCrownHolderWriter extends ObjectWriter +{ + public UnlimitedCrownHolderWriter(Writers writers) + { + super(writers, UnlimitedCrownHolder.class); + } + + @Override + protected void writeObject(UnlimitedCrownHolder unlimitedCrownHolder) throws IOException + { + UUIDWriter uuidWriter = writers.getWriter(UUIDWriter.class); + BigDecimalWriter bigDecimalWriter = writers.getWriter(BigDecimalWriter.class); + + uuidWriter.writeReferenceNotNull(unlimitedCrownHolder.getUniqueId()); + bigDecimalWriter.writeReferenceNotNull(unlimitedCrownHolder.getBalance()); + } +} diff --git a/plugin/src/main/java/com/eul4/externalizer/writer/VanillaPlayerWriter.java b/plugin/src/main/java/com/eul4/externalizer/writer/VanillaPlayerWriter.java index 2efa7c95..d2bf8da6 100644 --- a/plugin/src/main/java/com/eul4/externalizer/writer/VanillaPlayerWriter.java +++ b/plugin/src/main/java/com/eul4/externalizer/writer/VanillaPlayerWriter.java @@ -1,7 +1,7 @@ package com.eul4.externalizer.writer; import com.eul4.common.type.player.Writers; -import com.eul4.model.player.VanillaPlayer; +import com.eul4.model.player.physical.VanillaPlayer; import java.io.IOException; diff --git a/plugin/src/main/java/com/eul4/function/Operation.java b/plugin/src/main/java/com/eul4/function/Operation.java new file mode 100644 index 00000000..7031a208 --- /dev/null +++ b/plugin/src/main/java/com/eul4/function/Operation.java @@ -0,0 +1,7 @@ +package com.eul4.function; + +@FunctionalInterface +public interface Operation> +{ + void execute(N amount); +} diff --git a/plugin/src/main/java/com/eul4/function/StructureInstantiation.java b/plugin/src/main/java/com/eul4/function/StructureInstantiation.java index ee847ee1..39c00ff0 100644 --- a/plugin/src/main/java/com/eul4/function/StructureInstantiation.java +++ b/plugin/src/main/java/com/eul4/function/StructureInstantiation.java @@ -1,14 +1,11 @@ package com.eul4.function; -import com.eul4.exception.CannotConstructException; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.model.town.structure.Structure; -import java.io.IOException; - @FunctionalInterface public interface StructureInstantiation { - Structure newInstance(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException; + Structure newInstance(Town town, TownBlock centerTownBlock); } diff --git a/plugin/src/main/java/com/eul4/function/TradePreviewListCallable.java b/plugin/src/main/java/com/eul4/function/TradePreviewListCallable.java new file mode 100644 index 00000000..b22aa161 --- /dev/null +++ b/plugin/src/main/java/com/eul4/function/TradePreviewListCallable.java @@ -0,0 +1,18 @@ +package com.eul4.function; + +import com.eul4.exception.OverCapacityException; +import com.eul4.holder.Holder; +import com.eul4.wrapper.TradePreview; + +import java.util.List; + +@FunctionalInterface +public interface TradePreviewListCallable +< + N extends Number & Comparable, + H extends Holder, + TP extends TradePreview +> +{ + List call() throws OverCapacityException; +} diff --git a/plugin/src/main/java/com/eul4/function/TransactionCreator.java b/plugin/src/main/java/com/eul4/function/TransactionCreator.java new file mode 100644 index 00000000..f01a1350 --- /dev/null +++ b/plugin/src/main/java/com/eul4/function/TransactionCreator.java @@ -0,0 +1,10 @@ +package com.eul4.function; + +import com.eul4.economy.Transaction; +import com.eul4.exception.OverCapacityException; + +@FunctionalInterface +public interface TransactionCreator> +{ + Transaction createTransaction(N amount) throws OverCapacityException; +} diff --git a/plugin/src/main/java/com/eul4/function/TransactionalResourceFunction.java b/plugin/src/main/java/com/eul4/function/TransactionalResourceFunction.java new file mode 100644 index 00000000..5b68bc7f --- /dev/null +++ b/plugin/src/main/java/com/eul4/function/TransactionalResourceFunction.java @@ -0,0 +1,21 @@ +package com.eul4.function; + +import com.eul4.economy.Transaction; +import com.eul4.exception.OverCapacityException; +import com.eul4.holder.Holder; +import com.eul4.wrapper.TradePreview; + +import java.util.List; + +@FunctionalInterface +public interface TransactionalResourceFunction +{ + < + N extends Number & Comparable, + H1 extends Holder, + H2 extends Holder, + TP extends TradePreview + > + Transaction createTransaction(List tradePreviews, List

holdersTo) + throws OverCapacityException; +} diff --git a/plugin/src/main/java/com/eul4/holder/BigDecimalHolder.java b/plugin/src/main/java/com/eul4/holder/BigDecimalHolder.java new file mode 100644 index 00000000..456f20b8 --- /dev/null +++ b/plugin/src/main/java/com/eul4/holder/BigDecimalHolder.java @@ -0,0 +1,31 @@ +package com.eul4.holder; + +import com.eul4.exception.OperationException; + +import java.math.BigDecimal; + +public interface BigDecimalHolder extends Holder +{ + @Override BigDecimal getBalance(); + @Override void setBalance(BigDecimal balance) throws OperationException; + @Override void add(BigDecimal amount) throws OperationException; + @Override void subtract(BigDecimal amount) throws OperationException; + + @Override + default BigDecimal getZeroSample() + { + return BigDecimal.ZERO; + } + + @Override + default BigDecimal subtractSample(BigDecimal minuend, BigDecimal subtrahend) + { + return minuend.subtract(subtrahend); + } + + @Override + default BigDecimal addSample(BigDecimal augend, BigDecimal addend) + { + return augend.add(addend); + } +} diff --git a/plugin/src/main/java/com/eul4/holder/CapacitatedCrownHolder.java b/plugin/src/main/java/com/eul4/holder/CapacitatedCrownHolder.java new file mode 100644 index 00000000..93190f9a --- /dev/null +++ b/plugin/src/main/java/com/eul4/holder/CapacitatedCrownHolder.java @@ -0,0 +1,151 @@ +package com.eul4.holder; + +import com.eul4.Main; +import com.eul4.exception.NegativeBalanceException; +import com.eul4.exception.OperationException; +import com.eul4.exception.OverCapacityException; +import com.eul4.model.town.Town; +import com.eul4.model.town.structure.Structure; +import com.google.common.base.Preconditions; +import lombok.Getter; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; + +import java.math.BigDecimal; +import java.util.UUID; + +public class CapacitatedCrownHolder implements CrownHolder, + CapacitatedHolder, + StructureOwner +{ + private BigDecimal balance; + private BigDecimal capacity; + + private final @NotNull Main plugin; + + @Getter + private final @NotNull UUID townUniqueId; + @Getter + private final @NotNull UUID structureUniqueId; + + public CapacitatedCrownHolder(Structure structure) + { + this + ( + structure.getTown().getPlugin(), + structure.getTown().getTownUniqueId(), + structure.getUUID() + ); + } + + public CapacitatedCrownHolder + ( + @NotNull Main plugin, + @NotNull UUID townUniqueId, + @NotNull UUID structureUniqueId + ) + { + this(plugin, townUniqueId, structureUniqueId, BigDecimal.ZERO); + } + + public CapacitatedCrownHolder + ( + @NotNull Main plugin, + @NotNull UUID townUniqueId, + @NotNull UUID structureUniqueId, + BigDecimal balance + ) + { + this.plugin = Preconditions.checkNotNull(plugin); + this.townUniqueId = Preconditions.checkNotNull(townUniqueId); + this.structureUniqueId = Preconditions.checkNotNull(structureUniqueId); + + this.balance = balance; + this.capacity = BigDecimal.ZERO; + } + + public BigDecimal getRemainingCapacity() + { + return capacity.subtract(balance); + } + + public boolean isFull() + { + return balance.compareTo(capacity) >= 0; + } + + @Override + public boolean isEmpty() + { + return balance.compareTo(BigDecimal.ZERO) <= 0; + } + + @Override + public BigDecimal getBalance() + { + return balance; + } + + @Override + public void setBalance(BigDecimal balance) + { + this.balance = balance; + } + + public BigDecimal getCapacity() + { + return capacity; + } + + public void setCapacity(BigDecimal capacity) + { + this.capacity = capacity; + } + + @Override + public void add(BigDecimal amount) throws OperationException + { + updateBalance(balance.add(amount)); + } + + @Override + public void subtract(BigDecimal amount) throws OperationException + { + updateBalance(balance.subtract(amount)); + } + + private void updateBalance(BigDecimal newBalance) throws OperationException + { + if(newBalance.compareTo(BigDecimal.ZERO) < 0) + { + throw new NegativeBalanceException(); + } + + if(newBalance.compareTo(capacity) > 0) + { + throw new OverCapacityException(); + } + + this.balance = newBalance; + } + + @Override + public String toString() + { + return "CapacitatedCrownHolder{owner=" + + getOwnerName() + + ", structureUniqueId=" + structureUniqueId + + ", balance=" + balance + + ", capacity=" + capacity + + '}'; + } + + private String getOwnerName() + { + return plugin.getTownManager() + .findTownByTownUniqueId(townUniqueId) + .map(Town::getOwner) + .map(OfflinePlayer::getName) + .orElse(null); + } +} diff --git a/plugin/src/main/java/com/eul4/holder/CapacitatedHolder.java b/plugin/src/main/java/com/eul4/holder/CapacitatedHolder.java new file mode 100644 index 00000000..d9006c21 --- /dev/null +++ b/plugin/src/main/java/com/eul4/holder/CapacitatedHolder.java @@ -0,0 +1,11 @@ +package com.eul4.holder; + +public interface CapacitatedHolder> extends Holder +{ + boolean isFull(); + + void setCapacity(N capacity); + N getCapacity(); + + N getRemainingCapacity(); +} diff --git a/plugin/src/main/java/com/eul4/holder/CrownHolder.java b/plugin/src/main/java/com/eul4/holder/CrownHolder.java new file mode 100644 index 00000000..58e23b59 --- /dev/null +++ b/plugin/src/main/java/com/eul4/holder/CrownHolder.java @@ -0,0 +1,6 @@ +package com.eul4.holder; + +public interface CrownHolder extends BigDecimalHolder +{ + +} diff --git a/plugin/src/main/java/com/eul4/holder/Holder.java b/plugin/src/main/java/com/eul4/holder/Holder.java new file mode 100644 index 00000000..afd7abc1 --- /dev/null +++ b/plugin/src/main/java/com/eul4/holder/Holder.java @@ -0,0 +1,21 @@ +package com.eul4.holder; + +import com.eul4.exception.OperationException; + +public interface Holder> +{ + N getBalance(); +// Currency getCurrency(); + void setBalance(N balance) throws OperationException; + void add(N amount) throws OperationException; + void subtract(N amount) throws OperationException; + + default boolean isEmpty() + { + return getBalance().compareTo(getZeroSample()) <= 0; + } + + N getZeroSample(); + N subtractSample(N minuend, N subtrahend); + N addSample(N augend, N addend); +} diff --git a/plugin/src/main/java/com/eul4/holder/StructureOwner.java b/plugin/src/main/java/com/eul4/holder/StructureOwner.java new file mode 100644 index 00000000..a6793e6f --- /dev/null +++ b/plugin/src/main/java/com/eul4/holder/StructureOwner.java @@ -0,0 +1,10 @@ +package com.eul4.holder; + +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public interface StructureOwner extends TownOwner +{ + @NotNull UUID getStructureUniqueId(); +} diff --git a/plugin/src/main/java/com/eul4/holder/TownOwner.java b/plugin/src/main/java/com/eul4/holder/TownOwner.java new file mode 100644 index 00000000..f0d201d3 --- /dev/null +++ b/plugin/src/main/java/com/eul4/holder/TownOwner.java @@ -0,0 +1,10 @@ +package com.eul4.holder; + +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public interface TownOwner +{ + @NotNull UUID getTownUniqueId(); +} diff --git a/plugin/src/main/java/com/eul4/holder/UnlimitedCrownHolder.java b/plugin/src/main/java/com/eul4/holder/UnlimitedCrownHolder.java new file mode 100644 index 00000000..4b4a502b --- /dev/null +++ b/plugin/src/main/java/com/eul4/holder/UnlimitedCrownHolder.java @@ -0,0 +1,79 @@ +package com.eul4.holder; + +import com.eul4.Main; +import com.eul4.model.town.Town; +import com.google.common.base.Preconditions; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; + +import java.math.BigDecimal; +import java.util.UUID; + +public class UnlimitedCrownHolder implements CrownHolder +{ + private final @NotNull Main plugin; + private final @NotNull UUID uniqueId; + + private @NotNull BigDecimal balance; + + public UnlimitedCrownHolder(@NotNull Main plugin) + { + this(plugin, BigDecimal.ZERO); + } + + public UnlimitedCrownHolder(@NotNull Main plugin, @NotNull BigDecimal balance) + { + this(plugin, UUID.randomUUID(), balance); + } + + public UnlimitedCrownHolder(@NotNull Main plugin, + @NotNull UUID uniqueId, + @NotNull BigDecimal balance) + { + this.plugin = Preconditions.checkNotNull(plugin); + this.uniqueId = Preconditions.checkNotNull(uniqueId); + this.balance = Preconditions.checkNotNull(balance); + } + + @Override + public @NotNull BigDecimal getBalance() + { + return balance; + } + + @Override + public void setBalance(@NotNull BigDecimal balance) + { + this.balance = Preconditions.checkNotNull(balance); + } + + @Override + public void add(BigDecimal amount) + { + updateBalance(balance.add(amount)); + } + + @Override + public void subtract(BigDecimal amount) + { + updateBalance(balance.subtract(amount)); + } + + private void updateBalance(@NotNull BigDecimal newBalance) + { + this.balance = Preconditions.checkNotNull(newBalance); + } + + public @NotNull UUID getUniqueId() + { + return uniqueId; + } + + @Override + public String toString() + { + return "CapacitatedCrownHolder{uniqueId=" + uniqueId + + ", balance=" + balance + + '}'; + } +} diff --git a/plugin/src/main/java/com/eul4/hotbar/DefenderSpectatorHotbar.java b/plugin/src/main/java/com/eul4/hotbar/DefenderSpectatorHotbar.java index 0719d295..a849d8cc 100644 --- a/plugin/src/main/java/com/eul4/hotbar/DefenderSpectatorHotbar.java +++ b/plugin/src/main/java/com/eul4/hotbar/DefenderSpectatorHotbar.java @@ -1,7 +1,7 @@ package com.eul4.hotbar; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.DefenderSpectator; +import com.eul4.model.player.spiritual.DefenderSpectator; import lombok.Getter; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/hotbar/RaidAnalyzerHotbar.java b/plugin/src/main/java/com/eul4/hotbar/RaidAnalyzerHotbar.java index 74f53947..b335bef8 100644 --- a/plugin/src/main/java/com/eul4/hotbar/RaidAnalyzerHotbar.java +++ b/plugin/src/main/java/com/eul4/hotbar/RaidAnalyzerHotbar.java @@ -1,7 +1,7 @@ package com.eul4.hotbar; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import lombok.Getter; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/hotbar/RaidSpectatorHotbar.java b/plugin/src/main/java/com/eul4/hotbar/RaidSpectatorHotbar.java index 466e72cc..cbe87f44 100644 --- a/plugin/src/main/java/com/eul4/hotbar/RaidSpectatorHotbar.java +++ b/plugin/src/main/java/com/eul4/hotbar/RaidSpectatorHotbar.java @@ -1,7 +1,7 @@ package com.eul4.hotbar; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.RaidSpectator; +import com.eul4.model.player.spiritual.RaidSpectator; import lombok.Getter; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/i18n/AnalyzerScoreboardMessage.java b/plugin/src/main/java/com/eul4/i18n/AnalyzerScoreboardMessage.java index 91368f87..7d0829eb 100644 --- a/plugin/src/main/java/com/eul4/i18n/AnalyzerScoreboardMessage.java +++ b/plugin/src/main/java/com/eul4/i18n/AnalyzerScoreboardMessage.java @@ -2,139 +2,150 @@ import com.eul4.common.i18n.BundleBaseName; import com.eul4.common.i18n.Message; +import com.eul4.common.i18n.RichMessage; +import com.eul4.common.util.CommonMessageUtil; +import com.eul4.enums.Currency; import com.eul4.model.town.Town; import lombok.Getter; +import lombok.RequiredArgsConstructor; import net.kyori.adventure.text.Component; -import org.bukkit.OfflinePlayer; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.NumberFormat; -import java.util.Optional; -import java.util.ResourceBundle; +import java.util.Locale; import java.util.function.BiFunction; import static com.eul4.common.i18n.CommonMessage.OFFLINE; import static com.eul4.common.i18n.CommonMessage.ONLINE; +import static com.eul4.common.util.CommonMessageUtil.displayName; import static net.kyori.adventure.text.Component.empty; import static net.kyori.adventure.text.Component.text; -import static net.kyori.adventure.text.format.NamedTextColor.WHITE; -import static net.kyori.adventure.text.format.TextDecoration.BOLD; +import static net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component; +import static net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.unparsed; @Getter -public enum AnalyzerScoreboardMessage implements Message +@RequiredArgsConstructor +public enum AnalyzerScoreboardMessage implements RichMessage { - TITLE("title", (bundle, args) -> new Component[] + TITLE("title", (locale, args) -> new TagResolver[] { - empty().color(WHITE).decorate(BOLD), - text(Optional.ofNullable((Town) args[0]) - .map(Town::getOwner) - .map(OfflinePlayer::getName) - .map(String::toUpperCase) - .orElse("???")), + component("player", displayName(args[0])), }), - PLAYER_STATUS_PREFIX("player-status.prefix", (bundle, args) -> new Component[] + PLAYER_STATUS_PREFIX("player-status.prefix", (bundle, args) -> new TagResolver[] { - empty(), - (Component) args[0], + component("player", displayName(args[0])) }), - PLAYER_STATUS_ENTRY("player-status.entry"), - PLAYER_STATUS_SUFFIX("player-status.suffix", (bundle, args) -> + PLAYER_STATUS_SUFFIX("player-status.suffix", (locale, args) -> { boolean isOnline = (boolean) args[0]; Message message = isOnline ? ONLINE : OFFLINE; - return new Component[] + return new TagResolver[] { - empty(), - message.translate(bundle, String::toUpperCase), + component("status", message.translate(locale, String::toUpperCase)), }; }), TOWN_HALL_LEVEL_PREFIX("town-hall-level.prefix"), - TOWN_HALL_LEVEL_ENTRY("town-hall-level.entry"), - TOWN_HALL_LEVEL_SUFFIX("town-hall-level.suffix", (bundle, args) -> new Component[] + TOWN_HALL_LEVEL_SUFFIX("town-hall-level.suffix", (bundle, args) -> new TagResolver[] { - empty(), - text((int) args[0]), + unparsed("level", args[0].toString()) }), LIKES_PREFIX("likes.prefix"), - LIKES_ENTRY("likes.entry"), - LIKES_SUFFIX("likes.suffix", (bundle, args) -> + LIKES_SUFFIX("likes.suffix", (locale, args) -> { - NumberFormat numberFormat = NumberFormat.getInstance(bundle.getLocale()); + DecimalFormat decimalFormat = Currency.LIKE.getDecimalFormat(locale); Town town = (Town) args[0]; - return new Component[] + String balance = town == null + ? "?" + : decimalFormat.format(town.getLikesIncludingGenerators()); + String capacity = town == null + ? "?" + : decimalFormat.format(town.getLikeCapacityIncludingGenerators()); + + return new TagResolver[] { - empty(), - text(town == null ? "?" : numberFormat.format(town.getLikesIncludingGenerators())), - text(town == null ? "?" : numberFormat.format(town.getLikeCapacityIncludingGenerators())), + unparsed("like_balance", balance), + unparsed("like_capacity", capacity), }; }), DISLIKES_PREFIX("dislikes.prefix"), - DISLIKES_ENTRY("dislikes.entry"), - DISLIKES_SUFFIX("dislikes.suffix", (bundle, args) -> + DISLIKES_SUFFIX("dislikes.suffix", (locale, args) -> { - NumberFormat numberFormat = NumberFormat.getInstance(bundle.getLocale()); + DecimalFormat decimalFormat = Currency.DISLIKE.getDecimalFormat(locale); Town town = (Town) args[0]; - return new Component[] + String balance = town == null + ? "?" + : decimalFormat.format(town.getDislikesIncludingGenerators()); + String capacity = town == null + ? "?" + : decimalFormat.format(town.getDislikeCapacityIncludingGenerators()); + + return new TagResolver[] { - empty(), - text(town == null ? "?" : numberFormat.format(town.getDislikesIncludingGenerators())), - text(town == null ? "?" : numberFormat.format(town.getDislikeCapacityIncludingGenerators())), + unparsed("dislike_balance", balance), + unparsed("dislike_capacity", capacity), + }; + }), + + CROWNS_PREFIX("crowns.prefix"), + CROWNS_SUFFIX("crowns.suffix", (locale, args) -> + { + DecimalFormat decimalFormat = Currency.CROWN.getDecimalFormat(locale); + Town town = (Town) args[0]; + + String balance = town == null + ? "?" + : decimalFormat.format(town.getCalculatedCrownBalance()); + String capacity = town == null + ? "?" + : decimalFormat.format(town.calculateCrownCapacity()); + + return new TagResolver[] + { + unparsed("crown_balance", balance), + unparsed("crown_capacity", capacity), }; }), HARDNESS_PREFIX("hardness.prefix"), - HARDNESS_ENTRY("hardness.entry"), - HARDNESS_SUFFIX("hardness.suffix", (bundle, args) -> + HARDNESS_SUFFIX("hardness.suffix", (locale, args) -> { - DecimalFormat decimalFormat = new DecimalFormat("0.0", new DecimalFormatSymbols(bundle.getLocale())); + DecimalFormat decimalFormat = new DecimalFormat("0.0", new DecimalFormatSymbols(locale)); Town town = (Town) args[0]; - return new Component[] + String hardness = town == null ? "?" : decimalFormat.format(town.getHardness()); + String hardnessLimit = town == null ? "?" : decimalFormat.format(town.getHardnessLimit()); + + return new TagResolver[] { - empty(), - text(town == null ? "?" : decimalFormat.format(town.getHardness())), - text(town == null ? "?" : decimalFormat.format(town.getHardnessLimit())), + unparsed("hardness", hardness), + unparsed("hardness_limit", hardnessLimit) }; }), FOOTER_PREFIX("footer.prefix"), - FOOTER_ENTRY("footer.entry"), FOOTER_SUFFIX("footer.suffix"), ; private final String key; - private final BundleBaseName bundleBaseName; - private final BiFunction componentBiFunction; + private final BiFunction tagResolversFunction; AnalyzerScoreboardMessage(String key) { - this(key, empty()); - } - - AnalyzerScoreboardMessage(String key, Component baseComponent) - { - this(key, (bundle, args) -> new Component[] { baseComponent }); - } - - AnalyzerScoreboardMessage(String key, BiFunction componentBiFunction) - { - this(PluginBundleBaseName.ANALYZER_SCOREBOARD, key, componentBiFunction); + this(key, (locale, args) -> new TagResolver[0]); } - AnalyzerScoreboardMessage(BundleBaseName bundleBaseName, - String key, - BiFunction componentBiFunction) + @Override + public BundleBaseName getBundleBaseName() { - this.bundleBaseName = bundleBaseName; - this.key = key; - this.componentBiFunction = componentBiFunction; + return PluginBundleBaseName.ANALYZER_SCOREBOARD; } } diff --git a/plugin/src/main/java/com/eul4/i18n/PluginMessage.java b/plugin/src/main/java/com/eul4/i18n/PluginMessage.java index 10eeb4ea..8589f9cb 100644 --- a/plugin/src/main/java/com/eul4/i18n/PluginMessage.java +++ b/plugin/src/main/java/com/eul4/i18n/PluginMessage.java @@ -2,6 +2,7 @@ import com.eul4.Main; import com.eul4.StructureType; +import com.eul4.command.BaltopCommand; import com.eul4.command.HomeCommand; import com.eul4.command.SetHomeCommand; import com.eul4.command.TagCommand; @@ -12,10 +13,12 @@ import com.eul4.common.wrapper.TimerTranslator; import com.eul4.enums.Currency; import com.eul4.enums.Rarity; -import com.eul4.model.player.SetHomePerformer; +import com.eul4.model.player.performer.SetHomePerformer; import com.eul4.model.town.Town; import com.eul4.model.town.structure.Generator; +import com.eul4.model.town.structure.PhysicalDeposit; import com.eul4.rule.attribute.*; +import com.eul4.util.MaterialUtil; import com.eul4.util.TickConverter; import com.eul4.wrapper.Tag; import lombok.Getter; @@ -25,11 +28,13 @@ import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEventSource; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextColor; import org.apache.commons.lang.WordUtils; import org.bukkit.Material; import org.bukkit.OfflinePlayer; +import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.*; @@ -38,11 +43,11 @@ import static com.eul4.common.i18n.CommonMessage.*; import static com.eul4.common.util.CommonMessageUtil.*; +import static com.eul4.common.util.DecimalFormatUtil.parse; import static java.util.Collections.singletonList; import static net.kyori.adventure.text.Component.*; import static net.kyori.adventure.text.format.NamedTextColor.*; import static net.kyori.adventure.text.format.TextDecoration.BOLD; -import static net.kyori.adventure.text.format.TextDecoration.STRIKETHROUGH; @Getter public enum PluginMessage implements Message @@ -52,18 +57,24 @@ public enum PluginMessage implements Message DURABILITY("durability"), PRICE("price"), COST("cost"), + CROWN("crown"), + CROWNS("crowns"), COMMON("common"), RARE("rare"), LEGENDARY("legendary"), RARITY("rarity"), + CAPACITY("capacity"), ENCHANTMENT_STABILITY("enchantment.stability"), + COMMAND_WRONG_SYNTAX("command-wrong-syntax", empty().color(RED)), + TAG_OWNER("tag.owner", empty().color(DARK_RED)), TAG_ADMIN("tag.admin", empty().color(RED)), TAG_VIP("tag.vip", empty().color(GREEN)), TAG_MAYOR("tag.mayor", empty().color(YELLOW)), TAG_ALPHA("tag.alpha", empty().color(DARK_PURPLE)), + TAG_TYCOON("tag.tycoon", empty().color(GOLD)), TAG_DEPUTY_MAYOR("tag.deputy-mayor", empty().color(YELLOW)), TAG_TOWNEE("tag.townee", empty().color(GRAY)), TAG_INDIGENT("tag.indigent", empty().color(DARK_GRAY)), @@ -83,6 +94,10 @@ public enum PluginMessage implements Message LEGENDARY.translate(locale, String::toUpperCase).style(Rarity.LEGENDARY.getStyle()) )), + CROWN_DEPOSITS_INSUFFICIENT_CAPACITY("crown-deposits-insufficient-capacity", empty().color(RED)), + CROWN_DEPOSIT_INSUFFICIENT_CAPACITY("crown-deposit-insufficient-capacity", empty().color(RED)), + EXCEPTION_OPERATION("exception.operation", empty().color(RED)), + CONTAINTMENT_PICKAXE_CAN_BREAK_ONLY_SPAWNERS("containtment-pickaxe.can-break-only-spawners", empty().color(RED)), INCOMPATIBLE_RARITY("incompatible-rarity", empty().color(RED)), ENDERCHEST_DISABLED_YOU_CAN_ONLY_PICKUP("enderchest-disabled.you-can-only-pickup", (bundle, args) -> new Component[] @@ -113,12 +128,14 @@ public enum PluginMessage implements Message ((TranslatableComponent) args[0]), ((TranslatableComponent) args[1]) }), + RARE_PLACEMENT_INCOMPATIBILITY_$ITEM_$AGAINST("rare.placement-incompatibility", (bundle, args) -> new Component[] { empty().color(RED), ((TranslatableComponent) args[0]), ((TranslatableComponent) args[1]) }), + LEGENDARY_PLACEMENT_INCOMPATIBILITY_$ITEM_$AGAINST("legendary.placement-incompatibility", (bundle, args) -> new Component[] { empty().color(RED), @@ -126,6 +143,22 @@ public enum PluginMessage implements Message ((TranslatableComponent) args[1]) }), + BOLD_DECORATED_$CURRENCY_$VALUE((locale, args) -> + { + Currency currency = (Currency) args[0]; + Number value = (Number) args[1]; + Message word = value.doubleValue() == 1.0D ? currency.getSingularWord() : currency.getPluralWord(); + DecimalFormat decimalFormat = currency.getDecimalFormat(locale); + + Component component = decimalToComponent(value, decimalFormat) + .appendSpace() + .append(word.translate(locale, String::toUpperCase)) + .style(currency.getStyle()) + .decorate(BOLD); + + return Collections.singletonList(component); + }), + FIREWORK_INCOMPATIBLE_RARITY("firework-incompatible-rarity", empty().color(RED)), ARROW_RARITY_HIGHER_THAN_BOW("arrow-rarity-higher-than-bow", empty().color(RED)), CONTAINTMENT_PICKAXE_DISPLAY_NAME("containtment-pickaxe.display-name", empty().color(YELLOW).decorate(BOLD)), @@ -141,6 +174,7 @@ public enum PluginMessage implements Message STRUCTURE_TOWN_HALL_NAME ("structure.town-hall.name"), STRUCTURE_LIKE_GENERATOR_NAME("structure.like-generator.name"), STRUCTURE_DISLIKE_GENERATOR_NAME("structure.dislike-generator.name"), + STRUCTURE_CROWN_DEPOSIT_NAME("structure.crown-deposit.name"), STRUCTURE_LIKE_DEPOSIT_NAME("structure.like-deposit.name"), STRUCTURE_DISLIKE_DEPOSIT_NAME("structure.dislike-deposit.name"), COLLECT_LIKES("collect-likes", empty().color(GREEN)), @@ -163,9 +197,9 @@ public enum PluginMessage implements Message return new Component[] { empty().color(WHITE), - generator.getCurrency().getBaseComponent() - .append(generator.getCurrency().getPluralWord().translate(bundle.getLocale(), String::toUpperCase)) + generator.getCurrency().getPluralWord().translate(bundle.getLocale(), String::toUpperCase) .append(text(":")) + .style(generator.getCurrency().getStyle()) .decorate(BOLD), text(generator.getBalance()), text(generator.getCapacity()), @@ -179,8 +213,8 @@ public enum PluginMessage implements Message return new Component[] { empty().color(RED), - generator.getCurrency().getBaseComponent() - .append(generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase)) + generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase) + .style(generator.getCurrency().getStyle()) .decorate(BOLD), }; }), @@ -192,11 +226,7 @@ public enum PluginMessage implements Message return new Component[] { empty().color(GRAY), - generator.getCurrency().getBaseComponent() - .append(text(generator.getPossibleAmountToCollect())) - .append(text(" ")) - .append(generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase)) - .decorate(BOLD), + BOLD_DECORATED_$CURRENCY_$VALUE.translate(bundle, generator.getCurrency(), generator.getPossibleAmountToCollect()), }; }), @@ -208,11 +238,7 @@ public enum PluginMessage implements Message return new Component[] { empty().color(GRAY), - generator.getCurrency().getBaseComponent() - .append(text(amountCollected)) - .append(text(" ")) - .append(generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase)) - .decorate(BOLD), + BOLD_DECORATED_$CURRENCY_$VALUE.translate(bundle, generator.getCurrency(), amountCollected), }; }), @@ -223,8 +249,8 @@ public enum PluginMessage implements Message return new Component[] { empty().color(GRAY), - generator.getCurrency().getBaseComponent() - .append(generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase)) + generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase) + .style(generator.getCurrency().getStyle()) .decorate(BOLD), }; }), @@ -236,8 +262,8 @@ public enum PluginMessage implements Message return new Component[] { empty().color(GRAY), - generator.getCurrency().getBaseComponent() - .append(generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase)) + generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase) + .style(generator.getCurrency().getStyle()) .decorate(BOLD), }; }), @@ -249,8 +275,8 @@ public enum PluginMessage implements Message return new Component[] { empty().color(GRAY), - generator.getCurrency().getBaseComponent() - .append(generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase)) + generator.getCurrency().getPluralWord().translate(bundle, String::toUpperCase) + .style(generator.getCurrency().getStyle()) .decorate(BOLD), }; }), @@ -381,19 +407,8 @@ public enum PluginMessage implements Message YOU_CAN_NOT_CONSTRUCT_OUTSIDE_YOUR_TOWN("command.buy-structure.can-not-construct-outside", empty().color(RED)), - DECORATED_VALUE_CURRENCY("decorated-value-currency", (bundle, args) -> new Component[] - { - ((Currency) args[0]).getBaseComponent().decorate(BOLD), - text((int) args[1]), - ((Currency) args[0]).getPluralWord().translate(bundle, String::toUpperCase), - }), - - BOLD_DECORATED_VALUE_CURRENCY("bold-decorated-value-currency", (bundle, args) -> new Component[] - { - ((Currency) args[0]).getBaseComponent().decorate(BOLD), - text((int) args[1]), - ((Currency) args[0]).getPluralWord().translate(bundle, String::toUpperCase), - }), + LIKE("like"), + DISLIKE("dislike"), LIKES("likes"), DISLIKES("dislikes"), @@ -554,6 +569,25 @@ public enum PluginMessage implements Message }; }), + STRUCTURE_CROWN_DEPOSIT_UPGRADE_PREVIEW_LORE("structure.crown-deposit.upgrade-preview-lore", (bundle, args) -> + { + CrownDepositAttribute currentLevelAttributes = (CrownDepositAttribute) args[0]; + CrownDepositAttribute nextLevelAttributes = (CrownDepositAttribute) args[1]; + + Currency currency = currentLevelAttributes.getCurrency(); + DecimalFormat decimalFormat = currency.getDecimalFormat(bundle.getLocale()); + + int buildTicks = nextLevelAttributes.getTotalBuildTicks(); + + return new Component[] + { + empty().color(GRAY), + text(decimalFormat.format(currentLevelAttributes.getCapacity())), + text(decimalFormat.format(nextLevelAttributes.getCapacity())), + TimerTranslator.translate(buildTicks, bundle), + }; + }), + STRUCTURE_DISLIKE_DEPOSIT_UPGRADE_PREVIEW_LORE("structure.dislike-deposit.upgrade-preview-lore", (bundle, args) -> { DislikeDepositAttribute currentLevelAttributes = (DislikeDepositAttribute) args[0]; @@ -580,16 +614,65 @@ public enum PluginMessage implements Message { Currency currency = ((Currency) args[1]); - Component baseComponent = currency.getBaseComponent(); - return new Component[] { empty().color(WHITE).decorate(BOLD), - baseComponent.append(text((int) args[0])), - baseComponent.append(currency.getPluralWord().translate(bundle, String::toUpperCase)) + BOLD_DECORATED_$CURRENCY_$VALUE.translate(bundle, currency, args[0]) }; }), + STRUCTURE_PHYSICAL_DEPOSIT_BALANCE_HOLOGRAM((locale, args) -> + { + PhysicalDeposit physicalDeposit = (PhysicalDeposit) args[0]; + + Number balance = physicalDeposit.getHolder().getBalance(); + Number capacity = physicalDeposit.getHolder().getCapacity(); + + Currency currency = physicalDeposit.getCurrency(); + DecimalFormat decimalFormat = currency.getDecimalFormat(locale); + + Component balanceSlashCapacityComponent = decimalToComponent(balance, decimalFormat) + .append(text("/")) + .append(decimalToComponent(capacity, decimalFormat)) + .color(WHITE); + + Component component = currency.getPluralWord() + .translate(locale, CommonWordUtil::toUpperCaseAndConcatColon) + .style(currency.getStyle()) + .decorate(BOLD) + .appendSpace() + .append(balanceSlashCapacityComponent); + + return Collections.singletonList(component); + }), + + $CURRENCY_$BALANCE_$CAPACITY((locale, args) -> + { + Currency currency = (Currency) args[0]; + Number balance = (Number) args[1]; + Number capacity = (Number) args[2]; + + String formattedBalance = currency.format(balance, locale); + String formattedCapacity = currency.format(capacity, locale); + + return singletonList + ( + empty().color(WHITE) + .append + ( + currency.getPluralWord() + .translate(locale, CommonWordUtil::toUpperCaseAndConcatColon) + .style(currency.getStyle()) + .decorate(BOLD) + ) + .appendSpace() + .append(text(formattedBalance)) + .append(text("/")) + .append(text(formattedCapacity)) + .decorate(BOLD) + ); + }), + THIS_BLOCK_WILL_EXCEED_HARDNESS_LIMIT("this-block-will-exceed-hardness-limit", empty().color(RED)), TITLE_SEARCHING("title.searching", empty().color(GRAY)), @@ -690,6 +773,31 @@ public enum PluginMessage implements Message text((int) args[0]), }), + $BALANCE_$CURRENCY((locale, args) -> + { + Number balance = (Number) args[0]; + Currency currency = (Currency) args[1]; + + Component currencyWordComponent = currency + .getWordFor(balance, locale) + .translate(locale, String::toUpperCase); + + return singletonList + ( + text(currency.format(balance, locale)) + .appendSpace() + .append(currencyWordComponent) + .style(currency.getStyle()) + .decorate(BOLD) + ); + }), + + STRUCTURE_CROWN_DEPOSIT_BALANCE("structure.crown-deposit.balance", (bundle, args) -> new Component[] + { + empty().color(WHITE).decorate(BOLD), + decimalToComponent(args[0], Currency.CROWN.getDecimalFormat(bundle.getLocale())), + }), + STRUCTURE_TOWN_HALL_VIRTUAL_LIKES("structure.town-hall.virtual-likes", (bundle, args) -> new Component[] { empty().color(GREEN).decorate(BOLD), @@ -751,6 +859,37 @@ public enum PluginMessage implements Message COMMAND_RAID_ALREADY_IN_WORLD("command.raid.already-in-world", Component.empty().color(RED)), COMMAND_NEWBIE_ALREADY_IN_WORLD("command.newbie.already-in-world", Component.empty().color(RED)), + COMMAND_PRICE_USAGE_$ALIASES((locale, args) -> Collections.singletonList + ( + text("/") + .append(argToComponent(args[0])) + .color(RED) + )), + + COMMAND_PRICE_USE_$ALIASES((locale, args) -> Collections.singletonList + ( + USAGE.translate(locale, CommonWordUtil::capitalizeAndConcatColon) + .appendNewline() + .append(COMMAND_PRICE_USAGE_$ALIASES.translate(locale, args[0])) + .color(RED) + )), + + + COMMAND_SELL_USAGE_$ALIASES((locale, args) -> Collections.singletonList + ( + text("/") + .append(argToComponent(args[0])) + .color(RED) + )), + + COMMAND_SELL_USE_$ALIASES((locale, args) -> Collections.singletonList + ( + USAGE.translate(locale, CommonWordUtil::capitalizeAndConcatColon) + .appendNewline() + .append(COMMAND_SELL_USAGE_$ALIASES.translate(locale, args[0])) + .color(RED) + )), + COMMAND_RAID_USAGE_$ALIASES((locale, args) -> Collections.singletonList ( text("/") @@ -783,6 +922,23 @@ public enum PluginMessage implements Message .color(RED) )), + GENERIC_COMMAND_NOARGS_USAGE_$ALIASES((locale, args) -> Collections.singletonList + ( + text("/") + .append(argToComponent(args[0])) + .appendSpace() + .append(usageRequiredArg(BROADCAST.translate(locale))) + .color(RED) + )), + + GENERIC_COMMAND_NOARGS_USE_$ALIASES((locale, args) -> Collections.singletonList + ( + USAGE.translate(locale, CommonWordUtil::capitalizeAndConcatColon) + .appendNewline() + .append(GENERIC_COMMAND_NOARGS_USAGE_$ALIASES.translate(locale, args[0])) + .color(RED) + )), + COMMAND_NEWBIE_USAGE_$ALIASES((locale, args) -> Collections.singletonList ( text("/") @@ -798,16 +954,12 @@ public enum PluginMessage implements Message .color(RED) )), - COMMAND_BALANCE_YOUR_RESOURCES("command.balance.your-resources", Component.empty().color(WHITE).decorate(BOLD)), - COMMAND_BALANCE_TRY_TOWN_COMMAND("command.balance.try-town-command", (bundle, args) -> new Component[] { empty().color(RED), TOWN_COMMAND_NAME.translate(bundle), }), - COMMAND_BALANCE_FOOTER("command.balance.footer", Component.empty().color(GRAY).decorate(STRIKETHROUGH)), - COMMAND_MUTEBROADCAST_BROADCAST_MUTED("command.mutebroadcast.broadcast-muted", empty().color(GREEN)), COMMAND_MUTEBROADCAST_BROADCAST_ALREADY_MUTED("command.mutebroadcast.broadcast-already-muted", empty().color(RED)), @@ -818,24 +970,53 @@ public enum PluginMessage implements Message argToComponent(args[0]), }), - COMMAND_BALANCE("command.balance", (bundle, args) -> + COMMAND_BALTOP_WAIT_COMPUTATION("command.baltop.wait-computation", empty().color(GRAY)), + + COMMAND_BALTOP_$LIST((locale, args) -> { - Town town = (Town) args[0]; + List playerBalances = (List) args[0]; + DecimalFormat decimalFormat = Currency.CROWN.getDecimalFormat(locale); - return new Component[] + Component headerTracesComponent = text("============").color(DARK_GRAY); + + Component headerComponent = headerTracesComponent + .append(text(" BALTOP ").color(DARK_GREEN).decorate(BOLD)) + .append(headerTracesComponent); + Component footerComponent = text("=================================").color(DARK_GRAY); + + List components = new ArrayList<>(); + + components.add(headerComponent); + + for(int i = 0; i < 8 && i < playerBalances.size(); i++) { - empty().color(WHITE), - text(" ] ").color(GRAY).decorate(STRIKETHROUGH), - COMMAND_BALANCE_YOUR_RESOURCES.translate(bundle), - text(" [ ").color(GRAY).decorate(STRIKETHROUGH), - LIKES.translate(bundle, String::toUpperCase).color(GREEN).decorate(BOLD).append(text(":")), - text(town.getLikes()), - text(town.getLikeCapacity()), - DISLIKES.translate(bundle, String::toUpperCase).color(RED).decorate(BOLD).append(text(":")), - text(town.getDislikes()), - text(town.getDislikeCapacity()), - COMMAND_BALANCE_FOOTER.translate(bundle), - }; + final BaltopCommand.PlayerBalance playerBalance = playerBalances.get(i); + final int pos = i + 1; + + Component crownWordComponent = Currency.CROWN.getWordFor(playerBalance.getBalance()) + .translate(locale); + Component placementComponent = text(pos + "º").color(WHITE).decorate(BOLD); + Component playerNameComponent = displayName(playerBalance.getOfflinePlayer()); + Component playerBalanceComponent = text(decimalFormat.format(playerBalance.getBalance())) + .appendSpace() + .append(crownWordComponent) + .style(Currency.CROWN.getStyle()); + + Component component = empty() + .append(placementComponent) + .appendSpace() + .append(playerNameComponent) + .appendSpace() + .append(text("-").color(GRAY).decorate(BOLD)) + .appendSpace() + .append(playerBalanceComponent); + + components.add(component); + } + + components.add(footerComponent); + + return components; }), INVENTORY_ARMORY_STORAGE_TITLE("inventory-armory-storage.title"), @@ -992,6 +1173,18 @@ public enum PluginMessage implements Message }; }), + STRUCTURE_CROWN_DEPOSIT_SHOP_PREVIEW_ATTRIBUTES("structure.crown-deposit.shop-preview-attributes", (bundle, args) -> + { + CrownDepositAttribute attribute = (CrownDepositAttribute) StructureType.CROWN_DEPOSIT.getRule((Main) args[0]).getAttributeOrDefault(1); + + return new Component[] + { + empty().color(GRAY), + decimalToComponent(attribute.getCapacity(), attribute.getCurrency().getDecimalFormat(bundle.getLocale())), + TimerTranslator.translate(attribute.getTotalBuildTicks(), bundle), + }; + }), + STRUCTURE_ARMORY_SHOP_PREVIEW_ATTRIBUTES("structure.armory.shop-preview-attributes", (bundle, args) -> { ArmoryAttribute attribute = (ArmoryAttribute) StructureType.ARMORY.getRule((Main) args[0]).getAttributeOrDefault(1); @@ -1057,6 +1250,120 @@ public enum PluginMessage implements Message .append(text("(" + current + "/" + max + ")").color(color))); }), + COMMAND_PRICE_UNIT_PRICE_$MATERIAL_$PRICE("command.price.unit-price", (bundle, args) -> new Component[] + { + empty().color(GREEN), + argToComponent(args[0], "*", "*").color(YELLOW), + decimalToComponent(args[1], "0.###", bundle.getLocale()).color(YELLOW), + }), + + COMMAND_SELL_NEED_HOLD_ITEM("command.sell.need-hold-item", empty().color(RED)), + COMMAND_SELL_ITEM_NOT_FOR_SALE("command.sell.item-not-for-sale", empty().color(RED)), + COMMAND_SELL_SOLD_$MATERIAL_$AMOUNT_$VALUE_$RARITY("command.sell.sold", (bundle, args) -> + { + Material material = (Material) args[0]; + Rarity rarity = (Rarity) args[3]; + + Style materialStyle = MaterialUtil.getStyle(material); + Component materialComponent = Component + .translatable(material.translationKey()) + .style(materialStyle); + + Currency currency = Currency.CROWN; + String valueFormatted = currency.getDecimalFormat(bundle.getLocale()).format(args[2]); + + Component currencyWord = currency + .getWordFor((Number) args[2]) + .translate(bundle, String::toLowerCase); + + Component valueAndCurrencyComponent = empty() + .append(text(valueFormatted).style(currency.getStyle())) + .appendSpace() + .append(currencyWord); + + Component rarityComponent = rarity.getStylizedMessage().translate(bundle); + Component rarityTagComponent = argToComponent(rarityComponent, "[", "]").color(GRAY); + + + return new Component[] + { + empty().color(GRAY), + empty().append(materialComponent).appendSpace().append(rarityTagComponent), + argToComponent(args[1]).style(materialStyle), + valueAndCurrencyComponent + }; + }), + + COMMAND_PAY_USAGE_$ALIASES((locale, args) -> Collections.singletonList + ( + text("/") + .append(argToComponent(args[0])) + .appendSpace() + .append(usageRequiredArg(USER.translate(locale))) + .appendSpace() + .append(usageRequiredArg(VALUE.translate(locale))) + .color(RED)) + ), + + COMMAND_PAY_EXAMPLE_$ALIASES((locale, args) -> Collections.singletonList + ( + text("/") + .append(argToComponent(args[0])) + .appendSpace() + .append(text("CruzAPI")) + .appendSpace() + .append(text(Currency.CROWN.getDecimalFormat(locale).format(new BigDecimal("44.44")))) + .color(RED)) + ), + + COMMAND_PAY_USE_$ALIASES((locale, args) -> Collections.singletonList + ( + COMMAND_WRONG_SYNTAX.translate(locale) + .appendNewline() + .appendNewline() + .append(USAGE.translate(locale, CommonWordUtil::capitalizeAndConcatColon)) + .appendSpace() + .append(COMMAND_PAY_USAGE_$ALIASES.translate(locale, args[0])) + .appendNewline() + .append(EXAMPLE.translate(locale, CommonWordUtil::capitalizeAndConcatColon)) + .appendSpace() + .append(COMMAND_PAY_EXAMPLE_$ALIASES.translate(locale, args[0])) + .color(RED) + )), + + COMMAND_PAY_YOURSELF("command.pay.yourself", empty().color(RED)), + COMMAND_PAY_YOUR_TOWN_UNDER_ATTACK("command.pay.your-town-under-attack", empty().color(RED)), + COMMAND_PAY_TARGET_TOWN_UNDER_ATTACK_$TARGET("command.pay.target-town-under-attack", (bundle, args) -> new Component[] + { + empty().color(RED), + argToComponent(args[0]) + }), + COMMAND_PAY_MIN_VALUE("command.pay.min-value", empty().color(RED)), + COMMAND_PAY_SCALE_$LIMIT("command.pay.scale-limit", (bundle, args) -> new Component[] + { + empty().color(RED), + argToComponent(args[0]) + }), + COMMAND_PAY_INTEGRAL_SCALE_$LIMIT("command.pay.integral-scale-limit", (bundle, args) -> new Component[] + { + empty().color(RED), + argToComponent(args[0]) + }), + COMMAND_PAY_INDIGENT_$TARGET("command.pay.indigent-target", (bundle, args) -> new Component[] + { + empty().color(RED), + argToComponent(args[0]) + }), + COMMAND_PAY_INSUFFICIENT_BALANCE("command.pay.insufficient-balance", empty().color(RED)), + COMMAND_PAY_TARGET_OVER_CAPACITY_$TARGET("command.pay.target-over-capacity", (bundle, args) -> new Component[] + { + empty().color(RED), + argToComponent(args[0]) + }), + COMMAND_PAY_UNEXPECTED_ERROR("command.pay.unexpected-error", empty().color(RED)), + COMMAND_PAY_YOU_PAID_$PLAYER_$AMOUNT("command.pay.you-paid", getCommandPayBiFunction()), + COMMAND_PAY_YOU_RECEIVED_$PLAYER_$AMOUNT("command.pay.you-received", getCommandPayBiFunction()), + COMMAND_SETHOME_MAX_HOME_REACHED("command.sethome.max-home-reached", empty().color(RED)), COMMAND_SETHOME_NEED_TO_BE_IN_VANILLA("command.sethome.need-to-be-in-vanilla", empty().color(RED)), COMMAND_SETHOME_NEED_TO_BE_AWAY_$RADIUS("command.sethome.need-to-be-away-blocks-from-spawn", (bundle, args) -> new Component[] @@ -1340,7 +1647,30 @@ public enum PluginMessage implements Message .append(broadcast.translate(locale)) ); }), - ; + + YOU_STOLE_FROM_OTHER_$AMOUNT_$CURRENCY_$PLAYER("you-stole-from-other", + PluginMessage::getStoleMessageComponentArray), + OTHER_STOLE_FROM_YOU_$AMOUNT_$CURRENCY_$PLAYER("other-stole-from-you", + PluginMessage::getStoleMessageComponentArray), + + UNEXPECTED_ERROR_WHILE_STEALING("unexpected-error-while-stealing", empty().color(RED)), + STEALING_CROWNS_DEPOSIT_FULL("stealing-crowns-deposit-full", empty().color(RED)), + + CAPACITY_$BALANCE_$CURRENCY((locale, args) -> + { + Component capacityWordComponent = CAPACITY + .translate(locale, CommonWordUtil::capitalizeAndConcatColon) + .color(WHITE) + .decorate(BOLD); + + return singletonList + ( + empty() + .append(capacityWordComponent) + .appendSpace() + .append($BALANCE_$CURRENCY.translate(locale, args[0], args[1])) + ); + }); private final String key; private final BundleBaseName bundleBaseName; @@ -1381,4 +1711,59 @@ public enum PluginMessage implements Message this.key = null; this.componentBiFunction = null; } + + private static Component[] getStoleMessageComponentArray(ResourceBundle bundle, Object... args) + { + Number amount = (Number) args[0]; + Currency currency = (Currency) args[1]; + + DecimalFormat decimalFormat = currency.getDecimalFormat(bundle); + String formattedAmount = decimalFormat.format(amount); + Number parsed = parse(decimalFormat, true, formattedAmount, amount); + + Component amountComponent = text(formattedAmount) + .style(currency.getStyle()); + + Component currencyWordComponent = currency + .getWordFor(parsed) + .translate(bundle, String::toLowerCase); + + Component arg0Component = empty() + .append(amountComponent) + .appendSpace() + .append(currencyWordComponent); + + return new Component[] + { + empty().color(GRAY), + arg0Component, + displayName(args[2]) + }; + } + + private static BiFunction getCommandPayBiFunction() + { + return (bundle, args) -> + { + BigDecimal amount = (BigDecimal) args[1]; + + Currency currency = Currency.CROWN; + DecimalFormat decimalFormat = currency.getDecimalFormat(bundle); + + Component amountComponent = text(decimalFormat.format(amount)) + .style(currency.getStyle()); + + Component arg0Component = empty() + .append(amountComponent) + .appendSpace() + .append(currency.getWordFor(amount).translate(bundle, String::toLowerCase)); + + return new Component[] + { + empty().color(GRAY), + arg0Component, + displayName(args[0]) + }; + }; + } } diff --git a/plugin/src/main/java/com/eul4/i18n/PluginRichMessage.java b/plugin/src/main/java/com/eul4/i18n/PluginRichMessage.java index c088693d..a8131876 100644 --- a/plugin/src/main/java/com/eul4/i18n/PluginRichMessage.java +++ b/plugin/src/main/java/com/eul4/i18n/PluginRichMessage.java @@ -4,19 +4,31 @@ import com.eul4.common.i18n.BundleBaseName; import com.eul4.common.i18n.RichMessage; import com.eul4.common.util.CommonMessageUtil; +import com.eul4.enums.Currency; import com.eul4.enums.Rarity; +import com.eul4.model.town.Town; +import com.eul4.model.town.structure.PhysicalDeposit; +import com.eul4.wrapper.CrownInfo; import lombok.Getter; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; import java.util.Locale; import java.util.Optional; import java.util.function.BiFunction; -import static com.eul4.common.i18n.CommonMessage.COMMAND_REPLY_USAGE_$ALIASES; import static com.eul4.common.util.CommonMessageUtil.argToComponent; -import static com.eul4.common.util.CommonMessageUtil.displayName; +import static com.eul4.common.util.CommonMessageUtil.decimalToComponent; +import static net.kyori.adventure.text.Component.empty; +import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.format.NamedTextColor.*; +import static net.kyori.adventure.text.format.NamedTextColor.RED; +import static net.kyori.adventure.text.format.TextDecoration.BOLD; +import static net.kyori.adventure.text.format.TextDecoration.STRIKETHROUGH; import static net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component; import static net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.styling; @@ -67,6 +79,56 @@ public enum PluginRichMessage implements RichMessage WORLD_TOWN_LABEL("world.town.label"), @Deprecated(forRemoval = true) WORLD_CIDADE_VIRTUAL_LABEL("world.cidade-virtual.label"), + + CROWN_INFO("crown-info", (locale, args) -> + { + final CrownInfo crownInfo = (CrownInfo) args[0]; + final DecimalFormat decimalFormat = new DecimalFormat(); + + decimalFormat.setDecimalFormatSymbols(new DecimalFormatSymbols(locale)); + decimalFormat.applyPattern("0.00"); + + return new TagResolver[] + { + component("server_treasue", CommonMessageUtil.decimalToComponent(crownInfo.getServerTreasure(), decimalFormat)), + component("jackpot", CommonMessageUtil.decimalToComponent(crownInfo.getJackpot(), decimalFormat)), + component("town_hall_vault", CommonMessageUtil.decimalToComponent(crownInfo.getTownHallVault(), decimalFormat)), + component("eul4_insights", CommonMessageUtil.decimalToComponent(crownInfo.getEul4Insights(), decimalFormat)), + }; + }), + + STRUCTURE_CROWN_DEPOSIT_SHOP_LORE("structure.crown-deposit.shop-lore"), + + COMMAND_BALANCE_$TOWN("command.balance", (bundle, args) -> + { + Town town = (Town) args[0]; + + DecimalFormatSymbols symbols = new DecimalFormatSymbols(bundle); + + DecimalFormat intDecimalFormat = new DecimalFormat("0", symbols); + DecimalFormat crownDecimalFormat = new DecimalFormat("0.00", symbols); + + intDecimalFormat.setGroupingUsed(true); + crownDecimalFormat.setGroupingUsed(true); + intDecimalFormat.setGroupingSize(3); + crownDecimalFormat.setGroupingSize(3); + + return new TagResolver[] + { + component("like_balance", decimalToComponent(town.getLikes(), intDecimalFormat)), + component("like_capacity", decimalToComponent(town.getLikeCapacity(), intDecimalFormat)), + component("dislike_balance", decimalToComponent(town.getDislikes(), intDecimalFormat)), + component("dislike_capacity", decimalToComponent(town.getDislikeCapacity(), intDecimalFormat)), + component("crown_balance", decimalToComponent(town.getCalculatedCrownBalance(), crownDecimalFormat)), + component("crown_capacity", decimalToComponent(town.calculateCrownCapacity(), crownDecimalFormat)), + }; + }), + + BROADCAST_NEW_TYCOON_$PLAYER("broadcast.new-tycoon", (locale, args) -> new TagResolver[] + { + component("player", CommonMessageUtil.displayName(args[0])), + }), + ; private final String key; diff --git a/plugin/src/main/java/com/eul4/i18n/TownScoreboardMessage.java b/plugin/src/main/java/com/eul4/i18n/TownScoreboardMessage.java index c72d1b0b..a2aefbb5 100644 --- a/plugin/src/main/java/com/eul4/i18n/TownScoreboardMessage.java +++ b/plugin/src/main/java/com/eul4/i18n/TownScoreboardMessage.java @@ -1,101 +1,94 @@ package com.eul4.i18n; import com.eul4.common.i18n.BundleBaseName; -import com.eul4.common.i18n.Message; +import com.eul4.common.i18n.RichMessage; +import com.eul4.enums.Currency; import com.eul4.model.town.Town; import lombok.Getter; -import net.kyori.adventure.text.Component; +import lombok.RequiredArgsConstructor; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; -import java.text.NumberFormat; -import java.util.ResourceBundle; +import java.util.Locale; import java.util.function.BiFunction; -import static net.kyori.adventure.text.Component.empty; -import static net.kyori.adventure.text.Component.text; +import static net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.unparsed; @Getter -public enum TownScoreboardMessage implements Message +@RequiredArgsConstructor +public enum TownScoreboardMessage implements RichMessage { TITLE("title"), LIKES_PREFIX("likes.prefix"), - LIKES_ENTRY("likes.entry"), - LIKES_SUFFIX("likes.suffix", (bundle, args) -> + LIKES_SUFFIX("likes.suffix", (locale, args) -> { - NumberFormat numberFormat = NumberFormat.getInstance(bundle.getLocale()); + DecimalFormat decimalFormat = Currency.LIKE.getDecimalFormat(locale); Town town = (Town) args[0]; - return new Component[] + return new TagResolver[] { - empty(), - text(numberFormat.format(town.getLikes())), - text(numberFormat.format(town.getLikeCapacity())), + unparsed("like_balance", decimalFormat.format(town.getLikes())), + unparsed("like_capacity", decimalFormat.format(town.getLikeCapacity())) }; }), DISLIKES_PREFIX("dislikes.prefix"), - DISLIKES_ENTRY("dislikes.entry"), - DISLIKES_SUFFIX("dislikes.suffix", (bundle, args) -> + DISLIKES_SUFFIX("dislikes.suffix", (locale, args) -> { - NumberFormat numberFormat = NumberFormat.getInstance(bundle.getLocale()); + DecimalFormat decimalFormat = Currency.DISLIKE.getDecimalFormat(locale); Town town = (Town) args[0]; - return new Component[] + return new TagResolver[] { - empty(), - text(numberFormat.format(town.getDislikes())), - text(numberFormat.format(town.getDislikeCapacity())), + unparsed("dislike_balance", decimalFormat.format(town.getDislikes())), + unparsed("dislike_capacity", decimalFormat.format(town.getDislikeCapacity())) + }; + }), + + CROWNS_PREFIX("crowns.prefix"), + CROWNS_SUFFIX("crowns.suffix", (locale, args) -> + { + DecimalFormat decimalFormat = Currency.CROWN.getDecimalFormat(locale); + Town town = (Town) args[0]; + + return new TagResolver[] + { + unparsed("crown_balance", decimalFormat.format(town.getCalculatedCrownBalance())), + unparsed("crown_capacity", decimalFormat.format(town.calculateCrownCapacity())) }; }), HARDNESS_PREFIX("hardness.prefix"), - HARDNESS_ENTRY("hardness.entry"), - HARDNESS_SUFFIX("hardness.suffix", (bundle, args) -> + HARDNESS_SUFFIX("hardness.suffix", (locale, args) -> { - DecimalFormat decimalFormat = new DecimalFormat("0.0", new DecimalFormatSymbols(bundle.getLocale())); + DecimalFormat decimalFormat = new DecimalFormat("0.0", new DecimalFormatSymbols(locale)); Town town = (Town) args[0]; - return new Component[] + return new TagResolver[] { - empty(), - text(decimalFormat.format(town.getHardness())), - text(decimalFormat.format(town.getHardnessLimit())), + unparsed("hardness", decimalFormat.format(town.getHardness())), + unparsed("hardness_limit", decimalFormat.format(town.getHardnessLimit())) }; }), FOOTER_PREFIX("footer.prefix"), - FOOTER_ENTRY("footer.entry"), FOOTER_SUFFIX("footer.suffix"), ; private final String key; - private final BundleBaseName bundleBaseName; - private final BiFunction componentBiFunction; + private final BiFunction tagResolversFunction; TownScoreboardMessage(String key) { - this(key, empty()); - } - - TownScoreboardMessage(String key, Component baseComponent) - { - this(key, (bundle, args) -> new Component[] { baseComponent }); - } - - TownScoreboardMessage(String key, BiFunction componentBiFunction) - { - this(PluginBundleBaseName.TOWN_SCOREBOARD, key, componentBiFunction); + this(key, (locale, args) -> new TagResolver[0]); } - TownScoreboardMessage(BundleBaseName bundleBaseName, - String key, - BiFunction componentBiFunction) + @Override + public BundleBaseName getBundleBaseName() { - this.bundleBaseName = bundleBaseName; - this.key = key; - this.componentBiFunction = componentBiFunction; + return PluginBundleBaseName.TOWN_SCOREBOARD; } } diff --git a/plugin/src/main/java/com/eul4/i18n/TutorialTownMessage.java b/plugin/src/main/java/com/eul4/i18n/TutorialTownMessage.java index d4fdfefd..f6a47876 100644 --- a/plugin/src/main/java/com/eul4/i18n/TutorialTownMessage.java +++ b/plugin/src/main/java/com/eul4/i18n/TutorialTownMessage.java @@ -5,13 +5,11 @@ import com.eul4.enums.Currency; import lombok.Getter; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.TextDecoration; import java.util.ResourceBundle; import java.util.function.BiFunction; import static net.kyori.adventure.text.Component.empty; -import static net.kyori.adventure.text.Component.text; @Getter public enum TutorialTownMessage implements Message @@ -54,11 +52,7 @@ public enum TutorialTownMessage implements Message STEP_12("step-12", (bundle, args) -> new Component[] { empty(), - Currency.LIKE.getBaseComponent() - .append(text((int) args[0])) - .append(text(" ")) - .append(Currency.LIKE.getPluralWord().translate(bundle, String::toUpperCase)) - .decorate(TextDecoration.BOLD), + PluginMessage.BOLD_DECORATED_$CURRENCY_$VALUE.translate(bundle, Currency.LIKE, args[0]) }), STEP_13("step-13"), diff --git a/plugin/src/main/java/com/eul4/listener/AssistantInteractListener.java b/plugin/src/main/java/com/eul4/listener/AssistantInteractListener.java index 8fa4848d..37f9f5fe 100644 --- a/plugin/src/main/java/com/eul4/listener/AssistantInteractListener.java +++ b/plugin/src/main/java/com/eul4/listener/AssistantInteractListener.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.event.AssistantInteractEvent; import com.eul4.model.inventory.craft.CraftAssistantGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/listener/AssistantTargetTaskListener.java b/plugin/src/main/java/com/eul4/listener/AssistantTargetTaskListener.java index ac8aaed2..2a419db6 100644 --- a/plugin/src/main/java/com/eul4/listener/AssistantTargetTaskListener.java +++ b/plugin/src/main/java/com/eul4/listener/AssistantTargetTaskListener.java @@ -5,7 +5,6 @@ import com.eul4.event.AssistantRemoveEvent; import com.eul4.event.AssistantSpawnEvent; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.TownPlayer; import com.eul4.model.town.Town; import lombok.RequiredArgsConstructor; import org.bukkit.event.EventHandler; diff --git a/plugin/src/main/java/com/eul4/listener/EntityItemMoveListener.java b/plugin/src/main/java/com/eul4/listener/EntityItemMoveListener.java index ab2f2814..092e0afc 100644 --- a/plugin/src/main/java/com/eul4/listener/EntityItemMoveListener.java +++ b/plugin/src/main/java/com/eul4/listener/EntityItemMoveListener.java @@ -1,11 +1,10 @@ package com.eul4.listener; import com.eul4.Main; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.wrapper.EntityItemMove; import lombok.RequiredArgsConstructor; -import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/listener/GeneratorGuiListener.java b/plugin/src/main/java/com/eul4/listener/GeneratorGuiListener.java index 4e47e759..38489220 100644 --- a/plugin/src/main/java/com/eul4/listener/GeneratorGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/GeneratorGuiListener.java @@ -4,7 +4,7 @@ import com.eul4.common.event.GuiClickEvent; import com.eul4.model.inventory.GeneratorGui; import com.eul4.model.inventory.StructureGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/plugin/src/main/java/com/eul4/listener/ItemBuilderListener.java b/plugin/src/main/java/com/eul4/listener/ItemBuilderListener.java index 825a40b0..a5736098 100644 --- a/plugin/src/main/java/com/eul4/listener/ItemBuilderListener.java +++ b/plugin/src/main/java/com/eul4/listener/ItemBuilderListener.java @@ -4,7 +4,7 @@ import com.eul4.StructureType; import com.eul4.enums.ItemBuilder; import com.eul4.model.inventory.craft.CraftConfirmationGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import lombok.RequiredArgsConstructor; import org.bukkit.block.Block; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/listener/PluginFilerListener.java b/plugin/src/main/java/com/eul4/listener/PluginFilerListener.java new file mode 100644 index 00000000..6c4d99b6 --- /dev/null +++ b/plugin/src/main/java/com/eul4/listener/PluginFilerListener.java @@ -0,0 +1,23 @@ +package com.eul4.listener; + +import com.eul4.Main; +import lombok.RequiredArgsConstructor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.WorldSaveEvent; + +@RequiredArgsConstructor +public class PluginFilerListener implements Listener +{ + private final Main plugin; + + @EventHandler + public void on(WorldSaveEvent event) + { + if(event.getWorld() == plugin.getMainWorldType().getWorld()) + { + plugin.getRawMaterialMapFiler().save(); + plugin.getCrownInfoFiler().save(); + } + } +} diff --git a/plugin/src/main/java/com/eul4/listener/StructureGuiListener.java b/plugin/src/main/java/com/eul4/listener/StructureGuiListener.java index 440baaed..8ef0d495 100644 --- a/plugin/src/main/java/com/eul4/listener/StructureGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/StructureGuiListener.java @@ -4,7 +4,7 @@ import com.eul4.common.event.GuiClickEvent; import com.eul4.i18n.PluginMessage; import com.eul4.model.inventory.StructureGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.structure.Structure; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/listener/StructureListener.java b/plugin/src/main/java/com/eul4/listener/StructureListener.java index c1890670..59c2882f 100644 --- a/plugin/src/main/java/com/eul4/listener/StructureListener.java +++ b/plugin/src/main/java/com/eul4/listener/StructureListener.java @@ -9,7 +9,7 @@ import com.eul4.exception.CannotConstructException; import com.eul4.exception.StructureAlreadyBuiltException; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.model.town.structure.Structure; diff --git a/plugin/src/main/java/com/eul4/listener/StructureMoveListener.java b/plugin/src/main/java/com/eul4/listener/StructureMoveListener.java index fb51dd50..2a4fffa3 100644 --- a/plugin/src/main/java/com/eul4/listener/StructureMoveListener.java +++ b/plugin/src/main/java/com/eul4/listener/StructureMoveListener.java @@ -6,7 +6,7 @@ import com.eul4.common.wrapper.Pitch; import com.eul4.exception.CannotConstructException; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.TownBlock; import com.eul4.model.town.structure.Structure; import com.eul4.wrapper.StructureItemMove; diff --git a/plugin/src/main/java/com/eul4/listener/StructureShopGuiListener.java b/plugin/src/main/java/com/eul4/listener/StructureShopGuiListener.java index 9acda926..2fe4a6a7 100644 --- a/plugin/src/main/java/com/eul4/listener/StructureShopGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/StructureShopGuiListener.java @@ -6,7 +6,7 @@ import com.eul4.enums.ItemBuilder; import com.eul4.i18n.PluginMessage; import com.eul4.model.inventory.StructureShopGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.util.SoundUtil; import lombok.RequiredArgsConstructor; diff --git a/plugin/src/main/java/com/eul4/listener/TownAttackListener.java b/plugin/src/main/java/com/eul4/listener/TownAttackListener.java index 3ce0ad15..5b1c0a94 100644 --- a/plugin/src/main/java/com/eul4/listener/TownAttackListener.java +++ b/plugin/src/main/java/com/eul4/listener/TownAttackListener.java @@ -2,15 +2,15 @@ import com.destroystokyo.paper.event.block.BlockDestroyEvent; import com.eul4.Main; -import com.eul4.model.craft.town.structure.ResourceStructure; -import com.eul4.model.player.Attacker; +import com.eul4.model.town.structure.ResourceStructure; +import com.eul4.model.player.spiritual.Attacker; import com.eul4.model.player.Fighter; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.model.town.structure.Structure; +import com.eul4.model.town.structure.TransactionalResourceStructure; import com.eul4.wrapper.TownAttack; import lombok.RequiredArgsConstructor; -import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -24,6 +24,7 @@ import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; //TODO: if server restart dropped items in attack will persist and can be "dupped" @RequiredArgsConstructor @@ -177,6 +178,43 @@ public void onAttackerStealResources(BlockBreakEvent event) }); } + @EventHandler(priority = EventPriority.HIGHEST) + public void onAttackerStealTransactionalResources(BlockBreakEvent event) + { + Block block = event.getBlock(); + TownBlock townBlock = Town.getStaticTownBlock(block); + Town town = townBlock == null ? null : townBlock.getTown(); + TownAttack townAttack = town == null ? null : town.getCurrentAttack(); + + if(townAttack == null) + { + return; + } + + Player player = event.getPlayer(); + + if(!(plugin.getPlayerManager().get(player) instanceof Attacker attacker) + || attacker != townAttack.getAttacker() + || !(townBlock.getStructure() instanceof TransactionalResourceStructure structure)) + { + return; + } + + if(!structure.isDestroyed()) + { + return; + } + + ItemStack tool = player.getInventory().getItemInMainHand(); + + structure.findTransactionResource(block).ifPresent(resource -> + { + boolean stole = structure.steal(resource, tool); + event.setCancelled(!stole); + event.setDropItems(false); + }); + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void resetBlockHealthOnBlockBreak(BlockBreakEvent event) { diff --git a/plugin/src/main/java/com/eul4/listener/TownHardnessListener.java b/plugin/src/main/java/com/eul4/listener/TownHardnessListener.java index f226c7a8..5f7004f3 100644 --- a/plugin/src/main/java/com/eul4/listener/TownHardnessListener.java +++ b/plugin/src/main/java/com/eul4/listener/TownHardnessListener.java @@ -5,7 +5,7 @@ import com.eul4.event.StructureConstructEvent; import com.eul4.exception.TownHardnessLimitException; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.model.town.structure.Structure; diff --git a/plugin/src/main/java/com/eul4/listener/TownListener.java b/plugin/src/main/java/com/eul4/listener/TownListener.java index 304e244c..8af45d87 100644 --- a/plugin/src/main/java/com/eul4/listener/TownListener.java +++ b/plugin/src/main/java/com/eul4/listener/TownListener.java @@ -2,9 +2,13 @@ import com.eul4.Main; import com.eul4.common.hologram.Hologram; +import com.eul4.economy.Transaction; import com.eul4.event.TileInteractEvent; +import com.eul4.event.TransactionExecuteEvent; +import com.eul4.holder.Holder; +import com.eul4.holder.TownOwner; import com.eul4.model.inventory.craft.CraftConfirmationGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.model.town.TownTile; @@ -29,6 +33,9 @@ import org.bukkit.event.player.PlayerBucketFillEvent; import org.bukkit.event.player.PlayerInteractEvent; +import java.util.HashSet; +import java.util.Set; + import static org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CUSTOM; @RequiredArgsConstructor @@ -219,4 +226,24 @@ public void on(CreatureSpawnEvent event) event.setCancelled(true); } + + @EventHandler + public void updateCrownBalance(TransactionExecuteEvent event) + { + Transaction transaction = event.getTransaction(); + Set updatedTowns = new HashSet<>(); + + for(Holder involvedHolder : transaction.getInvolvedHolders()) + { + if(involvedHolder instanceof TownOwner townOwner) + { + Town town = plugin.getTownManager().getTownByTownUniqueId(townOwner.getTownUniqueId()); + + if(updatedTowns.add(town)) + { + town.updateCrownBalance(); + } + } + } + } } diff --git a/plugin/src/main/java/com/eul4/listener/TycoonListener.java b/plugin/src/main/java/com/eul4/listener/TycoonListener.java new file mode 100644 index 00000000..87e4b370 --- /dev/null +++ b/plugin/src/main/java/com/eul4/listener/TycoonListener.java @@ -0,0 +1,32 @@ +package com.eul4.listener; + +import com.eul4.Main; +import com.eul4.economy.Transaction; +import com.eul4.event.TransactionExecuteEvent; +import com.eul4.holder.Holder; +import com.eul4.holder.TownOwner; +import lombok.RequiredArgsConstructor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +@RequiredArgsConstructor +public class TycoonListener implements Listener +{ + private final Main plugin; + + @EventHandler(priority = EventPriority.MONITOR) + public void updateCrownBalance(TransactionExecuteEvent event) + { + Transaction transaction = event.getTransaction(); + + for(Holder involvedHolder : transaction.getInvolvedHolders()) + { + if(involvedHolder instanceof TownOwner) + { + plugin.getTycoonManager().updateTycoonAsync(); + return; + } + } + } +} diff --git a/plugin/src/main/java/com/eul4/listener/hotbar/DefenderSpectatorHotbarListener.java b/plugin/src/main/java/com/eul4/listener/hotbar/DefenderSpectatorHotbarListener.java index 018458f1..1b6fc034 100644 --- a/plugin/src/main/java/com/eul4/listener/hotbar/DefenderSpectatorHotbarListener.java +++ b/plugin/src/main/java/com/eul4/listener/hotbar/DefenderSpectatorHotbarListener.java @@ -2,9 +2,7 @@ import com.eul4.Main; import com.eul4.hotbar.DefenderSpectatorHotbar; -import com.eul4.hotbar.RaidSpectatorHotbar; -import com.eul4.model.player.DefenderSpectator; -import com.eul4.model.player.RaidSpectator; +import com.eul4.model.player.spiritual.DefenderSpectator; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/plugin/src/main/java/com/eul4/listener/hotbar/RaidAnalyzerHotbarListener.java b/plugin/src/main/java/com/eul4/listener/hotbar/RaidAnalyzerHotbarListener.java index 8bd9e57c..3ea617be 100644 --- a/plugin/src/main/java/com/eul4/listener/hotbar/RaidAnalyzerHotbarListener.java +++ b/plugin/src/main/java/com/eul4/listener/hotbar/RaidAnalyzerHotbarListener.java @@ -2,8 +2,9 @@ import com.eul4.Main; import com.eul4.hotbar.RaidAnalyzerHotbar; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import lombok.RequiredArgsConstructor; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -28,7 +29,9 @@ public void on(PlayerInteractEvent event) RaidAnalyzerHotbar hotbar = raidAnalyzer.getHotbar(); - if(item.equals(hotbar.getAttack())) + //TODO: As espadas dessa hotbar começou bugar por causa do toggle-combat, + // por isso é melhor verificar o item por NamespacedKeys e enums + if(hotbar.getAttack() != null && item.getType() == hotbar.getAttack().getType()) { raidAnalyzer.attack(); } diff --git a/plugin/src/main/java/com/eul4/listener/hotbar/RaidSpectatorHotbarListener.java b/plugin/src/main/java/com/eul4/listener/hotbar/RaidSpectatorHotbarListener.java index 47525547..b06bb3c1 100644 --- a/plugin/src/main/java/com/eul4/listener/hotbar/RaidSpectatorHotbarListener.java +++ b/plugin/src/main/java/com/eul4/listener/hotbar/RaidSpectatorHotbarListener.java @@ -1,10 +1,8 @@ package com.eul4.listener.hotbar; import com.eul4.Main; -import com.eul4.hotbar.RaidAnalyzerHotbar; import com.eul4.hotbar.RaidSpectatorHotbar; -import com.eul4.model.player.RaidAnalyzer; -import com.eul4.model.player.RaidSpectator; +import com.eul4.model.player.spiritual.RaidSpectator; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/plugin/src/main/java/com/eul4/listener/inventory/ArmoryGuiListener.java b/plugin/src/main/java/com/eul4/listener/inventory/ArmoryGuiListener.java index 5c4690e1..4113c76c 100644 --- a/plugin/src/main/java/com/eul4/listener/inventory/ArmoryGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/inventory/ArmoryGuiListener.java @@ -2,7 +2,7 @@ import com.eul4.Main; import com.eul4.model.inventory.ArmoryGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/plugin/src/main/java/com/eul4/listener/inventory/ArmoryMenuGuiListener.java b/plugin/src/main/java/com/eul4/listener/inventory/ArmoryMenuGuiListener.java index 6e925abe..4444f22d 100644 --- a/plugin/src/main/java/com/eul4/listener/inventory/ArmoryMenuGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/inventory/ArmoryMenuGuiListener.java @@ -5,9 +5,8 @@ import com.eul4.model.inventory.ArmoryMenuGui; import com.eul4.model.inventory.craft.CraftArmoryMyInventoryMenuGui; import com.eul4.model.inventory.craft.CraftArmoryWeaponShopGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import lombok.RequiredArgsConstructor; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/plugin/src/main/java/com/eul4/listener/inventory/ArmoryMyInventoryMenuGuiListener.java b/plugin/src/main/java/com/eul4/listener/inventory/ArmoryMyInventoryMenuGuiListener.java index 07fd5bb2..209ffee7 100644 --- a/plugin/src/main/java/com/eul4/listener/inventory/ArmoryMyInventoryMenuGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/inventory/ArmoryMyInventoryMenuGuiListener.java @@ -7,8 +7,8 @@ import com.eul4.model.craft.player.CraftInventoryOrganizerPlayer; import com.eul4.model.inventory.ArmoryMyInventoryMenuGui; import com.eul4.model.inventory.craft.CraftArmorySelectOrStorageItemsGui; -import com.eul4.model.player.InventoryOrganizerPlayer; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.spiritual.InventoryOrganizerPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.structure.Armory; import com.eul4.util.SoundUtil; import lombok.RequiredArgsConstructor; diff --git a/plugin/src/main/java/com/eul4/listener/inventory/ArmorySelectOrStorageItemsGuiListener.java b/plugin/src/main/java/com/eul4/listener/inventory/ArmorySelectOrStorageItemsGuiListener.java index f8f0e7ed..0ae950dc 100644 --- a/plugin/src/main/java/com/eul4/listener/inventory/ArmorySelectOrStorageItemsGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/inventory/ArmorySelectOrStorageItemsGuiListener.java @@ -3,24 +3,16 @@ import com.eul4.Main; import com.eul4.common.event.GuiClickEvent; import com.eul4.common.event.GuiCloseEvent; -import com.eul4.common.wrapper.Pitch; import com.eul4.model.inventory.ArmorySelectOrStorageItemsGui; -import com.eul4.model.inventory.craft.CraftArmorySelectOrStorageItemsGui; -import com.eul4.model.player.InventoryOrganizerPlayer; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.spiritual.InventoryOrganizerPlayer; import com.eul4.model.town.structure.Armory; -import com.eul4.service.PurchaseV2; import lombok.RequiredArgsConstructor; -import org.bukkit.Bukkit; -import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryDragEvent; -import org.bukkit.inventory.ItemStack; @RequiredArgsConstructor public class ArmorySelectOrStorageItemsGuiListener implements Listener diff --git a/plugin/src/main/java/com/eul4/listener/inventory/ArmoryWeaponShopGuiListener.java b/plugin/src/main/java/com/eul4/listener/inventory/ArmoryWeaponShopGuiListener.java index bd257f6b..81684040 100644 --- a/plugin/src/main/java/com/eul4/listener/inventory/ArmoryWeaponShopGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/inventory/ArmoryWeaponShopGuiListener.java @@ -2,17 +2,13 @@ import com.eul4.Main; import com.eul4.common.event.GuiClickEvent; -import com.eul4.common.wrapper.Pitch; -import com.eul4.i18n.PluginMessage; import com.eul4.model.inventory.ArmoryWeaponShopGui; import com.eul4.model.inventory.craft.CraftArmoryWeaponShopGui; import com.eul4.model.inventory.craft.CraftConfirmationGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.service.PurchaseV2; import com.eul4.util.SoundUtil; import lombok.RequiredArgsConstructor; -import net.kyori.adventure.text.Component; -import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/plugin/src/main/java/com/eul4/listener/inventory/AssistantGuiListener.java b/plugin/src/main/java/com/eul4/listener/inventory/AssistantGuiListener.java index f1115f5e..05ce3aec 100644 --- a/plugin/src/main/java/com/eul4/listener/inventory/AssistantGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/inventory/AssistantGuiListener.java @@ -4,7 +4,7 @@ import com.eul4.common.model.player.CommonPlayer; import com.eul4.model.inventory.AssistantGui; import com.eul4.model.inventory.craft.CraftStructureShopGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/plugin/src/main/java/com/eul4/listener/inventory/TownHallGuiListener.java b/plugin/src/main/java/com/eul4/listener/inventory/TownHallGuiListener.java index b59f6c1a..7ff6f68b 100644 --- a/plugin/src/main/java/com/eul4/listener/inventory/TownHallGuiListener.java +++ b/plugin/src/main/java/com/eul4/listener/inventory/TownHallGuiListener.java @@ -2,19 +2,14 @@ import com.eul4.Main; import com.eul4.common.event.GuiClickEvent; -import com.eul4.common.model.player.CommonPlayer; -import com.eul4.model.inventory.AssistantGui; import com.eul4.model.inventory.TownHallGui; import com.eul4.model.inventory.craft.CraftAssistantGui; -import com.eul4.model.inventory.craft.CraftStructureShopGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import lombok.RequiredArgsConstructor; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.inventory.ItemStack; @RequiredArgsConstructor diff --git a/plugin/src/main/java/com/eul4/listener/player/AttackerListener.java b/plugin/src/main/java/com/eul4/listener/player/AttackerListener.java index 60e15127..1ecc1b21 100644 --- a/plugin/src/main/java/com/eul4/listener/player/AttackerListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/AttackerListener.java @@ -2,7 +2,7 @@ import com.destroystokyo.paper.event.player.PlayerPostRespawnEvent; import com.eul4.Main; -import com.eul4.model.player.Attacker; +import com.eul4.model.player.spiritual.Attacker; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import lombok.RequiredArgsConstructor; diff --git a/plugin/src/main/java/com/eul4/listener/player/DefenderListener.java b/plugin/src/main/java/com/eul4/listener/player/DefenderListener.java index b7c970c1..44f88340 100644 --- a/plugin/src/main/java/com/eul4/listener/player/DefenderListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/DefenderListener.java @@ -2,7 +2,7 @@ import com.destroystokyo.paper.event.player.PlayerPostRespawnEvent; import com.eul4.Main; -import com.eul4.model.player.Defender; +import com.eul4.model.player.spiritual.Defender; import com.eul4.type.player.SpiritualPlayerType; import com.eul4.wrapper.TownAttack; import lombok.RequiredArgsConstructor; diff --git a/plugin/src/main/java/com/eul4/listener/player/InventoryOrganizerPlayerListener.java b/plugin/src/main/java/com/eul4/listener/player/InventoryOrganizerPlayerListener.java index 372cb687..d4df3d83 100644 --- a/plugin/src/main/java/com/eul4/listener/player/InventoryOrganizerPlayerListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/InventoryOrganizerPlayerListener.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.common.event.GuiClickEvent; import com.eul4.common.event.GuiCloseEvent; -import com.eul4.model.player.InventoryOrganizerPlayer; +import com.eul4.model.player.spiritual.InventoryOrganizerPlayer; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/plugin/src/main/java/com/eul4/listener/player/TutorialTownPlayerListener.java b/plugin/src/main/java/com/eul4/listener/player/TutorialTownPlayerListener.java index a863f8f0..7465f4fc 100644 --- a/plugin/src/main/java/com/eul4/listener/player/TutorialTownPlayerListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/TutorialTownPlayerListener.java @@ -10,7 +10,7 @@ import com.eul4.model.inventory.GeneratorGui; import com.eul4.model.inventory.TownHallGui; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.util.SoundUtil; import io.papermc.paper.event.player.AsyncChatEvent; import lombok.RequiredArgsConstructor; diff --git a/plugin/src/main/java/com/eul4/listener/player/VanillaListener.java b/plugin/src/main/java/com/eul4/listener/player/VanillaListener.java index adb5df90..3e956ff1 100644 --- a/plugin/src/main/java/com/eul4/listener/player/VanillaListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/VanillaListener.java @@ -3,7 +3,7 @@ import com.destroystokyo.paper.event.player.PlayerPostRespawnEvent; import com.eul4.Main; import com.eul4.common.world.CommonWorld; -import com.eul4.model.player.VanillaPlayer; +import com.eul4.model.player.physical.VanillaPlayer; import com.eul4.type.PluginWorldType; import com.eul4.world.RaidLevel; import lombok.RequiredArgsConstructor; diff --git a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/AssistantStepListener.java b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/AssistantStepListener.java index 704975b2..1c1974b2 100644 --- a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/AssistantStepListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/AssistantStepListener.java @@ -2,14 +2,12 @@ import com.eul4.Main; import com.eul4.event.AssistantInteractEvent; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.AssistantStep; import lombok.RequiredArgsConstructor; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerInteractEntityEvent; @RequiredArgsConstructor public class AssistantStepListener implements Listener diff --git a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/ClickToFinishTownHallStepListener.java b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/ClickToFinishTownHallStepListener.java index 8dcbd17f..28141eba 100644 --- a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/ClickToFinishTownHallStepListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/ClickToFinishTownHallStepListener.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.event.StructureFinishEvent; import com.eul4.event.StructureInteractEvent; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.ClickToFinishTownHallStep; import com.eul4.model.town.structure.Structure; import com.eul4.model.town.structure.TownHall; diff --git a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/CollectDislikesStepListener.java b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/CollectDislikesStepListener.java index c93b0653..0cabbdcc 100644 --- a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/CollectDislikesStepListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/CollectDislikesStepListener.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.event.DislikeGeneratorCollectEvent; import com.eul4.event.StructureInteractEvent; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CollectDislikesStep; import com.eul4.model.town.structure.DislikeGenerator; import com.eul4.model.town.structure.Structure; diff --git a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/CollectLikesStepListener.java b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/CollectLikesStepListener.java index 97736a4b..b71e5c29 100644 --- a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/CollectLikesStepListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/CollectLikesStepListener.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.event.LikeGeneratorCollectEvent; import com.eul4.event.StructureInteractEvent; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CollectLikesStep; import com.eul4.model.town.structure.LikeGenerator; import com.eul4.model.town.structure.Structure; diff --git a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/UpgradeTownHallStepListener.java b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/UpgradeTownHallStepListener.java index 55ed2fec..4bcc1e6c 100644 --- a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/UpgradeTownHallStepListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/UpgradeTownHallStepListener.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.event.StructureInteractEvent; import com.eul4.event.StructureUpgradeEvent; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.UpgradeTownHallStep; import com.eul4.model.town.structure.Structure; import com.eul4.model.town.structure.TownHall; diff --git a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/WaitFinishTownHallStepListener.java b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/WaitFinishTownHallStepListener.java index 8763d211..10aa7546 100644 --- a/plugin/src/main/java/com/eul4/listener/player/tutorial/step/WaitFinishTownHallStepListener.java +++ b/plugin/src/main/java/com/eul4/listener/player/tutorial/step/WaitFinishTownHallStepListener.java @@ -3,7 +3,7 @@ import com.eul4.Main; import com.eul4.event.StructureInteractEvent; import com.eul4.event.StructureReadyEvent; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.WaitFinishTownHallStep; import com.eul4.model.town.structure.Structure; import com.eul4.model.town.structure.TownHall; diff --git a/plugin/src/main/java/com/eul4/listener/scoreboard/AnalyzerScoreboardListener.java b/plugin/src/main/java/com/eul4/listener/scoreboard/AnalyzerScoreboardListener.java index 5354bbfd..3074e296 100644 --- a/plugin/src/main/java/com/eul4/listener/scoreboard/AnalyzerScoreboardListener.java +++ b/plugin/src/main/java/com/eul4/listener/scoreboard/AnalyzerScoreboardListener.java @@ -5,49 +5,51 @@ import com.eul4.common.event.CommonPlayerUnregisterEvent; import com.eul4.event.*; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import com.eul4.model.town.Town; import com.eul4.model.town.structure.TownHall; import com.eul4.scoreboard.AnalyzerScoreboard; import lombok.RequiredArgsConstructor; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; +import java.util.function.Consumer; @RequiredArgsConstructor public class AnalyzerScoreboardListener implements Listener { private final Main plugin; + @EventHandler + public void on(LikeChangeEvent event) + { + update(event, AnalyzerScoreboard::updateLikesTeam); + } + @EventHandler public void on(DislikeChangeEvent event) { - event.getTown().findAnalyzer() - .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updateDislikesTeam); + update(event, AnalyzerScoreboard::updateDislikesTeam); } @EventHandler - public void on(LikeChangeEvent event) + public void on(CrownChangeEvent event) { - event.getTown().findAnalyzer() - .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updateLikesTeam); + update(event, AnalyzerScoreboard::updateCrownsTeam); } @EventHandler public void on(TownCapacityChangeEvent event) { - event.getTown().findAnalyzer() - .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updateLikesAndDislikesTeams); + update(event, AnalyzerScoreboard::updateLikesAndDislikesTeams); } @EventHandler public void on(TownHardnessChangeEvent event) { - event.getTown().findAnalyzer() - .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updateHardnessTeam); + update(event, AnalyzerScoreboard::updateHardnessTeam); } @EventHandler @@ -64,10 +66,7 @@ public void on(StructureFinishEvent event) return; } - townHall.getTown() - .findAnalyzer() - .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updateTownHallLevelTeam); + update(townHall.getTown(), AnalyzerScoreboard::updateTownHallLevelTeam); } @EventHandler @@ -75,10 +74,7 @@ public void on(CommonPlayerRegisterEvent event) { PluginPlayer pluginPlayer = (PluginPlayer) event.getCommonPlayer(); - pluginPlayer.findTown() - .flatMap(Town::findAnalyzer) - .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updatePlayerStatusTeam); + update(pluginPlayer, AnalyzerScoreboard::updatePlayerStatusTeam); } @EventHandler @@ -86,36 +82,42 @@ public void on(CommonPlayerUnregisterEvent event) { PluginPlayer pluginPlayer = (PluginPlayer) event.getCommonPlayer(); - pluginPlayer.findTown() - .flatMap(Town::findAnalyzer) - .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updatePlayerStatusTeam); + update(pluginPlayer, AnalyzerScoreboard::updatePlayerStatusTeam); } @EventHandler public void on(GenerateLikeEvent event) { - event.getTown() - .findAnalyzer() - .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updateLikesTeam); + update(event, AnalyzerScoreboard::updateLikesTeam); } @EventHandler public void on(GenerateDislikeEvent event) { - event.getTown() - .findAnalyzer() - .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updateDislikesTeam); + update(event, AnalyzerScoreboard::updateDislikesTeam); } @EventHandler public void on(GeneratorsCapacityChangeEvent event) { - event.getTown() - .findAnalyzer() + update(event, AnalyzerScoreboard::updateLikesAndDislikesTeams); + } + + private void update(PluginPlayer pluginPlayer, Consumer action) + { + update(pluginPlayer.getTown(), action); + } + + private void update(TownEvent townEvent, Consumer action) + { + update(townEvent.getTown(), action); + } + + private void update(@Nullable Town town, Consumer action) + { + Optional.ofNullable(town) + .map(Town::getAnalyzer) .map(RaidAnalyzer::getScoreboard) - .ifPresent(AnalyzerScoreboard::updateLikesAndDislikesTeams); + .ifPresent(action); } } diff --git a/plugin/src/main/java/com/eul4/listener/scoreboard/TownScoreboardListener.java b/plugin/src/main/java/com/eul4/listener/scoreboard/TownScoreboardListener.java index db948a08..79b1f2f7 100644 --- a/plugin/src/main/java/com/eul4/listener/scoreboard/TownScoreboardListener.java +++ b/plugin/src/main/java/com/eul4/listener/scoreboard/TownScoreboardListener.java @@ -1,16 +1,16 @@ package com.eul4.listener.scoreboard; import com.eul4.Main; -import com.eul4.event.DislikeChangeEvent; -import com.eul4.event.LikeChangeEvent; -import com.eul4.event.TownCapacityChangeEvent; -import com.eul4.event.TownHardnessChangeEvent; +import com.eul4.event.*; import com.eul4.model.player.TownScoreboardPlayer; +import com.eul4.model.town.Town; import com.eul4.scoreboard.TownScoreboard; import lombok.RequiredArgsConstructor; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import java.util.function.Consumer; + @RequiredArgsConstructor public class TownScoreboardListener implements Listener { @@ -19,21 +19,19 @@ public class TownScoreboardListener implements Listener @EventHandler public void on(DislikeChangeEvent event) { - event.getTown().findPluginPlayer() - .filter(TownScoreboardPlayer.class::isInstance) - .map(TownScoreboardPlayer.class::cast) - .map(TownScoreboardPlayer::getTownScoreboard) - .ifPresent(TownScoreboard::updateDislikesTeam); + update(event, TownScoreboard::updateDislikesTeam); } @EventHandler public void on(LikeChangeEvent event) { - event.getTown().findPluginPlayer() - .filter(TownScoreboardPlayer.class::isInstance) - .map(TownScoreboardPlayer.class::cast) - .map(TownScoreboardPlayer::getTownScoreboard) - .ifPresent(TownScoreboard::updateLikesTeam); + update(event, TownScoreboard::updateLikesTeam); + } + + @EventHandler + public void on(CrownChangeEvent event) + { + update(event, TownScoreboard::updateCrownsTeam); } @EventHandler @@ -55,4 +53,18 @@ public void on(TownHardnessChangeEvent event) .map(TownScoreboardPlayer::getTownScoreboard) .ifPresent(TownScoreboard::updateHardnessTeam); } + + private void update(TownEvent townEvent, Consumer action) + { + update(townEvent.getTown(), action); + } + + private void update(Town town, Consumer action) + { + town.findPluginPlayer() + .filter(TownScoreboardPlayer.class::isInstance) + .map(TownScoreboardPlayer.class::cast) + .map(TownScoreboardPlayer::getTownScoreboard) + .ifPresent(action); + } } diff --git a/plugin/src/main/java/com/eul4/listener/structure/ArmoryListener.java b/plugin/src/main/java/com/eul4/listener/structure/ArmoryListener.java index bdd9564e..be914ca9 100644 --- a/plugin/src/main/java/com/eul4/listener/structure/ArmoryListener.java +++ b/plugin/src/main/java/com/eul4/listener/structure/ArmoryListener.java @@ -2,7 +2,7 @@ import com.eul4.Main; import com.eul4.model.inventory.craft.CraftArmoryMenuGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.structure.Armory; import lombok.RequiredArgsConstructor; diff --git a/plugin/src/main/java/com/eul4/listener/structure/TransactionResourceStructureListener.java b/plugin/src/main/java/com/eul4/listener/structure/TransactionResourceStructureListener.java new file mode 100644 index 00000000..f4c5fbfa --- /dev/null +++ b/plugin/src/main/java/com/eul4/listener/structure/TransactionResourceStructureListener.java @@ -0,0 +1,32 @@ +package com.eul4.listener.structure; + +import com.eul4.Main; +import com.eul4.event.StructureDestroyEvent; +import com.eul4.event.TransactionalResourceStructureStealEvent; +import com.eul4.model.town.structure.TransactionalResourceStructure; +import lombok.RequiredArgsConstructor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +@RequiredArgsConstructor +public class TransactionResourceStructureListener implements Listener +{ + private final Main plugin; + + @EventHandler + public void onDestroy(StructureDestroyEvent event) + { + if(!(event.getStructure() instanceof TransactionalResourceStructure structure)) + { + return; + } + + structure.placeTransactionalResources(); + } + + @EventHandler + public void onSteal(TransactionalResourceStructureStealEvent event) + { + event.getStructure().updateHologram(); + } +} diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftAdmin.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftAdmin.java index b86df5e1..09a68e07 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftAdmin.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftAdmin.java @@ -1,7 +1,7 @@ package com.eul4.model.craft.player; import com.eul4.Main; -import com.eul4.model.player.Admin; +import com.eul4.model.player.physical.Admin; import com.eul4.model.player.PluginPlayer; import com.eul4.type.player.PhysicalPlayerType; import org.bukkit.GameMode; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftAttacker.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftAttacker.java index c759fe2e..c240656d 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftAttacker.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftAttacker.java @@ -1,9 +1,9 @@ package com.eul4.model.craft.player; import com.eul4.Main; -import com.eul4.model.player.Attacker; +import com.eul4.model.player.spiritual.Attacker; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.type.player.SpiritualPlayerType; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftDefender.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftDefender.java index 254d8e6e..037e663a 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftDefender.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftDefender.java @@ -2,7 +2,7 @@ import com.eul4.Main; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.Defender; +import com.eul4.model.player.spiritual.Defender; import com.eul4.model.player.PluginPlayer; import com.eul4.model.town.Town; import com.eul4.type.player.SpiritualPlayerType; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftDefenderSpectator.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftDefenderSpectator.java index 7126b012..3333c937 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftDefenderSpectator.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftDefenderSpectator.java @@ -2,7 +2,7 @@ import com.eul4.Main; import com.eul4.hotbar.DefenderSpectatorHotbar; -import com.eul4.model.player.DefenderSpectator; +import com.eul4.model.player.spiritual.DefenderSpectator; import com.eul4.model.player.PluginPlayer; import com.eul4.type.player.PhysicalPlayerType; import com.eul4.type.player.SpiritualPlayerType; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftFighter.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftFighter.java index 7a7e1dd0..00f80006 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftFighter.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftFighter.java @@ -1,24 +1,13 @@ package com.eul4.model.craft.player; import com.eul4.Main; -import com.eul4.model.player.Attacker; import com.eul4.model.player.Fighter; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.RaidAnalyzer; -import com.eul4.model.town.Town; -import com.eul4.model.town.TownBlock; -import com.eul4.type.player.SpiritualPlayerType; -import com.eul4.wrapper.TownAttack; import lombok.Getter; import lombok.Setter; -import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; -import java.util.function.Predicate; -import java.util.logging.Level; - public abstract class CraftFighter extends CraftSpiritualPlayer implements Fighter { @Setter diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftInventoryOrganizerPlayer.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftInventoryOrganizerPlayer.java index 5eac0299..5b2088bd 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftInventoryOrganizerPlayer.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftInventoryOrganizerPlayer.java @@ -1,7 +1,7 @@ package com.eul4.model.craft.player; import com.eul4.Main; -import com.eul4.model.player.InventoryOrganizerPlayer; +import com.eul4.model.player.spiritual.InventoryOrganizerPlayer; import com.eul4.model.player.PluginPlayer; import com.eul4.type.player.SpiritualPlayerType; import lombok.Getter; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftPluginPlayer.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftPluginPlayer.java index d7622f3c..75f007c6 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftPluginPlayer.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftPluginPlayer.java @@ -233,4 +233,10 @@ public void setAttackSpeed(boolean attackSpeed) { pluginPlayerData.setNewCombat(attackSpeed); } + + @Override + public boolean isTycoon() + { + return getTown() == plugin.getTycoonManager().getTycoonTown(); + } } diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftRaidAnalyzer.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftRaidAnalyzer.java index 85b7fe16..8d2f0bc7 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftRaidAnalyzer.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftRaidAnalyzer.java @@ -5,7 +5,7 @@ import com.eul4.hotbar.RaidAnalyzerHotbar; import com.eul4.i18n.PluginMessage; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import com.eul4.model.town.Town; import com.eul4.scoreboard.AnalyzerScoreboard; import com.eul4.scoreboard.CraftAnalyzerScoreboard; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftRaidSpectator.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftRaidSpectator.java index dc7eeb3c..2f10f115 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftRaidSpectator.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftRaidSpectator.java @@ -4,10 +4,9 @@ import com.eul4.hotbar.RaidSpectatorHotbar; import com.eul4.i18n.PluginMessage; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.RaidSpectator; +import com.eul4.model.player.spiritual.RaidSpectator; import com.eul4.type.player.PhysicalPlayerType; import com.eul4.type.player.SpiritualPlayerType; -import com.eul4.wrapper.TownAttack; import lombok.Getter; import org.bukkit.GameMode; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftSpawnPlayer.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftSpawnPlayer.java index c1926677..c1e19d46 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftSpawnPlayer.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftSpawnPlayer.java @@ -4,12 +4,11 @@ import com.eul4.common.scoreboard.CommonScoreboard; import com.eul4.i18n.PluginMessage; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.SpawnPlayer; +import com.eul4.model.player.physical.SpawnPlayer; import com.eul4.scoreboard.CraftInitialScoreboard; import com.eul4.scoreboard.CraftTownScoreboard; import com.eul4.type.PluginWorldType; import com.eul4.type.player.PhysicalPlayerType; -import com.eul4.world.RaidWorld; import com.eul4.world.SpawnProtectedLevel; import lombok.Getter; import org.bukkit.GameMode; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftTownPlayer.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftTownPlayer.java index a6750f92..e2fbe0e6 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftTownPlayer.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftTownPlayer.java @@ -4,7 +4,7 @@ import com.eul4.common.i18n.CommonMessage; import com.eul4.i18n.PluginMessage; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.scoreboard.CraftTownScoreboard; import com.eul4.scoreboard.TownScoreboard; import com.eul4.type.player.PhysicalPlayerType; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftTutorialTownPlayer.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftTutorialTownPlayer.java index 6cce3ad0..7915939d 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftTutorialTownPlayer.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftTutorialTownPlayer.java @@ -3,9 +3,8 @@ import com.eul4.Main; import com.eul4.common.wrapper.Pitch; import com.eul4.i18n.TutorialTownMessage; -import com.eul4.model.craft.player.tutorial.step.CraftStep1; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step; import com.eul4.type.player.PhysicalPlayerType; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/CraftVanillaPlayer.java b/plugin/src/main/java/com/eul4/model/craft/player/CraftVanillaPlayer.java index 99b78599..fb90d26a 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/CraftVanillaPlayer.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/CraftVanillaPlayer.java @@ -4,12 +4,11 @@ import com.eul4.common.scoreboard.CommonScoreboard; import com.eul4.i18n.PluginMessage; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.VanillaPlayer; +import com.eul4.model.player.physical.VanillaPlayer; import com.eul4.scoreboard.CraftInitialScoreboard; import com.eul4.scoreboard.CraftTownScoreboard; import com.eul4.type.PluginWorldType; import com.eul4.type.player.PhysicalPlayerType; -import com.eul4.world.RaidLevel; import com.eul4.world.VanillaLevel; import com.eul4.wrapper.ChannelingTask; import lombok.Getter; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectDislikesStep.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectDislikesStep.java index e8bca50e..565c8dc7 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectDislikesStep.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectDislikesStep.java @@ -1,7 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; import com.eul4.common.i18n.MessageArgs; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CollectDislikesStep; public abstract class CraftCollectDislikesStep extends CraftCollectGeneratorStep implements CollectDislikesStep diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectGeneratorStep.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectGeneratorStep.java index 109cf1ec..cedd0776 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectGeneratorStep.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectGeneratorStep.java @@ -1,7 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; import com.eul4.common.i18n.MessageArgs; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CollectGeneratorStep; import lombok.Getter; import lombok.Setter; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectLikesStep.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectLikesStep.java index c7bf08a3..182fef91 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectLikesStep.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftCollectLikesStep.java @@ -1,7 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; import com.eul4.common.i18n.MessageArgs; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CollectLikesStep; public abstract class CraftCollectLikesStep extends CraftCollectGeneratorStep implements CollectLikesStep diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep.java index c735b8f1..e7825509 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep.java @@ -1,7 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; import com.eul4.common.i18n.MessageArgs; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.Step; import com.eul4.util.FaweUtil; import com.sk89q.worldedit.math.Vector3; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep1.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep1.java index cc257df3..6bcef590 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep1.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep1.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step1; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep10.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep10.java index 2adb6817..159a14b9 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep10.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep10.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step10; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep11.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep11.java index 9440d45d..0629a248 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep11.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep11.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step11; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep12.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep12.java index 17aaea95..749b93d9 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep12.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep12.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step12; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep13.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep13.java index d859846c..41acfd77 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep13.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep13.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step13; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep14.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep14.java index e59c52a6..82ffb44d 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep14.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep14.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step14; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep15.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep15.java index a936d9fb..4bc82d37 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep15.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep15.java @@ -1,8 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step13; import com.eul4.model.player.tutorial.step.Step15; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep16.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep16.java index 5addc389..f2264c03 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep16.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep16.java @@ -1,8 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step13; import com.eul4.model.player.tutorial.step.Step16; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep17.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep17.java index 0796d2b9..df354d68 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep17.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep17.java @@ -1,8 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step13; import com.eul4.model.player.tutorial.step.Step17; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep18.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep18.java index 5f2f0265..fde05f55 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep18.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep18.java @@ -1,8 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step13; import com.eul4.model.player.tutorial.step.Step18; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep19.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep19.java index 94bd0515..b58bfc94 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep19.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep19.java @@ -1,8 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step13; import com.eul4.model.player.tutorial.step.Step19; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep2.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep2.java index fcb4d262..f95d665e 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep2.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep2.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step2; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep20.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep20.java index 1ee0912a..023bbe9d 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep20.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep20.java @@ -1,8 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step13; import com.eul4.model.player.tutorial.step.Step20; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep21.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep21.java index 670232fd..dbf535f1 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep21.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep21.java @@ -1,8 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step13; import com.eul4.model.player.tutorial.step.Step21; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep22.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep22.java index d3887196..bf9c077a 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep22.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep22.java @@ -1,8 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step13; import com.eul4.model.player.tutorial.step.Step22; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep23.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep23.java index ba6192f1..0d5c772e 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep23.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep23.java @@ -1,9 +1,8 @@ package com.eul4.model.craft.player.tutorial.step; import com.eul4.enums.StructureStatus; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step13; import com.eul4.model.player.tutorial.step.Step23; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep24.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep24.java index 4b0f90a0..3ce606aa 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep24.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep24.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step24; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep25.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep25.java index abf370a6..b3094cd1 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep25.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep25.java @@ -1,8 +1,7 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; -import com.eul4.model.player.tutorial.step.Step23; import com.eul4.model.player.tutorial.step.Step25; import static com.eul4.i18n.TutorialTownMessage.*; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep3.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep3.java index 99a50ea9..bdbcf9bf 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep3.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep3.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step3; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep4.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep4.java index 14013767..d72a70b1 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep4.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep4.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step4; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep5.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep5.java index d4d691c4..b7483ed0 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep5.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep5.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step5; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep6.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep6.java index 101f2987..156ce979 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep6.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep6.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step6; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep7.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep7.java index d168f6de..4c02bf95 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep7.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep7.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step7; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep8.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep8.java index e28810bb..f404b5dc 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep8.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep8.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step8; diff --git a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep9.java b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep9.java index 14263f43..d1121927 100644 --- a/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep9.java +++ b/plugin/src/main/java/com/eul4/model/craft/player/tutorial/step/CraftStep9.java @@ -1,6 +1,6 @@ package com.eul4.model.craft.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import com.eul4.model.player.tutorial.step.CheckpointStepEnum; import com.eul4.model.player.tutorial.step.Step9; diff --git a/plugin/src/main/java/com/eul4/model/craft/town/CraftTown.java b/plugin/src/main/java/com/eul4/model/craft/town/CraftTown.java index 20ef7b99..ed8f1ac4 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/CraftTown.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/CraftTown.java @@ -8,25 +8,25 @@ import com.eul4.common.util.EntityUtil; import com.eul4.common.util.ThreadUtil; import com.eul4.common.wrapper.Pitch; +import com.eul4.economy.Transaction; import com.eul4.event.*; -import com.eul4.exception.CannotConstructException; -import com.eul4.exception.InsufficientBalanceException; -import com.eul4.exception.StructureLimitException; -import com.eul4.exception.TownHardnessLimitException; +import com.eul4.exception.*; +import com.eul4.holder.CapacitatedCrownHolder; import com.eul4.i18n.PluginMessage; import com.eul4.model.craft.town.structure.CraftDislikeGenerator; import com.eul4.model.craft.town.structure.CraftLikeGenerator; import com.eul4.model.craft.town.structure.CraftTownHall; -import com.eul4.model.player.Attacker; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.RaidAnalyzer; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; +import com.eul4.model.player.spiritual.Attacker; +import com.eul4.model.player.spiritual.RaidAnalyzer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.model.town.TownTile; import com.eul4.model.town.structure.*; import com.eul4.wrapper.*; import com.fastasyncworldedit.core.FaweAPI; +import com.google.common.base.Preconditions; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.entity.BaseEntity; @@ -60,12 +60,14 @@ import org.bukkit.util.Vector; import org.enginehub.linbus.tree.LinByteTag; import org.enginehub.linbus.tree.LinTagType; +import org.jetbrains.annotations.NotNull; import java.awt.*; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.math.BigDecimal; import java.text.MessageFormat; import java.util.List; import java.util.*; @@ -86,7 +88,8 @@ public class CraftTown implements Town { public static final Map TOWN_BLOCKS = new HashMap<>(); - private final UUID ownerUUID; + private final UUID townUniqueId; + private final UUID ownerUniqueId; private final Block block; private final Main plugin; @@ -138,22 +141,36 @@ public class CraftTown implements Town private transient EntityItemMoveMap entityItemMoveMap = new EntityItemMoveMap(); private transient AssistantTargetTask assistantTargetTask; - public CraftTown(UUID ownerUUID, Block block, Main plugin) + private transient BigDecimal calculatedCrownBalance; + + public CraftTown(UUID ownerUniqueId, Block block, Main plugin) { - this.ownerUUID = ownerUUID; - this.block = block; - this.plugin = plugin; + this(UUID.randomUUID(), ownerUniqueId, block, plugin); + } + + public CraftTown + ( + @NotNull UUID townUniqueId, + @NotNull UUID ownerUniqueId, + @NotNull Block block, + @NotNull Main plugin + ) + { + this.townUniqueId = Preconditions.checkNotNull(townUniqueId); + this.ownerUniqueId = Preconditions.checkNotNull(ownerUniqueId); + this.block = Preconditions.checkNotNull(block); + this.plugin = Preconditions.checkNotNull(plugin); } public CraftTown(OfflinePlayer owner, Block block, Main plugin) throws CannotConstructException, IOException { this(owner.getUniqueId(), block, plugin); - this.boughtTileMapByDepth = new BoughtTileMapByDepth(ownerUUID); + this.boughtTileMapByDepth = new BoughtTileMapByDepth(ownerUniqueId); this.townBlockMap = getInitialTownBlocks(); this.townTileMap = getInitialTownTiles(); - this.structureMap = new StructureMap(ownerUUID); + this.structureMap = new StructureMap(ownerUniqueId); createInitialStructures(); @@ -271,11 +288,14 @@ public void createInitialStructures() throws CannotConstructException, IOExcepti TownBlock likeGeneratorTownBlock = getTownBlock(centerBlock.getRelative(4, 0, -11)); TownBlock dislikeGeneratorTownBlock = getTownBlock(centerBlock.getRelative(-4, 0, -11)); - townHall = new CraftTownHall(this, centerTownBlock, true); - + this.townHall = new CraftTownHall(this, centerTownBlock, true); LikeGenerator likeGenerator = new CraftLikeGenerator(this, likeGeneratorTownBlock, true); DislikeGenerator dislikeGenerator = new CraftDislikeGenerator(this, dislikeGeneratorTownBlock, true); + this.townHall.register(); + likeGenerator.register(); + dislikeGenerator.register(); + ThreadUtil.runSynchronouslyUntilTerminate(plugin, likeGenerator::full); ThreadUtil.runSynchronouslyUntilTerminate(plugin, dislikeGenerator::full); } @@ -283,7 +303,7 @@ public void createInitialStructures() throws CannotConstructException, IOExcepti @Override public OfflinePlayer getOwner() { - return plugin.getServer().getOfflinePlayer(ownerUUID); + return plugin.getServer().getOfflinePlayer(ownerUniqueId); } @Override @@ -467,7 +487,7 @@ public Price buyNewStructure(StructureType structureType, TownBlock townBlock) Price price = structureType.getRule(plugin).getAttribute(1).getPrice(); checkIfAffordable(price); - structureType.getInstantiation().newInstance(this, townBlock); + structureType.getInstantiation().newInstance(this, townBlock).register(); subtract(price); return price; @@ -480,6 +500,7 @@ public void resetAttributes() likeGeneratorsCapacity = calculateLikeGeneratorsCapacity(); dislikeGeneratorsCapacity = calculateDislikeGeneratorsCapacity(); resetHardnessLimit(); + updateCrownBalance(); new TownCapacityChangeEvent(this).callEvent(); new GeneratorsCapacityChangeEvent(this).callEvent(); @@ -665,7 +686,7 @@ private void onHardnessChange() @Override public boolean isOwner(Player player) { - return player.getUniqueId().equals(ownerUUID); + return player.getUniqueId().equals(ownerUniqueId); } @Override @@ -845,8 +866,7 @@ private Void loadSchematic() throws Exception catch(Exception e) { plugin.getLogger().log(Level.SEVERE, MessageFormat.format( - "Failed to paste town schematic! uuid={0}", - ownerUUID), e); + "Failed to paste town schematic! uuid={0}", ownerUniqueId), e); throw e; } finally @@ -919,7 +939,7 @@ private Void saveSchematic() throws Exception ClipboardWriter writer = BuiltInClipboardFormat.FAST.getWriter(fileOutputStream)) { writer.write(clipboard2); - plugin.getLogger().info("Town schematic saved! uuid=" + ownerUUID); + plugin.getLogger().info("Town schematic saved! uuid=" + ownerUniqueId); } //TODO: concurrent bug if save occurs here @@ -946,8 +966,7 @@ private Void saveSchematic() throws Exception catch(Exception e) { plugin.getLogger().log(Level.SEVERE, MessageFormat.format( - "Failed to save town schematic! uuid={0}", - ownerUUID), e); + "Failed to save town schematic! uuid={0}", ownerUniqueId), e); throw e; } finally @@ -1199,13 +1218,13 @@ public void setDefaultBoughtTileMapByDepth() })); plugin.getLogger().warning("subtractedMap: " + subtractedMap); - boughtTileMapByDepth = new BoughtTileMapByDepth(ownerUUID, subtractedMap); + boughtTileMapByDepth = new BoughtTileMapByDepth(ownerUniqueId, subtractedMap); } @Override public UUID getUUID() { - return getOwnerUUID(); + return getOwnerUniqueId(); } @Override @@ -1383,4 +1402,116 @@ public boolean hasReachedStructureLimit(StructureType structureType) { return countStructures(structureType) >= getStructureLimit(structureType); } + + private BigDecimal calculateCrownBalance() + { + BigDecimal balance = BigDecimal.ZERO; + + for(Structure structure : structureMap.values()) + { + if(structure instanceof StructureCrownHoldeable structureCrownHoldeable) + { + balance = balance.add(structureCrownHoldeable.getCrownHolder().getBalance()); + } + } + + return calculatedCrownBalance = balance; + } + + @Override + public BigDecimal calculateCrownCapacity() + { + BigDecimal capacity = BigDecimal.ZERO; + + for(Structure structure : structureMap.values()) + { + if(structure instanceof StructureCapacitatedCrownHoldeable holdeable) + { + capacity = capacity.add(holdeable.getCapacitatedCrownHolder().getCapacity()); + } + } + + return capacity; + } + + @Override + public BigDecimal calculateRemainingCrownCapacity() + { + return calculateCrownCapacity().subtract(calculateCrownBalance()); + } + + @Override + public void updateCrownBalance() + { + BigDecimal oldCrowns = calculatedCrownBalance; + calculatedCrownBalance = calculateCrownBalance(); + oldCrowns = oldCrowns == null ? calculatedCrownBalance : oldCrowns; + + new CrownChangeEvent(this, oldCrowns, calculatedCrownBalance).callEvent(); + } + + @Override + public BigDecimal getCalculatedCrownBalance() + { + return calculatedCrownBalance == null + ? calculatedCrownBalance = calculateCrownBalance() + : calculatedCrownBalance; + } + + @Override + public List getCapacitatedCrownHolders() + { + List holders = new ArrayList<>(); + + for(Structure structure : structureMap.values()) + { + if(structure instanceof StructureCrownHoldeable structureCrownHoldeable + && structureCrownHoldeable.getCrownHolder() instanceof CapacitatedCrownHolder capacitatedCrownHolder) + { + holders.add(capacitatedCrownHolder); + } + } + + return holders; + } + + @Override + public List> createTradePreviewSubtract + ( + BigDecimal subtrahend + ) + throws NegativeBalanceException + { + Preconditions.checkArgument(subtrahend.compareTo(BigDecimal.ZERO) > 0); + + List> tradePreviewList = new ArrayList<>(); + + Iterator iterator = getCapacitatedCrownHolders().iterator(); + + while(iterator.hasNext() && subtrahend.compareTo(BigDecimal.ZERO) > 0) + { + CapacitatedCrownHolder holder = iterator.next(); + + BigDecimal balance = holder.getBalance(); + BigDecimal min = balance.compareTo(subtrahend) < 0 ? balance : subtrahend; + + subtrahend = subtrahend.subtract(min); + tradePreviewList.add(new TradePreview<>(holder, min)); + } + + if(subtrahend.compareTo(BigDecimal.ZERO) > 0) + { + throw new NegativeBalanceException(); + } + + return tradePreviewList; + } + + @Override + public Transaction createTransaction(Town townTo, BigDecimal amount) throws + OverCapacityException, + NegativeBalanceException + { + return plugin.getTransactionManager().createTransaction(this, townTo, amount); + } } diff --git a/plugin/src/main/java/com/eul4/model/craft/town/CraftTownTile.java b/plugin/src/main/java/com/eul4/model/craft/town/CraftTownTile.java index ed1f331c..31dbdb03 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/CraftTownTile.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/CraftTownTile.java @@ -17,7 +17,7 @@ import java.util.List; import java.util.Optional; -import static com.eul4.i18n.PluginMessage.BOLD_DECORATED_VALUE_CURRENCY; +import static com.eul4.i18n.PluginMessage.BOLD_DECORATED_$CURRENCY_$VALUE; import static com.eul4.i18n.PluginMessage.CLICK_TO_BUY_THIS_TILE; import static org.bukkit.block.BlockFace.*; @@ -191,8 +191,8 @@ public void updateHologram() hologram.setSize(3); hologram.getLine(2).setMessageAndArgs(CLICK_TO_BUY_THIS_TILE); - hologram.getLine(1).setMessageAndArgs(BOLD_DECORATED_VALUE_CURRENCY, Currency.LIKE, price.getLikes()); - hologram.getLine(0).setMessageAndArgs(BOLD_DECORATED_VALUE_CURRENCY, Currency.DISLIKE, price.getDislikes()); + hologram.getLine(1).setMessageAndArgs(BOLD_DECORATED_$CURRENCY_$VALUE, Currency.LIKE, price.getLikes()); + hologram.getLine(0).setMessageAndArgs(BOLD_DECORATED_$CURRENCY_$VALUE, Currency.DISLIKE, price.getDislikes()); } else { diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftArmory.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftArmory.java index 23e42898..12deecd0 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftArmory.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftArmory.java @@ -5,7 +5,7 @@ import com.eul4.enums.StructureStatus; import com.eul4.exception.CannotConstructException; import com.eul4.i18n.PluginMessage; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.model.town.structure.Armory; @@ -46,18 +46,14 @@ public class CraftArmory extends CraftStructure implements Armory private transient NPCWatcherTask npcWatcherTask; - public CraftArmory(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftArmory(Town town, TownBlock centerTownBlock) { this(town, centerTownBlock, false); } - public CraftArmory(Town town, TownBlock centerTownBlock, boolean isBuilt) throws CannotConstructException, IOException + public CraftArmory(Town town, TownBlock centerTownBlock, boolean isBuilt) { super(town, centerTownBlock, isBuilt); - town.setArmory(this); - - spawnNPC(); - scheduleNPCWatcherTaskIfPossible(); } public CraftArmory(Town town) @@ -65,6 +61,17 @@ public CraftArmory(Town town) super(town); } + @Override + public void register() throws CannotConstructException, IOException + { + super.register(); + + town.setArmory(this); + + spawnNPC(); + scheduleNPCWatcherTaskIfPossible(); + } + private void spawnNPC() { npc = (Villager) getCenterTownBlock().getBlock().getWorld().spawnEntity(getDefaultNpcLocation(), diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftCannon.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftCannon.java index 02e272b4..029058ef 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftCannon.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftCannon.java @@ -17,12 +17,12 @@ @Setter public class CraftCannon extends CraftStructure implements Cannon { - public CraftCannon(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftCannon(Town town, TownBlock centerTownBlock) { super(town, centerTownBlock, false); } - public CraftCannon(Town town, TownBlock centerTownBlock, boolean isBuilt) throws CannotConstructException, IOException + public CraftCannon(Town town, TownBlock centerTownBlock, boolean isBuilt) { super(town, centerTownBlock, isBuilt); } diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftCrownDeposit.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftCrownDeposit.java new file mode 100644 index 00000000..82bdbd26 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftCrownDeposit.java @@ -0,0 +1,139 @@ +package com.eul4.model.craft.town.structure; + +import com.eul4.StructureType; +import com.eul4.calculator.BigDecimalCalculator; +import com.eul4.common.i18n.MessageArgs; +import com.eul4.enums.Currency; +import com.eul4.exception.CannotConstructException; +import com.eul4.holder.CapacitatedCrownHolder; +import com.eul4.i18n.PluginMessage; +import com.eul4.model.town.Town; +import com.eul4.model.town.TownBlock; +import com.eul4.model.town.structure.CapacitatedCrownTransactionResourceStructure; +import com.eul4.model.town.structure.CrownDeposit; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.CrownDepositAttribute; +import com.eul4.wrapper.TransactionalResource; +import com.sk89q.worldedit.math.BlockVector3; +import lombok.Getter; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.Set; + +public class CraftCrownDeposit extends CraftPhysicalDeposit implements + CrownDeposit, + CapacitatedCrownTransactionResourceStructure +{ + @Getter + private final Set> transactionalResources = Set.of + ( + new TransactionalResource<> + ( + this, + BlockVector3.at(0, 1, 0), + TransactionalResource.Type.CROWN, + this::createStoleCrownTransaction, + BigDecimalCalculator.INSTANCE, + () -> getCapacitatedCrownHolder().isEmpty(), + this::getAmountOfCrownsToSteal + ) + ); + + private CapacitatedCrownHolder capacitatedCrownHolder; + private transient BigDecimal capacity; + + public CraftCrownDeposit(Town town) + { + super(town); + } + + public CraftCrownDeposit(Town town, TownBlock centerTownBlock) + { + this(town, centerTownBlock, false); + } + + public CraftCrownDeposit(Town town, TownBlock centerTownBlock, boolean isBuilt) + { + super(town, centerTownBlock, isBuilt); + capacitatedCrownHolder = new CapacitatedCrownHolder(this); + } + + @Override + public void register() throws CannotConstructException, IOException + { + super.register(); + capacitatedCrownHolder.setCapacity(capacity); + } + + @Override + public void reloadAttributes() + { + capacity = getRule().getAttributeOrDefault(getBuiltLevel()).getCapacity(); + + if(capacitatedCrownHolder != null) + { + capacitatedCrownHolder.setCapacity(capacity); + } + + super.reloadAttributes(); + } + + @Override + public StructureType getStructureType() + { + return StructureType.CROWN_DEPOSIT; + } + + @Override + public Currency getCurrency() + { + return Currency.CROWN; + } + + @Override + @SuppressWarnings("unchecked") + public Rule getRule() + { + return (Rule) getStructureType().getRule(town.getPlugin()); + } + + @Override + protected MessageArgs getStructureBalanceMessageUnderAttack() + { + return PluginMessage.$BALANCE_$CURRENCY.withArgs + ( + capacitatedCrownHolder.getBalance(), + Currency.CROWN + ); + } + + @Override + protected MessageArgs getStructureBalanceMessage() + { + return PluginMessage.$CURRENCY_$BALANCE_$CAPACITY.withArgs + ( + Currency.CROWN, + capacitatedCrownHolder.getBalance(), + capacitatedCrownHolder.getCapacity() + ); + } + + @Override + public CapacitatedCrownHolder getHolder() + { + return capacitatedCrownHolder; + } + + @Override + public void setHolder(CapacitatedCrownHolder capacitatedCrownHolder) + { + this.capacitatedCrownHolder = capacitatedCrownHolder; + } + + @Override + public CapacitatedCrownHolder getCapacitatedCrownHolder() + { + return capacitatedCrownHolder; + } +} diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDeposit.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDeposit.java index 25de097c..b607dde9 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDeposit.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDeposit.java @@ -18,11 +18,11 @@ import java.io.IOException; @Getter -public abstract class CraftDeposit extends CraftResourceStructure implements Deposit +public abstract class CraftDeposit extends CraftResourceStructure implements Deposit { - private transient int capacity; + private transient N capacity; @Setter(AccessLevel.PROTECTED) - protected transient int remainingCapacity; + protected transient N remainingCapacity; public CraftDeposit(Town town) { @@ -30,7 +30,6 @@ public CraftDeposit(Town town) } public CraftDeposit(Town town, TownBlock centerTownBlock, boolean isBuilt) - throws CannotConstructException, IOException { super(town, centerTownBlock, isBuilt); } @@ -73,7 +72,7 @@ public void updateHologram() protected abstract PluginMessage getStructureBalanceMessageUnderAttack(); - public abstract Rule getRule(); + public abstract Rule> getRule(); public abstract Currency getCurrency(); @@ -85,15 +84,13 @@ public void resetAttributes() capacity = getRule().getAttributeOrDefault(getBuiltLevel()).getCapacity(); } - @Override - public int getVirtualBalance() - { - return Math.min(remainingCapacity, getTotalTownBalance()); - } +// @Override +// public N getVirtualBalance() +// { +// return Math.min(remainingCapacity, getTotalTownBalance()); +// } - protected abstract int getTotalTownBalance(); - - protected abstract int subtract(int balance); + protected abstract N subtract(N balance); @Override public void onStartAttack() @@ -102,13 +99,8 @@ public void onStartAttack() remainingCapacity = capacity; } - protected int getVirtualCapacity() - { - return Math.min(getTotalTownBalance(), remainingCapacity); - } - - public boolean isEmpty() - { - return getVirtualCapacity() == 0; - } + public abstract boolean isEmpty(); +// { +// return getVirtualCapacity() == 0; +// } } \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDislikeDeposit.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDislikeDeposit.java index ce3c09f5..c7c676c8 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDislikeDeposit.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDislikeDeposit.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.Set; -public class CraftDislikeDeposit extends CraftDeposit implements DislikeDeposit +public class CraftDislikeDeposit extends CraftDeposit implements DislikeDeposit { @Getter private final Set resources = Set.of(Resource.builder() @@ -31,12 +31,12 @@ public CraftDislikeDeposit(Town town) super(town); } - public CraftDislikeDeposit(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftDislikeDeposit(Town town, TownBlock centerTownBlock) { this(town, centerTownBlock, false); } - public CraftDislikeDeposit(Town town, TownBlock centerTownBlock, boolean isBuilt) throws CannotConstructException, IOException + public CraftDislikeDeposit(Town town, TownBlock centerTownBlock, boolean isBuilt) { super(town, centerTownBlock, isBuilt); } @@ -67,13 +67,25 @@ protected PluginMessage getStructureBalanceMessageUnderAttack() } @Override - protected int getTotalTownBalance() + public Integer getTotalBalance() { return town.getDislikes(); } @Override - protected int subtract(int balance) + public Integer getVirtualBalance() + { + return Math.min(remainingCapacity, getTotalBalance()); + } + + @Override + public boolean isEmpty() + { + return getVirtualBalance() <= 0; + } + + @Override + protected Integer subtract(Integer balance) { return subtractVirtualBalance(this::setRemainingCapacity, town::subtractDislikes, diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDislikeGenerator.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDislikeGenerator.java index 860cdb55..98a83327 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDislikeGenerator.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftDislikeGenerator.java @@ -33,12 +33,12 @@ public CraftDislikeGenerator(Town town) super(town); } - public CraftDislikeGenerator(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftDislikeGenerator(Town town, TownBlock centerTownBlock) { this(town, centerTownBlock, false); } - public CraftDislikeGenerator(Town town, TownBlock centerTownBlock, boolean isBuilt) throws CannotConstructException, IOException + public CraftDislikeGenerator(Town town, TownBlock centerTownBlock, boolean isBuilt) { super(town, centerTownBlock, isBuilt); } diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftGenerator.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftGenerator.java index 4948956e..810f6b06 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftGenerator.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftGenerator.java @@ -5,7 +5,7 @@ import com.eul4.exception.CannotConstructException; import com.eul4.i18n.PluginMessage; import com.eul4.model.inventory.StructureGui; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.model.town.structure.Generator; @@ -41,10 +41,14 @@ public CraftGenerator(Town town) } public CraftGenerator(Town town, TownBlock centerTownBlock, boolean isBuilt) - throws CannotConstructException, IOException { super(town, centerTownBlock, isBuilt); - + } + + @Override + public void register() throws CannotConstructException, IOException + { + super.register(); scheduleGenerationTaskIfPossible(); } diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftLikeDeposit.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftLikeDeposit.java index b9f2eaf5..4d236b14 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftLikeDeposit.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftLikeDeposit.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.Set; -public class CraftLikeDeposit extends CraftDeposit implements LikeDeposit +public class CraftLikeDeposit extends CraftDeposit implements LikeDeposit { @Getter private final Set resources = Set.of(Resource.builder() @@ -31,12 +31,12 @@ public CraftLikeDeposit(Town town) super(town); } - public CraftLikeDeposit(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftLikeDeposit(Town town, TownBlock centerTownBlock) { this(town, centerTownBlock, false); } - public CraftLikeDeposit(Town town, TownBlock centerTownBlock, boolean isBuilt) throws CannotConstructException, IOException + public CraftLikeDeposit(Town town, TownBlock centerTownBlock, boolean isBuilt) { super(town, centerTownBlock, isBuilt); } @@ -53,6 +53,12 @@ public Currency getCurrency() return Currency.LIKE; } + @Override + public boolean isEmpty() + { + return getVirtualBalance() <= 0; + } + @Override @SuppressWarnings("unchecked") public Rule getRule() @@ -67,13 +73,19 @@ protected PluginMessage getStructureBalanceMessageUnderAttack() } @Override - protected int getTotalTownBalance() + public Integer getVirtualBalance() + { + return Math.min(remainingCapacity, getTotalBalance()); + } + + @Override + public Integer getTotalBalance() { return town.getLikes(); } @Override - protected int subtract(int balance) + protected Integer subtract(Integer balance) { return subtractVirtualBalance(this::setRemainingCapacity, town::subtractLikes, diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftLikeGenerator.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftLikeGenerator.java index 4a026fd3..b4edd9cd 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftLikeGenerator.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftLikeGenerator.java @@ -33,12 +33,12 @@ public CraftLikeGenerator(Town town) super(town); } - public CraftLikeGenerator(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftLikeGenerator(Town town, TownBlock centerTownBlock) { this(town, centerTownBlock, false); } - public CraftLikeGenerator(Town town, TownBlock centerTownBlock, boolean isBuilt) throws CannotConstructException, IOException + public CraftLikeGenerator(Town town, TownBlock centerTownBlock, boolean isBuilt) { super(town, centerTownBlock, isBuilt); } diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftPhysicalDeposit.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftPhysicalDeposit.java new file mode 100644 index 00000000..675ab166 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftPhysicalDeposit.java @@ -0,0 +1,106 @@ +package com.eul4.model.craft.town.structure; + +import com.eul4.common.i18n.MessageArgs; +import com.eul4.enums.Currency; +import com.eul4.enums.StructureStatus; +import com.eul4.i18n.PluginMessage; +import com.eul4.model.town.Town; +import com.eul4.model.town.TownBlock; +import com.eul4.model.town.structure.PhysicalDeposit; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.DepositAttribute; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.block.BlockFace; + +import static com.eul4.util.MessageUtil.getPercentageProgressBar; + +@Getter +public abstract class CraftPhysicalDeposit> extends CraftStructure implements PhysicalDeposit +{ + private transient N capacity; + @Setter(AccessLevel.PROTECTED) + protected transient N remainingCapacity; + + public CraftPhysicalDeposit(Town town) + { + super(town); + } + + public CraftPhysicalDeposit(Town town, TownBlock centerTownBlock, boolean isBuilt) + { + super(town, centerTownBlock, isBuilt); + } + + public void updateHologram() + { + if(status != StructureStatus.BUILT) + { + super.updateHologram(); + return; + } + + if(town.isUnderAttack()) + { + if(isDestroyed()) + { + teleportHologram(getLocation() + .toHighestLocation() + .getBlock() + .getRelative(BlockFace.UP) + .getLocation() + .toCenterLocation()); + hologram.setSize(2); + hologram.getLine(0).setMessageAndArgs(PluginMessage.STRUCTURE_HOLOGRAM_TITLE, + getStructureType(), + level); + hologram.getLine(1).setMessageAndArgs(getStructureBalanceMessageUnderAttack()); + } + else + { + teleportHologramToDefaultLocation(); + hologram.setSize(4); + hologram.getLine(0).setMessageAndArgs(PluginMessage.STRUCTURE_HOLOGRAM_TITLE, + getStructureType(), + level); + hologram.getLine(1).setMessageAndArgs(getStructureBalanceMessageUnderAttack()); + hologram.getLine(2).setMessageAndArgs(PluginMessage.STRUCTURE_HEALTH_POINTS, + getHealth(), + getMaxHealth()); + hologram.getLine(3).setCustomName(getPercentageProgressBar(getHealthPercentage())); + } + } + else + { + teleportHologramToDefaultLocation(); + hologram.setSize(2); + hologram.getLine(0).setMessageAndArgs(PluginMessage.STRUCTURE_HOLOGRAM_TITLE, + getStructureType(), + level); + hologram.getLine(1).setMessageAndArgs(getStructureBalanceMessage()); + } + } + + protected abstract MessageArgs getStructureBalanceMessageUnderAttack(); + protected abstract MessageArgs getStructureBalanceMessage(); + + public abstract Rule> getRule(); + + public abstract Currency getCurrency(); + + @Override + public void resetAttributes() + { + super.resetAttributes(); + + capacity = getRule().getAttributeOrDefault(getBuiltLevel()).getCapacity(); + } + + @Override + public void onStartAttack() + { + super.onStartAttack(); + remainingCapacity = capacity; + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftResourceStructure.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftResourceStructure.java index 156243b7..d9f0cfc3 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftResourceStructure.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftResourceStructure.java @@ -3,9 +3,10 @@ import com.eul4.common.wrapper.Pitch; import com.eul4.enums.Currency; import com.eul4.exception.CannotConstructException; -import com.eul4.model.player.Attacker; +import com.eul4.model.player.spiritual.Attacker; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; +import com.eul4.model.town.structure.ResourceStructure; import com.eul4.wrapper.Resource; import com.eul4.wrapper.TownAttack; import net.kyori.adventure.text.Component; @@ -28,13 +29,12 @@ public CraftResourceStructure(Town town) super(town); } - public CraftResourceStructure(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftResourceStructure(Town town, TownBlock centerTownBlock) { super(town, centerTownBlock); } public CraftResourceStructure(Town town, TownBlock centerTownBlock, boolean isBuilt) - throws CannotConstructException, IOException { super(town, centerTownBlock, isBuilt); } @@ -69,7 +69,6 @@ public void placeResources() } } - @Override public Optional findResource(Block block) { for(Resource resource : getResources()) @@ -105,9 +104,9 @@ public void steal(Resource resource) Currency currency = resource.getType().getCurrency(); - pluginPlayer.getPlayer().sendMessage(currency.getBaseComponent() - .append(Component.text("+" + amountStolen + " ")) - .append(currency.getPluralWord().translate(pluginPlayer, String::toUpperCase))); + pluginPlayer.getPlayer().sendMessage(Component.text("+" + amountStolen + " ") + .append(currency.getPluralWord().translate(pluginPlayer, String::toUpperCase)) + .style(currency.getStyle())); }); }); onSteal(); diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftStructure.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftStructure.java index d1061efe..a56d1305 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftStructure.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftStructure.java @@ -8,14 +8,11 @@ import com.eul4.common.wrapper.Pitch; import com.eul4.enums.PluginNamespacedKey; import com.eul4.enums.StructureStatus; -import com.eul4.event.StructureConstructEvent; -import com.eul4.event.StructureFinishEvent; -import com.eul4.event.StructureReadyEvent; -import com.eul4.event.StructureUpgradeEvent; +import com.eul4.event.*; import com.eul4.exception.*; import com.eul4.i18n.PluginMessage; import com.eul4.model.inventory.StructureGui; -import com.eul4.model.player.Attacker; +import com.eul4.model.player.spiritual.Attacker; import com.eul4.model.player.PluginPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; @@ -117,17 +114,20 @@ public abstract class CraftStructure implements Structure private Vector3 centerPosition; + private boolean registered; + public CraftStructure(Town town) { this.town = town; + this.registered = true; } - public CraftStructure(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftStructure(Town town, TownBlock centerTownBlock) { this(town, centerTownBlock, false); } - public CraftStructure(Town town, TownBlock centerTownBlock, boolean isBuilt) throws CannotConstructException, IOException + public CraftStructure(Town town, TownBlock centerTownBlock, boolean isBuilt) { this(town); @@ -138,7 +138,11 @@ public CraftStructure(Town town, TownBlock centerTownBlock, boolean isBuilt) thr this.status = isBuilt ? StructureStatus.BUILT : StructureStatus.UNREADY; this.buildTicks = isBuilt ? 0 : getRule().getAttribute(1).getTotalBuildTicks(); this.totalBuildTicks = buildTicks; - + } + + @Override + public void register() throws CannotConstructException, IOException + { resetAttributes(); construct(loadSchematic(), centerTownBlock, 0); @@ -205,7 +209,7 @@ public void cancelMoveBlindly() + "owner={3}", uuid, town.getUUID(), - town.getOwnerUUID(), + town.getOwnerUniqueId(), town.getOwner().getName()); town.getPlugin().getLogger().log(Level.WARNING, msg, e); @@ -476,7 +480,7 @@ public void load() { resetAttributes(); scheduleBuildTaskIfPossible(); - reconstructBlindly(); + constructSafely(); hologram.load(); } @@ -881,6 +885,7 @@ private boolean destroy() health = 0.0D; onDestroy(); + new StructureDestroyEvent(this).callEvent(); return true; } @@ -955,7 +960,7 @@ public void setDefaultUUID() this.uuid = UUID.randomUUID(); } - private void reconstructBlindly() + private void constructSafely() { try { @@ -972,7 +977,7 @@ private void reconstructBlindly() String msg = MessageFormat.format(pattern, uuid, town.getUUID(), - town.getOwnerUUID(), + town.getOwnerUniqueId(), town.getOwner().getName(), getStructureType()); @@ -989,7 +994,7 @@ private void reconstructBlindly() String msg = MessageFormat.format(pattern, uuid, town.getUUID(), - town.getOwnerUUID(), + town.getOwnerUniqueId(), town.getOwner().getName(), getStructureType()); diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftTownHall.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftTownHall.java index 821ea6ce..3ee2cc64 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftTownHall.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftTownHall.java @@ -1,8 +1,11 @@ package com.eul4.model.craft.town.structure; import com.eul4.StructureType; +import com.eul4.calculator.BigDecimalCalculator; +import com.eul4.enums.Currency; import com.eul4.enums.StructureStatus; import com.eul4.exception.CannotConstructException; +import com.eul4.holder.CapacitatedCrownHolder; import com.eul4.i18n.PluginMessage; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; @@ -10,8 +13,8 @@ import com.eul4.rule.Rule; import com.eul4.rule.attribute.TownHallAttribute; import com.eul4.util.FaweUtil; -import com.eul4.util.MessageUtil; import com.eul4.wrapper.Resource; +import com.eul4.wrapper.TransactionalResource; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.AffineTransform; @@ -23,14 +26,36 @@ import org.bukkit.util.Vector; import java.io.IOException; +import java.math.BigDecimal; import java.util.Map; import java.util.Set; +import static com.eul4.util.MessageUtil.getPercentageProgressBar; + @Getter public class CraftTownHall extends CraftResourceStructure implements TownHall { + private final Set> transactionalResources = Set.of + ( + new TransactionalResource<> + ( + this, + BlockVector3.at(0, 1, 0), + TransactionalResource.Type.CROWN, + this::createStoleCrownTransaction, + BigDecimalCalculator.INSTANCE, + () -> getCapacitatedCrownHolder().isEmpty(), + this::getAmountOfCrownsToSteal + ) + ); + private int likeCapacity; private int dislikeCapacity; + + private transient BigDecimal crownCapacity; + + private CapacitatedCrownHolder capacitatedCrownHolder; + private transient Vector3 relativeSpawnPosition; @Setter(AccessLevel.PRIVATE) @@ -54,14 +79,15 @@ public class CraftTownHall extends CraftResourceStructure implements TownHall private final Set resources = Set.of(likeResource, dislikeResource); - public CraftTownHall(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftTownHall(Town town, TownBlock centerTownBlock) { - super(town, centerTownBlock, false); + this(town, centerTownBlock, false); } - public CraftTownHall(Town town, TownBlock centerTownBlock, boolean isBuilt) throws CannotConstructException, IOException + public CraftTownHall(Town town, TownBlock centerTownBlock, boolean isBuilt) { super(town, centerTownBlock, isBuilt); + capacitatedCrownHolder = new CapacitatedCrownHolder(this); } public CraftTownHall(Town town) @@ -69,6 +95,13 @@ public CraftTownHall(Town town) super(town); } + @Override + public void register() throws CannotConstructException, IOException + { + super.register(); + capacitatedCrownHolder.setCapacity(crownCapacity); + } + @Override public StructureType getStructureType() { @@ -89,6 +122,13 @@ public void resetAttributes() likeCapacity = getRule().getAttribute(getBuiltLevel()).getLikeCapacity(); dislikeCapacity = getRule().getAttribute(getBuiltLevel()).getDislikeCapacity(); + crownCapacity = getRule().getAttribute(getBuiltLevel()).getCrownCapacity(); + + if(capacitatedCrownHolder != null) + { + capacitatedCrownHolder.setCapacity(crownCapacity); + } + structureLimitMap = getRule().getAttribute(getBuiltLevel()).getStructureLimit(); relativeSpawnPosition = getRule().getAttributeOrDefault(getLevel()).getSpawnPosition(); } @@ -112,25 +152,57 @@ public void updateHologram() .getRelative(BlockFace.UP) .getLocation() .toCenterLocation()); - hologram.setSize(3); - hologram.getLine(0).setMessageAndArgs(PluginMessage.STRUCTURE_HOLOGRAM_TITLE, getStructureType(), level); - hologram.getLine(1).setMessageAndArgs(PluginMessage.STRUCTURE_TOWN_HALL_VIRTUAL_LIKES, getVirtualLikes()); - hologram.getLine(2).setMessageAndArgs(PluginMessage.STRUCTURE_TOWN_HALL_VIRTUAL_DISLIKES, getVirtualDislikes()); + hologram.setSize(4); + hologram.getLine(0).setMessageAndArgs(PluginMessage.STRUCTURE_HOLOGRAM_TITLE, + getStructureType(), + level); + hologram.getLine(1).setMessageAndArgs(PluginMessage.STRUCTURE_TOWN_HALL_VIRTUAL_LIKES, + getVirtualLikes()); + hologram.getLine(2).setMessageAndArgs(PluginMessage.STRUCTURE_TOWN_HALL_VIRTUAL_DISLIKES, + getVirtualDislikes()); + hologram.getLine(3).setMessageAndArgs(PluginMessage.$CURRENCY_$BALANCE_$CAPACITY, + Currency.CROWN, + capacitatedCrownHolder.getBalance(), + capacitatedCrownHolder.getCapacity()); } else { hologram.setSize(5); - hologram.getLine(0).setMessageAndArgs(PluginMessage.STRUCTURE_HOLOGRAM_TITLE, getStructureType(), level); - hologram.getLine(1).setMessageAndArgs(PluginMessage.STRUCTURE_TOWN_HALL_VIRTUAL_LIKES, getVirtualLikes()); - hologram.getLine(2).setMessageAndArgs(PluginMessage.STRUCTURE_TOWN_HALL_VIRTUAL_DISLIKES, getVirtualDislikes()); - hologram.getLine(3).setMessageAndArgs(PluginMessage.STRUCTURE_HEALTH_POINTS, getHealth(), getMaxHealth()); - hologram.getLine(4).setCustomName(MessageUtil.getPercentageProgressBar(getHealthPercentage())); + hologram.getLine(0).setMessageAndArgs(PluginMessage.STRUCTURE_HOLOGRAM_TITLE, + getStructureType(), + level); + hologram.getLine(1).setMessageAndArgs(PluginMessage.STRUCTURE_TOWN_HALL_VIRTUAL_LIKES, + getVirtualLikes()); + hologram.getLine(2).setMessageAndArgs(PluginMessage.STRUCTURE_TOWN_HALL_VIRTUAL_DISLIKES, + getVirtualDislikes()); + hologram.getLine(3).setMessageAndArgs(PluginMessage.$CURRENCY_$BALANCE_$CAPACITY, + Currency.CROWN, + capacitatedCrownHolder.getBalance(), + capacitatedCrownHolder.getCapacity()); + hologram.getLine(3).setMessageAndArgs(PluginMessage.STRUCTURE_HEALTH_POINTS, + getHealth(), + getMaxHealth()); + hologram.getLine(4).setCustomName(getPercentageProgressBar(getHealthPercentage())); teleportHologramToDefaultLocation(); } } else { - hologram.remove(); + hologram.setSize(4); + hologram.getLine(0).setMessageAndArgs(PluginMessage.STRUCTURE_HOLOGRAM_TITLE, + getStructureType(), + level); + hologram.getLine(1).setMessageAndArgs(PluginMessage.CAPACITY_$BALANCE_$CURRENCY, + likeCapacity, + Currency.LIKE); + hologram.getLine(2).setMessageAndArgs(PluginMessage.CAPACITY_$BALANCE_$CURRENCY, + dislikeCapacity, + Currency.DISLIKE); + hologram.getLine(3).setMessageAndArgs(PluginMessage.$CURRENCY_$BALANCE_$CAPACITY, + Currency.CROWN, + capacitatedCrownHolder.getBalance(), + capacitatedCrownHolder.getCapacity()); + teleportHologramToDefaultLocation(); } } @@ -218,4 +290,23 @@ public Vector3 getRotatedSpawnRelativePosition() { return new AffineTransform().rotateY(-getRotation()).apply(relativeSpawnPosition); } + + @Override + public CapacitatedCrownHolder getCapacitatedCrownHolder() + { + return capacitatedCrownHolder; + } + + @Override + public void setCapacitatedCrownHolder(CapacitatedCrownHolder capacitatedCrownHolder) + { + this.capacitatedCrownHolder = capacitatedCrownHolder; + } + + @Override + public void setDefaultCapacitatedCrownHolder() + { + capacitatedCrownHolder = new CapacitatedCrownHolder(this); + capacitatedCrownHolder.setCapacity(crownCapacity); + } } diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftTurret.java b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftTurret.java index a81a05a6..913f05b8 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftTurret.java +++ b/plugin/src/main/java/com/eul4/model/craft/town/structure/CraftTurret.java @@ -57,15 +57,21 @@ public class CraftTurret extends CraftStructure implements Turret private Evoker evoker; - public CraftTurret(Town town, TownBlock centerTownBlock) throws CannotConstructException, IOException + public CraftTurret(Town town, TownBlock centerTownBlock) { this(town, centerTownBlock, false); } - public CraftTurret(Town town, TownBlock centerTownBlock, boolean isBuilt) throws CannotConstructException, IOException + public CraftTurret(Town town, TownBlock centerTownBlock, boolean isBuilt) { super(town, centerTownBlock, isBuilt); - this.evoker = (Evoker) centerTownBlock.getBlock() + } + + @Override + public void register() throws CannotConstructException, IOException + { + super.register(); + this.evoker = (Evoker) getCenterTownBlock().getBlock() .getWorld() .spawnEntity(getDefaultEvokerLocation(), EVOKER, CUSTOM, this::setupEvoker); EVOKER_UUID_MAP.put(evoker.getUniqueId(), this); diff --git a/plugin/src/main/java/com/eul4/model/inventory/CrownDepositGui.java b/plugin/src/main/java/com/eul4/model/inventory/CrownDepositGui.java new file mode 100644 index 00000000..fb41bc2d --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/inventory/CrownDepositGui.java @@ -0,0 +1,6 @@ +package com.eul4.model.inventory; + +public interface CrownDepositGui extends StructureGui +{ + +} diff --git a/plugin/src/main/java/com/eul4/model/inventory/craft/CraftCrownDepositGui.java b/plugin/src/main/java/com/eul4/model/inventory/craft/CraftCrownDepositGui.java new file mode 100644 index 00000000..f2f5a661 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/inventory/craft/CraftCrownDepositGui.java @@ -0,0 +1,39 @@ +package com.eul4.model.inventory.craft; + +import com.eul4.common.model.player.CommonPlayer; +import com.eul4.i18n.PluginMessage; +import com.eul4.model.inventory.CrownDepositGui; +import com.eul4.model.town.structure.CrownDeposit; +import com.eul4.model.town.structure.Structure; +import net.kyori.adventure.text.Component; +import org.bukkit.event.inventory.InventoryType; + +import static net.kyori.adventure.text.format.NamedTextColor.YELLOW; + +public class CraftCrownDepositGui extends CraftStructureGui implements CrownDepositGui +{ + public CraftCrownDepositGui(CommonPlayer commonPlayer, Structure structure) + { + this(commonPlayer, (CrownDeposit) structure); + } + + public CraftCrownDepositGui(CommonPlayer commonPlayer, CrownDeposit crownDeposit) + { + super(commonPlayer, crownDeposit, commonPlayer.createInventory(InventoryType.HOPPER, + PluginMessage.COMPONENT_STRUCTURE_TITLE, + Component.empty().color(YELLOW), + PluginMessage.STRUCTURE_CROWN_DEPOSIT_NAME, + crownDeposit.getLevel())); + } + + @Override + public Component getUpdatedTitleComponent() + { + CrownDeposit crownDeposit = (CrownDeposit) structure; + + return PluginMessage.COMPONENT_STRUCTURE_TITLE.translate(commonPlayer.getLocale(), + Component.empty().color(YELLOW), + PluginMessage.STRUCTURE_CROWN_DEPOSIT_NAME, + crownDeposit.getLevel()); + } +} diff --git a/plugin/src/main/java/com/eul4/model/inventory/craft/CraftStructureShopGui.java b/plugin/src/main/java/com/eul4/model/inventory/craft/CraftStructureShopGui.java index c3554286..b553fdc2 100644 --- a/plugin/src/main/java/com/eul4/model/inventory/craft/CraftStructureShopGui.java +++ b/plugin/src/main/java/com/eul4/model/inventory/craft/CraftStructureShopGui.java @@ -27,6 +27,7 @@ public class CraftStructureShopGui extends CraftGui implements StructureShopGui private ItemStack dislikeGenerator; private ItemStack likeDeposit; private ItemStack dislikeDeposit; + private ItemStack crownDeposit; private ItemStack armory; private ItemStack cannon; private ItemStack turret; @@ -47,6 +48,12 @@ public CraftStructureShopGui(CommonPlayer commonPlayer) dislikeDeposit = new ItemStack(Material.RED_CONCRETE); setDisplayNameAndPriceInLore(dislikeDeposit, ItemBuilder.DISLIKE_DEPOSIT); + setDisplayNameAndPriceInLore + ( + crownDeposit = ItemStack.of(Material.GOLD_BLOCK), + ItemBuilder.CROWN_DEPOSIT + ); + armory = new ItemStack(Material.IRON_BLOCK); //TODO: duplicated Material in ItemBuilder?? Probably one for icon and the other for be placed in ground. setDisplayNameAndPriceInLore(armory, ItemBuilder.ARMORY); diff --git a/plugin/src/main/java/com/eul4/model/player/Admin.java b/plugin/src/main/java/com/eul4/model/player/Admin.java deleted file mode 100644 index 5f6b73e8..00000000 --- a/plugin/src/main/java/com/eul4/model/player/Admin.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.eul4.model.player; - -import com.eul4.common.model.player.CommonAdmin; - -public interface Admin extends - CommonAdmin, - PluginPlayer, - PhysicalPlayer, - Invincible, - TownPerformer.TeleportInside, - SpawnPerformer.Teleport, - SetHomePerformer, - DelHomePerformer, - HomePerformer.InstantTeleport, - NewbiePerformer.Teleport, - RaidPerformer.Teleport -{ - -} diff --git a/plugin/src/main/java/com/eul4/model/player/Attacker.java b/plugin/src/main/java/com/eul4/model/player/Attacker.java deleted file mode 100644 index b1201d1e..00000000 --- a/plugin/src/main/java/com/eul4/model/player/Attacker.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.eul4.model.player; - -import com.eul4.wrapper.TownAttack; - -public interface Attacker extends PluginPlayer, SpiritualPlayer, Fighter -{ - TownAttack getTownAttack(); -} diff --git a/plugin/src/main/java/com/eul4/model/player/Defender.java b/plugin/src/main/java/com/eul4/model/player/Defender.java deleted file mode 100644 index de9a1942..00000000 --- a/plugin/src/main/java/com/eul4/model/player/Defender.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.eul4.model.player; - -import com.eul4.wrapper.TownAttack; - -import java.util.Optional; - -public interface Defender extends PluginPlayer, SpiritualPlayer, Warder, Fighter -{ - Optional findTownAttack(); -} diff --git a/plugin/src/main/java/com/eul4/model/player/DefenderSpectator.java b/plugin/src/main/java/com/eul4/model/player/DefenderSpectator.java deleted file mode 100644 index 4d769fe4..00000000 --- a/plugin/src/main/java/com/eul4/model/player/DefenderSpectator.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.eul4.model.player; - -import com.eul4.hotbar.DefenderSpectatorHotbar; - -public interface DefenderSpectator extends - PluginPlayer, - SpiritualPlayer, - Spectator, - Warder, - TownPerformer.TeleportOutside, SpawnPerformer.Reincarnate -{ - DefenderSpectatorHotbar getHotbar(); - - void quit(); - void respawn(); -} diff --git a/plugin/src/main/java/com/eul4/model/player/PluginPlayer.java b/plugin/src/main/java/com/eul4/model/player/PluginPlayer.java index 304b12fa..cd1fc48d 100644 --- a/plugin/src/main/java/com/eul4/model/player/PluginPlayer.java +++ b/plugin/src/main/java/com/eul4/model/player/PluginPlayer.java @@ -77,4 +77,6 @@ public interface PluginPlayer extends CommonPlayer void showTag(); boolean hasAttackSpeed(); void setAttackSpeed(boolean attackSpeed); + + boolean isTycoon(); } diff --git a/plugin/src/main/java/com/eul4/model/player/RaidSpectator.java b/plugin/src/main/java/com/eul4/model/player/RaidSpectator.java deleted file mode 100644 index 9e2b56f6..00000000 --- a/plugin/src/main/java/com/eul4/model/player/RaidSpectator.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.eul4.model.player; - -import com.eul4.hotbar.RaidSpectatorHotbar; - -public interface RaidSpectator extends - PluginPlayer, - SpiritualPlayer, - Spectator, - Warder, - TownPerformer.TeleportOutside, SpawnPerformer.Reincarnate -{ - RaidSpectatorHotbar getHotbar(); - - void defend(); - void vanilla(); -} diff --git a/plugin/src/main/java/com/eul4/model/player/TownPlayer.java b/plugin/src/main/java/com/eul4/model/player/TownPlayer.java deleted file mode 100644 index 86d4d275..00000000 --- a/plugin/src/main/java/com/eul4/model/player/TownPlayer.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.eul4.model.player; - -import com.eul4.model.town.Town; -import com.eul4.scoreboard.TownScoreboard; - -public interface TownPlayer extends - PluginPlayer, - PhysicalPlayer, - Invincible, - TownPerformer.TeleportInside, SpawnPerformer.Reincarnate, - BuyStructurePerformer, - TownScoreboardPlayer, - DelHomePerformer, - HomePerformer.InstantTeleport, - NewbiePerformer.Reincarnate, - RaidPerformer.Reincarnate -{ - Town getTown(); - boolean hasTown(); - - void test(boolean test); - boolean test(); - - @Override - TownScoreboard getScoreboard(); -} diff --git a/plugin/src/main/java/com/eul4/model/player/VanillaPlayer.java b/plugin/src/main/java/com/eul4/model/player/VanillaPlayer.java deleted file mode 100644 index 165e371e..00000000 --- a/plugin/src/main/java/com/eul4/model/player/VanillaPlayer.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.eul4.model.player; - -public interface VanillaPlayer extends - PhysicalPlayer, - TownPerformer.ChannelReincarnation, - SpawnPerformer.ChannelReincarnation, - TownScoreboardPlayer, - InitialScoreboardPlayer, - SetHomePerformer, - DelHomePerformer, - HomePerformer.Channeling, - Channeler, - NewbiePerformer.ChannelReincarnation, - RaidPerformer.ChannelReincarnation -{ - -} diff --git a/plugin/src/main/java/com/eul4/model/player/BuyStructurePerformer.java b/plugin/src/main/java/com/eul4/model/player/performer/BuyStructurePerformer.java similarity index 73% rename from plugin/src/main/java/com/eul4/model/player/BuyStructurePerformer.java rename to plugin/src/main/java/com/eul4/model/player/performer/BuyStructurePerformer.java index 5d1e322b..7cbfd74b 100644 --- a/plugin/src/main/java/com/eul4/model/player/BuyStructurePerformer.java +++ b/plugin/src/main/java/com/eul4/model/player/performer/BuyStructurePerformer.java @@ -1,6 +1,7 @@ -package com.eul4.model.player; +package com.eul4.model.player.performer; import com.eul4.model.inventory.craft.CraftStructureShopGui; +import com.eul4.model.player.PluginPlayer; public interface BuyStructurePerformer extends PluginPlayer { diff --git a/plugin/src/main/java/com/eul4/model/player/DelHomePerformer.java b/plugin/src/main/java/com/eul4/model/player/performer/DelHomePerformer.java similarity index 96% rename from plugin/src/main/java/com/eul4/model/player/DelHomePerformer.java rename to plugin/src/main/java/com/eul4/model/player/performer/DelHomePerformer.java index 52cea709..4b5f3af7 100644 --- a/plugin/src/main/java/com/eul4/model/player/DelHomePerformer.java +++ b/plugin/src/main/java/com/eul4/model/player/performer/DelHomePerformer.java @@ -1,4 +1,4 @@ -package com.eul4.model.player; +package com.eul4.model.player.performer; import com.eul4.i18n.PluginMessage; import com.eul4.wrapper.HomeMap; diff --git a/plugin/src/main/java/com/eul4/model/player/HomePerformer.java b/plugin/src/main/java/com/eul4/model/player/performer/HomePerformer.java similarity index 97% rename from plugin/src/main/java/com/eul4/model/player/HomePerformer.java rename to plugin/src/main/java/com/eul4/model/player/performer/HomePerformer.java index bf09df99..ae89788e 100644 --- a/plugin/src/main/java/com/eul4/model/player/HomePerformer.java +++ b/plugin/src/main/java/com/eul4/model/player/performer/HomePerformer.java @@ -1,7 +1,8 @@ -package com.eul4.model.player; +package com.eul4.model.player.performer; import com.eul4.common.wrapper.Pitch; import com.eul4.i18n.PluginMessage; +import com.eul4.model.player.Channeler; import com.eul4.wrapper.HomeMap; import org.bukkit.Location; import org.bukkit.Sound; diff --git a/plugin/src/main/java/com/eul4/model/player/HomeTabCompleter.java b/plugin/src/main/java/com/eul4/model/player/performer/HomeTabCompleter.java similarity index 91% rename from plugin/src/main/java/com/eul4/model/player/HomeTabCompleter.java rename to plugin/src/main/java/com/eul4/model/player/performer/HomeTabCompleter.java index d39292d6..369658b4 100644 --- a/plugin/src/main/java/com/eul4/model/player/HomeTabCompleter.java +++ b/plugin/src/main/java/com/eul4/model/player/performer/HomeTabCompleter.java @@ -1,4 +1,6 @@ -package com.eul4.model.player; +package com.eul4.model.player.performer; + +import com.eul4.model.player.PluginPlayer; import java.util.*; diff --git a/plugin/src/main/java/com/eul4/model/player/NewbiePerformer.java b/plugin/src/main/java/com/eul4/model/player/performer/NewbiePerformer.java similarity index 89% rename from plugin/src/main/java/com/eul4/model/player/NewbiePerformer.java rename to plugin/src/main/java/com/eul4/model/player/performer/NewbiePerformer.java index aa58eec1..91a4720b 100644 --- a/plugin/src/main/java/com/eul4/model/player/NewbiePerformer.java +++ b/plugin/src/main/java/com/eul4/model/player/performer/NewbiePerformer.java @@ -1,7 +1,10 @@ -package com.eul4.model.player; +package com.eul4.model.player.performer; import com.eul4.common.model.player.CommonPlayer; import com.eul4.i18n.PluginMessage; +import com.eul4.model.player.Channeler; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.physical.SpawnPlayer; import com.eul4.type.PluginWorldType; import com.eul4.type.player.PhysicalPlayerType; import com.eul4.world.NewbieLevel; diff --git a/plugin/src/main/java/com/eul4/model/player/performer/PayPerformer.java b/plugin/src/main/java/com/eul4/model/player/performer/PayPerformer.java new file mode 100644 index 00000000..e24780d5 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/player/performer/PayPerformer.java @@ -0,0 +1,187 @@ +package com.eul4.model.player.performer; + +import com.eul4.common.exception.CommonException; +import com.eul4.common.exception.CommonRuntimeException; +import com.eul4.common.i18n.MessageArgs; +import com.eul4.common.util.BigDecimalUtil; +import com.eul4.common.util.LoggerUtil; +import com.eul4.economy.Transaction; +import com.eul4.exception.NegativeBalanceException; +import com.eul4.exception.OverCapacityException; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.town.Town; +import com.eul4.util.SoundUtil; +import com.eul4.wrapper.CryptoInfo; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static com.eul4.i18n.PluginMessage.*; + +public interface PayPerformer extends PluginPlayer +{ + default List onPayTabComplete(String[] args) + { + List suggestions = Collections.emptyList(); + + if(args.length == 1) + { + for(Player player : getPlugin().getServer().getOnlinePlayers()) + { + if(player == getPlayer()) + { + continue; + } + + if(player.getName().toLowerCase().startsWith(args[0].toLowerCase())) + { + suggestions = suggestions == Collections.EMPTY_LIST + ? new ArrayList<>() + : suggestions; + suggestions.add(player.getName()); + } + } + + suggestions.sort(Comparator.naturalOrder()); + } + + return suggestions; + } + + default boolean performPay(String aliases, String[] args) + { + if(args.length == 2) + { + String targetName = args[0]; + + try + { + OfflinePlayer offlineTarget = getPlugin().getOfflinePlayerIfCachedOrElseThrow(args[0]); + targetName = offlineTarget.getName(); + + Town playerTown = getTown(); + Town targetTown = getPlugin().getTownManager().getTown(offlineTarget.getUniqueId()); + + if(getPlayer() == offlineTarget.getPlayer()) + { + sendMessage(COMMAND_PAY_YOURSELF); + return false; + } + + if(playerTown == null) + { + sendMessage(COMMAND_BALANCE_TRY_TOWN_COMMAND); + return false; + } + + if(targetTown == null) + { + sendMessage(COMMAND_PAY_INDIGENT_$TARGET, offlineTarget.getName()); + return false; + } + + if(playerTown == targetTown) + { + sendMessage(COMMAND_PAY_YOURSELF); + return false; + } + + if(playerTown.isUnderAttack()) + { + sendMessage(COMMAND_PAY_YOUR_TOWN_UNDER_ATTACK); + return false; + } + + if(targetTown.isUnderAttack()) + { + sendMessage + ( + COMMAND_PAY_TARGET_TOWN_UNDER_ATTACK_$TARGET, + offlineTarget.getName() + ); + return false; + } + + BigDecimal subtrahend = BigDecimalUtil + .newBigDecimal(args[1].replace(',', '.'), CryptoInfo.MATH_CONTEXT); + + if(subtrahend.compareTo(BigDecimalUtil.ONE_CENT) < 0) + { + sendMessage(COMMAND_PAY_MIN_VALUE); + return false; + } + + if(subtrahend.scale() > 2) + { + sendMessage(COMMAND_PAY_SCALE_$LIMIT, 2); + return false; + } + + if(subtrahend.precision() - subtrahend.scale() > 20) + { + sendMessage(COMMAND_PAY_INTEGRAL_SCALE_$LIMIT, 20); + return false; + } + + Transaction transaction = getPlugin() + .getTransactionManager() + .createTransaction + ( + playerTown.createTradePreviewSubtract(subtrahend), + targetTown.getCapacitatedCrownHolders() + ); + transaction.tryExecute(); + + MessageArgs paidMessage = COMMAND_PAY_YOU_PAID_$PLAYER_$AMOUNT + .withArgs(offlineTarget, subtrahend); + MessageArgs receivedMessage = COMMAND_PAY_YOU_RECEIVED_$PLAYER_$AMOUNT + .withArgs(getPlayer(), subtrahend); + + sendMessage(paidMessage); + SoundUtil.playPlingPlong(this); + + targetTown.findPluginPlayer().ifPresent(pluginPlayer -> + { + pluginPlayer.sendMessage(receivedMessage); + SoundUtil.playPiano(pluginPlayer.getPlayer()); + }); + + return true; + } + catch(CommonRuntimeException | CommonException e) + { + sendMessage(e.getMessageArgs()); + return false; + } + catch(NegativeBalanceException e) + { + sendMessage(COMMAND_PAY_INSUFFICIENT_BALANCE); + return false; + } + catch(OverCapacityException e) + { + sendMessage(COMMAND_PAY_TARGET_OVER_CAPACITY_$TARGET, targetName); + return false; + } + catch(Exception e) + { + sendMessage(COMMAND_PAY_UNEXPECTED_ERROR); + LoggerUtil.severe(getPlugin(), + e, + "Failed to execute /pay command used by {0}.", + getPlayer().getName()); + return false; + } + } + else + { + sendMessage(COMMAND_PAY_USE_$ALIASES, aliases); + return false; + } + } +} diff --git a/plugin/src/main/java/com/eul4/model/player/RaidPerformer.java b/plugin/src/main/java/com/eul4/model/player/performer/RaidPerformer.java similarity index 89% rename from plugin/src/main/java/com/eul4/model/player/RaidPerformer.java rename to plugin/src/main/java/com/eul4/model/player/performer/RaidPerformer.java index df8de6a2..44cbefe2 100644 --- a/plugin/src/main/java/com/eul4/model/player/RaidPerformer.java +++ b/plugin/src/main/java/com/eul4/model/player/performer/RaidPerformer.java @@ -1,7 +1,10 @@ -package com.eul4.model.player; +package com.eul4.model.player.performer; import com.eul4.common.model.player.CommonPlayer; import com.eul4.i18n.PluginMessage; +import com.eul4.model.player.Channeler; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.physical.SpawnPlayer; import com.eul4.type.PluginWorldType; import com.eul4.type.player.PhysicalPlayerType; import com.eul4.world.RaidLevel; diff --git a/plugin/src/main/java/com/eul4/model/player/SetHomePerformer.java b/plugin/src/main/java/com/eul4/model/player/performer/SetHomePerformer.java similarity index 97% rename from plugin/src/main/java/com/eul4/model/player/SetHomePerformer.java rename to plugin/src/main/java/com/eul4/model/player/performer/SetHomePerformer.java index 6ab49ca3..b103074a 100644 --- a/plugin/src/main/java/com/eul4/model/player/SetHomePerformer.java +++ b/plugin/src/main/java/com/eul4/model/player/performer/SetHomePerformer.java @@ -1,9 +1,10 @@ -package com.eul4.model.player; +package com.eul4.model.player.performer; import com.eul4.Price; import com.eul4.common.world.CommonWorld; import com.eul4.i18n.PluginMessage; import com.eul4.model.inventory.craft.CraftConfirmationGui; +import com.eul4.model.player.PluginPlayer; import com.eul4.service.PurchaseV2; import com.eul4.util.MessageUtil; import com.eul4.world.HomeableLevel; diff --git a/plugin/src/main/java/com/eul4/model/player/SpawnPerformer.java b/plugin/src/main/java/com/eul4/model/player/performer/SpawnPerformer.java similarity index 87% rename from plugin/src/main/java/com/eul4/model/player/SpawnPerformer.java rename to plugin/src/main/java/com/eul4/model/player/performer/SpawnPerformer.java index 5a96f582..952d3f4c 100644 --- a/plugin/src/main/java/com/eul4/model/player/SpawnPerformer.java +++ b/plugin/src/main/java/com/eul4/model/player/performer/SpawnPerformer.java @@ -1,6 +1,9 @@ -package com.eul4.model.player; +package com.eul4.model.player.performer; import com.eul4.common.model.player.CommonPlayer; +import com.eul4.model.player.Channeler; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.physical.SpawnPlayer; import com.eul4.type.PluginWorldType; import com.eul4.type.player.PhysicalPlayerType; import com.eul4.world.RaidLevel; diff --git a/plugin/src/main/java/com/eul4/model/player/TownPerformer.java b/plugin/src/main/java/com/eul4/model/player/performer/TownPerformer.java similarity index 94% rename from plugin/src/main/java/com/eul4/model/player/TownPerformer.java rename to plugin/src/main/java/com/eul4/model/player/performer/TownPerformer.java index 7b77a370..a8335b4d 100644 --- a/plugin/src/main/java/com/eul4/model/player/TownPerformer.java +++ b/plugin/src/main/java/com/eul4/model/player/performer/TownPerformer.java @@ -1,7 +1,10 @@ -package com.eul4.model.player; +package com.eul4.model.player.performer; import com.eul4.common.model.player.CommonPlayer; import com.eul4.i18n.PluginMessage; +import com.eul4.model.player.Channeler; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.type.player.PhysicalPlayerType; import com.eul4.type.player.PluginPlayerType; diff --git a/plugin/src/main/java/com/eul4/model/player/physical/Admin.java b/plugin/src/main/java/com/eul4/model/player/physical/Admin.java new file mode 100644 index 00000000..206c1de9 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/player/physical/Admin.java @@ -0,0 +1,21 @@ +package com.eul4.model.player.physical; + +import com.eul4.common.model.player.CommonAdmin; +import com.eul4.model.player.Invincible; +import com.eul4.model.player.PhysicalPlayer; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.performer.*; + +public interface Admin extends + CommonAdmin, PluginPlayer, PhysicalPlayer, Invincible, + TownPerformer.TeleportInside, + SpawnPerformer.Teleport, + SetHomePerformer, + DelHomePerformer, + HomePerformer.InstantTeleport, + NewbiePerformer.Teleport, + RaidPerformer.Teleport, + PayPerformer +{ + +} diff --git a/plugin/src/main/java/com/eul4/model/player/SpawnPlayer.java b/plugin/src/main/java/com/eul4/model/player/physical/SpawnPlayer.java similarity index 53% rename from plugin/src/main/java/com/eul4/model/player/SpawnPlayer.java rename to plugin/src/main/java/com/eul4/model/player/physical/SpawnPlayer.java index 310fa7c9..9877fa73 100644 --- a/plugin/src/main/java/com/eul4/model/player/SpawnPlayer.java +++ b/plugin/src/main/java/com/eul4/model/player/physical/SpawnPlayer.java @@ -1,7 +1,9 @@ -package com.eul4.model.player; +package com.eul4.model.player.physical; -public interface SpawnPlayer extends - PhysicalPlayer, +import com.eul4.model.player.*; +import com.eul4.model.player.performer.*; + +public interface SpawnPlayer extends PhysicalPlayer, TownPerformer.Reincarnate, SpawnPerformer.Teleport, TownScoreboardPlayer, @@ -10,7 +12,8 @@ public interface SpawnPlayer extends DelHomePerformer, HomePerformer.InstantTeleport, NewbiePerformer.Teleport, - RaidPerformer.Teleport + RaidPerformer.Teleport, + PayPerformer { PluginPlayer removeProtection(); } diff --git a/plugin/src/main/java/com/eul4/model/player/physical/TownPlayer.java b/plugin/src/main/java/com/eul4/model/player/physical/TownPlayer.java new file mode 100644 index 00000000..743e6ddd --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/player/physical/TownPlayer.java @@ -0,0 +1,26 @@ +package com.eul4.model.player.physical; + +import com.eul4.model.player.Invincible; +import com.eul4.model.player.PhysicalPlayer; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.TownScoreboardPlayer; +import com.eul4.model.player.performer.*; +import com.eul4.model.town.Town; +import com.eul4.scoreboard.TownScoreboard; + +public interface TownPlayer extends PluginPlayer, PhysicalPlayer, Invincible, + TownPerformer.TeleportInside, SpawnPerformer.Reincarnate, BuyStructurePerformer, TownScoreboardPlayer, DelHomePerformer, + HomePerformer.InstantTeleport, + NewbiePerformer.Reincarnate, + RaidPerformer.Reincarnate, + PayPerformer +{ + Town getTown(); + boolean hasTown(); + + void test(boolean test); + boolean test(); + + @Override + TownScoreboard getScoreboard(); +} diff --git a/plugin/src/main/java/com/eul4/model/player/TutorialTownPlayer.java b/plugin/src/main/java/com/eul4/model/player/physical/TutorialTownPlayer.java similarity index 59% rename from plugin/src/main/java/com/eul4/model/player/TutorialTownPlayer.java rename to plugin/src/main/java/com/eul4/model/player/physical/TutorialTownPlayer.java index f27ae81d..4aea3675 100644 --- a/plugin/src/main/java/com/eul4/model/player/TutorialTownPlayer.java +++ b/plugin/src/main/java/com/eul4/model/player/physical/TutorialTownPlayer.java @@ -1,5 +1,7 @@ -package com.eul4.model.player; +package com.eul4.model.player.physical; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.player.tutorial.step.Step; public interface TutorialTownPlayer extends TownPlayer diff --git a/plugin/src/main/java/com/eul4/model/player/physical/VanillaPlayer.java b/plugin/src/main/java/com/eul4/model/player/physical/VanillaPlayer.java new file mode 100644 index 00000000..07ddfaed --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/player/physical/VanillaPlayer.java @@ -0,0 +1,19 @@ +package com.eul4.model.player.physical; + +import com.eul4.model.player.Channeler; +import com.eul4.model.player.InitialScoreboardPlayer; +import com.eul4.model.player.PhysicalPlayer; +import com.eul4.model.player.TownScoreboardPlayer; +import com.eul4.model.player.performer.*; + +public interface VanillaPlayer extends PhysicalPlayer, + TownPerformer.ChannelReincarnation, + SpawnPerformer.ChannelReincarnation, TownScoreboardPlayer, InitialScoreboardPlayer, + SetHomePerformer, DelHomePerformer, + HomePerformer.Channeling, Channeler, + NewbiePerformer.ChannelReincarnation, + RaidPerformer.ChannelReincarnation, + PayPerformer +{ + +} diff --git a/plugin/src/main/java/com/eul4/model/player/spiritual/Attacker.java b/plugin/src/main/java/com/eul4/model/player/spiritual/Attacker.java new file mode 100644 index 00000000..1fedb77e --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/player/spiritual/Attacker.java @@ -0,0 +1,11 @@ +package com.eul4.model.player.spiritual; + +import com.eul4.model.player.Fighter; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.SpiritualPlayer; +import com.eul4.wrapper.TownAttack; + +public interface Attacker extends PluginPlayer, SpiritualPlayer, Fighter +{ + TownAttack getTownAttack(); +} diff --git a/plugin/src/main/java/com/eul4/model/player/spiritual/Defender.java b/plugin/src/main/java/com/eul4/model/player/spiritual/Defender.java new file mode 100644 index 00000000..e866ad01 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/player/spiritual/Defender.java @@ -0,0 +1,14 @@ +package com.eul4.model.player.spiritual; + +import com.eul4.model.player.Fighter; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.SpiritualPlayer; +import com.eul4.model.player.Warder; +import com.eul4.wrapper.TownAttack; + +import java.util.Optional; + +public interface Defender extends PluginPlayer, SpiritualPlayer, Warder, Fighter +{ + Optional findTownAttack(); +} diff --git a/plugin/src/main/java/com/eul4/model/player/spiritual/DefenderSpectator.java b/plugin/src/main/java/com/eul4/model/player/spiritual/DefenderSpectator.java new file mode 100644 index 00000000..75be58ce --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/player/spiritual/DefenderSpectator.java @@ -0,0 +1,18 @@ +package com.eul4.model.player.spiritual; + +import com.eul4.hotbar.DefenderSpectatorHotbar; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.Spectator; +import com.eul4.model.player.SpiritualPlayer; +import com.eul4.model.player.Warder; +import com.eul4.model.player.performer.SpawnPerformer; +import com.eul4.model.player.performer.TownPerformer; + +public interface DefenderSpectator extends PluginPlayer, SpiritualPlayer, Spectator, Warder, + TownPerformer.TeleportOutside, SpawnPerformer.Reincarnate +{ + DefenderSpectatorHotbar getHotbar(); + + void quit(); + void respawn(); +} diff --git a/plugin/src/main/java/com/eul4/model/player/InventoryOrganizerPlayer.java b/plugin/src/main/java/com/eul4/model/player/spiritual/InventoryOrganizerPlayer.java similarity index 54% rename from plugin/src/main/java/com/eul4/model/player/InventoryOrganizerPlayer.java rename to plugin/src/main/java/com/eul4/model/player/spiritual/InventoryOrganizerPlayer.java index 007b6614..07854e60 100644 --- a/plugin/src/main/java/com/eul4/model/player/InventoryOrganizerPlayer.java +++ b/plugin/src/main/java/com/eul4/model/player/spiritual/InventoryOrganizerPlayer.java @@ -1,5 +1,8 @@ -package com.eul4.model.player; +package com.eul4.model.player.spiritual; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.Spectator; +import com.eul4.model.player.SpiritualPlayer; import org.bukkit.inventory.ItemStack; public interface InventoryOrganizerPlayer extends PluginPlayer, SpiritualPlayer, Spectator diff --git a/plugin/src/main/java/com/eul4/model/player/RaidAnalyzer.java b/plugin/src/main/java/com/eul4/model/player/spiritual/RaidAnalyzer.java similarity index 64% rename from plugin/src/main/java/com/eul4/model/player/RaidAnalyzer.java rename to plugin/src/main/java/com/eul4/model/player/spiritual/RaidAnalyzer.java index 2c8401af..6f71a353 100644 --- a/plugin/src/main/java/com/eul4/model/player/RaidAnalyzer.java +++ b/plugin/src/main/java/com/eul4/model/player/spiritual/RaidAnalyzer.java @@ -1,17 +1,17 @@ -package com.eul4.model.player; +package com.eul4.model.player.spiritual; import com.eul4.common.model.player.ScoreboardPlayer; import com.eul4.common.scoreboard.CommonScoreboard; import com.eul4.hotbar.RaidAnalyzerHotbar; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.Spectator; +import com.eul4.model.player.SpiritualPlayer; import com.eul4.model.town.Town; import com.eul4.scoreboard.AnalyzerScoreboard; import java.util.Optional; -public interface RaidAnalyzer extends - PluginPlayer, - SpiritualPlayer, - Spectator, //TODO: Implemente TownPerformer & SpawnPerformer +public interface RaidAnalyzer extends PluginPlayer, SpiritualPlayer, Spectator, //TODO: Implemente TownPerformer & SpawnPerformer ScoreboardPlayer { void analyzeTown(Town town); diff --git a/plugin/src/main/java/com/eul4/model/player/spiritual/RaidSpectator.java b/plugin/src/main/java/com/eul4/model/player/spiritual/RaidSpectator.java new file mode 100644 index 00000000..e0ea3b9c --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/player/spiritual/RaidSpectator.java @@ -0,0 +1,18 @@ +package com.eul4.model.player.spiritual; + +import com.eul4.hotbar.RaidSpectatorHotbar; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.player.Spectator; +import com.eul4.model.player.SpiritualPlayer; +import com.eul4.model.player.Warder; +import com.eul4.model.player.performer.SpawnPerformer; +import com.eul4.model.player.performer.TownPerformer; + +public interface RaidSpectator extends PluginPlayer, SpiritualPlayer, Spectator, Warder, + TownPerformer.TeleportOutside, SpawnPerformer.Reincarnate +{ + RaidSpectatorHotbar getHotbar(); + + void defend(); + void vanilla(); +} diff --git a/plugin/src/main/java/com/eul4/model/player/tutorial/step/CheckpointStepEnum.java b/plugin/src/main/java/com/eul4/model/player/tutorial/step/CheckpointStepEnum.java index c64b6d90..e11a043a 100644 --- a/plugin/src/main/java/com/eul4/model/player/tutorial/step/CheckpointStepEnum.java +++ b/plugin/src/main/java/com/eul4/model/player/tutorial/step/CheckpointStepEnum.java @@ -1,7 +1,7 @@ package com.eul4.model.player.tutorial.step; import com.eul4.model.craft.player.tutorial.step.*; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import lombok.RequiredArgsConstructor; import java.util.function.Function; diff --git a/plugin/src/main/java/com/eul4/model/player/tutorial/step/Step.java b/plugin/src/main/java/com/eul4/model/player/tutorial/step/Step.java index bc76a82b..8c435e2d 100644 --- a/plugin/src/main/java/com/eul4/model/player/tutorial/step/Step.java +++ b/plugin/src/main/java/com/eul4/model/player/tutorial/step/Step.java @@ -1,6 +1,6 @@ package com.eul4.model.player.tutorial.step; -import com.eul4.model.player.TutorialTownPlayer; +import com.eul4.model.player.physical.TutorialTownPlayer; import org.bukkit.entity.Villager; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitTask; diff --git a/plugin/src/main/java/com/eul4/model/town/Town.java b/plugin/src/main/java/com/eul4/model/town/Town.java index 194fbf85..2ce2946e 100644 --- a/plugin/src/main/java/com/eul4/model/town/Town.java +++ b/plugin/src/main/java/com/eul4/model/town/Town.java @@ -3,11 +3,13 @@ import com.eul4.Main; import com.eul4.Price; import com.eul4.StructureType; +import com.eul4.economy.Transaction; import com.eul4.exception.*; +import com.eul4.holder.CapacitatedCrownHolder; import com.eul4.model.craft.town.CraftTown; -import com.eul4.model.player.Attacker; +import com.eul4.model.player.spiritual.Attacker; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import com.eul4.model.town.structure.*; import com.eul4.wrapper.*; import net.kyori.adventure.text.Component; @@ -21,10 +23,9 @@ import java.awt.*; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; +import java.math.BigDecimal; +import java.util.List; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; @@ -52,6 +53,8 @@ static Optional findStaticTownBlock(Block block) return Optional.ofNullable(getStaticTownBlock(block)); } + UUID getTownUniqueId(); + TownBlock getTownBlock(Block block); Optional findTownBlock(Block block); Location getLocation(); @@ -117,7 +120,7 @@ Price buyNewStructure(StructureType structureType, TownBlock townBlock) boolean canBeAnalyzed(); - UUID getOwnerUUID(); + UUID getOwnerUniqueId(); TownTileMap getTownTileMap(); TownBlockMap getTownBlockMap(); @@ -234,4 +237,19 @@ Price buyNewStructure(StructureType structureType, TownBlock townBlock) void setAssistant(Villager villager); boolean hasReachedStructureLimit(StructureType structureType); + + BigDecimal calculateCrownCapacity(); + BigDecimal calculateRemainingCrownCapacity(); + + BigDecimal getCalculatedCrownBalance(); + void updateCrownBalance(); + + List getCapacitatedCrownHolders(); + + List> createTradePreviewSubtract(BigDecimal subtrahend) + throws NegativeBalanceException; + + Transaction createTransaction(Town townTo, BigDecimal amount) throws + OverCapacityException, + NegativeBalanceException; } diff --git a/plugin/src/main/java/com/eul4/model/town/structure/CapacitatedCrownTransactionResourceStructure.java b/plugin/src/main/java/com/eul4/model/town/structure/CapacitatedCrownTransactionResourceStructure.java new file mode 100644 index 00000000..c5666bb0 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/town/structure/CapacitatedCrownTransactionResourceStructure.java @@ -0,0 +1,64 @@ +package com.eul4.model.town.structure; + +import com.eul4.economy.Transaction; +import com.eul4.exception.InvalidCryptoInfoException; +import com.eul4.exception.OverCapacityException; +import com.eul4.model.town.Town; +import com.eul4.wrapper.CryptoInfo; +import com.google.common.base.Preconditions; +import lombok.SneakyThrows; +import org.bukkit.inventory.ItemStack; + +import java.math.BigDecimal; + +import static com.eul4.common.util.BigDecimalUtil.*; + +public interface CapacitatedCrownTransactionResourceStructure extends + TransactionalResourceStructure, + StructureCapacitatedCrownHoldeable +{ + @SneakyThrows(InvalidCryptoInfoException.class) + default Transaction createStoleCrownTransaction(BigDecimal amount) + throws OverCapacityException + { + Preconditions.checkArgument(amount.compareTo(BigDecimal.ZERO) > 0); + CryptoInfo fakeCryptoInfo = getFakeCryptoInfo(); + + Town attackerTown = getTown().getCurrentAttack().getAttacker().getTown(); + + BigDecimal holderRemainingCapacity = attackerTown.calculateRemainingCrownCapacity(); + + if(holderRemainingCapacity.compareTo(BigDecimal.ZERO) <= 0) + { + throw new OverCapacityException(); + } + + final BigDecimal diffPreview = fakeCryptoInfo.previewMarketCapDiff(amount).negate(); + final BigDecimal balance = getCapacitatedCrownHolder().getBalance(); + final BigDecimal transactionAmount = min + ( + balance, + min(holderRemainingCapacity, max(diffPreview, ONE_CENT)) + ); + + return getTown().getPlugin().getTransactionManager().createTransaction + ( + getCapacitatedCrownHolder(), + attackerTown.getCapacitatedCrownHolders(), + transactionAmount + ); + } + + default BigDecimal getAmountOfCrownsToSteal(ItemStack tool) + { + //TODO increase multiplier with fortune or stability + return BigDecimal.ONE; + } + + private CryptoInfo getFakeCryptoInfo() + { + CryptoInfo fakeCryptoInfo = new CryptoInfo(getCapacitatedCrownHolder().getCapacity()); + fakeCryptoInfo.setMarketCap(getCapacitatedCrownHolder().getBalance()); + return fakeCryptoInfo; + } +} diff --git a/plugin/src/main/java/com/eul4/model/town/structure/CrownDeposit.java b/plugin/src/main/java/com/eul4/model/town/structure/CrownDeposit.java new file mode 100644 index 00000000..f0c4d2d1 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/town/structure/CrownDeposit.java @@ -0,0 +1,14 @@ +package com.eul4.model.town.structure; + +import com.eul4.holder.CapacitatedCrownHolder; + +import java.math.BigDecimal; + +public interface CrownDeposit extends PhysicalDeposit, StructureCapacitatedCrownHoldeable +{ + @Override + CapacitatedCrownHolder getHolder(); + + //TODO remover esse set da interface, fazer de outro jeito parecido com o TownTile + void setHolder(CapacitatedCrownHolder holder); +} diff --git a/plugin/src/main/java/com/eul4/model/town/structure/Deposit.java b/plugin/src/main/java/com/eul4/model/town/structure/Deposit.java index c40c527f..34fed62e 100644 --- a/plugin/src/main/java/com/eul4/model/town/structure/Deposit.java +++ b/plugin/src/main/java/com/eul4/model/town/structure/Deposit.java @@ -1,9 +1,8 @@ package com.eul4.model.town.structure; -import com.eul4.model.craft.town.structure.ResourceStructure; - -public interface Deposit extends ResourceStructure +public interface Deposit extends ResourceStructure { - int getCapacity(); - int getVirtualBalance(); + N getCapacity(); + N getVirtualBalance(); + N getTotalBalance(); } diff --git a/plugin/src/main/java/com/eul4/model/town/structure/DislikeDeposit.java b/plugin/src/main/java/com/eul4/model/town/structure/DislikeDeposit.java index 9d55f664..b4adc50d 100644 --- a/plugin/src/main/java/com/eul4/model/town/structure/DislikeDeposit.java +++ b/plugin/src/main/java/com/eul4/model/town/structure/DislikeDeposit.java @@ -1,6 +1,6 @@ package com.eul4.model.town.structure; -public interface DislikeDeposit extends Deposit +public interface DislikeDeposit extends Deposit { } diff --git a/plugin/src/main/java/com/eul4/model/town/structure/Generator.java b/plugin/src/main/java/com/eul4/model/town/structure/Generator.java index 5c6bd3cd..f2edf867 100644 --- a/plugin/src/main/java/com/eul4/model/town/structure/Generator.java +++ b/plugin/src/main/java/com/eul4/model/town/structure/Generator.java @@ -1,7 +1,6 @@ package com.eul4.model.town.structure; import com.eul4.enums.Currency; -import com.eul4.model.craft.town.structure.ResourceStructure; public interface Generator extends ResourceStructure { diff --git a/plugin/src/main/java/com/eul4/model/town/structure/LikeDeposit.java b/plugin/src/main/java/com/eul4/model/town/structure/LikeDeposit.java index 19b0b58f..070ddd85 100644 --- a/plugin/src/main/java/com/eul4/model/town/structure/LikeDeposit.java +++ b/plugin/src/main/java/com/eul4/model/town/structure/LikeDeposit.java @@ -1,6 +1,6 @@ package com.eul4.model.town.structure; -public interface LikeDeposit extends Deposit +public interface LikeDeposit extends Deposit { } diff --git a/plugin/src/main/java/com/eul4/model/town/structure/PhysicalDeposit.java b/plugin/src/main/java/com/eul4/model/town/structure/PhysicalDeposit.java new file mode 100644 index 00000000..0400c614 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/town/structure/PhysicalDeposit.java @@ -0,0 +1,15 @@ +package com.eul4.model.town.structure; + +import com.eul4.enums.Currency; +import com.eul4.holder.CapacitatedHolder; + +public interface PhysicalDeposit> extends Structure +{ + CapacitatedHolder getHolder(); + Currency getCurrency(); + + default boolean isEmpty() + { + return getHolder().isEmpty(); + } +} diff --git a/plugin/src/main/java/com/eul4/model/craft/town/structure/ResourceStructure.java b/plugin/src/main/java/com/eul4/model/town/structure/ResourceStructure.java similarity index 71% rename from plugin/src/main/java/com/eul4/model/craft/town/structure/ResourceStructure.java rename to plugin/src/main/java/com/eul4/model/town/structure/ResourceStructure.java index 428138cb..4ee7efc2 100644 --- a/plugin/src/main/java/com/eul4/model/craft/town/structure/ResourceStructure.java +++ b/plugin/src/main/java/com/eul4/model/town/structure/ResourceStructure.java @@ -1,6 +1,5 @@ -package com.eul4.model.craft.town.structure; +package com.eul4.model.town.structure; -import com.eul4.model.town.structure.Structure; import com.eul4.wrapper.Resource; import org.bukkit.block.Block; diff --git a/plugin/src/main/java/com/eul4/model/town/structure/Structure.java b/plugin/src/main/java/com/eul4/model/town/structure/Structure.java index 23f01512..ea3896c4 100644 --- a/plugin/src/main/java/com/eul4/model/town/structure/Structure.java +++ b/plugin/src/main/java/com/eul4/model/town/structure/Structure.java @@ -6,7 +6,7 @@ import com.eul4.enums.StructureStatus; import com.eul4.exception.*; import com.eul4.model.inventory.StructureGui; -import com.eul4.model.player.Attacker; +import com.eul4.model.player.spiritual.Attacker; import com.eul4.model.player.PluginPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; @@ -43,6 +43,8 @@ void construct(ClipboardHolder clipboardHolder, TownBlock centerTownBlock, int r File getSchematicFile(); StructureType getStructureType(); + void register() throws CannotConstructException, IOException; + void startMove() throws IOException; void cancelMoveBlindly(); diff --git a/plugin/src/main/java/com/eul4/model/town/structure/StructureCapacitatedCrownHoldeable.java b/plugin/src/main/java/com/eul4/model/town/structure/StructureCapacitatedCrownHoldeable.java new file mode 100644 index 00000000..a60a282c --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/town/structure/StructureCapacitatedCrownHoldeable.java @@ -0,0 +1,14 @@ +package com.eul4.model.town.structure; + +import com.eul4.holder.CapacitatedCrownHolder; +import com.eul4.holder.CrownHolder; + +public interface StructureCapacitatedCrownHoldeable extends StructureCrownHoldeable +{ + CapacitatedCrownHolder getCapacitatedCrownHolder(); + + default CrownHolder getCrownHolder() + { + return getCapacitatedCrownHolder(); + } +} diff --git a/plugin/src/main/java/com/eul4/model/town/structure/StructureCrownHoldeable.java b/plugin/src/main/java/com/eul4/model/town/structure/StructureCrownHoldeable.java new file mode 100644 index 00000000..a01a143c --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/town/structure/StructureCrownHoldeable.java @@ -0,0 +1,8 @@ +package com.eul4.model.town.structure; + +import com.eul4.holder.CrownHolder; + +public interface StructureCrownHoldeable extends Structure +{ + CrownHolder getCrownHolder(); +} diff --git a/plugin/src/main/java/com/eul4/model/town/structure/TownHall.java b/plugin/src/main/java/com/eul4/model/town/structure/TownHall.java index e99561cc..0737098b 100644 --- a/plugin/src/main/java/com/eul4/model/town/structure/TownHall.java +++ b/plugin/src/main/java/com/eul4/model/town/structure/TownHall.java @@ -1,15 +1,23 @@ package com.eul4.model.town.structure; import com.eul4.StructureType; -import com.eul4.model.craft.town.structure.ResourceStructure; +import com.eul4.holder.CapacitatedCrownHolder; import org.bukkit.Location; import java.util.Map; -public interface TownHall extends ResourceStructure +public interface TownHall extends + ResourceStructure, + StructureCapacitatedCrownHoldeable, + CapacitatedCrownTransactionResourceStructure { int getLikeCapacity(); int getDislikeCapacity(); + + CapacitatedCrownHolder getCapacitatedCrownHolder(); + void setCapacitatedCrownHolder(CapacitatedCrownHolder capacitatedCrownHolder); + void setDefaultCapacitatedCrownHolder(); + Map getStructureLimitMap(); Location getSpawnLocation(); diff --git a/plugin/src/main/java/com/eul4/model/town/structure/TransactionalResourceStructure.java b/plugin/src/main/java/com/eul4/model/town/structure/TransactionalResourceStructure.java new file mode 100644 index 00000000..b1dc73f5 --- /dev/null +++ b/plugin/src/main/java/com/eul4/model/town/structure/TransactionalResourceStructure.java @@ -0,0 +1,153 @@ +package com.eul4.model.town.structure; + +import com.eul4.common.i18n.MessageArgs; +import com.eul4.common.util.LoggerUtil; +import com.eul4.economy.Transaction; +import com.eul4.event.StructureDestroyEvent; +import com.eul4.event.TransactionalResourceStructureStealEvent; +import com.eul4.exception.OverCapacityException; +import com.eul4.i18n.PluginMessage; +import com.eul4.model.player.spiritual.Attacker; +import com.eul4.util.SoundUtil; +import com.eul4.wrapper.TownAttack; +import com.eul4.wrapper.TransactionalResource; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +import java.util.Optional; +import java.util.Set; + +import static com.eul4.common.wrapper.Pitch.max; +import static com.eul4.i18n.PluginMessage.OTHER_STOLE_FROM_YOU_$AMOUNT_$CURRENCY_$PLAYER; +import static com.eul4.i18n.PluginMessage.YOU_STOLE_FROM_OTHER_$AMOUNT_$CURRENCY_$PLAYER; +import static org.bukkit.Sound.ENTITY_EXPERIENCE_ORB_PICKUP; + +public interface TransactionalResourceStructure extends Structure +{ + > Set> getTransactionalResources(); + + default Optional> findTransactionResource(Block block) + { + for(TransactionalResource transactionalResource : getTransactionalResources()) + { + if(transactionalResource.getRelative(this.getCenterTownBlock().getBlock()).equals(block)) + { + return Optional.of(transactionalResource); + } + } + + return Optional.empty(); + } + + default > boolean steal + ( + TransactionalResource transactionalResource, + ItemStack tool + ) + { + if(!getTransactionalResources().contains(transactionalResource)) + { + return false; + } + + final N amount = transactionalResource.getAmountToSteal(tool); + + TownAttack townAttack = getTown().getCurrentAttack(); + Attacker attacker = townAttack == null ? null : townAttack.getAttacker(); + + if(attacker == null) + { + return false; + } + + try + { + Transaction transaction = transactionalResource + .getTransactionCreator() + .createTransaction(amount); + + N total = transaction.calculateTotal(transactionalResource.getCalculator()); + transaction.tryExecute(); + + attacker.sendMessage + ( + YOU_STOLE_FROM_OTHER_$AMOUNT_$CURRENCY_$PLAYER, + total, + transactionalResource.getType().getCurrency(), + getTown().getOwner() + ); + + attacker.getPlayer().playSound + ( + attacker.getPlayer(), + ENTITY_EXPERIENCE_ORB_PICKUP, + 1.0F, + max() + ); + + MessageArgs otherStoleYouMessage = OTHER_STOLE_FROM_YOU_$AMOUNT_$CURRENCY_$PLAYER + .withArgs + ( + total, + transactionalResource.getType().getCurrency(), + attacker.getPlayer() + ); + + getTown() + .findPluginPlayer() + .ifPresent(pluginPlayer -> + { + pluginPlayer.sendMessage(otherStoleYouMessage); + SoundUtil.playPiano(pluginPlayer.getPlayer()); + }); + + getTown().getPlugin().execute(this::placeTransactionalResources); + new TransactionalResourceStructureStealEvent(transactionalResource).callEvent(); + return true; + } + catch(OverCapacityException e) + { + attacker.sendMessage(transactionalResource.getType().getOverCapacityMessage()); + return false; + } + catch(Exception e) + { + attacker.sendMessage(PluginMessage.UNEXPECTED_ERROR_WHILE_STEALING); + LoggerUtil.severe + ( + getTown().getPlugin(), + e, + "Error while {0} tried to steal {1} resource ({2})", + attacker.getPlayer().getName(), + getTown().getOwner().getName(), + transactionalResource.getType()); + return false; + } + } + + private Optional findTransactionalResource(Block block) + { + for(TransactionalResource resource : getTransactionalResources()) + { + if(resource.getRelative(this.getCenterTownBlock().getBlock()).equals(block)) + { + return Optional.of(resource); + } + } + + return Optional.empty(); + } + + default void placeTransactionalResources() + { + for(TransactionalResource transactionalResource : getTransactionalResources()) + { + placeTransactionalResource(transactionalResource); + } + } + + private void placeTransactionalResource(TransactionalResource transactionalResource) + { + transactionalResource.placeRelative(getCenterTownBlock().getBlock()); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/attribute/ArmoryAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/ArmoryAttribute.java index c9d64a76..aa28244e 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/ArmoryAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/ArmoryAttribute.java @@ -9,5 +9,10 @@ @ToString(callSuper = true) public class ArmoryAttribute extends GenericAttribute { - public static final ArmoryAttribute DEFAULT = new ArmoryAttribute(); + public static final ArmoryAttribute DEFAULT = new ArmoryAttribute(GenericAttribute.Data.DEFAULT); + + public ArmoryAttribute(GenericAttribute.Data geneticAttributeData) + { + super(geneticAttributeData); + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/CannonAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/CannonAttribute.java index bf383105..8de2eebc 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/CannonAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/CannonAttribute.java @@ -9,5 +9,10 @@ @ToString(callSuper = true) public class CannonAttribute extends GenericAttribute { - public static final CannonAttribute DEFAULT = new CannonAttribute(); + public static final CannonAttribute DEFAULT = new CannonAttribute(Data.DEFAULT); + + public CannonAttribute(GenericAttribute.Data geneticAttributeData) + { + super(geneticAttributeData); + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/CrownDepositAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/CrownDepositAttribute.java new file mode 100644 index 00000000..8e38c4c1 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/attribute/CrownDepositAttribute.java @@ -0,0 +1,35 @@ +package com.eul4.rule.attribute; + +import com.eul4.enums.Currency; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.math.BigDecimal; + +@Getter +@Setter +@ToString(callSuper = true) +public class CrownDepositAttribute extends DepositAttribute +{ + public static final CrownDepositAttribute DEFAULT = new CrownDepositAttribute + ( + GenericAttribute.Data.DEFAULT, + new DepositAttribute.Data<>(BigDecimal.ZERO) + ); + + public CrownDepositAttribute + ( + GenericAttribute.Data genericAttributeData, + DepositAttribute.Data depositAttributeData + ) + { + super(genericAttributeData, depositAttributeData); + } + + @Override + public Currency getCurrency() + { + return Currency.CROWN; + } +} diff --git a/plugin/src/main/java/com/eul4/rule/attribute/DepositAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/DepositAttribute.java index 7b782142..5aa88889 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/DepositAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/DepositAttribute.java @@ -1,13 +1,34 @@ package com.eul4.rule.attribute; +import com.eul4.enums.Currency; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import org.jetbrains.annotations.NotNull; @Getter @Setter @ToString(callSuper = true) -public abstract class DepositAttribute extends GenericAttribute +public abstract class DepositAttribute extends GenericAttribute { - private int capacity; + private final @NotNull N capacity; + + protected DepositAttribute + ( + GenericAttribute.Data genericAttributeData, + DepositAttribute.Data depositAttributeData + ) + { + super(genericAttributeData); + + this.capacity = depositAttributeData.capacity; + } + + public abstract Currency getCurrency(); + + @lombok.Data + public static class Data + { + private final N capacity; + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/DislikeDepositAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/DislikeDepositAttribute.java index fc4263b8..b083626b 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/DislikeDepositAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/DislikeDepositAttribute.java @@ -1,5 +1,6 @@ package com.eul4.rule.attribute; +import com.eul4.enums.Currency; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -7,7 +8,26 @@ @Getter @Setter @ToString(callSuper = true) -public class DislikeDepositAttribute extends DepositAttribute +public class DislikeDepositAttribute extends DepositAttribute { - public static final DislikeDepositAttribute DEFAULT = new DislikeDepositAttribute(); + public static final DislikeDepositAttribute DEFAULT = new DislikeDepositAttribute + ( + GenericAttribute.Data.DEFAULT, + new DepositAttribute.Data<>(0) + ); + + public DislikeDepositAttribute + ( + GenericAttribute.Data geneticAttributeData, + DepositAttribute.Data depositAttributeData + ) + { + super(geneticAttributeData, depositAttributeData); + } + + @Override + public Currency getCurrency() + { + return Currency.DISLIKE; + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/DislikeGeneratorAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/DislikeGeneratorAttribute.java index 472d4eff..0d42d5fd 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/DislikeGeneratorAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/DislikeGeneratorAttribute.java @@ -9,5 +9,18 @@ @ToString(callSuper = true) public class DislikeGeneratorAttribute extends GeneratorAttribute { - public static final DislikeGeneratorAttribute DEFAULT = new DislikeGeneratorAttribute(); + public static final DislikeGeneratorAttribute DEFAULT = new DislikeGeneratorAttribute + ( + GenericAttribute.Data.DEFAULT, + GeneratorAttribute.Data.DEFAULT + ); + + public DislikeGeneratorAttribute + ( + GenericAttribute.Data genericAttributeData, + GeneratorAttribute.Data generatorAttributeData + ) + { + super(genericAttributeData, generatorAttributeData); + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/GeneratorAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/GeneratorAttribute.java index 3707208f..31bb41bc 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/GeneratorAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/GeneratorAttribute.java @@ -1,5 +1,6 @@ package com.eul4.rule.attribute; +import com.google.common.base.Preconditions; import lombok.Getter; import lombok.Setter; @@ -7,6 +8,29 @@ @Setter public abstract class GeneratorAttribute extends GenericAttribute { - private int capacity; - private int delay; + private final int capacity; + private final int delay; + + public GeneratorAttribute + ( + GenericAttribute.Data genericAttributeData, + GeneratorAttribute.Data generatorAttributeData + ) + { + super(genericAttributeData); + + this.capacity = generatorAttributeData.capacity; + this.delay = generatorAttributeData.delay; + + Preconditions.checkArgument(delay > 0, "Generator delay must be greater than 0."); + } + + @lombok.Data + public static class Data + { + public static final Data DEFAULT = new Data(0, Integer.MAX_VALUE); + + private final int capacity; + private final int delay; + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/GenericAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/GenericAttribute.java index 194d49e8..2a29e9c8 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/GenericAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/GenericAttribute.java @@ -11,9 +11,30 @@ @ToString public abstract class GenericAttribute { - private Price price; - private double hp; - private int requiresTownHallLevel; - private int totalBuildTicks; - private Vector hologramVector; + private final Price price; + private final double hp; + private final int requiresTownHallLevel; + private final int totalBuildTicks; + private final Vector hologramVector; + + protected GenericAttribute(GenericAttribute.Data genericAttributeData) + { + this.price = genericAttributeData.price; + this.hp = genericAttributeData.hp; + this.requiresTownHallLevel = genericAttributeData.requiresTownHallLevel; + this.totalBuildTicks = genericAttributeData.totalBuildTicks; + this.hologramVector = genericAttributeData.hologramVector; + } + + @lombok.Data + public static class Data + { + public static final Data DEFAULT = new Data(null, 100.0D, Integer.MAX_VALUE, Integer.MAX_VALUE, new Vector()); + + private final Price price; + private final double hp; + private final int requiresTownHallLevel; + private final int totalBuildTicks; + private final Vector hologramVector; + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/LikeDepositAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/LikeDepositAttribute.java index f1a6d262..96999083 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/LikeDepositAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/LikeDepositAttribute.java @@ -1,13 +1,35 @@ package com.eul4.rule.attribute; +import com.eul4.enums.Currency; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import java.math.BigDecimal; + @Getter @Setter @ToString(callSuper = true) -public class LikeDepositAttribute extends DepositAttribute +public class LikeDepositAttribute extends DepositAttribute { - public static final LikeDepositAttribute DEFAULT = new LikeDepositAttribute(); + public static final LikeDepositAttribute DEFAULT = new LikeDepositAttribute + ( + GenericAttribute.Data.DEFAULT, + new DepositAttribute.Data<>(0) + ); + + public LikeDepositAttribute + ( + GenericAttribute.Data geneticAttributeData, + DepositAttribute.Data depositAttributeData + ) + { + super(geneticAttributeData, depositAttributeData); + } + + @Override + public Currency getCurrency() + { + return Currency.LIKE; + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/LikeGeneratorAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/LikeGeneratorAttribute.java index ec80faf8..aaa58268 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/LikeGeneratorAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/LikeGeneratorAttribute.java @@ -9,5 +9,18 @@ @ToString(callSuper = true) public class LikeGeneratorAttribute extends GeneratorAttribute { - public static final LikeGeneratorAttribute DEFAULT = new LikeGeneratorAttribute(); + public static final LikeGeneratorAttribute DEFAULT = new LikeGeneratorAttribute + ( + GenericAttribute.Data.DEFAULT, + GeneratorAttribute.Data.DEFAULT + ); + + public LikeGeneratorAttribute + ( + GenericAttribute.Data geneticAttributeData, + GeneratorAttribute.Data generatorAttributeData + ) + { + super(geneticAttributeData, generatorAttributeData); + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/TownHallAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/TownHallAttribute.java index e2804000..688d3489 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/TownHallAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/TownHallAttribute.java @@ -1,11 +1,14 @@ package com.eul4.rule.attribute; import com.eul4.StructureType; +import com.google.common.base.Preconditions; import com.sk89q.worldedit.math.Vector3; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import java.math.BigDecimal; +import java.util.Collections; import java.util.Map; @Getter @@ -13,10 +16,42 @@ @ToString(callSuper = true) public class TownHallAttribute extends GenericAttribute { - public static final TownHallAttribute DEFAULT = new TownHallAttribute(); + public static final TownHallAttribute DEFAULT = new TownHallAttribute + ( + GenericAttribute.Data.DEFAULT, + TownHallAttribute.Data.DEFAULT + ); private Map structureLimit; private int likeCapacity; private int dislikeCapacity; + private BigDecimal crownCapacity; private Vector3 spawnPosition; + + public TownHallAttribute + ( + GenericAttribute.Data genericAttributeData, + TownHallAttribute.Data townHallAttributeData + ) + { + super(genericAttributeData); + + this.structureLimit = townHallAttributeData.structureLimit; + this.likeCapacity = townHallAttributeData.likeCapacity; + this.dislikeCapacity = townHallAttributeData.dislikeCapacity; + this.crownCapacity = townHallAttributeData.crownCapacity; + this.spawnPosition = Preconditions.checkNotNull(townHallAttributeData.spawnPosition, "spawnPosition is null"); + } + + @lombok.Data + public static class Data + { + public static final Data DEFAULT = new Data(Collections.emptyMap(), 0, 0, BigDecimal.ZERO, Vector3.ZERO); + + private final Map structureLimit; + private final int likeCapacity; + private final int dislikeCapacity; + private final BigDecimal crownCapacity; + private final Vector3 spawnPosition; + } } diff --git a/plugin/src/main/java/com/eul4/rule/attribute/TurretAttribute.java b/plugin/src/main/java/com/eul4/rule/attribute/TurretAttribute.java index 6c7f3a21..c93c5b64 100644 --- a/plugin/src/main/java/com/eul4/rule/attribute/TurretAttribute.java +++ b/plugin/src/main/java/com/eul4/rule/attribute/TurretAttribute.java @@ -9,12 +9,30 @@ @ToString(callSuper = true) public class TurretAttribute extends GenericAttribute { - public static final TurretAttribute DEFAULT = new TurretAttribute(); + public static final TurretAttribute DEFAULT = new TurretAttribute + ( + GenericAttribute.Data.DEFAULT, + TurretAttribute.Data.DEFAULT + ); - private double attackDamage; - private int attackSpeed = Integer.MAX_VALUE; - private double missileSpeed; - private double range; + private final double attackDamage; + private final int attackSpeed; + private final double missileSpeed; + private final double range; + + public TurretAttribute + ( + GenericAttribute.Data genericAttributeData, + TurretAttribute.Data turretAttributeData + ) + { + super(genericAttributeData); + + this.attackDamage = turretAttributeData.attackDamage; + this.attackSpeed = turretAttributeData.attackSpeed; + this.missileSpeed = turretAttributeData.missileSpeed; + this.range = turretAttributeData.range; + } public double getAttackSpeedPerSecond() { @@ -25,4 +43,15 @@ public double getMissileSpeedPerSecond() { return missileSpeed * 20.0D; } + + @lombok.Data + public static class Data + { + public static final Data DEFAULT = new Data(0.0D, Integer.MAX_VALUE, 0.0D, 0.0D); + + private final double attackDamage; + private final int attackSpeed; + private final double missileSpeed; + private final double range; + } } diff --git a/plugin/src/main/java/com/eul4/rule/serializer/DepositRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/DepositRuleSerializer.java deleted file mode 100644 index 05dd99c4..00000000 --- a/plugin/src/main/java/com/eul4/rule/serializer/DepositRuleSerializer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.eul4.rule.serializer; - -import com.eul4.Main; -import com.eul4.rule.attribute.DepositAttribute; -import org.bukkit.configuration.ConfigurationSection; - -public abstract class DepositRuleSerializer extends GenericRuleSerializer -{ - public DepositRuleSerializer(Main plugin) - { - super(plugin); - } - - public void readExternal(DepositAttribute deposit, ConfigurationSection section) - { - super.readExternal(deposit, section); - - final int capacity = section.getInt("capacity"); - - deposit.setCapacity(capacity); - } -} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/DislikeDepositRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/DislikeDepositRuleSerializer.java deleted file mode 100644 index 37747526..00000000 --- a/plugin/src/main/java/com/eul4/rule/serializer/DislikeDepositRuleSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.eul4.rule.serializer; - -import com.eul4.Main; -import com.eul4.StructureType; -import com.eul4.rule.Rule; -import com.eul4.rule.attribute.DislikeDepositAttribute; -import org.bukkit.configuration.ConfigurationSection; - -import java.io.FileNotFoundException; - -public class DislikeDepositRuleSerializer extends DepositRuleSerializer -{ - public DislikeDepositRuleSerializer(Main plugin) - { - super(plugin); - } - - public Rule load() throws FileNotFoundException - { - return deserializeRule( - loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.DISLIKE_DEPOSIT)), - DislikeDepositAttribute.DEFAULT, - this::deserializeAttribute); - } - - public DislikeDepositAttribute deserializeAttribute(ConfigurationSection section) - { - DislikeDepositAttribute dislikeDepositAttribute = new DislikeDepositAttribute(); - readExternal(dislikeDepositAttribute, section); - return dislikeDepositAttribute; - } - - private void readExternal(DislikeDepositAttribute dislikeDepositAttribute, ConfigurationSection section) - { - super.readExternal(dislikeDepositAttribute, section); - } -} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/DislikeGeneratorRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/DislikeGeneratorRuleSerializer.java deleted file mode 100644 index 2d63d496..00000000 --- a/plugin/src/main/java/com/eul4/rule/serializer/DislikeGeneratorRuleSerializer.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.eul4.rule.serializer; - -import com.eul4.Main; -import com.eul4.rule.attribute.DislikeGeneratorAttribute; -import com.eul4.rule.Rule; -import org.bukkit.configuration.ConfigurationSection; - -import java.io.FileNotFoundException; - -public class DislikeGeneratorRuleSerializer extends GeneratorRuleSerializer -{ - public DislikeGeneratorRuleSerializer(Main plugin) - { - super(plugin); - } - - public Rule load() throws FileNotFoundException - { - return deserializeRule(loadConfig(plugin.getDataFileManager() - .getDislikeGeneratorRuleFile()), DislikeGeneratorAttribute.DEFAULT, this::deserializeAttribute); - } - - public DislikeGeneratorAttribute deserializeAttribute(ConfigurationSection section) - { - DislikeGeneratorAttribute dislikeGeneratorAttribute = new DislikeGeneratorAttribute(); - readExternal(dislikeGeneratorAttribute, section); - return dislikeGeneratorAttribute; - } - - private void readExternal(DislikeGeneratorAttribute dislikeGeneratorAttribute, ConfigurationSection section) - { - super.readExternal(dislikeGeneratorAttribute, section); - } -} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/GeneratorRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/GeneratorRuleSerializer.java deleted file mode 100644 index 97c302a9..00000000 --- a/plugin/src/main/java/com/eul4/rule/serializer/GeneratorRuleSerializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.eul4.rule.serializer; - -import com.eul4.Main; -import com.eul4.rule.attribute.GeneratorAttribute; -import org.bukkit.configuration.ConfigurationSection; - -public abstract class GeneratorRuleSerializer extends GenericRuleSerializer -{ - public GeneratorRuleSerializer(Main plugin) - { - super(plugin); - } - - public void readExternal(GeneratorAttribute generatorAttribute, ConfigurationSection section) - { - super.readExternal(generatorAttribute, section); - - final int capacity = section.getInt("capacity"); - final int delay = section.getInt("delay"); - - if(delay <= 0) - { - throw new IllegalArgumentException("Generator delay must be greater than 0."); - } - - generatorAttribute.setCapacity(capacity); - generatorAttribute.setDelay(delay); - } -} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/GenericRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/GenericRuleSerializer.java deleted file mode 100644 index fc929f0a..00000000 --- a/plugin/src/main/java/com/eul4/rule/serializer/GenericRuleSerializer.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.eul4.rule.serializer; - -import com.eul4.Main; -import com.eul4.Price; -import com.eul4.rule.attribute.GenericAttribute; -import com.eul4.rule.Rule; -import lombok.RequiredArgsConstructor; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.util.Vector; - -import java.io.File; -import java.io.FileNotFoundException; -import java.util.function.Function; - -@RequiredArgsConstructor -public abstract class GenericRuleSerializer -{ - protected final Main plugin; - - public YamlConfiguration loadConfig(File file) throws FileNotFoundException - { - if(!file.exists() || file.length() == 0L) - { - throw new FileNotFoundException(file.getName() + " file not found."); - } - - return YamlConfiguration.loadConfiguration(file); - } - - public Rule deserializeRule(YamlConfiguration config, A defaultAttribute, - Function function) - { - Rule rule = new Rule<>(defaultAttribute); - - for(String key : config.getKeys(false)) - { - int level = Integer.parseInt(key); - ConfigurationSection section = config.getConfigurationSection(String.valueOf(level)); - - rule.setRule(level, function.apply(section)); - } - - return rule; - } - - public void readExternal(GenericAttribute genericAttribute, ConfigurationSection section) - { - final int requiresTownHallLevel = section.getInt("requires_town_hall_level"); - final int totalBuildTicks = section.getInt("total_build_ticks"); - - final double hp = section.getDouble("hp", 500.0D); - - final double hologramX = section.getDouble("hologram_pos.x"); - final double hologramY = section.getDouble("hologram_pos.y"); - final double hologramZ = section.getDouble("hologram_pos.z"); - final Vector hologramVector = new Vector(hologramX, hologramY, hologramZ); - - ConfigurationSection priceSection = section.getConfigurationSection("price"); - - if(priceSection != null) - { - final int like = priceSection.getInt("like"); - final int dislike = priceSection.getInt("dislike"); - - genericAttribute.setPrice(new Price(like, dislike)); - } - - genericAttribute.setHp(hp); - genericAttribute.setRequiresTownHallLevel(requiresTownHallLevel); - genericAttribute.setTotalBuildTicks(totalBuildTicks); - genericAttribute.setHologramVector(hologramVector); - } -} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/LikeDepositRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/LikeDepositRuleSerializer.java deleted file mode 100644 index 6175c6bf..00000000 --- a/plugin/src/main/java/com/eul4/rule/serializer/LikeDepositRuleSerializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.eul4.rule.serializer; - -import com.eul4.Main; -import com.eul4.StructureType; -import com.eul4.rule.Rule; -import com.eul4.rule.attribute.LikeDepositAttribute; -import org.bukkit.configuration.ConfigurationSection; - -import java.io.FileNotFoundException; - -public class LikeDepositRuleSerializer extends DepositRuleSerializer -{ - public LikeDepositRuleSerializer(Main plugin) - { - super(plugin); - } - - public Rule load() throws FileNotFoundException - { - return deserializeRule(loadConfig(plugin.getDataFileManager() - .getRuleFile(StructureType.LIKE_DEPOSIT)), LikeDepositAttribute.DEFAULT, this::deserializeAttribute); - } - - public LikeDepositAttribute deserializeAttribute(ConfigurationSection section) - { - LikeDepositAttribute likeDepositAttribute = new LikeDepositAttribute(); - readExternal(likeDepositAttribute, section); - return likeDepositAttribute; - } - - private void readExternal(LikeDepositAttribute likeDepositAttribute, ConfigurationSection section) - { - super.readExternal(likeDepositAttribute, section); - } -} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/LikeGeneratorRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/LikeGeneratorRuleSerializer.java deleted file mode 100644 index 2b489c85..00000000 --- a/plugin/src/main/java/com/eul4/rule/serializer/LikeGeneratorRuleSerializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.eul4.rule.serializer; - -import com.eul4.Main; -import com.eul4.rule.attribute.LikeGeneratorAttribute; -import com.eul4.rule.Rule; -import org.bukkit.configuration.ConfigurationSection; - -import java.io.FileNotFoundException; - -public class LikeGeneratorRuleSerializer extends GeneratorRuleSerializer -{ - public LikeGeneratorRuleSerializer(Main plugin) - { - super(plugin); - } - - public Rule load() throws FileNotFoundException - { - return deserializeRule(loadConfig(plugin.getDataFileManager() - .getLikeGeneratorRuleFile()), LikeGeneratorAttribute.DEFAULT, this::deserializeAttribute); - } - - private LikeGeneratorAttribute deserializeAttribute(ConfigurationSection section) - { - LikeGeneratorAttribute likeGeneratorAttribute = new LikeGeneratorAttribute(); - super.readExternal(likeGeneratorAttribute, section); - return likeGeneratorAttribute; - } -} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/TownHallRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/TownHallRuleSerializer.java deleted file mode 100644 index c5467ac4..00000000 --- a/plugin/src/main/java/com/eul4/rule/serializer/TownHallRuleSerializer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.eul4.rule.serializer; - -import com.eul4.Main; -import com.eul4.StructureType; -import com.eul4.rule.Rule; -import com.eul4.rule.attribute.TownHallAttribute; -import com.sk89q.worldedit.math.Vector3; -import org.bukkit.configuration.ConfigurationSection; - -import java.io.FileNotFoundException; -import java.util.HashMap; -import java.util.Map; - -public class TownHallRuleSerializer extends GenericRuleSerializer -{ - public TownHallRuleSerializer(Main plugin) - { - super(plugin); - } - - public Rule load() throws FileNotFoundException - { - return deserializeRule(loadConfig(plugin.getDataFileManager() - .getTownHallRuleFile()), TownHallAttribute.DEFAULT, this::deserializeAttribute); - } - - private TownHallAttribute deserializeAttribute(ConfigurationSection section) - { - TownHallAttribute townHallAttribute = new TownHallAttribute(); - readExternal(townHallAttribute, section); - return townHallAttribute; - } - - private void readExternal(TownHallAttribute townHallAttribute, ConfigurationSection section) - { - super.readExternal(townHallAttribute, section); - readStructureLimit(townHallAttribute, section); - - int likeCapacity = section.getInt("like_capacity"); - int dislikeCapacity = section.getInt("dislike_capacity"); - double spawnPositionX = section.getDouble("spawn_position.x"); - double spawnPositionY = section.getDouble("spawn_position.y"); - double spawnPositionZ = section.getDouble("spawn_position.z"); - Vector3 spawnPosition = Vector3.at(spawnPositionX, spawnPositionY, spawnPositionZ); - - townHallAttribute.setLikeCapacity(likeCapacity); - townHallAttribute.setDislikeCapacity(dislikeCapacity); - townHallAttribute.setSpawnPosition(spawnPosition); - } - - private void readStructureLimit(TownHallAttribute townHallAttribute, ConfigurationSection section) - { - ConfigurationSection structureLimitSection = section.getConfigurationSection("structure_limit"); - - Map structureLimit = new HashMap<>(); - - if(structureLimitSection != null) - { - for(String key : structureLimitSection.getKeys(false)) - { - StructureType structureType = StructureType.valueOf(key); - int limit = structureLimitSection.getInt(key); - - structureLimit.put(structureType, limit); - } - } - - townHallAttribute.setStructureLimit(structureLimit); - } -} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/TurretRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/TurretRuleSerializer.java deleted file mode 100644 index afe00cc8..00000000 --- a/plugin/src/main/java/com/eul4/rule/serializer/TurretRuleSerializer.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.eul4.rule.serializer; - -import com.eul4.Main; -import com.eul4.StructureType; -import com.eul4.rule.Rule; -import com.eul4.rule.attribute.TurretAttribute; -import org.bukkit.configuration.ConfigurationSection; - -import java.io.FileNotFoundException; - -public class TurretRuleSerializer extends GenericRuleSerializer -{ - public TurretRuleSerializer(Main plugin) - { - super(plugin); - } - - public Rule load() throws FileNotFoundException - { - return deserializeRule( - loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.TURRET)), - TurretAttribute.DEFAULT, - this::deserializeAttribute); - } - - public TurretAttribute deserializeAttribute(ConfigurationSection section) - { - TurretAttribute turretAttribute = new TurretAttribute(); - readExternal(turretAttribute, section); - return turretAttribute; - } - - private void readExternal(TurretAttribute turretAttribute, ConfigurationSection section) - { - super.readExternal(turretAttribute, section); - - final double attackDamage = section.getDouble("attack_damage", 1.0D); - final int attackSpeed = section.getInt("attack_speed", 100); - final double missileSpeed = section.getDouble("missile_speed", 0.1D); - final double range = section.getDouble("range", 5.0D); - - turretAttribute.setAttackDamage(attackDamage); - turretAttribute.setAttackSpeed(attackSpeed); - turretAttribute.setMissileSpeed(missileSpeed); - turretAttribute.setRange(range); - } -} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/data/DepositAttributeDataSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/data/DepositAttributeDataSerializer.java new file mode 100644 index 00000000..b742ea35 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/data/DepositAttributeDataSerializer.java @@ -0,0 +1,26 @@ +package com.eul4.rule.serializer.data; + +import com.eul4.rule.attribute.DepositAttribute; +import org.bukkit.configuration.ConfigurationSection; + +import java.math.BigDecimal; + +public class DepositAttributeDataSerializer +{ + public static DepositAttribute.Data deserialize(ConfigurationSection section, Class type) + { + if(type == BigDecimal.class) + { + BigDecimal capacity = new BigDecimal(section.getString("capacity", "0")); + return new DepositAttribute.Data<>(type.cast(capacity)); + } + + if(type == Integer.class) + { + int capacity = section.getInt("capacity"); + return new DepositAttribute.Data<>(type.cast(capacity)); + } + + throw new IllegalArgumentException("Unsupported number: " + type.getSimpleName()); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/data/GeneratorAttributeDataSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/data/GeneratorAttributeDataSerializer.java new file mode 100644 index 00000000..1a20af2b --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/data/GeneratorAttributeDataSerializer.java @@ -0,0 +1,15 @@ +package com.eul4.rule.serializer.data; + +import com.eul4.rule.attribute.GeneratorAttribute; +import org.bukkit.configuration.ConfigurationSection; + +public class GeneratorAttributeDataSerializer +{ + public static GeneratorAttribute.Data deserialize(ConfigurationSection section) + { + final int capacity = section.getInt("capacity"); + final int delay = section.getInt("delay"); + + return new GeneratorAttribute.Data(capacity, delay); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/data/GenericAttributeDataSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/data/GenericAttributeDataSerializer.java new file mode 100644 index 00000000..65bfcd58 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/data/GenericAttributeDataSerializer.java @@ -0,0 +1,47 @@ +package com.eul4.rule.serializer.data; + +import com.eul4.Price; +import com.eul4.rule.attribute.GenericAttribute; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.util.Vector; + +public class GenericAttributeDataSerializer +{ + public static GenericAttribute.Data deserialize(ConfigurationSection section) + { + final Price price = getPrice(section.getConfigurationSection("price")); + final double hp = section.getDouble("hp", 500.0D); + final int requiresTownHallLevel = section.getInt("requires_town_hall_level"); + final int totalBuildTicks = section.getInt("total_build_ticks"); + final Vector hologramVector = getVector(section.getConfigurationSection("hologram_pos")); + + return new GenericAttribute.Data(price, hp, requiresTownHallLevel, totalBuildTicks, hologramVector); + } + + private static Price getPrice(ConfigurationSection priceSection) + { + if(priceSection == null) + { + return null; + } + + final int like = priceSection.getInt("like"); + final int dislike = priceSection.getInt("dislike"); + + return new Price(like, dislike); + } + + private static Vector getVector(ConfigurationSection vectorSection) + { + if(vectorSection == null) + { + return null; + } + + final double x = vectorSection.getDouble("x"); + final double y = vectorSection.getDouble("y"); + final double z = vectorSection.getDouble("z"); + + return new Vector(x, y, z); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/data/TownHallAttributeDataSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/data/TownHallAttributeDataSerializer.java new file mode 100644 index 00000000..e61595a1 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/data/TownHallAttributeDataSerializer.java @@ -0,0 +1,58 @@ +package com.eul4.rule.serializer.data; + +import com.eul4.StructureType; +import com.eul4.rule.attribute.TownHallAttribute; +import com.sk89q.worldedit.math.Vector3; +import org.bukkit.configuration.ConfigurationSection; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class TownHallAttributeDataSerializer +{ + public static TownHallAttribute.Data deserialize(ConfigurationSection section) + { + final Map structureLimit = getStructureLimit(section.getConfigurationSection("structure_limit")); + final int likeCapacity = section.getInt("like_capacity"); + final int dislikeCapacity = section.getInt("dislike_capacity"); + final BigDecimal crownCapacity = new BigDecimal(section.getString("crown_capacity", "0")); + final Vector3 spawnPosition = Optional.ofNullable(getVector3(section.getConfigurationSection("spawn_position"))) + .orElse(Vector3.ZERO); + + return new TownHallAttribute.Data(structureLimit, likeCapacity, dislikeCapacity, crownCapacity, spawnPosition); + } + + private static Vector3 getVector3(ConfigurationSection vector3Section) + { + if(vector3Section == null) + { + return null; + } + + double x = vector3Section.getDouble("x"); + double y = vector3Section.getDouble("y"); + double z = vector3Section.getDouble("z"); + + return Vector3.at(x, y , z); + } + + private static Map getStructureLimit(ConfigurationSection structureLimitSection) + { + Map structureLimit = new HashMap<>(); + + if(structureLimitSection != null) + { + for(String key : structureLimitSection.getKeys(false)) + { + StructureType structureType = StructureType.valueOf(key); + int limit = structureLimitSection.getInt(key); + + structureLimit.put(structureType, limit); + } + } + + return structureLimit; + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/data/TurretAttributeDataSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/data/TurretAttributeDataSerializer.java new file mode 100644 index 00000000..cdb89188 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/data/TurretAttributeDataSerializer.java @@ -0,0 +1,17 @@ +package com.eul4.rule.serializer.data; + +import com.eul4.rule.attribute.TurretAttribute; +import org.bukkit.configuration.ConfigurationSection; + +public class TurretAttributeDataSerializer +{ + public static TurretAttribute.Data deserialize(ConfigurationSection section) + { + final double attackDamage = section.getDouble("attack_damage", 1.0D); + final int attackSpeed = section.getInt("attack_speed", 100); + final double missileSpeed = section.getDouble("missile_speed", 0.1D); + final double range = section.getDouble("range", 5.0D); + + return new TurretAttribute.Data(attackDamage, attackSpeed, missileSpeed, range); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/ArmoryRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/ArmoryRuleSerializer.java similarity index 51% rename from plugin/src/main/java/com/eul4/rule/serializer/ArmoryRuleSerializer.java rename to plugin/src/main/java/com/eul4/rule/serializer/rule/ArmoryRuleSerializer.java index 1b9462c2..1ce24b25 100644 --- a/plugin/src/main/java/com/eul4/rule/serializer/ArmoryRuleSerializer.java +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/ArmoryRuleSerializer.java @@ -1,9 +1,11 @@ -package com.eul4.rule.serializer; +package com.eul4.rule.serializer.rule; import com.eul4.Main; import com.eul4.StructureType; import com.eul4.rule.Rule; import com.eul4.rule.attribute.ArmoryAttribute; +import com.eul4.rule.attribute.GenericAttribute; +import com.eul4.rule.serializer.data.GenericAttributeDataSerializer; import org.bukkit.configuration.ConfigurationSection; import java.io.FileNotFoundException; @@ -17,21 +19,18 @@ public ArmoryRuleSerializer(Main plugin) public Rule load() throws FileNotFoundException { - return deserializeRule( - loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.ARMORY)), - ArmoryAttribute.DEFAULT, - this::deserializeAttribute); + return deserializeRule + ( + loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.ARMORY)), + ArmoryAttribute.DEFAULT, + this::deserializeAttribute + ); } public ArmoryAttribute deserializeAttribute(ConfigurationSection section) { - ArmoryAttribute armoryAttribute = new ArmoryAttribute(); - readExternal(armoryAttribute, section); - return armoryAttribute; - } - - private void readExternal(ArmoryAttribute armoryAttribute, ConfigurationSection section) - { - super.readExternal(armoryAttribute, section); + GenericAttribute.Data genericAttributeData = GenericAttributeDataSerializer.deserialize(section); + + return new ArmoryAttribute(genericAttributeData); } } diff --git a/plugin/src/main/java/com/eul4/rule/serializer/CannonRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/CannonRuleSerializer.java similarity index 51% rename from plugin/src/main/java/com/eul4/rule/serializer/CannonRuleSerializer.java rename to plugin/src/main/java/com/eul4/rule/serializer/rule/CannonRuleSerializer.java index 62fccb8f..24516e36 100644 --- a/plugin/src/main/java/com/eul4/rule/serializer/CannonRuleSerializer.java +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/CannonRuleSerializer.java @@ -1,9 +1,11 @@ -package com.eul4.rule.serializer; +package com.eul4.rule.serializer.rule; import com.eul4.Main; import com.eul4.StructureType; import com.eul4.rule.Rule; import com.eul4.rule.attribute.CannonAttribute; +import com.eul4.rule.attribute.GenericAttribute; +import com.eul4.rule.serializer.data.GenericAttributeDataSerializer; import org.bukkit.configuration.ConfigurationSection; import java.io.FileNotFoundException; @@ -17,21 +19,18 @@ public CannonRuleSerializer(Main plugin) public Rule load() throws FileNotFoundException { - return deserializeRule( - loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.CANNON)), - CannonAttribute.DEFAULT, - this::deserializeAttribute); + return deserializeRule + ( + loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.CANNON)), + CannonAttribute.DEFAULT, + this::deserializeAttribute + ); } public CannonAttribute deserializeAttribute(ConfigurationSection section) { - CannonAttribute cannonAttribute = new CannonAttribute(); - readExternal(cannonAttribute, section); - return cannonAttribute; - } - - private void readExternal(CannonAttribute cannonAttribute, ConfigurationSection section) - { - super.readExternal(cannonAttribute, section); + GenericAttribute.Data genericAttributeData = GenericAttributeDataSerializer.deserialize(section); + + return new CannonAttribute(genericAttributeData); } } diff --git a/plugin/src/main/java/com/eul4/rule/serializer/rule/CrownDepositRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/CrownDepositRuleSerializer.java new file mode 100644 index 00000000..dcd1e0a6 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/CrownDepositRuleSerializer.java @@ -0,0 +1,40 @@ +package com.eul4.rule.serializer.rule; + +import com.eul4.Main; +import com.eul4.StructureType; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.CrownDepositAttribute; +import com.eul4.rule.attribute.DepositAttribute; +import com.eul4.rule.attribute.GenericAttribute; +import com.eul4.rule.serializer.data.DepositAttributeDataSerializer; +import com.eul4.rule.serializer.data.GenericAttributeDataSerializer; +import org.bukkit.configuration.ConfigurationSection; + +import java.io.FileNotFoundException; +import java.math.BigDecimal; + +public class CrownDepositRuleSerializer extends GenericRuleSerializer +{ + public CrownDepositRuleSerializer(Main plugin) + { + super(plugin); + } + + public Rule load() throws FileNotFoundException + { + return deserializeRule + ( + loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.CROWN_DEPOSIT)), + CrownDepositAttribute.DEFAULT, + this::deserializeAttribute + ); + } + + public CrownDepositAttribute deserializeAttribute(ConfigurationSection section) + { + GenericAttribute.Data genericAttributeData = GenericAttributeDataSerializer.deserialize(section); + DepositAttribute.Data depositAttributeData = DepositAttributeDataSerializer.deserialize(section, BigDecimal.class); + + return new CrownDepositAttribute(genericAttributeData, depositAttributeData); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/rule/DislikeDepositRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/DislikeDepositRuleSerializer.java new file mode 100644 index 00000000..844faf5c --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/DislikeDepositRuleSerializer.java @@ -0,0 +1,39 @@ +package com.eul4.rule.serializer.rule; + +import com.eul4.Main; +import com.eul4.StructureType; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.DepositAttribute; +import com.eul4.rule.attribute.DislikeDepositAttribute; +import com.eul4.rule.attribute.GenericAttribute; +import com.eul4.rule.serializer.data.DepositAttributeDataSerializer; +import com.eul4.rule.serializer.data.GenericAttributeDataSerializer; +import org.bukkit.configuration.ConfigurationSection; + +import java.io.FileNotFoundException; + +public class DislikeDepositRuleSerializer extends GenericRuleSerializer +{ + public DislikeDepositRuleSerializer(Main plugin) + { + super(plugin); + } + + public Rule load() throws FileNotFoundException + { + return deserializeRule + ( + loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.DISLIKE_DEPOSIT)), + DislikeDepositAttribute.DEFAULT, + this::deserializeAttribute + ); + } + + public DislikeDepositAttribute deserializeAttribute(ConfigurationSection section) + { + GenericAttribute.Data genericAttributeData = GenericAttributeDataSerializer.deserialize(section); + DepositAttribute.Data depositAttributeData = DepositAttributeDataSerializer.deserialize(section, Integer.class); + + return new DislikeDepositAttribute(genericAttributeData, depositAttributeData); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/rule/DislikeGeneratorRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/DislikeGeneratorRuleSerializer.java new file mode 100644 index 00000000..8fba21f5 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/DislikeGeneratorRuleSerializer.java @@ -0,0 +1,38 @@ +package com.eul4.rule.serializer.rule; + +import com.eul4.Main; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.DislikeGeneratorAttribute; +import com.eul4.rule.attribute.GeneratorAttribute; +import com.eul4.rule.attribute.GenericAttribute; +import com.eul4.rule.serializer.data.GeneratorAttributeDataSerializer; +import com.eul4.rule.serializer.data.GenericAttributeDataSerializer; +import org.bukkit.configuration.ConfigurationSection; + +import java.io.FileNotFoundException; + +public class DislikeGeneratorRuleSerializer extends GenericRuleSerializer +{ + public DislikeGeneratorRuleSerializer(Main plugin) + { + super(plugin); + } + + public Rule load() throws FileNotFoundException + { + return deserializeRule + ( + loadConfig(plugin.getDataFileManager().getDislikeGeneratorRuleFile()), + DislikeGeneratorAttribute.DEFAULT, + this::deserializeAttribute + ); + } + + public DislikeGeneratorAttribute deserializeAttribute(ConfigurationSection section) + { + GenericAttribute.Data genericAttributeData = GenericAttributeDataSerializer.deserialize(section); + GeneratorAttribute.Data generatorAttributeData = GeneratorAttributeDataSerializer.deserialize(section); + + return new DislikeGeneratorAttribute(genericAttributeData, generatorAttributeData); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/rule/GenericRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/GenericRuleSerializer.java new file mode 100644 index 00000000..ea2e7b51 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/GenericRuleSerializer.java @@ -0,0 +1,48 @@ +package com.eul4.rule.serializer.rule; + +import com.eul4.Main; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.GenericAttribute; +import lombok.RequiredArgsConstructor; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.function.Function; + +@RequiredArgsConstructor +public abstract class GenericRuleSerializer +{ + protected final Main plugin; + + public YamlConfiguration loadConfig(File file) throws FileNotFoundException + { + if(!file.exists() || file.length() == 0L) + { + throw new FileNotFoundException(file.getName() + " file not found."); + } + + return YamlConfiguration.loadConfiguration(file); + } + + public Rule deserializeRule + ( + YamlConfiguration config, + A defaultAttribute, + Function function + ) + { + Rule rule = new Rule<>(defaultAttribute); + + for(String key : config.getKeys(false)) + { + int level = Integer.parseInt(key); + ConfigurationSection section = config.getConfigurationSection(String.valueOf(level)); + + rule.setRule(level, function.apply(section)); + } + + return rule; + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/rule/LikeDepositRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/LikeDepositRuleSerializer.java new file mode 100644 index 00000000..f6b19695 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/LikeDepositRuleSerializer.java @@ -0,0 +1,39 @@ +package com.eul4.rule.serializer.rule; + +import com.eul4.Main; +import com.eul4.StructureType; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.DepositAttribute; +import com.eul4.rule.attribute.GenericAttribute; +import com.eul4.rule.attribute.LikeDepositAttribute; +import com.eul4.rule.serializer.data.DepositAttributeDataSerializer; +import com.eul4.rule.serializer.data.GenericAttributeDataSerializer; +import org.bukkit.configuration.ConfigurationSection; + +import java.io.FileNotFoundException; + +public class LikeDepositRuleSerializer extends GenericRuleSerializer +{ + public LikeDepositRuleSerializer(Main plugin) + { + super(plugin); + } + + public Rule load() throws FileNotFoundException + { + return deserializeRule + ( + loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.LIKE_DEPOSIT)), + LikeDepositAttribute.DEFAULT, + this::deserializeAttribute + ); + } + + public LikeDepositAttribute deserializeAttribute(ConfigurationSection section) + { + GenericAttribute.Data genericAttributeData = GenericAttributeDataSerializer.deserialize(section); + DepositAttribute.Data depositAttributeData = DepositAttributeDataSerializer.deserialize(section, Integer.class); + + return new LikeDepositAttribute(genericAttributeData, depositAttributeData); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/rule/LikeGeneratorRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/LikeGeneratorRuleSerializer.java new file mode 100644 index 00000000..88095f9b --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/LikeGeneratorRuleSerializer.java @@ -0,0 +1,38 @@ +package com.eul4.rule.serializer.rule; + +import com.eul4.Main; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.GeneratorAttribute; +import com.eul4.rule.attribute.GenericAttribute; +import com.eul4.rule.attribute.LikeGeneratorAttribute; +import com.eul4.rule.serializer.data.GeneratorAttributeDataSerializer; +import com.eul4.rule.serializer.data.GenericAttributeDataSerializer; +import org.bukkit.configuration.ConfigurationSection; + +import java.io.FileNotFoundException; + +public class LikeGeneratorRuleSerializer extends GenericRuleSerializer +{ + public LikeGeneratorRuleSerializer(Main plugin) + { + super(plugin); + } + + public Rule load() throws FileNotFoundException + { + return deserializeRule + ( + loadConfig(plugin.getDataFileManager().getLikeGeneratorRuleFile()), + LikeGeneratorAttribute.DEFAULT, + this::deserializeAttribute + ); + } + + private LikeGeneratorAttribute deserializeAttribute(ConfigurationSection section) + { + GenericAttribute.Data genericAttributeData = GenericAttributeDataSerializer.deserialize(section); + GeneratorAttribute.Data generatorAttributeData = GeneratorAttributeDataSerializer.deserialize(section); + + return new LikeGeneratorAttribute(genericAttributeData, generatorAttributeData); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/rule/TownHallRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/TownHallRuleSerializer.java new file mode 100644 index 00000000..528a12df --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/TownHallRuleSerializer.java @@ -0,0 +1,37 @@ +package com.eul4.rule.serializer.rule; + +import com.eul4.Main; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.GenericAttribute; +import com.eul4.rule.attribute.TownHallAttribute; +import com.eul4.rule.serializer.data.GenericAttributeDataSerializer; +import com.eul4.rule.serializer.data.TownHallAttributeDataSerializer; +import org.bukkit.configuration.ConfigurationSection; + +import java.io.FileNotFoundException; + +public class TownHallRuleSerializer extends GenericRuleSerializer +{ + public TownHallRuleSerializer(Main plugin) + { + super(plugin); + } + + public Rule load() throws FileNotFoundException + { + return deserializeRule + ( + loadConfig(plugin.getDataFileManager().getTownHallRuleFile()), + TownHallAttribute.DEFAULT, + this::deserializeAttribute + ); + } + + private TownHallAttribute deserializeAttribute(ConfigurationSection section) + { + GenericAttribute.Data genericAttributeData = GenericAttributeDataSerializer.deserialize(section); + TownHallAttribute.Data townHallAttributeData = TownHallAttributeDataSerializer.deserialize(section); + + return new TownHallAttribute(genericAttributeData, townHallAttributeData); + } +} diff --git a/plugin/src/main/java/com/eul4/rule/serializer/rule/TurretRuleSerializer.java b/plugin/src/main/java/com/eul4/rule/serializer/rule/TurretRuleSerializer.java new file mode 100644 index 00000000..0031f7b3 --- /dev/null +++ b/plugin/src/main/java/com/eul4/rule/serializer/rule/TurretRuleSerializer.java @@ -0,0 +1,38 @@ +package com.eul4.rule.serializer.rule; + +import com.eul4.Main; +import com.eul4.StructureType; +import com.eul4.rule.Rule; +import com.eul4.rule.attribute.GenericAttribute; +import com.eul4.rule.attribute.TurretAttribute; +import com.eul4.rule.serializer.data.GenericAttributeDataSerializer; +import com.eul4.rule.serializer.data.TurretAttributeDataSerializer; +import org.bukkit.configuration.ConfigurationSection; + +import java.io.FileNotFoundException; + +public class TurretRuleSerializer extends GenericRuleSerializer +{ + public TurretRuleSerializer(Main plugin) + { + super(plugin); + } + + public Rule load() throws FileNotFoundException + { + return deserializeRule + ( + loadConfig(plugin.getDataFileManager().getRuleFile(StructureType.TURRET)), + TurretAttribute.DEFAULT, + this::deserializeAttribute + ); + } + + public TurretAttribute deserializeAttribute(ConfigurationSection section) + { + GenericAttribute.Data genericAttributeData = GenericAttributeDataSerializer.deserialize(section); + TurretAttribute.Data turretAttributeData = TurretAttributeDataSerializer.deserialize(section); + + return new TurretAttribute(genericAttributeData, turretAttributeData); + } +} diff --git a/plugin/src/main/java/com/eul4/scoreboard/AnalyzerScoreboard.java b/plugin/src/main/java/com/eul4/scoreboard/AnalyzerScoreboard.java index 905b6836..ad1b6b79 100644 --- a/plugin/src/main/java/com/eul4/scoreboard/AnalyzerScoreboard.java +++ b/plugin/src/main/java/com/eul4/scoreboard/AnalyzerScoreboard.java @@ -5,11 +5,14 @@ public interface AnalyzerScoreboard extends CommonScoreboard { void updateTitle(); + void updatePlayerStatusTeam(); void updateTownHallLevelTeam(); void updateLikesTeam(); void updateDislikesTeam(); + void updateCrownsTeam(); void updateHardnessTeam(); + void updateFooterTeam(); default void updateLikesAndDislikesTeams() { @@ -20,10 +23,13 @@ default void updateLikesAndDislikesTeams() default void updateAll() { updateTitle(); + updatePlayerStatusTeam(); updateTownHallLevelTeam(); updateLikesTeam(); updateDislikesTeam(); + updateCrownsTeam(); updateHardnessTeam(); + updateFooterTeam(); } } diff --git a/plugin/src/main/java/com/eul4/scoreboard/CraftAnalyzerScoreboard.java b/plugin/src/main/java/com/eul4/scoreboard/CraftAnalyzerScoreboard.java index 462fa984..a11bb0ba 100644 --- a/plugin/src/main/java/com/eul4/scoreboard/CraftAnalyzerScoreboard.java +++ b/plugin/src/main/java/com/eul4/scoreboard/CraftAnalyzerScoreboard.java @@ -1,9 +1,10 @@ package com.eul4.scoreboard; import com.eul4.common.scoreboard.CraftCommonScoreboard; -import com.eul4.model.player.RaidAnalyzer; +import com.eul4.model.player.spiritual.RaidAnalyzer; import com.eul4.model.town.Town; import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.scoreboard.Criteria; import org.bukkit.scoreboard.DisplaySlot; @@ -22,6 +23,7 @@ public class CraftAnalyzerScoreboard extends CraftCommonScoreboard implements An private final Team townHallLevelTeam; private final Team likesTeam; private final Team dislikesTeam; + private final Team crownsTeam; private final Team hardnessTeam; private final Team footerTeam; @@ -40,6 +42,7 @@ public CraftAnalyzerScoreboard(RaidAnalyzer raidAnalyzer) townHallLevelTeam = scoreboard.registerNewTeam("townHallLevelTeam"); likesTeam = scoreboard.registerNewTeam("likesTeam"); dislikesTeam = scoreboard.registerNewTeam("dislikesTeam"); + crownsTeam = scoreboard.registerNewTeam("crownsTeam"); hardnessTeam = scoreboard.registerNewTeam("hardnessTeam"); footerTeam = scoreboard.registerNewTeam("footerTeam"); } @@ -49,29 +52,32 @@ public void registerScores() { registered = true; - String playerStatusEntry = PLAYER_STATUS_ENTRY.translateLegacy(raidAnalyzer); - String townHallLevelEntry = TOWN_HALL_LEVEL_ENTRY.translateLegacy(raidAnalyzer); - String likesEntry = LIKES_ENTRY.translateLegacy(raidAnalyzer); - String dislikesEntry = DISLIKES_ENTRY.translateLegacy(raidAnalyzer); - String hardnessEntry = HARDNESS_ENTRY.translateLegacy(raidAnalyzer); - String footerEntry = FOOTER_ENTRY.translateLegacy(raidAnalyzer); + String playerStatusEntry = "§0"; + String townHallLevelEntry = "§1"; + String likesEntry = "§2"; + String dislikesEntry = "§3"; + String crownsEntry = "§4"; + String hardnessEntry = "§5"; + String footerEntry = "§6"; playerStatusTeam.addEntry(playerStatusEntry); townHallLevelTeam.addEntry(townHallLevelEntry); likesTeam.addEntry(likesEntry); dislikesTeam.addEntry(dislikesEntry); + crownsTeam.addEntry(crownsEntry); hardnessTeam.addEntry(hardnessEntry); footerTeam.addEntry(footerEntry); updateAll(); - objective.getScore("§0 ").setScore(10); - objective.getScore(playerStatusEntry).setScore(9); - objective.getScore("§1 ").setScore(8); - objective.getScore(townHallLevelEntry).setScore(7); - objective.getScore("§2 ").setScore(6); - objective.getScore(likesEntry).setScore(5); - objective.getScore(dislikesEntry).setScore(4); + objective.getScore("§0 ").setScore(11); + objective.getScore(playerStatusEntry).setScore(10); + objective.getScore("§1 ").setScore(9); + objective.getScore(townHallLevelEntry).setScore(8); + objective.getScore("§2 ").setScore(7); + objective.getScore(likesEntry).setScore(6); + objective.getScore(dislikesEntry).setScore(5); + objective.getScore(crownsEntry).setScore(4); objective.getScore("§3 ").setScore(3); objective.getScore(hardnessEntry).setScore(2); objective.getScore("§4 ").setScore(1); @@ -81,7 +87,10 @@ public void registerScores() @Override public void updateTitle() { - objective.displayName(TITLE.translate(raidAnalyzer, raidAnalyzer.getAnalyzingTown())); + objective.displayName(TITLE.translate(raidAnalyzer, raidAnalyzer + .findAnalyzingTown() + .map(Town::getOwner) + .orElse(null))); } @Override @@ -89,8 +98,8 @@ public void updatePlayerStatusTeam() { playerStatusTeam.prefix(PLAYER_STATUS_PREFIX.translate(raidAnalyzer, raidAnalyzer .findAnalyzingTown() - .map(Town::getOwnerDisplayName) - .orElse(Component.text("???")))); + .map(Town::getOwner) + .orElse(null))); playerStatusTeam.suffix(PLAYER_STATUS_SUFFIX.translate(raidAnalyzer, raidAnalyzer .findAnalyzingTown() @@ -102,6 +111,7 @@ public void updatePlayerStatusTeam() @Override public void updateTownHallLevelTeam() { + townHallLevelTeam.prefix(TOWN_HALL_LEVEL_PREFIX.translate(raidAnalyzer)); townHallLevelTeam.suffix(TOWN_HALL_LEVEL_SUFFIX.translate(raidAnalyzer, raidAnalyzer .findAnalyzingTown() .map(Town::getBuiltLevel) @@ -111,18 +121,35 @@ public void updateTownHallLevelTeam() @Override public void updateLikesTeam() { + likesTeam.prefix(LIKES_PREFIX.translate(raidAnalyzer)); likesTeam.suffix(LIKES_SUFFIX.translate(raidAnalyzer, raidAnalyzer.getAnalyzingTown())); } @Override public void updateDislikesTeam() { + dislikesTeam.prefix(DISLIKES_PREFIX.translate(raidAnalyzer)); dislikesTeam.suffix(DISLIKES_SUFFIX.translate(raidAnalyzer, raidAnalyzer.getAnalyzingTown())); } + @Override + public void updateCrownsTeam() + { + crownsTeam.prefix(CROWNS_PREFIX.translate(raidAnalyzer)); + crownsTeam.suffix(CROWNS_SUFFIX.translate(raidAnalyzer, raidAnalyzer.getAnalyzingTown())); + } + @Override public void updateHardnessTeam() { + hardnessTeam.prefix(HARDNESS_PREFIX.translate(raidAnalyzer)); hardnessTeam.suffix(HARDNESS_SUFFIX.translate(raidAnalyzer, raidAnalyzer.getAnalyzingTown())); } + + @Override + public void updateFooterTeam() + { + footerTeam.prefix(FOOTER_PREFIX.translate(raidAnalyzer)); + footerTeam.suffix(FOOTER_SUFFIX.translate(raidAnalyzer)); + } } diff --git a/plugin/src/main/java/com/eul4/scoreboard/CraftTownScoreboard.java b/plugin/src/main/java/com/eul4/scoreboard/CraftTownScoreboard.java index 9093b71a..1147d988 100644 --- a/plugin/src/main/java/com/eul4/scoreboard/CraftTownScoreboard.java +++ b/plugin/src/main/java/com/eul4/scoreboard/CraftTownScoreboard.java @@ -2,13 +2,13 @@ import com.eul4.common.scoreboard.CraftCommonScoreboard; import com.eul4.model.player.TownScoreboardPlayer; -import net.kyori.adventure.text.Component; -import org.bukkit.scoreboard.Criteria; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Team; import static com.eul4.i18n.TownScoreboardMessage.*; +import static net.kyori.adventure.text.Component.text; +import static org.bukkit.scoreboard.Criteria.DUMMY; public class CraftTownScoreboard extends CraftCommonScoreboard implements TownScoreboard { @@ -16,9 +16,12 @@ public class CraftTownScoreboard extends CraftCommonScoreboard implements TownSc private final Team likesTeam; private final Team dislikesTeam; + private final Team crownsTeam; private final Team hardnessTeam; private final Team footerTeam; + private Objective objective; + public CraftTownScoreboard(TownScoreboardPlayer townScoreboardPlayer) { super(townScoreboardPlayer, townScoreboardPlayer.getPlugin().getServer().getScoreboardManager().getNewScoreboard()); @@ -27,56 +30,96 @@ public CraftTownScoreboard(TownScoreboardPlayer townScoreboardPlayer) likesTeam = scoreboard.registerNewTeam("likesTeam"); dislikesTeam = scoreboard.registerNewTeam("dislikesTeam"); + crownsTeam = scoreboard.registerNewTeam("crownsTeam"); hardnessTeam = scoreboard.registerNewTeam("hardnessTeam"); footerTeam = scoreboard.registerNewTeam("footerTeam"); } public void registerScores() { - String likesEntry = LIKES_ENTRY.translateLegacy(townScoreboardPlayer); - String dislikesEntry = DISLIKES_ENTRY.translateLegacy(townScoreboardPlayer); - String hardnessEntry = HARDNESS_ENTRY.translateLegacy(townScoreboardPlayer); - String footerEntry = FOOTER_ENTRY.translateLegacy(townScoreboardPlayer); + final String entryDisambiguation = "§r§r"; + + final String likesEntry = "§0" + entryDisambiguation; + final String dislikesEntry = "§1" + entryDisambiguation; + final String crownsEntry = "§2" + entryDisambiguation; + final String hardnessEntry = "§3" + entryDisambiguation; + final String footerEntry = "§4" + entryDisambiguation; likesTeam.addEntry(likesEntry); dislikesTeam.addEntry(dislikesEntry); + crownsTeam.addEntry(crownsEntry); hardnessTeam.addEntry(hardnessEntry); footerTeam.addEntry(footerEntry); - updateAll(); + Objective objective = getOrRegisterObjective(); - Objective objective = scoreboard.registerNewObjective("name", Criteria.DUMMY, Component.text("text")); - objective.setDisplaySlot(DisplaySlot.SIDEBAR); - - objective.displayName(TITLE.translate(townScoreboardPlayer)); + updateAll(); - objective.getScore("§0 ").setScore(6); - objective.getScore(likesEntry).setScore(5); - objective.getScore(dislikesEntry).setScore(4); + objective.getScore("§0 ").setScore(7); + objective.getScore(likesEntry).setScore(6); + objective.getScore(dislikesEntry).setScore(5); + objective.getScore(crownsEntry).setScore(4); objective.getScore("§1 ").setScore(3); objective.getScore(hardnessEntry).setScore(2); objective.getScore("§2 ").setScore(1); objective.getScore(footerEntry).setScore(0); } + private Objective getOrRegisterObjective() + { + return objective = objective == null + ? registerObjective() + : objective; + } + + private Objective registerObjective() + { + Objective objective = scoreboard.registerNewObjective("name", DUMMY, text("text")); + objective.setDisplaySlot(DisplaySlot.SIDEBAR); + return objective; + } + + @Override + public void updateTitle() + { + getOrRegisterObjective().displayName(TITLE.translate(townScoreboardPlayer)); + } + @Override public void updateLikesTeam() { + likesTeam.prefix(LIKES_PREFIX.translate(townScoreboardPlayer)); likesTeam.suffix(LIKES_SUFFIX.translate(townScoreboardPlayer, townScoreboardPlayer.getTown())); } @Override public void updateDislikesTeam() { + dislikesTeam.prefix(DISLIKES_PREFIX.translate(townScoreboardPlayer)); dislikesTeam.suffix(DISLIKES_SUFFIX.translate(townScoreboardPlayer, townScoreboardPlayer.getTown())); } + @Override + public void updateCrownsTeam() + { + crownsTeam.prefix(CROWNS_PREFIX.translate(townScoreboardPlayer)); + crownsTeam.suffix(CROWNS_SUFFIX.translate(townScoreboardPlayer, townScoreboardPlayer.getTown())); + } + @Override public void updateHardnessTeam() { + hardnessTeam.prefix(HARDNESS_PREFIX.translate(townScoreboardPlayer)); hardnessTeam.suffix(HARDNESS_SUFFIX.translate(townScoreboardPlayer, townScoreboardPlayer.getTown())); } + @Override + public void updateFooterTeam() + { + footerTeam.prefix(FOOTER_PREFIX.translate(townScoreboardPlayer)); + footerTeam.suffix(FOOTER_SUFFIX.translate(townScoreboardPlayer)); + } + @Override public TownScoreboardPlayer getScoreboardPlayer() { diff --git a/plugin/src/main/java/com/eul4/scoreboard/TownScoreboard.java b/plugin/src/main/java/com/eul4/scoreboard/TownScoreboard.java index b383fa65..7cf8f82b 100644 --- a/plugin/src/main/java/com/eul4/scoreboard/TownScoreboard.java +++ b/plugin/src/main/java/com/eul4/scoreboard/TownScoreboard.java @@ -7,9 +7,12 @@ public interface TownScoreboard extends CommonScoreboard { void registerScores(); + void updateTitle(); void updateLikesTeam(); void updateDislikesTeam(); + void updateCrownsTeam(); void updateHardnessTeam(); + void updateFooterTeam(); default void updateLikesAndDislikesTeams() { @@ -19,9 +22,13 @@ default void updateLikesAndDislikesTeams() default void updateAll() { + updateTitle(); + updateLikesTeam(); updateDislikesTeam(); + updateCrownsTeam(); updateHardnessTeam(); + updateFooterTeam(); } @Override diff --git a/plugin/src/main/java/com/eul4/service/DataFileManager.java b/plugin/src/main/java/com/eul4/service/DataFileManager.java index 7139fde2..1bffaf3e 100644 --- a/plugin/src/main/java/com/eul4/service/DataFileManager.java +++ b/plugin/src/main/java/com/eul4/service/DataFileManager.java @@ -36,6 +36,26 @@ public File createTownsFileIfNotExists() throws IOException return createFileIfNotExists(getTownsFile()); } + public File getRawMaterialMapFile() + { + return new File(plugin.getDataFolder(), "raw_material_map.dat"); + } + + public File createCrownInfoFileIfNotExists() throws IOException + { + return createFileIfNotExists(getCrownInfoFile()); + } + + public File getCrownInfoFile() + { + return new File(plugin.getDataFolder(), "crown_info.dat"); + } + + public File createRawMaterialMapFileIfNotExists() throws IOException + { + return createFileIfNotExists(getRawMaterialMapFile()); + } + public File getLikeGeneratorRuleFile() { return new File(plugin.getDataFolder(), "like_generator_rule.yml"); @@ -73,7 +93,7 @@ public File[] getTownSchematicFiles() public File getTownSchematicFile(Town town) { - return getTownSchematicFile(town.getOwnerUUID()); + return getTownSchematicFile(town.getOwnerUniqueId()); } public File getTownSchematicFile(UUID uuid) @@ -83,7 +103,7 @@ public File getTownSchematicFile(UUID uuid) public File createTownSchematicFile(Town town) throws IOException { - return createTownSchematicFile(town.getOwnerUUID()); + return createTownSchematicFile(town.getOwnerUniqueId()); } public File createTownSchematicFile(UUID uuid) throws IOException diff --git a/plugin/src/main/java/com/eul4/service/MarketDataManager.java b/plugin/src/main/java/com/eul4/service/MarketDataManager.java new file mode 100644 index 00000000..f07fa9dc --- /dev/null +++ b/plugin/src/main/java/com/eul4/service/MarketDataManager.java @@ -0,0 +1,213 @@ +package com.eul4.service; + +import com.eul4.Main; +import com.eul4.economy.ItemStackTransaction; +import com.eul4.economy.Transaction; +import com.eul4.enums.Rarity; +import com.eul4.exception.InvalidCryptoInfoException; +import com.eul4.exception.MaterialNotForSaleException; +import com.eul4.exception.OverCapacityException; +import com.eul4.holder.CapacitatedCrownHolder; +import com.eul4.model.player.PluginPlayer; +import com.eul4.model.town.Town; +import com.eul4.util.RarityUtil; +import com.eul4.wrapper.*; +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static org.bukkit.Material.*; + +public class MarketDataManager +{ + private final Main plugin; + + private final Map derivates = new HashMap<>(); + + private boolean derivativeRegistered; + + static + { +// new RawMaterial() +// RAW_MATERIALS.put(Material.OAK_LOG, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.SPRUCE_LOG, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.BIRCH_LOG, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.JUNGLE_LOG, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.ACACIA_LOG, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.DARK_OAK_LOG, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.MANGROVE_LOG, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.CRIMSON_STEM, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.WARPED_STEM, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// +// RAW_MATERIALS.put(Material.STONE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.GRANITE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.ANDESITE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.DIORITE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.CLAY_BALL, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.SAND, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.RED_SAND, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.PRISMARINE_SHARD, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.PRISMARINE_CRYSTALS, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.NETHERRACK, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.BASALT, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.BLACKSTONE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.GILDED_BLACKSTONE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.END_STONE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.CHORUS_FRUIT, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// +// RAW_MATERIALS.put(Material.COAL, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.IRON_INGOT, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.GOLD_INGOT, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.REDSTONE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.EMERALD, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.LAPIS_LAZULI, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.DIAMOND, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.ANCIENT_DEBRIS, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.QUARTZ, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.AMETHYST_SHARD, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.COPPER_INGOT, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// +// RAW_MATERIALS.put(Material.TERRACOTTA, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// +// RAW_MATERIALS.put(Material.DIRT, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.GRASS_BLOCK, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.MYCELIUM, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.ICE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// RAW_MATERIALS.put(Material.CALCITE, new CryptoInfo(BigDecimal.valueOf(1_000_000.0D), BigDecimal.valueOf(1_000_000.0D))); +// +// DERIVATIVES.put(Material.COBBLESTONE, Set.of(new MaterialMultiplier(Material.STONE, 0.5F))); +// DERIVATIVES.put(Material.FURNACE, Set.of(new MaterialMultiplier(Material.STONE, 0.5F * 8.0F))); + } + + public MarketDataManager(final Main plugin) + { + this.plugin = plugin; + } + + public void registerDerivatives() throws Exception + { + if(derivativeRegistered) + { + throw new Exception("Derivatives already registered"); + } + + RawMaterialMap rawMaterialMap = plugin.getRawMaterialMapFiler().getRawMaterialMap(); + + RawMaterial rawOakLog = rawMaterialMap.get(Material.OAK_LOG); + RawMaterial rawEnderPearl = rawMaterialMap.get(Material.ENDER_PEARL); + RawMaterial rawBlazePowder = rawMaterialMap.get(Material.BLAZE_POWDER); + + rawEnderPearl.getCryptoInfo().setMarketCap(new BigDecimal("1000000")); + rawEnderPearl.getCryptoInfo().setCirculatingSupply(new BigDecimal("10000")); + + rawBlazePowder.getCryptoInfo().setMarketCap(new BigDecimal("5000")); + rawBlazePowder.getCryptoInfo().setCirculatingSupply(new BigDecimal("5000")); + + DerivativeMaterial derivativeOakPlanks = registerDerivative(OAK_PLANKS, + rawOakLog.withMultiplier(1.0D / 4.0D)); + DerivativeMaterial derivativeChest = registerDerivative(CHEST, + derivativeOakPlanks.withMultiplier(8.0D)); + + DerivativeMaterial derivativeEnderEye = registerDerivative(ENDER_EYE, + rawEnderPearl.withMultiplier(1.0D), + rawBlazePowder.withMultiplier(1.0D)); + + derivativeRegistered = true; + } + + private DerivativeMaterial registerDerivative(Material material, EconomicMaterialMultiplier... economicMaterialMultipliers) + { + return registerDerivative(new DerivativeMaterial(material, List.of(economicMaterialMultipliers))); + } + + private DerivativeMaterial registerDerivative(DerivativeMaterial derivativeMaterial) + { + derivates.put(derivativeMaterial.getMaterial(), derivativeMaterial); + return derivativeMaterial; + } + + public BigDecimal calculatePrice(Material material) throws MaterialNotForSaleException, InvalidCryptoInfoException + { + if(derivates.containsKey(material)) + { + return derivates.get(material).calculatePrice(); + } + + if(getRawMaterialMap().containsKey(material)) + { + return getRawMaterialMap().get(material).getCryptoInfo().calculatePrice(); + } + + throw new MaterialNotForSaleException(); + } + + public ItemStackTransaction createItemStackTransaction(PluginPlayer pluginPlayer, int slot) + throws OverCapacityException, InvalidCryptoInfoException, MaterialNotForSaleException + { + Town town = pluginPlayer.getTown(); + + final Inventory inventory = pluginPlayer.getPlayer().getInventory(); + final ItemStack itemStack = Optional.ofNullable(inventory.getItem(slot)).orElse(ItemStack.empty()); + + ItemStackTradePreview itemStackTradePreview = createTradePreviews( + town.calculateRemainingCrownCapacity(), + itemStack); + List holders = pluginPlayer.getTown().getCapacitatedCrownHolders(); + + int amountToConsume = itemStackTradePreview.getAmountToConsume(); + + Transaction transaction = plugin.getTransactionManager() + .createTransaction(itemStackTradePreview.getPreviews(), holders); + + return new ItemStackTransaction<>(transaction, inventory, slot, amountToConsume); + } + + private ItemStackTradePreview createTradePreviews + ( + BigDecimal holderRemainingCapacity, + ItemStack itemStack + ) + throws InvalidCryptoInfoException, MaterialNotForSaleException + { + Material material = itemStack.getType(); + Rarity rarity = RarityUtil.getRarity(itemStack); + BigDecimal rarityMultiplier = BigDecimal.valueOf(rarity.getScalarMultiplier(10)); + + if(derivates.containsKey(material)) + { + return derivates.get(material) + .createTradePreviews + ( + holderRemainingCapacity, + itemStack.getAmount(), + rarityMultiplier + ); + } + else if(getRawMaterialMap().containsKey(material)) + { + return getRawMaterialMap() + .get(material) + .createTradePreview + ( + holderRemainingCapacity, + itemStack.getAmount(), + rarityMultiplier + ); + } + else + { + throw new MaterialNotForSaleException(); + } + } + + public RawMaterialMap getRawMaterialMap() + { + return plugin.getRawMaterialMapFiler().getRawMaterialMap(); + } +} diff --git a/plugin/src/main/java/com/eul4/service/TownManager.java b/plugin/src/main/java/com/eul4/service/TownManager.java index d82b20ea..763eacac 100644 --- a/plugin/src/main/java/com/eul4/service/TownManager.java +++ b/plugin/src/main/java/com/eul4/service/TownManager.java @@ -29,13 +29,11 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.stream.Collectors; @RequiredArgsConstructor public class TownManager @@ -45,6 +43,8 @@ public class TownManager @Getter private TownMap towns; + private transient Map townsByTownUniqueId = new HashMap<>(); + private final Set waitingCreation = new HashSet<>(); @Getter @@ -58,6 +58,9 @@ public void loadTowns() throws Exception } this.towns = plugin.getTownsFiler().loadTownsFromDisk(); + this.townsByTownUniqueId = this.towns.values() + .stream() + .collect(Collectors.toMap(Town::getTownUniqueId, town -> town)); this.towns.values().forEach(Town::load); loaded = true; @@ -138,6 +141,7 @@ private synchronized Town createNewTown(UUID uuid) throws CannotConstructExcepti Town town = new CraftTown(plugin.getServer().getOfflinePlayer(uuid), location.getBlock(), plugin); + townsByTownUniqueId.put(town.getTownUniqueId(), town); towns.put(uuid, town); return town; } @@ -200,4 +204,14 @@ public Optional findTown(UUID townUUID) { return Optional.ofNullable(getTown(townUUID)); } + + public Optional findTownByTownUniqueId(UUID townUniqueId) + { + return Optional.ofNullable(getTownByTownUniqueId(townUniqueId)); + } + + public Town getTownByTownUniqueId(UUID townUniqueId) + { + return townsByTownUniqueId.get(townUniqueId); + } } diff --git a/plugin/src/main/java/com/eul4/service/TransactionManager.java b/plugin/src/main/java/com/eul4/service/TransactionManager.java new file mode 100644 index 00000000..f8d58798 --- /dev/null +++ b/plugin/src/main/java/com/eul4/service/TransactionManager.java @@ -0,0 +1,145 @@ +package com.eul4.service; + +import com.eul4.Main; +import com.eul4.economy.Transaction; +import com.eul4.economy.Transfer; +import com.eul4.exception.NegativeBalanceException; +import com.eul4.exception.OverCapacityException; +import com.eul4.holder.CapacitatedHolder; +import com.eul4.holder.Holder; +import com.eul4.model.town.Town; +import com.eul4.wrapper.TradePreview; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.Nullable; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +@RequiredArgsConstructor +public class TransactionManager +{ + private final Main plugin; + + public + < + H1 extends Holder + > + Transaction createTransaction + ( + H1 holderFrom, + Town townTo, + BigDecimal amount + ) + throws OverCapacityException + { + return this.createTransaction + ( + holderFrom, + townTo.getCapacitatedCrownHolders(), + amount + ); + } + + public + < + N extends Number & Comparable, + H1 extends Holder, + H2 extends Holder + > + Transaction createTransaction + ( + H1 holderFrom, + List

holdersTo, + N amount + ) + throws OverCapacityException + { + return createTransaction(new TradePreview<>(holderFrom, amount), holdersTo); + } + + public Transaction createTransaction(Town townFrom, Town townTo, BigDecimal amount) + throws OverCapacityException, NegativeBalanceException + { + return createTransaction + ( + townFrom.createTradePreviewSubtract(amount), + townTo.getCapacitatedCrownHolders() + ); + } + + public + < + N extends Number & Comparable, + H1 extends Holder, + H2 extends Holder, + TP extends TradePreview + > + Transaction createTransaction(TP tradePreview, List

holdersTo) + throws OverCapacityException + { + return createTransaction(Collections.singletonList(tradePreview), holdersTo); + } + + public + < + N extends Number & Comparable, + H1 extends Holder, + H2 extends Holder, + TP extends TradePreview + > + Transaction createTransaction(List tradePreviews, List

holdersTo) + throws OverCapacityException + { + List> transferList = new ArrayList<>(); + Iterator

holderIterator = holdersTo.iterator(); + + if(!holderIterator.hasNext()) + { + throw new OverCapacityException(); + } + + H2 holder = holderIterator.next(); + N simulatedRemainingCapacity = getRemainingCapacity(holder); + + for(TradePreview tradePreview : tradePreviews) + { + N preview = tradePreview.getPreview(); + + while(preview.compareTo(holder.getZeroSample()) > 0) + { + while(simulatedRemainingCapacity != null + && simulatedRemainingCapacity.compareTo(holder.getZeroSample()) <= 0) + { + if(!holderIterator.hasNext()) + { + throw new OverCapacityException(); + } + + holder = holderIterator.next(); + simulatedRemainingCapacity = getRemainingCapacity(holder); + } + + N min = simulatedRemainingCapacity != null && simulatedRemainingCapacity.compareTo(preview) < 0 + ? simulatedRemainingCapacity + : preview; + + preview = holder.subtractSample(preview, min); + simulatedRemainingCapacity = holder.subtractSample(simulatedRemainingCapacity, min); + + transferList.add(new Transfer<>(tradePreview.getHolder(), holder, min)); + } + } + + return new Transaction(transferList); + } + + private > @Nullable N getRemainingCapacity(Holder holder) + { + return holder instanceof CapacitatedHolder capacitatedHolder + ? (N) capacitatedHolder.getRemainingCapacity() + : null; + } +} diff --git a/plugin/src/main/java/com/eul4/service/TycoonManager.java b/plugin/src/main/java/com/eul4/service/TycoonManager.java new file mode 100644 index 00000000..32373104 --- /dev/null +++ b/plugin/src/main/java/com/eul4/service/TycoonManager.java @@ -0,0 +1,68 @@ +package com.eul4.service; + +import com.eul4.Main; +import com.eul4.common.wrapper.Pitch; +import com.eul4.model.town.Town; +import com.eul4.wrapper.Tag; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.Sound; + +import java.math.BigDecimal; + +import static com.eul4.i18n.PluginRichMessage.BROADCAST_NEW_TYCOON_$PLAYER; + +@RequiredArgsConstructor +public class TycoonManager +{ + private final Main plugin; + + @Getter + private Town tycoonTown; + + public void updateTycoonAsync() + { + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, this::updateTycoon); + } + + public synchronized void updateTycoon() + { + Town tycoonTown = null; + BigDecimal highestBalance = BigDecimal.ZERO; + + for(Town town : plugin.getTownManager().getTowns().values()) + { + final BigDecimal balance = town.getCalculatedCrownBalance(); + + if(balance.compareTo(highestBalance) >= 0) + { + tycoonTown = town; + highestBalance = balance; + } + } + + if(this.tycoonTown != null & this.tycoonTown != (this.tycoonTown = tycoonTown)) + { + plugin.getMessageableService() + .broadcastMessage + ( + BROADCAST_NEW_TYCOON_$PLAYER.withArgs(this.tycoonTown.getOwner()), + player -> player.playSound + ( + player.getLocation(), + Sound.ENTITY_LIGHTNING_BOLT_THUNDER, + 1.0F, + Pitch.A1 + ) + ); + + this.tycoonTown.findPluginPlayer().ifPresent(pluginPlayer -> + { + if(pluginPlayer.getBestTag() == Tag.TYCOON) + { + pluginPlayer.setTag(Tag.TYCOON); + } + }); + } + } +} diff --git a/plugin/src/main/java/com/eul4/task/RarityBossBarTask.java b/plugin/src/main/java/com/eul4/task/RarityBossBarTask.java index 30bf9d19..1e683ed5 100644 --- a/plugin/src/main/java/com/eul4/task/RarityBossBarTask.java +++ b/plugin/src/main/java/com/eul4/task/RarityBossBarTask.java @@ -351,7 +351,7 @@ protected boolean isValid() if(townBlock != null) { - return townBlock.getTown().getOwnerUUID().equals(pluginPlayer.getUniqueId()) + return townBlock.getTown().getOwnerUniqueId().equals(pluginPlayer.getUniqueId()) && townBlock.canBuild(); } diff --git a/plugin/src/main/java/com/eul4/task/SpawnProtectionTask.java b/plugin/src/main/java/com/eul4/task/SpawnProtectionTask.java index efd26f09..4bbc8778 100644 --- a/plugin/src/main/java/com/eul4/task/SpawnProtectionTask.java +++ b/plugin/src/main/java/com/eul4/task/SpawnProtectionTask.java @@ -2,8 +2,7 @@ import com.eul4.Main; import com.eul4.common.model.player.CommonPlayer; -import com.eul4.model.player.SpawnPlayer; -import com.eul4.world.RaidWorld; +import com.eul4.model.player.physical.SpawnPlayer; import com.eul4.world.SpawnProtectedLevel; import lombok.RequiredArgsConstructor; import org.bukkit.scheduler.BukkitRunnable; diff --git a/plugin/src/main/java/com/eul4/type/player/PhysicalPlayerType.java b/plugin/src/main/java/com/eul4/type/player/PhysicalPlayerType.java index ba6d798c..6b0107ba 100644 --- a/plugin/src/main/java/com/eul4/type/player/PhysicalPlayerType.java +++ b/plugin/src/main/java/com/eul4/type/player/PhysicalPlayerType.java @@ -5,6 +5,7 @@ import com.eul4.externalizer.writer.*; import com.eul4.model.craft.player.*; import com.eul4.model.player.*; +import com.eul4.model.player.physical.*; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/type/player/PluginExternalizerType.java b/plugin/src/main/java/com/eul4/type/player/PluginExternalizerType.java index 3b7914d1..6591000a 100644 --- a/plugin/src/main/java/com/eul4/type/player/PluginExternalizerType.java +++ b/plugin/src/main/java/com/eul4/type/player/PluginExternalizerType.java @@ -21,7 +21,11 @@ public enum PluginExternalizerType implements ExternalizerType BLOCK_DATA(BlockDataReader::new, BlockDataReader.class, BlockDataWriter::new, BlockDataWriter.class), BROADCAST_HASH_SET(BroadcastHashSetReader::new, BroadcastHashSetReader.class, BroadcastHashSetWriter::new, BroadcastHashSetWriter.class), CANNON(CannonReader::new, CannonReader.class, CannonWriter::new, CannonWriter.class), + CAPACITATED_CROWN_HOLDER(CapacitatedCrownHolderReader::new, CapacitatedCrownHolderReader.class, CapacitatedCrownHolderWriter::new, CapacitatedCrownHolderWriter.class), CHECKPOINT_STEP_ENUM(CheckpointStepEnumReader::new, CheckpointStepEnumReader.class, CheckpointStepEnumWriter::new, CheckpointStepEnumWriter.class), + CROWN_DEPOSIT(CrownDepositReader::new, CrownDepositReader.class, CrownDepositWriter::new, CrownDepositWriter.class), + CROWN_INFO(CrownInfoReader::new, CrownInfoReader.class, CrownInfoWriter::new, CrownInfoWriter.class), + CRYPTO_INFO(CryptoInfoReader::new, CryptoInfoReader.class, CryptoInfoWriter::new, CryptoInfoWriter.class), DEFENDER(DefenderReader::new, DefenderReader.class, DefenderWriter::new, DefenderWriter.class), DEFENDER_SPECTATOR(DefenderSpectatorReader::new, DefenderSpectatorReader.class, DefenderSpectatorWriter::new, DefenderSpectatorWriter.class), DISLIKE_DEPOSIT(DislikeDepositReader::new, DislikeDepositReader.class, DislikeDepositWriter::new, DislikeDepositWriter.class), @@ -36,6 +40,8 @@ public enum PluginExternalizerType implements ExternalizerType POINT_4_BIT(Point4BitReader::new, Point4BitReader.class, Point4BitWriter::new, Point4BitWriter.class), RAID_ANALYZER(RaidAnalyzerReader::new, RaidAnalyzerReader.class, RaidAnalyzerWriter::new, RaidAnalyzerWriter.class), RAID_SPECTATOR(RaidSpectatorReader::new, RaidSpectatorReader.class, RaidSpectatorWriter::new, RaidSpectatorWriter.class), + RAW_MATERIAL(RawMaterialReader::new, RawMaterialReader.class, RawMaterialWriter::new, RawMaterialWriter.class), + RAW_MATERIAL_MAP(RawMaterialMapReader::new, RawMaterialMapReader.class, RawMaterialMapWriter::new, RawMaterialMapWriter.class), SHORT_COORDINATE_BLOCK_CHUNK(ShortCoordinateBlockChunkReader::new, ShortCoordinateBlockChunkReader.class, ShortCoordinateBlockChunkWriter::new, ShortCoordinateBlockChunkWriter.class), SPAWN_PLAYER(SpawnPlayerReader::new, SpawnPlayerReader.class, SpawnPlayerWriter::new, SpawnPlayerWriter.class), STABILITY_FORMULA(StabilityFormularReader::new, StabilityFormularReader.class, StabilityFormulaWriter::new, StabilityFormulaWriter.class), @@ -54,6 +60,7 @@ public enum PluginExternalizerType implements ExternalizerType TURRET(TurretReader::new, TurretReader.class, TurretWriter::new, TurretWriter.class), TUTORIAL_TOWN_PLAYER_DATA(TutorialTownPlayerDataReader::new, TutorialTownPlayerDataReader.class, TutorialTownPlayerDataWriter::new, TutorialTownPlayerDataWriter.class), TUTORIAL_TOWN_PLAYER(TutorialTownPlayerReader::new, TutorialTownPlayerReader.class, TutorialTownPlayerWriter::new, TutorialTownPlayerWriter.class), + UNLIMITED_CROWN_HOLDER(UnlimitedCrownHolderReader::new, UnlimitedCrownHolderReader.class, UnlimitedCrownHolderWriter::new, UnlimitedCrownHolderWriter.class), VANILLA_PLAYER_DATA(VanillaPlayerDataReader::new, VanillaPlayerDataReader.class, VanillaPlayerDataWriter::new, VanillaPlayerDataWriter.class), VANILLA_PLAYER(VanillaPlayerReader::new, VanillaPlayerReader.class, VanillaPlayerWriter::new, VanillaPlayerWriter.class), VECTOR_3(Vector3Reader::new, Vector3Reader.class, Vector3Writer::new, Vector3Writer.class), diff --git a/plugin/src/main/java/com/eul4/type/player/PluginObjectType.java b/plugin/src/main/java/com/eul4/type/player/PluginObjectType.java index 484dcfdc..8f40d0fe 100644 --- a/plugin/src/main/java/com/eul4/type/player/PluginObjectType.java +++ b/plugin/src/main/java/com/eul4/type/player/PluginObjectType.java @@ -3,8 +3,10 @@ import com.eul4.common.type.player.ObjectType; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.ToString; @RequiredArgsConstructor +@ToString @Getter public enum PluginObjectType implements ObjectType { @@ -16,7 +18,11 @@ public enum PluginObjectType implements ObjectType BLOCK_DATA((byte) 5, PluginExternalizerType.BLOCK_DATA), BROADCAST_HASH_SET((byte) 0, PluginExternalizerType.BROADCAST_HASH_SET), CANNON((byte) 0, PluginExternalizerType.CANNON), + CAPACITATED_CROWN_HOLDER((byte) 0, PluginExternalizerType.CAPACITATED_CROWN_HOLDER), CHECKPOINT_STEP_ENUM((byte) 0, PluginExternalizerType.CHECKPOINT_STEP_ENUM), + CROWN_DEPOSIT((byte) 0, PluginExternalizerType.CROWN_DEPOSIT), + CROWN_INFO((byte) 0, PluginExternalizerType.CROWN_INFO), + CRYPTO_INFO((byte) 0, PluginExternalizerType.CRYPTO_INFO), DEFENDER((byte) 0, PluginExternalizerType.DEFENDER), DEFENDER_SPECTATOR((byte) 0, PluginExternalizerType.DEFENDER_SPECTATOR), DEPOSIT((byte) 0, null), @@ -29,12 +35,15 @@ public enum PluginObjectType implements ObjectType INVENTORY_ORGANIZER_PLAYER((byte) 0, PluginExternalizerType.INVENTORY_ORGANIZER_PLAYER), LIKE_DEPOSIT((byte) 0, PluginExternalizerType.LIKE_DEPOSIT), LIKE_GENERATOR((byte) 0, PluginExternalizerType.LIKE_GENERATOR), + PHYSICAL_DEPOSIT((byte) 0, null), PHYSICAL_PLAYER((byte) 0, null), PLUGIN_PLAYER((byte) 3, null), PLUGIN_PLAYER_DATA((byte) 3, PluginExternalizerType.PLUGIN_PLAYER_DATA), POINT_4_BIT((byte) 0, PluginExternalizerType.POINT_4_BIT), RAID_ANALYZER((byte) 0, PluginExternalizerType.RAID_ANALYZER), RAID_SPECTATOR((byte) 0, PluginExternalizerType.RAID_SPECTATOR), + RAW_MATERIAL((byte) 0, PluginExternalizerType.RAW_MATERIAL), + RAW_MATERIAL_MAP((byte) 0, PluginExternalizerType.RAW_MATERIAL_MAP), SHORT_COORDINATE_BLOCK_CHUNK((byte) 2, PluginExternalizerType.SHORT_COORDINATE_BLOCK_CHUNK), SPAWN_PLAYER((byte) 0, PluginExternalizerType.SPAWN_PLAYER), SPIRITUAL_PLAYER((byte) 0, null), @@ -45,16 +54,17 @@ public enum PluginObjectType implements ObjectType TOWN_BLOCK_MAP((byte) 0, PluginExternalizerType.TOWN_BLOCK_MAP), TOWN_BLOCK((byte) 0, PluginExternalizerType.TOWN_BLOCK), TOWN_BLOCK_SET((byte) 0, PluginExternalizerType.TOWN_BLOCK_SET), - TOWN_HALL((byte) 0, PluginExternalizerType.TOWN_HALL), + TOWN_HALL((byte) 1, PluginExternalizerType.TOWN_HALL), TOWN_MAP((byte) 0, PluginExternalizerType.TOWN_MAP), TOWN_PLAYER_DATA((byte) 1, PluginExternalizerType.TOWN_PLAYER_DATA), TOWN_PLAYER((byte) 0, PluginExternalizerType.TOWN_PLAYER), - TOWN((byte) 3, PluginExternalizerType.TOWN), + TOWN((byte) 4, PluginExternalizerType.TOWN), TOWN_TILE_MAP((byte) 0, PluginExternalizerType.TOWN_TILE_MAP), TOWN_TILE((byte) 0, PluginExternalizerType.TOWN_TILE), TURRET((byte) 0, PluginExternalizerType.TURRET), TUTORIAL_TOWN_PLAYER_DATA((byte) 0, PluginExternalizerType.TUTORIAL_TOWN_PLAYER_DATA), TUTORIAL_TOWN_PLAYER((byte) 0, PluginExternalizerType.TUTORIAL_TOWN_PLAYER), + UNLIMITED_CROWN_HOLDER((byte) 0, PluginExternalizerType.UNLIMITED_CROWN_HOLDER), VANILLA_PLAYER_DATA((byte) 0, PluginExternalizerType.VANILLA_PLAYER_DATA), VANILLA_PLAYER((byte) 0, PluginExternalizerType.VANILLA_PLAYER), VECTOR_3((byte) 0, PluginExternalizerType.VECTOR_3), diff --git a/plugin/src/main/java/com/eul4/type/player/SpiritualPlayerType.java b/plugin/src/main/java/com/eul4/type/player/SpiritualPlayerType.java index f51478c2..7bd24246 100644 --- a/plugin/src/main/java/com/eul4/type/player/SpiritualPlayerType.java +++ b/plugin/src/main/java/com/eul4/type/player/SpiritualPlayerType.java @@ -5,6 +5,7 @@ import com.eul4.externalizer.writer.*; import com.eul4.model.craft.player.*; import com.eul4.model.player.*; +import com.eul4.model.player.spiritual.*; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.bukkit.entity.Player; diff --git a/plugin/src/main/java/com/eul4/util/MaterialUtil.java b/plugin/src/main/java/com/eul4/util/MaterialUtil.java new file mode 100644 index 00000000..a2a2411f --- /dev/null +++ b/plugin/src/main/java/com/eul4/util/MaterialUtil.java @@ -0,0 +1,38 @@ +package com.eul4.util; + +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Material; + +import java.util.Map; + +import static net.kyori.adventure.text.format.Style.style; +import static org.bukkit.Material.DIAMOND; +import static org.bukkit.Material.EMERALD; + +public class MaterialUtil +{ + public static final Map MATERIAL_STYLE = Map.ofEntries + ( +// Map.entry(DIAMOND, style(createColorFromHexString("#34EBE8"))), +// Map.entry(EMERALD, style(createColorFromHexString("#50C878"))) + //TODO Agora quero que você faça o para todos os materiais + ); + + private static TextColor createColorFromHexString(String hexCode) + { + final TextColor color = TextColor.fromHexString(hexCode); + return color == null ? NamedTextColor.WHITE : color; + } + + public static Style getStyle(Material material) + { + return getStyle(material, Style.empty()); + } + + public static Style getStyle(Material material, Style defaultStyle) + { + return MATERIAL_STYLE.getOrDefault(material, defaultStyle); + } +} diff --git a/plugin/src/main/java/com/eul4/util/MessageUtil.java b/plugin/src/main/java/com/eul4/util/MessageUtil.java index 10160fa1..584bf9ba 100644 --- a/plugin/src/main/java/com/eul4/util/MessageUtil.java +++ b/plugin/src/main/java/com/eul4/util/MessageUtil.java @@ -13,14 +13,17 @@ import net.kyori.adventure.text.format.TextDecoration; import org.apache.commons.lang.WordUtils; import org.bukkit.Material; -import org.bukkit.OfflinePlayer; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeModifier; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; -import static com.eul4.i18n.PluginMessage.DECORATED_VALUE_CURRENCY; -import static net.kyori.adventure.text.format.NamedTextColor.*; +import static com.eul4.i18n.PluginMessage.BOLD_DECORATED_$CURRENCY_$VALUE; +import static net.kyori.adventure.text.format.NamedTextColor.GRAY; +import static net.kyori.adventure.text.format.NamedTextColor.WHITE; public class MessageUtil { @@ -47,14 +50,14 @@ public static List getPriceLore(Price price, CommonPlayer commonPlaye if(price.getLikes() > 0) { - components.add(DECORATED_VALUE_CURRENCY.translate(commonPlayer, + components.add(BOLD_DECORATED_$CURRENCY_$VALUE.translate(commonPlayer, Currency.LIKE, price.getLikes())); } if(price.getDislikes() > 0) { - components.add(DECORATED_VALUE_CURRENCY.translate(commonPlayer, + components.add(BOLD_DECORATED_$CURRENCY_$VALUE.translate(commonPlayer, Currency.DISLIKE, price.getDislikes())); } @@ -71,7 +74,7 @@ public static List getCostLore(Cost cost, CommonPlayer commonPlayer) if(price.getLikes() > 0) { components.add(getPontuatedComponent() - .append(DECORATED_VALUE_CURRENCY.translate(commonPlayer, + .append(BOLD_DECORATED_$CURRENCY_$VALUE.translate(commonPlayer, Currency.LIKE, price.getLikes()))); } @@ -79,7 +82,7 @@ public static List getCostLore(Cost cost, CommonPlayer commonPlayer) if(price.getDislikes() > 0) { components.add(getPontuatedComponent() - .append(DECORATED_VALUE_CURRENCY.translate(commonPlayer, + .append(BOLD_DECORATED_$CURRENCY_$VALUE.translate(commonPlayer, Currency.DISLIKE, price.getDislikes()))); } @@ -123,7 +126,7 @@ public static List getCostLoreV2(Cost cost, CommonPlayer commonPlayer if(price.getLikes() > 0) { components.add(getPontuatedComponent() - .append(DECORATED_VALUE_CURRENCY.translate(commonPlayer, + .append(BOLD_DECORATED_$CURRENCY_$VALUE.translate(commonPlayer, Currency.LIKE, price.getLikes()))); } @@ -131,7 +134,7 @@ public static List getCostLoreV2(Cost cost, CommonPlayer commonPlayer if(price.getDislikes() > 0) { components.add(getPontuatedComponent() - .append(DECORATED_VALUE_CURRENCY.translate(commonPlayer, + .append(BOLD_DECORATED_$CURRENCY_$VALUE.translate(commonPlayer, Currency.DISLIKE, price.getDislikes()))); } diff --git a/plugin/src/main/java/com/eul4/util/SoundUtil.java b/plugin/src/main/java/com/eul4/util/SoundUtil.java index 13b6c472..def69747 100644 --- a/plugin/src/main/java/com/eul4/util/SoundUtil.java +++ b/plugin/src/main/java/com/eul4/util/SoundUtil.java @@ -1,6 +1,7 @@ package com.eul4.util; import com.eul4.common.wrapper.Pitch; +import com.eul4.model.player.PluginPlayer; import org.bukkit.Sound; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -34,6 +35,11 @@ public static void playPling(Player player) player.playSound(player, Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, Pitch.max()); } + public static void playPlingPlong(PluginPlayer pluginPlayer) + { + playPlingPlong(pluginPlayer.getPlayer(), pluginPlayer.getPlugin()); + } + public static void playPlingPlong(Player player, Plugin plugin) { player.playSound(player, Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, Pitch.Db2); diff --git a/plugin/src/main/java/com/eul4/wrapper/CrownInfo.java b/plugin/src/main/java/com/eul4/wrapper/CrownInfo.java new file mode 100644 index 00000000..a268a4f0 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/CrownInfo.java @@ -0,0 +1,43 @@ +package com.eul4.wrapper; + +import com.eul4.Main; +import com.eul4.holder.UnlimitedCrownHolder; +import com.google.common.base.Preconditions; +import lombok.Getter; +import lombok.ToString; +import org.jetbrains.annotations.NotNull; + +@Getter +@ToString +public class CrownInfo +{ + private final @NotNull UnlimitedCrownHolder serverTreasure; + private final @NotNull UnlimitedCrownHolder jackpot; + private final @NotNull UnlimitedCrownHolder townHallVault; + private final @NotNull UnlimitedCrownHolder eul4Insights; + + public CrownInfo(@NotNull Main plugin) + { + this + ( + new UnlimitedCrownHolder(plugin), + new UnlimitedCrownHolder(plugin), + new UnlimitedCrownHolder(plugin), + new UnlimitedCrownHolder(plugin) + ); + } + + public CrownInfo + ( + @NotNull UnlimitedCrownHolder serverTreasure, + @NotNull UnlimitedCrownHolder jackpot, + @NotNull UnlimitedCrownHolder townHallVault, + @NotNull UnlimitedCrownHolder eul4Insights + ) + { + this.serverTreasure = Preconditions.checkNotNull(serverTreasure); + this.jackpot = Preconditions.checkNotNull(jackpot); + this.townHallVault = Preconditions.checkNotNull(townHallVault); + this.eul4Insights = Preconditions.checkNotNull(eul4Insights); + } +} diff --git a/plugin/src/main/java/com/eul4/wrapper/CryptoInfo.java b/plugin/src/main/java/com/eul4/wrapper/CryptoInfo.java new file mode 100644 index 00000000..d1be9938 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/CryptoInfo.java @@ -0,0 +1,171 @@ +package com.eul4.wrapper; + +import com.eul4.exception.InvalidCryptoInfoException; +import com.eul4.exception.NegativeBalanceException; +import com.eul4.exception.OperationException; +import com.eul4.holder.CrownHolder; +import com.google.common.base.Preconditions; +import lombok.*; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@ToString +public class CryptoInfo implements CrownHolder +{ + public static final MathContext MATH_CONTEXT = new MathContext(8, RoundingMode.HALF_EVEN); + + @Setter + private BigDecimal marketCap = BigDecimal.ZERO; + + @Setter + private BigDecimal circulatingSupply = BigDecimal.ZERO; + + public CryptoInfo(BigDecimal bigDecimal) + { + this.marketCap = bigDecimal; + this.circulatingSupply = bigDecimal; + } + + public CryptoInfo(double marketCap, double circulatingSupply) + { + this.marketCap = BigDecimal.valueOf(marketCap); + this.circulatingSupply = BigDecimal.valueOf(circulatingSupply); + } + + public BigDecimal calculatePrice() throws InvalidCryptoInfoException + { + validate(); + return marketCap.divide(circulatingSupply, MATH_CONTEXT); + } + + public CryptoInfoTradePreview createTradePreview(BigDecimal amount) throws InvalidCryptoInfoException + { + Preconditions.checkArgument(amount.compareTo(BigDecimal.ZERO) > 0); + return new CryptoInfoTradePreview(this, previewMarketCapDiff(amount).negate(), amount); + } + + public BigDecimal previewCirculatingSupplyDiff(BigDecimal marketCapAugend) + throws NegativeBalanceException, InvalidCryptoInfoException + { + return previewCirculatingSupply(marketCapAugend).subtract(circulatingSupply); + } + + public BigDecimal previewCirculatingSupply(BigDecimal marketCapAugend) + throws InvalidCryptoInfoException, NegativeBalanceException + { + validate(); + + BigDecimal marketCap = this.marketCap.add(marketCapAugend); + + if(marketCap.compareTo(BigDecimal.ZERO) < 0) + { + throw new NegativeBalanceException(); + } + + BigDecimal ratio = marketCap.divide(this.marketCap, MATH_CONTEXT); + return circulatingSupply.divide(ratio, MATH_CONTEXT); + } + + public BigDecimal previewMarketCapDiff(BigDecimal circulatingSupplyAugend) throws InvalidCryptoInfoException + { + BigDecimal marketCapPreview = previewMarketCap(circulatingSupplyAugend); + BigDecimal marketCapDiff = marketCapPreview.subtract(this.marketCap); + + return marketCapDiff; + } + + public BigDecimal previewMarketCap(BigDecimal circulatingSupplyAugend) throws InvalidCryptoInfoException + { + validate(); + + BigDecimal circulatingSupply = this.circulatingSupply.add(circulatingSupplyAugend); + + if(circulatingSupply.compareTo(BigDecimal.ZERO) <= 0) + { + throw new InvalidCryptoInfoException(); + } + + BigDecimal ratio = circulatingSupply.divide(this.circulatingSupply, MATH_CONTEXT); + BigDecimal marketCap = this.marketCap.divide(ratio, MATH_CONTEXT); + + return marketCap; + } + + public BigDecimal trade(BigDecimal amount) throws InvalidCryptoInfoException + { + validate(); + + BigDecimal currentPrice = calculatePrice(); + BigDecimal newPrice = marketCap + .subtract(currentPrice.multiply(amount)) + .divide(circulatingSupply.add(amount), MATH_CONTEXT); + BigDecimal avaragePrice = currentPrice + .add(newPrice) + .divide(BigDecimal.valueOf(2.0D), MATH_CONTEXT); + BigDecimal trade = avaragePrice.multiply(amount, MATH_CONTEXT); + marketCap = marketCap.subtract(trade); + circulatingSupply = circulatingSupply.add(amount); + + return trade; + } + + public boolean isValid() + { + return marketCap.compareTo(BigDecimal.ZERO) > 0 && circulatingSupply.compareTo(BigDecimal.ZERO) > 0; + } + + private void validate() throws InvalidCryptoInfoException + { + if(!isValid()) + { + throw new InvalidCryptoInfoException(); + } + } + + @Override + public BigDecimal getBalance() + { + return marketCap; + } + + @Override + public void setBalance(BigDecimal balance) throws OperationException + { + updateMarketCap(balance); + } + + @Override + public void add(BigDecimal amount) throws NegativeBalanceException + { + updateMarketCap(marketCap.add(amount)); + } + + @Override + public void subtract(BigDecimal amount) throws OperationException + { + updateMarketCap(marketCap.subtract(amount)); + } + + @Override + public boolean isEmpty() + { + return marketCap.compareTo(BigDecimal.ZERO) <= 0; + } + + private void updateMarketCap(BigDecimal newMarketCap) throws NegativeBalanceException + { + if(newMarketCap.compareTo(BigDecimal.ZERO) < 0) + { + throw new NegativeBalanceException(); + } + + BigDecimal ratio = newMarketCap.divide(marketCap, MATH_CONTEXT); + marketCap = newMarketCap; + circulatingSupply = circulatingSupply.divide(ratio, MATH_CONTEXT); + } +} diff --git a/plugin/src/main/java/com/eul4/wrapper/CryptoInfoTradePreview.java b/plugin/src/main/java/com/eul4/wrapper/CryptoInfoTradePreview.java new file mode 100644 index 00000000..826d12e8 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/CryptoInfoTradePreview.java @@ -0,0 +1,22 @@ +package com.eul4.wrapper; + +import lombok.Getter; + +import java.math.BigDecimal; + +@Getter +public class CryptoInfoTradePreview extends TradePreview +{ + private final BigDecimal marketCapPreview; + private final BigDecimal circulatingSupplyPreview; + + public CryptoInfoTradePreview(CryptoInfo holder, + BigDecimal marketCapPreview, + BigDecimal circulatingSupplyPreview) + { + super(holder, marketCapPreview); + + this.marketCapPreview = marketCapPreview; + this.circulatingSupplyPreview = circulatingSupplyPreview; + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/wrapper/DerivativeMaterial.java b/plugin/src/main/java/com/eul4/wrapper/DerivativeMaterial.java new file mode 100644 index 00000000..cb65d986 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/DerivativeMaterial.java @@ -0,0 +1,160 @@ +package com.eul4.wrapper; + +import com.eul4.exception.InvalidCryptoInfoException; +import com.eul4.exception.NegativeBalanceException; +import com.google.common.base.Preconditions; +import lombok.Getter; +import org.bukkit.Material; + +import java.math.BigDecimal; +import java.util.List; + +import static com.eul4.wrapper.CryptoInfo.MATH_CONTEXT; + +@Getter +public class DerivativeMaterial extends EconomicMaterial +{ + private final List economicMaterialMultipliers; + + public DerivativeMaterial(Material material, List economicMaterialMultipliers) + { + super(material); + + Preconditions.checkArgument(!economicMaterialMultipliers.isEmpty()); + + this.economicMaterialMultipliers = economicMaterialMultipliers; + } + + public ItemStackTradePreview createTradePreviews + ( + BigDecimal holderRemainingCapacity, + int amount, + BigDecimal rarityMultiplier + ) + throws InvalidCryptoInfoException + { + BigDecimal actualAmount = BigDecimal.valueOf(amount); + BigDecimal minAmount; + + try + { + BigDecimal maxAmount = previewCirculatingSupplyDiff(holderRemainingCapacity.negate()); + + maxAmount = maxAmount.divideToIntegralValue(rarityMultiplier, MATH_CONTEXT); + minAmount = maxAmount.compareTo(actualAmount) < 0 ? maxAmount : actualAmount; + } + catch(NegativeBalanceException e) + { + minAmount = actualAmount; + } + + minAmount = minAmount.compareTo(BigDecimal.ONE) < 0 + ? BigDecimal.ONE + : minAmount; + + return createTradePreviews(minAmount, rarityMultiplier); + } + + public ItemStackTradePreview createTradePreviews + ( + BigDecimal baseMultiplier, + BigDecimal rarityMultiplier + ) + throws InvalidCryptoInfoException + { + final BigDecimal multiplier = baseMultiplier.multiply(rarityMultiplier, MATH_CONTEXT); + return createTradePreviews(new ItemStackTradePreview(baseMultiplier), multiplier); + } + + public BigDecimal previewCirculatingSupplyDiff(BigDecimal marketCapAugend) + throws InvalidCryptoInfoException, NegativeBalanceException + { + BigDecimal price = calculatePrice(); + BigDecimal marketCap = calculateMarketCap(); + BigDecimal circulatingSupply = marketCap.divide(price, MATH_CONTEXT); + + CryptoInfo fakeCrypto = new CryptoInfo(marketCap, circulatingSupply); + + fakeCrypto.add(marketCapAugend); + + return fakeCrypto.getCirculatingSupply().subtract(circulatingSupply); + } + + private BigDecimal calculateMarketCap() throws InvalidCryptoInfoException + { + return calculateMarketCap(BigDecimal.ZERO); + } + + private BigDecimal calculateMarketCap(BigDecimal totalMarketCap) throws InvalidCryptoInfoException + { + for(EconomicMaterialMultiplier economicMaterialMultiplier : economicMaterialMultipliers) + { + EconomicMaterial economicMaterial = economicMaterialMultiplier.economicMaterial; + + if(economicMaterial instanceof DerivativeMaterial derivativeMaterial) + { + derivativeMaterial.calculateMarketCap(totalMarketCap); + } + else if(economicMaterial instanceof RawMaterial rawMaterial) + { + BigDecimal marketCap = rawMaterial.getCryptoInfo().getMarketCap(); + totalMarketCap = totalMarketCap.add(marketCap); + } + } + + return totalMarketCap; + } + + public BigDecimal calculatePrice() throws InvalidCryptoInfoException + { + return calculatePrice(BigDecimal.ZERO, BigDecimal.ONE); + } + + private BigDecimal calculatePrice(BigDecimal totalPrice, BigDecimal baseMultiplier) + throws InvalidCryptoInfoException + { + for(EconomicMaterialMultiplier economicMaterialMultiplier : economicMaterialMultipliers) + { + EconomicMaterial economicMaterial = economicMaterialMultiplier.economicMaterial; + BigDecimal multiplier = baseMultiplier.multiply(economicMaterialMultiplier.multiplier, MATH_CONTEXT); + + if(economicMaterial instanceof DerivativeMaterial derivativeMaterial) + { + derivativeMaterial.calculatePrice(totalPrice, multiplier); + } + else if(economicMaterial instanceof RawMaterial rawMaterial) + { + BigDecimal price = rawMaterial.getCryptoInfo().calculatePrice().multiply(multiplier, MATH_CONTEXT); + totalPrice = totalPrice.add(price); + } + } + + return totalPrice; + } + + private ItemStackTradePreview createTradePreviews + ( + ItemStackTradePreview itemStackTradePreview, + BigDecimal baseMultiplier + ) + throws InvalidCryptoInfoException + { + for(EconomicMaterialMultiplier economicMaterialMultiplier : economicMaterialMultipliers) + { + EconomicMaterial economicMaterial = economicMaterialMultiplier.economicMaterial; + BigDecimal multiplier = baseMultiplier + .multiply(economicMaterialMultiplier.multiplier, MATH_CONTEXT); + + if(economicMaterial instanceof DerivativeMaterial derivativeMaterial) + { + derivativeMaterial.createTradePreviews(itemStackTradePreview, multiplier); + } + else if(economicMaterial instanceof RawMaterial rawMaterial) + { + itemStackTradePreview.getPreviews().add(rawMaterial.createTradePreview(multiplier)); + } + } + + return itemStackTradePreview; + } +} diff --git a/plugin/src/main/java/com/eul4/wrapper/EconomicMaterial.java b/plugin/src/main/java/com/eul4/wrapper/EconomicMaterial.java new file mode 100644 index 00000000..6b097dd5 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/EconomicMaterial.java @@ -0,0 +1,27 @@ +package com.eul4.wrapper; + +import lombok.Getter; +import org.bukkit.Material; + +import java.math.BigDecimal; + +public abstract class EconomicMaterial +{ + @Getter + protected final Material material; + + protected EconomicMaterial(Material material) + { + this.material = material; + } + + public EconomicMaterialMultiplier withMultiplier(double multiplier) + { + return withMultiplier(BigDecimal.valueOf(multiplier)); + } + + public EconomicMaterialMultiplier withMultiplier(BigDecimal multiplier) + { + return new EconomicMaterialMultiplier(this, multiplier); + } +} diff --git a/plugin/src/main/java/com/eul4/wrapper/EconomicMaterialMultiplier.java b/plugin/src/main/java/com/eul4/wrapper/EconomicMaterialMultiplier.java new file mode 100644 index 00000000..e79b28b2 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/EconomicMaterialMultiplier.java @@ -0,0 +1,19 @@ +package com.eul4.wrapper; + +import com.google.common.base.Preconditions; + +import java.math.BigDecimal; + +public class EconomicMaterialMultiplier +{ + protected final EconomicMaterial economicMaterial; + protected final BigDecimal multiplier; + + public EconomicMaterialMultiplier(EconomicMaterial economicMaterial, BigDecimal multiplier) + { + Preconditions.checkArgument(multiplier.compareTo(BigDecimal.ZERO) > 0); + + this.economicMaterial = economicMaterial; + this.multiplier = multiplier; + } +} diff --git a/plugin/src/main/java/com/eul4/wrapper/ItemStackTradePreview.java b/plugin/src/main/java/com/eul4/wrapper/ItemStackTradePreview.java new file mode 100644 index 00000000..bb342331 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/ItemStackTradePreview.java @@ -0,0 +1,35 @@ +package com.eul4.wrapper; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@RequiredArgsConstructor +@Getter +public class ItemStackTradePreview +{ + private final List previews; + private final BigDecimal amountToConsume; + + public ItemStackTradePreview(CryptoInfoTradePreview preview, BigDecimal amountToConsume) + { + this.previews = new ArrayList<>(Collections.singletonList(preview)); + this.amountToConsume = amountToConsume; + } + + public ItemStackTradePreview(BigDecimal amountToConsume) + { + this.previews = new ArrayList<>(); + this.amountToConsume = amountToConsume; + } + + public int getAmountToConsume() + { + return amountToConsume.setScale(0, RoundingMode.UP).intValueExact(); + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/wrapper/MaterialLiquidity.java b/plugin/src/main/java/com/eul4/wrapper/MaterialLiquidity.java new file mode 100644 index 00000000..3941a6ec --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/MaterialLiquidity.java @@ -0,0 +1,10 @@ +package com.eul4.wrapper; + +import java.math.BigDecimal; + +public class MaterialLiquidity +{ + private BigDecimal marketCap; + private BigDecimal circulatingSupply; + +} diff --git a/plugin/src/main/java/com/eul4/wrapper/PreTownAttack.java b/plugin/src/main/java/com/eul4/wrapper/PreTownAttack.java index 10b925f6..f053fd05 100644 --- a/plugin/src/main/java/com/eul4/wrapper/PreTownAttack.java +++ b/plugin/src/main/java/com/eul4/wrapper/PreTownAttack.java @@ -1,8 +1,8 @@ package com.eul4.wrapper; import com.eul4.model.player.PluginPlayer; -import com.eul4.model.player.RaidAnalyzer; -import com.eul4.model.player.TownPlayer; +import com.eul4.model.player.spiritual.RaidAnalyzer; +import com.eul4.model.player.physical.TownPlayer; import com.eul4.model.town.Town; import com.eul4.model.town.structure.Structure; import com.eul4.type.player.SpiritualPlayerType; diff --git a/plugin/src/main/java/com/eul4/wrapper/RawMaterial.java b/plugin/src/main/java/com/eul4/wrapper/RawMaterial.java new file mode 100644 index 00000000..fc5781f4 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/RawMaterial.java @@ -0,0 +1,92 @@ +package com.eul4.wrapper; + +import com.eul4.exception.InvalidCryptoInfoException; +import com.eul4.exception.NegativeBalanceException; +import com.google.common.base.Preconditions; +import lombok.Getter; +import org.bukkit.Material; + +import java.math.BigDecimal; + +import static com.eul4.wrapper.CryptoInfo.MATH_CONTEXT; + +@Getter +public class RawMaterial extends EconomicMaterial +{ + private final CryptoInfo cryptoInfo; + + public RawMaterial(Material material, CryptoInfo cryptoInfo) + { + super(material); + this.cryptoInfo = Preconditions.checkNotNull(cryptoInfo); + } + + public CryptoInfoTradePreview createTradePreview(int amount) throws InvalidCryptoInfoException + { + return createTradePreview(BigDecimal.valueOf(amount)); + } + + public CryptoInfoTradePreview createTradePreview(BigDecimal circulatingSupplyAugend) + throws InvalidCryptoInfoException + { + return cryptoInfo.createTradePreview(circulatingSupplyAugend); + } + + public ItemStackTradePreview createTradePreview + ( + BigDecimal holderRemainingCapacity, + int circulatingSupplyAugend, + BigDecimal rarityMultiplier + ) + throws InvalidCryptoInfoException + { + return createTradePreview + ( + holderRemainingCapacity, + BigDecimal.valueOf(circulatingSupplyAugend), + rarityMultiplier + ); + } + + public ItemStackTradePreview createTradePreview + ( + BigDecimal holderRemainingCapacity, + BigDecimal actualAmount, + BigDecimal rarityMultiplier + ) + throws InvalidCryptoInfoException + { + BigDecimal minAmount = getMinAmount(holderRemainingCapacity, actualAmount, rarityMultiplier); + BigDecimal multiplier = minAmount.multiply(rarityMultiplier, MATH_CONTEXT); + + return new ItemStackTradePreview + ( + createTradePreview(multiplier), + minAmount + ); + } + + private BigDecimal getMinAmount + ( + BigDecimal holderRemainingCapacity, + BigDecimal actualAmount, + BigDecimal rarityMultiplier + ) + throws InvalidCryptoInfoException + { + try + { + final BigDecimal maxAmount = cryptoInfo + .previewCirculatingSupplyDiff(holderRemainingCapacity) + .divideToIntegralValue(rarityMultiplier, MATH_CONTEXT); + + return maxAmount.compareTo(actualAmount) < 0 + ? maxAmount + : actualAmount; + } + catch(NegativeBalanceException e) + { + return actualAmount; + } + } +} diff --git a/plugin/src/main/java/com/eul4/wrapper/RawMaterialMap.java b/plugin/src/main/java/com/eul4/wrapper/RawMaterialMap.java new file mode 100644 index 00000000..f5b5d4c2 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/RawMaterialMap.java @@ -0,0 +1,49 @@ +package com.eul4.wrapper; + +import lombok.Getter; +import org.bukkit.Material; + +import java.util.HashMap; + +@Getter +public class RawMaterialMap +{ + private final HashMap map; + + public RawMaterialMap() + { + this(createDefaultMap()); + } + + private RawMaterialMap(HashMap map) + { + this.map = map; + } + + private static HashMap createDefaultMap() + { + HashMap rawMaterialMap = new HashMap<>(); + + for(Material material : Material.values()) + { + rawMaterialMap.put(material, new RawMaterial(material, new CryptoInfo())); + } + + return rawMaterialMap; + } + + public boolean containsKey(Material material) + { + return map.containsKey(material); + } + + public RawMaterial get(Material material) + { + return map.get(material); + } + + public void put(RawMaterial rawMaterial) + { + map.put(rawMaterial.getMaterial(), rawMaterial); + } +} diff --git a/plugin/src/main/java/com/eul4/wrapper/Resource.java b/plugin/src/main/java/com/eul4/wrapper/Resource.java index 8a5f8363..dac903b2 100644 --- a/plugin/src/main/java/com/eul4/wrapper/Resource.java +++ b/plugin/src/main/java/com/eul4/wrapper/Resource.java @@ -24,7 +24,9 @@ public class Resource public enum Type { LIKE(Material.LIME_CONCRETE.createBlockData(), Town::addLikes, Currency.LIKE), - DISLIKE(Material.RED_CONCRETE.createBlockData(), Town::addDislikes, Currency.DISLIKE); + DISLIKE(Material.RED_CONCRETE.createBlockData(), Town::addDislikes, Currency.DISLIKE), + CROWN(Material.GOLD_BLOCK.createBlockData(), Town::addDislikes, Currency.CROWN), //FIXME fix addOperation + ; private final BlockData blockData; private final BiConsumer addOperation; diff --git a/plugin/src/main/java/com/eul4/wrapper/Tag.java b/plugin/src/main/java/com/eul4/wrapper/Tag.java index a47c7425..eed639e3 100644 --- a/plugin/src/main/java/com/eul4/wrapper/Tag.java +++ b/plugin/src/main/java/com/eul4/wrapper/Tag.java @@ -28,6 +28,15 @@ public enum Tag DEPUTY_MAYOR(TAG_DEPUTY_MAYOR, style(YELLOW), Set.of("deputy-mayor", "vice-prefeito")), ALPHA(TAG_ALPHA, style(DARK_PURPLE), Set.of("alpha")), + TYCOON(TAG_TYCOON, style(GOLD), Set.of("tycoon", "magnata")) + { + @Override + public boolean hasTag(PluginPlayer pluginPlayer) + { + return super.hasTag(pluginPlayer) || pluginPlayer.isTycoon(); + } + }, + TOWNEE(TAG_TOWNEE, style(GRAY), Set.of("townee", "cidadão")) { @Override diff --git a/plugin/src/main/java/com/eul4/wrapper/TownAttack.java b/plugin/src/main/java/com/eul4/wrapper/TownAttack.java index 8d3ff99a..b1c99ad2 100644 --- a/plugin/src/main/java/com/eul4/wrapper/TownAttack.java +++ b/plugin/src/main/java/com/eul4/wrapper/TownAttack.java @@ -5,6 +5,10 @@ import com.eul4.event.AttackStartEvent; import com.eul4.i18n.PluginMessage; import com.eul4.model.player.*; +import com.eul4.model.player.spiritual.Attacker; +import com.eul4.model.player.spiritual.Defender; +import com.eul4.model.player.spiritual.DefenderSpectator; +import com.eul4.model.player.spiritual.RaidSpectator; import com.eul4.model.town.Town; import com.eul4.model.town.TownBlock; import com.eul4.model.town.structure.Structure; @@ -236,7 +240,7 @@ private void updateBars() attackerBossBar.progress((float) ticks / maxTicks); bossBar.progress((float) ticks / maxTicks); - CommonPlayer commonPlayer = town.getPlugin().getPlayerManager().get(town.getOwnerUUID()); + CommonPlayer commonPlayer = town.getPlugin().getPlayerManager().get(town.getOwnerUniqueId()); if(commonPlayer instanceof Defender || commonPlayer instanceof DefenderSpectator diff --git a/plugin/src/main/java/com/eul4/wrapper/Trade.java b/plugin/src/main/java/com/eul4/wrapper/Trade.java new file mode 100644 index 00000000..946d34a2 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/Trade.java @@ -0,0 +1,18 @@ +package com.eul4.wrapper; + +import com.eul4.exception.InvalidCryptoInfoException; +import lombok.RequiredArgsConstructor; + +import java.math.BigDecimal; + +@RequiredArgsConstructor +public class Trade +{ + private final CryptoInfo cryptoInfo; + private final BigDecimal amount; + + public BigDecimal execute() throws InvalidCryptoInfoException + { + return cryptoInfo.trade(amount); + } +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/wrapper/TradePreview.java b/plugin/src/main/java/com/eul4/wrapper/TradePreview.java new file mode 100644 index 00000000..d4101c09 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/TradePreview.java @@ -0,0 +1,15 @@ +package com.eul4.wrapper; + +import com.eul4.holder.Holder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.ToString; + +@RequiredArgsConstructor +@Getter +@ToString +public class TradePreview, H extends Holder> +{ + private final H holder; + private final N preview; +} \ No newline at end of file diff --git a/plugin/src/main/java/com/eul4/wrapper/TransactionalResource.java b/plugin/src/main/java/com/eul4/wrapper/TransactionalResource.java new file mode 100644 index 00000000..da859c06 --- /dev/null +++ b/plugin/src/main/java/com/eul4/wrapper/TransactionalResource.java @@ -0,0 +1,84 @@ +package com.eul4.wrapper; + +import com.eul4.calculator.Calculator; +import com.eul4.common.i18n.TranslatableMessage; +import com.eul4.enums.Currency; +import com.eul4.function.TransactionCreator; +import com.eul4.i18n.PluginMessage; +import com.eul4.model.town.structure.TransactionalResourceStructure; +import com.sk89q.worldedit.math.BlockVector3; +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.inventory.ItemStack; + +import java.util.function.BooleanSupplier; +import java.util.function.Function; + +@Builder +@RequiredArgsConstructor +@Getter +public class TransactionalResource> +{ + @RequiredArgsConstructor + @Getter + public enum Type + { + CROWN(Material.GOLD_BLOCK.createBlockData(), Currency.CROWN, PluginMessage.STEALING_CROWNS_DEPOSIT_FULL), + ; + + private final BlockData blockData; + private final Currency currency; + private final TranslatableMessage overCapacityMessage; + } + + private final TransactionalResourceStructure structure; + private final BlockVector3 relativePosition; + private final Type type; + private final TransactionCreator transactionCreator; + private final Calculator calculator; + private final BooleanSupplier emptyChecker; + private final Function amountToStealFunction; + + public BlockData getBlockData() + { + return type.blockData; + } + + public Block getRelative(Block centerBlock) + { + return centerBlock.getRelative(relativePosition.x(), relativePosition.y(), relativePosition.z()); + } + + public boolean isEmpty() + { + return emptyChecker.getAsBoolean(); + } + + public void placeRelative(Block centerBlock) + { + Block relative = getRelative(centerBlock); + + if(isEmpty()) + { + relative.setType(Material.AIR); + } + else + { + relative.setBlockData(type.getBlockData()); + } + } + + public Calculator getCalculator() + { + return calculator; + } + + public N getAmountToSteal(ItemStack tool) + { + return amountToStealFunction.apply(tool); + } +} diff --git a/plugin/src/main/resources/analyzer_scoreboard_pt_BR.properties b/plugin/src/main/resources/analyzer_scoreboard_pt_BR.properties index 51589454..c3a8bd2a 100644 --- a/plugin/src/main/resources/analyzer_scoreboard_pt_BR.properties +++ b/plugin/src/main/resources/analyzer_scoreboard_pt_BR.properties @@ -1,27 +1,23 @@ -title=RECURSOS DO(A) {0} +title=RECURSOS DO(A) -player-status.prefix={0} -player-status.entry=§7 está\ -player-status.suffix={0}§7! +player-status.prefix= está +player-status.suffix=! -town-hall-level.prefix= -town-hall-level.entry=§7Nível da Prefeitura: §f -town-hall-level.suffix={0} +town-hall-level.prefix=Nível da Prefeitura: +town-hall-level.suffix= -likes.prefix= -likes.entry=§a§lLIKES: §f -likes.suffix={0}/{1} +likes.prefix=LIKES: +likes.suffix=/ -dislikes.prefix= -dislikes.entry=§c§lDISLIKES: §f -dislikes.suffix={0}/{1} +dislikes.prefix=DISLIKES: +dislikes.suffix=/ -hardness.prefix= -hardness.entry=§eDureza: §f -hardness.suffix={0}/{1} +crowns.prefix=COROAS: +crowns.suffix=/ -footer.prefix= -footer.entry=§l §7 IP: §f§oeul4.com -#footer.entry=§f §ocidadevirtual.eduadro137.com.br +hardness.prefix=Dureza: +hardness.suffix=/ + +footer.prefix= IP: eul4.com footer.suffix= diff --git a/plugin/src/main/resources/paper-plugin.yml b/plugin/src/main/resources/paper-plugin.yml index 26817384..a5f0420d 100644 --- a/plugin/src/main/resources/paper-plugin.yml +++ b/plugin/src/main/resources/paper-plugin.yml @@ -1,5 +1,5 @@ name: Plugin -version: '1.0' +version: '1.1' main: com.eul4.Main description: Plugin api-version: '1.21.1' diff --git a/plugin/src/main/resources/plugin_pt_BR.properties b/plugin/src/main/resources/plugin_pt_BR.properties index f7911854..9badc381 100644 --- a/plugin/src/main/resources/plugin_pt_BR.properties +++ b/plugin/src/main/resources/plugin_pt_BR.properties @@ -1,9 +1,11 @@ command.town.usage={0}: /{1} command.admin.can-not-leave-without-town=Você não pode deixar o modo ADMINISTRADOR neste mundo sem possuir uma cidade. -level=level +level=nível structure=estrutura value=valor currency=moeda +like=like +dislike=dislike likes=likes dislikes=dislikes upgrade=upgrade @@ -11,10 +13,16 @@ durability=durabilidade price=preço cost=custo +crown=Coroa +crowns=Coroas + common=comum rare=raro legendary=lendário rarity=raridade +capacity=capacidade + +command-wrong-syntax=Sintaxe errada! enchantment.stability=Estabilidade @@ -33,6 +41,11 @@ legendary.placement-incompatibility=S firework-incompatible-rarity=A raridade do foguete deve ser igual da Elytra! arrow-rarity-higher-than-bow=A raridade da flecha não pode ser maior que a do Arco! +crown-deposits-insufficient-capacity=A capacidade dos seus depósitos de coroas é insuficiente para realizar essa transação. +crown-deposit-insufficient-capacity=A capacidade desse depósito de coroas é insuficiente para realizar essa transação. + +exception.operation=Falha ao realizar a transação. + containtment-pickaxe.display-name=Picareta de Contenção containtment-pickaxe.can-break-only-spawners=A Picareta de Contenção só pode quebrar spawners. @@ -45,6 +58,7 @@ tag.admin=ADMIN tag.vip=VIP tag.mayor=PREFEITO tag.alpha=ALPHA +tag.tycoon=MAGNATA tag.deputy-mayor=VICE-PREFEITO tag.townee=CIDADÃO tag.indigent=INDIGENTE @@ -63,7 +77,7 @@ structure-constructor-lore=\ structure-max-upgrade-reached=A estrutura já está no level máximo. structure-upgraded-to-level=Estrutura melhorada para o level {0}! upgrade-locked.requires-town-hall-level=Upgrade bloqueado (Requer prefeitura no level {0}) -structure.deposit-capacity-hologram=Capacidade: {0} {1} +structure.deposit-capacity-hologram=Capacidade: {0} this-block-will-exceed-hardness-limit=Este bloco vai ultrapassar o limite de dureza da vila. structure.armory.upgrade-preview-lore=\ @@ -105,6 +119,10 @@ structure.dislike-deposit.upgrade-preview-lore=\ Capacidade: {0} -> {1}\n\ Tempo de construção: {2} +structure.crown-deposit.upgrade-preview-lore=\ + Capacidade: {0} -> {1}\n\ + Tempo de construção: {2} + can-only-upgrade-when-built=Só pode melhorar quando a estrutura estiver finalizada. requires-town-hall-level=Requer a prefeitura no level {0}. structure-limit-reached=Limite máximo de {0} atingido. ({1}/{2}) @@ -158,11 +176,13 @@ structure.dislike-deposit.balance={0} DISLIKES VIRTUAIS structure.dislike-generator.balance={0} DISLIKES structure.town-hall.virtual-likes={0} LIKES VIRTUAIS structure.town-hall.virtual-dislikes={0} DISLIKES VIRTUAIS +structure.crown-deposit.balance=COROAS: {0} collect-likes=Coletar likes structure.hologram.title={0} - {1} {2} structure.like-generator.name=Gerador de Likes structure.dislike-generator.name=Gerador de Dislikes +structure.crown-deposit.name=Depósito de Coroas structure.like-deposit.name=Depósito de Likes structure.dislike-deposit.name=Depósito de Dislikes structure.armory.name=Arsenal @@ -290,17 +310,6 @@ command.balance.try-town-command=\ Você precisa de uma cidade para usar este comando.\n\ Digite /{0} para criar uma cidade. -command.balance.your-resources=SEUS RECURSOS -command.balance=\ - {0} {1} {2}\n\ - \n\ - {3} {4}/{5}\n\ - {6} {7}/{8}\n\ - \n\ - {9} - -command.balance.footer=\ - tile-bought=Terreno comprado! purchase-invalid-price=O preço desta compra está inválido!\n\ @@ -369,6 +378,11 @@ structure.dislike-deposit.shop-preview-attributes=\ \n\ Tempo de construção: {1} +structure.crown-deposit.shop-preview-attributes=\ + Capacidade: {0}\n\ + \n\ + Tempo de construção: {1} + structure.armory.shop-preview-attributes=\ Tempo de construção: {0} @@ -413,6 +427,29 @@ structure.turret.shop-lore=\ §b§lTELEGUIADO§r para cima do adversário,\n\ não dando chance de revidar! +command.price.unit-price=O preço unitário atual do(a) {0} é {1} moedas. + +command.sell.need-hold-item=Você precisa estar segurando um item na mão. +command.sell.item-not-for-sale=Este item não está a venda. +command.sell.sold=Você vendeu {0} x{1} por {2}. + +command.pay.yourself=Você não pode pagar a si mesmo. +command.pay.your-town-under-attack=Você não pode realizar pagamentos \ + enquanto a sua cidade estiver sob ataque! +command.pay.target-town-under-attack={0} não pode receber pagamentos agora \ + porque a cidade dele(a) está sob ataque! +command.pay.min-value=O valor do pagamento deve ser no mínimo 1 centavo (0,01). +command.pay.scale-limit=A quantidade de casas decimais deve ser no máximo {0}. +command.pay.integral-scale-limit=A quantidade de casas inteiras deve ser no máximo {0}. +command.pay.indigent-target=O(A) {0} é um(a) indigente e por isso não pode receber pagamentos. +command.pay.insufficient-balance=O seu saldo de coroas é insuficiente para realizar esta transação. +command.pay.target-over-capacity=A capacidade dos depósitos de coroas do(a) {0} \ + é insuficiente para realizar essa transação. +command.pay.unexpected-error=Um erro inesperado aconteceu e por isso \ + não foi possível realizar esta transação. +command.pay.you-paid=Você pagou {0} para o(a) {1}. +command.pay.you-received=Você recebeu {0} do(a) {1}. + command.sethome.max-home-reached=\ Número máximo de casa atingido!\n\ Tente deletar uma casa: /delhome @@ -501,4 +538,17 @@ command.track.invalid=\ command.mutebroadcast.click-to-mute=Clique para silenciar esta transmissão command.mutebroadcast.broadcast-muted=Você não receberá mais esta transmissão. command.mutebroadcast.broadcast-already-muted=Esta transmissão já está silenciada. -command.mutebroadcast.broadcast-not-found=Transmissão \"{0}\" não encontrada. \ No newline at end of file +command.mutebroadcast.broadcast-not-found=Transmissão \"{0}\" não encontrada. + +command.baltop.wait-computation=\ + Calculando o saldo dos jogadores...\n\ + Aguarde um momento... + +you-stole-from-other=Você roubou {0} do(a) {1}. +other-stole-from-you={1} roubou {0} de você. + +unexpected-error-while-stealing=Um erro inesperado ocorreu ao tentar roubar este recurso.\n\ + Por favor, reporte este erro para o ADM. + +stealing-crowns-deposit-full=Não foi possível roubar este recurso!\n\ + Seus depósitos de coroas estão cheios! diff --git a/plugin/src/main/resources/plugin_rich_message_pt_BR.properties b/plugin/src/main/resources/plugin_rich_message_pt_BR.properties index 17bc1a7f..c6ca1de7 100644 --- a/plugin/src/main/resources/plugin_rich_message_pt_BR.properties +++ b/plugin/src/main/resources/plugin_rich_message_pt_BR.properties @@ -33,3 +33,23 @@ command.track=\ --- RESULTADOS --- \n\ +crown-info=\ + Tesouro do Servidor: \n\ + Jackpot: \n\ + Cofre da Prefeitura: \n\ + Canal do Eul4: + +structure.crown-deposit.shop-lore=\ + O depósito de COROAS serve\n\ + para guardar as suas COROAS! + +command.balance=\ + ] SEUS RECURSOS [ \n\ + \n\ + LIKES: /\n\ + DISLIKES: /\n\ + COROAS: /\n\ + \n\ + + +broadcast.new-tycoon=
é o novo MAGNATA!!!
\ No newline at end of file diff --git a/plugin/src/main/resources/town_scoreboard_pt_BR.properties b/plugin/src/main/resources/town_scoreboard_pt_BR.properties index 8dda9dfe..3a98c39c 100644 --- a/plugin/src/main/resources/town_scoreboard_pt_BR.properties +++ b/plugin/src/main/resources/town_scoreboard_pt_BR.properties @@ -1,18 +1,17 @@ -title=§f§lSEUS RECURSOS +title=SEUS RECURSOS -likes.prefix= -likes.entry=§a§lLIKES: §f -likes.suffix={0}/{1} +likes.prefix=LIKES: +likes.suffix=/ -dislikes.prefix= -dislikes.entry=§c§lDISLIKES: §f -dislikes.suffix={0}/{1} +dislikes.prefix=DISLIKES: +dislikes.suffix=/ -hardness.prefix= -hardness.entry=§eDureza: §f -hardness.suffix={0}/{1} +crowns.prefix=COROAS: +crowns.suffix=/ -footer.prefix= -footer.entry=§7 IP: §f§oeul4.com -#footer.entry=§f §ocidadevirtual.eduadro137.com.br +hardness.prefix=Dureza: +hardness.suffix=/ + +footer.prefix= IP: eul4.com +#footer.prefix=§f §ocidadevirtual.eduadro137.com.br footer.suffix= \ No newline at end of file diff --git a/plugin2/.gitignore b/plugin2/.gitignore deleted file mode 100644 index b63da455..00000000 --- a/plugin2/.gitignore +++ /dev/null @@ -1,42 +0,0 @@ -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### IntelliJ IDEA ### -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### Eclipse ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ - -### Mac OS ### -.DS_Store \ No newline at end of file diff --git a/plugin2/build.gradle.kts b/plugin2/build.gradle.kts deleted file mode 100644 index 49cc0cf7..00000000 --- a/plugin2/build.gradle.kts +++ /dev/null @@ -1,41 +0,0 @@ -plugins { - id("java") - id("com.github.johnrengelman.shadow") version "8.1.1" -} - -group = "com.eul4" -version = "1.0-SNAPSHOT" - -repositories { - gradlePluginPortal() - mavenCentral() - mavenLocal() - maven("https://maven.enginehub.org/repo") - maven("https://repo.papermc.io/repository/maven-public/") - maven("https://repo.dmulloy2.net/repository/public/") -} - -dependencies { - implementation(project(":plugin")) - implementation(project(":common")) - implementation(platform("com.intellectualsites.bom:bom-newest:1.46")) -// implementation(project(mapOf("path" to ":plugin-validator"))) // Ref: https://github.com/IntellectualSites/bom - compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") - compileOnly("org.projectlombok:lombok:1.18.30") - annotationProcessor("org.projectlombok:lombok:1.18.30") -} - -tasks.shadowJar { - shouldRunAfter(tasks.clean) - mergeServiceFiles() - - archiveClassifier = null - - dependencies { - include(project(":plugin")) - } -} - -tasks.build { - dependsOn(tasks.shadowJar) -} diff --git a/plugin2/src/main/java/com/eul4/plugin2/Main.java b/plugin2/src/main/java/com/eul4/plugin2/Main.java deleted file mode 100644 index 36df3f12..00000000 --- a/plugin2/src/main/java/com/eul4/plugin2/Main.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.eul4.plugin2; - -import com.eul4.common.Common; -import com.eul4.common.type.player.CommonWorldType; -import com.eul4.plugin2.command.SethomeCommand; -import com.eul4.plugin2.command.HomeCommand; -import com.eul4.plugin2.command.ListHomesCommand; -import com.eul4.plugin2.command.DelHomeCommand; -import com.eul4.plugin2.command.TpaCommand; -import com.eul4.plugin2.command.AceitarTpaCommand; - -import org.bukkit.plugin.java.JavaPlugin; - - -public class Main extends JavaPlugin -{ - - @Override - public void onEnable() - { - super.onEnable(); - saveDefaultConfig(); - // Passa a instância do plugin para os comandos -// getCommand("sethome").setExecutor(new SethomeCommand(this)); -// getCommand("home").setExecutor(new HomeCommand(this)); -// getCommand("delhome").setExecutor(new DelHomeCommand(this)); -// getCommand("listhomes").setExecutor(new ListHomesCommand(this)); - - TpaCommand tpaCommand = new TpaCommand(this); - getCommand("tpa").setExecutor(tpaCommand); - getCommand("aceitartpa").setExecutor(new AceitarTpaCommand(this, tpaCommand)); - - // Registra o evento de teleporte cancelado - HomeCommand homeCommand = new HomeCommand(this); - getServer().getPluginManager().registerEvents(homeCommand, this); - - - } - -} diff --git a/plugin2/src/main/java/com/eul4/plugin2/command/AceitarTpaCommand.java b/plugin2/src/main/java/com/eul4/plugin2/command/AceitarTpaCommand.java deleted file mode 100644 index 0d2825d8..00000000 --- a/plugin2/src/main/java/com/eul4/plugin2/command/AceitarTpaCommand.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.eul4.plugin2.command; - -import com.eul4.model.player.Fighter; -import com.eul4.plugin2.Main; -import lombok.RequiredArgsConstructor; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -@RequiredArgsConstructor -public class AceitarTpaCommand implements TabExecutor { - private final Main plugin; - private final TpaCommand tpaCommand; - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) { - return Collections.emptyList(); - } - - @Override - public boolean onCommand(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) { - if (!(commandSender instanceof Player player)) { - return true; - } - - if (isFighter(player)) { - player.sendMessage(Component.text("Voc\u00ea n\u00e3o pode usar esse comando porque est\u00e1 no mundo da Cidade Virtual. Digite /spawn para voltar.", NamedTextColor.RED)); - return true; - } - - if (args.length == 0) { - player.sendMessage(Component.text("Uso correto: /aceitartpa ", NamedTextColor.RED)); - return true; - } - - Player requester = Bukkit.getPlayer(args[0]); - if (requester == null || !requester.isOnline()) { - player.sendMessage(Component.text("Jogador n\u00e3o encontrado ou offline!", NamedTextColor.RED)); - return true; - } - - UUID playerUUID = player.getUniqueId(); - UUID requesterUUID = requester.getUniqueId(); - - Map> tpaRequests = tpaCommand.getTpaRequests(); - if (!tpaRequests.containsKey(playerUUID) || !tpaRequests.get(playerUUID).containsKey(requesterUUID)) { - player.sendMessage(Component.text("Nenhuma solicita\u00e7\u00e3o de teleporte encontrada de " + requester.getName(), NamedTextColor.RED)); - return true; - } - - // Aceitar o TPA - requester.teleport(player.getLocation()); - player.sendMessage(Component.text("Voc\u00ea aceitou a solicita\u00e7\u00e3o de teleporte de " + requester.getName(), NamedTextColor.GREEN)); - requester.sendMessage(Component.text("Sua solicita\u00e7\u00e3o de teleporte para " + player.getName() + " foi aceita!", NamedTextColor.GREEN)); - - // Remover a solicita\u00e7\u00e3o aceita - tpaRequests.get(playerUUID).remove(requesterUUID); - if (tpaRequests.get(playerUUID).isEmpty()) { - tpaRequests.remove(playerUUID); - } - - return true; - } - - private boolean isFighter(Player player) { - return player.getWorld().getName().equals("town_world"); - } -} diff --git a/plugin2/src/main/java/com/eul4/plugin2/command/DelHomeCommand.java b/plugin2/src/main/java/com/eul4/plugin2/command/DelHomeCommand.java deleted file mode 100644 index 73bdb7e0..00000000 --- a/plugin2/src/main/java/com/eul4/plugin2/command/DelHomeCommand.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.eul4.plugin2.command; - -import com.eul4.plugin2.Main; -import lombok.RequiredArgsConstructor; -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.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.List; - -@RequiredArgsConstructor -public class DelHomeCommand implements TabExecutor -{ - private final Main plugin; - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) - { - return Collections.emptyList(); - } - - @Override - public boolean onCommand(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) - { - if (!(commandSender instanceof Player player)) - { - return true; - } - - String homeName = (args.length > 0) ? args[0] : "default"; - String playerUUID = player.getUniqueId().toString(); - String path = "homes." + playerUUID + "." + homeName; - - if (plugin.getConfig().contains(path)) - { - plugin.getConfig().set(path, null); - plugin.saveConfig(); - player.sendMessage(Component.text("Casa " + homeName + " deletada com sucesso.", NamedTextColor.GREEN)); - } - else - { - player.sendMessage(Component.text("A casa " + homeName + " não foi encontrada.", NamedTextColor.RED)); - } - - return true; - } -} diff --git a/plugin2/src/main/java/com/eul4/plugin2/command/HomeCommand.java b/plugin2/src/main/java/com/eul4/plugin2/command/HomeCommand.java deleted file mode 100644 index a1051dc1..00000000 --- a/plugin2/src/main/java/com/eul4/plugin2/command/HomeCommand.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.eul4.plugin2.command; - -import com.eul4.model.player.Fighter; -import com.eul4.plugin2.Main; -import lombok.RequiredArgsConstructor; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -@RequiredArgsConstructor -public class HomeCommand implements TabExecutor, Listener { - private final Main plugin; - private final Map teleportTasks = new HashMap<>(); - private final Map cooldowns = new HashMap<>(); - - private static final long COOLDOWN_TIME = 20 * 1000; // 20 seconds in milliseconds - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) { - return Collections.emptyList(); - } - - @Override - public boolean onCommand(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) { - if (!(commandSender instanceof Player player)) { - return true; - } - - if (isFighter(player)) { - player.sendMessage(Component.text("Voc\u00ea n\u00e3o pode usar esse comando porque est\u00e1 no mundo da Cidade Virtual. Digite /spawn para voltar.", NamedTextColor.RED)); - return true; - } - - UUID playerUUID = player.getUniqueId(); - - // Check for cooldown - if (cooldowns.containsKey(playerUUID)) { - long timeElapsed = System.currentTimeMillis() - cooldowns.get(playerUUID); - if (timeElapsed < COOLDOWN_TIME) { - long timeLeft = (COOLDOWN_TIME - timeElapsed) / 1000; - player.sendMessage(Component.text("Voc\u00ea precisa esperar " + timeLeft + " segundos antes de usar o comando novamente.", NamedTextColor.RED)); - return true; - } - } - - String homeName = (args.length > 0) ? args[0] : "default"; - String pathPrefix = "homes." + playerUUID + "." + homeName; - - if (plugin.getConfig().getConfigurationSection(pathPrefix) == null) { - player.sendMessage(Component.text("Casa n\u00e3o encontrada!", NamedTextColor.RED)); - return true; - } - - String worldName = plugin.getConfig().getString(pathPrefix + ".world"); - double x = plugin.getConfig().getDouble(pathPrefix + ".x"); - double y = plugin.getConfig().getDouble(pathPrefix + ".y"); - double z = plugin.getConfig().getDouble(pathPrefix + ".z"); - Location location = new Location(plugin.getServer().getWorld(worldName), x, y, z); - - Vector vector = player.getLocation().toVector(); - - player.sendMessage(Component.text("Fique parado por 5 segundos para ser teleportado.", NamedTextColor.GREEN)); - - BukkitRunnable teleportTask = new BukkitRunnable() { - int countdown = 5; - - @Override - public void run() { - if (!player.getLocation().toVector().equals(vector)) { - Optional.ofNullable(teleportTasks.remove(playerUUID)) - .ifPresent(lixeira -> player.sendActionBar(Component.text("Teleporte cancelado.", NamedTextColor.RED))); - return; - } - if (countdown > 0) { - player.sendActionBar(Component.text("Teleportando em " + countdown + " segundos...", NamedTextColor.YELLOW)); - countdown--; - } else { - player.teleport(location); - player.sendActionBar(Component.text("Voc\u00ea foi teleportado para sua casa!", NamedTextColor.GREEN)); - teleportTasks.remove(playerUUID); - cancel(); - } - } - }; - - teleportTasks.put(playerUUID, teleportTask); - teleportTask.runTaskTimer(plugin, 0L, 20L); - - // Set the cooldown - cooldowns.put(playerUUID, System.currentTimeMillis()); - - return true; - } - - @EventHandler - public void onEntityDamage(EntityDamageEvent event) { - if (event.getEntity() instanceof Player player) { - UUID playerUUID = player.getUniqueId(); - if (teleportTasks.containsKey(playerUUID)) { - teleportTasks.get(playerUUID).cancel(); - teleportTasks.remove(playerUUID); - player.sendActionBar(Component.text("Teleporte cancelado porque voc\u00ea foi atacado.", NamedTextColor.RED)); - } - } - } - - @EventHandler - public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { - if (event.getDamager() instanceof Player player) { - UUID playerUUID = player.getUniqueId(); - if (teleportTasks.containsKey(playerUUID)) { - teleportTasks.get(playerUUID).cancel(); - teleportTasks.remove(playerUUID); - player.sendActionBar(Component.text("Teleporte cancelado porque voc\u00ea atacou algu\u00e9m.", NamedTextColor.RED)); - } - } - - if (event.getEntity() instanceof Player player) { - UUID playerUUID = player.getUniqueId(); - if (teleportTasks.containsKey(playerUUID)) { - teleportTasks.get(playerUUID).cancel(); - teleportTasks.remove(playerUUID); - player.sendActionBar(Component.text("Teleporte cancelado porque voc\u00ea foi atacado.", NamedTextColor.RED)); - } - } - } - - private boolean isFighter(Player player) { - return player.getWorld().getName().equals("town_world"); - } -} diff --git a/plugin2/src/main/java/com/eul4/plugin2/command/ListHomesCommand.java b/plugin2/src/main/java/com/eul4/plugin2/command/ListHomesCommand.java deleted file mode 100644 index 572e1e26..00000000 --- a/plugin2/src/main/java/com/eul4/plugin2/command/ListHomesCommand.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.eul4.plugin2.command; - -import com.eul4.plugin2.Main; -import lombok.RequiredArgsConstructor; -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.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.List; -import java.util.Set; - -@RequiredArgsConstructor -public class ListHomesCommand implements TabExecutor -{ - private final Main plugin; - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) - { - return Collections.emptyList(); - } - - @Override - public boolean onCommand(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) - { - if (!(commandSender instanceof Player player)) - { - return true; - } - - String playerUUID = player.getUniqueId().toString(); - String pathPrefix = "homes." + playerUUID; - Set playerHomes = plugin.getConfig().getConfigurationSection(pathPrefix).getKeys(false); - - if (playerHomes.isEmpty()) - { - player.sendMessage(Component.text("Você não tem nenhuma casa registrada.", NamedTextColor.RED)); - } - else - { - player.sendMessage(Component.text("Suas casas:", NamedTextColor.GREEN)); - for (String home : playerHomes) - { - player.sendMessage(Component.text("- " + home, NamedTextColor.WHITE)); - } - } - - return true; - } -} diff --git a/plugin2/src/main/java/com/eul4/plugin2/command/SethomeCommand.java b/plugin2/src/main/java/com/eul4/plugin2/command/SethomeCommand.java deleted file mode 100644 index 464f56ff..00000000 --- a/plugin2/src/main/java/com/eul4/plugin2/command/SethomeCommand.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.eul4.plugin2.command; - -import com.eul4.model.player.Fighter; -import com.eul4.plugin2.Main; -import lombok.RequiredArgsConstructor; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Location; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.List; -import java.util.Set; - -@RequiredArgsConstructor -public class SethomeCommand implements TabExecutor { - private final Main plugin; - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) { - return Collections.emptyList(); - } - - @Override - public boolean onCommand(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) { - if (!(commandSender instanceof Player player)) { - return true; - } - - if (isFighter(player)) { - player.sendMessage(Component.text("Voc\u00ea n\u00e3o pode usar esse comando porque est\u00e1 no mundo da Cidade Virtual. Digite /spawn para voltar.", NamedTextColor.RED)); - return true; - } - - int maxHomes = 3; - String playerUUID = player.getUniqueId().toString(); - String homeName = (args.length > 0) ? args[0] : "default"; - String pathPrefix = "homes." + playerUUID; - - if (plugin.getConfig().getConfigurationSection(pathPrefix) == null) { - plugin.getConfig().createSection(pathPrefix); - } - - Set playerHomes = plugin.getConfig().getConfigurationSection(pathPrefix).getKeys(false); - - if (playerHomes.size() >= maxHomes && !playerHomes.contains(homeName)) { - player.sendMessage(Component.text("Voc\u00ea j\u00e1 ultrapassou o seu limite de casas!", NamedTextColor.RED)); - player.sendMessage(Component.text("Para adicionar uma nova, apague uma de suas casas com /delhome", NamedTextColor.RED)); - return true; - } - - Location location = player.getLocation(); - String path = pathPrefix + "." + homeName; - - plugin.getConfig().set(path + ".world", location.getWorld().getName()); - plugin.getConfig().set(path + ".x", location.getX()); - plugin.getConfig().set(path + ".y", location.getY()); - plugin.getConfig().set(path + ".z", location.getZ()); - plugin.saveConfig(); - - player.sendMessage(Component.text("Sua casa foi adicionada!", NamedTextColor.GREEN)); - - if (homeName.equals("default")) { - player.sendMessage( - Component.text("Para se teletransportar at\u00e9 sua casa, digite o comando ", NamedTextColor.GRAY) - .append(Component.text("/home", NamedTextColor.WHITE)) - ); - } else { - player.sendMessage( - Component.text("Para se teletransportar at\u00e9 sua casa, digite o comando ", NamedTextColor.GRAY) - .append(Component.text("/home ", NamedTextColor.WHITE)) - .append(Component.text(homeName, NamedTextColor.WHITE)) - ); - } - - return true; - } - - private boolean isFighter(Player player) { - return player.getWorld().getName().equals("town_world"); - } -} diff --git a/plugin2/src/main/java/com/eul4/plugin2/command/TpaCommand.java b/plugin2/src/main/java/com/eul4/plugin2/command/TpaCommand.java deleted file mode 100644 index 6ed4effb..00000000 --- a/plugin2/src/main/java/com/eul4/plugin2/command/TpaCommand.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.eul4.plugin2.command; - -import com.eul4.model.player.Fighter; -import com.eul4.plugin2.Main; -import lombok.RequiredArgsConstructor; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -@RequiredArgsConstructor -public class TpaCommand implements TabExecutor { - private final Main plugin; - private final Map> tpaRequests = new HashMap<>(); - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) { - return Collections.emptyList(); - } - - @Override - public boolean onCommand(@NotNull CommandSender commandSender, - @NotNull Command command, - @NotNull String alias, - @NotNull String[] args) { - if (!(commandSender instanceof Player player)) { - return true; - } - - if (isFighter(player)) { - player.sendMessage(Component.text("Voc\u00ea n\u00e3o pode usar esse comando porque est\u00e1 no mundo da Cidade Virtual. Digite /spawn para voltar.", NamedTextColor.RED)); - return true; - } - - if (args.length == 0) { - player.sendMessage(Component.text("Uso correto: /tpa ", NamedTextColor.RED)); - return true; - } - - Player target = Bukkit.getPlayer(args[0]); - if (target == null || !target.isOnline()) { - player.sendMessage(Component.text("Jogador n\u00e3o encontrado ou offline!", NamedTextColor.RED)); - return true; - } - - UUID playerUUID = player.getUniqueId(); - UUID targetUUID = target.getUniqueId(); - - tpaRequests.computeIfAbsent(targetUUID, k -> new HashMap<>()).put(playerUUID, System.currentTimeMillis() + 60000); - - target.sendMessage( - Component.text(player.getName(), NamedTextColor.GREEN) - .append(Component.text(" enviou uma solicita\u00e7\u00e3o de teleporte para voc\u00ea. Use ", NamedTextColor.YELLOW)) - .append(Component.text("/aceitartpa " + player.getName(), NamedTextColor.GREEN)) - .append(Component.text(" para aceitar. (expira em 60 segundos)", NamedTextColor.YELLOW)) - ); - - player.sendMessage(Component.text("Solicita\u00e7\u00e3o de teleporte enviada para " + target.getName(), NamedTextColor.GREEN)); - - new BukkitRunnable() { - @Override - public void run() { - if (tpaRequests.containsKey(targetUUID) && tpaRequests.get(targetUUID).containsKey(playerUUID)) { - tpaRequests.get(targetUUID).remove(playerUUID); - if (tpaRequests.get(targetUUID).isEmpty()) { - tpaRequests.remove(targetUUID); - } - player.sendMessage(Component.text("Sua solicita\u00e7\u00e3o de teleporte para " + target.getName() + " expirou.", NamedTextColor.RED)); - target.sendMessage(Component.text("A solicita\u00e7\u00e3o de teleporte de " + player.getName() + " expirou.", NamedTextColor.RED)); - } - } - }.runTaskLater(plugin, 1200L); // 1200 ticks = 60 seconds - - return true; - } - - public Map> getTpaRequests() { - return tpaRequests; - } - - private boolean isFighter(Player player) { - return player.getWorld().getName().equals("town_world"); - } -} diff --git a/plugin2/src/main/java/com/eul4/plugin2/command/Util.java b/plugin2/src/main/java/com/eul4/plugin2/command/Util.java deleted file mode 100644 index 3419c6d6..00000000 --- a/plugin2/src/main/java/com/eul4/plugin2/command/Util.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.eul4.plugin2.command; - -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; - -public class Util { - public static Component arruma(String message) - { - return LegacyComponentSerializer.legacySection().deserialize(message); - } -} diff --git a/plugin2/src/main/resources/plugin.yml b/plugin2/src/main/resources/plugin.yml deleted file mode 100644 index a58dea69..00000000 --- a/plugin2/src/main/resources/plugin.yml +++ /dev/null @@ -1,9 +0,0 @@ -name: Plugin2 -main: com.eul4.plugin2.Main -version: 1.0 -author: Eul4 -api-version: '1.21' -depend: [ProtocolLib, Plugin] -commands: - tpa: - aceitartpa: \ No newline at end of file diff --git a/reset-towns-local.sh b/reset-towns-local.sh deleted file mode 100755 index 4ad938e5..00000000 --- a/reset-towns-local.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -SCRIPT_DIR=$(dirname "$(realpath "$0")") - -echo "Diretório é $SCRIPT_DIR" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/world/" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/world_nether/" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/world_the_end/" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/newbie_world/" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/newbie_world_nether/" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/newbie_world_the_end/" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/town_world/" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/plugins/Plugin/permission/" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/plugins/Plugin/player_data/" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/plugins/Plugin/towns.dat" -rm -rf "$SCRIPT_DIR/local/cidade-virtual/server/plugins/Plugin/block_data" diff --git a/reset-towns-remote.sh b/reset-towns-remote.sh deleted file mode 100755 index 43277b1c..00000000 --- a/reset-towns-remote.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -ssh -t "$1"@"$2" /bin/bash -ic "reset-towns" \ No newline at end of file diff --git a/scp.sh b/scp.sh deleted file mode 100755 index 1d76a4c0..00000000 --- a/scp.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -echo "ECHO" -echo "$1" "$2"@"$3":"$4" - -scp "$1" "$2"@"$3":"$4" \ No newline at end of file diff --git a/start-remote.sh b/start-remote.sh deleted file mode 100755 index a0995eff..00000000 --- a/start-remote.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -ssh -t "$1"@"$2" /bin/bash -ic "docker\ start\ $3" \ No newline at end of file diff --git a/stop-local.sh b/stop-local.sh deleted file mode 100755 index dbfd7ca5..00000000 --- a/stop-local.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -printf '\nstop\n' | socat EXEC:"docker attach cidade-virtual",pty STDIN \ No newline at end of file diff --git a/stop-remote.sh b/stop-remote.sh deleted file mode 100755 index 295502c2..00000000 --- a/stop-remote.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -ssh -t "$1"@"$2" /bin/bash -ic "stop\ $3" \ No newline at end of file