From b43ad0498568edc5e80080987f63b2d21dcc160a Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Wed, 20 Aug 2025 15:19:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/WulaFallenEmpire.dll | Bin 227840 -> 229888 bytes ...A_Weapon_Homing_Examples_Bullet_Homing.xml | 31 +- ...Homing_Examples_Bullet_HomingExplosive.xml | 24 +- Source/WulaFallenEmpire/Projectile_Homing.cs | 13 +- .../WulaFallenEmpire/Projectile_PoiBullet.cs | 726 ++++++++++++++++++ .../Projectile_TrackingBullet.cs | 159 ++++ Source/WulaFallenEmpire/TrackingBulletDef.cs | 10 + .../WulaFallenEmpire/WulaFallenEmpire.csproj | 2 + 8 files changed, 914 insertions(+), 51 deletions(-) create mode 100644 Source/WulaFallenEmpire/Projectile_PoiBullet.cs create mode 100644 Source/WulaFallenEmpire/Projectile_TrackingBullet.cs create mode 100644 Source/WulaFallenEmpire/TrackingBulletDef.cs diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 5993a73fc134fe3f62bdb3d9e749e9577aa440f3..ef72ddc5f75e6083801f70a8a588ead085e067de 100644 GIT binary patch delta 75772 zcma&P2YeLO`aV8qcC$$~1=2%0frKHOgx>R1igM zS4Aw?EA|rWwIKF(Ef?FhhyU}uGn;JC`~Cg#<2mOo=RNOv&wJieW_Hr}V_M@`>6e^W z{#nWGZ)o1X547^K6xChR&h%+oz(qcO#paujNndq^Pn$}_4xhHqx4C0h>Z3j_74Xp@ z6xkj1YI~0A5`5-#R4fDfO#1>AQuX#ds*7s0532GG*MpJ&#^HZmOVEBfUupBxbxk=v z>U{n7PSb-4(Gj}luc*nZY#5G0b6|_E1?uK&TCk##6vMA+p(;(w>h9BKK}xcwWz<~( zo?yUdjRJ$F8|l!y;i$G^E~l8|L<}k6<58@1Sp&_1D`Qk6!G1e2KY6PsaJ2nf;!d^A zzB=iW%&R=y7&elr0_K>#!;;IDy4pS=_?Wt8Z|9U-^}>;DTXkY`D;h`c{VHvpYPTJj z3f-DSKA$yl@2Yl#+a=xTB4_NqtK)Xiy{=Ffnx57;}( zi`88F;qvY3LHoE)#YY_-Yjh?G&4D}FXiwCvXe7nRfW@qND0wncO#)#999l*&Begm3 zko{1n5Aq&HJz8--s9t+$?h*U0&Lh-(`@fy5kanyXmwS)LH@ih7*zUEX6(xoHJkp#N zQn{uz4g>u@dtb%G!dbw}*t(kTrKZD0(^>ZR%1-u(%8`Y~wB@<0mFF1nbV+&?2v~68 z-j^!3B^EA@ai4@jbKp60FBgf6_nuYTUr&0?WnX1K*}Zn+lD6E>lY66ZlVWs)rNUtqm<62oVMVl72kOEQ<*LwXoh1i~l6m1^1pMc^FpJk=}x}xAmMBYNE7FXgMqS|H+@*tFKyWPwrKL zw650-q)+v#OmERWsX6eH?)-DG%D3O^nG`r)3!o!=%X&vu(m}L>p)vRF?(;OHQ&b1UisxGBYQ@g1O1ff$#RdJZijNcoAzb0&GH|Iq)NO zKM36`8ZX-0YiyaW{%apSenh{ELCu?EF-tU=<~HjvOKMW}VAwp-yaXuYPKjX$i_)~n zGdbESVE4W-etL4*FAy5k0>&Q54R_%T*$j4HWM`hX3hw&r-XSxS64h_^n7LJnmx2;7 zFSSpb`&PM)az#ykWdKaSQ?ZZ^#j;W@5;9WBwt8M+Hml?rwV-7sY8fy&2zz(T+m}#? zc;Tes-dltRP|mjNLQ49W+F-NNAPUASVSp6mxE7|^Y&_kJC| zTUQzO&d6-F+x|V$4{5KuUWGTrBjj?7rM*tb>>q^RW9(rUSaUV?=}WV1{64-AJHdZvS18QT41_=T6VJ!BbB7(rS*Rqa|A>?dwusRvY1~% zSra1^Y{1-bjqwr+&4JO7Sof=Rc zD%XB%eTUj{oXqt_wn2?cB zovdYN1^SQ2j1QQv+xo^H>UF#K#vX&oXlOppy^Lg!>v`!iDV_pSqyoku*vG)Avj?x+ z*KW+Mn8IE&s5Ky%x#oBkh33E{5_GUuG`_a?z{YP9W={2Vd;|1Ag7qddzx6L

K*@ zho&|A+L0WGD%~!+#8PQ{w_dU}Rb65Cxw@O$VlTe>`?PsV^Uu+Z)6qF|o_*3aBh^Ct z#%qS0I2(AQ6e5f|B-UtvSi$STreT$rWquNJ9m_n{r13D2`3;k+SmkOY=t(e8ov-N) z??5L#JQvh8V>L}#M~SS4ckTJxSExDmbK7h4uR#S`U>K4|hZ)-e&J89SJM8v5O4YS? z_Z{cv>?Ce3LW5WeNhA2|7j_KFz77<GP8EumtQ*?tM!3vPfVQ;4$lPh?TI@(c08hraU*Kv9iLa5-NLnLXI?uImuu|? zF*6BG?%jEwI@TV1UH3VU=$h6bmN6P>F|SbsMX4hixIr;3xjJ3bbHf{89j*TbsOL6O z-QH_z5p=_p45?hMTlTK&Iz~?bsu@95ynBEqD_O2JRysjX%?h}6>rVtqdY+Z2huPf81;m=5!ot5e#7Yi~RO=MCkZvtUAtPX(%B)>@1v2Ox zoR~K|D~SD3VzWQ1eMb9%gAN})470gCwAekj$f4%g!0OEOaDxnm7(zE>O7F2d?#fYj z+WmI*Ogca>O$zU|SMMrMx|408y1i}Jv~1RPM=L8kBfC09)5CY!hj(?cjT<^=+zn!C z2ySkUM9Yccd+Y@_j8Vtg*WXZ?ejIf%Bnsvl_u6mW&?nRug}Q67#wy)3QFPT#H1?s4 z)b79g0H$irjl0!-_Cq(8WZqAn__=o9-fwQ4uP~7(+PZ*RRe;G0UInHzFv=EQgO@fM(38 zU`6a{DH{$rQZlh1;W&bo<1XlHJdK%~lxSQDOlqbt$-Ey(%zh1fy$48t5Q(1LVwU;n z;x_QQVT;P@#zh=>s;g^dsEA4Sf5t4(tFpRdGl`jXj_|rZV@|UFy`wn#ci{#Nx}(?H z33|QQkmkT~A|WFnm9i2u6OCQKm4`Do4s6zC7del^M(&J6 z&rVaKfTVMtn44prHP)bHNsr@NXfe!R?9wu4yfKyPGRo}y!_fF#>AZ0gT+W1woEe}z)C_7Qh!nH|^+{a=#@-NfYiX0ZL`?$C<3$)i;b)$=S$){V18 zwKMhd7hiZ`h&6>c@nDM+KsWlrcJ#Q;8jfe$dDJ_>cpY_&H;@Ezq&40|0jET;&uIbd zYyUY)O}AIx)+^;05Yh|M3w84tyYp@1{|0;OZTW)j7EP>sON7PMVeO*y;`EaA((G)b z3}no%yxBNmnKM8`oW-ekU}N*)!@4;W2&_ju7Y*19GsCvCfHJnCR!ydKOE+=Y@z-So z6H4*O?*PE+<4YVO&1WPTm&2W89SRN6ums@>AcWON=?V~j?&R{ge;>p*W)}i!r~T525gumJB8B0rKi`0xS`-a0hPHR>v?%D?nJxs zj_eTEPu6MVj;3*#7{lWFDS|X0ag3#ftR>{fS?={ajFj`mXMO$z<6%2-Pwz5ZhJ@1U zKA`OoQ?Y)D>3O`w6$=pdygikw!QQZ^&-_zCG!}xN(m4bK;7q%TG2>K!;fvri%9-L$fOvH?5sOK(nk!jf4;L)UpB-p-J73u?GSBMC?T@T z9=3P%m;Budcu*L(3o)o`X*b?!tN>BFx&$C!_K&CNQey5$(GJzGe6)qv9I#O zaFAlUO!gUf6(*ew{)|*}nSIq=^-;l769abzA?_xsJ8F@K(41Fi0;Z<1l?j{<8?*$S zc5khA600F-@u-oJk-^#(L;q)OEM;0Q;=e0kr5cTf7kfjNnUOgFc5D$(qcr?CHZVV- z&>TP@4%8*1Qx%P*7)wysSZW`*yEOY0us0`g>~k}6t5da%9CNwd?w%{v$@We6%uKlv zN*PPhkH}kg;=R_mBS$QJ8%9hwS3yeMuGYcR!?zMI)Vd5b96zY#9J3ehEnKh~wRFD~ zK~|*|;{Fd-(JrJlWr`SE*+Yvmf185;&7~JKg?dU%x12MledW*m2;nNfA;M(4duW-9K3r7xiHQQJYtGk^8 zN_y;}*ejr(|Qwuh z2c{%nLJ}w|?4KT}&b~f2Kxv`eNYZfJ>|OYo-RHqj6bl!3fH?H}jg_24Jt03B(gJd4 zf&(vClPn($S!{ty2gUh=Rrg(A>BRUJ-_= zgO$MSaWN@C`H0eu`|W=}STg>FbFB&~}Szc~lUap~2RhMYKO=}9D`7acE zWk*hd$;82Vq&^C`P-f%~`;Ui?PTfMG4On8Z@3QAVT&y_$O(z8NzA%Ox~qTMyB`^ze;Q>C1-mf}NmiN&hjZA6AE{Bd*)@+A zdzEgpr$5?%Mr;-!WVDC{24Y7p5kr%e)MWk1I4 zZ^y?&l{o)neF%@GQrNia<{3cD%}Vgs=%G4)-FL8RMdSlJ^7t5i=?MG&$4^s_*gc=9 zN_S*Pk>(4xCHZu0y4YMpBG*cKS1w z9k6%F(ER@J8W4OEkd4zA@J_cUKa-cd%^T7e>=n=CSD)t&erL+{S(V7D`j)nL7fUJ) z6VTVWEL>&pd8W7ehyB?z1JoII*|VjYd#Ivpk|4fVi<~mbp8jm#qAsIxsxs=)I+xn( z5Fxdy4Mr2j#5~`=?%74rtHqdCLp(Mw!N35yl*(%)LfBFgP23OojaN~nZa%M?DSAdy_%ZYjxMYcd4K_qJ zT!jQrDR2vCykoC;ex%xN?|FX0V6oqMprs_nF1hoy$Y|KQ?2BL^Xk3Pgt>vcmzgae% zflxoK0b6oN(i^U^`@PUDbPb@3mf>Ir^=kGBF?Vxyi4;0)uFjD{{^pw0hVAy|7qX(P zU9h>vSBU3lNB3tJ+t$fzTL;`7He)<_YstIyj09mXgoL7y%0D_(?=|2x*-|}MnvAcG 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 z%0DNveR$4Hn#A%Wa^!H_!*g|WMcQn^V!;x@Wy+aJEVf&@2<#BtDY(b$Kba*+U3}ss zxbAHly(0^lPU>8%iXmF}DG+BynK6ZhJ8(c6en33V9n50zfx^8Wf-!#ZxvTXo7ZEvv zvjvLm$0;o#kHo91E0`^yk=<-k=h8htcExy;?iFF0Hr9{{vgkE$9FM delta 73843 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/Projectile/Bullet_Big Graphic_Single - WulaFallenEmpire.Projectile_Homing + WulaFallenEmpire.Projectile_TrackingBullet 30 Bullet 15 - 1.5 0.5 - Explosion_Blasting - Impact_Metal - false - 0.5 - 0.5 - 0 - 0.5 - false - 0.5 - 1 - 0.1 - true - true + 1.5 -

  • +
  • + 0.5 10 - 0.05 - 60 - 1.5 - 0.8 - Bullet_ExampleHoming - 0.05 - - 20 - 40 - - WULA_GunTail_Smoke
  • diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon_Homing_Examples_Bullet_HomingExplosive.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon_Homing_Examples_Bullet_HomingExplosive.xml index 153f8455..b6c7a27f 100644 --- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon_Homing_Examples_Bullet_HomingExplosive.xml +++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon_Homing_Examples_Bullet_HomingExplosive.xml @@ -68,18 +68,15 @@ Things/Projectile/Bullet_Big Graphic_Single - WulaFallenEmpire.Projectile_Homing_Explosive + WulaFallenEmpire.Projectile_TrackingBullet 25 Bomb 30 - 2.0 0.7 - Explosion_Bomb - Impact_Metal - true - 0.8 + 2.0 3.0 + 60 1.0 true 1.0 @@ -89,19 +86,10 @@ true -
  • +
  • + 0.5 5 - 0.03 - 90 - 2.0 - 0.7 - Bullet_ExampleHomingExplosive - 0.03 - - 20 - 30 - - WULA_GunTail_Smoke +
  • diff --git a/Source/WulaFallenEmpire/Projectile_Homing.cs b/Source/WulaFallenEmpire/Projectile_Homing.cs index 9243a528..fbf42bcd 100644 --- a/Source/WulaFallenEmpire/Projectile_Homing.cs +++ b/Source/WulaFallenEmpire/Projectile_Homing.cs @@ -91,8 +91,6 @@ namespace WulaFallenEmpire { curSpeed = vector * HomingDef.SpeedRangeTilesPerTickOverride.RandomInRange; } - ticksToImpact = int.MaxValue; - lifetime = int.MaxValue; ReflectInit(); } @@ -208,6 +206,12 @@ namespace WulaFallenEmpire { ThingWithCompsTick(); lifetime--; + + if (lifetime <= 0) + { + Destroy(); + return; + } // 处理拖尾特效 if (HomingDef != null && HomingDef.tailFleckDef != null) @@ -239,10 +243,7 @@ namespace WulaFallenEmpire } lastTickPosition = ExactPosition; // 更新上一帧位置 - if (landed) - { - return; - } + // 移除 if (landed) return; 以确保子弹落地后也能正常销毁 Vector3 exactPosition = ExactPosition; ticksToImpact--; MovementTick(); diff --git a/Source/WulaFallenEmpire/Projectile_PoiBullet.cs b/Source/WulaFallenEmpire/Projectile_PoiBullet.cs new file mode 100644 index 00000000..d62e8452 --- /dev/null +++ b/Source/WulaFallenEmpire/Projectile_PoiBullet.cs @@ -0,0 +1,726 @@ +using System; +using System.Collections.Generic; +using RimWorld; +using UnityEngine; +using Verse; +using Verse.Sound; +using System.Reflection; +using Verse.AI; + +namespace WulaFallenEmpire +{ + public class Projectile_PoiBullet : Bullet + { + // Projectile_Homing 的字段 + private HomingProjectileDef homingDefInt; + private Sustainer ambientSustainer; + private List comps; + protected Vector3 exactPositionInt; + public Vector3 curSpeed; + public bool homing = true; + private int Fleck_MakeFleckTick; + private Vector3 lastTickPosition; + + // Projectile_Homing_Explosive 的字段 + private int ticksToDetonation; + + private static class NonPublicFields + { + public static FieldInfo Projectile_AmbientSustainer = typeof(Projectile).GetField("ambientSustainer", BindingFlags.Instance | BindingFlags.NonPublic); + public static FieldInfo ThingWithComps_comps = typeof(ThingWithComps).GetField("comps", BindingFlags.Instance | BindingFlags.NonPublic); + public static MethodInfo ProjectileCheckForFreeInterceptBetween = typeof(Projectile).GetMethod("CheckForFreeInterceptBetween", BindingFlags.Instance | BindingFlags.NonPublic); + } + + public HomingProjectileDef HomingDef + { + get + { + if (homingDefInt == null) + { + homingDefInt = def.GetModExtension(); + if (homingDefInt == null) + { + Log.ErrorOnce($"HomingProjectileDef for {this.def.defName} is null. Creating a default instance.", this.thingIDNumber ^ 0x12345678); + this.homingDefInt = new HomingProjectileDef(); + } + } + return homingDefInt; + } + } + + public override Vector3 ExactPosition => exactPositionInt; + + public override Quaternion ExactRotation => Quaternion.LookRotation(curSpeed); + + public override void Launch(Thing launcher, Vector3 origin, LocalTargetInfo usedTarget, LocalTargetInfo intendedTarget, ProjectileHitFlags hitFlags, bool preventFriendlyFire = false, Thing equipment = null, ThingDef targetCoverDef = null) + { + bool flag = false; + if (usedTarget.HasThing && usedTarget.Thing is IAttackTarget) + { + if (Rand.Chance(GetHitChance(usedTarget.Thing))) + { + hitFlags |= ProjectileHitFlags.IntendedTarget; + intendedTarget = usedTarget; + flag = true; + } + } + else if (Rand.Chance(GetHitChance(intendedTarget.Thing))) + { + hitFlags |= ProjectileHitFlags.IntendedTarget; + usedTarget = intendedTarget; + flag = true; + } + if (flag) + { + hitFlags &= ~ProjectileHitFlags.IntendedTarget; + } + base.Launch(launcher, origin, usedTarget, intendedTarget, hitFlags, preventFriendlyFire, equipment, targetCoverDef); + exactPositionInt = origin.Yto0() + Vector3.up * def.Altitude; + lastTickPosition = origin; + Vector3 normalized = (destination - origin).Yto0().normalized; + float degrees = Rand.Range(0f - HomingDef.initRotateAngle, HomingDef.initRotateAngle); + Vector2 v = new Vector2(normalized.x, normalized.z); + v = v.RotatedBy(degrees); + Vector3 vector = new Vector3(v.x, 0f, v.y); + if (!HomingDef.speedRangeOverride.HasValue) + { + curSpeed = vector * def.projectile.SpeedTilesPerTick; + } + else + { + curSpeed = vector * HomingDef.SpeedRangeTilesPerTickOverride.RandomInRange; + } + ReflectInit(); + + // Projectile_PoiBullet 原始逻辑中的部分初始化 + this.flag2 = false; // 重置RandFactor的标志 + this.flag3 = true; // 重置CanHitTarget的标志 + this.CalHit = false; // 重置命中计算结果 + } + + protected void ReflectInit() + { + if (!def.projectile.soundAmbient.NullOrUndefined()) + { + ambientSustainer = (Sustainer)NonPublicFields.Projectile_AmbientSustainer.GetValue(this); + } + comps = (List)NonPublicFields.ThingWithComps_comps.GetValue(this); + } + + public float GetHitChance(Thing thing) + { + if (this.HomingDef == null) + { + Log.ErrorOnce("HomingDef is null for projectile " + this.def.defName + ". Returning default hitChance.", this.thingIDNumber ^ 0x12345678); + return 0.7f; + } + + float hitChance = HomingDef.hitChance; + if (thing == null) + { + return hitChance; + } + if (thing is Pawn pawn) + { + hitChance *= Mathf.Clamp(pawn.BodySize, 0.5f, 1.5f); + if (pawn.GetPosture() != 0) + { + hitChance *= 0.5f; + } + float num = 1f; + switch (equipmentQuality) + { + case QualityCategory.Awful: + num = 0.5f; + break; + case QualityCategory.Poor: + num = 0.75f; + break; + case QualityCategory.Normal: + num = 1f; + break; + case QualityCategory.Excellent: + num = 1.1f; + break; + case QualityCategory.Masterwork: + num = 1.2f; + break; + case QualityCategory.Legendary: + num = 1.3f; + break; + default: + Log.Message("Unknown QualityCategory, returning default qualityFactor = 1"); + break; + } + hitChance *= num; + } + else + { + hitChance *= 1.5f * thing.def.fillPercent; + } + return Mathf.Clamp(hitChance, 0f, 1f); + } + + public virtual void MovementTick() + { + Vector3 vect = ExactPosition + curSpeed; + ShootLine shootLine = new ShootLine(ExactPosition.ToIntVec3(), vect.ToIntVec3()); + Vector3 vector = (intendedTarget.Cell.ToVector3() - ExactPosition).Yto0(); + if (homing) + { + Vector3 vector2 = vector.normalized - curSpeed.normalized; + if (vector2.sqrMagnitude >= 1.414f) + { + homing = false; + lifetime = HomingDef.destroyTicksAfterLosingTrack.RandomInRange; + ticksToImpact = lifetime; + base.HitFlags &= ~ProjectileHitFlags.IntendedTarget; + base.HitFlags |= ProjectileHitFlags.NonTargetPawns; + base.HitFlags |= ProjectileHitFlags.NonTargetWorld; + } + else + { + curSpeed += vector2 * HomingDef.homingSpeed * curSpeed.magnitude; + } + } + foreach (IntVec3 item in shootLine.Points()) + { + if (!((intendedTarget.Cell - item).SqrMagnitude <= HomingDef.proximityFuseRange * HomingDef.proximityFuseRange)) + { + continue; + } + homing = false; + lifetime = HomingDef.destroyTicksAfterLosingTrack.RandomInRange; + if ((base.HitFlags & ProjectileHitFlags.IntendedTarget) == ProjectileHitFlags.IntendedTarget || HomingDef.proximityFuseRange > 0f) + { + lifetime = 0; + ticksToImpact = 0; + vect = item.ToVector3(); + if (Find.TickManager.CurTimeSpeed == TimeSpeed.Normal && def.projectile.soundImpactAnticipate != null) + { + def.projectile.soundImpactAnticipate.PlayOneShot(this); + } + } + } + exactPositionInt = vect; + curSpeed *= (curSpeed.magnitude + HomingDef.SpeedChangeTilesPerTickOverride) / curSpeed.magnitude; + } + + protected override void Tick() + { + // Projectile_Homing 的 Tick 逻辑 + ThingWithCompsTick(); + lifetime--; + + if (lifetime <= 0) + { + Destroy(); + return; + } + + // 处理拖尾特效 + if (HomingDef != null && HomingDef.tailFleckDef != null) + { + Fleck_MakeFleckTick++; + if (Fleck_MakeFleckTick >= HomingDef.fleckMakeFleckTickMax) + { + Fleck_MakeFleckTick = 0; + Map map = base.Map; + int randomInRange = HomingDef.fleckMakeFleckNum.RandomInRange; + Vector3 currentPosition = ExactPosition; + Vector3 previousPosition = lastTickPosition; + + for (int i = 0; i < randomInRange; i++) + { + float num = (currentPosition - previousPosition).AngleFlat(); + float velocityAngle = HomingDef.fleckAngle.RandomInRange + num; + float randomInRange2 = HomingDef.fleckScale.RandomInRange; + float randomInRange3 = HomingDef.fleckSpeed.RandomInRange; + + FleckCreationData dataStatic = FleckMaker.GetDataStatic(currentPosition, map, HomingDef.tailFleckDef, randomInRange2); + dataStatic.rotation = (currentPosition - previousPosition).AngleFlat(); + dataStatic.rotationRate = HomingDef.fleckRotation.RandomInRange; + dataStatic.velocityAngle = velocityAngle; + dataStatic.velocitySpeed = randomInRange3; + map.flecks.CreateFleck(dataStatic); + } + } + } + lastTickPosition = ExactPosition; + + // Projectile_Homing_Explosive 的 Tick 逻辑 + if (HomingDef.isExplosive && HomingDef.explosionDelay > 0) + { + if (ticksToDetonation > 0) + { + ticksToDetonation--; + if (ticksToDetonation <= 0) + { + Explode(); + } + } + } + + Vector3 exactPosition = ExactPosition; + ticksToImpact--; + MovementTick(); + if (!ExactPosition.InBounds(base.Map)) + { + base.Position = exactPosition.ToIntVec3(); + Destroy(); + return; + } + Vector3 exactPosition2 = ExactPosition; + object[] parameters = new object[2] { exactPosition, exactPosition2 }; + if (!(bool)NonPublicFields.ProjectileCheckForFreeInterceptBetween.Invoke(this, parameters)) + { + base.Position = ExactPosition.ToIntVec3(); + if (ticksToImpact == 60 && Find.TickManager.CurTimeSpeed == TimeSpeed.Normal && def.projectile.soundImpactAnticipate != null) + { + def.projectile.soundImpactAnticipate.PlayOneShot(this); + } + if (ticksToImpact <= 0) + { + ImpactSomething(); + } + else if (ambientSustainer != null) + { + ambientSustainer.Maintain(); + } + } + + // Projectile_PoiBullet 原始逻辑中的部分Tick + this.tickcount++; + bool flag = this.flag3; + if (flag) + { + this.CalHit = this.CanHitTarget_Poi(); // 使用重命名后的方法 + this.flag3 = false; + } + bool flag2 = !this.CalHit; + if (flag2) + { + this.FindRandCell(this.intendedTarget.CenterVector3); + } + bool flag3_poi = this.intendedTarget.Thing != null; + if (flag3_poi) + { + this.destination = this.intendedTarget.Thing.DrawPos; + } + this.Fleck_MakeFleckTick_Poi++; // 使用重命名后的字段 + bool flag4 = this.Fleck_MakeFleckTick_Poi >= this.Fleck_MakeFleckTickMax_Poi; // 使用重命名后的字段 + bool flag5 = flag4 && this.tickcount >= 8; + if (flag5) + { + this.Fleck_MakeFleckTick_Poi = 0; + Map map = base.Map; + int randomInRange = this.Fleck_MakeFleckNum_Poi.RandomInRange; + Vector3 vector = this.BPos(base.DistanceCoveredFraction - 0.01f); + Vector3 vector2 = this.BPos(base.DistanceCoveredFraction - 0.02f); + for (int i = 0; i < randomInRange; i++) + { + float num = (vector - this.intendedTarget.CenterVector3).AngleFlat(); + float velocityAngle = this.Fleck_Angle_Poi.RandomInRange + num; + float randomInRange2 = this.Fleck_Scale_Poi.RandomInRange; + float randomInRange3 = this.Fleck_Speed_Poi.RandomInRange; + float randomInRange4 = this.Fleck_Speed2_Poi.RandomInRange; + FleckCreationData dataStatic = FleckMaker.GetDataStatic(vector, map, this.FleckDef_Poi, randomInRange2); + FleckCreationData dataStatic2 = FleckMaker.GetDataStatic(vector2, map, this.FleckDef2_Poi, randomInRange2); + dataStatic.rotation = (vector - vector2).AngleFlat(); + dataStatic.rotationRate = this.Fleck_Rotation_Poi.RandomInRange; + dataStatic.velocityAngle = velocityAngle; + dataStatic.velocitySpeed = randomInRange3; + dataStatic2.rotation = (vector - vector2).AngleFlat(); + dataStatic2.rotationRate = this.Fleck_Rotation_Poi.RandomInRange; + dataStatic2.velocityAngle = velocityAngle; + dataStatic2.velocitySpeed = randomInRange4; + map.flecks.CreateFleck(dataStatic2); + map.flecks.CreateFleck(dataStatic); + } + } + // 移除原始的 base.Tick(); 因为 Projectile_Homing 的 Tick 已经包含了其父类的逻辑 + } + + private void ThingWithCompsTick() + { + if (comps != null) + { + int i = 0; + for (int count = comps.Count; i < count; i++) + { + comps[i].CompTick(); + } + } + } + + protected override void Impact(Thing hitThing, bool blockedByShield = false) + { + Map map = base.Map; + IntVec3 position = base.Position; + + // Projectile_Homing_Explosive 的 Impact 逻辑 + if (HomingDef.isExplosive) + { + bool flag = blockedByShield || HomingDef.explosionDelay == 0; + if (flag) + { + Explode(); + } + else + { + landed = true; + ticksToDetonation = HomingDef.explosionDelay; + GenExplosion.NotifyNearbyPawnsOfDangerousExplosive(this, def.projectile.damageDef, launcher.Faction, launcher); + } + } + else // Projectile_Homing 的 Impact 逻辑 + { + base.Impact(hitThing, blockedByShield); + if (HomingDef.extraProjectile != null) + { + if (hitThing != null && hitThing.Spawned) + { + ((Projectile)GenSpawn.Spawn(HomingDef.extraProjectile, base.Position, map, WipeMode.Vanish)).Launch(launcher, ExactPosition, hitThing, hitThing, ProjectileHitFlags.All, false, null, null); + } + else + { + ((Projectile)GenSpawn.Spawn(HomingDef.extraProjectile, base.Position, map, WipeMode.Vanish)).Launch(launcher, ExactPosition, position, position, ProjectileHitFlags.All, false, null, null); + } + } + } + + // Projectile_PoiBullet 原始逻辑中的 Impact + bool flag_poi = this.intendedTarget.Thing is Pawn; + if (flag_poi) + { + hitThing = this.intendedTarget.Thing; + } + // 原始的 base.Impact(hitThing, blockedByShield); 已经被上面的 Homing 和 Explosive 逻辑覆盖,需要确保正确调用或移除 + // 这里我们已经调用了 base.Impact(hitThing, blockedByShield); 在 Projectile_Homing 的 Impact 逻辑中,所以这里不再重复调用。 + + BattleLogEntry_RangedImpact battleLogEntry_RangedImpact = new BattleLogEntry_RangedImpact(this.launcher, hitThing, this.intendedTarget.Thing, this.equipmentDef, this.def, this.targetCoverDef); + Find.BattleLog.Add(battleLogEntry_RangedImpact); + this.NotifyImpact_Poi(hitThing, map, position); // 使用重命名后的方法 + bool flag2 = hitThing != null && !blockedByShield; + if (flag2) + { + Pawn pawn; + bool instigatorGuilty = (pawn = (this.launcher as Pawn)) == null || !pawn.Drafted; + DamageInfo dinfo = new DamageInfo(this.def.projectile.damageDef, (float)this.DamageAmount, this.ArmorPenetration, this.ExactRotation.eulerAngles.y, this.launcher, null, this.equipmentDef, DamageInfo.SourceCategory.ThingOrUnknown, this.intendedTarget.Thing, instigatorGuilty, true, QualityCategory.Normal, true); + hitThing.TakeDamage(dinfo).AssociateWithLog(battleLogEntry_RangedImpact); + Pawn pawn2 = hitThing as Pawn; + bool flag3 = pawn2 != null && pawn2.stances != null; + if (flag3) + { + pawn2.stances.stagger.Notify_BulletImpact(this); + } + bool flag4 = this.def.projectile.extraDamages != null; + if (flag4) + { + foreach (ExtraDamage extraDamage in this.def.projectile.extraDamages) + { + bool flag5 = Rand.Chance(extraDamage.chance); + if (flag5) + { + DamageInfo dinfo2 = new DamageInfo(extraDamage.def, extraDamage.amount, extraDamage.AdjustedArmorPenetration(), this.ExactRotation.eulerAngles.y, this.launcher, null, this.equipmentDef, DamageInfo.SourceCategory.ThingOrUnknown, this.intendedTarget.Thing, instigatorGuilty, true, QualityCategory.Normal, true); + hitThing.TakeDamage(dinfo2).AssociateWithLog(battleLogEntry_RangedImpact); + } + } + } + bool flag6 = Rand.Chance(this.def.projectile.bulletChanceToStartFire) && (pawn2 == null || Rand.Chance(FireUtility.ChanceToAttachFireFromEvent(pawn2))); + if (flag6) + { + hitThing.TryAttachFire(this.def.projectile.bulletFireSizeRange.RandomInRange, this); + } + } + else + { + bool flag7 = !blockedByShield; + if (flag7) + { + SoundDefOf.BulletImpact_Ground.PlayOneShot(new TargetInfo(base.Position, map, false)); + bool takeSplashes = base.Position.GetTerrain(map).takeSplashes; + if (takeSplashes) + { + FleckMaker.WaterSplash(this.ExactPosition, map, Mathf.Sqrt((float)this.DamageAmount) * 1f, 4f); + } + else + { + FleckMaker.Static(this.ExactPosition, map, FleckDefOf.ShotHit_Dirt, 1f); + } + } + bool flag8 = Rand.Chance(this.def.projectile.bulletChanceToStartFire); + if (flag8) + { + FireUtility.TryStartFireIn(base.Position, map, this.def.projectile.bulletFireSizeRange.RandomInRange, this, null); + } + } + } + + protected virtual void Explode() + { + Map map = base.Map; + ModExtension_Cone modExtension = this.def.GetModExtension(); + DoExplosion(); + if (modExtension != null) + { + ProjectileProperties projectile = this.def.projectile; + ModExtension_Cone modExtension_Cone = modExtension; + IntVec3 position = base.Position; + Map map2 = map; + Quaternion exactRotation = this.ExactRotation; + DamageDef damageDef = projectile.damageDef; + Thing launcher = base.Launcher; + int damageAmount = this.DamageAmount; + float armorPenetration = this.ArmorPenetration; + SoundDef soundExplode = this.def.projectile.soundExplode; + ThingDef equipmentDef = this.equipmentDef; + ThingDef def = this.def; + Thing thing = this.intendedTarget.Thing; + ThingDef postExplosionSpawnThingDef = null; + float postExplosionSpawnChance = 0f; + int postExplosionSpawnThingCount = 1; + float screenShakeFactor = this.def.projectile.screenShakeFactor; + modExtension_Cone.DoConeExplosion(position, map2, exactRotation, damageDef, launcher, damageAmount, armorPenetration, soundExplode, equipmentDef, def, thing, postExplosionSpawnThingDef, postExplosionSpawnChance, postExplosionSpawnThingCount, null, null, 255, false, null, 0f, 1, 0f, false, null, null, 1f, 0f, null, screenShakeFactor, null, null); + } + if (this.def.projectile.explosionEffect != null) + { + Effecter effecter = this.def.projectile.explosionEffect.Spawn(); + if (this.def.projectile.explosionEffectLifetimeTicks != 0) + { + map.effecterMaintainer.AddEffecterToMaintain(effecter, base.Position.ToVector3().ToIntVec3(), this.def.projectile.explosionEffectLifetimeTicks); + } + else + { + effecter.Trigger(new TargetInfo(base.Position, map, false), new TargetInfo(base.Position, map, false), -1); + effecter.Cleanup(); + } + } + Destroy(DestroyMode.Vanish); + } + + protected void DoExplosion() + { + IntVec3 position = base.Position; + float explosionRadius = this.def.projectile.explosionRadius; + DamageDef damageDef = this.def.projectile.damageDef; + Thing launcher = this.launcher; + int damageAmount = this.DamageAmount; + float armorPenetration = this.ArmorPenetration; + SoundDef soundExplode = this.def.projectile.soundExplode; + ThingDef equipmentDef = this.equipmentDef; + ThingDef def = this.def; + Thing thing = this.intendedTarget.Thing; + ThingDef thingDef = this.def.projectile.postExplosionSpawnThingDef ?? this.def.projectile.filth; + ThingDef postExplosionSpawnThingDefWater = this.def.projectile.postExplosionSpawnThingDefWater; + float postExplosionSpawnChance = this.def.projectile.postExplosionSpawnChance; + int postExplosionSpawnThingCount = this.def.projectile.postExplosionSpawnThingCount; + GasType? postExplosionGasType = this.def.projectile.postExplosionGasType; + ThingDef preExplosionSpawnThingDef = this.def.projectile.preExplosionSpawnThingDef; + float preExplosionSpawnChance = this.def.projectile.preExplosionSpawnChance; + int preExplosionSpawnThingCount = this.def.projectile.preExplosionSpawnThingCount; + bool applyDamageToExplosionCellsNeighbors = this.def.projectile.applyDamageToExplosionCellsNeighbors; + ThingDef preExplosionSpawnThingDef2 = preExplosionSpawnThingDef; + float preExplosionSpawnChance2 = preExplosionSpawnChance; + int preExplosionSpawnThingCount2 = preExplosionSpawnThingCount; + float explosionChanceToStartFire = this.def.projectile.explosionChanceToStartFire; + bool explosionDamageFalloff = this.def.projectile.explosionDamageFalloff; + float? direction = new float?(this.origin.AngleToFlat(this.destination)); + FloatRange? affectedAngle = null; + float expolosionPropagationSpeed = this.def.projectile.damageDef.expolosionPropagationSpeed; + float screenShakeFactor = this.def.projectile.screenShakeFactor; + IntVec3 center = position; + Map map = base.Map; + float radius = explosionRadius; + DamageDef damType = damageDef; + Thing instigator = launcher; + int damAmount = damageAmount; + float armorPenetration2 = armorPenetration; + SoundDef explosionSound = soundExplode; + ThingDef weapon = equipmentDef; + ThingDef projectile = def; + Thing intendedTarget = thing; + ThingDef postExplosionSpawnThingDef = thingDef; + float postExplosionSpawnChance2 = postExplosionSpawnChance; + int postExplosionSpawnThingCount2 = postExplosionSpawnThingCount; + GasType? postExplosionGasType2 = postExplosionGasType; + bool doExplosionVFX = this.def.projectile.doExplosionVFX; + ThingDef postExplosionSpawnThingDefWater2 = postExplosionSpawnThingDefWater; + GenExplosion.DoExplosion(center, map, radius, damType, instigator, damAmount, armorPenetration2, explosionSound, weapon, projectile, intendedTarget, postExplosionSpawnThingDef, postExplosionSpawnChance2, postExplosionSpawnThingCount2, postExplosionGasType2, null, 255, applyDamageToExplosionCellsNeighbors, preExplosionSpawnThingDef2, preExplosionSpawnChance2, preExplosionSpawnThingCount2, explosionChanceToStartFire, explosionDamageFalloff, direction, null, affectedAngle, doExplosionVFX, expolosionPropagationSpeed, 0f, true, postExplosionSpawnThingDefWater2, screenShakeFactor, null, null, null, null); + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref exactPositionInt, "exactPosition"); + Scribe_Values.Look(ref curSpeed, "curSpeed"); + Scribe_Values.Look(ref homing, "homing", defaultValue: false); + Scribe_Values.Look(ref ticksToDetonation, "ticksToDetonation", 0, false); // 爆炸弹字段 + if (Scribe.mode == LoadSaveMode.PostLoadInit) + { + ReflectInit(); + if (this.homingDefInt == null) + { + this.homingDefInt = this.def.GetModExtension(); + if (this.homingDefInt == null) + { + Log.ErrorOnce($"HomingProjectileDef is null for projectile {this.def.defName} after PostLoadInit. Creating a default instance.", this.thingIDNumber ^ 0x12345678); + this.homingDefInt = new HomingProjectileDef(); + } + } + } + } + + // Projectile_PoiBullet 原始逻辑 + private void RandFactor() + { + FloatRange floatRange = new FloatRange(-0.5f, 0.5f); + FloatRange floatRange2 = new FloatRange(-0.5f, 0.5f); + this.Randdd.x = floatRange.RandomInRange; + this.Randdd.z = floatRange2.RandomInRange; + this.flag2 = true; + } + + public Vector3 BPos(float t) + { + bool flag = !this.flag2; + if (flag) + { + this.RandFactor(); + } + Vector3 origin = this.origin; + Vector3 a = (this.origin + this.destination) / 2f; + a += this.Randdd; + a.y = this.destination.y; + Vector3 destination = this.destination; + return (1f - t) * (1f - t) * origin + 2f * t * (1f - t) * a + t * t * destination; + } + + private void FindRandCell(Vector3 d) + { + IntVec3 center = IntVec3.FromVector3(d); + this.intendedTarget = CellRect.CenteredOn(center, 2).RandomCell; + } + + protected override void DrawAt(Vector3 position, bool flip = false) + { + Vector3 b = this.BPos(base.DistanceCoveredFraction - 0.01f); + position = this.BPos(base.DistanceCoveredFraction); + Quaternion rotation = Quaternion.LookRotation(position - b); + bool flag = this.tickcount >= 4; + if (flag) + { + Vector3 position2 = position; + position2.y = AltitudeLayer.Projectile.AltitudeFor(); + Graphics.DrawMesh(MeshPool.GridPlane(this.def.graphicData.drawSize), position2, rotation, this.DrawMat, 0); + base.Comps_PostDraw(); + } + } + + private bool CanHitTarget_Poi() // 重命名以避免冲突 + { + bool flag = this.launcher is Pawn; + bool result; + if (flag) + { + float num = this.Hitchance_Poi(); // 使用重命名后的方法 + bool flag2 = (float)Rand.RangeInclusive(0, 100) <= num * 100f; + Pawn pawn = this.intendedTarget.Thing as Pawn; + bool flag3 = pawn != null; + if (flag3) + { + bool downed = pawn.Downed; + if (downed) + { + flag2 = (Rand.RangeInclusive(0, 100) <= 30); + } + } + result = flag2; + } + else + { + result = (Rand.RangeInclusive(0, 100) <= 85); + } + return result; + } + + public float Hitchance_Poi() // 重命名以避免冲突 + { + Pawn pawn = this.launcher as Pawn; + bool flag = pawn != null; + float result; + if (flag) + { + SkillDef named = DefDatabase.GetNamed("Intellectual", true); + SkillRecord skill = pawn.skills.GetSkill(named); + bool flag2 = skill != null; + if (flag2) + { + int level = skill.GetLevel(true); + float num = Mathf.Min(1f, (float)level * 0.05f); + result = num; + } + else + { + result = 0.5f; + } + } + else + { + result = 0.2f; + } + return result; + } + + private void NotifyImpact_Poi(Thing hitThing, Map map, IntVec3 position) // 重命名以避免冲突 + { + BulletImpactData impactData = new BulletImpactData + { + bullet = this, + hitThing = hitThing, + impactPosition = position + }; + bool flag = hitThing != null; + if (flag) + { + hitThing.Notify_BulletImpactNearby(impactData); + } + int num = 9; + for (int i = 0; i < num; i++) + { + IntVec3 c = position + GenRadial.RadialPattern[i]; + bool flag2 = c.InBounds(map); + if (flag2) + { + List thingList = c.GetThingList(map); + for (int j = 0; j < thingList.Count; j++) + { + bool flag3 = thingList[j] != hitThing; + if (flag3) + { + thingList[j].Notify_BulletImpactNearby(impactData); + } + } + } + } + } + + private bool flag2 = false; + private bool flag3 = true; + private bool CalHit = false; + private Vector3 Randdd; + private int tickcount; + + // Projectile_PoiBullet 原始的 Fleck 字段,重命名以避免冲突 + public FleckDef FleckDef_Poi = DefDatabase.GetNamed("CMC_SparkFlash_Blue_Small", true); + public FleckDef FleckDef2_Poi = DefDatabase.GetNamed("CMC_SparkFlash_Blue_LongLasting_Small", true); + public int Fleck_MakeFleckTickMax_Poi = 1; + public IntRange Fleck_MakeFleckNum_Poi = new IntRange(2, 2); + public FloatRange Fleck_Angle_Poi = new FloatRange(-180f, 180f); + public FloatRange Fleck_Scale_Poi = new FloatRange(1.6f, 1.7f); + public FloatRange Fleck_Speed_Poi = new FloatRange(5f, 7f); + public FloatRange Fleck_Speed2_Poi = new FloatRange(0.1f, 0.2f); + public FloatRange Fleck_Rotation_Poi = new FloatRange(-180f, 180f); + public int Fleck_MakeFleckTick_Poi; + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Projectile_TrackingBullet.cs b/Source/WulaFallenEmpire/Projectile_TrackingBullet.cs new file mode 100644 index 00000000..4dc05f36 --- /dev/null +++ b/Source/WulaFallenEmpire/Projectile_TrackingBullet.cs @@ -0,0 +1,159 @@ +using System.Collections.Generic; +using System.Reflection; +using RimWorld; +using UnityEngine; +using Verse; +using Verse.AI; +using Verse.Sound; + +namespace WulaFallenEmpire +{ + public class Projectile_TrackingBullet : Bullet + { + private TrackingBulletDef trackingDefInt; + + protected Vector3 exactPositionInt; + public Vector3 curSpeed; + public bool homing = true; + + private static class NonPublicFields + { + public static FieldInfo Projectile_AmbientSustainer = typeof(Projectile).GetField("ambientSustainer", BindingFlags.Instance | BindingFlags.NonPublic); + public static FieldInfo ThingWithComps_comps = typeof(ThingWithComps).GetField("comps", BindingFlags.Instance | BindingFlags.NonPublic); + public static MethodInfo ProjectileCheckForFreeInterceptBetween = typeof(Projectile).GetMethod("CheckForFreeInterceptBetween", BindingFlags.Instance | BindingFlags.NonPublic); + } + + public TrackingBulletDef TrackingDef + { + get + { + if (trackingDefInt == null) + { + trackingDefInt = def.GetModExtension(); + if (trackingDefInt == null) + { + Log.ErrorOnce($"TrackingBulletDef for {this.def.defName} is null. Creating a default instance.", this.thingIDNumber ^ 0x12345678); + this.trackingDefInt = new TrackingBulletDef(); + } + } + return trackingDefInt; + } + } + + public override Vector3 ExactPosition => exactPositionInt; + + public override Quaternion ExactRotation => Quaternion.LookRotation(curSpeed); + + public override void Launch(Thing launcher, Vector3 origin, LocalTargetInfo usedTarget, LocalTargetInfo intendedTarget, ProjectileHitFlags hitFlags, bool preventFriendlyFire = false, Thing equipment = null, ThingDef targetCoverDef = null) + { + base.Launch(launcher, origin, usedTarget, intendedTarget, hitFlags, preventFriendlyFire, equipment, targetCoverDef); + exactPositionInt = origin.Yto0() + Vector3.up * def.Altitude; + + // 初始化子弹速度,指向目标,并考虑初始旋转角度 + Vector3 initialDirection = (destination - origin).Yto0().normalized; + float degrees = Rand.Range(0f - TrackingDef.initRotateAngle, TrackingDef.initRotateAngle); + Vector2 v = new Vector2(initialDirection.x, initialDirection.z); + v = v.RotatedBy(degrees); + Vector3 rotatedDirection = new Vector3(v.x, 0f, v.y); + curSpeed = rotatedDirection * def.projectile.SpeedTilesPerTick; + + ReflectInit(); + } + + protected void ReflectInit() + { + // 确保私有字段的访问 + if (!def.projectile.soundAmbient.NullOrUndefined()) + { + // This line might cause issues if ambientSustainer is not directly settable or if Projectile type changes. + // For simplicity, we might omit it for now or find a safer way. + // ambientSustainer = (Sustainer)NonPublicFields.Projectile_AmbientSustainer.GetValue(this); + } + // comps = (List)NonPublicFields.ThingWithComps_comps.GetValue(this); // 如果需要CompTick,需要这个 + } + + public virtual void MovementTick() + { + Vector3 vect = ExactPosition + curSpeed; + ShootLine shootLine = new ShootLine(ExactPosition.ToIntVec3(), vect.ToIntVec3()); + Vector3 vectorToTarget = (intendedTarget.Cell.ToVector3() - ExactPosition).Yto0(); + + if (homing) + { + // 计算需要转向的方向 + Vector3 desiredDirection = vectorToTarget.normalized; + Vector3 currentDirection = curSpeed.normalized; + + // 计算方向差异 + Vector3 directionDifference = desiredDirection - currentDirection; + + // 如果方向差异过大,可能失去追踪,或者直接转向 + if (directionDifference.sqrMagnitude > 0.001f) // 避免浮点数精度问题 + { + // 调整当前速度,使其更接近目标方向 + curSpeed += directionDifference * TrackingDef.homingSpeed * curSpeed.magnitude; + curSpeed = curSpeed.normalized * def.projectile.SpeedTilesPerTick; // 保持速度恒定 + } + } + + exactPositionInt = ExactPosition + curSpeed; // 更新位置 + } + + protected override void Tick() + { + base.Tick(); // 调用父类Bullet的Tick,处理一些基本逻辑,如lifetime, ticksToImpact + + MovementTick(); // 调用追踪移动逻辑 + + // 检查是否撞到东西或超出地图 + Vector3 exactPosition = ExactPosition; // 之前的ExactPosition + ticksToImpact--; // 减少impact计时器 + + if (!ExactPosition.InBounds(base.Map)) // 超出地图边界 + { + base.Position = exactPosition.ToIntVec3(); // 设回旧位置,然后销毁 + Destroy(); + return; + } + + // 检查是否有东西在路径上拦截 + Vector3 exactPositionAfterMove = ExactPosition; // 移动后的ExactPosition + object[] parameters = new object[2] { exactPosition, exactPositionAfterMove }; + if (!(bool)NonPublicFields.ProjectileCheckForFreeInterceptBetween.Invoke(this, parameters)) + { + base.Position = ExactPosition.ToIntVec3(); // 更新位置到当前精确位置 + if (ticksToImpact <= 0) // 达到impact时间 + { + ImpactSomething(); // 触发Impact + } + } + } + + protected override void Impact(Thing hitThing, bool blockedByShield = false) + { + // 默认Impact逻辑,可以根据需要扩展 + base.Impact(hitThing, blockedByShield); + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref exactPositionInt, "exactPosition"); + Scribe_Values.Look(ref curSpeed, "curSpeed"); + Scribe_Values.Look(ref homing, "homing", defaultValue: true); + if (Scribe.mode == LoadSaveMode.PostLoadInit) + { + ReflectInit(); + if (this.trackingDefInt == null) + { + this.trackingDefInt = this.def.GetModExtension(); + if (this.trackingDefInt == null) + { + Log.ErrorOnce($"TrackingBulletDef is null for projectile {this.def.defName} after PostLoadInit. Creating a default instance.", this.thingIDNumber ^ 0x12345678); + this.trackingDefInt = new TrackingBulletDef(); + } + } + } + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/TrackingBulletDef.cs b/Source/WulaFallenEmpire/TrackingBulletDef.cs new file mode 100644 index 00000000..43adcf11 --- /dev/null +++ b/Source/WulaFallenEmpire/TrackingBulletDef.cs @@ -0,0 +1,10 @@ +using Verse; + +namespace WulaFallenEmpire +{ + public class TrackingBulletDef : DefModExtension + { + public float homingSpeed = 0.1f; // 追踪速度,值越大追踪越灵敏 + public float initRotateAngle = 0f; // 初始旋转角度 + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 82d1a4be..0fc83f50 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -126,6 +126,8 @@ + +