aboutsummaryrefslogtreecommitdiff
path: root/Northstar.CustomServers/mod/scripts
diff options
context:
space:
mode:
authorTom Barham <me@cpdt.dev>2022-02-22 08:33:50 +1000
committerGitHub <noreply@github.com>2022-02-21 19:33:50 -0300
commitea9a2ed9b9698d891769fa8598b8262aad97ed77 (patch)
tree2bcac5590c8c12114b6a54febd7920506bbe66c4 /Northstar.CustomServers/mod/scripts
parent1fad39a0d753fa905520ee858f3aa4e8a3ad96a5 (diff)
downloadNorthstarMods-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/scripts')
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/_chat.gnut51
-rw-r--r--Northstar.CustomServers/mod/scripts/vscripts/_custom_codecallbacks.gnut38
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