# saberslay/slayercore architecture

> Architecture diagram of the GitHub repository saberslay/slayercore, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-05-14). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/saberslay/slayercore
- Repository: https://github.com/saberslay/slayercore

## Overview

1. **What this repo is**
   - SlayerCore is a **Java/Maven library** with a small **Spigot/Paper plugin layer** on top.
   - The code is organized as a reusable “core” utility toolkit plus a Minecraft-specific integration package.

2. **Top-level split: core vs Spigot**
   - `com.saberslay.slayercore.core` contains framework-agnostic utilities.
   - `com.saberslay.slayercore.spigot` contains platform-specific plugin code that depends on the Spigot runtime and likely acts as the entrypoint for Minecraft server usage.
   - This is the main architectural boundary in the repo.

3. **Plugin/runtime entrypoint**
   - `SlayerCore.java` is the main plugin class, backed by `src/main/resources/plugin.yml`.
   - That means the Spigot side is deployed as a plugin jar, not a standalone app.
   - The plugin layer likely wires registration and listeners during server startup.

4. **Logging subsystem**
   - `core.logging` provides a colored terminal logger with `Logger`, `Level`, and ANSI color support via `ConsoleColors`.
   - The README shows this as a general-purpose console output API with timestamped, level-based messages.
   - This subsystem is purely output-facing; it does not depend on Spigot.

5. **Audio / composition subsystem**
   - `core.composers.NokiaComposer` generates simple Nokia-style monophonic tones.
   - The README shows synchronous/asynchronous playback and configurable note length, play style, looping, and volume.
   - Architecturally, this is an independent utility module that spawns background playback work rather than blocking the caller.

6. **Asset I/O subsystem**
   - `core.io.ImageLoader` and `SpriteSheet` indicate image loading and sprite slicing utilities.
   - This layer is where external files become in-memory assets, likely for game/tooling use.
   - It is separate from plugin logic, so the repo can support visual resources without hardwiring them to Minecraft APIs.

7. **Serialization subsystem**
   - `core.serialization` contains a small type system: `SCBase`, `SCObject`, `SCArray`, `SCString`, `SCField`, `SCDatabase`, plus `Type`, `ContainerType`, and `SerializationUtils`.
   - The shape suggests a custom structured-data model with nested objects/arrays and typed fields.
   - This is likely the repo’s main data interchange layer for converting domain objects into a serialized form and back.

8. **System and metadata utilities**
   - `core.system.AppInfo` reads application metadata, and the README ties it to Maven jar manifest entries.
   - This creates a build-time/runtime bridge: the jar must be packaged with implementation entries so version info is available at runtime.

9. **Formatting and time helpers**
   - `core.formatting.NumberFormatter` handles numeric presentation.
   - `core.time.Time` likely provides time abstractions or conversions used by logging and other utilities.
   - These are small supporting utilities rather than major subsystems.

10. **Spigot custom-item flow**
   - `spigot.CustomItem`, `ItemRegistry`, and `listeners.CustomItemListener` form a small item-management pipeline.
   - The registry likely stores custom item definitions; the listener reacts to game events and routes them through those definitions.
   - This is the main game-facing behavior in the plugin layer.

11. **Dependencies and boundaries**
   - The repo appears self-contained: no database, message broker, or external service integration is visible.
   - The only obvious runtime dependency is the **Spigot API** for the plugin side; everything else is internal utility code.
   - Most subsystems are reusable independently, which is why they live under `core` rather than inside the plugin package.

12. **How to think about the architecture diagram**
   - Draw a central `core` library box with branches for logging, serialization, IO/assets, audio composition, formatting/time, and system metadata.
   - Draw a separate `spigot` box that consumes core utilities and exposes plugin lifecycle, item registry, and event listeners.
   - Show resource/package inputs flowing into the core utilities: console output, image files, serialized data, and plugin metadata/version info.

Main entry points: [`src/main/java/com/saberslay/slayercore/core`](https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core) (Core), [`src/main/java/com/saberslay/slayercore/spigot`](https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/spigot) (Spigot), [`src/main/java/com/saberslay/slayercore/core/logging`](https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core/logging) (Logging), [`src/main/java/com/saberslay/slayercore/spigot/SlayerCore.java`](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/spigot/SlayerCore.java) (SlayerCore)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_core["Core library"]
  node_core_root["Core"]
  node_logging["Logging<br/>output subsystem"]
  node_serialization["Serialization<br/>data model"]
  node_io_assets["Image I/O<br/>asset loader"]
  node_composer["Composer<br/>audio utility<br/>[NokiaComposer.java]"]
  node_formatting["Formatting<br/>presentation helper"]
  node_time["Time<br/>[Time.java]"]
  node_system["App Info<br/>metadata helper<br/>[AppInfo.java]"]
  node_logger_file["Logger<br/>[Logger.java]"]
  node_level_file["Level<br/>[Level.java]"]
  node_colors["Colors<br/>ansi palette<br/>[ConsoleColors.java]"]
  node_serialization_types["SC Types<br/>serialization types"]
end

subgraph group_spigot["Spigot plugin"]
  node_spigot_root["Spigot<br/>plugin layer"]
  node_plugin_main["SlayerCore<br/>plugin entrypoint<br/>[SlayerCore.java]"]
  node_custom_item["Custom Item<br/>domain model<br/>[CustomItem.java]"]
  node_item_registry["Registry<br/>[ItemRegistry.java]"]
  node_item_listener["Item Listener<br/>event listener"]
end

subgraph group_resources["Resources"]
  node_plugin_yml["plugin.yml<br/>plugin descriptor<br/>[plugin.yml]"]
end

node_core_root -->|"contains"| node_logging
node_core_root -->|"contains"| node_serialization
node_core_root -->|"contains"| node_io_assets
node_core_root -->|"contains"| node_composer
node_core_root -->|"contains"| node_formatting
node_core_root -->|"contains"| node_time
node_core_root -->|"contains"| node_system
node_logging -->|"implemented by"| node_logger_file
node_logging -->|"uses"| node_level_file
node_logging -->|"uses"| node_colors
node_serialization -->|"contains"| node_serialization_types
node_serialization -.->|"uses"| node_serialization_types
node_spigot_root -->|"contains"| node_plugin_main
node_spigot_root -->|"contains"| node_custom_item
node_spigot_root -->|"contains"| node_item_registry
node_spigot_root -->|"contains"| node_item_listener
node_plugin_main -->|"declared in"| node_plugin_yml
node_plugin_main -->|"initializes"| node_item_registry
node_plugin_main -->|"registers"| node_item_listener
node_item_listener -->|"dispatches"| node_custom_item
node_item_registry -->|"stores"| node_custom_item
node_spigot_root -->|"depends on"| node_core_root
node_system -.->|"reads metadata from"| node_plugin_yml

click node_core_root "https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core"
click node_logging "https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core/logging"
click node_serialization "https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core/serialization"
click node_io_assets "https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core/io"
click node_composer "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/composers/NokiaComposer.java"
click node_formatting "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/formatting/NumberFormatter.java"
click node_time "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/time/Time.java"
click node_system "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/system/AppInfo.java"
click node_logger_file "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/logging/Logger.java"
click node_level_file "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/logging/Level.java"
click node_colors "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/logging/ConsoleColors.java"
click node_serialization_types "https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core/serialization"
click node_spigot_root "https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/spigot"
click node_plugin_main "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/spigot/SlayerCore.java"
click node_custom_item "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/spigot/CustomItem.java"
click node_item_registry "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/spigot/ItemRegistry.java"
click node_item_listener "https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/spigot/listeners/CustomItemListener.java"
click node_plugin_yml "https://github.com/saberslay/slayercore/blob/master/src/main/resources/plugin.yml"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_core_root,node_logging,node_serialization,node_io_assets,node_composer,node_formatting,node_time,node_system,node_logger_file,node_level_file,node_colors,node_serialization_types toneBlue
class node_spigot_root,node_plugin_main,node_custom_item,node_item_registry,node_item_listener toneAmber
class node_plugin_yml toneMint
```

## Components

### Core library

Framework-agnostic utilities shared by the repo.

- [Core](https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core): library · Reusable utility toolkit and shared foundation. · `src/main/java/com/saberslay/slayercore/core`
- [Logging](https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core/logging): output subsystem · Colored, level-based console logging. · `src/main/java/com/saberslay/slayercore/core/logging`
- [Serialization](https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core/serialization): data model · Structured custom serialization types and helpers. · `src/main/java/com/saberslay/slayercore/core/serialization`
- [Image I/O](https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core/io): asset loader · Image loading and sprite-sheet slicing utilities. · `src/main/java/com/saberslay/slayercore/core/io`
- [Composer](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/composers/NokiaComposer.java): audio utility · Monophonic tone composition and playback support. · `src/main/java/com/saberslay/slayercore/core/composers/NokiaComposer.java`
- [Formatting](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/formatting/NumberFormatter.java): presentation helper · Numeric formatting utilities. · `src/main/java/com/saberslay/slayercore/core/formatting/NumberFormatter.java`
- [Time](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/time/Time.java): time helper · Time abstractions and conversions. · `src/main/java/com/saberslay/slayercore/core/time/Time.java`
- [App Info](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/system/AppInfo.java): metadata helper · Reads application and manifest metadata. · `src/main/java/com/saberslay/slayercore/core/system/AppInfo.java`
- [Logger](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/logging/Logger.java): logger · Primary logging API. · `src/main/java/com/saberslay/slayercore/core/logging/Logger.java`
- [Level](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/logging/Level.java): log levels · Logging severity definitions. · `src/main/java/com/saberslay/slayercore/core/logging/Level.java`
- [Colors](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/core/logging/ConsoleColors.java): ansi palette · ANSI terminal color support. · `src/main/java/com/saberslay/slayercore/core/logging/ConsoleColors.java`
- [SC Types](https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/core/serialization): serialization types · Base, object, array, string, field, database, and type metadata. · `src/main/java/com/saberslay/slayercore/core/serialization`

### Spigot plugin

Minecraft server integration built on the core library.

- [Spigot](https://github.com/saberslay/slayercore/tree/master/src/main/java/com/saberslay/slayercore/spigot): plugin layer · Minecraft plugin integration on top of the core library. · `src/main/java/com/saberslay/slayercore/spigot`
- [SlayerCore](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/spigot/SlayerCore.java): plugin entrypoint · Spigot plugin bootstrap and lifecycle entrypoint. · `src/main/java/com/saberslay/slayercore/spigot/SlayerCore.java`
- [Custom Item](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/spigot/CustomItem.java): domain model · Plugin-side custom item definition. · `src/main/java/com/saberslay/slayercore/spigot/CustomItem.java`
- [Registry](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/spigot/ItemRegistry.java): item registry · Stores and resolves custom item definitions. · `src/main/java/com/saberslay/slayercore/spigot/ItemRegistry.java`
- [Item Listener](https://github.com/saberslay/slayercore/blob/master/src/main/java/com/saberslay/slayercore/spigot/listeners/CustomItemListener.java): event listener · Responds to server events and applies custom-item behavior. · `src/main/java/com/saberslay/slayercore/spigot/listeners/CustomItemListener.java`

### Resources

Runtime metadata and plugin descriptor files.

- [plugin.yml](https://github.com/saberslay/slayercore/blob/master/src/main/resources/plugin.yml): plugin descriptor · Spigot plugin metadata and entrypoint declaration. · `src/main/resources/plugin.yml`

## Connections

- Core → Logging: contains · Core library is decomposed into logging.
- Core → Serialization: contains · Core library is decomposed into serialization.
- Core → Image I/O: contains · Core library is decomposed into asset I/O.
- Core → Composer: contains · Core library includes audio composition utilities.
- Core → Formatting: contains · Core library includes formatting helpers.
- Core → Time: contains · Core library includes time helpers.
- Core → App Info: contains · Core library includes runtime metadata helpers.
- Logging → Logger: implemented by · Logger is the main logging API.
- Logging → Level: uses · Logging relies on severity levels.
- Logging → Colors: uses · Logging uses ANSI color codes.
- Serialization → SC Types: contains · Serialization package groups the structured data types.
- Serialization → SC Types: uses · Serialization utilities operate on the type model.
- Spigot → SlayerCore: contains · Spigot layer is anchored by the plugin entrypoint.
- Spigot → Custom Item: contains · Spigot layer defines custom item behavior.
- Spigot → Registry: contains · Spigot layer manages custom items through a registry.
- Spigot → Item Listener: contains · Spigot layer reacts to server events with listeners.
- SlayerCore → plugin.yml: declared in · Plugin entrypoint is wired by the plugin descriptor.
- SlayerCore → Registry: initializes · Plugin bootstrap likely registers custom items.
- SlayerCore → Item Listener: registers · Plugin bootstrap registers event listeners.
- Item Listener → Custom Item: dispatches · Listener routes game events through custom item logic.
- Registry → Custom Item: stores · Registry holds custom item definitions.
- Spigot → Core: depends on · Plugin layer consumes reusable core utilities.
- App Info → plugin.yml: reads metadata from · Runtime metadata is aligned with packaged plugin/build info.
