From c2d8caff4bfb06805af5ff4f47de7902e894cc7b Mon Sep 17 00:00:00 2001 From: bytezlol Date: Mon, 25 May 2026 19:51:39 +0200 Subject: [PATCH 1/5] feat: add folia support & configurable lenguage files --- .../clearlag/annotations/ConfigModule.java | 14 - .../clearlag/commands/AreaCmd.java | 44 -- .../clearlag/commands/CheckCmd.java | 114 ----- .../clearlag/commands/KillmobsCmd.java | 28 -- .../clearlag/language/LanguageManager.java | 66 --- .../clearlag/language/LanguageValue.java | 12 - .../listeners/HopperLimitListener.java | 86 ---- .../clearlag/listeners/MobLimitListener.java | 74 --- .../clearlag/modules/TaskModule.java | 32 -- .../clearlag/tasks/ClearTask.java | 59 --- Clearlag Legacy/pom.xml | 91 ---- .../clearlag/commands/UnloadChunksCmd.java | 44 -- .../clearlag/entities/AttributeParser.java | 111 ----- .../attributes/EntityHasNameAttribute.java | 16 - .../attributes/EntityNameAttribute.java | 22 - .../listeners/ChunkLimiterListener.java | 39 -- .../clearlag/removetype/KillMobsClear.java | 29 -- Clearlag Legacy/src/main/resources/config.yml | 471 ------------------ .../META-INF/MANIFEST.MF | 0 common/dependency-reduced-pom.xml | 101 ++++ {Clearlag Core => common}/pom.xml | 65 ++- .../minebuilders/clearlag/BukkitUpdater.java | 19 +- .../me/minebuilders/clearlag/Callback.java | 2 - .../me/minebuilders/clearlag/ChunkKey.java | 1 - .../me/minebuilders/clearlag/ClearLag.java | 32 +- .../clearlag/CommandListener.java | 30 +- .../me/minebuilders/clearlag/MutableInt.java | 0 .../me/minebuilders/clearlag/RAMUtil.java | 0 .../java/me/minebuilders/clearlag/Util.java | 58 ++- .../adapters/LatestVersionAdapter.java | 14 +- .../adapters/LegacyVersionAdapter.java | 13 +- .../clearlag/adapters/VersionAdapter.java | 1 - .../clearlag/annotations/AutoWire.java | 8 +- .../clearlag/annotations/ConfigModule.java | 16 + .../clearlag/annotations/ConfigPath.java | 3 - .../clearlag/annotations/ConfigValue.java | 10 +- .../clearlag/commands/AdminCmd.java | 68 +-- .../clearlag/commands/AreaCmd.java | 69 +++ .../clearlag/commands/CheckChunkCmd.java | 19 +- .../clearlag/commands/CheckCmd.java | 178 +++++++ .../clearlag/commands/ChunkCmd.java | 23 +- .../clearlag/commands/ClearCmd.java | 5 - .../minebuilders/clearlag/commands/GcCmd.java | 6 +- .../clearlag/commands/HaltCmd.java | 7 - .../clearlag/commands/KillmobsCmd.java | 85 ++++ .../clearlag/commands/MemoryCmd.java | 16 +- .../clearlag/commands/PerformanceCmd.java | 15 +- .../clearlag/commands/ProfileCmd.java | 89 ++-- .../clearlag/commands/ReloadCmd.java | 20 +- .../clearlag/commands/SampleMemoryCmd.java | 98 ++-- .../clearlag/commands/TickSamplerCmd.java | 88 +--- .../clearlag/commands/TpChunkCmd.java | 30 +- .../clearlag/commands/TpsCmd.java | 1 - .../clearlag/commands/UnloadChunksCmd.java | 9 +- .../clearlag/config/ConfigHandler.java | 108 ++-- .../clearlag/config/ConfigValueType.java | 6 +- .../config/configupdater/ConfigUpdater.java | 60 +-- .../entries/ConfigBasicEntry.java | 0 .../entries/ConfigCommentEntry.java | 10 +- .../configupdater/entries/ConfigEntry.java | 1 - .../entries/ConfigListEntry.java | 20 +- .../entries/TreeConfigEntry.java | 11 +- .../config/configvalues/ColoredStringCV.java | 3 +- .../config/configvalues/ColoredStringsCV.java | 5 +- .../config/configvalues/ConfigData.java | 1 - .../config/configvalues/EntityLimitMapCV.java | 20 +- .../config/configvalues/EntityTypeTable.java | 17 +- .../configvalues/MaterialIntegerMapCV.java | 12 +- .../config/configvalues/MaterialSetCV.java | 13 +- .../config/configvalues/PrimitiveCV.java | 3 +- .../config/configvalues/StringSetCV.java | 5 +- .../config/configvalues/WarnMapCV.java | 10 - .../clearlag/entities/AttributeParser.java | 48 +- .../clearlag/entities/EntityMap.java | 29 +- .../clearlag/entities/EntityTable.java | 11 +- .../entities/attributes/EntityAttribute.java | 1 - .../attributes/EntityHasMetaAttribute.java | 1 - .../attributes/EntityHasNameAttribute.java | 1 - .../attributes/EntityLifeLimitAttribute.java | 2 - .../attributes/EntityMaterialAttribute.java | 1 - .../attributes/EntityMountedAttribute.java | 1 - .../attributes/EntityNameAttribute.java | 3 +- .../attributes/EntityOnGroundAttribute.java | 1 - .../clearlag/events/EntityRemoveEvent.java | 17 +- .../clearlag/events/TPSUpdateEvent.java | 9 +- .../FancyIllegalArgumentException.java | 3 - .../IncompatibleServerVersionException.java | 0 .../WrongCommandArgumentException.java | 0 .../clearlag/language/LanguageLoader.java | 59 +-- .../clearlag/language/LanguageManager.java | 162 ++++++ .../clearlag/language/LanguageValue.java | 14 + .../language/messages/BasicMessage.java | 16 +- .../clearlag/language/messages/Message.java | 1 - .../language/messages/MessageBlock.java | 33 +- .../language/messages/MessageTree.java | 7 +- .../listeners/ChunkEntityLimiterListener.java | 32 +- .../listeners/ChunkLimiterListener.java | 3 - .../listeners/ChunkOverloadListener.java | 7 +- .../ChunkPerEntityLimiterListener.java | 111 ++--- .../listeners/DispenceLimitEvent.java | 4 +- .../clearlag/listeners/EggSpawnListener.java | 18 +- .../listeners/EntityAISpawnListener.java | 11 +- .../listeners/EntityBreedListener.java | 14 +- .../listeners/FireSpreadListener.java | 23 +- .../listeners/HopperLimitListener.java | 65 +++ .../listeners/ItemLivetimeListener.java | 3 - .../clearlag/listeners/ItemMergeListener.java | 13 +- .../clearlag/listeners/MobLimitListener.java | 122 +++++ .../clearlag/listeners/MobSpawerListener.java | 41 +- .../listeners/TNTMinecartListener.java | 12 +- .../clearlag/listeners/TntReduceListener.java | 24 +- .../clearlag/managers/EntityManager.java | 22 +- .../clearlag/modules/BroadcastHandler.java | 26 +- .../clearlag/modules/ClearModule.java | 37 +- .../clearlag/modules/ClearlagModule.java | 1 - .../clearlag/modules/CommandModule.java | 18 +- .../clearlag/modules/EventModule.java | 5 +- .../minebuilders/clearlag/modules/Module.java | 1 - .../clearlag/modules/TaskModule.java | 33 ++ .../clearlag/reflection/AutoWirer.java | 21 +- .../clearlag/reflection/ReflectionUtil.java | 17 +- .../clearlag/removetype/AreaClear.java | 3 +- .../clearlag/removetype/AutoClear.java | 7 +- .../clearlag/removetype/CmdClear.java | 1 - .../clearlag/removetype/KillMobsClear.java | 3 +- .../clearlag/removetype/LimitClear.java | 54 +- .../statrenderers/MemoryRenderer.java | 41 +- .../statrenderers/ProcessRenderer.java | 77 +-- .../clearlag/statrenderers/StatRenderer.java | 28 +- .../clearlag/tasks/ClearTask.java | 112 +++++ .../minebuilders/clearlag/tasks/HaltTask.java | 74 ++- .../clearlag/tasks/LagSpikeTask.java | 114 ++--- .../clearlag/tasks/LimitTask.java | 10 +- .../minebuilders/clearlag/tasks/LiveTask.java | 14 +- .../clearlag/tasks/LogPurger.java | 9 +- .../clearlag/tasks/RAMCheckTask.java | 8 +- .../clearlag/tasks/TPSCheckTask.java | 26 +- .../minebuilders/clearlag/tasks/TPSTask.java | 43 +- .../minebuilders/clearlag/tasks/WarnTask.java | 6 +- .../triggeredremoval/CleanerHandler.java | 11 +- .../triggeredremoval/TriggerManager.java | 48 +- .../cleanermodules/CommandExecuteJob.java | 14 +- .../cleanermodules/EntityCleanerJob.java | 0 .../cleanermodules/WarningJob.java | 13 +- .../triggers/CleanerTrigger.java | 4 - .../triggers/EntityLimitTrigger.java | 16 +- .../triggeredremoval/triggers/TPSTrigger.java | 0 .../triggeredremoval/triggers/Trigger.java | 3 - .../src/main/resources/changelog.txt | 0 .../src/main/resources/config.yml | 0 .../languages/BrazilianPortuguese.lang | 0 .../languages/ChineseSimplified.lang | 0 .../languages/ChineseTraditional.lang | 0 .../src/main/resources/languages/Czech.lang | 0 .../src/main/resources/languages/English.lang | 0 .../src/main/resources/languages/French.lang | 0 .../src/main/resources/languages/German.lang | 0 .../main/resources/languages/Japanese.lang | 0 .../src/main/resources/languages/Korean.lang | 0 .../src/main/resources/languages/Polish.lang | 0 .../src/main/resources/languages/Russian.lang | 0 .../src/main/resources/languages/Spanish.lang | 0 .../src/main/resources/plugin.yml | 9 +- pom.xml | 22 +- 164 files changed, 1838 insertions(+), 2892 deletions(-) delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigModule.java delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/AreaCmd.java delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/CheckCmd.java delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/KillmobsCmd.java delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageManager.java delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageValue.java delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/HopperLimitListener.java delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/MobLimitListener.java delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/TaskModule.java delete mode 100644 Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java delete mode 100644 Clearlag Legacy/pom.xml delete mode 100644 Clearlag Legacy/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java delete mode 100644 Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java delete mode 100644 Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java delete mode 100644 Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java delete mode 100644 Clearlag Legacy/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java delete mode 100644 Clearlag Legacy/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java delete mode 100644 Clearlag Legacy/src/main/resources/config.yml rename {Clearlag Core => common}/META-INF/MANIFEST.MF (100%) create mode 100644 common/dependency-reduced-pom.xml rename {Clearlag Core => common}/pom.xml (58%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/BukkitUpdater.java (96%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/Callback.java (98%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/ChunkKey.java (99%) rename Clearlag Core/src/main/java/me/minebuilders/clearlag/Clearlag.java => common/src/main/java/me/minebuilders/clearlag/ClearLag.java (91%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/CommandListener.java (83%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/MutableInt.java (100%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/RAMUtil.java (100%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/Util.java (82%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java (89%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java (94%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/annotations/AutoWire.java (51%) create mode 100644 common/src/main/java/me/minebuilders/clearlag/annotations/ConfigModule.java rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/annotations/ConfigPath.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/annotations/ConfigValue.java (63%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/AdminCmd.java (85%) create mode 100644 common/src/main/java/me/minebuilders/clearlag/commands/AreaCmd.java rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/CheckChunkCmd.java (93%) create mode 100644 common/src/main/java/me/minebuilders/clearlag/commands/CheckCmd.java rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/ChunkCmd.java (80%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/ClearCmd.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/GcCmd.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/HaltCmd.java (99%) create mode 100644 common/src/main/java/me/minebuilders/clearlag/commands/KillmobsCmd.java rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/MemoryCmd.java (88%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/PerformanceCmd.java (89%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/ProfileCmd.java (80%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/ReloadCmd.java (82%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/SampleMemoryCmd.java (74%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/TickSamplerCmd.java (66%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/TpChunkCmd.java (60%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/TpsCmd.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/ConfigHandler.java (78%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/ConfigValueType.java (88%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configupdater/ConfigUpdater.java (93%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigBasicEntry.java (100%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigCommentEntry.java (74%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigEntry.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigListEntry.java (83%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/TreeConfigEntry.java (95%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringCV.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringsCV.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/ConfigData.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityLimitMapCV.java (97%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityTypeTable.java (98%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialIntegerMapCV.java (90%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialSetCV.java (86%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/PrimitiveCV.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/StringSetCV.java (88%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java (83%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/EntityMap.java (70%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/EntityTable.java (88%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityAttribute.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasMetaAttribute.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityLifeLimitAttribute.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMaterialAttribute.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMountedAttribute.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityOnGroundAttribute.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/events/EntityRemoveEvent.java (97%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/events/TPSUpdateEvent.java (97%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/exceptions/FancyIllegalArgumentException.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/exceptions/IncompatibleServerVersionException.java (100%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/exceptions/WrongCommandArgumentException.java (100%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/language/LanguageLoader.java (84%) create mode 100644 common/src/main/java/me/minebuilders/clearlag/language/LanguageManager.java create mode 100644 common/src/main/java/me/minebuilders/clearlag/language/LanguageValue.java rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/language/messages/BasicMessage.java (63%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/language/messages/Message.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/language/messages/MessageBlock.java (67%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/language/messages/MessageTree.java (96%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/ChunkEntityLimiterListener.java (71%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/ChunkOverloadListener.java (96%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/ChunkPerEntityLimiterListener.java (55%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/DispenceLimitEvent.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/EggSpawnListener.java (83%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/EntityAISpawnListener.java (97%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/EntityBreedListener.java (87%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/FireSpreadListener.java (63%) create mode 100644 common/src/main/java/me/minebuilders/clearlag/listeners/HopperLimitListener.java rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/ItemLivetimeListener.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/ItemMergeListener.java (82%) create mode 100644 common/src/main/java/me/minebuilders/clearlag/listeners/MobLimitListener.java rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/MobSpawerListener.java (74%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/TNTMinecartListener.java (74%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/listeners/TntReduceListener.java (64%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/managers/EntityManager.java (63%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/modules/BroadcastHandler.java (89%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/modules/ClearModule.java (63%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/modules/ClearlagModule.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/modules/CommandModule.java (92%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/modules/EventModule.java (78%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/modules/Module.java (98%) create mode 100644 common/src/main/java/me/minebuilders/clearlag/modules/TaskModule.java rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/reflection/AutoWirer.java (94%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/reflection/ReflectionUtil.java (98%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/removetype/AreaClear.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/removetype/AutoClear.java (91%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/removetype/CmdClear.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/removetype/LimitClear.java (62%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/statrenderers/MemoryRenderer.java (95%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/statrenderers/ProcessRenderer.java (76%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/statrenderers/StatRenderer.java (74%) create mode 100644 common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/tasks/HaltTask.java (73%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/tasks/LagSpikeTask.java (55%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/tasks/LimitTask.java (86%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/tasks/LiveTask.java (71%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/tasks/LogPurger.java (86%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/tasks/RAMCheckTask.java (82%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/tasks/TPSCheckTask.java (75%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/tasks/TPSTask.java (93%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/tasks/WarnTask.java (91%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/triggeredremoval/CleanerHandler.java (79%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/triggeredremoval/TriggerManager.java (84%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/CommandExecuteJob.java (76%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/EntityCleanerJob.java (100%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/WarningJob.java (93%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/CleanerTrigger.java (99%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/EntityLimitTrigger.java (82%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/TPSTrigger.java (100%) rename {Clearlag Core => common}/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/Trigger.java (98%) rename {Clearlag Core => common}/src/main/resources/changelog.txt (100%) rename {Clearlag Core => common}/src/main/resources/config.yml (100%) rename {Clearlag Core => common}/src/main/resources/languages/BrazilianPortuguese.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/ChineseSimplified.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/ChineseTraditional.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/Czech.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/English.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/French.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/German.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/Japanese.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/Korean.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/Polish.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/Russian.lang (100%) rename {Clearlag Core => common}/src/main/resources/languages/Spanish.lang (100%) rename {Clearlag Core => common}/src/main/resources/plugin.yml (84%) diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigModule.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigModule.java deleted file mode 100644 index 86c000f..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigModule.java +++ /dev/null @@ -1,14 +0,0 @@ -package me.minebuilders.clearlag.annotations; - -import java.lang.annotation.*; - -/** - * Created by TCP on 2/5/2016. - */ -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) - -public @interface ConfigModule { - -} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/AreaCmd.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/AreaCmd.java deleted file mode 100644 index 2ae8025..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/AreaCmd.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.minebuilders.clearlag.commands; - -import me.minebuilders.clearlag.annotations.AutoWire; -import me.minebuilders.clearlag.annotations.ConfigModule; -import me.minebuilders.clearlag.exceptions.WrongCommandArgumentException; -import me.minebuilders.clearlag.language.LanguageValue; -import me.minebuilders.clearlag.language.messages.MessageTree; -import me.minebuilders.clearlag.managers.EntityManager; -import me.minebuilders.clearlag.modules.CommandModule; -import me.minebuilders.clearlag.removetype.AreaClear; -import org.bukkit.entity.Player; - -public class AreaCmd extends CommandModule { - - @ConfigModule - private final AreaClear areaClear = new AreaClear(); - - @AutoWire - private EntityManager entityManager; - - @LanguageValue(key = "command.area.") - private MessageTree lang; - - public AreaCmd() { - argLength = 1; - } - - @Override - protected void run(Player player, String[] args) throws WrongCommandArgumentException { - - try { - - final int radius = Integer.parseInt(args[0]); - - final int removed = entityManager.removeEntities(areaClear.getRemovables(player.getNearbyEntities(radius, radius, radius), player.getWorld()), player.getWorld()); - - lang.sendMessage("message", player, removed, radius); - - } catch (NumberFormatException e) { - throw new WrongCommandArgumentException(lang.getMessage("error")); - } - } - -} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/CheckCmd.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/CheckCmd.java deleted file mode 100644 index f9a0e5e..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/CheckCmd.java +++ /dev/null @@ -1,114 +0,0 @@ -package me.minebuilders.clearlag.commands; - -import me.minebuilders.clearlag.Clearlag; -import me.minebuilders.clearlag.RAMUtil; -import me.minebuilders.clearlag.Util; -import me.minebuilders.clearlag.annotations.AutoWire; -import me.minebuilders.clearlag.exceptions.WrongCommandArgumentException; -import me.minebuilders.clearlag.language.LanguageValue; -import me.minebuilders.clearlag.language.messages.MessageTree; -import me.minebuilders.clearlag.modules.CommandModule; -import me.minebuilders.clearlag.tasks.TPSTask; -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.block.BlockState; -import org.bukkit.block.CreatureSpawner; -import org.bukkit.block.Hopper; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.*; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.List; - -public class CheckCmd extends CommandModule { - - @AutoWire - private TPSTask tpsTask; - - @LanguageValue(key = "command.check.") - private MessageTree lang; - - @Override - protected void run(CommandSender sender, String[] args) throws WrongCommandArgumentException { - - final List worlds; - - if (args.length > 0) { - - worlds = new ArrayList<>(args.length); - - for (String arg : args) { - - World world = Bukkit.getWorld(arg); - - if (world == null) - throw new WrongCommandArgumentException(lang.getMessage("invalidworld"), arg); - - worlds.add(world); - } - - } else { - worlds = Bukkit.getWorlds(); - } - - int removed1 = 0, mobs = 0, animals = 0, chunks = 0, spawners = 0, activehoppers = 0, inactivehoppers = 0, players = 0; - - for (World w : worlds) { - - for (Chunk c : w.getLoadedChunks()) { - - for (BlockState bt : c.getTileEntities()) { - - if (bt instanceof CreatureSpawner) { - - spawners++; - - } else if (bt instanceof Hopper) { - - if (!isHopperEmpty((Hopper) bt)) { - activehoppers++; - } else { - inactivehoppers++; - } - } - } - - for (Entity e : c.getEntities()) { - if (e instanceof Monster) mobs++; - else if (e instanceof Player) players++; - else if (e instanceof Creature) animals++; - else if (e instanceof Item) removed1++; - } - chunks++; - } - } - - lang.sendMessage("header", sender); - - lang.sendMessage("printed", sender, - removed1, - mobs, - animals, - players, - chunks, - activehoppers, - inactivehoppers, - spawners, - Util.getTime(System.currentTimeMillis() - Clearlag.getInstance().getInitialBootTimestamp()), - tpsTask.getStringTPS(), - RAMUtil.getUsedMemory(), RAMUtil.getMaxMemory(), - (RAMUtil.getMaxMemory() - RAMUtil.getUsedMemory()) - ); - - lang.sendMessage("footer", sender); - } - - private boolean isHopperEmpty(Hopper hop) { - for (ItemStack it : hop.getInventory().getContents()) { - if (it != null) return false; - } - return true; - } -} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/KillmobsCmd.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/KillmobsCmd.java deleted file mode 100644 index 065df00..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/KillmobsCmd.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.minebuilders.clearlag.commands; - -import me.minebuilders.clearlag.annotations.AutoWire; -import me.minebuilders.clearlag.annotations.ConfigModule; -import me.minebuilders.clearlag.language.LanguageValue; -import me.minebuilders.clearlag.language.messages.Message; -import me.minebuilders.clearlag.managers.EntityManager; -import me.minebuilders.clearlag.modules.CommandModule; -import me.minebuilders.clearlag.removetype.KillMobsClear; -import org.bukkit.command.CommandSender; - -public class KillmobsCmd extends CommandModule { - - @ConfigModule - private final KillMobsClear killMobsClear = new KillMobsClear(); - - @AutoWire - private EntityManager entityManager; - - @LanguageValue(key = "command.killmobs.message") - private Message message; - - @Override - protected void run(CommandSender sender, String[] args) { - message.sendMessage(sender, entityManager.removeEntities(killMobsClear)); - } - -} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageManager.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageManager.java deleted file mode 100644 index a9c0cce..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageManager.java +++ /dev/null @@ -1,66 +0,0 @@ -package me.minebuilders.clearlag.language; - -import me.minebuilders.clearlag.Clearlag; -import me.minebuilders.clearlag.Util; -import me.minebuilders.clearlag.annotations.AutoWire; -import me.minebuilders.clearlag.config.ConfigHandler; -import me.minebuilders.clearlag.language.messages.Message; -import me.minebuilders.clearlag.modules.BroadcastHandler; -import me.minebuilders.clearlag.modules.ClearlagModule; - -/** - * @author bob7l - */ -public class LanguageManager extends ClearlagModule { - - @AutoWire - private BroadcastHandler broadcastHandler; - - @AutoWire - private ConfigHandler config; - - private LanguageLoader languageLoader; - - public Message getMessage(String key) { - return languageLoader.getMessageByKey(key); - } - - public LanguageLoader getLanguageLoader() { - return languageLoader; - } - - @Override - public void setEnabled() { - super.setEnabled(); - - String desiredLanguage = config.getConfig().getString("settings.language") + ".lang"; - - desiredLanguage = desiredLanguage.substring(0, 1).toUpperCase() + desiredLanguage.substring(1); - - languageLoader = new LanguageLoader(broadcastHandler); - - try { - - languageLoader.setLanguageMap(Clearlag.class.getResource("/languages/" + desiredLanguage).openStream()); - - } catch (Exception e) { - - Util.warning("Clearlag FAILED to find your desired language file '" + desiredLanguage + "'. Defaulting to English..."); - - try { - languageLoader.setLanguageMap(Clearlag.class.getResource("/languages/English.lang").openStream()); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - for (Object object : Clearlag.getInstance().getAutoWirer().getWires()) { - - try { - languageLoader.wireInMessages(object); - } catch (Exception e) { - e.printStackTrace(); - } - } - } -} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageValue.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageValue.java deleted file mode 100644 index e60e584..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageValue.java +++ /dev/null @@ -1,12 +0,0 @@ -package me.minebuilders.clearlag.language; - -import java.lang.annotation.*; - -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -public @interface LanguageValue { - - String key(); - -} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/HopperLimitListener.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/HopperLimitListener.java deleted file mode 100644 index 74818f9..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/HopperLimitListener.java +++ /dev/null @@ -1,86 +0,0 @@ -package me.minebuilders.clearlag.listeners; - -import me.minebuilders.clearlag.ChunkKey; -import me.minebuilders.clearlag.Clearlag; -import me.minebuilders.clearlag.annotations.ConfigPath; -import me.minebuilders.clearlag.annotations.ConfigValue; -import me.minebuilders.clearlag.modules.EventModule; -import org.bukkit.Bukkit; -import org.bukkit.block.Hopper; -import org.bukkit.event.EventHandler; -import org.bukkit.event.inventory.InventoryMoveItemEvent; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -@ConfigPath(path = "hopper-limiter") -public class HopperLimitListener extends EventModule implements Runnable { - - @ConfigValue - private final int transferLimit = 6; - - @ConfigValue - private final int checkInterval = 1; - - private int schedulerID = -1; - - private Map hopperDataMap = new HashMap<>(); - - @EventHandler - public void onHopper(InventoryMoveItemEvent event) { - - if (event.getSource().getHolder() instanceof Hopper) { - - ChunkKey chunkKey = new ChunkKey(((Hopper) event.getSource().getHolder()).getChunk()); - - Integer transfers = hopperDataMap.get(chunkKey); - - if (transfers == null) { - transfers = 0; - } - - if (transfers >= transferLimit) - event.setCancelled(true); - else - ++transfers; - - hopperDataMap.put(chunkKey, transfers); - } - } - - - @Override - public void run() { - - Iterator> entries = hopperDataMap.entrySet().iterator(); - - while (entries.hasNext()) { - - Map.Entry entry = entries.next(); - - if (entry.getValue() == 0) { - entries.remove(); - } else { - entry.setValue(0); - } - } - } - - @Override - public void setEnabled() { - super.setEnabled(); - - schedulerID = Bukkit.getScheduler().scheduleSyncRepeatingTask(Clearlag.getInstance(), this, checkInterval * 20L, checkInterval * 20L); - } - - @Override - public void setDisabled() { - super.setDisabled(); - - if (schedulerID != -1) { - Bukkit.getServer().getScheduler().cancelTask(schedulerID); - hopperDataMap = new HashMap<>(); - } - } -} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/MobLimitListener.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/MobLimitListener.java deleted file mode 100644 index de7b6f3..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/MobLimitListener.java +++ /dev/null @@ -1,74 +0,0 @@ -package me.minebuilders.clearlag.listeners; - -import me.minebuilders.clearlag.Clearlag; -import me.minebuilders.clearlag.annotations.ConfigPath; -import me.minebuilders.clearlag.annotations.ConfigValue; -import me.minebuilders.clearlag.modules.EventModule; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.entity.Animals; -import org.bukkit.entity.Creature; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Villager; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.CreatureSpawnEvent; - -@ConfigPath(path = "spawn-limiter") -public class MobLimitListener extends EventModule implements Runnable { - - @ConfigValue - private int animals; - - @ConfigValue - private int mobs; - - @ConfigValue - private int interval; - - private int sched = -1; - - private boolean canAnimalspawn = true; - - private boolean canMobspawn = true; - - @Override - public void run() { - int animals = 0; - int mobs = 0; - - for (World world : Bukkit.getWorlds()) { - for (Entity e : world.getEntities()) { - if (e instanceof Animals || e instanceof Villager) animals++; - if (e instanceof Creature) mobs++; - } - } - - canAnimalspawn = animals < this.animals; - - canMobspawn = mobs < this.mobs; - } - - @Override - public void setEnabled() { - super.setEnabled(); - - sched = Bukkit.getScheduler().scheduleSyncRepeatingTask(Clearlag.getInstance(), this, interval * 20L, interval * 20L); - } - - @Override - public void setDisabled() { - super.setDisabled(); - - if (sched != -1) Bukkit.getServer().getScheduler().cancelTask(sched); - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onMobSpawn(CreatureSpawnEvent e) { - Entity en = e.getEntity(); - if (!canAnimalspawn && en instanceof Animals) - e.setCancelled(true); - else if (!canMobspawn && en instanceof Creature) - e.setCancelled(true); - } -} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/TaskModule.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/TaskModule.java deleted file mode 100644 index e774dc7..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/TaskModule.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.minebuilders.clearlag.modules; - - -import me.minebuilders.clearlag.Clearlag; -import org.bukkit.Bukkit; - -public abstract class TaskModule extends ClearlagModule implements Runnable { - - protected int taskid = -2; - - @Override - public void setEnabled() { - super.setEnabled(); - - taskid = startTask(); - } - - protected int startTask() { - return Bukkit.getScheduler().scheduleSyncRepeatingTask(Clearlag.getInstance(), this, getInterval(), getInterval()); - } - - @Override - public void setDisabled() { - super.setDisabled(); - Bukkit.getScheduler().cancelTask(taskid); - } - - public int getInterval() { - return 20; - } - -} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java b/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java deleted file mode 100644 index 14d5876..0000000 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java +++ /dev/null @@ -1,59 +0,0 @@ -package me.minebuilders.clearlag.tasks; - -import me.minebuilders.clearlag.Util; -import me.minebuilders.clearlag.annotations.AutoWire; -import me.minebuilders.clearlag.annotations.ConfigModule; -import me.minebuilders.clearlag.annotations.ConfigPath; -import me.minebuilders.clearlag.annotations.ConfigValue; -import me.minebuilders.clearlag.config.ConfigValueType; -import me.minebuilders.clearlag.managers.EntityManager; -import me.minebuilders.clearlag.modules.BroadcastHandler; -import me.minebuilders.clearlag.modules.TaskModule; -import me.minebuilders.clearlag.removetype.AutoClear; - -import java.util.HashMap; - -@ConfigPath(path = "auto-removal") -public class ClearTask extends TaskModule { - - @ConfigModule - private final AutoClear autoClear = new AutoClear(); - - @ConfigValue - private int autoremovalInterval; - - @ConfigValue(valueType = ConfigValueType.COLORED_STRINGS) - private String[] broadcastMessage; - - @ConfigValue(valueType = ConfigValueType.WARN_ARRAY) - private HashMap warnings; - - @ConfigValue(valueType = ConfigValueType.PRIMITIVE) - private boolean broadcastRemoval; - - @AutoWire - private EntityManager entityManager; - - @AutoWire - private BroadcastHandler broadcastHandler; - - private int interval = 0; - - public void run() { - - final String[] broadcastWarning = warnings.get(++interval); - - if (broadcastWarning != null) - broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastWarning, "+remaining", "" + (autoremovalInterval - interval))); - - - if (interval >= autoremovalInterval) { - - if (broadcastRemoval) - broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastMessage, "+RemoveAmount", String.valueOf(entityManager.removeEntities(autoClear)))); - - interval = 0; - } - } - -} diff --git a/Clearlag Legacy/pom.xml b/Clearlag Legacy/pom.xml deleted file mode 100644 index 1de5645..0000000 --- a/Clearlag Legacy/pom.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - clearlag - me.minebuilders - 2.9.0-SNAPSHOT - - - 4.0.0 - clearlag-legacy - jar - - - 1.8 - 1.8 - - - - - - me.minebuilders - clearlag-core - ${project.version} - compile - - - - org.bukkit - craftbukkit - 1.7.10-R0.1-SNAPSHOT - provided - - - - - - ${project.name} - ${basedir}/src/main/java - clean install - - - - . - true - ${basedir}/src/main/resources/ - - *.yml - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.3.1 - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - - - - package - - shade - - - - - - - - - \ No newline at end of file diff --git a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java b/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java deleted file mode 100644 index b68f273..0000000 --- a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.minebuilders.clearlag.commands; - -import me.minebuilders.clearlag.language.LanguageValue; -import me.minebuilders.clearlag.language.messages.Message; -import me.minebuilders.clearlag.modules.CommandModule; -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.command.CommandSender; -import org.bukkit.event.world.ChunkUnloadEvent; -import org.bukkit.plugin.PluginManager; - -public class UnloadChunksCmd extends CommandModule { - - @LanguageValue(key = "command.unloadchunks.print") - private Message unloadPrintMessage; - - @Override - protected void run(CommandSender sender, String[] args) { - - int chunkcount = 0; - - PluginManager pluginManager = Bukkit.getPluginManager(); - - for (World world : Bukkit.getServer().getWorlds()) { - - for (Chunk chunk : world.getLoadedChunks()) { - - if (!world.isChunkInUse(chunk.getX(), chunk.getZ())) { - - ChunkUnloadEvent event = new ChunkUnloadEvent(chunk); - - pluginManager.callEvent(event); - - if (!event.isCancelled() && chunk.unload(true, false)) { - chunkcount++; - } - } - } - - } - unloadPrintMessage.sendMessage(sender, chunkcount); - } -} \ No newline at end of file diff --git a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java b/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java deleted file mode 100644 index 9fcf35a..0000000 --- a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java +++ /dev/null @@ -1,111 +0,0 @@ -package me.minebuilders.clearlag.entities; - -import me.minebuilders.clearlag.Util; -import me.minebuilders.clearlag.entities.attributes.*; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; - -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - -/** - * @author bob7l - */ -public class AttributeParser { - - public Result getAttributesFromString(EntityType t, StringTokenizer tk) { - - final Result result = new Result(); - - while (tk.hasMoreTokens()) { - - EntityAttribute attribute = null; - - String tok = tk.nextToken(); - - boolean reversed = (tok.startsWith("!")); - - if (reversed) - tok = tok.substring(1); - - if (tok.startsWith("name=\"") || tok.startsWith("hasMeta=\"")) { - - StringBuilder name = new StringBuilder(); - - name.append(tok, 6, (tok.endsWith("\"") ? tok.length() - 1 : tok.length())); - - while (tk.hasMoreTokens()) { - - tok = tk.nextToken(); - - if (tok.endsWith("\"")) { - name.append(" ").append(tok, 0, tok.length() - 1); - break; - } - name.append(" ").append(tok); - } - - if (tok.startsWith("name=\"")) - attribute = new EntityNameAttribute(name.toString()); - else - attribute = new EntityHasMetaAttribute(name.toString()); - - } else if (tok.startsWith("hasName")) - attribute = new EntityHasNameAttribute(); - else if (tok.startsWith("liveTime=")) - attribute = new EntityLifeLimitAttribute(Integer.parseInt(tok.substring(9))); - else if (tok.startsWith("isMounted")) - attribute = new EntityMountedAttribute(); - else if (tok.startsWith("onGround")) - attribute = new EntityOnGroundAttribute(); - else if (tok.startsWith("id=") || tok.startsWith("material=")) { - - if (t == EntityType.DROPPED_ITEM) { - - String input = tok.substring(3); - Material mat = null; - - if (Util.isInteger(input)) { - - int id = Integer.parseInt(input); - - if (Material.values().length < id) - mat = Material.getMaterial(id); - - } else { - mat = Material.getMaterial(input); - } - - - attribute = new EntityMaterialAttribute(mat); - - } - } - - if (attribute != null) { - attribute.setReversed(reversed); - result.attributes.add(attribute); - } else - result.nonApplicables.add(tok); - } - - return result; - } - - public static class Result { - - private final ArrayList> attributes = new ArrayList<>(2); - - private final List nonApplicables = new ArrayList<>(1); - - public ArrayList> getAttributes() { - return attributes; - } - - public List getNonApplicables() { - return nonApplicables; - } - } -} diff --git a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java b/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java deleted file mode 100644 index d39ad8f..0000000 --- a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java +++ /dev/null @@ -1,16 +0,0 @@ -package me.minebuilders.clearlag.entities.attributes; - -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; - -/** - * @author bob7l - */ -public class EntityHasNameAttribute extends EntityAttribute { - - @Override - public boolean containsData(Entity entity) { - return (!reversed == (entity instanceof LivingEntity && ((LivingEntity) entity).getCustomName() != null)); - } - -} diff --git a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java b/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java deleted file mode 100644 index fc97c3e..0000000 --- a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.minebuilders.clearlag.entities.attributes; - -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; - -/** - * @author bob7l - */ -public class EntityNameAttribute extends EntityAttribute { - - private final String name; - - public EntityNameAttribute(String name) { - this.name = name; - } - - @Override - public boolean containsData(Entity entity) { - return (!reversed == (entity instanceof LivingEntity && name.equals(((LivingEntity) entity).getCustomName()))); - } - -} diff --git a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java b/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java deleted file mode 100644 index 89e9535..0000000 --- a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.minebuilders.clearlag.listeners; - -import me.minebuilders.clearlag.annotations.ConfigPath; -import me.minebuilders.clearlag.annotations.ConfigValue; -import me.minebuilders.clearlag.modules.EventModule; -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.event.EventHandler; -import org.bukkit.event.world.ChunkLoadEvent; - -@ConfigPath(path = "chunk-limiter") -public class ChunkLimiterListener extends EventModule { - - @ConfigValue - private int limit; - - @ConfigValue - private boolean createNewChunks; - - @EventHandler - public void onChunkLoad(ChunkLoadEvent event) { - if ((!createNewChunks && event.isNewChunk()) || (countChunks() >= limit)) { - event.getChunk().unload(false); - - for (Chunk c : event.getWorld().getLoadedChunks()) { - c.unload(true, true); - } - } - } - - public int countChunks() { - int size = 0; - for (World w : Bukkit.getWorlds()) { - size += w.getLoadedChunks().length; - } - return size; - } -} diff --git a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java b/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java deleted file mode 100644 index b0b331e..0000000 --- a/Clearlag Legacy/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.minebuilders.clearlag.removetype; - -import me.minebuilders.clearlag.annotations.ConfigPath; -import me.minebuilders.clearlag.annotations.ConfigValue; -import me.minebuilders.clearlag.config.ConfigValueType; -import me.minebuilders.clearlag.entities.EntityTable; -import me.minebuilders.clearlag.modules.ClearModule; -import org.bukkit.entity.Entity; -import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; - -@ConfigPath(path = "kill-mobs") -public class KillMobsClear extends ClearModule { - - @ConfigValue(valueType = ConfigValueType.ENTITY_TYPE_TABLE) - private EntityTable mobFilter; - - @ConfigValue - private boolean removeNamed; - - @Override - public boolean isRemovable(Entity e) { - return e instanceof LivingEntity - && !(e instanceof HumanEntity) - && (removeNamed || ((LivingEntity) e).getCustomName() == null) - && !mobFilter.containsEntity(e); - } - -} \ No newline at end of file diff --git a/Clearlag Legacy/src/main/resources/config.yml b/Clearlag Legacy/src/main/resources/config.yml deleted file mode 100644 index 4ddda16..0000000 --- a/Clearlag Legacy/src/main/resources/config.yml +++ /dev/null @@ -1,471 +0,0 @@ -#--------------------------------------------------------------------# -# ClearLag Configuration File # -#--------------------------------------------------------------------# -# Configure to your liking, reload the config by tying: /lagg reload # -# - # -# Here is a helpful tutorial on this configuration setup! (Updated) # -# http://dev.bukkit.org/bukkit-plugins/clearlagg/pages/config-setup/ # -#--------------------------------------------------------------------# -# All possible mob names: https://goo.gl/cch8YK # -#--------------------------------------------------------------------# -config-version: 20 - -# -- 'use-internal-tps' Should clearlag just use the calculated internal TPS? (Improves accuracy) -# -- 'language' Clearlag supports multiple languages (https://github.com/bob7l/Clearlag-Languages) translated by the community -settings: - language: English - auto-update: true - enable-api: true - use-internal-tps: true - -#Controls ALL of Clearlag's broadcasting. Disabling this will disable ALL broadcasting on Clearlag -# -- 'enabled' Should clearlag broadcast messages at all? (Example: Auto-removal, warnings, ect) -# -- 'async' Should messages be broadcasted on another thread -# -- 'use-permission-for-broadcasts' Should clearlag use permissions? -# -- 'permission' What is the permission? (By default, it's bukkit's default) -global-broadcasts: - enabled: true - async: false - use-permission-for-broadcasts: false - permission: bukkit.broadcast - -#Monitors your server's main thread for locking/freezing. Helps figure out what's causing lag-spikes -# NOTE: This will outprint mostly just stacktraces. It's up to YOU to interpret the stacktrace -# NOTE: (!Important!) Clearlag will print EVERYTHING to your Spigot/Bukkit server logs! -# NOTE: A large 'Garbage collection time' generally means the spike was caused by the Garbage collector (Memory issue basically..) -# -- 'enabled' Should this be enabled (Prints data to your logs, not ingame chat) -# -- 'min-elapsed-time' How long (IN MILLISECONDS) of a server-tick constitutes a freeze/lock? I don't recommend going under ~80 -# -- 'check-interval' How often (IN MILLISECONDS) should the server be checked? Lower the number, more accurate the timings -# -- 'follow-stack' Should Clearlag keep printing the stacktrace every time it changes (Can be very spammy)? -# Help-> https://dev.bukkit.org/projects/clearlagg/pages/finding-the-cause-of-lag-spikes -lag-spike-helper: - enabled: false - min-elapsed-time: 500 - check-interval: 100 - follow-stack: true - -#Limits the amount of item transfers for all the hoppers in a single chunk -# -- 'transfer-limit' How many transfers per check interval until the hopper should be disabled -# -- 'check-interval' In seconds, on what interval should the transfer limit be reset -hopper-limiter: - enabled: false - transfer-limit: 5 - check-interval: 1 - -#Meters your ram usage. If it goes above 'limit', run 'commands:' -# NOTE: It's perfectly normal for your server to be using a lot of memory. The JVM's garbage collector will automatically free memory. -# NOTE: Only use this if you have very little memory that can't support the server -# -- 'ram-limit' is in MB, do not set it exactly to your max allocated ram amount -# -- 'interval' is how often clearlag will check your ram usage -# -- 'commands' lists the commands that will be ran upon hitting your ram-limit -ram-meter: - enabled: false - interval: 20 - ram-limit: 5000 - commands: - - 'lagg killmobs' - - 'lagg clear' - -#Configure what the '/lagg halt' command does -# -- 'remove-entities' remove entities such as items, primed-tnt, and mobs -# -- 'disable-natural-entity-spawning' disables the server's natural world spawning -# -- 'halted' this section defines which actions should be halted during '/lagg halt' -halt-command: - remove-entities: true - disable-natural-entity-spawning: true - halted: - fire: true - fire-burn: true - explosion: true - decay: true - block-fade: true - block-form: true - block-spread: true - block-natural-change: true - -#This limits how fast a user can move by walking or flying in a single tick (20 ticks a second) -#I HIGHLY recommend you use this on servers with increased player-speed/fly to prevent chunk overload -# -- 'move-max-speed' Max speed on foot -# -- 'fly-max-speed' Max speed while flying -player-speed-limiter: - enabled: false - move-max-speed: 0.7 - fly-max-speed: 0.8 - -#Set the age of specific items when they're first spawned so they naturally despawn faster, or slower then others -#Recommended for servers with a lot of item-entities conisting mostly of useless items (Such as stone) -#Material list: https://jd.bukkit.org/org/bukkit/Material.html -# -- 'items' Lists the material names of the entities with their spawn-age (In seconds) -item-spawn-age-setter: - enabled: false - items: - stone: 240 - grass: 240 - cobblestone: 240 - log: 240 - stone_axe: 240 - stone_pickaxe: 240 - stone_sword: 240 - wood_axe: 240 - wood_pickaxe: 240 - wood_sword: 240 - rotten_flesh: 240 - gravel: 240 - dirt: 240 - leather: 200 - sand: 240 - bone: 240 - raw_beef: 240 - raw_chicken: 160 - cactus: 210 - wool: 180 - arrow: 160 - PORK: 240 - potato: 240 - red_rose: 240 - -#Should mobs be nerfed to prevent over-breeding to reduce CPU usage (And possibly raise TPS) -#When mobs are stuck too close, collisions are extremely intensive putting a pretty mean load on the server -# -- 'max-mobs' means how many bably/adult animals are allowed within the 'check-radius' -# -- 'check-radius' is the radius of what clearlag will check for 'max-mobs' -mob-breeding-limiter: - enabled: false - max-mobs: 6 - check-radius: 15 - -#Should clearlag purge logs under /logs when the server starts? -# -- 'days-old' means how many days old can the log be to be deleted -log-purger: - enabled: false - days-old: 3 - -#What type of entities SHOULD NOT be removed while doing /lagg area? -area-filter: - - Itemframe - - Minecart - - Wolf - - Villager - - Horse - -#Should clearlag reset the config, or attempt to update your config on updates -# -- 'force-update' is whether or not clearlag will reset your config with a newer version -# -- settings this to false will make clearlag update your config rather then resetting -config-updater: - force-update: false - -#This limits the mob egg spawners so players cannot "overload" the server with them -# -- 'check-radius' is the radius clearlag will check for nearby entities -# -- 'max-mobs' is how many entities may be in the radius before the spawning is blocked -mobegg-limiter: - enabled: false - check-radius: 8 - max-mobs: 5 - -#Disable new chunk generation, or just put a cap on how many can load at once. -#May cause many bugs with Spigot 1.8+, not recommended! -# -- 'create-new-chunks' disables or enables chunk creation. false would disallow new chunks -# -- !UNSTABLE ON SPIGOT BUILDS! -chunk-limiter: - enabled: false - limit: 6000 - create-new-chunks: true - -#This modifies the view range of entities -# -- Lower it is, the better your entity tick will be and the more CPU cycles you'll save -# -- If it's too high, expect bugs / lots of lag -mob-range: - enabled: false - zombie: 30 - skeleton: 30 - creeper: 20 - -#How long should items/Mobs be left on the ground -# -- live-time's go by ticks (20 ticks a second) -live-time: - enabled: false - interval: 10 - mobtimer: true - itemtimer: true - arrowtimer: true - arrowkilltime: 15 - moblivetime: 600 - itemlivetime: 240 - -#This option disallows the placement of too many tnt-minecarts -# -- 'radius' is the radius clearlag will check for TNT-Minecarts -tnt-minecart: - enabled: false - max: 2 - radius: 6 - -#This option reduces global dispenser fire rate -# -- 'time' is in milliseconds -dispenser-reducer: - enabled: false - time: 100 - -#This option reduces the explosions of mass amounts of tnt, and reduces tnt lag -# -- 'check-radius' is the radius clearlag will check for primed TNT -# -- 'max-primed' is the max primed TNT within the radius allowed before clearlag begins to remove -tnt-reducer: - enabled: false - check-radius: 5 - max-primed: 3 - -#This option reduces fire spread rate -# -- 'time' is in milliseconds -firespread-reducer: - enabled: false - time: 2000 - -#How many entities should one chunk be allowed to hold? -# -- 'entities' lists all the entities that will be counted -# and possibly removed. -chunk-entity-limiter: - enabled: false - limit: 10 - entities: - - Squid - - Zombie - - Skeleton - - Creeper - - Chicken - - Pig - - Sheep - - Cow - - Horse - # - Pig liveTime=100 <- This mob will be REMOVED if it's been alive for 100 ticks (5 seconds) - -#A per-entity chunk limiter. Very useful to limiting useless mobs like squid, but not zombies -# -- 'entity-limits' lists all the entities, their filters, and 'limit' to specify their limit -# to be removed/culled -per-entity-chunk-entity-limiter: - enabled: false - entity-limits: - - Squid limit:1 - - Zombie limit:2 - - Skeleton limit:2 - - Creeper limit:2 - - Chicken limit:3 - - Pig limit:5 - - Sheep limit:5 - - Cow limit:5 - - Horse limit:5 - - Villager limit:4 - - Arrow limit:5 inGround - - Rabbit limit:2 - passive-cleaner: - passive-cleaning-enabled: false - check-interval: 1 - chunk-batch-size: 2 - -#How many mobs should be allowed to spawn globally -# -- 'interval' is the check interval check the current spawn amounts -spawn-limiter: - enabled: false - interval: 15 - mobs: 300 - animals: 300 - -#Meters your TPS, if it goes to low, run the commands you wrote below! -# -- 'interval' is how often tps-meter will check the TPS -# -- 'tps-trigger' is at what TPS the commands will be ran at -# -- 'tps-recover' is at what TPS should the TPS be considered stable after 'tps-trigger' is executed -# -- 'commands' lists what commands will be executed when tps-tigger is reached -# -- 'recover-commands' lists what commands will be executed when tps-recover is reached -# -- 'trigger-broadcast-message' specifies which message should be broadcasted when tps-trigger runs -# -- 'recover-broadcast-message' specifies which message should be broadcasted when TPS recovers -# -- 'broadcast-enabled' defines whether or not tps-meter should broadcast -tps-meter: - enabled: false - trigger-broadcast-message: '&6[ClearLag] &cThe server is overloaded, executing lag-perventing measures' - recover-broadcast-message: '&6[ClearLag] &aThe server is no longer overloaded!' - broadcast-enabled: false - interval: 15 - tps-trigger: 14.0 - tps-recover: 19.0 - commands: - - 'lagg killmobs' - - 'lagg clear' - - 'lagg halt on' - recover-commands: - - 'lagg halt off' - -#This is /lagg killmobs, put what you DON'T want removed! -# -- 'remove-named', when FALSE entities with custom names will NOT be removed -# -- 'mob-filter' lists which mobs will be IGNORED during /lagg killmobs -kill-mobs: - remove-named: false - mob-filter: - - Villager - - Wolf -# - Pig !name="Test" <- This entity will filtered if the name does NOT equal "Test" -# - Zombie hasName <- This entity will be filtered if it HAS a name - - Horse - -#This nerfs mob-spawners (Natural and player-made) -#------------------------------------------------- -#This goes by chunks rather then spawners. This is to prevent -#a large buildup of mob-spawners within a small region to "bypass" -#your set limit. It also allows for keys to be generated more easily -#increasing the performance -# -- 'max-spawn' is the maximum mobs allowed to spawn by a mob-spawner -# -- 'remove-mobs-on-chunk-unload' is whether or not Clearlag should remove -# -- the mobs spawned by the mobspawner upon chunk unload (Highly Recommended) -mobspawner: - enabled: false - max-spawn: 4 - remove-mobs-on-chunk-unload: true - -#Dont use if you have CB++ or Spigot! -item-merger: - enabled: false - radius: 6 - -#Auto-removal options -# -- warnings works like this; time = the time warning should be given, msg = warning message at that time -# -- NOTE: The below 'remove' section applies to this remover! -# -- NOTE: Putting the interval to low will cause issues! -# -- NOTE: To disable "warnings", set it to "warnings: []" -# -- NOTE: bukkit.broadcast.user permission will allow users to see broadcasts (If not enabled by default) -# -# !==[ All string values MUST be inside '']==! -# -# -- 'remove-entities' lists what entities should be REMOVED on removal -# -- 'warnings' list warnings to be given out at specified times: time:60 = runs after 60 seconds after the last clear -auto-removal: - enabled: true - broadcast-message: '&6[ClearLag] &aRemoved +RemoveAmount Entities!' - broadcast-removal: true - autoremoval-interval: 460 - world-filter: - # - this_world <-This world will be ignored during removal! - boat: false - falling-block: true - experience-orb: true - painting: false - projectile: false - item: true - itemframe: false - minecart: false - primed-tnt: true - item-filter: - # - Stone <-This item-id will be ignored during removal! - # - Grass - remove-entities: - - Arrow onGround - - Snowball - - Egg - - Fireball - - Boat !isMounted - - Minecart !isMounted - - MINECART_TNT - # - cow <- This mob-type will be REMOVED during removal! - # - MINECART_MOB_SPAWNER - # - Pig liveTime=100 <- This mob will be REMOVED if it's been alive for 100 ticks (5 seconds) - # - Minecart !isMounted <- This entity will be REMOVED if it's NOT mounted - # - Wolf !hasName <- This entity will be REMOVED if it doesn't have a name - warnings: - - 'time:400 msg:&4[ClearLag] &cWarning Ground items will be removed in &7+remaining &cseconds!' - - 'time:440 msg:&4[ClearLag] &cWarning Ground items will be removed in &7+remaining &cseconds!' - -#What should be removed during /lagg clear -command-remove: - world-filter: - # - this_world <-This world will be ignored during removal! - broadcast-removal: false - boat: true - falling-block: true - experience-orb: true - painting: false - projectile: true - item: true - itemframe: false - minecart: true - primed-tnt: true - item-filter: - # - 222 <-This item-id will be ignored during removal! - # - 265 - remove-entities: - # - cow <- This mob-type will be REMOVED during removal! - # - MINECART_MOB_SPAWNER - # - Pig liveTime=100 <- This mob will be REMOVED if it's been alive for 100 ticks (5 seconds) - # - Minecart !isMounted <- This entity will be REMOVED if it's NOT mounted - # - Wolf !hasName <- This entity will be REMOVED if it doesn't have a name - -limit: - enabled: false - max: 1000 - check-interval: 60 - broadcast-message: '&6[ClearLag] &aLimit reached, removed +RemoveAmount Entities!' - world-filter: - # - this_world <-This world will be ignored during removal! - broadcast-removal: true - boat: true - falling-block: true - experience-orb: true - painting: false - projectile: true - item: true - itemframe: false - minecart: true - primed-tnt: true - item-filter: - # - 264 - # - 232 <-This item-id will be ignored during removal! - - - # Create your own custom removal stuff! - # -- warnings works like this; time = the time warning should be given, msg = warning message at that time - # -- NOTE: The below 'remove' section applies to this remover! - # \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ - # > READ FOR HELP -> https://dev.bukkit.org/projects/clearlagg/pages/config-setup <- READ FOR HELP < - # /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ - custom-trigger-removal: - enabled: false - triggers: - trigger1: - trigger-type: tps-trigger - run-interval: 5 - tps-trigger: 14.0 - tps-recover: 19.0 - jobs: - command-executor: - commands: - - 'lagg killmobs' - - 'lagg clear' - - 'lagg halt' - recover-commands: - - 'lagg halt' - entity-clearer: - execute-job-time: 120 - warnings: - - 'time:60 msg:&4[ClearLag] &cEntities/drops will be purged in &7+remaining &cseconds!' - - 'time:100 msg:&4[ClearLag] &cEntities/drops will be purged in &720 &cseconds!' - - 'time:110 msg:&4[ClearLag] &cEntities/drops will be purged in &710 &cseconds!' - world-filter: - # - world <-This world will be ignored during removal - removeEntities: - - item - - zombie !hasName - - skeleton !hasName - - pig !hasName - - cow !hasName - trigger2: - trigger-type: entity-limit-trigger - run-interval: 25 - limit: 200 - world-filter: - # - world <-This world will be ignored during checking - entity-limits: - - zombie - - skeleton - - enderman - jobs: - entity-clearer: - world-filter: - # - world <-This world will be ignored during removal - remove-entities: - - zombie - - skeleton - - enderman \ No newline at end of file diff --git a/Clearlag Core/META-INF/MANIFEST.MF b/common/META-INF/MANIFEST.MF similarity index 100% rename from Clearlag Core/META-INF/MANIFEST.MF rename to common/META-INF/MANIFEST.MF diff --git a/common/dependency-reduced-pom.xml b/common/dependency-reduced-pom.xml new file mode 100644 index 0000000..66e0f24 --- /dev/null +++ b/common/dependency-reduced-pom.xml @@ -0,0 +1,101 @@ + + + + clearlag + me.minebuilders + 2.9.0-SNAPSHOT + + 4.0.0 + ClearLag + 4.0.0 + + ${basedir}/src/main/java + clean install + + + . + true + ${basedir}/src/main/resources/ + + *.yml + + + + ./languages + true + ${basedir}/src/main/resources/languages + + *.lang + + + + ${project.artifactId}-${project.version} + + + maven-compiler-plugin + 3.14.1 + + 21 + 21 + + + + maven-jar-plugin + 3.4.2 + + + maven-shade-plugin + 3.6.1 + + + package + + shade + + + + + + + com.tcoded:FoliaLib + + + + + com.tcoded.folialib + me.minebuilders.clearlag.libs.folialib + + + + + + + + + paper-mc + https://repo.papermc.io/repository/maven-public/ + + + tcoded-releases + https://repo.tcoded.com/releases + + + + + io.papermc.paper + paper-api + 1.21.8-R0.1-SNAPSHOT + provided + + + com.googlecode.json-simple + json-simple + 1.1.1 + compile + + + + 21 + 21 + + diff --git a/Clearlag Core/pom.xml b/common/pom.xml similarity index 58% rename from Clearlag Core/pom.xml rename to common/pom.xml index 46dfc9f..489cf26 100644 --- a/Clearlag Core/pom.xml +++ b/common/pom.xml @@ -9,38 +9,50 @@ 4.0.0 - clearlag-core + ClearLag + 4.0.0 jar - 1.8 - 1.8 + 21 + 21 - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + paper-mc + https://repo.papermc.io/repository/maven-public/ + + + + tcoded-releases + https://repo.tcoded.com/releases - - - - org.spigotmc - spigot-api - 1.20.4-R0.1-SNAPSHOT + io.papermc.paper + paper-api + 1.21.8-R0.1-SNAPSHOT provided - + + com.tcoded + FoliaLib + 0.5.1 + compile + + + com.googlecode.json-simple + json-simple + 1.1.1 + - ${project.name} + ${project.artifactId}-${project.version} ${basedir}/src/main/java clean install @@ -67,24 +79,33 @@ org.apache.maven.plugins maven-compiler-plugin - 2.3.2 + 3.14.1 - 1.8 - 1.8 + 21 + 21 - org.apache.maven.plugins maven-jar-plugin - 2.3.1 + 3.4.2 - org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.6.1 + + + com.tcoded:FoliaLib + + + + + com.tcoded.folialib + me.minebuilders.clearlag.libs.folialib + + @@ -95,8 +116,6 @@ - - \ No newline at end of file diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/BukkitUpdater.java b/common/src/main/java/me/minebuilders/clearlag/BukkitUpdater.java similarity index 96% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/BukkitUpdater.java rename to common/src/main/java/me/minebuilders/clearlag/BukkitUpdater.java index b6b916f..526c885 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/BukkitUpdater.java +++ b/common/src/main/java/me/minebuilders/clearlag/BukkitUpdater.java @@ -28,7 +28,6 @@ private int versionToInt(String s) { } private boolean updateAvailable() throws Exception { - Util.log("Checking for updates compatible with your bukkit version [" + Util.getBukkitVersion() + "]..."); final HttpURLConnection conn = createConnection(HOST, 6000); @@ -46,11 +45,8 @@ private boolean updateAvailable() throws Exception { boolean isLegacy = bukkitversion.contains("1.7"); for (int i = array.size() - 1; i > 17; i--) { - line = ((JSONObject) array.get(i)); - final String ver = (String) line.get("gameVersion"); - if (ver.contains(bukkitversion) || (!isLegacy && !ver.contains("1.7"))) { break; } @@ -59,32 +55,26 @@ private boolean updateAvailable() throws Exception { this.newversion = line.get("name").toString(); this.download = (String) line.get("downloadUrl"); - return (versionToInt(Clearlag.getInstance().getDescription().getVersion()) < versionToInt(newversion)); + return (versionToInt(ClearLag.getInstance().getDescription().getVersion()) < versionToInt(newversion)); } private HttpURLConnection createConnection(String url, int timeout) throws Exception { - final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setConnectTimeout(timeout); - conn.setInstanceFollowRedirects(true); - conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36"); return conn; } public void run() { - try { - if (updateAvailable()) { - Util.log("Clearlag version " + newversion + " update available! Downloading..."); - - if (!Bukkit.getUpdateFolderFile().exists()) + if (!Bukkit.getUpdateFolderFile().exists()) { Bukkit.getUpdateFolderFile().mkdir(); + } HttpURLConnection conn = createConnection(download, 15000); @@ -97,7 +87,6 @@ public void run() { try (BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); FileOutputStream fout = new FileOutputStream(Bukkit.getUpdateFolderFile().getAbsolutePath() + "/" + file.getName())) { - final byte[] data = new byte[1024]; int count; @@ -106,11 +95,9 @@ public void run() { } Util.log("Updating finished! Restart your server for files to take effect"); - } catch (Exception e) { Util.log("Failed to download the latest update!"); } - } else { Util.log("No updates found!"); } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/Callback.java b/common/src/main/java/me/minebuilders/clearlag/Callback.java similarity index 98% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/Callback.java rename to common/src/main/java/me/minebuilders/clearlag/Callback.java index af996de..360d160 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/Callback.java +++ b/common/src/main/java/me/minebuilders/clearlag/Callback.java @@ -4,7 +4,5 @@ * @author bob7l */ public interface Callback { - void call(T t); - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/ChunkKey.java b/common/src/main/java/me/minebuilders/clearlag/ChunkKey.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/ChunkKey.java rename to common/src/main/java/me/minebuilders/clearlag/ChunkKey.java index aaa328e..9ef0411 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/ChunkKey.java +++ b/common/src/main/java/me/minebuilders/clearlag/ChunkKey.java @@ -63,5 +63,4 @@ public boolean equals(Object ob) { public boolean equals(ChunkKey ck) { return ck.getZ() == z && ck.getX() == x; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/Clearlag.java b/common/src/main/java/me/minebuilders/clearlag/ClearLag.java similarity index 91% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/Clearlag.java rename to common/src/main/java/me/minebuilders/clearlag/ClearLag.java index 1e3cbd8..aad0d07 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/Clearlag.java +++ b/common/src/main/java/me/minebuilders/clearlag/ClearLag.java @@ -1,5 +1,7 @@ package me.minebuilders.clearlag; +import com.tcoded.folialib.FoliaLib; +import com.tcoded.folialib.impl.PlatformScheduler; import me.minebuilders.clearlag.adapters.LatestVersionAdapter; import me.minebuilders.clearlag.adapters.LegacyVersionAdapter; import me.minebuilders.clearlag.adapters.VersionAdapter; @@ -20,12 +22,14 @@ import java.util.ArrayList; import java.util.List; -public class Clearlag extends JavaPlugin { +public class ClearLag extends JavaPlugin { @AutoWire private ConfigHandler config; - private static Clearlag instance; + private static ClearLag instance; + + private static PlatformScheduler scheduler; private static Module[] modules; @@ -35,10 +39,17 @@ public class Clearlag extends JavaPlugin { private final long initialBootTimestamp = System.currentTimeMillis(); + public static PlatformScheduler scheduler() { + return scheduler; + } + @Override public void onEnable() { - Clearlag.instance = this; + ClearLag.instance = this; + + FoliaLib foliaLib = new FoliaLib(this); + scheduler = foliaLib.getScheduler(); versionAdapter = findVersionAdapter(); @@ -139,13 +150,12 @@ private VersionAdapter findVersionAdapter() { for (Class versionAdapterType : versionAdapterTypes) { try { - final VersionAdapter tryingVersionAdapter = versionAdapterType.newInstance(); - - if (tryingVersionAdapter.isCompatible()) + if (tryingVersionAdapter.isCompatible()) { return tryingVersionAdapter; - - } catch (Throwable ignored) { } + } + } catch (Throwable ignored) { + } } return null; @@ -156,9 +166,7 @@ private void startModules() { Util.log("Loading modules..."); for (Module mod : modules) { - ConfigPath configPath = mod.getClass().getAnnotation(ConfigPath.class); - if (configPath == null || (getConfig().get(configPath.path() + ".enabled") == null || getConfig().getBoolean(configPath.path() + ".enabled"))) { mod.setEnabled(); } @@ -180,7 +188,7 @@ public void onDisable() { Util.log("Clearlag is now disabled!"); } - public static Clearlag getInstance() { + public static ClearLag getInstance() { return instance; } @@ -189,9 +197,7 @@ public static Module[] getModules() { } public static Module getModule(String name) { - for (Module module : modules) { - if (module.getClass().getSimpleName().equalsIgnoreCase(name)) { return module; } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/CommandListener.java b/common/src/main/java/me/minebuilders/clearlag/CommandListener.java similarity index 83% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/CommandListener.java rename to common/src/main/java/me/minebuilders/clearlag/CommandListener.java index d24e7bb..60bbc5f 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/CommandListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/CommandListener.java @@ -8,6 +8,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -17,25 +18,20 @@ public class CommandListener implements CommandExecutor { @LanguageValue(key = "command.lagg.") private MessageTree lang; - private final List cmds = new ArrayList(); + private final List cmds = new ArrayList<>(); public CommandListener() { - Clearlag.getInstance().getCommand("lagg").setExecutor(this); + ClearLag.getInstance().getCommand("lagg").setExecutor(this); } - - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { final CommandModule enteredSubCommand = (args.length > 0 ? getCmd(args[0]) : null); if (enteredSubCommand == null) { - final List cmds = getUserCmds(sender); - - if (cmds.size() == 0) { - + if (cmds.isEmpty()) { lang.sendMessage("nopermission", sender); - return false; } @@ -43,13 +39,12 @@ public boolean onCommand(CommandSender sender, Command command, String label, St lang.sendMessage("header", sender); - for (CommandModule cmd : cmds) + for (CommandModule cmd : cmds) { helpLineMessage.sendMessage(sender, cmd.getDisplayName(), cmd.getDescription()); + } lang.sendMessage("footer", sender); - } else { - try { enteredSubCommand.processCmd(sender, args); } catch (IllegalArgumentException e) { @@ -62,16 +57,13 @@ public boolean onCommand(CommandSender sender, Command command, String label, St return true; } - public void addCmd(CommandModule cmd) { cmds.add(cmd); } private CommandModule getCmd(String s) { s = s.toLowerCase(); - for (CommandModule cmd : cmds) { - if (cmd != null && cmd.getDisplayName().equals(s)) { return cmd; } @@ -81,11 +73,8 @@ private CommandModule getCmd(String s) { } private List getUserCmds(CommandSender p) { - - List mod = new ArrayList(); - + List mod = new ArrayList<>(); for (CommandModule cmd : cmds) { - if (p.hasPermission("lagg." + cmd.getName())) { mod.add(cmd); } @@ -93,5 +82,4 @@ private List getUserCmds(CommandSender p) { return mod; } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/MutableInt.java b/common/src/main/java/me/minebuilders/clearlag/MutableInt.java similarity index 100% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/MutableInt.java rename to common/src/main/java/me/minebuilders/clearlag/MutableInt.java diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/RAMUtil.java b/common/src/main/java/me/minebuilders/clearlag/RAMUtil.java similarity index 100% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/RAMUtil.java rename to common/src/main/java/me/minebuilders/clearlag/RAMUtil.java diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/Util.java b/common/src/main/java/me/minebuilders/clearlag/Util.java similarity index 82% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/Util.java rename to common/src/main/java/me/minebuilders/clearlag/Util.java index 89a9d00..12230b9 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/Util.java +++ b/common/src/main/java/me/minebuilders/clearlag/Util.java @@ -34,15 +34,19 @@ public static ChatColor getChatColorByNumberLength(int variable, int yellowSize, } public static void shiftRight(Object[] list, int dropIndex) { - - if (list.length < 2) return; + if (list.length < 2) { + return; + } System.arraycopy(list, dropIndex, list, dropIndex + 1, list.length - 1 - dropIndex); - } public static void postToMainThread(Runnable runnable) { - Bukkit.getScheduler().runTask(Clearlag.getInstance(), runnable); + if (Bukkit.isPrimaryThread()) { + runnable.run(); + } else { + ClearLag.scheduler().runNextTick(task -> runnable.run()); + } } public static boolean isInteger(String s) { @@ -50,14 +54,24 @@ public static boolean isInteger(String s) { } public static boolean isInteger(String s, int radix) { - if (s.isEmpty()) return false; + if (s.isEmpty()) { + return false; + } + for (int i = 0; i < s.length(); i++) { if (i == 0 && s.charAt(i) == '-') { - if (s.length() == 1) return false; - else continue; + if (s.length() == 1) { + return false; + } else { + continue; + } + } + + if (Character.digit(s.charAt(i), radix) < 0) { + return false; } - if (Character.digit(s.charAt(i), radix) < 0) return false; } + return true; } @@ -77,9 +91,7 @@ public static String[] cloneAndReplaceStringArr(String[] stringArr, String key, } public static EntityType getEntityTypeFromString(String s) { - @SuppressWarnings("deprecation") EntityType et = EntityType.fromName(s); - if (et != null) { return et; } @@ -93,6 +105,7 @@ public static EntityType getEntityTypeFromString(String s) { } } } + return null; } @@ -101,36 +114,28 @@ public static String getRawBukkitVersion() { } public static String getBukkitVersion() { - String[] v = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3].split("-")[0].split("_"); - return v[0].replace("v", "") + "." + v[1]; } public static Date parseTime(String time) { - try { - String[] frag = time.split("-"); - - if (frag.length < 2) + if (frag.length < 2) { return new Date(); + } SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - return dateFormat.parse(frag[0] + "-" + frag[1] + "-" + frag[2]); - } catch (Exception e) { return new Date(); } } public static String getTime(long time) { - long seconds = Math.abs(time) / 1000L; final StringBuilder message = new StringBuilder(); - if (seconds >= 86400) { int days = (int) (seconds / 86400); seconds %= 86400; @@ -142,7 +147,9 @@ public static String getTime(long time) { int hours = (int) (seconds / 3600); seconds %= 3600; - if (message.length() > 0) message.append(", "); + if (!message.isEmpty()) { + message.append(", "); + } message.append(hours).append(hours > 1 ? " hours" : " hour"); } @@ -151,18 +158,21 @@ public static String getTime(long time) { int min = (int) (seconds / 60); seconds %= 60; - if (message.length() > 0) message.append(", "); + if (!message.isEmpty()) { + message.append(", "); + } message.append(min).append(min > 1 ? " minutes" : " minute"); } if (seconds >= 0) { - if (message.length() > 0) message.append(", "); + if (!message.isEmpty()) { + message.append(", "); + } message.append(seconds).append(seconds > 1 ? " seconds" : " second"); } return message.toString(); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java b/common/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java similarity index 89% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java rename to common/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java index 7ffda91..e5d1f22 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java +++ b/common/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java @@ -19,13 +19,9 @@ public boolean isCompatible() { @Override public ItemStack createMapItemStack(MapView mapView) { - final ItemStack item = new ItemStack(Material.FILLED_MAP); - final MapMeta meta = (MapMeta) item.getItemMeta(); - meta.setMapView(mapView); - item.setItemMeta(meta); return item; @@ -33,18 +29,20 @@ public ItemStack createMapItemStack(MapView mapView) { @Override public boolean isMapItemStackEqual(ItemStack itemStack, ItemStack itemStack2) { - - if (itemStack.getType() != itemStack2.getType()) + if (itemStack.getType() != itemStack2.getType()) { return false; + } final MapMeta meta = (MapMeta) itemStack.getItemMeta(); final MapMeta meta2 = (MapMeta) itemStack2.getItemMeta(); - if (meta == meta2) + if (meta == meta2) { return true; + } - if (meta == null || meta2 == null || meta.getMapView() == null || meta2.getMapView() == null) + if (meta == null || meta2 == null || meta.getMapView() == null || meta2.getMapView() == null) { return false; + } return meta.getMapView().equals(meta2.getMapView()); } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java b/common/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java similarity index 94% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java rename to common/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java index 60f7e20..541ccc9 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java +++ b/common/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java @@ -27,24 +27,17 @@ public class LegacyVersionAdapter implements VersionAdapter { @Override public boolean isCompatible() { - return (Material.getMaterial("MAP") != null && mcItemSetAge != null && itemField != null); + return Material.getMaterial("MAP") != null; } @Override public ItemStack createMapItemStack(MapView mapView) { - final ItemStack mapItemStack = new ItemStack(Material.MAP, 1); - try { - final Method method = MapView.class.getDeclaredMethod("getId"); - method.setAccessible(true); - short id = (short) method.invoke(mapView); - mapItemStack.setDurability(id); - } catch (Exception e) { e.printStackTrace(); } @@ -59,14 +52,10 @@ public boolean isMapItemStackEqual(ItemStack itemStack, ItemStack itemStack2) { @Override public void setItemEntityAge(Item item, int age) { - try { item.setTicksLived(age); - final Object nmsEntity = itemField.get(item); - mcItemSetAge.set(nmsEntity, age); - } catch (Throwable e) { e.printStackTrace(); } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java b/common/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java rename to common/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java index 50de102..7290af0 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java +++ b/common/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java @@ -16,5 +16,4 @@ public interface VersionAdapter { boolean isMapItemStackEqual(ItemStack itemStack, ItemStack itemStack2); void setItemEntityAge(Item item, int ticks); - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/AutoWire.java b/common/src/main/java/me/minebuilders/clearlag/annotations/AutoWire.java similarity index 51% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/AutoWire.java rename to common/src/main/java/me/minebuilders/clearlag/annotations/AutoWire.java index 3990d48..cd71c4c 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/AutoWire.java +++ b/common/src/main/java/me/minebuilders/clearlag/annotations/AutoWire.java @@ -1,6 +1,10 @@ package me.minebuilders.clearlag.annotations; -import java.lang.annotation.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * @author bob7l @@ -10,7 +14,5 @@ @Inherited @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) - public @interface AutoWire { - } diff --git a/common/src/main/java/me/minebuilders/clearlag/annotations/ConfigModule.java b/common/src/main/java/me/minebuilders/clearlag/annotations/ConfigModule.java new file mode 100644 index 0000000..f5ad686 --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/annotations/ConfigModule.java @@ -0,0 +1,16 @@ +package me.minebuilders.clearlag.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by TCP on 2/5/2016. + */ +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ConfigModule { +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigPath.java b/common/src/main/java/me/minebuilders/clearlag/annotations/ConfigPath.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigPath.java rename to common/src/main/java/me/minebuilders/clearlag/annotations/ConfigPath.java index 8c51ecb..bef7e3d 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigPath.java +++ b/common/src/main/java/me/minebuilders/clearlag/annotations/ConfigPath.java @@ -10,9 +10,6 @@ */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) - public @interface ConfigPath { - String path(); - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigValue.java b/common/src/main/java/me/minebuilders/clearlag/annotations/ConfigValue.java similarity index 63% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigValue.java rename to common/src/main/java/me/minebuilders/clearlag/annotations/ConfigValue.java index 0297dfa..8dc7ee8 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/annotations/ConfigValue.java +++ b/common/src/main/java/me/minebuilders/clearlag/annotations/ConfigValue.java @@ -2,20 +2,20 @@ import me.minebuilders.clearlag.config.ConfigValueType; -import java.lang.annotation.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * Created by TCP on 2/3/2016. */ - @Inherited @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) - public @interface ConfigValue { - String path() default ""; ConfigValueType valueType() default ConfigValueType.PRIMITIVE; - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/AdminCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/AdminCmd.java similarity index 85% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/AdminCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/AdminCmd.java index 864af0a..3da5a6f 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/AdminCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/AdminCmd.java @@ -1,6 +1,6 @@ package me.minebuilders.clearlag.commands; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.config.ConfigHandler; import me.minebuilders.clearlag.language.LanguageValue; @@ -22,52 +22,32 @@ public class AdminCmd extends CommandModule { @Override protected void run(CommandSender sender, String[] args) { - if (args.length == 0) { - lang.sendMessage("help", sender); - } else { - final String cmd = args[0]; - if (cmd.equalsIgnoreCase("reload")) { - if (args.length == 1) { - StringBuilder sb = new StringBuilder(); - - for (Module m : Clearlag.getModules()) { + for (Module m : ClearLag.getModules()) { if (m.isEnabled() && ConfigHandler.containsReloadableFields(m)) { sb.append(", ").append(m.getClass().getSimpleName()); } } lang.sendMessage("enabledModules", sender, (sb.length() > 1 ? sb.substring(2) : "None")); - } else { - - Module mod = Clearlag.getModule(args[1]); - + Module mod = ClearLag.getModule(args[1]); if (mod != null) { - if (!ConfigHandler.containsReloadableFields(mod)) { - lang.sendMessage("noReloadableFields", sender, mod.getClass().getSimpleName()); - } else if (!mod.isEnabled()) { - lang.sendMessage("notEnabled", sender, mod.getClass().getSimpleName()); - } else { - try { configHandler.reloadConfig(); - configHandler.setObjectConfigValues(mod); - lang.sendMessage("reload", sender, mod.getClass().getSimpleName()); - } catch (Exception e) { lang.sendMessage("failedReload", sender, mod.getClass().getSimpleName()); } @@ -76,26 +56,19 @@ protected void run(CommandSender sender, String[] args) { lang.sendMessage("invalidModule", sender, args[1]); } } - } else if (cmd.equalsIgnoreCase("stop")) { - if (args.length == 1) { - StringBuilder sb = new StringBuilder(); - - for (Module m : Clearlag.getModules()) { + for (Module m : ClearLag.getModules()) { if (m.isEnabled()) { sb.append(", ").append(m.getClass().getSimpleName()); } } lang.sendMessage("enabledModules", sender, sb.substring(2)); - } else { - Module mod = Clearlag.getModule(args[1]); - + Module mod = ClearLag.getModule(args[1]); if (mod != null) { - if (!mod.isEnabled()) { lang.sendMessage("notEnabled", sender, mod.getClass().getSimpleName()); } else { @@ -107,55 +80,40 @@ protected void run(CommandSender sender, String[] args) { lang.sendMessage("invalidModule", sender, args[1]); } } - } else if (cmd.equalsIgnoreCase("start")) { - if (args.length == 1) { - StringBuilder sb = new StringBuilder(); - - for (Module m : Clearlag.getModules()) { + for (Module m : ClearLag.getModules()) { if (!m.isEnabled()) sb.append(", ").append(m.getClass().getSimpleName()); } lang.sendMessage("startableModules", sender, sb.substring(2)); - } else { - Module mod = Clearlag.getModule(args[1]); - + Module mod = ClearLag.getModule(args[1]); if (mod != null) { if (mod.isEnabled()) { lang.sendMessage("alreadyEnabled", sender, mod.getClass().getSimpleName()); } else { mod.setEnabled(); - lang.sendMessage("enabled", sender, mod.getClass().getSimpleName()); } } else { lang.sendMessage("invalidModule", sender, args[1]); } } - } else if (cmd.equalsIgnoreCase("list")) { - StringBuilder events = new StringBuilder(); StringBuilder commands = new StringBuilder(); StringBuilder tasks = new StringBuilder(); StringBuilder modules = new StringBuilder(); - - for (Module m : Clearlag.getModules()) { - + for (Module m : ClearLag.getModules()) { String s = ChatColor.DARK_GRAY + ", " + (m.isEnabled() ? ChatColor.GREEN : ChatColor.GRAY) + m.getClass().getSimpleName(); - - if (m instanceof EventModule) { - events.append(s); - } else if (m instanceof CommandModule) { - commands.append(s); - } else if (m instanceof TaskModule) { - tasks.append(s); - } else { - modules.append(s); + switch (m) { + case EventModule eventModule -> events.append(s); + case CommandModule commandModule -> commands.append(s); + case TaskModule taskModule -> tasks.append(s); + default -> modules.append(s); } } diff --git a/common/src/main/java/me/minebuilders/clearlag/commands/AreaCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/AreaCmd.java new file mode 100644 index 0000000..6e7bffc --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/commands/AreaCmd.java @@ -0,0 +1,69 @@ +package me.minebuilders.clearlag.commands; + +import me.minebuilders.clearlag.annotations.AutoWire; +import me.minebuilders.clearlag.annotations.ConfigModule; +import me.minebuilders.clearlag.exceptions.WrongCommandArgumentException; +import me.minebuilders.clearlag.language.LanguageValue; +import me.minebuilders.clearlag.language.messages.MessageTree; +import me.minebuilders.clearlag.managers.EntityManager; +import me.minebuilders.clearlag.modules.CommandModule; +import me.minebuilders.clearlag.removetype.AreaClear; +import me.minebuilders.clearlag.ClearLag; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class AreaCmd extends CommandModule { + + @ConfigModule + private final AreaClear areaClear = new AreaClear(); + + @AutoWire + private EntityManager entityManager; + + @LanguageValue(key = "command.area.") + private MessageTree lang; + + public AreaCmd() { + argLength = 1; + } + + @Override + protected void run(Player player, String[] args) throws WrongCommandArgumentException { + try { + final int radius = Integer.parseInt(args[0]); + + final World world = player.getWorld(); + final double px = player.getLocation().getX(); + final double py = player.getLocation().getY(); + final double pz = player.getLocation().getZ(); + final double r2 = (double) radius * (double) radius; + + ClearLag.scheduler().runNextTick(task -> { + final List nearby = new ArrayList<>(); + + for (Entity e : world.getEntities()) { + if (e.getWorld() != world) continue; + + final double dx = e.getLocation().getX() - px; + final double dy = e.getLocation().getY() - py; + final double dz = e.getLocation().getZ() - pz; + + if ((dx * dx + dy * dy + dz * dz) <= r2) { + nearby.add(e); + } + } + + final int removed = entityManager.removeEntities(areaClear.getRemovables(nearby, world), world); + + ClearLag.scheduler().runAtEntity(player, nextTask -> lang.sendMessage("message", player, removed, radius)); + }); + + } catch (NumberFormatException e) { + throw new WrongCommandArgumentException(lang.getMessage("error")); + } + } +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/CheckChunkCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/CheckChunkCmd.java similarity index 93% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/CheckChunkCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/CheckChunkCmd.java index ffb5be9..d867c7e 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/CheckChunkCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/CheckChunkCmd.java @@ -23,22 +23,16 @@ public class CheckChunkCmd extends CommandModule { @Override protected void run(Player sender, String[] args) { - final Chunk c = sender.getLocation().getChunk(); - final Map, Integer> tileEntityCountMap = new IdentityHashMap<>(100); - final Map entityCountMap = new IdentityHashMap<>(100); - - for (BlockState bt : c.getTileEntities()) + for (BlockState bt : c.getTileEntities()) { tileEntityCountMap.merge(bt.getClass(), 1, Integer::sum); - + } for (Entity e : c.getEntities()) { - final EntityType type = e.getType(); - entityCountMap.merge(type, 1, Integer::sum); } @@ -46,17 +40,16 @@ protected void run(Player sender, String[] args) { lang.sendMessage("tilelist", sender); - for (Map.Entry, Integer> tileEntry : tileEntityCountMap.entrySet()) + for (Map.Entry, Integer> tileEntry : tileEntityCountMap.entrySet()) { lineMessage.sendMessage(sender, tileEntry.getValue(), tileEntry.getKey().getSimpleName().replace("Craft", "")); - + } lang.sendMessage("entitylist", sender); - for (Map.Entry entityEntry : entityCountMap.entrySet()) + for (Map.Entry entityEntry : entityCountMap.entrySet()) { lineMessage.sendMessage(sender, entityEntry.getValue(), entityEntry.getKey().name().toLowerCase().replace("_", " ")); - + } lang.sendMessage("footer", sender); } - } diff --git a/common/src/main/java/me/minebuilders/clearlag/commands/CheckCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/CheckCmd.java new file mode 100644 index 0000000..a2de7ce --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/commands/CheckCmd.java @@ -0,0 +1,178 @@ +package me.minebuilders.clearlag.commands; + +import me.minebuilders.clearlag.ClearLag; +import me.minebuilders.clearlag.RAMUtil; +import me.minebuilders.clearlag.Util; +import me.minebuilders.clearlag.annotations.AutoWire; +import me.minebuilders.clearlag.exceptions.WrongCommandArgumentException; +import me.minebuilders.clearlag.language.LanguageValue; +import me.minebuilders.clearlag.language.messages.MessageTree; +import me.minebuilders.clearlag.modules.CommandModule; +import me.minebuilders.clearlag.tasks.TPSTask; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.block.BlockState; +import org.bukkit.block.CreatureSpawner; +import org.bukkit.block.Hopper; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Creature; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.Monster; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.Location; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class CheckCmd extends CommandModule { + + @AutoWire + private TPSTask tpsTask; + + @LanguageValue(key = "command.check.") + private MessageTree lang; + + @Override + protected void run(CommandSender sender, String[] args) throws WrongCommandArgumentException { + final List worlds; + if (args.length > 0) { + worlds = new ArrayList<>(args.length); + for (String arg : args) { + World world = Bukkit.getWorld(arg); + if (world == null) { + throw new WrongCommandArgumentException(lang.getMessage("invalidworld"), arg); + } + + worlds.add(world); + } + } else { + worlds = Bukkit.getWorlds(); + } + + final AtomicInteger removed = new AtomicInteger(0); + final AtomicInteger mobs = new AtomicInteger(0); + final AtomicInteger animals = new AtomicInteger(0); + final AtomicInteger chunks = new AtomicInteger(0); + final AtomicInteger spawners = new AtomicInteger(0); + final AtomicInteger activehoppers = new AtomicInteger(0); + final AtomicInteger inactivehoppers = new AtomicInteger(0); + final AtomicInteger players = new AtomicInteger(0); + + final List all = new ArrayList<>(); + for (World w : worlds) { + Collections.addAll(all, w.getLoadedChunks()); + } + + if (all.isEmpty()) { + lang.sendMessage("header", sender); + lang.sendMessage("printed", sender, + 0, 0, 0, 0, 0, 0, 0, 0, + Util.getTime(System.currentTimeMillis() - ClearLag.getInstance().getInitialBootTimestamp()), + tpsTask.getStringTPS(), + RAMUtil.getUsedMemory(), RAMUtil.getMaxMemory(), + (RAMUtil.getMaxMemory() - RAMUtil.getUsedMemory()) + ); + lang.sendMessage("footer", sender); + return; + } + + final AtomicInteger pending = new AtomicInteger(all.size()); + + for (Chunk c : all) { + final World w = c.getWorld(); + final int cx = c.getX(); + final int cz = c.getZ(); + final int lx = (cx << 4) + 8; + final int lz = (cz << 4) + 8; + final int ly = w.getMinHeight() + 1; + + Location loc = new Location(w, lx, ly, lz); + + ClearLag.scheduler().runAtLocation(loc, task -> { + try { + final Chunk rc = w.getChunkAt(cx, cz); + + for (BlockState bt : rc.getTileEntities()) { + if (bt instanceof CreatureSpawner) { + spawners.incrementAndGet(); + } else if (bt instanceof Hopper hop) { + if (!isHopperEmpty(hop)) { + activehoppers.incrementAndGet(); + } else { + inactivehoppers.incrementAndGet(); + } + } + } + + for (Entity e : rc.getEntities()) { + switch (e) { + case Monster monster -> mobs.incrementAndGet(); + case Player p -> players.incrementAndGet(); + case Creature creature -> animals.incrementAndGet(); + case Item item -> removed.incrementAndGet(); + default -> { + } + } + } + + chunks.incrementAndGet(); + } finally { + if (pending.decrementAndGet() == 0) { + if (sender instanceof Player plr) { + ClearLag.scheduler().runAtEntity(plr, t -> { + lang.sendMessage("header", plr); + lang.sendMessage("printed", plr, + removed.get(), + mobs.get(), + animals.get(), + players.get(), + chunks.get(), + activehoppers.get(), + inactivehoppers.get(), + spawners.get(), + Util.getTime(System.currentTimeMillis() - ClearLag.getInstance().getInitialBootTimestamp()), + tpsTask.getStringTPS(), + RAMUtil.getUsedMemory(), RAMUtil.getMaxMemory(), + (RAMUtil.getMaxMemory() - RAMUtil.getUsedMemory()) + ); + lang.sendMessage("footer", plr); + }); + } else { + ClearLag.scheduler().runNextTick(t -> { + lang.sendMessage("header", sender); + lang.sendMessage("printed", sender, + removed.get(), + mobs.get(), + animals.get(), + players.get(), + chunks.get(), + activehoppers.get(), + inactivehoppers.get(), + spawners.get(), + Util.getTime(System.currentTimeMillis() - ClearLag.getInstance().getInitialBootTimestamp()), + tpsTask.getStringTPS(), + RAMUtil.getUsedMemory(), RAMUtil.getMaxMemory(), + (RAMUtil.getMaxMemory() - RAMUtil.getUsedMemory()) + ); + lang.sendMessage("footer", sender); + }); + } + } + } + }); + } + } + + private boolean isHopperEmpty(Hopper hop) { + for (ItemStack it : hop.getInventory().getContents()) { + if (it != null) return false; + } + + return true; + } +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ChunkCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/ChunkCmd.java similarity index 80% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ChunkCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/ChunkCmd.java index 44b0f7c..0d038f5 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ChunkCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/ChunkCmd.java @@ -9,6 +9,8 @@ import org.bukkit.World; import org.bukkit.command.CommandSender; +import java.util.concurrent.atomic.AtomicInteger; + public class ChunkCmd extends CommandModule { @LanguageValue(key = "command.chunk.header") @@ -19,23 +21,15 @@ public class ChunkCmd extends CommandModule { @Override protected void run(CommandSender sender, String[] args) { - - final int size = (args.length >= 1 && Util.isInteger(args[0])) ? Integer.parseInt(args[0]) : 5; - - final Integer[] sizes = new Integer[size]; - - final Chunk[] chunks = new Chunk[size]; + final AtomicInteger size = new AtomicInteger((args.length >= 1 && Util.isInteger(args[0])) ? Integer.parseInt(args[0]) : 5); + final Integer[] sizes = new Integer[size.get()]; + final Chunk[] chunks = new Chunk[size.get()]; for (World world : Bukkit.getWorlds()) { - for (Chunk c : world.getLoadedChunks()) { - final int amount = c.getEntities().length; - - for (int i = 0; i < size; i++) { - + for (int i = 0; i < size.get(); i++) { if (sizes[i] == null || sizes[i] < amount) { - Util.shiftRight(chunks, i); Util.shiftRight(sizes, i); @@ -49,12 +43,9 @@ protected void run(CommandSender sender, String[] args) { } header.sendMessage(sender); - for (int i = 0; i < sizes.length; i++) { - final Chunk c = chunks[i]; - outprint.sendMessage(sender, (i + 1), c.getWorld().getName(), c.getX(), c.getZ(), sizes[i]); } } -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ClearCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/ClearCmd.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ClearCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/ClearCmd.java index 97e6673..f460b6a 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ClearCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/ClearCmd.java @@ -30,16 +30,11 @@ public class ClearCmd extends CommandModule { @Override protected void run(CommandSender sender, String[] args) { - final int i = entityManager.removeEntities(cmdClear); - if (configHandler.getConfig().getBoolean("command-remove.broadcast-removal")) { - broadcastHandler.broadcast(configHandler.getConfig().getString("auto-removal.broadcast-message").replace("+RemoveAmount", "" + i)); - } else { clearMessage.sendMessage(sender, i); } } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/GcCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/GcCmd.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/GcCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/GcCmd.java index 9d1883c..8ebe618 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/GcCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/GcCmd.java @@ -12,11 +12,7 @@ public class GcCmd extends CommandModule { @Override protected void run(CommandSender sender, String[] args) { - message.sendMessage(sender); - System.gc(); - } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/HaltCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/HaltCmd.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/HaltCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/HaltCmd.java index 78cc5fd..6e25454 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/HaltCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/HaltCmd.java @@ -17,19 +17,12 @@ public class HaltCmd extends CommandModule { @Override protected void run(CommandSender sender, String[] args) { - if (!halttask.isEnabled() && (args.length <= 0 || args[0].equalsIgnoreCase("on"))) { - halttask.setEnabled(); - lang.sendMessage("halted", sender); - } else if (halttask.isEnabled() && (args.length <= 0 || args[0].equalsIgnoreCase("off"))) { - halttask.setDisabled(); - lang.sendMessage("unhalted", sender); - } else { wrongUsage.sendMessage(sender, usage, displayName); } diff --git a/common/src/main/java/me/minebuilders/clearlag/commands/KillmobsCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/KillmobsCmd.java new file mode 100644 index 0000000..bf3d899 --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/commands/KillmobsCmd.java @@ -0,0 +1,85 @@ +package me.minebuilders.clearlag.commands; + +import me.minebuilders.clearlag.ClearLag; +import me.minebuilders.clearlag.annotations.AutoWire; +import me.minebuilders.clearlag.annotations.ConfigModule; +import me.minebuilders.clearlag.config.ConfigHandler; +import me.minebuilders.clearlag.language.LanguageValue; +import me.minebuilders.clearlag.language.messages.Message; +import me.minebuilders.clearlag.managers.EntityManager; +import me.minebuilders.clearlag.modules.CommandModule; +import me.minebuilders.clearlag.removetype.KillMobsClear; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +public class KillmobsCmd extends CommandModule { + + @ConfigModule + private final KillMobsClear killMobsClear = new KillMobsClear(); + + @AutoWire + private EntityManager entityManager; + + @AutoWire + private ConfigHandler configHandler; + + @LanguageValue(key = "command.killmobs.message") + private Message killMobsMessage; + + @Override + protected void run(CommandSender sender, String[] args) { + final List worlds = Bukkit.getWorlds(); + final AtomicInteger pendingWorlds = new AtomicInteger(worlds.size()); + final AtomicInteger totalRemoved = new AtomicInteger(0); + + if (worlds.isEmpty()) { + killMobsMessage.sendMessage(sender, 0); + return; + } + + for (World w : worlds) { + final Entity[] snapshot = w.getEntities().toArray(new Entity[0]); + + if (snapshot.length == 0) { + if (pendingWorlds.decrementAndGet() == 0) { + killMobsMessage.sendMessage(sender, totalRemoved.get()); + } + continue; + } + + final ConcurrentLinkedQueue matched = new ConcurrentLinkedQueue<>(); + final AtomicInteger pending = new AtomicInteger(snapshot.length); + + for (Entity en : snapshot) { + ClearLag.scheduler().runAtEntity(en, task -> { + try { + if (killMobsClear.isWorldEnabled(w) && killMobsClear.isRemovable(en)) { + matched.add(en); + } + } finally { + if (pending.decrementAndGet() == 0) { + final int removed = entityManager.removeEntities(new ArrayList<>(matched), w); + totalRemoved.addAndGet(removed); + + if (pendingWorlds.decrementAndGet() == 0) { + if (sender instanceof Player plr) { + ClearLag.scheduler().runAtEntity(plr, nextTask -> killMobsMessage.sendMessage(plr, totalRemoved.get())); + } else { + ClearLag.scheduler().runNextTick(additionalTask -> killMobsMessage.sendMessage(sender, totalRemoved.get())); + } + } + } + } + }); + } + } + } +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/MemoryCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/MemoryCmd.java similarity index 88% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/MemoryCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/MemoryCmd.java index 8fe0551..14e8017 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/MemoryCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/MemoryCmd.java @@ -30,33 +30,31 @@ public MemoryCmd() { @Override protected void run(Player p, String[] args) throws WrongCommandArgumentException { - if (p.getInventory().getItemInHand() != null && p.getInventory().getItemInHand().getType() != Material.AIR) + if (p.getInventory().getItemInHand().getType() != Material.AIR) { p.getWorld().dropItem(p.getLocation(), p.getItemInHand()); + } int sampleRate = 5; if (args.length > 0) { - - if (!Util.isInteger(args[0])) + if (!Util.isInteger(args[0])) { throw new WrongCommandArgumentException(lang.getMessage("invalidinteger"), args[0]); + } sampleRate = Math.max(1, Integer.parseInt(args[0])); } final MapView view = Bukkit.createMap(p.getWorld()); - view.setScale(MapView.Scale.NORMAL); - for (MapRenderer renderer : view.getRenderers()) + for (MapRenderer renderer : view.getRenderers()) { view.removeRenderer(renderer); + } final ItemStack mapItemStack = versionAdapter.createMapItemStack(view); - view.addRenderer(new MemoryRenderer(p, sampleRate, mapItemStack, versionAdapter, view)); - p.setItemInHand(mapItemStack); lang.getMessage("message").sendMessage(p); } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/PerformanceCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/PerformanceCmd.java similarity index 89% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/PerformanceCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/PerformanceCmd.java index b526bcd..af1489b 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/PerformanceCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/PerformanceCmd.java @@ -30,30 +30,27 @@ public PerformanceCmd() { @Override protected void run(Player p, String[] args) throws WrongCommandArgumentException { - if (p.getInventory().getItemInHand() != null && p.getInventory().getItemInHand().getType() != Material.AIR) + if (p.getInventory().getItemInHand().getType() != Material.AIR) { p.getWorld().dropItem(p.getLocation(), p.getItemInHand()); + } int sampleRate = 1; - if (args.length > 0) { - - if (!Util.isInteger(args[0])) + if (!Util.isInteger(args[0])) { throw new WrongCommandArgumentException(lang.getMessage("invalidinteger"), args[0]); + } sampleRate = Math.max(1, Integer.parseInt(args[0])); } final MapView view = Bukkit.createMap(p.getWorld()); - view.setScale(MapView.Scale.NORMAL); - - for (MapRenderer renderer : view.getRenderers()) + for (MapRenderer renderer : view.getRenderers()) { view.removeRenderer(renderer); + } final ItemStack mapItemStack = versionAdapter.createMapItemStack(view); - view.addRenderer(new ProcessRenderer(p, sampleRate, mapItemStack, versionAdapter, view, Thread.currentThread())); - p.setItemInHand(mapItemStack); lang.getMessage("message").sendMessage(p); diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ProfileCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/ProfileCmd.java similarity index 80% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ProfileCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/ProfileCmd.java index 4f1cb3b..a3e12cb 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ProfileCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/ProfileCmd.java @@ -17,10 +17,9 @@ import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.entity.EntitySpawnEvent; -import org.bukkit.scheduler.BukkitRunnable; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * @author bob7l @@ -46,32 +45,23 @@ public ProfileCmd() { @Override protected void run(final CommandSender sender, String[] args) throws WrongCommandArgumentException { - - if (!Util.isInteger(args[0])) + if (!Util.isInteger(args[0])) { throw new WrongCommandArgumentException(lang.getMessage("invalidtime"), args[0]); + } final Callback> callback = chunkKeyMutableIntMap -> { - if (chunkKeyMutableIntMap.isEmpty()) { - lang.sendMessage("nosamples", sender); - return; } final int size = 10; - final Integer[] sizes = new Integer[size]; final ChunkKey[] chunks = new ChunkKey[size]; - for (Map.Entry entry : chunkKeyMutableIntMap.entrySet()) { - final int amount = entry.getValue().getValue(); - for (int i = 0; i < size; i++) { - if (sizes[i] == null || sizes[i] < amount) { - Util.shiftRight(chunks, i); Util.shiftRight(sizes, i); @@ -86,75 +76,56 @@ protected void run(final CommandSender sender, String[] args) throws WrongComman lang.sendMessage("header", sender); for (int i = 0; i < sizes.length; i++) { + if (sizes[i] == null || chunks[i] == null) { + break; + } ChunkKey c = chunks[i]; - lineMessage.sendMessage(sender, (i + 1), c.getWorld().getName(), c.getX(), c.getZ(), sizes[i]); } }; ProfileSession profileSession = null; - for (ProfilerFactory factory : profilerFactories) { - - if (factory.getId().equalsIgnoreCase(args[1])) { + if (factory.id().equalsIgnoreCase(args[1])) { profileSession = factory.constructProfiler(callback); break; } } if (profileSession == null) { - final StringBuilder sb = new StringBuilder(); - for (ProfilerFactory factory : profilerFactories) { - - if (sb.length() > 0) + if (!sb.isEmpty()) sb.append(", "); - - sb.append(factory.getId()); + sb.append(factory.id()); } throw new WrongCommandArgumentException(lang.getMessage("invalidprofiler"), args[1], sb.toString()); } - profileSession.runTaskLater(Clearlag.getInstance(), Integer.parseInt(args[0]) * 20L); - - Bukkit.getPluginManager().registerEvents(profileSession, Clearlag.getInstance()); + ClearLag.scheduler().runLater(profileSession, Integer.parseInt(args[0]) * 20L); + Bukkit.getPluginManager().registerEvents(profileSession, ClearLag.getInstance()); lang.sendMessage("started", sender, args[0]); } - private static class ProfilerFactory { - - private final String id; - - private final Class sessionClass; - - public ProfilerFactory(String id, Class sessionClass) { - this.id = id; - this.sessionClass = sessionClass; - } + private record ProfilerFactory(String id, Class sessionClass) { public ProfileSession constructProfiler(Callback> callback) { - try { - return (ProfileSession) sessionClass.getDeclaredConstructors()[0].newInstance(callback); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } + try { + return (ProfileSession) sessionClass.getDeclaredConstructors()[0].newInstance(callback); + } catch (Exception e) { + e.printStackTrace(); + } - public String getId() { - return id; + return null; + } } - } - - - private static abstract class ProfileSession extends BukkitRunnable implements Listener { - final Map chunkMap = new HashMap<>(); + private static abstract class ProfileSession implements Listener, Runnable { + final Map chunkMap = new ConcurrentHashMap<>(); final Callback> callback; public ProfileSession(Callback> callback) { @@ -163,23 +134,20 @@ public ProfileSession(Callback> callback) { @Override public void run() { - HandlerList.unregisterAll(this); - callback.call(chunkMap); } protected void incrementMap(Chunk chunk) { - final ChunkKey key = new ChunkKey(chunk); + chunkMap.compute(key, (k, v) -> { + if (v == null) { + return new MutableInt(1); + } - MutableInt count = chunkMap.get(key); - - if (count == null) { - count = new MutableInt(1); - chunkMap.put(key, count); - } else - count.increment(); + v.increment(); + return v; + }); } } @@ -230,5 +198,4 @@ public void onEntitySpawn(EntitySpawnEvent event) { incrementMap(event.getLocation().getChunk()); } } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ReloadCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/ReloadCmd.java similarity index 82% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ReloadCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/ReloadCmd.java index 31a3960..af5965a 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/ReloadCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/ReloadCmd.java @@ -1,9 +1,10 @@ package me.minebuilders.clearlag.commands; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.config.ConfigHandler; +import me.minebuilders.clearlag.language.LanguageManager; import me.minebuilders.clearlag.language.LanguageValue; import me.minebuilders.clearlag.language.messages.MessageTree; import me.minebuilders.clearlag.modules.CommandModule; @@ -15,6 +16,9 @@ public class ReloadCmd extends CommandModule { @AutoWire private ConfigHandler configHandler; + @AutoWire + private LanguageManager languageManager; + @LanguageValue(key = "command.reload.") private MessageTree lang; @@ -23,11 +27,9 @@ protected void run(CommandSender sender, String[] args) { lang.sendMessage("begin", sender); - for (Module mod : Clearlag.getModules()) { - + for (Module mod : ClearLag.getModules()) { if (mod.isEnabled()) { ConfigPath configPath = mod.getClass().getAnnotation(ConfigPath.class); - if ((configPath != null)) { mod.setDisabled(); } @@ -36,13 +38,13 @@ protected void run(CommandSender sender, String[] args) { configHandler.reloadConfig(); - for (Module mod : Clearlag.getModules()) { + languageManager.reload(); + for (Module mod : ClearLag.getModules()) { if (!mod.isEnabled()) { ConfigPath configPath = mod.getClass().getAnnotation(ConfigPath.class); - if (configPath == null || (configHandler.getConfig().get(configPath.path() + ".enabled") == null || configHandler.getConfig().getBoolean(configPath.path() + ".enabled"))) { - mod.setEnabled(); + mod.setEnabled(); } } } @@ -53,8 +55,6 @@ protected void run(CommandSender sender, String[] args) { e.printStackTrace(); } - //Todo: Inject language shit. - lang.sendMessage("successful", sender); } -} +} \ No newline at end of file diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/SampleMemoryCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/SampleMemoryCmd.java similarity index 74% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/SampleMemoryCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/SampleMemoryCmd.java index 751e2d9..a404536 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/SampleMemoryCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/SampleMemoryCmd.java @@ -1,7 +1,7 @@ package me.minebuilders.clearlag.commands; import me.minebuilders.clearlag.Callback; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.RAMUtil; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.exceptions.WrongCommandArgumentException; @@ -9,7 +9,6 @@ import me.minebuilders.clearlag.language.messages.MessageTree; import me.minebuilders.clearlag.modules.CommandModule; import org.bukkit.command.CommandSender; -import org.bukkit.scheduler.BukkitRunnable; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; @@ -32,8 +31,9 @@ public SampleMemoryCmd() { @Override protected void run(CommandSender sender, String[] args) throws WrongCommandArgumentException { - if (!Util.isInteger(args[0])) + if (!Util.isInteger(args[0])) { throw new WrongCommandArgumentException(lang.getMessage("invalidinteger"), args[0]); + } lang.sendMessage("begin", sender, args[0]); @@ -42,23 +42,22 @@ protected void run(CommandSender sender, String[] args) throws WrongCommandArgum int validMemorySamples = 0; - long highestMemory = s.memoryList.get(0); + long highestMemory = s.memoryList.getFirst(); long lowestMemory = highestMemory; long totalMemoryUsage = 0; for (long memory : s.memoryList) { - if (memory > 0) { - - if (memory > highestMemory) + if (memory > highestMemory) { highestMemory = memory; + } - if (memory < lowestMemory) + if (memory < lowestMemory) { lowestMemory = memory; + } totalMemoryUsage += memory; - ++validMemorySamples; } } @@ -72,13 +71,9 @@ protected void run(CommandSender sender, String[] args) throws WrongCommandArgum Util.getChatColorByNumberLength((int) averageMemory, 30, 100) + Long.toString(averageMemory) ); - - //Todo: Replace this pointless code with new Java 8 features... if (s.gcCollectionTickstamps.size() > 1) { - - long highestGC = s.gcCollectionTickstamps.get(0).data; + long highestGC = s.gcCollectionTickstamps.getFirst().data; long lowestGC = highestGC; - long totalGC = 0; int totalBetweenGCTime = 0; @@ -86,12 +81,13 @@ protected void run(CommandSender sender, String[] args) throws WrongCommandArgum Sample lastSample = null; for (Sample sample : s.gcCollectionTickstamps) { - - if (highestGC < sample.data) + if (highestGC < sample.data) { highestGC = sample.data; + } - if (lowestGC > sample.data) + if (lowestGC > sample.data) { lowestGC = sample.data; + } totalGC += sample.data; @@ -103,27 +99,21 @@ protected void run(CommandSender sender, String[] args) throws WrongCommandArgum } long averageGC = (totalGC / s.gcCollectionTickstamps.size()); - int averageBetweenTime = (totalBetweenGCTime / (s.gcCollectionTickstamps.size() - 1)); - lang.sendMessage("gc", sender, s.gcCollectionTickstamps.size(), Util.getChatColorByNumberLength((int) highestGC, 100, 200) + "" + highestGC, Util.getChatColorByNumberLength((int) lowestGC, 100, 200) + "" + lowestGC, Util.getChatColorByNumberLength((int) averageGC, 100, 200) + "" + averageGC, - averageBetweenTime - ); - + averageBetweenTime); } else { lang.sendMessage("notenoughtime", sender); } - - - }).runTaskTimer(Clearlag.getInstance(), 1L, 1L); + }).start(); } - private static class MemorySamlier extends BukkitRunnable { + private static class MemorySamlier { private int currentTick = 0; @@ -144,46 +134,38 @@ private static class MemorySamlier extends BukkitRunnable { public MemorySamlier(int runTicks, Callback callback) { this.runTicks = runTicks; this.callback = callback; - this.memoryList = new ArrayList<>(runTicks); } - @Override - public void run() { - - long currentGcCollections = getTotalGCEvents(); + public void start() { + ClearLag.scheduler().runTimer(task -> { + long currentGcCollections = getTotalGCEvents(); + if (currentGcCollections != gcCollections) { + long currentTotalGCPauseTime = getTotalGCCompleteTime(); - if (currentGcCollections != gcCollections) { - - long currentTotalGCPauseTime = getTotalGCCompleteTime(); - - gcCollectionTickstamps.add(new Sample(currentTick, currentTotalGCPauseTime - gcLastPauseTime)); - - gcCollections = currentGcCollections; - gcLastPauseTime = currentTotalGCPauseTime; - - } + gcCollectionTickstamps.add(new Sample(currentTick, currentTotalGCPauseTime - gcLastPauseTime)); + gcCollections = currentGcCollections; + gcLastPauseTime = currentTotalGCPauseTime; + } - long memoryUsedDif = (RAMUtil.getUsedMemory() - lastMemoryUsed); + long memoryUsedDif = (RAMUtil.getUsedMemory() - lastMemoryUsed); - memoryList.add(memoryUsedDif); + memoryList.add(memoryUsedDif); - lastMemoryUsed = RAMUtil.getUsedMemory(); + lastMemoryUsed = RAMUtil.getUsedMemory(); - if (++currentTick > runTicks) { - cancel(); - callback.call(this); - } + if (++currentTick > runTicks) { + task.cancel(); + callback.call(this); + } + }, 1L, 1L); } private long getTotalGCEvents() { long totalGarbageCollections = 0; - for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) { - long count = gc.getCollectionCount(); - if (count >= 0) { totalGarbageCollections += count; } @@ -195,11 +177,8 @@ private long getTotalGCEvents() { private long getTotalGCCompleteTime() { long totalGarbageCollections = 0; - for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) { - long count = gc.getCollectionTime(); - if (count >= 0) { totalGarbageCollections += count; } @@ -209,15 +188,6 @@ private long getTotalGCCompleteTime() { } } - private static class Sample { - - private final int timeStamp; - - private final long data; - - public Sample(int timeStamp, long data) { - this.timeStamp = timeStamp; - this.data = data; - } + private record Sample(int timeStamp, long data) { } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/TickSamplerCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/TickSamplerCmd.java similarity index 66% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/TickSamplerCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/TickSamplerCmd.java index 3379d6f..a233101 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/TickSamplerCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/TickSamplerCmd.java @@ -1,20 +1,18 @@ package me.minebuilders.clearlag.commands; import me.minebuilders.clearlag.Callback; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.language.LanguageValue; import me.minebuilders.clearlag.language.messages.Message; import me.minebuilders.clearlag.language.messages.MessageTree; import me.minebuilders.clearlag.modules.CommandModule; import org.bukkit.command.CommandSender; -import org.bukkit.scheduler.BukkitRunnable; import java.util.ArrayList; import java.util.Collection; import java.util.IntSummaryStatistics; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; public class TickSamplerCmd extends CommandModule { @@ -29,42 +27,36 @@ public TickSamplerCmd() { protected void run(final CommandSender sender, String[] args) { int sampleTickCycles = 1; - if (args.length > 0 && Util.isInteger(args[0])) { sampleTickCycles = Integer.parseInt(args[0]); - - if (sampleTickCycles <= 0) + if (sampleTickCycles <= 0) { sampleTickCycles = 1; + } } final Thread serverThread = Thread.currentThread(); - final Callback> callback; - if (args.length > 1 && args[1].equalsIgnoreCase("raw")) + if (args.length > 1 && args[1].equalsIgnoreCase("raw")) { callback = (sample) -> { - lang.sendMessage("rawheader", sender); - final Message rawLineMessage = lang.getMessage("rawprint"); - for (Integer time : sample) { rawLineMessage.sendMessage(sender, (Util.getChatColorByNumberLength(time, 40, 50).toString() + time)); } }; - - else + } else { callback = (samples) -> { - final IntSummaryStatistics stats = samples.stream() .mapToInt((x) -> x) .summaryStatistics(); int spikes = 0; - - for (int sample : samples) - if (sample > 50) + for (int sample : samples) { + if (sample > 50) { ++spikes; + } + } lang.sendMessage("print", sender, (Util.getChatColorByNumberLength(stats.getMax(), 40, 50).toString() + stats.getMax()), @@ -72,13 +64,12 @@ protected void run(final CommandSender sender, String[] args) { (Util.getChatColorByNumberLength((int) Math.round(stats.getAverage()), 40, 50).toString() + Math.round(stats.getAverage())), (Util.getChatColorByNumberLength(spikes, 1, 2).toString() + spikes) ); - }; - new TimingThread(serverThread, callback, sampleTickCycles).start(); + } + new TimingThread(serverThread, callback, sampleTickCycles).start(); lang.sendMessage("start", sender, serverThread.getName(), sampleTickCycles); - } private static class TimingThread extends Thread { @@ -91,58 +82,31 @@ private static class TimingThread extends Thread { private int sampleTickCycles; - private final AtomicInteger tick = new AtomicInteger(); - - private final BukkitRunnable tickWatcher; + private long lastTimestamp = -1L; public TimingThread(Thread watchingThread, Callback> callback, int sampleTickCycles) { this.watchingThread = watchingThread; this.callback = callback; this.sampleTickCycles = ++sampleTickCycles; this.fullTickTimings = new ArrayList<>(sampleTickCycles); - - tickWatcher = new BukkitRunnable() { - - @Override - public void run() { - tick.incrementAndGet(); - } - }; - - tickWatcher.runTaskTimer(Clearlag.getInstance(), 0L, 0L); } - @Override - public void run() { - - try { - - while (sampleTickCycles-- > 0) { - - final int startTick = tick.get(); - - final long timestamp = System.currentTimeMillis(); - - while (watchingThread.getState() != State.TIMED_WAITING && tick.get() == startTick) { - Thread.sleep(1); - } - - fullTickTimings.add((int) (System.currentTimeMillis() - timestamp)); - - while (watchingThread.getState() == State.TIMED_WAITING && tick.get() == startTick) { - Thread.sleep(1); - } + public void start() { + ClearLag.scheduler().runTimer(task -> { + final long now = System.currentTimeMillis(); + if (lastTimestamp == -1L) { + lastTimestamp = now; + return; } - fullTickTimings.remove(0); - - Util.postToMainThread(() -> callback.call(fullTickTimings)); + fullTickTimings.add((int) (now - lastTimestamp)); + lastTimestamp = now; - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - tickWatcher.cancel(); - } + if (fullTickTimings.size() >= (this.sampleTickCycles - 1)) { + task.cancel(); + ClearLag.scheduler().runNextTick(nextTask -> callback.call(fullTickTimings)); + } + }, 1L, 1L); } } -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/TpChunkCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/TpChunkCmd.java similarity index 60% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/TpChunkCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/TpChunkCmd.java index 4207de5..2fca31b 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/TpChunkCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/TpChunkCmd.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.commands; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.exceptions.WrongCommandArgumentException; import me.minebuilders.clearlag.language.LanguageValue; @@ -29,26 +30,33 @@ protected void run(Player player, String[] args) throws WrongCommandArgumentExce if (args.length >= 3) { world = Bukkit.getServer().getWorld(args[2]); - if (world == null) + if (world == null) { throw new WrongCommandArgumentException(lang.getMessage("invalidworld"), args[2]); - + } } else { world = player.getWorld(); } - if (!Util.isInteger(args[0]) || !Util.isInteger(args[1])) + if (!Util.isInteger(args[0]) || !Util.isInteger(args[1])) { throw new WrongCommandArgumentException(lang.getMessage("invalidinteger"), (Util.isInteger(args[0]) ? args[1] : args[0])); + } + + final int cx = Integer.parseInt(args[0]); + final int cz = Integer.parseInt(args[1]); - final Chunk chunk = world.getChunkAt(Integer.parseInt(args[0]), Integer.parseInt(args[1])); + final Location regionLoc = new Location(world, (cx << 4) + 8, 0, (cz << 4) + 8); - final Block b = chunk.getBlock(8, 0, 8); + ClearLag.scheduler().runAtLocation(regionLoc, task -> world.getChunkAtAsync(cx, cz, true, (Chunk chunk) -> { + final Block b = chunk.getBlock(8, 0, 8); + final int x = b.getX(); + final int y = b.getY(); + final int z = b.getZ(); - final int x = b.getX(); - final int y = b.getY(); - final int z = b.getZ(); + final Location target = new Location(world, x, world.getHighestBlockYAt(new Location(world, x, y, z)), z); - player.teleport(new Location(world, x, world.getHighestBlockYAt(new Location(world, x, y, z)), z)); + ClearLag.scheduler().teleportAsync(player, target); - lang.sendMessage("teleported", player, chunk.getX(), chunk.getZ()); + lang.sendMessage("teleported", player, chunk.getX(), chunk.getZ()); + })); } -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/TpsCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/TpsCmd.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/TpsCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/TpsCmd.java index 3ec4c40..39bd341 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/TpsCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/TpsCmd.java @@ -19,5 +19,4 @@ public class TpsCmd extends CommandModule { protected void run(CommandSender sender, String[] args) { tpsPrintMessage.sendMessage(sender, tpsTask.getStringTPS()); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java b/common/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java rename to common/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java index 909f42b..859a4ec 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java +++ b/common/src/main/java/me/minebuilders/clearlag/commands/UnloadChunksCmd.java @@ -26,22 +26,17 @@ protected void run(CommandSender sender, String[] args) { final PluginManager pluginManager = Bukkit.getPluginManager(); for (World world : Bukkit.getServer().getWorlds()) { - for (Chunk chunk : world.getLoadedChunks()) { - if (!world.isChunkInUse(chunk.getX(), chunk.getZ())) { - ChunkUnloadEvent event = new ChunkUnloadEvent(chunk); - pluginManager.callEvent(event); - if (chunk.unload(true)) { chunkcount++; } } } - } + unloadPrintMessage.sendMessage(sender, chunkcount); } -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/ConfigHandler.java b/common/src/main/java/me/minebuilders/clearlag/config/ConfigHandler.java similarity index 78% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/ConfigHandler.java rename to common/src/main/java/me/minebuilders/clearlag/config/ConfigHandler.java index c26caf9..bbdd84a 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/ConfigHandler.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/ConfigHandler.java @@ -1,6 +1,6 @@ package me.minebuilders.clearlag.config; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.annotations.ConfigModule; import me.minebuilders.clearlag.annotations.ConfigPath; @@ -18,7 +18,6 @@ import java.lang.reflect.Field; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Filter; -import java.util.logging.LogRecord; public class ConfigHandler { @@ -32,67 +31,47 @@ public Configuration getConfig() { public ConfigHandler() { - final Filter currentFilter = Clearlag.getInstance().getLogger().getFilter(); - + final Filter currentFilter = ClearLag.getInstance().getLogger().getFilter(); final AtomicBoolean configLoadFailed = new AtomicBoolean(false); try { - //Ridicious.. - Clearlag.getInstance().getServer().getLogger().setFilter(new Filter() { - - @Override - public boolean isLoggable(LogRecord record) { - - if (record.getMessage().contains("ClearLag")) - configLoadFailed.set(true); - - return true; + ClearLag.getInstance().getServer().getLogger().setFilter(record -> { + if (record.getMessage().contains("ClearLag")) { + configLoadFailed.set(true); } + + return true; }); - config = Clearlag.getInstance().getConfig(); + config = ClearLag.getInstance().getConfig(); if (configLoadFailed.get()) { - Util.warning("Clearlag failed to load to your config. Clearlag will now attempt to repair your config by force-updating it..."); - try { - updateConfig(); - - Clearlag.getInstance().reloadConfig(); - - config = Clearlag.getInstance().getConfig(); - + ClearLag.getInstance().reloadConfig(); + config = ClearLag.getInstance().getConfig(); } catch (Exception e) { Util.warning("Clearlag failed to force-update your config. Using the default config - please repair your configuration using https://yaml-online-parser.appspot.com/"); throw e; } } - Clearlag.getInstance().getServer().getLogger().setFilter(currentFilter); - + ClearLag.getInstance().getServer().getLogger().setFilter(currentFilter); } catch (Exception e) { - config = Clearlag.getInstance().getConfig(); + config = ClearLag.getInstance().getConfig(); } - if (!new File(Clearlag.getInstance().getDataFolder(), "config.yml").exists()) { + if (!new File(ClearLag.getInstance().getDataFolder(), "config.yml").exists()) { Util.log("Config not found. Generating default config..."); - Clearlag.getInstance().saveDefaultConfig(); - + ClearLag.getInstance().saveDefaultConfig(); } else if (!isConfigUpdated()) { - boolean resetConfig = false; - if (config.getBoolean("config-updater.force-update") && !isConfigUpdated()) { - resetConfig("Old-Config.yml"); - resetConfig = true; - } else if (!isConfigUpdated()) { - try { updateConfig(); } catch (Exception e) { @@ -108,7 +87,6 @@ public boolean isLoggable(LogRecord record) { } WarnTask warnTask = new WarnTask(resetConfig); - warnTask.setEnabled(); } @@ -124,9 +102,7 @@ public String fieldToConfigValue(Field field) { } public String javaToConfigValue(String str) { - StringBuilder sb = new StringBuilder(); - for (char c : str.toCharArray()) { if (Character.isUpperCase(c)) { sb.append("-"); @@ -140,9 +116,7 @@ public String javaToConfigValue(String str) { } public void setModuleConfigValues() throws Exception { - - for (Module module : Clearlag.getModules()) { - + for (Module module : ClearLag.getModules()) { if (module.isEnabled()) { setObjectConfigValues(module); } @@ -150,9 +124,7 @@ public void setModuleConfigValues() throws Exception { } public void setObjectConfigValues(Object object) throws Exception { - String path = null; - final ConfigPath configPath = object.getClass().getAnnotation(ConfigPath.class); if (configPath != null) { @@ -162,39 +134,29 @@ public void setObjectConfigValues(Object object) throws Exception { setObjectConfigValues(object, path); } - public void setObjectConfigValues(Object object, String path) throws Exception {//Todo: Apply config setting to objects too - + public void setObjectConfigValues(Object object, String path) throws Exception { Class clazz = object.getClass(); - while (clazz != null && clazz != Object.class && clazz != Module.class) { - for (Field field : clazz.getDeclaredFields()) { - final ConfigValue configValue = field.getAnnotation(ConfigValue.class); final ConfigModule configModule = field.getAnnotation(ConfigModule.class); - if (configValue != null) { - field.setAccessible(true); - ConfigData cd = configValue.valueType().getConfigData(); - Object ob = cd.getValue(configValue.path().length() <= 1 ? path + "." + fieldToConfigValue(field) : configValue.path()); - if (ob == null) { Object tp = field.get(object); - if (tp != null) + if (tp != null) { ob = tp.getClass().newInstance(); + } } field.set(object, (cd instanceof PrimitiveCV ? ReflectionUtil.castPrimitedValues(field.getType(), ob) : ob)); - } if (configModule != null) { field.setAccessible(true); - setObjectConfigValues(field.get(object)); } } @@ -209,53 +171,53 @@ public static boolean containsReloadableFields(Object ob) { return true; } } + return false; } private void resetConfig(String renamedName) { renameCurrentConfig(renamedName); - Clearlag.getInstance().saveDefaultConfig(); - - Clearlag.getInstance().reloadConfig(); + ClearLag.getInstance().saveDefaultConfig(); + ClearLag.getInstance().reloadConfig(); } public void reloadConfig() { - Clearlag.getInstance().reloadConfig(); - config = Clearlag.getInstance().getConfig(); + ClearLag.getInstance().reloadConfig(); + config = ClearLag.getInstance().getConfig(); } private void renameCurrentConfig(String newName) { - final File newf = new File(Clearlag.getInstance().getDataFolder().getAbsolutePath(), "config.yml"); - final File oldf = new File(Clearlag.getInstance().getDataFolder().getAbsolutePath(), newName); + final File newf = new File(ClearLag.getInstance().getDataFolder().getAbsolutePath(), "config.yml"); + final File oldf = new File(ClearLag.getInstance().getDataFolder().getAbsolutePath(), newName); - if (oldf.isFile()) + if (oldf.isFile()) { oldf.delete(); + } - if (newf.isFile()) - newf.renameTo(new File(Clearlag.getInstance().getDataFolder().getAbsolutePath(), newName)); + if (newf.isFile()) { + newf.renameTo(new File(ClearLag.getInstance().getDataFolder().getAbsolutePath(), newName)); + } } private void updateConfig() throws Exception { - Util.log("Updating config to v" + Clearlag.getInstance().getDescription().getVersion() + "..."); - - final File file = new File(Clearlag.getInstance().getDataFolder() + "/config.yml"); + Util.log("Updating config to v" + ClearLag.getInstance().getDescription().getVersion() + "..."); + final File file = new File(ClearLag.getInstance().getDataFolder() + "/config.yml"); final ConfigUpdater configUpdater = new ConfigUpdater(); configUpdater.addCarriedOverPath("custom-trigger-removal"); configUpdater.addCarriedOverPath("item-spawn-age-setter"); - configUpdater.addNonMergableKey("config-version"); - configUpdater.setUpdatingToConfig(Clearlag.getInstance().getResource("config.yml")); - configUpdater.setUpdatingFromConfig(new FileInputStream(Clearlag.getInstance().getDataFolder() + "/config.yml")); + configUpdater.setUpdatingToConfig(ClearLag.getInstance().getResource("config.yml")); + configUpdater.setUpdatingFromConfig(new FileInputStream(ClearLag.getInstance().getDataFolder() + "/config.yml")); renameCurrentConfig("before-update-config.yml"); configUpdater.updateConfig(file); - Util.log("Successfully updated config to v" + Clearlag.getInstance().getDescription().getVersion() + "!"); + Util.log("Successfully updated config to v" + ClearLag.getInstance().getDescription().getVersion() + "!"); } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/ConfigValueType.java b/common/src/main/java/me/minebuilders/clearlag/config/ConfigValueType.java similarity index 88% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/ConfigValueType.java rename to common/src/main/java/me/minebuilders/clearlag/config/ConfigValueType.java index 86acb16..07e1c11 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/ConfigValueType.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/ConfigValueType.java @@ -1,6 +1,6 @@ package me.minebuilders.clearlag.config; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.config.configvalues.*; /** @@ -22,9 +22,8 @@ public enum ConfigValueType { ConfigValueType(ConfigData configData) { this.configData = configData; - try { - Clearlag.getInstance().getAutoWirer().wireObject(configData); + ClearLag.getInstance().getAutoWirer().wireObject(configData); } catch (IllegalAccessException e) { e.printStackTrace(); } @@ -33,5 +32,4 @@ public enum ConfigValueType { public ConfigData getConfigData() { return configData; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/ConfigUpdater.java b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/ConfigUpdater.java similarity index 93% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/ConfigUpdater.java rename to common/src/main/java/me/minebuilders/clearlag/config/configupdater/ConfigUpdater.java index 4fe23fe..e85f132 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/ConfigUpdater.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/ConfigUpdater.java @@ -37,17 +37,11 @@ public void addNonMergableKey(String key) { public int updateConfig(File writeToFile) throws Exception { int mergedVariables = 0; - for (ConfigEntry updatingToEntry : updatingToConfig) { - if (!(updatingToEntry instanceof ConfigCommentEntry) && !nonMergableKeys.contains(updatingToEntry.getKey())) { - for (ConfigEntry updatingFromEntry : updatingFromConfig) { - if (updatingToEntry.getKey().equals(updatingFromEntry.getKey())) { - updatingToEntry.merge(updatingFromEntry); - ++mergedVariables; } } @@ -55,19 +49,12 @@ public int updateConfig(File writeToFile) throws Exception { } for (String carriedOverPath : carriedOverPaths) { - for (ConfigEntry updatingFromEntry : updatingFromConfig) { - if (updatingFromEntry.getKey().equals(carriedOverPath)) { - final ListIterator updatingToIter = updatingToConfig.listIterator(); - while (updatingToIter.hasNext()) { - if (updatingToIter.next().getKey().equals(carriedOverPath)) { - updatingToIter.set(updatingFromEntry); - break; } } @@ -76,9 +63,9 @@ public int updateConfig(File writeToFile) throws Exception { } try (final BufferedWriter bw = new BufferedWriter(new FileWriter(writeToFile))) { - - for (ConfigEntry updatingToEntry : updatingToConfig) + for (ConfigEntry updatingToEntry : updatingToConfig) { updatingToEntry.write(bw, 0); + } } return (updatingToConfig.size() - mergedVariables); @@ -87,74 +74,56 @@ public int updateConfig(File writeToFile) throws Exception { private List loadConfig(InputStream in) throws Exception { final BufferedReader reader = new BufferedReader(new InputStreamReader(in)); - final List configEntryList = new ArrayList(); - final Stack treeStack = new Stack<>(); ConfigListEntry currentListEntry = null; - String line = reader.readLine(); - String nextLine = reader.readLine(); do { final int position = getPosition(line); - - while (!treeStack.isEmpty() && treeStack.peek().position >= position) + while (!treeStack.isEmpty() && treeStack.peek().position >= position) { treeStack.pop(); + } - final String trimmedLine = line.substring(position); //Remove leading white spaces. - + final String trimmedLine = line.substring(position); if (trimmedLine.startsWith("-")) { - - if (currentListEntry != null) + if (currentListEntry != null) { currentListEntry.add(trimmedLine); - + } } else { - final TreeEntryNode currentTree = (treeStack.isEmpty() ? null : treeStack.peek()); - ConfigEntry configEntry; - - //Comment if (isComment(trimmedLine)) { configEntry = new ConfigCommentEntry(line); } else { - final String[] bits = trimmedLine.split(":", 2); - final String key = bits[0]; - //Small, or value is a comment? Must be a tree-key if (bits.length <= 1 || isComment(bits[1])) { - if (nextLine != null && nextLine.trim().startsWith("-")) { currentListEntry = new ConfigListEntry(key); configEntry = currentListEntry; } else { - final TreeEntryNode treeEntryNode = new TreeEntryNode(new TreeConfigEntry(key), position); - configEntry = treeEntryNode.treeConfigEntry; - treeStack.add(treeEntryNode); } - } else { configEntry = new ConfigBasicEntry(key, bits[1]); } } //Are we currently in a tree? If not, add the new value/tree directly - if (currentTree != null) + if (currentTree != null) { currentTree.treeConfigEntry.addConfigEntry(configEntry); - else + } else { configEntryList.add(configEntry); + } } line = nextLine; - } while (((nextLine = reader.readLine()) != null && line != null) || line != null); return configEntryList; @@ -162,8 +131,9 @@ private List loadConfig(InputStream in) throws Exception { private boolean isComment(String str) { - if (str.isEmpty() || str.startsWith("#")) + if (str.isEmpty() || str.startsWith("#")) { return true; + } final String noSpaceStr = str.replace(" ", ""); @@ -185,9 +155,11 @@ public TreeEntryNode(TreeConfigEntry treeConfigEntry, int position) { private int getPosition(String str) { int i = 0; - for (; i < str.length(); ++i) - if (str.charAt(i) != ' ') + for (; i < str.length(); ++i) { + if (str.charAt(i) != ' ') { break; + } + } return i; } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigBasicEntry.java b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigBasicEntry.java similarity index 100% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigBasicEntry.java rename to common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigBasicEntry.java diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigCommentEntry.java b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigCommentEntry.java similarity index 74% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigCommentEntry.java rename to common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigCommentEntry.java index c2cac52..03cc04f 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigCommentEntry.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigCommentEntry.java @@ -6,13 +6,7 @@ /** * @author bob7l */ -public class ConfigCommentEntry implements ConfigEntry { - - private final String comment; - - public ConfigCommentEntry(String comment) { - this.comment = comment; - } +public record ConfigCommentEntry(String comment) implements ConfigEntry { @Override public Object getValue() { @@ -30,9 +24,7 @@ public void merge(ConfigEntry entry) { @Override public void write(BufferedWriter writer, int tabs) throws IOException { - writer.write(comment); - writer.newLine(); } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigEntry.java b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigEntry.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigEntry.java rename to common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigEntry.java index 2eefea0..739460c 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigEntry.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigEntry.java @@ -17,5 +17,4 @@ public interface ConfigEntry { void merge(ConfigEntry value); void write(BufferedWriter writer, int tabs) throws IOException; - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigListEntry.java b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigListEntry.java similarity index 83% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigListEntry.java rename to common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigListEntry.java index 01c0460..6ba0236 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigListEntry.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/ConfigListEntry.java @@ -41,10 +41,12 @@ public String getKey() { @Override public void merge(ConfigEntry entry) { - if (entry.getValue() instanceof List) - values = (List) entry.getValue(); - else + Object val = entry.getValue(); + if (val instanceof List list) { + values = new ArrayList<>(list); + } else { values = new ArrayList<>(1); + } } @Override @@ -52,20 +54,14 @@ public void write(BufferedWriter writer, int tabs) throws IOException { final StringBuilder tabLine = new StringBuilder(); - for (int i = 0; i < tabs; ++i) - tabLine.append(ConfigEntry.TAB); - + tabLine.append(ConfigEntry.TAB.repeat(Math.max(0, tabs))); writer.write(tabLine + key + ":"); - - if (values.isEmpty()) + if (values.isEmpty()) { writer.write(" []"); - else { + } else { tabLine.append(ConfigEntry.TAB); - for (Object value : values) { - writer.newLine(); - writer.write(tabLine + value.toString()); } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/TreeConfigEntry.java b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/TreeConfigEntry.java similarity index 95% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/TreeConfigEntry.java rename to common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/TreeConfigEntry.java index 2562bbd..e525501 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/TreeConfigEntry.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configupdater/entries/TreeConfigEntry.java @@ -34,13 +34,11 @@ public void merge(ConfigEntry mergingEntry) { } public void merge(TreeConfigEntry mergingTree) { - for (ConfigEntry entry : entries) { - for (ConfigEntry mergingEntry : mergingTree.entries) { - - if (entry.getKey().equals(mergingEntry.getKey())) + if (entry.getKey().equals(mergingEntry.getKey())) { entry.merge(mergingEntry); + } } } } @@ -58,13 +56,12 @@ public String getKey() { @Override public void write(BufferedWriter writer, int tabs) throws IOException { - for (int i = 0; i < tabs; ++i) + for (int i = 0; i < tabs; ++i) { writer.write(ConfigEntry.TAB); + } writer.write(key + ":"); - writer.newLine(); - for (ConfigEntry entry : entries) { entry.write(writer, tabs + 1); } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringCV.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringCV.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringCV.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringCV.java index c031169..271cd7e 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringCV.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringCV.java @@ -16,5 +16,4 @@ public class ColoredStringCV implements ConfigData { public String getValue(String path) { return Util.color(configHandler.getConfig().getString(path)); } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringsCV.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringsCV.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringsCV.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringsCV.java index 6512245..d2c059f 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringsCV.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/ColoredStringsCV.java @@ -14,14 +14,11 @@ public class ColoredStringsCV implements ConfigData { @Override public String[] getValue(String path) { - final String[] lines = configHandler.getConfig().getString(path).split("/n"); - for (int i = 0; i < lines.length; ++i) { lines[i] = Util.color(lines[i]); } return lines; } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/ConfigData.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/ConfigData.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/ConfigData.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/ConfigData.java index 0afa036..3e4a86f 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/ConfigData.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/ConfigData.java @@ -6,5 +6,4 @@ public interface ConfigData { T getValue(String path); - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityLimitMapCV.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityLimitMapCV.java similarity index 97% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityLimitMapCV.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityLimitMapCV.java index 1c9c623..d52f556 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityLimitMapCV.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityLimitMapCV.java @@ -30,38 +30,24 @@ public EntityMap getValue(String path) { main: for (String entityLine : entities) { - try { - final StringTokenizer tokenizer = new StringTokenizer(entityLine); - final String entityName = tokenizer.nextToken(); - final EntityType entityType = Util.getEntityTypeFromString(entityName); - if (entityType != null) { - try { - final AttributeParser.Result result = attributeParser.getAttributesFromString(entityType, tokenizer); - for (Iterator iter = result.getNonApplicables().iterator(); iter.hasNext(); ) { - final String token = iter.next(); - if (token.startsWith("limit:")) { - iter.remove(); - try { - - for (String nonApplicable : result.getNonApplicables()) + for (String nonApplicable : result.getNonApplicables()) { Util.warning("Invalid entity attribute path=\"" + path + "\" token=" + nonApplicable + "\""); + } final int limit = Integer.parseInt(token.split(":", 2)[1]); - entityMap.set(entityType, result.getAttributes(), limit); - } catch (Exception ignored) { Util.warning("Invalid entity limit path=\"" + path + "\" token=" + token + "\""); } @@ -72,11 +58,9 @@ public EntityMap getValue(String path) { } catch (Exception e) { Util.warning("Failed to read entity path=\"" + path + "\" type=" + entityType.name() + "\" error=\"" + e + "\""); } - } else { Util.warning("Invalid entity type specified path=\"" + path + "\" value=" + entityName); } - } catch (Exception e) { Util.warning("Invalid line specified path=\"" + path + "\" line=" + entityLine); } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityTypeTable.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityTypeTable.java similarity index 98% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityTypeTable.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityTypeTable.java index bbd1123..2dea2b4 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityTypeTable.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/EntityTypeTable.java @@ -19,45 +19,32 @@ public class EntityTypeTable implements ConfigData { public EntityTable getValue(String path) { final List entities = configHandler.getConfig().getStringList(path); - final EntityTable table = new EntityTable(); - final AttributeParser attributeParser = new AttributeParser(); - for (String entityLine : entities) { - try { - final StringTokenizer tokenizer = new StringTokenizer(entityLine); - final String entityName = tokenizer.nextToken(); - final EntityType entityType = Util.getEntityTypeFromString(entityName); - if (entityType != null) { - try { - final AttributeParser.Result result = attributeParser.getAttributesFromString(entityType, tokenizer); - - for (String nonApplicable : result.getNonApplicables()) + for (String nonApplicable : result.getNonApplicables()) { Util.warning("Invalid entity attribute path=\"" + path + "\" token=" + nonApplicable + "\""); + } if (result.getAttributes().isEmpty()) { table.setEntity(entityType); } else { table.setEntityAttributes(entityType, result.getAttributes()); } - } catch (Exception e) { Util.warning("Failed to read entity path=\"" + path + "\" type=" + entityType.name() + "\" error=\"" + e + "\""); e.printStackTrace(); } - } else { Util.warning("Invalid entity type specified path=\"" + path + "\" value=" + entityName); } - } catch (Exception e) { Util.warning("Invalid line specified path=\"" + path + "\" line=" + entityLine); } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialIntegerMapCV.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialIntegerMapCV.java similarity index 90% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialIntegerMapCV.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialIntegerMapCV.java index 633e006..c3101e4 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialIntegerMapCV.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialIntegerMapCV.java @@ -22,22 +22,20 @@ public Map getValue(String path) { Map materialIntegerMap = new HashMap<>(); if (section != null) { - for (String key : section.getKeys(false)) { - Material material = Material.matchMaterial(key); - - if (material == null) + if (material == null) { material = Material.getMaterial(key); + } - if (material != null) + if (material != null) { materialIntegerMap.put(material, configHandler.getConfig().getInt(path + "." + key)); - else { + } else { Util.warning("Item type '" + key + "' does not match any Materials found on your Craftbukkit version."); } } } + return materialIntegerMap; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialSetCV.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialSetCV.java similarity index 86% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialSetCV.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialSetCV.java index 705cec0..98d16d4 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialSetCV.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/MaterialSetCV.java @@ -19,26 +19,23 @@ public class MaterialSetCV implements ConfigData> { @Override public EnumSet getValue(String path) { - List types = configHandler.getConfig().getStringList(path); List materials = new LinkedList<>(); for (String str : types) { - Material material = Material.matchMaterial(str); - - if (material == null) + if (material == null) { material = Material.getMaterial(str); + } - if (material != null) + if (material != null) { materials.add(material); - else { + } else { Util.warning("Item type '" + str + "' does not match any Materials found on your Craftbukkit version."); } } - return (materials.size() > 0 ? EnumSet.copyOf(materials) : EnumSet.noneOf(Material.class)); + return (!materials.isEmpty() ? EnumSet.copyOf(materials) : EnumSet.noneOf(Material.class)); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/PrimitiveCV.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/PrimitiveCV.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/PrimitiveCV.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/PrimitiveCV.java index be4f1da..a2ed89a 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/PrimitiveCV.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/PrimitiveCV.java @@ -15,5 +15,4 @@ public class PrimitiveCV implements ConfigData { public Object getValue(String path) { return configHandler.getConfig().get(path); } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/StringSetCV.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/StringSetCV.java similarity index 88% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/StringSetCV.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/StringSetCV.java index 92e6ba5..654cf4c 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/StringSetCV.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/StringSetCV.java @@ -16,11 +16,10 @@ public class StringSetCV implements ConfigData> { @Override public Set getValue(String path) { - - if (configHandler.getConfig().get(path) == null) + if (configHandler.getConfig().get(path) == null) { return new HashSet<>(); + } return new HashSet<>(configHandler.getConfig().getStringList(path)); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java rename to common/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java index 94e33ae..0be8a51 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java @@ -16,29 +16,20 @@ public class WarnMapCV implements ConfigData> { @Override public HashMap getValue(String path) { - final HashMap warns = new HashMap<>(); - for (String line : configHandler.getConfig().getStringList(path)) { - try { - final String[] bits = line.split(" ", 2); - final int time = Integer.parseInt(bits[0].replace("time:", "")); - final String[] msg = Util.color(bits[1].replace("msg:", "")).split("/n"); - if (time > 0) { warns.put(time, msg); } else { Util.warning("Config Error at line " + path + ":"); Util.warning(line + " is an invalid warning!"); } - } catch (Exception e) { Util.warning("Config Read Error at line " + path + ":"); - if (e instanceof NumberFormatException) { Util.warning("Failed to read 'time:' variable in " + line); Util.warning("Insure you have a NUMBER after 'time:' specified"); @@ -48,5 +39,4 @@ public HashMap getValue(String path) { return warns; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java b/common/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java similarity index 83% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java rename to common/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java index 9f3eb1a..b621e53 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/AttributeParser.java @@ -16,81 +16,65 @@ public class AttributeParser { public Result getAttributesFromString(EntityType t, StringTokenizer tk) { - final Result result = new Result(); - while (tk.hasMoreTokens()) { - EntityAttribute attribute = null; - String tok = tk.nextToken(); - boolean reversed = (tok.startsWith("!")); - - if (reversed) + if (reversed) { tok = tok.substring(1); + } if (tok.startsWith("name=\"") || tok.startsWith("hasMeta=\"")) { - StringBuilder name = new StringBuilder(); - name.append(tok, 6, (tok.endsWith("\"") ? tok.length() - 1 : tok.length())); - while (tk.hasMoreTokens()) { - tok = tk.nextToken(); - if (tok.endsWith("\"")) { name.append(" ").append(tok, 0, tok.length() - 1); break; } + name.append(" ").append(tok); } - if (tok.startsWith("name=\"")) + if (tok.startsWith("name=\"")) { attribute = new EntityNameAttribute(name.toString()); - else + } else { attribute = new EntityHasMetaAttribute(name.toString()); - - } else if (tok.startsWith("hasName")) + } + } else if (tok.startsWith("hasName")) { attribute = new EntityHasNameAttribute(); - else if (tok.startsWith("liveTime=")) + } else if (tok.startsWith("liveTime=")) { attribute = new EntityLifeLimitAttribute(Integer.parseInt(tok.substring(9))); - else if (tok.startsWith("isMounted")) + } else if (tok.startsWith("isMounted")) { attribute = new EntityMountedAttribute(); - else if (tok.startsWith("onGround")) + } else if (tok.startsWith("onGround")) { attribute = new EntityOnGroundAttribute(); - else if (tok.startsWith("id=") || tok.startsWith("material=")) { - - if (t == EntityType.DROPPED_ITEM) { - + } else if (tok.startsWith("id=") || tok.startsWith("material=")) { + if (t == EntityType.ITEM) { String input = tok.substring(3); Material mat = null; - if (Util.isInteger(input)) { - int id = Integer.parseInt(input); - Util.warning("ID's are no longer usable in your Spigot version - Please change \"" + id + "\" into the item/block's name"); - } else { mat = Material.getMaterial(input); - - if (mat == null) + if (mat == null) { mat = Material.matchMaterial(input); + } } - attribute = new EntityMaterialAttribute(mat); - } } if (attribute != null) { attribute.setReversed(reversed); result.attributes.add(attribute); - } else + } else { result.nonApplicables.add(tok); + } } return result; diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/EntityMap.java b/common/src/main/java/me/minebuilders/clearlag/entities/EntityMap.java similarity index 70% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/EntityMap.java rename to common/src/main/java/me/minebuilders/clearlag/entities/EntityMap.java index 0a49cd8..a898879 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/EntityMap.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/EntityMap.java @@ -16,14 +16,13 @@ public class EntityMap { private final Node[] entityTable = new Node[EntityType.values().length + 1]; public boolean containsEntity(Entity entity) { - Node node = entityTable[entity.getType().ordinal()]; - if (node != null) { - - for (EntityAttribute e : node.attributes) - if (!e.containsData(entity)) + for (EntityAttribute e : node.attributes) { + if (!e.containsData(entity)) { return false; + } + } return true; } @@ -32,14 +31,13 @@ public boolean containsEntity(Entity entity) { } public T getValue(Entity entity) { - Node node = entityTable[entity.getType().ordinal()]; - if (node != null) { - - for (EntityAttribute e : node.attributes) - if (!e.containsData(entity)) + for (EntityAttribute e : node.attributes) { + if (!e.containsData(entity)) { return null; + } + } return node.value; } @@ -55,15 +53,6 @@ public void set(EntityType type, T value) { entityTable[type.ordinal()] = new Node<>(Collections.emptyList(), value); } - private static class Node { - - private final List> attributes; - - private final T value; - - private Node(List> attributes, T value) { - this.attributes = attributes; - this.value = value; - } + private record Node(List> attributes, T value) { } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/EntityTable.java b/common/src/main/java/me/minebuilders/clearlag/entities/EntityTable.java similarity index 88% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/EntityTable.java rename to common/src/main/java/me/minebuilders/clearlag/entities/EntityTable.java index 334e8b1..d4fb79f 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/EntityTable.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/EntityTable.java @@ -17,16 +17,14 @@ public class EntityTable { private static final ArrayList> EMPTY_COLLECTION = new ArrayList<>(1); public boolean containsEntity(Entity entity) { - List> con = entityTable[entity.getType().ordinal()]; - if (con != null) { - if (!con.isEmpty()) { - - for (EntityAttribute e : con) - if (!e.containsData(entity)) + for (EntityAttribute e : con) { + if (!e.containsData(entity)) { return false; + } + } } return true; @@ -35,7 +33,6 @@ public boolean containsEntity(Entity entity) { return false; } - public void setEntityAttributes(EntityType type, ArrayList> entityAttributes) { entityTable[type.ordinal()] = entityAttributes; } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityAttribute.java b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityAttribute.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityAttribute.java rename to common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityAttribute.java index 6dcdbe9..7b94cbb 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityAttribute.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityAttribute.java @@ -18,5 +18,4 @@ public void setReversed(boolean reversed) { } public abstract boolean containsData(T entity); - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasMetaAttribute.java b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasMetaAttribute.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasMetaAttribute.java rename to common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasMetaAttribute.java index 0cea532..2cded00 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasMetaAttribute.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasMetaAttribute.java @@ -17,6 +17,5 @@ public EntityHasMetaAttribute(String meta) { public boolean containsData(Entity entity) { return (!reversed == (entity.hasMetadata(meta))); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java rename to common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java index ec1a488..2acc0d8 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityHasNameAttribute.java @@ -11,5 +11,4 @@ public class EntityHasNameAttribute extends EntityAttribute { public boolean containsData(Entity entity) { return (!reversed == (entity.getCustomName() != null)); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityLifeLimitAttribute.java b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityLifeLimitAttribute.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityLifeLimitAttribute.java rename to common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityLifeLimitAttribute.java index 3f4c0dd..771b796 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityLifeLimitAttribute.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityLifeLimitAttribute.java @@ -17,6 +17,4 @@ public EntityLifeLimitAttribute(int lifeLimit) { public boolean containsData(Entity entity) { return (!reversed == (entity.getTicksLived() >= lifeLimit)); } - - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMaterialAttribute.java b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMaterialAttribute.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMaterialAttribute.java rename to common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMaterialAttribute.java index 5711bef..52a762a 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMaterialAttribute.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMaterialAttribute.java @@ -19,5 +19,4 @@ public EntityMaterialAttribute(Material material) { public boolean containsData(Entity entity) { return (!reversed == (material == ((Item)entity).getItemStack().getType())); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMountedAttribute.java b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMountedAttribute.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMountedAttribute.java rename to common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMountedAttribute.java index a7f3d4e..89aac69 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMountedAttribute.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityMountedAttribute.java @@ -11,5 +11,4 @@ public class EntityMountedAttribute extends EntityAttribute { public boolean containsData(Entity entity) { return (reversed == entity.isEmpty()); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java rename to common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java index ba09f8f..31187c9 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityNameAttribute.java @@ -17,5 +17,4 @@ public EntityNameAttribute(String name) { public boolean containsData(Entity entity) { return (!reversed == name.equals(entity.getCustomName())); } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityOnGroundAttribute.java b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityOnGroundAttribute.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityOnGroundAttribute.java rename to common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityOnGroundAttribute.java index d760839..eb97443 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityOnGroundAttribute.java +++ b/common/src/main/java/me/minebuilders/clearlag/entities/attributes/EntityOnGroundAttribute.java @@ -11,5 +11,4 @@ public class EntityOnGroundAttribute extends EntityAttribute { public boolean containsData(Entity entity) { return (!reversed == (entity.isOnGround())); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/events/EntityRemoveEvent.java b/common/src/main/java/me/minebuilders/clearlag/events/EntityRemoveEvent.java similarity index 97% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/events/EntityRemoveEvent.java rename to common/src/main/java/me/minebuilders/clearlag/events/EntityRemoveEvent.java index 9140df1..6adb42e 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/events/EntityRemoveEvent.java +++ b/common/src/main/java/me/minebuilders/clearlag/events/EntityRemoveEvent.java @@ -10,38 +10,37 @@ public class EntityRemoveEvent extends Event { private static final HandlerList handlers = new HandlerList(); - + private final World world; private final List entities; - + public EntityRemoveEvent(List entities, World w) { this.entities = entities; this.world = w; } - + public void addEntity(Entity e) { entities.add(e); } - + public void removeEntity(Entity e) { entities.remove(e); } - + public List getEntityList() { return entities; } - + public World getWorld() { return world; } - + @Override public HandlerList getHandlers() { return handlers; } - + public static HandlerList getHandlerList() { return handlers; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/events/TPSUpdateEvent.java b/common/src/main/java/me/minebuilders/clearlag/events/TPSUpdateEvent.java similarity index 97% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/events/TPSUpdateEvent.java rename to common/src/main/java/me/minebuilders/clearlag/events/TPSUpdateEvent.java index 9c1ccd3..6ab906d 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/events/TPSUpdateEvent.java +++ b/common/src/main/java/me/minebuilders/clearlag/events/TPSUpdateEvent.java @@ -8,22 +8,21 @@ public class TPSUpdateEvent extends Event { private static final HandlerList handlers = new HandlerList(); private final double tps; - + public TPSUpdateEvent(double tps) { this.tps = tps; } - + public double getTPS() { return tps; } - + @Override public HandlerList getHandlers() { return handlers; } - + public static HandlerList getHandlerList() { return handlers; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/exceptions/FancyIllegalArgumentException.java b/common/src/main/java/me/minebuilders/clearlag/exceptions/FancyIllegalArgumentException.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/exceptions/FancyIllegalArgumentException.java rename to common/src/main/java/me/minebuilders/clearlag/exceptions/FancyIllegalArgumentException.java index 70fc702..bc0087a 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/exceptions/FancyIllegalArgumentException.java +++ b/common/src/main/java/me/minebuilders/clearlag/exceptions/FancyIllegalArgumentException.java @@ -1,6 +1,5 @@ package me.minebuilders.clearlag.exceptions; - import org.bukkit.ChatColor; /** @@ -11,6 +10,4 @@ public class FancyIllegalArgumentException extends IllegalArgumentException { public FancyIllegalArgumentException(String warningMessage, String invalidArguments) { super(ChatColor.DARK_RED + warningMessage + ChatColor.DARK_GRAY + ": " + ChatColor.RED + invalidArguments); } - - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/exceptions/IncompatibleServerVersionException.java b/common/src/main/java/me/minebuilders/clearlag/exceptions/IncompatibleServerVersionException.java similarity index 100% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/exceptions/IncompatibleServerVersionException.java rename to common/src/main/java/me/minebuilders/clearlag/exceptions/IncompatibleServerVersionException.java diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/exceptions/WrongCommandArgumentException.java b/common/src/main/java/me/minebuilders/clearlag/exceptions/WrongCommandArgumentException.java similarity index 100% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/exceptions/WrongCommandArgumentException.java rename to common/src/main/java/me/minebuilders/clearlag/exceptions/WrongCommandArgumentException.java diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageLoader.java b/common/src/main/java/me/minebuilders/clearlag/language/LanguageLoader.java similarity index 84% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageLoader.java rename to common/src/main/java/me/minebuilders/clearlag/language/LanguageLoader.java index aa5bcc5..ca6df1e 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/LanguageLoader.java +++ b/common/src/main/java/me/minebuilders/clearlag/language/LanguageLoader.java @@ -21,7 +21,7 @@ /** * @author bob7l - *//// + */ public class LanguageLoader { private Map fallbackLanguageMap = null; @@ -35,39 +35,32 @@ public LanguageLoader(BroadcastHandler broadcastHandler) { } public void wireInMessages(Object object) throws Exception { - Class clazz = object.getClass(); - while (clazz != null && clazz != Object.class && clazz != Module.class) { - for (Field field : clazz.getDeclaredFields()) { - if (field.isAnnotationPresent(LanguageValue.class)) { - field.setAccessible(true); - Message message = getMessageByKey(field.getAnnotation(LanguageValue.class).key()); - - if (message == null) + if (message == null) { message = new BasicMessage(broadcastHandler, ChatColor.RED + "!Missing-From-Language-File!"); + } field.set(object, message); } } + clazz = clazz.getSuperclass(); } } public Message getMessageByKey(String key) { - Message message = languageMap.get(key); - if (message == null) { - - if (fallbackLanguageMap != null) + if (fallbackLanguageMap != null) { message = fallbackLanguageMap.get(key); - else + } else { message = new BasicMessage(broadcastHandler, ChatColor.RED + "!Missing-From-Language-File!"); + } } return message; @@ -90,11 +83,10 @@ private Map loadLanguage(InputStream in) throws Exception { final BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); String line; - while ((line = reader.readLine()) != null) { - - if (line.startsWith("#") || line.trim().isEmpty()) + if (line.startsWith("#") || line.trim().isEmpty()) { continue; + } final String[] lineParts = line.split("=", 2); @@ -102,54 +94,30 @@ private Map loadLanguage(InputStream in) throws Exception { String[] replaceValues = lineParts[0].substring(lineParts[0].indexOf("(") + 1, lineParts[0].indexOf(")")).split(","); - if (replaceValues.length == 1 && replaceValues[0].isEmpty()) + if (replaceValues.length == 1 && replaceValues[0].isEmpty()) { replaceValues = new String[0]; + } final String message = Util.color(lineParts[1]); - //Replace the representation of a replaced value with a shortend version. Small optimization... -// int replaceVariableVal = 0; -// -// for (int i = 0; i < replaceValues.length; ++i) { -// -// String replacerElement; -// -// do { -// replacerElement = "@" + (replaceVariableVal++); -// } while (message.contains(replacerElement)); -// -// message = message.replace(replaceValues[i], replacerElement); -// -// replaceValues[i] = replacerElement; -// } - - final Message insertingMessage; if (message.trim().equals("{")) { - List currentMessageBlock = new LinkedList<>(); - - while ((line = reader.readLine()) != null && !line.trim().equals("}")) + while ((line = reader.readLine()) != null && !line.trim().equals("}")) { currentMessageBlock.add(Util.color(line)); + } insertingMessage = new MessageBlock(broadcastHandler, currentMessageBlock.toArray(new String[0]), replaceValues); - - } else { - insertingMessage = new BasicMessage(broadcastHandler, message, replaceValues); - } final int treeEndLength = keyBits[0].lastIndexOf(".") + 1; - final String treeKey = keyBits[0].substring(0, treeEndLength); - final String treeMessageKey = keyBits[0].substring(treeEndLength); MessageTree tree = loadedMessageTrees.get(treeKey); - if (tree == null) { tree = new MessageTree(); loadedMessageTrees.put(treeKey, tree); @@ -157,7 +125,6 @@ private Map loadLanguage(InputStream in) throws Exception { } tree.addMessage(treeMessageKey, insertingMessage); - loadedMessageMap.put(keyBits[0], insertingMessage); } diff --git a/common/src/main/java/me/minebuilders/clearlag/language/LanguageManager.java b/common/src/main/java/me/minebuilders/clearlag/language/LanguageManager.java new file mode 100644 index 0000000..f4e80f1 --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/language/LanguageManager.java @@ -0,0 +1,162 @@ +package me.minebuilders.clearlag.language; + +import me.minebuilders.clearlag.ClearLag; +import me.minebuilders.clearlag.Util; +import me.minebuilders.clearlag.annotations.AutoWire; +import me.minebuilders.clearlag.config.ConfigHandler; +import me.minebuilders.clearlag.language.messages.Message; +import me.minebuilders.clearlag.modules.BroadcastHandler; +import me.minebuilders.clearlag.modules.ClearlagModule; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +/** + * @author bob7l + */ +public class LanguageManager extends ClearlagModule { + + private static final String[] BUNDLED_LANGUAGES = { + "English.lang", + "BrazilianPortuguese.lang", + "ChineseSimplified.lang", + "ChineseTraditional.lang", + "Czech.lang", + "French.lang", + "German.lang", + "Japanese.lang", + "Korean.lang", + "Polish.lang", + "Russian.lang", + "Spanish.lang" + }; + + private static final String FALLBACK_LANGUAGE = "English.lang"; + + @AutoWire + private BroadcastHandler broadcastHandler; + + @AutoWire + private ConfigHandler config; + + private LanguageLoader languageLoader; + + private File languagesFolder; + + public Message getMessage(String key) { + return languageLoader.getMessageByKey(key); + } + + public LanguageLoader getLanguageLoader() { + return languageLoader; + } + + @Override + public void setEnabled() { + super.setEnabled(); + + languagesFolder = new File(ClearLag.getInstance().getDataFolder(), "languages"); + if (!languagesFolder.exists() && !languagesFolder.mkdirs()) { + Util.warning("Clearlag failed to create the languages folder!"); + } + + extractBundledLanguages(); + + languageLoader = new LanguageLoader(broadcastHandler); + + loadLanguageFromDisk(); + + for (Object object : ClearLag.getInstance().getAutoWirer().getWires()) { + try { + languageLoader.wireInMessages(object); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void reload() { + loadLanguageFromDisk(); + + for (Object object : ClearLag.getInstance().getAutoWirer().getWires()) { + try { + languageLoader.wireInMessages(object); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + private void loadLanguageFromDisk() { + + String desiredLanguage = config.getConfig().getString("settings.language") + ".lang"; + desiredLanguage = desiredLanguage.substring(0, 1).toUpperCase() + desiredLanguage.substring(1); + + try (InputStream fallbackStream = openLanguageFile(FALLBACK_LANGUAGE)) { + if (fallbackStream != null) { + languageLoader.setFallbackLanguageMap(fallbackStream); + } + } catch (Exception e) { + Util.warning("Clearlag failed to load the fallback English language file!"); + e.printStackTrace(); + } + + try (InputStream stream = openLanguageFile(desiredLanguage)) { + if (stream != null) { + languageLoader.setLanguageMap(stream); + Util.log("Loaded language file: " + desiredLanguage); + return; + } + Util.warning("Clearlag FAILED to find your desired language file '" + desiredLanguage + "'. Defaulting to English..."); + } catch (Exception e) { + Util.warning("Clearlag FAILED to load your desired language file '" + desiredLanguage + "'. Defaulting to English..."); + e.printStackTrace(); + } + + try (InputStream englishStream = openLanguageFile(FALLBACK_LANGUAGE)) { + if (englishStream != null) { + languageLoader.setLanguageMap(englishStream); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + private InputStream openLanguageFile(String fileName) throws IOException { + File diskFile = new File(languagesFolder, fileName); + if (diskFile.isFile()) { + return new FileInputStream(diskFile); + } + + java.net.URL bundled = ClearLag.class.getResource("/languages/" + fileName); + if (bundled != null) { + return bundled.openStream(); + } + + return null; + } + + private void extractBundledLanguages() { + for (String fileName : BUNDLED_LANGUAGES) { + File target = new File(languagesFolder, fileName); + if (target.exists()) { + continue; + } + + try (InputStream in = ClearLag.class.getResourceAsStream("/languages/" + fileName)) { + if (in == null) { + continue; + } + Files.copy(in, target.toPath(), StandardCopyOption.REPLACE_EXISTING); + Util.log("Extracted language file: " + fileName); + } catch (IOException e) { + Util.warning("Failed to extract language file: " + fileName); + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/common/src/main/java/me/minebuilders/clearlag/language/LanguageValue.java b/common/src/main/java/me/minebuilders/clearlag/language/LanguageValue.java new file mode 100644 index 0000000..f0f9569 --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/language/LanguageValue.java @@ -0,0 +1,14 @@ +package me.minebuilders.clearlag.language; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface LanguageValue { + String key(); +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/BasicMessage.java b/common/src/main/java/me/minebuilders/clearlag/language/messages/BasicMessage.java similarity index 63% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/BasicMessage.java rename to common/src/main/java/me/minebuilders/clearlag/language/messages/BasicMessage.java index 94883b8..b3884f0 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/BasicMessage.java +++ b/common/src/main/java/me/minebuilders/clearlag/language/messages/BasicMessage.java @@ -6,19 +6,8 @@ /** * @author bob7l */ -public class BasicMessage implements Message { - - private final BroadcastHandler broadcastHandler; - - private final String rawMessage; - - private final String[] messageReplaceBits; - - public BasicMessage(BroadcastHandler broadcastHandler, String rawMessage, String... messageReplaceBits) { - this.broadcastHandler = broadcastHandler; - this.rawMessage = rawMessage; - this.messageReplaceBits = messageReplaceBits; - } +public record BasicMessage(BroadcastHandler broadcastHandler, String rawMessage, + String... messageReplaceBits) implements Message { public String getRawStringMessage() { return rawMessage; @@ -27,7 +16,6 @@ public String getRawStringMessage() { public String getStringMessage(Object... obj) { String message = rawMessage; - for (int i = 0; i < obj.length && i < messageReplaceBits.length; ++i) { message = message.replace(messageReplaceBits[i], obj[i].toString()); } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/Message.java b/common/src/main/java/me/minebuilders/clearlag/language/messages/Message.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/Message.java rename to common/src/main/java/me/minebuilders/clearlag/language/messages/Message.java index 0e6e01a..993f672 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/Message.java +++ b/common/src/main/java/me/minebuilders/clearlag/language/messages/Message.java @@ -14,5 +14,4 @@ public interface Message { void sendMessage(CommandSender sender, Object... obj); void broadcastMessage(Object... obj); - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/MessageBlock.java b/common/src/main/java/me/minebuilders/clearlag/language/messages/MessageBlock.java similarity index 67% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/MessageBlock.java rename to common/src/main/java/me/minebuilders/clearlag/language/messages/MessageBlock.java index 9855d8e..e21897a 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/MessageBlock.java +++ b/common/src/main/java/me/minebuilders/clearlag/language/messages/MessageBlock.java @@ -6,56 +6,41 @@ /** * @author bob7l */ -public class MessageBlock implements Message { - - private final BroadcastHandler broadcastHandler; - - private final String[] rawMessage; - - private final String[] messageReplaceBits; - - public MessageBlock(BroadcastHandler broadcastHandler, String[] rawMessage, String... messageReplaceBits) { - this.broadcastHandler = broadcastHandler; - this.rawMessage = rawMessage; - this.messageReplaceBits = messageReplaceBits; - } +public record MessageBlock(BroadcastHandler broadcastHandler, String[] rawMessage, + String... messageReplaceBits) implements Message { public String getRawStringMessage() { return rawMessage[0]; } public String getStringMessage(Object... obj) { - final StringBuilder sb = new StringBuilder(); - for (String message : rawMessage) { - - for (int i = 0; i < obj.length && i < messageReplaceBits.length; ++i) + for (int i = 0; i < obj.length && i < messageReplaceBits.length; ++i) { message = message.replace(messageReplaceBits[i], obj[i].toString()); + } - sb.append(sb.length() == 0 ? System.lineSeparator() + message : message); + sb.append(sb.isEmpty() ? System.lineSeparator() + message : message); } return sb.toString(); } public void sendMessage(CommandSender sender, Object... obj) { - for (String message : rawMessage) { - - for (int i = 0; i < obj.length && i < messageReplaceBits.length; ++i) + for (int i = 0; i < obj.length && i < messageReplaceBits.length; ++i) { message = message.replace(messageReplaceBits[i], obj[i].toString()); + } sender.sendMessage(message); } } public void broadcastMessage(Object... obj) { - for (String message : rawMessage) { - - for (int i = 0; i < obj.length && i < messageReplaceBits.length; ++i) + for (int i = 0; i < obj.length && i < messageReplaceBits.length; ++i) { message = message.replace(messageReplaceBits[i], obj[i].toString()); + } broadcastHandler.broadcast(getStringMessage(obj)); } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/MessageTree.java b/common/src/main/java/me/minebuilders/clearlag/language/messages/MessageTree.java similarity index 96% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/MessageTree.java rename to common/src/main/java/me/minebuilders/clearlag/language/messages/MessageTree.java index b06b18f..a6441c1 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/language/messages/MessageTree.java +++ b/common/src/main/java/me/minebuilders/clearlag/language/messages/MessageTree.java @@ -39,11 +39,10 @@ public Message getMessage(String key) { } private Message getNextMessage() { - final Message message = messageList.get(currentReadIndex++); - - if (messageList.size() >= currentReadIndex) + if (messageList.size() >= currentReadIndex) { resetReadIndex(); + } return message; } @@ -71,9 +70,7 @@ public void broadcastMessage(Object... obj) { getNextMessage().broadcastMessage(obj); } - public void resetReadIndex() { currentReadIndex = 0; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkEntityLimiterListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/ChunkEntityLimiterListener.java similarity index 71% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkEntityLimiterListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/ChunkEntityLimiterListener.java index 6bbdfc3..41b6a92 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkEntityLimiterListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/ChunkEntityLimiterListener.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.listeners; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.annotations.ConfigValue; import me.minebuilders.clearlag.config.ConfigValueType; @@ -11,6 +12,8 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.world.ChunkLoadEvent; +import java.util.concurrent.atomic.AtomicInteger; + @ConfigPath(path = "chunk-entity-limiter") public class ChunkEntityLimiterListener extends EventModule { @@ -20,21 +23,15 @@ public class ChunkEntityLimiterListener extends EventModule { @ConfigValue(valueType = ConfigValueType.ENTITY_TYPE_TABLE) private EntityTable entities; - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onChunkLoad(ChunkLoadEvent event) { - Entity[] entities = event.getChunk().getEntities(); - if (entities.length >= limit) { - - int count = 0; - + AtomicInteger count = new AtomicInteger(0); for (Entity e : entities) { if (this.entities.containsEntity(e)) { - - if (++count > limit) { - e.remove(); + if (count.incrementAndGet() > limit) { + ClearLag.scheduler().runAtEntity(e, task -> e.remove()); } } } @@ -43,20 +40,17 @@ public void onChunkLoad(ChunkLoadEvent event) { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onSpawn(CreatureSpawnEvent event) { - if (this.entities.containsEntity(event.getEntity())) { - Entity[] entities = event.getLocation().getChunk().getEntities(); - if (entities.length >= limit) { + AtomicInteger count = new AtomicInteger(0); + for (Entity e : entities) { + if (this.entities.containsEntity(e)) { + count.incrementAndGet(); + } + } - int count = 0; - - for (Entity e : entities) - if (this.entities.containsEntity(e)) - ++count; - - event.setCancelled(count >= limit); + event.setCancelled(count.get() >= limit); } } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java index 3694b04..f65408f 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/ChunkLimiterListener.java @@ -22,7 +22,6 @@ public class ChunkLimiterListener extends EventModule { public void onChunkLoad(ChunkLoadEvent event) { if ((!createNewChunks && event.isNewChunk()) || (countChunks() >= limit)) { event.getChunk().unload(false); - for (Chunk c : event.getWorld().getLoadedChunks()) { c.unload(true); } @@ -30,9 +29,7 @@ public void onChunkLoad(ChunkLoadEvent event) { } private int countChunks() { - int size = 0; - for (World w : Bukkit.getWorlds()) { size += w.getLoadedChunks().length; } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkOverloadListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/ChunkOverloadListener.java similarity index 96% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkOverloadListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/ChunkOverloadListener.java index 1b97825..d56a64b 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkOverloadListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/ChunkOverloadListener.java @@ -17,21 +17,18 @@ public class ChunkOverloadListener extends EventModule { @ConfigValue private double flyMaxSpeed; - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onMove(PlayerMoveEvent event) { if (!event.getPlayer().isInsideVehicle()) { - final Location to = event.getTo(); final Location from = event.getFrom(); - if (to.getBlockX() != from.getBlockX() || to.getBlockZ() != from.getBlockZ()) { - double distance = Math.hypot(from.getX() - to.getX(), from.getZ() - to.getZ()); - if (distance > (event.getPlayer().isFlying() ? flyMaxSpeed : moveMaxSpeed)) + if (distance > (event.getPlayer().isFlying() ? flyMaxSpeed : moveMaxSpeed)) { event.setTo(from); + } } } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkPerEntityLimiterListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/ChunkPerEntityLimiterListener.java similarity index 55% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkPerEntityLimiterListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/ChunkPerEntityLimiterListener.java index e13418c..f0ba1c1 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ChunkPerEntityLimiterListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/ChunkPerEntityLimiterListener.java @@ -1,6 +1,6 @@ package me.minebuilders.clearlag.listeners; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.annotations.ConfigValue; import me.minebuilders.clearlag.config.ConfigValueType; @@ -14,10 +14,9 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.world.ChunkLoadEvent; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; @ConfigPath(path = "per-entity-chunk-entity-limiter") public class ChunkPerEntityLimiterListener extends EventModule { @@ -25,7 +24,7 @@ public class ChunkPerEntityLimiterListener extends EventModule { @ConfigValue(valueType = ConfigValueType.ENTITY_LIMIT_MAP) private EntityMap entityLimits; - private BukkitTask passivePurger = null; + private PassivePurger passivePurger = null; @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onChunkLoad(ChunkLoadEvent event) { @@ -34,22 +33,16 @@ public void onChunkLoad(ChunkLoadEvent event) { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onSpawn(CreatureSpawnEvent event) { - final Entity entity = event.getEntity(); - final Integer limit = entityLimits.getValue(entity); - if (limit != null) { - final Entity[] entities = event.getLocation().getChunk().getEntities(); - if (entities.length >= limit) { - int count = 0; - for (Entity e : entities) - if (entity.getType() == e.getType() && entityLimits.getValue(e).equals(limit)) + if (entity.getType() == e.getType() && entityLimits.getValue(e).equals(limit)) { ++count; + } event.setCancelled(count >= limit); } @@ -57,84 +50,82 @@ public void onSpawn(CreatureSpawnEvent event) { } private void purgeEntities(final Entity[] entities) { - if (entities.length > 0) { - final EntityMap entityMap = new EntityMap<>(); - for (Entity entity : entities) { - final Integer limit = entityLimits.getValue(entity); - if (limit != null) { - Integer amount = entityMap.getValue(entity); - - if (amount == null) + if (amount == null) { amount = 1; - else + } else { ++amount; + } entityMap.set(entity.getType(), amount); - if (amount > limit) { - entity.remove(); + ClearLag.scheduler().runAtEntity(entity, task -> entity.remove()); } } } } } - private class PassivePurger extends BukkitRunnable { + private class PassivePurger { private final int chunkBatchSize; private int worldIndex = 0; private int chunkIndex = 0; + private final AtomicBoolean cancelled = new AtomicBoolean(false); + private PassivePurger(int chunkBatchSize) { this.chunkBatchSize = chunkBatchSize; } - @Override - public void run() { - - final List worlds = Bukkit.getWorlds(); - - if (worlds.isEmpty()) - return; - - if (worldIndex >= worlds.size()) - worldIndex = 0; - - int processedChunks = 0; - - for (World world = worlds.get(worldIndex); processedChunks < chunkBatchSize;) { - - final Chunk[] chunks = world.getLoadedChunks(); - - if (chunks.length > chunkIndex) { + private void start() { + ClearLag.scheduler().runTimer(task -> { + if (cancelled.get()) { + task.cancel(); + return; + } - for (; chunkIndex < chunks.length && processedChunks < chunkBatchSize; ++chunkIndex) { + final List worlds = Bukkit.getWorlds(); - purgeEntities(chunks[chunkIndex].getEntities()); + if (worlds.isEmpty()) { + return; + } - ++processedChunks; - } + if (worldIndex >= worlds.size()) { + worldIndex = 0; } - if (processedChunks < chunkBatchSize) { + int processedChunks = 0; - if (++worldIndex >= worlds.size()) { + for (World world = worlds.get(worldIndex); processedChunks < chunkBatchSize;) { + final Chunk[] chunks = world.getLoadedChunks(); + if (chunks.length > chunkIndex) { + for (; chunkIndex < chunks.length && processedChunks < chunkBatchSize; ++chunkIndex) { + purgeEntities(chunks[chunkIndex].getEntities()); + ++processedChunks; + } + } - worldIndex = 0; + if (processedChunks < chunkBatchSize) { + if (++worldIndex >= worlds.size()) { + worldIndex = 0; + return; + } - return; + chunkIndex = 0; } - - chunkIndex = 0; } - } + }, 1L, 1L); + } + + private void cancel() { + cancelled.set(true); } } @@ -142,10 +133,16 @@ public void run() { public void setEnabled() { super.setEnabled(); - if (Clearlag.getInstance().getConfig().getBoolean("per-entity-chunk-entity-limiter.passive-cleaner.passive-cleaning-enabled")) - passivePurger = new PassivePurger(Clearlag.getInstance().getConfig().getInt("per-entity-chunk-entity-limiter.passive-cleaner.chunk-batch-size")).runTaskTimer(Clearlag.getInstance(), - Clearlag.getInstance().getConfig().getInt("per-entity-chunk-entity-limiter.passive-cleaner.check-interval"), - Clearlag.getInstance().getConfig().getInt("per-entity-chunk-entity-limiter.passive-cleaner.check-interval")); + if (ClearLag.getInstance().getConfig().getBoolean("per-entity-chunk-entity-limiter.passive-cleaner.passive-cleaning-enabled")) { + int interval = Math.max(1, ClearLag.getInstance().getConfig().getInt("per-entity-chunk-entity-limiter.passive-cleaner.check-interval")); + int batchSize = ClearLag.getInstance().getConfig().getInt("per-entity-chunk-entity-limiter.passive-cleaner.chunk-batch-size"); + passivePurger = new PassivePurger(batchSize); + ClearLag.scheduler().runLater(task -> { + if (passivePurger != null) { + passivePurger.start(); + } + }, interval); + } } @Override diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/DispenceLimitEvent.java b/common/src/main/java/me/minebuilders/clearlag/listeners/DispenceLimitEvent.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/DispenceLimitEvent.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/DispenceLimitEvent.java index d8da838..51503c0 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/DispenceLimitEvent.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/DispenceLimitEvent.java @@ -16,12 +16,10 @@ public class DispenceLimitEvent extends EventModule { @EventHandler public void onBlockDispenseEvent(BlockDispenseEvent e) { - if (System.currentTimeMillis() > nextAllowedDispense) { nextAllowedDispense = (System.currentTimeMillis() + time); } else { e.setCancelled(true); } } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/EggSpawnListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/EggSpawnListener.java similarity index 83% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/EggSpawnListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/EggSpawnListener.java index e7226b8..a82eb85 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/EggSpawnListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/EggSpawnListener.java @@ -9,6 +9,8 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import java.util.concurrent.atomic.AtomicInteger; + @ConfigPath(path = "mobegg-limiter") public class EggSpawnListener extends EventModule { @@ -20,11 +22,8 @@ public class EggSpawnListener extends EventModule { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onCreatureSpawn(CreatureSpawnEvent event) { - if (event.getSpawnReason() == SpawnReason.SPAWNER_EGG) { - final Entity e = event.getEntity(); - if (countNearbyLivingEntities(e, checkRadius) > maxMobs) { event.setCancelled(true); } @@ -32,13 +31,12 @@ public void onCreatureSpawn(CreatureSpawnEvent event) { } private int countNearbyLivingEntities(Entity checkEntity, int checkRadius) { + AtomicInteger count = new AtomicInteger(0); + //Use a loop because in some CraftBukkit's, this returns an array rather than a list + for (Entity ignored : checkEntity.getNearbyEntities(checkRadius, checkRadius, checkRadius)) { + count.incrementAndGet(); + } - int count = 0; - - //Use a loop because in some CraftBukkit's, this returns an array rather then a list - for (Entity ignored : checkEntity.getNearbyEntities(checkRadius, checkRadius, checkRadius)) - ++count; - - return count; + return count.get(); } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/EntityAISpawnListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/EntityAISpawnListener.java similarity index 97% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/EntityAISpawnListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/EntityAISpawnListener.java index a15ea4b..774bda4 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/EntityAISpawnListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/EntityAISpawnListener.java @@ -26,9 +26,7 @@ public class EntityAISpawnListener extends EventModule { private final Map mobRanges = new IdentityHashMap<>(); - private Method getHandleMethod, - getAttriInstanceMethod, - setAttriMethod; + private Method getHandleMethod, getAttriInstanceMethod, setAttriMethod; private Object followRangeConst; @@ -42,7 +40,6 @@ public void onCreatureSpawn(CreatureSpawnEvent event) throws Exception { @Override public void setEnabled() { - try { String version = Util.getRawBukkitVersion(); @@ -73,17 +70,14 @@ public void setEnabled() { } super.setEnabled(); - } catch (Exception e) { Util.warning("Failed to initialize 'mob-range' controller ~ This is possibly caused by an unsupported Bukkit/Spigot server version"); return; } Configuration config = configHandler.getConfig(); - for (String s : config.getConfigurationSection("mob-range").getKeys(false)) { EntityType type = Util.getEntityTypeFromString(s); - if (type != null) { mobRanges.put(type, config.getDouble("mob-range." + s)); } @@ -92,7 +86,6 @@ public void setEnabled() { private void setEntityRange(Entity e) throws Exception { Double value = mobRanges.get(e.getType()); - if (value != null) { setAttriMethod.invoke( getAttriInstanceMethod.invoke(getHandleMethod.invoke(e), followRangeConst), @@ -100,4 +93,4 @@ private void setEntityRange(Entity e) throws Exception { ); } } -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/EntityBreedListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/EntityBreedListener.java similarity index 87% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/EntityBreedListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/EntityBreedListener.java index 2fd8d2a..c50e8eb 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/EntityBreedListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/EntityBreedListener.java @@ -9,6 +9,8 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import java.util.concurrent.atomic.AtomicInteger; + @ConfigPath(path = "mob-breeding-limiter") public class EntityBreedListener extends EventModule { @@ -20,21 +22,13 @@ public class EntityBreedListener extends EventModule { @EventHandler public void onCreatureSpawn(CreatureSpawnEvent event) { - if (event.getSpawnReason() == SpawnReason.EGG || event.getSpawnReason() == SpawnReason.BREEDING) { - final Entity eventEntity = event.getEntity(); - - int count = 0; - + AtomicInteger count = new AtomicInteger(0); for (Entity entity : eventEntity.getNearbyEntities(checkRadius, checkRadius, checkRadius)) { - if (entity instanceof Ageable) { - - if (++count >= maxMobs) { - + if (count.incrementAndGet() >= maxMobs) { event.setCancelled(true); - return; } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/FireSpreadListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/FireSpreadListener.java similarity index 63% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/FireSpreadListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/FireSpreadListener.java index 495a976..ac25542 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/FireSpreadListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/FireSpreadListener.java @@ -15,29 +15,9 @@ public class FireSpreadListener extends EventModule { @ConfigValue private int time; -// //Remove me -// @EventHandler -// public void onMap(MapInitializeEvent event) { -// -// System.out.println("YEEES!!"); -// -// event.getMap().setScale(MapView.Scale.NORMAL); -// -// final List list = new ArrayList<>(event.getMap().getRenderers()); -// -// for (MapRenderer mapRenderer : list) -// event.getMap().removeRenderer(mapRenderer); -// -// event.getMap().getRenderers().clear(); -// -// event.getMap().addRenderer(memoryRenderer); -// -// } @EventHandler public void fireSpread(BlockIgniteEvent event) { - if (event.getCause() == IgniteCause.SPREAD) { - if (System.currentTimeMillis() > nextAllowedSpread) { nextAllowedSpread = (System.currentTimeMillis() + time); } else { @@ -45,5 +25,4 @@ public void fireSpread(BlockIgniteEvent event) { } } } - -} \ No newline at end of file +} diff --git a/common/src/main/java/me/minebuilders/clearlag/listeners/HopperLimitListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/HopperLimitListener.java new file mode 100644 index 0000000..bc0dedf --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/HopperLimitListener.java @@ -0,0 +1,65 @@ +package me.minebuilders.clearlag.listeners; + +import me.minebuilders.clearlag.ChunkKey; +import me.minebuilders.clearlag.ClearLag; +import me.minebuilders.clearlag.annotations.ConfigPath; +import me.minebuilders.clearlag.annotations.ConfigValue; +import me.minebuilders.clearlag.modules.EventModule; +import org.bukkit.block.Hopper; +import org.bukkit.event.EventHandler; +import org.bukkit.event.inventory.InventoryMoveItemEvent; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +@ConfigPath(path = "hopper-limiter") +public class HopperLimitListener extends EventModule { + + @ConfigValue + private final int transferLimit = 6; + + @ConfigValue + private final int checkInterval = 1; + + private final ConcurrentHashMap hopperDataMap = new ConcurrentHashMap<>(); + private final AtomicBoolean running = new AtomicBoolean(false); + + @EventHandler + public void onHopper(InventoryMoveItemEvent event) { + if (event.getSource().getHolder() instanceof Hopper hopper) { + final ChunkKey key = new ChunkKey(hopper.getChunk()); + final AtomicInteger count = hopperDataMap.computeIfAbsent(key, k -> new AtomicInteger()); + if (count.incrementAndGet() > transferLimit) { + event.setCancelled(true); + } + } + } + + private void resetCounters() { + hopperDataMap.entrySet().removeIf(e -> e.getValue().get() == 0); + hopperDataMap.replaceAll((k, v) -> new AtomicInteger()); + } + + @Override + public void setEnabled() { + super.setEnabled(); + running.set(true); + + ClearLag.scheduler().runTimer(task -> { + if (!running.get()) { + task.cancel(); + return; + } + + resetCounters(); + }, checkInterval * 20L, checkInterval * 20L); + } + + @Override + public void setDisabled() { + super.setDisabled(); + running.set(false); + hopperDataMap.clear(); + } +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ItemLivetimeListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/ItemLivetimeListener.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ItemLivetimeListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/ItemLivetimeListener.java index 8e404bd..09a5231 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ItemLivetimeListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/ItemLivetimeListener.java @@ -24,11 +24,8 @@ public class ItemLivetimeListener extends EventModule { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onItemSpawn(ItemSpawnEvent event) { - final Integer age = items.get(event.getEntity().getItemStack().getType()); - if (age != null) { - final int ageInTicks = age * 20; if (event.getEntity().getTicksLived() < ageInTicks || event.getEntity().getTicksLived() == 0) { diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ItemMergeListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/ItemMergeListener.java similarity index 82% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ItemMergeListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/ItemMergeListener.java index 79f4290..27163c1 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/ItemMergeListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/ItemMergeListener.java @@ -3,6 +3,7 @@ import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.annotations.ConfigValue; import me.minebuilders.clearlag.modules.EventModule; +import me.minebuilders.clearlag.ClearLag; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; @@ -17,7 +18,7 @@ public class ItemMergeListener extends EventModule { @ConfigValue private int radius; - //Yes yes. Very ugly/outdated code. Ignore this class.. Shouldn't even be used anymore in Spigot + //Yes, yes. Very ugly/outdated code. Ignore this class... Shouldn't even be used anymore in Spigot @EventHandler public void onItemDrop(ItemSpawnEvent event) { @@ -27,22 +28,16 @@ public void onItemDrop(ItemSpawnEvent event) { MaterialData data = i.getData(); for (Entity entity : event.getEntity().getNearbyEntities(radius, radius, radius)) { - if (entity instanceof Item && !entity.isDead()) { - ItemStack ni = ((Item) entity).getItemStack(); - if (!entity.isDead() && type == ni.getType() && data.equals(ni.getData()) && i.getDurability() == ni.getDurability() && i.getMaxStackSize() >= (ni.getAmount() + c)) { - - entity.remove(); - + final Entity toRemove = entity; + ClearLag.scheduler().runAtEntity(toRemove, task -> toRemove.remove()); i.setAmount(ni.getAmount() + c); - return; } } } } - } diff --git a/common/src/main/java/me/minebuilders/clearlag/listeners/MobLimitListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/MobLimitListener.java new file mode 100644 index 0000000..a329a56 --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/MobLimitListener.java @@ -0,0 +1,122 @@ +package me.minebuilders.clearlag.listeners; + +import me.minebuilders.clearlag.ClearLag; +import me.minebuilders.clearlag.annotations.ConfigPath; +import me.minebuilders.clearlag.annotations.ConfigValue; +import me.minebuilders.clearlag.modules.EventModule; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Animals; +import org.bukkit.entity.Creature; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Villager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +@ConfigPath(path = "spawn-limiter") +public class MobLimitListener extends EventModule implements Runnable { + + @ConfigValue + private int animals; + + @ConfigValue + private int mobs; + + @ConfigValue + private int interval; + + private final AtomicBoolean cancelled = new AtomicBoolean(false); + + private volatile boolean canAnimalspawn = true; + + private volatile boolean canMobspawn = true; + + @Override + public void run() { + final List worlds = Bukkit.getWorlds(); + if (worlds.isEmpty()) { + canAnimalspawn = true; + canMobspawn = true; + return; + } + + final AtomicInteger totalAnimals = new AtomicInteger(0); + final AtomicInteger totalMobs = new AtomicInteger(0); + final AtomicInteger pendingWorlds = new AtomicInteger(worlds.size()); + + for (World world : worlds) { + final Entity[] snapshot = world.getEntities().toArray(new Entity[0]); + if (snapshot.length == 0) { + if (pendingWorlds.decrementAndGet() == 0) { + canAnimalspawn = totalAnimals.get() < this.animals; + canMobspawn = totalMobs.get() < this.mobs; + } + + continue; + } + + final AtomicInteger animalsInWorld = new AtomicInteger(0); + final AtomicInteger mobsInWorld = new AtomicInteger(0); + final AtomicInteger pending = new AtomicInteger(snapshot.length); + + for (Entity e : snapshot) { + ClearLag.scheduler().runAtEntity(e, task -> { + try { + if (e instanceof Animals || e instanceof Villager) { + animalsInWorld.incrementAndGet(); + } + if (e instanceof Creature) { + mobsInWorld.incrementAndGet(); + } + } finally { + if (pending.decrementAndGet() == 0) { + totalAnimals.addAndGet(animalsInWorld.get()); + totalMobs.addAndGet(mobsInWorld.get()); + if (pendingWorlds.decrementAndGet() == 0) { + canAnimalspawn = totalAnimals.get() < this.animals; + canMobspawn = totalMobs.get() < this.mobs; + } + } + } + }); + } + } + } + + @Override + public void setEnabled() { + super.setEnabled(); + + cancelled.set(false); + ClearLag.scheduler().runTimer(task -> { + if (cancelled.get()) { + task.cancel(); + return; + } + + run(); + }, interval * 20L, interval * 20L); + } + + @Override + public void setDisabled() { + super.setDisabled(); + + cancelled.set(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onMobSpawn(CreatureSpawnEvent e) { + Entity en = e.getEntity(); + if (!canAnimalspawn && en instanceof Animals) { + e.setCancelled(true); + } else if (!canMobspawn && en instanceof Creature) { + e.setCancelled(true); + } + } +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/MobSpawerListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/MobSpawerListener.java similarity index 74% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/MobSpawerListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/MobSpawerListener.java index 328033f..2e12902 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/MobSpawerListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/MobSpawerListener.java @@ -13,6 +13,8 @@ import org.bukkit.event.world.ChunkUnloadEvent; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; @ConfigPath(path = "mobspawner") public class MobSpawerListener extends EventModule { @@ -23,40 +25,33 @@ public class MobSpawerListener extends EventModule { @ConfigValue private boolean removeMobsOnChunkUnload; - private final HashMap> map = new HashMap<>(); + private final ConcurrentHashMap> map = new ConcurrentHashMap<>(); - private boolean isOverLimit(List en) { - Iterator ee = en.iterator(); + private boolean isOverLimit(ConcurrentLinkedQueue en) { + en.removeIf(Entity::isDead); int amount = 0; - - while (ee.hasNext()) { - if (ee.next().isDead()) { - ee.remove(); - } else { + for (Entity e : en) { + if (!e.isDead()) { amount++; + if (amount >= maxSpawn) { + return true; + } } } - return (amount >= maxSpawn); + + return false; } @EventHandler(priority = EventPriority.MONITOR) public void onCreatureSpawn(CreatureSpawnEvent event) { final LivingEntity e = event.getEntity(); - if (event.getSpawnReason() == SpawnReason.SPAWNER) { - ChunkKey key = new ChunkKey(event.getLocation().getChunk()); - - List entities = map.get(key); - - if (entities == null) { - entities = new ArrayList<>(); - map.put(key, entities); - } - - if (removeMobsOnChunkUnload) + ConcurrentLinkedQueue entities = map.computeIfAbsent(key, k -> new ConcurrentLinkedQueue<>()); + if (removeMobsOnChunkUnload) { e.setRemoveWhenFarAway(true); + } if (!isOverLimit(entities)) { entities.add(e); @@ -71,7 +66,7 @@ public void onChunkUnload(ChunkUnloadEvent event) { map.remove(new ChunkKey(event.getChunk())); } - private class ChunkKey { + private static class ChunkKey { private final int x; private final int z; @@ -91,13 +86,13 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (obj == this) + if (obj == this) { return true; + } ChunkKey ck = (ChunkKey) obj; return (ck.x == x && ck.z == z && ck.worldUuid == worldUuid); } } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/TNTMinecartListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/TNTMinecartListener.java similarity index 74% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/TNTMinecartListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/TNTMinecartListener.java index aa4cd66..b9f55d9 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/TNTMinecartListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/TNTMinecartListener.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.listeners; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.annotations.ConfigValue; import me.minebuilders.clearlag.modules.EventModule; @@ -8,6 +9,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.vehicle.VehicleCreateEvent; +import java.util.concurrent.atomic.AtomicInteger; + @ConfigPath(path = "tnt-minecart") public class TNTMinecartListener extends EventModule { @@ -22,16 +25,15 @@ public void onVehicleCreate(VehicleCreateEvent event) { Entity mine = event.getVehicle(); if (mine instanceof ExplosiveMinecart) { - int max = 0; - + AtomicInteger count = new AtomicInteger(0); for (Entity tnt : mine.getNearbyEntities(radius, radius, radius)) { if (tnt instanceof ExplosiveMinecart) { - max++; + count.incrementAndGet(); } } - if (max >= this.max) { - mine.remove(); + if (count.get() >= this.max) { + ClearLag.scheduler().runAtEntity(mine, task -> mine.remove()); } } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/TntReduceListener.java b/common/src/main/java/me/minebuilders/clearlag/listeners/TntReduceListener.java similarity index 64% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/TntReduceListener.java rename to common/src/main/java/me/minebuilders/clearlag/listeners/TntReduceListener.java index 731a546..d0c39b4 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/listeners/TntReduceListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/listeners/TntReduceListener.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.listeners; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.annotations.ConfigValue; import me.minebuilders.clearlag.modules.EventModule; @@ -8,6 +9,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityExplodeEvent; +import java.util.concurrent.atomic.AtomicInteger; + @ConfigPath(path = "tnt-reducer") public class TntReduceListener extends EventModule { @@ -19,23 +22,16 @@ public class TntReduceListener extends EventModule { @EventHandler public void onBoom(EntityExplodeEvent event) { - Entity e = event.getEntity(); - - if (e.getType() == EntityType.PRIMED_TNT) { - - int counter = 0; - + if (e.getType() == EntityType.TNT) { + AtomicInteger counter = new AtomicInteger(0); for (Entity tnt : e.getNearbyEntities(checkRadius, checkRadius, checkRadius)) { - - if (tnt.getType() == EntityType.PRIMED_TNT) - - if (counter > maxPrimed) - tnt.remove(); - else - ++counter; + if (tnt.getType() == EntityType.TNT) { + if (counter.incrementAndGet() > maxPrimed) { + ClearLag.scheduler().runAtEntity(tnt, task -> tnt.remove()); + } + } } } } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/managers/EntityManager.java b/common/src/main/java/me/minebuilders/clearlag/managers/EntityManager.java similarity index 63% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/managers/EntityManager.java rename to common/src/main/java/me/minebuilders/clearlag/managers/EntityManager.java index 7e87e5d..d6943c0 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/managers/EntityManager.java +++ b/common/src/main/java/me/minebuilders/clearlag/managers/EntityManager.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.managers; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.ConfigValue; import me.minebuilders.clearlag.events.EntityRemoveEvent; import me.minebuilders.clearlag.modules.ClearModule; @@ -9,6 +10,7 @@ import org.bukkit.entity.Entity; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; public class EntityManager extends ClearlagModule { @@ -16,25 +18,25 @@ public class EntityManager extends ClearlagModule { private final boolean enabled = true; public int removeEntities(ClearModule mod) { - int removed = 0; - + AtomicInteger removed = new AtomicInteger(0); for (World w : Bukkit.getWorlds()) { - removed += removeEntities(mod.getRemovables(w.getEntities(), w), w); + removed.addAndGet(removeEntities(mod.getRemovables(w.getEntities(), w), w)); } - return removed; + return removed.get(); } public int removeEntities(List removables, World w) { EntityRemoveEvent et = new EntityRemoveEvent(removables, w); + if (enabled) { + Bukkit.getPluginManager().callEvent(et); + } - if (enabled) - Bukkit.getPluginManager().callEvent(et); - - for (Entity en : et.getEntityList()) - en.remove(); + for (Entity en : et.getEntityList()) { + ClearLag.scheduler().runAtEntity(en, task -> en.remove()); + } return et.getEntityList().size(); } -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/BroadcastHandler.java b/common/src/main/java/me/minebuilders/clearlag/modules/BroadcastHandler.java similarity index 89% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/BroadcastHandler.java rename to common/src/main/java/me/minebuilders/clearlag/modules/BroadcastHandler.java index 8103f25..86733e5 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/BroadcastHandler.java +++ b/common/src/main/java/me/minebuilders/clearlag/modules/BroadcastHandler.java @@ -33,12 +33,13 @@ public void broadcast(String message) { public void broadcast(String[] message) { if (isEnabled()) { - - for (int i = 0; i < message.length; ++i) + for (int i = 0; i < message.length; ++i) { message[i] = Util.color(message[i]); + } - if (async && !(broadcaster instanceof AsyncBroadcaster)) + if (async && !(broadcaster instanceof AsyncBroadcaster)) { broadcaster = new AsyncBroadcaster(broadcaster); + } broadcaster.broadcast(message); } @@ -53,35 +54,30 @@ public void setBroadcaster(Broadcaster broadcaster) { } public interface Broadcaster { - void broadcast(String[] message); - } private class DefaultBroadcaster implements Broadcaster { @Override public void broadcast(String[] message) { - if (usePermissionForBroadcasts) { - - for (String str : message) + for (String str : message) { Bukkit.broadcast(str, permission); - - } else - + } + } else { for (Player p : Bukkit.getOnlinePlayers()) { - - for (String str : message) + for (String str : message) { p.sendMessage(str); + } } + } } } private static class AsyncBroadcaster implements Broadcaster { private final ExecutorService executor = Executors.newSingleThreadExecutor(); - private final Broadcaster wrappedBroadcaster; public AsyncBroadcaster(Broadcaster wrappedBroadcaster) { @@ -93,4 +89,4 @@ public void broadcast(String[] message) { executor.submit(() -> wrappedBroadcaster.broadcast(message)); } } -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/ClearModule.java b/common/src/main/java/me/minebuilders/clearlag/modules/ClearModule.java similarity index 63% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/ClearModule.java rename to common/src/main/java/me/minebuilders/clearlag/modules/ClearModule.java index 7c930f3..70077f6 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/ClearModule.java +++ b/common/src/main/java/me/minebuilders/clearlag/modules/ClearModule.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.modules; +import me.minebuilders.clearlag.ClearLag; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Entity; @@ -11,33 +12,30 @@ public abstract class ClearModule extends ClearlagModule { public List getRemovables(List list, World w) { List en = new LinkedList<>(); - - if (isWorldEnabled(w)) { - - for (Entity ent : list) { - if (isRemovable(ent)) { - en.add(ent); - } - } - + if (!isWorldEnabled(w) || list.isEmpty()) { + return en; + } + + for (Entity ent : list) { + if (isRemovable(ent)) { + en.add(ent); + } } - + return en; } public List getAllRemovables() { - List en = new LinkedList<>(); - for (World w : Bukkit.getWorlds()) { + if (!isWorldEnabled(w)) { + continue; + } - if (isWorldEnabled(w)) { - - for (Entity ent : w.getEntities()) { - if (isRemovable(ent)) { - en.add(ent); - } - } + for (Entity ent : w.getEntities()) { + if (isRemovable(ent)) { + en.add(ent); + } } } @@ -49,5 +47,4 @@ public List getAllRemovables() { public boolean isWorldEnabled(World w) { return true; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/ClearlagModule.java b/common/src/main/java/me/minebuilders/clearlag/modules/ClearlagModule.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/ClearlagModule.java rename to common/src/main/java/me/minebuilders/clearlag/modules/ClearlagModule.java index 73f9fda..f0bb1fd 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/ClearlagModule.java +++ b/common/src/main/java/me/minebuilders/clearlag/modules/ClearlagModule.java @@ -18,5 +18,4 @@ public void setDisabled() { public boolean isEnabled() { return enabled; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/CommandModule.java b/common/src/main/java/me/minebuilders/clearlag/modules/CommandModule.java similarity index 92% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/CommandModule.java rename to common/src/main/java/me/minebuilders/clearlag/modules/CommandModule.java index c8b1e1a..dca70c4 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/CommandModule.java +++ b/common/src/main/java/me/minebuilders/clearlag/modules/CommandModule.java @@ -39,19 +39,23 @@ public abstract class CommandModule extends ClearlagModule { public void processCmd(CommandSender sender, String[] arg) throws WrongCommandArgumentException { - if (!sender.hasPermission("lagg." + name)) + if (!sender.hasPermission("lagg." + name)) { throw new WrongCommandArgumentException(noPermission, displayName); + } - if (argLength >= arg.length) + if (argLength >= arg.length) { throw new WrongCommandArgumentException(wrongUsage, usage, displayName); + } - if (arg.length >= 1) + if (arg.length >= 1) { arg = Arrays.copyOfRange(arg, 1, arg.length); + } - if (sender instanceof Player) + if (sender instanceof Player) { run((Player) sender, arg); - else + } else { run(sender, arg); + } } protected void run(Player player, String[] args) throws WrongCommandArgumentException { @@ -71,8 +75,9 @@ public void setEnabled() { displayName = languageManager.getMessage("command." + name + ".name").getRawStringMessage(); desc = languageManager.getMessage("command." + name + ".desc").getRawStringMessage(); usage = languageManager.getMessage("command." + name + ".usage").getRawStringMessage(); - } else + } else { displayName = name; + } commandListener.addCmd(this); } @@ -96,5 +101,4 @@ public String getUsage() { public String getDescription() { return desc; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/EventModule.java b/common/src/main/java/me/minebuilders/clearlag/modules/EventModule.java similarity index 78% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/EventModule.java rename to common/src/main/java/me/minebuilders/clearlag/modules/EventModule.java index 354429d..1d1ee31 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/EventModule.java +++ b/common/src/main/java/me/minebuilders/clearlag/modules/EventModule.java @@ -1,6 +1,6 @@ package me.minebuilders.clearlag.modules; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import org.bukkit.Bukkit; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; @@ -11,7 +11,7 @@ public abstract class EventModule extends ClearlagModule implements Listener { public void setEnabled() { super.setEnabled(); - Bukkit.getPluginManager().registerEvents(this, Clearlag.getInstance()); + Bukkit.getPluginManager().registerEvents(this, ClearLag.getInstance()); } @Override @@ -20,5 +20,4 @@ public void setDisabled() { HandlerList.unregisterAll(this); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/Module.java b/common/src/main/java/me/minebuilders/clearlag/modules/Module.java similarity index 98% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/Module.java rename to common/src/main/java/me/minebuilders/clearlag/modules/Module.java index 7c05ba3..41f63a8 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/modules/Module.java +++ b/common/src/main/java/me/minebuilders/clearlag/modules/Module.java @@ -7,5 +7,4 @@ public interface Module { void setDisabled(); boolean isEnabled(); - } diff --git a/common/src/main/java/me/minebuilders/clearlag/modules/TaskModule.java b/common/src/main/java/me/minebuilders/clearlag/modules/TaskModule.java new file mode 100644 index 0000000..d5ab9a1 --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/modules/TaskModule.java @@ -0,0 +1,33 @@ +package me.minebuilders.clearlag.modules; + +import com.tcoded.folialib.wrapper.task.WrappedTask; +import me.minebuilders.clearlag.ClearLag; + +public abstract class TaskModule extends ClearlagModule implements Runnable { + + private WrappedTask task; + + @Override + public void setEnabled() { + super.setEnabled(); + + task = startTask(); + } + + protected WrappedTask startTask() { + return ClearLag.scheduler().runTimer(this, getInterval(), getInterval()); + } + + @Override + public void setDisabled() { + super.setDisabled(); + if (task != null) { + ClearLag.scheduler().cancelTask(task); + task = null; + } + } + + public int getInterval() { + return 20; + } +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/reflection/AutoWirer.java b/common/src/main/java/me/minebuilders/clearlag/reflection/AutoWirer.java similarity index 94% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/reflection/AutoWirer.java rename to common/src/main/java/me/minebuilders/clearlag/reflection/AutoWirer.java index 988fbd9..e6e14e8 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/reflection/AutoWirer.java +++ b/common/src/main/java/me/minebuilders/clearlag/reflection/AutoWirer.java @@ -15,45 +15,36 @@ public class AutoWirer { private final List wireables = new ArrayList<>(); public void addWireable(Object obj) { - - if (obj == null) + if (obj == null) { throw new NullPointerException(); + } wireables.add(obj); } public void addWireables(Object[] obs) { - - for (Object obj : obs) + for (Object obj : obs) { addWireable(obj); + } } public void wireObject(Object object) throws IllegalAccessException { - Class clazz = object.getClass(); - while (clazz != null && clazz != Object.class && clazz != Module.class) { - for (Field field : clazz.getDeclaredFields()) { - if (field.isAnnotationPresent(AutoWire.class)) { - field.setAccessible(true); - if (field.get(object) == null) { - for (Object wire : wireables) { - if (field.getType().isAssignableFrom(wire.getClass())) { - field.set(object, wire); - break; } } } } } + clazz = clazz.getSuperclass(); } } @@ -61,4 +52,4 @@ public void wireObject(Object object) throws IllegalAccessException { public List getWires() { return wireables; } -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/reflection/ReflectionUtil.java b/common/src/main/java/me/minebuilders/clearlag/reflection/ReflectionUtil.java similarity index 98% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/reflection/ReflectionUtil.java rename to common/src/main/java/me/minebuilders/clearlag/reflection/ReflectionUtil.java index ff6314d..87ef5ae 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/reflection/ReflectionUtil.java +++ b/common/src/main/java/me/minebuilders/clearlag/reflection/ReflectionUtil.java @@ -16,6 +16,7 @@ public static Method getMethodByName(Class clazz, String methodName) { return meth; } } + return null; } @@ -31,7 +32,7 @@ public static boolean isClass(String className) { public static boolean isField(Class owner, String fieldName) { try { Field field = owner.getDeclaredField(fieldName); - return field != null; + return true; } catch (Exception e) { return false; } @@ -42,63 +43,57 @@ public static Object castPrimitedValues(Class field, Object value) { if (field == int.class) { return ((Number) value).intValue(); } + if (field == long.class) { return ((Number) value).longValue(); } + if (field == float.class) { return ((Number) value).floatValue(); } + if (field == double.class) { return ((Number) value).doubleValue(); } } + return value; } public static Field getField(Class clazz, String name) { - try { final Field field = clazz.getDeclaredField(name); - field.setAccessible(true); return field; - } catch (Exception e) { throw new IllegalStateException(e); } } public static MethodHandle generateGetterMethodHandle(Class clazz, String name) { - try { final Field field = clazz.getDeclaredField(name); - field.setAccessible(true); return MethodHandles.lookup().unreflectGetter(field); - } catch (Exception e) { throw new IllegalStateException(e); } } public static MethodHandle generateSetterMethodHandle(Class clazz, String name) { - try { final Field field = clazz.getDeclaredField(name); - field.setAccessible(true); return MethodHandles.lookup().unreflectSetter(field); - } catch (Exception e) { throw new IllegalStateException(e); } } public static Class getClass(String package_, String clazz) { - try { return Class.forName(package_ + "." + clazz); } catch (Exception e) { diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/AreaClear.java b/common/src/main/java/me/minebuilders/clearlag/removetype/AreaClear.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/AreaClear.java rename to common/src/main/java/me/minebuilders/clearlag/removetype/AreaClear.java index 91e855e..12d0e7e 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/AreaClear.java +++ b/common/src/main/java/me/minebuilders/clearlag/removetype/AreaClear.java @@ -16,5 +16,4 @@ public class AreaClear extends ClearModule { public boolean isRemovable(Entity e) { return (!(e instanceof Player) && !types.containsEntity(e)); } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/AutoClear.java b/common/src/main/java/me/minebuilders/clearlag/removetype/AutoClear.java similarity index 91% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/AutoClear.java rename to common/src/main/java/me/minebuilders/clearlag/removetype/AutoClear.java index e0c9a65..59e55e0 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/AutoClear.java +++ b/common/src/main/java/me/minebuilders/clearlag/removetype/AutoClear.java @@ -14,11 +14,10 @@ public class AutoClear extends LimitClear { @Override public boolean isRemovable(Entity e) { - - if (removeEntities.containsEntity(e)) + if (removeEntities.containsEntity(e)) { return true; + } return super.isRemovable(e); } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/CmdClear.java b/common/src/main/java/me/minebuilders/clearlag/removetype/CmdClear.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/CmdClear.java rename to common/src/main/java/me/minebuilders/clearlag/removetype/CmdClear.java index b221b96..adcdca2 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/CmdClear.java +++ b/common/src/main/java/me/minebuilders/clearlag/removetype/CmdClear.java @@ -4,5 +4,4 @@ @ConfigPath(path = "command-remove") public class CmdClear extends AutoClear { - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java b/common/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java rename to common/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java index fc6f65b..3b126ab 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java +++ b/common/src/main/java/me/minebuilders/clearlag/removetype/KillMobsClear.java @@ -22,5 +22,4 @@ public class KillMobsClear extends ClearModule { public boolean isRemovable(Entity e) { return e instanceof LivingEntity && !(e instanceof HumanEntity) && (removeNamed || e.getCustomName() == null) && !mobFilter.containsEntity(e); } - -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/LimitClear.java b/common/src/main/java/me/minebuilders/clearlag/removetype/LimitClear.java similarity index 62% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/LimitClear.java rename to common/src/main/java/me/minebuilders/clearlag/removetype/LimitClear.java index c3710ac..5c4990c 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/removetype/LimitClear.java +++ b/common/src/main/java/me/minebuilders/clearlag/removetype/LimitClear.java @@ -17,38 +17,71 @@ public class LimitClear extends ClearModule { @ConfigValue private boolean item; + @ConfigValue(valueType = ConfigValueType.MATERIAL_SET) private Set itemFilter; + @ConfigValue - private final List worldFilter = new ArrayList(); + private final List worldFilter = new ArrayList<>(); + @ConfigValue private boolean itemframe; + @ConfigValue private boolean fallingBlock; + @ConfigValue private boolean boat; + @ConfigValue private boolean experienceOrb; + @ConfigValue private boolean painting; + @ConfigValue private boolean projectile; + @ConfigValue private boolean primedTnt; + @ConfigValue private boolean minecart; - @Override public boolean isRemovable(Entity e) { - if (e instanceof Item) return (item && !itemFilter.contains((((Item) e).getItemStack().getType()))); - if (e instanceof ItemFrame) return itemframe; - if (e instanceof FallingBlock) return fallingBlock; - if (e instanceof Boat) return (e.isEmpty() && boat); - if (e instanceof ExperienceOrb) return experienceOrb; - if (e instanceof Painting) return painting; - if (e instanceof Projectile) return projectile; - if (e instanceof TNTPrimed) return primedTnt; + if (e instanceof Item) { + return (item && !itemFilter.contains((((Item) e).getItemStack().getType()))); + } + + if (e instanceof ItemFrame) { + return itemframe; + } + + if (e instanceof FallingBlock) { + return fallingBlock; + } + + if (e instanceof Boat) { + return (e.isEmpty() && boat); + } + + if (e instanceof ExperienceOrb) { + return experienceOrb; + } + + if (e instanceof Painting) { + return painting; + } + + if (e instanceof Projectile) { + return projectile; + } + + if (e instanceof TNTPrimed) { + return primedTnt; + } + return e instanceof Minecart && (e.isEmpty() && minecart); } @@ -56,5 +89,4 @@ public boolean isRemovable(Entity e) { public boolean isWorldEnabled(World w) { return !worldFilter.contains(w.getName()); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/statrenderers/MemoryRenderer.java b/common/src/main/java/me/minebuilders/clearlag/statrenderers/MemoryRenderer.java similarity index 95% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/statrenderers/MemoryRenderer.java rename to common/src/main/java/me/minebuilders/clearlag/statrenderers/MemoryRenderer.java index 1bcc955..880f521 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/statrenderers/MemoryRenderer.java +++ b/common/src/main/java/me/minebuilders/clearlag/statrenderers/MemoryRenderer.java @@ -37,7 +37,6 @@ public MemoryRenderer(Player observer, int sampleTicks, ItemStack mapItemStack, super(observer, sampleTicks, mapItemStack, versionAdapter, mapView); for (MemoryPoolMXBean memoryBean : ManagementFactory.getMemoryPoolMXBeans()) { - if (memoryBean.getType() == MemoryType.HEAP) { memoryBeans.add(memoryBean); } @@ -48,24 +47,17 @@ public MemoryRenderer(Player observer, int sampleTicks, ItemStack mapItemStack, int colorIndex = 0; for (int i = memoryBeans.size() - 1; i >= 0; --i) { - final MemoryPoolMXBean memoryBean = memoryBeans.get(i); - final int color = colorIndex >= colorTypes.length ? colorIndex = 0 : colorIndex++; observer.sendMessage(ChatColor.RED + " - " + ChatColor.DARK_GREEN + memoryBean.getName() + ChatColor.DARK_GRAY + ": " + ChatColor.GREEN + colorTypes[color]); - } } private long getTotalGCCompleteTime() { - long totalGarbageCollections = 0; - for (GarbageCollectorMXBean gc : gcBeans) { - long count = gc.getCollectionTime(); - if (count >= 0) { totalGarbageCollections += count; } @@ -74,52 +66,41 @@ private long getTotalGCCompleteTime() { return totalGarbageCollections; } - @Override public void tick() { - final MemorySampleColumn column = new MemorySampleColumn(); - for (MemoryPoolMXBean memoryBean : memoryBeans) { column.addMemorySample(new MemorySample(RAMUtil.toMB(memoryBean.getUsage().getUsed()))); } final long totalGCTime = getTotalGCCompleteTime(); - final long gcTime = (totalGCTime - gcLastPauseTime); - if (gcTime > 0) + if (gcTime > 0) { column.garbageCollectionTime = (int) gcTime; + } this.gcLastPauseTime = totalGCTime; memorySamples.addLast(column); - while (memorySamples.size() > width) + while (memorySamples.size() > width) { memorySamples.removeFirst(); + } } @Override public void draw(MapView mapView, MapCanvas mapCanvas, Player player) { - final int maxHeapSize = RAMUtil.toMB(Runtime.getRuntime().totalMemory()); int x = 0; - for (MemorySampleColumn memorySampleColumn : memorySamples) { - int colorIndex = 0; - int baseY = 0; - int drawTo = height; - for (int i = memorySampleColumn.memorySamples.size() - 1; i >= 0; --i) { - final MemorySample sample = memorySampleColumn.memorySamples.get(i); - final byte color = memoryPalettes[colorIndex >= memoryPalettes.length ? colorIndex = 0 : colorIndex++]; - final int y = (((sample.usageInMB + baseY) * height) / maxHeapSize); for (int j = height - y; j < drawTo; ++j) { @@ -134,9 +115,7 @@ public void draw(MapView mapView, MapCanvas mapCanvas, Player player) { } x = 0; - for (MemorySampleColumn memorySampleColumn : memorySamples) { - if (memorySampleColumn.didGarbageCollection()) { mapCanvas.drawText(x, height - 8, MinecraftFont.Font, "§32;" + memorySampleColumn.garbageCollectionTime + "ms"); } @@ -145,9 +124,7 @@ public void draw(MapView mapView, MapCanvas mapCanvas, Player player) { } for (double yPos : new double[]{0.0, 0.25, 0.50, 0.75}) { - final int y = (int) (((maxHeapSize * yPos) * height) / maxHeapSize); - mapCanvas.drawText(5, y, MinecraftFont.Font, "§48;" + (Math.round(((maxHeapSize * (1 - yPos)) / 1000.0) * 10.0) / 10.0) + "GB" ); @@ -163,7 +140,6 @@ public void draw(MapView mapView, MapCanvas mapCanvas, Player player) { } private static class MemorySampleColumn { - private final List memorySamples = new ArrayList<>(5); private int garbageCollectionTime = -1; @@ -177,13 +153,6 @@ public boolean didGarbageCollection() { } } - private static class MemorySample { - - private final int usageInMB; - - public MemorySample(int usageInMB) { - this.usageInMB = usageInMB; - } - + private record MemorySample(int usageInMB) { } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/statrenderers/ProcessRenderer.java b/common/src/main/java/me/minebuilders/clearlag/statrenderers/ProcessRenderer.java similarity index 76% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/statrenderers/ProcessRenderer.java rename to common/src/main/java/me/minebuilders/clearlag/statrenderers/ProcessRenderer.java index e4c231c..26fca97 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/statrenderers/ProcessRenderer.java +++ b/common/src/main/java/me/minebuilders/clearlag/statrenderers/ProcessRenderer.java @@ -9,14 +9,14 @@ import org.bukkit.map.MapView; import org.bukkit.map.MinecraftFont; -import java.util.LinkedList; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.atomic.AtomicInteger; import static java.lang.Thread.State.*; +import me.minebuilders.clearlag.ClearLag; +import com.tcoded.folialib.wrapper.task.WrappedTask; + /** * @author bob7l */ @@ -30,11 +30,9 @@ public class ProcessRenderer extends StatRenderer { private final Thread watchingThread; - private final LinkedList threadStateColumns = new LinkedList<>(); - - private final Lock lock = new ReentrantLock(); + private final ConcurrentLinkedDeque threadStateColumns = new ConcurrentLinkedDeque<>(); - private final Timer samplerTimer; + private final WrappedTask samplerTask; public ProcessRenderer(Player observer, int sampleTicks, ItemStack mapItemStack, VersionAdapter versionAdapter, MapView mapView, Thread watchingThread) { super(observer, sampleTicks, mapItemStack, versionAdapter, mapView); @@ -47,9 +45,7 @@ public ProcessRenderer(Player observer, int sampleTicks, ItemStack mapItemStack, defineState(BLOCKED, 3, MapPalette.RED); defineState(TIMED_WAITING, 4, MapPalette.BLUE); - samplerTimer = new Timer("clearlag-thread-prober", true); - - samplerTimer.scheduleAtFixedRate(new SamplerThread(), 1L, 1L); + samplerTask = ClearLag.scheduler().runTimerAsync(new SamplerRunnable(), 1L, 1L); } private void defineState(Thread.State state, int orderId, byte colorId) { @@ -61,7 +57,7 @@ private void defineState(Thread.State state, int orderId, byte colorId) { public void cancel() { super.cancel(); - samplerTimer.cancel(); + ClearLag.scheduler().cancelTask(samplerTask); } @Override @@ -72,32 +68,21 @@ public void tick() { public void draw(MapView mapView, MapCanvas mapCanvas, Player player) { int x = 0; - int sleepTime = 0; - int totalTime = 0; - lock.lock(); - if (!threadStateColumns.isEmpty()) { - totalTime = threadStateColumns.size() * TICK_LENGTH; - for (StateColumn stateColumn : threadStateColumns) { - int drawPosition = height - 1; - for (int i = 0; i < stateColumn.stateTable.length; ++i) { - final int length = stateColumn.getStateCount(i); - if (length > 0) { - - if (i == 4) + if (i == 4) { sleepTime += length; + } final byte color = stateColorTable[i]; - for (int j = 0; j < length; ++j) { mapCanvas.setPixel(x, drawPosition - j, color); } @@ -105,22 +90,18 @@ public void draw(MapView mapView, MapCanvas mapCanvas, Player player) { drawPosition -= length; } } + ++x; } } - lock.unlock(); - final int tickLineY = width - 51; - for (int i = 0; i < width; ++i) { mapCanvas.setPixel(i, tickLineY, MapPalette.LIGHT_GRAY); } if (totalTime != 0) { - final double threadUsage = (100.0 - (((double) sleepTime / (double) totalTime) * 100.0)); - mapCanvas.drawText(5, 5, MinecraftFont.Font, "§44;Thread-Usage: §16;" + ((int) threadUsage) + "%" ); @@ -134,9 +115,7 @@ public void draw(MapView mapView, MapCanvas mapCanvas, Player player) { mapCanvas.drawText(6, 29, MinecraftFont.Font, "§44;Memory: §16;" + RAMUtil.getUsedMemory() + "MB" ); - } - } private static class StateColumn { @@ -159,34 +138,22 @@ public int getLength() { } } - private class SamplerThread extends TimerTask { + private class SamplerRunnable implements Runnable { - private StateColumn currentColumn = new StateColumn(); + private volatile StateColumn currentColumn = new StateColumn(); + private final AtomicInteger sampleCount = new AtomicInteger(0); @Override public void run() { - - if (currentColumn.length >= TICK_LENGTH) { - - lock.lock(); - - try { - - threadStateColumns.addFirst(currentColumn); - - if (threadStateColumns.size() > width) - threadStateColumns.removeLast(); - - } catch (Exception e) { - e.printStackTrace(); - } finally { - lock.unlock(); - - currentColumn = new StateColumn(); + currentColumn.addStateStat(stateGroupTable[watchingThread.getState().ordinal()]); + if (sampleCount.incrementAndGet() >= TICK_LENGTH) { + threadStateColumns.addFirst(currentColumn); + while (threadStateColumns.size() > width) { + threadStateColumns.pollLast(); } + currentColumn = new StateColumn(); + sampleCount.set(0); } - - currentColumn.addStateStat(stateGroupTable[watchingThread.getState().ordinal()]); } } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/statrenderers/StatRenderer.java b/common/src/main/java/me/minebuilders/clearlag/statrenderers/StatRenderer.java similarity index 74% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/statrenderers/StatRenderer.java rename to common/src/main/java/me/minebuilders/clearlag/statrenderers/StatRenderer.java index e426cf8..f0994d2 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/statrenderers/StatRenderer.java +++ b/common/src/main/java/me/minebuilders/clearlag/statrenderers/StatRenderer.java @@ -1,12 +1,12 @@ package me.minebuilders.clearlag.statrenderers; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.adapters.VersionAdapter; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.map.*; -import org.bukkit.scheduler.BukkitTask; +import org.jetbrains.annotations.NotNull; +import com.tcoded.folialib.wrapper.task.WrappedTask; /** * @author bob7l @@ -29,7 +29,7 @@ public abstract class StatRenderer extends MapRenderer implements Runnable { private final VersionAdapter versionAdapter; - private final BukkitTask taskId; + private final WrappedTask taskId; public StatRenderer(Player observer, int sampleTicks, ItemStack mapItemStack, VersionAdapter versionAdapter, MapView mapView) { this.observer = observer; @@ -38,14 +38,14 @@ public StatRenderer(Player observer, int sampleTicks, ItemStack mapItemStack, Ve this.versionAdapter = versionAdapter; this.sampleTicks = sampleTicks; - taskId = Bukkit.getScheduler().runTaskTimer(Clearlag.getInstance(), this, sampleTicks, sampleTicks); + taskId = ClearLag.scheduler().runTimer(this, sampleTicks, sampleTicks); } public void cancel() { mapView.removeRenderer(this); - taskId.cancel(); + ClearLag.scheduler().cancelTask(taskId); } public abstract void tick(); @@ -54,29 +54,26 @@ public void cancel() { @Override public void run() { - - if (!observer.isOnline() || observer.getItemInHand() == null || !versionAdapter.isMapItemStackEqual(observer.getItemInHand(), mapItemStack)) { - + if (!observer.isOnline() || !versionAdapter.isMapItemStackEqual(observer.getItemInHand(), mapItemStack)) { cancel(); - return; } pendingRefresh = true; - tick(); } @Override - public void render(MapView mapView, MapCanvas mapCanvas, Player player) { - + public void render(@NotNull MapView mapView, MapCanvas mapCanvas, @NotNull Player player) { final MapCursorCollection mapCursorCollection = mapCanvas.getCursors(); - while (mapCursorCollection.size() > 0) + while (mapCursorCollection.size() > 0) { mapCursorCollection.removeCursor(mapCursorCollection.getCursor(0)); + } - if (!pendingRefresh) + if (!pendingRefresh) { return; + } for (int i = width; i >= 0; --i) { for (int j = height; j >= 0; --j) { @@ -85,7 +82,6 @@ public void render(MapView mapView, MapCanvas mapCanvas, Player player) { } draw(mapView, mapCanvas, player); - pendingRefresh = false; } } diff --git a/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java new file mode 100644 index 0000000..00a7b88 --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java @@ -0,0 +1,112 @@ +package me.minebuilders.clearlag.tasks; + +import me.minebuilders.clearlag.Util; +import me.minebuilders.clearlag.annotations.AutoWire; +import me.minebuilders.clearlag.annotations.ConfigModule; +import me.minebuilders.clearlag.annotations.ConfigPath; +import me.minebuilders.clearlag.annotations.ConfigValue; +import me.minebuilders.clearlag.config.ConfigValueType; +import me.minebuilders.clearlag.managers.EntityManager; +import me.minebuilders.clearlag.modules.BroadcastHandler; +import me.minebuilders.clearlag.modules.TaskModule; +import me.minebuilders.clearlag.removetype.AutoClear; +import me.minebuilders.clearlag.ClearLag; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Entity; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +@ConfigPath(path = "auto-removal") +public class ClearTask extends TaskModule { + + @ConfigModule + private final AutoClear autoClear = new AutoClear(); + + @ConfigValue + private int autoremovalInterval; + + @ConfigValue(valueType = ConfigValueType.COLORED_STRINGS) + private String[] broadcastMessage; + + @ConfigValue(valueType = ConfigValueType.WARN_ARRAY) + private HashMap warnings; + + @ConfigValue(valueType = ConfigValueType.PRIMITIVE) + private boolean broadcastRemoval; + + @AutoWire + private EntityManager entityManager; + + @AutoWire + private BroadcastHandler broadcastHandler; + + private int interval = 0; + + public void run() { + + final String[] broadcastWarning = warnings != null ? warnings.get(++interval) : null; + + if (broadcastWarning != null) { + broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastWarning, "+remaining", "" + (autoremovalInterval - interval))); + } + + if (interval >= autoremovalInterval) { + final List worlds = Bukkit.getWorlds(); + if (worlds.isEmpty()) { + if (broadcastRemoval) { + broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastMessage, "+RemoveAmount", "0")); + } + + interval = 0; + return; + } + + final AtomicInteger totalPendingWorlds = new AtomicInteger(worlds.size()); + final AtomicInteger totalRemoved = new AtomicInteger(0); + + for (World w : worlds) { + final Entity[] snapshot = w.getEntities().toArray(new Entity[0]); + + if (snapshot.length == 0) { + if (totalPendingWorlds.decrementAndGet() == 0) { + if (broadcastRemoval) { + broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastMessage, "+RemoveAmount", String.valueOf(totalRemoved.get()))); + } + } + continue; + } + + final AtomicInteger pending = new AtomicInteger(snapshot.length); + final ConcurrentLinkedQueue matched = new ConcurrentLinkedQueue<>(); + + for (Entity e : snapshot) { + ClearLag.scheduler().runAtEntity(e, task -> { + try { + if (autoClear.isWorldEnabled(w) && autoClear.isRemovable(e)) { + matched.add(e); + } + } finally { + if (pending.decrementAndGet() == 0) { + int removed = entityManager.removeEntities(new ArrayList<>(matched), w); + totalRemoved.addAndGet(removed); + + if (totalPendingWorlds.decrementAndGet() == 0) { + if (broadcastRemoval) { + broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastMessage, "+RemoveAmount", String.valueOf(totalRemoved.get()))); + } + } + } + } + }); + } + } + + interval = 0; + } + } +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/HaltTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/HaltTask.java similarity index 73% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/HaltTask.java rename to common/src/main/java/me/minebuilders/clearlag/tasks/HaltTask.java index f2d5ef8..dc46835 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/HaltTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/HaltTask.java @@ -1,6 +1,6 @@ package me.minebuilders.clearlag.tasks; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.annotations.ConfigValue; @@ -18,7 +18,10 @@ import org.bukkit.plugin.PluginManager; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.HashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; @ConfigPath(path = "halt-command") public class HaltTask extends ClearlagModule implements Listener { @@ -44,22 +47,28 @@ public void setEnabled() { valuelist = new HashMap<>(Bukkit.getWorlds().size()); for (World w : Bukkit.getWorlds()) { - if (removeEntities) { - - entityManager.removeEntities(new ClearModule() { - - @Override - public boolean isRemovable(Entity e) { - return (((e instanceof Item)) || ((e instanceof TNTPrimed)) || ((e instanceof ExperienceOrb)) || ((e instanceof FallingBlock)) || ((e instanceof Monster))); - } - - @Override - public boolean isWorldEnabled(World w) { - return true; + for (World world : Bukkit.getWorlds()) { + final Entity[] snapshot = world.getEntities().toArray(new Entity[0]); + if (snapshot.length == 0) continue; + + final ConcurrentLinkedQueue matched = new ConcurrentLinkedQueue<>(); + final AtomicInteger pending = new AtomicInteger(snapshot.length); + + for (Entity e : snapshot) { + ClearLag.scheduler().runAtEntity(e, task -> { + try { + if (((e instanceof Item)) || ((e instanceof TNTPrimed)) || ((e instanceof ExperienceOrb)) || ((e instanceof FallingBlock)) || ((e instanceof Monster))) { + matched.add(e); + } + } finally { + if (pending.decrementAndGet() == 0) { + entityManager.removeEntities(new ArrayList<>(matched), world); + } + } + }); } - - }); + } } if (disableNaturalEntitySpawning) { @@ -83,46 +92,34 @@ public boolean isWorldEnabled(World w) { } } - PluginManager pm = Clearlag.getInstance().getServer().getPluginManager(); + PluginManager pm = ClearLag.getInstance().getServer().getPluginManager(); Method[] methods = this.getClass().getDeclaredMethods(); for (final Method method : methods) { - final EventHandler he = method.getAnnotation(EventHandler.class); - if (he != null && config.getConfig().getBoolean("halt-command.halted." + config.javaToConfigValue(method.getName()))) { - Class[] params = method.getParameterTypes(); - if (!Event.class.isAssignableFrom(params[0]) || params.length != 1) { continue; } final Class eventClass = params[0].asSubclass(Event.class); - method.setAccessible(true); - EventExecutor executor = new EventExecutor() { - - public void execute(Listener listener, Event event) throws EventException { - - try { - - if (!eventClass.isAssignableFrom(event.getClass())) { - return; - } - - method.invoke(listener, event); - - } catch (Exception ex) { - throw new EventException(ex.getCause()); + EventExecutor executor = (listener, event) -> { + try { + if (!eventClass.isAssignableFrom(event.getClass())) { + return; } + + method.invoke(listener, event); + } catch (Exception ex) { + throw new EventException(ex.getCause()); } }; - - pm.registerEvent(eventClass, this, he.priority(), executor, Clearlag.getInstance(), he.ignoreCancelled()); + pm.registerEvent(eventClass, this, he.priority(), executor, ClearLag.getInstance(), he.ignoreCancelled()); } } } @@ -132,7 +129,6 @@ public void setDisabled() { super.setDisabled(); if (!valuelist.isEmpty()) { - for (World w : valuelist.keySet()) { Integer[] values = valuelist.get(w); w.setAmbientSpawnLimit(values[0]); @@ -145,7 +141,6 @@ public void setDisabled() { } valuelist = null; - HandlerList.unregisterAll(this); } @@ -189,5 +184,4 @@ public void blockFade(BlockFadeEvent e) { public void blockNaturalChange(BlockFromToEvent e) { e.setCancelled(true); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LagSpikeTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/LagSpikeTask.java similarity index 55% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LagSpikeTask.java rename to common/src/main/java/me/minebuilders/clearlag/tasks/LagSpikeTask.java index f8728c0..b08a23b 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LagSpikeTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/LagSpikeTask.java @@ -1,13 +1,13 @@ package me.minebuilders.clearlag.tasks; -import me.minebuilders.clearlag.Clearlag; +import com.tcoded.folialib.wrapper.task.WrappedTask; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.annotations.ConfigValue; import me.minebuilders.clearlag.config.ConfigHandler; import me.minebuilders.clearlag.modules.TaskModule; -import org.bukkit.Bukkit; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; @@ -28,136 +28,92 @@ public class LagSpikeTask extends TaskModule { @AutoWire private ConfigHandler configHandler; - private final Thread mainThread; - + private final Thread mainThread = Thread.currentThread(); private final AtomicInteger tick = new AtomicInteger(); - private final AtomicLong tickTimestamp = new AtomicLong(); - private final AtomicLong tickGarbageCollectorTimeTotal = new AtomicLong(); - private Timer timer = null; - - public LagSpikeTask() { - this.mainThread = Thread.currentThread(); - } + private Timer timer; private class ThreadWatcherTask extends TimerTask { - - private long lastElaspedTime = 0L; - + private long lastElapsedTime = 0L; private long lastGarbageCollectionTimeTotal = 0; - private int frozenTick = -100; - private String frozenLine = ""; - private boolean frozen = false; + @Override public void run() { - final int currentTick = tick.get(); - - if (currentTick < 400) - return; + if (currentTick < 400) return; final long elapsedTime = (System.currentTimeMillis() - tickTimestamp.get()); - if (elapsedTime >= minElapsedTime) { - frozen = true; - - final StackTraceElement[] stackTraceElements = mainThread.getStackTrace(); + final StackTraceElement[] trace = mainThread.getStackTrace(); if (currentTick != frozenTick) { - lastGarbageCollectionTimeTotal = tickGarbageCollectorTimeTotal.get(); - frozenTick = currentTick; - Util.warning("Clearlag has detected a possible lag spike on tick #" + currentTick + " (Tick is currently at " + elapsedTime + " milliseconds)"); - - Util.warning("Thread name: " + mainThread.getName() + " Id: " + mainThread.getId()); - - Util.warning("Thread state: " + mainThread.getState()); - - Util.warning("Thread stack-trace: "); - - if (stackTraceElements.length > 0) { - - for (StackTraceElement ste : stackTraceElements) - Util.log(" > " + ste); - - frozenLine = stackTraceElements[0].toString(); - } + Util.warning("Clearlag detected a possible lag spike on tick #" + currentTick + " (" + elapsedTime + "ms elapsed)"); + Util.warning("Thread: " + mainThread.getName() + " [" + mainThread.getState() + "]"); + Util.warning("Stack trace:"); + for (StackTraceElement ste : trace) Util.log(" > " + ste); - } else if (followStack && stackTraceElements.length > 0 && !stackTraceElements[0].toString().equals(frozenLine)) { + if (trace.length > 0) frozenLine = trace[0].toString(); - Util.warning("Thread stack-trace (Stack moved): "); - - for (StackTraceElement ste : stackTraceElements) - Util.log(" > " + ste); - - frozenLine = stackTraceElements[0].toString(); + } else if (followStack && trace.length > 0 && !trace[0].toString().equals(frozenLine)) { + Util.warning("Thread stack trace (stack moved):"); + for (StackTraceElement ste : trace) Util.log(" > " + ste); + frozenLine = trace[0].toString(); } - lastElaspedTime = elapsedTime; - + lastElapsedTime = elapsedTime; } else if (frozen) { - frozenLine = null; - frozen = false; - Util.warning("Thread '" + mainThread.getName() + "' is no longer stuck on tick #" + frozenTick); - Util.warning("Estimated time spent on tick #" + frozenTick + ": " + lastElaspedTime); - Util.warning("Garbage collection time during tick: " + (getTotalGCCompleteTime() - lastGarbageCollectionTimeTotal)); + Util.warning("Estimated time spent on tick #" + frozenTick + ": " + lastElapsedTime + "ms"); + Util.warning("Garbage collection time during tick: " + (getTotalGCCompleteTime() - lastGarbageCollectionTimeTotal) + "ms"); } - } - } private long getTotalGCCompleteTime() { - - long totalGarbageCollections = 0; - - for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) - totalGarbageCollections += gc.getCollectionTime(); - - return totalGarbageCollections; + long total = 0; + for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) { + total += gc.getCollectionTime(); + } + return total; } @Override public void run() { - tick.incrementAndGet(); - tickTimestamp.set(System.currentTimeMillis()); - tickGarbageCollectorTimeTotal.set(getTotalGCCompleteTime()); } - protected int startTask() { - + @Override + protected WrappedTask startTask() { timer = new Timer(true); + long interval = configHandler.getConfig().getLong("lag-spike-helper.check-interval"); + timer.scheduleAtFixedRate(new ThreadWatcherTask(), 50L, interval); - timer.scheduleAtFixedRate(new ThreadWatcherTask(), 50, configHandler.getConfig().getLong("lag-spike-helper.check-interval")); - - return Bukkit.getScheduler().runTaskTimer(Clearlag.getInstance(), this, getInterval(), getInterval()).getTaskId(); + return ClearLag.scheduler().runTimer(this, getInterval(), getInterval()); } @Override public void setDisabled() { super.setDisabled(); - - Bukkit.getScheduler().cancelTask(taskid); - - timer.cancel(); - - timer = null; + if (timer != null) { + timer.cancel(); + timer = null; + } } + @Override public int getInterval() { return 1; } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LimitTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/LimitTask.java similarity index 86% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LimitTask.java rename to common/src/main/java/me/minebuilders/clearlag/tasks/LimitTask.java index 459eb95..4bc795c 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LimitTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/LimitTask.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.tasks; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigModule; import me.minebuilders.clearlag.annotations.ConfigPath; @@ -31,16 +32,18 @@ public class LimitTask extends TaskModule { private BroadcastHandler broadcastHandler; public void run() { - List ents = new ArrayList(); + List ents = new ArrayList<>(); for (World w : Bukkit.getWorlds()) { ents.addAll(limitClear.getRemovables(w.getEntities(), w)); } - if (ents.size() <= max) return; + if (ents.size() <= max) { + return; + } for (Entity entity : ents) { - entity.remove(); + ClearLag.scheduler().runAtEntity(entity, task -> entity.remove()); } if (configHandler.getConfig().getBoolean("limit.broadcast-removal")) { @@ -54,5 +57,4 @@ public void run() { public int getInterval() { return configHandler.getConfig().getInt("limit.check-interval") * 20; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LiveTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/LiveTask.java similarity index 71% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LiveTask.java rename to common/src/main/java/me/minebuilders/clearlag/tasks/LiveTask.java index 8973697..bee619b 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LiveTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/LiveTask.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.tasks; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.annotations.ConfigValue; @@ -37,11 +38,17 @@ public void run() { for (World w : Bukkit.getWorlds()) { for (Entity e : w.getEntities()) { if (mobtimer && e instanceof LivingEntity && !(e instanceof HumanEntity)) { - if (e.getTicksLived() > moblivetime) e.remove(); + if (e.getTicksLived() > moblivetime) { + ClearLag.scheduler().runAtEntity(e, task -> e.remove()); + } } else if (itemtimer && e instanceof Item) { - if (e.getTicksLived() > itemlivetime) e.remove(); + if (e.getTicksLived() > itemlivetime) { + ClearLag.scheduler().runAtEntity(e, task -> e.remove()); + } } else if (arrowtimer && e instanceof Arrow) { - if (e.getTicksLived() > arrowkilltime) e.remove(); + if (e.getTicksLived() > arrowkilltime) { + ClearLag.scheduler().runAtEntity(e, task -> e.remove()); + } } } } @@ -51,5 +58,4 @@ public void run() { public int getInterval() { return configHandler.getConfig().getInt("live-time.interval") * 20; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LogPurger.java b/common/src/main/java/me/minebuilders/clearlag/tasks/LogPurger.java similarity index 86% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LogPurger.java rename to common/src/main/java/me/minebuilders/clearlag/tasks/LogPurger.java index f305e73..5236bfb 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/LogPurger.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/LogPurger.java @@ -1,6 +1,7 @@ package me.minebuilders.clearlag.tasks; -import me.minebuilders.clearlag.Clearlag; +import com.tcoded.folialib.wrapper.task.WrappedTask; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigPath; @@ -32,7 +33,6 @@ public void run() { int deleted = 0; if (files != null) { - for (File file : files) { if (file.isFile() && file.getName().endsWith(".log.gz") && time > Util.parseTime(file.getName().replace(".log.gz", "")).getTime()) { file.delete(); @@ -45,8 +45,7 @@ public void run() { } @Override - public int startTask() { - return Bukkit.getScheduler().runTaskLaterAsynchronously(Clearlag.getInstance(), this, 0L).getTaskId(); + protected WrappedTask startTask() { + return ClearLag.scheduler().runLaterAsync(this, 1L); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/RAMCheckTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/RAMCheckTask.java similarity index 82% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/RAMCheckTask.java rename to common/src/main/java/me/minebuilders/clearlag/tasks/RAMCheckTask.java index 0843e5a..f76dcfa 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/RAMCheckTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/RAMCheckTask.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.tasks; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.RAMUtil; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.annotations.AutoWire; @@ -24,11 +25,11 @@ public class RAMCheckTask extends TaskModule { private ConfigHandler configHandler; public void run() { - if (RAMUtil.getUsedMemory() > ramLimit) { try { - for (String s : commands) - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s); + for (String s : commands) { + ClearLag.scheduler().runNextTick(task -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s)); + } } catch (Exception e) { Util.warning("RAMCheckTask was unable to dispatch commands!"); } @@ -39,5 +40,4 @@ public void run() { public int getInterval() { return configHandler.getConfig().getInt("ram-meter.interval") * 20; } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/TPSCheckTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/TPSCheckTask.java similarity index 75% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/TPSCheckTask.java rename to common/src/main/java/me/minebuilders/clearlag/tasks/TPSCheckTask.java index d522f85..ac965f9 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/TPSCheckTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/TPSCheckTask.java @@ -1,6 +1,7 @@ package me.minebuilders.clearlag.tasks; -import me.minebuilders.clearlag.Clearlag; +import com.tcoded.folialib.wrapper.task.WrappedTask; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigPath; @@ -48,13 +49,14 @@ public void run() { double tps = tpsTask.getTPS(); if (tps <= tpsTrigger && isRecovered) { - - if (broadcastEnabled) + if (broadcastEnabled) { Bukkit.broadcastMessage(triggerBroadcastMessage); + } try { - for (String s : commands) - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s); + for (String s : commands) { + ClearLag.scheduler().runNextTick(task -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s)); + } } catch (Exception e) { Util.warning("TPSCheckTask was unable to dispatch commands!"); } finally { @@ -62,12 +64,13 @@ public void run() { } } else if (tps >= tpsRecover && !isRecovered) { try { - - if (broadcastEnabled) + if (broadcastEnabled) { Bukkit.broadcastMessage(recoverBroadcastMessage); + } - for (String s : recoverCommands) - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s); + for (String s : recoverCommands) { + ClearLag.scheduler().runNextTick(task -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s)); + } } catch (Exception e) { Util.warning("TPSCheckTask was unable to dispatch commands!"); } finally { @@ -82,8 +85,7 @@ public int getInterval() { } @Override - protected int startTask() { - return Bukkit.getScheduler().scheduleSyncRepeatingTask(Clearlag.getInstance(), this, 420, getInterval()); + protected WrappedTask startTask() { + return ClearLag.scheduler().runTimer(this, 420L, getInterval()); } - } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/TPSTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/TPSTask.java similarity index 93% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/TPSTask.java rename to common/src/main/java/me/minebuilders/clearlag/tasks/TPSTask.java index c3576ce..85f0c1f 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/TPSTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/TPSTask.java @@ -1,6 +1,7 @@ package me.minebuilders.clearlag.tasks; -import me.minebuilders.clearlag.Clearlag; +import com.tcoded.folialib.wrapper.task.WrappedTask; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigPath; @@ -35,29 +36,21 @@ public void setEnabled() { } @Override - protected int startTask() { - + protected WrappedTask startTask() { elapsedTicks = 0; - if (configHandler.getConfig().getBoolean("settings.use-internal-tps")) { - try { - tpsCalculator = new InternalTPSYoinker(); - } catch (Exception e) { - Util.warning("Clearlag failed to use the internal TPS tracker during initialization. Reverted to estimation... (" + e.getMessage() + ")"); tpsCalculator = new EstimatedTPSCalculator(); } - } else { tpsCalculator = new EstimatedTPSCalculator(); } - - return Bukkit.getScheduler().scheduleSyncRepeatingTask(Clearlag.getInstance(), this, 120L, getInterval()); + return ClearLag.scheduler().runTimer(this, 120L, getInterval()); } public double getTPS() { @@ -85,21 +78,13 @@ public ChatColor getColor() { @Override public void run() { - tpsCalculator.tick(); - if (elapsedTicks % 20 == 0) { - double tps = tpsCalculator.calculateCurrentAverageTPS(); - if (tps > 0 && tps <= 21.0) { - tpsHistory[index++] = tps; - if (index >= tpsHistory.length) { - index = 0; - Bukkit.getPluginManager().callEvent(new TPSUpdateEvent(getTPS())); } } @@ -112,11 +97,8 @@ public int getInterval() { } private interface TPSCalculator { - double calculateCurrentAverageTPS(); - void tick(); - } private class EstimatedTPSCalculator implements TPSCalculator { @@ -133,27 +115,22 @@ public EstimatedTPSCalculator() { @Override public void tick() { - final long currentTime = System.currentTimeMillis(); - if (lasTimestamp != -1) { - int elaspedTime = (int) (currentTime - lasTimestamp); - - if (elaspedTime == 49 || elaspedTime == 51) + if (elaspedTime == 49 || elaspedTime == 51) { elaspedTime = 50; + } tickLengths[elapsedTicks % 20] = elaspedTime; } lasTimestamp = currentTime; - if (++elapsedTicks % 20 == 0) { - double tickSum = 0.0; - - for (int tickLength : tickLengths) + for (int tickLength : tickLengths) { tickSum += tickLength; + } final double tickLength = (tickSum / 20.0); @@ -176,7 +153,6 @@ private class InternalTPSYoinker implements TPSCalculator { private double tps = 20.0; public InternalTPSYoinker() throws Exception { - Class minecraftServerClazz = Class.forName("net.minecraft.server." + Util.getRawBukkitVersion() + ".MinecraftServer"); minecraftServerInstance = minecraftServerClazz.getDeclaredMethod("getServer").invoke(null); @@ -184,17 +160,14 @@ public InternalTPSYoinker() throws Exception { recentTpsField = minecraftServerClazz.getDeclaredField("recentTps"); recentTpsField.setAccessible(true); - } @Override public void tick() { - if (++elapsedTicks % 60 == 0) { try { tps = ((double[]) recentTpsField.get(minecraftServerInstance))[0]; } catch (IllegalAccessException e) { - Util.warning("Clearlag failed to use the internal TPS tracker during runtime. Reverted to estimation... (" + e.getMessage() + ")"); tpsCalculator = new EstimatedTPSCalculator(); diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/WarnTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/WarnTask.java similarity index 91% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/WarnTask.java rename to common/src/main/java/me/minebuilders/clearlag/tasks/WarnTask.java index edf5413..3917a76 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/tasks/WarnTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/WarnTask.java @@ -1,6 +1,6 @@ package me.minebuilders.clearlag.tasks; -import me.minebuilders.clearlag.Clearlag; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.modules.EventModule; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -21,7 +21,7 @@ public void onJoin(PlayerJoinEvent e) { if (p.hasPermission("lagg.clear")) { p.sendMessage("§8§l]=============(§7§lClearlag Updated§8§l)=============["); - p.sendMessage("§6§lNew Version: §7§l" + Clearlag.getInstance().getDescription().getVersion()); + p.sendMessage("§6§lNew Version: §7§l" + ClearLag.getInstance().getDescription().getVersion()); p.sendMessage("§6Please check §7§nhttp://dev.bukkit.org/bukkit-plugins/clearlagg/"); if (resetConfig) { @@ -31,4 +31,4 @@ public void onJoin(PlayerJoinEvent e) { } } } -} \ No newline at end of file +} diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/CleanerHandler.java b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/CleanerHandler.java similarity index 79% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/CleanerHandler.java rename to common/src/main/java/me/minebuilders/clearlag/triggeredremoval/CleanerHandler.java index 97a7d58..7abd888 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/CleanerHandler.java +++ b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/CleanerHandler.java @@ -21,16 +21,17 @@ public void removeCleanerJob(ClearlagModule module) { } public void startJobs() { - - for (ClearlagModule job : cleanerJobs) + for (ClearlagModule job : cleanerJobs) { job.setEnabled(); + } } public boolean areJobsComplete() { - - for (ClearlagModule job : cleanerJobs) - if (job.isEnabled()) + for (ClearlagModule job : cleanerJobs) { + if (job.isEnabled()) { return false; + } + } return true; } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/TriggerManager.java b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/TriggerManager.java similarity index 84% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/TriggerManager.java rename to common/src/main/java/me/minebuilders/clearlag/triggeredremoval/TriggerManager.java index 792917d..0a6d274 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/TriggerManager.java +++ b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/TriggerManager.java @@ -1,6 +1,7 @@ package me.minebuilders.clearlag.triggeredremoval; -import me.minebuilders.clearlag.Clearlag; +import com.tcoded.folialib.wrapper.task.WrappedTask; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigPath; @@ -13,8 +14,6 @@ import me.minebuilders.clearlag.triggeredremoval.triggers.EntityLimitTrigger; import me.minebuilders.clearlag.triggeredremoval.triggers.TPSTrigger; import org.bukkit.configuration.Configuration; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; import java.util.HashMap; import java.util.Map; @@ -30,13 +29,11 @@ public class TriggerManager extends ClearlagModule { @AutoWire private ConfigHandler configHandler; - private final Map tirggerTaskMap = new HashMap<>(2); + private final Map triggerTaskMap = new HashMap<>(2); @Override public void setEnabled() { - final Configuration config = configHandler.getConfig(); - if (config.getConfigurationSection("custom-trigger-removal.triggers") == null) { enabled = false; @@ -48,22 +45,17 @@ public void setEnabled() { super.setEnabled(); for (String triggerKey : config.getConfigurationSection("custom-trigger-removal.triggers").getKeys(false)) { - final CleanerTrigger trigger; - CleanerHandler cleanerHandler = new CleanerHandler(); - final String cleanerType = config.getString("custom-trigger-removal.triggers." + triggerKey + ".trigger-type"); - if (cleanerType != null) { - if (cleanerType.equalsIgnoreCase("tps-trigger")) { trigger = new TPSTrigger(cleanerHandler); } else if (cleanerType.equalsIgnoreCase("entity-limit-trigger")) { trigger = new EntityLimitTrigger(cleanerHandler); - } else + } else { trigger = null; - + } } else { Util.warning("You must specify a trigger-type for trigger " + triggerKey); continue; @@ -73,10 +65,9 @@ public void setEnabled() { Util.warning("Unknown trigger specified: " + triggerKey); Util.warning("Trigger " + triggerKey + " will be ignored!"); } else { - try { configHandler.setObjectConfigValues(trigger, "custom-trigger-removal.triggers." + triggerKey); - Clearlag.getInstance().getAutoWirer().wireObject(trigger); + ClearLag.getInstance().getAutoWirer().wireObject(trigger); } catch (Exception e) { Util.warning("Failed to set config variables for trigger '" + triggerKey + "'"); e.printStackTrace(); @@ -84,9 +75,7 @@ public void setEnabled() { } for (String cleanerKey : config.getConfigurationSection("custom-trigger-removal.triggers." + triggerKey + ".jobs").getKeys(false)) { - ClearlagModule module = null; - if (cleanerKey.equalsIgnoreCase("entity-clearer")) { module = new EntityCleanerJob(); } else if (cleanerKey.equalsIgnoreCase("command-executor")) { @@ -97,10 +86,9 @@ public void setEnabled() { Util.warning("Unknown job specified: " + cleanerKey); Util.warning("Job " + cleanerKey + " will be ignored!"); } else { - try { configHandler.setObjectConfigValues(module, "custom-trigger-removal.triggers." + triggerKey + ".jobs." + cleanerKey); - Clearlag.getInstance().getAutoWirer().wireObject(module); + ClearLag.getInstance().getAutoWirer().wireObject(module); } catch (Exception e) { Util.warning("Failed to set config variables for job '" + cleanerKey + "', and trigger " + triggerKey); e.printStackTrace(); @@ -109,10 +97,9 @@ public void setEnabled() { if (config.get("custom-trigger-removal.triggers." + triggerKey + ".jobs." + cleanerKey + ".warnings") != null) { module = new WarningJob(module); - try { configHandler.setObjectConfigValues(module, "custom-trigger-removal.triggers." + triggerKey + ".jobs." + cleanerKey); - Clearlag.getInstance().getAutoWirer().wireObject(module); + ClearLag.getInstance().getAutoWirer().wireObject(module); } catch (Exception e) { Util.warning("Failed to set config variables for warnings on job '" + cleanerKey + "', and trigger " + triggerKey); e.printStackTrace(); @@ -124,16 +111,8 @@ public void setEnabled() { } } - final BukkitTask runnableTask = new BukkitRunnable() { - - @Override - public void run() { - trigger.runTrigger(); - } - - }.runTaskTimer(Clearlag.getInstance(), trigger.getCheckFrequency(), trigger.getCheckFrequency()); - - tirggerTaskMap.put(trigger, runnableTask); + final WrappedTask runnableTask = ClearLag.scheduler().runTimer(trigger::runTrigger, trigger.getCheckFrequency(), trigger.getCheckFrequency()); + triggerTaskMap.put(trigger, runnableTask); } } } @@ -142,9 +121,10 @@ public void run() { public void setDisabled() { super.setDisabled(); - for (BukkitTask task : tirggerTaskMap.values()) - task.cancel(); + for (WrappedTask task : triggerTaskMap.values()) { + ClearLag.scheduler().cancelTask(task); + } - tirggerTaskMap.clear(); + triggerTaskMap.clear(); } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/CommandExecuteJob.java b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/CommandExecuteJob.java similarity index 76% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/CommandExecuteJob.java rename to common/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/CommandExecuteJob.java index fee1dbe..43a6c86 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/CommandExecuteJob.java +++ b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/CommandExecuteJob.java @@ -1,5 +1,6 @@ package me.minebuilders.clearlag.triggeredremoval.cleanermodules; +import me.minebuilders.clearlag.ClearLag; import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.annotations.ConfigValue; import me.minebuilders.clearlag.modules.ClearlagModule; @@ -30,8 +31,9 @@ public void setEnabled() { super.setEnabled(); try { - for (String s : commands) - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s); + for (String s : commands) { + ClearLag.scheduler().runNextTick(task -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s)); + } } catch (Exception e) { Util.warning("CommandExecuteJob was unable to dispatch commands!"); } @@ -42,8 +44,9 @@ public void setDisabled() { super.setDisabled(); try { - for (String s : recoverCommands) - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s); + for (String s : recoverCommands) { + ClearLag.scheduler().runNextTick(task -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s)); + } } catch (Exception e) { Util.warning("CommandExecuteJob was unable to dispatch commands!"); } @@ -52,8 +55,9 @@ public void setDisabled() { @Override public boolean isEnabled() { - if (super.isEnabled() && !cleanerTrigger.shouldTrigger()) + if (super.isEnabled() && !cleanerTrigger.shouldTrigger()) { setDisabled(); + } return super.isEnabled(); } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/EntityCleanerJob.java b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/EntityCleanerJob.java similarity index 100% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/EntityCleanerJob.java rename to common/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/EntityCleanerJob.java diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/WarningJob.java b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/WarningJob.java similarity index 93% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/WarningJob.java rename to common/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/WarningJob.java index 8934eb6..a3d80fe 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/WarningJob.java +++ b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/cleanermodules/WarningJob.java @@ -50,17 +50,14 @@ public void setEnabled() { public void run() { final String[] broadcastWarning = warnings.get(++timer); - if (broadcastWarning != null) { - - for (String message : broadcastWarning) + for (String message : broadcastWarning) { broadcastHandler.broadcast(message.replace("+remaining", "" + (executeJobTime - timer))); + } } if (timer >= executeJobTime) { - super.setDisabled(); - wrappedJob.setEnabled(); } } @@ -72,10 +69,10 @@ public boolean isEnabled() { @Override public void setDisabled() { - - if (super.isEnabled()) + if (super.isEnabled()) { super.setDisabled(); - else + } else { wrappedJob.setDisabled(); + } } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/CleanerTrigger.java b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/CleanerTrigger.java similarity index 99% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/CleanerTrigger.java rename to common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/CleanerTrigger.java index 975ed5c..2806d59 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/CleanerTrigger.java +++ b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/CleanerTrigger.java @@ -23,14 +23,10 @@ public CleanerTrigger(CleanerHandler cleanerHandler) { public boolean runTrigger() { if (!triggered) { - if (shouldTrigger()) { - triggered = true; - cleanerHandler.startJobs(); } - } else if (isRecovered()) { triggered = false; } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/EntityLimitTrigger.java b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/EntityLimitTrigger.java similarity index 82% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/EntityLimitTrigger.java rename to common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/EntityLimitTrigger.java index 28d39c5..781a298 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/EntityLimitTrigger.java +++ b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/EntityLimitTrigger.java @@ -9,6 +9,7 @@ import org.bukkit.entity.Entity; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; /** * @author bob7l @@ -39,22 +40,17 @@ public boolean isRecovered() { } private int countEntities() { - - int entities = 0; - + AtomicInteger entities = new AtomicInteger(0); for (World world : Bukkit.getWorlds()) { - if (!worldFilter.contains(world.getName())) { - for (Entity entity : world.getEntities()) { - - if (entityLimits.containsEntity(entity)) - ++entities; - + if (entityLimits.containsEntity(entity)) { + entities.incrementAndGet(); + } } } } - return entities; + return entities.get(); } } diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/TPSTrigger.java b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/TPSTrigger.java similarity index 100% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/TPSTrigger.java rename to common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/TPSTrigger.java diff --git a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/Trigger.java b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/Trigger.java similarity index 98% rename from Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/Trigger.java rename to common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/Trigger.java index 4d9e5c8..21900bc 100644 --- a/Clearlag Core/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/Trigger.java +++ b/common/src/main/java/me/minebuilders/clearlag/triggeredremoval/triggers/Trigger.java @@ -4,9 +4,6 @@ * @author bob7l */ public interface Trigger { - boolean runTrigger(); - int getCheckFrequency(); - } diff --git a/Clearlag Core/src/main/resources/changelog.txt b/common/src/main/resources/changelog.txt similarity index 100% rename from Clearlag Core/src/main/resources/changelog.txt rename to common/src/main/resources/changelog.txt diff --git a/Clearlag Core/src/main/resources/config.yml b/common/src/main/resources/config.yml similarity index 100% rename from Clearlag Core/src/main/resources/config.yml rename to common/src/main/resources/config.yml diff --git a/Clearlag Core/src/main/resources/languages/BrazilianPortuguese.lang b/common/src/main/resources/languages/BrazilianPortuguese.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/BrazilianPortuguese.lang rename to common/src/main/resources/languages/BrazilianPortuguese.lang diff --git a/Clearlag Core/src/main/resources/languages/ChineseSimplified.lang b/common/src/main/resources/languages/ChineseSimplified.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/ChineseSimplified.lang rename to common/src/main/resources/languages/ChineseSimplified.lang diff --git a/Clearlag Core/src/main/resources/languages/ChineseTraditional.lang b/common/src/main/resources/languages/ChineseTraditional.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/ChineseTraditional.lang rename to common/src/main/resources/languages/ChineseTraditional.lang diff --git a/Clearlag Core/src/main/resources/languages/Czech.lang b/common/src/main/resources/languages/Czech.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/Czech.lang rename to common/src/main/resources/languages/Czech.lang diff --git a/Clearlag Core/src/main/resources/languages/English.lang b/common/src/main/resources/languages/English.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/English.lang rename to common/src/main/resources/languages/English.lang diff --git a/Clearlag Core/src/main/resources/languages/French.lang b/common/src/main/resources/languages/French.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/French.lang rename to common/src/main/resources/languages/French.lang diff --git a/Clearlag Core/src/main/resources/languages/German.lang b/common/src/main/resources/languages/German.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/German.lang rename to common/src/main/resources/languages/German.lang diff --git a/Clearlag Core/src/main/resources/languages/Japanese.lang b/common/src/main/resources/languages/Japanese.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/Japanese.lang rename to common/src/main/resources/languages/Japanese.lang diff --git a/Clearlag Core/src/main/resources/languages/Korean.lang b/common/src/main/resources/languages/Korean.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/Korean.lang rename to common/src/main/resources/languages/Korean.lang diff --git a/Clearlag Core/src/main/resources/languages/Polish.lang b/common/src/main/resources/languages/Polish.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/Polish.lang rename to common/src/main/resources/languages/Polish.lang diff --git a/Clearlag Core/src/main/resources/languages/Russian.lang b/common/src/main/resources/languages/Russian.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/Russian.lang rename to common/src/main/resources/languages/Russian.lang diff --git a/Clearlag Core/src/main/resources/languages/Spanish.lang b/common/src/main/resources/languages/Spanish.lang similarity index 100% rename from Clearlag Core/src/main/resources/languages/Spanish.lang rename to common/src/main/resources/languages/Spanish.lang diff --git a/Clearlag Core/src/main/resources/plugin.yml b/common/src/main/resources/plugin.yml similarity index 84% rename from Clearlag Core/src/main/resources/plugin.yml rename to common/src/main/resources/plugin.yml index 0b3d2b5..c9923d7 100644 --- a/Clearlag Core/src/main/resources/plugin.yml +++ b/common/src/main/resources/plugin.yml @@ -1,9 +1,10 @@ name: ClearLag author: bob7l -description: Clear your lagg! -main: me.minebuilders.clearlag.Clearlag -version: 3.2.2 +description: Clear your lag! +main: me.minebuilders.clearlag.ClearLag +version: ${version} api-version: 1.13 +folia-supported: true commands: lagg: description: Clearlag base command! @@ -33,4 +34,4 @@ permissions: lagg.memory: description: Permission to checm memory lagg.performance: - description: Permission to run performance \ No newline at end of file + description: Permission to run performance diff --git a/pom.xml b/pom.xml index 7586a5f..301e8da 100644 --- a/pom.xml +++ b/pom.xml @@ -10,17 +10,13 @@ pom - Clearlag Core - Clearlag Legacy - savedeathdrops + common - ${project.name} ${basedir}/src/main/java clean install - . @@ -30,30 +26,26 @@ *.yml - - org.apache.maven.plugins maven-compiler-plugin - 2.3.2 + 3.14.1 - 1.8 - 1.8 + 21 + 21 - org.apache.maven.plugins maven-jar-plugin - 2.3.1 + 3.4.2 - org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.6.1 @@ -65,8 +57,6 @@ - - \ No newline at end of file From 2e2aef320d58cb69e0c91390190bad726b385054 Mon Sep 17 00:00:00 2001 From: bytez Date: Mon, 25 May 2026 19:53:58 +0200 Subject: [PATCH 2/5] Update README with language files information Added information about language files and their editing process. --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e76bacf..1076f51 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ - -Clearlag's an extremely old plugin that has somehow survived since 2011. Much of the code is probably outdated or inefficient due to API/internal changes of Spigot from other the years. +Clearlag's an extremely old plugin that has somehow survived since 2011. Much of the code is probably outdated or inefficient due to API/internal changes of Spigot from other the years. **Modules** - Clearlag Legacy: For Spigot/Bukkit builds before 1.8 - Clearlag Core: For 1.8+ + +**Extras** +- Language files are extracted to `plugins/ClearLag/languages/` on first run, so they can be edited directly via the server panel. Changes take effect on `/lagg reload` without a restart. From 8632c37585901a58287de9a00eeea9351d1d0eb7 Mon Sep 17 00:00:00 2001 From: bytezlol Date: Fri, 12 Jun 2026 19:39:13 +0200 Subject: [PATCH 3/5] feat: add actionbar support for auto-removal warnings & broadcasts --- README.md | 6 ++- .../adapters/LatestVersionAdapter.java | 13 ++++- .../adapters/LegacyVersionAdapter.java | 39 +++++++++++++- .../clearlag/adapters/VersionAdapter.java | 5 +- .../clearlag/tasks/ClearTask.java | 51 ++++++++++++++++--- common/src/main/resources/config.yml | 1 + 6 files changed, 104 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e76bacf..a9977c9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ - -Clearlag's an extremely old plugin that has somehow survived since 2011. Much of the code is probably outdated or inefficient due to API/internal changes of Spigot from other the years. +Clearlag's an extremely old plugin that has somehow survived since 2011. Much of the code is probably outdated or inefficient due to API/internal changes of Spigot from other the years. **Modules** - Clearlag Legacy: For Spigot/Bukkit builds before 1.8 - Clearlag Core: For 1.8+ + +**Extras** +- Language files are extracted to `plugins/ClearLag/languages/` on first run, so they can be edited directly via the server panel. Changes take effect on `/lagg reload` without a restart. \ No newline at end of file diff --git a/common/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java b/common/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java index e5d1f22..51e7e2a 100644 --- a/common/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java +++ b/common/src/main/java/me/minebuilders/clearlag/adapters/LatestVersionAdapter.java @@ -1,8 +1,11 @@ package me.minebuilders.clearlag.adapters; import me.minebuilders.clearlag.reflection.ReflectionUtil; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Material; import org.bukkit.entity.Item; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.MapMeta; import org.bukkit.map.MapView; @@ -51,4 +54,12 @@ public boolean isMapItemStackEqual(ItemStack itemStack, ItemStack itemStack2) { public void setItemEntityAge(Item item, int ticks) { item.setTicksLived(ticks); } -} + + @Override + public void sendActionBar(Player player, String message) { + player.spigot().sendMessage( + ChatMessageType.ACTION_BAR, + TextComponent.fromLegacyText(message) + ); + } +} \ No newline at end of file diff --git a/common/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java b/common/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java index 541ccc9..61c8644 100644 --- a/common/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java +++ b/common/src/main/java/me/minebuilders/clearlag/adapters/LegacyVersionAdapter.java @@ -2,8 +2,11 @@ import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.reflection.ReflectionUtil; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Material; import org.bukkit.entity.Item; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.map.MapView; @@ -60,4 +63,38 @@ public void setItemEntityAge(Item item, int age) { e.printStackTrace(); } } -} + + @Override + public void sendActionBar(Player player, String message) { + try { + player.spigot().sendMessage( + ChatMessageType.ACTION_BAR, + TextComponent.fromLegacyText(message) + ); + return; + } catch (Throwable ignored) { + } + + try { + final String ver = Util.getRawBukkitVersion(); + final Class chatBaseComponent = ReflectionUtil.getClass("net.minecraft.server." + ver, "IChatBaseComponent"); + final Class packetClass = ReflectionUtil.getClass("net.minecraft.server." + ver, "PacketPlayOutChat"); + final Class chatSerializer = chatBaseComponent.getDeclaredClasses()[0]; + + final String json = "{\"text\":\"" + message.replace("\\", "\\\\").replace("\"", "\\\"") + "\"}"; + final Object component = chatSerializer.getMethod("a", String.class).invoke(null, json); + + final Object packet = packetClass + .getConstructor(chatBaseComponent, byte.class) + .newInstance(component, (byte) 2); + + final Object handle = player.getClass().getMethod("getHandle").invoke(player); + final Object connection = handle.getClass().getField("playerConnection").get(handle); + connection.getClass() + .getMethod("sendPacket", ReflectionUtil.getClass("net.minecraft.server." + ver, "Packet")) + .invoke(connection, packet); + } catch (Throwable e) { + player.sendMessage(message); + } + } +} \ No newline at end of file diff --git a/common/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java b/common/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java index 7290af0..a77a662 100644 --- a/common/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java +++ b/common/src/main/java/me/minebuilders/clearlag/adapters/VersionAdapter.java @@ -1,6 +1,7 @@ package me.minebuilders.clearlag.adapters; import org.bukkit.entity.Item; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.map.MapView; @@ -16,4 +17,6 @@ public interface VersionAdapter { boolean isMapItemStackEqual(ItemStack itemStack, ItemStack itemStack2); void setItemEntityAge(Item item, int ticks); -} + + void sendActionBar(Player player, String message); +} \ No newline at end of file diff --git a/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java index 00a7b88..ac434ac 100644 --- a/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java @@ -1,6 +1,7 @@ package me.minebuilders.clearlag.tasks; import me.minebuilders.clearlag.Util; +import me.minebuilders.clearlag.adapters.VersionAdapter; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.annotations.ConfigModule; import me.minebuilders.clearlag.annotations.ConfigPath; @@ -14,6 +15,7 @@ import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.HashMap; @@ -39,6 +41,12 @@ public class ClearTask extends TaskModule { @ConfigValue(valueType = ConfigValueType.PRIMITIVE) private boolean broadcastRemoval; + @ConfigValue(valueType = ConfigValueType.PRIMITIVE) + private boolean actionbar; + + @AutoWire + private VersionAdapter versionAdapter; + @AutoWire private EntityManager entityManager; @@ -49,17 +57,24 @@ public class ClearTask extends TaskModule { public void run() { - final String[] broadcastWarning = warnings != null ? warnings.get(++interval) : null; + ++interval; + + final String[] broadcastWarning = warnings != null ? warnings.get(interval) : null; if (broadcastWarning != null) { - broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastWarning, "+remaining", "" + (autoremovalInterval - interval))); + final String[] formatted = Util.cloneAndReplaceStringArr(broadcastWarning, "+remaining", "" + (autoremovalInterval - interval)); + broadcastHandler.broadcast(formatted); + + if (actionbar) { + sendActionBar(formatted); + } } if (interval >= autoremovalInterval) { final List worlds = Bukkit.getWorlds(); if (worlds.isEmpty()) { if (broadcastRemoval) { - broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastMessage, "+RemoveAmount", "0")); + broadcastRemovalMessage(0); } interval = 0; @@ -75,7 +90,7 @@ public void run() { if (snapshot.length == 0) { if (totalPendingWorlds.decrementAndGet() == 0) { if (broadcastRemoval) { - broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastMessage, "+RemoveAmount", String.valueOf(totalRemoved.get()))); + broadcastRemovalMessage(totalRemoved.get()); } } continue; @@ -97,7 +112,7 @@ public void run() { if (totalPendingWorlds.decrementAndGet() == 0) { if (broadcastRemoval) { - broadcastHandler.broadcast(Util.cloneAndReplaceStringArr(broadcastMessage, "+RemoveAmount", String.valueOf(totalRemoved.get()))); + broadcastRemovalMessage(totalRemoved.get()); } } } @@ -109,4 +124,28 @@ public void run() { interval = 0; } } -} + + private void broadcastRemovalMessage(int removedAmount) { + final String[] formatted = Util.cloneAndReplaceStringArr(broadcastMessage, "+RemoveAmount", String.valueOf(removedAmount)); + broadcastHandler.broadcast(formatted); + + if (actionbar) { + sendActionBar(formatted); + } + } + + private void sendActionBar(String[] lines) { + if (versionAdapter == null) { + return; + } + + for (String line : lines) { + final String colored = Util.color(line); + Util.postToMainThread(() -> { + for (Player p : Bukkit.getOnlinePlayers()) { + versionAdapter.sendActionBar(p, colored); + } + }); + } + } +} \ No newline at end of file diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index 10f1f35..9af4dc3 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -355,6 +355,7 @@ item-merger: # -- 'remove-entities' What entities SHOULD be removed during removal auto-removal: enabled: true + actionbar: true broadcast-message: '&6[ClearLag] &aRemoved +RemoveAmount Entities!' broadcast-removal: true autoremoval-interval: 460 From 6930cbc06f7f288d05a6cb3ea57171431d19dc31 Mon Sep 17 00:00:00 2001 From: bytezlol Date: Fri, 12 Jun 2026 22:49:17 +0200 Subject: [PATCH 4/5] feat: add actionbar support for auto-removal warnings & broadcasts --- .../config/configvalues/WarnMapCV.java | 50 +++++++++++++++---- .../clearlag/config/configvalues/Warning.java | 26 ++++++++++ .../clearlag/tasks/ClearTask.java | 32 ++++++++++-- 3 files changed, 95 insertions(+), 13 deletions(-) create mode 100644 common/src/main/java/me/minebuilders/clearlag/config/configvalues/Warning.java diff --git a/common/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java index 0be8a51..01218ad 100644 --- a/common/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/WarnMapCV.java @@ -3,27 +3,59 @@ import me.minebuilders.clearlag.Util; import me.minebuilders.clearlag.annotations.AutoWire; import me.minebuilders.clearlag.config.ConfigHandler; +import org.bukkit.Sound; import java.util.HashMap; /** * Created by TCP on 2/3/2016. */ -public class WarnMapCV implements ConfigData> { +public class WarnMapCV implements ConfigData> { @AutoWire private ConfigHandler configHandler; @Override - public HashMap getValue(String path) { - final HashMap warns = new HashMap<>(); + public HashMap getValue(String path) { + final HashMap warns = new HashMap<>(); + for (String line : configHandler.getConfig().getStringList(path)) { try { - final String[] bits = line.split(" ", 2); - final int time = Integer.parseInt(bits[0].replace("time:", "")); - final String[] msg = Util.color(bits[1].replace("msg:", "")).split("/n"); + int time = -1; + String msg = null; + Sound sound = null; + + final int msgIndex = line.indexOf("msg:"); + if (msgIndex == -1) { + Util.warning("Config Read Error at line " + path + ":"); + Util.warning("Missing 'msg:' in " + line); + continue; + } + + msg = line.substring(msgIndex + "msg:".length()); + + final String prefix = line.substring(0, msgIndex).trim(); + for (String token : prefix.split(" ")) { + if (token.isEmpty()) { + continue; + } + + if (token.startsWith("time:")) { + time = Integer.parseInt(token.replace("time:", "")); + } else if (token.startsWith("sound:")) { + final String soundName = token.replace("sound:", ""); + try { + sound = Sound.valueOf(soundName.toUpperCase()); + } catch (IllegalArgumentException ex) { + Util.warning("Invalid sound '" + soundName + "' at line " + path + " in: " + line); + Util.warning("Use a valid Sound enum name for your server version."); + } + } + } + if (time > 0) { - warns.put(time, msg); + final String[] messages = Util.color(msg).split("/n"); + warns.put(time, new Warning(messages, sound)); } else { Util.warning("Config Error at line " + path + ":"); Util.warning(line + " is an invalid warning!"); @@ -32,11 +64,11 @@ public HashMap getValue(String path) { Util.warning("Config Read Error at line " + path + ":"); if (e instanceof NumberFormatException) { Util.warning("Failed to read 'time:' variable in " + line); - Util.warning("Insure you have a NUMBER after 'time:' specified"); + Util.warning("Ensure you have a NUMBER after 'time:' specified"); } } } return warns; } -} +} \ No newline at end of file diff --git a/common/src/main/java/me/minebuilders/clearlag/config/configvalues/Warning.java b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/Warning.java new file mode 100644 index 0000000..8d05025 --- /dev/null +++ b/common/src/main/java/me/minebuilders/clearlag/config/configvalues/Warning.java @@ -0,0 +1,26 @@ +package me.minebuilders.clearlag.config.configvalues; + +import org.bukkit.Sound; + +public class Warning { + + private final String[] messages; + private final Sound sound; + + public Warning(String[] messages, Sound sound) { + this.messages = messages; + this.sound = sound; + } + + public String[] getMessages() { + return messages; + } + + public Sound getSound() { + return sound; + } + + public boolean hasSound() { + return sound != null; + } +} \ No newline at end of file diff --git a/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java b/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java index ac434ac..5b75e0a 100644 --- a/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java +++ b/common/src/main/java/me/minebuilders/clearlag/tasks/ClearTask.java @@ -7,6 +7,7 @@ import me.minebuilders.clearlag.annotations.ConfigPath; import me.minebuilders.clearlag.annotations.ConfigValue; import me.minebuilders.clearlag.config.ConfigValueType; +import me.minebuilders.clearlag.config.configvalues.Warning; import me.minebuilders.clearlag.managers.EntityManager; import me.minebuilders.clearlag.modules.BroadcastHandler; import me.minebuilders.clearlag.modules.TaskModule; @@ -36,11 +37,14 @@ public class ClearTask extends TaskModule { private String[] broadcastMessage; @ConfigValue(valueType = ConfigValueType.WARN_ARRAY) - private HashMap warnings; + private HashMap warnings; @ConfigValue(valueType = ConfigValueType.PRIMITIVE) private boolean broadcastRemoval; + @ConfigValue(valueType = ConfigValueType.PRIMITIVE) + private String broadcastSound; + @ConfigValue(valueType = ConfigValueType.PRIMITIVE) private boolean actionbar; @@ -59,15 +63,19 @@ public void run() { ++interval; - final String[] broadcastWarning = warnings != null ? warnings.get(interval) : null; + final Warning warning = warnings != null ? warnings.get(interval) : null; - if (broadcastWarning != null) { - final String[] formatted = Util.cloneAndReplaceStringArr(broadcastWarning, "+remaining", "" + (autoremovalInterval - interval)); + if (warning != null) { + final String[] formatted = Util.cloneAndReplaceStringArr(warning.getMessages(), "+remaining", "" + (autoremovalInterval - interval)); broadcastHandler.broadcast(formatted); if (actionbar) { sendActionBar(formatted); } + + if (warning.hasSound()) { + playSound(warning.getSound()); + } } if (interval >= autoremovalInterval) { @@ -132,6 +140,14 @@ private void broadcastRemovalMessage(int removedAmount) { if (actionbar) { sendActionBar(formatted); } + + if (broadcastSound != null && !broadcastSound.isEmpty()) { + try { + playSound(org.bukkit.Sound.valueOf(broadcastSound.toUpperCase())); + } catch (IllegalArgumentException ex) { + Util.warning("Invalid broadcast-sound '" + broadcastSound + "' - use a valid Sound name for your version."); + } + } } private void sendActionBar(String[] lines) { @@ -148,4 +164,12 @@ private void sendActionBar(String[] lines) { }); } } + + private void playSound(org.bukkit.Sound sound) { + Util.postToMainThread(() -> { + for (Player p : Bukkit.getOnlinePlayers()) { + p.playSound(p.getLocation(), sound, 1.0f, 1.0f); + } + }); + } } \ No newline at end of file From 9d51f3aea75b97b846bc04274b446a06720ee950 Mon Sep 17 00:00:00 2001 From: bytezlol Date: Sat, 13 Jun 2026 11:37:44 +0200 Subject: [PATCH 5/5] feat: add tab completion for /lagg subcommands and alias /clearlag --- common/dependency-reduced-pom.xml | 2 +- common/pom.xml | 2 +- .../clearlag/CommandListener.java | 24 ++++++++++++++++--- common/src/main/resources/plugin.yml | 2 ++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/common/dependency-reduced-pom.xml b/common/dependency-reduced-pom.xml index 66e0f24..46e47dc 100644 --- a/common/dependency-reduced-pom.xml +++ b/common/dependency-reduced-pom.xml @@ -7,7 +7,7 @@ 4.0.0 ClearLag - 4.0.0 + 4.0.1 ${basedir}/src/main/java clean install diff --git a/common/pom.xml b/common/pom.xml index 489cf26..8c36966 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -10,7 +10,7 @@ 4.0.0 ClearLag - 4.0.0 + 4.0.1 jar diff --git a/common/src/main/java/me/minebuilders/clearlag/CommandListener.java b/common/src/main/java/me/minebuilders/clearlag/CommandListener.java index 60bbc5f..b49b5db 100644 --- a/common/src/main/java/me/minebuilders/clearlag/CommandListener.java +++ b/common/src/main/java/me/minebuilders/clearlag/CommandListener.java @@ -8,12 +8,15 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Objects; -public class CommandListener implements CommandExecutor { +public class CommandListener implements CommandExecutor, TabCompleter { @LanguageValue(key = "command.lagg.") private MessageTree lang; @@ -21,7 +24,7 @@ public class CommandListener implements CommandExecutor { private final List cmds = new ArrayList<>(); public CommandListener() { - ClearLag.getInstance().getCommand("lagg").setExecutor(this); + Objects.requireNonNull(ClearLag.getInstance().getCommand("lagg")).setExecutor(this); } public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { @@ -57,6 +60,21 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command return true; } + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (args.length != 1) { + return Collections.emptyList(); + } + + final String partial = args[0].toLowerCase(); + + return getUserCmds(sender).stream() + .map(CommandModule::getDisplayName) + .filter(name -> name.startsWith(partial)) + .sorted() + .toList(); + } + public void addCmd(CommandModule cmd) { cmds.add(cmd); } @@ -82,4 +100,4 @@ private List getUserCmds(CommandSender p) { return mod; } -} +} \ No newline at end of file diff --git a/common/src/main/resources/plugin.yml b/common/src/main/resources/plugin.yml index c9923d7..1886649 100644 --- a/common/src/main/resources/plugin.yml +++ b/common/src/main/resources/plugin.yml @@ -8,6 +8,8 @@ folia-supported: true commands: lagg: description: Clearlag base command! + aliases: + - clearlag permissions: lagg.clear: description: Permission to clear lag