protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; PawnKindDef pawnKindDef; if (!this.TryFindAnimalKind(map.Tile, out pawnKindDef)) { return(false); } IntVec3 intVec; IntVec3 near; if (!this.TryFindStartAndEndCells(map, out intVec, out near)) { return(false); } Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); List <Pawn> list = this.GenerateAnimals(pawnKindDef, map.Tile); for (int i = 0; i < list.Count; i++) { Pawn newThing = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null); GenSpawn.Spawn(newThing, loc, map, rot, WipeMode.Vanish, false); newThing.health.AddHediff(HediffDef.Named("AA_CrushingEverything")); Find.LetterStack.ReceiveLetter("LetterLabelSummitCrab".Translate(), "SummitCrab".Translate(), LetterDefOf.ThreatBig, newThing, null, null); } LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(near, LocomotionUrgency.Walk, 12f, false, false), map, list); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; PawnKindDef pawnKindDef = PawnKindDef.Named("AA_ArcticLion"); IntVec3 intVec; if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal)) { return(false); } List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals(pawnKindDef, map.Tile, 300); Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null); GenSpawn.Spawn(pawn, loc, map, rot, WipeMode.Vanish, false); pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent, null, false, false, null, false); pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000); pawn.health.AddHediff(HediffDef.Named("AA_InvisibleArcticLion")); } Find.LetterStack.ReceiveLetter("LetterLabelManhuntingArcticLion".Translate(), "ManhuntingArcticLion".Translate(), LetterDefOf.ThreatBig, null, null, null); Find.TickManager.slower.SignalForceNormalSpeedShort(); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; if (!TryFindAnimalKind(map.Tile, out PawnKindDef animalKind)) { return(false); } if (!TryFindStartAndEndCells(map, out IntVec3 start, out IntVec3 end)) { return(false); } Rot4 rot = Rot4.FromAngleFlat((map.Center - start).AngleFlat); List <Pawn> list = GenerateAnimals(animalKind, map.Tile); for (int i = 0; i < list.Count; i++) { Pawn newThing = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(start, map, 10); GenSpawn.Spawn(newThing, loc, map, rot); } LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(end, LocomotionUrgency.Walk), map, list); string text = string.Format(def.letterText, animalKind.GetLabelPlural()).CapitalizeFirst(); string label = string.Format(def.letterLabel, animalKind.GetLabelPlural().CapitalizeFirst()); Find.LetterStack.ReceiveLetter(label, text, def.letterDef, list[0]); return(true); }
void TransformShadows(LayerSubMesh mesh) { if (mesh.uvs.Count == 0) { return; } var rot = Rot4.FromAngleFlat(target); var uvs = mesh.uvs; var vertsc = mesh.verts.Count; var origVerts = NoAllocHelpers.ExtractArrayFromListT(mesh.verts); Util.ResizeIfNeeded(ref tempVerts, vertsc); for (int i = 0; i <= vertsc - 5; i += 5) { var offset = uvs[i / 10]; if (offset == Vector3.zero) { Array.Copy(origVerts, i, tempVerts, i, 5); continue; } var r = offset.RotatedBy(rot) - offset; tempVerts[i] = origVerts[i] + r; tempVerts[i + 1] = origVerts[i + 1] + r; tempVerts[i + 2] = origVerts[i + 2] + r; tempVerts[i + 3] = origVerts[i + 3] + r; tempVerts[i + 4] = origVerts[i + 4] + r; } mesh.mesh.SetVertices(tempVerts, vertsc); }
public static bool Prefix(Building_Shield __instance) { var thingsWithinRadius = new HashSet <Thing>(__instance.ThingsWithinRadius); var thingsWithinScanArea = new HashSet <Thing>(__instance.ThingsWithinScanArea); foreach (var thing in thingsWithinScanArea) { // Try and block projectiles from outside if (thing is ProjectileCE proj && proj.BlockableByShield(__instance)) { var launcher = NonPublicFields.CombatExtended.ProjectileCE_launcher.GetValue(proj) as Thing; if (launcher != null && !thingsWithinRadius.Contains(launcher)) { var explosiveProj = proj as ProjectileCE_Explosive; // Explosives are handled separately if (explosiveProj == null) { __instance.AbsorbDamage(proj.def.projectile.GetDamageAmount(1), proj.def.projectile.damageDef, proj.ExactRotation.eulerAngles.y); } proj.Position += Rot4.FromAngleFlat((__instance.Position - proj.Position).AngleFlat).Opposite.FacingCell; NonPublicMethods.CombatExtended.ProjectileCE_ImpactSomething(proj); if (explosiveProj != null) { NonPublicMethods.CombatExtended.ProjectileCE_Explosive_Explode(explosiveProj); } } } } return(false); }
void TransformUVs(LayerSubMesh mesh) { // Fix texture flip if (GraphicPrintPatch.matData.TryGetValue(mesh.material, out var matData)) { var fullRot = GenMath.PositiveMod(matData.Item2.AsInt - Rot4.FromAngleFlat(target).AsInt, 4); var graphic = matData.Item1; var flipped = fullRot == 1 && graphic.EastFlipped || fullRot == 3 && graphic.WestFlipped ? 1 : 0; var origUvs = Printer_Plane.defaultUvs; var uvsc = mesh.uvs.Count; Util.ResizeIfNeeded(ref tempUVs, uvsc); for (int i = 0; i < uvsc; i += 4) { tempUVs[i + (3 * flipped & 3)] = origUvs[0]; tempUVs[i + (1 + flipped & 3)] = origUvs[1]; tempUVs[i + (2 + 3 * flipped & 3)] = origUvs[2]; tempUVs[i + (3 + flipped & 3)] = origUvs[3]; } mesh.mesh.SetUVs(tempUVs, uvsc); } }
protected override bool TryExecuteWorker(IncidentParms parms) { var map = (Map)parms.target; if (!ManhunterPackIncidentUtility.TryFindManhunterAnimalKind(parms.points, map.Tile, out var pawnKindDef)) { return(false); } if (!RCellFinder.TryFindRandomPawnEntryCell(out var intVec, map, CellFinder.EdgeRoadChance_Animal)) { return(false); } var list = ManhunterPackIncidentUtility.GenerateAnimals(pawnKindDef, map.Tile, parms.points * 0.2f); var rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); for (var i = 0; i < list.Count; i++) { var deviljho = PawnKindDefOf.Deviljho; var pawn = PawnGenerator.GeneratePawn(deviljho); var loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10); GenSpawn.Spawn(pawn, loc, map, rot); pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 135000); } Find.LetterStack.ReceiveLetter("LetterLabelDeviljho".Translate(), "Deviljholetter".Translate(pawnKindDef.GetLabelPlural()), LetterDefOf.ThreatBig, list[0]); Find.TickManager.slower.SignalForceNormalSpeedShort(); LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical); LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important); return(true); }
// Token: 0x0600000E RID: 14 RVA: 0x0000221C File Offset: 0x0000041C protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; PawnKindDef named = DefDatabase <PawnKindDef> .GetNamed("KillerRabbit", true); IntVec3 intVec; bool flag = !RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal, false, null); bool result; if (flag) { result = false; } else { List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals(named, map.Tile, parms.points * 1f); Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null); GenSpawn.Spawn(pawn, loc, map, rot, WipeMode.Vanish, false); pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent, null, false, false, null, false); pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000); } Find.LetterStack.ReceiveLetter(Translator.Translate("LetterLabelManhunterPackArrived"), TranslatorFormattedStringExtensions.Translate("ManhunterPackArrived", named.GetLabelPlural(-1)), LetterDefOf.ThreatBig, list[0], null, null); Find.TickManager.slower.SignalForceNormalSpeedShort(); LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical); LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important); result = true; } return(result); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; PawnKindDef pawnKindDef = PawnKindDef.Named("AA_FeraliskClutchMother"); IntVec3 intVec; if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal)) { return(false); } Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); IntVec3 loc2 = CellFinder.RandomClosewalkCellNear(intVec, map, 1, null); Pawn newThing = PawnGenerator.GeneratePawn(pawnKindDef, null); newThing.gender = Gender.Female; GenSpawn.Spawn(newThing, loc2, map, WipeMode.Vanish); Find.LetterStack.ReceiveLetter("LetterLabelFeraliskClutchMother".Translate(), "FeraliskClutchMother".Translate(), LetterDefOf.ThreatBig, newThing, null, null); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; PawnKindDef pawnKindDef; if (!ManhunterPackIncidentUtility.TryFindManhunterAnimalKind(parms.points, map.Tile, out pawnKindDef)) { return(false); } IntVec3 intVec; if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal, null)) { return(false); } List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals(pawnKindDef, map.Tile, parms.points * 1f); Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null); GenSpawn.Spawn(pawn, loc, map, rot, WipeMode.Vanish, false); pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent, null, false, false, null, false); pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000); } Find.LetterStack.ReceiveLetter("LetterLabelManhunterPackArrived".Translate(), "ManhunterPackArrived".Translate(new object[] { pawnKindDef.GetLabelPlural(-1) }), LetterDefOf.ThreatBig, list[0], null, null); Find.TickManager.slower.SignalForceNormalSpeedShort(); LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical); LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; PawnKindDef pawnKindDef; if (!this.TryFindAnimalKind(map.Tile, out pawnKindDef)) { return(false); } IntVec3 intVec; IntVec3 near; if (!this.TryFindStartAndEndCells(map, out intVec, out near)) { return(false); } Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); List <Pawn> list = this.GenerateAnimals(pawnKindDef, map.Tile); for (int i = 0; i < list.Count; i++) { Pawn newThing = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null); GenSpawn.Spawn(newThing, loc, map, rot, WipeMode.Vanish, false); } LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(near, LocomotionUrgency.Walk, 12f, false, false), map, list); string text = string.Format(this.def.letterText, pawnKindDef.GetLabelPlural(-1)).CapitalizeFirst(); string label = string.Format(this.def.letterLabel, pawnKindDef.GetLabelPlural(-1).CapitalizeFirst()); Find.LetterStack.ReceiveLetter(label, text, this.def.letterDef, list[0], null, null); return(true); }
//public TM_Skyfaller() //{ // this.innerContainer = new ThingOwner<Thing>(this); //} //public override void ExposeData() //{ // base.ExposeData(); // Scribe_Deep.Look<ThingOwner>(ref this.innerContainer, "innerContainer", new object[] // { // this // }); // Scribe_Values.Look<int>(ref this.ticksToImpact, "ticksToImpact", 0, false); // Scribe_Values.Look<float>(ref this.angle, "angle", 0f, false); // Scribe_Values.Look<float>(ref this.shrapnelDirection, "shrapnelDirection", 0f, false); //} //public override void PostMake() //{ // base.PostMake(); // if (this.def.skyfaller.MakesShrapnel) // { // this.shrapnelDirection = Rand.Range(0f, 360f); // } //} public override void SpawnSetup(Map map, bool respawningAfterLoad) { base.SpawnSetup(map, respawningAfterLoad); if (!respawningAfterLoad) { this.ticksToImpact = this.def.skyfaller.ticksToImpactRange.RandomInRange; if (this.def.skyfaller.MakesShrapnel) { float num = GenMath.PositiveMod(this.shrapnelDirection, 360f); if (num < 270f && num >= 90f) { this.angle = Rand.Range(0f, 33f); } else { this.angle = Rand.Range(-33f, 0f); } } else { this.angle = -80f; } if (this.def.rotatable && this.innerContainer.Any) { base.Rotation = Rot4.FromAngleFlat(this.angle - 90f);//this.innerContainer[0].Rotation; } } }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; PawnKindDef bossKind = def.pawnKind; PawnKindDef animalKind = GetAnimalKind(parms.points, map.Tile); if (bossKind == null || animalKind == null || ManhunterPackIncidentUtility.GetAnimalsCount(animalKind, (parms.points * PointsFactor) - bossKind.combatPower) <= 0) { return(false); } IntVec3 result = parms.spawnCenter; if (!result.IsValid && !RCellFinder.TryFindRandomPawnEntryCell(out result, map, CellFinder.EdgeRoadChance_Animal)) { return(false); } List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals(bossKind, map.Tile, bossKind.combatPower, 1); list.AddRange(ManhunterPackIncidentUtility.GenerateAnimals(animalKind, map.Tile, (parms.points * PointsFactor) - bossKind.combatPower, parms.pawnCount)); Rot4 rot = Rot4.FromAngleFlat((map.Center - result).AngleFlat); for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(result, map, 10); QuestUtility.AddQuestTag(GenSpawn.Spawn(pawn, loc, map, rot), parms.questTag); pawn.health.AddHediff(HediffDefOf.Scaria); pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent); pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(AnimalsStayDurationMin, AnimalsStayDurationMax); } TaggedString labelString = null; if (def.letterLabel != null) { labelString = def.letterLabel; } else { labelString = "LetterLabelManhunterPackArrived".Translate(); } TaggedString textString = null; if (def.letterText != null) { textString = def.letterText; } else { textString = "ManhunterPackArrived".Translate(animalKind.GetLabelPlural()); } SendStandardLetter(labelString, textString, LetterDefOf.ThreatBig, parms, list[0]); Find.TickManager.slower.SignalForceNormalSpeedShort(); LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical); LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; PawnKindDef animalKind = parms.pawnKind; if ((animalKind == null && !ManhunterPackIncidentUtility.TryFindManhunterAnimalKind(parms.points, map.Tile, out animalKind)) || ManhunterPackIncidentUtility.GetAnimalsCount(animalKind, parms.points) == 0) { return(false); } IntVec3 result = parms.spawnCenter; if (!result.IsValid && !RCellFinder.TryFindRandomPawnEntryCell(out result, map, CellFinder.EdgeRoadChance_Animal)) { return(false); } List <Pawn> list = ManhunterPackIncidentUtility.GenerateAnimals_NewTmp(animalKind, map.Tile, parms.points * 1f, parms.pawnCount); Rot4 rot = Rot4.FromAngleFlat((map.Center - result).AngleFlat); for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(result, map, 10); QuestUtility.AddQuestTag(GenSpawn.Spawn(pawn, loc, map, rot), parms.questTag); pawn.health.AddHediff(HediffDefOf.Scaria); pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent); pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000); } SendStandardLetter("LetterLabelManhunterPackArrived".Translate(), "ManhunterPackArrived".Translate(animalKind.GetLabelPlural()), LetterDefOf.ThreatBig, parms, list[0]); Find.TickManager.slower.SignalForceNormalSpeedShort(); LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical); LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important); return(true); }
private static void SendCaravan(FCEvent evt) { Map playerHomeMap = Find.World.GetComponent <FactionFC>().TaxMap; if (DoDelayCaravanDueToDanger(evt)) { return; } MakeDeliveryLetterAndMessage(evt); List <Pawn> pawns = new List <Pawn>(); while (evt.goods.Count() > 0) { Pawn pawn = PawnGenerator.GeneratePawn(FCPawnGenerator.WorkerOrMilitaryRequest()); Thing next = evt.goods.First(); if (pawn.carryTracker.innerContainer.TryAdd(next)) { evt.goods.Remove(next); } pawns.Add(pawn); } PawnsArrivalModeWorker_EdgeWalkIn pawnsArrivalModeWorker = new PawnsArrivalModeWorker_EdgeWalkIn(); IncidentParms parms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.FactionArrival, playerHomeMap); parms.spawnRotation = Rot4.FromAngleFlat((((Map)parms.target).Center - parms.spawnCenter).AngleFlat); RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, playerHomeMap, CellFinder.EdgeRoadChance_Friendly); pawnsArrivalModeWorker.Arrive(pawns, parms); LordMaker.MakeNewLord(FCPawnGenerator.WorkerOrMilitaryRequest().Faction, new LordJob_DeliverSupplies(parms.spawnCenter), playerHomeMap, pawns); }
public override bool TryResolveRaidSpawnCenter(IncidentParms parms) { Map map = (Map)parms.target; if (!parms.spawnCenter.IsValid && !RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, map, CellFinder.EdgeRoadChance_Hostile, null)) { return(false); } parms.spawnRotation = Rot4.FromAngleFlat((map.Center - parms.spawnCenter).AngleFlat); return(true); }
void TransformVerts(LayerSubMesh mesh) { var offset = Rot4.FromAngleFlat(target); var offseti = offset.AsInt; var uvs = mesh.uvs; var vertsc = mesh.verts.Count; var origVerts = NoAllocHelpers.ExtractArrayFromListT(mesh.verts); // Rotate around a center if (PrintPlanePatch.plantMats.Contains(mesh.material) || GraphicPrintPatch.graphicSingle.Contains(mesh.material)) { if (uvs.Count * 4 != vertsc) { Log.ErrorOnce($"Carousel: Bad material {mesh.material}", mesh.material.GetHashCode()); return; } Util.ResizeIfNeeded(ref tempVerts, vertsc); for (int i = 0; i < vertsc; i += 4) { // The mesh data lists are only used during mesh building and are otherwise unused // In between mesh rebuilding, Carousel uses the uv list to store object centers for rotation var c = uvs[i / 4]; tempVerts[i] = c + (origVerts[i] - c).RotatedBy(offset); tempVerts[i + 1] = c + (origVerts[i + 1] - c).RotatedBy(offset); tempVerts[i + 2] = c + (origVerts[i + 2] - c).RotatedBy(offset); tempVerts[i + 3] = c + (origVerts[i + 3] - c).RotatedBy(offset); } mesh.mesh.SetVertices(tempVerts, vertsc); } // Exchange vertices if (GraphicPrintPatch.matData.ContainsKey(mesh.material) || LinkedPrintPatch.linkedMaterials.Contains(mesh.material)) { Util.ResizeIfNeeded(ref tempVerts, vertsc); for (int i = 0; i < vertsc; i += 4) { tempVerts[i].SetXZY(ref origVerts[i + (offseti & 3)], origVerts[i].y); tempVerts[i + 1].SetXZY(ref origVerts[i + (offseti + 1 & 3)], origVerts[i + 1].y); tempVerts[i + 2].SetXZY(ref origVerts[i + (offseti + 2 & 3)], origVerts[i + 2].y); tempVerts[i + 3].SetXZY(ref origVerts[i + (offseti + 3 & 3)], origVerts[i + 3].y); } mesh.mesh.SetVertices(tempVerts, vertsc); } }
// Token: 0x06000029 RID: 41 RVA: 0x00002DD8 File Offset: 0x00000FD8 internal void JPRotatePilot(Pawn pilot, IntVec3 targCell, out float angle) { angle = Vector3Utility.AngleToFlat(pilot.Position.ToVector3(), targCell.ToVector3()); float offsetAngle = angle + 90f; if (offsetAngle > 360f) { offsetAngle -= 360f; } Rot4 facing = Rot4.FromAngleFlat(offsetAngle); pilot.Rotation = facing; }
void TransformAtlas(LayerSubMesh mesh, TextureAtlasGroup group) { var offset = Rot4.FromAngleFlat(target); var offseti = offset.AsInt; var vertsc = mesh.verts.Count / 5 * 4; var uvsc = mesh.uvs.Count; var vertsArr = NoAllocHelpers.ExtractArrayFromListT(mesh.verts); var uvsArr = NoAllocHelpers.ExtractArrayFromListT(mesh.uvs); Util.ResizeIfNeeded(ref tempVerts, vertsc); Util.ResizeIfNeeded(ref tempUVs, uvsc); for (int i = 0; i < vertsc; i += 4) { var data = vertsArr[vertsc + i / 4]; if (data.x == PrintPlanePatch.SPECIAL_X) { ExchangeVerts(tempVerts, vertsArr, i, offseti); var rotData = ((int)data.z & 0b1100) >> 2; var flipData = (int)data.z & 0b0011; var relRot = GenMath.PositiveMod(rotData - Rot4.FromAngleFlat(target).AsInt, 4); var flipped = relRot == 1 && ((flipData & 1) == 1) || relRot == 3 && ((flipData & 2) == 2) ? 1 : 0; var rotatedMat = GraphicPrintPatch_SetData.intToGraphic[(int)data.y].mats[(rotData + Rot4.FromAngleFlat(-target).AsInt) % 4]; Graphic.TryGetTextureAtlasReplacementInfo(rotatedMat, group, false, false, out _, out var uvs, out _); FixUVs( tempUVs, uvs, i, flipped ); } else if (data.x != PrintPlanePatch.EMPTY_X) { RotateVerts(tempVerts, vertsArr, i, data, offset); Array.Copy(uvsArr, i, tempUVs, i, 4); } else { Array.Copy(vertsArr, i, tempVerts, i, 4); Array.Copy(uvsArr, i, tempUVs, i, 4); } } mesh.mesh.SetVertices(tempVerts, vertsc); mesh.mesh.SetUVs(tempUVs, uvsc); }
internal static void RotatePawn(Pawn pawn, IntVec3 targCell, out float angle) { angle = Vector3Utility.AngleToFlat(pawn.Position.ToVector3(), targCell.ToVector3()); float num = angle + 90f; bool flag = num > 360f; if (flag) { num -= 360f; } Rot4 rotation = Rot4.FromAngleFlat(num); pawn.Rotation = rotation; }
internal void RotateFlyer(Pawn pawn, IntVec3 targetCell, out float angle) { angle = pawn.Position.ToVector3().AngleToFlat(targetCell.ToVector3()); float num = angle + 90f; bool flag = num > 360f; if (flag) { num -= 360f; } Rot4 rotation = Rot4.FromAngleFlat(num); pawn.Rotation = rotation; }
void TransformVerts(LayerSubMesh mesh) { var offset = Rot4.FromAngleFlat(target); var offseti = offset.AsInt; // Rotate around a center if (PrintPlanePatch.plantMats.Contains(mesh.material) || GraphicPrintPatch_TransformMats.graphicSingle.Contains(mesh.material)) { var vertsc = mesh.verts.Count / 5 * 4; var vertsArr = NoAllocHelpers.ExtractArrayFromListT(mesh.verts); Util.ResizeIfNeeded(ref tempVerts, vertsc); for (int i = 0; i < vertsc; i += 4) { // The mesh data lists are only used during mesh building and are otherwise unused. // In between mesh rebuilding, Carousel reuses the lists to recalculate the meshes // but also appends additional information to the end of the vertex list var center = vertsArr[vertsc + i / 4]; RotateVerts(tempVerts, vertsArr, i, center, offset); } mesh.mesh.SetVertices(tempVerts, vertsc); } // Exchange vertices // This doesn't change the set of their values but changes their order if (GraphicPrintPatch_TransformMats.exchangeMats.ContainsKey(mesh.material) || LinkedPrintPatch.linkedMaterials.Contains(mesh.material)) { var vertsc = mesh.verts.Count; var vertsArr = NoAllocHelpers.ExtractArrayFromListT(mesh.verts); Util.ResizeIfNeeded(ref tempVerts, vertsc); for (int i = 0; i < vertsc; i += 4) { ExchangeVerts(tempVerts, vertsArr, i, offseti); } mesh.mesh.SetVertices(tempVerts, vertsc); } }
static void HandleRotation(Pawn pawn, ref Rot4?rotOverride) { var comp = pawn.Map.CarouselComp(); var camera = Rot4.FromAngleFlat(-comp.current).AsInt; // Conditions from Pawn_RotationTracker.UpdateRotation if (!pawn.Destroyed && !pawn.jobs.HandlingFacing && pawn.pather.Moving && pawn.pather.curPath != null && pawn.pather.curPath.NodesLeftCount >= 1) { var movingRotation = FaceAdjacentCell(pawn.Position, pawn.pather.nextCell, Rot4.FromAngleFlat(-comp.current)); if (movingRotation != null) { rotOverride = new Rot4(movingRotation.Value.AsInt); return; } } rotOverride = new Rot4((rotOverride?.AsInt ?? pawn.Rotation.AsInt) + camera); }
public override bool SubstituionWorkerExecution() { Map map = (Map)parms.target; Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); for (int i = 0; i < pawnList.Count; i++) { Pawn pawn = pawnList[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null); GenSpawn.Spawn(pawn, loc, map, rot, WipeMode.Vanish, false); pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.ManhunterPermanent, null, false, false, null, false); pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.Range(60000, 120000); } Find.LetterStack.ReceiveLetter("LetterLabelManhunterPackArrived".Translate(), "ManhunterPackArrived".Translate(AnimalType.GetLabelPlural(-1)), LetterDefOf.ThreatBig, pawnList[0], null, null); Find.TickManager.slower.SignalForceNormalSpeedShort(); LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical); LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important); return(true); }
public override bool SubstituionWorkerExecution() { Map map = (Map)parms.target; Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); for (int i = 0; i < pawnList.Count; i++) { Pawn newThing = pawnList[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null); GenSpawn.Spawn(newThing, loc, map, rot, WipeMode.Vanish, false); } LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(near, LocomotionUrgency.Walk, 12f, false, false), map, pawnList); IncidentDef def = incidentDef; string text = string.Format(def.letterText, AnimalType.GetLabelPlural(-1)).CapitalizeFirst(); string label = string.Format(def.letterLabel, AnimalType.GetLabelPlural(-1).CapitalizeFirst()); Find.LetterStack.ReceiveLetter(label, text, def.letterDef, pawnList[0], null, null); return(true); }
void TransformUVs(LayerSubMesh mesh) { // Fix texture flip if (GraphicPrintPatch_TransformMats.exchangeMats.TryGetValue(mesh.material, out var matData)) { var uvsc = mesh.uvs.Count; var graphic = matData.Item1; var relRot = GenMath.PositiveMod(matData.Item2.AsInt - Rot4.FromAngleFlat(target).AsInt, 4); var flipped = relRot == 1 && graphic.EastFlipped || relRot == 3 && graphic.WestFlipped ? 1 : 0; Util.ResizeIfNeeded(ref tempUVs, uvsc); for (int i = 0; i < uvsc; i += 4) { FixUVs(tempUVs, Printer_Plane.defaultUvs, i, flipped); } mesh.mesh.SetUVs(tempUVs, uvsc); } }
protected override bool TryExecuteWorker(IncidentParms parms) //don't bother asking me what any of this means { Map target = (Map)parms.target; IntVec3 cell; if (!this.TryFindEntryCell(target, out cell)) { return(false); } PawnKindDef shambler = Skellin_PawnKindDefOf.SkellinShambler; int num1 = Mathf.Clamp(GenMath.RoundRandom(StorytellerUtility.DefaultThreatPointsNow((IIncidentTarget)target) / shambler.combatPower), 2, Rand.RangeInclusive(3, 12)); int num2 = Rand.RangeInclusive(90000, 150000); IntVec3 result = IntVec3.Invalid; if (!RCellFinder.TryFindRandomCellOutsideColonyNearTheCenterOfTheMap(cell, target, 10f, out result)) { result = IntVec3.Invalid; } Lord lord = LordMaker.MakeNewLord(null, (LordJob) new LordJob_AssaultColony(null, canTimeoutOrFlee: false, canSteal: false), target); //faction is null, previously Faction.OfAncients - revert if this causes errors Pawn pawn = (Pawn)null; for (int index = 0; index < num1; ++index) { IntVec3 loc = CellFinder.RandomClosewalkCellNear(cell, target, 10); pawn = GeneratePawn(); Rot4 rot = Rot4.FromAngleFlat((target.Center - result).AngleFlat); GenSpawn.Spawn((Thing)pawn, loc, target, rot); pawn.health.AddHediff(Skellin_HediffDefOf.ToxicFever); pawn.mindState.mentalStateHandler.TryStartMentalState(Skellin_MentalStateDefOf.SkellinToxic); pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + num2; lord.AddPawn(pawn); if (result.IsValid) { pawn.mindState.forcedGotoPosition = CellFinder.RandomClosewalkCellNear(result, target, 10); } } this.SendStandardLetter(parms, (LookTargets)pawn, (NamedArgument[])Array.Empty <NamedArgument>()); Find.TickManager.slower.SignalForceNormalSpeedShort(); return(true); }
protected virtual bool ResolveRaidSpawnCenter(IncidentParms parms) { Map map = (Map)parms.target; if (parms.spawnCenter.IsValid) { return(true); } if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop) { if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop) { parms.raidPodOpenDelay = 520; parms.spawnRotation = Rot4.Random; if (Rand.Value < 0.40000000596046448 && map.listerBuildings.ColonistsHaveBuildingWithPowerOn(ThingDefOf.OrbitalTradeBeacon)) { parms.spawnCenter = DropCellFinder.TradeDropSpot(map); } else if (!DropCellFinder.TryFindRaidDropCenterClose(out parms.spawnCenter, map)) { parms.raidArrivalMode = PawnsArriveMode.EdgeDrop; } } if (parms.raidArrivalMode == PawnsArriveMode.EdgeDrop) { parms.raidPodOpenDelay = 140; parms.spawnCenter = DropCellFinder.FindRaidDropCenterDistant(map); parms.spawnRotation = Rot4.Random; } } else { if (!RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, map, CellFinder.EdgeRoadChance_Hostile, (Predicate <IntVec3>)null)) { return(false); } parms.spawnRotation = Rot4.FromAngleFlat((map.Center - parms.spawnCenter).AngleFlat); } return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; ValidateVariables(parms); if (!RCellFinder.TryFindRandomPawnEntryCell(out IntVec3 intVec, map, CellFinder.EdgeRoadChance_Animal, null)) { return(false); } Pawn boss = BossFightUtility.GenerateAnimal(map.Tile, faction, parms.points); Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); bossLord.AddPawn(boss); // so many asthmatic bosses boss.health.Reset(); GenSpawn.Spawn(boss, intVec, map, rot, false); Find.LetterStack.ReceiveLetter("Boss Fight", "The birds go silent and the ground trembles below you… BOSS FIGHT INCOMING", LetterDefOf.ThreatBig, boss, null); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; Pawn pawn = PawnGenerator.GeneratePawn(RWBYDefOf.Grimm_Nuckelavee, FactionUtility.DefaultFactionFrom(RWBYDefOf.Creatures_of_Grimm)); if (!parms.spawnCenter.IsValid && !RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, map, CellFinder.EdgeRoadChance_Hostile, false, null)) { return(false); } parms.spawnRotation = Rot4.FromAngleFlat((map.Center - parms.spawnCenter).AngleFlat); IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8, null); if (pawn is Pawn_Grimm pawn_Grimm) { pawn_Grimm.SetNuckelaveeTimer(Rand.RangeInclusive(30000, 60000)); } GenSpawn.Spawn(pawn, loc, map, parms.spawnRotation, WipeMode.Vanish, false); string label = "LetterLabelNuckelavee".Translate(); string text = "LetterTextNuckelavee".Translate(); Find.LetterStack.ReceiveLetter(label, text, LetterDefOf.ThreatBig, pawn); return(true); }