예제 #1
0
        /// <summary>
        /// Converts the specified object ID value into a managed player object.
        /// </summary>
        /// <param name="objectId">The object ID to convert.</param>
        /// <param name="playerSearch">Methods to use to resolve the player.</param>
        /// <returns>The associated player for this object, otherwise null.</returns>
        public static unsafe NwPlayer?ToNwPlayer(this uint objectId, PlayerSearch playerSearch = PlayerSearch.All)
        {
            if (objectId == NwObject.Invalid)
            {
                return(null);
            }

            CNWSPlayer?player = null;

            if (playerSearch.HasFlag(PlayerSearch.Controlled))
            {
                player = LowLevel.ServerExoApp.GetClientObjectByObjectId(objectId);
            }

            if ((player == null || player.Pointer == IntPtr.Zero) && playerSearch.HasFlag(PlayerSearch.Login))
            {
                CExoLinkedListInternal players = LowLevel.ServerExoApp.m_pcExoAppInternal.m_pNWSPlayerList.m_pcExoLinkedListInternal;
                for (CExoLinkedListNode node = players.pHead; node != null; node = node.pNext)
                {
                    CNWSPlayer current = CNWSPlayer.FromPointer(node.pObject);
                    if (current.m_oidPCObject == objectId)
                    {
                        player = current;
                        break;
                    }
                }
            }

            return(player != null && player.Pointer != IntPtr.Zero ? new NwPlayer(player) : null);
        }
예제 #2
0
        private bool IsCreatureInLastUpdateObjectList(NwPlayer observer, NwPlayer target)
        {
            CNWSPlayer        nwPlayer      = observer.Player;
            CLastUpdateObject lastUpdateObj = nwPlayer.GetLastUpdateObject(target.ControlledCreature);

            if (lastUpdateObj != null)
            {
                return(true);
            }

            CExoLinkedListInternal partyObjectsList = nwPlayer.m_pActivePartyObjectsLastUpdate.m_pcExoLinkedListInternal;

            if (partyObjectsList == null)
            {
                return(false);
            }

            for (CExoLinkedListNode head = partyObjectsList.pHead; head != null; head = head.pNext)
            {
                CLastUpdatePartyObject partyMember = CLastUpdatePartyObject.FromPointer(head.pObject);
                if (partyMember != null && partyMember.m_nPlayerId == target.ControlledCreature?.ObjectId)
                {
                    return(true);
                }
            }

            return(false);
        }
예제 #3
0
        private void OnDropTURD(void *pPlayer)
        {
            dropTURDHook.CallOriginal(pPlayer);

            // Be very, very paranoid. Bad things happen when the TURD list doesn't exist
            // This can happen when you BootPC() the very first PC to connect to your sever
            //     https://github.com/nwnxee/unified/issues/319
            CExoLinkedListInternal turdList = NwModule.Instance.Module.m_lstTURDList.m_pcExoLinkedListInternal;
            CExoLinkedListNode     pHead;

            if (turdList != null && (pHead = turdList.pHead) != null && pHead.pObject != null)
            {
                CNWSPlayer     player = CNWSPlayer.FromPointer(pPlayer);
                CNWSPlayerTURD turd   = CNWSPlayerTURD.FromPointer(pHead.pObject);

                ICGameObject?playerObj = player.m_oidNWSObject.ToNwObject()?.Object;
                if (playerObj != null)
                {
                    objectStorage[turd.Pointer] = GetObjectStorage(playerObj).Clone();
                }
            }
        }
예제 #4
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());
        }