public override void Tick() { base.Tick(); if (ticks > 240) { Destroy(); } if (!Spawned) { return; } ticks++; if (ticks == 59) { affected = new List <Pawn>(); } if (!startBomb) { return; } GenDraw.DrawFieldEdges(MagNowCellsAround(self.Position, Map, range * ((ticks - 60) * 1f / 180f)), new Color(0.4f, 0.4f, 0.8f)); foreach (var ic in MagNowCellsAround(self.Position, Map, range * ((ticks - 60) * 1f / 180f))) { foreach (var th in Map.thingGrid.ThingsAt(ic)) { if (th is not Pawn pawn) { continue; } if (affected.Contains(pawn) || pawn == self) { continue; } if (pawn.Faction.HostileTo(self.Faction)) { var dinfo = new DamageInfo(DefDatabase <DamageDef> .GetNamed("Mag"), damage, 0, -1, self, null, null, DamageInfo.SourceCategory.ThingOrUnknown, pawn); pawn.TakeDamage(dinfo); var hediff_Magnetize = (Hediff_Volt4Skill)HediffMaker.MakeHediff(HediffDef.Named("Volt4Skill"), self); hediff_Magnetize.level = (int)self.GetLevel(); hediff_Magnetize.damage = 3; pawn.health.AddHediff(hediff_Magnetize); WarframeStaticMethods.ShowDamageAmount(pawn, damage.ToString("f0")); pawn.stances.stunner.StunFor((int)(180 * (1 + (self.GetLevel() * 1f / 30f))), self); } affected.Add(pawn); } } }
public static void Postfix(Projectile __instance, Thing hitThing) { if (hitThing == null) { return; } var tv = Traverse.Create(__instance); var launcher = tv.Field("launcher").GetValue <Thing>(); var intendedTarget = tv.Field("intendedTarget").GetValue <LocalTargetInfo>(); var equipmentDef = tv.Field("equipmentDef").GetValue <ThingDef>(); if (launcher is not Pawn pawn || !pawn.IsWarframe()) { return; } foreach (var hef in pawn.health.hediffSet.hediffs) { if (hef.def.defName == "WFMesa1Skill_End") { if (hef is Hediff_Mesa1SkillB hf) { var damage = hf.sdamage; var dinfo = new DamageInfo(DamageDefOf.Bullet, damage, 1, -1, pawn); WarframeStaticMethods.ShowDamageAmount(hitThing, damage.ToString()); if (hitThing is Pawn { Dead: true })
public void DrawHediffExtras() { var dinfo = new DamageInfo(DefDatabase<DamageDef>.GetNamed("Mag"), damage, 0, -1, pawn, null, null, DamageInfo.SourceCategory.ThingOrUnknown, pawn); pawn.TakeDamage(dinfo); WarframeStaticMethods.ShowDamageAmount(pawn, damage.ToString("f0")); FleckMaker.ThrowExplosionInterior(new Vector3(pawn.TrueCenter().x, 0, pawn.TrueCenter().z), pawn.Map, FleckDefOf.MicroSparks); }
public override void Tick() { base.Tick(); if (Find.TickManager.TicksGame - 60 < createdTick) { return; } float damage = 120 + (8 * WarframeStaticMethods.GetWFLevel(self) / 5); foreach (var iv in WarframeStaticMethods.GetCellsAround(self.Position, self.Map, range)) { foreach (var t in self.Map.thingGrid.ThingsAt(iv)) { if (t is not Pawn pawn) { continue; } if (pawn == self || pawn.Faction == self.Faction) { continue; } WarframeStaticMethods.ShowDamageAmount(pawn, damage.ToString("f0")); // float totaldamage = 0; var dinfo = new DamageInfo(DamageDefOf.Cut, damage, 1, -1, self); /* * foreach (BodyPartRecord bpr in (t as Pawn).health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Outside)) * { * (t as Pawn).TakeDamage(dinfo); * totaldamage += bpr.def.hitPoints; * dinfo.SetAmount(damage - totaldamage); * if (totaldamage > damage) * { * break; * } * } */ pawn.TakeDamage(dinfo); { var mote = (Mote)ThingMaker.MakeThing(ThingDef.Named("Mote_2ExFlash")); mote.exactPosition = pawn.Position.ToVector3Shifted(); mote.Scale = Mathf.Max(10f, 15f); mote.rotationRate = 1.2f; // mote.Scale = 0.2f; GenSpawn.Spawn(mote, pawn.Position + new IntVec3(0, 1, 0), self.Map); } } } Destroy(); }
public override void Tick() { base.Tick(); if (Find.TickManager.TicksGame - startTick < 15) { return; } GenDraw.DrawLineBetween(self.Position.ToVector3Shifted(), target.DrawPos, SimpleColor.Red); if (Find.TickManager.TicksGame - startTick == 25) { if (!target.AnimalOrWildMan() && (target.Faction == self.Faction || !target.HostileTo(self))) { self.pather.StartPath(target.Position, PathEndMode.Touch); self.Position = target.Position; self.pather.StopDead(); if (self.jobs.curJob != null) { self.jobs.curDriver.Notify_PatherArrived(); } } else if (target.AnimalOrWildMan() || target.HostileTo(self)) { var pos = getPos(target); target.pather.StartPath(pos, PathEndMode.Touch); target.Position = pos; target.pather.StopDead(); if (target.jobs.curJob != null) { target.jobs.curDriver.Notify_PatherArrived(); } target.stances.stunner.StunFor(120, self); var amount = getDMG(); WarframeStaticMethods.ShowDamageAmount(target, amount + ""); var dinfo = new DamageInfo(DamageDefOf.Cut, amount, 0, -1, self, null, null, DamageInfo.SourceCategory.ThingOrUnknown, target); target.TakeDamage(dinfo); } } if (Find.TickManager.TicksGame - startTick >= 40) { Destroy(); } }
// Token: 0x060026E7 RID: 9959 RVA: 0x00127F60 File Offset: 0x00126360 protected override void Impact(Thing hitThing) { var map = Map; base.Impact(hitThing); var battleLogEntry_RangedImpact = new BattleLogEntry_RangedImpact(launcher, hitThing, intendedTarget.Thing, equipmentDef, def, targetCoverDef); Find.BattleLog.Add(battleLogEntry_RangedImpact); if (hitThing != null) { var damageDef = def.projectile.damageDef; float amount = DamageAmount; var armorPenetration = ArmorPenetration; var y = ExactRotation.eulerAngles.y; var instigator = launcher; var thingDef = equipmentDef; var finaldmg = changeDamage(amount); var dinfo = new DamageInfo(damageDef, finaldmg, armorPenetration, y, instigator, null, thingDef, DamageInfo.SourceCategory.ThingOrUnknown, intendedTarget.Thing); if (isCR) { WarframeStaticMethods.ShowColorText(hitThing, "X3 -" + finaldmg, Color.magenta, GameFont.Medium); } else { WarframeStaticMethods.ShowDamageAmount(hitThing, finaldmg + ""); } hitThing.TakeDamage(dinfo).AssociateWithLog(battleLogEntry_RangedImpact); if (hitThing is Pawn { stances : { } } pawn&& pawn.BodySize <= def.projectile.StoppingPower + 0.001f) { pawn.stances.StaggerFor(95); } } else { SoundDefOf.BulletImpact_Ground.PlayOneShot(new TargetInfo(Position, map)); FleckMaker.Static(ExactPosition, map, FleckDefOf.ShotHit_Dirt); if (Position.GetTerrain(map).takeSplashes) { FleckMaker.WaterSplash(ExactPosition, map, Mathf.Sqrt(DamageAmount) * 1f, 4f); } } }
// Token: 0x060026E7 RID: 9959 RVA: 0x00127F60 File Offset: 0x00126360 protected override void Impact(Thing hitThingf) { Thing hitThing = target; var unused = Map; base.Impact(hitThing); var battleLogEntry_RangedImpact = new BattleLogEntry_RangedImpact(launcher, hitThing, intendedTarget.Thing, equipmentDef, def, targetCoverDef); Find.BattleLog.Add(battleLogEntry_RangedImpact); if (hitThing == null) { return; } var damageDef = def.projectile.damageDef; float Baseamount = DamageAmount; var armorPenetration = ArmorPenetration; var y = ExactRotation.eulerAngles.y; var instigator = launcher; var thingDef = equipmentDef; var amount = Baseamount * (1 + ((instigator as Pawn).GetLevel() / 6f)); var dinfo = new DamageInfo(damageDef, amount, armorPenetration, y, instigator, null, thingDef, DamageInfo.SourceCategory.ThingOrUnknown, intendedTarget.Thing); WarframeStaticMethods.ShowDamageAmount(target, amount.ToString()); hitThing.TakeDamage(dinfo).AssociateWithLog(battleLogEntry_RangedImpact); if (hitThing is Pawn { stances : { } } pawn&& pawn.BodySize <= def.projectile.StoppingPower + 0.001f) { pawn.stances.StaggerFor(95); } /* * else * { * SoundDefOf.BulletImpact_Ground.PlayOneShot(new TargetInfo(base.Position, map, false)); * MoteMaker.MakeStaticMote(this.ExactPosition, map, ThingDefOf.Mote_ShotHit_Dirt, 1f); * if (base.Position.GetTerrain(map).takeSplashes) * { * MoteMaker.MakeWaterSplash(this.ExactPosition, map, Mathf.Sqrt((float)base.DamageAmount) * 1f, 4f); * } * } */ }
//咖喱技能3 public static Command_CastSkill Skill3() { var ck = new Command_CastSkill { defaultLabel = "ValkyrSkill3.name".Translate(), icon = ContentFinder <Texture2D> .Get("Skills/ValkyrSkill3"), targetingParams = WarframeStaticMethods.JumpTP(), cooldownTime = 0.2f, range = 10f, hotKey = KeyBindingDefOf.Misc4 }; ck.action = delegate(Pawn self) { SoundDef.Named("Valkyr_3Skill").PlayOneShot(self); var wb = WarframeStaticMethods.GetBelt(self); var damage = wb.Energy * 5; var levelmul = 2 + (1 * self.GetLevel() / 30f); damage *= levelmul; foreach (var ic in WarframeStaticMethods.GetCellsAround(self.Position, self.Map, ck.range)) { foreach (var th in self.Map.thingGrid.ThingsAt(ic)) { if (th is not Pawn pawn) { continue; } if (!pawn.HostileTo(self.Faction)) { continue; } pawn.stances.stunner.StunFor(150, self); var dinfo = new DamageInfo(DamageDefOf.Blunt, damage, 0, -1, self, null, null, DamageInfo.SourceCategory.ThingOrUnknown, pawn); WarframeStaticMethods.ShowDamageAmount(pawn, damage + ""); pawn.TakeDamage(dinfo); var dataStatic = FleckMaker.GetDataStatic(pawn.Position.ToVector3(), self.Map, FleckDefOf.Smoke, Rand.Range(1.5f, 2.5f)); dataStatic.rotationRate = Rand.Range(-30f, 30f); dataStatic.velocityAngle = Rand.Range(30, 40); dataStatic.velocitySpeed = Rand.Range(0.5f, 0.7f); dataStatic.instanceColor = Color.white; self.Map.flecks.CreateFleck(dataStatic); } } var adde = wb.Energy * -0.33f; wb.AddEnergy(adde * 100); var wfdinfo = new DamageInfo(DamageDefOf.Stun, 1, 0, -1, self, null, null, DamageInfo.SourceCategory.ThingOrUnknown, self); self.TakeDamage(wfdinfo); WarframeStaticMethods.StartCooldown(self, ck.cooldownTime, 3, WarframeStaticMethods.GetArmor(self).TryGetComp <CompWarframeSkill>().Props.mana3); }; return(ck); }
protected void aImpact(Thing hitThing) { var unused = Map; GenClamor.DoClamor(this, 2.1f, ClamorDefOf.Impact); var instigator = launcher; var weaponDef = equipmentDef; var battleLogEntry_RangedImpact = new BattleLogEntry_RangedImpact(instigator, hitThing, intendedTarget.Thing, weaponDef, def, targetCoverDef); Find.BattleLog.Add(battleLogEntry_RangedImpact); if (hitThing == null) { return; } if (hitThing is Pawn thing) { if (thing.Faction == launcher.Faction) { return; } } var damageDef = def.projectile.damageDef; float amount = DamageAmount; var armorPenetration = ArmorPenetration; var y = ExactRotation.eulerAngles.y; instigator = launcher; weaponDef = equipmentDef; var dinfo = new DamageInfo(damageDef, amount, armorPenetration, y, instigator, null, weaponDef, DamageInfo.SourceCategory.ThingOrUnknown, intendedTarget.Thing); WarframeStaticMethods.ShowDamageAmount(hitThing, amount.ToString("f0")); hitThing.TakeDamage(dinfo).AssociateWithLog(battleLogEntry_RangedImpact); try { if (hitThing is Pawn { stances : { } } pawn&& pawn.BodySize <= def.projectile.StoppingPower + 0.001f) { pawn.stances.StaggerFor(95); } } catch (Exception) { // ignored } /* * else * { * // SoundDefOf.BulletImpact_Ground.PlayOneShot(new TargetInfo(base.Position, map, false)); * // MoteMaker.MakeStaticMote(this.ExactPosition, map, ThingDefOf.Mote_ShotHit_Dirt, 1f); * if (base.Position.GetTerrain(map).takeSplashes) * { * MoteMaker.MakeWaterSplash(this.ExactPosition, map, Mathf.Sqrt((float)base.DamageAmount) * 1f, 4f); * } * } */ }
//咖喱技能1 public static Command_CastSkillTargeting Skill1() { var ck = new Command_CastSkillTargeting { defaultLabel = "MagSkill1.name".Translate(), icon = ContentFinder <Texture2D> .Get("Skills/MagSkill1"), targetingParams = WarframeStaticMethods.OnlyPawn(), cooldownTime = 0.2f, range = 20f }; ck.finishAction = delegate { GenDraw.DrawFieldEdges( WarframeStaticMethods.GetCellsAround(ck.self.Position, ck.self.Map, ck.range)); }; ck.hotKey = KeyBindingDefOf.Misc5; ck.action = delegate(Pawn self, Thing target) { // GenExplosion.DoExplosion(self.Position, self.Map, 3.5f, DamageDefOf.Bomb, self, -1, -1, null, null, null, null, null, 0, 1, false, null, 0, 1, 0, false); if (!WarframeStaticMethods.GetCellsAround(self.Position, self.Map, ck.range).Contains(target.Position)) { SoundDefOf.ClickReject.PlayOneShotOnCamera(); return; } var linec = WarframeStaticMethods.GetLineCell(self, target); if (linec == null) { Messages.Message("BeBlockedByBuilding".Translate(), MessageTypeDefOf.RejectInput, false); return; } if (!(target is Pawn pawn)) { return; } var eway = self.CellsAdjacent8WayAndInside().ToList(); var finalpoc = self.Position; if (pawn.Position.x == self.Position.x) { finalpoc = pawn.Position.z > self.Position.z ? eway[5] : eway[3]; } else if (pawn.Position.z == self.Position.z) { finalpoc = pawn.Position.x > self.Position.x ? eway[7] : eway[1]; } else if (pawn.Position.x > self.Position.x) { finalpoc = pawn.Position.z > self.Position.z ? eway[8] : eway[6]; } else if (pawn.Position.x < self.Position.x) { finalpoc = pawn.Position.z > self.Position.z ? eway[2] : eway[0]; } var finalPawn = new List <Pawn>(); foreach (var ic in pawn.CellsAdjacent8WayAndInside()) { foreach (var tt in pawn.Map.thingGrid.ThingsAt(ic)) { if (tt is not Pawn thing || tt == self || tt == pawn || thing.Position == self.Position) { continue; } if (thing.Faction != self.Faction) { finalPawn.Add(thing); } } } if (pawn.Faction != self.Faction) { finalPawn.Add(pawn); } foreach (var ttg in finalPawn) { ttg.pather.StartPath(finalpoc, PathEndMode.Touch); ttg.Position = finalpoc; ttg.pather.StopDead(); if (ttg.jobs.curJob != null) { ttg.jobs.curDriver.Notify_PatherArrived(); } ttg.stances.stunner.StunFor(120, self); } SoundDef.Named("Mag_1Skill").PlayOneShot(self); float damage = 30 + (2 * WarframeStaticMethods.GetWFLevel(self) / 5); var dinfo = new DamageInfo(DefDatabase <DamageDef> .GetNamed("Mag"), damage, 1, -1, self, null, null, DamageInfo.SourceCategory.ThingOrUnknown, pawn); foreach (var p in finalPawn) { if (p.Faction == self.Faction) { continue; } WarframeStaticMethods.ShowDamageAmount(p, damage.ToString("f0")); p.TakeDamage(dinfo); } // WarframeStaticMethods.showDamageAmount(self, damage.ToString("f0")); WarframeStaticMethods.StartCooldown(self, ck.cooldownTime, 1, WarframeStaticMethods.GetArmor(self).TryGetComp <CompWarframeSkill>().Props.mana1); }; return(ck); }
protected void aImpact(Thing hitThing) { var unused = Map; GenClamor.DoClamor(this, 2.1f, ClamorDefOf.Impact); var instigator = launcher; var weaponDef = equipmentDef; var battleLogEntry_RangedImpact = new BattleLogEntry_RangedImpact(instigator, hitThing, intendedTarget.Thing, weaponDef, def, targetCoverDef); Find.BattleLog.Add(battleLogEntry_RangedImpact); if (hitThing == null) { return; } if (hitThing is Pawn thing) { if (thing.Faction == launcher.Faction) { return; } } var tg = hitThing as Pawn; var damageDef = def.projectile.damageDef; float amount = DamageAmount; var armorPenetration = ArmorPenetration; var y = ExactRotation.eulerAngles.y; instigator = launcher; weaponDef = equipmentDef; var bpr = tg?.health.hediffSet.GetRandomNotMissingPart(damageDef, BodyPartHeight.Undefined, BodyPartDepth.Inside); var dinfo = new DamageInfo(damageDef, amount, armorPenetration, y, instigator, null, weaponDef, DamageInfo.SourceCategory.ThingOrUnknown, intendedTarget.Thing); dinfo.SetHitPart(bpr); WarframeStaticMethods.ShowDamageAmount(hitThing, amount.ToString("f0")); hitThing.TakeDamage(dinfo).AssociateWithLog(battleLogEntry_RangedImpact); try { if (hitThing is Pawn { stances : { } } pawn&& pawn.BodySize <= def.projectile.StoppingPower + 0.001f) { pawn.stances.StaggerFor(95); } } catch (Exception) { // ignored } Destroy(); }
//咖喱技能1 public static Command_CastSkillTargeting Skill1() { var ck = new Command_CastSkillTargeting { defaultLabel = "ExcaliburSkill1.name".Translate(), icon = ContentFinder <Texture2D> .Get("Skills/ExcaliburSkill1"), targetingParams = WarframeStaticMethods.OnlyPawn(), cooldownTime = 0.2f, range = 10f }; ck.finishAction = delegate { GenDraw.DrawFieldEdges( WarframeStaticMethods.GetCellsAround(ck.self.Position, ck.self.Map, ck.range)); }; ck.hotKey = KeyBindingDefOf.Misc5; ck.action = delegate(Pawn self, Thing target) { // GenExplosion.DoExplosion(self.Position, self.Map, 3.5f, DamageDefOf.Bomb, self, -1, -1, null, null, null, null, null, 0, 1, false, null, 0, 1, 0, false); if (!WarframeStaticMethods.GetCellsAround(self.Position, self.Map, ck.range).Contains(target.Position)) { SoundDefOf.ClickReject.PlayOneShotOnCamera(); return; } var linec = WarframeStaticMethods.GetLineCell(self, target); if (linec == null) { Messages.Message("BeBlockedByBuilding".Translate(), MessageTypeDefOf.RejectInput, false); return; } self.pather.StartPath(target, PathEndMode.Touch); self.Position = target.Position; self.pather.StopDead(); if (self.jobs.curJob != null) { self.jobs.curDriver.Notify_PatherArrived(); } SoundDef.Named("Excalibur_SlashDash").PlayOneShot(self); float damage = 30 + (2 * WarframeStaticMethods.GetWFLevel(self) / 5); var dinfo = new DamageInfo(DamageDefOf.Cut, damage, 1, -1, self, null, null, DamageInfo.SourceCategory.ThingOrUnknown, target); foreach (var p in linec) { if (p.Faction == self.Faction) { continue; } WarframeStaticMethods.ShowDamageAmount(p, damage.ToString("f0")); p.TakeDamage(dinfo); } // WarframeStaticMethods.showDamageAmount(self, damage.ToString("f0")); WarframeStaticMethods.StartCooldown(self, ck.cooldownTime, 1, WarframeStaticMethods.GetArmor(self).TryGetComp <CompWarframeSkill>().Props.mana1); }; return(ck); }
public override void Tick() { base.Tick(); if (affected.Count < 1) { self.SetPositionDirect(opos); self.pather.StopDead(); foreach (var hed in self.health.hediffSet.hediffs) { if (hed.def.defName == "WFGod") { //self.health.RemoveHediff(hed); ((Hediff_God)hed).del = true; } } Destroy(); return; } if (self == null || self.Dead || !self.Spawned) { Destroy(); return; } var target = affected[0]; if (lastATKTick < 1 || Find.TickManager.TicksGame - lastATKTick > 60) { lastATKTick = Find.TickManager.TicksGame; var hediff = (Hediff_God)HediffMaker.MakeHediff(HediffDef.Named("WFGod"), self); self.health.AddHediff(hediff); self.stances.stunner.StunFor(180, self); if (!target.Dead) { target.stances.stunner.StunFor(180, self); self.SetPositionDirect(target.Position); } //play sound to do } //atk if ((Find.TickManager.TicksGame - lastATKTick) % 20 == 0 && hitTime < 3 && !target.Dead && target.Spawned) { var timeMul = hitTime == 2 ? 1 : 0.5f; var damags = (int)((damage + getHandATK()) * timeMul); // Log.Warning("FINAL:"+damags +" "+ getHandATK() ); var dinfo = new DamageInfo(DamageDefOf.Stab, damags, 1, -1, self); WarframeStaticMethods.ShowDamageAmount(target, damags.ToString()); target.TakeDamage(dinfo); hitTime++; SoundDefOf.Pawn_Melee_Punch_HitPawn.PlayOneShot(target); } if (Find.TickManager.TicksGame - lastATKTick != 60) { return; } affected.RemoveAt(0); hitTime = 0; }
public override void Tick() { base.Tick(); if (ticks > 180) { Destroy(); } if (!Spawned) { return; } ticks++; if (ticks == 1 || ticks == 60) { foreach (var iv in WarframeStaticMethods.GetCellsAround(self.Position, self.Map, range)) { foreach (var t in self.Map.thingGrid.ThingsAt(iv)) { if (t is not Pawn pawn) { continue; } if (pawn == self || pawn.Faction == self.Faction) { continue; } pawn.stances.stunner.StunFor(180, self); { var mote = (Mote)ThingMaker.MakeThing(ThingDef.Named("Mote_2ExFlash")); mote.exactPosition = pawn.Position.ToVector3Shifted(); mote.Scale = Mathf.Max(6f, 11f); mote.rotationRate = 1.2f; GenSpawn.Spawn(mote, pawn.Position + new IntVec3(0, 1, 0), self.Map); } WarframeStaticMethods.ShowDamageAmount(pawn, (damage * 0.3f).ToString("f0")); var dinfo = new DamageInfo(DamageDefOf.Crush, damage * 0.3f, 1, -1, self); var bprs = pawn.health.hediffSet.GetNotMissingParts(); var canHitPart = new List <BodyPartRecord>(); if (pawn.RaceProps.IsFlesh) { foreach (var bpr in bprs) { if (bpr.groups != null && bpr.groups.Contains(BodyPartGroupDefOf.Torso)) { canHitPart.Add(bpr); } } } else { foreach (var bpr in bprs) { if (bpr.def.tags != null && bpr.def.tags.Contains(BodyPartTagDefOf.MovingLimbCore)) { canHitPart.Add(bpr); } } } if (canHitPart.Count <= 0) { continue; } dinfo.SetHitPart(canHitPart.RandomElement()); pawn.TakeDamage(dinfo); } } } else if (ticks == 110) //last attack { foreach (var iv in WarframeStaticMethods.GetCellsAround(self.Position, self.Map, range)) { foreach (var t in self.Map.thingGrid.ThingsAt(iv)) { if (t is not Pawn pawn) { continue; } if (pawn == self || pawn.Faction == self.Faction) { continue; } pawn.stances.stunner.StunFor(180, self); { var mote = (Mote)ThingMaker.MakeThing(ThingDef.Named("Mote_ExFlash")); mote.exactPosition = pawn.Position.ToVector3Shifted(); mote.Scale = Mathf.Max(10f, 15f); mote.rotationRate = 1.2f; GenSpawn.Spawn(mote, pawn.Position + new IntVec3(0, 1, 0), self.Map); } WarframeStaticMethods.ShowDamageAmount(pawn, damage.ToString("f0")); var dinfo = new DamageInfo(DamageDefOf.Crush, damage, 1, -1, self); var bprs = pawn.health.hediffSet.GetNotMissingParts(); var canHitPart = new List <BodyPartRecord>(); if (pawn.RaceProps.IsFlesh) { foreach (var bpr in bprs) { if (bpr.groups != null && bpr.groups.Contains(BodyPartGroupDefOf.Torso)) { canHitPart.Add(bpr); } } } foreach (var bpr in bprs) { if (bpr.def.tags != null && bpr.def.tags.Contains(BodyPartTagDefOf.MovingLimbCore)) { canHitPart.Add(bpr); } } if (canHitPart.Count <= 0) { continue; } dinfo.SetHitPart(canHitPart.RandomElement()); pawn.TakeDamage(dinfo); } } } }
//咖喱技能1 public static Command_CastSkill Skill1() { var ck = new Command_CastSkillTargetingFloor { defaultLabel = "VoltSkill1.name".Translate(), icon = ContentFinder <Texture2D> .Get("Skills/VoltSkill1"), targetingParams = WarframeStaticMethods.JumpTP(), cooldownTime = 0.2f, range = 11f }; ck.finishAction = delegate { GenDraw.DrawRadiusRing(UI.MouseCell(), 5f * (1 + (ck.self.GetLevel() * 1f / 30f))); GenDraw.DrawFieldEdges(WarframeStaticMethods.GetCellsAround(ck.self.Position, ck.self.Map, ck.range)); }; ck.hotKey = KeyBindingDefOf.Misc5; ck.action = delegate(Pawn self, LocalTargetInfo target) { // GenExplosion.DoExplosion(self.Position, self.Map, 3.5f, DaVolteDefOf.Bomb, self, -1, -1, null, null, null, null, null, 0, 1, false, null, 0, 1, 0, false); if (!WarframeStaticMethods.GetCellsAround(self.Position, self.Map, ck.range).Contains(target.Cell)) { SoundDefOf.ClickReject.PlayOneShotOnCamera(); return; } var cells = new List <IntVec3>(); var num = GenRadial.NumCellsInRadius(5f * (1 + (ck.self.GetLevel() * 1f / 30f))); for (var i = 0; i < num; i++) { cells.Add(target.Cell + GenRadial.RadialPattern[i]); } var ps = 0; float damage = 20 + (2 * WarframeStaticMethods.GetWFLevel(self) / 5); var dinfo = new DamageInfo(DefDatabase <DamageDef> .GetNamed("Mag"), damage, 0, -1, self); foreach (var ic in cells) { foreach (var th in self.Map.thingGrid.ThingsAt(ic)) { if (th is not Pawn pawn || pawn.Faction == self.Faction) { continue; } ps++; pawn.stances.stunner.StunFor(180, self); pawn.TakeDamage(dinfo); WarframeStaticMethods.ShowDamageAmount(pawn, damage.ToString("f0")); if (ps >= 2 * (1 + (self.GetLevel() * 1f / 10f))) { break; } } if (ps >= 2 * (1 + (self.GetLevel() * 1f / 10f))) { break; } } SoundDef.Named("Volt_1Skill").PlayOneShot(self); WarframeStaticMethods.StartCooldown(self, ck.cooldownTime, 1, WarframeStaticMethods.GetArmor(self).TryGetComp <CompWarframeSkill>().Props.mana1); }; return(ck); }