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 void Unpossess(SActor actor, PlayerController newPlayerController, AIController aiController)
        {
            Log.Information($"player Unpossess player_id{actor.GetPlayerId()}, network_id{actor.NetworkId}, world{actor.WorldId}");

            // 새로운 플레이어컨트롤로 교체인 경우
            if (newPlayerController != null)
            {
                actor.SetController(newPlayerController);
                return;
            }

            World.Instance(actor.WorldId).GameMode.LeaveEntry(mPlayerId);

            if (EnableAiSwitch)
            {
                // 남은 플레이어중에서 ai가 가장 적게 할당된 유저에게 할당
                var otherActor = GetAppropriateActorAIPossess(mWorldId, GetPlayerId());
                if (otherActor != null)
                {
                    if (aiController == null)
                    {
                        // 최초 AI컨트롤러로 위임
                        aiController = new AIController();
                        aiController.Possess(otherActor, actor);
                    }
                    else
                    {
                        // 새로운 곳에 붙임
                        aiController.Possess(otherActor, actor);
                    }

                    // AI 교체 완료
                    return;
                }
            }

            // 기본적으로 해당 객체에 컨트롤러를 널로 초기화
            actor.SetController(null);
        }
Example #3
0
        public void Possess(SActor actor)
        {
            Log.Information($"player Possess player_id{mPlayerId}, network_id{actor.NetworkId}, world{actor.WorldId}");

            ControllPlayerId = mPlayerId;
            actor.SetPlayerId(mPlayerId);
            actor.SetController(this);

            var entry = World.Instance(actor.WorldId).GameMode.GetEntry(mPlayerId);

            if (entry != null)
            {
                entry.Leave = false;
            }
        }