using System.Diagnostics.CodeAnalysis; using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using static ClientToGameRes.Types; using ANCHOR_GUID = System.String; using Amazon.Runtime.Internal; namespace GameServer; internal class GameZoneAction : EntityActionBase { Map? m_map; public GameZoneAction(Player owner) : base(owner) { } public GameZoneAction(UgcNpc owner) : base(owner) { } public override Task onInit() { var result = new Result(); return Task.FromResult(result); } public override void onClear() { return; } public void broadcast(Player player, ClientToGame message) { ArgumentNullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); ArgumentNullReferenceCheckHelper.throwIfNull(message, () => $"message is null !!! - {player.toBasicString()}"); if (null == m_map) { Log.getLogger().warn($"Not joined GameZone !!! - {player.toBasicString()}"); return; } m_map.Broadcast(player, message); } public Result tryEnterGameZone(Map map) { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); if(true == isLinkedToMap()) { var curr_map = getLinkedToMap(); NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {player.toBasicStringWithMaster()}"); err_msg = $"Entity is linked to Map !!! : currMap:{curr_map.toBasicString()} - {player.toBasicStringWithMaster()}"; result.setFail(ServerErrorCode.EntityLinkedToMap, err_msg); Log.getLogger().error(result.toBasicString()); return result; } result = map.tryAddPlayer(player); if(result.isFail()) { return result; } setlinkToMap(map); var log_action = new LogActionEx(LogActionType.StageEnter); var stage_log_info = StageBusinessLogHelper.toStageLogInfo(StageMoveType.Enter, map); var stage_business_log = new StageBusinessLog(stage_log_info, log_action); BusinessLogger.collectLog(player, stage_business_log); return result; } public async Task tryLeaveGameZone() { var result = new Result(); var err_msg = string.Empty; if (false == isLinkedToMap()) { return result; } var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var user_attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {player.toBasicString()}"); var farming_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {player.toBasicString()}"); if (true == farming_action.isFarmingHere()) { var farming_effect = farming_action.getFarmingEffect(); NullReferenceCheckHelper.throwIfNull(farming_effect, () => $"farming_effect is null !!! - {player.toBasicString()}"); var farming_effect_attribute = farming_effect.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(farming_effect_attribute, () => $"farming_effect_attribute is null !!! - {player.toBasicString()}"); var farming_cancel_result = await GameServer.PacketHandler.FarmingCancelPacketHandler.tryCancelFarming(player, farming_effect_attribute.AnchorMetaGuid); if (farming_cancel_result.isFail()) { err_msg = $"Failed to FarmingCancelPacketHandler.tryCancelFarming() !!! : {farming_cancel_result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } } var curr_map = getLinkedToMap(); NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {player.toBasicString()}"); result = curr_map.tryRemovePlayer(player); if(result.isFail()) { return result; } unlinkToMap(); var log_action = new LogActionEx(LogActionType.StageExit); var stage_log_info = StageBusinessLogHelper.toStageLogInfo(StageMoveType.Leave, curr_map); var stage_business_log = new StageBusinessLog(stage_log_info, log_action); BusinessLogger.collectLog(player, stage_business_log); return result; } public Result tryMove(Pos pos) { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "Player is null !!!"); var location_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(location_action, () => $"location action is null !!! - {player.toBasicString()}"); if(true == isLinkedToMap()) { var curr_map = getLinkedToMap(); NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {player.toBasicString()}"); result = curr_map.tryRelocate(player, pos); if(result.isFail()) { return result; } } else { // 이런 경우가 발생할 수 있는지 시스템적인 체크가 필요 하다 !!! // 나올 수 없다면 location_action.tryModifyCurrentPos(pos) 처리는 Map이 연결된 경우만 호출되어야 한다 !!!. - kangms err_msg = $"Not linked to Map !!! - {player.toBasicString()}"; Log.getLogger().error(err_msg); } location_action.tryModifyCurrentPos(pos); return result; } public async Task<(Result, ElevatorFloorInfoRes)> tryGetElevatorFloorInfos(int landMetaId, int buildingMetaId) { var result = new Result(); var err_msg = string.Empty; var res = new ElevatorFloorInfoRes(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var server_logic = GameServerApp.getServerLogic(); NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}"); if (!MapManager.Instance.GetLandMapTree(landMetaId, out var land_map_tree)) { err_msg = $"Failed to GetLandMapTree() !!! : LandMetaId:{landMetaId} - {player.toBasicString()}"; result.setFail(ServerErrorCode.LandMapTreeDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, res); } var building_map_tree = land_map_tree.ChildBuildingMapTree; if (building_map_tree == null) { err_msg = $"Not Exist LandMapTree ChildBuilding !!! : LandMap:{land_map_tree.LandMapFileName} - {player.toBasicString()}"; result.setFail(ServerErrorCode.LandMapTreeChildBuildingNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, res); } if (building_map_tree.BuildingMetaId != buildingMetaId && buildingMetaId != 0) { err_msg = $"Not Match LandMap ChildBuilding !!! : ChildBuildingMetaId:{building_map_tree.BuildingMetaId}, inputBuildingMetaId:{buildingMetaId} - {player.toBasicString()}"; result.setFail(ServerErrorCode.LandMapTreeChildBuildingNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, res); } foreach (var (floor, room_map_tree) in building_map_tree.ChildRoomMapTrees) { var owner_name = string.Empty; if (room_map_tree.OwnerGuid != string.Empty) { (result, var nickname_attrib) = await NicknameDoc.findNicknameFromGuid(room_map_tree.OwnerGuid); if (result.isFail() || null == nickname_attrib) continue; owner_name = nickname_attrib.Nickname; } var user_count = 0; if (room_map_tree.MyhomeGuid != string.Empty) { var roomIdBase = InstanceRoomHandler.makeMyhomeInstanceRoomIdBase(room_map_tree.OwnerGuid, room_map_tree.MyhomeGuid); user_count = await InstanceRoomHandler.getInstanceUserCount(room_map_tree.InstanceMetaId, roomIdBase); } else { var roomIdBase = InstanceRoomHandler.makeInstanceRoomIdBase(room_map_tree.InstanceMetaId); user_count = await InstanceRoomHandler.getInstanceUserCount(room_map_tree.InstanceMetaId, roomIdBase); } ElevatorFloorInfo elevatorFloorInfo = new(); elevatorFloorInfo.Floor = floor; elevatorFloorInfo.InstanceId = room_map_tree.InstanceMetaId; elevatorFloorInfo.CurrentUser = user_count; elevatorFloorInfo.OwnerName = owner_name; elevatorFloorInfo.InstanceName = room_map_tree.InstanceName; elevatorFloorInfo.ThumbnailImageId = room_map_tree.ThumbnailImageId; elevatorFloorInfo.ListImageId = room_map_tree.ListImageId; elevatorFloorInfo.EnterPlayerCount = room_map_tree.EnterPlayerCount; res.List.Add(elevatorFloorInfo); } return (result, res); } public (Result, Pos?, List?) tryMoveTaxiWayPoint(TaxiMetaData taxi_meta_data) { var result = new Result(); var err_msg = string.Empty; var business_logs = new List(); NullReferenceCheckHelper.throwIfNull(m_map, () => $"m_map is null"); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var location_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(location_action, () => $"location_action is null !!! - {player.toBasicString()}"); if (taxi_meta_data.WaypointWorld != m_map.MapMId || taxi_meta_data.UnloadingWorldId != m_map.MapMId) { err_msg = $"Not Usable Place !!! WaypointWorldMetaId:{taxi_meta_data.WaypointWorld}, UnloadingWorldMetaId:{taxi_meta_data.UnloadingWorldId}, CurrentMapMid:{m_map.MapMId} - {player.toBasicString()}"; result.setFail(ServerErrorCode.NotUsablePlace, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null); } var departure_position_info = player.getCurrentPositionInfo(); var departure_position_log_info = PositionBusinessLogHelper.toPositionLogInfo(PositionMoveType.Departure, departure_position_info); var departure_position_business_log = new PositionBusinessLog(departure_position_log_info); business_logs.Add(departure_position_business_log); Pos newPos = ServerBase.EntityHelper.makePos(taxi_meta_data.UnloadingPositionX, taxi_meta_data.UnloadingPositionY, taxi_meta_data.UnloadingPositionZ, taxi_meta_data.UnloadingRotate); result = location_action.tryUpdateCurrentPos(newPos); if (result.isFail()) { err_msg = $"Failed to tryUpdateCurrentPos() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null, null); } var arrival_position_info = player.getCurrentPositionInfo(); arrival_position_info.Pos = newPos; var arrival_position_log_info = PositionBusinessLogHelper.toPositionLogInfo(PositionMoveType.Arrival, arrival_position_info); var arrival_position_business_log = new PositionBusinessLog(arrival_position_log_info); business_logs.Add(arrival_position_business_log); return (result, newPos, business_logs); } public async Task<(Result, ClientToGameRes.Types.LeaveInstanceRoomRes)> tryLeaveInstanceRoom() { var result = new Result(); var err_msg = string.Empty; var res = new ClientToGameRes.Types.LeaveInstanceRoomRes(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var farming_action = player.getEntityAction(); if (true == farming_action.isFarmingHere()) { var farming_effect = farming_action.getFarmingEffect(); NullReferenceCheckHelper.throwIfNull(farming_effect, () => $"farming_effect is null !!! - {player.toBasicString()}"); var farming_effect_attribute = farming_effect.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(farming_effect_attribute, () => $"farming_effect_attribute is null !!! - {player.toBasicString()}"); var farming_cancel_result = await GameServer.PacketHandler.FarmingCancelPacketHandler.tryCancelFarming(player, farming_effect_attribute.AnchorMetaGuid); if (farming_cancel_result.isFail()) { err_msg = $"Failed to FarmingCancelPacketHandler.tryCancelFarming() !!! : {farming_cancel_result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } } var location_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(location_action, () => $"location_action is null !!! - {player.toBasicString()}"); var current_indun_location = location_action.getCurrentLocation() as IndunLocation; NullReferenceCheckHelper.throwIfNull(current_indun_location, () => $"current_indun_location is null !!! - {player.toBasicString()}"); var instance_room_Id = current_indun_location.InstanceRoomId; if (instance_room_Id == string.Empty) { Log.getLogger().info($"tryLeaveInstanceRoom() !!! - {player.toBasicString()}"); return (result, res); } if (!await InstanceRoomManager.Instance.LeaveRoom(player, instance_room_Id)) { err_msg = $"Failed to LeaveRoom() !!! : instanceRoomId:{instance_room_Id} - {player.toBasicString()}"; result.setFail(ServerErrorCode.NotExistInstanceRoom, err_msg); Log.getLogger().error(result.toBasicString()); return (result, res); } return (result, res); } public Result tryExchangeMannequinDisplayItem(string anchorGuid, List displayItemMetaIds) { var result = new Result(); var err_msg = string.Empty; NullReferenceCheckHelper.throwIfNull(m_map, () => $"m_map is null"); var server_logic = GameServerApp.getServerLogic(); var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game; NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => "rabbit mq is null !!!"); MapManager.Instance.ExchangeMannequinDisplayItem(anchorGuid, displayItemMetaIds); m_map.PropModifyNoti(anchorGuid); rabbit_mq.sendExchangeMannequinDisplayItemNoti(anchorGuid, displayItemMetaIds); return result; } public (Result, UseMountPropRes) tryUseMountProp(string anchorGuid) { var result = new Result(); var err_msg = string.Empty; NullReferenceCheckHelper.throwIfNull(m_map, () => $"m_map is null"); var res = new UseMountPropRes(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game; NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit mq is null !!! - {player.toBasicString()}"); if (false == m_map.getAnchors().TryGetValue(anchorGuid, out var anchor_info)) { err_msg = $"Not Found AnchorInfo. anchorGuid:{anchorGuid}"; result.setFail(ServerErrorCode.NotFoundAnchorGuid, err_msg); Log.getLogger().error(err_msg); return (result, res); } if (!server_logic.getPlayerManager().tryGetUserByPrimaryKey(anchor_info.OccupyingUserGuid, out _)) { anchor_info.OccupyingUserGuid = string.Empty; } if (anchor_info.OccupyingUserGuid != string.Empty) { err_msg = $"Prop is Occupied"; result.setFail(ServerErrorCode.PropIsOccupied, err_msg); Log.getLogger().error(err_msg); return (result, res); } var user_attribute = player.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user attribute is null !!! - {player.toBasicString()}"); anchor_info.OccupyingUserGuid = player.getUserGuid(); user_attribute.OccupiedAnchorGuid = anchor_info.AnchorGuid; user_attribute.modifiedEntityAttribute(); res.AnchorGuid = anchor_info.AnchorGuid; return (result, res); } public (Result, EndUseMountPropRes) tryEndUseMountProp(string anchorGuid) { var result = new Result(); var err_msg = string.Empty; NullReferenceCheckHelper.throwIfNull(m_map, () => $"m_map is null"); var res = new EndUseMountPropRes(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game; NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit mq is null !!! - {player.toBasicString()}"); if (false == m_map.getAnchors().TryGetValue(anchorGuid, out var anchor_info)) { err_msg = $"Not Found AnchorInfo. anchorGuid:{anchorGuid}"; result.setFail(ServerErrorCode.NotFoundAnchorGuid, err_msg); Log.getLogger().error(err_msg); return (result, res); } if (anchor_info.OccupyingUserGuid != player.getUserGuid()) { err_msg = $"Not usable"; result.setFail(ServerErrorCode.NotUsablePlace, err_msg); Log.getLogger().error(err_msg); return (result, res); } var user_attribute = player.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user attribute is null !!! - {player.toBasicString()}"); anchor_info.OccupyingUserGuid = string.Empty; user_attribute.OccupiedAnchorGuid = string.Empty; res.AnchorGuid = anchor_info.AnchorGuid; return (result, res); } public async Task<(Result, UseRewardPropRes, UseRewardPropInfo?)> tryUseRewardProp(string anchorGuid) { var result = new Result(); var err_msg = string.Empty; NullReferenceCheckHelper.throwIfNull(m_map, () => $"m_map is null"); var res = new UseRewardPropRes(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game; NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit mq is null !!! - {player.toBasicString()}"); if (false == m_map.getAnchors().TryGetValue(anchorGuid, out var anchor_info)) { err_msg = $"Not Found AnchorInfo. anchorGuid:{anchorGuid}"; result.setFail(ServerErrorCode.NotFoundAnchorGuid, err_msg); Log.getLogger().error(err_msg); return (result, res, null); } if (!MapHelper.isRewardProp(anchorGuid) && !MapHelper.isGroupProp(anchorGuid)) { err_msg = $"Not Found AnchorInfo. anchorGuid:{anchorGuid}"; result.setFail(ServerErrorCode.NotFoundAnchorGuid, err_msg); Log.getLogger().error(err_msg); return (result, res, null); } if (anchor_info.PropState != PropState.Activation) { err_msg = $"Not Found AnchorInfo. anchorGuid:{anchorGuid}"; result.setFail(ServerErrorCode.NotFoundAnchorGuid, err_msg); Log.getLogger().error(err_msg); return (result, res, null); } if (!MetaData.Instance._RewardPropMetaTable.TryGetValue(anchor_info.AnchorProp.TableId, out var rewardPropData)) { err_msg = $"Not Found AnchorInfo. anchorGuid:{anchorGuid}"; result.setFail(ServerErrorCode.NotFoundAnchorGuid, err_msg); Log.getLogger().error(err_msg); return (result, res, null); } result = await player.checkRequirement(rewardPropData.UseRequired); if (result.isFail()) { err_msg = $"Failed to checkRequirement() !!! : {result.toBasicString()} : {this.getTypeName()}"; Log.getLogger().error(err_msg); return (result, res, null); } if (!MetaData.Instance._RewardMetaTable.TryGetValue(rewardPropData.UsedReward, out var rewardDatas)) { err_msg = $"Not Found AnchorInfo. anchorGuid:{anchorGuid}"; result.setFail(ServerErrorCode.NotFoundAnchorGuid, err_msg); Log.getLogger().error(err_msg); return (result, res, null); } ClientToGame clientToGame = new(); clientToGame.Response = new(); clientToGame.Response.UseRewardPropRes = res; List < MetaAssets.Reward > rewards = new(); foreach (var reward in rewardDatas) { rewards.Add(reward.Reward); } IReward reward_proc = new RewardUseProp(player, player.getUserGuid(), rewards); result = await RewardManager.It.proceedRewardProcess(reward_proc); if (result.isFail()) { return (result, res, null); } if (MapHelper.isRewardProp(anchorGuid)) { anchor_info.PropState = PropState.Respawning; anchor_info.respawnTime = Timestamp.FromDateTime(DateTime.UtcNow.AddSeconds(rewardPropData.Respawntime)); } if (MapHelper.isGroupProp(anchorGuid)) { anchor_info.PropState = PropState.Deactivated; } RewardManager.It.postRewardProcess(reward_proc); //var reward_base = reward_proc as RewardBase; //var rewarded_items = reward_base.getRewardedItems(); //var rewarded_money = reward_base.getRewardedMoneys(); //var items = RewardManager.Instance.convertItemAndMoneyToItem(rewarded_items, rewarded_money); res.AnchorGuid = anchorGuid; //res.Items.AddRange(items); UseRewardPropInfo info = new UseRewardPropInfo(anchorGuid, anchor_info.AnchorProp.TableId, rewardPropData.UsedReward, rewardDatas); return (result, res, info); } public bool GetNearestStartPoint(Pos current_pos, [MaybeNullWhen(false)] out Pos nearest_start_point) { NullReferenceCheckHelper.throwIfNull(m_map, () => $"m_map is null"); if (m_map.GetNearestStartPoint(current_pos, out nearest_start_point) == false) { return false; } return true; } public AnchorInfo? GetAnchor(ANCHOR_GUID anchor_guid) { NullReferenceCheckHelper.throwIfNull(m_map, () => $"m_map is null"); if (m_map.getAnchors().TryGetValue(anchor_guid, out var crafting_anchor) == false) { return null; } return crafting_anchor; } public CellPos GetPlayerCellPos(Player player) { NullReferenceCheckHelper.throwIfNull(m_map, () => $"m_map is null"); var location_action = player.getEntityAction(); var current_pos = location_action.getCurrentPos(); return m_map.GetCellPos(current_pos.X, current_pos.Y); } public bool isLinkedToMap() => m_map != null; public Map? getLinkedToMap() => m_map; public void setlinkToMap(Map map) => m_map = map; public void unlinkToMap() => m_map = null; }