diff options
author | Tom Barham <me@cpdt.dev> | 2022-02-22 08:33:50 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-21 19:33:50 -0300 |
commit | ea9a2ed9b9698d891769fa8598b8262aad97ed77 (patch) | |
tree | 2bcac5590c8c12114b6a54febd7920506bbe66c4 /Northstar.CustomServers/mod | |
parent | 1fad39a0d753fa905520ee858f3aa4e8a3ad96a5 (diff) | |
download | NorthstarMods-ea9a2ed9b9698d891769fa8598b8262aad97ed77.tar.gz NorthstarMods-ea9a2ed9b9698d891769fa8598b8262aad97ed77.zip |
Advanced chat: custom messages and client hooks (#217)
Co-authored-by: EmmaM <27428383+emma-miler@users.noreply.github.com>
Diffstat (limited to 'Northstar.CustomServers/mod')
-rw-r--r-- | Northstar.CustomServers/mod/scripts/vscripts/_chat.gnut | 51 | ||||
-rw-r--r-- | Northstar.CustomServers/mod/scripts/vscripts/_custom_codecallbacks.gnut | 38 |
2 files changed, 77 insertions, 12 deletions
diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_chat.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_chat.gnut new file mode 100644 index 00000000..97ed959c --- /dev/null +++ b/Northstar.CustomServers/mod/scripts/vscripts/_chat.gnut @@ -0,0 +1,51 @@ +untyped +globalize_all_functions + +enum eChatMessageType +{ + CHAT = 1, + WHISPER = 2 +} + +// Displays a chat message as if the player sent it. +void function Chat_Impersonate(entity player, string text, bool isTeamChat) { + NSSendMessage(player.GetPlayerIndex(), text, isTeamChat) +} + +// Sends a whisper message from one player that is only shown to another. Will be shown as a whisper if whisper is set. +void function Chat_PrivateMessage(entity fromPlayer, entity toPlayer, string text, bool whisper) { + NSBroadcastMessage( + fromPlayer.GetPlayerIndex(), + toPlayer.GetPlayerIndex(), + text, + false, + false, + whisper ? eChatMessageType.WHISPER : eChatMessageType.CHAT + ) +} + +// Broadcasts a message from the server to all players. +void function Chat_ServerBroadcast(string text) +{ + NSBroadcastMessage( + -1, + -1, + text, + false, + false, + eChatMessageType.CHAT + ) +} + +// Sends a message from the server to one player. Will be shown as a whisper if whisper is set. +void function Chat_ServerPrivateMessage(entity toPlayer, string text, bool whisper) +{ + NSBroadcastMessage( + -1, + toPlayer.GetPlayerIndex(), + text, + false, + false, + whisper ? eChatMessageType.WHISPER : eChatMessageType.CHAT + ) +} diff --git a/Northstar.CustomServers/mod/scripts/vscripts/_custom_codecallbacks.gnut b/Northstar.CustomServers/mod/scripts/vscripts/_custom_codecallbacks.gnut index 7f102f6e..9e46f99a 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/_custom_codecallbacks.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/_custom_codecallbacks.gnut @@ -1,11 +1,12 @@ untyped -globalize_all_functions +global function AddCallback_OnReceivedSayTextMessage +global function NSSetupChathooksServer global struct ClServer_MessageStruct { string message entity player - int channelId + bool isTeam bool shouldBlock } @@ -13,32 +14,45 @@ struct { array< ClServer_MessageStruct functionref( ClServer_MessageStruct ) > OnReceivedSayTextMessageCallbacks } NsCustomCallbacks -void function CServerGameDLL_ProcessMessageStartThread() +void function CServerGameDLL_ProcessMessageStartThread(int playerIndex, string message, bool isTeam) { - thread CServerGameDLL_OnReceivedSayTextMessageCallback() + thread CServerGameDLL_OnReceivedSayTextMessageCallback(playerIndex, message, isTeam) } -void function CServerGameDLL_OnReceivedSayTextMessageCallback() +void function CServerGameDLL_OnReceivedSayTextMessageCallback(int playerIndex, string message, bool isTeam) { + entity player = GetPlayerByIndex(playerIndex) + if (player == null) { + print("Ignored chat message from invalid player index " + playerIndex + ": " + message) + return + } + ClServer_MessageStruct localMessage - localMessage.message = NSChatGetCurrentMessage() - localMessage.player = GetPlayerByIndex(NSChatGetCurrentPlayer()) - localMessage.channelId = NSChatGetCurrentChannel() + localMessage.message = message + localMessage.player = player + localMessage.isTeam = isTeam localMessage.shouldBlock = false - foreach ( callbackFunc in NsCustomCallbacks.OnReceivedSayTextMessageCallbacks ) { ClServer_MessageStruct returnStruct = callbackFunc(localMessage) localMessage.message = returnStruct.message - localMessage.player = returnStruct.player - localMessage.channelId = returnStruct.channelId + localMessage.isTeam = returnStruct.isTeam localMessage.shouldBlock = localMessage.shouldBlock || returnStruct.shouldBlock } - NSSetMessage(localMessage.message, localMessage.player.GetPlayerIndex(), localMessage.channelId, localMessage.shouldBlock) + if (localMessage.shouldBlock) + { + return + } + + NSSendMessage(player.GetPlayerIndex(), localMessage.message, localMessage.isTeam) } void function AddCallback_OnReceivedSayTextMessage( ClServer_MessageStruct functionref (ClServer_MessageStruct) callbackFunc ) { NsCustomCallbacks.OnReceivedSayTextMessageCallbacks.append(callbackFunc) +} + +void function NSSetupChathooksServer() { + getroottable().rawset("CServerGameDLL_ProcessMessageStartThread", CServerGameDLL_ProcessMessageStartThread) }
\ No newline at end of file |