997 lines
41 KiB
C#
997 lines
41 KiB
C#
using Amazon.DynamoDBv2.DocumentModel;
|
|
using GameServer;
|
|
using GameServer.Contents.Room;
|
|
using Google.Protobuf.WellKnownTypes;
|
|
using MetaAssets;
|
|
using ServerCommon;
|
|
using ServerCore; using ServerBase;
|
|
|
|
namespace GameServer
|
|
{
|
|
internal class InstanceRoomHandler
|
|
{
|
|
public static async Task<(Result, string)> joinInstance(string userGuid, int instanceMetaId, string? reJoinRoomId = null)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(reJoinRoomId))
|
|
{
|
|
var roomInfo = await instance_room_storage.GetInstanceRoomInfo(reJoinRoomId);
|
|
if (roomInfo == null)
|
|
{
|
|
await deleteInstanceRoom(reJoinRoomId);
|
|
}
|
|
else
|
|
{
|
|
var rejoin_instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(reJoinRoomId);
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, reJoinRoomId, instanceMetaId, rejoin_instance_room_id_base, roomInfo.UgcNpcCount);
|
|
if (result.isSuccess())
|
|
return (result, reJoinRoomId);
|
|
}
|
|
}
|
|
|
|
var instance_room_id = string.Empty;
|
|
|
|
if (instance_meta_data.OverLimit == 1)
|
|
{
|
|
(result, instance_room_id) = await joinInstanceRoom(userGuid, instanceMetaId);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to joinInstanceRoom() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
(result, instance_room_id) = await joinOnlyOneInstanceRoom(userGuid, instanceMetaId);
|
|
if (instance_room_id == string.Empty)
|
|
{
|
|
err_msg = $"Failed to joinOnlyOneInstanceRoom() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
}
|
|
|
|
return (result, instance_room_id);
|
|
}
|
|
|
|
static async Task<(Result, string)> joinInstanceRoom(string userGuid, int instanceMetaId)
|
|
{
|
|
var result = new Result();
|
|
string err_msg;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
if (instance_meta_data.OverLimit != 1)
|
|
{
|
|
err_msg = $"InstanceMetaData.OverLimit != 1 !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataOverLimitWrong, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
var instance_room_id_base = makeInstanceRoomIdBase(instanceMetaId);
|
|
var instance_room_id = string.Empty;
|
|
|
|
var room_list = await instance_room_storage.GetInstanceRoomList(instance_room_id_base, instance_meta_data.LimitCount);
|
|
foreach (var room_id in room_list)
|
|
{
|
|
var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(room_id);
|
|
if (instance_room_Info == null)
|
|
{
|
|
await deleteInstanceRoom(room_id);
|
|
|
|
continue;
|
|
}
|
|
|
|
// 콘서트 입장 조건 체크
|
|
if (instance_room_Info.InstancePlaceType == EPlaceType.Concert)
|
|
{
|
|
// 콘서트 시작시간 Delta 전 까지만 입장 가능
|
|
if (DateTime.UtcNow.AddSeconds(MetaHelper.GameConfigMeta.ConcertEntranceLimitTime).ToTimestamp() >= instance_room_Info.InstanceStartTime)
|
|
continue;
|
|
}
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, room_id, instanceMetaId, instance_room_id_base, instance_room_Info.UgcNpcCount);
|
|
if (result.isSuccess())
|
|
{
|
|
instance_room_id = room_id;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (instance_room_id == string.Empty)
|
|
{
|
|
(result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instanceMetaId);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instanceMetaId, instance_room_id_base, 0);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
}
|
|
|
|
return (result, instance_room_id);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 방이 하나만 존재하는 인스턴스 룸 생성 함수 <br/>
|
|
/// <see cref="MetaAssets.InstanceMetaData.OverLimit"/> 값이 0 인 인스턴스의 룸 생성시 사용
|
|
/// </summary>
|
|
/// <param name="instanceMetaId"></param>
|
|
/// <param name="userGuid"></param>
|
|
/// <returns></returns>
|
|
static async Task<(Result, string)> joinOnlyOneInstanceRoom(string userGuid, int instanceMetaId)
|
|
{
|
|
var result = new Result();
|
|
string err_msg;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
if (instance_meta_data.OverLimit != 0)
|
|
{
|
|
err_msg = $"InstanceMetaData.OverLimit != 0 !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataOverLimitWrong, err_msg);
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
var instance_room_id_base = makeInstanceRoomIdBase(instanceMetaId);
|
|
var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base);
|
|
|
|
var room_info = await instance_room_storage.GetInstanceRoomInfo(instance_room_id);
|
|
var room_ugc_npc_count = room_info?.UgcNpcCount ?? 0;
|
|
if (room_info == null)
|
|
{
|
|
(result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instanceMetaId);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
}
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instanceMetaId, instance_room_id_base, room_ugc_npc_count);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
return (result, instance_room_id);
|
|
}
|
|
|
|
public static async Task<(Result, string)> joinMyhomeInstance(string userGuid, string myhomeOwnerUserGuid, string myhomeGuid, int myhomeInstanceMetaId, int enterPlayerCount = 0)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
var instance_meta_id = myhomeInstanceMetaId;
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instance_meta_id, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instance_meta_id} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
if (enterPlayerCount < 1)
|
|
enterPlayerCount = instance_meta_data.LimitCount;
|
|
|
|
var instance_room_id_base = makeMyhomeInstanceRoomIdBase(myhomeOwnerUserGuid, myhomeGuid);
|
|
var instance_room_id = string.Empty;
|
|
|
|
var room_list = await instance_room_storage.GetInstanceRoomList(instance_room_id_base, enterPlayerCount);
|
|
foreach (var room_id in room_list)
|
|
{
|
|
var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(room_id);
|
|
if (instance_room_Info == null)
|
|
{
|
|
await deleteInstanceRoom(room_id);
|
|
|
|
continue;
|
|
}
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, room_id, instance_meta_id, instance_room_id_base, instance_room_Info.UgcNpcCount);
|
|
if (result.isSuccess())
|
|
{
|
|
instance_room_id = room_id;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (instance_room_id == string.Empty)
|
|
{
|
|
(result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instance_meta_id);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instance_meta_id, instance_room_id_base, 0);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
}
|
|
|
|
return (result, instance_room_id);
|
|
}
|
|
|
|
public static async Task<(Result, string)> JoinOnlyOneMyhomeInstance(string userGuid, string myhomeOwnerUserGuid, string myhomeGuid, int myhomeInstanceMetaId)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
var instance_meta_id = myhomeInstanceMetaId;
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instance_meta_id, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instance_meta_id} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
var instance_room_id_base = makeMyhomeInstanceRoomIdBase(myhomeOwnerUserGuid, myhomeGuid);
|
|
var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base);
|
|
|
|
var room_info = await instance_room_storage.GetInstanceRoomInfo(instance_room_id);
|
|
var room_ugc_npc_count = room_info?.UgcNpcCount ?? 0;
|
|
if (room_info == null)
|
|
{
|
|
(result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instance_meta_id);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
}
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instance_meta_id, instance_room_id_base, room_ugc_npc_count);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
return (result, instance_room_id);
|
|
}
|
|
|
|
public static async Task<(Result, string)> joinDressRoomInstance(string userGuid)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
var instance_meta_id = ServerCommon.Constant.DRESS_ROOM_INSTANCE_META_ID;
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instance_meta_id, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instance_meta_id}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
var instance_room_id_base = makeDressRoomInstanceRoomIdBase(userGuid);
|
|
var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base);
|
|
|
|
var room_info = await instance_room_storage.GetInstanceRoomInfo(instance_room_id);
|
|
var room_ugc_npc_count = room_info?.UgcNpcCount ?? 0;
|
|
if (room_info == null)
|
|
{
|
|
(result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instance_meta_id);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to createInstance() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
}
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instance_meta_id, instance_room_id_base, room_ugc_npc_count);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
return (result, instance_room_id);
|
|
}
|
|
|
|
public static async Task<(Result, string)> joinEditRoomInstance(string userGuid)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
var instanceMetaId = ServerCommon.Constant.EDIT_ROOM_INSTANCE_META_ID;
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
var instance_room_id_base = makeEditRoomInstanceRoomIdBase(userGuid);
|
|
var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base);
|
|
|
|
var room_info = await instance_room_storage.GetInstanceRoomInfo(instance_room_id);
|
|
var room_ugc_npc_count = room_info?.UgcNpcCount ?? 0;
|
|
if (room_info == null)
|
|
{
|
|
(result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instanceMetaId);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
}
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instanceMetaId, instance_room_id_base, room_ugc_npc_count);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
return (result, instance_room_id);
|
|
}
|
|
|
|
public static async Task<Result> joinTargetInstanceRoom(string userGuid, string instanceRoomId, int instanceMetaId, int enterPlayerCount = 0)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return result;
|
|
}
|
|
|
|
var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(instanceRoomId);
|
|
|
|
var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(instanceRoomId);
|
|
if (instance_room_Info == null)
|
|
{
|
|
await deleteInstanceRoom(instanceRoomId);
|
|
|
|
err_msg = $"Not Found InstanceRoomInfo !!! : instanceRoomId:{instanceRoomId} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.NotExistRoomInfoForEnter, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return result;
|
|
}
|
|
|
|
result = await joinInstanceRoomFromRedis(userGuid, instanceRoomId, instanceMetaId, instance_room_id_base, instance_room_Info.UgcNpcCount, enterPlayerCount);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return result;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static async Task<string> CreatePartyInstance(string partyGuid, int instanceMetaId)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instanceMetaId}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
(result, var instance_server_info) = await getBestInstanceServerForCreateInstance(MetaHelper.GameConfigMeta.MaxPartyMembers);
|
|
if (result.isFail() || instance_server_info == null)
|
|
{
|
|
err_msg = $"Failed to getBestInstanceServerForCreateInstance() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
if (instance_server_info.Address == string.Empty || instance_server_info.Port == 0)
|
|
{
|
|
err_msg = $"ServerInfo is invalid !!! Address:{instance_server_info.Address}, Port:{instance_server_info.Port}";
|
|
result.setFail(ServerErrorCode.ValidServerNotFound, err_msg);
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
var instance_room_id_base = makePartyInstanceRoomIdBase(partyGuid);
|
|
var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base);
|
|
|
|
(result, _) = await instance_room_storage.createInstanceRoom(instance_room_id, instance_server_info.Address, instance_server_info.Port, instanceMetaId);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to createInstanceRoom() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
return instance_room_id;
|
|
}
|
|
|
|
public static async Task<string> JoinPartyInstance(string userGuid, string instanceRoomId)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
var roomInfo = await instance_room_storage.GetInstanceRoomInfo(instanceRoomId);
|
|
if (roomInfo == null)
|
|
{
|
|
await deleteInstanceRoom(instanceRoomId);
|
|
|
|
err_msg = $"Not exist instanceroom:{instanceRoomId}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
result = await instance_room_storage.joinInstanceRoom(userGuid, instanceRoomId, MetaHelper.GameConfigMeta.MaxPartyMembers);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to TryJoinInstanceRoom() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
return instanceRoomId;
|
|
}
|
|
|
|
public static async Task<Result> leaveInstanceRoom(string userGuid, string instanceRoomId)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
await instance_room_storage.leaveInstanceRoom(userGuid, instanceRoomId);
|
|
|
|
if (!isOnlyOneInstanceRoomID(instanceRoomId))
|
|
{
|
|
var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(instanceRoomId);
|
|
|
|
await instance_room_storage.decreaseInstanceRoomScore(instance_room_id_base, instanceRoomId);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static async Task<Result> deleteInstanceRoom(string instanceRoomId)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
await instance_room_storage.deleteInstanceRoom(instanceRoomId);
|
|
|
|
if (!isOnlyOneInstanceRoomID(instanceRoomId))
|
|
{
|
|
var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(instanceRoomId);
|
|
|
|
await instance_room_storage.removeInstanceRoomList(instance_room_id_base, instanceRoomId);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static async Task<int> getInstanceUserCount(int instanceMetaId, string roomIdBase)
|
|
{
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instanceMetaId}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int user_count = 0;
|
|
|
|
if (instance_meta_data.OverLimit == 1)
|
|
{
|
|
user_count = await instance_room_storage.getInstanceRoomListTotalUserCount(roomIdBase);
|
|
}
|
|
else
|
|
{
|
|
var instance_room_id = makeOnlyOneInstanceRoomId(roomIdBase);
|
|
|
|
var instance_room = await instance_room_storage.GetInstanceRoomInfo(instance_room_id);
|
|
if (instance_room == null) return 0;
|
|
|
|
user_count = await instance_room_storage.getInstanceRoomUserCount(instance_room_id);
|
|
user_count += instance_room.UgcNpcCount;
|
|
}
|
|
|
|
return user_count;
|
|
}
|
|
|
|
public static string makeInstanceRoomIdBase(int instanceMetaId)
|
|
{
|
|
return $"{ServerCommon.Constant.PREFIX_INSTANCE_ROOM_ID}:{instanceMetaId}";
|
|
}
|
|
|
|
public static string makeMyhomeInstanceRoomIdBase(string userGuid, string myhomeGuid)
|
|
{
|
|
return $"{ServerCommon.Constant.PREFIX_MYHOME_INSTANCE_ROOM_ID}:{userGuid}:{myhomeGuid}";
|
|
}
|
|
|
|
static string makeDressRoomInstanceRoomIdBase(string userGuid)
|
|
{
|
|
return $"{ServerCommon.Constant.PREFIX_DRESS_ROOM_INSTANCE_ROOM_ID}:{userGuid}";
|
|
}
|
|
|
|
public static string makeEditRoomInstanceRoomIdBase(string userGuid)
|
|
{
|
|
return $"{ServerCommon.Constant.PREFIX_EDIT_ROOM_INSTANCE_ROOM_ID}:{userGuid}";
|
|
}
|
|
|
|
static string makePartyInstanceRoomIdBase(string partyGuid)
|
|
{
|
|
return $"{ServerCommon.Constant.PREFIX_PARTY_INSTANCE_ROOM_ID}:{partyGuid}";
|
|
}
|
|
|
|
public static async Task<string> makeInstanceRoomId(string instanceRoomIdBase, int overLimit)
|
|
{
|
|
if (overLimit == 1)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
var room_id_seq = await instance_room_storage.getRoomIdSeq();
|
|
if (room_id_seq == 0)
|
|
return string.Empty;
|
|
|
|
return $"{instanceRoomIdBase}:{room_id_seq}";
|
|
}
|
|
else
|
|
{
|
|
return makeOnlyOneInstanceRoomId(instanceRoomIdBase);
|
|
}
|
|
}
|
|
|
|
static string makeOnlyOneInstanceRoomId(string instanceRoomIdBase)
|
|
{
|
|
return $"{instanceRoomIdBase}:{ServerCommon.Constant.POSTFIX_ONLY_ONE_INSTANCE_ROOM_ID}";
|
|
}
|
|
|
|
public static string getInstanceRoomIdBaseFromInstanceRoomId(string instanceRoomId)
|
|
{
|
|
var instance_room_Id_element = instanceRoomId.Split(":");
|
|
|
|
if (instance_room_Id_element.Length == ServerCommon.Constant.INSTANCE_ROOM_ID_ELEMENT_COUNT)
|
|
{
|
|
return $"{instance_room_Id_element[0]}:{instance_room_Id_element[1]}";
|
|
}
|
|
|
|
if (instance_room_Id_element.Length == ServerCommon.Constant.MYHOME_INSTANCE_ROOM_ID_ELEMENT_COUNT)
|
|
{
|
|
return $"{instance_room_Id_element[0]}:{instance_room_Id_element[1]}:{instance_room_Id_element[2]}";
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
public static bool isOnlyOneInstanceRoomID(string instanceRoomId)
|
|
{
|
|
var room_id_element = instanceRoomId.Split(":");
|
|
if (room_id_element.Length != ServerCommon.Constant.INSTANCE_ROOM_ID_ELEMENT_COUNT && room_id_element.Length != ServerCommon.Constant.MYHOME_INSTANCE_ROOM_ID_ELEMENT_COUNT)
|
|
return false;
|
|
|
|
if (room_id_element[room_id_element.Length - 1] == ServerCommon.Constant.POSTFIX_ONLY_ONE_INSTANCE_ROOM_ID)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
static async Task<(Result, string)> createInstanceRoomFromRedis(string instanceRoomIdBase, int instanceMetaId)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
(result, var instance_server_info) = await getBestInstanceServerForCreateInstance(instance_meta_data.LimitCount);
|
|
if (result.isFail() || instance_server_info == null)
|
|
{
|
|
err_msg = $"Failed to getBestInstanceServerForCreateInstance() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
if (instance_server_info.Address == string.Empty || instance_server_info.Port == 0)
|
|
{
|
|
err_msg = $"ServerInfo is invalid !!! Address:{instance_server_info.Address}, Port:{instance_server_info.Port}";
|
|
result.setFail(ServerErrorCode.ValidServerNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
var instance_room_id = await makeInstanceRoomId(instanceRoomIdBase, instance_meta_data.OverLimit);
|
|
if (instance_room_id == string.Empty)
|
|
{
|
|
err_msg = $"Failed to makeInstanceRoomId() !!!";
|
|
result.setFail(ServerErrorCode.ValidServerNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
(result, var is_created) = await instance_room_storage.createInstanceRoom(instance_room_id, instance_server_info.Address, instance_server_info.Port, instanceMetaId);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to createInstanceRoom() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
|
|
if (instance_meta_data.OverLimit == 1 && is_created)
|
|
{
|
|
result = await instance_room_storage.addInstanceRoomList(instanceRoomIdBase, instance_room_id);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to addInstanceRoomList() !!! : {result.toBasicString()}";
|
|
Log.getLogger().error(err_msg);
|
|
|
|
return (result, string.Empty);
|
|
}
|
|
}
|
|
|
|
return (result, instance_room_id);
|
|
}
|
|
|
|
public static async Task<(Result, ServerInfo?)> getBestInstanceServerForCreateInstance(int roomCapacity)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
(result, var server_info_list) = await server_logic.getServerInfosByServerType(ServerType.Indun);
|
|
if (server_info_list.Count == 0)
|
|
{
|
|
err_msg = $"Not Exist Indun Server !!!";
|
|
result.setFail(ServerErrorCode.ValidServerNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, null);
|
|
}
|
|
|
|
int selected_server_index = LoadBalanceServerHelper.getBestInstanceServerIndexForCreate(server_info_list, roomCapacity);
|
|
if (selected_server_index == -1)
|
|
{
|
|
foreach (var server_info in server_info_list)
|
|
{
|
|
Log.getLogger().info($"IndunServer Capacity Info !!! : serverName:{server_info.Name}, serverCapacity:{server_info.Capacity}, serverRoomCapacity:{server_info.RoomCapacity}");
|
|
}
|
|
|
|
err_msg = $"Not Found Enough Capacity Indun Server !!! : tryCreateRoomCapacity:{roomCapacity}";
|
|
result.setFail(ServerErrorCode.ValidServerNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return (result, null);
|
|
}
|
|
|
|
return (result, server_info_list[selected_server_index]);
|
|
}
|
|
|
|
public static async Task<Result> joinInstanceRoomFromRedis(string userGuid, string instanceRoomId, int instanceMetaId, string instanceRoomIdBase, int ugcNpcCount, int enterPlayerCount = 0)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return result;
|
|
}
|
|
|
|
if (enterPlayerCount < 1)
|
|
enterPlayerCount = instance_meta_data.LimitCount;
|
|
|
|
result = await instance_room_storage.joinInstanceRoom(userGuid, instanceRoomId, enterPlayerCount - ugcNpcCount);
|
|
if (result.isFail())
|
|
{
|
|
err_msg = $"Failed to TryJoinInstanceRoom() !!! : {result.toBasicString()}";
|
|
Log.getLogger().debug(err_msg);
|
|
|
|
return result;
|
|
}
|
|
|
|
if (instance_meta_data.OverLimit == 1)
|
|
{
|
|
result = await instance_room_storage.increaseInstanceRoomScore(instanceRoomIdBase, instanceRoomId);
|
|
if (result.isFail())
|
|
{
|
|
await instance_room_storage.leaveInstanceRoom(userGuid, instanceRoomId);
|
|
|
|
err_msg = $"Failed to increaseInstanceRoomScore() !!! : {result.toBasicString()} - userGuid:{userGuid}";
|
|
Log.getLogger().debug(err_msg);
|
|
|
|
return result;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static async Task<Result> increaseInstanceRoomScoreForUgcNpc(string instanceRoomIdBase, string instanceRoomId)
|
|
{
|
|
var result = new Result();
|
|
string err_msg;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
var instance_room = await instance_room_storage.GetInstanceRoomInfo(instanceRoomId);
|
|
if (instance_room == null)
|
|
{
|
|
err_msg = $"Fail to increase instance room score for ugc npc: instance room id - {instanceRoomId}";
|
|
result.setFail(ServerErrorCode.InstanceRoomException, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return result;
|
|
}
|
|
|
|
result = await instance_room_storage.increaseInstanceRoomUgcNpcScore(instanceRoomId);
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instance_room.InstanceId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instance_room.InstanceId}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return result;
|
|
}
|
|
|
|
if (instance_meta_data.OverLimit == 1)
|
|
{
|
|
result = await instance_room_storage.increaseInstanceRoomScore(instanceRoomIdBase, instanceRoomId);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static async Task<Result> decreaseInstanceRoomScoreForUgcNpc(string instanceRoomIdBase, string instanceRoomId)
|
|
{
|
|
var result = new Result();
|
|
string err_msg;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
var instance_room = await instance_room_storage.GetInstanceRoomInfo(instanceRoomId);
|
|
if (instance_room == null)
|
|
{
|
|
err_msg = $"Fail to increase instance room score for ugc npc: instance room id - {instanceRoomId}";
|
|
result.setFail(ServerErrorCode.InstanceRoomException, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return result;
|
|
}
|
|
|
|
result = await instance_room_storage.decreaseInstanceRoomUgcNpcScore(instanceRoomId);
|
|
|
|
if (!MetaData.Instance._IndunTable.TryGetValue(instance_room.InstanceId, out var instance_meta_data))
|
|
{
|
|
err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instance_room.InstanceId}";
|
|
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
return result;
|
|
}
|
|
if (instance_meta_data.OverLimit == 1)
|
|
{
|
|
result = await instance_room_storage.decreaseInstanceRoomScore(instanceRoomIdBase, instanceRoomId);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static async Task<(Result, List<InstanceRoomInfo>)> tryGetMyhomeInstanceRoomInfos(string myhomeOwnerUserGuid, string myhomeGuid)
|
|
{
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var myhome_Instance_room_infos = new List<InstanceRoomInfo>();
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var instance_room_storage = new InstanceRoomStorage();
|
|
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
|
|
|
var instance_room_id_base = makeMyhomeInstanceRoomIdBase(myhomeOwnerUserGuid, myhomeGuid);
|
|
|
|
var room_list = await instance_room_storage.GetInstanceRoomList(instance_room_id_base, int.MaxValue);
|
|
foreach (var room_id in room_list)
|
|
{
|
|
var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(room_id);
|
|
if (instance_room_Info == null)
|
|
{
|
|
await deleteInstanceRoom(room_id);
|
|
|
|
continue;
|
|
}
|
|
|
|
myhome_Instance_room_infos.Add(instance_room_Info);
|
|
}
|
|
|
|
return (result, myhome_Instance_room_infos);
|
|
}
|
|
}
|
|
}
|