Example #1
0
        /// <summary>
        /// AI 컨트롤러로 위임.
        /// 최초 할당한 유저 값만 의미가 있고 이후 위임한 유저의 값은 의미가 없음
        /// </summary>
        /// <param name="actor"></param>
        /// <param name="original_actor"></param>
        public void Possess(SActor actor, SActor original_actor)
        {
            // 기존 유저 정보를 바탕으로 ai컨트롤러 초기화
            if (original_actor.GetActorController() != null)
            {
                mSessionId         = original_actor.GetActorController().mSessionId;
                mSelectedCharacter = original_actor.GetActorController().mSelectedCharacter;
                UserId             = original_actor.GetActorController().UserId;
                mCharacterLevel    = original_actor.GetActorController().mCharacterLevel;
            }
            mNetworkId       = original_actor.GetNetworkId();
            mPlayerId        = original_actor.GetPlayerId();
            ControllPlayerId = actor.GetPlayerId();

            Log.Information($"ai Possess original player_id{mPlayerId}, attached player_id{actor.GetPlayerId()}");

            // ai 할당되었음을 동기화
            actor.AIPlayers.Add(mNetworkId);
            NetworkManagerServer.sInstance.SetStateDirty(actor.GetNetworkId(), actor.WorldId, (uint)Actor.ReplicationState.AI);

            original_actor.SetController(this);

            // 순환 참조 방지
            if (actor != original_actor)
            {
                actor.GetActorController().AIControllers.Add(this);
            }

            World.Instance(original_actor.WorldId).aiList[original_actor.GetPlayerId()] = original_actor;
        }
Example #2
0
        public SActor RestoreAI()
        {
            SActor actor  = null;
            var    actors = World.Instance(mWorldId).playerList.Values.Where(x => x.GetPlayerId() != GetPlayerId() && ((SActor)x).GetActorController() != null).Select(x => (SActor)x).ToList();

            foreach (var otherActor in actors)
            {
                var aiController = otherActor.GetActorController().GetAIController(this.mSessionId);
                if (aiController != null && aiController != default(AIController))
                {
                    // AI로 대신 플레이 해주었던 유저에게서 때어 내고
                    actor = (SActor)NetworkManagerServer.sInstance.GetGameObject(aiController.mNetworkId, this.mWorldId);
                    if (actor != null)
                    {
                        aiController.Unpossess(actor);

                        actor.GetActorController().AIControllers.RemoveAll(x => x.mSessionId == this.mSessionId);

                        // 원래 유저에게 다시 붙인다.
                        this.Possess(actor);
                    }
                }
            }
            return(actor);
        }