ShiroCore
Library for ShiroVerse project
ShiroCore
<p align="center"> <a href="https://github.com/tantaihaha4487/ShiroVerse/actions/workflows/build-plugin.yml" style="text-decoration:none;"><img src="https://github.com/tantaihaha4487/QDropConfirm/actions/workflows/build-plugin.yml/badge.svg" alt="Build Status"></a> <a href="https://github.com/tantaihaha4487/ShiroVerse/releases/latest" style="text-decoration:none;"><img src="https://img.shields.io/github/v/release/tantaihaha4487/ShiroVerse?style=flat-square" alt="Latest Release"></a> <a href="https://jitpack.io/#tantaihaha4487/ShiroVerse" style="text-decoration:none;"><img src="https://jitpack.io/v/tantaihaha4487/ShiroVerse.svg" alt="jitpack badge"></a> </p>
ShiroCore
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.
---
🛠️ Understanding the Components: Engine vs. API
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.
`ShiroCore` — The Engine
- Developers: The actual Spigot/Paper plugin that you install on your Minecraft server. It's the heart of the system. - Developers: 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. - Developers: - Developers: You install this single plugin in your `plugins` folder. It's the powerhouse that makes all dependent plugins work. - Developers: Your plugins require `ShiroCore` to be present on the server to function. It's the runtime environment for your creations.
`shiro-api` — The Developer Kit
- Developers: A lightweight Java library (`.jar`) that developers use to write their own plugins that integrate with `ShiroCore`. - Developers: 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: - `AbilityManager`: For registering and managing your custom abilities. - `ShiftAbility`: An abstract class you extend to create your own shift-activated skills quickly. - `ActionbarMessage`: A utility for creating stylish progress bars and alerts. - `DependencyLogger`: A utility for professional, consistent dependency error logging. - Developers: - Developers: You include `shiro-api` as a dependency in your plugin's `pom.xml` (or other build system). It is your toolbox for building new gameplay features on top of the ShiroCore engine.
---
🌟 Core Features
1. Shift Activation System
Create abilities that activate through rapid shift-key spamming (configurable threshold).
- 🎯 Material-Based Registration - Set custom shift count requirements - 📊 Material-Based Registration - Track activation progress in real-time - 🎨 Material-Based Registration - Beautiful progress bars with mini-font support - ⚡ Material-Based Registration - Register specific materials for activation
2. Ability Manager API
Simplified API for creating and managing shift-activated abilities.
- 🔌 Thread-Safe - Easy integration with any Spigot/Paper plugin - 🔄 Thread-Safe - Handles activation/deactivation automatically - 🎮 Thread-Safe - Built-in event handling for abilities - 🛡️ Thread-Safe - Concurrent-safe ability tracking
3. Action Bar Utilities
Create stylish action bar messages with multiple design options.
- 🎨 Alert Messages - Default, gradient, and minimalist loading bars - 🔤 Alert Messages - Small, clean text rendering - 🌈 Alert Messages - Full color customization - ⚡ Alert Messages - Pre-formatted alert system
4. Dependency Logger
Professional, consistent dependency error messaging for your plugins.
- 📦 Reusable - Beautiful bordered error boxes - 🎯 Reusable - Built-in version mismatch warnings - 🔗 Reusable - Automatic ShiroCore download links - ♻️ Reusable - Use across all your ShiroCore-dependent plugins
---
📦 Installation
As a Server Plugin
1. Download the latest JAR from Releases 2. Place in your server's `plugins` folder 3. Restart the server
As a Dependency
Add to your `pom.xml`:
```xml <repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
<dependencies> <dependency> <groupId>com.github.tantaihaha4487.ShiroVerse</groupId> <artifactId>shiro-api</artifactId> <version>v1.21.10-2.0.0</version> <scope>provided</scope> </dependency> </dependencies> ```
Add to your `plugin.yml`: ```yaml depend: [ShiroCore] ```
---
🚀 Quick Start
Example 1: Create a Shift-Activated Ability
```java import net.thanachot.ShiroCore.api.ability.AbilityManager; import net.thanachot.ShiroCore.api.ability.ShiftAbility;
public class MyPlugin extends JavaPlugin {
@Override public void onEnable() { // Get the AbilityManager AbilityManager manager = AbilityManager.getOrThrow();
// Register your custom ability manager.registerAbility(new SuperJumpAbility()); } }
// Custom ability class public class SuperJumpAbility extends ShiftAbility { private final Set<UUID> activePlayers = new HashSet<>();
public SuperJumpAbility() { super("superjump", item -> item != null && item.getType() == Material.FEATHER ); }
@Override public void onActivate(Player player, ItemStack item) { activePlayers.add(player.getUniqueId()); player.sendActionBar(Component.text("Super Jump Activated!") .color(NamedTextColor.GREEN)); player.addPotionEffect(new PotionEffect( PotionEffectType.JUMP, Integer.MAX_VALUE, 2 )); }
@Override public void onDeactivate(Player player) { activePlayers.remove(player.getUniqueId()); player.removePotionEffect(PotionEffectType.JUMP); }
@Override public boolean isActive(Player player) { return activePlayers.contains(player.getUniqueId()); } } ```
That's it! The ability will: - ✅ Automatically listen for shift-spam events - ✅ Show progress bar on action bar - ✅ Activate when threshold is reached - ✅ Deactivate when item is swapped
---
Example 2: Action Bar Messages
```java import net.thanachot.ShiroCore.api.text.ActionbarMessage;
// Simple loading bar Component loadingBar = ActionbarMessage.getLoadingBar(currentProgress, maxProgress); player.sendActionBar(loadingBar);
// Stylized gradient bar Component gradientBar = ActionbarMessage.getStylizedLoadingBar( current, max, NamedTextColor.AQUA, // filled color NamedTextColor.GRAY // empty color );
// Minimalist dot bar Component dotBar = ActionbarMessage.getDotLoadingBar(current, max);
// Alert message Component alert = ActionbarMessage.getAlert("Warning!", NamedTextColor.RED); ```
Output Examples: ``` ╞═══▰════╡ 40% (Default) 【█▓▒░░░░░░░】 40% (Gradient) ●●●●○○○○○○ 40% (Dots) (i) Warning! (Alert) ```
---
Example 3: Dependency Checking
```java import net.thanachot.shiroverse.api.util.DependencyLogger; import org.bukkit.plugin.Plugin;
public class MyPlugin extends JavaPlugin {
private static final String REQUIRED_SHIROCORE_VERSION = "2.0.0";
@Override public void onEnable() { if (!checkShiroCore()) { // Plugin will continue but without ShiroCore features return; }
// Initialize ShiroCore features initializeAbilities(); }
private boolean checkShiroCore() { Plugin shiroCore = getServer().getPluginManager().getPlugin("ShiroCore");
if (shiroCore == null) { logShiroCoreNotFound(); return false; }
String version = shiroCore.getPluginMeta().getVersion(); if (!version.contains(REQUIRED_SHIROCORE_VERSION)) { logIncompatibleVersion(version); return false; }
return true; }
private void logShiroCoreNotFound() { try { DependencyLogger.logShiroCoreNotFound( getLogger(), "MyPlugin", REQUIRED_SHIROCORE_VERSION ); } catch (NoClassDefFoundError e) { getLogger().warning("ShiroCore NOT FOUND! MyPlugin requires ShiroCore v" + REQUIRED_SHIROCORE_VERSION + "+"); } }
private void logIncompatibleVersion(String foundVersion) { try { DependencyLogger.logIncompatibleVersion( getLogger(), foundVersion, REQUIRED_SHIROCORE_VERSION ); } catch (NoClassDefFoundError e) { getLogger().warning("INCOMPATIBLE ShiroCore VERSION! Found: " + foundVersion + ", Required: v" + REQUIRED_SHIROCORE_VERSION + "+"); } } } ```
Benefits: - ✅ Professional, consistent error messages - ✅ Clear instructions for server admins - ✅ Graceful degradation if DependencyLogger unavailable - ✅ Reusable across all your plugins
---
📚 API Documentation
AbilityManager
```java // Get the manager AbilityManager manager = AbilityManager.getOrThrow();
// Register an ability manager.registerAbility(ShiftAbility ability);
// Unregister an ability manager.unregisterAbility(String abilityId);
// Get a player's active ability Optional<ShiftAbility> active = manager.getActiveAbility(Player player);
// Check if player has any ability active boolean hasAbility = manager.hasActiveAbility(Player player);
// Deactivate all abilities for a player manager.deactivateAll(Player player); ```
ShiftActivation (Low-Level API)
```java // Get the service ShiftActivation shift = ShiftActivation.getOrThrow();
// Set shift count required shift.setMaxProgress(10);
// Register materials for shift activation shift.register(handler, Material.NETHERITE_PICKAXE, Material.DIAMOND_SWORD);
// Check if material is registered boolean registered = shift.isRegistered(Material.NETHERITE_PICKAXE); ```
Events
```java // Listen to shift progress @EventHandler public void onShiftProgress(ShiftProgressEvent event) { Player player = event.getPlayer(); int progress = event.getPercentage(); Component message = event.getActionBarMessage();
// Cancel to prevent default behavior event.setCancelled(true); }
// Listen to shift activation @EventHandler public void onShiftActivation(ShiftActivationEvent event) { Player player = event.getPlayer(); ItemStack item = event.getItem();
// Your custom logic } ```
DependencyLogger
```java import net.thanachot.shiroverse.api.util.DependencyLogger;
// Log when ShiroCore is not found DependencyLogger.logShiroCoreNotFound( getLogger(), "YourPlugin", // Your plugin name "2.0.0" // Required ShiroCore version );
// Log when ShiroCore version is incompatible DependencyLogger.logIncompatibleVersion( getLogger(), "1.0.0", // Found version "2.0.0" // Required version );
// Log custom dependency errors DependencyLogger.logDependencyError( getLogger(), "DEPENDENCY ERROR!", "ShiroCore API is required.", "Please install ShiroCore v2.0.0+" );
// Get ShiroCore download URL String url = DependencyLogger.getShiroCoreUrl(); ```
Output Example: ``` ╔════════════════════════════════════════════════════════════╗ ║ ShiroCore NOT FOUND! ║ ║ YourPlugin requires ShiroCore v2.0.0+ ║ ║ for abilities to work. ║ ║ ║ ║ The plugin will continue without ability features. ║ ║ ║ ║ Download ShiroCore from: ║ ║ → https://modrinth.com/plugin/shirocore ║ ╚════════════════════════════════════════════════════════════╝ ```
Best Practice - Use with try-catch: ```java private void checkDependencies() { try { DependencyLogger.logShiroCoreNotFound( getLogger(), "MyPlugin", "2.0.0" ); } catch (NoClassDefFoundError e) { // Fallback if DependencyLogger isn't available getLogger().warning("ShiroCore required!"); } }
---
🎨 Action Bar Styles
ShiroCore provides three beautiful loading bar styles:
1. Default Style
```java ActionbarMessage.getLoadingBar(current, max) ``` `╞═══▰════╡ 40%`
Features: - Smooth transition character (▰) - Green filled, black empty - Clean, modern look
2. Gradient Style
```java ActionbarMessage.getStylizedLoadingBar(current, max, filledColor, emptyColor) ``` `【█▓▒░░░░░░░】 40%`
Features: - Multi-level gradient effect (█ ▓ ▒ ░) - Custom color support - Asian-style brackets
3. Minimalist Dots
```java ActionbarMessage.getDotLoadingBar(current, max) ``` `●●●●○○○○○○ 40%`
Features: - Clean, simple design - Filled/empty dot indicators - Minimal visual noise
---
🏗️ Architecture
``` ShiroCore ├── api/ │ ├── ability/ │ │ ├── ShiftAbility.java (Abstract base class) │ │ └── AbilityManager.java (Service API) │ ├── event/ │ │ ├── ShiftProgressEvent.java │ │ ├── ShiftActivationEvent.java │ │ └── ShiftEvent.java │ ├── text/ │ │ └── ActionbarMessage.java │ ├── util/ │ │ └── DependencyLogger.java (Dependency logging) │ └── ShiftActivation.java └── internal/ ├── ability/ │ ├── AbilityManagerImpl.java (Implementation) │ └── AbilityListener.java (Event handling) ├── handler/ │ └── ShiftActivationHandler.java └── system/ └── ShiftActivationService.java ```
---
💡 Use Cases
What You Can Build
- 🔨 Custom Mechanics - Pickaxes with 3x3 mining, shovels with area digging - ⚔️ Custom Mechanics - Swords with special attacks, bows with enhanced arrows - 🏃 Custom Mechanics - Speed boots, jump abilities, teleportation - 🛡️ Custom Mechanics - Shields with absorption, armor with resistance - 🎯 Custom Mechanics - Anything that activates via shift-spam!
Real World Example: SuperPickaxe
Check out the SuperPickaxe-Prototype plugin that uses ShiroCore:
- 🔨 3x3 block breaking - 🎨 Beautiful activation effects - ⚡ Only ~80 lines of code (thanks to ShiroCore!)
---
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
1. Fork the project 2. Create your feature branch (`git checkout -b feature/AmazingFeature`) 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) 4. Push to the branch (`git push origin feature/AmazingFeature`) 5. Open a Pull Request
---
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
---
🔗 Links
- Issues: Issues - Issues: %%MD1%% - Issues: %%MD2%%
---
✨ Credits
Created by tantaihaha4487 for the ShiroVerse project.
Special thanks to all contributors and the Minecraft development community!
---
<p align="center"> <sub>Built with ❤️ for the Minecraft community</sub> </p>