protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDestroyedOrNull(TargetIndex.A); Toil gotoThing = new Toil(); gotoThing.initAction = delegate { this.pawn.pather.StartPath(this.TargetThingA, PathEndMode.Touch); }; gotoThing.defaultCompleteMode = ToilCompleteMode.PatherArrival; gotoThing.FailOnDespawnedNullOrForbidden(TargetIndex.A); yield return(gotoThing); Toil enchanting = new Toil();//actions performed to enchant an item enchanting.FailOnCannotTouch(TargetIndex.A, PathEndMode.Touch); enchanting.FailOnDestroyedOrNull(TargetIndex.A); enchanting.initAction = delegate { actor = enchanting.actor; thing = TargetThingA; thingLoc = thing.Position; if (!(thing.def.IsMeleeWeapon || thing.def.IsRangedWeapon || thing.def.IsApparel)) { actor.jobs.EndCurrentJob(JobCondition.Incompletable, true); Log.Message("Failed to initialize enchanting - invalid item type."); } }; enchanting.tickAction = delegate { if (thing.Position != thingLoc || thing.Destroyed) { actor.jobs.EndCurrentJob(JobCondition.Incompletable, true); Log.Message("Failed to complete enchanting - item being enchanted not at enchanting location or destroyed"); } if (Find.TickManager.TicksGame % 5 == 0) { TM_MoteMaker.ThrowEnchantingMote(TargetLocA.ToVector3Shifted(), actor.Map, .6f); } }; enchanting.WithProgressBar(TargetIndex.A, delegate { if (thing == null) { return(1f); } return(1f - (float)enchanting.actor.jobs.curDriver.ticksLeftThisToil / 240); }, false, 0f); enchanting.defaultCompleteMode = ToilCompleteMode.Delay; enchanting.defaultDuration = 240; enchanting.AddFinishAction(delegate { CompEnchantedItem enchantment = thing.TryGetComp <CompEnchantedItem>(); CompEnchant enchantingItem = actor.TryGetComp <CompEnchant>(); CompAbilityUserMagic pawnComp = actor.TryGetComp <CompAbilityUserMagic>(); if (enchantment != null && enchantingItem != null && enchanting.actor.jobs.curDriver.ticksLeftThisToil < 1) { EnchantItem(enchantingItem.enchantingContainer[0], enchantment); enchantingItem.enchantingContainer[0].Destroy(); pawnComp.Mana.CurLevel -= .5f; MoteMaker.ThrowText(TargetLocA.ToVector3Shifted(), actor.Map, "TM_Enchanted".Translate(), -1); SoundStarter.PlayOneShotOnCamera(TorannMagicDefOf.ItemEnchanted, null); //DestroyEnchantingStone(enchantingItem.innerContainer[0]); } else { Log.Message("Detected null enchanting comp."); } }); yield return(enchanting); }
private static void DoBlink(Pawn caster, IntVec3 targetCell, Thing carriedThing) { JobDef retainJobDef = caster.CurJobDef; int retainCount = 1; LocalTargetInfo retainTargetA = caster.CurJob.targetA; if (retainTargetA.Thing != null && retainTargetA.Thing.stackCount != 1) { retainCount = retainTargetA.Thing.stackCount; } LocalTargetInfo retainTargetB = caster.CurJob.targetB; LocalTargetInfo retainTargetC = caster.CurJob.targetC; Pawn p = caster; Thing cT = carriedThing; if (cT != null && cT.stackCount != 1) { retainCount = cT.stackCount; } Map map = caster.Map; IntVec3 casterCell = caster.Position; bool selectCaster = false; if (Find.Selector.FirstSelectedObject == caster) { selectCaster = true; } try { ThingDef moteThrown = null; Vector3 moteVector = TM_Calc.GetVector(casterCell, targetCell); float angle = moteVector.ToAngleFlat(); if (angle >= -135 && angle < -45) //north { moteThrown = ThingDef.Named("Mote_DWPhase_North"); } else if (angle >= 45 && angle < 135) //south { moteThrown = ThingDef.Named("Mote_DWPhase_South"); } else if (angle >= -45 && angle < 45) //east { moteThrown = ThingDef.Named("Mote_DWPhase_East"); } else //west { moteThrown = ThingDef.Named("Mote_DWPhase_West"); } for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .2f, .1f, .5f, 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); } TM_MoteMaker.ThrowGenericMote(moteThrown, caster.DrawPos, caster.Map, 1.4f, .1f, 0f, .4f, 0, 5f, (Quaternion.AngleAxis(90, Vector3.up) * moteVector).ToAngleFlat(), 0); bool drafted = caster.drafter.Drafted; caster.DeSpawn(); GenSpawn.Spawn(p, targetCell, map); if (carriedThing != null) { carriedThing.DeSpawn(); GenPlace.TryPlaceThing(cT, targetCell, map, ThingPlaceMode.Near); //GenSpawn.Spawn(cT, targetCell, map); } if (selectCaster) { Find.Selector.Select(caster, false, true); } for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .4f, .1f, Rand.Range(.8f, 1.2f), 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); //TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Casting, caster.DrawPos, caster.Map, Rand.Range(1.4f, 2f), .2f, .05f, Rand.Range(.4f, .6f), Rand.Range(-200, 200), 0, 0, 0); } Vector3 drawPos = caster.DrawPos + (-2 * moteVector); TM_MoteMaker.ThrowGenericMote(moteThrown, drawPos, caster.Map, 1.4f, .1f, .3f, 0f, 0, 8f, (Quaternion.AngleAxis(90, Vector3.up) * moteVector).ToAngleFlat(), 0); if (caster.drafter == null) { caster.drafter = new Pawn_DraftController(caster); } if (drafted) { caster.drafter.Drafted = true; } Job job = new Job(retainJobDef, retainTargetA, retainTargetB, retainTargetC) { count = retainCount }; //caster.jobs.TryTakeOrderedJob(job, JobTag.Misc); caster.jobs.StartJob(job); } catch { if (!caster.Spawned) { GenSpawn.Spawn(p, casterCell, map); } } }
public override void PostPreApplyDamage(DamageInfo dinfo, out bool absorbed) { bool flag = dinfo.Weapon != null; if (flag) { bool flag2 = !dinfo.Weapon.IsMeleeWeapon && dinfo.WeaponBodyPartGroup == null && GetPawn != null; if (flag2) { bool hasCompActivatableEffect = this.HasCompActivatableEffect; if (hasCompActivatableEffect) { bool?flag3 = new bool?((bool)AccessTools.Method(this.GetActivatableEffect.GetType(), "IsActive", null, null).Invoke(this.GetActivatableEffect, null)); bool flag4 = flag3 == false; if (flag4) { absorbed = false; return; } } float deflectionChance = this.DeflectionChance; float meleeSkill = GetPawn.skills.GetSkill(this.Props.deflectSkill).Level; CompAbilityUserMagic holder = GetPawn.GetComp <CompAbilityUserMagic>(); deflectionChance += meleeSkill * this.Props.deflectRatePerSkillPoint; if (holder != null && !holder.IsMagicUser && (this.parent.def.defName == "TM_DefenderStaff" || this.parent.def.defName == "TM_BlazingPowerStaff")) { deflectionChance = 0; } int num = (int)(deflectionChance * 100f); bool flag5 = Rand.Range(1, 100) > num; if (flag5) { absorbed = false; this.lastShotReflected = false; return; } //splicing in TM handling of reflection Thing instigator = dinfo.Instigator; Vector3 drawPos = this.GetPawn.DrawPos; drawPos.x += ((instigator.DrawPos.x - drawPos.x) / 20f) + Rand.Range(-.2f, .2f); drawPos.z += ((instigator.DrawPos.z - drawPos.z) / 20f) + Rand.Range(-.2f, .2f); TM_MoteMaker.ThrowSparkFlashMote(drawPos, this.GetPawn.Map, 2f); Thing thing = new Thing(); thing.def = dinfo.Weapon; if (instigator is Pawn) { Pawn shooterPawn = instigator as Pawn; if (!dinfo.Weapon.IsMeleeWeapon && dinfo.WeaponBodyPartGroup == null) { TM_CopyAndLaunchProjectile.CopyAndLaunchThing(shooterPawn.equipment.PrimaryEq.PrimaryVerb.verbProps.defaultProjectile, this.GetPawn, instigator, shooterPawn, ProjectileHitFlags.IntendedTarget, null); } } //no longer using comp deflector handling //this.ResolveDeflectVerb(); //this.GiveDeflectJob(dinfo); dinfo.SetAmount(0); absorbed = true; // true; return; } } absorbed = false; }
private static void DoPhase(Pawn caster, IntVec3 targetCell, PawnAbility ability, Thing carriedThing) { JobDef retainJobDef = caster.CurJobDef; LocalTargetInfo retainTargetA = caster.CurJob.targetA; int retainCount = 1; if (retainTargetA.Thing != null && retainTargetA.Thing.stackCount != 1) { retainCount = retainTargetA.Thing.stackCount; } LocalTargetInfo retainTargetB = caster.CurJob.targetB; LocalTargetInfo retainTargetC = caster.CurJob.targetC; Pawn p = caster; Thing cT = carriedThing; if (cT != null && cT.stackCount != 1) { retainCount = cT.stackCount; } Map map = caster.Map; IntVec3 casterCell = caster.Position; bool selectCaster = false; if (Find.Selector.FirstSelectedObject == caster) { selectCaster = true; } try { for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .4f, .1f, Rand.Range(.8f, 1.2f), 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Enchanting, caster.DrawPos, caster.Map, Rand.Range(1.4f, 2f), .2f, .05f, Rand.Range(.4f, .6f), Rand.Range(-200, 200), 0, 0, 0); } caster.DeSpawn(); GenSpawn.Spawn(p, targetCell, map); if (carriedThing != null) { carriedThing.DeSpawn(); GenPlace.TryPlaceThing(cT, targetCell, map, ThingPlaceMode.Near); //GenSpawn.Spawn(cT, targetCell, map); } caster.GetComp <CompAbilityUserMight>().MightUserXP -= 50; ability.PostAbilityAttempt(); if (selectCaster) { Find.Selector.Select(caster, false, true); } for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .4f, .1f, Rand.Range(.8f, 1.2f), 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Enchanting, caster.DrawPos, caster.Map, Rand.Range(1.4f, 2f), .2f, .05f, Rand.Range(.4f, .6f), Rand.Range(-200, 200), 0, 0, 0); } Job job = new Job(retainJobDef, retainTargetA, retainTargetB, retainTargetC) { count = retainCount, playerForced = false }; //caster.jobs.TryTakeOrderedJob(); caster.jobs.StartJob(job); } catch { if (!caster.Spawned) { GenSpawn.Spawn(p, casterCell, map); } } }