/// <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); }
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); }
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(); } } }
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()); }