11package NoMathExpectation.chatExchange.neoForged
22
3+ import com.mojang.brigadier.StringReader
34import com.mojang.brigadier.arguments.BoolArgumentType
5+ import com.mojang.brigadier.arguments.StringArgumentType
46import net.minecraft.commands.Commands
7+ import net.minecraft.commands.ParserUtils
58import net.minecraft.network.chat.Component
9+ import net.minecraft.network.chat.ComponentSerialization
610import net.minecraft.network.chat.contents.PlainTextContents
711import net.minecraft.world.entity.player.Player
812import net.neoforged.bus.api.EventPriority
@@ -16,10 +20,13 @@ import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedInEven
1620import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent
1721import net.neoforged.neoforge.event.server.ServerStartedEvent
1822import net.neoforged.neoforge.event.server.ServerStoppingEvent
23+ import org.apache.logging.log4j.LogManager
1924import kotlin.jvm.optionals.getOrNull
2025
2126@EventBusSubscriber(modid = ChatExchange .ID )
2227object NeoForgeEvents {
28+ private val logger = LogManager .getLogger(ChatExchange .ID )
29+
2330 @SubscribeEvent
2431 fun onServerStarted (event : ServerStartedEvent ) {
2532 ExchangeServer .startNewInstance(event.server)
@@ -57,7 +64,7 @@ object NeoForgeEvents {
5764
5865 ExchangeServer .sendEvent(
5966 MessageEvent (
60- event.username ,
67+ ExchangeServer .componentToString( event.player.name) ,
6168 ExchangeServer .componentToString(message)
6269 )
6370 )
@@ -69,7 +76,7 @@ object NeoForgeEvents {
6976 return
7077 }
7178
72- val name = event.entity.name.string
79+ val name = ExchangeServer .componentToString( event.entity.name)
7380 if (ChatExchangeConfig .checkIgnoreBot(name)) {
7481 return
7582 }
@@ -85,7 +92,7 @@ object NeoForgeEvents {
8592 return
8693 }
8794
88- val name = event.entity.name.string
95+ val name = ExchangeServer .componentToString( event.entity.name)
8996 if (ChatExchangeConfig .checkIgnoreBot(name)) {
9097 return
9198 }
@@ -102,16 +109,15 @@ object NeoForgeEvents {
102109 }
103110
104111 val player = event.entity as ? Player ? : return
105- val name = player.name.string
112+ val name = ExchangeServer .componentToString( player.name)
106113 if (ChatExchangeConfig .checkIgnoreBot(name)) {
107114 return
108115 }
109116
110117 val cause = event.source
111- val playerName = ExchangeServer .componentToString(player.name)
112118 val text = ExchangeServer .componentToString(cause.getLocalizedDeathMessage(player))
113119 ExchangeServer .sendEvent(
114- PlayerDieEvent (playerName , text)
120+ PlayerDieEvent (name , text)
115121 )
116122 }
117123
@@ -122,7 +128,7 @@ object NeoForgeEvents {
122128 }
123129
124130 val player = event.entity
125- val name = player.name.string
131+ val name = ExchangeServer .componentToString( player.name)
126132 if (ChatExchangeConfig .checkIgnoreBot(name)) {
127133 return
128134 }
@@ -134,9 +140,8 @@ object NeoForgeEvents {
134140
135141 val advancementName =
136142 advancement.display.getOrNull()?.title?.let { ExchangeServer .componentToString(it) } ? : return
137- val playerName = ExchangeServer .componentToString(player.name)
138143 ExchangeServer .sendEvent(
139- PlayerAdvancementEvent (playerName , advancementName)
144+ PlayerAdvancementEvent (name , advancementName)
140145 )
141146 }
142147
@@ -147,9 +152,43 @@ object NeoForgeEvents {
147152 }
148153
149154 val dispatcher = event.dispatcher
155+ val buildContext = event.buildContext
150156
151157 val command = Commands .literal(" chatexchange" )
152158 .then(
159+ Commands .literal(" send" ).then(
160+ Commands .argument(" message" , StringArgumentType .greedyString()).executes { context ->
161+ val player = context.source.player ? : return @executes 0
162+ val message = StringArgumentType .getString(context, " message" )
163+
164+ val name = ExchangeServer .componentToString(player.name)
165+
166+ val component = kotlin.runCatching {
167+ val formatted = ChatExchangeConfig .commandBroadcastFormat
168+ .get()
169+ .format(
170+ name,
171+ message,
172+ )
173+ ParserUtils .parseJson(buildContext, StringReader (formatted), ComponentSerialization .CODEC )
174+ }.getOrElse {
175+ logger.error(" Unable to resolve component from command broadcast format." , it)
176+ player.sendSystemMessage(" chatexchange.const.exception" .toExchangeServerTranslatedLiteral())
177+ return @executes 0
178+ }
179+
180+ logger.info(component.getStringWithLanguage(ExchangeServer .language))
181+ ExchangeServer .sendEvent(
182+ MessageEvent (name, message)
183+ )
184+ player.server.playerList.players.forEach {
185+ it.sendSystemMessage(component)
186+ }
187+
188+ 1
189+ }
190+ )
191+ ).then(
153192 Commands .literal(" status" ).executes { context ->
154193 val player = context.source.player ? : return @executes 0
155194
0 commit comments