private bool SendMessage(ChatChannel chatChannel, string message, NwObject speaker, NwPlayer?target) { uint playerId = target != null ? target.Player.m_nPlayerID : PlayerIdConstants.AllClients; if (playerId == PlayerIdConstants.Invalid) { return(false); } CNWSMessage messageDispatch = LowLevel.ServerExoApp.GetNWSMessage(); if (target != null) { // This means we're sending this to one player only. // The normal function broadcasts in an area for talk, shout, and whisper, therefore // we need to call these functions directly if we are in those categories. switch (chatChannel) { case ChatChannel.PlayerTalk: return(messageDispatch.SendServerToPlayerChat_Talk(playerId, speaker, message.ToExoString()).ToBool()); case ChatChannel.DmTalk: return(messageDispatch.SendServerToPlayerChat_DM_Talk(playerId, speaker, message.ToExoString()).ToBool()); case ChatChannel.DmDm: case ChatChannel.PlayerDm: return(messageDispatch.SendServerToPlayerChat_DM_Silent_Shout(playerId, speaker, message.ToExoString()).ToBool()); case ChatChannel.PlayerShout: case ChatChannel.DmShout: return(messageDispatch.SendServerToPlayerChat_Shout(playerId, speaker, message.ToExoString()).ToBool()); case ChatChannel.PlayerWhisper: return(messageDispatch.SendServerToPlayerChat_Whisper(playerId, speaker, message.ToExoString()).ToBool()); case ChatChannel.DmWhisper: return(messageDispatch.SendServerToPlayerChat_DM_Whisper(playerId, speaker, message.ToExoString()).ToBool()); case ChatChannel.PlayerParty: case ChatChannel.DmParty: return(messageDispatch.SendServerToPlayerChat_Party(playerId, speaker, message.ToExoString()).ToBool()); } } return(messageDispatch.SendServerToPlayerChatMessage((byte)chatChannel, speaker, message.ToExoString(), playerId).ToBool()); }
private int OnSendServerToPlayerChatMessage(void *pMessage, ChatChannel nChatMessageType, uint oidSpeaker, void *sSpeakerMessage, uint nTellPlayerId, void *tellName) { if (!isEventHooked && !customHearingDistances) { return(sendServerToPlayerChatMessageHook.CallOriginal(pMessage, nChatMessageType, oidSpeaker, sSpeakerMessage, nTellPlayerId, tellName)); } CNWSMessage message = CNWSMessage.FromPointer(pMessage); CExoString speakerMessage = CExoString.FromPointer(sSpeakerMessage); NwObject speaker = oidSpeaker.ToNwObject() !; bool skipMessage = ProcessEvent(nChatMessageType, speakerMessage.ToString(), speaker, NwPlayer.FromPlayerId(nTellPlayerId)); if (skipMessage) { return(false.ToInt()); } if (!customHearingDistances) { return(sendServerToPlayerChatMessageHook.CallOriginal(pMessage, nChatMessageType, oidSpeaker, sSpeakerMessage, nTellPlayerId, tellName)); } CExoLinkedListInternal playerList = LowLevel.ServerExoApp.m_pcExoAppInternal.m_pNWSPlayerList.m_pcExoLinkedListInternal; if (playerList == null) { return(false.ToInt()); } if (nChatMessageType == ChatChannel.PlayerShout && nwServer.ServerInfo.PlayOptions.DisallowShouting) { nChatMessageType = ChatChannel.PlayerTalk; } if (nChatMessageType != ChatChannel.PlayerTalk && nChatMessageType != ChatChannel.PlayerWhisper && nChatMessageType != ChatChannel.DmTalk && nChatMessageType != ChatChannel.DmWhisper) { return(sendServerToPlayerChatMessageHook.CallOriginal(pMessage, nChatMessageType, oidSpeaker, sSpeakerMessage, nTellPlayerId, tellName)); } NwGameObject?speakerGameObject = speaker as NwGameObject; NwArea? speakerArea = speakerGameObject?.Area; foreach (NwPlayer player in NwModule.Instance.Players) { NwCreature?controlledCreature = player.ControlledCreature; if (controlledCreature == null || speakerArea != null && speakerArea != controlledCreature.Area) { continue; } float hearDistance = GetPlayerChatHearingDistance(player, nChatMessageType); if (speakerGameObject != null && controlledCreature.DistanceSquared(speakerGameObject) > hearDistance * hearDistance) { continue; } switch (nChatMessageType) { case ChatChannel.PlayerTalk: message.SendServerToPlayerChat_Talk(player.Player.m_nPlayerID, speaker, speakerMessage); break; case ChatChannel.DmTalk: message.SendServerToPlayerChat_DM_Talk(player.Player.m_nPlayerID, speaker, speakerMessage); break; case ChatChannel.PlayerWhisper: message.SendServerToPlayerChat_Whisper(player.Player.m_nPlayerID, speaker, speakerMessage); break; case ChatChannel.DmWhisper: message.SendServerToPlayerChat_DM_Whisper(player.Player.m_nPlayerID, speaker, speakerMessage); break; } } return(true.ToInt()); }