/// <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 uint OnModuleLoadProgressChange(void *pModule, int nAreasLoaded, int nAreasToLoad) { CNWSModule module = CNWSModule.FromPointer(pModule); int index = nAreasLoaded; CExoLinkedListNode node = module.m_lstModuleArea.m_pcExoLinkedListInternal.pHead; while (node != null && index != 0) { node = node.pNext; index--; } CResRef?resRef = node != null?CResRef.FromPointer(node.pObject) : null; if (resRef != null) { Log.Debug("Loading area {Area} ({AreaNum}/{AreaCount})", resRef.ToString(), nAreasLoaded + 1, nAreasToLoad); } uint retVal = loadModuleInProgressHook.CallOriginal(pModule, nAreasLoaded, nAreasToLoad); if (resRef != null) { switch (retVal) { case 0: Log.Debug("Loaded area {Area} ({AreaNum}/{AreaCount})", resRef.ToString(), nAreasLoaded + 1, nAreasToLoad); break; default: Log.Error("Failed to load area {Area}, error code {ErrorCode} ({AreaNum}/{AreaCount})", resRef.ToString(), retVal, nAreasLoaded + 1, nAreasToLoad); break; } } return(retVal); }