diff --git a/README.MD b/README.MD index fc0eb31..65f40b1 100644 --- a/README.MD +++ b/README.MD @@ -2,7 +2,7 @@ [![Codacy Badge](https://app.codacy.com/project/badge/Grade/5113aa86f46b45caa40bdfd8508bcd3e)](https://www.codacy.com/gh/GilbertoKPL/TotalEssentials/dashboard?utm_source=github.com&utm_medium=referral&utm_content=GilbertoKPL/TotalEssentials&utm_campaign=Badge_Grade) -* A core system for minecraft server that supports most versions (1.5.2 - 1.19.2), using only database as a storage +* A core system for minecraft server that supports most versions (1.5.2 - 1.20.2), using only database as a storage medium and various built-in commands / systems, which can be disabled at any time. # Bstats @@ -58,7 +58,7 @@ | /changepass | change pass of account. | totalessentials.commands.changepass | | /vip | vip system. | totalessentials.commands.vip | | /shop and /loja | players shops. | totalessentials.commands.shop | -| /clearitems | clear all items in server (with config). | totalessentials.commands.clearitems | +| /clearentities | clear all items in server (with config). | totalessentials.commands.clearitems | ## Permission Color @@ -144,7 +144,12 @@ To use in chat, commands, signs etc. ## TODO List -- [ ] Add support of version Checker for a Windows. +- [ X ] Add support of version Checker for a Windows. +- [ X ] Add Support to H2 DataBase. +- [ X ] Create CacheSQL to more powerful speed. +- [ X ] Create reload system. +- [ X ] Create auto config system with comments. +- [ X ] Create auto lang system with comments. # Discord diff --git a/build.gradle.kts b/build.gradle.kts index 873a739..d8b7c67 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,13 +1,13 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - kotlin("jvm") version "1.9.21" + kotlin("jvm") version "1.9.22" id("com.github.johnrengelman.shadow") version "8.1.1" } val base = "github.gilbertokpl.library" -version = "1.1.1" +version = "1.1.2" repositories { @@ -29,7 +29,7 @@ dependencies { compileOnly(fileTree(mapOf("dir" to "$buildDir\\..\\localjar", "include" to listOf("*.jar")))) //spigot - compileOnly("org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT") { + compileOnly("org.spigotmc:spigot-api:1.19.2-R0.1-SNAPSHOT") { exclude("commons-lang", "commons-lang") exclude("commons-io", "commons-io") exclude("org.yaml", "snakeyaml") @@ -39,17 +39,17 @@ dependencies { //exposed - compileOnly("org.jetbrains.exposed:exposed-core:0.45.0") { + compileOnly("org.jetbrains.exposed:exposed-core:0.47.0") { exclude("org.slf4j", "slf4j-api") exclude("org.slf4j", "jcl-over-slf4j") } - compileOnly("org.jetbrains.exposed:exposed-dao:0.45.0") { + compileOnly("org.jetbrains.exposed:exposed-dao:0.47.0") { exclude("org.slf4j", "slf4j-api") exclude("org.slf4j", "jcl-over-slf4j") } - compileOnly("org.jetbrains.exposed:exposed-jdbc:0.45.0") { + compileOnly("org.jetbrains.exposed:exposed-jdbc:0.47.0") { exclude("org.slf4j", "slf4j-api") exclude("org.slf4j", "jcl-over-slf4j") } @@ -82,23 +82,23 @@ dependencies { } //host info - compileOnly("com.github.oshi:oshi-core:6.4.8") { + compileOnly("com.github.oshi:oshi-core:6.4.12") { exclude("org.slf4j", "slf4j-api") exclude("org.slf4j", "jcl-over-slf4j") } - compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.21") { + compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.22") { exclude("org.slf4j", "slf4j-api") exclude("org.slf4j", "jcl-over-slf4j") } - compileOnly("net.dv8tion:JDA:5.0.0-beta.18") { + compileOnly("net.dv8tion:JDA:5.0.0-beta.20") { exclude("club.minnced","opus-java") exclude("org.slf4j", "slf4j-api") exclude("org.slf4j", "jcl-over-slf4j") } - compileOnly("org.json:json:20231013") { + compileOnly("org.json:json:20240205") { exclude("org.slf4j", "slf4j-api") exclude("org.slf4j", "jcl-over-slf4j") } @@ -109,6 +109,15 @@ tasks.shadowJar { archiveFileName.set(rootProject.name + "-" + project.version.toString() + ".jar") destinationDirectory.set(File("$projectDir/jar/plugins")) + manifest { + attributes( + "Plugin-Version" to project.version.toString(), + "Plugin-Creator" to "Gilberto", + "Plugin-Name" to "EssentialsK", + "Plugin-Github" to "https://github.com/GilbertoKPL/TotalEssentials", + "Class-Path" to "TotalEssentials/lib/TotalEssentials-lib-1.1.1.jar" + ) + } //relocate all libs diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3a47f67..e846b64 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file diff --git a/src/main/java/github/gilbertokpl/total/TotalEssentialsJava.java b/src/main/java/github/gilbertokpl/total/TotalEssentialsJava.java index 38bbb17..c2b380a 100644 --- a/src/main/java/github/gilbertokpl/total/TotalEssentialsJava.java +++ b/src/main/java/github/gilbertokpl/total/TotalEssentialsJava.java @@ -3,7 +3,7 @@ import github.gilbertokpl.core.external.CorePlugin; import github.gilbertokpl.total.cache.internal.InternalLoader; import github.gilbertokpl.total.cache.local.PlayerData; -import github.gilbertokpl.total.cache.loop.ClearItemsLoop; +import github.gilbertokpl.total.cache.loop.ClearEntitiesLoop; import github.gilbertokpl.total.cache.loop.PluginLoop; import github.gilbertokpl.total.cache.sql.*; import github.gilbertokpl.total.config.files.LangConfig; @@ -25,6 +25,7 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.security.CodeSource; +import java.util.Arrays; import java.util.Enumeration; import java.util.Objects; import java.util.jar.*; @@ -93,6 +94,7 @@ public void onLoad() { File file = new File(newPath); + classPath = newPath.replace("plugins/", ""); if (!file.exists()) { @@ -107,7 +109,7 @@ public void onLoad() { update = true; } } catch (IOException e) { - throw new RuntimeException(e); + Bukkit.getServer().getLogger().severe("Você está utilizando Windowns Algumas funcionalidades do plugin não irão funcionar!"); } if (update || libModify) { @@ -151,7 +153,12 @@ public void onEnable() { ) ); - permission = Bukkit.getServer().getServicesManager().getRegistration(Permission.class).getProvider(); + try { + permission = Bukkit.getServer().getServicesManager().getRegistration(Permission.class).getProvider(); + } + catch (NoClassDefFoundError e) { + instance.getLogger().severe("Falta instalar VAULT, o addon de VIP não ira funcionar direito!"); + } InternalLoader.INSTANCE.start( MainConfig.announcementsListAnnounce, @@ -171,7 +178,7 @@ public void onEnable() { Discord.INSTANCE.sendDiscordMessage(LangConfig.discordchatServerStart, true); } - ClearItemsLoop.INSTANCE.start(); + ClearEntitiesLoop.INSTANCE.start(); PluginLoop.INSTANCE.start(); @@ -185,24 +192,25 @@ public void onDisable() { for (Player p : basePlugin.getReflection().getPlayers()) { if (MainConfig.playtimeActivated) { - if (PlayerData.INSTANCE.getPlayTimeCache().get(p) != null) { - long time = PlayerData.INSTANCE.getPlayTimeCache().get(p) != null ? PlayerData.INSTANCE.getPlayTimeCache().get(p) : 0L; - long timePlayed = PlayerData.INSTANCE.getPlaytimeLocal().get(p) != null ? PlayerData.INSTANCE.getPlayTimeCache().get(p) : 0L; + long currentTimeMillis = System.currentTimeMillis(); - long newTime = time + (System.currentTimeMillis() - timePlayed); + Long playTimeCacheValue = PlayerData.INSTANCE.getPlayTimeCache().get(p); + long time = (playTimeCacheValue != null) ? playTimeCacheValue : 0L; - if (time > 94608000000L) { - newTime = time; - } + Long playtimeLocalValue = PlayerData.INSTANCE.getPlaytimeLocal().get(p); + long timePlayed = (playtimeLocalValue != null) ? playtimeLocalValue : 0L; - if (newTime > 94608000000L) { - newTime = 518400000L; - } + long newTime = time + (currentTimeMillis - timePlayed); + + if (time > 94608000000L) { + newTime = time; + } - PlayerData.INSTANCE.getPlayTimeCache().set(p, newTime); - } else { - PlayerData.INSTANCE.getPlayTimeCache().set(p, 0L); + if (newTime > 94608000000L) { + newTime = 518400000L; } + + PlayerData.INSTANCE.getPlayTimeCache().set(p, newTime); PlayerData.INSTANCE.getPlaytimeLocal().set(p, 0L); } } diff --git a/src/main/java/github/gilbertokpl/total/config/files/MainConfig.java b/src/main/java/github/gilbertokpl/total/config/files/MainConfig.java index 5a0d8bb..625a3fa 100644 --- a/src/main/java/github/gilbertokpl/total/config/files/MainConfig.java +++ b/src/main/java/github/gilbertokpl/total/config/files/MainConfig.java @@ -286,10 +286,10 @@ public class MainConfig implements DefaultConfig { ) public static Boolean craftActivated = true; - //clearItemsCommand + //clearEntitiesCommand @PrimaryComments( { - @PrimaryComment(primaryAnnotations = "Configurações dos comandos kits", lang = LangTypes.PT_BR), + @PrimaryComment(primaryAnnotations = "Configurações dos comando clear items", lang = LangTypes.PT_BR), @PrimaryComment(primaryAnnotations = "Kit command settings", lang = LangTypes.EN_US) } ) @@ -299,28 +299,28 @@ public class MainConfig implements DefaultConfig { @Comment(annotations = "If enabled (true), The command will be actived.", lang = LangTypes.EN_US) } ) - public static Boolean clearitemsActivated = true; + public static Boolean clearentitiesActivated = true; @Comments( { @Comment(annotations = "Lista de mundos para limpar o chão.", lang = LangTypes.PT_BR), @Comment(annotations = "", lang = LangTypes.EN_US) } ) - public static List clearitemsWorlds = Collections.singletonList("world"); + public static List clearentitiesWorlds = Collections.singletonList("world"); @Comments( { @Comment(annotations = "Lista de items para não excluir em material, para pegar o material > /material.", lang = LangTypes.PT_BR), @Comment(annotations = "", lang = LangTypes.EN_US) } ) - public static List clearitemsItemsNotClear = Collections.singletonList("dirt"); + public static List clearentitiesItemsNotClear = Collections.singletonList("dirt"); @Comments( { @Comment(annotations = "Tempo em minutos para executar um limpar chão", lang = LangTypes.PT_BR), @Comment(annotations = "", lang = LangTypes.EN_US) } ) - public static Integer clearitemsTime = 10; + public static Integer clearentitiesTime = 10; //kitCommand @PrimaryComments( @@ -365,6 +365,14 @@ public class MainConfig implements DefaultConfig { ) public static Boolean kitsEquipArmorInCatch = true; + @Comments( + { + @Comment(annotations = "Se estiver ativado (true), será enviado ao player os kits disponiveis para pegar ao logar.", lang = LangTypes.PT_BR), + @Comment(annotations = "jkl", lang = LangTypes.EN_US) + } + ) + public static Boolean kitsSendAvailableKitsOnLogin = true; + //homeCommand @PrimaryComments( { diff --git a/src/main/kotlin/github/gilbertokpl/core/external/cache/Cache.kt b/src/main/kotlin/github/gilbertokpl/core/external/cache/Cache.kt index 6ec55a2..20840ec 100644 --- a/src/main/kotlin/github/gilbertokpl/core/external/cache/Cache.kt +++ b/src/main/kotlin/github/gilbertokpl/core/external/cache/Cache.kt @@ -124,24 +124,28 @@ class Cache(core: CorePlugin) { } } Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay({ - try { - transaction(corePlugin.sql) { - for (i in toByteUpdate) { - try { - i.update() - } catch (e: Exception) { - Bukkit.getServer().shutdown() - e.printStackTrace() - } - } - } - } catch (e: Exception) { - Bukkit.getServer().shutdown() - e.printStackTrace() - } + save() }, 5, 5, TimeUnit.MINUTES) } val toByteUpdate = ArrayList>() + fun save() { + try { + transaction(corePlugin.sql) { + for (i in toByteUpdate) { + try { + i.update() + } catch (e: Exception) { + Bukkit.getServer().shutdown() + e.printStackTrace() + } + } + } + } catch (e: Exception) { + Bukkit.getServer().shutdown() + e.printStackTrace() + } + } + } \ No newline at end of file diff --git a/src/main/kotlin/github/gilbertokpl/core/external/command/CommandCreator.kt b/src/main/kotlin/github/gilbertokpl/core/external/command/CommandCreator.kt index f22ecad..99a83c0 100644 --- a/src/main/kotlin/github/gilbertokpl/core/external/command/CommandCreator.kt +++ b/src/main/kotlin/github/gilbertokpl/core/external/command/CommandCreator.kt @@ -3,11 +3,11 @@ package github.gilbertokpl.core.external.command import github.gilbertokpl.core.external.CorePlugin import github.gilbertokpl.core.external.command.interfaces.CommandBase import github.gilbertokpl.core.internal.command.InternalCommand -import org.bukkit.command.Command import org.bukkit.command.CommandSender +import org.bukkit.command.defaults.BukkitCommand import org.bukkit.entity.Player -abstract class CommandCreator(name: String) : Command(name), CommandBase { +abstract class CommandCreator(name: String) : BukkitCommand(name), CommandBase { private val internalCommand: InternalCommand = InternalCommand(this) diff --git a/src/main/kotlin/github/gilbertokpl/core/internal/cache/ByteCacheBuilder.kt b/src/main/kotlin/github/gilbertokpl/core/internal/cache/ByteCacheBuilder.kt index ae67b14..d19ddc9 100644 --- a/src/main/kotlin/github/gilbertokpl/core/internal/cache/ByteCacheBuilder.kt +++ b/src/main/kotlin/github/gilbertokpl/core/internal/cache/ByteCacheBuilder.kt @@ -28,7 +28,7 @@ internal class ByteCacheBuilder( override fun set(entity: String, value: T) { hashMap[entity.lowercase()] = value - toUpdate += entity.lowercase() + toUpdate.add(entity.lowercase()) } override fun set(entity: String, value: T, override: Boolean) { @@ -45,31 +45,32 @@ internal class ByteCacheBuilder( override fun remove(entity: String) { hashMap[entity.lowercase()] = null - if (entity.lowercase() in toUpdate) { - toUpdate.remove(entity.lowercase()) - } + toUpdate.add(entity.lowercase()) } private fun save(list: List) { - val currentHash = getMap() + if (toUpdate.isEmpty()) return + val existingRows = table.select { primaryColumn inList toUpdate }.toList().associateBy { it[primaryColumn] } + for (i in list) { if (i in toUpdate) { toUpdate.remove(i) - val tab = table.select { primaryColumn eq i } - val value = currentHash[i] - if (tab.empty()) { - if (value == null) continue - table.insert { - it[primaryColumn] = i - it[column] = value + val value = hashMap[i] + + if (value == null) { + existingRows[i]?.let { row -> + table.deleteWhere { primaryColumn eq row[primaryColumn] } } } else { - if (value == null) { - table.deleteWhere { primaryColumn eq i } - continue - } - table.update({ primaryColumn eq i }) { - it[column] = value + if (existingRows[i] == null) { + table.insert { + it[primaryColumn] = i + it[column] = value + } + } else { + table.update({ primaryColumn eq i }) { + it[column] = value + } } } } diff --git a/src/main/kotlin/github/gilbertokpl/core/internal/cache/HashMapCacheBuilder.kt b/src/main/kotlin/github/gilbertokpl/core/internal/cache/HashMapCacheBuilder.kt index ec3b004..f626387 100644 --- a/src/main/kotlin/github/gilbertokpl/core/internal/cache/HashMapCacheBuilder.kt +++ b/src/main/kotlin/github/gilbertokpl/core/internal/cache/HashMapCacheBuilder.kt @@ -35,16 +35,19 @@ internal class HashMapCacheBuilder( override fun set(entity: String, value: HashMap, override: Boolean) { if (override) { hashMap[entity.lowercase()] = value - } else { - set(entity, value) + toUpdate.add(entity.lowercase()) + return } + set(entity, value) + return } override operator fun set(entity: String, value: HashMap) { + val ent = hashMap[entity.lowercase()] ?: HashMap() ent.putAll(value) hashMap[entity.lowercase()] = ent - toUpdate += entity.lowercase() + toUpdate.add(entity.lowercase()) } override fun remove(entity: Player, value: V) { @@ -55,7 +58,7 @@ internal class HashMapCacheBuilder( val ent = hashMap[entity.lowercase()] ?: return ent.remove(value) hashMap[entity.lowercase()] = ent - toUpdate += entity.lowercase() + toUpdate.add(entity.lowercase()) } override fun remove(entity: Player) { @@ -64,30 +67,33 @@ internal class HashMapCacheBuilder( override fun remove(entity: String) { hashMap[entity.lowercase()] = null - toUpdate += entity.lowercase() + toUpdate.add(entity.lowercase()) } private fun save(list: List) { - val currentHash = hashMap + + if (toUpdate.isEmpty()) return + + val existingRows = table.select { primaryColumn inList toUpdate }.toList().associateBy { it[primaryColumn] } for (i in list) { toUpdate.remove(i) - val tab = table.select { primaryColumn eq i } - val value = currentHash[i] - - if (tab.empty()) { - if (value == null) continue - table.insert { - it[primaryColumn] = i - it[column] = classConvert.convertToDatabase(value) + val value = hashMap[i] + + if (value == null) { + existingRows[i]?.let { row -> + table.deleteWhere { primaryColumn eq row[primaryColumn] } } } else { - if (value == null) { - table.deleteWhere { primaryColumn eq i } - continue - } - table.update({ primaryColumn eq i }) { - it[column] = classConvert.convertToDatabase(value) + if (existingRows[i] == null) { + table.insert { + it[primaryColumn] = i + it[column] = classConvert.convertToDatabase(value) + } + } else { + table.update({ primaryColumn eq i }) { + it[column] = classConvert.convertToDatabase(value) + } } } } diff --git a/src/main/kotlin/github/gilbertokpl/core/internal/cache/ListCacheBuilder.kt b/src/main/kotlin/github/gilbertokpl/core/internal/cache/ListCacheBuilder.kt index 61cd916..a3cad91 100644 --- a/src/main/kotlin/github/gilbertokpl/core/internal/cache/ListCacheBuilder.kt +++ b/src/main/kotlin/github/gilbertokpl/core/internal/cache/ListCacheBuilder.kt @@ -37,9 +37,10 @@ internal class ListCacheBuilder( if (override) { hashMap[entity.lowercase()] = value toUpdate.add(entity.lowercase()) - } else { - set(entity, value) + return } + set(entity, value) + return } override operator fun set(entity: String, value: ArrayList) { @@ -74,26 +75,29 @@ internal class ListCacheBuilder( } private fun save(list: List) { - val currentHash = hashMap + + if (toUpdate.isEmpty()) return + + val existingRows = table.select { primaryColumn inList toUpdate }.toList().associateBy { it[primaryColumn] } for (i in list) { - val tab = table.select { primaryColumn eq i } toUpdate.remove(i) - val value = currentHash[i] + val value = hashMap[i] - if (tab.empty()) { - if (value == null) continue - table.insert { - it[primaryColumn] = i - it[column] = classConvert.convertToDatabase(value) + if (value == null) { + existingRows[i]?.let { row -> + table.deleteWhere { primaryColumn eq row[primaryColumn] } } } else { - if (value == null) { - table.deleteWhere { primaryColumn eq i } - continue - } - table.update({ primaryColumn eq i }) { - it[column] = classConvert.convertToDatabase(value) + if (existingRows[i] == null) { + table.insert { + it[primaryColumn] = i + it[column] = classConvert.convertToDatabase(value) + } + } else { + table.update({ primaryColumn eq i }) { + it[column] = classConvert.convertToDatabase(value) + } } } } diff --git a/src/main/kotlin/github/gilbertokpl/core/internal/cache/LocationCacheBuilder.kt b/src/main/kotlin/github/gilbertokpl/core/internal/cache/LocationCacheBuilder.kt index 0db9a94..5c1732d 100644 --- a/src/main/kotlin/github/gilbertokpl/core/internal/cache/LocationCacheBuilder.kt +++ b/src/main/kotlin/github/gilbertokpl/core/internal/cache/LocationCacheBuilder.kt @@ -5,6 +5,7 @@ import github.gilbertokpl.core.external.cache.interfaces.CacheBuilder import org.bukkit.Location import org.bukkit.entity.Player import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq internal class LocationCacheBuilder( private val table: Table, @@ -55,31 +56,33 @@ internal class LocationCacheBuilder( } private fun save(list: List) { - val currentHash = hashMap + + if (toUpdate.isEmpty()) return + + val existingRows = table.select { primaryColumn inList toUpdate }.toList().associateBy { it[primaryColumn] } for (i in list) { toUpdate.remove(i) - val tab = table.select { primaryColumn eq i } - val value = currentHash[i] - - if (tab.empty()) { - if (value == null) continue - table.insert { - it[primaryColumn] = i - it[column] = classConvert.convertToDatabase(value) + val value = hashMap[i] + + if (value == null) { + existingRows[i]?.let { row -> + table.deleteWhere { primaryColumn eq row[primaryColumn] } } } else { - if (value == null) { + if (existingRows[i] == null) { + table.insert { + it[primaryColumn] = i + it[column] = classConvert.convertToDatabase(value) + } + } else { table.update({ primaryColumn eq i }) { - it[column] = "" + it[column] = classConvert.convertToDatabase(value) } - continue - } - table.update({ primaryColumn eq i }) { - it[column] = classConvert.convertToDatabase(value) } } } + } override fun load() { diff --git a/src/main/kotlin/github/gilbertokpl/core/internal/utils/InternalReflection.kt b/src/main/kotlin/github/gilbertokpl/core/internal/utils/InternalReflection.kt index b97379e..71b0440 100644 --- a/src/main/kotlin/github/gilbertokpl/core/internal/utils/InternalReflection.kt +++ b/src/main/kotlin/github/gilbertokpl/core/internal/utils/InternalReflection.kt @@ -47,7 +47,7 @@ internal class InternalReflection(private val corePlugin: CorePlugin) { val bukkitCommandMap: Field = Bukkit.getServer().javaClass.getDeclaredField("commandMap") bukkitCommandMap.isAccessible = true val commandMap: CommandMap = bukkitCommandMap.get(Bukkit.getServer()) as CommandMap - commandMap.register("lunarFrame", command) + commandMap.register("TotalEssentials", command) } fun nameFieldHelper(field: Field): String { diff --git a/src/main/kotlin/github/gilbertokpl/total/cache/internal/DataTeleport.kt b/src/main/kotlin/github/gilbertokpl/total/cache/internal/DataTeleport.kt index 1d6baa9..5d64257 100644 --- a/src/main/kotlin/github/gilbertokpl/total/cache/internal/DataTeleport.kt +++ b/src/main/kotlin/github/gilbertokpl/total/cache/internal/DataTeleport.kt @@ -3,6 +3,7 @@ package github.gilbertokpl.total.cache.internal import github.gilbertokpl.total.config.files.LangConfig import github.gilbertokpl.total.util.TaskUtil import org.bukkit.entity.Player +import org.bukkit.scheduler.BukkitRunnable import java.util.concurrent.CompletableFuture import java.util.concurrent.TimeUnit @@ -54,6 +55,7 @@ internal data class DataTeleport( github.gilbertokpl.total.TotalEssentialsJava.instance.server.scheduler.runTask( github.gilbertokpl.total.TotalEssentialsJava.instance ) { + BukkitRunnable -> pSender.sendMessage( LangConfig.tpaRequestOtherDenyTime.replace( "%player%", diff --git a/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/EditKit.kt b/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/EditKit.kt index 535e79c..72f6b3c 100644 --- a/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/EditKit.kt +++ b/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/EditKit.kt @@ -21,7 +21,7 @@ internal object EditKit { ) private val CLOCK_ITEM = ItemUtil.item( - MaterialUtil["clock"] ?: Material.WATCH, + MaterialUtil["clock"] ?: Material.CLOCK, LangConfig.kitsEditKitInventoryTimeName, LangConfig.kitsEditKitInventoryTimeLore ) diff --git a/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Kit.kt b/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Kit.kt index 6f02c49..f905a00 100644 --- a/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Kit.kt +++ b/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Kit.kt @@ -39,7 +39,11 @@ internal object Kit { val meta = item.itemMeta item.amount = 1 - meta?.displayName = itemName + try { + ItemUtil.setDisplayName(meta, itemName) + } catch (e : NoSuchMethodError) { + meta?.setDisplayName(itemName) + } if (meta != null) { meta.lore = LangConfig.kitsInventoryItemsLore.map { it.replace("%realname%", kit.key) } } diff --git a/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Playtime.kt b/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Playtime.kt index 62beb00..8188450 100644 --- a/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Playtime.kt +++ b/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Playtime.kt @@ -91,7 +91,11 @@ object Playtime { val item = ItemStack(MaterialUtil["head"]!!, 1, SkullType.PLAYER.ordinal.toShort()) val meta = item.itemMeta - meta?.displayName = playerName + try { + ItemUtil.setDisplayName(meta, playerName) + } catch (e : NoSuchMethodError) { + meta?.setDisplayName(playerName) + } val itemLore = ArrayList(playtimeInventoryItemsLore.size) diff --git a/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Shop.kt b/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Shop.kt index 0898772..2c01da5 100644 --- a/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Shop.kt +++ b/src/main/kotlin/github/gilbertokpl/total/cache/internal/inventory/Shop.kt @@ -32,7 +32,11 @@ object Shop { val meta = item.itemMeta item.amount = 1 - meta?.displayName = name + try { + ItemUtil.setDisplayName(meta, name) + } catch (e : NoSuchMethodError) { + meta?.setDisplayName(name) + } val checkIfIsOpen = ShopData.shopOpen[shop.key] ?: false diff --git a/src/main/kotlin/github/gilbertokpl/total/cache/local/PlayerData.kt b/src/main/kotlin/github/gilbertokpl/total/cache/local/PlayerData.kt index 8d93140..11a3fbc 100644 --- a/src/main/kotlin/github/gilbertokpl/total/cache/local/PlayerData.kt +++ b/src/main/kotlin/github/gilbertokpl/total/cache/local/PlayerData.kt @@ -79,7 +79,7 @@ object PlayerData : CacheBase { val nick = nickCache[p] if (nick != "" && nick != p.displayName && p.hasPermission("totalessentials.commands.nick")) { - p.displayName = nick + PlayerUtil.setDisplayName(p, nick) } val gameModeName = PlayerUtil.getGameModeNumber(gameModeCache[p].toString()) diff --git a/src/main/kotlin/github/gilbertokpl/total/cache/local/WarpData.kt b/src/main/kotlin/github/gilbertokpl/total/cache/local/WarpData.kt index 3c4a9cb..b3333f0 100644 --- a/src/main/kotlin/github/gilbertokpl/total/cache/local/WarpData.kt +++ b/src/main/kotlin/github/gilbertokpl/total/cache/local/WarpData.kt @@ -19,7 +19,7 @@ object WarpData : CacheBase { } fun getWarpList(player: Player?): List { - val warpNames = warpLocation.getMap().keys.toList() + val warpNames = warpLocation.getMap().filterValues { it != null }.keys.toList() return if (player == null) { warpNames } else { diff --git a/src/main/kotlin/github/gilbertokpl/total/cache/loop/ClearItemsLoop.kt b/src/main/kotlin/github/gilbertokpl/total/cache/loop/ClearEntitiesLoop.kt similarity index 77% rename from src/main/kotlin/github/gilbertokpl/total/cache/loop/ClearItemsLoop.kt rename to src/main/kotlin/github/gilbertokpl/total/cache/loop/ClearEntitiesLoop.kt index 825bd9b..17a01c8 100644 --- a/src/main/kotlin/github/gilbertokpl/total/cache/loop/ClearItemsLoop.kt +++ b/src/main/kotlin/github/gilbertokpl/total/cache/loop/ClearEntitiesLoop.kt @@ -5,8 +5,8 @@ import github.gilbertokpl.total.util.TaskUtil import github.gilbertokpl.total.util.WorldUtil import java.util.concurrent.TimeUnit -object ClearItemsLoop { - private val CLEAR_ITEMS_INTERVAL_MINUTES = MainConfig.clearitemsTime.toLong() +object ClearEntitiesLoop { + private val CLEAR_ITEMS_INTERVAL_MINUTES = MainConfig.clearentitiesTime.toLong() fun start() { TaskUtil.getInternalExecutor().scheduleWithFixedDelay( ::clearItems, @@ -17,6 +17,6 @@ object ClearItemsLoop { } private fun clearItems() { - WorldUtil.clearItems() + WorldUtil.clearEntities() } } \ No newline at end of file diff --git a/src/main/kotlin/github/gilbertokpl/total/commands/CommandClearItems.kt b/src/main/kotlin/github/gilbertokpl/total/commands/CommandClearEntities.kt similarity index 72% rename from src/main/kotlin/github/gilbertokpl/total/commands/CommandClearItems.kt rename to src/main/kotlin/github/gilbertokpl/total/commands/CommandClearEntities.kt index 2779b90..f14b729 100644 --- a/src/main/kotlin/github/gilbertokpl/total/commands/CommandClearItems.kt +++ b/src/main/kotlin/github/gilbertokpl/total/commands/CommandClearEntities.kt @@ -6,26 +6,26 @@ import github.gilbertokpl.total.config.files.MainConfig import github.gilbertokpl.total.util.WorldUtil import org.bukkit.command.CommandSender -class CommandClearItems : github.gilbertokpl.core.external.command.CommandCreator("clearitems") { +class CommandClearEntities : github.gilbertokpl.core.external.command.CommandCreator("clearentities") { override fun commandPattern(): CommandPattern { return CommandPattern( aliases = listOf("limparchao"), - active = MainConfig.clearitemsActivated, + active = MainConfig.clearentitiesActivated, target = CommandTarget.ALL, countdown = 0, - permission = "totalessentials.commands.clearitems", + permission = "totalessentials.commands.clearentities", minimumSize = 0, maximumSize = 0, usage = listOf( - "/limpachao", + "/limparchao", ) ) } override fun funCommand(s: CommandSender, label: String, args: Array): Boolean { - WorldUtil.clearItems() + WorldUtil.clearEntities() return false } diff --git a/src/main/kotlin/github/gilbertokpl/total/commands/CommandHat.kt b/src/main/kotlin/github/gilbertokpl/total/commands/CommandHat.kt index 0886f92..621e0cd 100644 --- a/src/main/kotlin/github/gilbertokpl/total/commands/CommandHat.kt +++ b/src/main/kotlin/github/gilbertokpl/total/commands/CommandHat.kt @@ -4,6 +4,7 @@ import github.gilbertokpl.core.external.command.CommandTarget import github.gilbertokpl.core.external.command.annotations.CommandPattern import github.gilbertokpl.total.config.files.LangConfig import github.gilbertokpl.total.config.files.MainConfig +import github.gilbertokpl.total.util.PlayerUtil import org.bukkit.Material import org.bukkit.command.CommandSender import org.bukkit.entity.Player @@ -43,11 +44,7 @@ class CommandHat : github.gilbertokpl.core.external.command.CommandCreator("hat" p.inventory.helmet = itemHand - try { - p.inventory.itemInMainHand = helmet - } catch (e: NoSuchMethodError) { - p.itemInHand = helmet - } + PlayerUtil.setItemInMainHand(p, helmet) p.sendMessage(LangConfig.hatSuccess) diff --git a/src/main/kotlin/github/gilbertokpl/total/commands/CommandNick.kt b/src/main/kotlin/github/gilbertokpl/total/commands/CommandNick.kt index 1ba46d2..226116d 100644 --- a/src/main/kotlin/github/gilbertokpl/total/commands/CommandNick.kt +++ b/src/main/kotlin/github/gilbertokpl/total/commands/CommandNick.kt @@ -7,6 +7,7 @@ import github.gilbertokpl.total.config.files.LangConfig import github.gilbertokpl.total.config.files.MainConfig import github.gilbertokpl.total.util.MainUtil import github.gilbertokpl.total.util.PermissionUtil +import github.gilbertokpl.total.util.PlayerUtil import org.bukkit.command.CommandSender import org.bukkit.entity.Player @@ -57,7 +58,7 @@ class CommandNick : github.gilbertokpl.core.external.command.CommandCreator("nic PlayerData.nickCache[s] = "" - s.displayName = s.name + PlayerUtil.setDisplayName(s, s.name) s.sendMessage(LangConfig.nicksRemovedSuccess) return false @@ -116,7 +117,7 @@ class CommandNick : github.gilbertokpl.core.external.command.CommandCreator("nic } PlayerData.nickCache[p] = "" - p.displayName = p.name + PlayerUtil.setDisplayName(p, p.name) s.sendMessage(LangConfig.nicksRemovedOtherSuccess) p.sendMessage(LangConfig.nicksRemovedOtherPlayerSuccess) @@ -148,7 +149,7 @@ class CommandNick : github.gilbertokpl.core.external.command.CommandCreator("nic return true } } - player.displayName = newNick + PlayerUtil.setDisplayName(player, newNick) PlayerData.nickCache[player] = newNick return false } diff --git a/src/main/kotlin/github/gilbertokpl/total/commands/CommandTotal.kt b/src/main/kotlin/github/gilbertokpl/total/commands/CommandTotal.kt index 7e8b069..b3444cb 100644 --- a/src/main/kotlin/github/gilbertokpl/total/commands/CommandTotal.kt +++ b/src/main/kotlin/github/gilbertokpl/total/commands/CommandTotal.kt @@ -1,5 +1,6 @@ package github.gilbertokpl.total.commands +import github.gilbertokpl.core.external.cache.Cache import github.gilbertokpl.core.external.command.CommandTarget import github.gilbertokpl.core.external.command.annotations.CommandPattern import github.gilbertokpl.total.TotalEssentialsJava @@ -31,7 +32,8 @@ class CommandTotal : github.gilbertokpl.core.external.command.CommandCreator("to "/total host", "/total plugin ", "C_/total reset", - "P_/total id" + "P_/total id", + "/total save" ) ) } @@ -180,7 +182,11 @@ class CommandTotal : github.gilbertokpl.core.external.command.CommandCreator("to return false } - + if (args[0].lowercase() == "save") { + TotalEssentialsJava.basePlugin.getCache().save() + s.sendMessage("salvo") + return false + } return true } } diff --git a/src/main/kotlin/github/gilbertokpl/total/listeners/EntityDamageEntity.kt b/src/main/kotlin/github/gilbertokpl/total/listeners/EntityDamageEntity.kt index 987c254..49d75c6 100644 --- a/src/main/kotlin/github/gilbertokpl/total/listeners/EntityDamageEntity.kt +++ b/src/main/kotlin/github/gilbertokpl/total/listeners/EntityDamageEntity.kt @@ -81,7 +81,6 @@ class EntityDamageEntity : Listener { val field: Field = EntityDamageEvent::class.java.getDeclaredField("damage") field.isAccessible = true damage = field.getDouble(e) - println(damage) } catch (ex: NoSuchFieldException) { damage = e.damage entityHealth = entity.health @@ -102,9 +101,6 @@ class EntityDamageEntity : Listener { method.isAccessible = true val maxHealth = (method.invoke(entity) as Int) - - println(maxHealth) - val method1: Method = Damageable::class.java.getDeclaredMethod("setHealth", Int::class.javaPrimitiveType) method1.isAccessible = true method1.invoke(entity, maxHealth) diff --git a/src/main/kotlin/github/gilbertokpl/total/listeners/EntityDeath.kt b/src/main/kotlin/github/gilbertokpl/total/listeners/EntityDeath.kt index 52a83f8..9806a53 100644 --- a/src/main/kotlin/github/gilbertokpl/total/listeners/EntityDeath.kt +++ b/src/main/kotlin/github/gilbertokpl/total/listeners/EntityDeath.kt @@ -44,9 +44,10 @@ class EntityDeath : Listener { try { val entityId = livingEntity.type.typeId.toInt() - val newEntity = livingEntity.world.spawnEntity(livingEntity.location, EntityType.fromId(entityId)) + val newEntity = EntityType.fromId(entityId) + ?.let { livingEntity.world.spawnEntity(livingEntity.location, it) } - newEntity.setMetadata("mob_id", FixedMetadataValue(instance, entityId)) + newEntity?.setMetadata("mob_id", FixedMetadataValue(instance, entityId)) var name = livingEntity.toString().replace("Craft", "") MainConfig.stackmobsNameReplacer @@ -54,7 +55,9 @@ class EntityDeath : Listener { name = it } - StackMobsUtil.mobCreate(newEntity, stackSize - 1, name) + if (newEntity != null) { + StackMobsUtil.mobCreate(newEntity, stackSize - 1, name) + } } catch (ex: Exception) { ex.printStackTrace() } diff --git a/src/main/kotlin/github/gilbertokpl/total/listeners/InventoryClick.kt b/src/main/kotlin/github/gilbertokpl/total/listeners/InventoryClick.kt index f85c608..f5386e3 100644 --- a/src/main/kotlin/github/gilbertokpl/total/listeners/InventoryClick.kt +++ b/src/main/kotlin/github/gilbertokpl/total/listeners/InventoryClick.kt @@ -362,13 +362,17 @@ class InventoryClick : Listener { if (oldMeta.hasDisplayName()) { val oldName = oldMeta.displayName.replace("§", "") if (name == oldName) { - meta.displayName = oldMeta.displayName + try { + ItemUtil.setDisplayName(meta, oldMeta.displayName) + } catch (e: NoSuchMethodError) { + meta.setDisplayName(oldMeta.displayName) + } item.itemMeta = meta e.currentItem = item return } } - meta.displayName = PermissionUtil.colorPermission(e.whoClicked as Player, name) + ItemUtil.setDisplayName(meta, PermissionUtil.colorPermission(e.whoClicked as Player, name)) item.itemMeta = meta e.currentItem = item } diff --git a/src/main/kotlin/github/gilbertokpl/total/listeners/PlayerKickEvent.kt b/src/main/kotlin/github/gilbertokpl/total/listeners/PlayerKickEvent.kt index 429021d..32faf8f 100644 --- a/src/main/kotlin/github/gilbertokpl/total/listeners/PlayerKickEvent.kt +++ b/src/main/kotlin/github/gilbertokpl/total/listeners/PlayerKickEvent.kt @@ -11,7 +11,6 @@ class PlayerKickEvent : Listener { @EventHandler(priority = EventPriority.HIGH) fun kick(e: PlayerKickEvent) { if (TotalEssentialsJava.lowVersion) { - e.leaveMessage = null } } } \ No newline at end of file diff --git a/src/main/kotlin/github/gilbertokpl/total/util/ItemUtil.kt b/src/main/kotlin/github/gilbertokpl/total/util/ItemUtil.kt index 91fd429..d19f76f 100644 --- a/src/main/kotlin/github/gilbertokpl/total/util/ItemUtil.kt +++ b/src/main/kotlin/github/gilbertokpl/total/util/ItemUtil.kt @@ -7,8 +7,11 @@ import github.gilbertokpl.total.config.files.MainConfig import org.bukkit.Material import org.bukkit.enchantments.Enchantment import org.bukkit.entity.Player +import org.bukkit.event.entity.EntityDamageEvent import org.bukkit.inventory.ItemFlag import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.meta.ItemMeta +import java.lang.reflect.Field internal object ItemUtil { @@ -164,6 +167,21 @@ internal object ItemUtil { return true } + var usage = false + fun setDisplayName(meta: ItemMeta?, name: String) { + if (!usage) { + try { + meta?.setDisplayName(name) + return + } catch (e: NoSuchMethodError) { + usage = true + } + } + val field: Field = ItemMeta::class.java.getDeclaredField("displayName") + field.isAccessible = true + field.set(meta, name) + } + fun item(material: Material, name: String, lore: List, effect: Boolean = false): ItemStack { val item = ItemStack(material) if (effect) { @@ -174,7 +192,12 @@ internal object ItemUtil { } val meta = item.itemMeta meta?.lore = lore - meta?.displayName = name + try { + setDisplayName(meta, name) + } + catch (e : NoSuchMethodError) { + meta?.setDisplayName(name) + } if (effect) { try { meta?.addItemFlags(ItemFlag.HIDE_ENCHANTS) @@ -194,7 +217,12 @@ internal object ItemUtil { } } val meta = item.itemMeta - meta?.displayName = name + try { + setDisplayName(meta, name) + } + catch (e : NoSuchMethodError) { + meta?.setDisplayName(name) + } if (effect) { try { meta?.addItemFlags(ItemFlag.HIDE_ENCHANTS) diff --git a/src/main/kotlin/github/gilbertokpl/total/util/MaterialUtil.kt b/src/main/kotlin/github/gilbertokpl/total/util/MaterialUtil.kt index b9f20cd..e844359 100644 --- a/src/main/kotlin/github/gilbertokpl/total/util/MaterialUtil.kt +++ b/src/main/kotlin/github/gilbertokpl/total/util/MaterialUtil.kt @@ -17,6 +17,7 @@ internal object MaterialUtil { materialHelper(listOf("SOIL", "SOUL_SOIL")) material["head"] = materialHelper(listOf("PLAYER_HEAD", "SKULL_ITEM")) + } private fun materialHelper(material: List): Material { diff --git a/src/main/kotlin/github/gilbertokpl/total/util/PlayerUtil.kt b/src/main/kotlin/github/gilbertokpl/total/util/PlayerUtil.kt index a408714..6a3a5e5 100644 --- a/src/main/kotlin/github/gilbertokpl/total/util/PlayerUtil.kt +++ b/src/main/kotlin/github/gilbertokpl/total/util/PlayerUtil.kt @@ -8,10 +8,14 @@ import github.gilbertokpl.total.config.files.LangConfig import github.gilbertokpl.total.config.files.MainConfig import org.bukkit.GameMode import org.bukkit.Location +import org.bukkit.entity.Item import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.meta.ItemMeta import org.json.JSONObject import java.io.BufferedReader import java.io.InputStreamReader +import java.lang.reflect.Field import java.net.URL import java.nio.charset.StandardCharsets @@ -188,4 +192,33 @@ internal object PlayerUtil { } + var usage = false + fun setDisplayName(p: Player, nick: String?) { + if (!usage) { + try { + p.setDisplayName(nick) + return + } catch (e: NoSuchMethodError) { + usage = true + } + } + val field: Field = Player::class.java.getDeclaredField("displayName") + field.isAccessible = true + field.set(p, nick) + } + private var usage1 = false + fun setItemInMainHand(p: Player, item : ItemStack?) { + if (!usage1) { + try { + p.setItemInHand(item) + return + } catch (e: NoSuchMethodError) { + usage1 = true + } + } + val field: Field = Player::class.java.getDeclaredField("itemInHand") + field.isAccessible = true + field.set(p, item) + } + } diff --git a/src/main/kotlin/github/gilbertokpl/total/util/VipUtil.kt b/src/main/kotlin/github/gilbertokpl/total/util/VipUtil.kt index 80cdafc..1f34daf 100644 --- a/src/main/kotlin/github/gilbertokpl/total/util/VipUtil.kt +++ b/src/main/kotlin/github/gilbertokpl/total/util/VipUtil.kt @@ -88,7 +88,6 @@ object VipUtil { var value = 0 for (i in sequence) { - println(i) value += 1 if (i == currentGroup) { break diff --git a/src/main/kotlin/github/gilbertokpl/total/util/WorldUtil.kt b/src/main/kotlin/github/gilbertokpl/total/util/WorldUtil.kt index efe809c..c4df1de 100644 --- a/src/main/kotlin/github/gilbertokpl/total/util/WorldUtil.kt +++ b/src/main/kotlin/github/gilbertokpl/total/util/WorldUtil.kt @@ -6,11 +6,13 @@ import github.gilbertokpl.total.config.files.LangConfig import github.gilbertokpl.total.config.files.MainConfig import org.bukkit.World import org.bukkit.entity.Item +import org.bukkit.entity.LivingEntity +import org.bukkit.entity.Monster object WorldUtil { private var inUse = false - fun clearItems() { + fun clearEntities() { var time = 30000L val waitTime = ((time / 3) / 1000) @@ -34,7 +36,7 @@ object WorldUtil { switchContext(SynchronizationContext.SYNC) PlayerUtil.sendAllMessage(LangConfig.ClearitemsFinishMessage) - for (w in MainConfig.clearitemsWorlds) { + for (w in MainConfig.clearentitiesWorlds) { val world: World try { world = TotalEssentialsJava.instance.server.getWorld(w)!! @@ -44,7 +46,10 @@ object WorldUtil { val t = world.entities for (e in 0 until t.size) { val i = t[e] - if (i is Item && !MainConfig.clearitemsItemsNotClear.any { it.equals(i.itemStack.type.name.lowercase(), ignoreCase = true) }) { + if (i is Item && !MainConfig.clearentitiesItemsNotClear.any { it.equals(i.itemStack.type.name.lowercase(), ignoreCase = true) }) { + i.remove() + } + if (i is LivingEntity && i is Monster) { i.remove() } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 11f0bc6..4953b1c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: TotalEssentials -version: 1.1.1 +version: 1.1.2 main: github.gilbertokpl.total.TotalEssentialsJava author: Gilberto api-version: 1.13