This commit is contained in:
Putoo
2026-07-05 18:51:01 +08:00
parent fdb16f5d91
commit a1dbce8a96
15 changed files with 468 additions and 47 deletions

View File

@@ -36,6 +36,12 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
return result;
}
private async Task RemoveUserFight(string userId)
{
string key = string.Format(FightCache.FightCacheKey, "UserFight");
bool result = await redis.AddHashAsync(key, userId, new List<string>());
}
#endregion
#region
@@ -55,7 +61,7 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
}
public async Task AddFightHarm(string fightId,string userId, long harm)
public async Task AddFightHarm(string fightId, string userId, long harm)
{
string key = string.Format(FightCache.FightCacheKeys, "FightData:Harm", fightId);
if (await redis.HExistsHashAsync(key, userId))
@@ -69,19 +75,24 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
await redis.AddHashAsync(key, userId, harm);
}
}
public async Task RemoveFightHarm(string fightId,string userId)
public async Task RemoveFightHarm(string fightId, string userId)
{
string key = string.Format(FightCache.FightCacheKeys, "FightData:Harm", fightId);
await redis.DelHashAsync(key, userId);
}
private async Task ClearFightInfoCache(string fightId, string keyId)
private async Task ClearFightInfoCache(string fightId, string keyId, bool remMonsterBool = false)
{
string key1 = string.Format(FightCache.FightCacheKeys, "FightData:Info", fightId);
string key2 = string.Format(FightCache.FightCacheKeys, "FightData:Blood", keyId);
await redis.DelAsync(key1, key2);
List<string> keys = new List<string>();
keys.Add(string.Format(FightCache.FightCacheKeys, "FightData:Info", fightId));
if (remMonsterBool)
{
keys.Add(string.Format(FightCache.FightCacheKeys, "FightData:Blood", keyId));
}
await redis.DelAsync(keys.ToArray());
}
public async Task<bool> AddFight(string fightId, string areaCode, string keyId, string mainId, string code,
@@ -153,28 +164,116 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
return result;
}
public async Task<bool> SetFightWin(string fightId, string winUser)
public async Task<bool> SetFightWin(game_fight_data fightData, string winUser)
{
bool result = false;
var data = await GetFightInfo(fightId);
if (data != null)
long okTime = TimeExtend.GetTimeStampSeconds;
var db = DbClient.AsTenant().GetConnectionWithAttr<game_fight_data>();
if (fightData.code == nameof(GameEnum.FightCode.PVE))
{
long okTime = TimeExtend.GetTimeStampSeconds;
data.state = 1;
data.winUser = winUser;
data.okTime = okTime;
var db = DbClient.AsTenant().GetConnectionWithAttr<game_fight_data>();
result = await db.Updateable<game_fight_data>().SetColumns(it => it.state == 1)
.SetColumns(it => it.winUser == winUser)
.SetColumns(it => it.okTime == okTime)
.Where(it => it.fightId == fightId).ExecuteCommandAsync() > 0;
if (fightData.userId == winUser)
{
var data = await db.Queryable<game_fight_data>()
.Where(it =>
it.keyId == fightData.keyId && it.state == 0 && it.code == nameof(GameEnum.FightCode.PVE))
.ToListAsync();
foreach (var item in data)
{
db.Updateable<game_fight_data>().SetColumns(it => it.state == 1)
.SetColumns(it => it.winUser == winUser)
.SetColumns(it => it.winCode == nameof(UserEnum.AttrCode.Person))
.SetColumnsIF(item.userId == winUser, it => it.okTime == okTime)
.Where(it => it.fightId == item.fightId).AddQueue();
}
result = await db.SaveQueuesAsync() > 0;
if (result)
{
foreach (var item in data)
{
await ClearFightInfoCache(item.fightId, item.keyId, true);
}
fightData.state = 1;
fightData.winCode = nameof(UserEnum.AttrCode.Person);
fightData.winUser = winUser;
fightData.okTime = okTime;
//此处调用战斗结束相关
var _eventPublisher = App.GetService<IEventPublisher>();
await _eventPublisher.PublishAsync(new ChannelEventSource(BusEventsEnum.BusEventsName.PutFightAward,
fightData));
}
}
else
{
//清理相关pvp数据
result = await HandleFightUserDataByPvp(fightData.fightId, fightData.keyId,
nameof(UserEnum.AttrCode.Monster), winUser, fightData.userId, okTime);
if (result)
{
await RemoveUserFight(fightData.userId);
}
}
}
else if (fightData.code == nameof(GameEnum.FightCode.PVP))
{
string lowUser = fightData.userId == winUser ? fightData.mainId : fightData.userId;
result = await HandleFightUserDataByPvp(fightData.fightId, fightData.keyId,
nameof(UserEnum.AttrCode.Person), winUser, lowUser, okTime);
if (result)
{
await RemoveUserFight(lowUser);
}
}
return result;
}
private async Task<bool> HandleFightUserDataByPvp(string fightId, string keyId, string winCode, string winUser,
string lowUser, long okTime)
{
bool result = true;
var db = DbClient.AsTenant().GetConnectionWithAttr<game_fight_data>();
var data = await db.Queryable<game_fight_data>()
.Where(it => it.state == 0 &&
((it.keyId.Contains(lowUser) && it.code == nameof(GameEnum.FightCode.PVP)) ||
(it.userId == lowUser && it.code == nameof(GameEnum.FightCode.PVE))))
.ToListAsync();
foreach (var item in data)
{
db.Updateable<game_fight_data>().SetColumns(it => it.state == 1)
.SetColumns(it => it.winCode == winCode)
.SetColumns(it => it.winUser == winUser)
.SetColumnsIF(item.userId == winUser && winCode == nameof(UserEnum.AttrCode.Person),
it => it.okTime == okTime)
.Where(it => it.fightId == item.fightId).AddQueue();
}
result = await db.SaveQueuesAsync() > 0;
if (result)
{
await ClearFightInfoCache(fightId, data.keyId);
//此处调用战斗结束相关
await HandleFight(data);
foreach (var item in data)
{
await ClearFightInfoCache(item.fightId, item.keyId, false);
}
if (winCode == nameof(UserEnum.AttrCode.Person))
{
var winFight = data.Find(it => it.userId == winUser);
if (winFight != null)
{
winFight.state = 1;
winFight.code = winCode;
winFight.winUser = winUser;
winFight.okTime = okTime;
var _eventPublisher = App.GetService<IEventPublisher>();
await _eventPublisher.PublishAsync(new ChannelEventSource(BusEventsEnum.BusEventsName.PutFightAward,
winFight));
}
}
}
return result;
@@ -184,8 +283,52 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
#region
private async Task HandleFight(game_fight_data data)
public async Task<int> GetUserFightHarm(string userId)
{
int result = 0;
string key = string.Format(FightCache.FightCacheKey, "UserHarm");
if (await redis.HExistsHashAsync(key, userId))
{
result = await redis.GetHashAsync<int>(key, userId);
}
if (result > 0)
{
await redis.AddHashAsync(key, userId, 0);
}
return result;
}
public async Task SetUserFightHarm(string userId, int harm)
{
string key = string.Format(FightCache.FightCacheKey, "UserHarm");
await redis.AddHashAsync(key, userId, harm);
}
public async Task HandleFight(game_fight_data fightData)
{
string winUser = fightData.winUser;
#region
if (fightData.exp > 0)
{
var attrService = App.GetService<IUnitUserAttrService>();
await attrService.UpdateUserExp(winUser, (long)fightData.exp, 1);
}
if (fightData.copper > 0)
{
var accService = App.GetService<IUnitUserAccService>();
await accService.UpdateUserCopper(winUser, 1, (long)fightData.copper, "击杀怪物");
}
if (fightData.petExp > 0) //宠物经验
{
}
#endregion
}
#endregion