{ config, lib, options, pkgs, ... }: with lib; let essentialsx = pkgs.callPackage ../../packages/minecraft/essentialsx.nix {}; cfg = config.services.minecraft.essentialsx; opt = options.services.minecraft.essentialsx; config-yml = pkgs.writeText "config.yml" (generators.toYAML {} cfg.config); in { options.services.minecraft.essentialsx = { enable = mkOption { default = false; description = "Enable EssentialsX"; type = types.bool; }; chat = mkOption { default = true; description = "Enable EssentialsX Chat"; type = types.bool; }; spawn = mkOption { default = true; description = "Enable EssentialsX Spawn"; type = types.bool; }; config = { ops-name-color = mkOption { default = "4"; description = "Ops name color"; type = types.str; }; nickname-prefix = mkOption { default = "~"; description = "Nickname prefix"; type = types.str; }; max-nick-length = mkOption { default = 15; description = "Max nickname length"; type = types.int; }; nick-blacklist = mkOption { default = []; description = "Nickname blacklist"; type = types.listOf types.str; }; ignore-colors-in-max-nick-length = mkOption { default = false; description = "Ignore colors in max nickname length"; type = types.bool; }; hide-displayname-in-vanish = mkOption { default = true; description = "Hide displayname in vanish"; type = types.bool; }; change-displayname = mkOption { default = true; description = "Change displayname"; type = types.bool; }; change-tab-complete-name = mkOption { default = false; description = "Change tab complete name"; type = types.bool; }; change-playerlist = mkOption { default = false; description = "Change playerlist"; type = types.bool; }; add-prefix-in-playerlist = mkOption { default = false; description = "Add prefix in playerlist"; type = types.bool; }; add-suffix-in-playerlist = mkOption { default = false; description = "Add suffix in playerlist"; type = types.bool; }; teleport-safety = mkOption { default = true; description = "Teleport safety"; type = types.bool; }; force-disable-teleport-safety = mkOption { default = false; description = "Force disable teleport safety"; type = types.bool; }; force-safe-teleport-location = mkOption { default = false; description = "Force safe teleport location"; type = types.bool; }; teleport-passenger-dismount = mkOption { default = true; description = "Teleport passenger dismount"; type = types.bool; }; teleport-cooldown = mkOption { default = 0; description = "Teleport cooldown"; type = types.int; }; teleport-delay = mkOption { default = 0; description = "Teleport delay"; type = types.int; }; teleport-invulnerability = mkOption { default = 4; description = "Teleport invulnerability"; type = types.int; }; teleport-to-center = mkOption { default = true; description = "Teleport to center"; type = types.bool; }; heal-cooldown = mkOption { default = 60; description = "Heal cooldown"; type = types.int; }; remove-effects-on-heal = mkOption { default = true; description = "Remove effects on heal"; type = types.bool; }; near-radius = mkOption { default = 200; description = "Near radius"; type = types.int; }; item-spawn-blacklist = mkOption { default = ""; description = "Item spawn blacklist"; type = types.str; }; permission-based-item-spawn = mkOption { default = false; description = "Permission based item spawn"; type = types.bool; }; spawnmob-limit = mkOption { default = 10; description = "Spawnmob limit"; type = types.int; }; warn-on-smite = mkOption { default = true; description = "Warn on smite"; type = types.bool; }; drop-items-if-full = mkOption { default = false; description = "Drop items if full"; type = types.bool; }; notify-no-new-mail = mkOption { default = true; description = "Notify no new mail"; type = types.bool; }; notify-player-of-mail-cooldown = mkOption { default = 60; description = "Notify player of mail cooldown"; type = types.int; }; ovverridden-commands = mkOption { default = []; description = "Ovverridden commands"; type = types.listOf types.str; }; disabled-commands = mkOption { default = []; description = "Disabled commands"; type = types.listOf types.str; }; verbose-command-usages = mkOption { default = true; description = "Verbose command usages"; type = types.bool; }; socialspy-commands = mkOption { default = [ "msg" "w" "r" "mail" "m" "t" "whisper" "emsg" "tell" "er" "reply" "ereply" "email" "action" "describe" "eme" "eaction" "edescribe" "etell" "ewhisper" "pm" ]; description = "Socialspy commands"; type = types.listOf types.str; }; socialspy-listen-muted-players = mkOption { default = true; description = "Socialspy listen muted players"; type = types.bool; }; socialspy-messages = mkOption { default = true; description = "Socialspy messages"; type = types.bool; }; world-change-fly-reset = mkOption { default = true; description = "World change=ly reset"; type = types.bool; }; world-change-speed-reset = mkOption { default = true; description = "World change=ly reset"; type = types.bool; }; mute-commands = mkOption { default = []; description = "Mute commands"; type = types.listOf types.str; }; player-commands = mkOption { default = []; description = "Player commands"; type = types.listOf types.str; }; use-bukkit-permissions = mkOption { default = true; description = "Use bukkit permissions"; type = types.bool; }; skip-used-one-time-kits-from-kit-list = mkOption { default = false; description = "Skip used one time kits from kit list"; type = types.bool; }; kit-auto-equip = mkOption { default = false; description = "Kit auto equip"; type = types.bool; }; pastebin-createkit = mkOption { default = false; description = "Pastebin createkit"; type = types.bool; }; use-nbt-serialization-in-createkit = mkOption { default = false; description = "Use nbt serialization in createkit"; type = types.bool; }; enabled-signs = mkOption { default = []; description = "Enabled signs"; type = types.listOf types.str; }; sign-use-per-second = mkOption { default = 4; description = "Sign use per second"; type = types.int; }; allow-old-id-signs = mkOption { default = false; description = "Allow old id signs"; type = types.bool; }; unprotected-sign-names = mkOption { default = []; description = "Unprotected sign names"; type = types.listOf types.str; }; backup = { interval = mkOption { default = 30; description = "Backup interval"; type = types.int; }; always-run = mkOption { default = false; description = "Always run"; type = types.bool; }; command = mkOption { default = null; description = "Command"; type = types.nullOr types.str; }; }; per-warp-permission = mkOption { default = false; description = "Per warp permission"; type = types.bool; }; real-names-on-list = mkOption { default = false; description = "Real names on list"; type = types.bool; }; debug = mkOption { default = false; description = "Debug"; type = types.bool; }; remove-god-on-disconnect = mkOption { default = false; description = "Remove god on disconnect"; type = types.bool; }; auto-afk = mkOption { default = 300; description = "Auto afk"; type = types.int; }; auto-afk-kick = mkOption { default = -1; description = "Auto afk kick"; type = types.int; }; freeze-afk-players = mkOption { default = false; description = "Freeze afk players"; type = types.bool; }; disable-item-pickup-while-afk = mkOption { default = false; description = "Disable item pickup while afk"; type = types.bool; }; cancel-afk-on-interact = mkOption { default = true; description = "Cancel afk on interact"; type = types.bool; }; cancel-afk-on-move = mkOption { default = true; description = "Cancel afk on move"; type = types.bool; }; cancel-afk-on-chat = mkOption { default = true; description = "Cancel afk on chat"; type = types.bool; }; sleep-ignores-afk-players = mkOption { default = true; description = "Sleep ignores afk players"; type = types.bool; }; sllep-ignores-vanished-players = mkOption { default = true; description = "Sleep ignores vanished players"; type = types.bool; }; afk-list-name = mkOption { default = "none"; description = "Afk list name"; type = types.str; }; broadcast-afk-message = mkOption { default = true; description = "Broadcast afk message"; type = types.bool; }; death-messages = mkOption { default = true; description = "Death messages"; type = types.bool; }; vanishing-items-policy = mkOption { default = "keep"; description = "Vanishing items policy"; type = types.str; }; binding-items-policy = mkOption { default = "keep"; description = "Binding items policy"; type = types.str; }; send-info-after-death = mkOption { default = false; description = "Send info after death"; type = types.bool; }; allow-silent-join-quit = mkOption { default = false; description = "Allow silent join quit"; type = types.bool; }; custom-join-message = mkOption { default = "none"; description = "Custom join message"; type = types.str; }; custom-quit-message = mkOption { default = "none"; description = "Custom quit message"; type = types.str; }; custom-new-username-message = mkOption { default = "none"; description = "Custom new username message"; type = types.str; }; use-custom-server-full-message = mkOption { default = true; description = "Use custom server full message"; type = types.bool; }; hide-join-quit-messages-above = mkOption { default = -1; description = "Hide join quit messages above"; type = types.int; }; no-god-in-worlds = mkOption { default = []; description = "No god in worlds"; type = types.listOf types.str; }; world-teleport-permissions = mkOption { default = false; description = "World teleport permissions"; type = types.bool; }; default-stack-size = mkOption { default = -1; description = "Default stack size"; type = types.int; }; oversized-stacksize = mkOption { default = 64; description = "Oversized stacksize"; type = types.int; }; repair-enchanted = mkOption { default = true; description = "Repair enchanted"; type = types.bool; }; unsafe-enchantments = mkOption { default = false; description = "Unsafe enchantments"; type = types.bool; }; tree-command-range-limit = mkOption { default = 300; description = "Tree command range limit"; type = types.int; }; register-back-in-listener = mkOption { default = false; description = "Register back in listener"; type = types.bool; }; login-attack-delay = mkOption { default = 5; description = "Login attack delay"; type = types.int; }; max-fly-speed = mkOption { default = 0.8; description = "Max fly speed"; type = types.float; }; max-walk-speed = mkOption { default = 0.8; description = "Max walk speed"; type = types.float; }; mails-per-minute = mkOption { default = 1000; description = "Mails per minute"; type = types.int; }; max-mute-time = mkOption { default = -1; description = "Max mute time"; type = types.int; }; max-tempban-time = mkOption { default = -1; description = "Max tempban time"; type = types.int; }; last-message-reply-recipient = mkOption { default = true; description = "Last message reply recipient"; type = types.bool; }; last-message-reply-recipient-timeout = mkOption { default = 180; description = "Last message reply recipient timeout"; type = types.int; }; last-message-reply-vanished = mkOption { default = true; description = "Last message reply vanished"; type = types.bool; }; milk-bucket-easter-egg = mkOption { default = true; description = "Milk bucket easter egg"; type = types.bool; }; send-fly-enable-on-join = mkOption { default = true; description = "Send fly enable on join"; type = types.bool; }; world-time-permissions = mkOption { default = false; description = "World time permissions"; type = types.bool; }; command-cooldowns = mkOption { default = {}; description = "Command cooldowns"; type = types.attrsOf types.int; }; command-cooldown-persistence = mkOption { default = true; description = "Command cooldown persistence"; type = types.bool; }; npcs-in-balance-ranking = mkOption { default = false; description = "Npcs in balance ranking"; type = types.bool; }; allow-bulk-buy-sell = mkOption { default = true; description = "Allow bulk buy sell"; type = types.bool; }; allow-selling-named-items = mkOption { default = false; description = "Allow selling named items"; type = types.bool; }; delay-motd = mkOption { default = 0; description = "Delay motd"; type = types.int; }; default-enabled-confirm-commands = mkOption { default = []; description = "Default enabled confirm commands"; type = types.listOf types.str; }; teleport-when-freed = mkOption { default = "back"; description = "Teleport when freed"; type = types.str; }; jail-online-time = mkOption { default = false; description = "Jail online time"; type = types.bool; }; tpa-accept-cancellation = mkOption { default = 120; description = "Tpa accept cancellation"; type = types.int; }; tpa-max-request = mkOption { default = 5; description = "Tpa max request"; type = types.int; }; allow-direct-hat = mkOption { default = true; description = "Allow direct hat"; type = types.bool; }; allow-world-in-broadcastworld = mkOption { default = true; description = "Allow world in broadcastworld"; type = types.bool; }; is-water-safe = mkOption { default = false; description = "Is water safe"; type = types.bool; }; safe-usermap-names = mkOption { default = true; description = "Safe usermap names"; type = types.bool; }; log-command-block-commands = mkOption { default = true; description = "Log command block commands"; type = types.bool; }; max-projectile-speed = mkOption { default = 8; description = "Max projectile speed"; type = types.int; }; update-check = mkOption { default = true; description = "Update check"; type = types.bool; }; update-bed-at-daytime = mkOption { default = true; description = "Update bed at daytime"; type = types.bool; }; world-home-permission = mkOption { default = false; description = "World home permission"; type = types.bool; }; sethome-multiple = mkOption { default = { default = 3; vip = 5; staff = 10; }; description = "Sethome multiple"; type = types.attrsOf types.int; }; compass-towards-home-perm = mkOption { default = false; description = "Compass towards home perm"; type = types.bool; }; spawn-if-no-home = mkOption { default = true; description = "Spawn if no home"; type = types.bool; }; confirm-home-overwrite = mkOption { default = false; description = "Confirm home overwrite"; type = types.bool; }; starting-balance = mkOption { default = 0; description = "Starting balance"; type = types.int; }; command-costs = mkOption { default = {}; description = "Command costs"; type = types.attrsOf types.int; }; currency-symbol = mkOption { default = "$"; description = "Currency symbol"; type = types.str; }; currency-symbol-suffix = mkOption { default = false; description = "Currency symbol suffix"; type = types.bool; }; max-money = mkOption { default = 10000000000000; description = "Max money"; type = types.int; }; min-money = mkOption { default = -10000; description = "Min money"; type = types.int; }; economy-log-enabled = mkOption { default = false; description = "Economy log enabled"; type = types.bool; }; economy-log-update-enabled = mkOption { default = false; description = "Economy log update enabled"; type = types.bool; }; minimum-pay-amount = mkOption { default = 0.001; description = "Minimum pay amount"; type = types.float; }; pay-excludes-ignore-list = mkOption { default = false; description = "Pay excludes ignore list"; type = types.bool; }; show-zero-baltop = mkOption { default = true; description = "Show zero baltop"; type = types.bool; }; currency-format = mkOption { default = "#,##0.00"; description = "Currency format"; type = types.str; }; non-ess-in-help = mkOption { default = true; description = "Non ess in help"; type = types.bool; }; hide-permissionless-help = mkOption { default = true; description = "Hide permissionless help"; type = types.bool; }; chat = { radius = mkOption { default = 0; description = "Radius"; type = types.int; }; format = mkOption { default = "{PREFIX}{DISPLAYNAME}{SUFFIX}&r: {MESSAGE}"; description = "Format"; type = types.str; }; group-formats = mkOption { default = {}; description = "Group formats"; type = types.attrsOf types.str; }; world-aliases = mkOption { default = {}; description = "World aliases"; type = types.attrsOf types.str; }; shout-default = mkOption { default = false; description = "Shout default"; type = types.bool; }; persist-shout = mkOption { default = false; description = "Persist shout"; type = types.bool; }; question-enabled = mkOption { default = true; description = "Question enabled"; type = types.bool; }; }; respawn-listener-priority = mkOption { default = "high"; description = "Respawn listener priority"; type = types.str; }; spawn-join-listener-priority = mkOption { default = "high"; description = "Spawn join listener priority"; type = types.str; }; respawn-at-home = mkOption { default = false; description = "Respawn at home"; type = types.bool; }; respawn-at-home-bed = mkOption { default = true; description = "Respawn at home bed"; type = types.bool; }; respawn-anchor = mkOption { default = false; description = "Respawn anchor"; type = types.bool; }; spawn-on-join = mkOption { default = false; description = "Spawn on join"; type = types.oneOf [types.bool types.str (types.listOf types.str)]; }; }; worth-yml = mkOption { default = null; description = "Worth YML Path"; type = types.path; }; }; config = mkIf cfg.enable { assertions = [ { assertion = cfg.config.change-playerlist -> cfg.config.change-tab-complete-name; message = "change-playerlist can only be on if change-tab-complete-name is on"; } { assertion = cfg.config.add-prefix-in-playerlist -> cfg.config.change-playerlist; message = "add-prefix-in-playerlist can only be on if change-playerlist is on"; } { assertion = cfg.config.add-suffix-in-playerlist -> cfg.config.change-playerlist; message = "add-suffix-in-playerlist can only be on if change-playerlist is on"; } { assertion = cfg.config.force-disable-teleport-safety -> cfg.config.teleport-safety; message = "force-disable-teleport-safety can only be on if teleport-safety is on"; } ]; warnings = optional (!(cfg.config.respawn-at-home -> cfg.config.respawn-at-home-bed)) "respawn-at-home is off, the setting of respawn-at-home-bed is ignored."; services.minecraft = { vault.enable = config.services.minecraft.luckperms.enable; }; services.minecraft.plugins = lib.mkMerge [ [ { package = essentialsx.essentialsx; startScript = pkgs.writeScript "essentialsx" '' mkdir -pv plugins/Essentials cat ${config-yml} > plugins/Essentials/config.yml ${ if cfg.worth-yml != null then '' cat ${cfg.worth-yml} > plugins/Essentials/worth.yml '' else "" } ''; } ] ( mkIf cfg.chat [ { package = essentialsx.essentialsx-chat; startScript = pkgs.writeScript "dummy" ""; } ] ) ( mkIf cfg.spawn [ { package = essentialsx.essentialsx-spawn; startScript = pkgs.writeScript "dummy" ""; } ] ) ]; }; }