This commit is contained in:
Putoo
2026-07-10 16:39:52 +08:00
parent cfe6612a7a
commit 9de24634e3
31 changed files with 760 additions and 39 deletions

View File

@@ -16,6 +16,8 @@ public interface IGameMonsterService
Task<unit_user_monster> GetCreateMonsterInfo(string umId);
Task<bool> RemoveCreateMonster(string umId);
Task<bool> RemoveCreateMonster(unit_user_monster data);
Task ClearCreateMonster(string userId,string code, string par, string monsterId, string mapId);
Task<int> GetUserMonsterCount(string userId, string monsterId, int state);
Task HandleCreateMonster();
Task<List<MapMonsterModel>> GetMapMonster(string userId, string mapId, string teamId);

View File

@@ -12,10 +12,14 @@ public interface IGameTaskService
#region
Task<List<unit_user_task>> GetUserTaskData(string userId);
Task<unit_user_task> GetUserTaskInfo(string userId, int taskId);
Task<bool> UpdateUserTaskInfo(string userId, int itemId);
Task<int> GetUserTaskCount(string userId, int taskId);
Task ResetNextTask(string userId, int nextId);
Task<UserTaskModel> GetUserTaskModel(string userId, game_task_item task);
Task HandleUserTaskLog();
Task HandleUserTask();
#endregion
}

View File

@@ -91,5 +91,17 @@ public class GameAutoJobService(ISqlSugarClient DbClient, IRedisCache redis, ITi
await _eventPublisher.PublishAsync(new ChannelEventSource(BusEventsEnum.BusEventsName.HandleExchangeData,
data));
}
else if (data.code == nameof(GameEnum.JobCode.UpdateTaskLog)) //更新任务日志
{
var _eventPublisher = App.GetService<IEventPublisher>();
await _eventPublisher.PublishAsync(new ChannelEventSource(BusEventsEnum.BusEventsName.HandleTaskLog,
data));
}
else if (data.code == nameof(GameEnum.JobCode.UpdateTaskUser)) //更新角色任务
{
var _eventPublisher = App.GetService<IEventPublisher>();
await _eventPublisher.PublishAsync(new ChannelEventSource(BusEventsEnum.BusEventsName.HandelTaskUser,
data));
}
}
}

View File

@@ -152,6 +152,26 @@ public class GameMonsterService(ISqlSugarClient DbClient, IRedisCache redis) : I
return result;
}
public async Task ClearCreateMonster(string userId, string code, string par, string monsterId, string mapId)
{
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_monster>();
bool result = await db.Deleteable<unit_user_monster>()
.Where(it => it.userId == userId && it.code == code && it.par == par && it.monsterId == monsterId)
.ExecuteCommandAsync() > 0;
if (result)
{
await ClearCreateMonster(mapId);
}
}
public async Task<int> GetUserMonsterCount(string userId, string monsterId, int state)
{
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_monster>();
return await db.Queryable<unit_user_monster>()
.Where(it => it.userId == userId && it.monsterId == monsterId && it.state == state).CountAsync();
}
public async Task HandleCreateMonster()
{
var endTime = TimeExtend.GetTimeStampSeconds;

View File

@@ -64,6 +64,20 @@ public class GameTaskService(ISqlSugarClient DbClient, IRedisCache redis) : IGam
#region
public async Task<List<unit_user_task>> GetUserTaskData(string userId)
{
string key = string.Format(UserCache.BaseCacheKeys, "TaskCache", "UserTaskData");
if (await redis.HExistsHashAsync(key, userId))
{
return await redis.GetHashAsync<List<unit_user_task>>(key, userId);
}
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_task>();
var data = await db.Queryable<unit_user_task>().Where(it => it.userId == userId).ToListAsync();
await redis.AddHashAsync(key, userId, data);
return data;
}
public async Task<unit_user_task> GetUserTaskInfo(string userId, int taskId)
{
string utId = $"{userId}_{taskId}";
@@ -80,6 +94,17 @@ public class GameTaskService(ISqlSugarClient DbClient, IRedisCache redis) : IGam
return data;
}
private async Task ClearUserTaskCache(string userId, string utId = "")
{
string key = string.Format(UserCache.BaseCacheKeys, "TaskCache", "UserTaskData");
await redis.DelHashAsync(key, userId);
if (!string.IsNullOrEmpty(utId))
{
key = string.Format(UserCache.BaseCacheKeys, "TaskCache", "UserTaskInfo");
await redis.DelHashAsync(key, utId);
}
}
public async Task<bool> UpdateUserTaskInfo(string userId, int itemId)
{
bool result = false;
@@ -93,8 +118,7 @@ public class GameTaskService(ISqlSugarClient DbClient, IRedisCache redis) : IGam
result = await db.Deleteable<unit_user_task>().Where(it => it.utId == utId).ExecuteCommandAsync() > 0;
if (result)
{
string key = string.Format(UserCache.BaseCacheKeys, "TaskCache", "UserTaskInfo");
await redis.DelHashAsync(key, utId);
await ClearUserTaskCache(userId, utId);
}
}
else
@@ -107,6 +131,7 @@ public class GameTaskService(ISqlSugarClient DbClient, IRedisCache redis) : IGam
onTask.userId = userId;
onTask.taskId = taskInfo.taskId;
onTask.itemId = taskInfo.tiId;
onTask.lev = taskInfo.lev;
onTask.name = taskInfo.name;
onTask.code = taskInfo.code;
onTask.endTime = await GetItemEndTime((int)taskInfo.taskId, (int)taskInfo.time);
@@ -117,6 +142,7 @@ public class GameTaskService(ISqlSugarClient DbClient, IRedisCache redis) : IGam
{
onTask.itemId = taskInfo.tiId;
onTask.name = taskInfo.name;
onTask.lev = taskInfo.lev;
onTask.code = taskInfo.code;
onTask.endTime = await GetItemEndTime((int)taskInfo.taskId, (int)taskInfo.time);
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_task>();
@@ -127,17 +153,36 @@ public class GameTaskService(ISqlSugarClient DbClient, IRedisCache redis) : IGam
{
string key = string.Format(UserCache.BaseCacheKeys, "TaskCache", "UserTaskInfo");
await redis.AddHashAsync(key, utId, onTask);
await ClearUserTaskCache(userId);
}
}
}
if (result)
{
//清理遗留数据,如怪物
if (taskInfo.needData.Count > 0)
{
var monsterService = App.GetService<IGameMonsterService>();
foreach (var item in taskInfo.needData)
{
if (item.code == nameof(GameEnum.PropCode.Monster))
{
if (!string.IsNullOrEmpty(item.mapId))
{
await monsterService.ClearCreateMonster(userId, nameof(MonsterEnum.MonsterCode.Task),
taskInfo.tiId.ToString(), item.parameter, item.mapId);
}
}
}
}
if (taskInfo.itemType == 0)
{
await AddUserTaskLog(userId, (int)taskInfo.taskId);
}
else if (taskInfo.itemType == 1)
if (taskInfo.itemType != 2)
{
//初始化下一环任务
await ResetNextTask(userId, taskInfo.tiId + 1);
@@ -169,7 +214,7 @@ public class GameTaskService(ISqlSugarClient DbClient, IRedisCache redis) : IGam
long endTime = await GetEndTime(taskId);
unit_user_task_log log = new unit_user_task_log()
{
utId = utId,
utId = StringAssist.NewGuid,
userId = userId,
taskId = taskId,
addTime = DateTime.Now,
@@ -184,9 +229,35 @@ public class GameTaskService(ISqlSugarClient DbClient, IRedisCache redis) : IGam
}
}
private async Task ResetNextTask(string userId, int nextId)
public async Task ResetNextTask(string userId, int nextId)
{
await Task.CompletedTask;
var taskInfo = await GetTaskItemInfo(nextId);
if (taskInfo != null)
{
if (taskInfo.needData.Count > 0)
{
var monsterService = App.GetService<IGameMonsterService>();
var monster = taskInfo.needData.FindAll(it => it.code == nameof(GameEnum.PropCode.Monster));
if (monster.Count > 0)
{
foreach (var item in monster)
{
if (!string.IsNullOrEmpty(item.mapId) && !string.IsNullOrEmpty(item.parameter))
{
int opCount = 0;
int count = await monsterService.GetUserMonsterCount(userId, item.parameter, 0);
if (count < item.count)
{
opCount = (int)item.count - count;
await monsterService.CreateMonsterToMap(userId, item.mapId, item.areaCode,
item.parameter,
opCount, (int)taskInfo.time, nextId.ToString());
}
}
}
}
}
}
}
public async Task<UserTaskModel> GetUserTaskModel(string userId, game_task_item task)
@@ -268,6 +339,68 @@ public class GameTaskService(ISqlSugarClient DbClient, IRedisCache redis) : IGam
return model;
}
public async Task HandleUserTaskLog()
{
//处理任务日志
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_task_log>();
List<string> uts = new List<string>();
long endTime = TimeExtend.GetTimeStampSeconds;
var data = await db.Queryable<unit_user_task_log>().Where(it => it.endTime < endTime).ToListAsync();
foreach (var item in data)
{
string utId = $"{item.userId}_{item.taskId}";
if (uts.Any(it => it == utId))
{
continue;
}
uts.Add(utId);
}
if (uts.Count > 0)
{
bool result =
await db.Deleteable<unit_user_task_log>().Where(it => it.endTime < endTime).ExecuteCommandAsync() > 0;
if (result)
{
string key = string.Format(UserCache.BaseCacheKeys, "TaskCache", "UserTaskCount");
await redis.DelHashAsync(key, uts.ToArray());
}
}
}
public async Task HandleUserTask()
{
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_task>();
List<string> users = new List<string>();
List<string> uts = new List<string>();
long endTime = TimeExtend.GetTimeStampSeconds;
var data = await db.Queryable<unit_user_task>().Where(it => it.endTime < endTime).ToListAsync();
foreach (var item in data)
{
if (users.Any(it => it == item.userId) == false)
{
users.Add(item.userId);
}
uts.Add($"{item.userId}_{item.taskId}");
}
if (users.Count > 0)
{
bool result =
await db.Deleteable<unit_user_task>().Where(it => it.endTime < endTime).ExecuteCommandAsync() > 0;
if (result)
{
string key = string.Format(UserCache.BaseCacheKeys, "TaskCache", "UserTaskData");
await redis.DelHashAsync(key, users.ToArray());
key = string.Format(UserCache.BaseCacheKeys, "TaskCache", "UserTaskInfo");
await redis.DelHashAsync(key, uts.ToArray());
}
}
}
#endregion
#region