변경 기록
0.1.0-alpha.10 — 2026-10-22
- 설치 프로그램 창을 정리했습니다. 이름과 입력 칸이 줄 맞춰 있고, 클라이언트·서버를 바꾸거나 "고급 설정"을 열어도 창 크기가 그대로입니다.
- Poly 모드가 Fabric 모드의 초기화가 끝날 때를 기다릴 수 있습니다(
LifecycleEvents.MODS_INITIALIZED). 생명주기와 스레드
0.1.0-alpha.9 — 2026-10-22
- 설치 프로그램으로 전용 서버를 설치합니다. "서버"와 폴더를 고르면 Mojang 서버를 받고
run.bat,run.sh,polymodloader-server.jar를 만듭니다. Minecraft EULA 동의는 직접 합니다. 설치 안내
0.1.0-alpha.8 — 2026-10-22
- Forge 모드가 이제 Poly 모드 로더 위에서 실행됩니다(테스트 환경). Forge가 모드를 만들고 설정 이벤트를 실행하고 아이템을 등록하며, 같은 게임에서 Poly 모드도 함께 동작합니다. 설치한 Poly 모드 로더에서 Forge 모드가 로드되는 것은 아직입니다.
0.1.0-alpha.7 — 2026-10-22
- 설치 프로그램을 단순하게 바꿨습니다. Minecraft 버전, 게임 메모리, 설치 버튼만 보이고 나머지는 "고급 설정"에 있습니다.
- MinecraftForge 자체가 이제 Poly 모드 로더 위에서 시작됩니다(테스트 환경). Forge가 로드되고 월드를 만들고 게임 테스트를 통과합니다. 설치한 Poly 모드 로더에서 Forge 모드가 로드되는 것은 아직입니다.
0.1.0-alpha.6 — 2026-10-22
- Forge 모드를 위한 기반 작업: Forge가 전제로 하는 Java 모듈 구성을 Poly 모드 로더가 만들 수 있게 됐습니다. Forge 모드는 아직 실행되지 않고, 플레이어에게 바뀌는 점은 없습니다.
0.1.0-alpha.5 — 2026-10-22
- 설치 프로그램에서 게임 메모리를 정합니다. 최대(-Xmx)와 시작(-Xms) 메모리를 런처 프로필에 씁니다. PC에 맞는 최대 메모리를 미리 골라 둡니다. 설치 안내
- 설치가 끝나면 설치 여부를 알림으로 알려 주고, 설치 프로그램은 저절로 닫힙니다. 알림을 누르면 mods 폴더가 열립니다.
- 웹사이트 문장을 짧은 줄로 나눠 읽기 쉽게 했고, 페이지를 옮길 때 부드러운 전환 효과를 넣었습니다.
0.1.0-alpha.4 — 2026-10-22
- Mixin을 쓰는 Fabric 모드가 실행됩니다. Fabric Loader와 같은 방식입니다. Mixin·MixinExtras, class tweaker의 인터페이스 주입, Fabric의 진입점 실행 시점을 그대로 따릅니다. 호환성
- 26.2용 인기 Fabric 모드 52개 중 클라이언트에서 42개, 전용 서버에서 28개가 로드됩니다(나머지는 대부분 클라이언트 전용). Fabric API 모듈 44개도 모두 로드됩니다.
- Sodium, Iris, Lithium을 포함한 Fabric 모드 137개를 함께 넣고 클라이언트에서 월드에 들어갈 수 있습니다. 실제 전용 서버는 99개로 시작됩니다.
getGameInstance나 class tweaker의 enum 확장(extend-enum)을 쓰는 Fabric 모드도 이제 로드됩니다. 이제 Fabric Loader 공개 API를 빠짐없이 제공합니다.- NeoForge·Forge 모드는 아직 실행되지 않습니다. Forge 지원 작업을 시작했습니다.
- 다운로드 페이지에서 빌드마다 바뀐 점을 볼 수 있습니다.
0.1.0-alpha.3 — 2026-10-22 (첫 공개 릴리스)
- Minecraft 26.1, 26.1.1, 26.1.2를 26.2와 함께 지원합니다. 설치 프로그램에서 설치할 버전을 고릅니다.
- Poly 모드 로더 소스 없이 모드 개발: SDK가 이 사이트의 Maven 저장소에 있습니다. 모드 템플릿을 다운로드하고
initPolyMod를 실행하세요. 모드 템플릿 받기 - Native API: 이벤트 우선순위와 결정 결과, 상호작용 이벤트(블록·아이템·엔티티 사용, 공격), 취소할 수 있는 블록 부수기·설치, 서버·월드·리스폰·엔티티 수명 주기 이벤트, 태그, 모드 창작 탭, 아이템 툴팁. 이벤트, 태그와 창작 탭
- class tweaker(access widener)를 쓰는 Fabric 모드도, 그 밖에 빠진 기능이 없으면 로드됩니다. 호환성
- 웹사이트: 영어·한국어, 다운로드 페이지, 모드 개발자 페이지.
- 고친 문제: 리스폰한 플레이어의 엔티티 데이터(
EntityDataKey)가 사라지던 문제, 플레이어에게EntityEvents.DIED가 발생하지 않던 문제.
0.1.0-alpha.2 — 2026-10-21 (공개하지 않음, 내용은 0.1.0-alpha.3에 포함)
설치 프로그램과 첫 Poly 모드 튜토리얼 (2026-10-21)
- 플레이어용 설치 프로그램(
PolyModLoader-<버전>.exe,.jar)이 Minecraft Launcher에 Poly 모드 로더 프로필을 추가합니다. 설치 안내 - Native API로 만든 모드를 Poly 모드라고 부릅니다
- 첫 Poly 모드 만들기를 자라는 크리스털 모드 Crystal Garden으로 다시 썼습니다
- 런처 프로필로 실행할 때 게임 jar를 찾지 못하면
POLY-BOOTSTRAP-006으로 알립니다 - 라이선스: PolyLoader Non-Commercial License 1.0
서버 틱·힙·GC 측정 (2026-10-21)
:poly-bootstrap:tickBenchmark: 바닐라와 Poly 모드 로더를 같은 부하로 번갈아 실행해 서버 틱 시간 p50/p95/p99, 50ms 초과 비율, 피크 힙, GC를 비교합니다. 결과는 "유의한 차이 없음"입니다 (성능)- 측정용 에이전트
tools/tick-probe
변환 엔진: 순서 계약, call-site 변경, 접근 확대, 캐시 상한 (2026-10-21)
- 같은 메서드를 고치는 규칙은
after가 하나의 순서를 정하면 함께 적용됩니다(시작 훅·반환 훅은 선언 순서대로 실행) (설계 결정 ADR-0013) - 새 동작: 메서드 안의 특정 호출을 정적 훅으로 바꾸는 call-site 변경
- 접근 확대(Fabric access widener와 같은 뜻:
accessible,extendable,mutable). poly.mod.json 스키마의accessWidenings - 변환 캐시 크기 상한(기본 256 MiB,
-Dpoly.transformCacheMaxMegabytes)
셰이더 텍스처·모드 유니폼, 상태별 블록 모델 (2026-10-21)
- 모드 셰이더 파이프라인에 텍스처(
ShaderPipelineDefinition.Builder.texture,Sampler0~3)와 텍스처 좌표(VertexSink.vertex(x, y, z, u, v, argb)). 그리기와 카메라 - 모드 유니폼(
Builder.uniform,ShaderUniform): std140 블록ModUniforms, 매 프레임 렌더 스레드에서 값을 올림, 잘못된 값은POLY-CLIENT-007 - 블록 엔티티 그리기의 상태별 블록 모델(
BlockEntityCanvas.block(BlockStateView, …),defaultState), 상태 사본BlockStateView.with - 고친 문제: 깨끗한 체크아웃(
build/없음)에서 버전 모듈 컴파일이 실패하던 문제
이름 변경: Poly 모드 로더 (2026-10-21)
- 프로젝트 이름을 Void Mod Loader(VML)에서 Poly 모드 로더로 바꿨습니다. 패키지
dev.polymodloader, 모듈poly-*, 메타데이터poly.mod.json, 오류 코드POLY-*(번호와 의미는 그대로), 모드 IDpoly, 보고서 폴더.poly/. 전체 대응표는 설계 결정 ADR-0012
문서 사이트와 API 레퍼런스 (2026-10-21)
site/를 Docusaurus 3 문서 사이트로 바꿨습니다. 시작하기, Native API, 테스트, 레퍼런스, 기여 섹션, Minecraft 버전별 문서 드롭다운, 오프라인 검색(한국어 포함), 버전 값을 한 곳(site/src/versionInfo.js)에서 관리- API 레퍼런스:
./gradlew apiReference가 공개 API의 Javadoc에서 패키지별 페이지를 만듦(모든 타입과 멤버의 시그니처·설명·인자·반환값·예외)
여러 Minecraft 버전 지원 구조 (2026-10-21)
- 지원 버전 목록
gradle/minecraft-versions.properties(버전, 기본 버전, 버전별 Java). 버전 카탈로그의minecraft항목은 없앰 - 버전마다 어댑터·게임 계층 모듈을 목록에서 자동으로 포함하고, 버전별 jar와 Java로 컴파일
-PpolyMinecraft=<버전>으로 실행·검증 버전 선택. 모드 프로젝트는gradle.properties의polyMinecraft./gradlew newMinecraftVersion -Pfrom=<버전> -Pto=<새 버전>: 가장 가까운 버전의 모듈을 복사하고 이름을 바꿈../gradlew minecraftVersions: 지원 버전 목록poly.mod.json의"minecraft"가 와일드카드(26.*)와 범위(>=26.2 <27)를 받음. Native 예제와 템플릿은26.*- 버전 어댑터가 여러 핫픽스 버전을 맡을 수 있음(
GameVersionAdapter.gameVersions()) - 결정 기록: ADR-0011
Native API 4단계 (2026-10-20)
- 묶음 A: 엔티티 데이터 옵션(추적자 동기화, 버전·마이그레이션), 모든 종류 파일의 리로드 리스너(
onDataFiles/onAssetFiles),PlayerEvents.LOGIN_CHECK, 월드 백업 개수 제한(max-backups-per-world) - 묶음 B: 블록 모양·충돌 모양(
BlockShape, 상태별·방향별), 나는 몹과 헤엄치는 몹(flying,swimming: 길찾기·이동 제어·배회 목표), 몹 모델 키프레임 애니메이션(KeyframeAnimation,ALWAYS/WHILE_MOVING/ON_DEMAND,MobView.playAnimation) - 묶음 C: 코드 배치 기능(
feature,FeaturePlacement), 노이즈 지형에 끼우는 코드 density function(densityFunction), 코드 구조물(structure,StructureDefinition)과 생성 팩의 configured/placed feature·structure·structure_set - 묶음 D: 월드에 그리기(
worldPainter: 선·상자·점·글자·셰이더 사각형), 블록 엔티티 그리기의 블록 모델(BlockEntityCanvas.block)과 셰이더 사각형, 모드 코어 셰이더 파이프라인(shaderPipeline) - 묶음 E: 접속 준비 단계의 교환(
configurationExchange: 서버 요청, 클라이언트 답, 서버 검사와 거절, 대기 시간) - 고친 문제:
custom_goal_seeks_glow_block게임 테스트가 약 10번에 1번 실패하던 문제(목표 블록이 탐색 반경 끝에 있었음)addFeature로 바꾼 바이옴을 쓰는 노이즈 차원에서 기능 배치 중 게임이 멈추던 문제(생성기의 기능 색인을 다시 만듦)
Native API 3단계 (2026-10-19)
- 콘텐츠 심화: 이름 블록 속성(
choice), 상태별 빛, 칸 배치 메뉴와 진행 막대, 아이템 데이터 컴포넌트와 실제 스택 참조(ItemStackRef), 투사체, 자연 스폰 - 게임플레이: 몹별 AI 목표(
AiGoal,MobView), 속도·방향·중력·탑승 API와 조종 가능한 탈것 몹, 피해량 수정(MODIFY_DAMAGE), 발전 과제 트리거와 부여·취소 - 월드: 코드 바이옴(생성 팩에 기록), 코드 지형 생성기(
TerrainGenerator), 청크 강제 로드, 청크 로드·언로드 이벤트,biomeAt. 생성 팩 버전을 내용 해시로 정함 - 클라이언트 그리기: 몹 상자 모델과 부품 애니메이션, 블록 엔티티 그리기(아이템·글자), 모드 파티클 종류, 시야각 이벤트·시점 전환, 모드 후처리 셰이더, 동적 텍스처와
HudCanvas.drawTexture - 리소스·네트워크·운영: 데이터·에셋 리로드 리스너, 엔티티 데이터(저장·리스폰 유지·본인 동기화), 저장소 버전·마이그레이션·클라이언트 동기화, 블록 엔티티 데이터 버전, 권한 노드·공급자, 클라이언트 접속·퇴장 이벤트와
leaveWorld, 모드가 바뀐 월드의 자동 백업, 게임 테스트 공간TestArea - 고친 문제: 모드 블록 상태가 게임의 상태 번호 표에 들어가지 않아 클라이언트로 보낼 수 없던 문제(1단계부터 있던 결함)
Native API 2단계 (2026-10-19)
- 블록 상태 속성, 블록 엔티티(데이터·틱·동기화), 상자형 인벤토리, 월드 저장소, 작업 예약,
WorldEvents.READY - 몹 타입(AI 목표·속성·생성 알·렌더러), 상태 효과, 게임 규칙, 사운드, 파티클, 피해 취소·사망 이벤트
- 모드 팩에
KnownPack을 표시해 데이터 레지스트리(월드 생성·차원·피해 유형)를 안정 상태로 사용. 바이옴 기능 추가, 차원 이동 - 모드 화면(Screen)과 위젯,
ModContext.configDirectory() - 변환 엔진: 원시형 반환 메서드의
RETURN_IF_NON_NULL
Native API 1단계 (2026-10-19)
- Native API(
poly-game-api, 모두PREVIEW): 블록·아이템·음식·창작 탭, 월드·엔티티·플레이어 뷰, 플레이어·블록·클라이언트 이벤트, 명령어, 네트워크 페이로드 채널, 키 바인딩, HUD 레이어, 게임 내 테스트 - 모드 jar의
assets/·data/를 필수 리소스·데이터 팩으로 자동 추가 - 게임 계층
poly-game-v26_2: Minecraft 26.2 jar에 컴파일되고 게임 클래스로더가 로드(ADR-0010) - 변환 동작 추가:
InvokeHookAtHead(인수 전달, 취소·조기 반환),InvokeHookBeforeReturn(인수·반환값 전달, 매개변수 재할당 시 거부) - Gradle:
poly.minecraft-compile플러그인, 모드 프로젝트용gameTests작업, 모드 플러그인에 FabricMC 저장소 추가(템플릿에서polyRuntime을 해석하지 못하던 문제 수정) - 예제
native-showcase-mod, 템플릿에 아이템·게임 테스트 예시
0.1.0-alpha.1 — 2026-10-19 (개발자 미리보기)
Minecraft 26.2 / Java 25 대상 첫 미리보기입니다. 모든 공개 API는 PREVIEW입니다.
- 부트스트랩, 변환 클래스로더, 로딩 파이프라인(검색 → 메타데이터 → 의존성 → 시스템 충돌 → 변환 계획 → 시스템 등록 → 엔트리포인트 → 게임 → 종료)
poly.mod.json스키마 1: 엔트리포인트, 의존성, 충돌, 권한(capabilities), 시스템 교체, 변환 선언- 시스템 교체
poly:game_brand, 서버 생명주기 이벤트 - 변환 엔진: 사전 계획, descriptor·바이트코드 사전조건, 충돌 거부, 진입 후크, 해시 기반 캐시
- 로더 브리지: Fabric 엔트리포인트 실행(Experimental), Fabric·NeoForge·Forge 기능별 진단
- 개발 도구:
dev.polymodloader.modGradle 플러그인, 모드 템플릿, 실제 게임 검증 작업, 혼합 로더 행렬, 시작 시간 벤치마크
원본은 Poly 모드 로더 저장소의 CHANGELOG.md입니다.