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