111
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user