초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,391 @@
using System.Collections.Concurrent;
using System.Net;
using GameServer.Contents.Battle.Doc;
using MetaAssets;
using Newtonsoft.Json;
using ServerCommon;
using ServerCore; using ServerBase;
namespace GameServer;
public class BattleEventCheckTicker : EntityTicker
{
public BattleEventCheckTicker(double onTickIntervalMilliseconds, CancellationTokenSource? cts)
: base(EntityType.BattleEventCheckTicker, onTickIntervalMilliseconds, cts)
{
}
public override async Task onTaskTick()
{
if (false == BattleRoomHelper.checkBattleActive()) return;
var result = await refreshEvent();
if (result.isFail())
{
Log.getLogger().error($"BattleEventCheckTicker onTaskTick error :{result.toBasicString()}");
}
}
public override async Task<Result> onInit()
{
await refreshEvent();
var result = new Result();
return result;
}
public async Task<Result> refreshEvent()
{
var result = new Result();
(result, var docs) = await loadFromDB();
if (result.isFail()) return result;
if (docs.Count == 0)
{
Log.getLogger().info("Not exist Battle Evnet From DB");
return result;
}
//실제로 작동하는 battle event로 만들기
await updateBattleEvent(docs);
return result;
}
private async Task<(Result, List<BattleEventDoc>)> loadFromDB()
{
var server_logic = GameServerApp.getServerLogic();
var dynamo_db_client = server_logic.getDynamoDbClient();
var doc = new BattleEventDoc();
var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(doc.getPK());
(var result, var read_doc_list) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<BattleEventDoc>(query_config);
if (result.isFail())
{
return (result, new());
}
Log.getLogger().info($"load battle event from db eventdoc count : {read_doc_list.Count}");
return (result, read_doc_list);
}
public List<BattleEventAttrib> loadTempEvent()
{
List<BattleEventAttrib> battle_event_attribs = new();
for(int i = 1; i < 15; i++)
{
var battle_event_attrib = new BattleEventAttrib();
battle_event_attrib.m_event_id = i;
battle_event_attrib.m_is_active = i == 11 ? false : true;
battle_event_attrib.m_start_day = DateTimeHelper.Current.Date;
battle_event_attrib.m_start_hour = i-1; //9시 부터 셋팅
battle_event_attrib.m_start_min = 00;
battle_event_attrib.m_instance_id = 1017006 + ((i % 3) % 2);
battle_event_attrib.m_period = OncePeriodRangeType.Daily;
battle_event_attrib.m_day_of_week_type = new();
battle_event_attrib.m_ffa_config_data_id = 1;
battle_event_attrib.m_ffa_reward_group_id = 1;
battle_event_attrib.m_ffa_hot_time = 1 + (i % 3) ;
battle_event_attrib.m_round_count = 1 + (i % 5);
battle_event_attrib.m_end_date = DateTimeHelper.Current.Date.AddDays(7);
battle_event_attribs.Add(battle_event_attrib);
}
return battle_event_attribs;
}
public async Task updateBattleEvent(List<BattleEventDoc> docs)
{
await Task.CompletedTask;
DateTime now = DateTimeHelper.Current;
DateTime today = now.Date;
deleteOldEvents(now);
foreach (var read_doc in docs)
{
addNewEvent(read_doc, today, now);
}
foreach (var read_doc in docs)
{
checkModifiedEvent(now, read_doc);
}
BattleInstanceManager.It.logSystemBattleEvents();
}
private void addNewEvent(BattleEventDoc doc, DateTime today, DateTime now)
{
var attrib = doc.getAttrib<BattleEventAttrib>();
if (attrib is null)
{
Log.getLogger().error("BattleEventDoc BattleEventAttrib is null !!!!");
return;
}
//메모리에 존재하는 이벤트면 리턴
if (BattleInstanceManager.It.existSystemBattleEvent(attrib.m_event_id)) return;
//아직 시작 안한 이벤트면 리턴
var start_day = DateTime.SpecifyKind(attrib.m_start_day, DateTimeKind.Utc);
var recently_events = CreateSystemBattleEvents(attrib, start_day, now);
foreach (var new_ev in recently_events)
{
BattleInstanceManager.It.addNewSystemBattleEvent(new_ev, true);
}
var new_events = CreateSystemBattleEvents(attrib, today, now);
foreach (var new_ev in new_events)
{
BattleInstanceManager.It.addNewSystemBattleEvent(new_ev, true);
}
//다음날 events 도 추가능한것은 추가한다.
var tomorrow_new_events = CreateSystemBattleEvents(attrib, today.AddDays(1), now);
foreach (var new_ev in tomorrow_new_events)
{
BattleInstanceManager.It.addNewSystemBattleEvent(new_ev, false);
}
}
private void checkModifiedEvent(DateTime now, BattleEventDoc doc)
{
var events = BattleInstanceManager.It.getSystemBattleEvents();
var attrib = doc.getAttrib<BattleEventAttrib>();
if (attrib is null)
{
Log.getLogger().error("BattleEventDoc BattleEventAttrib is null !!!!");
return;
}
if (false == events.TryGetValue(attrib.m_event_id, out var event_data)) return;
if (event_data.m_start_time <= now) return;
var delete_event_ids = new List<int>();
if (attrib.m_is_active == false)
{
delete_event_ids.Add(attrib.m_event_id);
}
if (delete_event_ids.Count > 0)
{
Log.getLogger().info($"deleted event ids : {JsonConvert.SerializeObject(delete_event_ids)}");
BattleInstanceManager.It.removeSystemBattleEvents(delete_event_ids);
}
}
private void deleteOldEvents(DateTime now)
{
var events = BattleInstanceManager.It.getSystemBattleEvents();
//오래된 이벤트 id 취합 및 삭제
List<Int32> deleted_event_ids = new();
foreach (var battle_events in events.Values.ToList())
{
var event_id = battle_events.m_event_id;
var start_time = battle_events.m_start_time;
var destroyed_time = BattleRoomHelper.calculateDestroyedTime(start_time, battle_events.m_ffa_config_data_id, battle_events.m_round_count);
if (destroyed_time < now)
{
deleted_event_ids.Add(event_id);
}
}
if (deleted_event_ids.Count > 0)
{
Log.getLogger().info($"deleted event ids : {JsonConvert.SerializeObject(deleted_event_ids)}");
BattleInstanceManager.It.removeSystemBattleEvents(deleted_event_ids);
}
}
private List<SystemBattleEvent> CreateSystemBattleEvents(BattleEventAttrib attrib, DateTime startDay, DateTime now)
{
List<SystemBattleEvent> new_events = new();
if (BattleInstanceManager.It.existSystemBattleEvent(attrib.m_event_id)) return new_events;
var start_time = makeSystemBattleEventStartTime(attrib, startDay);
//파괴되는 시간을 계산했는데 이벤트 종료시간보다 크면 안넣는다.
var joinableTime_time = BattleRoomHelper.calculateRoomJoinableTime(start_time, attrib.m_ffa_config_data_id, attrib.m_round_count);
if (joinableTime_time < now) return new_events;
if (attrib.m_end_date < joinableTime_time) return new_events;
//이벤트 비활성 상태면 안넣는다.
if (attrib.m_is_active == false) return new_events;
switch (attrib.m_period)
{
case OncePeriodRangeType.NONE:
case OncePeriodRangeType.Daily:
new_events.AddRange(makeDailySystemBattleEvent(start_time, now, attrib));
break;
case OncePeriodRangeType.Weekly:
new_events.AddRange(makeWeekliySystemBattleEvent(startDay, now, attrib));
break;
case OncePeriodRangeType.Monthly:
new_events.AddRange(makeMonthiySystemBattleEvent(startDay, now, attrib));
break;
case OncePeriodRangeType.Nolimit:
Log.getLogger($"There is not used Type in Battle System Event !!!! eventId : {attrib.m_event_id}");
break;
}
if (new_events.Count > 0)
{
string new_events_str = JsonConvert.SerializeObject(new_events);
Log.getLogger().info($"new battele events set {new_events_str}");
}
return new_events;
}
private DateTime makeSystemBattleEventStartTime(BattleEventAttrib attrib, DateTime today)
{
switch (attrib.m_period)
{
case OncePeriodRangeType.NONE:
var start_day = DateTime.SpecifyKind(attrib.m_start_day, DateTimeKind.Utc);
return start_day.AddHours(attrib.m_start_hour).AddMinutes(attrib.m_start_min);
case OncePeriodRangeType.Daily:
case OncePeriodRangeType.Weekly:
case OncePeriodRangeType.Monthly:
return today.AddHours(attrib.m_start_hour).AddMinutes(attrib.m_start_min);
case OncePeriodRangeType.Nolimit:
Log.getLogger($"There is not used Type in Battle System Event !!!! eventId : {JsonConvert.SerializeObject(attrib)}");
return DateTimeHelper.MinTime;
}
return DateTimeHelper.MinTime;
}
// private List<SystemBattleEvent> makeNoneTypeSystemBattleEvent(DateTime startTime, DateTime now, BattleEventAttrib attrib)
// {
// List<SystemBattleEvent> events = new();
//
// if (startTime >= now) // && startTime < now.AddDays(1))
// {
// if (attrib.m_end_date <= now) return events;
//
// SystemBattleEvent new_event = new SystemBattleEvent
// {
// m_event_id = attrib.m_event_id,
// m_instance_id = attrib.m_instance_id,
// m_start_time = startTime,
// m_ffa_config_data_id = attrib.m_ffa_config_data_id,
// m_ffa_reward_group_id = attrib.m_ffa_reward_group_id,
// m_ready_time = startTime.AddMinutes(-5),
// m_is_send_noti = false,
// m_ffa_hot_time = attrib.m_ffa_hot_time,
// m_round_count = attrib.m_round_count
// };
// events.Add(new_event);
// }
// return events;
// }
private List<SystemBattleEvent> makeDailySystemBattleEvent(DateTime startTime, DateTime now, BattleEventAttrib attrib)
{
List<SystemBattleEvent> events = new();
if (attrib.m_end_date <= now) return events;
SystemBattleEvent new_event = new SystemBattleEvent
{
m_event_id = attrib.m_event_id,
m_instance_id = attrib.m_instance_id,
m_start_time = startTime,
m_ffa_config_data_id = attrib.m_ffa_config_data_id,
m_ffa_reward_group_id = attrib.m_ffa_reward_group_id,
m_ready_time = startTime.AddMinutes(-5),
m_is_send_noti = false,
m_ffa_hot_time = attrib.m_ffa_hot_time,
m_round_count = attrib.m_round_count
};
events.Add(new_event);
return events;
}
private List<SystemBattleEvent> makeWeekliySystemBattleEvent(DateTime today, DateTime now, BattleEventAttrib attrib)
{
List<SystemBattleEvent> events = new();
foreach (var dayOfWeek in attrib.m_day_of_week_type)
{
int daysUntilNext = ((int)dayOfWeek - (int)today.DayOfWeek + 7) % 7;
DateTime eventTime = today.AddDays(daysUntilNext).Date
.AddHours(attrib.m_start_hour)
.AddMinutes(attrib.m_start_min);
if (eventTime >= now)// && eventTime < now.AddDays(1))
{
if (attrib.m_end_date <= now) return events;
events.Add(new SystemBattleEvent
{
m_event_id = attrib.m_event_id,
m_instance_id = attrib.m_instance_id,
m_start_time = eventTime,
m_ffa_config_data_id = attrib.m_ffa_config_data_id,
m_ffa_reward_group_id = attrib.m_ffa_reward_group_id,
m_ready_time = eventTime.AddMinutes(-5),
m_is_send_noti = false,
m_ffa_hot_time = attrib.m_ffa_hot_time,
m_round_count = attrib.m_round_count
});
}
}
return events;
}
private List<SystemBattleEvent> makeMonthiySystemBattleEvent(DateTime today, DateTime now, BattleEventAttrib attrib)
{
List<SystemBattleEvent> events = new();
DateTime monthlyTime = new DateTime(
today.Year, today.Month, attrib.m_start_day.Day,
attrib.m_start_hour, attrib.m_start_min, 0
);
if (monthlyTime >= now)// && monthlyTime < now.AddDays(1))
{
if (attrib.m_end_date <= now) return events;
events.Add(new SystemBattleEvent
{
m_event_id = attrib.m_event_id,
m_instance_id = attrib.m_instance_id,
m_start_time = monthlyTime,
m_ffa_config_data_id = attrib.m_ffa_config_data_id,
m_ffa_reward_group_id = attrib.m_ffa_reward_group_id,
m_ready_time = monthlyTime.AddMinutes(-5),
m_is_send_noti = false,
m_ffa_hot_time = attrib.m_ffa_hot_time,
m_round_count = attrib.m_round_count
});
}
return events;
}
}