12121
This commit is contained in:
@@ -13,7 +13,7 @@ public interface IGameFightService
|
||||
Task RemoveFightHarm(string fightId, string userId);
|
||||
Task<bool> AddFight(string fightId, string areaCode, string keyId, string mainId, string code,
|
||||
string scene, string mapId,
|
||||
string userId,long dueTime, 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(game_fight_data fightData, string winUser, bool setDefMap=true);
|
||||
Task HandleFightData();
|
||||
@@ -29,7 +29,10 @@ public interface IGameFightService
|
||||
Task RemoveFightGoods(string mapId, string mgId);
|
||||
Task AutoUseDrug(UserAttrModel user, game_fight_data fight);
|
||||
Task HandelFightEnd(string userId, List<FightRemoveData> data);
|
||||
Task<bool> ValidFight(game_fight_data fight, bool isBlack = true);
|
||||
Task<bool> CheckFightLock(string userId, string lockStr);
|
||||
Task<string> SetFightLock(string userId);
|
||||
Task<bool> FightIsCool(string userId);
|
||||
Task SetFightCool(string userId, long CoolTime);
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -94,7 +94,7 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
|
||||
|
||||
public async Task<bool> AddFight(string fightId, string areaCode, string keyId, string mainId, string code,
|
||||
string scene, string mapId,
|
||||
string userId, long dueTime, long exp = 0, long copper = 0, long petExp = 0, string award = "",
|
||||
string userId,long exp = 0, long copper = 0, long petExp = 0, string award = "",
|
||||
string pars = "")
|
||||
{
|
||||
long addTime = TimeExtend.GetTimeStampMilliseconds;
|
||||
@@ -119,7 +119,6 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
|
||||
petExp = petExp,
|
||||
award = award,
|
||||
pars = pars,
|
||||
dueTime = dueTime,
|
||||
addTime = addTime,
|
||||
okTime = 0,
|
||||
endTime = endTime
|
||||
@@ -382,11 +381,6 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
|
||||
|
||||
public async Task HandleFight(game_fight_data fightData)
|
||||
{
|
||||
if (await ValidFight(fightData) == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
string winUser = fightData.winUser;
|
||||
string lowUser = fightData.userId == winUser ? fightData.mainId : fightData.userId;
|
||||
|
||||
@@ -701,26 +695,34 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
|
||||
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
public async Task<bool> ValidFight(game_fight_data fight, bool isBlack = true)
|
||||
|
||||
public async Task<bool> CheckFightLock(string userId, string lockStr)
|
||||
{
|
||||
bool result = true;
|
||||
if (fight.dueTime > 0)
|
||||
{
|
||||
int diffTime = Convert.ToInt32(fight.okTime - fight.addTime);
|
||||
if (diffTime < 3000)
|
||||
{
|
||||
result = diffTime >= fight.dueTime;
|
||||
if (result == false && isBlack) //异常处理
|
||||
{
|
||||
//封禁账号
|
||||
var userService = App.GetService<IUnitUserService>();
|
||||
await userService.BlackUser(fight.userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
string key = string.Format(BaseCache.BaseCacheKey, "FightLock");
|
||||
var onData = await redis.GetHashAsync<string>(key, userId);
|
||||
return onData == lockStr;
|
||||
}
|
||||
|
||||
return result;
|
||||
public async Task<string> SetFightLock(string userId)
|
||||
{
|
||||
string lockStr = StringAssist.NewGuid;
|
||||
string key = string.Format(BaseCache.BaseCacheKey, "FightLock");
|
||||
await redis.AddHashAsync(key, userId, lockStr);
|
||||
return lockStr;
|
||||
}
|
||||
|
||||
public async Task<bool> FightIsCool(string userId)
|
||||
{
|
||||
string key = string.Format(BaseCache.BaseCacheKey, "FightCool");
|
||||
var onData = await redis.GetHashAsync<long>(key, userId);
|
||||
return TimeExtend.GetTimeStampMilliseconds >= onData;
|
||||
}
|
||||
|
||||
public async Task SetFightCool(string userId, long CoolTime)
|
||||
{
|
||||
long lockStr = TimeExtend.GetTimeStampMilliseconds + CoolTime;
|
||||
string key = string.Format(BaseCache.BaseCacheKey, "FightCool");
|
||||
await redis.AddHashAsync(key, userId, lockStr);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
217
Service/Application.Domain/Tool/Base/FightCompute.cs
Normal file
217
Service/Application.Domain/Tool/Base/FightCompute.cs
Normal file
@@ -0,0 +1,217 @@
|
||||
using Dm.util;
|
||||
|
||||
namespace Application.Domain;
|
||||
|
||||
public class FightCompute
|
||||
{
|
||||
public static FightResultModel ComputeFight(UserAttrModel atkUser, UserAttrModel defUser)
|
||||
{
|
||||
int result = 0;
|
||||
int myHarm = 0;
|
||||
int otHarm = 0;
|
||||
List<string> myStateData = new List<string>();
|
||||
List<FightRemoveData> myRemData = new List<FightRemoveData>();
|
||||
List<string> otStateData = new List<string>();
|
||||
List<FightRemoveData> otRemData = new List<FightRemoveData>();
|
||||
|
||||
var atkHandle = UnitFight(atkUser, defUser);
|
||||
myHarm += atkHandle.atkHarm;
|
||||
otHarm += atkHandle.defHarm;
|
||||
otStateData.AddRange(atkHandle.stateData);
|
||||
otRemData.AddRange(atkHandle.remData);
|
||||
if (defUser.IsSystem == 1) {
|
||||
var defHandle = UnitFight(defUser, atkUser);
|
||||
myHarm += defHandle.defHarm;
|
||||
otHarm += defHandle.atkHarm;
|
||||
myStateData.AddRange(defHandle.stateData);
|
||||
myRemData.AddRange(defHandle.remData);
|
||||
}
|
||||
|
||||
return new FightResultModel() {
|
||||
result = result,
|
||||
myHarm = myHarm,
|
||||
otHarm = otHarm,
|
||||
myStateData = myStateData,
|
||||
myRemData = myRemData,
|
||||
otStateData = otStateData,
|
||||
otRemData = otRemData
|
||||
};
|
||||
}
|
||||
|
||||
private static UnitFightResult UnitFight(UserAttrModel atkUser, UserAttrModel defUser)
|
||||
{
|
||||
int atkHarm = 0;
|
||||
int defHarm = 0;
|
||||
List<string> stateData = new List<string>();
|
||||
List<FightRemoveData> remData = new List<FightRemoveData>();
|
||||
//闪避处理
|
||||
if (defUser.Dodge > 0)
|
||||
{
|
||||
decimal dodgeRide = defUser.Dodge - atkUser.Deadly + defUser.DeadlyLess;
|
||||
if (dodgeRide > 0)
|
||||
{
|
||||
if (randomTrigger(dodgeRide))
|
||||
{
|
||||
return new UnitFightResult()
|
||||
{
|
||||
atkHarm = 0,
|
||||
defHarm = 0,
|
||||
stateData = stateData,
|
||||
remData = remData
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//士气处理
|
||||
if (atkUser.upMorale > 0)
|
||||
{
|
||||
atkUser.minAtk = Convert.ToInt32(atkUser.minAtk * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3));
|
||||
}
|
||||
|
||||
if (defUser.upMorale > 0)
|
||||
{
|
||||
defUser.defense = Convert.ToInt32(defUser.defense * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3));
|
||||
}
|
||||
|
||||
if (atkUser.minAtk > defUser.defense && defUser.defense > 0)
|
||||
{
|
||||
double harmRide = (atkUser.minAtk - defUser.defense) / defUser.defense;
|
||||
harmRide = harmRide > 1.2 ? 1.2 : harmRide;
|
||||
double fight_Harm = harmRide * atkUser.maxAtk;
|
||||
defHarm +=Convert.ToInt32( 0 - fight_Harm);
|
||||
}
|
||||
else
|
||||
{
|
||||
defHarm = -1;
|
||||
}
|
||||
|
||||
//暴击处理
|
||||
if (atkUser.Crit > 0)
|
||||
{
|
||||
if (randomTrigger(atkUser.Crit))
|
||||
{
|
||||
defHarm = Convert.ToInt32(defHarm * 1.5) ;
|
||||
}
|
||||
}
|
||||
|
||||
//处理反弹
|
||||
if (defUser.Rebound > 0)
|
||||
{
|
||||
decimal reboundRide = defUser.Rebound = atkUser.ReboundLess;
|
||||
if (reboundRide > 0)
|
||||
{
|
||||
atkHarm += Convert.ToInt32( defHarm * reboundRide);
|
||||
}
|
||||
}
|
||||
|
||||
defHarm +=Convert.ToInt32(0 - atkUser.Harm_Add) ; //额外伤害
|
||||
//连击处理
|
||||
if (atkUser.Atk_Next > 0)
|
||||
{
|
||||
if (randomTrigger(atkUser.Atk_Next))
|
||||
{
|
||||
defHarm =Convert.ToInt32( defHarm * 1.3);
|
||||
atkHarm += Convert.ToInt32(atkHarm * 1.3) ;
|
||||
}
|
||||
}
|
||||
|
||||
//免伤处理
|
||||
if (defUser.NoHarm > 0 && defHarm < -1)
|
||||
{
|
||||
defHarm = Convert.ToInt32( defHarm * (1 - defUser.NoHarm));
|
||||
defHarm = defHarm > 0 ? 0 : defHarm;
|
||||
}
|
||||
|
||||
//吸血处理
|
||||
if (defHarm < 0 && atkUser.InBlood > 0)
|
||||
{
|
||||
decimal inBloodRide = atkUser.InBlood - defUser.Punish;
|
||||
if (inBloodRide > 0)
|
||||
{
|
||||
atkHarm += Convert.ToInt32((0 - defHarm) * inBloodRide);
|
||||
}
|
||||
}
|
||||
|
||||
//#region 状态类处理
|
||||
decimal slow = atkUser.Slow - defUser.SlowLess;
|
||||
if (randomTrigger(slow))
|
||||
{
|
||||
stateData.Add("Slow");
|
||||
}
|
||||
|
||||
decimal poison = atkUser.Poison - defUser.PoisonLess;
|
||||
if (randomTrigger(poison))
|
||||
{
|
||||
stateData.Add("Poison");
|
||||
}
|
||||
|
||||
decimal curse = atkUser.Curse - defUser.CurseLess;
|
||||
if (randomTrigger(curse))
|
||||
{
|
||||
stateData.Add("Curse");
|
||||
}
|
||||
|
||||
decimal weaken = atkUser.Weaken - defUser.WeakenLess;
|
||||
if (randomTrigger(weaken))
|
||||
{
|
||||
stateData.Add("Weaken");
|
||||
}
|
||||
|
||||
decimal depressed = atkUser.Depressed - defUser.DepressedLess;
|
||||
if (randomTrigger(depressed))
|
||||
{
|
||||
stateData.Add("Depressed");
|
||||
}
|
||||
|
||||
decimal breach = atkUser.Breach - defUser.BreachLess;
|
||||
if (randomTrigger(breach))
|
||||
{
|
||||
stateData.Add("Breach");
|
||||
}
|
||||
|
||||
decimal palsyatk = atkUser.PalsyAtk - defUser.PalsyAtkLess;
|
||||
if (randomTrigger(palsyatk))
|
||||
{
|
||||
stateData.Add("PalsyAtk");
|
||||
}
|
||||
|
||||
if (randomTrigger(atkUser.Del_Fashion))
|
||||
{
|
||||
if (defUser.code == nameof(UserEnum.AttrCode.Person))
|
||||
{
|
||||
remData.Add(new FightRemoveData()
|
||||
{
|
||||
code = "Equ",
|
||||
par = "Fashion",
|
||||
count = 1
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//#endregion
|
||||
|
||||
return new UnitFightResult()
|
||||
{
|
||||
atkHarm = atkHarm,
|
||||
defHarm = defHarm,
|
||||
stateData = stateData,
|
||||
remData = remData
|
||||
};
|
||||
}
|
||||
|
||||
private static bool randomTrigger(decimal rate)
|
||||
{
|
||||
Random random = new Random();
|
||||
double rand = random.NextDouble();
|
||||
return rand < Convert.ToDouble(rate);
|
||||
}
|
||||
}
|
||||
|
||||
public class UnitFightResult
|
||||
{
|
||||
public int atkHarm { get; set; }
|
||||
public int defHarm { get; set; }
|
||||
public List<string> stateData { get; set; }
|
||||
public List<FightRemoveData> remData { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user