diff --git a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs
index 4414c63..9123c9c 100644
--- a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs
@@ -67,4 +67,62 @@
return damage;
}
+
+ ///
+ /// 武器初始散射值增量
+ ///
+ public float WeaponMinScatteringRangeIncrement = 0;
+
+ ///
+ /// 武器最终散射值增量
+ ///
+ public float WeaponFinalScatteringRangeIncrement = 0;
+
+ ///
+ /// 武器开火发射子弹最大数量
+ ///
+ public event Action> CalcWeaponFireBulletCount;
+ public int CallCalcWeaponFireBulletCount(Weapon weapon, int count)
+ {
+ if (CalcWeaponFireBulletCount != null)
+ {
+ var result = new RefValue(count);
+ CalcWeaponFireBulletCount(weapon, result);
+ return result.Value;
+ }
+
+ return count;
+ }
+
+ ///
+ /// 子弹速度
+ ///
+ public event Action> CalcBulletSpeed;
+ public float CallCalcBulletSpeed(Weapon weapon, float speed)
+ {
+ if (CalcBulletSpeed != null)
+ {
+ var result = new RefValue(speed);
+ CalcBulletSpeed(weapon, result);
+ return result.Value;
+ }
+
+ return speed;
+ }
+
+ ///
+ /// 子弹射程
+ ///
+ public event Action> CalcBulletDistance;
+ public float CallBulletDistance(Weapon weapon, float distance)
+ {
+ if (CalcBulletDistance != null)
+ {
+ var result = new RefValue(distance);
+ CalcBulletDistance(weapon, result);
+ return result.Value;
+ }
+
+ return distance;
+ }
}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs
index 2b74d67..6d05203 100644
--- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs
+++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs
@@ -238,7 +238,7 @@
{
if (_weaponAttributeMap.TryGetValue(itemId, out var attr))
{
- return attr;
+ return attr.Clone();
}
throw new Exception($"武器'{itemId}'没有在 Weapon 表中配置属性数据!");
@@ -422,8 +422,7 @@
//攻击冷却计时
_attackTimer = _attackTimer > 0 ? _attackTimer - delta : 0;
//武器的当前散射半径
- CurrScatteringRange = Mathf.Max(CurrScatteringRange - Attribute.ScatteringRangeBackSpeed * delta,
- Attribute.StartScatteringRange);
+ ScatteringRangeBackHandler(delta);
//松开扳机
if (_triggerFlag || _downTimer > 0)
{
@@ -620,8 +619,7 @@
//散射值销退
if (_noAttackTime >= Attribute.ScatteringRangeBackDelayTime)
{
- CurrScatteringRange = Mathf.Max(CurrScatteringRange - Attribute.ScatteringRangeBackSpeed * delta,
- Attribute.StartScatteringRange);
+ ScatteringRangeBackHandler(delta);
}
_triggerTimer = _triggerTimer > 0 ? _triggerTimer - delta : 0;
@@ -937,8 +935,8 @@
}
//开火添加散射值
- CurrScatteringRange = Mathf.Min(CurrScatteringRange + Attribute.ScatteringRangeAddValue,
- Attribute.FinalScatteringRange);
+ ScatteringRangeAddHandler();
+
//武器的旋转角度
tempAngle -= Attribute.UpliftAngle;
RotationDegrees = tempAngle;
@@ -1297,6 +1295,50 @@
}
}
+ //散射值消退处理
+ private void ScatteringRangeBackHandler(float delta)
+ {
+ var startScatteringRange = Attribute.StartScatteringRange;
+ var finalScatteringRange = Attribute.FinalScatteringRange;
+ if (Master != null)
+ {
+ startScatteringRange += Master.RoleState.WeaponMinScatteringRangeIncrement;
+ finalScatteringRange += Master.RoleState.WeaponFinalScatteringRangeIncrement;
+ }
+ if (startScatteringRange <= finalScatteringRange)
+ {
+ CurrScatteringRange = Mathf.Max(CurrScatteringRange - Attribute.ScatteringRangeBackSpeed * delta,
+ startScatteringRange);
+ }
+ else
+ {
+ CurrScatteringRange = Mathf.Min(CurrScatteringRange + Attribute.ScatteringRangeBackSpeed * delta,
+ startScatteringRange);
+ }
+ }
+
+ //散射值添加处理
+ private void ScatteringRangeAddHandler()
+ {
+ var startScatteringRange = Attribute.StartScatteringRange;
+ var finalScatteringRange = Attribute.FinalScatteringRange;
+ if (Master != null)
+ {
+ startScatteringRange += Master.RoleState.WeaponMinScatteringRangeIncrement;
+ finalScatteringRange += Master.RoleState.WeaponFinalScatteringRangeIncrement;
+ }
+ if (startScatteringRange <= finalScatteringRange)
+ {
+ CurrScatteringRange = Mathf.Min(CurrScatteringRange + Attribute.ScatteringRangeAddValue,
+ finalScatteringRange);
+ }
+ else
+ {
+ CurrScatteringRange = Mathf.Min(CurrScatteringRange - Attribute.ScatteringRangeAddValue,
+ finalScatteringRange);
+ }
+ }
+
//停止当前的换弹状态
private void StopReloadState()
{