초기커밋
This commit is contained in:
@@ -0,0 +1,474 @@
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
|
||||
using Axion.Collections.Concurrent;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
|
||||
public class BattleInstanceRoom : EntityBase, IWithLogActor
|
||||
{
|
||||
//public string m_instance_room_guid { get; } = string.Empty;
|
||||
public bool m_is_load_complete { get; private set; } = false;
|
||||
public InstanceRoom m_instance_room { get; }
|
||||
|
||||
private readonly CancellationTokenSource m_cancel_token = new();
|
||||
|
||||
public readonly IHostMigrator m_host_migrator; //생성자에서 모드에 맞춰서 할당한다.
|
||||
|
||||
|
||||
public BattlePlayMode m_play_mode { get; set; } = BattlePlayMode.PodCombat;
|
||||
|
||||
public DateTime m_battle_instance_event_start_time { get; private set; } = DateTimeHelper.Current; //실제 이벤트 시작시간
|
||||
//public DateTime m_battle_instance_load_time { get; } = DateTimeHelper.Current; //이벤트 시작시간과 관계 없이 메모리에 로드 될때의 시간 이 변수가 필요할지 모르겠다.
|
||||
|
||||
|
||||
//todo : 모드별 관리 메타를 따로 구성해야할듯...
|
||||
//todo : 제네릭으로 받아도 되려나?.. 고민 필요 우선 임시데이터
|
||||
public Int32 m_pod_combat_reward_group_id = 1;
|
||||
public Int32 m_pod_combat_ffa_id = 1;
|
||||
public BattleFFAConfigData m_ffa_config_meta;
|
||||
public Dictionary<int, BattleFFARewardData> m_ffa_reward_meta = new();
|
||||
public Int32 m_hot_time_reward = 1;
|
||||
public Int32 m_round_count = 8;
|
||||
//public Int32 m_pickup_pod_reward_max_count { get; } = 2;
|
||||
//public int m_max_step_per_round { get; set; } = 10;
|
||||
|
||||
public ConcurrentHashSet<string /*anchor_guid*/> m_respawn_pos_anchors_meta { get; private set; } = new(); //이건 랜덤 돌릴 일이 잦아서 그냥 들고 있는다...
|
||||
public ConcurrentDictionary<int /*battle_group_id*/ , HashSet<string>> m_battle_pod_storage_guid_group { get; private set; } = new(); //pod combat을 생성해줄때 필요
|
||||
public ConcurrentDictionary<int /*battle_group_id*/ , HashSet<string>> m_battle_pickup_pod_guid_group { get; private set; } = new();
|
||||
|
||||
|
||||
public BattleInstanceRoom(InstanceRoom room, DateTime eventStartTime, Int32 configId, Int32 rewardId, Int32 hotTime, Int32 roundCount)
|
||||
: base(EntityType.BattleInstance)
|
||||
{
|
||||
m_instance_room = room;
|
||||
NullReferenceCheckHelper.throwIfNull(m_instance_room, () => $"m_instance_room is null !!!");
|
||||
|
||||
m_battle_instance_event_start_time = eventStartTime;
|
||||
m_play_mode = BattlePlayMode.PodCombat;
|
||||
|
||||
m_host_migrator = BattleRoomHelper.createHostMigrator(m_play_mode);
|
||||
|
||||
m_pod_combat_ffa_id = configId;
|
||||
m_pod_combat_reward_group_id = rewardId;
|
||||
m_hot_time_reward = hotTime;
|
||||
m_round_count = roundCount;
|
||||
|
||||
//m_instance_room_guid = BattleConstant.PREFIX_BATTLE_TRANSACTION_GUID + System.Guid.NewGuid();
|
||||
|
||||
// BattleFFAConfigData
|
||||
if (false == MetaData.Instance._BattleFFAConfigMetaTable.TryGetValue(m_pod_combat_ffa_id, out var configData))
|
||||
{
|
||||
var err_msg = $"Not exist Battle Conig Data id : {m_pod_combat_ffa_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
NullReferenceCheckHelper.throwIfNull(configData, () => $"configData is null !!!");
|
||||
}
|
||||
|
||||
m_ffa_config_meta = new BattleFFAConfigData(new BattleFFAConfigDataMutable()
|
||||
{
|
||||
Id = configData.Id,
|
||||
Description = configData.Description,
|
||||
PlayerRespawnTime = configData.PlayerRespawnTime,
|
||||
DefaultRoundCount = configData.DefaultRoundCount,
|
||||
RoundTime = configData.RoundTime,
|
||||
NextRoundWaitTime = configData.NextRoundWaitTime,
|
||||
ResultUIWaitTime = configData.ResultUIWaitTime,
|
||||
GetRewardTime = configData.GetRewardTime,
|
||||
EntranceClosingTime = configData.EntranceClosingTime,
|
||||
CurrencyType = configData.CurrencyType,
|
||||
CurrencyCount = configData.CurrencyCount,
|
||||
TPSGuideURL = configData.TPSGuideURL
|
||||
});
|
||||
|
||||
|
||||
if (false == MetaData.Instance._BattleFFARewardMetaTable.TryGetValue(m_pod_combat_reward_group_id, out var rewardMeta))
|
||||
{
|
||||
var err_msg = $"Not exist reward Meta Data id : {m_pod_combat_ffa_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
NullReferenceCheckHelper.throwIfNull(rewardMeta, () => $"rewardMeta is null !!!");
|
||||
}
|
||||
|
||||
foreach (var meta_set in rewardMeta)
|
||||
{
|
||||
var val = meta_set.Value;
|
||||
var key = meta_set.Key;
|
||||
|
||||
BattleFFARewardData data = new BattleFFARewardData(new BattleFFARewardDataMutable()
|
||||
{
|
||||
Id = val.Id,
|
||||
GroupID = val.GroupID,
|
||||
ChargeLevel = val.ChargeLevel,
|
||||
ChargeTime = val.ChargeTime,
|
||||
RewardItemID = val.RewardItemID,
|
||||
RewardCount = val.RewardCount
|
||||
});
|
||||
|
||||
m_ffa_reward_meta.TryAdd(key, data);
|
||||
}
|
||||
Log.getLogger().info($"BattleInstanceRoom construct done roomId : " +
|
||||
$"{room.getMap().m_room_id}, eventStartTime : {eventStartTime}, configId : {configId}, rewardId : {rewardId}, hotTime : {hotTime}, roundCount : {roundCount}");
|
||||
}
|
||||
|
||||
|
||||
public async Task<Result> init()
|
||||
{
|
||||
string err_msg = string.Empty;
|
||||
|
||||
//Action 추가
|
||||
addEntityAction(new BattleInstanceAction(this));
|
||||
addEntityAction(new BattleInstanceUpdateAction(this));
|
||||
addEntityAction(new BattleObjectInteractAction(this));
|
||||
addEntityAction(new BattleObjectRewardAction(this));
|
||||
|
||||
|
||||
//Attribute 추가
|
||||
addEntityAttribute(new BattleInstanceSnapshotAttribute(this));
|
||||
|
||||
//Anchor 정보 로드
|
||||
loadAnchorPos();
|
||||
|
||||
//스냅샷 데이터 로드, 없으면 신규 생성
|
||||
var battle_instance_action = getEntityAction<BattleInstanceAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(battle_instance_action, () => $"battle_instance_action is null !!!");
|
||||
var result = await battle_instance_action.loadOrCreateSnapshot();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"loadSnapshot error instanceId : {m_instance_room.getInstanceId()}, roomId : {m_instance_room.getMap().m_room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
Log.getLogger().info($"load Snapshot done instanceId : {m_instance_room.getInstanceId()}, roomId : {m_instance_room.getMap().m_room_id}");
|
||||
|
||||
//태스크 생성
|
||||
result = await createTask();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"battle instance room onCreateTask error instanceId : {m_instance_room.getInstanceId()}, roomId : {m_instance_room.getMap().m_room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
Log.getLogger().info($"createTask done instanceId : {m_instance_room.getInstanceId()}, roomId : {m_instance_room.getMap().m_room_id}");
|
||||
|
||||
m_is_load_complete = true;
|
||||
|
||||
// P2P Host Migrator p2p 그룹 id 설정
|
||||
m_host_migrator.setGroupHostId(m_instance_room.getMap().getP2PGroupId());
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
var result = new Result();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private async Task<Result> createTask()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
//Timer에서 사용할 Action 초기화
|
||||
var battle_update_action = getEntityAction<BattleInstanceUpdateAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(battle_update_action, () => $"battle_update_action is null !!!");
|
||||
|
||||
try
|
||||
{
|
||||
//임시로 0.8초로 처리 나중에 이거 Meta로 빼야 된다.
|
||||
new PeriodicTaskTimer( GetType().Name, BattleConstant.BATTLE_ROOM_CHECK_INTERVAL, m_cancel_token, onTaskTick);
|
||||
|
||||
await battle_update_action.onInit();
|
||||
Log.getLogger().debug("battle_update_action.onInit() dome");
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
var err_msg = $"Exception !!!, new PeriodicTaskTimer() : exception:{e} - {toBasicString()}";
|
||||
result.setFail(ServerErrorCode.TryCatchException, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private void loadAnchorPos()
|
||||
{
|
||||
foreach (var anchor_info_dict in m_instance_room.getMap().getAnchors())
|
||||
{
|
||||
var anchor_guid = anchor_info_dict.Key;
|
||||
var anchor_info = anchor_info_dict.Value;
|
||||
|
||||
if (!MapDataTable.Instance.getAnchor(anchor_guid, out var anchor))
|
||||
{
|
||||
Log.getLogger().error($"anchr_guid not MapDataTable.Instance.getAnchor, anchorGuid : {anchor_guid}");
|
||||
continue;
|
||||
}
|
||||
|
||||
var type = anchor.Type;
|
||||
var table_id = anchor_info.AnchorProp.TableId;
|
||||
loadRespawnPos(type, anchor_guid);
|
||||
loadBattleObjectGroups(type, anchor_guid, table_id);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void loadRespawnPos(string type, string anchorGuid)
|
||||
{
|
||||
if (!type.Equals(BattleConstant.RESPAWN_POS_ANCHOR_NAME)) return;
|
||||
|
||||
if (false == m_respawn_pos_anchors_meta.Add(anchorGuid))
|
||||
{
|
||||
Log.getLogger().warn($"respawnPos add fail type : {type}, anchorGuid : {anchorGuid}");
|
||||
}
|
||||
Log.getLogger().info($"respawnPos add success type : {type}, anchorGuid : {anchorGuid}");
|
||||
}
|
||||
|
||||
// private void loadBattleObject(string type, string anchorGuid)
|
||||
// {
|
||||
// if (!type.Equals(BattleConstant.BATTLE_OBJECT_ANCHOR_NAME)) return;
|
||||
//
|
||||
// if (false == m_battle_object_anchors_meta.Add(anchorGuid))
|
||||
// {
|
||||
// Log.getLogger().warn($"m_battle_object_anchors add fail type : {type}, anchorGuid : {anchorGuid}");
|
||||
// }
|
||||
// Log.getLogger().info($"m_battle_object_anchors add success type : {type}, anchorGuid : {anchorGuid}");
|
||||
// }
|
||||
|
||||
private bool loadBattleObjectGroups(string type, string anchorGuid, Int32 tableID)
|
||||
{
|
||||
if (!type.Equals(BattleConstant.BATTLE_OBJECT_GROUP_ANCHOR_NAME)) return true;
|
||||
|
||||
// if (false == m_battle_object_group_anchors_meta.Add(anchorGuid))
|
||||
// {
|
||||
// Log.getLogger().warn($"m_battle_object_group_anchors add fail type : {type}, anchorGuid : {anchorGuid}");
|
||||
// }
|
||||
// Log.getLogger().info($"m_battle_object_group_anchors add success type : {type}, anchorGuid : {anchorGuid}");
|
||||
|
||||
|
||||
if (false == MetaData.Instance._BattleObjectSpawnGroupMetaTable.TryGetValue(tableID, out var battle_object_spawn_meta))
|
||||
{
|
||||
Log.getLogger().warn($"battle_object_group add fail type : {type}, anchorGuid : {anchorGuid}, table_id : {tableID}");
|
||||
return false;
|
||||
}
|
||||
|
||||
var battle_object_id = battle_object_spawn_meta.BattleObjectID;
|
||||
if (false == MetaData.Instance._BattleObjectMetaTable.TryGetValue(battle_object_id, out var battle_object_meta))
|
||||
{
|
||||
Log.getLogger().warn($"battle_object_group add fail type : {type}, anchorGuid : {anchorGuid}, table_id : {tableID}, battle_object_id : {battle_object_id}");
|
||||
return false;
|
||||
}
|
||||
|
||||
EBattleObjectType object_type = battle_object_meta.ObjectType;
|
||||
|
||||
var group_id = battle_object_spawn_meta.GroupID;
|
||||
if (object_type.Equals(EBattleObjectType.Pod_Combat) && battle_object_meta.Name.Equals(BattleConstant.BATTLE_POD_STORAGE_NAME))
|
||||
{
|
||||
loadBattleObjectPodStorageGroup(anchorGuid, group_id);
|
||||
}
|
||||
else if (object_type.Equals(EBattleObjectType.Pod_Box))
|
||||
{
|
||||
loadBattleObjectPickupPodGroup(anchorGuid, group_id);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void loadBattleObjectPodStorageGroup(string anchorGuid, int groupId)
|
||||
{
|
||||
if (false == m_battle_pod_storage_guid_group.ContainsKey(groupId))
|
||||
{
|
||||
m_battle_pod_storage_guid_group.TryAdd(groupId, new());
|
||||
}
|
||||
|
||||
if (false == m_battle_pod_storage_guid_group.TryGetValue(groupId, out var poses))
|
||||
{
|
||||
Log.getLogger().error($"m_battle_pod_stand_group_pos_meta get fail anchorGuid : {anchorGuid}, group_id : {groupId}");
|
||||
return;
|
||||
}
|
||||
poses.Add(anchorGuid);
|
||||
|
||||
Log.getLogger().info($"m_battle_pod_stand_group_pos_meta Add anchorGuid : {anchorGuid}, group_id : {groupId}");
|
||||
}
|
||||
|
||||
private void loadBattleObjectPickupPodGroup(string anchorGuid, int groupId)
|
||||
{
|
||||
if (false == m_battle_pickup_pod_guid_group.ContainsKey(groupId))
|
||||
{
|
||||
m_battle_pickup_pod_guid_group.TryAdd(groupId, new());
|
||||
}
|
||||
if (false == m_battle_pickup_pod_guid_group.TryGetValue(groupId, out var poses))
|
||||
{
|
||||
Log.getLogger().error($"m_battle_pod_box_group_pos_meta get fail anchorGuid : {anchorGuid}, group_id : {groupId}");
|
||||
return;
|
||||
}
|
||||
poses.Add(anchorGuid);
|
||||
|
||||
Log.getLogger().info($"m_battle_pod_box_group_pos_meta Add anchorGuid : {anchorGuid}, group_id : {groupId}");
|
||||
}
|
||||
|
||||
public Result AddOrUpdatePlayer(Player player)
|
||||
{
|
||||
var result = new Result();
|
||||
// if (false == m_battle_players.TryAdd(player.getUserGuid(), new BattlePlayer(player)))
|
||||
// {
|
||||
// string err_msg = $"Player tryAdd fail guid : {player.getUserGuid()}";
|
||||
// result.setFail(ServerErrorCode.BattleInstanceJoinPlayerError, err_msg);
|
||||
// Log.getLogger().error(result.toBasicString());
|
||||
// return result;
|
||||
// }
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private async Task onTaskTick()
|
||||
{
|
||||
if (!m_is_load_complete) return;
|
||||
|
||||
var battle_update_action = getEntityAction<BattleInstanceUpdateAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(battle_update_action, () => $"battle_update_action is null !!!");
|
||||
|
||||
|
||||
var result = await battle_update_action.update();
|
||||
if (result.isFail())
|
||||
{
|
||||
var err_msg = $"playr mode hander update error : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public ILogActor toLogActor()
|
||||
{
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var region_id = server_logic.getServerConfig().getRegionId();
|
||||
var server_name = server_logic.getServerName();
|
||||
|
||||
var log_info = new BattleInstanceActorLog(region_id, server_name, m_instance_room.getMap().m_room_id, m_instance_room.getInstanceId());
|
||||
return log_info;
|
||||
}
|
||||
|
||||
public async Task removePodCombat(Player player)
|
||||
{
|
||||
var attribute = getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
|
||||
if (attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid.Equals(player.getUserGuid()))
|
||||
{
|
||||
using (var releaser = await getAsyncLock())
|
||||
{
|
||||
attribute.m_combat_pod_mode.m_pod_combat.changeDropState(player.getCurrentPositionInfo().Pos);
|
||||
}
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void removeBattlePlayerIfExist(string userGuid)
|
||||
{
|
||||
// if (true == m_battle_players.ContainsKey(userGuid))
|
||||
// {
|
||||
// if (false == m_battle_players.TryRemove(userGuid, out var player))
|
||||
// {
|
||||
// Log.getLogger().warn($"m_battle_players try remove faial userGuid : {userGuid}");
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
public async Task<bool> LeaveBattleRoom(Player player, string roomId, bool disconnected = false)
|
||||
{
|
||||
//BattleRoom에서 먼저 빼준다.
|
||||
//m_battle_players.TryRemove(player.getUserGuid(), out _);
|
||||
|
||||
Log.getLogger().info($"LeaveBattleRoom, player : {player.toBasicString()}, roomId : {roomId}, disconnected : {disconnected}");
|
||||
await m_instance_room.LeaveBattleInstanceRoom(player, disconnected);
|
||||
|
||||
if (m_instance_room.isDestroy)
|
||||
{
|
||||
Log.getLogger().info($"m_instance_room.isDestroy, so destroyBattleRoom : {player.toBasicString()}, roomId : {roomId}, disconnected : {disconnected}");
|
||||
await destroyBattleRoom();
|
||||
InstanceRoomManager.Instance.DestroyRoom(roomId);
|
||||
Log.getLogger().info($"destroy InstanceRoomManager room Player : {player.toBasicString()}, roomId : {roomId}, disconnected : {disconnected}");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task destroyBattleRoom()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
//여기서 timer 종료 처리
|
||||
m_cancel_token.Cancel();
|
||||
Log.getLogger().debug($"battle instance room token canceled m_room_id :{m_instance_room.getMap().m_room_id}");
|
||||
|
||||
var fn_save_battle_instance = async delegate()
|
||||
{
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var fn_result = new Result();
|
||||
using (var releaser = await getAsyncLock())
|
||||
{
|
||||
//여기서 battleRoomSnapshot 저장
|
||||
var battle_instance_snapshot_attribute = getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(battle_instance_snapshot_attribute, () => $"battle_instance_snapshot_attribute is null !!!");
|
||||
if (!battle_instance_snapshot_attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid.Equals(string.Empty))
|
||||
{
|
||||
battle_instance_snapshot_attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid = string.Empty;
|
||||
}
|
||||
|
||||
battle_instance_snapshot_attribute.modifiedEntityAttribute(true);
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(this, LogActionType.BattleInstanceSnapshotSave, server_logic.getDynamoDbClient(), true);
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
BattleSnapShotBusinessLog business_log = new(this, "");
|
||||
batch.appendBusinessLog(business_log);
|
||||
|
||||
fn_result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
|
||||
if (fn_result.isSuccess())
|
||||
{
|
||||
Log.getLogger().info($"save battle instance snapshot done attribute : {JsonConvert.SerializeObject(battle_instance_snapshot_attribute)}");
|
||||
}
|
||||
}
|
||||
|
||||
return fn_result;
|
||||
};
|
||||
|
||||
|
||||
|
||||
var result = await runTransactionRunnerSafely(TransactionIdType.PrivateContents, "SaveBattleInstanceByDestroy", fn_save_battle_instance);
|
||||
if (result.isFail())
|
||||
{
|
||||
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public override string toBasicString()
|
||||
{
|
||||
return $"BattleInstanceRoom room_id : {m_instance_room.getMap().m_room_id}";
|
||||
}
|
||||
|
||||
|
||||
public void setEventStartTime(DateTime t)
|
||||
{
|
||||
m_battle_instance_event_start_time = t;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,451 @@
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using Amazon.DynamoDBv2.Model;
|
||||
using Newtonsoft.Json;
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class BattleInstanceSnapshotPlayModePodCombat
|
||||
{
|
||||
//Respawn 정보
|
||||
[JsonProperty]
|
||||
public ConcurrentDictionary<string /*anchor_guid*/, DateTime> m_respawns {get; set;} = new ();
|
||||
[JsonProperty]
|
||||
public ConcurrentDictionary<string /*anchor_guid*/, BattleObjectPodStorage> m_pod_storages {get; set;} = new ();
|
||||
[JsonProperty] public BattleObjectPodCombat m_pod_combat { get; set; } = new();
|
||||
|
||||
[JsonProperty]
|
||||
public ConcurrentDictionary<string /*anchor_guid*/, BattleObjectPickupPod> m_pickup_pods {get; set;} = new ();
|
||||
|
||||
|
||||
[JsonProperty] public ConcurrentDictionary<(Int32, Int32) /*(group_id, idx)*/, PickupPodGeneratedInfo> m_pickup_pod_generated_info { get; set; } = new();
|
||||
|
||||
[JsonProperty]
|
||||
public ConcurrentDictionary<string /*anchor_guid*/, BattleObjectWeapon> m_weapons {get; set;} = new ();
|
||||
|
||||
[JsonProperty]
|
||||
public ConcurrentDictionary<string /*anchor_guid*/, BattleObjectBuff> m_buffs {get; set;} = new ();
|
||||
|
||||
[JsonProperty] public BattleRoundStateType m_round_state_type { get; set; } = BattleRoundStateType.Rounding;
|
||||
[JsonProperty] public int m_current_round { get; set; } = 1;
|
||||
[JsonProperty] public DateTime m_current_state_start_time { get; set; } = DateTimeHelper.Current;
|
||||
|
||||
[JsonProperty] public int m_charged_step { get; set; } = 0;
|
||||
[JsonProperty] public int m_rewarded_step { get; set; } = 0;
|
||||
|
||||
|
||||
|
||||
[JsonProperty] public ConcurrentDictionary<string /*user_guid*/, BattleTacticalBoardInfo> m_tactical_board = new(); //결과 표시에서 보여줄것
|
||||
|
||||
|
||||
/*
|
||||
m_respawns
|
||||
m_pod_storages
|
||||
m_pod_combat
|
||||
m_pickup_pods
|
||||
m_pickup_pod_reward_max_count
|
||||
m_pickup_pod_generated_info
|
||||
m_weapons
|
||||
m_buffs
|
||||
m_round_state_type
|
||||
m_current_round
|
||||
m_current_state_start_time
|
||||
m_charged_step
|
||||
m_rewarded_step
|
||||
m_max_step
|
||||
m_tactical_board
|
||||
*/
|
||||
|
||||
public void clear()
|
||||
{
|
||||
m_respawns.Clear();
|
||||
m_pod_storages.Clear();
|
||||
m_pod_combat.setDeactive();
|
||||
m_pickup_pods.Clear();
|
||||
m_pickup_pod_generated_info.Clear();
|
||||
m_weapons.Clear();
|
||||
m_buffs.Clear();
|
||||
m_round_state_type = BattleRoundStateType.None;
|
||||
m_current_round = 1;
|
||||
m_current_state_start_time = DateTimeHelper.Current;
|
||||
m_charged_step = 0;
|
||||
m_rewarded_step = 0;
|
||||
m_tactical_board.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public class BattleInstanceSnapshotAttribute : EntityAttributeBase, ICopyEntityAttributeFromDoc, IMergeWithEntityAttribute
|
||||
{
|
||||
[JsonProperty]
|
||||
public string m_room_id { get; set; } = string.Empty;
|
||||
|
||||
//아래 데이터들은 일반화 혹은 모드별로 관리 필요
|
||||
//public BattlePlayMode m_play_mode = BattlePlayMode.PodCombat;
|
||||
|
||||
//public DateTime m_create_time { get; set; } = DateTimeHelper.Current;
|
||||
//public DateTime m_destroy_time { get; set; } = DateTimeHelper.MaxTime;
|
||||
|
||||
//todo : 이 코드 들어간 부분은 전부 리펙토링 대상
|
||||
public BattleInstanceSnapshotPlayModePodCombat m_combat_pod_mode { get; set; } = new();
|
||||
|
||||
|
||||
|
||||
public BattleInstanceSnapshotAttribute(EntityBase owner) : base(owner)
|
||||
{
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
m_room_id = string.Empty;
|
||||
m_combat_pod_mode.clear();
|
||||
|
||||
getAttributeState().reset();
|
||||
}
|
||||
|
||||
public override async Task<(Result, DynamoDbDocBase?)> toDocBase(bool isForQuery = true)
|
||||
{
|
||||
var owner = getOwner();
|
||||
|
||||
var result = new Result();
|
||||
|
||||
//=====================================================================================
|
||||
// Attribute => try pending Doc
|
||||
//=====================================================================================
|
||||
var try_pending_doc = getTryPendingDocBase() as BattleInstanceSnapshotDoc;
|
||||
if (null == try_pending_doc)
|
||||
{
|
||||
var to_copy_doc = new BattleInstanceSnapshotDoc(m_room_id);
|
||||
|
||||
var origin_doc = getOriginDocBase<BattleInstanceSnapshotAttribute>();
|
||||
if (null != origin_doc)
|
||||
{
|
||||
to_copy_doc.copyTimestampsFromOriginDocBase(origin_doc);
|
||||
}
|
||||
|
||||
try_pending_doc = to_copy_doc;
|
||||
|
||||
setTryPendingDocBase(try_pending_doc);
|
||||
}
|
||||
|
||||
var to_copy_battle_instance_snapshot_attrib = try_pending_doc.getAttrib<BattleInstanceSnapshotAttrib>();
|
||||
NullReferenceCheckHelper.throwIfNull(to_copy_battle_instance_snapshot_attrib, () => $"to_copy_battle_instance_snapshot_attrib is null !!!");
|
||||
|
||||
to_copy_battle_instance_snapshot_attrib.m_room_id = m_room_id;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_respawns = m_combat_pod_mode.m_respawns;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_pod_storages = m_combat_pod_mode.m_pod_storages;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_pod_combat = m_combat_pod_mode.m_pod_combat;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_pickup_pods = m_combat_pod_mode.m_pickup_pods;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_pickup_pod_generated_info.AddRange(m_combat_pod_mode.m_pickup_pod_generated_info.Values);
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_weapons = m_combat_pod_mode.m_weapons;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_buffs = m_combat_pod_mode.m_buffs;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_round_state_type = m_combat_pod_mode.m_round_state_type;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_current_round = m_combat_pod_mode.m_current_round;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_current_state_start_time = m_combat_pod_mode.m_current_state_start_time;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_charged_step = m_combat_pod_mode.m_charged_step;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_rewarded_step = m_combat_pod_mode.m_rewarded_step;
|
||||
to_copy_battle_instance_snapshot_attrib.m_combat_pod_attrib.m_tactical_board = m_combat_pod_mode.m_tactical_board;
|
||||
|
||||
if (false == isForQuery)
|
||||
{
|
||||
return (result, try_pending_doc);
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// Doc QueryType 반영
|
||||
//=====================================================================================
|
||||
(result, var to_query_doc) = await applyDoc4Query(try_pending_doc);
|
||||
if (result.isFail())
|
||||
{
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
return (result, to_query_doc);
|
||||
}
|
||||
|
||||
|
||||
public override EntityAttributeBase onCloned()
|
||||
{
|
||||
var owner = getOwner();
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!! - {toBasicString()}");
|
||||
|
||||
var cloned = new BattleInstanceSnapshotAttribute(owner);
|
||||
cloned.deepCopyFromBase(this);
|
||||
|
||||
cloned.m_room_id = m_room_id;
|
||||
// Respawn 처리
|
||||
foreach (var respawn in m_combat_pod_mode.m_respawns)
|
||||
{
|
||||
var key = respawn.Key;
|
||||
var val = respawn.Value;
|
||||
cloned.m_combat_pod_mode.m_respawns.TryAdd(key, val);
|
||||
}
|
||||
|
||||
// PodStorage 처리
|
||||
foreach (var storage in m_combat_pod_mode.m_pod_storages)
|
||||
{
|
||||
var key = storage.Key;
|
||||
BattleObjectPodStorage battle_object_pod_storage = storage.Value;
|
||||
|
||||
BattleObjectPodStorage new_storage = new(key);
|
||||
new_storage.m_is_active = battle_object_pod_storage.m_is_active;
|
||||
new_storage.m_type = battle_object_pod_storage.m_type;
|
||||
new_storage.m_anchor_guid = battle_object_pod_storage.m_anchor_guid;
|
||||
new_storage.m_active_time = battle_object_pod_storage.m_active_time;
|
||||
new_storage.m_reward_cnt = battle_object_pod_storage.m_reward_cnt;
|
||||
|
||||
cloned.m_combat_pod_mode.m_pod_storages.TryAdd(key, new_storage);
|
||||
}
|
||||
|
||||
// Combat Pod 처리
|
||||
cloned.m_combat_pod_mode.m_pod_combat = new();
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_type = m_combat_pod_mode.m_pod_combat.m_type;
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_anchor_guid = m_combat_pod_mode.m_pod_combat.m_anchor_guid;
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_active_time = m_combat_pod_mode.m_pod_combat.m_active_time;
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_is_active = m_combat_pod_mode.m_pod_combat.m_is_active;
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_source_storage_anchor_guid = m_combat_pod_mode.m_pod_combat.m_source_storage_anchor_guid;
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_state = m_combat_pod_mode.m_pod_combat.m_state;
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_state_change_time = m_combat_pod_mode.m_pod_combat.m_state_change_time;
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_currenct_Pos = m_combat_pod_mode.m_pod_combat.m_currenct_Pos.Clone();
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid = m_combat_pod_mode.m_pod_combat.m_current_occupier_guid;
|
||||
cloned.m_combat_pod_mode.m_pod_combat.m_occupied_time = m_combat_pod_mode.m_pod_combat.m_occupied_time;
|
||||
|
||||
//Pickup pod 처리
|
||||
foreach (var pickup_pod in m_combat_pod_mode.m_pickup_pods)
|
||||
{
|
||||
var key = pickup_pod.Key;
|
||||
cloned.m_combat_pod_mode.m_pickup_pods.TryAdd(key, pickup_pod.Value.clone());
|
||||
}
|
||||
|
||||
foreach (var generation_info in m_combat_pod_mode.m_pickup_pod_generated_info)
|
||||
{
|
||||
var key = generation_info.Key;
|
||||
cloned.m_combat_pod_mode.m_pickup_pod_generated_info.TryAdd((key.Item1, key.Item2), generation_info.Value.clone());
|
||||
}
|
||||
|
||||
//Weapon 처리
|
||||
foreach (var weapon in m_combat_pod_mode.m_weapons)
|
||||
{
|
||||
var key = weapon.Key;
|
||||
cloned.m_combat_pod_mode.m_weapons.TryAdd(key, weapon.Value.clone());
|
||||
}
|
||||
|
||||
//Buff 처리
|
||||
foreach (var buff in m_combat_pod_mode.m_buffs)
|
||||
{
|
||||
var key = buff.Key;
|
||||
cloned.m_combat_pod_mode.m_buffs.TryAdd(key, buff.Value.clone());
|
||||
}
|
||||
|
||||
//기타 진행 상황
|
||||
cloned.m_combat_pod_mode.m_round_state_type = m_combat_pod_mode.m_round_state_type;
|
||||
cloned.m_combat_pod_mode.m_current_round = m_combat_pod_mode.m_current_round;
|
||||
cloned.m_combat_pod_mode.m_current_state_start_time = m_combat_pod_mode.m_current_state_start_time;
|
||||
cloned.m_combat_pod_mode.m_charged_step = m_combat_pod_mode.m_charged_step;
|
||||
cloned.m_combat_pod_mode.m_rewarded_step = m_combat_pod_mode.m_rewarded_step;
|
||||
|
||||
//택틱컬 보드 정보
|
||||
foreach (var board in m_combat_pod_mode.m_tactical_board)
|
||||
{
|
||||
var key = board.Key;
|
||||
cloned.m_combat_pod_mode.m_tactical_board.TryAdd(key, board.Value.clone());
|
||||
}
|
||||
|
||||
return cloned;
|
||||
|
||||
}
|
||||
|
||||
public Result onMerge(EntityAttributeBase otherEntityAttribute)
|
||||
{
|
||||
var owner = getOwner();
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!! - {toBasicString()}");
|
||||
|
||||
var result = new Result();
|
||||
|
||||
var err_msg = string.Empty;
|
||||
|
||||
if (null == otherEntityAttribute)
|
||||
{
|
||||
err_msg = $"Invalid Param !!!, otherEntityAttribute is null";
|
||||
result.setFail(ServerErrorCode.FunctionParamNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return result;
|
||||
}
|
||||
|
||||
var other_attribute = otherEntityAttribute as BattleInstanceSnapshotAttribute;
|
||||
if (null == other_attribute)
|
||||
{
|
||||
err_msg = $"Failed to cast BattleInstanceSnapshotAttribute !!!, other_attribute is null";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// OtherAttribute => Attribute
|
||||
//=====================================================================================
|
||||
m_room_id = other_attribute.m_room_id;
|
||||
|
||||
m_combat_pod_mode.m_respawns = other_attribute.m_combat_pod_mode.m_respawns;
|
||||
m_combat_pod_mode.m_pod_storages = other_attribute.m_combat_pod_mode.m_pod_storages;
|
||||
m_combat_pod_mode.m_pod_combat = other_attribute.m_combat_pod_mode.m_pod_combat;
|
||||
m_combat_pod_mode.m_pickup_pods = other_attribute.m_combat_pod_mode.m_pickup_pods;
|
||||
m_combat_pod_mode.m_pickup_pod_generated_info = other_attribute.m_combat_pod_mode.m_pickup_pod_generated_info;
|
||||
|
||||
m_combat_pod_mode.m_weapons = other_attribute.m_combat_pod_mode.m_weapons;
|
||||
m_combat_pod_mode.m_buffs = other_attribute.m_combat_pod_mode.m_buffs;
|
||||
m_combat_pod_mode.m_round_state_type = other_attribute.m_combat_pod_mode.m_round_state_type;
|
||||
m_combat_pod_mode.m_current_round = other_attribute.m_combat_pod_mode.m_current_round;
|
||||
m_combat_pod_mode.m_current_state_start_time = other_attribute.m_combat_pod_mode.m_current_state_start_time;
|
||||
m_combat_pod_mode.m_charged_step = other_attribute.m_combat_pod_mode.m_charged_step;
|
||||
m_combat_pod_mode.m_rewarded_step = other_attribute.m_combat_pod_mode.m_rewarded_step;
|
||||
m_combat_pod_mode.m_tactical_board = other_attribute.m_combat_pod_mode.m_tactical_board;
|
||||
|
||||
|
||||
|
||||
//=====================================================================================
|
||||
// Attribute Try Pending Doc => Origin Doc
|
||||
//=====================================================================================
|
||||
var try_pending_doc = other_attribute.getTryPendingDocBase() as BattleInstanceSnapshotDoc;
|
||||
if (null != try_pending_doc)
|
||||
{
|
||||
other_attribute.resetTryPendingDocBase();
|
||||
|
||||
syncOriginDocBaseWithNewDoc<BattleInstanceSnapshotAttribute>(try_pending_doc);
|
||||
}
|
||||
|
||||
var origin_doc_base = getOriginDocBase<BattleInstanceSnapshotAttribute>();
|
||||
if (null == origin_doc_base)
|
||||
{
|
||||
// DB 에 저장되어 있지 않는 경우 OriginDoc은 null 이다 !!!
|
||||
return result;
|
||||
}
|
||||
|
||||
var battle_instance_snapshot_attrib = origin_doc_base.getAttrib<BattleInstanceSnapshotAttrib>();
|
||||
NullReferenceCheckHelper.throwIfNull(battle_instance_snapshot_attrib, () => $"battle_instance_snapshot_attrib is null !!! - {owner.toBasicString()}");
|
||||
|
||||
battle_instance_snapshot_attrib.m_room_id = m_room_id;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_respawns = m_combat_pod_mode.m_respawns;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_pod_storages = m_combat_pod_mode.m_pod_storages;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_pod_combat = m_combat_pod_mode.m_pod_combat;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_pickup_pods = m_combat_pod_mode.m_pickup_pods;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_pickup_pod_generated_info.AddRange(m_combat_pod_mode.m_pickup_pod_generated_info.Values);
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_weapons = m_combat_pod_mode.m_weapons;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_buffs = m_combat_pod_mode.m_buffs;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_round_state_type = m_combat_pod_mode.m_round_state_type;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_current_round = m_combat_pod_mode.m_current_round;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_current_state_start_time = m_combat_pod_mode.m_current_state_start_time;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_charged_step = m_combat_pod_mode.m_charged_step;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_rewarded_step = m_combat_pod_mode.m_rewarded_step;
|
||||
battle_instance_snapshot_attrib.m_combat_pod_attrib.m_tactical_board = m_combat_pod_mode.m_tactical_board;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public bool copyEntityAttributeFromDoc(DynamoDbDocBase? docBase)
|
||||
{
|
||||
var battle_instance_snapshot_doc_base = docBase as BattleInstanceSnapshotDoc;
|
||||
if (null == battle_instance_snapshot_doc_base)
|
||||
{
|
||||
var to_cast_string = typeof(BattleInstanceSnapshotDoc).Name;
|
||||
var err_msg = $"Failed to copyEntityAttributeFromDoc() !!!, item_doc_base is null :{to_cast_string}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// New Doc => Origin Doc
|
||||
//=====================================================================================
|
||||
syncOriginDocBaseWithNewDoc<BattleInstanceSnapshotAttribute>(battle_instance_snapshot_doc_base);
|
||||
|
||||
//=====================================================================================
|
||||
// Doc => Attribute
|
||||
//=====================================================================================
|
||||
var doc_attrib = battle_instance_snapshot_doc_base.getAttrib<BattleInstanceSnapshotAttrib>();
|
||||
NullReferenceCheckHelper.throwIfNull(doc_attrib, () => $"doc_attrib is null !!! - {toBasicString()}");
|
||||
|
||||
m_room_id = doc_attrib.m_room_id;
|
||||
m_combat_pod_mode.m_respawns = doc_attrib.m_combat_pod_attrib.m_respawns;
|
||||
m_combat_pod_mode.m_pod_storages = doc_attrib.m_combat_pod_attrib.m_pod_storages;
|
||||
m_combat_pod_mode.m_pod_combat = doc_attrib.m_combat_pod_attrib.m_pod_combat;
|
||||
m_combat_pod_mode.m_pickup_pods = doc_attrib.m_combat_pod_attrib.m_pickup_pods;
|
||||
|
||||
foreach (var generated_info in doc_attrib.m_combat_pod_attrib.m_pickup_pod_generated_info)
|
||||
{
|
||||
m_combat_pod_mode.m_pickup_pod_generated_info.AddOrUpdate((generated_info.m_group_id, generated_info.m_idx), generated_info, (key, old) => generated_info);
|
||||
}
|
||||
|
||||
m_combat_pod_mode.m_weapons = doc_attrib.m_combat_pod_attrib.m_weapons;
|
||||
m_combat_pod_mode.m_buffs = doc_attrib.m_combat_pod_attrib.m_buffs;
|
||||
m_combat_pod_mode.m_round_state_type = doc_attrib.m_combat_pod_attrib.m_round_state_type;
|
||||
m_combat_pod_mode.m_current_round = doc_attrib.m_combat_pod_attrib.m_current_round;
|
||||
m_combat_pod_mode.m_current_state_start_time = doc_attrib.m_combat_pod_attrib.m_current_state_start_time;
|
||||
m_combat_pod_mode.m_charged_step = doc_attrib.m_combat_pod_attrib.m_charged_step;
|
||||
m_combat_pod_mode.m_rewarded_step = doc_attrib.m_combat_pod_attrib.m_rewarded_step;
|
||||
m_combat_pod_mode.m_tactical_board = doc_attrib.m_combat_pod_attrib.m_tactical_board;
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override IEntityAttributeTransactor onNewEntityAttributeTransactor()
|
||||
{
|
||||
return new BattleInstanceSnapshotAttributeTransactor(getOwner());
|
||||
}
|
||||
|
||||
|
||||
public class BattleInstanceSnapshotAttributeTransactor :
|
||||
EntityAttributeTransactorBase<BattleInstanceSnapshotAttribute>,
|
||||
ICopyEntityAttributeTransactorFromEntityAttribute
|
||||
{
|
||||
|
||||
public BattleInstanceSnapshotAttributeTransactor(EntityBase owner) : base(owner)
|
||||
{
|
||||
}
|
||||
|
||||
public bool copyEntityAttributeTransactorFromEntityAttribute(EntityAttributeBase entityAttributeBase)
|
||||
{
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var copy_from_attribute = entityAttributeBase as BattleInstanceSnapshotAttribute;
|
||||
if (null == copy_from_attribute)
|
||||
{
|
||||
err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_from_craft_attribute is null : BattleInstanceSnapshotAttribute";
|
||||
Log.getLogger().error(err_msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
var copy_to_attribute = getClonedEntityAttribute() as BattleInstanceSnapshotAttribute;
|
||||
if (null == copy_to_attribute)
|
||||
{
|
||||
err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_to_craft_attribute is null : BattleInstanceSnapshotAttribute";
|
||||
Log.getLogger().error(err_msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
copy_to_attribute.m_room_id = copy_from_attribute.m_room_id;
|
||||
|
||||
copy_to_attribute.m_combat_pod_mode.m_respawns = copy_from_attribute.m_combat_pod_mode.m_respawns;
|
||||
copy_to_attribute.m_combat_pod_mode.m_pod_storages = copy_from_attribute.m_combat_pod_mode.m_pod_storages;
|
||||
copy_to_attribute.m_combat_pod_mode.m_pod_combat = copy_from_attribute.m_combat_pod_mode.m_pod_combat;
|
||||
copy_to_attribute.m_combat_pod_mode.m_pickup_pods = copy_from_attribute.m_combat_pod_mode.m_pickup_pods;
|
||||
copy_to_attribute.m_combat_pod_mode.m_pickup_pod_generated_info = copy_from_attribute.m_combat_pod_mode.m_pickup_pod_generated_info;
|
||||
copy_to_attribute.m_combat_pod_mode.m_weapons = copy_from_attribute.m_combat_pod_mode.m_weapons;
|
||||
copy_to_attribute.m_combat_pod_mode.m_buffs = copy_from_attribute.m_combat_pod_mode.m_buffs;
|
||||
copy_to_attribute.m_combat_pod_mode.m_round_state_type = copy_from_attribute.m_combat_pod_mode.m_round_state_type;
|
||||
copy_to_attribute.m_combat_pod_mode.m_current_round = copy_from_attribute.m_combat_pod_mode.m_current_round;
|
||||
copy_to_attribute.m_combat_pod_mode.m_current_state_start_time = copy_from_attribute.m_combat_pod_mode.m_current_state_start_time;
|
||||
copy_to_attribute.m_combat_pod_mode.m_charged_step = copy_from_attribute.m_combat_pod_mode.m_charged_step;
|
||||
copy_to_attribute.m_combat_pod_mode.m_rewarded_step = copy_from_attribute.m_combat_pod_mode.m_rewarded_step;
|
||||
copy_to_attribute.m_combat_pod_mode.m_tactical_board = copy_from_attribute.m_combat_pod_mode.m_tactical_board;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
using System.Collections.Concurrent;
|
||||
using Newtonsoft.Json;
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class BattleInstanceSnapshotPlayModePodCombatAttrib
|
||||
{
|
||||
[JsonProperty("respawns")]
|
||||
public ConcurrentDictionary<string, DateTime> m_respawns {get; set;} = new ();
|
||||
|
||||
[JsonProperty("pod_storages")]
|
||||
public ConcurrentDictionary<string /*anchor_guid*/, BattleObjectPodStorage> m_pod_storages {get; set;} = new ();
|
||||
[JsonProperty("pod_combat")]
|
||||
public BattleObjectPodCombat m_pod_combat {get; set;} = new ();
|
||||
|
||||
[JsonProperty("pickup_pods")]
|
||||
public ConcurrentDictionary<string /*anchor_guid*/, BattleObjectPickupPod> m_pickup_pods {get; set;} = new ();
|
||||
|
||||
|
||||
[JsonProperty("pickup_pods_generation_info")] public List<PickupPodGeneratedInfo> m_pickup_pod_generated_info { get; set; } = new();
|
||||
|
||||
[JsonProperty("weapons")]
|
||||
public ConcurrentDictionary<string /*anchor_guid*/, BattleObjectWeapon> m_weapons {get; set;} = new ();
|
||||
|
||||
[JsonProperty("buffs")]
|
||||
public ConcurrentDictionary<string /*anchor_guid*/, BattleObjectBuff> m_buffs {get; set;} = new ();
|
||||
|
||||
[JsonProperty("state")] public BattleRoundStateType m_round_state_type { get; set; } = BattleRoundStateType.Rounding;
|
||||
[JsonProperty("round")] public int m_current_round { get; set; } = 1;
|
||||
[JsonProperty("state_start_time")] public DateTime m_current_state_start_time { get; set; } = DateTimeHelper.Current;
|
||||
|
||||
[JsonProperty("charged_step")] public int m_charged_step { get; set; } = 0;
|
||||
[JsonProperty("rewarded_step")] public int m_rewarded_step { get; set; } = 0;
|
||||
|
||||
[JsonProperty("tactical_board")] public ConcurrentDictionary<string /*user_guid*/, BattleTacticalBoardInfo> m_tactical_board = new();
|
||||
}
|
||||
|
||||
public class BattleInstanceSnapshotAttrib : AttribBase
|
||||
{
|
||||
[JsonProperty("room_id")]
|
||||
public string m_room_id { get; set; } = string.Empty;
|
||||
|
||||
[JsonProperty("combat_pod_attrib")]
|
||||
public BattleInstanceSnapshotPlayModePodCombatAttrib m_combat_pod_attrib { get; set; } = new();
|
||||
|
||||
public BattleInstanceSnapshotAttrib()
|
||||
: base(typeof(BattleInstanceSnapshotAttrib).Name)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================================
|
||||
// PK(Partition Key) : "battle_instance_snapshot#global"
|
||||
// SK(Sort Key) : "date#room_id"
|
||||
// DocType : BattleInstanceSnapshotDoc
|
||||
// BlockUserAttrib : {}
|
||||
// ...
|
||||
//=============================================================================================
|
||||
public class BattleInstanceSnapshotDoc : DynamoDbDocBase
|
||||
{
|
||||
public static readonly string pk = "battle_instance_snapshot#global";
|
||||
|
||||
public BattleInstanceSnapshotDoc()
|
||||
: base(typeof(BattleInstanceSnapshotDoc).Name)
|
||||
{
|
||||
appendAttribWrapper(new AttribWrapper<BattleInstanceSnapshotAttrib>());
|
||||
}
|
||||
|
||||
public BattleInstanceSnapshotDoc(string combinationKeyForSk)
|
||||
: base(typeof(BattleInstanceSnapshotDoc).Name)
|
||||
{
|
||||
setCombinationKeyForSK(combinationKeyForSk);
|
||||
appendAttribWrapper(new AttribWrapper<BattleInstanceSnapshotAttrib>());
|
||||
fillUpPrimaryKey(onMakePK(), onMakeSK());
|
||||
}
|
||||
|
||||
protected override string onGetPrefixOfPK()
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
protected override string onMakePK()
|
||||
{
|
||||
return pk;
|
||||
}
|
||||
|
||||
// protected override string onMakeSK()
|
||||
// {
|
||||
// return $"{getCombinationKeyForSK()}";
|
||||
//
|
||||
// }
|
||||
|
||||
protected override ServerErrorCode onCheckAndSetPK(string partitionKey)
|
||||
{
|
||||
getPrimaryKey().fillUpPK(partitionKey);
|
||||
return ServerErrorCode.Success;
|
||||
}
|
||||
|
||||
protected override ServerErrorCode onCheckAndSetSK(string sortKey)
|
||||
{
|
||||
getPrimaryKey().fillUpSK(sortKey);
|
||||
return ServerErrorCode.Success;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class BattlePlayer : EntityBase
|
||||
{
|
||||
private Player m_player;
|
||||
public BattlePlayer(Player player) : base(EntityType.BattlePlayer)
|
||||
{
|
||||
m_player = player;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class SystemBattleEvent
|
||||
{
|
||||
public Int32 m_event_id { get; set; } = 0;
|
||||
public Int32 m_instance_id { get; set; } = 0;
|
||||
|
||||
public DateTime m_ready_time { get; set; } = DateTimeHelper.Current;
|
||||
public bool m_is_send_noti { get; set; } = false;
|
||||
|
||||
public DateTime m_start_time { get; set; } = DateTimeHelper.Current;
|
||||
public Int32 m_ffa_config_data_id { get; set; } = 4;
|
||||
public Int32 m_ffa_reward_group_id { get; set; } = 7;
|
||||
public Int32 m_ffa_hot_time { get; set; } = 1;
|
||||
public Int32 m_round_count { get; set; } = 4;
|
||||
|
||||
public SystemBattleEvent()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user