# apace100/apoli architecture

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

- Interactive diagram: https://gitdiagram.com/apace100/apoli
- Repository: https://github.com/apace100/apoli

## Overview

Apoli is a Fabric mod that lets datapacks attach data-driven powers to entities. The main workflow is defining power data, resolving it into registered power types, assigning powers to entity components, then applying them as gameplay events occur. Powers cover actions, restrictions, attribute and movement changes, resources, effects, crafting, and rendering; client/server networking synchronizes relevant state and active-power requests. The sampled mixins confirm component-backed gameplay hooks and client activation. Other subsystem links reflect the README and source tree; unsampled internals are represented without asserting unverified call chains.

Main entry points: [`src/main/java/io/github/apace100/apoli/component/PowerHolderComponent.java`](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/component/PowerHolderComponent.java) (Entity power component), [`src/main/java/io/github/apace100/apoli/ApoliClient.java`](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/ApoliClient.java) (Client initialization), [`src/main/java/io/github/apace100/apoli/power`](https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/power) (Power behaviors), [`src/main/java/io/github/apace100/apoli/networking`](https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/networking) (Power packets)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_definitions["Power definitions"]
  node_global_sets["Global power sets"]
  node_power_types[("Power types")]
  node_factories["Power factories"]
end

subgraph group_runtime["Power runtime"]
  node_power_models["Power behaviors"]
  node_holder[("Entity power component")]
  node_commands["Power commands<br/>[PowerCommand.java]"]
  node_global_util["Global power utilities"]
end

subgraph group_gameplay["Gameplay hooks"]
  node_game_hooks["Gameplay mixins"]
  node_actions["Action factories"]
end

subgraph group_sync["Client and server"]
  node_server["Server initialization<br/>[ApoliServer.java]"]
  node_client["Client initialization<br/>[ApoliClient.java]"]
  node_packets["Power packets"]
end

subgraph group_presentation["Client presentation"]
  node_hud["Power HUD"]
  node_client_hooks["Client gameplay hooks"]
end

node_datapacks["Datapacks"]
node_player(("Player"))
node_minecraft(("Minecraft runtime"))

node_datapacks -->|"provides data"| node_global_sets
node_datapacks -->|"defines powers"| node_power_types
node_power_types -->|"resolves types"| node_factories
node_factories -->|"creates powers"| node_power_models
node_holder -->|"holds powers"| node_power_models
node_commands -->|"operates on"| node_holder
node_global_util -->|"applies sets"| node_holder
node_game_hooks -->|"queries powers"| node_holder
node_game_hooks -->|"executes behavior"| node_power_models
node_power_models -->|"uses actions"| node_actions
node_server -->|"registers packets"| node_packets
node_client -->|"registers packets"| node_packets
node_client -->|"registers renderer"| node_hud
node_client -->|"initializes client"| node_client_hooks
node_player -.->|"issues commands"| node_commands
node_player -->|"activates powers"| node_client
node_client -->|"reads powers"| node_holder
node_client -->|"sends activation"| node_packets
node_packets -->|"syncs powers"| node_holder
node_game_hooks -->|"modifies gameplay"| node_minecraft
node_hud -->|"renders status"| node_minecraft
node_client_hooks -->|"reads powers"| node_holder

click node_global_sets "https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/global/GlobalPowerSetLoader.java"
click node_power_types "https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/power/PowerTypeRegistry.java"
click node_factories "https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/power/factory/PowerFactories.java"
click node_power_models "https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/power"
click node_holder "https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/component/PowerHolderComponent.java"
click node_commands "https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/command/PowerCommand.java"
click node_global_util "https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/global/GlobalPowerSetUtil.java"
click node_game_hooks "https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/mixin"
click node_actions "https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/power/factory/action"
click node_server "https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/ApoliServer.java"
click node_client "https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/ApoliClient.java"
click node_packets "https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/networking"
click node_hud "https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/screen"
click node_client_hooks "https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/mixin/LightmapTextureManagerMixin.java"

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_global_sets,node_power_types,node_factories toneBlue
class node_power_models,node_holder,node_commands,node_global_util toneAmber
class node_game_hooks,node_actions toneMint
class node_server,node_client,node_packets toneRose
class node_hud,node_client_hooks,node_datapacks,node_player,node_minecraft toneIndigo
```

## Components

### Power definitions

- [Global power sets](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/global/GlobalPowerSetLoader.java): `src/main/java/io/github/apace100/apoli/global/GlobalPowerSetLoader.java`
- [Power types](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/power/PowerTypeRegistry.java): `src/main/java/io/github/apace100/apoli/power/PowerTypeRegistry.java`
- [Power factories](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/power/factory/PowerFactories.java): `src/main/java/io/github/apace100/apoli/power/factory/PowerFactories.java`

### Power runtime

- [Power behaviors](https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/power): `src/main/java/io/github/apace100/apoli/power`
- [Entity power component](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/component/PowerHolderComponent.java): `src/main/java/io/github/apace100/apoli/component/PowerHolderComponent.java`
- [Power commands](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/command/PowerCommand.java): `src/main/java/io/github/apace100/apoli/command/PowerCommand.java`
- [Global power utilities](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/global/GlobalPowerSetUtil.java): `src/main/java/io/github/apace100/apoli/global/GlobalPowerSetUtil.java`

### Gameplay hooks

- [Gameplay mixins](https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/mixin): `src/main/java/io/github/apace100/apoli/mixin`
- [Action factories](https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/power/factory/action): `src/main/java/io/github/apace100/apoli/power/factory/action`

### Client and server

- [Server initialization](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/ApoliServer.java): `src/main/java/io/github/apace100/apoli/ApoliServer.java`
- [Client initialization](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/ApoliClient.java): `src/main/java/io/github/apace100/apoli/ApoliClient.java`
- [Power packets](https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/networking): `src/main/java/io/github/apace100/apoli/networking`

### Client presentation

- [Power HUD](https://github.com/apace100/apoli/tree/1.20/src/main/java/io/github/apace100/apoli/screen): `src/main/java/io/github/apace100/apoli/screen`
- [Client gameplay hooks](https://github.com/apace100/apoli/blob/1.20/src/main/java/io/github/apace100/apoli/mixin/LightmapTextureManagerMixin.java): `src/main/java/io/github/apace100/apoli/mixin/LightmapTextureManagerMixin.java`

### Other components

- **Datapacks**
- **Player**
- **Minecraft runtime**

## Connections

- Datapacks → Global power sets: provides data
- Datapacks → Power types: defines powers
- Power types → Power factories: resolves types
- Power factories → Power behaviors: creates powers
- Entity power component → Power behaviors: holds powers
- Power commands → Entity power component: operates on
- Global power utilities → Entity power component: applies sets
- Gameplay mixins → Entity power component: queries powers
- Gameplay mixins → Power behaviors: executes behavior
- Power behaviors → Action factories: uses actions
- Server initialization → Power packets: registers packets
- Client initialization → Power packets: registers packets
- Client initialization → Power HUD: registers renderer
- Client initialization → Client gameplay hooks: initializes client
- Player → Power commands: issues commands
- Player → Client initialization: activates powers
- Client initialization → Entity power component: reads powers
- Client initialization → Power packets: sends activation
- Power packets → Entity power component: syncs powers
- Gameplay mixins → Minecraft runtime: modifies gameplay
- Power HUD → Minecraft runtime: renders status
- Client gameplay hooks → Entity power component: reads powers
