1
This commit is contained in:
Binary file not shown.
@@ -60,7 +60,108 @@
|
|||||||
<defaultDamage>25</defaultDamage>
|
<defaultDamage>25</defaultDamage>
|
||||||
<soundExplosion>Explosion_Bomb</soundExplosion>
|
<soundExplosion>Explosion_Bomb</soundExplosion>
|
||||||
</DamageDef>
|
</DamageDef>
|
||||||
|
|
||||||
|
<DamageDef ParentName="Bullet">
|
||||||
|
<defName>WULA_Armour_Piercing_Projectile_1_Damage</defName>
|
||||||
|
<label>穿甲钢针</label>
|
||||||
|
<workerClass>WulaFallenEmpire.DamageWorker_ExtraDamage</workerClass>
|
||||||
|
<defaultDamage>15</defaultDamage>
|
||||||
|
|
||||||
|
<modExtensions>
|
||||||
|
<li Class="WulaFallenEmpire.DamageDef_ExtraDamageExtension">
|
||||||
|
<extraLabel>穿透伤害</extraLabel>
|
||||||
|
<showExtraLog>true</showExtraLog>
|
||||||
|
|
||||||
|
<extraDamages>
|
||||||
|
<li>
|
||||||
|
<damageDef>Bullet</damageDef>
|
||||||
|
<amount>15</amount>
|
||||||
|
<isPercentage>false</isPercentage>
|
||||||
|
<armorPenetration>0.5</armorPenetration>
|
||||||
|
<!-- <soundDef>EMP_Small</soundDef>
|
||||||
|
<fleckDef>ElectricArc</fleckDef> -->
|
||||||
|
<!-- <minTriggerDamage>5</minTriggerDamage> -->
|
||||||
|
</li>
|
||||||
|
</extraDamages>
|
||||||
|
</li>
|
||||||
|
</modExtensions>
|
||||||
|
</DamageDef>
|
||||||
|
<DamageDef ParentName="Bullet">
|
||||||
|
<defName>WULA_Armour_Piercing_Projectile_2_Damage</defName>
|
||||||
|
<label>穿甲钢针</label>
|
||||||
|
<workerClass>WulaFallenEmpire.DamageWorker_ExtraDamage</workerClass>
|
||||||
|
<defaultDamage>30</defaultDamage>
|
||||||
|
|
||||||
|
<modExtensions>
|
||||||
|
<li Class="WulaFallenEmpire.DamageDef_ExtraDamageExtension">
|
||||||
|
<extraLabel>穿透伤害</extraLabel>
|
||||||
|
<showExtraLog>true</showExtraLog>
|
||||||
|
|
||||||
|
<extraDamages>
|
||||||
|
<li>
|
||||||
|
<damageDef>WULA_Armour_Piercing_Projectile_1_Damage</damageDef>
|
||||||
|
<amount>30</amount>
|
||||||
|
<isPercentage>false</isPercentage>
|
||||||
|
<armorPenetration>1</armorPenetration>
|
||||||
|
<!-- <soundDef>EMP_Small</soundDef>
|
||||||
|
<fleckDef>ElectricArc</fleckDef> -->
|
||||||
|
<!-- <minTriggerDamage>5</minTriggerDamage> -->
|
||||||
|
</li>
|
||||||
|
</extraDamages>
|
||||||
|
</li>
|
||||||
|
</modExtensions>
|
||||||
|
</DamageDef>
|
||||||
|
<DamageDef ParentName="Bullet">
|
||||||
|
<defName>WULA_Armour_Piercing_Projectile_3_Damage</defName>
|
||||||
|
<label>穿甲钢针</label>
|
||||||
|
<workerClass>WulaFallenEmpire.DamageWorker_ExtraDamage</workerClass>
|
||||||
|
<defaultDamage>50</defaultDamage>
|
||||||
|
|
||||||
|
<modExtensions>
|
||||||
|
<li Class="WulaFallenEmpire.DamageDef_ExtraDamageExtension">
|
||||||
|
<extraLabel>穿透伤害</extraLabel>
|
||||||
|
<showExtraLog>true</showExtraLog>
|
||||||
|
|
||||||
|
<extraDamages>
|
||||||
|
<li>
|
||||||
|
<damageDef>WULA_Armour_Piercing_Projectile_2_Damage</damageDef>
|
||||||
|
<amount>50</amount>
|
||||||
|
<isPercentage>false</isPercentage>
|
||||||
|
<armorPenetration>1.5</armorPenetration>
|
||||||
|
<!-- <soundDef>EMP_Small</soundDef>
|
||||||
|
<fleckDef>ElectricArc</fleckDef> -->
|
||||||
|
<!-- <minTriggerDamage>5</minTriggerDamage> -->
|
||||||
|
</li>
|
||||||
|
</extraDamages>
|
||||||
|
</li>
|
||||||
|
</modExtensions>
|
||||||
|
</DamageDef>
|
||||||
|
<DamageDef ParentName="Bullet">
|
||||||
|
<defName>WULA_Armour_Piercing_Projectile_4_Damage</defName>
|
||||||
|
<label>穿甲钢针</label>
|
||||||
|
<workerClass>WulaFallenEmpire.DamageWorker_ExtraDamage</workerClass>
|
||||||
|
<defaultDamage>100</defaultDamage>
|
||||||
|
|
||||||
|
<modExtensions>
|
||||||
|
<li Class="WulaFallenEmpire.DamageDef_ExtraDamageExtension">
|
||||||
|
<extraLabel>穿透伤害</extraLabel>
|
||||||
|
<showExtraLog>true</showExtraLog>
|
||||||
|
|
||||||
|
<extraDamages>
|
||||||
|
<li>
|
||||||
|
<damageDef>WULA_Armour_Piercing_Projectile_3_Damage</damageDef>
|
||||||
|
<amount>100</amount>
|
||||||
|
<isPercentage>false</isPercentage>
|
||||||
|
<armorPenetration>2</armorPenetration>
|
||||||
|
<!-- <soundDef>EMP_Small</soundDef>
|
||||||
|
<fleckDef>ElectricArc</fleckDef> -->
|
||||||
|
<!-- <minTriggerDamage>5</minTriggerDamage> -->
|
||||||
|
</li>
|
||||||
|
</extraDamages>
|
||||||
|
</li>
|
||||||
|
</modExtensions>
|
||||||
|
</DamageDef>
|
||||||
|
|
||||||
<DamageDef ParentName="Wula_Dark_Matter_Beam_DMG">
|
<DamageDef ParentName="Wula_Dark_Matter_Beam_DMG">
|
||||||
<defName>Wula_Psi_Damage</defName>
|
<defName>Wula_Psi_Damage</defName>
|
||||||
<ignoreShields>true</ignoreShields>
|
<ignoreShields>true</ignoreShields>
|
||||||
|
|||||||
@@ -19,18 +19,27 @@
|
|||||||
</graphicData>
|
</graphicData>
|
||||||
</FleckDef>
|
</FleckDef>
|
||||||
|
|
||||||
<FleckDef ParentName="FleckBase">
|
<FleckDef Name="WULA_GunTail_Lighting" ParentName="FleckBase">
|
||||||
<defName>WULA_GunTail_Lighting</defName>
|
<defName>WULA_GunTail_Lighting</defName>
|
||||||
<altitudeLayer>Projectile</altitudeLayer>
|
<altitudeLayer>Projectile</altitudeLayer>
|
||||||
<fadeInTime>0.50</fadeInTime>
|
<!-- <fadeInTime>0.50</fadeInTime> -->
|
||||||
<solidTime>1</solidTime>
|
<solidTime>1</solidTime>
|
||||||
<fadeOutTime>1.2</fadeOutTime>
|
<fadeOutTime>1.2</fadeOutTime>
|
||||||
<growthRate>0.005</growthRate>
|
<growthRate>0.1</growthRate>
|
||||||
<graphicData>
|
<graphicData>
|
||||||
<texPath>Wula/Mote/WULA_Lighting_Beam</texPath>
|
<texPath>Wula/Mote/WULA_Lighting_Beam</texPath>
|
||||||
<shaderType>MoteGlow</shaderType>
|
<shaderType>MoteGlow</shaderType>
|
||||||
<color>(113,165,225,255)</color>
|
<color>(113,165,225,255)</color>
|
||||||
<drawSize>(0.5,2)</drawSize>
|
<drawSize>(0.75,2)</drawSize>
|
||||||
|
</graphicData>
|
||||||
|
</FleckDef>
|
||||||
|
<FleckDef ParentName="WULA_GunTail_Lighting">
|
||||||
|
<defName>WULA_GunTail_Lighting_Small</defName>
|
||||||
|
<solidTime>1</solidTime>
|
||||||
|
<fadeOutTime>0.25</fadeOutTime>
|
||||||
|
<growthRate>0.25</growthRate>
|
||||||
|
<graphicData>
|
||||||
|
<drawSize>(0.3,2)</drawSize>
|
||||||
</graphicData>
|
</graphicData>
|
||||||
</FleckDef>
|
</FleckDef>
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -766,10 +766,10 @@
|
|||||||
<minRange>5.9</minRange>
|
<minRange>5.9</minRange>
|
||||||
<range>75</range>
|
<range>75</range>
|
||||||
<burstShotCount>1</burstShotCount>
|
<burstShotCount>1</burstShotCount>
|
||||||
<forcedMissRadius>0.1</forcedMissRadius>
|
|
||||||
<soundCast>WULA_MW_Mass_Drivers_Shootingsound</soundCast>
|
<soundCast>WULA_MW_Mass_Drivers_Shootingsound</soundCast>
|
||||||
<soundCastTail>GunTail_Heavy</soundCastTail>
|
<soundCastTail>GunTail_Heavy</soundCastTail>
|
||||||
<muzzleFlashScale>18</muzzleFlashScale>
|
<muzzleFlashScale>18</muzzleFlashScale>
|
||||||
|
<canGoWild>false</canGoWild>
|
||||||
</li>
|
</li>
|
||||||
</verbs>
|
</verbs>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
@@ -783,7 +783,8 @@
|
|||||||
<damageFalloff>0</damageFalloff> <!-- 无伤害衰减 -->
|
<damageFalloff>0</damageFalloff> <!-- 无伤害衰减 -->
|
||||||
<preventFriendlyFire>true</preventFriendlyFire> <!-- 是否阻止友方火力 -->
|
<preventFriendlyFire>true</preventFriendlyFire> <!-- 是否阻止友方火力 -->
|
||||||
<tailFleckDef>WULA_GunTail_Lighting</tailFleckDef> <!-- 拖尾特效定义 -->
|
<tailFleckDef>WULA_GunTail_Lighting</tailFleckDef> <!-- 拖尾特效定义 -->
|
||||||
<hitEffecterDef>Bullet_WULA_WM_Panzer_Turret_Hit</hitEffecterDef>
|
<fleckDelayTicks>0</fleckDelayTicks>
|
||||||
|
<impactEffecter>Bullet_WULA_RW_Fractal_RF_Hit</impactEffecter>
|
||||||
</li>
|
</li>
|
||||||
</modExtensions>
|
</modExtensions>
|
||||||
<tickerType>Normal</tickerType>
|
<tickerType>Normal</tickerType>
|
||||||
@@ -797,72 +798,14 @@
|
|||||||
<projectile>
|
<projectile>
|
||||||
</projectile>
|
</projectile>
|
||||||
<projectile>
|
<projectile>
|
||||||
<damageDef>Bullet</damageDef>
|
<damageDef>WULA_Armour_Piercing_Projectile_4_Damage</damageDef>
|
||||||
<damageAmountBase>180</damageAmountBase>
|
<damageAmountBase>100</damageAmountBase>
|
||||||
<speed>220</speed>
|
<speed>180</speed>
|
||||||
<armorPenetrationBase>2</armorPenetrationBase>
|
<armorPenetrationBase>2</armorPenetrationBase>
|
||||||
<explosionRadius>3.5</explosionRadius>
|
|
||||||
<soundHitThickRoof>Artillery_HitThickRoof</soundHitThickRoof>
|
|
||||||
<soundExplode>MortarBomb_Explode</soundExplode>
|
|
||||||
<soundImpactAnticipate>MortarRound_PreImpact</soundImpactAnticipate>
|
|
||||||
<soundAmbient>MortarRound_Ambient</soundAmbient>
|
<soundAmbient>MortarRound_Ambient</soundAmbient>
|
||||||
<stoppingPower>10</stoppingPower>
|
<stoppingPower>10</stoppingPower>
|
||||||
</projectile>
|
</projectile>
|
||||||
<modExtensions>
|
|
||||||
<li Class="WulaFallenEmpire.TrackingBulletDef">
|
|
||||||
<tailFleckDef>WULA_GunTail_Lighting</tailFleckDef>
|
|
||||||
<fleckMakeFleckTickMax>5</fleckMakeFleckTickMax>
|
|
||||||
</li>
|
|
||||||
</modExtensions>
|
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
<EffecterDef>
|
|
||||||
<defName>Bullet_WULA_WM_Panzer_Turret_Hit</defName>
|
|
||||||
<children>
|
|
||||||
<li>
|
|
||||||
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
|
|
||||||
<positionRadius>0.1</positionRadius>
|
|
||||||
<moteDef>WULA_Mote_halo</moteDef>
|
|
||||||
<burstCount>1~1</burstCount>
|
|
||||||
<speed>0.4~0.8</speed>
|
|
||||||
<scale>0.05~0.05</scale>
|
|
||||||
<spawnLocType>OnSource</spawnLocType>
|
|
||||||
<color>(255,255,255)</color>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
|
|
||||||
<positionRadius>0.02</positionRadius>
|
|
||||||
<moteDef>WULA_Mote_halo</moteDef>
|
|
||||||
<burstCount>1~1</burstCount>
|
|
||||||
<speed>0.3~0.4</speed>
|
|
||||||
<rotationRate>5~10</rotationRate>
|
|
||||||
<scale>0.1~0.2</scale>
|
|
||||||
<spawnLocType>OnSource</spawnLocType>
|
|
||||||
<color>(255,255,255)</color>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
|
|
||||||
<moteDef>WULA_Mote_ChargeLanceShot</moteDef>
|
|
||||||
<burstCount>6~12</burstCount>
|
|
||||||
<scale>0.4~0.8</scale>
|
|
||||||
<speed>20~40</speed>
|
|
||||||
<angle>135~225</angle>
|
|
||||||
<positionRadius>0.01</positionRadius>
|
|
||||||
<spawnLocType>OnSource</spawnLocType>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
|
|
||||||
<moteDef>WULA_Mote_ChargeLanceShot</moteDef>
|
|
||||||
<burstCount>5~9</burstCount>
|
|
||||||
<scale>0.4~0.8</scale>
|
|
||||||
<speed>10~20</speed>
|
|
||||||
<angle>135~225</angle>
|
|
||||||
<positionRadius>0.01</positionRadius>
|
|
||||||
<spawnLocType>OnSource</spawnLocType>
|
|
||||||
</li>
|
|
||||||
</children>
|
|
||||||
<offsetTowardsTarget>0.25~0.25</offsetTowardsTarget>
|
|
||||||
<positionRadius>0.1</positionRadius>
|
|
||||||
</EffecterDef>
|
|
||||||
|
|
||||||
<!-- 激光炮 -->
|
<!-- 激光炮 -->
|
||||||
<ThingDef ParentName="BuildingBase">
|
<ThingDef ParentName="BuildingBase">
|
||||||
|
|||||||
@@ -154,47 +154,47 @@
|
|||||||
<defaultProjectile>Bullet_Wula_MR_Mobile_Factory_Turret</defaultProjectile>
|
<defaultProjectile>Bullet_Wula_MR_Mobile_Factory_Turret</defaultProjectile>
|
||||||
<warmupTime>0</warmupTime>
|
<warmupTime>0</warmupTime>
|
||||||
<range>32</range>
|
<range>32</range>
|
||||||
<defaultCooldownTime>3</defaultCooldownTime>
|
<defaultCooldownTime>4</defaultCooldownTime>
|
||||||
<forcedMissRadius>0.1</forcedMissRadius>
|
<burstShotCount>1</burstShotCount>
|
||||||
<burstShotCount>6</burstShotCount>
|
<ticksBetweenBurstShots>4</ticksBetweenBurstShots>
|
||||||
<ticksBetweenBurstShots>6</ticksBetweenBurstShots>
|
<soundCast>WULA_MW_Mass_Drivers_Shootingsound</soundCast>
|
||||||
<soundCast>Shot_ChargeRifle</soundCast>
|
<soundCastTail>GunTail_Heavy</soundCastTail>
|
||||||
<soundCastTail>GunTail_Medium</soundCastTail>
|
|
||||||
<muzzleFlashScale>9</muzzleFlashScale>
|
<muzzleFlashScale>9</muzzleFlashScale>
|
||||||
<targetParams>
|
<targetParams>
|
||||||
<canTargetPawns>true</canTargetPawns>
|
<canTargetPawns>true</canTargetPawns>
|
||||||
<canTargetLocations>true</canTargetLocations>
|
<canTargetLocations>true</canTargetLocations>
|
||||||
<canTargetBuildings>true</canTargetBuildings>
|
<canTargetBuildings>true</canTargetBuildings>
|
||||||
</targetParams>
|
</targetParams>
|
||||||
|
<canGoWild>false</canGoWild>
|
||||||
</li>
|
</li>
|
||||||
</verbs>
|
</verbs>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
<ThingDef ParentName="BaseBullet">
|
<ThingDef ParentName="BaseBullet">
|
||||||
<defName>Bullet_Wula_MR_Mobile_Factory_Turret</defName>
|
<defName>Bullet_Wula_MR_Mobile_Factory_Turret</defName>
|
||||||
<label>陨磷自动炮炮弹</label>
|
<label>陨磷钢针弹</label>
|
||||||
<graphicData>
|
<graphicData>
|
||||||
<texPath>Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red</texPath>
|
<texPath>Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red</texPath>
|
||||||
<graphicClass>Graphic_Single</graphicClass>
|
<graphicClass>Graphic_Single</graphicClass>
|
||||||
<shaderType>MoteGlow</shaderType>
|
<shaderType>MoteGlow</shaderType>
|
||||||
<drawSize>2.5</drawSize>
|
<drawSize>2.5</drawSize>
|
||||||
</graphicData>
|
</graphicData>
|
||||||
<thingClass>WulaFallenEmpire.Projectile_ExplosiveWithTrail</thingClass>
|
<thingClass>WulaFallenEmpire.Projectile_WulaLineAttack</thingClass>
|
||||||
<projectile>
|
|
||||||
<damageDef>Bullet</damageDef>
|
|
||||||
<damageAmountBase>12</damageAmountBase>
|
|
||||||
<speed>90</speed>
|
|
||||||
<explosionRadius>1.2</explosionRadius>
|
|
||||||
<arcHeightFactor>0.4</arcHeightFactor>
|
|
||||||
<soundExplode>Explosion_Rocket</soundExplode>
|
|
||||||
<armorPenetrationBase>0.75</armorPenetrationBase>
|
|
||||||
<screenShakeFactor>0.1</screenShakeFactor>
|
|
||||||
</projectile>
|
|
||||||
<modExtensions>
|
<modExtensions>
|
||||||
<li Class="WulaFallenEmpire.TrackingBulletDef">
|
<li Class="WulaFallenEmpire.Wula_PathPierce_Extension">
|
||||||
<tailFleckDef>WULA_GunTail_Lighting</tailFleckDef>
|
<maxHits>-1</maxHits> <!-- 无限穿透 -->
|
||||||
<fleckMakeFleckTickMax>1</fleckMakeFleckTickMax>
|
<damageFalloff>0</damageFalloff> <!-- 无伤害衰减 -->
|
||||||
|
<preventFriendlyFire>true</preventFriendlyFire> <!-- 是否阻止友方火力 -->
|
||||||
|
<tailFleckDef>WULA_GunTail_Lighting</tailFleckDef> <!-- 拖尾特效定义 -->
|
||||||
|
<fleckDelayTicks>0</fleckDelayTicks>
|
||||||
|
<impactEffecter>Bullet_WULA_RW_Fractal_RF_Hit</impactEffecter>
|
||||||
</li>
|
</li>
|
||||||
</modExtensions>
|
</modExtensions>
|
||||||
|
<projectile>
|
||||||
|
<damageDef>WULA_Armour_Piercing_Projectile_3_Damage</damageDef>
|
||||||
|
<damageAmountBase>100</damageAmountBase>
|
||||||
|
<speed>120</speed>
|
||||||
|
<armorPenetrationBase>1.5</armorPenetrationBase>
|
||||||
|
</projectile>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
<ThingDef ParentName="BaseWeaponTurret">
|
<ThingDef ParentName="BaseWeaponTurret">
|
||||||
<defName>Wula_LR_Mobile_Factory_Turret</defName>
|
<defName>Wula_LR_Mobile_Factory_Turret</defName>
|
||||||
@@ -390,44 +390,45 @@
|
|||||||
<defaultProjectile>Bullet_Wula_AI_Heavy_Panzer_Turret_Weapon</defaultProjectile>
|
<defaultProjectile>Bullet_Wula_AI_Heavy_Panzer_Turret_Weapon</defaultProjectile>
|
||||||
<warmupTime>0</warmupTime>
|
<warmupTime>0</warmupTime>
|
||||||
<minRange>5.9</minRange>
|
<minRange>5.9</minRange>
|
||||||
<range>50</range>
|
<range>60</range>
|
||||||
<defaultCooldownTime>3</defaultCooldownTime>
|
<defaultCooldownTime>4</defaultCooldownTime>
|
||||||
<burstShotCount>6</burstShotCount>
|
<burstShotCount>1</burstShotCount>
|
||||||
<ticksBetweenBurstShots>6</ticksBetweenBurstShots>
|
<ticksBetweenBurstShots>4</ticksBetweenBurstShots>
|
||||||
<requireLineOfSight>true</requireLineOfSight>
|
<requireLineOfSight>true</requireLineOfSight>
|
||||||
<forcedMissRadius>0.1</forcedMissRadius>
|
<soundCast>WULA_MW_Mass_Drivers_Shootingsound</soundCast>
|
||||||
<soundCast>Shot_ChargeRifle</soundCast>
|
|
||||||
<soundCastTail>GunTail_Heavy</soundCastTail>
|
<soundCastTail>GunTail_Heavy</soundCastTail>
|
||||||
<muzzleFlashScale>18</muzzleFlashScale>
|
<muzzleFlashScale>18</muzzleFlashScale>
|
||||||
|
<canGoWild>false</canGoWild>
|
||||||
</li>
|
</li>
|
||||||
</verbs>
|
</verbs>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
<ThingDef ParentName="BaseBullet">
|
<ThingDef ParentName="BaseBullet">
|
||||||
<defName>Bullet_Wula_AI_Heavy_Panzer_Turret_Weapon</defName>
|
<defName>Bullet_Wula_AI_Heavy_Panzer_Turret_Weapon</defName>
|
||||||
<label>青金石自动炮炮弹</label>
|
<label>青金石钢针弹</label>
|
||||||
<graphicData>
|
<graphicData>
|
||||||
<texPath>Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red</texPath>
|
<texPath>Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red</texPath>
|
||||||
<graphicClass>Graphic_Single</graphicClass>
|
<graphicClass>Graphic_Single</graphicClass>
|
||||||
<shaderType>MoteGlow</shaderType>
|
<shaderType>MoteGlow</shaderType>
|
||||||
<drawSize>2.5</drawSize>
|
<drawSize>2.5</drawSize>
|
||||||
</graphicData>
|
</graphicData>
|
||||||
<thingClass>WulaFallenEmpire.Projectile_ExplosiveWithTrail</thingClass>
|
<thingClass>WulaFallenEmpire.Projectile_WulaLineAttack</thingClass>
|
||||||
<projectile>
|
|
||||||
<damageDef>Bullet</damageDef>
|
|
||||||
<damageAmountBase>12</damageAmountBase>
|
|
||||||
<speed>90</speed>
|
|
||||||
<explosionRadius>2.1</explosionRadius>
|
|
||||||
<arcHeightFactor>0</arcHeightFactor>
|
|
||||||
<soundExplode>Explosion_Rocket</soundExplode>
|
|
||||||
<armorPenetrationBase>1.5</armorPenetrationBase>
|
|
||||||
<screenShakeFactor>0.1</screenShakeFactor>
|
|
||||||
</projectile>
|
|
||||||
<modExtensions>
|
<modExtensions>
|
||||||
<li Class="WulaFallenEmpire.TrackingBulletDef">
|
<li Class="WulaFallenEmpire.Wula_PathPierce_Extension">
|
||||||
<tailFleckDef>WULA_GunTail_Lighting</tailFleckDef>
|
<maxHits>-1</maxHits> <!-- 无限穿透 -->
|
||||||
<fleckMakeFleckTickMax>1</fleckMakeFleckTickMax>
|
<damageFalloff>0</damageFalloff> <!-- 无伤害衰减 -->
|
||||||
|
<preventFriendlyFire>true</preventFriendlyFire> <!-- 是否阻止友方火力 -->
|
||||||
|
<tailFleckDef>WULA_GunTail_Lighting</tailFleckDef> <!-- 拖尾特效定义 -->
|
||||||
|
<fleckDelayTicks>0</fleckDelayTicks>
|
||||||
|
<impactEffecter>Bullet_WULA_RW_Fractal_RF_Hit</impactEffecter>
|
||||||
</li>
|
</li>
|
||||||
</modExtensions>
|
</modExtensions>
|
||||||
|
<projectile>
|
||||||
|
<damageDef>WULA_Armour_Piercing_Projectile_3_Damage</damageDef>
|
||||||
|
<damageAmountBase>100</damageAmountBase>
|
||||||
|
<speed>120</speed>
|
||||||
|
<explosionRadius>1.2</explosionRadius>
|
||||||
|
<armorPenetrationBase>1.5</armorPenetrationBase>
|
||||||
|
</projectile>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
<ThingDef ParentName="BaseHumanMakeableGun">
|
<ThingDef ParentName="BaseHumanMakeableGun">
|
||||||
<defName>Wula_AI_Heavy_Panzer_Main_Weapon</defName>
|
<defName>Wula_AI_Heavy_Panzer_Main_Weapon</defName>
|
||||||
|
|||||||
@@ -826,7 +826,7 @@
|
|||||||
</costList>
|
</costList>
|
||||||
<verbs>
|
<verbs>
|
||||||
<li>
|
<li>
|
||||||
<verbClass>WulaFallenEmpire.Verb_ShootBeyondTarge</verbClass>
|
<verbClass>WulaFallenEmpire.Verb_ShootWithOffset</verbClass>
|
||||||
<hasStandardCommand>true</hasStandardCommand>
|
<hasStandardCommand>true</hasStandardCommand>
|
||||||
<defaultProjectile>Bullet_WULA_RW_Fractal_RF</defaultProjectile>
|
<defaultProjectile>Bullet_WULA_RW_Fractal_RF</defaultProjectile>
|
||||||
<warmupTime>1.25</warmupTime>
|
<warmupTime>1.25</warmupTime>
|
||||||
@@ -835,6 +835,7 @@
|
|||||||
<soundCast>WULA_RW_Railgun_Shootingsound</soundCast>
|
<soundCast>WULA_RW_Railgun_Shootingsound</soundCast>
|
||||||
<soundCastTail>GunTail_Medium</soundCastTail>
|
<soundCastTail>GunTail_Medium</soundCastTail>
|
||||||
<muzzleFlashScale>9</muzzleFlashScale>
|
<muzzleFlashScale>9</muzzleFlashScale>
|
||||||
|
<canGoWild>false</canGoWild>
|
||||||
</li>
|
</li>
|
||||||
</verbs>
|
</verbs>
|
||||||
<weaponTags Inherit="False">
|
<weaponTags Inherit="False">
|
||||||
@@ -864,8 +865,9 @@
|
|||||||
<maxHits>-1</maxHits> <!-- 无限穿透 -->
|
<maxHits>-1</maxHits> <!-- 无限穿透 -->
|
||||||
<damageFalloff>0</damageFalloff> <!-- 无伤害衰减 -->
|
<damageFalloff>0</damageFalloff> <!-- 无伤害衰减 -->
|
||||||
<preventFriendlyFire>true</preventFriendlyFire> <!-- 是否阻止友方火力 -->
|
<preventFriendlyFire>true</preventFriendlyFire> <!-- 是否阻止友方火力 -->
|
||||||
<tailFleckDef>WULA_GunTail_Lighting</tailFleckDef> <!-- 拖尾特效定义 -->
|
<tailFleckDef>WULA_GunTail_Lighting_Small</tailFleckDef> <!-- 拖尾特效定义 -->
|
||||||
<!-- <hitEffecterDef>Bullet_WULA_RW_Fractal_RF_Hit</hitEffecterDef> -->
|
<fleckDelayTicks>0</fleckDelayTicks>
|
||||||
|
<impactEffecter>Bullet_WULA_RW_Fractal_RF_Hit</impactEffecter>
|
||||||
</li>
|
</li>
|
||||||
</modExtensions>
|
</modExtensions>
|
||||||
<graphicData>
|
<graphicData>
|
||||||
@@ -875,10 +877,10 @@
|
|||||||
<drawSize>1.4</drawSize>
|
<drawSize>1.4</drawSize>
|
||||||
</graphicData>
|
</graphicData>
|
||||||
<projectile>
|
<projectile>
|
||||||
<damageDef>Bullet</damageDef>
|
<damageDef>WULA_Armour_Piercing_Projectile_2_Damage</damageDef>
|
||||||
<damageAmountBase>25</damageAmountBase>
|
<damageAmountBase>20</damageAmountBase>
|
||||||
<speed>230</speed>
|
<speed>130</speed>
|
||||||
<armorPenetrationBase>0.5</armorPenetrationBase>
|
<armorPenetrationBase>1</armorPenetrationBase>
|
||||||
<stoppingPower>5</stoppingPower>
|
<stoppingPower>5</stoppingPower>
|
||||||
</projectile>
|
</projectile>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
@@ -908,7 +910,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
|
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
|
||||||
<moteDef>WULA_Mote_ChargeLanceShot</moteDef>
|
<moteDef>WULA_RW_Fractal_RF_Spark_Mote</moteDef>
|
||||||
<burstCount>6~12</burstCount>
|
<burstCount>6~12</burstCount>
|
||||||
<scale>0.4~0.8</scale>
|
<scale>0.4~0.8</scale>
|
||||||
<speed>20~40</speed>
|
<speed>20~40</speed>
|
||||||
@@ -918,7 +920,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
|
<subEffecterClass>SubEffecter_SprayerTriggered</subEffecterClass>
|
||||||
<moteDef>WULA_Mote_ChargeLanceShot</moteDef>
|
<moteDef>WULA_RW_Fractal_RF_Spark_Mote</moteDef>
|
||||||
<burstCount>5~9</burstCount>
|
<burstCount>5~9</burstCount>
|
||||||
<scale>0.4~0.8</scale>
|
<scale>0.4~0.8</scale>
|
||||||
<speed>10~20</speed>
|
<speed>10~20</speed>
|
||||||
@@ -930,6 +932,23 @@
|
|||||||
<offsetTowardsTarget>0.25~0.25</offsetTowardsTarget>
|
<offsetTowardsTarget>0.25~0.25</offsetTowardsTarget>
|
||||||
<positionRadius>0.1</positionRadius>
|
<positionRadius>0.1</positionRadius>
|
||||||
</EffecterDef>
|
</EffecterDef>
|
||||||
|
<ThingDef ParentName="MoteBase">
|
||||||
|
<defName>WULA_RW_Fractal_RF_Spark_Mote</defName>
|
||||||
|
<graphicData>
|
||||||
|
<texPath>Things/Projectile/ChargeLanceShot</texPath>
|
||||||
|
<drawSize>(0.75,1.5)</drawSize>
|
||||||
|
<shaderType>MoteGlow</shaderType>
|
||||||
|
<color>(0.3,0.5,0.7,1)</color>
|
||||||
|
</graphicData>
|
||||||
|
<altitudeLayer>Projectile</altitudeLayer>
|
||||||
|
<mote>
|
||||||
|
<fadeInTime>0.2</fadeInTime>
|
||||||
|
<solidTime>0.4</solidTime>
|
||||||
|
<fadeOutTime>0.2</fadeOutTime>
|
||||||
|
<growthRate>-0.8</growthRate>
|
||||||
|
<rotateTowardsMoveDirection>true</rotateTowardsMoveDirection>
|
||||||
|
</mote>
|
||||||
|
</ThingDef>
|
||||||
<ThingDef ParentName="WULA_ExperienceCore_Weapon_Ranged">
|
<ThingDef ParentName="WULA_ExperienceCore_Weapon_Ranged">
|
||||||
<defName>WULA_RW_StarDrift_SG</defName>
|
<defName>WULA_RW_StarDrift_SG</defName>
|
||||||
<label>DCs-7"黑曜石"</label>
|
<label>DCs-7"黑曜石"</label>
|
||||||
@@ -1019,7 +1038,7 @@
|
|||||||
<ThingDef ParentName="WULA_ExperienceCore_Weapon_Ranged">
|
<ThingDef ParentName="WULA_ExperienceCore_Weapon_Ranged">
|
||||||
<defName>WULA_RW_AutoCannon</defName>
|
<defName>WULA_RW_AutoCannon</defName>
|
||||||
<label>FLm-78"萤石"</label>
|
<label>FLm-78"萤石"</label>
|
||||||
<description>一般由乌拉帝国跳帮组或骑士军团携带的自动炮,在拥有长射程的同时火力也非常凶猛,会造成区域性的爆炸效果以控制集群敌军。它同时下挂了一具长射程的EMP榴弹发射器,可以用于控制机械族的集群冲击。</description>
|
<description>一般由乌拉帝国跳帮组或骑士军团携带的自动磁轨炮,在拥有长射程的同时火力也非常凶猛,能够穿透一大群敌军。它同时下挂了一具长射程的EMP榴弹发射器,可以用于控制机械族的集群冲击。</description>
|
||||||
<techLevel>Ultra</techLevel>
|
<techLevel>Ultra</techLevel>
|
||||||
<weaponTags Inherit="False">
|
<weaponTags Inherit="False">
|
||||||
<li>Wula_Ranged_Weapon_T3</li>
|
<li>Wula_Ranged_Weapon_T3</li>
|
||||||
@@ -1061,12 +1080,12 @@
|
|||||||
<defaultProjectile>Bullet_WULA_RW_AutoCannon</defaultProjectile>
|
<defaultProjectile>Bullet_WULA_RW_AutoCannon</defaultProjectile>
|
||||||
<warmupTime>2</warmupTime>
|
<warmupTime>2</warmupTime>
|
||||||
<range>32</range>
|
<range>32</range>
|
||||||
<forcedMissRadius>0.1</forcedMissRadius>
|
<burstShotCount>6</burstShotCount>
|
||||||
<burstShotCount>3</burstShotCount>
|
|
||||||
<ticksBetweenBurstShots>8</ticksBetweenBurstShots>
|
<ticksBetweenBurstShots>8</ticksBetweenBurstShots>
|
||||||
<soundCast>Shot_ChargeRifle</soundCast>
|
<soundCast>Shot_ChargeRifle</soundCast>
|
||||||
<soundCastTail>GunTail_Medium</soundCastTail>
|
<soundCastTail>GunTail_Medium</soundCastTail>
|
||||||
<muzzleFlashScale>9</muzzleFlashScale>
|
<muzzleFlashScale>9</muzzleFlashScale>
|
||||||
|
<canGoWild>false</canGoWild>
|
||||||
<targetParams>
|
<targetParams>
|
||||||
<canTargetPawns>true</canTargetPawns>
|
<canTargetPawns>true</canTargetPawns>
|
||||||
<canTargetLocations>true</canTargetLocations>
|
<canTargetLocations>true</canTargetLocations>
|
||||||
@@ -1095,25 +1114,30 @@
|
|||||||
</ThingDef>
|
</ThingDef>
|
||||||
<ThingDef ParentName="BaseBullet">
|
<ThingDef ParentName="BaseBullet">
|
||||||
<defName>Bullet_WULA_RW_AutoCannon</defName>
|
<defName>Bullet_WULA_RW_AutoCannon</defName>
|
||||||
<label>萤石自动炮子弹</label>
|
<label>萤石钢针弹</label>
|
||||||
<thingClass>Projectile_Explosive</thingClass>
|
<thingClass>WulaFallenEmpire.Projectile_WulaLineAttack</thingClass>
|
||||||
<tickerType>Normal</tickerType>
|
<modExtensions>
|
||||||
<neverMultiSelect>True</neverMultiSelect>
|
<li Class="WulaFallenEmpire.Wula_PathPierce_Extension">
|
||||||
|
<maxHits>-1</maxHits> <!-- 无限穿透 -->
|
||||||
|
<damageFalloff>0</damageFalloff> <!-- 无伤害衰减 -->
|
||||||
|
<preventFriendlyFire>true</preventFriendlyFire> <!-- 是否阻止友方火力 -->
|
||||||
|
<tailFleckDef>WULA_GunTail_Lighting_Small</tailFleckDef> <!-- 拖尾特效定义 -->
|
||||||
|
<fleckDelayTicks>0</fleckDelayTicks>
|
||||||
|
<impactEffecter>Bullet_WULA_RW_Fractal_RF_Hit</impactEffecter>
|
||||||
|
</li>
|
||||||
|
</modExtensions>
|
||||||
<graphicData>
|
<graphicData>
|
||||||
<texPath>Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red</texPath>
|
<texPath>Wula/Projectile/WULA_Bullet_ChargeLanceShot_Red</texPath>
|
||||||
<graphicClass>Graphic_Single</graphicClass>
|
<graphicClass>Graphic_Single</graphicClass>
|
||||||
<shaderType>MoteGlow</shaderType>
|
<shaderType>TransparentPostLight</shaderType>
|
||||||
<drawSize>2.5</drawSize>
|
<drawSize>1</drawSize>
|
||||||
</graphicData>
|
</graphicData>
|
||||||
<projectile>
|
<projectile>
|
||||||
<damageDef>Bullet</damageDef>
|
<damageDef>WULA_Armour_Piercing_Projectile_1_Damage</damageDef>
|
||||||
<damageAmountBase>12</damageAmountBase>
|
<damageAmountBase>15</damageAmountBase>
|
||||||
<speed>90</speed>
|
<speed>130</speed>
|
||||||
<explosionRadius>1.2</explosionRadius>
|
<armorPenetrationBase>1.5</armorPenetrationBase>
|
||||||
<arcHeightFactor>0.4</arcHeightFactor>
|
<stoppingPower>5</stoppingPower>
|
||||||
<soundExplode>Explosion_Rocket</soundExplode>
|
|
||||||
<armorPenetrationBase>0.75</armorPenetrationBase>
|
|
||||||
<screenShakeFactor>0.1</screenShakeFactor>
|
|
||||||
</projectile>
|
</projectile>
|
||||||
</ThingDef>
|
</ThingDef>
|
||||||
<AbilityDef>
|
<AbilityDef>
|
||||||
|
|||||||
BIN
About/ModIcon.png
Normal file
BIN
About/ModIcon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.9 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 834 KiB After Width: | Height: | Size: 843 KiB |
@@ -235,16 +235,8 @@ namespace WulaFallenEmpire
|
|||||||
return true;
|
return true;
|
||||||
case ConditionTarget.Pawn:
|
case ConditionTarget.Pawn:
|
||||||
return target is Pawn;
|
return target is Pawn;
|
||||||
case ConditionTarget.Animal:
|
|
||||||
return target is Pawn pawn && pawn.RaceProps.Animal;
|
|
||||||
case ConditionTarget.Humanlike:
|
|
||||||
return target is Pawn pawn && pawn.RaceProps.Humanlike;
|
|
||||||
case ConditionTarget.Mechanoid:
|
|
||||||
return target is Pawn pawn && pawn.RaceProps.IsMechanoid;
|
|
||||||
case ConditionTarget.Building:
|
case ConditionTarget.Building:
|
||||||
return target is Building;
|
return target is Building;
|
||||||
case ConditionTarget.SpecificRaces:
|
|
||||||
return target is Pawn pawn && specificRaces.Contains(pawn.def);
|
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -264,12 +256,6 @@ namespace WulaFallenEmpire
|
|||||||
{
|
{
|
||||||
if (requiredTags == null || requiredTags.Count == 0)
|
if (requiredTags == null || requiredTags.Count == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
foreach (var tag in requiredTags)
|
|
||||||
{
|
|
||||||
if (target.def.HasTag(tag))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,245 +1,47 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using Verse;
|
using Verse;
|
||||||
using System.Linq;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace WulaFallenEmpire
|
namespace WulaFallenEmpire
|
||||||
{
|
{
|
||||||
public class DamageWorker_ExtraDamage : DamageWorker
|
public class DamageWorker_ExtraDamage : DamageWorker_AddInjury
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// 重写伤害应用方法
|
|
||||||
/// </summary>
|
|
||||||
public override DamageResult Apply(DamageInfo dinfo, Thing victim)
|
public override DamageResult Apply(DamageInfo dinfo, Thing victim)
|
||||||
{
|
{
|
||||||
// 先应用原始伤害
|
// 首先应用原始伤害
|
||||||
DamageResult originalResult = base.Apply(dinfo, victim);
|
DamageResult result = base.Apply(dinfo, victim);
|
||||||
|
|
||||||
// 获取额外伤害扩展
|
// 检查是否有额外伤害扩展
|
||||||
DamageDef_ExtraDamageExtension extension =
|
var extension = dinfo.Def.GetModExtension<DamageDef_ExtraDamageExtension>();
|
||||||
dinfo.Def.GetModExtension<DamageDef_ExtraDamageExtension>();
|
if (extension != null && extension.extraDamages != null)
|
||||||
|
|
||||||
if (extension != null && victim != null && !victim.Destroyed)
|
|
||||||
{
|
{
|
||||||
// 应用额外伤害
|
foreach (var extraDamage in extension.extraDamages)
|
||||||
var extraDamageResults = ApplyExtraDamages(extension, dinfo, victim, originalResult);
|
|
||||||
|
|
||||||
// 如果需要,添加战斗日志
|
|
||||||
if (extension.showExtraLog && extraDamageResults.Count > 0)
|
|
||||||
{
|
{
|
||||||
AddCombatLog(extension, dinfo, victim, extraDamageResults);
|
if (extraDamage.damageDef != null && extraDamage.amount > 0)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return originalResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 应用额外伤害
|
|
||||||
/// </summary>
|
|
||||||
private List<DamageResult> ApplyExtraDamages(
|
|
||||||
DamageDef_ExtraDamageExtension extension,
|
|
||||||
DamageInfo originalDinfo,
|
|
||||||
Thing victim,
|
|
||||||
DamageResult originalResult)
|
|
||||||
{
|
|
||||||
List<DamageResult> results = new List<DamageResult>();
|
|
||||||
|
|
||||||
var applicableDamages = extension.GetApplicableExtraDamages(victim, originalDinfo);
|
|
||||||
|
|
||||||
foreach (var extraDamage in applicableDamages)
|
|
||||||
{
|
|
||||||
if (ShouldApplyExtraDamage(extraDamage, originalDinfo, victim))
|
|
||||||
{
|
|
||||||
DamageResult result = ApplySingleExtraDamage(extraDamage, originalDinfo, victim);
|
|
||||||
if (result != null)
|
|
||||||
{
|
{
|
||||||
results.Add(result);
|
// 直接应用额外伤害
|
||||||
|
DamageInfo extraDinfo = new DamageInfo(
|
||||||
|
extraDamage.damageDef,
|
||||||
|
extraDamage.amount,
|
||||||
|
extraDamage.armorPenetration >= 0 ? extraDamage.armorPenetration : extraDamage.damageDef.defaultArmorPenetration,
|
||||||
|
dinfo.Angle,
|
||||||
|
dinfo.Instigator,
|
||||||
|
null,
|
||||||
|
dinfo.Weapon,
|
||||||
|
dinfo.Category
|
||||||
|
);
|
||||||
|
|
||||||
|
victim.TakeDamage(extraDinfo);
|
||||||
|
|
||||||
|
// 调试信息
|
||||||
|
if (Prefs.DevMode)
|
||||||
|
{
|
||||||
|
Log.Message($"应用额外伤害: {extraDamage.damageDef.defName} 伤害值: {extraDamage.amount}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 检查是否应该应用额外伤害
|
|
||||||
/// </summary>
|
|
||||||
private bool ShouldApplyExtraDamage(ExtraDamageDef extraDamage, DamageInfo originalDinfo, Thing victim)
|
|
||||||
{
|
|
||||||
// 检查最小触发伤害
|
|
||||||
if (originalDinfo.Amount < extraDamage.minTriggerDamage)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 应用单个额外伤害
|
|
||||||
/// </summary>
|
|
||||||
private DamageResult ApplySingleExtraDamage(ExtraDamageDef extraDamage, DamageInfo originalDinfo, Thing victim)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// 计算伤害值
|
|
||||||
float damageAmount = extraDamage.CalculateActualAmount(originalDinfo, victim);
|
|
||||||
if (damageAmount <= 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
// 计算护甲穿透
|
|
||||||
float armorPenetration = extraDamage.CalculateActualArmorPenetration();
|
|
||||||
|
|
||||||
// 创建伤害信息
|
|
||||||
DamageInfo extraDinfo = new DamageInfo(
|
|
||||||
def: extraDamage.damageDef,
|
|
||||||
amount: damageAmount,
|
|
||||||
armorPenetration: armorPenetration,
|
|
||||||
angle: originalDinfo.Angle,
|
|
||||||
instigator: originalDinfo.Instigator,
|
|
||||||
hitPart: GetTargetBodyPart(victim, extraDamage.targetBodyPart),
|
|
||||||
weapon: originalDinfo.Weapon,
|
|
||||||
category: DamageInfo.SourceCategory.ThingOrUnknown,
|
|
||||||
intendedTarget: originalDinfo.IntendedTarget
|
|
||||||
);
|
|
||||||
|
|
||||||
// 如果是真实伤害,设置特殊标志(如果需要特殊处理)
|
|
||||||
if (extraDamage.isTrueDamage)
|
|
||||||
{
|
|
||||||
// 这里可能需要特殊的处理方式
|
|
||||||
// 例如,可以设置伤害信息中的特殊标志
|
|
||||||
}
|
|
||||||
|
|
||||||
// 应用伤害
|
|
||||||
DamageResult result = victim.TakeDamage(extraDinfo);
|
|
||||||
|
|
||||||
// 播放效果
|
|
||||||
PlayExtraDamageEffects(extraDamage, victim, damageAmount);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
catch (System.Exception ex)
|
|
||||||
{
|
|
||||||
Log.Warning($"应用额外伤害时出错: {ex.Message}");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取目标部位
|
|
||||||
/// </summary>
|
|
||||||
private BodyPartRecord GetTargetBodyPart(Thing victim, BodyPartDef bodyPartDef)
|
|
||||||
{
|
|
||||||
if (bodyPartDef == null || !(victim is Pawn pawn))
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return pawn.RaceProps.body.GetPartsWithDef(bodyPartDef).FirstOrDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 播放额外伤害效果
|
|
||||||
/// </summary>
|
|
||||||
private void PlayExtraDamageEffects(ExtraDamageDef extraDamage, Thing victim, float damageAmount)
|
|
||||||
{
|
|
||||||
if (victim.Map == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// 播放音效
|
|
||||||
if (extraDamage.soundDef != null)
|
|
||||||
{
|
|
||||||
extraDamage.soundDef.PlayOneShot(new TargetInfo(victim.Position, victim.Map));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 播放粒子效果
|
|
||||||
if (extraDamage.fleckDef != null)
|
|
||||||
{
|
|
||||||
FleckMaker.Static(victim.DrawPos, victim.Map, extraDamage.fleckDef);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 播放效果器
|
|
||||||
if (extraDamage.effecterDef != null)
|
|
||||||
{
|
|
||||||
Effecter effecter = extraDamage.effecterDef.Spawn();
|
|
||||||
effecter.Trigger(new TargetInfo(victim.Position, victim.Map), new TargetInfo(victim.Position, victim.Map));
|
|
||||||
effecter.Cleanup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 添加战斗日志
|
|
||||||
/// </summary>
|
|
||||||
private void AddCombatLog(
|
|
||||||
DamageDef_ExtraDamageExtension extension,
|
|
||||||
DamageInfo originalDinfo,
|
|
||||||
Thing victim,
|
|
||||||
List<DamageResult> extraResults)
|
|
||||||
{
|
|
||||||
if (victim is Pawn victimPawn)
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.AppendLine($"{extension.extraLabel} - 额外伤害:");
|
|
||||||
|
|
||||||
foreach (var result in extraResults)
|
|
||||||
{
|
|
||||||
if (result != null && result.totalDamageDealt > 0)
|
|
||||||
{
|
|
||||||
sb.AppendLine($" {result.totalDamageDealt:F1} 伤害");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 这里可以添加更详细的战斗日志逻辑
|
|
||||||
// 例如,创建一个自定义的战斗日志条目
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 重写爆炸伤害处理
|
|
||||||
/// </summary>
|
|
||||||
protected override void ExplosionDamageThing(Explosion explosion, Thing t, List<Thing> damagedThings, List<Thing> ignoredThings, IntVec3 cell)
|
|
||||||
{
|
|
||||||
base.ExplosionDamageThing(explosion, t, damagedThings, ignoredThings, cell);
|
|
||||||
|
|
||||||
// 检查并应用额外伤害
|
|
||||||
DamageDef_ExtraDamageExtension extension =
|
|
||||||
explosion.damType.GetModExtension<DamageDef_ExtraDamageExtension>();
|
|
||||||
|
|
||||||
if (extension != null && !t.Destroyed)
|
|
||||||
{
|
|
||||||
// 为爆炸中的每个目标应用额外伤害
|
|
||||||
// 注意:这里需要创建适当的DamageInfo
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取伤害描述(用于UI显示)
|
|
||||||
/// </summary>
|
|
||||||
public string GetExtraDamageDescription(DamageDef damageDef)
|
|
||||||
{
|
|
||||||
DamageDef_ExtraDamageExtension extension =
|
|
||||||
damageDef.GetModExtension<DamageDef_ExtraDamageExtension>();
|
|
||||||
|
|
||||||
if (extension == null || extension.extraDamages.Count == 0)
|
|
||||||
return "";
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.AppendLine("额外伤害效果:");
|
|
||||||
|
|
||||||
foreach (var extraDamage in extension.extraDamages)
|
|
||||||
{
|
|
||||||
string damageType = extraDamage.damageDef.label;
|
|
||||||
string amountStr = extraDamage.isPercentage ?
|
|
||||||
$"{extraDamage.percentageMultiplier * 100}% 原始伤害" :
|
|
||||||
$"{extraDamage.amount} 点";
|
|
||||||
|
|
||||||
sb.AppendLine($" {damageType}: {amountStr}");
|
|
||||||
|
|
||||||
if (extraDamage.minTriggerDamage > 0)
|
|
||||||
{
|
|
||||||
sb.AppendLine($" 触发条件: 原始伤害 > {extraDamage.minTriggerDamage}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,416 +2,184 @@ using System.Collections.Generic;
|
|||||||
using RimWorld;
|
using RimWorld;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Verse;
|
using Verse;
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace WulaFallenEmpire
|
namespace WulaFallenEmpire
|
||||||
{
|
{
|
||||||
public class Wula_PathPierce_Extension : DefModExtension
|
// 在 Wula_PathPierce_Extension 类中添加粒子特效相关的属性
|
||||||
|
public class Wula_PathPierce_Extension : DefModExtension
|
||||||
|
{
|
||||||
|
// 原有的穿透属性
|
||||||
|
public int maxHits = 3;
|
||||||
|
public float damageFalloff = 0.25f;
|
||||||
|
public bool preventFriendlyFire = false;
|
||||||
|
public FleckDef tailFleckDef;
|
||||||
|
public int fleckDelayTicks = 10;
|
||||||
|
|
||||||
|
// 新增的击中特效属性(来自 Projectile_BulletWithEffect_Extension)
|
||||||
|
public EffecterDef impactEffecter; // 击中时的特效
|
||||||
|
}
|
||||||
|
public class Projectile_WulaLineAttack : Bullet
|
||||||
|
{
|
||||||
|
private int hitCounter = 0;
|
||||||
|
private List<Thing> alreadyDamaged = new List<Thing>();
|
||||||
|
private Vector3 lastTickPosition;
|
||||||
|
private int Fleck_MakeFleckTick;
|
||||||
|
public int Fleck_MakeFleckTickMax = 1;
|
||||||
|
public IntRange Fleck_MakeFleckNum = new IntRange(1, 1);
|
||||||
|
public FloatRange Fleck_Angle = new FloatRange(-180f, 180f);
|
||||||
|
public FloatRange Fleck_Scale = new FloatRange(1f, 1f);
|
||||||
|
public FloatRange Fleck_Speed = new FloatRange(0f, 0f);
|
||||||
|
public FloatRange Fleck_Rotation = new FloatRange(-180f, 180f);
|
||||||
|
private Wula_PathPierce_Extension Props => def.GetModExtension<Wula_PathPierce_Extension>();
|
||||||
|
public override void ExposeData()
|
||||||
{
|
{
|
||||||
// 设置正数表示有限命中次数,-1 表示无限穿透
|
base.ExposeData();
|
||||||
public int maxHits = 3;
|
Scribe_Values.Look(ref hitCounter, "hitCounter", 0);
|
||||||
|
Scribe_Collections.Look(ref alreadyDamaged, "alreadyDamaged", LookMode.Reference);
|
||||||
|
Scribe_Values.Look(ref lastTickPosition, "lastTickPosition");
|
||||||
|
if (alreadyDamaged == null)
|
||||||
|
{
|
||||||
|
alreadyDamaged = new List<Thing>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
this.lastTickPosition = origin;
|
||||||
|
this.alreadyDamaged.Clear();
|
||||||
|
this.hitCounter = 0;
|
||||||
|
this.preventFriendlyFire = preventFriendlyFire || (Props?.preventFriendlyFire ?? false);
|
||||||
|
}
|
||||||
|
protected override void Tick()
|
||||||
|
{
|
||||||
|
Vector3 startPos = this.lastTickPosition;
|
||||||
|
base.Tick();
|
||||||
|
|
||||||
// 每次命中的伤害损失百分比。0.25 表示每次命中损失25%伤害
|
if (this.Destroyed) return;
|
||||||
public float damageFalloff = 0.25f;
|
this.Fleck_MakeFleckTick++;
|
||||||
|
if (this.Fleck_MakeFleckTick >= Props.fleckDelayTicks)
|
||||||
|
{
|
||||||
|
if (this.Fleck_MakeFleckTick >= (Props.fleckDelayTicks + this.Fleck_MakeFleckTickMax))
|
||||||
|
{
|
||||||
|
this.Fleck_MakeFleckTick = Props.fleckDelayTicks;
|
||||||
|
}
|
||||||
|
Map map = base.Map;
|
||||||
|
int randomInRange = this.Fleck_MakeFleckNum.RandomInRange;
|
||||||
|
Vector3 currentPosition = this.ExactPosition;
|
||||||
|
for (int i = 0; i < randomInRange; i++)
|
||||||
|
{
|
||||||
|
float currentBulletAngle = ExactRotation.eulerAngles.y;
|
||||||
|
float fleckRotationAngle = currentBulletAngle;
|
||||||
|
float velocityAngle = this.Fleck_Angle.RandomInRange + currentBulletAngle;
|
||||||
|
float randomInRange2 = this.Fleck_Scale.RandomInRange;
|
||||||
|
float randomInRange3 = this.Fleck_Speed.RandomInRange;
|
||||||
|
|
||||||
// 如果为 true,无论游戏设置如何,这个抛射体都不会造成友军伤害
|
if (Props?.tailFleckDef != null)
|
||||||
public bool preventFriendlyFire = false;
|
{
|
||||||
|
FleckCreationData dataStatic = FleckMaker.GetDataStatic(currentPosition, map, Props.tailFleckDef, randomInRange2);
|
||||||
|
dataStatic.rotation = fleckRotationAngle;
|
||||||
|
dataStatic.rotationRate = this.Fleck_Rotation.RandomInRange;
|
||||||
|
dataStatic.velocityAngle = velocityAngle;
|
||||||
|
dataStatic.velocitySpeed = randomInRange3;
|
||||||
|
map.flecks.CreateFleck(dataStatic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.Destroyed) return;
|
||||||
|
Vector3 endPos = this.ExactPosition;
|
||||||
|
|
||||||
// 尾部拖尾特效的 FleckDef
|
CheckPathForDamage(startPos, endPos);
|
||||||
public FleckDef tailFleckDef;
|
this.lastTickPosition = endPos;
|
||||||
|
|
||||||
// 拖尾特效延迟生成时间(tick)
|
|
||||||
public int fleckDelayTicks = 10;
|
|
||||||
|
|
||||||
|
|
||||||
// 1. 击中敌人时播放的效果器(Effecter)
|
|
||||||
public EffecterDef hitEffecterDef;
|
|
||||||
// 2. 击中敌人时播放的粒子(Fleck)
|
|
||||||
public FleckDef hitFleckDef;
|
|
||||||
// 4. 特效持续时间(tick,仅对效果器有效)
|
|
||||||
public int effectDurationTicks = 60;
|
|
||||||
// 5. 是否对每个命中的敌人都播放特效
|
|
||||||
public bool playEffectOnEveryHit = true;
|
|
||||||
// 6. 特效位置偏移(相对于被击中目标)
|
|
||||||
public Vector3 effectOffset = Vector3.zero;
|
|
||||||
// 7. 特效缩放
|
|
||||||
public float effectScale = 1.0f;
|
|
||||||
// 8. 伤害阈值:只有达到这个伤害值才会播放特效(0表示总是播放)
|
|
||||||
public float damageThreshold = 0f;
|
|
||||||
// 9. 随机播放的特效列表(随机选择一个)
|
|
||||||
public List<EffecterDef> randomHitEffecters;
|
|
||||||
// 10. 随机粒子列表(随机选择一个)
|
|
||||||
public List<FleckDef> randomHitFlecks;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Projectile_WulaLineAttack : Bullet
|
protected override void Impact(Thing hitThing, bool blockedByShield = false)
|
||||||
{
|
{
|
||||||
private int hitCounter = 0;
|
// 原有的穿透检测
|
||||||
private List<Thing> alreadyDamaged = new List<Thing>();
|
CheckPathForDamage(lastTickPosition, this.ExactPosition);
|
||||||
private Vector3 lastTickPosition;
|
|
||||||
private int fleckMakeFleckTick; // 拖尾特效的计时器
|
|
||||||
public int fleckMakeFleckTickMax = 1; // 拖尾特效的生成频率
|
|
||||||
public IntRange fleckMakeFleckNum = new IntRange(1, 1); // 每次生成的粒子数量
|
|
||||||
public FloatRange fleckAngle = new FloatRange(-180f, 180f); // 粒子角度
|
|
||||||
public FloatRange fleckScale = new FloatRange(1f, 1f); // 粒子大小
|
|
||||||
public FloatRange fleckSpeed = new FloatRange(0f, 0f); // 粒子速度
|
|
||||||
public FloatRange fleckRotation = new FloatRange(-180f, 180f); // 粒子旋转
|
|
||||||
|
|
||||||
// 特效维护列表
|
|
||||||
private List<Effecter> activeEffecters = new List<Effecter>();
|
|
||||||
private Dictionary<Pawn, int> effecterEndTicks = new Dictionary<Pawn, int>();
|
|
||||||
|
|
||||||
private Wula_PathPierce_Extension Props => def.GetModExtension<Wula_PathPierce_Extension>();
|
|
||||||
|
|
||||||
public override void ExposeData()
|
if (hitThing != null && alreadyDamaged.Contains(hitThing))
|
||||||
{
|
{
|
||||||
base.ExposeData();
|
base.Impact(null, blockedByShield);
|
||||||
Scribe_Values.Look(ref hitCounter, "hitCounter", 0);
|
}
|
||||||
Scribe_Collections.Look(ref alreadyDamaged, "alreadyDamaged", LookMode.Reference);
|
else
|
||||||
Scribe_Values.Look(ref lastTickPosition, "lastTickPosition");
|
{
|
||||||
Scribe_Collections.Look(ref activeEffecters, "activeEffecters", LookMode.Deep);
|
base.Impact(hitThing, blockedByShield);
|
||||||
Scribe_Collections.Look(ref effecterEndTicks, "effecterEndTicks", LookMode.Reference, LookMode.Value);
|
}
|
||||||
|
|
||||||
if (alreadyDamaged == null)
|
|
||||||
{
|
|
||||||
alreadyDamaged = new List<Thing>();
|
|
||||||
}
|
|
||||||
if (activeEffecters == null)
|
|
||||||
{
|
|
||||||
activeEffecters = new List<Effecter>();
|
|
||||||
}
|
|
||||||
if (effecterEndTicks == null)
|
|
||||||
{
|
|
||||||
effecterEndTicks = new Dictionary<Pawn, int>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Launch(Thing launcher, Vector3 origin, LocalTargetInfo usedTarget, LocalTargetInfo intendedTarget, ProjectileHitFlags hitFlags, bool preventFriendlyFire = false, Thing equipment = null, ThingDef targetCoverDef = null)
|
// 新增:触发击中特效(来自 Projectile_BulletWithEffect 的功能)
|
||||||
{
|
if (Props?.impactEffecter != null)
|
||||||
base.Launch(launcher, origin, usedTarget, intendedTarget, hitFlags, preventFriendlyFire, equipment, targetCoverDef);
|
{
|
||||||
this.lastTickPosition = origin;
|
// 创建一个新的 Effecter 实例并触发
|
||||||
this.alreadyDamaged.Clear();
|
Effecter effecter = Props.impactEffecter.Spawn();
|
||||||
this.hitCounter = 0;
|
effecter.Trigger(new TargetInfo(this.ExactPosition.ToIntVec3(), this.launcher.Map, false), this.launcher);
|
||||||
// 如果游戏设置为 true 或 XML 扩展为 true,则防止友军伤害
|
|
||||||
this.preventFriendlyFire = preventFriendlyFire || (Props?.preventFriendlyFire ?? false);
|
|
||||||
|
|
||||||
// 清理旧的特效器
|
|
||||||
CleanupOldEffecters();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Tick()
|
// 可选:在一段时间后清理 Effecter
|
||||||
{
|
// 这里我们使用一个临时的 Effecter,所以不需要手动清理
|
||||||
Vector3 startPos = this.lastTickPosition;
|
}
|
||||||
base.Tick();
|
|
||||||
|
|
||||||
if (this.Destroyed) return;
|
|
||||||
|
|
||||||
// 更新拖尾特效
|
|
||||||
UpdateTrailFlecks();
|
|
||||||
|
|
||||||
// 更新击中特效器
|
|
||||||
UpdateHitEffecters();
|
|
||||||
|
|
||||||
if (this.Destroyed) return;
|
|
||||||
|
|
||||||
Vector3 endPos = this.ExactPosition;
|
|
||||||
|
|
||||||
CheckPathForDamage(startPos, endPos);
|
|
||||||
|
|
||||||
this.lastTickPosition = endPos;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 更新拖尾粒子特效
|
|
||||||
/// </summary>
|
|
||||||
private void UpdateTrailFlecks()
|
|
||||||
{
|
|
||||||
this.fleckMakeFleckTick++;
|
|
||||||
|
|
||||||
// 只有当达到延迟时间后才开始生成 Fleck
|
|
||||||
if (this.fleckMakeFleckTick >= Props?.fleckDelayTicks)
|
|
||||||
{
|
|
||||||
if (this.fleckMakeFleckTick >= (Props.fleckDelayTicks + this.fleckMakeFleckTickMax))
|
|
||||||
{
|
|
||||||
this.fleckMakeFleckTick = Props.fleckDelayTicks; // 重置计时器,从延迟时间开始循环
|
|
||||||
}
|
|
||||||
|
|
||||||
Map map = base.Map;
|
|
||||||
int randomInRange = this.fleckMakeFleckNum.RandomInRange;
|
|
||||||
Vector3 currentPosition = this.ExactPosition; // 子弹当前位置
|
|
||||||
|
|
||||||
for (int i = 0; i < randomInRange; i++)
|
|
||||||
{
|
|
||||||
float currentBulletAngle = ExactRotation.eulerAngles.y; // 使用子弹当前的水平旋转角度
|
|
||||||
float fleckRotationAngle = currentBulletAngle; // Fleck 的旋转角度与子弹方向一致
|
|
||||||
float velocityAngle = this.fleckAngle.RandomInRange + currentBulletAngle; // Fleck 的速度角度基于子弹方向加上随机偏移
|
|
||||||
float randomInRange2 = this.fleckScale.RandomInRange;
|
|
||||||
float randomInRange3 = this.fleckSpeed.RandomInRange;
|
|
||||||
|
|
||||||
if (Props?.tailFleckDef != null)
|
|
||||||
{
|
|
||||||
FleckCreationData dataStatic = FleckMaker.GetDataStatic(currentPosition, map, Props.tailFleckDef, randomInRange2);
|
|
||||||
dataStatic.rotation = fleckRotationAngle;
|
|
||||||
dataStatic.rotationRate = this.fleckRotation.RandomInRange;
|
|
||||||
dataStatic.velocityAngle = velocityAngle;
|
|
||||||
dataStatic.velocitySpeed = randomInRange3;
|
|
||||||
map.flecks.CreateFleck(dataStatic);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 更新击中特效器
|
|
||||||
/// </summary>
|
|
||||||
private void UpdateHitEffecters()
|
|
||||||
{
|
|
||||||
if (activeEffecters == null || activeEffecters.Count == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var ticksGame = Find.TickManager.TicksGame;
|
|
||||||
var effectersToRemove = new List<Effecter>();
|
|
||||||
var pawnsToRemove = new List<Pawn>();
|
|
||||||
|
|
||||||
// 检查每个特效器是否应该结束
|
|
||||||
foreach (var kvp in effecterEndTicks)
|
|
||||||
{
|
|
||||||
if (ticksGame >= kvp.Value || kvp.Key == null || kvp.Key.Destroyed || !kvp.Key.Spawned)
|
|
||||||
{
|
|
||||||
pawnsToRemove.Add(kvp.Key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 清理结束的特效器
|
|
||||||
foreach (var pawn in pawnsToRemove)
|
|
||||||
{
|
|
||||||
effecterEndTicks.Remove(pawn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清理旧的特效器
|
|
||||||
/// </summary>
|
|
||||||
private void CleanupOldEffecters()
|
|
||||||
{
|
|
||||||
if (activeEffecters != null)
|
|
||||||
{
|
|
||||||
foreach (var effecter in activeEffecters)
|
|
||||||
{
|
|
||||||
effecter?.Cleanup();
|
|
||||||
}
|
|
||||||
activeEffecters.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
effecterEndTicks?.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Impact(Thing hitThing, bool blockedByShield = false)
|
|
||||||
{
|
|
||||||
CheckPathForDamage(lastTickPosition, this.ExactPosition);
|
|
||||||
|
|
||||||
if (hitThing != null && alreadyDamaged.Contains(hitThing))
|
|
||||||
{
|
|
||||||
base.Impact(null, blockedByShield);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
base.Impact(hitThing, blockedByShield);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CheckPathForDamage(Vector3 startPos, Vector3 endPos)
|
|
||||||
{
|
|
||||||
if (startPos == endPos) return;
|
|
||||||
|
|
||||||
int maxHits = Props?.maxHits ?? 1;
|
|
||||||
bool infinitePenetration = maxHits < 0;
|
|
||||||
|
|
||||||
if (!infinitePenetration && hitCounter >= maxHits) return;
|
|
||||||
|
|
||||||
Map map = this.Map;
|
|
||||||
float distance = Vector3.Distance(startPos, endPos);
|
|
||||||
Vector3 direction = (endPos - startPos).normalized;
|
|
||||||
|
|
||||||
for (float i = 0; i < distance; i += 0.8f)
|
|
||||||
{
|
|
||||||
if (!infinitePenetration && hitCounter >= maxHits) break;
|
|
||||||
|
|
||||||
Vector3 checkPos = startPos + direction * i;
|
|
||||||
var thingsInCell = new HashSet<Thing>(map.thingGrid.ThingsListAt(checkPos.ToIntVec3()));
|
|
||||||
|
|
||||||
foreach (Thing thing in thingsInCell)
|
|
||||||
{
|
|
||||||
if (thing is Pawn pawn && pawn != this.launcher && !alreadyDamaged.Contains(pawn))
|
|
||||||
{
|
|
||||||
bool shouldDamage = false;
|
|
||||||
|
|
||||||
// 情况1:如果预期目标是pawn,总是造成伤害。这允许狩猎。
|
|
||||||
if (this.intendedTarget.Thing == pawn)
|
|
||||||
{
|
|
||||||
shouldDamage = true;
|
|
||||||
}
|
|
||||||
// 情况2:总是对路径上的敌对pawn造成伤害。
|
|
||||||
else if (pawn.HostileTo(this.launcher))
|
|
||||||
{
|
|
||||||
shouldDamage = true;
|
|
||||||
}
|
|
||||||
// 情况3:如果射击本身没有标记为防止友军伤害,则对非敌对(友好,中立)造成伤害。
|
|
||||||
else if (!this.preventFriendlyFire)
|
|
||||||
{
|
|
||||||
shouldDamage = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shouldDamage)
|
|
||||||
{
|
|
||||||
ApplyPathDamage(pawn);
|
|
||||||
if (!infinitePenetration && hitCounter >= maxHits) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ApplyPathDamage(Pawn pawn)
|
|
||||||
{
|
|
||||||
Wula_PathPierce_Extension props = Props;
|
|
||||||
float falloff = props?.damageFalloff ?? 0.25f;
|
|
||||||
|
|
||||||
// 伤害衰减现在普遍适用,即使是无限穿透。
|
|
||||||
float damageMultiplier = Mathf.Pow(1f - falloff, hitCounter);
|
|
||||||
|
|
||||||
int damageAmount = (int)(this.DamageAmount * damageMultiplier);
|
|
||||||
if (damageAmount <= 0) return;
|
|
||||||
|
|
||||||
// 检查伤害阈值
|
|
||||||
if (props?.damageThreshold > 0 && damageAmount < props.damageThreshold)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var dinfo = new DamageInfo(
|
|
||||||
this.def.projectile.damageDef,
|
|
||||||
damageAmount,
|
|
||||||
this.ArmorPenetration * damageMultiplier,
|
|
||||||
this.ExactRotation.eulerAngles.y,
|
|
||||||
this.launcher,
|
|
||||||
null,
|
|
||||||
this.equipmentDef,
|
|
||||||
DamageInfo.SourceCategory.ThingOrUnknown,
|
|
||||||
this.intendedTarget.Thing);
|
|
||||||
|
|
||||||
pawn.TakeDamage(dinfo);
|
|
||||||
alreadyDamaged.Add(pawn);
|
|
||||||
hitCounter++;
|
|
||||||
|
|
||||||
// 播放击中特效
|
|
||||||
PlayHitEffects(pawn, damageAmount);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 播放击中敌人时的特效
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="pawn">被击中的Pawn</param>
|
|
||||||
/// <param name="damageAmount">造成的伤害值</param>
|
|
||||||
private void PlayHitEffects(Pawn pawn, int damageAmount)
|
|
||||||
{
|
|
||||||
if (pawn == null || pawn.Destroyed || pawn.Map == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Wula_PathPierce_Extension props = Props;
|
|
||||||
if (props == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// 是否对每个命中都播放特效
|
|
||||||
if (!props.playEffectOnEveryHit && hitCounter > 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// 播放粒子特效
|
|
||||||
PlayHitFleck(pawn);
|
|
||||||
|
|
||||||
// 播放效果器特效
|
|
||||||
PlayHitEffecter(pawn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 播放击中粒子特效
|
|
||||||
/// </summary>
|
|
||||||
private void PlayHitFleck(Pawn pawn)
|
|
||||||
{
|
|
||||||
Wula_PathPierce_Extension props = Props;
|
|
||||||
if (props == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
FleckDef fleckDef = null;
|
|
||||||
|
|
||||||
// 选择粒子:优先使用随机列表,然后使用固定粒子
|
|
||||||
if (props.randomHitFlecks != null && props.randomHitFlecks.Count > 0)
|
|
||||||
{
|
|
||||||
fleckDef = props.randomHitFlecks.RandomElement();
|
|
||||||
}
|
|
||||||
else if (props.hitFleckDef != null)
|
|
||||||
{
|
|
||||||
fleckDef = props.hitFleckDef;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fleckDef != null)
|
|
||||||
{
|
|
||||||
Vector3 position = pawn.DrawPos + props.effectOffset;
|
|
||||||
float scale = props.effectScale;
|
|
||||||
|
|
||||||
FleckCreationData data = FleckMaker.GetDataStatic(position, pawn.Map, fleckDef, scale);
|
|
||||||
pawn.Map.flecks.CreateFleck(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 播放击中效果器特效
|
|
||||||
/// </summary>
|
|
||||||
private void PlayHitEffecter(Pawn pawn)
|
|
||||||
{
|
|
||||||
Wula_PathPierce_Extension props = Props;
|
|
||||||
if (props == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
EffecterDef effecterDef = null;
|
|
||||||
|
|
||||||
// 选择效果器:优先使用随机列表,然后使用固定效果器
|
|
||||||
if (props.randomHitEffecters != null && props.randomHitEffecters.Count > 0)
|
|
||||||
{
|
|
||||||
effecterDef = props.randomHitEffecters.RandomElement();
|
|
||||||
}
|
|
||||||
else if (props.hitEffecterDef != null)
|
|
||||||
{
|
|
||||||
effecterDef = props.hitEffecterDef;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (effecterDef != null)
|
|
||||||
{
|
|
||||||
Vector3 position = pawn.DrawPos + props.effectOffset;
|
|
||||||
|
|
||||||
// 创建效果器
|
|
||||||
Effecter effecter = effecterDef.Spawn();
|
|
||||||
effecter.Trigger(new TargetInfo(pawn.Position, pawn.Map), new TargetInfo(pawn.Position, pawn.Map));
|
|
||||||
|
|
||||||
// 如果需要持续效果,添加到维护列表
|
|
||||||
if (props.effectDurationTicks > 0)
|
|
||||||
{
|
|
||||||
activeEffecters.Add(effecter);
|
|
||||||
effecterEndTicks[pawn] = Find.TickManager.TicksGame + props.effectDurationTicks;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 立即清理效果器
|
|
||||||
effecter.Cleanup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Destroy(DestroyMode mode = DestroyMode.Vanish)
|
|
||||||
{
|
|
||||||
// 清理所有特效器
|
|
||||||
CleanupOldEffecters();
|
|
||||||
base.Destroy(mode);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
private void CheckPathForDamage(Vector3 startPos, Vector3 endPos)
|
||||||
|
{
|
||||||
|
if (startPos == endPos) return;
|
||||||
|
int maxHits = Props?.maxHits ?? 1;
|
||||||
|
bool infinitePenetration = maxHits < 0;
|
||||||
|
if (!infinitePenetration && hitCounter >= maxHits) return;
|
||||||
|
Map map = this.Map;
|
||||||
|
float distance = Vector3.Distance(startPos, endPos);
|
||||||
|
Vector3 direction = (endPos - startPos).normalized;
|
||||||
|
for (float i = 0; i < distance; i += 0.8f)
|
||||||
|
{
|
||||||
|
if (!infinitePenetration && hitCounter >= maxHits) break;
|
||||||
|
Vector3 checkPos = startPos + direction * i;
|
||||||
|
var thingsInCell = new HashSet<Thing>(map.thingGrid.ThingsListAt(checkPos.ToIntVec3()));
|
||||||
|
foreach (Thing thing in thingsInCell)
|
||||||
|
{
|
||||||
|
if (thing is Pawn pawn && pawn != this.launcher && !alreadyDamaged.Contains(pawn))
|
||||||
|
{
|
||||||
|
bool shouldDamage = false;
|
||||||
|
if (this.intendedTarget.Thing == pawn)
|
||||||
|
{
|
||||||
|
shouldDamage = true;
|
||||||
|
}
|
||||||
|
else if (pawn.HostileTo(this.launcher))
|
||||||
|
{
|
||||||
|
shouldDamage = true;
|
||||||
|
}
|
||||||
|
else if (!this.preventFriendlyFire)
|
||||||
|
{
|
||||||
|
shouldDamage = true;
|
||||||
|
}
|
||||||
|
if (shouldDamage)
|
||||||
|
{
|
||||||
|
ApplyPathDamage(pawn);
|
||||||
|
if (!infinitePenetration && hitCounter >= maxHits) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void ApplyPathDamage(Pawn pawn)
|
||||||
|
{
|
||||||
|
Wula_PathPierce_Extension props = Props;
|
||||||
|
float falloff = props?.damageFalloff ?? 0.25f;
|
||||||
|
|
||||||
|
float damageMultiplier = Mathf.Pow(1f - falloff, hitCounter);
|
||||||
|
|
||||||
|
int damageAmount = (int)(this.DamageAmount * damageMultiplier);
|
||||||
|
if (damageAmount <= 0) return;
|
||||||
|
var dinfo = new DamageInfo(
|
||||||
|
this.def.projectile.damageDef,
|
||||||
|
damageAmount,
|
||||||
|
this.ArmorPenetration * damageMultiplier,
|
||||||
|
this.ExactRotation.eulerAngles.y,
|
||||||
|
this.launcher,
|
||||||
|
null,
|
||||||
|
this.equipmentDef,
|
||||||
|
DamageInfo.SourceCategory.ThingOrUnknown,
|
||||||
|
this.intendedTarget.Thing);
|
||||||
|
|
||||||
|
pawn.TakeDamage(dinfo);
|
||||||
|
alreadyDamaged.Add(pawn);
|
||||||
|
hitCounter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
using RimWorld;
|
|
||||||
using System;
|
|
||||||
using UnityEngine;
|
|
||||||
using Verse;
|
|
||||||
|
|
||||||
namespace WulaFallenEmpire
|
|
||||||
{
|
|
||||||
public class Verb_ShootBeyondTarge : Verb_ShootWithOffset
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 重写射击逻辑,直接修改当前目标为延长线目标
|
|
||||||
/// </summary>
|
|
||||||
protected override bool TryCastShot()
|
|
||||||
{
|
|
||||||
// 保存原始目标
|
|
||||||
LocalTargetInfo originalTarget = currentTarget;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// 计算延长线目标
|
|
||||||
LocalTargetInfo beyondTarget = CalculateBeyondTarget(originalTarget);
|
|
||||||
|
|
||||||
// 设置为延长线目标
|
|
||||||
currentTarget = beyondTarget;
|
|
||||||
|
|
||||||
// 调用基类射击逻辑
|
|
||||||
return base.TryCastShot();
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// 恢复原始目标
|
|
||||||
currentTarget = originalTarget;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 计算延长线目标
|
|
||||||
/// </summary>
|
|
||||||
private LocalTargetInfo CalculateBeyondTarget(LocalTargetInfo target)
|
|
||||||
{
|
|
||||||
if (!target.IsValid || caster == null || caster.Map == null)
|
|
||||||
return target;
|
|
||||||
|
|
||||||
Vector3 shooterPos = caster.DrawPos;
|
|
||||||
Vector3 targetPos = target.HasThing ?
|
|
||||||
target.Thing.DrawPos :
|
|
||||||
target.Cell.ToVector3Shifted();
|
|
||||||
|
|
||||||
Vector3 direction = (targetPos - shooterPos).normalized;
|
|
||||||
float maxRange = EffectiveRange;
|
|
||||||
Vector3 beyondTargetPos = shooterPos + direction * maxRange;
|
|
||||||
IntVec3 beyondTargetCell = beyondTargetPos.ToIntVec3();
|
|
||||||
|
|
||||||
// 确保在地图范围内
|
|
||||||
if (!beyondTargetCell.InBounds(caster.Map))
|
|
||||||
{
|
|
||||||
beyondTargetCell = beyondTargetCell.ClampInsideMap(caster.Map);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new LocalTargetInfo(beyondTargetCell);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -137,6 +137,8 @@
|
|||||||
<Compile Include="BuildingComp\WULA_TransformAtFullCapacity\TransformValidationUtility.cs" />
|
<Compile Include="BuildingComp\WULA_TransformAtFullCapacity\TransformValidationUtility.cs" />
|
||||||
<Compile Include="BuildingComp\WULA_TrapLauncher\CompProperties_TrapLauncher.cs" />
|
<Compile Include="BuildingComp\WULA_TrapLauncher\CompProperties_TrapLauncher.cs" />
|
||||||
<Compile Include="BuildingComp\WULA_TrapLauncher\CompTrapLauncher.cs" />
|
<Compile Include="BuildingComp\WULA_TrapLauncher\CompTrapLauncher.cs" />
|
||||||
|
<Compile Include="Damage\DamageDef_ExtraDamageExtension.cs" />
|
||||||
|
<Compile Include="Damage\DamageWorker_ExtraDamage.cs" />
|
||||||
<Compile Include="EventSystem\CompOpenCustomUI.cs" />
|
<Compile Include="EventSystem\CompOpenCustomUI.cs" />
|
||||||
<Compile Include="EventSystem\Condition\ConditionBase.cs" />
|
<Compile Include="EventSystem\Condition\ConditionBase.cs" />
|
||||||
<Compile Include="EventSystem\Condition\Condition_FlagExists.cs" />
|
<Compile Include="EventSystem\Condition\Condition_FlagExists.cs" />
|
||||||
@@ -347,7 +349,6 @@
|
|||||||
<Compile Include="HediffComp\HediffComp_TimedExplosion.cs" />
|
<Compile Include="HediffComp\HediffComp_TimedExplosion.cs" />
|
||||||
<Compile Include="Projectiles\Projectile_ConfigurableHellsphereCannon.cs" />
|
<Compile Include="Projectiles\Projectile_ConfigurableHellsphereCannon.cs" />
|
||||||
<Compile Include="Verb\Verb_ShootBeamSplitAndChain.cs" />
|
<Compile Include="Verb\Verb_ShootBeamSplitAndChain.cs" />
|
||||||
<Compile Include="Verb\Verb_ShootBeyondTarget.cs" />
|
|
||||||
<Compile Include="Verb\Verb_ShootShotgun.cs" />
|
<Compile Include="Verb\Verb_ShootShotgun.cs" />
|
||||||
<Compile Include="Projectiles\Projectile_CruiseMissile.cs" />
|
<Compile Include="Projectiles\Projectile_CruiseMissile.cs" />
|
||||||
<Compile Include="Verb\Verb_ShootBeamExplosive\Verb_ShootBeamExplosive.cs" />
|
<Compile Include="Verb\Verb_ShootBeamExplosive\Verb_ShootBeamExplosive.cs" />
|
||||||
@@ -387,6 +388,9 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Verb\Verb_Excalibur\Thing_ExcaliburBeam.cs" />
|
<Compile Include="Verb\Verb_Excalibur\Thing_ExcaliburBeam.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="Damage\202512031732.xml" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- 自定义清理任务,删除obj文件夹中的临时文件 -->
|
<!-- 自定义清理任务,删除obj文件夹中的临时文件 -->
|
||||||
<Target Name="CleanDebugFiles" AfterTargets="Build">
|
<Target Name="CleanDebugFiles" AfterTargets="Build">
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 521 KiB |
BIN
美术与文本源文件/Wula/Storyteller/军团/泳装.sai2
Normal file
BIN
美术与文本源文件/Wula/Storyteller/军团/泳装.sai2
Normal file
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user