111
This commit is contained in:
@@ -60,6 +60,8 @@ namespace Application.Domain.Entity
|
|||||||
[SugarColumn(IsNullable = true)]
|
[SugarColumn(IsNullable = true)]
|
||||||
public int? state { get; set; }
|
public int? state { get; set; }
|
||||||
|
|
||||||
|
[SugarColumn(Length = 50, IsNullable = true)]
|
||||||
|
public string? winCode { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 胜利方
|
/// 胜利方
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -10,4 +10,12 @@
|
|||||||
<ProjectReference Include="..\Application.Domain.Entity\Application.Domain.Entity.csproj" />
|
<ProjectReference Include="..\Application.Domain.Entity\Application.Domain.Entity.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="BusEvents\EventModel\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="BusEvents\EventModel\FightAwardEventModel.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
16
Service/Application.Domain/BusEvents/BusEventsEnum.cs
Normal file
16
Service/Application.Domain/BusEvents/BusEventsEnum.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Application.Domain
|
||||||
|
{
|
||||||
|
public class BusEventsEnum
|
||||||
|
{
|
||||||
|
public enum BusEventsName
|
||||||
|
{
|
||||||
|
PutFightAward,//战斗奖励事件
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
17
Service/Application.Domain/BusEvents/BusEventsSubscriber.cs
Normal file
17
Service/Application.Domain/BusEvents/BusEventsSubscriber.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
namespace Application.Domain
|
||||||
|
{
|
||||||
|
public class BusEventsSubscriber : IEventSubscriber
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 处理贡献提成
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context"></param>
|
||||||
|
[EventSubscribe(BusEventsEnum.BusEventsName.PutFightAward, NumRetries = 0)]
|
||||||
|
public async Task HandleQueueBonus(EventHandlerExecutingContext context)
|
||||||
|
{
|
||||||
|
var data = context.GetPayload<game_fight_data>();
|
||||||
|
var fightService = App.GetService<IGameFightService>();
|
||||||
|
await fightService.HandleFight(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,3 +4,4 @@ global using Application.Domain.Entity;
|
|||||||
global using Photon.Core.Redis;
|
global using Photon.Core.Redis;
|
||||||
global using Photon.Core.Assist;
|
global using Photon.Core.Assist;
|
||||||
global using Application.Service.Pub;
|
global using Application.Service.Pub;
|
||||||
|
global using Jaina;
|
||||||
|
|||||||
@@ -15,11 +15,15 @@ public interface IGameFightService
|
|||||||
string scene, string mapId,
|
string scene, string mapId,
|
||||||
string userId, long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = "");
|
string userId, long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = "");
|
||||||
|
|
||||||
Task<bool> SetFightWin(string fightId, string winUser);
|
Task<bool> SetFightWin(game_fight_data fightData, string winUser);
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
#region 战斗相关
|
#region 战斗相关
|
||||||
|
|
||||||
|
Task<int> GetUserFightHarm(string userId);
|
||||||
|
Task SetUserFightHarm(string userId, int harm);
|
||||||
|
Task HandleFight(game_fight_data eventData);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -36,6 +36,12 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
|
|||||||
return result;
|
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
|
#endregion
|
||||||
|
|
||||||
#region 战斗信息
|
#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);
|
string key = string.Format(FightCache.FightCacheKeys, "FightData:Harm", fightId);
|
||||||
if (await redis.HExistsHashAsync(key, userId))
|
if (await redis.HExistsHashAsync(key, userId))
|
||||||
@@ -70,18 +76,23 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
string key = string.Format(FightCache.FightCacheKeys, "FightData:Harm", fightId);
|
||||||
await redis.DelHashAsync(key, userId);
|
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);
|
List<string> keys = new List<string>();
|
||||||
string key2 = string.Format(FightCache.FightCacheKeys, "FightData:Blood", keyId);
|
keys.Add(string.Format(FightCache.FightCacheKeys, "FightData:Info", fightId));
|
||||||
await redis.DelAsync(key1, key2);
|
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,
|
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;
|
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;
|
bool result = false;
|
||||||
var data = await GetFightInfo(fightId);
|
long okTime = TimeExtend.GetTimeStampSeconds;
|
||||||
if (data != null)
|
var db = DbClient.AsTenant().GetConnectionWithAttr<game_fight_data>();
|
||||||
|
if (fightData.code == nameof(GameEnum.FightCode.PVE))
|
||||||
{
|
{
|
||||||
long okTime = TimeExtend.GetTimeStampSeconds;
|
if (fightData.userId == winUser)
|
||||||
data.state = 1;
|
{
|
||||||
data.winUser = winUser;
|
var data = await db.Queryable<game_fight_data>()
|
||||||
data.okTime = okTime;
|
.Where(it =>
|
||||||
var db = DbClient.AsTenant().GetConnectionWithAttr<game_fight_data>();
|
it.keyId == fightData.keyId && it.state == 0 && it.code == nameof(GameEnum.FightCode.PVE))
|
||||||
result = await db.Updateable<game_fight_data>().SetColumns(it => it.state == 1)
|
.ToListAsync();
|
||||||
.SetColumns(it => it.winUser == winUser)
|
|
||||||
.SetColumns(it => it.okTime == okTime)
|
foreach (var item in data)
|
||||||
.Where(it => it.fightId == fightId).ExecuteCommandAsync() > 0;
|
{
|
||||||
|
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)
|
if (result)
|
||||||
{
|
{
|
||||||
await ClearFightInfoCache(fightId, data.keyId);
|
foreach (var item in data)
|
||||||
//此处调用战斗结束相关
|
{
|
||||||
await HandleFight(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;
|
return result;
|
||||||
@@ -184,8 +283,52 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
|
|||||||
|
|
||||||
#region 战斗相关
|
#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
|
#endregion
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Jaina" Version="4.6.7" />
|
||||||
<PackageReference Include="Photon.Core" Version="1.0.0.1" />
|
<PackageReference Include="Photon.Core" Version="1.0.0.1" />
|
||||||
<PackageReference Include="Photon.Core.Assist" Version="1.0.0.1" />
|
<PackageReference Include="Photon.Core.Assist" Version="1.0.0.1" />
|
||||||
<PackageReference Include="Photon.Core.Jwt" Version="1.0.0.2" />
|
<PackageReference Include="Photon.Core.Jwt" Version="1.0.0.2" />
|
||||||
|
|||||||
@@ -17,10 +17,11 @@ public class FightController : ControllerBase
|
|||||||
private readonly IGameMapService _mapService;
|
private readonly IGameMapService _mapService;
|
||||||
private readonly IUnitUserAccService _accService;
|
private readonly IUnitUserAccService _accService;
|
||||||
private readonly IGameGoodsService _goodsService;
|
private readonly IGameGoodsService _goodsService;
|
||||||
|
private readonly IUnitUserService _userService;
|
||||||
|
|
||||||
public FightController(IGameFightService fightService, IGameMonsterService monsterService,
|
public FightController(IGameFightService fightService, IGameMonsterService monsterService,
|
||||||
IUnitUserAttrService attrService, IGameMapService mapService, IUnitUserAccService accService,
|
IUnitUserAttrService attrService, IGameMapService mapService, IUnitUserAccService accService,
|
||||||
IGameGoodsService goodsService)
|
IGameGoodsService goodsService, IUnitUserService userService)
|
||||||
{
|
{
|
||||||
_fightService = fightService;
|
_fightService = fightService;
|
||||||
_monsterService = monsterService;
|
_monsterService = monsterService;
|
||||||
@@ -28,6 +29,7 @@ public class FightController : ControllerBase
|
|||||||
_mapService = mapService;
|
_mapService = mapService;
|
||||||
_accService = accService;
|
_accService = accService;
|
||||||
_goodsService = goodsService;
|
_goodsService = goodsService;
|
||||||
|
_userService = userService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -136,7 +138,7 @@ public class FightController : ControllerBase
|
|||||||
return PoAction.Message("战斗结束", 100);
|
return PoAction.Message("战斗结束", 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 此处处理战斗
|
#region 此处处理战斗
|
||||||
|
|
||||||
FightResultModel fightResult = new FightResultModel()
|
FightResultModel fightResult = new FightResultModel()
|
||||||
{
|
{
|
||||||
@@ -144,19 +146,20 @@ public class FightController : ControllerBase
|
|||||||
};
|
};
|
||||||
if (!string.IsNullOrEmpty(parms.data))
|
if (!string.IsNullOrEmpty(parms.data))
|
||||||
{
|
{
|
||||||
fightResult = JsonConvert.DeserializeObject<FightResultModel>(parms.data);
|
fightResult = JsonConvert.DeserializeObject<FightResultModel>(parms.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
//更新攻击
|
//更新攻击
|
||||||
if (fightResult.result == 0)
|
if (fightResult.result == 0)
|
||||||
{
|
{
|
||||||
myHarm = fightResult.myHarm;
|
myHarm = fightResult.myHarm;
|
||||||
|
myHarm += await _fightService.GetUserFightHarm(userId);
|
||||||
otHarm = fightResult.otHarm;
|
otHarm = fightResult.otHarm;
|
||||||
await _attrService.UpdateUserBlood(userId, 1, fightResult.myHarm);
|
await _attrService.UpdateUserBlood(userId, 1, fightResult.myHarm);
|
||||||
}
|
}
|
||||||
|
|
||||||
var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene);
|
var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene);
|
||||||
UserAttrModel otAttr = new UserAttrModel();
|
UserAttrModel otAttr = new UserAttrModel();
|
||||||
if (fight.code == nameof(GameEnum.FightCode.PVE))
|
if (fight.code == nameof(GameEnum.FightCode.PVE))
|
||||||
@@ -172,19 +175,36 @@ public class FightController : ControllerBase
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
otAttr = await _attrService.GetUserAttrModel(fight.mainId, fight.scene);
|
|
||||||
if (fightResult.result == 0)
|
if (fightResult.result == 0)
|
||||||
{
|
{
|
||||||
|
await _fightService.SetUserFightHarm(fight.mainId, fightResult.otHarm);
|
||||||
await _attrService.UpdateUserBlood(fight.mainId, 1, fightResult.otHarm);
|
await _attrService.UpdateUserBlood(fight.mainId, 1, fightResult.otHarm);
|
||||||
}
|
}
|
||||||
|
otAttr = await _attrService.GetUserAttrModel(fight.mainId, fight.scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
//结束战斗都此处直接返回
|
//结束战斗都此处直接返回
|
||||||
if (otAttr.blood < 1||myAttr.blood<1)
|
if (otAttr.blood < 1 || myAttr.blood < 1)
|
||||||
{
|
{
|
||||||
|
await _fightService.RemoveUserFight(userId, fightId);
|
||||||
|
if (otAttr.blood < 1)
|
||||||
|
{
|
||||||
|
await _fightService.SetFightWin(fight, userId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _fightService.SetFightWin(fight, fight.mainId);
|
||||||
|
}
|
||||||
await _fightService.RemoveUserFight(userId, fightId);
|
await _fightService.RemoveUserFight(userId, fightId);
|
||||||
return PoAction.Message("战斗结束", 100);
|
return PoAction.Message("战斗结束", 100);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//自动使用药品
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//获取个人药品栏
|
//获取个人药品栏
|
||||||
var myDrug = await _attrService.GetUserDrug(userId);
|
var myDrug = await _attrService.GetUserDrug(userId);
|
||||||
//获取个人负面
|
//获取个人负面
|
||||||
@@ -192,7 +212,7 @@ public class FightController : ControllerBase
|
|||||||
|
|
||||||
//冷却时间
|
//冷却时间
|
||||||
int cool = 1000;
|
int cool = 1000;
|
||||||
if (myAttr.agility > otAttr.agility&&otAttr.agility>0)
|
if (myAttr.agility > otAttr.agility && otAttr.agility > 0)
|
||||||
{
|
{
|
||||||
decimal diff = myAttr.agility - otAttr.agility;
|
decimal diff = myAttr.agility - otAttr.agility;
|
||||||
decimal bl = diff / otAttr.agility;
|
decimal bl = diff / otAttr.agility;
|
||||||
@@ -274,6 +294,7 @@ public class FightController : ControllerBase
|
|||||||
{
|
{
|
||||||
if (await _fightService.RemoveUserFight(userId, fightId))
|
if (await _fightService.RemoveUserFight(userId, fightId))
|
||||||
{
|
{
|
||||||
|
await _fightService.SetFightWin(fight, fight.mainId);
|
||||||
await _fightService.RemoveFightHarm(fightId, userId); //移除伤害
|
await _fightService.RemoveFightHarm(fightId, userId); //移除伤害
|
||||||
var nextFight = myFight.FindAll(it => it != fightId);
|
var nextFight = myFight.FindAll(it => it != fightId);
|
||||||
string nextId = nextFight.Count > 0 ? nextFight[0] : "";
|
string nextId = nextFight.Count > 0 ? nextFight[0] : "";
|
||||||
@@ -305,6 +326,7 @@ public class FightController : ControllerBase
|
|||||||
{
|
{
|
||||||
return PoAction.Message("战斗不存在!");
|
return PoAction.Message("战斗不存在!");
|
||||||
}
|
}
|
||||||
|
|
||||||
var fight = await _fightService.GetFightInfo(fightId);
|
var fight = await _fightService.GetFightInfo(fightId);
|
||||||
if (fight == null)
|
if (fight == null)
|
||||||
{
|
{
|
||||||
@@ -355,7 +377,93 @@ public class FightController : ControllerBase
|
|||||||
{
|
{
|
||||||
return PoAction.Message("药品使用失败!");
|
return PoAction.Message("药品使用失败!");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 战斗信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fightId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IPoAction> GetFightMsg(string fightId)
|
||||||
|
{
|
||||||
|
string userId = StateHelper.userId;
|
||||||
|
var myFight = await _fightService.GetUserFight(userId);
|
||||||
|
|
||||||
|
var fight = await _fightService.GetFightInfo(fightId);
|
||||||
|
if (fight == null)
|
||||||
|
{
|
||||||
|
return PoAction.Message("战斗不存在!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fight.userId != userId)
|
||||||
|
{
|
||||||
|
return PoAction.Message("战斗不存在!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fight.state == 0)
|
||||||
|
{
|
||||||
|
return PoAction.Message("战斗未完成", 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
int isWin = 0;
|
||||||
|
if (fight.winUser == fight.mainId)
|
||||||
|
{
|
||||||
|
isWin = 0;
|
||||||
|
}
|
||||||
|
else if(fight.winUser==userId)
|
||||||
|
{
|
||||||
|
isWin = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isWin = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
string otName = string.Empty;
|
||||||
|
if (isWin == 0)
|
||||||
|
{
|
||||||
|
if (fight.code == nameof(GameEnum.FightCode.PVP))
|
||||||
|
{
|
||||||
|
var userInfo = await _userService.GetUserInfoByUserId(fight.winUser);
|
||||||
|
otName = userInfo.nick;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var monsterInfo = await _monsterService.GetMonsterInfo(fight.winUser);
|
||||||
|
otName = monsterInfo.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isWin == 1)
|
||||||
|
{
|
||||||
|
if (fight.code == nameof(GameEnum.FightCode.PVP))
|
||||||
|
{
|
||||||
|
var userInfo = await _userService.GetUserInfoByUserId(fight.mainId);
|
||||||
|
otName = userInfo.nick;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var monsterInfo = await _monsterService.GetMonsterInfo(fight.mainId);
|
||||||
|
otName = monsterInfo.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (fight.winCode == nameof(UserEnum.AttrCode.Person))
|
||||||
|
{
|
||||||
|
var userInfo = await _userService.GetUserInfoByUserId(fight.winUser);
|
||||||
|
otName = userInfo.nick;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var monsterInfo = await _monsterService.GetMonsterInfo(fight.winUser);
|
||||||
|
otName = monsterInfo.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene);
|
||||||
|
|
||||||
|
|
||||||
|
return PoAction.Ok(new { isWin, otName, blood = myAttr.blood, upBlood = myAttr.upBlood, fight });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
using Microsoft.OpenApi.Models;
|
using Microsoft.OpenApi.Models;
|
||||||
using Photon.Core.Redis;
|
using Photon.Core.Redis;
|
||||||
|
|
||||||
@@ -82,6 +81,17 @@ builder.Services.AddCors(options =>
|
|||||||
|
|
||||||
#endregion 配置跨域处理,允许所有来源
|
#endregion 配置跨域处理,允许所有来源
|
||||||
|
|
||||||
|
#region 事务总线
|
||||||
|
// 注册 EventBus 服务
|
||||||
|
builder.Services.AddEventBus(builder =>
|
||||||
|
{
|
||||||
|
// 注册 ToDo 事件订阅者
|
||||||
|
builder.AddSubscriber<BusEventsSubscriber>();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
builder.Services.AddSignalR();
|
builder.Services.AddSignalR();
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="common">
|
<div class="common">
|
||||||
<Abutton>{{ autoFight == 0 ? "开启自动攻击" : "关闭自动攻击" }}</Abutton>
|
<Abutton @click="AutoAtk">{{ autoFight == 0 ? "开启自动攻击" : "关闭自动攻击" }}</Abutton>
|
||||||
</div>
|
</div>
|
||||||
<div class="common">
|
<div class="common">
|
||||||
你向{{ otAttr.name }}发起了攻击!
|
你向{{ otAttr.name }}发起了攻击!
|
||||||
@@ -72,6 +72,7 @@ const coolTime = ref(0);
|
|||||||
let coolLock = false;//冷却锁
|
let coolLock = false;//冷却锁
|
||||||
const coolTimer = ref(0);//冷却定时器
|
const coolTimer = ref(0);//冷却定时器
|
||||||
let dataLock = false;//数据锁
|
let dataLock = false;//数据锁
|
||||||
|
const autoAtkTimer = ref(0);//冷却定时器
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
try {
|
try {
|
||||||
@@ -83,7 +84,8 @@ onMounted(async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
clearTimeout(coolTimer.value)
|
clearTimeout(coolTimer.value);
|
||||||
|
clearTimeout(autoAtkTimer.value);
|
||||||
})
|
})
|
||||||
|
|
||||||
/**加载方法 */
|
/**加载方法 */
|
||||||
@@ -162,4 +164,19 @@ const StartCool = () => {
|
|||||||
coolLock = false;
|
coolLock = false;
|
||||||
}, coolTime.value)
|
}, coolTime.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**自动攻击 */
|
||||||
|
|
||||||
|
const AutoAtk = () => {
|
||||||
|
if (autoFight.value == 0) {
|
||||||
|
autoFight.value = 1;
|
||||||
|
autoAtkTimer.value = setInterval(async () => {
|
||||||
|
await FightAtk()
|
||||||
|
}, coolTime.value)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
autoFight.value = 0;
|
||||||
|
clearTimeout(autoAtkTimer.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -1 +1,89 @@
|
|||||||
<template></template>
|
<template>
|
||||||
|
<div class="content" v-if="isWin != -1">
|
||||||
|
<div class="common">
|
||||||
|
<span v-if="isWin == 1">战胜了{{ otName }}!</span>
|
||||||
|
<span v-if="isWin == 0">你被{{ otName }}击杀!</span>
|
||||||
|
<span v-if="isWin == 2">被{{ otName }}击杀!</span>
|
||||||
|
</div>
|
||||||
|
<div class="common">
|
||||||
|
<Abar href="/map">继续</Abar>
|
||||||
|
</div>
|
||||||
|
<div class="common">
|
||||||
|
你体力:{{ blood }}/{{ upBlood }}
|
||||||
|
</div>
|
||||||
|
<div class="common" v-if="isWin == 1">
|
||||||
|
<div class="item" v-if="fight.exp > 0">
|
||||||
|
经验:+{{ fight.exp }}
|
||||||
|
</div>
|
||||||
|
<div class="item" v-if="fight.copper > 0">
|
||||||
|
铜贝:+{{ fight.copper }}
|
||||||
|
</div>
|
||||||
|
<div class="item" v-if="fight.petExp > 0">
|
||||||
|
宠物经验:+{{ fight.petExp }}
|
||||||
|
</div>
|
||||||
|
<div class="item" v-if="fight.award != ''" v-html="AwardTips">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
definePageMeta({
|
||||||
|
layout: layout.default,
|
||||||
|
middleware: 'page-loading'
|
||||||
|
})
|
||||||
|
|
||||||
|
const isWin = ref(-1);
|
||||||
|
const otName = ref('');
|
||||||
|
const blood = ref(0);
|
||||||
|
const upBlood = ref(0);
|
||||||
|
const fight = ref<any>({});
|
||||||
|
const AwardTips = ref('');
|
||||||
|
let fightId = PageExtend.QueryString("f");
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
try {
|
||||||
|
await BindData();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
PageLoading.Close();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const BindData = async (): Promise<void> => {
|
||||||
|
let result = await FightService.GetFightMsg(fightId);
|
||||||
|
if (result.code == 0) {
|
||||||
|
isWin.value = result.data.isWin;
|
||||||
|
otName.value = result.data.otName;
|
||||||
|
blood.value = result.data.blood;
|
||||||
|
upBlood.value = result.data.upBlood;
|
||||||
|
fight.value = result.data.fight;
|
||||||
|
if (fight.value.award != '') {
|
||||||
|
AwardTips.value = awardTipsStr(JSON.parse(fight.value.award))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (result.code == 100) {
|
||||||
|
PageExtend.RedirectTo("/fight?f=" + fightId);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
MessageExtend.ShowDialogEvent("提示", result.msg, () => {
|
||||||
|
PageExtend.RedirectTo("/map");
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const awardTipsStr = (data: any) => {
|
||||||
|
let result = '';
|
||||||
|
if (data.code == 'Default') {
|
||||||
|
result += "<span>掉落物品:</span><br>"
|
||||||
|
let awData: Array<any> = data.award;
|
||||||
|
awData.forEach(it => {
|
||||||
|
result += `${it.name}×${it.count}、`;
|
||||||
|
})
|
||||||
|
return StringExtend.trimEnd(result, '、');
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
等级:{{ monster.lev }}<br>
|
等级:{{ monster.lev }}<br>
|
||||||
说明:{{ monster.remark }}<br>
|
说明:{{ monster.remark }}<br>
|
||||||
体力:{{ monster.blood }}<br>
|
体力:{{ monster.blood }}<br>
|
||||||
攻击:{{ monster.minAtk }}/{{ monster.maxAtk }}<br>
|
攻击:{{ monster.minAtk }}-{{ monster.maxAtk }}<br>
|
||||||
防御:{{ monster.defense }}<br>
|
防御:{{ monster.defense }}<br>
|
||||||
敏捷:{{ monster.agility }}<br>
|
敏捷:{{ monster.agility }}<br>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -35,4 +35,12 @@ export class FightService {
|
|||||||
static async UseFightDrug(fightId: string, drugId: string) {
|
static async UseFightDrug(fightId: string, drugId: string) {
|
||||||
return await ApiService.Request("get", "/Fight/UseFightDrug", { fightId, drugId });
|
return await ApiService.Request("get", "/Fight/UseFightDrug", { fightId, drugId });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 战斗信息
|
||||||
|
* GET /Fight/GetFightMsg
|
||||||
|
*/
|
||||||
|
static async GetFightMsg(fightId: string) {
|
||||||
|
return await ApiService.Request("get", "/Fight/GetFightMsg", { fightId });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -57,7 +57,6 @@ export class FightTool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//士气处理
|
//士气处理
|
||||||
if (atkUser.upMorale > 0) {
|
if (atkUser.upMorale > 0) {
|
||||||
atkUser.minAtk = atkUser.minAtk * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3);
|
atkUser.minAtk = atkUser.minAtk * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3);
|
||||||
@@ -75,7 +74,6 @@ export class FightTool {
|
|||||||
else {
|
else {
|
||||||
defHarm = -1;
|
defHarm = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//暴击处理
|
//暴击处理
|
||||||
if (atkUser.crit > 0) {
|
if (atkUser.crit > 0) {
|
||||||
if (this.randomTrigger(atkUser.crit)) {
|
if (this.randomTrigger(atkUser.crit)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user