Пример #1
0
        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());
        }
Пример #2
0
        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());
        }