아키텍처 및 믹스인 분석 (MC 26.2)
이 문서는 Minecraft 26.2 버전의 Item Clumps에 대한 내부 패키지 구조, 클래스 계층, 믹스인 대상 분석, 섀도우 멤버 및 주입 지점에 대해 다룹니다.
🌳 패키지 계층 구조 및 클래스 다이어그램
net.instantgratification.item_clumps
│
├── ItemClumpsFabric.java [Main Entrypoint / GameRules Registration]
│
├── config/
│ ├── ItemClumpsConfig.java [Configuration POJO / ConfigHelper Persistence]
│ ├── ModMenuIntegration.java [ModMenuApi Provider / Safe GUI Factory]
│ └── YaclScreenHelper.java [YetAnotherConfigLib v3 Screen Factory]
│
├── mixin/
│ ├── HopperBlockEntityMixin.java [Hopper Drip Extraction Mixin]
│ └── ItemEntityMixin.java [Mega-Stack Aggregation & Smart Pickup Mixin]
│
└── util/
└── ModVersionGuard.java [Knot ClassLoader Runtime Safety Guard]🛠️ 전체 믹스인 대상 및 주입 지점 분석
1. ItemEntityMixin.java
- 대상 클래스:
net.minecraft.world.entity.item.ItemEntity - 슈퍼클래스 확장:
extends net.minecraft.world.entity.Entity
| 멤버 / 메서드 | 어노테이션 | 주입 지점 | 용도 |
|---|---|---|---|
getItem() | @Shadow | 해당 없음 | 아이템 스택에 접근합니다. |
setItem(ItemStack) | @Shadow | 해당 없음 | 아이템 스택을 변경하고 추적 데이터를 갱신합니다. |
target | @Shadow | 해당 없음 | 대상 플레이어의 UUID (던지기 안전용). |
pickupDelay | @Shadow | 해당 없음 | 줍기 쿨다운 타이머 틱. |
age | @Shadow | 해당 없음 | 디스폰 수명 타이머 틱 ($0$ ~ $6000$). |
setItem | @Inject | @At("TAIL") | 스택 수량이 변경될 때 이름표 갱신을 트리거합니다. |
isMergable | @Inject | @At("HEAD"), cancellable = true | 최대 스택 검사를 max_clump_size 규칙으로 재정의합니다. |
mergeWithNeighbours | @Redirect | INVOKE -> AABB.inflate(DDD) | 수평 탐색 반경($r \in [1, 10]$)의 무할당 확장. |
tryToMerge | @Inject | @At("HEAD"), cancellable = true | 64비트 합산 연산, 최신 수명 계승 및 자석 검사를 수행합니다. |
playerTouch | @Inject | @At("HEAD"), cancellable = true | 깨끗한 바닐라 스택으로 단일 배치 인벤토리 지급을 실행합니다. |
2. HopperBlockEntityMixin.java
- 대상 클래스:
net.minecraft.world.level.block.entity.HopperBlockEntity
| 메서드 | 어노테이션 | 주입 지점 | 용도 |
|---|---|---|---|
addItem(Container, ItemEntity) | @Inject | @At("HEAD"), cancellable = true | 대형 뭉치에서 1개씩($2.5$개/초) 깔때기 보관함으로 추출합니다. |
📄 믹스인 설정 (item-clumps.mixins.json)
json
{
"required": true,
"package": "net.instantgratification.item_clumps.mixin",
"compatibilityLevel": "JAVA_25",
"refmap": "item-clumps-refmap.json",
"mixins": [
"HopperBlockEntityMixin",
"ItemEntityMixin"
],
"injectors": {
"defaultRequire": 1
}
}