{"id":138746,"date":"2026-06-08T08:05:10","date_gmt":"2026-06-08T05:05:10","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/"},"modified":"2026-06-08T08:05:10","modified_gmt":"2026-06-08T05:05:10","slug":"shirocore","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/","title":{"rendered":"ShiroCore"},"content":{"rendered":"<p align=\"center\">\n  <img decoding=\"async\" src=\"https:\/\/github.com\/tantaihaha4487\/QDropConfirm\/actions\/workflows\/build-plugin.yml\/badge.svg\" alt=\"Build Status\"><br \/>\n  <img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/v\/release\/tantaihaha4487\/ShiroVerse?style=flat-square\" alt=\"Latest Release\"><br \/>\n  <img decoding=\"async\" src=\"https:\/\/jitpack.io\/v\/tantaihaha4487\/ShiroVerse.svg\" alt=\"jitpack badge\">\n<\/p>\n<p># ShiroCore<\/p>\n<p>**ShiroCore** is a powerful library plugin for Minecraft (Spigot\/Paper) designed to simplify the creation of complex, interactive player abilities. It provides a robust framework for shift-activated skills, complete with progress bars, event handling, and a clean API, allowing developers to focus on building unique gameplay mechanics.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udee0\ufe0f Understanding the Components: Engine vs. API<\/p>\n<p>The ShiroVerse project is composed of two key modules that work together: `ShiroCore` (the engine) and `shiro-api` (the developer kit). Understanding their distinct roles is crucial for using the framework effectively.<\/p>\n<p>### **`ShiroCore` \u2014 The Engine**<\/p>\n<p>&#8211; **What It Is:** The actual Spigot\/Paper plugin that you install on your Minecraft server. It&#8217;s the heart of the system.<br \/>\n&#8211; **What It Does:** It contains all the core logic for detecting player actions (like shift-spamming), managing ability states, handling cooldowns, and displaying visual feedback like action bar progress bars.<br \/>\n&#8211; **Who It&#8217;s For:**<br \/>\n    &#8211; **Server Owners:** You install this single plugin in your `plugins` folder. It&#8217;s the powerhouse that makes all dependent plugins work.<br \/>\n    &#8211; **Developers:** Your plugins require `ShiroCore` to be present on the server to function. It&#8217;s the runtime environment for your creations.<\/p>\n<p>### **`shiro-api` \u2014 The Developer Kit**<\/p>\n<p>&#8211; **What It Is:** A lightweight Java library (`.jar`) that developers use to write their own plugins that integrate with `ShiroCore`.<br \/>\n&#8211; **What It Does:** It provides a clean and simple API to register custom abilities, listen to events, and control the activation system without needing to access the complex internal code of the engine. Key components include:<br \/>\n    &#8211; `AbilityManager`: For registering and managing your custom abilities.<br \/>\n    &#8211; `ShiftAbility`: An abstract class you extend to create your own shift-activated skills quickly.<br \/>\n    &#8211; `ActionbarMessage`: A utility for creating stylish progress bars and alerts.<br \/>\n    &#8211; `DependencyLogger`: A utility for professional, consistent dependency error logging.<br \/>\n&#8211; **Who It&#8217;s For:**<br \/>\n    &#8211; **Developers:** You include `shiro-api` as a dependency in your plugin&#8217;s `pom.xml` (or other build system). It is your toolbox for building new gameplay features on top of the ShiroCore engine.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udf1f Core Features<\/p>\n<p>### **1. Shift Activation System**<br \/>\nCreate abilities that activate through rapid shift-key spamming (configurable threshold).<\/p>\n<p>&#8211; \ud83c\udfaf **Configurable Progress** &#8211; Set custom shift count requirements<br \/>\n&#8211; \ud83d\udcca **Progress Events** &#8211; Track activation progress in real-time<br \/>\n&#8211; \ud83c\udfa8 **Action Bar Integration** &#8211; Beautiful progress bars with mini-font support<br \/>\n&#8211; \u26a1 **Material-Based Registration** &#8211; Register specific materials for activation<\/p>\n<p>### **2. Ability Manager API**<br \/>\nSimplified API for creating and managing shift-activated abilities.<\/p>\n<p>&#8211; \ud83d\udd0c **Plugin-Friendly** &#8211; Easy integration with any Spigot\/Paper plugin<br \/>\n&#8211; \ud83d\udd04 **Automatic State Management** &#8211; Handles activation\/deactivation automatically<br \/>\n&#8211; \ud83c\udfae **Event-Driven** &#8211; Built-in event handling for abilities<br \/>\n&#8211; \ud83d\udee1\ufe0f **Thread-Safe** &#8211; Concurrent-safe ability tracking<\/p>\n<p>### **3. Action Bar Utilities**<br \/>\nCreate stylish action bar messages with multiple design options.<\/p>\n<p>&#8211; \ud83c\udfa8 **Multiple Styles** &#8211; Default, gradient, and minimalist loading bars<br \/>\n&#8211; \ud83d\udd24 **Mini-Font Support** &#8211; Small, clean text rendering<br \/>\n&#8211; \ud83c\udf08 **Custom Colors** &#8211; Full color customization<br \/>\n&#8211; \u26a1 **Alert Messages** &#8211; Pre-formatted alert system<\/p>\n<p>### **4. Dependency Logger**<br \/>\nProfessional, consistent dependency error messaging for your plugins.<\/p>\n<p>&#8211; \ud83d\udce6 **Standardized Messages** &#8211; Beautiful bordered error boxes<br \/>\n&#8211; \ud83c\udfaf **Version Checking** &#8211; Built-in version mismatch warnings<br \/>\n&#8211; \ud83d\udd17 **Helpful Links** &#8211; Automatic ShiroCore download links<br \/>\n&#8211; \u267b\ufe0f **Reusable** &#8211; Use across all your ShiroCore-dependent plugins<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udce6 Installation<\/p>\n<p>### **As a Server Plugin**<br \/>\n1. Download the latest JAR from Releases<br \/>\n2. Place in your server&#8217;s `plugins` folder<br \/>\n3. Restart the server<\/p>\n<p>### **As a Dependency**<\/p>\n<p>Add to your `pom.xml`:<\/p>\n<p>&#8220;`xml<br \/>\n<repositories><br \/>\n    <repository><br \/>\n        <id>jitpack.io<\/id><br \/>\n        <url>https:\/\/jitpack.io<\/url><br \/>\n    <\/repository><br \/>\n<\/repositories><\/p>\n<p><dependencies><br \/>\n    <dependency><br \/>\n        <groupId>com.github.tantaihaha4487.ShiroVerse<\/groupId><br \/>\n        <artifactId>shiro-api<\/artifactId><br \/>\n        <version>v1.21.10-2.0.0<\/version><br \/>\n        <scope>provided<\/scope><br \/>\n    <\/dependency><br \/>\n<\/dependencies><br \/>\n&#8220;`<\/p>\n<p>Add to your `plugin.yml`:<br \/>\n&#8220;`yaml<br \/>\ndepend: [ShiroCore]<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\ude80 Quick Start<\/p>\n<p>### **Example 1: Create a Shift-Activated Ability**<\/p>\n<p>&#8220;`java<br \/>\nimport net.thanachot.ShiroCore.api.ability.AbilityManager;<br \/>\nimport net.thanachot.ShiroCore.api.ability.ShiftAbility;<\/p>\n<p>public class MyPlugin extends JavaPlugin {<\/p>\n<p>    @Override<br \/>\n    public void onEnable() {<br \/>\n        \/\/ Get the AbilityManager<br \/>\n        AbilityManager manager = AbilityManager.getOrThrow();<\/p>\n<p>        \/\/ Register your custom ability<br \/>\n        manager.registerAbility(new SuperJumpAbility());<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/ Custom ability class<br \/>\npublic class SuperJumpAbility extends ShiftAbility {<br \/>\n    private final Set<UUID> activePlayers = new HashSet<>();<\/p>\n<p>    public SuperJumpAbility() {<br \/>\n        super(&#8220;superjump&#8221;, item -><br \/>\n            item != null &#038;&#038; item.getType() == Material.FEATHER<br \/>\n        );<br \/>\n    }<\/p>\n<p>    @Override<br \/>\n    public void onActivate(Player player, ItemStack item) {<br \/>\n        activePlayers.add(player.getUniqueId());<br \/>\n        player.sendActionBar(Component.text(&#8220;Super Jump Activated!&#8221;)<br \/>\n            .color(NamedTextColor.GREEN));<br \/>\n        player.addPotionEffect(new PotionEffect(<br \/>\n            PotionEffectType.JUMP,<br \/>\n            Integer.MAX_VALUE,<br \/>\n            2<br \/>\n        ));<br \/>\n    }<\/p>\n<p>    @Override<br \/>\n    public void onDeactivate(Player player) {<br \/>\n        activePlayers.remove(player.getUniqueId());<br \/>\n        player.removePotionEffect(PotionEffectType.JUMP);<br \/>\n    }<\/p>\n<p>    @Override<br \/>\n    public boolean isActive(Player player) {<br \/>\n        return activePlayers.contains(player.getUniqueId());<br \/>\n    }<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>**That&#8217;s it!** The ability will:<br \/>\n&#8211; \u2705 Automatically listen for shift-spam events<br \/>\n&#8211; \u2705 Show progress bar on action bar<br \/>\n&#8211; \u2705 Activate when threshold is reached<br \/>\n&#8211; \u2705 Deactivate when item is swapped<\/p>\n<p>&#8212;<\/p>\n<p>### **Example 2: Action Bar Messages**<\/p>\n<p>&#8220;`java<br \/>\nimport net.thanachot.ShiroCore.api.text.ActionbarMessage;<\/p>\n<p>\/\/ Simple loading bar<br \/>\nComponent loadingBar = ActionbarMessage.getLoadingBar(currentProgress, maxProgress);<br \/>\nplayer.sendActionBar(loadingBar);<\/p>\n<p>\/\/ Stylized gradient bar<br \/>\nComponent gradientBar = ActionbarMessage.getStylizedLoadingBar(<br \/>\n    current,<br \/>\n    max,<br \/>\n    NamedTextColor.AQUA,  \/\/ filled color<br \/>\n    NamedTextColor.GRAY    \/\/ empty color<br \/>\n);<\/p>\n<p>\/\/ Minimalist dot bar<br \/>\nComponent dotBar = ActionbarMessage.getDotLoadingBar(current, max);<\/p>\n<p>\/\/ Alert message<br \/>\nComponent alert = ActionbarMessage.getAlert(&#8220;Warning!&#8221;, NamedTextColor.RED);<br \/>\n&#8220;`<\/p>\n<p>**Output Examples:**<br \/>\n&#8220;`<br \/>\n\u255e\u2550\u2550\u2550\u25b0\u2550\u2550\u2550\u2550\u2561 40%          (Default)<br \/>\n\u3010\u2588\u2593\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u3011 40%        (Gradient)<br \/>\n\u25cf\u25cf\u25cf\u25cf\u25cb\u25cb\u25cb\u25cb\u25cb\u25cb 40%          (Dots)<br \/>\n(i) Warning!            (Alert)<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>### **Example 3: Dependency Checking**<\/p>\n<p>&#8220;`java<br \/>\nimport net.thanachot.shiroverse.api.util.DependencyLogger;<br \/>\nimport org.bukkit.plugin.Plugin;<\/p>\n<p>public class MyPlugin extends JavaPlugin {<\/p>\n<p>    private static final String REQUIRED_SHIROCORE_VERSION = &#8220;2.0.0&#8221;;<\/p>\n<p>    @Override<br \/>\n    public void onEnable() {<br \/>\n        if (!checkShiroCore()) {<br \/>\n            \/\/ Plugin will continue but without ShiroCore features<br \/>\n            return;<br \/>\n        }<\/p>\n<p>        \/\/ Initialize ShiroCore features<br \/>\n        initializeAbilities();<br \/>\n    }<\/p>\n<p>    private boolean checkShiroCore() {<br \/>\n        Plugin shiroCore = getServer().getPluginManager().getPlugin(&#8220;ShiroCore&#8221;);<\/p>\n<p>        if (shiroCore == null) {<br \/>\n            logShiroCoreNotFound();<br \/>\n            return false;<br \/>\n        }<\/p>\n<p>        String version = shiroCore.getPluginMeta().getVersion();<br \/>\n        if (!version.contains(REQUIRED_SHIROCORE_VERSION)) {<br \/>\n            logIncompatibleVersion(version);<br \/>\n            return false;<br \/>\n        }<\/p>\n<p>        return true;<br \/>\n    }<\/p>\n<p>    private void logShiroCoreNotFound() {<br \/>\n        try {<br \/>\n            DependencyLogger.logShiroCoreNotFound(<br \/>\n                getLogger(),<br \/>\n                &#8220;MyPlugin&#8221;,<br \/>\n                REQUIRED_SHIROCORE_VERSION<br \/>\n            );<br \/>\n        } catch (NoClassDefFoundError e) {<br \/>\n            getLogger().warning(&#8220;ShiroCore NOT FOUND! MyPlugin requires ShiroCore v&#8221;<br \/>\n                + REQUIRED_SHIROCORE_VERSION + &#8220;+&#8221;);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void logIncompatibleVersion(String foundVersion) {<br \/>\n        try {<br \/>\n            DependencyLogger.logIncompatibleVersion(<br \/>\n                getLogger(),<br \/>\n                foundVersion,<br \/>\n                REQUIRED_SHIROCORE_VERSION<br \/>\n            );<br \/>\n        } catch (NoClassDefFoundError e) {<br \/>\n            getLogger().warning(&#8220;INCOMPATIBLE ShiroCore VERSION! Found: &#8221;<br \/>\n                + foundVersion + &#8220;, Required: v&#8221; + REQUIRED_SHIROCORE_VERSION + &#8220;+&#8221;);<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>**Benefits:**<br \/>\n&#8211; \u2705 Professional, consistent error messages<br \/>\n&#8211; \u2705 Clear instructions for server admins<br \/>\n&#8211; \u2705 Graceful degradation if DependencyLogger unavailable<br \/>\n&#8211; \u2705 Reusable across all your plugins<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcda API Documentation<\/p>\n<p>### **AbilityManager**<\/p>\n<p>&#8220;`java<br \/>\n\/\/ Get the manager<br \/>\nAbilityManager manager = AbilityManager.getOrThrow();<\/p>\n<p>\/\/ Register an ability<br \/>\nmanager.registerAbility(ShiftAbility ability);<\/p>\n<p>\/\/ Unregister an ability<br \/>\nmanager.unregisterAbility(String abilityId);<\/p>\n<p>\/\/ Get a player&#8217;s active ability<br \/>\nOptional<ShiftAbility> active = manager.getActiveAbility(Player player);<\/p>\n<p>\/\/ Check if player has any ability active<br \/>\nboolean hasAbility = manager.hasActiveAbility(Player player);<\/p>\n<p>\/\/ Deactivate all abilities for a player<br \/>\nmanager.deactivateAll(Player player);<br \/>\n&#8220;`<\/p>\n<p>### **ShiftActivation (Low-Level API)**<\/p>\n<p>&#8220;`java<br \/>\n\/\/ Get the service<br \/>\nShiftActivation shift = ShiftActivation.getOrThrow();<\/p>\n<p>\/\/ Set shift count required<br \/>\nshift.setMaxProgress(10);<\/p>\n<p>\/\/ Register materials for shift activation<br \/>\nshift.register(handler, Material.NETHERITE_PICKAXE, Material.DIAMOND_SWORD);<\/p>\n<p>\/\/ Check if material is registered<br \/>\nboolean registered = shift.isRegistered(Material.NETHERITE_PICKAXE);<br \/>\n&#8220;`<\/p>\n<p>### **Events**<\/p>\n<p>&#8220;`java<br \/>\n\/\/ Listen to shift progress<br \/>\n@EventHandler<br \/>\npublic void onShiftProgress(ShiftProgressEvent event) {<br \/>\n    Player player = event.getPlayer();<br \/>\n    int progress = event.getPercentage();<br \/>\n    Component message = event.getActionBarMessage();<\/p>\n<p>    \/\/ Cancel to prevent default behavior<br \/>\n    event.setCancelled(true);<br \/>\n}<\/p>\n<p>\/\/ Listen to shift activation<br \/>\n@EventHandler<br \/>\npublic void onShiftActivation(ShiftActivationEvent event) {<br \/>\n    Player player = event.getPlayer();<br \/>\n    ItemStack item = event.getItem();<\/p>\n<p>    \/\/ Your custom logic<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>### **DependencyLogger**<\/p>\n<p>&#8220;`java<br \/>\nimport net.thanachot.shiroverse.api.util.DependencyLogger;<\/p>\n<p>\/\/ Log when ShiroCore is not found<br \/>\nDependencyLogger.logShiroCoreNotFound(<br \/>\n    getLogger(),<br \/>\n    &#8220;YourPlugin&#8221;,      \/\/ Your plugin name<br \/>\n    &#8220;2.0.0&#8221;            \/\/ Required ShiroCore version<br \/>\n);<\/p>\n<p>\/\/ Log when ShiroCore version is incompatible<br \/>\nDependencyLogger.logIncompatibleVersion(<br \/>\n    getLogger(),<br \/>\n    &#8220;1.0.0&#8221;,          \/\/ Found version<br \/>\n    &#8220;2.0.0&#8221;           \/\/ Required version<br \/>\n);<\/p>\n<p>\/\/ Log custom dependency errors<br \/>\nDependencyLogger.logDependencyError(<br \/>\n    getLogger(),<br \/>\n    &#8220;DEPENDENCY ERROR!&#8221;,<br \/>\n    &#8220;ShiroCore API is required.&#8221;,<br \/>\n    &#8220;Please install ShiroCore v2.0.0+&#8221;<br \/>\n);<\/p>\n<p>\/\/ Get ShiroCore download URL<br \/>\nString url = DependencyLogger.getShiroCoreUrl();<br \/>\n&#8220;`<\/p>\n<p>**Output Example:**<br \/>\n&#8220;`<br \/>\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557<br \/>\n\u2551  ShiroCore NOT FOUND!                                      \u2551<br \/>\n\u2551  YourPlugin requires ShiroCore v2.0.0+                     \u2551<br \/>\n\u2551  for abilities to work.                                    \u2551<br \/>\n\u2551                                                            \u2551<br \/>\n\u2551  The plugin will continue without ability features.        \u2551<br \/>\n\u2551                                                            \u2551<br \/>\n\u2551  Download ShiroCore from:                                  \u2551<br \/>\n\u2551  \u2192 https:\/\/modrinth.com\/plugin\/shirocore                   \u2551<br \/>\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d<br \/>\n&#8220;`<\/p>\n<p>**Best Practice &#8211; Use with try-catch:**<br \/>\n&#8220;`java<br \/>\nprivate void checkDependencies() {<br \/>\n    try {<br \/>\n        DependencyLogger.logShiroCoreNotFound(<br \/>\n            getLogger(), &#8220;MyPlugin&#8221;, &#8220;2.0.0&#8221;<br \/>\n        );<br \/>\n    } catch (NoClassDefFoundError e) {<br \/>\n        \/\/ Fallback if DependencyLogger isn&#8217;t available<br \/>\n        getLogger().warning(&#8220;ShiroCore required!&#8221;);<br \/>\n    }<br \/>\n}<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udfa8 Action Bar Styles<\/p>\n<p>ShiroCore provides **three beautiful loading bar styles**:<\/p>\n<p>### **1. Default Style**<br \/>\n&#8220;`java<br \/>\nActionbarMessage.getLoadingBar(current, max)<br \/>\n&#8220;`<br \/>\n`\u255e\u2550\u2550\u2550\u25b0\u2550\u2550\u2550\u2550\u2561 40%`<\/p>\n<p>**Features:**<br \/>\n&#8211; Smooth transition character (\u25b0)<br \/>\n&#8211; Green filled, black empty<br \/>\n&#8211; Clean, modern look<\/p>\n<p>### **2. Gradient Style**<br \/>\n&#8220;`java<br \/>\nActionbarMessage.getStylizedLoadingBar(current, max, filledColor, emptyColor)<br \/>\n&#8220;`<br \/>\n`\u3010\u2588\u2593\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u3011 40%`<\/p>\n<p>**Features:**<br \/>\n&#8211; Multi-level gradient effect (\u2588 \u2593 \u2592 \u2591)<br \/>\n&#8211; Custom color support<br \/>\n&#8211; Asian-style brackets<\/p>\n<p>### **3. Minimalist Dots**<br \/>\n&#8220;`java<br \/>\nActionbarMessage.getDotLoadingBar(current, max)<br \/>\n&#8220;`<br \/>\n`\u25cf\u25cf\u25cf\u25cf\u25cb\u25cb\u25cb\u25cb\u25cb\u25cb 40%`<\/p>\n<p>**Features:**<br \/>\n&#8211; Clean, simple design<br \/>\n&#8211; Filled\/empty dot indicators<br \/>\n&#8211; Minimal visual noise<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udfd7\ufe0f Architecture<\/p>\n<p>&#8220;`<br \/>\nShiroCore<br \/>\n\u251c\u2500\u2500 api\/<br \/>\n\u2502   \u251c\u2500\u2500 ability\/<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 ShiftAbility.java          (Abstract base class)<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 AbilityManager.java        (Service API)<br \/>\n\u2502   \u251c\u2500\u2500 event\/<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 ShiftProgressEvent.java<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 ShiftActivationEvent.java<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 ShiftEvent.java<br \/>\n\u2502   \u251c\u2500\u2500 text\/<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 ActionbarMessage.java<br \/>\n\u2502   \u251c\u2500\u2500 util\/<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 DependencyLogger.java      (Dependency logging)<br \/>\n\u2502   \u2514\u2500\u2500 ShiftActivation.java<br \/>\n\u2514\u2500\u2500 internal\/<br \/>\n    \u251c\u2500\u2500 ability\/<br \/>\n    \u2502   \u251c\u2500\u2500 AbilityManagerImpl.java    (Implementation)<br \/>\n    \u2502   \u2514\u2500\u2500 AbilityListener.java       (Event handling)<br \/>\n    \u251c\u2500\u2500 handler\/<br \/>\n    \u2502   \u2514\u2500\u2500 ShiftActivationHandler.java<br \/>\n    \u2514\u2500\u2500 system\/<br \/>\n        \u2514\u2500\u2500 ShiftActivationService.java<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udca1 Use Cases<\/p>\n<p>### **What You Can Build**<\/p>\n<p>&#8211; \ud83d\udd28 **Super Tools** &#8211; Pickaxes with 3&#215;3 mining, shovels with area digging<br \/>\n&#8211; \u2694\ufe0f **Combat Abilities** &#8211; Swords with special attacks, bows with enhanced arrows<br \/>\n&#8211; \ud83c\udfc3 **Movement Skills** &#8211; Speed boots, jump abilities, teleportation<br \/>\n&#8211; \ud83d\udee1\ufe0f **Defensive Powers** &#8211; Shields with absorption, armor with resistance<br \/>\n&#8211; \ud83c\udfaf **Custom Mechanics** &#8211; Anything that activates via shift-spam!<\/p>\n<p>### **Real World Example: SuperPickaxe**<\/p>\n<p>Check out the SuperPickaxe-Prototype plugin that uses ShiroCore:<\/p>\n<p>&#8211; \ud83d\udd28 3&#215;3 block breaking<br \/>\n&#8211; \ud83c\udfa8 Beautiful activation effects<br \/>\n&#8211; \u26a1 Only ~80 lines of code (thanks to ShiroCore!)<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83e\udd1d Contributing<\/p>\n<p>Contributions are welcome! Please feel free to submit a Pull Request.<\/p>\n<p>1. Fork the project<br \/>\n2. Create your feature branch (`git checkout -b feature\/AmazingFeature`)<br \/>\n3. Commit your changes (`git commit -m &#8216;Add some AmazingFeature&#8217;`)<br \/>\n4. Push to the branch (`git push origin feature\/AmazingFeature`)<br \/>\n5. Open a Pull Request<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcc4 License<\/p>\n<p>This project is licensed under the MIT License &#8211; see the LICENSE file for details.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udd17 Links<\/p>\n<p>&#8211; **GitHub**: tantaihaha4487\/ShiroVerse<br \/>\n&#8211; **JitPack**: ShiroCore on JitPack<br \/>\n&#8211; **Issues**: Report a Bug<\/p>\n<p>&#8212;<\/p>\n<p>## \u2728 Credits<\/p>\n<p>Created by **tantaihaha4487** for the ShiroVerse project.<\/p>\n<p>Special thanks to all contributors and the Minecraft development community!<\/p>\n<p>&#8212;<\/p>\n<p align=\"center\">\n  <sub>Built with \u2764\ufe0f for the Minecraft community<\/sub><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Library for ShiroVerse project<\/p>\n","protected":false},"featured_media":138747,"template":"","meta":{"_minecraft_slug":"shirocore","_minecraft_project_id":"Zxu6cKYi","_minecraft_author":"tantaihaha4487","_minecraft_license":"MIT","_minecraft_downloads":110,"_minecraft_follows":1,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"shirocore.zip","_minecraft_size_bytes":129847,"_minecraft_version_count":5,"_minecraft_updated_at":"2026-05-15T19:28:53.143085Z","_minecraft_date_created":"2025-12-02T04:30:52.437237Z","_minecraft_date_modified":"2025-12-06T19:31:28.615256Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/shirocore","_minecraft_icon_attachment_id":138747,"_minecraft_imported_at":"2026-06-08T05:05:11+00:00","_minecraft_import_hash":"d32d0ec47d5a42ead8bdbe9af181a9f8","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[89,873,126,127,128],"mod_loader":[132,133],"minecraft_version":[62,37,40,41,73,74,38,78,79,80,81,82],"class_list":["post-138746","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-game-mechanics","mod_category-library","mod_category-management","mod_category-paper","mod_category-purpur","mod_loader-paper","mod_loader-purpur","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-10","minecraft_version-1-21-11","minecraft_version-1-21-2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8","minecraft_version-1-21-9"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>ShiroCore - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ShiroCore - Minecraft\" \/>\n<meta property=\"og:description\" content=\"Library for ShiroVerse project\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta property=\"og:image\" content=\"https:\/\/github.com\/tantaihaha4487\/QDropConfirm\/actions\/workflows\/build-plugin.yml\/badge.svg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/shirocore\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/shirocore\\\/\",\"name\":\"ShiroCore - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/shirocore\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/shirocore\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/shirocore-icon-5be4f5093e5bbc11f5546d8b66553d3d29e79290_96.webp\",\"datePublished\":\"2026-06-08T05:05:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/shirocore\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/shirocore\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/shirocore\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/shirocore-icon-5be4f5093e5bbc11f5546d8b66553d3d29e79290_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/shirocore-icon-5be4f5093e5bbc11f5546d8b66553d3d29e79290_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/shirocore\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"ShiroCore\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ShiroCore - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/","og_locale":"en_US","og_type":"article","og_title":"ShiroCore - Minecraft","og_description":"Library for ShiroVerse project","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/","og_site_name":"Minecraft","og_image":[{"url":"https:\/\/github.com\/tantaihaha4487\/QDropConfirm\/actions\/workflows\/build-plugin.yml\/badge.svg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/","name":"ShiroCore - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/shirocore-icon-5be4f5093e5bbc11f5546d8b66553d3d29e79290_96.webp","datePublished":"2026-06-08T05:05:10+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/shirocore-icon-5be4f5093e5bbc11f5546d8b66553d3d29e79290_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/shirocore-icon-5be4f5093e5bbc11f5546d8b66553d3d29e79290_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/shirocore\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"ShiroCore"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/138746","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/138747"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=138746"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=138746"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=138746"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=138746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}