Restructure into multi-loader (Fabric + NeoForge) with merged jar

common 디렉토리에 로더 비종속 ChatAnswerCore 를 두고, fabric/ 과 neoforge/
서브프로젝트가 각자 진입점만 갖도록 분리. 두 결과물을 하나의 jar 로 묶기 위해
Fabric 측 common 클래스를 Shadow 의 relocate 로 kr.tkrmagid.chatanswer.fabric.core
패키지로 옮긴다 (Fabric 은 intermediary, NeoForge 는 Mojang 매핑이라 같은 클래스
경로에 그대로 두면 충돌). 루트의 mergedJar 태스크가 :fabric:relocatedJar 와
:neoforge:jar 를 합쳐서 build/libs/chat_answer-<version>-all.jar 생성.

산출물: 9.9KB 통합 jar 가 Fabric / NeoForge 양쪽에서 작동.
This commit is contained in:
Claude
2026-05-13 22:10:30 +09:00
parent 3e59d08db1
commit 2c35e77b8b
12 changed files with 340 additions and 157 deletions

41
neoforge/build.gradle Normal file
View File

@@ -0,0 +1,41 @@
plugins {
id 'net.neoforged.moddev' version '2.0.97'
}
archivesBaseName = "${project.mod_id}-neoforge"
sourceSets {
main {
java {
srcDirs += "${rootDir}/common/src/main/java"
}
}
}
neoForge {
version = project.neoforge_version
}
processResources {
inputs.property "version", project.version
inputs.property "mod_id", project.mod_id
inputs.property "mod_name", project.mod_name
inputs.property "minecraft_version", project.minecraft_version
inputs.property "neoforge_version", project.neoforge_version
filesMatching("META-INF/neoforge.mods.toml") {
expand(
"version": project.version,
"mod_id": project.mod_id,
"mod_name": project.mod_name,
"minecraft_version": project.minecraft_version,
"neoforge_version": project.neoforge_version
)
}
}
jar {
from(rootProject.file("LICENSE")) {
rename { "${it}_${project.mod_id}" }
}
}

View File

@@ -0,0 +1,23 @@
package kr.tkrmagid.chatanswer.neoforge;
import kr.tkrmagid.chatanswer.core.ChatAnswerCore;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.ServerChatEvent;
@Mod(ChatAnswerCore.MOD_ID)
public final class ChatAnswerNeoForge {
public ChatAnswerNeoForge(IEventBus modBus) {
NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onServerChat);
}
@SubscribeEvent
public static void onServerChat(ServerChatEvent event) {
boolean allow = ChatAnswerCore.handleChat(event.getPlayer(), event.getRawText());
if (!allow) {
event.setCanceled(true);
}
}
}

View File

@@ -0,0 +1,26 @@
modLoader = "javafml"
loaderVersion = "[1,)"
license = "MIT"
issueTrackerURL = "https://git.tkrmagid.kr/tkrmagid/mc_chat_answer_mod/issues"
[[mods]]
modId = "${mod_id}"
version = "${version}"
displayName = "${mod_name}"
authors = "tkrmagid"
description = '''음악퀴즈(mq) 데이터팩이 정답 입력을 받는 상태(init=5)에서 채팅을 가로채 mq:answer/submit 함수로 전달합니다.'''
displayURL = "https://git.tkrmagid.kr/tkrmagid/mc_chat_answer_mod"
[[dependencies.${mod_id}]]
modId = "neoforge"
type = "required"
versionRange = "[${neoforge_version},)"
ordering = "NONE"
side = "SERVER"
[[dependencies.${mod_id}]]
modId = "minecraft"
type = "required"
versionRange = "[${minecraft_version},)"
ordering = "NONE"
side = "SERVER"