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:
@@ -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 = 채팅 차단 (이미 정답 제출 처리됨)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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=채팅정답
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user