├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── multiworld-api ├── multiworld-api-bukkit │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── dev7ex │ │ └── multiworld │ │ └── api │ │ └── bukkit │ │ ├── MultiWorldBukkitApi.java │ │ ├── MultiWorldBukkitApiConfiguration.java │ │ ├── event │ │ ├── MultiWorldListener.java │ │ ├── package-info.java │ │ ├── plugin │ │ │ ├── MultiWorldEvent.java │ │ │ ├── MultiWorldStartupCompleteEvent.java │ │ │ └── package-info.java │ │ ├── user │ │ │ ├── WorldUserEvent.java │ │ │ ├── WorldUserLoginEvent.java │ │ │ ├── WorldUserLogoutEvent.java │ │ │ ├── WorldUserPortalEvent.java │ │ │ ├── WorldUserTeleportWorldEvent.java │ │ │ └── package-info.java │ │ └── world │ │ │ ├── WorldCloneEvent.java │ │ │ ├── WorldCreateEvent.java │ │ │ ├── WorldDeleteEvent.java │ │ │ ├── WorldEvent.java │ │ │ ├── WorldFlagChangeEvent.java │ │ │ ├── WorldGameRuleChangeEvent.java │ │ │ └── package-info.java │ │ ├── package-info.java │ │ ├── translation │ │ └── BukkitTranslationProvider.java │ │ ├── user │ │ ├── BukkitWorldUser.java │ │ ├── BukkitWorldUserConfiguration.java │ │ └── BukkitWorldUserProvider.java │ │ └── world │ │ ├── BukkitWorldConfiguration.java │ │ ├── BukkitWorldEnvironment.java │ │ ├── BukkitWorldHolder.java │ │ ├── BukkitWorldManager.java │ │ ├── BukkitWorldProvider.java │ │ ├── BukkitWorldType.java │ │ ├── biome │ │ └── BukkitBiomeHolder.java │ │ ├── generator │ │ ├── BukkitWorldGenerator.java │ │ ├── BukkitWorldGeneratorHolder.java │ │ ├── BukkitWorldGeneratorProvider.java │ │ ├── defaults │ │ │ ├── FlatWorldGenerator.java │ │ │ ├── VoidWorldGenerator.java │ │ │ └── WaterWorldGenerator.java │ │ └── package-info.java │ │ ├── location │ │ ├── BukkitWorldLocation.java │ │ └── package-info.java │ │ └── package-info.java ├── multiworld-api-core │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── dev7ex │ │ └── multiworld │ │ └── api │ │ ├── MultiWorldApi.java │ │ ├── MultiWorldApiConfiguration.java │ │ ├── MultiWorldApiProvider.java │ │ ├── package-info.java │ │ ├── translation │ │ └── TranslationProvider.java │ │ ├── user │ │ ├── WorldUser.java │ │ ├── WorldUserConfiguration.java │ │ ├── WorldUserProperty.java │ │ ├── WorldUserProvider.java │ │ └── package-info.java │ │ └── world │ │ ├── WorldConfiguration.java │ │ ├── WorldDefaultProperty.java │ │ ├── WorldEnvironment.java │ │ ├── WorldFlag.java │ │ ├── WorldHolder.java │ │ ├── WorldManager.java │ │ ├── WorldProperty.java │ │ ├── WorldProvider.java │ │ ├── WorldType.java │ │ ├── biome │ │ └── BiomeHolder.java │ │ ├── generator │ │ ├── WorldGenerator.java │ │ ├── WorldGeneratorHolder.java │ │ ├── WorldGeneratorProperty.java │ │ └── WorldGeneratorProvider.java │ │ ├── location │ │ ├── WorldLocation.java │ │ └── package-info.java │ │ └── package-info.java └── pom.xml ├── multiworld-bukkit ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── dev7ex │ │ └── multiworld │ │ ├── MultiWorldConfiguration.java │ │ ├── MultiWorldPlugin.java │ │ ├── command │ │ ├── WorldCommand.java │ │ └── world │ │ │ ├── BackCommand.java │ │ │ ├── BackupCommand.java │ │ │ ├── CloneCommand.java │ │ │ ├── CreateCommand.java │ │ │ ├── DeleteCommand.java │ │ │ ├── FlagCommand.java │ │ │ ├── GameRuleCommand.java │ │ │ ├── HelpCommand.java │ │ │ ├── ImportCommand.java │ │ │ ├── InfoCommand.java │ │ │ ├── LinkCommand.java │ │ │ ├── ListCommand.java │ │ │ ├── LoadCommand.java │ │ │ ├── ReloadCommand.java │ │ │ ├── TeleportCommand.java │ │ │ ├── UnloadCommand.java │ │ │ ├── VersionCommand.java │ │ │ ├── WhitelistCommand.java │ │ │ └── whitelist │ │ │ ├── AddCommand.java │ │ │ ├── DisableCommand.java │ │ │ ├── EnableCommand.java │ │ │ ├── ListCommand.java │ │ │ └── RemoveCommand.java │ │ ├── hook │ │ ├── DefaultHookProvider.java │ │ ├── permission │ │ │ └── MultiPermsHook.java │ │ └── placeholder │ │ │ └── PlaceholderHook.java │ │ ├── listener │ │ ├── entity │ │ │ ├── EntityPortalListener.java │ │ │ └── EntitySpawnListener.java │ │ ├── player │ │ │ ├── PlayerAdvancementDoneListener.java │ │ │ ├── PlayerChangeWorldListener.java │ │ │ ├── PlayerConnectionListener.java │ │ │ ├── PlayerDamagePlayerListener.java │ │ │ └── PlayerPortalListener.java │ │ ├── user │ │ │ └── UserTeleportWorldListener.java │ │ └── world │ │ │ ├── WorldActivityListener.java │ │ │ ├── WorldFlagListener.java │ │ │ └── WorldInitializeListener.java │ │ ├── task │ │ └── WorldUnloadTask.java │ │ ├── translation │ │ └── DefaultTranslationProvider.java │ │ ├── user │ │ ├── User.java │ │ ├── UserConfiguration.java │ │ └── UserProvider.java │ │ ├── util │ │ ├── Colored.java │ │ └── PluginUpdater.java │ │ └── world │ │ ├── DefaultWorldConfiguration.java │ │ ├── DefaultWorldManager.java │ │ ├── DefaultWorldProvider.java │ │ └── generator │ │ └── DefaultWorldGeneratorProvider.java │ └── resources │ ├── config.yml │ ├── language │ ├── de_DE.json │ ├── en_US.json │ ├── fr_FR.json │ ├── it_IT.json │ ├── tr_TR.json │ ├── uk_UA.json │ └── zh_CN.json │ └── plugin.yml ├── multiworld-resources ├── pom.xml └── src │ └── main │ └── resources │ ├── changelogs │ ├── 1.5.7-2024-03-30.md │ ├── 1.5.7-2024-03-30.txt │ ├── 1.5.8-2024-04-06.txt │ ├── 1.5.9-2024-06-18.txt │ ├── 1.6.0-2024-06-24.txt │ ├── 1.6.1-2024-07-16.txt │ ├── 1.6.2-2024-07-31.txt │ ├── 1.6.3-2024-08-12.txt │ ├── 1.6.4-2024-08-12.txt │ ├── 1.6.5-2024-08-20.txt │ ├── 1.6.6-2024-08-24.txt │ ├── 1.6.7-2024-09-04.md │ ├── 1.6.8-2024-10-10.md │ ├── 1.6.9-2024-10-27.md │ ├── 1.7.0-2024-11-06.md │ ├── CHANGELOG-2024-12-07.md │ ├── CHANGELOG-2025-01-20.md │ ├── CHANGELOG-2025-02-16.md │ ├── CHANGELOG-2025-04-09.md │ └── CHANGELOG_CONVENTION.md │ ├── images │ ├── -Commands-.png │ ├── -Links-.png │ ├── -MultiWorld-.png │ ├── -README-.png │ ├── -Setup-.png │ ├── -Tutorial-.png │ ├── -bStats-.png │ ├── icon.png │ ├── preview-world-command.png │ ├── preview-world-info.png │ ├── title-default.png │ ├── title-description.png │ └── title-github.png │ └── readme │ ├── README_OLD.md │ └── READ_ME_SPIGOT_OLD.txt └── pom.xml /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/MultiWorldBukkitApi.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.multiworld.api.MultiWorldApi; 5 | import com.dev7ex.multiworld.api.bukkit.translation.BukkitTranslationProvider; 6 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUserProvider; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldConfiguration; 8 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldManager; 9 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldProvider; 10 | import com.dev7ex.multiworld.api.bukkit.world.generator.BukkitWorldGeneratorProvider; 11 | import org.bukkit.command.ConsoleCommandSender; 12 | import org.jetbrains.annotations.NotNull; 13 | 14 | /** 15 | * Interface for interacting with the MultiWorld API in a Bukkit environment. 16 | * Provides access to various functionalities and data related to MultiWorld for Bukkit servers. 17 | * 18 | *

This interface extends {@link MultiWorldApi} to provide Bukkit-specific functionality, 19 | * including world management, configuration, and command handling.

20 | * 21 | * @author Dev7ex 22 | * @since 18.06.2023 23 | */ 24 | public interface MultiWorldBukkitApi extends MultiWorldApi { 25 | 26 | /** 27 | * Retrieves the configuration settings for MultiWorld in a Bukkit environment. 28 | * 29 | * @return The {@link MultiWorldBukkitApiConfiguration} instance containing the configuration settings. 30 | */ 31 | @Override 32 | @NotNull 33 | MultiWorldBukkitApiConfiguration getConfiguration(); 34 | 35 | /** 36 | * Retrieves the command handler for MultiWorld commands in a Bukkit environment. 37 | * 38 | * @return The {@link BukkitCommand} instance handling MultiWorld commands. 39 | */ 40 | @NotNull 41 | BukkitCommand getWorldCommand(); 42 | 43 | /** 44 | * Retrieves the console command sender. 45 | * 46 | * @return The {@link ConsoleCommandSender} instance representing the Bukkit console sender. 47 | */ 48 | ConsoleCommandSender getConsoleSender(); 49 | 50 | /** 51 | * Retrieves the translation provider for Bukkit environments. 52 | * 53 | * @return The {@link BukkitTranslationProvider} instance handling translations. 54 | */ 55 | @Override 56 | @NotNull 57 | BukkitTranslationProvider getTranslationProvider(); 58 | 59 | /** 60 | * Retrieves the provider for managing users in Bukkit worlds. 61 | * 62 | * @return The {@link BukkitWorldUserProvider} instance managing Bukkit world users. 63 | */ 64 | @Override 65 | @NotNull 66 | BukkitWorldUserProvider getUserProvider(); 67 | 68 | /** 69 | * Retrieves the configuration settings for a Bukkit world. 70 | * 71 | * @return The {@link BukkitWorldConfiguration} instance representing Bukkit world settings. 72 | */ 73 | @Override 74 | @NotNull 75 | BukkitWorldConfiguration getWorldConfiguration(); 76 | 77 | /** 78 | * Retrieves the provider for generating Bukkit worlds. 79 | * 80 | * @return The {@link BukkitWorldGeneratorProvider} responsible for Bukkit world generation. 81 | */ 82 | @Override 83 | @NotNull 84 | BukkitWorldGeneratorProvider getWorldGeneratorProvider(); 85 | 86 | /** 87 | * Retrieves the manager for managing Bukkit worlds. 88 | * 89 | * @return The {@link BukkitWorldManager} instance handling Bukkit world management. 90 | */ 91 | @Override 92 | @NotNull 93 | BukkitWorldManager getWorldManager(); 94 | 95 | /** 96 | * Retrieves the provider for accessing information about Bukkit worlds. 97 | * 98 | * @return The {@link BukkitWorldProvider} instance providing Bukkit world-related data. 99 | */ 100 | @Override 101 | @NotNull 102 | BukkitWorldProvider getWorldProvider(); 103 | 104 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/MultiWorldBukkitApiConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit; 2 | 3 | import com.dev7ex.common.bukkit.plugin.configuration.DefaultPluginConfiguration; 4 | import com.dev7ex.common.io.file.configuration.ConfigurationHolder; 5 | import com.dev7ex.multiworld.api.MultiWorldApiConfiguration; 6 | import lombok.AccessLevel; 7 | import lombok.Getter; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | /** 11 | * @author Dev7ex 12 | * @since 16.08.2023 13 | */ 14 | public abstract class MultiWorldBukkitApiConfiguration extends DefaultPluginConfiguration implements MultiWorldApiConfiguration { 15 | 16 | public MultiWorldBukkitApiConfiguration(@NotNull final ConfigurationHolder configurationHolder) { 17 | super(configurationHolder); 18 | } 19 | 20 | @Getter(AccessLevel.PUBLIC) 21 | public enum Entry { 22 | 23 | PREFIX("prefix", "§8[§bMultiWorld§8]§r", false), 24 | 25 | SETTINGS_ACCESS_NETHER_WORLD_VIA_COMMAND("settings.access-nether-world-via-command", true, false), 26 | SETTINGS_ACCESS_END_WORLD_VIA_COMMAND("settings.access-end-world-via-command", true, false), 27 | SETTINGS_AUTO_GAME_MODE_ENABLED("settings.auto-game-mode-enabled", true, false), 28 | SETTINGS_AUTO_UNLOAD_LOAD_DELAY("settings.auto-unload-load-delay", 300, false), 29 | SETTINGS_AUTO_UNLOAD_SYSTEM_DELAY("settings.auto-unload-system-delay", 1800, false), 30 | SETTINGS_AUTO_UNLOAD_SYSTEM_ENABLED("settings.auto-unload-system-enabled", true, false), 31 | 32 | SETTINGS_DEFAULTS_AUTO_LOAD_ENABLED("settings.defaults.auto-load-enabled", false, false), 33 | SETTINGS_DEFAULTS_AUTO_UNLOAD_ENABLED("settings.defaults.auto-unload-enabled", false, false), 34 | SETTINGS_DEFAULTS_DIFFICULTY("settings.defaults.difficulty", "PEACEFUL", false), 35 | SETTINGS_DEFAULTS_END_PORTAL_ACCESSIBLE("settings.defaults.end-portal-accessible", true, false), 36 | SETTINGS_DEFAULTS_END_WORLD("settings.defaults.end-world", "world_the_end", false), 37 | SETTINGS_DEFAULTS_GAME_MODE("settings.defaults.game-mode", "SURVIVAL", false), 38 | SETTINGS_DEFAULTS_FORCE_GAME_MODE("settings.defaults.force-game-mode", "false-with-permission", false), 39 | SETTINGS_DEFAULTS_HUNGER_ENABLED_ENABLED("settings.defaults.hunger-enabled", true, false), 40 | SETTINGS_DEFAULTS_KEEP_SPAWN_IN_MEMORY("settings.defaults.keep-spawn-in-memory", false, false), 41 | SETTINGS_DEFAULTS_NETHER_PORTAL_ACCESSIBLE("settings.defaults.nether-portal-accessible", true, false), 42 | SETTINGS_DEFAULTS_NETHER_WORLD("settings.defaults.nether-world", "world_nether", false), 43 | SETTINGS_DEFAULTS_NORMAL_WORLD("settings.defaults.normal-world", "world", false), 44 | SETTINGS_DEFAULTS_PVP_ENABLED("settings.defaults.pvp-enabled", true, false), 45 | SETTINGS_DEFAULTS_RECEIVE_ACHIEVEMENTS("settings.defaults.receive-achievements", true, false), 46 | SETTINGS_DEFAULTS_REDSTONE_ENABLED("settings.defaults.redstone-enabled", true, false), 47 | SETTINGS_DEFAULTS_SPAWN_ANIMALS("settings.defaults.spawn-animals", true, false), 48 | SETTINGS_DEFAULTS_SPAWN_ENTITIES("settings.defaults.spawn-entities", true, false), 49 | SETTINGS_DEFAULTS_SPAWN_MONSTERS("settings.defaults.spawn-monsters", true, false), 50 | SETTINGS_DEFAULTS_WEATHER_ENABLED("settings.defaults.weather-enabled", true, false), 51 | SETTINGS_DEFAULTS_WHITELIST_ENABLED("settings.defaults.whitelist-enabled", false, false), 52 | 53 | SETTINGS_TIME_FORMAT("settings.time-format", "dd.MM.yyyy HH:mm:ss", false), 54 | SETTINGS_WORLD_LINK_ENABLED("settings.world-link-enabled", true, false); 55 | 56 | private final String path; 57 | private final Object defaultValue; 58 | private final boolean removed; 59 | 60 | Entry(@NotNull final String path, @NotNull final Object defaultValue, final boolean removed) { 61 | this.path = path; 62 | this.defaultValue = defaultValue; 63 | this.removed = removed; 64 | } 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/MultiWorldListener.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApiConfiguration; 5 | import com.dev7ex.multiworld.api.bukkit.translation.BukkitTranslationProvider; 6 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUserProvider; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldConfiguration; 8 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldManager; 9 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldProvider; 10 | import com.dev7ex.multiworld.api.bukkit.world.generator.BukkitWorldGeneratorProvider; 11 | import org.bukkit.command.ConsoleCommandSender; 12 | import org.bukkit.event.Listener; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | /** 16 | * Base class for event listeners in the MultiWorld plugin. 17 | * Provides access to various components of the MultiWorld Bukkit API. 18 | * 19 | *

This class serves as a foundation for event listeners, ensuring easy access to essential 20 | * MultiWorld components such as world management, user handling, and translation services.

21 | * 22 | * @author Dev7ex 23 | * @since 18.06.2023 24 | */ 25 | public abstract class MultiWorldListener implements Listener { 26 | 27 | private final MultiWorldBukkitApi multiWorldApi; 28 | 29 | /** 30 | * Constructs a MultiWorldListener with the given MultiWorldBukkitApi. 31 | * 32 | * @param multiWorldApi The {@link MultiWorldBukkitApi} instance providing access to the API. 33 | */ 34 | public MultiWorldListener(@NotNull final MultiWorldBukkitApi multiWorldApi) { 35 | this.multiWorldApi = multiWorldApi; 36 | } 37 | 38 | /** 39 | * Retrieves the MultiWorld API configuration. 40 | * 41 | * @return The {@link MultiWorldBukkitApiConfiguration} instance. 42 | */ 43 | public MultiWorldBukkitApiConfiguration getConfiguration() { 44 | return this.multiWorldApi.getConfiguration(); 45 | } 46 | 47 | /** 48 | * Retrieves the prefix used for messages in the plugin. 49 | * 50 | * @return The plugin message prefix. 51 | */ 52 | public String getPrefix() { 53 | return this.multiWorldApi.getConfiguration().getPrefix(); 54 | } 55 | 56 | /** 57 | * Retrieves the Bukkit console command sender. 58 | * 59 | * @return The {@link ConsoleCommandSender} instance. 60 | */ 61 | public ConsoleCommandSender getConsoleSender() { 62 | return this.multiWorldApi.getConsoleSender(); 63 | } 64 | 65 | /** 66 | * Retrieves the translation provider for handling translations. 67 | * 68 | * @return The {@link BukkitTranslationProvider} instance. 69 | */ 70 | public BukkitTranslationProvider getTranslationProvider() { 71 | return this.multiWorldApi.getTranslationProvider(); 72 | } 73 | 74 | /** 75 | * Retrieves the provider for managing users in Bukkit worlds. 76 | * 77 | * @return The {@link BukkitWorldUserProvider} instance. 78 | */ 79 | public BukkitWorldUserProvider getUserProvider() { 80 | return this.multiWorldApi.getUserProvider(); 81 | } 82 | 83 | /** 84 | * Retrieves the provider for generating Bukkit worlds. 85 | * 86 | * @return The {@link BukkitWorldGeneratorProvider} instance. 87 | */ 88 | public BukkitWorldGeneratorProvider getWorldGeneratorProvider() { 89 | return this.multiWorldApi.getWorldGeneratorProvider(); 90 | } 91 | 92 | /** 93 | * Retrieves the configuration settings for a Bukkit world. 94 | * 95 | * @return The {@link BukkitWorldConfiguration} instance. 96 | */ 97 | public BukkitWorldConfiguration getWorldConfiguration() { 98 | return this.multiWorldApi.getWorldConfiguration(); 99 | } 100 | 101 | /** 102 | * Retrieves the world manager responsible for handling Bukkit worlds. 103 | * 104 | * @return The {@link BukkitWorldManager} instance. 105 | */ 106 | public BukkitWorldManager getWorldManager() { 107 | return this.multiWorldApi.getWorldManager(); 108 | } 109 | 110 | /** 111 | * Retrieves the provider for accessing information about Bukkit worlds. 112 | * 113 | * @return The {@link BukkitWorldProvider} instance. 114 | */ 115 | public BukkitWorldProvider getWorldProvider() { 116 | return this.multiWorldApi.getWorldProvider(); 117 | } 118 | 119 | } 120 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Classes dedicated to handling triggered code executions. 3 | */ 4 | package com.dev7ex.multiworld.api.bukkit.event; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/plugin/MultiWorldEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.plugin; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import org.bukkit.event.Event; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * Base class for events related to the MultiWorld plugin. 11 | * Provides access to the MultiWorldBukkitApi instance. 12 | * 13 | * @author Dev7ex 14 | * @since 18.06.2023 15 | */ 16 | @Getter(AccessLevel.PUBLIC) 17 | abstract class MultiWorldEvent extends Event { 18 | 19 | private final MultiWorldBukkitApi multiWorldApi; 20 | 21 | /** 22 | * Constructs a MultiWorldEvent with the given MultiWorldBukkitApi instance. 23 | * 24 | * @param multiWorldApi The MultiWorldBukkitApi instance. 25 | */ 26 | MultiWorldEvent(@NotNull final MultiWorldBukkitApi multiWorldApi) { 27 | this.multiWorldApi = multiWorldApi; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/plugin/MultiWorldStartupCompleteEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.plugin; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import org.bukkit.event.HandlerList; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * Event triggered when MultiWorld has finished loading. 11 | * This event provides information about the duration of the startup process. 12 | * 13 | * @author itsTyrion 14 | * @since 29.11.2022 15 | */ 16 | @Getter(AccessLevel.PUBLIC) 17 | public class MultiWorldStartupCompleteEvent extends MultiWorldEvent { 18 | 19 | private static final HandlerList HANDLERS = new HandlerList(); 20 | private final long startupDuration; 21 | 22 | /** 23 | * Constructs a MultiWorldStartupCompleteEvent with the given MultiWorldBukkitApi instance and startup duration. 24 | * 25 | * @param multiWorldApi The MultiWorldBukkitApi instance. 26 | * @param startupDuration The duration of the startup process, in milliseconds. 27 | */ 28 | public MultiWorldStartupCompleteEvent(@NotNull final MultiWorldBukkitApi multiWorldApi, final long startupDuration) { 29 | super(multiWorldApi); 30 | this.startupDuration = startupDuration; 31 | } 32 | 33 | /** 34 | * Retrieves the handler list for this event. 35 | * 36 | * @return The handler list. 37 | */ 38 | public static HandlerList getHandlerList() { 39 | return MultiWorldStartupCompleteEvent.HANDLERS; 40 | } 41 | 42 | @Override 43 | public @NotNull HandlerList getHandlers() { 44 | return MultiWorldStartupCompleteEvent.HANDLERS; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/plugin/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Events related to MultiWorld. 3 | */ 4 | package com.dev7ex.multiworld.api.bukkit.event.plugin; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/user/WorldUserEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.user; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUser; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import org.bukkit.event.Event; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * Represents an abstract event related to a world user. 11 | * All events involving world users should extend this class. 12 | * 13 | * @author Dev7ex 14 | * @since 18.06.2023 15 | */ 16 | @Getter(AccessLevel.PUBLIC) 17 | abstract class WorldUserEvent extends Event { 18 | 19 | private final BukkitWorldUser user; 20 | 21 | /** 22 | * Constructs a new WorldUserEvent. 23 | * 24 | * @param user The WorldUser associated with the event. 25 | */ 26 | WorldUserEvent(@NotNull final BukkitWorldUser user) { 27 | this.user = user; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/user/WorldUserLoginEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.user; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUser; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import org.bukkit.event.HandlerList; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * Represents an event triggered when a world user logs in. 11 | * This event is called after the user successfully logs in. 12 | * 13 | * @author Dev7ex 14 | * @since 18.06.2023 15 | */ 16 | @Getter(AccessLevel.PUBLIC) 17 | public class WorldUserLoginEvent extends WorldUserEvent { 18 | 19 | private static final HandlerList HANDLERS = new HandlerList(); 20 | 21 | /** 22 | * Constructs a new WorldUserLoginEvent. 23 | * 24 | * @param user The WorldUser who logged in. 25 | */ 26 | public WorldUserLoginEvent(@NotNull final BukkitWorldUser user) { 27 | super(user); 28 | } 29 | 30 | /** 31 | * Gets the handler list for this event. 32 | * 33 | * @return The handler list. 34 | */ 35 | public static HandlerList getHandlerList() { 36 | return WorldUserLoginEvent.HANDLERS; 37 | } 38 | 39 | @Override 40 | public @NotNull HandlerList getHandlers() { 41 | return WorldUserLoginEvent.HANDLERS; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/user/WorldUserLogoutEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.user; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUser; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import org.bukkit.event.HandlerList; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * Represents an event triggered when a world user logs out. 11 | * This event is called after the user successfully logs out. 12 | * 13 | * @author Dev7ex 14 | * @since 18.06.2023 15 | */ 16 | @Getter(AccessLevel.PUBLIC) 17 | public class WorldUserLogoutEvent extends WorldUserEvent { 18 | 19 | private static final HandlerList HANDLERS = new HandlerList(); 20 | 21 | /** 22 | * Constructs a new WorldUserLogoutEvent. 23 | * 24 | * @param user The WorldUser who logged out. 25 | */ 26 | public WorldUserLogoutEvent(@NotNull final BukkitWorldUser user) { 27 | super(user); 28 | } 29 | 30 | /** 31 | * Gets the handler list for this event. 32 | * 33 | * @return The handler list. 34 | */ 35 | public static HandlerList getHandlerList() { 36 | return WorldUserLogoutEvent.HANDLERS; 37 | } 38 | 39 | @Override 40 | public @NotNull HandlerList getHandlers() { 41 | return WorldUserLogoutEvent.HANDLERS; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/user/WorldUserPortalEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.user; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUser; 4 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 5 | import lombok.AccessLevel; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | import org.bukkit.PortalType; 9 | import org.bukkit.event.HandlerList; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | /** 13 | * This event is called when a user enters a portal in a world. 14 | * It extends WorldUserEvent. 15 | * It provides information about the user, the current world they are in, the portal world they will be teleported to, and the type of portal. 16 | * 17 | * @author Dev7ex 18 | * @since 29.06.2023 19 | */ 20 | @Getter(AccessLevel.PUBLIC) 21 | @Setter(AccessLevel.PUBLIC) 22 | public class WorldUserPortalEvent extends WorldUserEvent { 23 | 24 | private static final HandlerList HANDLERS = new HandlerList(); 25 | private boolean cancelled = false; 26 | private final BukkitWorldHolder currentWorldHolder; 27 | private final BukkitWorldHolder portalWorldHolder; 28 | private final PortalType portalType; 29 | 30 | /** 31 | * Constructs a new WorldUserEnterPortalEvent. 32 | * 33 | * @param user The user entering the portal. 34 | * @param currentWorldHolder The BukkitWorldHolder of the current world the user is in. 35 | * @param portalWorldHolder The BukkitWorldHolder of the portal world the user will be teleported to. 36 | * @param portalType The type of portal the user is entering. 37 | */ 38 | public WorldUserPortalEvent(@NotNull final BukkitWorldUser user, @NotNull final BukkitWorldHolder currentWorldHolder, @NotNull final BukkitWorldHolder portalWorldHolder, @NotNull final PortalType portalType) { 39 | super(user); 40 | this.currentWorldHolder = currentWorldHolder; 41 | this.portalWorldHolder = portalWorldHolder; 42 | this.portalType = portalType; 43 | } 44 | 45 | /** 46 | * Gets the HandlerList for this event. 47 | * 48 | * @return The HandlerList for this event. 49 | */ 50 | public static HandlerList getHandlerList() { 51 | return WorldUserPortalEvent.HANDLERS; 52 | } 53 | 54 | /** 55 | * Gets the handlers for this event. 56 | * 57 | * @return The handlers for this event. 58 | */ 59 | @Override 60 | public @NotNull HandlerList getHandlers() { 61 | return WorldUserPortalEvent.HANDLERS; 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/user/WorldUserTeleportWorldEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.user; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUser; 4 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 5 | import lombok.AccessLevel; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | import org.bukkit.event.Cancellable; 9 | import org.bukkit.event.HandlerList; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | /** 13 | * This event is called when a user is teleported between worlds. 14 | * It extends WorldUserEvent and implements Cancellable. 15 | * It provides information about the user, the world they were in before the teleportation, and the world they will be teleported to. 16 | * 17 | * @author Dev7ex 18 | * @since 18.06.2023 19 | */ 20 | @Getter(AccessLevel.PUBLIC) 21 | @Setter(AccessLevel.PUBLIC) 22 | public class WorldUserTeleportWorldEvent extends WorldUserEvent implements Cancellable { 23 | 24 | private static final HandlerList HANDLERS = new HandlerList(); 25 | private boolean cancelled = false; 26 | private BukkitWorldHolder lastWorldHolder; 27 | private BukkitWorldHolder nextWorldHolder; 28 | 29 | /** 30 | * Constructs a new WorldUserTeleportWorldEvent. 31 | * 32 | * @param user The user being teleported. 33 | * @param lastWorldHolder The BukkitWorldHolder of the world the user was in before the teleportation. 34 | * @param nextWorldHolder The BukkitWorldHolder of the world the user will be teleported to. 35 | */ 36 | public WorldUserTeleportWorldEvent(@NotNull final BukkitWorldUser user, @NotNull final BukkitWorldHolder lastWorldHolder, @NotNull final BukkitWorldHolder nextWorldHolder) { 37 | super(user); 38 | this.lastWorldHolder = lastWorldHolder; 39 | this.nextWorldHolder = nextWorldHolder; 40 | } 41 | 42 | /** 43 | * Gets the HandlerList for this event. 44 | * 45 | * @return The HandlerList for this event. 46 | */ 47 | public static HandlerList getHandlerList() { 48 | return WorldUserTeleportWorldEvent.HANDLERS; 49 | } 50 | 51 | /** 52 | * Gets the handlers for this event. 53 | * 54 | * @return The handlers for this event. 55 | */ 56 | @Override 57 | public @NotNull HandlerList getHandlers() { 58 | return WorldUserTeleportWorldEvent.HANDLERS; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/user/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Events relating to users. 3 | */ 4 | package com.dev7ex.multiworld.api.bukkit.event.user; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/world/WorldCloneEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.world; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.event.Cancellable; 9 | import org.bukkit.event.HandlerList; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | import java.io.File; 13 | 14 | /** 15 | * Represents an event that occurs when a world is cloned. 16 | * This event is called before the world is cloned. 17 | * If the event is cancelled, the world will not be cloned. 18 | * 19 | * @author Dev7ex 20 | * @since 18.06.2023 21 | */ 22 | @Getter(AccessLevel.PUBLIC) 23 | @Setter(AccessLevel.PUBLIC) 24 | public class WorldCloneEvent extends WorldEvent implements Cancellable { 25 | 26 | private static final HandlerList HANDLERS = new HandlerList(); 27 | private boolean cancelled = false; 28 | 29 | private final String clonedName; 30 | private final File sourceFolder; 31 | private final File destinationFolder; 32 | 33 | /** 34 | * Constructs a new WorldCloneEvent. 35 | * 36 | * @param worldHolder The BukkitWorldHolder of the world being cloned. 37 | * @param commandSender The command sender initiating the clone operation. 38 | * @param clonedName The name of the cloned world. 39 | * @param sourceFolder The source folder of the world being cloned. 40 | * @param destinationFolder The destination folder where the cloned world will be placed. 41 | */ 42 | public WorldCloneEvent(@NotNull final BukkitWorldHolder worldHolder, @NotNull final CommandSender commandSender, 43 | @NotNull final String clonedName, @NotNull final File sourceFolder, 44 | @NotNull final File destinationFolder) { 45 | super(worldHolder, commandSender); 46 | this.clonedName = clonedName; 47 | this.sourceFolder = sourceFolder; 48 | this.destinationFolder = destinationFolder; 49 | } 50 | 51 | /** 52 | * Gets the handler list for this event. 53 | * 54 | * @return The handler list. 55 | */ 56 | public static HandlerList getHandlerList() { 57 | return WorldCloneEvent.HANDLERS; 58 | } 59 | 60 | /** 61 | * {@inheritDoc} 62 | */ 63 | @Override 64 | public @NotNull HandlerList getHandlers() { 65 | return WorldCloneEvent.HANDLERS; 66 | } 67 | 68 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/world/WorldCreateEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.world; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.event.Cancellable; 9 | import org.bukkit.event.HandlerList; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | /** 13 | * Represents an event that occurs when a world is created. 14 | * This event is called after the world is created. 15 | * If the event is cancelled, the world creation process will be halted. 16 | * 17 | * @author Dev7ex 18 | * @since 18.06.2023 19 | */ 20 | @Getter(AccessLevel.PUBLIC) 21 | @Setter(AccessLevel.PUBLIC) 22 | public class WorldCreateEvent extends WorldEvent implements Cancellable { 23 | 24 | private static final HandlerList HANDLERS = new HandlerList(); 25 | private boolean cancelled = false; 26 | 27 | /** 28 | * Constructs a new WorldCreateEvent. 29 | * 30 | * @param worldHolder The BukkitWorldHolder of the world being created. 31 | * @param commandSender The command sender initiating the world creation. 32 | */ 33 | public WorldCreateEvent(@NotNull final BukkitWorldHolder worldHolder, @NotNull final CommandSender commandSender) { 34 | super(worldHolder, commandSender); 35 | } 36 | 37 | /** 38 | * Gets the handler list for this event. 39 | * 40 | * @return The handler list. 41 | */ 42 | public static HandlerList getHandlerList() { 43 | return WorldCreateEvent.HANDLERS; 44 | } 45 | 46 | /** 47 | * {@inheritDoc} 48 | */ 49 | @Override 50 | public @NotNull HandlerList getHandlers() { 51 | return WorldCreateEvent.HANDLERS; 52 | } 53 | 54 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/world/WorldDeleteEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.world; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.event.Cancellable; 9 | import org.bukkit.event.HandlerList; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | /** 13 | * Represents an event that occurs when a world is deleted. 14 | * This event is called before the world is deleted. 15 | * If the event is cancelled, the world deletion process will be halted. 16 | * 17 | * @author Dev7ex 18 | * @since 18.06.2023 19 | */ 20 | @Getter(AccessLevel.PUBLIC) 21 | @Setter(AccessLevel.PUBLIC) 22 | public class WorldDeleteEvent extends WorldEvent implements Cancellable { 23 | 24 | private static final HandlerList HANDLERS = new HandlerList(); 25 | private boolean cancelled = false; 26 | 27 | /** 28 | * Constructs a new WorldDeleteEvent. 29 | * 30 | * @param worldHolder The BukkitWorldHolder of the world being deleted. 31 | * @param commandSender The command sender initiating the world deletion. 32 | */ 33 | public WorldDeleteEvent(@NotNull final BukkitWorldHolder worldHolder, @NotNull final CommandSender commandSender) { 34 | super(worldHolder, commandSender); 35 | } 36 | 37 | /** 38 | * Gets the handler list for this event. 39 | * 40 | * @return The handler list. 41 | */ 42 | public static HandlerList getHandlerList() { 43 | return WorldDeleteEvent.HANDLERS; 44 | } 45 | 46 | /** 47 | * {@inheritDoc} 48 | */ 49 | @Override 50 | public @NotNull HandlerList getHandlers() { 51 | return WorldDeleteEvent.HANDLERS; 52 | } 53 | 54 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/world/WorldEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.world; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import org.bukkit.command.CommandSender; 7 | import org.bukkit.event.Event; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | /** 11 | * Represents a base class for events related to worlds. 12 | * This class should be extended by specific world-related events. 13 | * 14 | * @author Dev7ex 15 | * @since 18.06.2023 16 | */ 17 | @Getter(AccessLevel.PUBLIC) 18 | abstract class WorldEvent extends Event { 19 | 20 | private final BukkitWorldHolder worldHolder; 21 | private final CommandSender commandSender; 22 | 23 | /** 24 | * Constructs a new WorldEvent. 25 | * 26 | * @param worldHolder The BukkitWorldHolder associated with the event. 27 | * @param commandSender The command sender related to the event. 28 | */ 29 | WorldEvent(@NotNull final BukkitWorldHolder worldHolder, @NotNull final CommandSender commandSender) { 30 | this.worldHolder = worldHolder; 31 | this.commandSender = commandSender; 32 | } 33 | 34 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/world/WorldFlagChangeEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.world; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 4 | import com.dev7ex.multiworld.api.world.WorldFlag; 5 | import lombok.AccessLevel; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | import org.bukkit.command.CommandSender; 9 | import org.bukkit.event.Cancellable; 10 | import org.bukkit.event.HandlerList; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | /** 14 | * Represents an event triggered when a world flag is changed. 15 | * This event can be cancelled. 16 | * 17 | * @author Dev7ex 18 | * @since 29.06.2023 19 | */ 20 | @Getter(AccessLevel.PUBLIC) 21 | @Setter(AccessLevel.PUBLIC) 22 | public class WorldFlagChangeEvent extends WorldEvent implements Cancellable { 23 | 24 | private static final HandlerList HANDLERS = new HandlerList(); 25 | private boolean cancelled = false; 26 | private WorldFlag flag; 27 | private String value; 28 | 29 | /** 30 | * Constructs a new WorldFlagChangeEvent. 31 | * 32 | * @param worldHolder The BukkitWorldHolder associated with the event. 33 | * @param commandSender The command sender related to the event. 34 | * @param flag The flag that was changed. 35 | * @param value The new value of the flag. 36 | */ 37 | public WorldFlagChangeEvent(@NotNull final BukkitWorldHolder worldHolder, @NotNull final CommandSender commandSender, @NotNull final WorldFlag flag, @NotNull final String value) { 38 | super(worldHolder, commandSender); 39 | this.flag = flag; 40 | this.value = value; 41 | } 42 | 43 | /** 44 | * Returns the handler list. 45 | * 46 | * @return The handler list. 47 | */ 48 | public static HandlerList getHandlerList() { 49 | return WorldFlagChangeEvent.HANDLERS; 50 | } 51 | 52 | @Override 53 | public @NotNull HandlerList getHandlers() { 54 | return WorldFlagChangeEvent.HANDLERS; 55 | } 56 | 57 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/world/WorldGameRuleChangeEvent.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.event.world; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | import org.bukkit.GameRule; 8 | import org.bukkit.command.CommandSender; 9 | import org.bukkit.event.Cancellable; 10 | import org.bukkit.event.HandlerList; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | /** 14 | * Represents an event triggered when a game rule is changed in a world. 15 | * This event can be cancelled. 16 | * 17 | * @author Dev7ex 18 | * @since 29.03.2024 19 | */ 20 | @Getter(AccessLevel.PUBLIC) 21 | @Setter(AccessLevel.PUBLIC) 22 | public class WorldGameRuleChangeEvent extends WorldEvent implements Cancellable { 23 | 24 | private static final HandlerList HANDLERS = new HandlerList(); 25 | private boolean cancelled = false; 26 | private GameRule gameRule; 27 | private String value; 28 | 29 | /** 30 | * Constructs a new WorldGameRuleChangeEvent. 31 | * 32 | * @param worldHolder The BukkitWorldHolder associated with the event. 33 | * @param commandSender The command sender related to the event. 34 | * @param gameRule The game rule that was changed. 35 | * @param value The new value of the game rule. 36 | */ 37 | public WorldGameRuleChangeEvent(@NotNull final BukkitWorldHolder worldHolder, @NotNull final CommandSender commandSender, @NotNull final GameRule gameRule, @NotNull final String value) { 38 | super(worldHolder, commandSender); 39 | this.gameRule = gameRule; 40 | this.value = value; 41 | } 42 | 43 | /** 44 | * Returns the handler list. 45 | * 46 | * @return The handler list. 47 | */ 48 | public static HandlerList getHandlerList() { 49 | return WorldGameRuleChangeEvent.HANDLERS; 50 | } 51 | 52 | @Override 53 | public @NotNull HandlerList getHandlers() { 54 | return WorldGameRuleChangeEvent.HANDLERS; 55 | } 56 | 57 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/event/world/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Events related to worlds. 3 | */ 4 | package com.dev7ex.multiworld.api.bukkit.event.world; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * The root package of the MultiWorld API, contains generalized API classes. 3 | */ 4 | package com.dev7ex.multiworld.api.bukkit; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/translation/BukkitTranslationProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.translation; 2 | 3 | import com.dev7ex.multiworld.api.translation.TranslationProvider; 4 | import org.bukkit.command.CommandSender; 5 | 6 | /** 7 | * @author Dev7ex 8 | * @since 10.07.2024 9 | */ 10 | public interface BukkitTranslationProvider extends TranslationProvider {} 11 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/user/BukkitWorldUser.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.user; 2 | 3 | import com.dev7ex.common.bukkit.entity.EntityResolver; 4 | import com.dev7ex.multiworld.api.user.WorldUser; 5 | import org.bukkit.entity.Player; 6 | 7 | /** 8 | * @author Dev7ex 9 | * @since 07.06.2024 10 | */ 11 | public interface BukkitWorldUser extends WorldUser, EntityResolver {} 12 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/user/BukkitWorldUserConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.user; 2 | 3 | import com.dev7ex.multiworld.api.user.WorldUserConfiguration; 4 | 5 | /** 6 | * @author Dev7ex 7 | * @since 07.06.2024 8 | */ 9 | public interface BukkitWorldUserConfiguration extends WorldUserConfiguration { 10 | } 11 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/user/BukkitWorldUserProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.user; 2 | 3 | import com.dev7ex.multiworld.api.user.WorldUserProvider; 4 | 5 | /** 6 | * @author Dev7ex 7 | * @since 07.06.2024 8 | */ 9 | public interface BukkitWorldUserProvider extends WorldUserProvider { 10 | } 11 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/BukkitWorldConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world; 2 | 3 | import com.dev7ex.multiworld.api.world.WorldConfiguration; 4 | 5 | /** 6 | * Represents the configuration of a Bukkit world in a multi-world environment. 7 | * Extends WorldConfiguration with BukkitWorldHolder as the generic type parameter. 8 | * This interface provides methods for configuring Bukkit worlds. 9 | * 10 | * @author Dev7ex 11 | * @since 18.06.2023 12 | */ 13 | public interface BukkitWorldConfiguration extends WorldConfiguration { 14 | } 15 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/BukkitWorldEnvironment.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world; 2 | 3 | import com.dev7ex.multiworld.api.world.WorldEnvironment; 4 | import com.dev7ex.multiworld.api.world.WorldType; 5 | import org.bukkit.World; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | /** 9 | * @author Dev7ex 10 | * @since 29.06.2024 11 | */ 12 | public class BukkitWorldEnvironment { 13 | 14 | public static World.Environment from(@NotNull final WorldEnvironment environment) { 15 | return switch (environment) { 16 | case NORMAL -> World.Environment.NORMAL; 17 | case NETHER -> World.Environment.NETHER; 18 | case THE_END -> World.Environment.THE_END; 19 | default -> World.Environment.CUSTOM; 20 | }; 21 | } 22 | 23 | public static World.Environment from(@NotNull final WorldType type) { 24 | return switch (type) { 25 | case NORMAL -> World.Environment.NORMAL; 26 | case NETHER -> World.Environment.NETHER; 27 | case THE_END -> World.Environment.THE_END; 28 | default -> World.Environment.CUSTOM; 29 | }; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/BukkitWorldManager.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world; 2 | 3 | import com.dev7ex.multiworld.api.world.WorldManager; 4 | 5 | /** 6 | * Represents a manager for Bukkit worlds in a multi-world environment. 7 | * Extends WorldManager interface. 8 | * This interface provides functionality for managing Bukkit worlds. 9 | * 10 | * @author Dev7ex 11 | * @since 27.06.2023 12 | */ 13 | public interface BukkitWorldManager extends WorldManager { 14 | } 15 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/BukkitWorldProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world; 2 | 3 | import com.dev7ex.multiworld.api.world.WorldProvider; 4 | 5 | /** 6 | * Represents a provider for Bukkit worlds in a multi-world environment. 7 | * Extends WorldProvider interface with BukkitWorldHolder as the generic type parameter. 8 | * This interface provides functionality for managing Bukkit worlds. 9 | * 10 | * @author Dev7ex 11 | * @since 18.06.2023 12 | */ 13 | public interface BukkitWorldProvider extends WorldProvider { 14 | } 15 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/BukkitWorldType.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world; 2 | 3 | import com.dev7ex.multiworld.api.world.WorldType; 4 | import org.bukkit.World; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * Utility class for converting Bukkit world environments to corresponding WorldType. 9 | * This class provides static methods for mapping Bukkit world environments to WorldType enum values. 10 | * 11 | * @author Dev7ex 12 | * @since 18.06.2023 13 | */ 14 | public class BukkitWorldType { 15 | 16 | // Private constructor to prevent instantiation of this utility class 17 | private BukkitWorldType() { 18 | } 19 | 20 | /** 21 | * Converts a Bukkit world environment to a corresponding WorldType enum value. 22 | * 23 | * @param environment The Bukkit world environment. 24 | * @return The corresponding WorldType. 25 | */ 26 | public static WorldType fromEnvironment(@NotNull final World.Environment environment) { 27 | return switch (environment) { 28 | case THE_END -> WorldType.THE_END; 29 | case NETHER -> WorldType.NETHER; 30 | default -> WorldType.NORMAL; 31 | }; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/biome/BukkitBiomeHolder.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world.biome; 2 | 3 | import com.dev7ex.multiworld.api.world.biome.BiomeHolder; 4 | import org.bukkit.block.Biome; 5 | 6 | /** 7 | * @author Dev7ex 8 | * @since 06.11.2024 9 | */ 10 | public interface BukkitBiomeHolder extends BiomeHolder { 11 | } 12 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/generator/BukkitWorldGenerator.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world.generator; 2 | 3 | import com.dev7ex.multiworld.api.world.generator.WorldGenerator; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | import org.bukkit.generator.ChunkGenerator; 8 | import org.bukkit.plugin.Plugin; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | /** 12 | * Represents a Bukkit implementation of a custom world generator. 13 | * Extends ChunkGenerator and implements WorldGenerator. 14 | * This class can be used to generate custom terrain and structures for Bukkit worlds. 15 | * 16 | * @author Dev7ex 17 | * @since 26.03.2024 18 | */ 19 | @Getter(AccessLevel.PUBLIC) 20 | @Setter(AccessLevel.PUBLIC) 21 | public class BukkitWorldGenerator extends ChunkGenerator implements WorldGenerator { 22 | 23 | private Plugin plugin; 24 | 25 | /** 26 | * Constructs a new BukkitWorldGenerator with the given plugin. 27 | * 28 | * @param plugin The Bukkit plugin associated with this world generator. 29 | */ 30 | public BukkitWorldGenerator(@NotNull final Plugin plugin) { 31 | this.plugin = plugin; 32 | } 33 | 34 | /** 35 | * Default constructor for BukkitWorldGenerator. 36 | * This constructor is needed for Bukkit to properly instantiate the generator. 37 | */ 38 | public BukkitWorldGenerator() {} 39 | 40 | } 41 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/generator/BukkitWorldGeneratorHolder.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world.generator; 2 | 3 | import com.dev7ex.multiworld.api.world.generator.WorldGeneratorHolder; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import org.bukkit.plugin.Plugin; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * Represents a Bukkit implementation of a WorldGeneratorHolder. 11 | * It holds a reference to the Bukkit plugin that provides the world generator. 12 | * 13 | * @author Dev7ex 14 | * @since 06.06.2024 15 | */ 16 | @Getter(AccessLevel.PUBLIC) 17 | public class BukkitWorldGeneratorHolder implements WorldGeneratorHolder { 18 | 19 | private final Plugin plugin; 20 | 21 | /** 22 | * Constructs a new BukkitWorldGeneratorHolder with the given plugin. 23 | * 24 | * @param plugin The Bukkit plugin providing the world generator. 25 | */ 26 | public BukkitWorldGeneratorHolder(@NotNull final Plugin plugin) { 27 | this.plugin = plugin; 28 | } 29 | 30 | /** 31 | * Gets the name of the plugin providing the world generator. 32 | * 33 | * @return The name of the plugin. 34 | */ 35 | @Override 36 | public String getName() { 37 | return this.plugin.getName(); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/generator/BukkitWorldGeneratorProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world.generator; 2 | 3 | import com.dev7ex.multiworld.api.world.generator.WorldGeneratorProvider; 4 | 5 | /** 6 | * Represents a provider for Bukkit world generators in a multi-world environment. 7 | * Extends WorldGeneratorProvider interface. 8 | * This interface provides functionality for managing Bukkit world generators. 9 | * 10 | * @author Dev7ex 11 | * @since 29.06.2023 12 | */ 13 | public interface BukkitWorldGeneratorProvider extends WorldGeneratorProvider {} 14 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/generator/defaults/FlatWorldGenerator.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world.generator.defaults; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.world.generator.BukkitWorldGenerator; 4 | import lombok.NoArgsConstructor; 5 | import org.bukkit.Material; 6 | import org.bukkit.World; 7 | import org.bukkit.block.Biome; 8 | import org.bukkit.generator.ChunkGenerator; 9 | import org.bukkit.plugin.Plugin; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | import java.util.Random; 13 | 14 | /** 15 | * Generates a flat world with bedrock at the bottom and grass blocks on top. 16 | * This class extends BukkitWorldGenerator and overrides the generateChunkData method. 17 | * It is used to create flat worlds in Bukkit. 18 | * 19 | * @author Dev7ex 20 | * @since 20.05.2021 21 | */ 22 | @NoArgsConstructor 23 | public class FlatWorldGenerator extends BukkitWorldGenerator { 24 | 25 | /** 26 | * Constructs a new FlatWorldGenerator with the given plugin. 27 | * 28 | * @param plugin The Bukkit plugin associated with this generator. 29 | */ 30 | public FlatWorldGenerator(@NotNull final Plugin plugin) { 31 | super(plugin); 32 | } 33 | 34 | /** 35 | * Generates the chunk data for a flat world. 36 | * 37 | * @param world The Bukkit world. 38 | * @param random The random number generator. 39 | * @param x The X-coordinate of the chunk. 40 | * @param z The Z-coordinate of the chunk. 41 | * @param biome The biome grid. 42 | * @return The generated chunk data. 43 | */ 44 | @Override 45 | public @NotNull ChunkGenerator.ChunkData generateChunkData(@NotNull final World world, @NotNull final Random random, final int x, final int z, @NotNull final ChunkGenerator.BiomeGrid biome) { 46 | final ChunkGenerator.ChunkData chunkData = super.createChunkData(world); 47 | 48 | // Set bedrock at the bottom 49 | chunkData.setRegion(0, 0, 0, 16, 1, 16, Material.BEDROCK); 50 | 51 | // Set grass blocks on top 52 | chunkData.setRegion(0, 1, 0, 16, 64, 16, Material.GRASS_BLOCK); 53 | 54 | // Set plains biome for all chunks 55 | for (int chunkX = 0; chunkX < 15; chunkX++) { 56 | for (int chunkZ = 0; chunkZ < 15; chunkZ++) { 57 | if (biome.getBiome(chunkX, chunkZ) != Biome.PLAINS) { 58 | biome.setBiome(chunkX, chunkZ, Biome.PLAINS); 59 | } 60 | } 61 | } 62 | return chunkData; 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/generator/defaults/VoidWorldGenerator.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world.generator.defaults; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.world.generator.BukkitWorldGenerator; 4 | import lombok.NoArgsConstructor; 5 | import org.bukkit.Location; 6 | import org.bukkit.Material; 7 | import org.bukkit.World; 8 | import org.bukkit.block.Biome; 9 | import org.bukkit.generator.ChunkGenerator; 10 | import org.bukkit.plugin.Plugin; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.Random; 14 | 15 | /** 16 | * Generates a void world with a single stone block at the spawn location. 17 | * This class extends BukkitWorldGenerator and overrides the generateChunkData method. 18 | * It is used to create void worlds in Bukkit. 19 | * 20 | * @author Dev7ex 21 | * @since 20.05.2021 22 | */ 23 | @NoArgsConstructor 24 | public class VoidWorldGenerator extends BukkitWorldGenerator { 25 | 26 | /** 27 | * Constructs a new VoidWorldGenerator with the given plugin. 28 | * 29 | * @param plugin The Bukkit plugin associated with this generator. 30 | */ 31 | public VoidWorldGenerator(@NotNull final Plugin plugin) { 32 | super(plugin); 33 | } 34 | 35 | /** 36 | * Generates the chunk data for a void world. 37 | * 38 | * @param world The Bukkit world. 39 | * @param random The random number generator. 40 | * @param x The X-coordinate of the chunk. 41 | * @param z The Z-coordinate of the chunk. 42 | * @param biome The biome grid. 43 | * @return The generated chunk data. 44 | */ 45 | @Override 46 | public @NotNull ChunkGenerator.ChunkData generateChunkData(@NotNull final World world, @NotNull final Random random, final int x, final int z, @NotNull final ChunkGenerator.BiomeGrid biome) { 47 | final ChunkGenerator.ChunkData chunkData = super.createChunkData(world); 48 | 49 | // Set a stone block at the center of the world as the spawn location 50 | if ((x == 0) && (z == 0)) { 51 | chunkData.setBlock(0, 63, 0, Material.STONE); 52 | world.setSpawnLocation(new Location(world, 0, 64, 0)); 53 | } 54 | 55 | // Set plains biome for all chunks 56 | for (int chunkX = 0; chunkX < 16; chunkX++) { 57 | for (int chunkZ = 0; chunkZ < 16; chunkZ++) { 58 | if (biome.getBiome(chunkX, chunkZ) != Biome.PLAINS) { 59 | biome.setBiome(chunkX, chunkZ, Biome.PLAINS); 60 | } 61 | } 62 | } 63 | return chunkData; 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/generator/defaults/WaterWorldGenerator.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world.generator.defaults; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.world.generator.BukkitWorldGenerator; 4 | import lombok.NoArgsConstructor; 5 | import org.bukkit.Location; 6 | import org.bukkit.Material; 7 | import org.bukkit.World; 8 | import org.bukkit.block.Biome; 9 | import org.bukkit.generator.ChunkGenerator; 10 | import org.bukkit.plugin.Plugin; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.Random; 14 | 15 | /** 16 | * Generates a water world with a single stone block at the spawn location. 17 | * This class extends BukkitWorldGenerator and overrides the generateChunkData method. 18 | * It is used to create water worlds in Bukkit. 19 | * 20 | * @author Dev7ex 21 | * @since 26.03.2024 22 | */ 23 | @NoArgsConstructor 24 | public class WaterWorldGenerator extends BukkitWorldGenerator { 25 | 26 | /** 27 | * Constructs a new WaterWorldGenerator with the given plugin. 28 | * 29 | * @param plugin The Bukkit plugin associated with this generator. 30 | */ 31 | public WaterWorldGenerator(@NotNull final Plugin plugin) { 32 | super(plugin); 33 | } 34 | 35 | /** 36 | * Generates the chunk data for a water world. 37 | * 38 | * @param world The Bukkit world. 39 | * @param random The random number generator. 40 | * @param x The X-coordinate of the chunk. 41 | * @param z The Z-coordinate of the chunk. 42 | * @param biome The biome grid. 43 | * @return The generated chunk data. 44 | */ 45 | @Override 46 | public @NotNull ChunkGenerator.ChunkData generateChunkData(@NotNull final World world, @NotNull final Random random, final int x, final int z, @NotNull final ChunkGenerator.BiomeGrid biome) { 47 | final ChunkGenerator.ChunkData chunkData = super.createChunkData(world); 48 | 49 | // Set bedrock at the bottom 50 | chunkData.setRegion(0, 0, 0, 16, 1, 16, Material.BEDROCK); 51 | 52 | // Set water blocks covering the surface 53 | chunkData.setRegion(0, 1, 0, 16, 64, 16, Material.WATER); 54 | 55 | // Set a stone block at the center of the world as the spawn location 56 | if ((x == 0) && (z == 0)) { 57 | chunkData.setBlock(0, 63, 0, Material.STONE); 58 | world.setSpawnLocation(new Location(world, 0, 64, 0)); 59 | } 60 | 61 | // Set ocean biome for all chunks 62 | for (int chunkX = 0; chunkX < 15; chunkX++) { 63 | for (int chunkZ = 0; chunkZ < 15; chunkZ++) { 64 | if (biome.getBiome(chunkX, chunkZ) != Biome.OCEAN) { 65 | biome.setBiome(chunkX, chunkZ, Biome.OCEAN); 66 | } 67 | } 68 | } 69 | return chunkData; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/generator/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Classes relevant to generators. 3 | */ 4 | package com.dev7ex.multiworld.api.bukkit.world.generator; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/location/BukkitWorldLocation.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.bukkit.world.location; 2 | 3 | import com.dev7ex.multiworld.api.world.location.WorldLocation; 4 | import lombok.*; 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.Location; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * @author Dev7ex 11 | * @since 30.06.2023 12 | */ 13 | @Setter(AccessLevel.PUBLIC) 14 | @Getter(AccessLevel.PUBLIC) 15 | @Builder(setterPrefix = "set") 16 | @NoArgsConstructor 17 | public class BukkitWorldLocation implements WorldLocation { 18 | 19 | private String worldName; 20 | private double x; 21 | private double z; 22 | private double y; 23 | private double yaw; 24 | private double pitch; 25 | 26 | public BukkitWorldLocation(@NotNull final String worldName, final double x, final double y, final double z, final double yaw, final double pitch) { 27 | this.worldName = worldName; 28 | this.x = x; 29 | this.y = y; 30 | this.z = z; 31 | this.yaw = yaw; 32 | this.pitch = pitch; 33 | } 34 | 35 | public static BukkitWorldLocation of(@NotNull final Location location) { 36 | final BukkitWorldLocation worldLocation = new BukkitWorldLocation(); 37 | worldLocation.setWorldName(location.getWorld().getName()); 38 | worldLocation.setX(location.getX()); 39 | worldLocation.setY(location.getY()); 40 | worldLocation.setZ(location.getZ()); 41 | worldLocation.setYaw(location.getYaw()); 42 | worldLocation.setPitch(location.getPitch()); 43 | return worldLocation; 44 | } 45 | 46 | public static Location to(@NotNull final WorldLocation location) { 47 | return new Location(Bukkit.getWorld(location.getWorldName()), location.getX(), location.getY(), location.getZ(), (float) location.getYaw(), (float) location.getPitch()); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/location/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Classes relevant to locations. 3 | */ 4 | package com.dev7ex.multiworld.api.bukkit.world.location; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-bukkit/src/main/java/com/dev7ex/multiworld/api/bukkit/world/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Classes relevant to worlds. 3 | */ 4 | package com.dev7ex.multiworld.api.bukkit.world; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | multiworld-api 9 | com.dev7ex 10 | 1.7.4-SNAPSHOT 11 | 12 | 13 | MultiWorld-API-Core 14 | multiworld-api-core 15 | 16 | 17 | ${project.source.version} 18 | ${project.source.version} 19 | ${project.source.encoding} 20 | 21 | 22 | 23 | 24 | com.dev7ex 25 | facilis-common-core 26 | ${dependency.facilis.common.version} 27 | provided 28 | 29 | 30 | 31 | org.projectlombok 32 | lombok 33 | ${dependency.lombok.version} 34 | provided 35 | 36 | 37 | 38 | org.jetbrains 39 | annotations 40 | ${dependency.annotations.version} 41 | provided 42 | 43 | 44 | 45 | 46 | ${project.name}-${project.version} 47 | clean package 48 | 49 | 50 | 51 | . 52 | src/main/resources 53 | true 54 | 55 | 56 | **/.*.* 57 | 58 | 59 | 60 | 61 | 62 | 63 | org.apache.maven.plugins 64 | maven-shade-plugin 65 | ${maven.shade.plugin.version} 66 | 67 | 68 | package 69 | 70 | shade 71 | 72 | 73 | 74 | 75 | 76 | 77 | org.apache.maven.plugins 78 | maven-compiler-plugin 79 | ${maven.compiler.plugin.version} 80 | 81 | true 82 | lines,vars,source 83 | UTF-8 84 | true 85 | true 86 | ${project.source.version} 87 | ${project.source.version} 88 | 89 | 90 | 91 | 92 | org.apache.maven.plugins 93 | maven-javadoc-plugin 94 | ${maven.javadoc.plugin.version} 95 | 96 | 97 | attach-javadocs 98 | 99 | jar 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/MultiWorldApi.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api; 2 | 3 | import com.dev7ex.multiworld.api.translation.TranslationProvider; 4 | import com.dev7ex.multiworld.api.user.WorldUserProvider; 5 | import com.dev7ex.multiworld.api.world.WorldConfiguration; 6 | import com.dev7ex.multiworld.api.world.WorldManager; 7 | import com.dev7ex.multiworld.api.world.WorldProvider; 8 | import com.dev7ex.multiworld.api.world.generator.WorldGeneratorProvider; 9 | import org.jetbrains.annotations.NotNull; 10 | import org.jetbrains.annotations.Nullable; 11 | 12 | import java.io.File; 13 | 14 | /** 15 | * Interface for interacting with the MultiWorld API. 16 | * Provides access to various functionalities and data related to MultiWorld. 17 | * 18 | *

This interface serves as the main entry point for retrieving configurations, providers, 19 | * and managers related to the MultiWorld system.

20 | * 21 | * @author Dev7ex 22 | * @since 20.12.2022 23 | */ 24 | public interface MultiWorldApi { 25 | 26 | /** 27 | * Retrieves the configuration settings for MultiWorld. 28 | * 29 | * @return The {@link MultiWorldApiConfiguration} instance containing the configuration settings. 30 | */ 31 | @NotNull 32 | MultiWorldApiConfiguration getConfiguration(); 33 | 34 | /** 35 | * Retrieves the translation provider. 36 | * 37 | * @return The {@link TranslationProvider} used for handling translations. 38 | */ 39 | @NotNull 40 | TranslationProvider getTranslationProvider(); 41 | 42 | /** 43 | * Retrieves the user provider for worlds. 44 | * 45 | * @return The {@link WorldUserProvider} instance responsible for managing world users. 46 | */ 47 | @NotNull 48 | WorldUserProvider getUserProvider(); 49 | 50 | /** 51 | * Retrieves the provider for generating worlds. 52 | * 53 | * @return The {@link WorldGeneratorProvider} responsible for world generation. 54 | */ 55 | @NotNull 56 | WorldGeneratorProvider getWorldGeneratorProvider(); 57 | 58 | /** 59 | * Retrieves the configuration settings for a world. 60 | * 61 | * @return The {@link WorldConfiguration} instance representing world-specific settings. 62 | */ 63 | @NotNull 64 | WorldConfiguration getWorldConfiguration(); 65 | 66 | /** 67 | * Retrieves the manager for managing worlds. 68 | * 69 | * @return The {@link WorldManager} instance responsible for managing worlds. 70 | */ 71 | @NotNull 72 | WorldManager getWorldManager(); 73 | 74 | /** 75 | * Retrieves the provider for accessing information about worlds. 76 | * 77 | * @return The {@link WorldProvider} instance offering world-related data access. 78 | */ 79 | @NotNull 80 | WorldProvider getWorldProvider(); 81 | 82 | /** 83 | * Retrieves the folder where user-related data is stored. 84 | * 85 | * @return The {@link File} instance representing the user data folder, or null if unavailable. 86 | */ 87 | @Nullable 88 | File getUserFolder(); 89 | 90 | /** 91 | * Retrieves the folder where backups of worlds are stored. 92 | * 93 | * @return The {@link File} instance representing the backup folder, or null if unavailable. 94 | */ 95 | @Nullable 96 | File getBackupFolder(); 97 | 98 | } 99 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/MultiWorldApiConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api; 2 | 3 | import com.dev7ex.common.collect.map.ParsedMap; 4 | import com.dev7ex.multiworld.api.world.WorldDefaultProperty; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.text.SimpleDateFormat; 8 | import java.util.List; 9 | 10 | /** 11 | * Interface for accessing configuration settings of the MultiWorld plugin. 12 | * Provides methods to retrieve various configuration parameters. 13 | * 14 | * @author Dev7ex 15 | * @since 18.06.2023 16 | */ 17 | public interface MultiWorldApiConfiguration { 18 | 19 | /** 20 | * Retrieves a string value from the configuration. 21 | * 22 | * @param path The path to the configuration value. 23 | * @return The string value at the specified path. 24 | */ 25 | String getString(@NotNull final String path); 26 | 27 | /** 28 | * Retrieves a boolean value from the configuration. 29 | * 30 | * @param path The path to the configuration value. 31 | * @return The boolean value at the specified path. 32 | */ 33 | boolean getBoolean(@NotNull final String path); 34 | 35 | /** 36 | * Retrieves an integer value from the configuration. 37 | * 38 | * @param path The path to the configuration value. 39 | * @return The integer value at the specified path. 40 | */ 41 | int getInteger(@NotNull final String path); 42 | 43 | /** 44 | * Retrieves a message from the configuration. 45 | * 46 | * @param path The path to the configuration value. 47 | * @return The message at the specified path. 48 | */ 49 | String getMessage(@NotNull final String path); 50 | 51 | /** 52 | * Retrieves the prefix used in messages from the configuration. 53 | * 54 | * @return The message prefix. 55 | */ 56 | String getPrefix(); 57 | 58 | /** 59 | * Retrieves the time format used in the plugin. 60 | * 61 | * @return The time format. 62 | */ 63 | SimpleDateFormat getTimeFormat(); 64 | 65 | /** 66 | * Checks if auto game mode is enabled. 67 | * 68 | * @return True if auto game mode is enabled, otherwise false. 69 | */ 70 | boolean isAutoGameModeEnabled(); 71 | 72 | /** 73 | * Checks if world linking is enabled. 74 | * 75 | * @return True if world linking is enabled, otherwise false. 76 | */ 77 | boolean isWorldLinkEnabled(); 78 | 79 | /** 80 | * Checks if the automatic world unloading system is enabled. 81 | * 82 | * This method indicates whether the system responsible for automatically 83 | * unloading inactive or unused worlds is currently active. When enabled, 84 | * worlds that have not been accessed for a certain period will be 85 | * automatically unloaded to free up resources. 86 | * 87 | * @return {@code true} if the auto-unload system is enabled, {@code false} otherwise. 88 | */ 89 | boolean isAutoUnloadSystemEnabled(); 90 | 91 | 92 | /** 93 | * Checks if Nether world access via command is allowed. 94 | * 95 | * @return True if Nether world access via command is allowed, otherwise false. 96 | */ 97 | boolean canNetherWorldAccessViaCommand(); 98 | 99 | /** 100 | * Checks if End world access via command is allowed. 101 | * 102 | * @return True if End world access via command is allowed, otherwise false. 103 | */ 104 | boolean canEndWorldAccessViaCommand(); 105 | 106 | /** 107 | * Retrieves the delay in seconds before a world is automatically unloaded. 108 | * 109 | * Worlds that are no longer needed or are inactive will be unloaded after 110 | * this specified delay. The delay helps to ensure that resources are freed 111 | * efficiently, while allowing for any pending processes or tasks related to 112 | * the world to be completed. 113 | * 114 | * @return the delay in seconds before the world is automatically unloaded. 115 | */ 116 | long getAutoUnloadSystemDelay(); 117 | 118 | long getAutoUnloadLoadDelay(); 119 | 120 | 121 | /** 122 | * Retrieves the default properties for worlds. 123 | * 124 | * @return The default properties for worlds. 125 | */ 126 | ParsedMap getDefaultProperties(); 127 | 128 | /** 129 | * Retrieves a list of strings from the configuration. 130 | * 131 | * @param path The path to the configuration value. 132 | * @return The list of strings at the specified path. 133 | */ 134 | List getStringList(@NotNull final String path); 135 | 136 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/MultiWorldApiProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | /** 6 | * Acts as a gateway for obtaining an instance of the MultiWorldApi, 7 | * allowing users to manage various aspects across different worlds. 8 | * 9 | * @author Dev7ex 10 | * @since 20.12.2022 11 | */ 12 | public class MultiWorldApiProvider { 13 | 14 | private static MultiWorldApi multiWorldApi; 15 | 16 | /** 17 | * Registers the MultiWorldApi instance. 18 | * 19 | * @param multiWorldApi The MultiWorldApi instance to register. 20 | */ 21 | public static void registerApi(@NotNull final MultiWorldApi multiWorldApi) { 22 | MultiWorldApiProvider.multiWorldApi = multiWorldApi; 23 | } 24 | 25 | /** 26 | * Unregisters the MultiWorldApi instance. 27 | */ 28 | public static void unregisterApi() { 29 | MultiWorldApiProvider.multiWorldApi = null; 30 | } 31 | 32 | /** 33 | * Retrieves the registered MultiWorldApi instance. 34 | * 35 | * @return The registered MultiWorldApi instance. 36 | */ 37 | public static MultiWorldApi getMultiWorldApi() { 38 | return MultiWorldApiProvider.multiWorldApi; 39 | } 40 | 41 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Test 3 | */ 4 | package com.dev7ex.multiworld.api; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/translation/TranslationProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.translation; 2 | 3 | import com.dev7ex.common.io.file.configuration.FileConfiguration; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | import java.io.File; 7 | import java.util.List; 8 | import java.util.Locale; 9 | import java.util.Map; 10 | 11 | /** 12 | * @author Dev7ex 13 | * @since 10.07.2024 14 | */ 15 | public interface TranslationProvider { 16 | 17 | Map getTranslationConfigurations(); 18 | 19 | void register(@NotNull final Locale locale, @NotNull final File file); 20 | 21 | void unregister(@NotNull final Locale locale); 22 | 23 | Locale getDefaultLocale(); 24 | 25 | String getMessage(@NotNull final E entity, @NotNull final String path); 26 | 27 | List getMessageList(@NotNull final E entity, @NotNull final String path); 28 | 29 | } 30 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/user/WorldUser.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.user; 2 | 3 | import com.dev7ex.multiworld.api.world.WorldHolder; 4 | import com.dev7ex.multiworld.api.world.location.WorldLocation; 5 | import org.jetbrains.annotations.NotNull; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | import java.util.UUID; 9 | 10 | /** 11 | * Represents a user within the multi-world system. 12 | * This interface provides methods to access user-related information and settings. 13 | * 14 | * @author Dev7ex 15 | * @since 18.06.2023 16 | */ 17 | public interface WorldUser { 18 | 19 | /** 20 | * Gets the unique identifier of the user. 21 | * 22 | * @return The UUID of the user. 23 | */ 24 | UUID getUniqueId(); 25 | 26 | /** 27 | * Gets the name of the user. 28 | * 29 | * @return The name of the user. 30 | */ 31 | String getName(); 32 | 33 | /** 34 | * Gets the configuration of the user. 35 | * 36 | * @return The configuration of the user. 37 | */ 38 | WorldUserConfiguration getConfiguration(); 39 | 40 | /** 41 | * Sets the configuration of the user. 42 | * 43 | * @param configuration The new configuration of the user. 44 | */ 45 | void setConfiguration(@NotNull final WorldUserConfiguration configuration); 46 | 47 | /** 48 | * Gets the last known location of the user. 49 | * 50 | * @return The last known location of the user, or null if not available. 51 | */ 52 | @Nullable 53 | WorldLocation getLastLocation(); 54 | 55 | /** 56 | * Sets the last known location of the user. 57 | * 58 | * @param location The last known location of the user. 59 | */ 60 | void setLastLocation(@Nullable final WorldLocation location); 61 | 62 | long getFirstLogin(); 63 | 64 | void setFirstLogin(final long firstLogin); 65 | 66 | /** 67 | * Gets the timestamp of the user's last login. 68 | * 69 | * @return The timestamp of the user's last login. 70 | */ 71 | long getLastLogin(); 72 | 73 | /** 74 | * Sets the timestamp of the user's last login. 75 | * 76 | * @param lastLogin The timestamp of the user's last login. 77 | */ 78 | void setLastLogin(final long lastLogin); 79 | 80 | /** 81 | * Sends a message to the user. 82 | * 83 | * @param message The message to send. 84 | */ 85 | void sendMessage(@NotNull final String message); 86 | 87 | /** 88 | * Teleports the user to the specified world. 89 | * 90 | * @param worldHolder The WorldHolder representing the destination world. 91 | */ 92 | void teleport(@NotNull final WorldHolder worldHolder); 93 | 94 | } 95 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/user/WorldUserConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.user; 2 | 3 | import com.dev7ex.common.collect.map.ParsedMap; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | /** 7 | * Represents the configuration of a user within the multi-world system. 8 | * This interface provides methods to read and write user configuration data. 9 | * 10 | * @author Dev7ex 11 | * @since 18.06.2023 12 | */ 13 | public interface WorldUserConfiguration { 14 | 15 | /** 16 | * Reads the user configuration data. 17 | * 18 | * @return A parsed map containing the user configuration data. 19 | */ 20 | ParsedMap read(); 21 | 22 | /** 23 | * Reads specific properties from the user configuration data. 24 | * 25 | * @param properties The properties to read. 26 | * @return A parsed map containing the specified user configuration data. 27 | */ 28 | ParsedMap read(@NotNull final WorldUserProperty... properties); 29 | 30 | /** 31 | * Writes user configuration data. 32 | * 33 | * @param userData The user configuration data to write. 34 | */ 35 | void write(@NotNull final ParsedMap userData); 36 | 37 | /** 38 | * Saves the user configuration data to a file. 39 | */ 40 | void save(); 41 | 42 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/user/WorldUserProperty.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.user; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.Getter; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * Represents properties associated with a user in the multi-world system. 9 | * These properties include unique ID, name, last location, and last login time. 10 | * 11 | * @author Dev7ex 12 | * @since 18.06.2023 13 | */ 14 | @Getter(AccessLevel.PUBLIC) 15 | public enum WorldUserProperty { 16 | 17 | UNIQUE_ID("unique-id"), 18 | NAME("name"), 19 | LAST_LOCATION("last-location"), 20 | FIRST_LOGIN("first-login"), 21 | LAST_LOGIN("last-login"); 22 | 23 | private final String storagePath; 24 | 25 | WorldUserProperty(@NotNull final String storagePath) { 26 | this.storagePath = storagePath; 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/user/WorldUserProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.user; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | import java.util.Map; 6 | import java.util.Optional; 7 | import java.util.UUID; 8 | 9 | /** 10 | * Provides methods for managing user data within the multi-world system. 11 | * Users can be registered, unregistered, retrieved by unique ID or name, 12 | * and their data can be saved. 13 | * 14 | * @param The type of WorldUser implementation. 15 | * @author Dev7ex 16 | * @since 18.06.2023 17 | */ 18 | public interface WorldUserProvider { 19 | 20 | /** 21 | * Registers a user in the multi-world system. 22 | * 23 | * @param user The user to register. 24 | */ 25 | void registerUser(@NotNull final T user); 26 | 27 | /** 28 | * Unregisters a user from the multi-world system. 29 | * 30 | * @param uniqueId The unique ID of the user to unregister. 31 | */ 32 | void unregisterUser(@NotNull final UUID uniqueId); 33 | 34 | /** 35 | * Retrieves a user by their unique ID. 36 | * 37 | * @param uniqueId The unique ID of the user to retrieve. 38 | * @return An optional containing the user if found, otherwise empty. 39 | */ 40 | Optional getUser(@NotNull final UUID uniqueId); 41 | 42 | /** 43 | * Retrieves a user by their name. 44 | * 45 | * @param name The name of the user to retrieve. 46 | * @return An optional containing the user if found, otherwise empty. 47 | */ 48 | Optional getUser(@NotNull final String name); 49 | 50 | /** 51 | * Saves the data of a user. 52 | * 53 | * @param user The user whose data to save. 54 | */ 55 | void saveUser(@NotNull final T user); 56 | 57 | /** 58 | * Saves specific properties of a user. 59 | * 60 | * @param user The user whose data to save. 61 | * @param properties The properties to save. 62 | */ 63 | void saveUser(@NotNull final T user, @NotNull final WorldUserProperty... properties); 64 | 65 | /** 66 | * Retrieves a map of all registered users, keyed by their unique ID. 67 | * 68 | * @return A map containing all registered users. 69 | */ 70 | Map getUsers(); 71 | 72 | } 73 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/user/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Classes relevant to user. 3 | */ 4 | package com.dev7ex.multiworld.api.user; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/WorldConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world; 2 | 3 | import com.dev7ex.common.collect.map.ParsedMap; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | import java.util.Map; 7 | 8 | /** 9 | * Represents a configuration for a world. 10 | * This interface provides methods for adding, removing, and retrieving properties of a world. 11 | * 12 | * @param The type of WorldHolder associated with this configuration. 13 | * @author Dev7ex 14 | * @since 18.06.2023 15 | */ 16 | public interface WorldConfiguration { 17 | 18 | /** 19 | * Adds the specified world holder to this configuration. 20 | * 21 | * @param worldHolder The world holder to add. 22 | */ 23 | void add(@NotNull final T worldHolder); 24 | 25 | /** 26 | * Removes the specified world holder from this configuration. 27 | * 28 | * @param worldHolder The world holder to remove. 29 | */ 30 | void remove(@NotNull final T worldHolder); 31 | 32 | /** 33 | * Removes the world with the specified name from this configuration. 34 | * 35 | * @param name The name of the world to remove. 36 | */ 37 | void remove(@NotNull final String name); 38 | 39 | /** 40 | * Checks if this configuration contains the world with the specified name. 41 | * 42 | * @param name The name of the world to check. 43 | * @return true if this configuration contains the world, otherwise false. 44 | */ 45 | boolean contains(@NotNull final String name); 46 | 47 | /** 48 | * Gets the value of the specified property for the given world holder. 49 | * 50 | * @param worldHolder The world holder. 51 | * @param property The property to retrieve. 52 | * @return The value of the property. 53 | */ 54 | Object getValue(@NotNull final WorldHolder worldHolder, @NotNull final WorldProperty property); 55 | 56 | /** 57 | * Checks if the specified world has the given property. 58 | * 59 | * @param name The name of the world. 60 | * @param property The property to check. 61 | * @return true if the world has the property, otherwise false. 62 | */ 63 | boolean hasProperty(@NotNull final String name, @NotNull final WorldProperty property); 64 | 65 | /** 66 | * Adds the missing property for the specified world holder. 67 | * 68 | * @param worldHolder The world holder. 69 | * @param property The missing property to add. 70 | */ 71 | void addMissingProperty(@NotNull final T worldHolder, @NotNull final WorldProperty property); 72 | 73 | /** 74 | * Updates the flag for the specified world holder. 75 | * 76 | * @param worldHolder The world holder. 77 | * @param worldFlag The flag to update. 78 | * @param value The new value of the flag. 79 | */ 80 | void updateFlag(@NotNull final T worldHolder, @NotNull final WorldFlag worldFlag, @NotNull final String value); 81 | 82 | /** 83 | * Writes the specified world data to the configuration. 84 | * 85 | * @param worldHolder The world holder. 86 | * @param worldData The world data to write. 87 | */ 88 | void write(@NotNull final T worldHolder, @NotNull final ParsedMap worldData); 89 | 90 | /** 91 | * Writes the specified data for the given property to the configuration. 92 | * 93 | * @param worldHolder The world holder. 94 | * @param property The property. 95 | * @param data The data to write. 96 | */ 97 | void write(@NotNull final T worldHolder, @NotNull final WorldProperty property, @NotNull final Object data); 98 | 99 | /** 100 | * Gets the world holder with the specified name. 101 | * 102 | * @param name The name of the world. 103 | * @return The world holder, or null if not found. 104 | */ 105 | T getWorldHolder(@NotNull final String name); 106 | 107 | /** 108 | * Gets a map of all world holders in this configuration, where the key is the name of the world. 109 | * 110 | * @return A map of world holders. 111 | */ 112 | Map getWorldHolders(); 113 | 114 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/WorldDefaultProperty.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.Getter; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.Arrays; 8 | import java.util.Optional; 9 | 10 | /** 11 | * Represents default properties for worlds. 12 | * This enum provides methods to obtain default property values and their storage paths. 13 | * 14 | * @author Dev7ex 15 | * @since 18.06.2023 16 | */ 17 | @Getter(AccessLevel.PUBLIC) 18 | public enum WorldDefaultProperty { 19 | 20 | AUTO_LOAD_ENABLED("auto-load-enabled", "settings.defaults.auto-load-enabled"), 21 | AUTO_UNLOAD_ENABLED("auto-unload-enabled", "settings.defaults.auto-unload-enabled"), 22 | DIFFICULTY("difficulty", "settings.defaults.difficulty"), 23 | END_PORTAL_ACCESSIBLE("end-portal-accessible", "settings.defaults.end-portal-accessible"), 24 | END_WORLD("end-world", "settings.defaults.end-world"), 25 | GAME_MODE("game-mode", "settings.defaults.game-mode"), 26 | FORCE_GAME_MODE("force-game-mode", "settings.defaults.force-game-mode"), 27 | HUNGER_ENABLED("hunger-enabled", "settings.defaults.hunger-enabled"), 28 | KEEP_SPAWN_IN_MEMORY("keep-spawn-in-memory", "settings.defaults.keep-spawn-in-memory"), 29 | NETHER_PORTAL_ACCESSIBLE("nether-portal-accessible", "settings.defaults.nether-portal-accessible"), 30 | NETHER_WORLD("nether-world", "settings.defaults.nether-world"), 31 | NORMAL_WORLD("world", "settings.defaults.normal-world"), 32 | PVP_ENABLED("pvp-enabled", "settings.defaults.pvp-enabled"), 33 | RECEIVE_ACHIEVEMENTS("receive-achievements", "settings.defaults.receive-achievements"), 34 | REDSTONE_ENABLED("redstone-enabled", "settings.defaults.redstone-enabled"), 35 | SPAWN_ANIMALS("spawn-animals", "settings.defaults.spawn-animals"), 36 | SPAWN_ENTITIES("spawn-entities", "settings.defaults.spawn-entities"), 37 | SPAWN_MONSTERS("spawn-monsters", "settings.defaults.spawn-monsters"), 38 | WEATHER_ENABLED("weather-enabled", "settings.defaults.weather-enabled"), 39 | WHITELIST_ENABLED("whitelist-enabled", "settings.defaults.whitelist-enabled"), 40 | WORLD("world", "settings.defaults.normal-world"); 41 | 42 | 43 | 44 | private final String name; 45 | private final String storagePath; 46 | 47 | WorldDefaultProperty(@NotNull final String name, @NotNull final String storagePath) { 48 | this.name = name; 49 | this.storagePath = storagePath; 50 | } 51 | 52 | /** 53 | * Returns an Optional containing the WorldDefaultProperty enum constant with the specified name, 54 | * or an empty Optional if no such constant exists. 55 | * 56 | * @param name The name of the WorldDefaultProperty constant to find. 57 | * @return An Optional containing the found WorldDefaultProperty constant, or an empty Optional if not found. 58 | */ 59 | public static Optional fromString(final String name) { 60 | return Arrays.stream(WorldDefaultProperty.values()).filter(property -> property.name.equalsIgnoreCase(name)).findFirst(); 61 | } 62 | 63 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/WorldEnvironment.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | import java.util.Arrays; 6 | import java.util.List; 7 | import java.util.Optional; 8 | 9 | /** 10 | * Represents different types of world environments. 11 | * This enum provides methods to convert between WorldType and WorldEnvironment, 12 | * as well as to obtain string representations of the environment. 13 | * 14 | * @author Dev7ex 15 | * @since 26.06.2023 16 | */ 17 | public enum WorldEnvironment { 18 | 19 | CUSTOM, 20 | NORMAL, 21 | NETHER, 22 | THE_END; 23 | 24 | /** 25 | * Converts a WorldType to its corresponding WorldEnvironment. 26 | * 27 | * @param worldType The WorldType to convert. 28 | * @return The corresponding WorldEnvironment. 29 | */ 30 | public static WorldEnvironment fromType(final WorldType worldType) { 31 | return switch (worldType) { 32 | case THE_END -> WorldEnvironment.THE_END; 33 | case NETHER -> WorldEnvironment.NETHER; 34 | case NORMAL -> WorldEnvironment.NORMAL; 35 | default -> WorldEnvironment.CUSTOM; 36 | }; 37 | } 38 | 39 | /** 40 | * Returns a list of string representations of all available WorldEnvironment values. 41 | * 42 | * @return A list of string representations of WorldEnvironment values. 43 | */ 44 | public static List toStringList() { 45 | return Arrays.stream(WorldEnvironment.values()).map(Enum::name).toList(); 46 | } 47 | 48 | /** 49 | * Returns an Optional containing the WorldEnvironment enum constant with the specified name, 50 | * or an empty Optional if no such constant exists. 51 | * 52 | * @param name The name of the WorldEnvironment constant to find. 53 | * @return An Optional containing the found WorldEnvironment constant, or an empty Optional if not found. 54 | */ 55 | public static Optional fromString(@NotNull final String name) { 56 | return Arrays.stream(WorldEnvironment.values()).filter(worldType -> worldType.name().equalsIgnoreCase(name)).findFirst(); 57 | } 58 | 59 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/WorldFlag.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.Getter; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.Arrays; 8 | import java.util.List; 9 | import java.util.Optional; 10 | 11 | /** 12 | * Represents flags that can be set for a world, such as whether achievements are received or monsters spawn. 13 | * This enum provides methods to access the storage path and possible values for each flag. 14 | * 15 | * @author Dev7ex 16 | * @since 23.05.2021 17 | */ 18 | @Getter(AccessLevel.PUBLIC) 19 | public enum WorldFlag { 20 | 21 | AUTO_LOAD_ENABLED("flag.auto-load-enabled", List.of("false", "true")), 22 | AUTO_UNLOAD_ENABLED("flag.auto-unload-enabled", List.of("false", "true")), 23 | DIFFICULTY("flag.difficulty", List.of("EASY", "HARD", "NORMAL", "PEACEFUL")), 24 | END_PORTAL_ACCESSIBLE("flag.end-portal-accessible", List.of("false", "true")), 25 | GAME_MODE("flag.game-mode", List.of("ADVENTURE", "CREATIVE", "SURVIVAL", "SPECTATOR")), 26 | FORCE_GAME_MODE("flag.force-game-mode", List.of("false", "true", "false-with-permission")), 27 | HUNGER_ENABLED("flag.hunger-enabled", List.of("false", "true")), 28 | KEEP_SPAWN_IN_MEMORY("flag.keep-spawn-in-memory", List.of("false", "true")), 29 | NETHER_PORTAL_ACCESSIBLE("flag.nether-portal-accessible", List.of("false", "true")), 30 | PVP_ENABLED("flag.pvp-enabled", List.of("false", "true")), 31 | RECEIVE_ACHIEVEMENTS("flag.receive-achievements", List.of("false", "true")), 32 | REDSTONE_ENABLED("flag.redstone-enabled", List.of("false", "true")), 33 | SPAWN_ANIMALS("flag.spawn-animals", List.of("false", "true")), 34 | SPAWN_ENTITIES("flag.spawn-entities", List.of("false", "true")), 35 | SPAWN_MONSTERS("flag.spawn-monsters", List.of("false", "true")), 36 | WEATHER_ENABLED("flag.weather-enabled", List.of("false", "true")); 37 | 38 | private final String storagePath; 39 | private final List values; 40 | 41 | /** 42 | * Constructs a WorldFlag with the given storage path and possible values. 43 | * 44 | * @param storagePath The storage path of the flag. 45 | * @param values The possible values of the flag. 46 | */ 47 | WorldFlag(@NotNull final String storagePath, @NotNull final List values) { 48 | this.storagePath = storagePath; 49 | this.values = values; 50 | } 51 | 52 | /** 53 | * Returns a list of string representations of all available WorldFlag values. 54 | * 55 | * @return A list of string representations of WorldFlag values. 56 | */ 57 | public static List toStringList() { 58 | return Arrays.stream(WorldFlag.values()).map(Enum::name).toList(); 59 | } 60 | 61 | /** 62 | * Returns an Optional containing the WorldFlag enum constant with the specified name, 63 | * or an empty Optional if no such constant exists. 64 | * 65 | * @param name The name of the WorldFlag constant to find. 66 | * @return An Optional containing the found WorldFlag constant, or an empty Optional if not found. 67 | */ 68 | public static Optional fromString(final String name) { 69 | return Arrays.stream(WorldFlag.values()).filter(worldFlag -> worldFlag.name().equalsIgnoreCase(name)).findFirst(); 70 | } 71 | 72 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/WorldProperty.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.Getter; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.Arrays; 8 | import java.util.Optional; 9 | 10 | /** 11 | * Represents properties associated with a world. 12 | * Each property has a storage path and can be modifiable. 13 | * Provides methods to retrieve properties based on their storage path. 14 | * 15 | * @author Dev7ex 16 | * @since 18.06.2023 17 | */ 18 | @Getter(AccessLevel.PUBLIC) 19 | public enum WorldProperty { 20 | 21 | AUTO_LOAD_ENABLED("flag.auto-load-enabled", true), 22 | AUTO_UNLOAD_ENABLED("flag.auto-unload-enabled", true), 23 | CREATION_TIMESTAMP("creation-timestamp", true), 24 | CREATOR_NAME("creator-name", true), 25 | DIFFICULTY("flag.difficulty", true), 26 | END_PORTAL_ACCESSIBLE("flag.end-portal-accessible", true), 27 | ENVIRONMENT("generation.environment", false), 28 | GAME_MODE("flag.game-mode", true), 29 | FORCE_GAME_MODE("flag.force-game-mode", true), 30 | GENERATOR("generation.generator", false), 31 | HUNGER_ENABLED("flag.hunger-enabled", true), 32 | KEEP_SPAWN_IN_MEMORY("flag.keep-spawn-in-memory", true), 33 | LINKED_END_WORLD("end-world", true), 34 | LINKED_NETHER_WORLD("nether-world", true), 35 | LINKED_OVERWORLD("overworld", true), 36 | NETHER_PORTAL_ACCESSIBLE("flag.nether-portal-accessible", true), 37 | PVP_ENABLED("flag.pvp-enabled", true), 38 | RECEIVE_ACHIEVEMENTS("flag.receive-achievements", true), 39 | REDSTONE_ENABLED("flag.redstone-enabled", true), 40 | SPAWN_ANIMALS("flag.spawn-animals", true), 41 | SPAWN_ENTITIES("flag.spawn-entities", true), 42 | SPAWN_MONSTERS("flag.spawn-monsters", true), 43 | TYPE("generation.type", true), 44 | WEATHER_ENABLED("flag.weather-enabled", true), 45 | WHITELIST("whitelist.entries", true), 46 | WHITELIST_ENABLED("whitelist.enabled", true); 47 | 48 | private final String storagePath; 49 | private final boolean modifiable; 50 | 51 | WorldProperty(@NotNull final String storagePath, final boolean modifiable) { 52 | this.storagePath = storagePath; 53 | this.modifiable = modifiable; 54 | } 55 | 56 | /** 57 | * Retrieves a WorldProperty enum constant based on its storage path. 58 | * 59 | * @param storagePath The storage path of the property. 60 | * @return An Optional containing the matching WorldProperty, or empty if not found. 61 | */ 62 | public static Optional fromStoragePath(@NotNull final String storagePath) { 63 | return Arrays.stream(WorldProperty.values()) 64 | .filter(property -> property.getStoragePath().equalsIgnoreCase(storagePath)) 65 | .findFirst(); 66 | } 67 | 68 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/WorldProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | import java.util.Map; 6 | import java.util.Optional; 7 | 8 | /** 9 | * A provider interface for managing worlds. 10 | * Implementations of this interface handle the registration, retrieval, 11 | * and configuration of world holders. 12 | * 13 | * @param The type of world holder managed by this provider. 14 | * @author Dev7ex 15 | * @since 18.06.2023 16 | */ 17 | public interface WorldProvider { 18 | 19 | /** 20 | * Registers a new world holder. 21 | * 22 | * @param worldHolder The world holder to register. 23 | */ 24 | void register(@NotNull final T worldHolder); 25 | 26 | /** 27 | * Unregisters a world holder by its name. 28 | * 29 | * @param name The name of the world holder to unregister. 30 | */ 31 | void unregister(@NotNull final String name); 32 | 33 | /** 34 | * Checks if a world holder with the given name is registered. 35 | * 36 | * @param name The name of the world holder to check. 37 | * @return True if the world holder is registered, false otherwise. 38 | */ 39 | boolean isRegistered(@NotNull final String name); 40 | 41 | /** 42 | * Retrieves a world holder by its name. 43 | * 44 | * @param name The name of the world holder to retrieve. 45 | * @return An Optional containing the retrieved world holder, or empty if not found. 46 | */ 47 | Optional getWorldHolder(@NotNull final String name); 48 | 49 | T getDefaultWorldHolder(); 50 | 51 | /** 52 | * Retrieves all registered world holders. 53 | * 54 | * @return A map of world holder names to their corresponding world holders. 55 | */ 56 | Map getWorldHolders(); 57 | 58 | /** 59 | * Retrieves the configuration associated with this world provider. 60 | * 61 | * @return The configuration of the world provider. 62 | */ 63 | WorldConfiguration getConfiguration(); 64 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/WorldType.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.Getter; 5 | 6 | import java.util.Arrays; 7 | import java.util.List; 8 | import java.util.Optional; 9 | 10 | /** 11 | * An enumeration representing different types of worlds. 12 | * Each world type has a boolean flag indicating if it belongs to the overworld. 13 | * 14 | * @author Dev7ex 15 | * @since 20.05.2021 16 | */ 17 | @Getter(AccessLevel.PUBLIC) 18 | public enum WorldType { 19 | 20 | /** 21 | * Represents a custom world type. 22 | */ 23 | CUSTOM(false), 24 | 25 | /** 26 | * Represents an end world type. 27 | */ 28 | THE_END(false), 29 | 30 | /** 31 | * Represents a nether world type. 32 | */ 33 | NETHER(false), 34 | 35 | /** 36 | * Represents a normal world type. 37 | */ 38 | NORMAL(true); 39 | 40 | private final boolean overWorld; 41 | 42 | /** 43 | * Constructs a WorldType with the given overworld flag. 44 | * 45 | * @param overWorld True if the world belongs to the overworld, false otherwise. 46 | */ 47 | WorldType(final boolean overWorld) { 48 | this.overWorld = overWorld; 49 | } 50 | 51 | /** 52 | * Retrieves a list of string representations of all WorldType values. 53 | * 54 | * @return A list of string representations of WorldType values. 55 | */ 56 | public static List toStringList() { 57 | return Arrays.stream(WorldType.values()).map(Enum::name).toList(); 58 | } 59 | 60 | /** 61 | * Retrieves a WorldType enum value from its string representation. 62 | * 63 | * @param name The string representation of the WorldType. 64 | * @return An Optional containing the corresponding WorldType enum value, or empty if not found. 65 | */ 66 | public static Optional fromString(final String name) { 67 | return Arrays.stream(WorldType.values()) 68 | .filter(worldType -> worldType.name().equalsIgnoreCase(name.toUpperCase())) 69 | .findFirst(); 70 | } 71 | 72 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/biome/BiomeHolder.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world.biome; 2 | 3 | /** 4 | * @author Dev7ex 5 | * @since 23.02.2024 6 | */ 7 | public interface BiomeHolder { 8 | 9 | V getBiome(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/generator/WorldGenerator.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world.generator; 2 | 3 | /** 4 | * Represents a world generator. 5 | * Implementations of this interface provide methods for generating worlds. 6 | * 7 | * @author Dev7ex 8 | * @since 26.03.2024 9 | */ 10 | public interface WorldGenerator { 11 | 12 | /** 13 | * Gets the name of the world generator. 14 | * 15 | * @return The name of the world generator. 16 | */ 17 | default String getName() { 18 | return this.getClass().getSimpleName(); 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/generator/WorldGeneratorHolder.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world.generator; 2 | 3 | /** 4 | * Represents a holder for a world generator. 5 | * Implementations of this interface provide methods to retrieve the name of the world generator. 6 | * 7 | * @author Dev7ex 8 | * @since 06.06.2024 9 | */ 10 | public interface WorldGeneratorHolder { 11 | 12 | /** 13 | * Gets the name of the world generator. 14 | * 15 | * @return The name of the world generator. 16 | */ 17 | String getName(); 18 | 19 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/generator/WorldGeneratorProperty.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world.generator; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.Getter; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * @author Dev7ex 9 | * @since 07.06.2024 10 | */ 11 | @Getter(AccessLevel.PUBLIC) 12 | public enum WorldGeneratorProperty { 13 | 14 | NAME("name"), 15 | AUTHOR("author"), 16 | SETTINGS_SPAWN_X("settings.spawn.x"), 17 | SETTINGS_SPAWN_Y("settings.spawn.y"), 18 | SETTINGS_SPAWN_Z("settings.spawn.z"), 19 | ENVIRONMENT("environment"), 20 | SEED("seed"), 21 | TYPE("type"), 22 | GENERATOR("generator"), 23 | HARDCORE("hardcore"), 24 | GENERATE_STRUCTURES("generate-structures"), 25 | SINGLE_BIOME("single-biome"), 26 | BIOME("biome"), 27 | BIOMES("biomes"); 28 | 29 | private final String storagePath; 30 | 31 | WorldGeneratorProperty(@NotNull final String storagePath) { 32 | this.storagePath = storagePath; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/generator/WorldGeneratorProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world.generator; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | /** 7 | * Represents a provider for world generators. 8 | * Implementations of this interface provide methods to retrieve a map of world generators. 9 | * 10 | * @param The type of WorldGeneratorHolder. 11 | * @since 29.06.2023 12 | */ 13 | public interface WorldGeneratorProvider { 14 | 15 | /** 16 | * Retrieves a map of custom world generators. 17 | * 18 | * @return A map containing instances of WorldGeneratorHolder as keys and their corresponding world generator names as values. 19 | */ 20 | Map getCustomGenerators(); 21 | 22 | /** 23 | * Retrieves a map of file-based world generators. 24 | * 25 | * @return A map containing instances of WorldGeneratorHolder as keys and their corresponding world generators as values. 26 | */ 27 | Map getFileGenerators(); 28 | 29 | /** 30 | * Retrieves a map of default world generators. 31 | * 32 | * @return A map containing instances of WorldGeneratorHolder as keys and their corresponding default world generators as values. 33 | */ 34 | List getDefaultGenerators(); 35 | 36 | /** 37 | * Checks if a custom world generator is registered. 38 | * 39 | * @param generator The name of the generator to check. 40 | * @return True if the generator is registered, false otherwise. 41 | */ 42 | boolean isRegistered(String generator); 43 | 44 | List getAllGenerators(); 45 | 46 | } 47 | -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/location/WorldLocation.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.api.world.location; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | /** 6 | * Represents a location in a world. 7 | * This interface provides methods for accessing and modifying the coordinates and orientation of the location. 8 | * 9 | * @author Dev7ex 10 | * @since 30.06.2023 11 | */ 12 | public interface WorldLocation { 13 | 14 | /** 15 | * Gets the name of the world associated with this location. 16 | * 17 | * @return The name of the world. 18 | */ 19 | String getWorldName(); 20 | 21 | /** 22 | * Sets the name of the world associated with this location. 23 | * 24 | * @param worldName The name of the world. 25 | */ 26 | void setWorldName(@NotNull final String worldName); 27 | 28 | /** 29 | * Gets the x-coordinate of this location. 30 | * 31 | * @return The x-coordinate. 32 | */ 33 | double getX(); 34 | 35 | /** 36 | * Sets the x-coordinate of this location. 37 | * 38 | * @param x The x-coordinate. 39 | */ 40 | void setX(final double x); 41 | 42 | /** 43 | * Gets the y-coordinate of this location. 44 | * 45 | * @return The y-coordinate. 46 | */ 47 | double getY(); 48 | 49 | /** 50 | * Sets the y-coordinate of this location. 51 | * 52 | * @param y The y-coordinate. 53 | */ 54 | void setY(final double y); 55 | 56 | /** 57 | * Gets the z-coordinate of this location. 58 | * 59 | * @return The z-coordinate. 60 | */ 61 | double getZ(); 62 | 63 | /** 64 | * Sets the z-coordinate of this location. 65 | * 66 | * @param z The z-coordinate. 67 | */ 68 | void setZ(final double z); 69 | 70 | /** 71 | * Gets the yaw of this location. 72 | * 73 | * @return The yaw. 74 | */ 75 | double getYaw(); 76 | 77 | /** 78 | * Sets the yaw of this location. 79 | * 80 | * @param yaw The yaw. 81 | */ 82 | void setYaw(final double yaw); 83 | 84 | /** 85 | * Gets the pitch of this location. 86 | * 87 | * @return The pitch. 88 | */ 89 | double getPitch(); 90 | 91 | /** 92 | * Sets the pitch of this location. 93 | * 94 | * @param pitch The pitch. 95 | */ 96 | void setPitch(final double pitch); 97 | 98 | } -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/location/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Classes relevant to locations. 3 | */ 4 | package com.dev7ex.multiworld.api.world.location; -------------------------------------------------------------------------------- /multiworld-api/multiworld-api-core/src/main/java/com/dev7ex/multiworld/api/world/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Classes relevant to worlds. 3 | */ 4 | package com.dev7ex.multiworld.api.world; -------------------------------------------------------------------------------- /multiworld-api/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | multiworld 9 | com.dev7ex 10 | 1.7.4-SNAPSHOT 11 | 12 | 13 | MultiWorld-API 14 | multiworld-api 15 | pom 16 | 17 | 18 | multiworld-api-core 19 | multiworld-api-bukkit 20 | 21 | 22 | 23 | ${project.source.version} 24 | ${project.source.version} 25 | ${project.source.encoding} 26 | 27 | 28 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/BackCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.multiworld.MultiWorldPlugin; 6 | import com.dev7ex.multiworld.api.bukkit.event.user.WorldUserTeleportWorldEvent; 7 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUser; 8 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 9 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 10 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.command.CommandSender; 13 | import org.bukkit.entity.Player; 14 | import org.jetbrains.annotations.NotNull; 15 | 16 | /** 17 | * @author Dev7ex 18 | * @since 20.05.2021 19 | */ 20 | @BukkitCommandProperties(name = "back", permission = "multiworld.command.world.back") 21 | public class BackCommand extends BukkitCommand { 22 | 23 | private final DefaultTranslationProvider translationProvider; 24 | private final DefaultWorldProvider worldProvider; 25 | 26 | public BackCommand(@NotNull final MultiWorldPlugin plugin) { 27 | super(plugin); 28 | 29 | this.translationProvider = plugin.getTranslationProvider(); 30 | this.worldProvider = plugin.getWorldProvider(); 31 | } 32 | 33 | @Override 34 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 35 | if (!(commandSender instanceof Player player)) { 36 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.no-console-command") 37 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 38 | .replaceAll("%command_name%", super.getName())); 39 | return; 40 | } 41 | 42 | if (arguments.length != 1) { 43 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.back.usage") 44 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 45 | return; 46 | } 47 | final BukkitWorldUser user = MultiWorldPlugin.getInstance() 48 | .getUserProvider() 49 | .getUser(player.getUniqueId()) 50 | .orElseThrow(); 51 | 52 | if (user.getLastLocation() == null) { 53 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.back.world-not-exists") 54 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 55 | .replaceAll("%world_name%", player.getWorld().getName())); 56 | return; 57 | } 58 | 59 | if (MultiWorldPlugin.getInstance().getWorldProvider().getWorldHolder(user.getLastLocation().getWorldName()).isEmpty()) { 60 | commandSender.sendMessage(super.getConfiguration().getString("general.world.not-exists") 61 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 62 | .replaceAll("%world_name%", player.getWorld().getName())); 63 | return; 64 | } 65 | final BukkitWorldHolder currentWorldHolder = this.worldProvider.getWorldHolder(player.getWorld().getName()) 66 | .orElseThrow(); 67 | final BukkitWorldHolder nextWorldHolder = this.worldProvider.getWorldHolder(user.getLastLocation().getWorldName()) 68 | .orElseThrow(); 69 | 70 | if (!nextWorldHolder.isLoaded()) { 71 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.not-loaded") 72 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 73 | .replaceAll("%world_name%", player.getWorld().getName())); 74 | return; 75 | } 76 | 77 | if (user.getLastLocation().getWorldName().equalsIgnoreCase(player.getWorld().getName())) { 78 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.back.already-there") 79 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 80 | .replaceAll("%world_name%", player.getWorld().getName())); 81 | return; 82 | } 83 | final WorldUserTeleportWorldEvent event = new WorldUserTeleportWorldEvent(user, currentWorldHolder, nextWorldHolder); 84 | Bukkit.getPluginManager().callEvent(event); 85 | 86 | if (event.isCancelled()) { 87 | return; 88 | } 89 | player.teleport(nextWorldHolder.getWorld().getSpawnLocation()); 90 | } 91 | 92 | } 93 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/BackupCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 8 | import com.dev7ex.multiworld.world.DefaultWorldManager; 9 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 10 | import org.bukkit.command.CommandSender; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.ArrayList; 14 | import java.util.Collections; 15 | import java.util.List; 16 | 17 | /** 18 | * @author Dev7ex 19 | * @since 19.06.2023 20 | */ 21 | @BukkitCommandProperties(name = "backup", permission = "multiworld.command.world.backup") 22 | public class BackupCommand extends BukkitCommand implements BukkitTabCompleter { 23 | 24 | private final DefaultTranslationProvider translationProvider; 25 | private final DefaultWorldManager worldManager; 26 | private final DefaultWorldProvider worldProvider; 27 | 28 | public BackupCommand(@NotNull final MultiWorldPlugin plugin) { 29 | super(plugin); 30 | 31 | this.translationProvider = plugin.getTranslationProvider(); 32 | this.worldManager = plugin.getWorldManager(); 33 | this.worldProvider = plugin.getWorldProvider(); 34 | } 35 | 36 | @Override 37 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 38 | if (arguments.length != 2) { 39 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.backup.usage") 40 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 41 | return; 42 | } 43 | 44 | if (arguments[1].equalsIgnoreCase("%creator_name%")) { 45 | arguments[1] = arguments[1].replaceAll("%creator_name%", commandSender.getName()); 46 | } 47 | 48 | if (!this.worldProvider.isRegistered(arguments[1])) { 49 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender,"general.world.not-exists") 50 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 51 | .replaceAll("%world_name%", arguments[1])); 52 | return; 53 | } 54 | this.worldManager.createBackup(commandSender.getName(), arguments[1]); 55 | } 56 | 57 | @Override 58 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 59 | if (arguments.length != 2) { 60 | return Collections.emptyList(); 61 | } 62 | return new ArrayList<>(this.worldProvider.getWorldHolders().keySet()); 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/CloneCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 8 | import com.dev7ex.multiworld.world.DefaultWorldManager; 9 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 10 | import org.bukkit.command.CommandSender; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.ArrayList; 14 | import java.util.Collections; 15 | import java.util.List; 16 | 17 | /** 18 | * @author Dev7ex 19 | * @since 26.06.2023 20 | */ 21 | @BukkitCommandProperties(name = "clone", permission = "multiworld.command.world.clone") 22 | public class CloneCommand extends BukkitCommand implements BukkitTabCompleter { 23 | 24 | private final DefaultTranslationProvider translationProvider; 25 | private final DefaultWorldManager worldManager; 26 | private final DefaultWorldProvider worldProvider; 27 | 28 | public CloneCommand(@NotNull final MultiWorldPlugin plugin) { 29 | super(plugin); 30 | 31 | this.translationProvider = plugin.getTranslationProvider(); 32 | this.worldManager = plugin.getWorldManager(); 33 | this.worldProvider = plugin.getWorldProvider(); 34 | } 35 | 36 | @Override 37 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 38 | if (arguments.length != 3) { 39 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "messages.commands.clone.usage") 40 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 41 | return; 42 | } 43 | 44 | if (arguments[2].equalsIgnoreCase("%creator_name%")) { 45 | arguments[2] = arguments[2].replaceAll("%creator_name%", commandSender.getName()); 46 | } 47 | 48 | if (MultiWorldPlugin.getInstance().getWorldProvider().isRegistered(arguments[2])) { 49 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender,"general.world.already-exists") 50 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 51 | .replaceAll("%world_name%", arguments[2])); 52 | return; 53 | } 54 | this.worldManager.cloneWorld(commandSender.getName(), arguments[1], arguments[2]); 55 | } 56 | 57 | @Override 58 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 59 | if (arguments.length != 2) { 60 | return Collections.emptyList(); 61 | } 62 | return new ArrayList<>(this.worldProvider.getWorldHolders().keySet()); 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/DeleteCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.common.io.file.Files; 7 | import com.dev7ex.multiworld.MultiWorldPlugin; 8 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 9 | import com.dev7ex.multiworld.world.DefaultWorldManager; 10 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.command.CommandSender; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | import java.io.File; 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | /** 20 | * @author Dev7ex 21 | * @since 20.05.2021 22 | */ 23 | @BukkitCommandProperties(name = "delete", permission = "multiworld.command.world.delete") 24 | public class DeleteCommand extends BukkitCommand implements BukkitTabCompleter { 25 | 26 | private final DefaultTranslationProvider translationProvider; 27 | private final DefaultWorldManager worldManager; 28 | private final DefaultWorldProvider worldProvider; 29 | 30 | public DeleteCommand(@NotNull final MultiWorldPlugin plugin) { 31 | super(plugin); 32 | 33 | this.translationProvider = plugin.getTranslationProvider(); 34 | this.worldManager = plugin.getWorldManager(); 35 | this.worldProvider = plugin.getWorldProvider(); 36 | } 37 | 38 | @Override 39 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 40 | if (arguments.length != 2) { 41 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "messages.commands.delete.usage") 42 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 43 | return; 44 | } 45 | 46 | if (arguments[1].equalsIgnoreCase("%creator_name%")) { 47 | arguments[1] = arguments[1].replaceAll("%creator_name%", commandSender.getName()); 48 | } 49 | 50 | if (this.worldProvider.getWorldHolder(arguments[1]).isEmpty()) { 51 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.not-exists") 52 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 53 | .replaceAll("%world_name%", arguments[1])); 54 | return; 55 | } 56 | final File worldFolder = new File(Bukkit.getWorldContainer(), arguments[1]); 57 | 58 | if (!worldFolder.exists()) { 59 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.not-exists") 60 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 61 | .replaceAll("%world_name%", arguments[1])); 62 | return; 63 | } 64 | 65 | if ((!Files.containsFile(worldFolder, "level.dat")) && (!Files.containsFile(worldFolder, "session.lock"))) { 66 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.not-exists") 67 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 68 | .replaceAll("%world_name%", arguments[1])); 69 | return; 70 | } 71 | 72 | if (arguments[1].equalsIgnoreCase(MultiWorldPlugin.getInstance().getConfiguration().getString("settings.defaults.normal-world"))) { 73 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.delete.world.delete-locked") 74 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 75 | .replaceAll("%world_name%", arguments[1])); 76 | return; 77 | } 78 | this.worldManager.deleteWorld(commandSender.getName(), arguments[1]); 79 | } 80 | 81 | @Override 82 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 83 | final List worlds = new ArrayList<>(this.worldProvider.getWorldHolders().keySet()); 84 | worlds.remove(super.getConfiguration().getString("settings.defaults.normal-world")); 85 | return worlds; 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/HelpCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.multiworld.MultiWorldPlugin; 6 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 7 | import org.bukkit.command.CommandSender; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | /** 11 | * @author Dev7ex 12 | * @since 18.06.2023 13 | */ 14 | @BukkitCommandProperties(name = "help", permission = "multiworld.command.world") 15 | public class HelpCommand extends BukkitCommand { 16 | 17 | private final DefaultTranslationProvider translationProvider; 18 | 19 | public HelpCommand(final MultiWorldPlugin plugin) { 20 | super(plugin); 21 | 22 | this.translationProvider = plugin.getTranslationProvider(); 23 | } 24 | 25 | @Override 26 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 27 | this.translationProvider.getMessageList(commandSender, "commands.world.help.message") 28 | .forEach(message -> commandSender.sendMessage(message.replaceAll("%prefix%", super.getConfiguration().getPrefix()))); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/ListCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.multiworld.MultiWorldPlugin; 6 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 7 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 8 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 9 | import net.md_5.bungee.api.ChatColor; 10 | import org.bukkit.command.CommandSender; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.Set; 14 | 15 | /** 16 | * @author Dev7ex 17 | * @since 20.05.2021 18 | */ 19 | @BukkitCommandProperties(name = "list", permission = "multiworld.command.world.list") 20 | public class ListCommand extends BukkitCommand { 21 | 22 | private final DefaultTranslationProvider translationProvider; 23 | private final DefaultWorldProvider worldProvider; 24 | 25 | public ListCommand(@NotNull final MultiWorldPlugin plugin) { 26 | super(plugin); 27 | 28 | this.translationProvider = plugin.getTranslationProvider(); 29 | this.worldProvider = plugin.getWorldProvider(); 30 | } 31 | 32 | @Override 33 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 34 | if (arguments.length != 1) { 35 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.list.usage") 36 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 37 | return; 38 | } 39 | 40 | final StringBuilder stringBuilder = new StringBuilder(); 41 | final Set worldEntries = this.worldProvider.getWorldHolders().keySet(); 42 | 43 | for (final String worldEntry : worldEntries) { 44 | final BukkitWorldHolder worldHolder = this.worldProvider.getWorldHolder(worldEntry) 45 | .orElseThrow(); 46 | 47 | if (!stringBuilder.isEmpty()) { 48 | stringBuilder.append(ChatColor.GRAY); 49 | stringBuilder.append(", "); 50 | } 51 | stringBuilder.append(worldHolder.isLoaded() ? ChatColor.GREEN : ChatColor.RED).append(worldEntry); 52 | } 53 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.list.message") 54 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 55 | .replaceAll("%world_names%", stringBuilder.toString())); 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/LoadCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 8 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 9 | import com.dev7ex.multiworld.world.DefaultWorldManager; 10 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.command.CommandSender; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | import java.util.List; 16 | 17 | /** 18 | * @author Dev7ex 19 | * @since 20.05.2021 20 | */ 21 | @BukkitCommandProperties(name = "load", permission = "multiworld.command.world.load") 22 | public class LoadCommand extends BukkitCommand implements BukkitTabCompleter { 23 | 24 | private final DefaultTranslationProvider translationProvider; 25 | private final DefaultWorldManager worldManager; 26 | private final DefaultWorldProvider worldProvider; 27 | 28 | public LoadCommand(@NotNull final MultiWorldPlugin plugin) { 29 | super(plugin); 30 | 31 | this.translationProvider = plugin.getTranslationProvider(); 32 | this.worldManager = plugin.getWorldManager(); 33 | this.worldProvider = plugin.getWorldProvider(); 34 | } 35 | 36 | @Override 37 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 38 | if (arguments.length != 2) { 39 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "messages.commands.load.usage") 40 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 41 | return; 42 | } 43 | 44 | if (arguments[1].equalsIgnoreCase("%creator_name%")) { 45 | arguments[1] = arguments[1].replaceAll("%creator_name%", commandSender.getName()); 46 | } 47 | 48 | if (this.worldProvider.getWorldHolder(arguments[1]).isEmpty()) { 49 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.not-exists") 50 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 51 | .replaceAll("%world_name%", arguments[1])); 52 | return; 53 | } 54 | 55 | if (Bukkit.getWorld(arguments[1]) != null) { 56 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.already-loaded") 57 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 58 | .replaceAll("%world_name%", arguments[1])); 59 | return; 60 | } 61 | this.worldManager.loadWorld(commandSender.getName(), arguments[1]); 62 | } 63 | 64 | @Override 65 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 66 | return this.worldProvider.getWorldHolders() 67 | .values() 68 | .stream() 69 | .filter(bukkitWorldHolder -> !bukkitWorldHolder.isLoaded()) 70 | .map(BukkitWorldHolder::getName) 71 | .toList(); 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/ReloadCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.multiworld.MultiWorldPlugin; 6 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 7 | import org.bukkit.command.CommandSender; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | /** 11 | * @author Dev7ex 12 | * @since 28.12.2022 13 | */ 14 | @BukkitCommandProperties(name = "reload", permission = "multiworld.command.world.reload") 15 | public class ReloadCommand extends BukkitCommand { 16 | 17 | private final DefaultTranslationProvider translationProvider; 18 | 19 | public ReloadCommand(@NotNull final MultiWorldPlugin plugin) { 20 | super(plugin); 21 | 22 | this.translationProvider = plugin.getTranslationProvider(); 23 | } 24 | 25 | @Override 26 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 27 | if (arguments.length != 1) { 28 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.reload.usage") 29 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 30 | return; 31 | } 32 | super.getConfiguration().load(); 33 | 34 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender,"commands.world.reload.message") 35 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/UnloadCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 8 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 9 | import com.dev7ex.multiworld.world.DefaultWorldManager; 10 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.command.CommandSender; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | import java.util.List; 16 | 17 | /** 18 | * @author Dev7ex 19 | * @since 20.05.2021 20 | */ 21 | @BukkitCommandProperties(name = "unload", permission = "multiworld.command.world.unload") 22 | public class UnloadCommand extends BukkitCommand implements BukkitTabCompleter { 23 | 24 | private final DefaultTranslationProvider translationProvider; 25 | private final DefaultWorldManager worldManager; 26 | private final DefaultWorldProvider worldProvider; 27 | 28 | public UnloadCommand(@NotNull final MultiWorldPlugin plugin) { 29 | super(plugin); 30 | 31 | this.translationProvider = plugin.getTranslationProvider(); 32 | this.worldManager = plugin.getWorldManager(); 33 | this.worldProvider = plugin.getWorldProvider(); 34 | } 35 | 36 | @Override 37 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 38 | if (arguments.length != 2) { 39 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "messages.commands.load.usage") 40 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 41 | return; 42 | } 43 | 44 | if (arguments[1].equalsIgnoreCase("%creator_name%")) { 45 | arguments[1] = arguments[1].replaceAll("%creator_name%", commandSender.getName()); 46 | } 47 | 48 | if (this.worldProvider.getWorldHolder(arguments[1]).isEmpty()) { 49 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.not-exists") 50 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 51 | .replaceAll("%world_name%", arguments[1])); 52 | return; 53 | } 54 | 55 | if (arguments[1].equalsIgnoreCase(super.getConfiguration().getString("settings.defaults.normal-world"))) { 56 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.unload-locked") 57 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 58 | .replaceAll("%world_name%", arguments[1])); 59 | return; 60 | } 61 | 62 | if (Bukkit.getWorld(arguments[1]) == null) { 63 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.not-loaded") 64 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 65 | .replaceAll("%world_name%", arguments[1])); 66 | } 67 | this.worldManager.unloadWorld(commandSender.getName(), arguments[1]); 68 | } 69 | 70 | @Override 71 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 72 | return this.worldProvider 73 | .getWorldHolders() 74 | .values() 75 | .stream() 76 | .filter(BukkitWorldHolder::isLoaded) 77 | .map(BukkitWorldHolder::getName) 78 | .toList(); 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/VersionCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.multiworld.MultiWorldPlugin; 6 | import com.dev7ex.multiworld.util.Colored; 7 | import com.dev7ex.multiworld.util.PluginUpdater; 8 | import net.md_5.bungee.api.ChatColor; 9 | import org.bukkit.command.CommandSender; 10 | import org.bukkit.plugin.PluginDescriptionFile; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | /** 14 | * @author Dev7ex 15 | * @since 22.07.2024 16 | */ 17 | @BukkitCommandProperties(name = "version", permission = "multiworld.command.world.version") 18 | public class VersionCommand extends BukkitCommand { 19 | 20 | private final PluginUpdater updater; 21 | private final PluginDescriptionFile descriptionFile; 22 | 23 | public VersionCommand(@NotNull final MultiWorldPlugin plugin) { 24 | super(plugin); 25 | 26 | this.updater = plugin.getUpdater(); 27 | this.descriptionFile = plugin.getDescription(); 28 | } 29 | 30 | @Override 31 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 32 | final MultiWorldPlugin plugin = MultiWorldPlugin.getInstance(); 33 | 34 | commandSender.sendMessage(" "); 35 | commandSender.sendMessage("§f§m §r§r " + super.getConfiguration().getPrefix() + " §f§m "); 36 | commandSender.sendMessage(" "); 37 | commandSender.sendMessage("§8» §bVersion: §a" + this.descriptionFile.getVersion()); 38 | commandSender.sendMessage("§8» §bAuthors: " + this.getAuthors()); 39 | commandSender.sendMessage("§8» §bSupport: §adiscord.dev7ex.com"); 40 | commandSender.sendMessage("§8» §bWiki: §ahttps://github.com/Dev7ex/MultiWorld/wiki"); 41 | commandSender.sendMessage("§8» §bReport Bug: §ahttps://github.com/Dev7ex/MultiWorld/issues"); 42 | commandSender.sendMessage("§8» §bUpdate Available: " + Colored.getColoredBoolean(this.updater.isUpdateAvailable())); 43 | commandSender.sendMessage(" "); 44 | commandSender.sendMessage("§f§m §r§r " + super.getConfiguration().getPrefix() + " §f§m "); 45 | commandSender.sendMessage(" "); 46 | } 47 | 48 | private String getAuthors() { 49 | final StringBuilder stringBuilder = new StringBuilder(); 50 | 51 | for (final String author : this.descriptionFile.getAuthors()) { 52 | if (!stringBuilder.isEmpty()) { 53 | stringBuilder.append(ChatColor.GRAY); 54 | stringBuilder.append(", "); 55 | } 56 | stringBuilder.append(ChatColor.GREEN).append(author); 57 | } 58 | return stringBuilder.toString(); 59 | } 60 | 61 | } -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/WhitelistCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.command.world.whitelist.ListCommand; 8 | import com.dev7ex.multiworld.command.world.whitelist.*; 9 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 10 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 11 | import com.google.common.collect.Lists; 12 | import org.bukkit.command.CommandSender; 13 | import org.jetbrains.annotations.NotNull; 14 | import org.jetbrains.annotations.Nullable; 15 | 16 | import java.util.ArrayList; 17 | import java.util.Collections; 18 | import java.util.List; 19 | import java.util.Objects; 20 | 21 | /** 22 | * @author Dev7ex 23 | * @since 29.06.2023 24 | */ 25 | @BukkitCommandProperties(name = "whitelist", permission = "multiworld.command.world.whitelist") 26 | public class WhitelistCommand extends BukkitCommand implements BukkitTabCompleter { 27 | 28 | private final DefaultTranslationProvider translationProvider; 29 | private final DefaultWorldProvider worldProvider; 30 | 31 | public WhitelistCommand(@NotNull final MultiWorldPlugin plugin) { 32 | super(plugin); 33 | 34 | this.translationProvider = plugin.getTranslationProvider(); 35 | this.worldProvider = plugin.getWorldProvider(); 36 | 37 | super.registerSubCommand(new AddCommand(plugin)); 38 | super.registerSubCommand(new DisableCommand(plugin)); 39 | super.registerSubCommand(new EnableCommand(plugin)); 40 | super.registerSubCommand(new HelpCommand(plugin)); 41 | super.registerSubCommand(new ListCommand(plugin)); 42 | super.registerSubCommand(new RemoveCommand(plugin)); 43 | } 44 | 45 | @Override 46 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 47 | if ((arguments.length < 3) || (arguments.length > 4)) { 48 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.usage") 49 | .replaceAll("%prefix%", super.getConfiguration().getPrefix())); 50 | return; 51 | } 52 | 53 | if (this.worldProvider.getWorldHolder(arguments[1]).isEmpty()) { 54 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "general.world.not-exists") 55 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 56 | .replaceAll("%world_name%", arguments[1])); 57 | return; 58 | } 59 | 60 | if (super.getSubCommand(arguments[2].toLowerCase()).isEmpty()) { 61 | Objects.requireNonNull(super.getSubCommand(HelpCommand.class)).execute(commandSender, arguments); 62 | return; 63 | } 64 | super.getSubCommand(arguments[2].toLowerCase()) 65 | .get() 66 | .execute(commandSender, arguments); 67 | } 68 | 69 | @Nullable 70 | @Override 71 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 72 | if ((arguments.length < 2) || (arguments.length > 4)) { 73 | return Collections.emptyList(); 74 | } 75 | 76 | if (arguments.length == 2) { 77 | return new ArrayList<>(this.worldProvider.getWorldHolders().keySet()); 78 | } 79 | 80 | if (arguments.length == 3) { 81 | return Lists.newArrayList(super.getSubCommands().keySet()); 82 | } 83 | 84 | if (super.getSubCommand(arguments[2].toLowerCase()).isEmpty()) { 85 | return Collections.emptyList(); 86 | } 87 | final BukkitCommand subCommand = super.getSubCommand(arguments[2].toLowerCase()) 88 | .get(); 89 | 90 | if (!(subCommand instanceof BukkitTabCompleter)) { 91 | return Collections.emptyList(); 92 | } 93 | return ((BukkitTabCompleter) subCommand).onTabComplete(commandSender, arguments); 94 | } 95 | 96 | } 97 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/whitelist/AddCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world.whitelist; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 8 | import com.dev7ex.multiworld.api.world.WorldProperty; 9 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 10 | import com.dev7ex.multiworld.world.DefaultWorldConfiguration; 11 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 12 | import com.google.common.collect.Lists; 13 | import org.bukkit.Bukkit; 14 | import org.bukkit.command.CommandSender; 15 | import org.bukkit.entity.HumanEntity; 16 | import org.jetbrains.annotations.NotNull; 17 | 18 | import java.util.Collections; 19 | import java.util.List; 20 | 21 | /** 22 | * @author Dev7ex 23 | * @since 15.02.2024 24 | */ 25 | @BukkitCommandProperties(name = "add", permission = "multiworld.command.whitelist.add") 26 | public class AddCommand extends BukkitCommand implements BukkitTabCompleter { 27 | 28 | private final DefaultTranslationProvider translationProvider; 29 | private final DefaultWorldConfiguration worldConfiguration; 30 | private final DefaultWorldProvider worldProvider; 31 | 32 | public AddCommand(@NotNull final MultiWorldPlugin plugin) { 33 | super(plugin); 34 | 35 | this.translationProvider = plugin.getTranslationProvider(); 36 | this.worldConfiguration = plugin.getWorldConfiguration(); 37 | this.worldProvider = plugin.getWorldProvider(); 38 | } 39 | 40 | @Override 41 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 42 | final BukkitWorldHolder worldHolder = this.worldProvider 43 | .getWorldHolder(arguments[1]) 44 | .orElseThrow(); 45 | 46 | if (worldHolder.getWhitelist().contains(arguments[3])) { 47 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.add.already-added") 48 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 49 | .replaceAll("%world_name%", arguments[1]) 50 | .replaceAll("%player_name%", arguments[3])); 51 | return; 52 | } 53 | worldHolder.getWhitelist().add(arguments[3]); 54 | this.worldConfiguration.write(worldHolder, WorldProperty.WHITELIST, worldHolder.getWhitelist()); 55 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.add.successfully-added") 56 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 57 | .replaceAll("%world_name%", arguments[1]) 58 | .replaceAll("%player_name%", arguments[3])); 59 | } 60 | 61 | @Override 62 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 63 | if (arguments.length != 4) { 64 | return Collections.emptyList(); 65 | } 66 | final BukkitWorldHolder worldHolder = this.worldProvider 67 | .getWorldHolder(arguments[1]) 68 | .orElseThrow(); 69 | 70 | final List completions = Lists.newArrayList(Bukkit.getOnlinePlayers() 71 | .stream() 72 | .map(HumanEntity::getName) 73 | .toList()); 74 | completions.removeAll(worldHolder.getWhitelist()); 75 | 76 | return completions; 77 | } 78 | 79 | } -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/whitelist/DisableCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world.whitelist; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 8 | import com.dev7ex.multiworld.api.world.WorldProperty; 9 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 10 | import com.dev7ex.multiworld.world.DefaultWorldConfiguration; 11 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 12 | import org.bukkit.command.CommandSender; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | import java.util.Collections; 16 | import java.util.List; 17 | 18 | /** 19 | * @author Dev7ex 20 | * @since 15.02.2024 21 | */ 22 | @BukkitCommandProperties(name = "disable", permission = "multiworld.command.whitelist.disable") 23 | public class DisableCommand extends BukkitCommand implements BukkitTabCompleter { 24 | 25 | private final DefaultTranslationProvider translationProvider; 26 | private final DefaultWorldConfiguration worldConfiguration; 27 | private final DefaultWorldProvider worldProvider; 28 | 29 | public DisableCommand(@NotNull final MultiWorldPlugin plugin) { 30 | super(plugin); 31 | 32 | this.translationProvider = plugin.getTranslationProvider(); 33 | this.worldConfiguration = plugin.getWorldConfiguration(); 34 | this.worldProvider = plugin.getWorldProvider(); 35 | } 36 | 37 | @Override 38 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 39 | final BukkitWorldHolder worldHolder = this.worldProvider.getWorldHolder(arguments[1]) 40 | .orElseThrow(); 41 | 42 | if (!worldHolder.isWhitelistEnabled()) { 43 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.disable.already-disabled") 44 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 45 | .replaceAll("%world_name%", arguments[1])); 46 | return; 47 | } 48 | worldHolder.setWhitelistEnabled(false); 49 | this.worldConfiguration.write(worldHolder, WorldProperty.WHITELIST_ENABLED, false); 50 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.disable.successfully-disabled") 51 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 52 | .replaceAll("%world_name%", arguments[1])); 53 | } 54 | 55 | @Override 56 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 57 | return Collections.emptyList(); 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/whitelist/EnableCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world.whitelist; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 8 | import com.dev7ex.multiworld.api.world.WorldProperty; 9 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 10 | import com.dev7ex.multiworld.world.DefaultWorldConfiguration; 11 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 12 | import org.bukkit.command.CommandSender; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | import java.util.Collections; 16 | import java.util.List; 17 | 18 | /** 19 | * @author Dev7ex 20 | * @since 15.02.2024 21 | */ 22 | @BukkitCommandProperties(name = "enable", permission = "multiworld.command.whitelist.enable") 23 | public class EnableCommand extends BukkitCommand implements BukkitTabCompleter { 24 | 25 | private final DefaultTranslationProvider translationProvider; 26 | private final DefaultWorldConfiguration worldConfiguration; 27 | private final DefaultWorldProvider worldProvider; 28 | 29 | public EnableCommand(@NotNull final MultiWorldPlugin plugin) { 30 | super(plugin); 31 | 32 | this.translationProvider = plugin.getTranslationProvider(); 33 | this.worldConfiguration = plugin.getWorldConfiguration(); 34 | this.worldProvider = plugin.getWorldProvider(); 35 | } 36 | 37 | @Override 38 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 39 | final BukkitWorldHolder worldHolder = this.worldProvider 40 | .getWorldHolder(arguments[1]) 41 | .orElseThrow(); 42 | 43 | if (worldHolder.isWhitelistEnabled()) { 44 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.enable.already-enabled") 45 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 46 | .replaceAll("%world_name%", arguments[1])); 47 | return; 48 | } 49 | worldHolder.setWhitelistEnabled(true); 50 | this.worldConfiguration.write(worldHolder, WorldProperty.WHITELIST_ENABLED, true); 51 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.enable.successfully-enabled") 52 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 53 | .replaceAll("%world_name%", arguments[1])); 54 | } 55 | 56 | @Override 57 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 58 | return Collections.emptyList(); 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/whitelist/ListCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world.whitelist; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 8 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 9 | import com.dev7ex.multiworld.world.DefaultWorldConfiguration; 10 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.ChatColor; 13 | import org.bukkit.command.CommandSender; 14 | import org.jetbrains.annotations.NotNull; 15 | 16 | import java.util.Collections; 17 | import java.util.List; 18 | 19 | /** 20 | * @author Dev7ex 21 | * @since 15.02.2024 22 | */ 23 | @BukkitCommandProperties(name = "list", permission = "multiworld.command.whitelist.list") 24 | public class ListCommand extends BukkitCommand implements BukkitTabCompleter { 25 | 26 | private final DefaultTranslationProvider translationProvider; 27 | private final DefaultWorldConfiguration worldConfiguration; 28 | private final DefaultWorldProvider worldProvider; 29 | 30 | public ListCommand(@NotNull final MultiWorldPlugin plugin) { 31 | super(plugin); 32 | 33 | this.translationProvider = plugin.getTranslationProvider(); 34 | this.worldConfiguration = plugin.getWorldConfiguration(); 35 | this.worldProvider = plugin.getWorldProvider(); 36 | } 37 | 38 | @Override 39 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 40 | final BukkitWorldHolder worldHolder = this.worldProvider.getWorldHolder(arguments[1]) 41 | .orElseThrow(); 42 | 43 | if (worldHolder.getWhitelist().isEmpty()) { 44 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.list.empty") 45 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 46 | .replaceAll("%world_name%", arguments[1])); 47 | return; 48 | } 49 | final StringBuilder stringBuilder = new StringBuilder(); 50 | 51 | for (final String name : worldHolder.getWhitelist()) { 52 | if (!stringBuilder.isEmpty()) { 53 | stringBuilder.append(ChatColor.GRAY); 54 | stringBuilder.append(", "); 55 | } 56 | stringBuilder.append(Bukkit.getPlayer(name) != null ? ChatColor.GREEN : ChatColor.RED).append(name); 57 | } 58 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender,"commands.world.whitelist.list.message") 59 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 60 | .replaceAll("%world_name%", arguments[1]) 61 | .replaceAll("%player_names%", stringBuilder.toString())); 62 | } 63 | 64 | @Override 65 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 66 | return Collections.emptyList(); 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/command/world/whitelist/RemoveCommand.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.command.world.whitelist; 2 | 3 | import com.dev7ex.common.bukkit.command.BukkitCommand; 4 | import com.dev7ex.common.bukkit.command.BukkitCommandProperties; 5 | import com.dev7ex.common.bukkit.command.completer.BukkitTabCompleter; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 8 | import com.dev7ex.multiworld.api.world.WorldProperty; 9 | import com.dev7ex.multiworld.translation.DefaultTranslationProvider; 10 | import com.dev7ex.multiworld.world.DefaultWorldConfiguration; 11 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 12 | import org.bukkit.command.CommandSender; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | import java.util.Collections; 16 | import java.util.List; 17 | 18 | /** 19 | * @author Dev7ex 20 | * @since 15.02.2024 21 | */ 22 | @BukkitCommandProperties(name = "remove", permission = "multiworld.command.whitelist.remove") 23 | public class RemoveCommand extends BukkitCommand implements BukkitTabCompleter { 24 | 25 | private final DefaultTranslationProvider translationProvider; 26 | private final DefaultWorldConfiguration worldConfiguration; 27 | private final DefaultWorldProvider worldProvider; 28 | 29 | public RemoveCommand(@NotNull final MultiWorldPlugin plugin) { 30 | super(plugin); 31 | 32 | this.translationProvider = plugin.getTranslationProvider(); 33 | this.worldConfiguration = plugin.getWorldConfiguration(); 34 | this.worldProvider = plugin.getWorldProvider(); 35 | } 36 | 37 | @Override 38 | public void execute(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 39 | final BukkitWorldHolder worldHolder = this.worldProvider.getWorldHolder(arguments[1]) 40 | .orElseThrow(); 41 | 42 | if (!worldHolder.getWhitelist().contains(arguments[3])) { 43 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.remove.already-removed") 44 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 45 | .replaceAll("%world_name%", arguments[1]) 46 | .replaceAll("%player_name%", arguments[3])); 47 | return; 48 | } 49 | worldHolder.getWhitelist().remove(arguments[3]); 50 | this.worldConfiguration.write(worldHolder, WorldProperty.WHITELIST, worldHolder.getWhitelist()); 51 | commandSender.sendMessage(this.translationProvider.getMessage(commandSender, "commands.world.whitelist.remove.successfully-removed") 52 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 53 | .replaceAll("%world_name%", arguments[1]) 54 | .replaceAll("%player_name%", arguments[3])); 55 | } 56 | 57 | @Override 58 | public List onTabComplete(@NotNull final CommandSender commandSender, @NotNull final String[] arguments) { 59 | if (arguments.length != 4) { 60 | return Collections.emptyList(); 61 | } 62 | 63 | final BukkitWorldHolder worldHolder = this.worldProvider 64 | .getWorldHolder(arguments[1]) 65 | .orElseThrow(); 66 | 67 | if (worldHolder.getWhitelist().isEmpty()) { 68 | return Collections.emptyList(); 69 | } 70 | return worldHolder.getWhitelist(); 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/hook/DefaultHookProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.hook; 2 | 3 | import com.dev7ex.common.bukkit.plugin.module.PluginModule; 4 | import com.dev7ex.multiworld.MultiWorldPlugin; 5 | import com.dev7ex.multiworld.hook.permission.MultiPermsHook; 6 | import com.dev7ex.multiworld.hook.placeholder.PlaceholderHook; 7 | import org.bukkit.Bukkit; 8 | 9 | /** 10 | * @author Dev7ex 11 | * @since 19.08.2024 12 | */ 13 | public class DefaultHookProvider implements PluginModule { 14 | 15 | @Override 16 | public void onEnable() { 17 | if (Bukkit.getPluginManager().isPluginEnabled("MultiPerms")) { 18 | new MultiPermsHook().register(); 19 | MultiWorldPlugin.getInstance().getLogger().info("Successfully injected into MultiPerms"); 20 | } 21 | 22 | if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { 23 | new PlaceholderHook(MultiWorldPlugin.getInstance()).register(); 24 | MultiWorldPlugin.getInstance().getLogger().info("Successfully injected into PlaceholderAPI"); 25 | } 26 | } 27 | 28 | @Override 29 | public void onDisable() {} 30 | 31 | } 32 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/hook/permission/MultiPermsHook.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.hook.permission; 2 | 3 | import com.dev7ex.multiperms.api.MultiPermsApiProvider; 4 | import com.dev7ex.multiperms.api.bukkit.MultiPermsBukkitApi; 5 | import com.dev7ex.multiperms.api.hook.PermissionHook; 6 | import com.dev7ex.multiworld.MultiWorldPlugin; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author Dev7ex 12 | * @since 19.08.2024 13 | */ 14 | public class MultiPermsHook implements PermissionHook { 15 | 16 | private final MultiPermsBukkitApi multiPermsApi = (MultiPermsBukkitApi) MultiPermsApiProvider.getMultiPermsApi(); 17 | 18 | @Override 19 | public List getPermissions() { 20 | return List.of("multiworld.bypass.forcegamemode", 21 | "multiworld.command.world", 22 | "multiworld.command.world.back", 23 | "multiworld.command.world.backup", 24 | "multiworld.command.world.clone", 25 | "multiworld.command.world.create", 26 | "multiworld.command.world.delete", 27 | "multiworld.command.world.flag", 28 | "multiworld.command.world.gamerule", 29 | "multiworld.command.world.help", 30 | "multiworld.command.world.import", 31 | "multiworld.command.world.info", 32 | "multiworld.command.world.link", 33 | "multiworld.command.world.list", 34 | "multiworld.command.world.load", 35 | "multiworld.command.world.reload", 36 | "multiworld.command.world.teleport", 37 | "multiworld.command.world.unload", 38 | "multiworld.command.world.version", 39 | "multiworld.command.world.whitelist", 40 | "multiworld.command.world.whitelist.add", 41 | "multiworld.command.world.whitelist.disable", 42 | "multiworld.command.world.whitelist.enable", 43 | "multiworld.command.world.whitelist.list", 44 | "multiworld.command.world.whitelist.remove"); 45 | } 46 | 47 | @Override 48 | public void register() { 49 | this.multiPermsApi.getPermissionHookProvider() 50 | .register(MultiWorldPlugin.getInstance(), this); 51 | } 52 | 53 | @Override 54 | public void unregister() { 55 | this.multiPermsApi.getPermissionHookProvider() 56 | .unregister(MultiWorldPlugin.getInstance()); 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/listener/entity/EntitySpawnListener.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.listener.entity; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import com.dev7ex.multiworld.api.bukkit.event.MultiWorldListener; 5 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 6 | import org.bukkit.entity.LivingEntity; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.entity.EntitySpawnEvent; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | /** 13 | * Listens for entity spawn events and cancels them based on world configurations. 14 | * This class extends MultiWorldListener to utilize multi-world functionality. 15 | * 16 | * @author Dev7ex 17 | * @since 06.03.2024 18 | */ 19 | public class EntitySpawnListener extends MultiWorldListener { 20 | 21 | /** 22 | * Constructs an EntitySpawnListener with the given MultiWorldBukkitApi instance. 23 | * 24 | * @param multiWorldApi The MultiWorldBukkitApi instance. 25 | */ 26 | public EntitySpawnListener(@NotNull final MultiWorldBukkitApi multiWorldApi) { 27 | super(multiWorldApi); 28 | } 29 | 30 | /** 31 | * Handles the entity spawn event and cancels it if configured to disallow entity spawning. 32 | * 33 | * @param event The EntitySpawnEvent. 34 | */ 35 | @EventHandler(priority = EventPriority.NORMAL) 36 | public void handleEntitySpawn(final EntitySpawnEvent event) { 37 | if (event.getLocation().getWorld() == null) { 38 | return; 39 | } 40 | final String worldName = event.getLocation().getWorld().getName(); 41 | 42 | if (super.getWorldProvider().getWorldHolder(worldName).isEmpty()) { 43 | return; 44 | } 45 | final BukkitWorldHolder worldHolder = super.getWorldProvider() 46 | .getWorldHolder(worldName) 47 | .get(); 48 | 49 | if (!(event.getEntity() instanceof LivingEntity)) { 50 | return; 51 | } 52 | if (!worldHolder.isSpawnEntities()) { 53 | event.setCancelled(true); 54 | } 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/listener/player/PlayerAdvancementDoneListener.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.listener.player; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import com.dev7ex.multiworld.api.bukkit.event.MultiWorldListener; 5 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 6 | import org.bukkit.World; 7 | import org.bukkit.advancement.Advancement; 8 | import org.bukkit.advancement.AdvancementProgress; 9 | import org.bukkit.entity.Player; 10 | import org.bukkit.event.EventHandler; 11 | import org.bukkit.event.EventPriority; 12 | import org.bukkit.event.player.PlayerAdvancementDoneEvent; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | /** 16 | * Listener for player advancements. 17 | * This listener handles the event when a player completes an advancement. 18 | * It revokes the advancement if the world settings specify that achievements should not be received. 19 | * 20 | * @since 29.03.2024 21 | */ 22 | public class PlayerAdvancementDoneListener extends MultiWorldListener { 23 | 24 | /** 25 | * Constructs a new PlayerAdvancementDoneListener. 26 | * 27 | * @param multiWorldApi The MultiWorldBukkitApi instance. 28 | */ 29 | public PlayerAdvancementDoneListener(@NotNull final MultiWorldBukkitApi multiWorldApi) { 30 | super(multiWorldApi); 31 | } 32 | 33 | /** 34 | * Handles the PlayerAdvancementDoneEvent. 35 | * If the world does not allow receiving achievements, the completed advancement is revoked. 36 | * 37 | * @param event The PlayerAdvancementDoneEvent. 38 | */ 39 | @EventHandler(priority = EventPriority.NORMAL) 40 | public void handlePlayerAdvancementDone(final PlayerAdvancementDoneEvent event) { 41 | final Player player = event.getPlayer(); 42 | final World world = player.getWorld(); 43 | final BukkitWorldHolder worldHolder = super.getWorldProvider() 44 | .getWorldHolder(world.getName()) 45 | .orElseThrow(); 46 | 47 | if (worldHolder.isReceiveAchievements()) { 48 | return; 49 | } 50 | final Advancement advancement = event.getAdvancement(); 51 | final AdvancementProgress progress = player.getAdvancementProgress(advancement); 52 | 53 | if (progress.isDone()) { 54 | progress.getAwardedCriteria().forEach(progress::revokeCriteria); 55 | } 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/listener/player/PlayerChangeWorldListener.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.listener.player; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import com.dev7ex.multiworld.api.bukkit.event.MultiWorldListener; 5 | import com.dev7ex.multiworld.api.bukkit.event.user.WorldUserTeleportWorldEvent; 6 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUser; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 8 | import org.bukkit.Bukkit; 9 | import org.bukkit.World; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.event.EventHandler; 12 | import org.bukkit.event.EventPriority; 13 | import org.bukkit.event.player.PlayerTeleportEvent; 14 | import org.jetbrains.annotations.NotNull; 15 | 16 | /** 17 | * Listener for player teleport events. 18 | * This listener handles the event when a player teleports between worlds. 19 | * It triggers a custom event if the player teleports from one registered world to another. 20 | * 21 | * @since 07.06.2024 22 | */ 23 | public class PlayerChangeWorldListener extends MultiWorldListener { 24 | 25 | /** 26 | * Constructs a PlayerTeleportListener with the given MultiWorldBukkitApi. 27 | * 28 | * @param multiWorldApi The MultiWorldBukkitApi instance. 29 | */ 30 | public PlayerChangeWorldListener(@NotNull final MultiWorldBukkitApi multiWorldApi) { 31 | super(multiWorldApi); 32 | } 33 | 34 | /** 35 | * Handles the PlayerTeleportEvent. 36 | * If the player teleports from one registered world to another, it triggers a WorldUserTeleportWorldEvent. 37 | * 38 | * @param event The PlayerTeleportEvent. 39 | */ 40 | @EventHandler(priority = EventPriority.NORMAL) 41 | public void handlePlayerTeleport(final PlayerTeleportEvent event) { 42 | final Player player = event.getPlayer(); 43 | final World to = event.getTo() != null ? event.getTo().getWorld() : null; 44 | final World from = event.getFrom().getWorld(); 45 | 46 | if ((to == null) || (from == null)) { 47 | return; 48 | } 49 | 50 | // Fix https://github.com/Dev7ex/MultiWorld/issues/37 51 | if (from.getName().equalsIgnoreCase(to.getName())) { 52 | return; 53 | } 54 | 55 | // Ensure both the source and destination worlds are registered 56 | if ((super.getWorldProvider().getWorldHolder(to.getName()).isEmpty()) 57 | || (super.getWorldProvider().getWorldHolder(from.getName()).isEmpty())) { 58 | return; 59 | } 60 | final BukkitWorldHolder lastWorldHolder = super.getWorldProvider().getWorldHolder(from.getName()).get(); 61 | final BukkitWorldHolder nextWorldHolder = super.getWorldProvider().getWorldHolder(to.getName()).get(); 62 | 63 | if (super.getUserProvider().getUser(player.getUniqueId()).isEmpty()) { 64 | return; 65 | } 66 | final BukkitWorldUser user = super.getUserProvider().getUser(player.getUniqueId()).get(); 67 | Bukkit.getPluginManager().callEvent(new WorldUserTeleportWorldEvent(user, lastWorldHolder, nextWorldHolder)); 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/listener/player/PlayerDamagePlayerListener.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.listener.player; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import com.dev7ex.multiworld.api.bukkit.event.MultiWorldListener; 5 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 6 | import org.bukkit.entity.EntityType; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.entity.Projectile; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.EventPriority; 11 | import org.bukkit.event.entity.EntityDamageByEntityEvent; 12 | import org.jetbrains.annotations.NotNull; 13 | 14 | /** 15 | * Listener for player damage events. 16 | * This listener handles the event when a player is damaged by another entity. 17 | * It cancels the event if PvP is disabled in the world settings. 18 | * 19 | * @since 29.06.2023 20 | */ 21 | public class PlayerDamagePlayerListener extends MultiWorldListener { 22 | 23 | /** 24 | * Constructs a new PlayerDamagePlayerListener. 25 | * 26 | * @param multiWorldApi The MultiWorldBukkitApi instance. 27 | */ 28 | public PlayerDamagePlayerListener(@NotNull final MultiWorldBukkitApi multiWorldApi) { 29 | super(multiWorldApi); 30 | } 31 | 32 | /** 33 | * Handles the EntityDamageByEntityEvent. 34 | * If the entity damaged is a player and PvP is disabled in the world, the event is cancelled. 35 | * 36 | * @param event The EntityDamageByEntityEvent. 37 | */ 38 | @EventHandler(priority = EventPriority.NORMAL) 39 | public void handlePlayerDamagePlayer(final EntityDamageByEntityEvent event) { 40 | // Check if the damaged entity is a player 41 | if (event.getEntity().getType() != EntityType.PLAYER) { 42 | return; 43 | } 44 | final Player player = (Player) event.getEntity(); 45 | 46 | // Get the world holder for the current world 47 | final BukkitWorldHolder worldHolder = super.getWorldProvider() 48 | .getWorldHolder(player.getWorld().getName()) 49 | .orElse(null); 50 | 51 | // If the worldHolder is null or PvP is enabled in the world, return 52 | if ((worldHolder == null) || (worldHolder.isPvpEnabled())) { 53 | return; 54 | } 55 | 56 | // Check if the damager is a projectile 57 | if (event.getDamager() instanceof Projectile) { 58 | final Projectile projectile = (Projectile) event.getDamager(); 59 | 60 | if (projectile.getShooter() instanceof Player) { 61 | event.setCancelled(true); 62 | } 63 | return; 64 | } 65 | 66 | if (event.getDamager().getType() == EntityType.PLAYER) { 67 | event.setCancelled(true); 68 | } 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/listener/user/UserTeleportWorldListener.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.listener.user; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import com.dev7ex.multiworld.api.bukkit.event.MultiWorldListener; 5 | import com.dev7ex.multiworld.api.bukkit.event.user.WorldUserTeleportWorldEvent; 6 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUser; 7 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 8 | import com.dev7ex.multiworld.api.bukkit.world.location.BukkitWorldLocation; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.event.EventHandler; 12 | import org.bukkit.event.EventPriority; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | /** 16 | * Listens for events related to user teleportation between worlds. 17 | */ 18 | public class UserTeleportWorldListener extends MultiWorldListener { 19 | 20 | /** 21 | * Constructs a new UserTeleportWorldListener. 22 | * 23 | * @param multiWorldApi The MultiWorldBukkitApi instance. 24 | */ 25 | public UserTeleportWorldListener(@NotNull final MultiWorldBukkitApi multiWorldApi) { 26 | super(multiWorldApi); 27 | } 28 | 29 | /** 30 | * Handles user game mode change upon world teleportation. 31 | * 32 | * @param event The WorldUserTeleportWorldEvent. 33 | */ 34 | @EventHandler(priority = EventPriority.NORMAL) 35 | public void onUserGameModeChange(final WorldUserTeleportWorldEvent event) { 36 | final Player player = Bukkit.getPlayer(event.getUser().getUniqueId()); 37 | if (!super.getConfiguration().isAutoGameModeEnabled()) { 38 | return; 39 | } 40 | if (event.getNextWorldHolder().getForceGameMode().equalsIgnoreCase("false")) { 41 | return; 42 | } 43 | if (event.getNextWorldHolder().getForceGameMode().equalsIgnoreCase("false-with-permission")) { 44 | if (player.hasPermission("multiworld.bypass.forcegamemode")) { 45 | return; 46 | } 47 | } 48 | player.setGameMode(event.getNextWorldHolder().getGameMode()); 49 | } 50 | 51 | /** 52 | * Handles user entering a world upon teleportation. 53 | * 54 | * @param event The WorldUserTeleportWorldEvent. 55 | */ 56 | @EventHandler(priority = EventPriority.NORMAL) 57 | public void handleUserEnterWorld(final WorldUserTeleportWorldEvent event) { 58 | final BukkitWorldUser user = event.getUser(); 59 | final Player player = user.getEntity(); 60 | final BukkitWorldHolder nextWorldHolder = event.getNextWorldHolder(); 61 | 62 | user.setLastLocation(BukkitWorldLocation.of(player.getLocation())); 63 | 64 | if (!nextWorldHolder.isWhitelistEnabled()) { 65 | return; 66 | } 67 | 68 | if (nextWorldHolder.getWhitelist().contains(user.getName())) { 69 | return; 70 | } 71 | 72 | if (player.hasPermission("multiworld.whitelist.ignore")) { 73 | return; 74 | } 75 | user.setLastLocation(null); 76 | player.sendMessage(super.getConfiguration().getString("messages.general.world-whitelist-block-trespassing") 77 | .replaceAll("%prefix%", super.getConfiguration().getPrefix()) 78 | .replaceAll("%world_name%", nextWorldHolder.getName())); 79 | event.setCancelled(true); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/listener/world/WorldActivityListener.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.listener.world; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import com.dev7ex.multiworld.api.bukkit.event.MultiWorldListener; 5 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.EventPriority; 8 | import org.bukkit.event.block.BlockBreakEvent; 9 | import org.bukkit.event.block.BlockPlaceEvent; 10 | import org.bukkit.event.player.PlayerInteractEvent; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | /** 14 | * @author Dev7ex 15 | * @since 19.09.2024 16 | */ 17 | public class WorldActivityListener extends MultiWorldListener { 18 | 19 | /** 20 | * Constructs a MultiWorldListener with the given MultiWorldBukkitApi. 21 | * 22 | * @param multiWorldApi The MultiWorldBukkitApi instance. 23 | */ 24 | public WorldActivityListener(@NotNull final MultiWorldBukkitApi multiWorldApi) { 25 | super(multiWorldApi); 26 | } 27 | 28 | @EventHandler(priority = EventPriority.NORMAL) 29 | public void handlePlayerInteract(final PlayerInteractEvent event) { 30 | final String worldName = event.getPlayer().getWorld().getName(); 31 | 32 | if (super.getWorldProvider().getWorldHolder(worldName).isEmpty()) { 33 | return; 34 | } 35 | final BukkitWorldHolder worldHolder = super.getWorldProvider() 36 | .getWorldHolder(worldName) 37 | .get(); 38 | 39 | worldHolder.setLastActivity(System.currentTimeMillis()); 40 | } 41 | 42 | @EventHandler(priority = EventPriority.NORMAL) 43 | public void handleWorldBlockBreak(final BlockBreakEvent event) { 44 | final String worldName = event.getBlock().getWorld().getName(); 45 | 46 | if (super.getWorldProvider().getWorldHolder(worldName).isEmpty()) { 47 | return; 48 | } 49 | final BukkitWorldHolder worldHolder = super.getWorldProvider() 50 | .getWorldHolder(worldName) 51 | .get(); 52 | 53 | worldHolder.setLastActivity(System.currentTimeMillis()); 54 | } 55 | 56 | @EventHandler(priority = EventPriority.NORMAL) 57 | public void handleWorldBlockBreak(final BlockPlaceEvent event) { 58 | final String worldName = event.getBlock().getWorld().getName(); 59 | 60 | if (super.getWorldProvider().getWorldHolder(worldName).isEmpty()) { 61 | return; 62 | } 63 | final BukkitWorldHolder worldHolder = super.getWorldProvider() 64 | .getWorldHolder(worldName) 65 | .get(); 66 | 67 | worldHolder.setLastActivity(System.currentTimeMillis()); 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/listener/world/WorldInitializeListener.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.listener.world; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.MultiWorldBukkitApi; 4 | import com.dev7ex.multiworld.api.bukkit.event.MultiWorldListener; 5 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldType; 6 | import com.dev7ex.multiworld.api.world.WorldEnvironment; 7 | import com.dev7ex.multiworld.api.world.WorldType; 8 | import org.bukkit.Bukkit; 9 | import org.bukkit.World; 10 | import org.bukkit.event.EventHandler; 11 | import org.bukkit.event.EventPriority; 12 | import org.bukkit.event.world.WorldInitEvent; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | /** 16 | * @author Dev7ex 17 | * @since 02.02.2025 18 | */ 19 | public class WorldInitializeListener extends MultiWorldListener { 20 | 21 | /** 22 | * Constructs a MultiWorldListener with the given MultiWorldBukkitApi. 23 | * 24 | * @param multiWorldApi The MultiWorldBukkitApi instance. 25 | */ 26 | public WorldInitializeListener(@NotNull final MultiWorldBukkitApi multiWorldApi) { 27 | super(multiWorldApi); 28 | } 29 | 30 | @EventHandler(priority = EventPriority.NORMAL) 31 | public void handleWorldInitialize(final WorldInitEvent event) { 32 | final World world = event.getWorld(); 33 | 34 | if (super.getWorldProvider().getWorldHolder(world.getName()).isPresent()) { 35 | return; 36 | } 37 | final WorldType worldType = BukkitWorldType.fromEnvironment(world.getEnvironment()); 38 | super.getWorldManager().importWorld(Bukkit.getConsoleSender().getName(), world.getName(), WorldEnvironment.fromType(worldType), worldType); 39 | 40 | super.getConsoleSender().sendMessage(String.format("§cThe world %s was registered by MultiWorld.", event.getWorld().getName())); 41 | super.getConsoleSender().sendMessage("§cPlease note that you may have to change the flags yourself if this world has special properties like Void WorldType or similar"); 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/task/WorldUnloadTask.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.task; 2 | 3 | import com.dev7ex.common.scheduler.task.Task; 4 | import com.dev7ex.multiworld.MultiWorldConfiguration; 5 | import com.dev7ex.multiworld.MultiWorldPlugin; 6 | import com.dev7ex.multiworld.api.bukkit.world.BukkitWorldHolder; 7 | import com.dev7ex.multiworld.world.DefaultWorldProvider; 8 | import org.bukkit.Bukkit; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | import java.util.Queue; 12 | import java.util.concurrent.ConcurrentLinkedQueue; 13 | import java.util.concurrent.TimeUnit; 14 | 15 | /** 16 | * @author Dev7ex 17 | * @since 18.09.2024 18 | */ 19 | public class WorldUnloadTask implements Task { 20 | 21 | private final DefaultWorldProvider worldProvider; 22 | private final Queue worldUnloadQueue = new ConcurrentLinkedQueue<>(); 23 | private final MultiWorldConfiguration configuration = MultiWorldPlugin.getInstance().getConfiguration(); 24 | 25 | public WorldUnloadTask(@NotNull final DefaultWorldProvider worldProvider) { 26 | this.worldProvider = worldProvider; 27 | } 28 | 29 | @Override 30 | public void run() { 31 | for (final BukkitWorldHolder worldHolder : this.worldProvider.getWorldHolders().values()) { 32 | if (!worldHolder.isAutoUnloadEnabled()) { 33 | continue; 34 | } 35 | 36 | if (!worldHolder.isLoaded()) { 37 | continue; 38 | } 39 | 40 | if ((System.currentTimeMillis() - worldHolder.getLoadTimeStamp()) < TimeUnit.SECONDS.toMillis(this.configuration.getAutoUnloadLoadDelay())) { 41 | continue; 42 | } 43 | 44 | if (!worldHolder.getWorld().getPlayers().isEmpty()) { 45 | return; 46 | } 47 | 48 | if (worldHolder.getName().equalsIgnoreCase(this.configuration.getString("settings.defaults.normal-world"))) { 49 | return; 50 | } 51 | 52 | if ((System.currentTimeMillis() - worldHolder.getLastActivity()) >= (this.configuration.getAutoUnloadSystemDelay() * 1000L)) { 53 | if (!this.worldUnloadQueue.contains(worldHolder)) { 54 | this.worldUnloadQueue.add(worldHolder); 55 | } 56 | } 57 | } 58 | 59 | if (!this.worldUnloadQueue.isEmpty()) { 60 | final BukkitWorldHolder worldToUnload = this.worldUnloadQueue.poll(); 61 | 62 | if (worldToUnload != null) { 63 | this.worldProvider.getWorldManager().unloadWorld(Bukkit.getConsoleSender().getName(), worldToUnload.getName()); 64 | } 65 | } 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/user/User.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.user; 2 | 3 | import com.dev7ex.multiworld.api.bukkit.user.BukkitWorldUser; 4 | import com.dev7ex.multiworld.api.bukkit.world.location.BukkitWorldLocation; 5 | import com.dev7ex.multiworld.api.user.WorldUserConfiguration; 6 | import com.dev7ex.multiworld.api.world.WorldHolder; 7 | import com.dev7ex.multiworld.api.world.location.WorldLocation; 8 | import lombok.AccessLevel; 9 | import lombok.Getter; 10 | import lombok.Setter; 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.entity.Player; 13 | import org.bukkit.event.player.PlayerTeleportEvent; 14 | import org.jetbrains.annotations.NotNull; 15 | 16 | import java.util.UUID; 17 | 18 | /** 19 | * Represents a user in the MultiWorld system. 20 | * This class implements BukkitWorldUser and EntityResolver for Player entities. 21 | * It manages user-specific information and actions within the world. 22 | * 23 | * @since 18.06.2023 24 | */ 25 | @Getter(AccessLevel.PUBLIC) 26 | @Setter(AccessLevel.PUBLIC) 27 | public class User implements BukkitWorldUser { 28 | 29 | private final UUID uniqueId; 30 | private final String name; 31 | private WorldUserConfiguration configuration; 32 | private WorldLocation lastLocation; 33 | private long firstLogin; 34 | private long lastLogin; 35 | 36 | /** 37 | * Constructs a new User with the specified unique ID and name. 38 | * 39 | * @param uniqueId The unique ID of the user. 40 | * @param name The name of the user. 41 | */ 42 | public User(@NotNull final UUID uniqueId, @NotNull final String name) { 43 | this.uniqueId = uniqueId; 44 | this.name = name; 45 | } 46 | 47 | /** 48 | * Sends a message to the user. 49 | * 50 | * @param message The message to send. 51 | */ 52 | @Override 53 | public void sendMessage(@NotNull final String message) { 54 | this.getEntity().sendMessage(message); 55 | } 56 | 57 | /** 58 | * Teleports the user to the spawn location of the specified world. 59 | * 60 | * @param worldHolder The holder of the world to teleport to. 61 | */ 62 | @Override 63 | public void teleport(@NotNull final WorldHolder worldHolder) { 64 | this.getEntity().teleport(BukkitWorldLocation.to(worldHolder.getSpawnLocation()), PlayerTeleportEvent.TeleportCause.PLUGIN); 65 | } 66 | 67 | /** 68 | * Gets the Bukkit Player entity associated with this user. 69 | * 70 | * @return The Bukkit Player entity. 71 | */ 72 | @Override 73 | public Player getEntity() { 74 | return Bukkit.getPlayer(this.uniqueId); 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/util/Colored.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.util; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.Difficulty; 5 | import org.bukkit.GameMode; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | /** 9 | * @author Dev7ex 10 | * @since 22.10.2024 11 | */ 12 | public class Colored { 13 | 14 | public static String getColoredBoolean(final boolean value) { 15 | if (value) { 16 | return ChatColor.GREEN + "true"; 17 | } 18 | return ChatColor.RED + "false"; 19 | } 20 | 21 | public static String getColoredGameMode(@NotNull final GameMode gameMode) { 22 | return switch (gameMode) { 23 | case ADVENTURE, SURVIVAL -> ChatColor.GREEN + gameMode.toString(); 24 | case CREATIVE -> ChatColor.RED + gameMode.toString(); 25 | case SPECTATOR -> ChatColor.DARK_GREEN + gameMode.toString(); 26 | }; 27 | } 28 | 29 | public static String getColoredBooleanWithOption(@NotNull final String value) { 30 | if (value.equalsIgnoreCase("true")) { 31 | return ChatColor.GREEN + "true"; 32 | } else if (value.equalsIgnoreCase("false")) { 33 | return ChatColor.RED + "false"; 34 | } else { 35 | return ChatColor.YELLOW + value; 36 | } 37 | } 38 | 39 | public static String getColoredDifficulty(@NotNull final Difficulty difficulty) { 40 | return switch (difficulty) { 41 | case PEACEFUL -> ChatColor.GREEN + difficulty.toString(); 42 | case EASY -> ChatColor.DARK_GREEN + difficulty.toString(); 43 | case NORMAL -> ChatColor.YELLOW + difficulty.toString(); 44 | case HARD -> ChatColor.RED + difficulty.toString(); 45 | }; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/java/com/dev7ex/multiworld/world/generator/DefaultWorldGeneratorProvider.java: -------------------------------------------------------------------------------- 1 | package com.dev7ex.multiworld.world.generator; 2 | 3 | import com.dev7ex.common.bukkit.plugin.module.PluginModule; 4 | import com.dev7ex.multiworld.MultiWorldPlugin; 5 | import com.dev7ex.multiworld.api.bukkit.world.generator.BukkitWorldGenerator; 6 | import com.dev7ex.multiworld.api.bukkit.world.generator.BukkitWorldGeneratorHolder; 7 | import com.dev7ex.multiworld.api.bukkit.world.generator.BukkitWorldGeneratorProvider; 8 | import com.dev7ex.multiworld.api.bukkit.world.generator.defaults.FlatWorldGenerator; 9 | import com.dev7ex.multiworld.api.bukkit.world.generator.defaults.VoidWorldGenerator; 10 | import com.dev7ex.multiworld.api.bukkit.world.generator.defaults.WaterWorldGenerator; 11 | import com.dev7ex.multiworld.api.world.generator.WorldGenerator; 12 | import lombok.AccessLevel; 13 | import lombok.Getter; 14 | import org.bukkit.Bukkit; 15 | import org.bukkit.plugin.Plugin; 16 | 17 | import java.util.ArrayList; 18 | import java.util.HashMap; 19 | import java.util.List; 20 | import java.util.Map; 21 | 22 | /** 23 | * Default implementation of a world generator provider for managing custom world generators. 24 | * This module scans all enabled plugins to find and register their custom world generators. 25 | * It implements PluginModule and BukkitWorldGeneratorProvider. 26 | * 27 | * @author Dev7ex 28 | * @since 29.06.2023 29 | */ 30 | @Getter(AccessLevel.PUBLIC) 31 | public class DefaultWorldGeneratorProvider implements PluginModule, BukkitWorldGeneratorProvider { 32 | 33 | private final Map customGenerators = new HashMap<>(); 34 | private final List defaultGenerators = new ArrayList<>(); 35 | private final Map fileGenerators = new HashMap<>(); 36 | 37 | /** 38 | * Called when the module is enabled. 39 | * Scans all enabled plugins to find and register their custom world generators. 40 | */ 41 | @Override 42 | public void onEnable() { 43 | for (final Plugin plugin : Bukkit.getServer().getPluginManager().getPlugins()) { 44 | if (!plugin.isEnabled()) { 45 | continue; 46 | } 47 | try { 48 | if (plugin.getDefaultWorldGenerator("world", "") == null) { 49 | continue; 50 | } 51 | } catch (final Exception exception) { 52 | MultiWorldPlugin.getInstance().getLogger().severe(plugin.getName() + " could not be loaded"); 53 | continue; 54 | } 55 | this.customGenerators.put(new BukkitWorldGeneratorHolder(plugin), plugin.getDescription().getName()); 56 | } 57 | this.defaultGenerators.add(new FlatWorldGenerator(MultiWorldPlugin.getInstance())); 58 | this.defaultGenerators.add(new VoidWorldGenerator(MultiWorldPlugin.getInstance())); 59 | this.defaultGenerators.add(new WaterWorldGenerator(MultiWorldPlugin.getInstance())); 60 | 61 | MultiWorldPlugin.getInstance().getLogger().info("Found: [" + this.customGenerators.values().size() + "] World Generator"); 62 | } 63 | 64 | /** 65 | * Called when the module is disabled. 66 | * Clears the list of custom world generators. 67 | */ 68 | @Override 69 | public void onDisable() { 70 | this.customGenerators.clear(); 71 | this.defaultGenerators.clear(); 72 | this.fileGenerators.clear(); 73 | } 74 | 75 | /** 76 | * Checks if a custom world generator is registered. 77 | * 78 | * @param generator The name of the generator to check. 79 | * @return True if the generator is registered, false otherwise. 80 | */ 81 | @Override 82 | public boolean isRegistered(final String generator) { 83 | return (this.customGenerators.containsValue(generator)) 84 | || (this.defaultGenerators.stream() 85 | .anyMatch(generator1 -> generator1.getName().equalsIgnoreCase(generator))); 86 | } 87 | 88 | @Override 89 | public List getAllGenerators() { 90 | final List allGenerators = new ArrayList<>(); 91 | 92 | allGenerators.addAll(this.customGenerators.values()); 93 | allGenerators.addAll(this.defaultGenerators.stream().map(WorldGenerator::getName).toList()); 94 | allGenerators.addAll(this.fileGenerators.values().stream().map(WorldGenerator::getName).toList()); 95 | 96 | return allGenerators; 97 | } 98 | 99 | } 100 | -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/resources/config.yml: -------------------------------------------------------------------------------- 1 | # __ ___ ____ _ _ __ __ __ 2 | # / |/ /_ __/ / /_(_) | / /___ _____/ /___/ / 3 | # / /|_/ / / / / / __/ /| | /| / / __ \/ ___/ / __ / 4 | # / / / / /_/ / / /_/ / | |/ |/ / /_/ / / / / /_/ / 5 | # /_/ /_/\__,_/_/\__/_/ |__/|__/\____/_/ /_/\__,_/ 6 | # 7 | # Copyright (c) 2021 - 2024 by Dev7ex 8 | # Version: ${project.version} 9 | config-version: ${project.version} 10 | # General 11 | prefix: '§8[§bMultiWorld§8]§r' 12 | # Settings 13 | settings: 14 | # Should you be able to enter Nether/End worlds with the command /world telport 15 | access-nether-world-via-command: true 16 | access-end-world-via-command: true 17 | # Should the auto-game-mode per world work? 18 | auto-game-mode-enabled: true 19 | # Delay in seconds after a world is loaded before it becomes eligible for auto-unloading (300 = 5 minutes) 20 | auto-unload-load-delay: 300 21 | # Delay in Seconds (900 = 15min) 22 | auto-unload-system-delay: 1800 23 | # Enables automatic unloading of inactive worlds. 24 | auto-unload-system-enabled: true 25 | # Standard values for new worlds 26 | defaults: 27 | # Specifies whether the server should automatically load the worlds upon starting 28 | auto-load-enabled: false 29 | # Determines whether the server should automatically unload chunks that are not being used 30 | auto-unload-enabled: false 31 | # Sets the game's difficulty level. "PEACEFUL" means no hostile mobs will spawn, and players cannot starve 32 | difficulty: PEACEFUL 33 | # Determines whether players have access to the End portal, allowing them to enter the End 34 | end-portal-accessible: true 35 | # Specifies the name of the world that serves as the End 36 | end-world: world_the_end 37 | # Sets the game mode to Survival, where players must gather resources, manage health, and survive against mobs 38 | game-mode: SURVIVAL 39 | # Enables the per-world enforcement of a player's game mode automatically. 'auto-game-mode-enabled' above must be set to true! 40 | # Set to "true" to force the world's game mode, set to "false" to disable that world from forcing its game mode. 41 | # Set to "false-with-permission" to force the world's game mode for all players who DO NOT have the permission "multiworld.bypass.forcegamemode". 42 | force-game-mode: false-with-permission 43 | # Enables the hunger mechanic, causing players to lose food points over time and need to eat to maintain their health and energy 44 | hunger-enabled: true 45 | # Determines whether the server should keep the spawn chunks loaded in memory even when no players are nearby. 46 | # Set this to true to ensure that spawn chunks are always active, which can be useful for certain redstone machines or farms 47 | keep-spawn-in-memory: false 48 | # Determines whether players have access to Nether portals, allowing them to enter the Nether 49 | nether-portal-accessible: true 50 | # Specifies the name of the world that serves as the Nether 51 | nether-world: world_nether 52 | # Specifies the name of the main world 53 | normal-world: world 54 | # Enables player versus player combat, allowing players to attack each other 55 | pvp-enabled: true 56 | # Allows players to receive achievements during gameplay 57 | receive-achievements: true 58 | # Enables the functionality of Redstone, allowing players to use Redstone mechanisms and devices 59 | redstone-enabled: true 60 | # Allows animals to spawn naturally in the world 61 | spawn-animals: true 62 | # Allows all entities, including items, mobs, and other non-player characters, to spawn in the world 63 | spawn-entities: true 64 | # Allows hostile mobs to spawn naturally in the world 65 | spawn-monsters: true 66 | # Enables weather changes such as rain, thunderstorms, and snow 67 | weather-enabled: true 68 | # Disables the whitelist feature, allowing any player to join the world without needing to be added to a whitelist 69 | whitelist-enabled: false 70 | # The time format in which information is displayed 71 | time-format: dd.MM.yyyy HH:mm:ss 72 | # Should MultiWorld connect the worlds with each other via the registered data? 73 | world-link-enabled: true -------------------------------------------------------------------------------- /multiworld-bukkit/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | api-version: 1.17 2 | author: Dev7ex 3 | database: false 4 | depend: [ FacilisCommon ] 5 | description: ${project.description} 6 | libraries: 7 | - commons-io:commons-io:${dependency.commons.io.version} 8 | load: POSTWORLD 9 | loadbefore: [ ] 10 | main: com.dev7ex.multiworld.MultiWorldPlugin 11 | name: MultiWorld 12 | prefix: MultiWorld 13 | softdepend: [ PlaceholderAPI, MultiPerms ] 14 | version: ${project.version} 15 | website: https://www.spigotmc.org/resources/multiworld.92559/ 16 | commands: 17 | world: 18 | aliases: [ multiworld, mw ] 19 | description: Main Command for all World Commands 20 | permission: multiworld.command.world 21 | usage: /world 22 | permissions: 23 | multiworld.*: 24 | default: op 25 | description: All MultiWorld permissions, ideally given to administrators. 26 | multiworld.bypass.*: 27 | default: op 28 | description: Allows users to bypass specific per-world flag settings. 29 | children: 30 | multiworld.bypass.forcegamemode: true 31 | multiworld.command.world: 32 | default: op 33 | description: Ability to run /multiworld help. 34 | multiworld.command.world.*: 35 | default: op 36 | description: Ability to run all /multiworld commands. 37 | children: 38 | multiworld.command.world.back: true 39 | multiworld.command.world.backup: true 40 | multiworld.command.world.clone: true 41 | multiworld.command.world.create: true 42 | multiworld.command.world.delete: true 43 | multiworld.command.world.flag: true 44 | multiworld.command.world.gamerule: true 45 | multiworld.command.world.import: true 46 | multiworld.command.world.info: true 47 | multiworld.command.world.link: true 48 | multiworld.command.world.list: true 49 | multiworld.command.world.load: true 50 | multiworld.command.world.reload: true 51 | multiworld.command.world.teleport: true 52 | multiworld.command.world.unload: true 53 | multiworld.command.world.version: true 54 | multiworld.command.world.whitelist: true 55 | multiworld.command.world.whitelist.add: true 56 | multiworld.command.world.whitelist.disable: true 57 | multiworld.command.world.whitelist.enable: true 58 | multiworld.command.world.whitelist.list: true 59 | multiworld.command.world.whitelist.remove: true -------------------------------------------------------------------------------- /multiworld-resources/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | com.dev7ex 9 | multiworld 10 | 1.7.4-SNAPSHOT 11 | 12 | 13 | MultiWorld-Resources 14 | multiworld-resources 15 | 16 | 17 | ${project.source.version} 18 | ${project.source.version} 19 | ${project.source.encoding} 20 | 21 | 22 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.5.7-2024-03-30.md: -------------------------------------------------------------------------------- 1 | # Changelog Version 1.5.7 2 | **Date:** 30.03.2024 3 | 4 | ## Additions 5 | 6 | + ![#008000](https://via.placeholder.com/15/008000/000000?text=+) **Adding**: Achievements can now be deactivated. (#32) 7 | + ![#008000](https://via.placeholder.com/15/008000/000000?text=+) **Adding**: A function to set the gamerule for each world via MultiWorld. The TabCompletion of `/mw gamerule` shows the current value for a gamerule with a number as its value. 8 | 9 | ## Fixes 10 | 11 | - ![#FFA500](https://via.placeholder.com/15/FFA500/000000?text=+) **Fixing**: Fixed a bug where a newly created world throws an exception when adding a player to the whitelist. (#33) 12 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.5.7-2024-03-30.txt: -------------------------------------------------------------------------------- 1 | » Fixed a bug where a newly created world throws an exception when adding a player to the whitelist (#33) 2 | » Achievements can now be deactivated (#32) 3 | Messages are still displayed, however, these can be deactivated via the gamerule 4 | » It is now possible to set the gamerule for each world via MultiWorld. 5 | The TabCompletion of /mw gamerule shows the current value for a gamerule with a number as value -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.5.8-2024-04-06.txt: -------------------------------------------------------------------------------- 1 | Version: 1.5.8 2 | FacilisCommon Version: 1.0.5 3 | 4 | » The TimeFormat in the Info Command is now adjustable in the config.yml 5 | » The MultiWorld API has been improved 6 | » The last login of users is saved (for a future update) 7 | » Fix an error where flags are not read correctly -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.5.9-2024-06-18.txt: -------------------------------------------------------------------------------- 1 | Adding JavaDocs for almost all classes 2 | Improve WorldGenerator for Future Update 3 | Improve Internal Project Structure for Future Update 4 | In version 1.6.0 the support for 1.16 will be removed -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.0-2024-06-24.txt: -------------------------------------------------------------------------------- 1 | Fixing NullPointerException (#34) 2 | Create Command now has clearly defined arguments for creating with seeds, generators or worldtypes (mw create <-g, -s, -t> ) 3 | Fixing World Link not working (#35) 4 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.1-2024-07-16.txt: -------------------------------------------------------------------------------- 1 | Fixing: https://github.com/Dev7ex/MultiWorld/issues/37 2 | Fixing: Missing Dependency https://github.com/Dev7ex/MultiWorld/issues/39 -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.2-2024-07-31.txt: -------------------------------------------------------------------------------- 1 | Syntax of the World Create command changed -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.3-2024-08-12.txt: -------------------------------------------------------------------------------- 1 | » Adding WorldFlag (REDSTONE_ENABLED, HUNGER_ENABLED, KEEP_SPAWN_IN_MEMORY, WEATHER_ENABLED) 2 | » Optimize Code 3 | » Improve Create and Import Command 4 | » Add Version Command 5 | » Improve Load Command 6 | » Improve World Creation 7 | » Add Language Support (https://github.com/Dev7ex/MultiWorld/issues/38) 8 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.4-2024-08-12.txt: -------------------------------------------------------------------------------- 1 | Fixing incorrect pull from github of old entries in config.yml 2 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.5-2024-08-20.txt: -------------------------------------------------------------------------------- 1 | Updating Dependencies 2 | Adding MultiPerms Hook 3 | Fix World Creation Error wrong end type 4 | Fix that worlds are not loaded automatically 5 | Fix wrong permission message in world command -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.6-2024-08-24.txt: -------------------------------------------------------------------------------- 1 | Adding zh_CN.json 2 | Fixing CommandException in World Creator Command by using Custom Environment 3 | Fixing World with special generators couldn't be load when server starting (#46) 4 | Fixing Teleport Command cannot teleport 5 | Fixing incorret spelling 6 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.7-2024-09-04.md: -------------------------------------------------------------------------------- 1 | # Changelog Version 1.6.7 2 | 3 | ## Fixes 4 | 5 | - ![#FFA500](https://via.placeholder.com/15/FFA500/000000?text=+) **Fixing**: Custom Generators were not working. 6 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.8-2024-10-10.md: -------------------------------------------------------------------------------- 1 | # Changelog Version 1.6.8 2 | 3 | 1. Adding World Auto Unload System 4 | 2. Adding Variable that stores the first login of a multiworld user 5 | 6 | 3. Updating User file format to JSON 7 | 8 | Fixing 9 | 10 | Removing 11 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.6.9-2024-10-27.md: -------------------------------------------------------------------------------- 1 | # Changelog Version 1.6.9 2 | 3 | - **Adding**: Translation for the info command. 4 | - **Adding**: Colored class to display GameMode, Difficulty, and boolean values in colors. 5 | - **Fixing**: Resolved the issue where the info command did not display usage. 6 | - **Updating**: Improved the listing of the info command. 7 | - **Updating**: Updated the world load method to reduce errors. 8 | - **Updating**: Java project version changed from 16 to 17. 9 | - **Updating**: Minor code improvements. 10 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/1.7.0-2024-11-06.md: -------------------------------------------------------------------------------- 1 | ### [Version 1.7.0] 2 | 3 | - **Adding**: Added a plugin updater that informs the console and OP users about a new update. (Color Green) 4 | - **Fixing**: Fixed the display error in the info command. (Color Orange) 5 | - **Fixing**: Resolved an issue where a world could not be loaded when it was created with the custom parameter. (Color Orange) 6 | - **Updating**: The version command now shows only a variable to indicate whether an update is available. (Color Blue) 7 | - **Updating**: Improved the code. (Color Blue) 8 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/CHANGELOG-2024-12-07.md: -------------------------------------------------------------------------------- 1 | ### [Version 1.7.1] 2 | 3 | - **Adding** Ukrainian translation 4 | - **Adding** WaterWorldGenerator 5 | 6 | - **Fixing** missing placeholder replacement in the Clone command 7 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/CHANGELOG-2025-01-20.md: -------------------------------------------------------------------------------- 1 | ### [Version 1.7.2] 2 | 3 | - **Fixing**: Resolved an issue where the default world was incorrectly shown as unloaded despite being loaded. (#54) 4 | - **Fixing**: Fixed an error occurring when adding a player to the whitelist. (#53) 5 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/CHANGELOG-2025-02-16.md: -------------------------------------------------------------------------------- 1 | ### [Version 1.0.1] - YYYY-MM-DD 2 | 3 | - **Adding**: Added functionality to recognize and import worlds that were not created by MultiWorld at runtime 4 | 5 | - **Fixing**: Resolved an issue where pistons were activated despite being disabled in WorldGuard (Thanks to https://github.com/Emptiness0x) 6 | 7 | - **Updating**: Improved the API module for better performance and flexibility 8 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/CHANGELOG-2025-04-09.md: -------------------------------------------------------------------------------- 1 | ### [Version 1.7.4] 2 | 3 | - **Adding** Italian translation (Thanks to https://github.com/calexe) 4 | - **Adding** Flag that only sets the gamemode for a new world under certain conditions (Thanks to https://github.com/calaritooo) 5 | 6 | - **Fixing** Missing prefix in the update log message 7 | - **Fixing** Missing entry in the usage for the create command in all languages 8 | 9 | - **Updating**: General code improvements -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/changelogs/CHANGELOG_CONVENTION.md: -------------------------------------------------------------------------------- 1 | # Changelog Convention 2 | 3 | Each change in the changelog should begin with one of the following keywords and should be listed in alphabetical order: 4 | 5 | - **Adding**: For new features or functionalities introduced to the project. 6 | - **Fixing**: For bug fixes or error corrections. 7 | - **Removing**: For features, code, or dependencies that have been removed. 8 | - **Updating**: For improvements, modifications, or updates to existing features, dependencies, or documentation. 9 | 10 | ## Example Format 11 | 12 | ```text 13 | ### [Version 1.0.1] - YYYY-MM-DD 14 | - **Adding**: Introduced a new logging feature for tracking user actions. (Color Green) 15 | - **Fixing**: Resolved an issue where users were unable to log in. (Color Orange) 16 | - **Removing**: Deprecated the legacy authentication method. (Color Red) 17 | - **Updating**: Improved the performance of the search functionality. (Color Blue) 18 | -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/-Commands-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/-Commands-.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/-Links-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/-Links-.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/-MultiWorld-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/-MultiWorld-.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/-README-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/-README-.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/-Setup-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/-Setup-.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/-Tutorial-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/-Tutorial-.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/-bStats-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/-bStats-.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/icon.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/preview-world-command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/preview-world-command.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/preview-world-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/preview-world-info.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/title-default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/title-default.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/title-description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/title-description.png -------------------------------------------------------------------------------- /multiworld-resources/src/main/resources/images/title-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dev7ex/MultiWorld/a6c66db92cb6690f4cbd6a0b22398c02b977fda7/multiworld-resources/src/main/resources/images/title-github.png -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.dev7ex 8 | multiworld 9 | pom 10 | 1.7.4-SNAPSHOT 11 | 12 | MultiWorld 13 | World Management for Minecraft 14 | https://github.com/Dev7ex/MultiWorld 15 | 16 | 17 | 18 | github 19 | GitHub Dev7ex Apache Maven Packages 20 | https://maven.pkg.github.com/Dev7ex/MultiWorld 21 | 22 | 23 | 24 | 25 | multiworld-bukkit 26 | multiworld-api 27 | multiworld-resources 28 | 29 | 30 | 31 | ${project.source.version} 32 | ${project.source.version} 33 | 34 | 17 35 | UTF-8 36 | 37 | 3.13.0 38 | 3.6.0 39 | 3.8.0 40 | 41 | 1.1.2-SNAPSHOT 42 | 4.3.3 43 | 4.17.0 44 | 24.1.0 45 | 1.0.7-SNAPSHOT 46 | 2.16.1 47 | 1.18.34 48 | 1.17.1-R0.1-SNAPSHOT 49 | 2.11.6 50 | 51 | 52 | --------------------------------------------------------------------------------