public void Attacked(IntVec3 pos, Map map, CompProperties_ReactiveDefense props) { if (newattack) { newattack = false; } }
public void Aura(IntVec3 pos, Map map, CompProperties_ReactiveDefense props) { if (props.aura != null) { for (int i = pos.x - props.auraSize; i <= pos.x + props.auraSize; i++) { for (int j = pos.z - props.auraSize; j <= pos.z + props.auraSize; j++) { IntVec3 temp = new IntVec3(i, 0, j); if (temp != pos && temp.InBounds(map)) { ThingDef particle = ThingDef.Named(props.aura); List <ThingDef> thingdefs = new List <ThingDef>(); foreach (Thing t in temp.GetThingList(map)) { thingdefs.Add(t.def); } if (particle.GetCompProperties <CompProperties_AuraParticle>() != null && temp.GetFirstBuilding(map) == null && !thingdefs.Contains(ThingDef.Named(props.aura))) { particle.GetCompProperties <CompProperties_AuraParticle>().duration = props.duration; GenSpawn.Spawn(ThingDef.Named(props.aura), temp, map); } } } } } }
public void Proximity(IntVec3 pos, Map map, CompProperties_ReactiveDefense props) { for (int i = pos.x - props.proximity; i <= pos.x + props.proximity; i++) { for (int j = pos.z - props.proximity; j <= pos.z + props.proximity; j++) { IntVec3 temp = new IntVec3(i, 0, j); if (temp.InBounds(map) && temp.GetFirstPawn(map) != null && temp != pos && !temp.GetFirstPawn(map).Dead&& !temp.GetFirstPawn(map).Downed) { React(pos, map, props); } } } }
public void React(IntVec3 pos, Map map, CompProperties_ReactiveDefense props) { if (props.defenseType == CompProperties_ReactiveDefense.defType.aura) { Aura(pos, map, props); } if (props.defenseType == CompProperties_ReactiveDefense.defType.buff) { } if (props.defenseType == CompProperties_ReactiveDefense.defType.hide) { Hide(pos, map, props); } if (props.defenseType == CompProperties_ReactiveDefense.defType.projectile) { } }
public void Defend(CompProperties_ReactiveDefense props) { IntVec3 pos = base.parent.Position; Map map = base.parent.Map; if (props.defenseTrigger == CompProperties_ReactiveDefense.defTrigger.attacked) { Attacked(pos, map, props); } if (props.defenseTrigger == CompProperties_ReactiveDefense.defTrigger.health) { React(pos, map, props); } if (props.defenseTrigger == CompProperties_ReactiveDefense.defTrigger.proximity) { Proximity(pos, map, props); } }
public void Hide(IntVec3 pos, Map map, CompProperties_ReactiveDefense props) { if (props.statDefs == null || props.statDefs.Count == 0 || props.statValues == null || props.statValues.Count == 0 || props.statDefs.Count != props.statValues.Count) { return; } Pawn pawn = (Pawn)parent; if (pawn.Dead) { if (pawn.apparel.WornApparel.Count > 0) { List <Apparel> tap = pawn.apparel.WornApparel.ToList(); foreach (Apparel apparel in tap) { pawn.apparel.Remove(apparel); } } return; } if (((Pawn)parent).health.hediffSet.GetPartHealth(((Pawn)parent).RaceProps.body.corePart) < ((Pawn)parent).RaceProps.body.corePart.def.hitPoints * props.hpThreshold * ((Pawn)parent).def.race.baseHealthScale) { //Log.Error("a"); if (!hidden) { if (Props.apparel != null) { Apparel apparel = (Apparel)ThingMaker.MakeThing(Props.apparel); for (int i = 0; i < props.statDefs.Count; i++) { apparel.def.SetStatBaseValue(props.statDefs[i], props.statValues[i]); } if (ApparelUtility.HasPartsToWear(pawn, apparel.def)) { if (pawn.apparel == null) { pawn.apparel = new Pawn_ApparelTracker(pawn); } pawn.apparel.Wear(apparel, false); } } if (Props.stopAttacker && !stoppedAttacker) { ((Pawn)lastattack.Instigator).jobs.StartJob(new Job(JobDefOf.WaitWander), JobCondition.InterruptForced); stoppedAttacker = true; } ResolveHideGraphic(); hidden = true; pawn.jobs.StartJob(new Job(JobDefOf.FleeAndCower, pawn.Position), JobCondition.InterruptForced); } else { //prevent from moving pawn.pather.StopDead(); } } else { if (hidden) { if (Props.apparel != null && pawn.apparel != null) { pawn.apparel.DestroyAll(); } ResolveBaseGraphic(); hidden = false; stoppedAttacker = false; //allow to move again // pawn.pather.ResetToCurrentPosition(); pawn.pather.StartPath(pawn.Position, PathEndMode.OnCell); } } }