Add player-join hook to signal mod presence to datapack (v1.1.0)

ChatAnswerCore.onPlayerJoin 이 storage chat_answer:status active=1b 를 set.
Fabric 측은 ServerPlayConnectionEvents.JOIN, NeoForge 측은 PlayerLoggedInEvent
에서 호출. 데이터팩이 mq:load 단계에서 0b 로 clear 해 두므로, 모드가 빠진
환경에선 이 hook 이 일어나지 않아 0b 가 유지되고, 모드가 있으면 첫 로그인
직후 1b 로 갱신되어 데이터팩이 활성 상태를 분기할 수 있다.
This commit is contained in:
Claude
2026-05-13 22:20:00 +09:00
parent 2c35e77b8b
commit 4eb9cf796c
4 changed files with 35 additions and 1 deletions

View File

@@ -31,6 +31,26 @@ public final class ChatAnswerCore {
private ChatAnswerCore() {} private ChatAnswerCore() {}
/**
* 플레이어 로그인 직후 호출. 데이터팩이 "모드 살아있음" 신호로 쓸 수 있게
* storage chat_answer:status 에 active=1b 를 세팅한다. 데이터팩의 mq:load 가
* 매 /reload 와 서버 시작 시 이 값을 0b 로 clear 하므로, 모드가 없으면 이
* 호출이 일어나지 않아 0b 로 유지되고, 모드가 있으면 첫 로그인 직후 1b 로 갱신.
*/
public static void onPlayerJoin(ServerPlayer player) {
MinecraftServer server = player.getServer();
if (server == null) return;
CommandSourceStack source = server.createCommandSourceStack().withSuppressedOutput();
try {
server.getCommands().performPrefixedCommand(
source,
"data modify storage chat_answer:status active set value 1b"
);
} catch (Exception e) {
LOG.debug("[{}] failed to set active flag: {}", MOD_ID, e.toString());
}
}
/** /**
* @return true = 채팅을 평소처럼 broadcast / false = 채팅 차단 (이미 정답 제출 처리됨) * @return true = 채팅을 평소처럼 broadcast / false = 채팅 차단 (이미 정답 제출 처리됨)
*/ */

View File

@@ -3,6 +3,7 @@ package kr.tkrmagid.chatanswer.fabric;
import kr.tkrmagid.chatanswer.core.ChatAnswerCore; import kr.tkrmagid.chatanswer.core.ChatAnswerCore;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.message.v1.ServerMessageEvents; import net.fabricmc.fabric.api.message.v1.ServerMessageEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
public final class ChatAnswerFabric implements ModInitializer { public final class ChatAnswerFabric implements ModInitializer {
@Override @Override
@@ -10,5 +11,8 @@ public final class ChatAnswerFabric implements ModInitializer {
ServerMessageEvents.ALLOW_CHAT_MESSAGE.register((message, sender, params) -> ServerMessageEvents.ALLOW_CHAT_MESSAGE.register((message, sender, params) ->
ChatAnswerCore.handleChat(sender, message.signedContent()) ChatAnswerCore.handleChat(sender, message.signedContent())
); );
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) ->
ChatAnswerCore.onPlayerJoin(handler.player)
);
} }
} }

View File

@@ -15,6 +15,6 @@ neoforge_version=21.6.20-beta
# ───── mod metadata ───────────────────────────────────────────────────────── # ───── mod metadata ─────────────────────────────────────────────────────────
mod_id=chat_answer mod_id=chat_answer
mod_version=1.0.0 mod_version=1.1.0
mod_group=kr.tkrmagid.chatanswer mod_group=kr.tkrmagid.chatanswer
mod_name=채팅정답 mod_name=채팅정답

View File

@@ -1,16 +1,19 @@
package kr.tkrmagid.chatanswer.neoforge; package kr.tkrmagid.chatanswer.neoforge;
import kr.tkrmagid.chatanswer.core.ChatAnswerCore; import kr.tkrmagid.chatanswer.core.ChatAnswerCore;
import net.minecraft.server.level.ServerPlayer;
import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.Mod; import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.ServerChatEvent; import net.neoforged.neoforge.event.ServerChatEvent;
import net.neoforged.neoforge.event.entity.player.PlayerEvent;
@Mod(ChatAnswerCore.MOD_ID) @Mod(ChatAnswerCore.MOD_ID)
public final class ChatAnswerNeoForge { public final class ChatAnswerNeoForge {
public ChatAnswerNeoForge(IEventBus modBus) { public ChatAnswerNeoForge(IEventBus modBus) {
NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onServerChat); NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onServerChat);
NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onPlayerLogin);
} }
@SubscribeEvent @SubscribeEvent
@@ -20,4 +23,11 @@ public final class ChatAnswerNeoForge {
event.setCanceled(true); event.setCanceled(true);
} }
} }
@SubscribeEvent
public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) {
if (event.getEntity() instanceof ServerPlayer player) {
ChatAnswerCore.onPlayerJoin(player);
}
}
} }