|
|
|
@@ -15,35 +15,15 @@ namespace GameClass.GameObj |
|
|
|
/// </summary> |
|
|
|
private class BuffManager |
|
|
|
{ |
|
|
|
[StructLayout(LayoutKind.Explicit, Size = 8)] |
|
|
|
private struct BuffValue // buff参数联合体类型,可能是int或double |
|
|
|
{ |
|
|
|
[FieldOffset(0)] |
|
|
|
public int iValue; |
|
|
|
[FieldOffset(0)] |
|
|
|
public double lfValue; |
|
|
|
|
|
|
|
public BuffValue(int intValue) |
|
|
|
{ |
|
|
|
this.lfValue = 0.0; |
|
|
|
this.iValue = intValue; |
|
|
|
} |
|
|
|
public BuffValue(double longFloatValue) |
|
|
|
{ |
|
|
|
this.iValue = 0; |
|
|
|
this.lfValue = longFloatValue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// buff列表 |
|
|
|
/// </summary> |
|
|
|
private readonly LinkedList<BuffValue>[] buffList; |
|
|
|
private readonly LinkedList<double>[] buffList; |
|
|
|
private readonly object[] buffListLock; |
|
|
|
|
|
|
|
private void AddBuff(BuffValue bf, int buffTime, BuffType buffType, Action ReCalculateFunc) |
|
|
|
private void AddBuff(double bf, int buffTime, BuffType buffType, Action ReCalculateFunc) |
|
|
|
{ |
|
|
|
LinkedListNode<BuffValue> buffNode; |
|
|
|
LinkedListNode<double> buffNode; |
|
|
|
lock (buffListLock[(int)buffType]) |
|
|
|
{ |
|
|
|
buffNode = buffList[(int)buffType].AddLast(bf); |
|
|
|
@@ -80,13 +60,13 @@ namespace GameClass.GameObj |
|
|
|
{ |
|
|
|
foreach (var add in buffList[(int)buffType]) |
|
|
|
{ |
|
|
|
times *= add.lfValue; |
|
|
|
times *= add; |
|
|
|
} |
|
|
|
} |
|
|
|
return Math.Max(Math.Min((int)Math.Round(orgVal * times), maxVal), minVal); |
|
|
|
} |
|
|
|
|
|
|
|
public void AddMoveSpeed(double add, int buffTime, Action<int> SetNewMoveSpeed, int orgMoveSpeed) => AddBuff(new BuffValue(add), buffTime, BuffType.AddSpeed, () => SetNewMoveSpeed(ReCalculateFloatBuff(BuffType.AddSpeed, orgMoveSpeed, GameData.MaxSpeed, GameData.MinSpeed))); |
|
|
|
public void AddMoveSpeed(double add, int buffTime, Action<int> SetNewMoveSpeed, int orgMoveSpeed) => AddBuff(add, buffTime, BuffType.AddSpeed, () => SetNewMoveSpeed(ReCalculateFloatBuff(BuffType.AddSpeed, orgMoveSpeed, GameData.MaxSpeed, GameData.MinSpeed))); |
|
|
|
public bool HasFasterSpeed |
|
|
|
{ |
|
|
|
get |
|
|
|
@@ -98,7 +78,7 @@ namespace GameClass.GameObj |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void AddShield(int shieldTime) => AddBuff(new BuffValue(), shieldTime, BuffType.Shield, () => |
|
|
|
public void AddShield(int shieldTime) => AddBuff(0, shieldTime, BuffType.Shield, () => |
|
|
|
{ }); |
|
|
|
public bool HasShield |
|
|
|
{ |
|
|
|
@@ -123,7 +103,7 @@ namespace GameClass.GameObj |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
public void AddAp(int time) => AddBuff(new BuffValue(), time, BuffType.AddAp, () => { }); |
|
|
|
public void AddAp(int time) => AddBuff(0, time, BuffType.AddAp, () => { }); |
|
|
|
public bool HasAp |
|
|
|
{ |
|
|
|
get |
|
|
|
@@ -147,7 +127,7 @@ namespace GameClass.GameObj |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
public void AddLife(int totelTime) => AddBuff(new BuffValue(), totelTime, BuffType.AddLife, () => |
|
|
|
public void AddLife(int totelTime) => AddBuff(0, totelTime, BuffType.AddLife, () => |
|
|
|
{ }); |
|
|
|
public bool HasLIFE |
|
|
|
{ |
|
|
|
@@ -172,7 +152,7 @@ namespace GameClass.GameObj |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
public void AddSpear(int spearTime) => AddBuff(new BuffValue(), spearTime, BuffType.Spear, () => |
|
|
|
public void AddSpear(int spearTime) => AddBuff(0, spearTime, BuffType.Spear, () => |
|
|
|
{ }); |
|
|
|
public bool HasSpear |
|
|
|
{ |
|
|
|
@@ -210,7 +190,7 @@ namespace GameClass.GameObj |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
public void AddClairaudience(int shieldTime) => AddBuff(new BuffValue(), shieldTime, BuffType.Clairaudience, () => |
|
|
|
public void AddClairaudience(int shieldTime) => AddBuff(0, shieldTime, BuffType.Clairaudience, () => |
|
|
|
{ }); |
|
|
|
public bool HasClairaudience |
|
|
|
{ |
|
|
|
@@ -223,7 +203,7 @@ namespace GameClass.GameObj |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void AddInvisible(int shieldTime) => AddBuff(new BuffValue(), shieldTime, BuffType.Invisible, () => |
|
|
|
public void AddInvisible(int shieldTime) => AddBuff(0, shieldTime, BuffType.Invisible, () => |
|
|
|
{ }); |
|
|
|
public bool HasInvisible |
|
|
|
{ |
|
|
|
@@ -253,12 +233,12 @@ namespace GameClass.GameObj |
|
|
|
public BuffManager() |
|
|
|
{ |
|
|
|
var buffTypeArray = Enum.GetValues(typeof(BuffType)); |
|
|
|
buffList = new LinkedList<BuffValue>[buffTypeArray.Length]; |
|
|
|
buffList = new LinkedList<double>[buffTypeArray.Length]; |
|
|
|
buffListLock = new object[buffList.Length]; |
|
|
|
int i = 0; |
|
|
|
foreach (BuffType type in buffTypeArray) |
|
|
|
{ |
|
|
|
buffList[i] = new LinkedList<BuffValue>(); |
|
|
|
buffList[i] = new LinkedList<double>(); |
|
|
|
buffListLock[i++] = new object(); |
|
|
|
} |
|
|
|
} |
|
|
|
|