# wuhenqiubai/shape-shifter-curse_unofficial-port architecture

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

- Interactive diagram: https://gitdiagram.com/wuhenqiubai/shape-shifter-curse_unofficial-port
- Repository: https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port

## Overview

This is a community-maintained Fabric port of Shape Shifter Curse: players transform into forms, with server-side transformation effects and client-side animation/rendering. The tree also shows Apoli power support, recipe extension, and an Origins badge integration. Source excerpts are partial, so the graph includes only evidenced calls and otherwise keeps related subsystems separate.

Main entry points: [`src/main/java/net/onixary/shapeShifterCurseFabric/player_form/utils/TransformManager.java`](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_form/utils/TransformManager.java) (Transform Manager), [`src/main/java/net/onixary/shapeShifterCurseFabric/player_animation/v3/AnimStateController/TransformingController.java`](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_animation/v3/AnimStateController/TransformingController.java) (Transform Animation), [`src/main/java/net/onixary/shapeShifterCurseFabric/player_form`](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_form) (Form Data), [`src/main/java/net/onixary/shapeShifterCurseFabric/client/ClientPlayerStateManager.java`](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/client/ClientPlayerStateManager.java) (Client Player State)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_transform["Form Transformation"]
  node_transform_manager["Transform Manager"]
  node_effect_manager["Effect Manager<br/>[EffectManager.java]"]
  node_transform_effects["Transform Effects"]
  node_transform_packets["Transform Packets"]
  node_effect_packets["Effect Packets"]
  node_form_data["Form Data"]
end

subgraph group_client["Client Presentation"]
  node_client_state["Client Player State"]
  node_animation["Transform Animation"]
  node_eye_blink["Form Eye Blink"]
end

subgraph group_powers["Powers and Resources"]
  node_apoli_powers["Apoli Powers"]
  node_power_holder["Power Holder"]
  node_resource_listeners["Ordered Reload"]
end

subgraph group_extensions["Extensions"]
  node_recipe_hook["Recipe Hook"]
  node_badge_manager["Origins Badges<br/>[BadgeManager.java]"]
  node_power_callbacks["Power Callbacks"]
  node_recipe_event["Recipe Event"]
end

node_player(("Player"))

node_player -->|"requests transform"| node_transform_manager
node_transform_manager -->|"sets target form"| node_form_data
node_transform_manager -->|"applies effects"| node_transform_effects
node_transform_manager -->|"sends transform state"| node_transform_packets
node_effect_manager -->|"syncs effect state"| node_effect_packets
node_animation -->|"reads client state"| node_client_state
node_animation -->|"resolves forms"| node_form_data
node_eye_blink -->|"reads client config"| node_client_state
node_power_holder -->|"holds powers"| node_apoli_powers
node_badge_manager -->|"registers callbacks"| node_power_callbacks
node_recipe_hook -->|"fires recipe event"| node_recipe_event

click node_transform_manager "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_form/utils/TransformManager.java"
click node_effect_manager "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/status_effects/attachment/EffectManager.java"
click node_transform_effects "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_form/utils"
click node_transform_packets "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/networking"
click node_effect_packets "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/networking"
click node_form_data "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_form"
click node_client_state "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/client/ClientPlayerStateManager.java"
click node_animation "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_animation/v3/AnimStateController/TransformingController.java"
click node_eye_blink "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/render/form_render/sub_controller/FormEyeBlinkController.java"
click node_apoli_powers "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/power"
click node_power_holder "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/component/PowerHolderComponent.java"
click node_resource_listeners "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/calio/src/main/java/io/github/apace100/calio/resource/OrderedResourceListenerManager.java"
click node_recipe_hook "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/mixin/RecipeManagerMixin.java"
click node_badge_manager "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/integration/origins/badge/BadgeManager.java"
click node_power_callbacks "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/integration"
click node_recipe_event "https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/event"

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_transform_manager,node_effect_manager,node_transform_effects,node_transform_packets,node_effect_packets,node_form_data toneBlue
class node_client_state,node_animation,node_eye_blink toneAmber
class node_apoli_powers,node_power_holder,node_resource_listeners toneMint
class node_recipe_hook,node_badge_manager,node_power_callbacks,node_recipe_event toneRose
class node_player toneIndigo
```

## Components

### Form Transformation

- [Transform Manager](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_form/utils/TransformManager.java): `src/main/java/net/onixary/shapeShifterCurseFabric/player_form/utils/TransformManager.java`
- [Effect Manager](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/status_effects/attachment/EffectManager.java): `src/main/java/net/onixary/shapeShifterCurseFabric/status_effects/attachment/EffectManager.java`
- [Transform Effects](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_form/utils): `src/main/java/net/onixary/shapeShifterCurseFabric/player_form/utils`
- [Transform Packets](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/networking): `apoli/src/main/java/io/github/apace100/apoli/networking`
- [Effect Packets](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/networking): `apoli/src/main/java/io/github/apace100/apoli/networking`
- [Form Data](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_form): `src/main/java/net/onixary/shapeShifterCurseFabric/player_form`

### Client Presentation

- [Client Player State](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/client/ClientPlayerStateManager.java): `src/main/java/net/onixary/shapeShifterCurseFabric/client/ClientPlayerStateManager.java`
- [Transform Animation](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/player_animation/v3/AnimStateController/TransformingController.java): `src/main/java/net/onixary/shapeShifterCurseFabric/player_animation/v3/AnimStateController/TransformingController.java`
- [Form Eye Blink](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/render/form_render/sub_controller/FormEyeBlinkController.java): `src/main/java/net/onixary/shapeShifterCurseFabric/render/form_render/sub_controller/FormEyeBlinkController.java`

### Powers and Resources

- [Apoli Powers](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/power): `apoli/src/main/java/io/github/apace100/apoli/power`
- [Power Holder](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/component/PowerHolderComponent.java): `apoli/src/main/java/io/github/apace100/apoli/component/PowerHolderComponent.java`
- [Ordered Reload](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/calio/src/main/java/io/github/apace100/calio/resource/OrderedResourceListenerManager.java): `calio/src/main/java/io/github/apace100/calio/resource/OrderedResourceListenerManager.java`

### Extensions

- [Recipe Hook](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/mixin/RecipeManagerMixin.java): `src/main/java/net/onixary/shapeShifterCurseFabric/mixin/RecipeManagerMixin.java`
- [Origins Badges](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/blob/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/integration/origins/badge/BadgeManager.java): `src/main/java/net/onixary/shapeShifterCurseFabric/integration/origins/badge/BadgeManager.java`
- [Power Callbacks](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/apoli/src/main/java/io/github/apace100/apoli/integration): `apoli/src/main/java/io/github/apace100/apoli/integration`
- [Recipe Event](https://github.com/wuhenqiubai/shape-shifter-curse_unofficial-port/tree/ver/1.21.1_main/src/main/java/net/onixary/shapeShifterCurseFabric/event): `src/main/java/net/onixary/shapeShifterCurseFabric/event`

### Other components

- **Player**

## Connections

- Player → Transform Manager: requests transform
- Transform Manager → Form Data: sets target form
- Transform Manager → Transform Effects: applies effects
- Transform Manager → Transform Packets: sends transform state
- Effect Manager → Effect Packets: syncs effect state
- Transform Animation → Client Player State: reads client state
- Transform Animation → Form Data: resolves forms
- Form Eye Blink → Client Player State: reads client config
- Power Holder → Apoli Powers: holds powers
- Origins Badges → Power Callbacks: registers callbacks
- Recipe Hook → Recipe Event: fires recipe event
