2
This commit is contained in:
@@ -17,7 +17,7 @@ namespace WulaFallenEmpire
|
||||
public ThingDef turretDef;
|
||||
public float angleOffset;
|
||||
public bool autoAttack = true;
|
||||
public bool defaultEnabled = true; // 新增:默认启用状态
|
||||
public bool defaultEnabled = true;
|
||||
}
|
||||
|
||||
[StaticConstructorOnStartup]
|
||||
@@ -87,31 +87,28 @@ namespace WulaFallenEmpire
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override void CompPostTick(ref float severityAdjustment)
|
||||
{
|
||||
base.CompPostTick(ref severityAdjustment);
|
||||
|
||||
if (!TurretEnabled)
|
||||
{
|
||||
ResetCurrentTarget();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.CanShoot)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// 优先处理手动目标
|
||||
if (HasManualTarget && CanAttackManualTarget)
|
||||
{
|
||||
LocalTargetInfo manualTarget = VolleyTargetManager.GetVolleyTarget(Pawn);
|
||||
this.currentTarget = manualTarget;
|
||||
this.curRotation = (manualTarget.Cell.ToVector3Shifted() - this.Pawn.DrawPos).AngleFlat() + this.Props.angleOffset;
|
||||
}
|
||||
else if (this.currentTarget.IsValid)
|
||||
|
||||
if (this.currentTarget.IsValid)
|
||||
{
|
||||
this.curRotation = (this.currentTarget.Cell.ToVector3Shifted() - this.Pawn.DrawPos).AngleFlat() + this.Props.angleOffset;
|
||||
}
|
||||
|
||||
this.AttackVerb.VerbTick();
|
||||
|
||||
if (this.AttackVerb.state != VerbState.Bursting)
|
||||
{
|
||||
if (this.WarmingUp)
|
||||
@@ -125,14 +122,6 @@ namespace WulaFallenEmpire
|
||||
this.lastAttackTargetTick = Find.TickManager.TicksGame;
|
||||
this.lastAttackedTarget = this.currentTarget;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果手动攻击失败且目标无效,清除手动目标
|
||||
if (HasManualTarget && !CanAttackManualTarget)
|
||||
{
|
||||
VolleyTargetManager.ClearVolleyTarget(Pawn);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -142,68 +131,30 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
this.burstCooldownTicksLeft--;
|
||||
}
|
||||
|
||||
if (this.burstCooldownTicksLeft <= 0 && this.Pawn.IsHashIntervalTick(10))
|
||||
{
|
||||
// 如果手动目标无效,清除它
|
||||
if (HasManualTarget && !CanAttackManualTarget)
|
||||
// 自动寻找目标
|
||||
this.currentTarget = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(this, TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable, null, 0f, 9999f);
|
||||
|
||||
if (this.currentTarget.IsValid)
|
||||
{
|
||||
VolleyTargetManager.ClearVolleyTarget(Pawn);
|
||||
}
|
||||
// 只有在没有有效的手动目标时才寻找新目标
|
||||
if (!HasManualTarget || !CanAttackManualTarget)
|
||||
{
|
||||
this.currentTarget = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(this, TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable, null, 0f, 9999f);
|
||||
if (this.currentTarget.IsValid)
|
||||
{
|
||||
this.burstWarmupTicksLeft = 1;
|
||||
return;
|
||||
}
|
||||
this.burstWarmupTicksLeft = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
this.ResetCurrentTarget();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 检查是否有手动目标
|
||||
private bool HasManualTarget
|
||||
{
|
||||
get
|
||||
{
|
||||
LocalTargetInfo manualTarget = VolleyTargetManager.GetVolleyTarget(Pawn);
|
||||
return manualTarget.IsValid;
|
||||
}
|
||||
}
|
||||
// 检查是否可以攻击手动目标
|
||||
private bool CanAttackManualTarget
|
||||
{
|
||||
get
|
||||
{
|
||||
LocalTargetInfo manualTarget = VolleyTargetManager.GetVolleyTarget(Pawn);
|
||||
if (!manualTarget.IsValid)
|
||||
return false;
|
||||
// 检查目标是否在射程内
|
||||
float distance = Pawn.Position.DistanceTo(manualTarget.Cell);
|
||||
if (distance > AttackVerb.verbProps.range)
|
||||
return false;
|
||||
// 检查是否可以命中目标
|
||||
if (!AttackVerb.CanHitTarget(manualTarget))
|
||||
return false;
|
||||
// 检查目标是否还活着(如果是生物)
|
||||
if (manualTarget.Thing is Pawn targetPawn && (targetPawn.Dead || targetPawn.Downed))
|
||||
return false;
|
||||
// 检查目标是否被摧毁(如果是建筑)
|
||||
if (manualTarget.Thing != null && manualTarget.Thing.Destroyed)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// 简化的Gizmos - 只有设置目标和清除目标按钮
|
||||
|
||||
// 简化的Gizmos - 只有开关按钮
|
||||
public override IEnumerable<Gizmo> CompGetGizmos()
|
||||
{
|
||||
// 只有 pawn 被选中且是玩家派系时才显示按钮
|
||||
if (this.Pawn.Faction == Faction.OfPlayer && Find.Selector.IsSelected(this.Pawn))
|
||||
{
|
||||
// 原有开关按钮
|
||||
yield return new Command_Toggle
|
||||
{
|
||||
defaultLabel = "CommandToggleTurret".Translate(),
|
||||
@@ -213,75 +164,33 @@ namespace WulaFallenEmpire
|
||||
toggleAction = () => TurretEnabled = !TurretEnabled,
|
||||
hotKey = KeyBindingDefOf.Misc1
|
||||
};
|
||||
// 设置目标按钮
|
||||
yield return new Command_Action
|
||||
{
|
||||
defaultLabel = "CommandSetTarget".Translate(),
|
||||
defaultDesc = "CommandSetTargetDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Gizmos/SetTarget"),
|
||||
action = () =>
|
||||
{
|
||||
Find.Targeter.BeginTargeting(
|
||||
CreateTargetingParameters(),
|
||||
delegate (LocalTargetInfo target)
|
||||
{
|
||||
VolleyTargetManager.SetVolleyTarget(Pawn, target);
|
||||
},
|
||||
Pawn, // caster 参数
|
||||
null, // actionWhenFinished
|
||||
null, // mouseAttachment
|
||||
true // requiresCastedSelected
|
||||
);
|
||||
},
|
||||
hotKey = KeyBindingDefOf.Misc2
|
||||
};
|
||||
// 清除目标按钮(只在有手动目标时显示)
|
||||
LocalTargetInfo currentTarget = VolleyTargetManager.GetVolleyTarget(Pawn);
|
||||
if (currentTarget.IsValid)
|
||||
{
|
||||
yield return new Command_Action
|
||||
{
|
||||
defaultLabel = "CommandClearTarget".Translate(),
|
||||
defaultDesc = "CommandClearTargetDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Gizmos/ClearTarget"),
|
||||
action = () => VolleyTargetManager.ClearVolleyTarget(Pawn),
|
||||
hotKey = KeyBindingDefOf.Misc3
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
// 创建目标参数
|
||||
private TargetingParameters CreateTargetingParameters()
|
||||
{
|
||||
return TargetingParameters.ForThing();
|
||||
}
|
||||
// 在提示中显示目标状态
|
||||
|
||||
// 简化的提示信息
|
||||
public override string CompTipStringExtra
|
||||
{
|
||||
get
|
||||
{
|
||||
string baseString = base.CompTipStringExtra;
|
||||
string turretStatus = TurretEnabled ? "Turret: Active" : "Turret: Inactive";
|
||||
string targetStatus = "Manual Target: ";
|
||||
LocalTargetInfo manualTarget = VolleyTargetManager.GetVolleyTarget(Pawn);
|
||||
if (manualTarget.IsValid)
|
||||
string targetStatus = "Target: ";
|
||||
|
||||
if (this.currentTarget.IsValid)
|
||||
{
|
||||
targetStatus += $"{manualTarget.Thing?.LabelCap ?? manualTarget.Cell.ToString()}";
|
||||
if (!CanAttackManualTarget)
|
||||
{
|
||||
targetStatus += " (Unreachable)";
|
||||
}
|
||||
targetStatus += $"{this.currentTarget.Thing?.LabelCap ?? this.currentTarget.Cell.ToString()}";
|
||||
}
|
||||
else
|
||||
{
|
||||
targetStatus += "None";
|
||||
}
|
||||
|
||||
string result = turretStatus + "\n" + targetStatus;
|
||||
return string.IsNullOrEmpty(baseString) ? result : baseString + "\n" + result;
|
||||
}
|
||||
}
|
||||
|
||||
// 新增:炮塔启用状态
|
||||
// 炮塔启用状态
|
||||
public bool TurretEnabled
|
||||
{
|
||||
get { return turretEnabled; }
|
||||
@@ -299,7 +208,7 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
get
|
||||
{
|
||||
// 新增:检查炮塔是否启用
|
||||
// 检查炮塔是否启用
|
||||
if (!TurretEnabled)
|
||||
return false;
|
||||
|
||||
@@ -361,7 +270,7 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
base.CompPostMake();
|
||||
this.MakeGun();
|
||||
// 新增:设置默认启用状态
|
||||
// 设置默认启用状态
|
||||
TurretEnabled = Props.defaultEnabled;
|
||||
}
|
||||
|
||||
@@ -384,6 +293,7 @@ namespace WulaFallenEmpire
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private void ResetCurrentTarget()
|
||||
{
|
||||
this.currentTarget = LocalTargetInfo.Invalid;
|
||||
@@ -398,7 +308,7 @@ namespace WulaFallenEmpire
|
||||
Scribe_TargetInfo.Look(ref this.currentTarget, "currentTarget");
|
||||
Scribe_Deep.Look<Thing>(ref this.gun, "gun", Array.Empty<object>());
|
||||
Scribe_Values.Look<bool>(ref this.fireAtWill, "fireAtWill", true, false);
|
||||
// 新增:保存启用状态
|
||||
// 保存启用状态
|
||||
Scribe_Values.Look<bool>(ref this.turretEnabled, "turretEnabled", Props.defaultEnabled, false);
|
||||
|
||||
if (Scribe.mode == LoadSaveMode.PostLoadInit)
|
||||
@@ -415,8 +325,6 @@ namespace WulaFallenEmpire
|
||||
|
||||
private const int StartShootIntervalTicks = 10;
|
||||
|
||||
private static readonly CachedTexture ToggleTurretIcon = new CachedTexture("UI/Gizmos/ToggleTurret");
|
||||
|
||||
public Thing gun;
|
||||
protected int burstCooldownTicksLeft;
|
||||
protected int burstWarmupTicksLeft;
|
||||
@@ -426,10 +334,10 @@ namespace WulaFallenEmpire
|
||||
private int lastAttackTargetTick;
|
||||
private float curRotation;
|
||||
|
||||
// 新增:炮塔启用状态字段
|
||||
// 炮塔启用状态字段
|
||||
private bool turretEnabled = true;
|
||||
|
||||
[Unsaved(false)]
|
||||
public Material turretMat;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user