public void SetPlace(CaravanAI caravanAI, Caravan playerCaravan, IntVec3 mapSize) { MapSize = mapSize; this.caravanAI = caravanAI; aiFaction = caravanAI.Faction; aiTarget = caravanAI.pather.Destination; aiAction = caravanAI.pather.ArrivalAction; this.playerCaravan = playerCaravan; List <Pawn> aiPawns = new List <Pawn>(caravanAI.pawns); caravanAI.Tile = Tile; playerCaravan.Tile = Tile; Map map = GetOrGenerateMap(Tile, MapSize, null); Find.TickManager.Notify_GeneratedPotentiallyHostileMap(); MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out IntVec3 first, out IntVec3 second); CaravanEnterMapUtility.Enter(caravanAI, map, x => CellFinder.RandomSpawnCellForPawnNear(first, map), CaravanDropInventoryMode.DoNotDrop); CaravanEnterMapUtility.Enter(playerCaravan, map, x => CellFinder.RandomSpawnCellForPawnNear(second, map), CaravanDropInventoryMode.DoNotDrop); LordJob lordJob = new LordJob_AssaultColony(caravanAI.Faction, canKidnap: true, canTimeoutOrFlee: false); LordMaker.MakeNewLord(caravanAI.Faction, lordJob, map, aiPawns); winner = CaravanBattleWinner.None; Find.LetterStack.ReceiveLetter("CaravanBattlePlacePlace_BattleStarted".Translate(), "CaravanBattlePlacePlace_BattleDescription".Translate(playerCaravan.Name, caravanAI.Name), LetterDefOf.ThreatBig); }
public static CaravanToil GotoObject(TargetIndex ind, CaravanArrivalAction arrivalAction = null) { int tileInt = -1; CaravanToil toil = new CaravanToil(); toil.initAction = delegate { //Log.Message("GoToObject1"); tileInt = CurJob(toil.actor).GetTarget(ind).WorldObject.Tile; //Log.Message("GoToObject2"); toil.actor.pather.StartPath(tileInt, arrivalAction, true); //Log.Message("GoToObject3"); }; toil.tickAction = delegate { if (tileInt < 0) { tileInt = CurJob(toil.actor).GetTarget(ind).WorldObject.Tile; } if (toil.actor.Tile == tileInt) { //Log.Message("GoToObject4a"); CurTracker(toil.actor).curDriver.Notify_PatherArrived(); } }; toil.defaultCompleteMode = ToilCompleteMode.PatherArrival; //toil.FailOnDespawnedOrNull(ind); return(toil); }
/// <summary> /// Catch-All for Caravan_PathFollower.StartPath, redirect to VehicleCaravan_PathFollower /// </summary> /// <param name="destTile"></param> /// <param name="arrivalAction"></param> /// <param name="___caravan"></param> /// <param name="repathImmediately"></param> /// <param name="resetPauseStatus"></param> /// <returns></returns> public static bool StartVehicleCaravanPath(int destTile, CaravanArrivalAction arrivalAction, Caravan ___caravan, bool repathImmediately = false, bool resetPauseStatus = true) { if (___caravan is VehicleCaravan vehicleCaravan && vehicleCaravan.HasVehicle()) { vehicleCaravan.vPather.StartPath(destTile, arrivalAction, repathImmediately, resetPauseStatus); } return(true); }
public static CaravanToil GotoTile(TargetIndex ind, CaravanArrivalAction arrivalAction = null) { CaravanToil toil = new CaravanToil(); toil.initAction = delegate { Caravan actor = toil.actor; actor.pather.StartPath(Find.World.GetComponent <CaravanJobGiver>().CurJob(actor).GetTarget(ind).Tile, arrivalAction); }; toil.defaultCompleteMode = ToilCompleteMode.PatherArrival; //toil.FailOnDespawnedOrNull(ind); return(toil); }
public bool StartPath(int destTile, CaravanArrivalAction arrivalAction, bool repathImmediately = false, bool resetPauseStatus = true) { caravan.autoJoinable = false; if (resetPauseStatus) { paused = false; } if (arrivalAction != null && !arrivalAction.StillValid(caravan, destTile)) { return(false); } if (!IsPassable(caravan.Tile) && !TryRecoverFromUnwalkablePosition()) { return(false); } if (moving && curPath != null && this.destTile == destTile) { this.arrivalAction = arrivalAction; return(true); } if (!WorldVehicleReachability.Instance.CanReach(caravan, destTile)) { PatherFailed(); return(false); } this.destTile = destTile; this.arrivalAction = arrivalAction; caravan.Notify_DestinationOrPauseStatusChanged(); if (nextTile < 0 || !IsNextTilePassable()) { nextTile = caravan.Tile; nextTileCostLeft = 0f; previousTileForDrawingIfInDoubt = -1; } if (AtDestinationPosition()) { PatherArrived(); return(true); } if (curPath != null) { curPath.ReleaseToPool(); } curPath = null; moving = true; if (repathImmediately && TrySetNewPath() && nextTileCostLeft <= 0f && moving) { TryEnterNextPathTile(); } return(true); }
public static CaravanToil GotoTile(TargetIndex ind, CaravanArrivalAction arrivalAction = null) { var toil = new CaravanToil(); toil.initAction = () => { var actor = toil.actor; actor.pather.StartPath(CaravanJobsUtility.GetCaravanJobGiver().CurJob(actor).GetTarget(ind).Tile, arrivalAction); }; toil.defaultCompleteMode = ToilCompleteMode.PatherArrival; //toil.FailOnDespawnedOrNull(ind); return(toil); }
private void PatherArrived() { CaravanArrivalAction caravanArrivalAction = arrivalAction; StopDead(); if (caravanArrivalAction != null && caravanArrivalAction.StillValid(caravan, caravan.Tile)) { caravanArrivalAction.Arrived(caravan); return; } if (caravan.IsPlayerControlled && !caravan.VisibleToCameraNow()) { Messages.Message("MessageCaravanArrivedAtDestination".Translate(caravan.Label), caravan, MessageTypeDefOf.TaskCompletion, true); } }
public void StopDead() { if (curPath != null) { curPath.ReleaseToPool(); } curPath = null; moving = false; paused = false; nextTile = caravan.Tile; previousTileForDrawingIfInDoubt = -1; arrivalAction = null; nextTileCostLeft = 0f; caravan.Notify_DestinationOrPauseStatusChanged(); }
private void Set(Caravan caravan) { caravan.StoryState.CopyTo(map.StoryState); shouldPassStoryState = true; if (caravan.pather.Moving) { nextTile = caravan.pather.nextTile; nextTileCostLeftPct = caravan.pather.nextTileCostLeft / caravan.pather.nextTileCostTotal; paused = caravan.pather.Paused; destinationTile = caravan.pather.Destination; arrivalAction = caravan.pather.ArrivalAction; } else { nextTile = -1; nextTileCostLeftPct = 0f; paused = false; destinationTile = -1; arrivalAction = null; } }
public void Notify_CaravanFormed(Caravan caravan) { if (shouldPassStoryState) { shouldPassStoryState = false; map.StoryState.CopyTo(caravan.StoryState); } if (nextTile != -1 && nextTile != caravan.Tile && caravan.CanReach(nextTile)) { caravan.pather.StartPath(nextTile, null, repathImmediately: true); caravan.pather.nextTileCostLeft = caravan.pather.nextTileCostTotal * nextTileCostLeftPct; caravan.pather.Paused = paused; caravan.tweener.ResetTweenedPosToRoot(); } if (HasDestinationTile && destinationTile != caravan.Tile) { caravan.pather.StartPath(destinationTile, arrivalAction, repathImmediately: true); destinationTile = -1; arrivalAction = null; } }
public void Notify_CaravanFormed(Caravan caravan) { if (this.shouldPassStoryState) { this.shouldPassStoryState = false; this.map.StoryState.CopyTo(caravan.StoryState); } if (this.nextTile != -1 && this.nextTile != caravan.Tile && caravan.CanReach(this.nextTile)) { caravan.pather.StartPath(this.nextTile, null, true, true); caravan.pather.nextTileCostLeft = caravan.pather.nextTileCostTotal * this.nextTileCostLeftPct; caravan.pather.Paused = this.paused; caravan.tweener.ResetTweenedPosToRoot(); } if (this.HasDestinationTile && this.destinationTile != caravan.Tile) { caravan.pather.StartPath(this.destinationTile, this.arrivalAction, true, true); this.destinationTile = -1; this.arrivalAction = null; } }
public static CaravanToil Goto(TargetIndex ind, CaravanArrivalAction arrivalAction = null) { return(CaravanToils_Goto.GotoTile(ind, arrivalAction)); }
public void AddQueueAction(CaravanArrivalAction action, int destinationTile) { queueActions.Add(new CaravanAI_QueueAction(action, destinationTile)); }
public CaravanAI_QueueAction(CaravanArrivalAction action, int tile) { CaravanArrivalAction = action; DestinationTile = tile; }
public static void Pather_StartPath_WarObjects(Caravan_PathFollower __instance, Caravan ___caravan, int destTile, CaravanArrivalAction arrivalAction, ref bool __result, bool repathImmediately = false, bool resetPauseStatus = true) { if (__result == true) { if (arrivalAction is RimWar.Planet.CaravanArrivalAction_AttackWarObject) { //Log.Message("assigning war object action: attack"); CaravanArrivalAction_AttackWarObject woAction = arrivalAction as CaravanArrivalAction_AttackWarObject; woAction.wo.interactable = true; RimWar.Planet.WorldUtility.Get_WCPT().AssignCaravanTargets(___caravan, woAction.wo); } else if (arrivalAction is RimWar.Planet.CaravanArrivalAction_EngageWarObject) { //Log.Message("assigning war object action: engage"); CaravanArrivalAction_EngageWarObject woAction = arrivalAction as CaravanArrivalAction_EngageWarObject; woAction.wo.interactable = true; RimWar.Planet.WorldUtility.Get_WCPT().AssignCaravanTargets(___caravan, woAction.wo); } else { WorldUtility.Get_WCPT().RemoveCaravanTarget(___caravan); } } }
public static void Pather_StartPath_WarObjects(Caravan_PathFollower __instance, int destTile, CaravanArrivalAction arrivalAction, ref bool __result, bool repathImmediately = false, bool resetPauseStatus = true) { if (__result == true) { if (arrivalAction is RimWar.Planet.CaravanArrivalAction_AttackWarObject) { //Log.Message("assigning war object action: attack"); Caravan caravan = Traverse.Create(root: __instance).Field(name: "caravan").GetValue <Caravan>(); CaravanArrivalAction_AttackWarObject woAction = arrivalAction as CaravanArrivalAction_AttackWarObject; RimWar.Planet.WorldUtility.Get_WCPT().AssignCaravanTargets(caravan, woAction.wo); } else if (arrivalAction is RimWar.Planet.CaravanArrivalAction_EngageWarObject) { //Log.Message("assigning war object action: engage"); Caravan caravan = Traverse.Create(root: __instance).Field(name: "caravan").GetValue <Caravan>(); CaravanArrivalAction_EngageWarObject woAction = arrivalAction as CaravanArrivalAction_EngageWarObject; RimWar.Planet.WorldUtility.Get_WCPT().AssignCaravanTargets(caravan, woAction.wo); } else { Caravan caravan = Traverse.Create(root: __instance).Field(name: "caravan").GetValue <Caravan>(); List <CaravanTargetData> ctdList = RimWar.Planet.WorldUtility.Get_WCPT().caravanTargetData; for (int i = 0; i < ctdList.Count; i++) { if (ctdList[i].caravan == caravan) { ctdList.Remove(ctdList[i]); } } } } }