본문으로 건너뛰기
버전: Minecraft 26.2

예제 모드

Poly 모드 로더 소스의 examples/ 폴더에 Poly 모드 예제가 다섯 개 있습니다. 모두 실제 게임에서 검증한 모드입니다. Poly 모드 로더 소스는 지금 비공개이므로 이 페이지에서는 각 예제가 보여 주는 것을 설명하고, 문서에 필요한 코드는 Native API 페이지에 싣습니다.

새 모드를 시작할 때는 예제가 아니라 모드 템플릿을 다운로드합니다. 모드 템플릿 받기를 보세요.

한눈에 보기​

경로모드 ID보여 주는 것
examples/crystal-gardencrystal_garden첫 Poly 모드 만들기 튜토리얼의 완성본. 자라는 블록, 저장 데이터, 명령어·권한, 접속 확인, 클라이언트 그리기, 게임 테스트
examples/minimal-native-modminimal_native_mod가장 작은 Poly 모드. 엔트리포인트, 서버 이벤트, 종료 작업
examples/custom-system-modcustom_system_mod시스템 교체(poly:game_brand)
examples/transform-demo-modtransform_demo_modpoly.mod.json으로 선언하는 코드 변환·call-site 변경·순서 선언·접근 확대
examples/native-showcase-modnative_showcaseNative API 전 영역과 게임 내 테스트

crystal-garden​

튜토리얼에서 만드는 모드입니다. 다른 예제와 달리 모드 제작자가 쓰는 방식(모드 플러그인 dev.polymodloader.mod)대로 빌드하는 독립 프로젝트입니다. 크리스털 새싹은 4단계에 걸쳐 자라며, 다 자란 새싹을 사용하면 크리스털을 얻습니다.

파일내용
CrystalGardenModcommon 엔트리포인트. 아이템·블록 선언, 엔티티 데이터 키, 권한 노드, 접속 확인
CrystalSprout블록 상태 stage, 상태별 모양·밝기, 매 틱 자라는 블록 엔티티, 수확(엔티티 데이터·월드 저장소 기록)
GardenCommands/garden stats, /garden grow <pos>(권한 crystal_garden:grow)
CrystalGardenClient접속 확인 답, 새싹 위 성장 표시, 수확 수 HUD, 키 바인딩 toggle_hud(기본 G)
GardenTests게임 내 테스트 4개

minimal-native-mod​

가장 작은 Poly 모드입니다. 블록·아이템 같은 게임 내용은 추가하지 않고, 엔트리포인트가 실행됐다는 사실을 로그로 남깁니다.

파일내용
poly.mod.json"minecraft": ["26.*"], common·client 엔트리포인트, poly 의존성
MinimalNativeModcommon 엔트리포인트. 인사 로그, 종료 작업(onShutdown), ServerEvents.STARTED·STOPPING 리스너
MinimalNativeModClientclient 엔트리포인트. 호출됐다는 로그만 남김

custom-system-mod​

poly:game_brand 시스템을 교체해 Minecraft가 보고하는 브랜드를 poly/example로 바꿉니다. Minecraft 클래스를 참조하지 않습니다.

파일내용
poly.mod.json엔트리포인트 없음. replacesSystems로 제공자를 선언하고, 권한 system.provider.replace를 요청
ExampleBrandProviderpoly:game_brand 제공자

클라이언트 로그에 [Poly 모드 로더] poly:game_brand reported 'poly/example' to Minecraft (CLIENT)가 남습니다. 선언 방법은 poly.mod.json 스키마에 있습니다.

transform-demo-mod​

poly.mod.json의 transforms와 accessWidenings로 Minecraft 클래스를 바꿉니다. 첫 규칙은 Java 코드 없이 선언만으로 동작하고, 둘째 규칙은 작은 훅 클래스 TickHooks를 씁니다.

| 규칙 | 대상 | 동작 | 하는 일 | |---|---|---| | transform_demo_mod:storage_format_name | LevelStorageSource.getName()Ljava/lang/String; | replace_returned_string_constant | 표시용 저장 형식 이름 "Anvil"을 "Anvil (Poly 모드 로더 transform demo)"로 바꿈 | | transform_demo_mod:tick_start_nanos | MinecraftServer.tickServer(Ljava/util/function/BooleanSupplier;)V | redirect_call, after: ["poly:server_tick_events"] | 첫 Util.getNanos() 호출을 TickHooks.tickStartNanos()로 바꿈. Poly 모드 로더 내장 시작 훅과 같은 메서드라 순서를 선언 | | 접근 확대 | MinecraftServer.tickCount:I | accessible | private 필드를 public으로 |

  • 실패 정책은 disable_rule·skip이라 대상이 달라지면 그 항목만 꺼집니다.
  • 권한은 internal.bytecode.transform, internal.callsite.intercept, internal.member.access입니다.
  • minecraft는 ["26.2"]입니다. 특정 버전의 게임 코드에 기대므로 정확한 버전을 적습니다.

로그에는 다음이 남습니다. 두 번째 실행부터는 변환 캐시를 써서 from cache가 붙습니다.

  • Transformed net/minecraft/world/level/storage/LevelStorageSource with [transform_demo_mod:storage_format_name]
  • Transformed net/minecraft/server/MinecraftServer with [poly:server_brand, poly:server_tick_events, transform_demo_mod:tick_start_nanos, poly:server_stopping_event, poly:worldgen_features, access widening by transform_demo_mod]
  • [transform_demo_mod] tickServer start time comes from the mod hook; MinecraftServer.tickCount is public: true

native-showcase-mod​

Native API의 모든 영역을 한 모드에서 사용하는 예제로, Poly 모드 로더가 Native API를 실제 게임에서 검증할 때 기준으로 삼습니다. poly.mod.json은 "minecraft": ["26.*"]입니다.

클래스​

클래스영역내용
NativeShowcaseModcommon 엔트리포인트빛나는 블록 glow_block(밝기 12, 맞는 도구 필요, 사용하면 spark 지급), 아이템 spark, 음식 star_fruit, 명령어, 네트워크 채널, 접속 준비 교환, 이벤트, 월드 저장소, 설정 파일 showcase.properties, 모드 창작 탭 showcase, 다른 클래스의 선언 호출
MachineContent블록 상태·블록 엔티티플레이어를 향하고 사용하면 powered가 바뀌며 켜진 동안 틱을 세는 machine, 27칸 인벤토리 crate
AdvancedContent심화 콘텐츠색 속성과 상태별 밝기를 가진 lamp, 메뉴 배치와 진행 막대가 있는 grinder, 아이템 데이터 컴포넌트 charge를 쓰는 spark_wand, 투사체 spark_bolt, 발전 과제 트리거 used_wand
CreatureContent몹과 게임플레이스폰 알·자연 스폰·탈것이 있는 몹 golem_friend, 상태 효과 glowing_heart, 게임 규칙 golems_greet_players·spark_multiplier, 사운드 chime, 피해·죽음 이벤트
SeekGlowBlockGoalAI 목표6블록 안의 glow_block으로 걸어감
VisualContent몹 모델상자 모델과 키프레임 애니메이션이 있는 나는 몹 wisp, 파티클 sparkle
MovementContent모양과 이동반 칸 높이 블록 stone_step, 헤엄치는 몹 minnow, 관련 게임 테스트
WorldContent월드 생성바이옴 glow_meadow, native_showcase:terraces 차원이 쓰는 계단식 지형 생성기, 청크 로드 감시
CodeWorldgenContent코드 월드 생성배치 기능 boulder, native_showcase:waves 차원의 밀도 함수 waves, 구조물 shrine, 관련 게임 테스트
InteractionContent이벤트 우선순위·상호작용 이벤트BlockEvents.BREAK(높은 우선순위)·PLACE·PLACED와 InteractionEvents로 자신과 그 위에 있는 것을 지키는 warded_block, 각 이벤트가 동작을 취소하고 취소하지 않은 동작은 그대로 되는지 확인하는 게임 테스트 6개
LifecycleContent생명주기 이벤트서버·오버월드 생명주기 로그, PlayerEvents.COPY로 옮기는 엔티티 데이터의 리스폰 횟수, RESPAWNED, EntityEvents.JOINED_WORLD, 접속한 모의 플레이어를 쓰는 게임 테스트 2개
TagContent태그#native_showcase:warded(보호 블록 판정에 쓰임), #native_showcase:sparkly, #minecraft:mineable/pickaxe에 더한 보호 블록, 게임 테스트 2개
OperationsContent데이터·동기화·운영데이터 리로드 리스너, 엔티티 데이터 visits·golem_mood(버전 이전 포함), 클라이언트와 동기화하는 버전 있는 월드 저장소 world_info, 권한 노드 place·secret과 권한 제공자, 접속 검사
NativeShowcaseClientclient 엔트리포인트키 바인딩, HUD 레이어, 셰이더 파이프라인 glow·pulse(텍스처·모드 유니폼), 월드 그리기 compass, grinder 블록 엔티티 그리기(상태별 램프 모델), 동적 텍스처 noise, 화면, 카메라 시점, 후처리 sepia, 클라이언트 이벤트, #native_showcase:sparkly 아이템의 "Sparkly" 툴팁 줄
ShowcaseScreen모드 화면인사 글, 이름 입력칸, 닫기 버튼
ShowcaseGameTests게임 내 테스트콘텐츠·월드·엔티티·명령어·데이터·권한 테스트

리소스는 src/main/resources/assets/native_showcase/(블록 상태, 모델, 텍스처, 이름, 셰이더, 후처리)와 src/main/resources/data/(전리품 테이블, 레시피, 태그, 차원 pocket·terraces·waves, 발전 과제, 피해 유형, 월드 생성 데이터)에 있습니다.

명령어, 키, 채널​

종류이름동작
명령어/showcase info블록이 등록됐는지 알려 줌
명령어/showcase add <a> <b>두 정수의 합을 명령 결과값으로 돌려줌
명령어/showcase place <pos>그 위치에 glow_block을 놓음. 권한 노드 place(기본 수준 2) 필요
키 바인딩show_info(기본 K)액션 바에 Native Showcase: key binding works 표시
페이로드 채널native_showcase:greetings접속하면 서버가 환영 인사를 보내고, 클라이언트가 thanks로 답함
접속 준비 교환native_showcase:handshake월드에 들어가기 전에 서버가 클라이언트의 쇼케이스 버전을 묻고, 답이 없거나 showcase 로 시작하지 않으면 접속을 거절

게임 안에서 테스트​

쇼케이스의 게임 내 테스트 52개는 월드 안에서 /test runmultiple native_showcase:*로 실행합니다. 내 모드의 테스트를 만들고 실행하는 방법은 게임 내 테스트에 있습니다.

Buy me a coffee