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