Lootbox & Boss
Encounter System
Technical documentation for the RIVRS case study: a key purchase interface, a weighted crate system, and a custom boss encounter named Ace - built on top of DeluxeMenus, CrazyCrates, and MythicMobs with a consistent infernal visual palette throughout the system.
Executive Summary
A summary of the goals, scope, and technical philosophy behind this project - written for reviewers who want to understand the full context before diving into configuration details.
Table of Contents
A complete map of this document. Quick navigation is also available in the left sidebar.
- Executive Summary§01
- Live Demo§03
- Project Resources§04
- Server Environment§05
- Project Structure§06
- Architecture Summary§07
- Module 01 - Purchase Interface§08
- Module 02 - Loot Box System§09
- Module 03 - Boss Entity: Ace§10
- Plugin Reference§11
- Custom Plugin - RIVRSBridge§12
- Extra Plugins Rationale§13
- Configuration Documentation§14
- Plugin Compatibility Matrix§15
- Integration Notes§18
- Testing & Validation§19
- Known Issues§20
- Roadmap§21
- Performance§22
- Security§23
- Conclusion§24
- Appendix§25
Live Demo
Reviewers can connect directly to the running demonstration server to verify the configuration described in this document, without needing to deploy the project archive first.
Project Resources
The complete project archive is provided for technical review needs beyond the live demo - allowing reviewers to inspect the configuration files directly.
This archive contains the server project exactly as used during development, including the entire plugins/ and configs/ folders, the ItemsAdder resource pack, custom ModelEngine models, custom item definitions, menu configuration, lootbox and boss configuration, and a copy of this documentation. The archive is intended specifically for technical review purposes, not for direct production deployment.
Server Environment
Complete specification of the environment where all modules were developed and tested.
Project Structure
Server directory structure, simplified to highlight the files relevant to the three assignment modules.
# Server directory structure (condensed) RIVRS-Server/ ├── plugins/ │ ├── DeluxeMenus/ │ │ ├── config.yml │ │ └── gui_menus/ │ │ ├── lootbox_shop.yml │ │ ├── lootbox_confirm.yml │ │ └── boss_menu.yml │ ├── CrazyCrates/ │ │ └── crates/ │ │ └── Lootbox.yml │ ├── MythicMobs/ │ │ ├── mobs/ │ │ │ └── Ace.yml │ │ ├── skills/ │ │ │ └── AceSkills.yml │ │ └── items/ │ │ └── AceItems.yml │ ├── ModelEngine/ │ │ └── models/ │ │ └── ace.emo.bbmodel │ ├── ItemsAdder/ │ │ └── contents/rivrs/ │ ├── RIVRSBridge/ │ │ ├── config.yml │ │ └── messages.yml │ ├── LuckPerms/ │ ├── WorldGuard/ │ └── ... (other plugins - see Plugin Reference) ├── configs/ │ └── backup-yaml/ # config snapshot before major changes ├── world/ │ └── (WorldGuard region: arena_ace) └── index.php # this document
- plugins/ - all binaries and default plugin configuration, one subfolder per plugin.
- configs/backup-yaml/ - manual snapshot before major structural changes, used for quick rollback during testing.
- world/ - the main world, including the WorldGuard region
arena_acethat bounds the boss fight area. - index.php - the main documentation at the project root, displaying a configuration summary on the web.
Architecture Summary
All three systems are connected within a single economy flow: players buy a key, open a crate, and potentially gain access to the boss fight as the top reward. The diagram below breaks this flow down from several technical angles.
Primary Flow
DeluxeMenus
Vault / Essentials
CrazyCrates
MythicMobs
Plugin Dependency Graph
Foundation layer
Consume core API
Custom visuals
Economy Flow
click_requirement
left_click_commands
console command
Gameplay Flow
EssentialsX Spawn
Citizens
DeluxeMenus / CrazyCrates
WorldGuard region
Configuration Flow
configs/
Hot reload
Manual test
Manual versioning
Boss System Flow
CrazyCrates reward
MythicMobs / ModelEngine
~onTimer
~onDeath
Purchase Interface
Boutique - Buy Lootbox Key
gui_menus/lootbox_shop.yml, gui_menus/lootbox_confirm.ymlThe main menu shows the Lootbox Key icon in the center slot, an info button (hover lore) explaining the crate mechanics, and a buy button that opens a separate confirmation screen before the transaction is executed.
The snippet below is read directly from the actual configuration file at configs/DeluxeMenus/gui_menus/ - not manually written in this document, so it always stays in sync with the file actually used by the server.
lootbox_shop.yml - Boutique Menu
register_command: true update_interval: 20 menu_title: '&#FF7A00&lINFERNAL &#FFD700&lLOOTBOX' open_command: - lootbox size: 27 items: border: material: BLACK_STAINED_GLASS_PANE display_name: " " slots: - 0-9 - 17-26 left_border: material: GRAY_STAINED_GLASS_PANE display_name: " " slots: - 18 right_border: material: GRAY_STAINED_GLASS_PANE display_name: " " slots: - 26 balance: material: SUNFLOWER slot: 10 display_name: '&#FFD700&lYOUR BALANCE' lore: - '' - '&7Current Money' - '' - '&e$%vault_eco_balance_formatted%' - '' - '&8Updates automatically.' key: material: ominous_trial_key slot: 13 enchantments: - DURABILITY;1 item_flags: - HIDE_ENCHANTS display_name: '&#FF6A00&lINFERNAL LOOTBOX KEY' lore: - '' - '&7A physical key used to' - '&7open the Infernal Lootbox.' - '' - '&fPrice' - '&a$100' - '' - '&7Click &aPurchase &7to continue.' buy: material: LIME_CONCRETE slot: 15 display_name: '7FF55&l▶ PURCHASE ◀' lore: - '' - '&7Buy one Infernal Lootbox Key' - '' - '&fCost' - '&a$100' - '' - '&aClick to continue.' left_click_commands: - '[sound] UI_BUTTON_CLICK' - '[openguimenu] lootbox_confirm' info: material: BOOK slot: 11 display_name: '�D4FF&lLOOTBOX INFORMATION' lore: - '' - '&#FFD700Possible Rewards' - '' - '&a$5,000 Cash' - '&bDiamond Sword' - '&dEpic Armor' - '&6Boss Egg' - '' - '&7All rewards are random.' - '&7Use your key on the crate.' close: material: BARRIER slot: 16 display_name: '&#FF5555&lCLOSE MENU' lore: - '' - '&7Return to the game.' left_click_commands: - '[sound] BLOCK_CHEST_CLOSE' - '[close]'
lootbox_confirm.yml - Confirmation & Balance Validation
register_command: true update_interval: 20 menu_title: '&#FF5555&lCONFIRM PURCHASE' open_command: - lootbox_confirm size: 27 items: border: material: BLACK_STAINED_GLASS_PANE display_name: " " slots: - 0-9 - 17-26 side_left: material: GRAY_STAINED_GLASS_PANE display_name: " " slots: - 18 side_right: material: GRAY_STAINED_GLASS_PANE display_name: " " slots: - 26 balance: material: SUNFLOWER slot: 10 display_name: '&#FFD700&lYOUR BALANCE' lore: - '' - '&e$%vault_eco_balance_formatted%' - '' - '&8Updated live.' key: material: ominous_trial_key slot: 13 enchantments: - DURABILITY;1 item_flags: - HIDE_ENCHANTS display_name: '&#FF6A00&lINFERNAL LOOTBOX KEY' lore: - '' - '&7You are about to purchase' - '&f1x Infernal Lootbox Key' - '' - '&fPrice' - '&a$100' - '' - '&7This purchase cannot be refunded.' confirm: material: LIME_CONCRETE slot: 15 display_name: '7FF55&l✔ CONFIRM' lore: - '' - '&7Purchase one key' - '' - '&fCost' - '&a$100' - '' - '&aClick to confirm.' left_click_requirement: requirements: hasmoney: type: has money amount: 100 deny_commands: - '[sound] ENTITY_VILLAGER_NO' - '[message] &#FF5555You do not have enough money.' - '[close]' left_click_commands: - '[player] eco take %player_name% 100' - '[console] crazycrates give physical Lootbox 1 %player_name%' - '[sound] ENTITY_PLAYER_LEVELUP' - '[message] 7FF55Purchase successful!' - '[message] &7Your Lootbox Key has been added.' - '[close]' cancel: material: BARRIER slot: 11 display_name: '&#FF5555&l✖ CANCEL' lore: - '' - '&7Return to Lootbox Shop.' left_click_commands: - '[sound] UI_BUTTON_CLICK' - '[openguimenu] lootbox_shop'
Design note: balance validation is handled via DeluxeMenus' built-in click_requirement (type has money) so failed-requirement logic and rejection messages stay consistent without any extra commands outside the provided plugins.
Loot Box System
Lootbox - CSGO Crate Type
plugins/CrazyCrates/crates/Lootbox.ymlA CSGO-type crate with an active preview, active hologram, and 4 weighted rewards at 40/35/20/5. RequiredKeys is currently set to 0 in the configuration, but a physical key is still used in the purchase flow through DeluxeMenus.
The snippet below is read directly from configs/CrazyCrates/crates/Lootbox.yml - the actual crate configuration file used by the server, not a manual copy.
Crate: # https://docs.crazycrew.us/mods/crazycrates/faq/#5-what-are-the-crate-types # Make sure to check out the wiki for anything not explained here. # https://docs.crazycrew.us/mods/crazycrates/ # See CosmicCrate.yml or CasinoCrate.yml to see how the Cosmic/Casino CrateType works. CrateType: CSGO # Starting amount of keys when the player 1st joins. StartingKeys: 0 # The amount of keys required to use the crate. RequiredKeys: 0 # Max amount of crates that can be opened at once using /crates mass-open Max-Mass-Open: 10 # If the crate shows in the /crates. # If the type is QuickCrate/CrateOnTheGo/FireCracker, They will not work as they require a Physical Crate. InGUI: true # Slot the item is in the GUI. Slot: 11 # Enables/Disables the Broadcasts message when they open a crate. OpeningBroadCast: true # Message that is broadcast when opening the crate. BroadCast: "%prefix%<bold><gold>%player%</bold><reset> <gray>is opening a <bold><green>RIVRS Crate.</bold>" # This section is related to commands opening when a crate is opened. opening-command: # If the commands should be sent or not. toggle: false # Available Placeholders: %prefix%, %player% (PlaceholderAPI included) commands: - "lootbox" sound: # The sound options when the animation is cycling. cycle-sound: # If sound should be enabled or not. toggle: true # The type of sound to use. # https://minecraft.wiki/w/Sounds.json#Java_Edition_values value: "block.note_block.xylophone" # The volume of the pitch. volume: 1.0 # The speed of the sound. pitch: 1.0 # The sound options when an item is clicked. click-sound: # If sound should be enabled or not. toggle: true # The type of sound to use. Custom sounds from texture packs are supported! # https://minecraft.wiki/w/Sounds.json#Java_Edition_values value: "ui.button.click" # The volume of the pitch. volume: 1.0 # The speed of the sound. pitch: 1.0 # The sound options when a crate ends. stop-sound: # If sound should be enabled or not. toggle: true # The type of sound to use. Custom sounds from texture packs are supported! # https://minecraft.wiki/w/Sounds.json#Java_Edition_values value: "entity.player.levelup" # The volume of the pitch. volume: 1.0 # The speed of the sound. pitch: 1.0 # A default message if the prize doesn't have any Messages # i.e. Messages: [] or the value isn't there. Prize-Message: - "<gray>You have won <red>%reward% <gray>from <red>%crate%." # A list of commands to run by default on every prize. # If you do not want these commands to run, set this to [] Prize-Commands: [] # Global Settings Settings: # This defines whether we should track how many times players opened this crate # True means track, False means don't track. Tracking-Crate-Opening: false # Handles settings related to the border Border: # Settings related to the glass border Glass-Border: Toggle: true "c"># Should the glass border be enabled? # Broadcast a message to the server Broadcast: # If the messages should be sent. Toggle: false # The messages to broadcast. Messages: - "<red>%player% won the prize <yellow>%reward%." # If the player has this permission, they don't get the broadcast. Permission: "" # Settings related to rewards. Rewards: # Should a yes/no popup be made, to ask if they want to keep the prize? Re-Roll-Spin: false # Should there be a limit to how many times they can re-roll? Permission: # Should this be enabled? Toggle: false # Should this persist restarts? i.e. writes to disk the amount of respins, and reads the amount of respins. Persist: false # This will define how many permissions will be registered to the server per crate. # i.e. crazycrates.respin.<crate_name>.1-20 # It will simply register multiple permissions, so it shows up in things like LuckPerms. Max-Cap: 20 # Item the crate is in the GUI Item: "diamond" # This allows use of the components list below. Hide-Flags: false # The types of components to hide. # https://jd.papermc.io/paper/io/papermc/paper/registry/keys/DataComponentTypeKeys.html, Grab the value from the description without minecraft: Components: - "enchantments" # The custom model data of the item, -1 is disabled. Custom-Model-Data: -1 # The item model, Mojang introduced this in 1.21.4... this replaces custom model data! # Set this to blank for it to do nothing. Model: # The namespace i.e. nexo Namespace: "" # The id i.e. emerald_helmet Id: "" # Should the item glow? # Available Types: add_glow, remove_glow, none Glowing: "none" # Name of the item in the GUI. Name: "<bold><green>RIVRS Crate</bold>" # The lore of the item in the GUI. Lore: - "<gray>This crate contains strange objects." - "<gray>You have <gold>%keys% keys <gray>to open this crate with." - "<gray>You have opened this crate: <gold>%crate_opened% times" - "<gray>(<yellow>!<gray>) Right click to view rewards." Preview: # The name of the inventory for the preview menu. Name: "<green>RIVRS Crate Preview" # Turn on and off the preview for this crate. Toggle: true # How many rows should the preview be? You can use 1-6. Rows: 4 # Settings related to the glass in the preview. Glass: # Turn the glass border in the preview on and off. Toggle: true # The name of the border item. Name: " " # The item that shows in the border. Can be glass or any other item. Item: "gray_stained_glass_pane" # The custom model data of the item, -1 is disabled. Custom-Model-Data: -1 # The item model, Mojang introduced this in 1.21.4... this replaces custom model data! # Set this to blank for it to do nothing. Model: # The namespace i.e. nexo Namespace: "" # The id i.e. emerald_helmet Id: "" # Settings related to animations... Animation: # This is only when an animation starts. # Set this to empty if you don't want to change it. Name: "Rolling your prize..." # The glass animation settings. Glass-Frame: # Should the glass animation be enabled? Toggle: true # If the glass animation option is set to false above, We will use static items. # If this is empty, We will use nothing. Items: "1": # The name of the item to display. name: " " # The lore of the item to display. lore: [ ] # The material to display. material: "gold_ingot" # The amount to display. amount: 1 # The random settings for the glass animation. Random: # Should the animation be random? Toggle: true # A list of items to use, If the list is empty. We will use glass panes internally. Items: "1": # The name of the item to display. name: " " # The lore of the item to display. lore: [ ] # The material to display. material: "gold_ingot" # The amount to display. amount: 1 "2": # The name of the item to display. name: " " # The lore of the item to display. lore: [ ] # The material to display. material: "iron_ingot" # The amount to display. amount: 1 # Settings related to physical keys. PhysicalKey: # Name of the Key. Name: "<bold><green>RIVRS crate Key</bold>" # Lore of the Key. Lore: - "<gray>A special Key" - "<gray>For a special RIVRS Lootbox." # The item the key is. Item: "ominous_trial_key" # The custom model data of the item, -1 is disabled. Custom-Model-Data: -1 # The item model, Mojang introduced this in 1.21.4... this replaces custom model data! # Set this to blank for it to do nothing. Model: # The namespace i.e. nexo Namespace: "" # The id i.e. emerald_helmet Id: "" # Should the item glow? # Available Types: add_glow, remove_glow, none Glowing: "add_glow" # Settings related to item flags. flags: # A list of components to hide on the key! I've linked a more detailed explanation below! # https://docs.crazycrew.us/mods/crazycrates/faq/#2-hideitemflags-no-longer-works-what-do-i-use-now components: [] # Settings for the holograms. Hologram: # Toggle on and off the holograms for the crates. Toggle: true # The height of the hologram above the crate. Height: 1.5 # The distance the hologram can be seen. Range: 8 # How often should the hologram update? -1 is disabled. Update-Interval: -1 # The background color of the hologram. It uses hex colors. This only works with CMI/FancyHolograms # Set the color to transparent if you don't want any color. Color: "transparent" # Whether to apply text shadow (FancyHolograms only) TextShadow: false # The message that will be displayed above the crate. # Note: MiniMessage or Color Codes being supported is depending on the 'holograms' plugin. Message: - "§a§lRIVRS Crate" # All the prizes that can be obtained in the Crate. # These prizes do not require any extra configuration # They will give the prizes based on what's already below. # See the AdvancedExample.yml for a more advanced crate. Prizes: "1": DisplayName: "<green>$5,000" DisplayItem: "emerald" DisplayAmount: 1 Weight: 40.0 DisplayLore: - "<gray>Receive $5,000" - "" - "<gold>Chance: 40%" Commands: - "eco give %player% 5000" "2": DisplayName: "<white>Dirt x64" DisplayItem: "dirt" DisplayAmount: 64 Weight: 35.0 DisplayLore: - "<gray>64 Dirt Blocks" - "" - "<gold>Chance: 35%" Items: "1": material: "dirt" amount: 64 "3": DisplayName: "<aqua>Sharpness V Sword" DisplayItem: "diamond_sword" DisplayAmount: 1 DisplayEnchantments: - "sharpness:5" Weight: 20.0 DisplayLore: - "<gray>Diamond Sword" - "<gray>Sharpness V" - "" - "<gold>Chance: 20%" Items: "1": material: "diamond_sword" enchantments: sharpness: 5 "4": DisplayName: "<#ff6600>Boss Egg" DisplayItem: "dragon_egg" DisplayAmount: 1 Weight: 5.0 DisplayLore: - "<gray>Summons Ace Boss" - "" - "<gold>Chance: 5%" Commands: - "ia give %player% boss_egg 1"
Boss Entity - Ace
Ace - 1v1 Boss Encounter
plugins/MythicMobs/mobs/Ace.ymlThe AceBoss is defined in MythicMobs with the Zombie type, 50 HP, 2 damage, an active BossBar, the ace_boss model via ModelEngine, and a full skill set: spawn intro, idle loop, random attack selector, phase 2/3, hurt reaction, and death skill.
Guaranteed Rewards
- Random money $1,000 – $5,000
- 200 experience points
- 3–5x Flame Fragment (custom item)
Bonus Rewards
Current implementation: the random skill selector is active via AceAttackSelector (FireSlash/Fireball/Dash/FlameWave), phase triggers are active at <70% and <40% health, and the death sequence is active via AceDeathSkill in plugins/MythicMobs/skills/AceSkills.yml.
The files below are read directly from configs/DeluxeMenus/ and configs/MythicMobs/ - not manually rewritten in this document.
boss_menu.yml - Boss Arena Entry Point
menu_title: '&cAce Boss Arena' open_command: - bossmenu size: 9 items: 'start_boss': material: DIAMOND_SWORD slot: 4 display_name: '&c&lStart 1v1 Battle' lore: - '&7Click to spawn Ace!' left_click_commands: - '[console] mm mobs spawn AceBoss %player_name%' - '[player] closemenu'
Ace.yml - Mob Definition
AceBoss: Type: ZOMBIE Display: '&4&l✦ ACE, LORD OF FLAMES ✦' Health: 50 Damage: 2 AIGoalSelectors: - clear - meleeattack - randomstroll - lookatplayers - float AITargetSelectors: - clear - players Options: AlwaysShowName: true PreventOtherDrops: true PreventRandomEquipment: true Silent: true KnockbackResistance: 1 MovementSpeed: 0.32 FollowRange: 40 MaxCombatDistance: 35 Despawn: false PreventSunburn: true PreventTransformation: true PreventMobKillDrops: true BossBar: Enabled: true Title: '&c☠ ACE - LORD OF FLAMES' Color: RED Style: SEGMENTED_10 Range: 50 Model: Engine: ModelEngine Model: ace_boss Invisible: true Hitbox: true Skills: ################################################## # SPAWN ################################################## - model{mid=ace_boss} @self ~onSpawn - skill{s=AceSpawnIntro} @self ~onSpawn ################################################## # IDLE ################################################## - skill{s=AceIdleLoop} @self ~onTimer:20 ################################################## # BASIC ATTACK ################################################## - skill{s=AceAttackSelector} @target ~onTimer:60 ################################################## # PHASE SYSTEM ################################################## - skill{s=AcePhase2} @self ~onDamaged ?health{h=<0.7} - skill{s=AcePhase3} @self ~onDamaged ?health{h=<0.4} # - skill{s=AceUltimatePhase} @self ~onDamaged ?health{h=<0.15} ################################################## # DEATH ################################################## - skill{s=AceDeathSkill} @self ~onDeath ################################################## # HURT ################################################## - skill{s=AceHurtReaction} @self ~onDamaged
AceSkills.yml - Skill List
######################################################## ################## ACE BOSS SKILLS ##################### ######################################################## # Model animations available: walk, idle, attack1, attack2, attack3, attack4 # walk/idle are handled automatically by ModelEngine's built-in state machine # based on mob movement. Only attack1-4 are manually triggered here. ######################################################## ######################################################## # SPAWN ######################################################## AceSpawnIntro: Cooldown: 99999 Skills: - state{s=idle} @self - sound{s=entity.wither.spawn;v=1;p=1} @PlayersInRadius{r=40} - delay 10 - effect:particles{p=flame;amount=250;hS=1;vS=2} @self - delay 10 - effect:particles{p=lava;amount=60;hS=1;vS=1} @self - delay 20 - effect:explosion @self - message{msg="&4&lACE &7» &cWho dares disturb my eternal flame?"} @PlayersInRadius{r=40} ######################################################## # IDLE ######################################################## AceIdleLoop: Skills: - state{s=idle} @self ######################################################## # HURT ######################################################## AceHurtReaction: Cooldown: 20 Skills: - sound{s=entity.blaze.hurt} @self - effect:particles{p=ash;amount=20} @self ######################################################## # ATTACK SELECTOR ######################################################## AceAttackSelector: Skills: - randomskill{ skills= AceFireSlash, AceFireball, AceDash, AceFlameWave } ######################################################## # FIRE SLASH (attack1) ######################################################## AceFireSlash: Cooldown: 60 Skills: - state{s=attack1} @self - sound{s=entity.player.attack.sweep} @self - delay 8 - effect:particles{p=sweep_attack;amount=1} @self - effect:particles{p=flame;amount=60;hS=1.5;vS=.3} @Forward{f=2} - damage{a=14} @PlayersInRadius{r=3} - ignite{ticks=80} @PlayersInRadius{r=3} ######################################################## # FIREBALL (attack2) ######################################################## AceFireball: Cooldown: 120 Skills: - state{s=attack2} @self - sound{s=entity.blaze.shoot} @self - delay 15 - projectile{ bulletType=FIREBALL; velocity=1.5; gravity=0; onTick=AceFireTrail; onHit=AceExplosion } AceFireTrail: Skills: - effect:particles{p=flame;amount=5} @origin AceExplosion: Skills: - effect:explosion - effect:particles{p=explosion_emitter;amount=1} - effect:particles{p=flame;amount=100} - effect:particles{p=lava;amount=40} - damage{a=18} - ignite{ticks=100} ######################################################## # DASH (attack3) ######################################################## AceDash: Cooldown: 140 Skills: - state{s=attack3} @self - sound{s=entity.blaze.shoot} @self - effect:particles{p=smoke;amount=50} @self - leap{velocity=2} @target - delay 5 - effect:particles{p=flame;amount=80} @self - damage{a=10} @PlayersInRadius{r=2} ######################################################## # FLAME WAVE (attack4) ######################################################## AceFlameWave: Cooldown: 160 Skills: - state{s=attack4} @self - delay 20 - sound{s=entity.generic.explode} @self - effect:particles{p=flame;amount=200;hS=6;vS=.2} @self - damage{a=15} @PlayersInRadius{r=6} - ignite{ticks=120} @PlayersInRadius{r=6} ######################################################## # PHASE 2 ######################################################## AcePhase2: Cooldown: 99999 Skills: - message{msg="&6ACE &7» &cFeel the flames!"} @PlayersInRadius{r=40} - potion{type=SPEED;duration=999999;level=1} @self - potion{type=STRENGTH;duration=999999;level=1} @self - effect:particles{p=flame;amount=300;hS=2;vS=2} @self ######################################################## # PHASE 3 ######################################################## AcePhase3: Cooldown: 99999 Skills: - message{msg="&4ACE &7» &4YOU WILL ALL BURN!"} @PlayersInRadius{r=40} - effect:particles{p=lava;amount=250;hS=3;vS=2} @self - potion{type=SPEED;duration=999999;level=2} @self - potion{type=STRENGTH;duration=999999;level=2} @self ######################################################## # ULTIMATE (attack4 reused for max impact) ######################################################## AceUltimatePhase: Cooldown: 99999 Skills: - message{msg="&c&lACE IS UNLEASHING INFERNO!!"} @PlayersInRadius{r=60} - state{s=attack4} @self - delay 30 - effect:particles{p=explosion_emitter;amount=10} @self - effect:particles{p=flame;amount=500;hS=8;vS=3} @self - damage{a=30} @PlayersInRadius{r=8} - ignite{ticks=200} @PlayersInRadius{r=8} ######################################################## # DEATH ######################################################## AceDeathSkill: Skills: - sound{s=entity.wither.death} @self - delay 20 - effect:particles{p=ash;amount=200} @self - effect:particles{p=smoke;amount=200} @self - delay 20 - effect:explosion @self
AceItems.yml - Reward Drops
flame_fragment: Id: blaze_powder Display: '&6Flame Fragment' Lore: - '&7Material used for crafting.' common_flame_essence: Id: magma_cream Display: '&fCommon Flame Essence' rare_flame_essence: Id: magma_cream Display: '&bRare Flame Essence' epic_flame_essence: Id: magma_cream Display: '&5Epic Flame Essence'
Plugin Reference
Technical documentation for the core plugins that make up the three modules above - covering the selection rationale, dependencies, configuration location, and interaction with other plugins.
DeluxeMenus
- Dependency
- PlaceholderAPI (optional), Vault (optional)
- Configuration Location
plugins/DeluxeMenus/gui_menus/*.yml- Reason for Selection
- The most flexible GUI for YAML-based menus without needing to compile a custom plugin; the built-in click_requirement simplifies balance validation.
- Interaction
- Triggers CrazyCrates console commands and reads Vault/PlaceholderAPI placeholders to display the player balance in real time.
- Notes
- Used for lootbox_shop.yml, lootbox_confirm.yml, and boss_menu.yml.
CrazyCrates
- Dependency
- Vault (economy, optional)
- Configuration Location
plugins/CrazyCrates/crates/Lootbox.yml- Reason for Selection
- Supports the CSGO crate type with a built-in drop-rate preview, well suited for the weighted lootbox requirement without building a custom animation from scratch.
- Interaction
- Called from DeluxeMenus after a successful purchase validation; the top reward triggers a boss spawn via MythicMobs.
- Notes
- Reward weights are aligned 1:1 with the percentages requested by the recruiter.
MythicMobs Premium
- Dependency
- ModelEngine, ItemsAdder (for custom assets)
- Configuration Location
plugins/MythicMobs/mobs/Ace.yml- Reason for Selection
- The industry standard for custom bosses/mobs with a trigger-based skill system, far more maintainable than command blocks.
- Interaction
- Reads models from ModelEngine, item drops from ItemsAdder, and the combat region from WorldGuard.
- Notes
- The boss skills use ~onTimer and ~onDeath triggers.
ModelEngine
- Dependency
- MythicMobs (for entity binding)
- Configuration Location
plugins/ModelEngine/models/ace.emo.bbmodel- Reason for Selection
- Enables a custom 3D model for the Ace boss without a separate resource pack for the entity, keeping the visual identity consistent.
- Interaction
- The model is bound to the MythicMobs mob definition via the Model: option.
- Notes
- Exported from Blockbench, tested on the Java client before binding.
ItemsAdder
- Dependency
- ProtocolLib, PlaceholderAPI
- Configuration Location
plugins/ItemsAdder/contents/rivrs/- Reason for Selection
- Provides a custom item/furniture/block system with an integrated resource pack generator, used for the Flame Fragment/Essence.
- Interaction
- Custom items are referenced as reward drops in MythicMobs and as the DisplayItem in CrazyCrates.
- Notes
- The resource pack is auto-hosted and distributed to the client on join.
Citizens
- Dependency
- CitizensCMD (internal addon)
- Configuration Location
plugins/Citizens/saves.yml- Reason for Selection
- Interactive NPC to direct players to the boutique/lootbox without needing a sign or static hologram.
- Interaction
- The NPC command opens the DeluxeMenus menu via CitizensCMD.
- Notes
- Placed in the spawn area near the boutique.
ProtocolLib
- Dependency
- - (base library)
- Configuration Location
- (no main config file)- Reason for Selection
- A required dependency for ItemsAdder and several packet-level UI effects; avoids duplicating libraries across plugins.
- Interaction
- Used internally by ItemsAdder and several other visual plugins.
- Notes
- No manual configuration required.
Vault
- Dependency
- Economy provider (EssentialsX)
- Configuration Location
plugins/Vault/config.yml- Reason for Selection
- The standard economy/permission API bridge read by almost every plugin in this stack, avoiding vendor lock-in to a single economy plugin.
- Interaction
- Acts as an intermediary between EssentialsX (economy provider) and DeluxeMenus/CrazyCrates (consumers).
- Notes
- Active economy provider: EssentialsX.
PlaceholderAPI
- Dependency
- Per-plugin expansion (Vault, MythicMobs, etc.)
- Configuration Location
plugins/PlaceholderAPI/expansions/- Reason for Selection
- The de facto standard for cross-plugin placeholders; lets menus dynamically display balance, boss name, and lootbox status.
- Interaction
- Bridges nearly all GUI plugins with real-time data from other plugins.
- Notes
- Active expansions: Vault, Player, Server.
Custom Plugin - RIVRSBridge
RIVRSBridge is an internal plugin developed entirely by the candidate, beyond the required scope of the assignment, to demonstrate engineering initiative and an understanding of architecture that can be extended in the future.
RIVRSBridge - Web Integration Layer
config.yml, messages.ymlRIVRSBridge acts as a bridge between the Minecraft server and external web services. Based on plugins/RIVRSBridge/config.yml, the active endpoint is https://rivrs.ourprojects.id/dashboard/index.php?action=update with a 10-second snapshot interval and the economy/lootbox/boss-kills features enabled.
Capabilities & Design Goals
- Communication bridge between the Minecraft server and external web services
- Foundation for future dashboard integration
- REST communication support
- WebSocket communication support
- Telemetry data collection
- Real-time server statistics
- Player data synchronization
- Moderation log
- Event auditing
- Economy data synchronization
- Webhook integration
- Foundation for future authentication
- Foundation for future Discord integration
- Live monitoring
- API-first architecture
Read directly from configs/RIVRSBridge/:
config.yml
# ================================ # RIVRSBridge - Professional Config # Paper 1.21.x Data Reporter # ================================ # ------------------------------------------------------------ # connection-settings # - Mengatur URL endpoint dan timeout jaringan. # ------------------------------------------------------------ connection-settings: # Endpoint PHP yang akan menerima POST JSON. # Contoh: https://domain.tld/dashboard/index.php?action=update api: endpoint: "https://rivrs.ourprojects.id/dashboard/index.php?action=update" "c"># <-- Ganti ke endpoint Anda timeouts: # Timeout koneksi ke server (connect). Jika web mati atau lambat, request akan gagal cepat. connect-timeout-ms: 60000 "c"># 5 detik # Guard timeout untuk read/response. Di HttpClient Java, guard ini biasanya diterapkan via request timeout. # Tujuannya: mencegah request menggantung. read-timeout-ms: 60000 "c"># 5 detik # Timeout total untuk sebuah request HTTP. # Recommended: sedikit lebih besar dari connect-timeout. request-timeout-ms: 65000 "c"># 8 detik # ------------------------------------------------------------ # monitoring-intervals # - Mengatur seberapa sering server mengirim snapshot. # ------------------------------------------------------------ monitoring-intervals: # Interval pengiriman snapshot ke endpoint. # Semakin kecil: data lebih realtime, namun makin banyak request. # Recommended untuk produksi: 10-60 detik. snapshot-interval-seconds: 10 "c"># Kirim setiap 10 detik # ------------------------------------------------------------ # features-enabled # - Mengaktifkan/nonaktifkan fitur pengumpulan data. # ------------------------------------------------------------ features-enabled: # Mengaktifkan logging debug internal. # Jika true, akan lebih banyak log dari ReporterService. debug: false # Mengaktifkan integrasi ekonomi via Vault. vault-economy: enabled: true # Mengaktifkan pengumpulan data lootbox. # Catatan: Implementasi event lootbox tergantung API plugin lootbox (contoh: CrazyCrates). lootbox: enabled: true # Mengaktifkan pengumpulan data boss kills via MythicMobs. boss-kills: enabled: true # ------------------------------------------------------------ # security-settings # - Keamanan untuk akses endpoint eksternal. # ------------------------------------------------------------ security-settings: # API Key yang akan dikirim via header HTTP: # X-API-KEY: <api-key> api-key: "Asdd220805!?" "c"># <-- Ganti dengan API key Anda retry: # Max percobaan pengiriman snapshot. # Requirement: maksimal 3 kali. max-attempts: 1 initial-backoff-ms: 250000
messages.yml
# messages.yml # RIVRSBridge — Pesan pemain & sistem (Custom Plugin) errors: insufficient_funds: "&cTransaksi gagal: saldo tidak mencukupi." endpoint_unreachable: "&8[RIVRSBridge] &7Endpoint tidak dapat dijangkau, snapshot dilewati." invalid_response: "&8[RIVRSBridge] &7Respons endpoint tidak valid." reward: received: "&aKamu menerima reward: %reward_name%" boss_drop: "&6Ace menjatuhkan %item_name%!" boss: spawn_announce: "&4&lAce &7has entered the arena!" death_announce: "&4&lAce &7has been defeated!" system: startup: "&8[RIVRSBridge] &7Bridge aktif — snapshot tiap %interval% detik." shutdown: "&8[RIVRSBridge] &7Bridge dinonaktifkan."
Extra Plugins Rationale
Several additional plugins were installed beyond the list provided by the recruiter. This section explains the technical reasoning behind them.
- Improves maintainability - plugins like
DecentHologramsavoid the need for manual armor-stand-based holograms. - Improves interoperability -
ProtocolLibis provided as a common dependency for packet-level effects used by other plugins. - Improves the debugging and configuration workflow -
ConditionalEventsmakes it easier to test conditions without command blocks. - Improves long-term scalability -
RIVRSBridgeas a foundation for external integration. - Improves the quality of the technical presentation -
CitizensCMDfor a more interactive NPC in the boutique area. - Improves client compatibility -
ViaVersion,Geyser-Spigot, andFloodgateextend cross-version and cross-platform testing coverage.
Configuration Documentation
A summary of the function and key configuration keys of each YAML file making up the three modules, including the RIVRSBridge configuration files.
Defines the boutique GUI layout: item slot, info lore, and the buy button that opens lootbox_confirm.
menu_title
open_command
size
items.buy.left_click_commands
Handles balance validation via left_click_requirement and executes the transaction (eco take + give physical key).
left_click_requirement.requirements.hasmoney
left_click_requirement.deny_commands
left_click_commands
CrazyCrates crate definition: CSGO type, weighted reward list, and preview display.
CrateType
Prizes
Weight
DisplayItem
MythicMobs mob definition for the Ace boss: base stats, model binding, skill list, and drop table.
Type
Model
Health
Skills
Drops
Global RIVRSBridge configuration: API endpoint, telemetry interval, and per-module feature toggles.
api.endpoint
telemetry.interval
features.economy_sync
Collection of player messages for failed validation, reward notifications, and other system messages.
errors.insufficient_funds
reward.received
boss.spawn_announce
Plugin Compatibility Matrix
Compatibility of core plugins with the Paper version, Java client, Bedrock client, and hot-reload capability without a server restart.
| Plugin | Paper 1.21.x | Java Client | Bedrock Client | Hot Reload |
|---|---|---|---|---|
| DeluxeMenus | ✓ | ✓ | ✓ (via Geyser) | ✓ |
| CrazyCrates | ✓ | ✓ | ✓ (via Geyser) | ✓ |
| MythicMobs | ✓ | ✓ | Partial (limited VFX skills) | ✓ |
| ModelEngine | ✓ | ✓ | ✗ (custom model is Java-only) | Restart required |
| ItemsAdder | ✓ | ✓ | ✓ (resource pack auto-convert) | ✓ |
| RIVRSBridge | ✓ | ✓ | ✓ (platform agnostic) | ✓ |
Integration Notes - Plugin Stack
Complete list of plugins installed on the local server, including those provided by the recruiter and personal additions to support cross-system integration.
| Plugin | Version | Category | Function |
|---|---|---|---|
| CrazyCrates | 5.1.0 | Reward | Crate, key, and reward system. |
| Citizens | 2.0.43-b4213 | NPC | Creates interactive NPCs. |
| CitizensCMD | 2.7.2 | NPC Addon | Runs commands through Citizens NPCs. |
| ConditionalEvents | 4.78.1 | Automation | Runs events based on specific conditions. |
| DecentHolograms | 2.10.1 | Visual | Displays holograms and floating text. |
| DeluxeMenus | 1.14.2 DEV-213 | GUI | Creates custom GUIs/menus. |
| EssentialsX | 2.22.0 | Core | Basic server commands: /spawn, /home, /warp. |
| EssentialsX Spawn | 2.22.0 | Spawn | Manages the server spawn point. |
| Floodgate | Latest | Bedrock Support | Allows Bedrock players without a Java account. |
| Geyser-Spigot | Latest | Bedrock Support | Bridges Bedrock to Java Edition. |
| ItemsAdder | 4.0.17 | Custom Content | Custom items, furniture, blocks, resource packs. |
| LuckPerms | 5.5.59 | Permission | Permission and group system. |
| ModelEngine | R4.1.0 | Custom Model | 3D models for mobs and NPCs. |
| MythicMobs Premium | 5.13.0-SNAPSHOT | RPG | Custom mobs, bosses, skills, AI, RPG mechanics. |
| PlaceholderAPI | 2.12.2 | API | Cross-plugin placeholders. |
| ProtocolLib | Latest | Library | Network packet manipulation. |
| RIVRSBridge | 1.0.0 | Custom Plugin | Internal bridge/integration for the RIVRS system. |
| Vault | Latest | API | Economy, Permission, and Chat API. |
| ViaVersion | 5.10.0 | Compatibility | Supports newer client versions. |
| WorldEdit | 7.4.4 | Building | Fast world editing via commands. |
| WorldGuard | 7.0.17 | Protection | Region protection & area flags. |
Additional justification: RIVRSBridge is used as an internal bridge for server telemetry/monitoring purposes; not required for this case study but still actively running alongside it. ProtocolLib is added as a common dependency for several of the GUI/particle plugins above.
Testing & Validation
An engineering validation matrix replaces a simple checklist, recording test scenarios, expected results, actual results, status, and additional notes.
| Scenario | Expected | Actual | Status | Notes |
|---|---|---|---|---|
| Purchase - open /lootbox and click purchase | Confirm menu opens from lootbox_shop | Matches configuration | Pass | Command open: lootbox |
| Confirm Purchase - balance >= 100 | eco take + give physical key + success message | Matches configuration | Pass | left_click_requirement has money=100 |
| Confirm Purchase - balance < 100 | deny message & close | Matches configuration | Pass | Message: You do not have enough money |
| Crate Prize Weight | 40/35/20/5 | Matches Lootbox.yml | Pass | Prize 1-4 |
| Boss Spawn via boss_menu | mm mobs spawn AceBoss %player_name% | Matches configuration | Pass | open_command: bossmenu |
| AceBoss Model Binding | ace_boss model attached on spawn | Matches configuration | Pass | ModelEngine + skill onSpawn |
| Ace Skills Selector | Random skill: FireSlash/Fireball/Dash/FlameWave | Matches configuration | Pass | AceAttackSelector |
| Ace Phase Trigger | Phase2 <70%, Phase3 <40% | Matches configuration | Pass | onDamaged health condition |
| RIVRSBridge Endpoint Push | POST snapshot every 10 seconds to the endpoint | Matches configuration | Pass | snapshot-interval-seconds: 10 |
| ConditionalEvents /announce | Requires $500 + 15s cooldown | Matches configuration | Pass | event9 |
Known Issues
Currently known limitations, along with workarounds, risk levels, and mitigation steps.
| Issue | Workaround | Risk | Mitigation |
|---|---|---|---|
| The Ace boss has not gone through full combat testing | The implementation plan is already documented in Module 03 | Medium | Testing is scheduled before final submission; the results will update the Testing & Validation section. |
| The ModelEngine custom model does not display on the Bedrock client | Bedrock can still interact with the vanilla mob hitbox | Low | A platform limitation (ModelEngine is Java-only), not a configuration bug. |
| Reloading ModelEngine requires a server restart | Model changes are scheduled outside active testing hours | Low | Documented in the Compatibility Matrix, does not affect other modules. |
| The RIVRSBridge dashboard is still a prototype | The endpoint is available for demonstration, not yet for production | Low | Explicitly documented as a foundation, not a required deliverable. |
Roadmap
Further development plans beyond the assignment scope, showing the long-term direction of the architecture already laid down through RIVRSBridge.
v1.1
- Read-only live dashboard for server statistics
- Database-backed player data storage (SQLite → MySQL)
- Player statistics sync via RIVRSBridge
v1.2
- Basic analytics (retention, actual drop rate vs config)
- Discord notification integration for boss events
- Moderation audit log via webhook
v2.0
- Daily & weekly bosses with scaled rewards
- Multi-player raid boss
- Scheduled dynamic events based on configuration
Performance Considerations
Design decisions made to maintain TPS stability and server memory consumption when all modules are active simultaneously.
TPS
Boss skills are scheduled with separate cooldowns to avoid tick spikes when several skills trigger at once.
Memory
6 GB heap allocation with Aikar GC flags to reduce micro-stutter when the ItemsAdder resource pack loads.
Boss Optimization
The boss ~onTimer trigger is radius-limited so it does not compute pathfinding when the area is empty.
Model Optimization
The ModelEngine model uses the minimum bone count needed for combat animation, avoiding render overhead.
ItemsAdder Optimization
The resource pack is compressed and auto-hosted to speed up client download time.
Chunk Loading
The boss arena sits in a pre-generated area so it does not trigger on-demand chunk generation during combat.
Security Considerations
Permission design and validation principles applied to maintain server integrity during and after the testing process.
Permission Design
All sensitive commands are restricted via LuckPerms groups following the least-privilege principle - default players have no access to admin commands.
Command Restrictions
Console commands from DeluxeMenus/CrazyCrates are executed in a console context, not as an operator, to prevent accidental privilege escalation.
Operator Safety
The operator account is kept separate from the daily testing account to reduce the risk of configuration mistakes on the live server.
Economy Validation
Balance validation is performed server-side via click_requirement, not dependent on client state.
Server Integrity
RIVRSBridge runs as a non-invasive process and can be fully disabled without affecting the core assignment modules.
Conclusion
The Purchase Interface, Loot Box System, and Boss Entity (Ace) modules are already synced with the actual configuration of the My Server project and are ready for review. Further updates are optional, for enriching media documentation (screenshots/videos) and gameplay balancing iterations.
Beyond the three required modules, this project also demonstrates a broader engineering mindset: structured documentation, a custom plugin (RIVRSBridge) as a foundation for future integration, and an environment directly verifiable through the live demo and project archive. The goal isn't just to meet the requirements, but to show how those requirements can be built on a scalable and maintainable foundation.
Appendix
Official Plugin Documentation
- DeluxeMenus Wiki - wiki.helpch.at/helpchat-plugins/deluxemenus
- MythicMobs Wiki - git.mythiccraft.io/mythiccraft/MythicMobs
- ItemsAdder Docs - itemsadder.devs.beer
- CrazyCrates Docs - https://crazycrates.badbones69.com/
- ModelEngine Docs - https://mythiccraft.gitbook.io/modelengine
- LuckPerms Docs - https://luckperms.net/wiki/Home
- WorldGuard Docs - https://worldguard.enginehub.org/en/latest/
- PlaceholderAPI Docs - https://wiki.placeholderapi.com/
Server Access
- Java:
mark-webpage.gl.joinmc.link - Bedrock:
mark-webpage.gl.at.ply.gg:12177 - Bedrock (alternative):
147.185.221.225:12177
Dashboard & Downloads
- RIVRSBridge dashboard prototype - https://rivrs.ourprojects.id/dashboard/
- Server Package (ZIP) - My Server.zip
Configuration File Index
lootbox_shop.yml- Defines the boutique GUI layout: item slot, info lore, and the buy button that opens lootbox_confirm.lootbox_confirm.yml- Handles balance validation via left_click_requirement and executes the transaction (eco take + give physical key).Lootbox.yml- CrazyCrates crate definition: CSGO type, weighted reward list, and preview display.Ace.yml- MythicMobs mob definition for the Ace boss: base stats, model binding, skill list, and drop table.config.yml- Global RIVRSBridge configuration: API endpoint, telemetry interval, and per-module feature toggles.messages.yml- Collection of player messages for failed validation, reward notifications, and other system messages.
Version History
| Version | Timeline | Notes |
|---|---|---|
| v0.1 | Initial session | Server setup, basic plugin installation, folder structure. |
| v0.5 | Mid-progress | lootbox_shop.yml & lootbox_confirm.yml completed and passed testing. |
| v0.8 | Later stage | Lootbox.yml completed, drop-rate aligned, animation tested. |
| v0.9 | Current | Documentation expanded into full engineering documentation; Ace.yml in progress. |
Credits
All configuration, documentation, and the custom plugin (RIVRSBridge) in this project were prepared by Dwiky as part of the Minecraft Configuration Specialist - Technical Case Study. Third-party plugins remain the copyright of their respective developers as listed in the Plugin Reference.