ArtifactDimensions
Create a Minecraft Paper 1.21+ plugin called Artifact Dimensions that adds a huge collection of unique custom items called Artifacts that completely change gameplay and are not just normal Minecraft weapons, tools, armor, buffs, or abilities. Each artifact should have its own custom mechanic, rarity, cooldowns, lore, and acquisition methods. Examples include items that rewind time, copy actions, alter gravity, create temporary biomes, draw structures into existence, slow time in an area, rewrite mob behavior, capture creatures as companions, temporarily disable game rules, create pocket
Read the full description
dimensions, swap inventories between players, duplicate terrain for a short time, generate alternate reality versions of chunks, store and replay player actions, create unstable portals, and other reality-bending mechanics. The plugin must contain multiple configurable Ages or Modes that can be switched in config.yml or with commands including Primitive Age, Arcane Age, Tech Age, Void Age, Chaos Age, Ancient Age, and Experimental Age. Each age enables different artifact sets, recipes, loot tables, powers, balancing, and mechanics. The plugin should contain at least 100 unique artifacts across all ages and allow server owners to easily add more. Artifacts can be obtained through custom crafting, bosses, world events, dungeons, exploration, loot crates, achievements, quests, and rare random drops. Include commands such as /artifact give, /artifact list, /artifact reload, /artifact info, /artifact age set, and /artifact debug. Include permissions, SQLite storage, PlaceholderAPI support, custom model data support, configurable rarity tiers, configurable cooldowns, configurable recipes, custom world events, custom loot integration, and support for future expansion. The goal is to make the server feel like a completely different game where players discover strange, creative, experimental items that manipulate reality, physics, time, dimensions, entities, world generation, and player interaction in ways that vanilla Minecraft never does while remaining optimized for Paper and avoiding TPS lag.
package eu.codexe.artifactdimensions;
import eu.codexe.artifactdimensions.commands.ArtifactCommand;
import eu.codexe.artifactdimensions.listeners.PlayerJoinListener;
import eu.codexe.artifactdimensions.managers.ArtifactManager;
import eu.codexe.artifactdimensions.managers.AgeManager;
import eu.codexe.artifactdimensions.managers.EventManager;
import eu.codexe.artifactdimensions.placeholder.ArtifactExpansion;
import eu.codexe.artifactdimensions.storage.StorageManager;
import eu.codexe.artifactdimensions.storage.StorageProvider;
import eu.codexe.artifactdimensions.storage.YamlStorage;
import eu.codexe.artifactdimensions.storage.sqlite.SqliteStorage;
import eu.codexe.artifactdimensions.storage.types.StorageType;
import eu.codexe.artifactdimensions.util.ConfigManager;
import eu.codexe.artifactdimensions.util.MessageManager;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.command.PluginCommand;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.util.Objects;
public final class ArtifactDimensionsPlugin extends JavaPlugin {
private ConfigManager configManager;
private MessageManager messageManager;
private AgeManager ageManager;
private ArtifactManager artifactManager;
private EventManager eventManager;
private StorageManager storageManager;
@Override
public void onEnable() {
saveDefaultConfig();
this.configManager = new ConfigManager(this);
this.messageManager = new MessageManager(this, configManager);
this.ageManager = new AgeManager(configManager);
this.artifactManager = new ArtifactManager(this, configManager, ageManager);
this.eventManager = new EventManager(this, configManager, artifactManager, ageManager);
StorageType storageType = configManager.getStorageType();
this.storageManager = switch (storageType) {
case SQLITE -> new SqliteStorage(this, configManager);
case YAML -> new YamlStorage(this);
case MYSQL -> new SqliteStorage(this, configManager);
};
this.storageManager.initialize();
artifactManager.loadArtifacts();
eventManager.startSchedulers();
ArtifactCommand command = new ArtifactCommand(this, artifactManager, ageManager, messageManager, configManager, storageManager);
PluginCommand pluginCommand = Objects.requireNonNull(getCommand("artifact"), "artifact command missing from plugin.yml");
pluginCommand.setExecutor(command);
pluginCommand.setTabCompleter(command);
Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(messageManager, artifactManager, configManager), this);
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {