public static void CarAIPathfindFailurePostFix(ushort vehicleID, ref Vehicle data) { ushort i = vehicleID; if ((data.m_transferType == 112) || (data.m_transferType == 113)) { if (data.Info.m_vehicleAI is CargoTruckAI && (data.m_targetBuilding != 0)) { CargoTruckAI AI = (CargoTruckAI)data.Info.m_vehicleAI; #if DEBUG DebugLog.LogToFileOnly("PathFind not success " + i.ToString() + "transferType = " + vehicle.m_transferType.ToString() + "And MainDataStore.TargetGasBuilding[vehicleID] = " + MainDataStore.TargetGasBuilding[i].ToString() + "data.m_targetBuilding = " + vehicle.m_targetBuilding.ToString()); #endif AI.SetTarget((ushort)i, ref data, data.m_targetBuilding); #if DEBUG DebugLog.LogToFileOnly("Reroute to target " + i.ToString() + "vehicle.m_path = " + vehicle.m_path.ToString() + vehicle.m_flags.ToString()); #endif data.m_transferType = MainDataStore.preTranferReason[i]; MainDataStore.TargetGasBuilding[i] = 0; return; } else if (data.Info.m_vehicleAI is PassengerCarAI && data.Info.m_class.m_subService == ItemClass.SubService.ResidentialLow) { PassengerCarAI AI = (PassengerCarAI)data.Info.m_vehicleAI; AI.SetTarget((ushort)i, ref data, 0); data.m_transferType = MainDataStore.preTranferReason[i]; MainDataStore.TargetGasBuilding[i] = 0; return; } } }
public static void CargoTruckAIArriveAtSourceForRealGasStationPre(ref CargoTruckAI __instance, ushort vehicleID, ref Vehicle data) { var distance = Vector3.Distance(data.GetLastFramePosition(), Singleton <BuildingManager> .instance.m_buildings.m_buffer[MainDataStore.TargetGasBuilding[vehicleID]].m_position); if (distance < 80f) { if (MainDataStore.petrolBuffer[MainDataStore.TargetGasBuilding[vehicleID]] > 400) { MainDataStore.petrolBuffer[MainDataStore.TargetGasBuilding[vehicleID]] -= 400; } } data.m_transferType = MainDataStore.preTranferReason[vehicleID]; PathManager instance = Singleton <PathManager> .instance; if (data.m_path != 0u) { instance.ReleasePath(data.m_path); data.m_path = 0; } __instance.SetTarget(vehicleID, ref data, data.m_targetBuilding); if (MainDataStore.finalVehicleForFuelCount[MainDataStore.TargetGasBuilding[vehicleID]] > 0) { MainDataStore.finalVehicleForFuelCount[MainDataStore.TargetGasBuilding[vehicleID]]--; } MainDataStore.TargetGasBuilding[vehicleID] = 0; if (distance < 80f) { if (Loader.isRealCityRunning) { int money = (int)(400f * RealCityUtil.GetResourcePrice(TransferManager.TransferReason.Petrol) + 1000); if (data.m_flags.IsFlagSet(Vehicle.Flags.DummyTraffic)) { Singleton <EconomyManager> .instance.AddResource(EconomyManager.Resource.PublicIncome, money, ItemClass.Service.Vehicles, ItemClass.SubService.PlayerIndustryOil, ItemClass.Level.Level2); } else { Singleton <EconomyManager> .instance.AddResource(EconomyManager.Resource.PublicIncome, money, ItemClass.Service.Vehicles, ItemClass.SubService.None, ItemClass.Level.Level2); } } } }
public static bool Prefix(ref CargoTruckAI __instance, ushort vehicleID, ref Vehicle data, ushort targetBuilding) { if ((data.m_transferType == 127) || (data.m_transferType == 126)) { data.m_targetBuilding = targetBuilding; if (!CustomCargoTruckAI.CustomStartPathFind(vehicleID, ref data)) { data.m_transferType = MainDataStore.preTranferReason[vehicleID]; data.m_targetBuilding = 0; __instance.SetTarget(vehicleID, ref data, 0); if (MainDataStore.finalVehicleForFuelCount[MainDataStore.TargetGasBuilding[vehicleID]] > 0) { MainDataStore.finalVehicleForFuelCount[MainDataStore.TargetGasBuilding[vehicleID]]--; } MainDataStore.TargetGasBuilding[vehicleID] = 0; data.Unspawn(vehicleID); } return(false); } return(true); }
public static bool Prefix(ref CargoTruckAI __instance, ushort vehicleID, ref Vehicle data, ushort targetBuilding) { if ((data.m_transferType == 127) || (data.m_transferType == 126)) { if (targetBuilding == data.m_targetBuilding) { return(true); } else { data.m_flags &= ~Vehicle.Flags.WaitingTarget; data.m_waitCounter = 0; ushort tempTargetBuilding = data.m_targetBuilding; data.m_targetBuilding = MainDataStore.TargetGasBuilding[vehicleID]; bool success = CustomCargoTruckAI.CustomStartPathFind(vehicleID, ref data); data.m_targetBuilding = tempTargetBuilding; if (!success) { data.m_transferType = MainDataStore.preTranferReason[vehicleID]; PathManager instance = Singleton <PathManager> .instance; if (data.m_path != 0u) { instance.ReleasePath(data.m_path); data.m_path = 0; } __instance.SetTarget(vehicleID, ref data, data.m_targetBuilding); if (MainDataStore.finalVehicleForFuelCount[MainDataStore.TargetGasBuilding[vehicleID]] > 0) { MainDataStore.finalVehicleForFuelCount[MainDataStore.TargetGasBuilding[vehicleID]]--; } MainDataStore.TargetGasBuilding[vehicleID] = 0; } return(false); } } return(true); }
public static void StartGasTransfer(ushort vehicleID, ref Vehicle data, TransferManager.TransferReason material, TransferManager.TransferOffer offer) { if ((material == (TransferManager.TransferReason) 113) || (material == (TransferManager.TransferReason) 112)) { if (data.Info.m_vehicleAI is CargoTruckAI) { CargoTruckAI AI = (CargoTruckAI)data.Info.m_vehicleAI; MainDataStore.preTranferReason[vehicleID] = data.m_transferType; MainDataStore.TargetGasBuilding[vehicleID] = offer.Building; data.m_transferType = 113; if (offer.Building == data.m_targetBuilding) { DebugLog.LogToFileOnly("Error: Transfer fuel cargotruck do not need fuel"); } if (data.m_flags.IsFlagSet(Vehicle.Flags.Created) && !data.m_flags.IsFlagSet(Vehicle.Flags.Deleted) && !data.m_flags.IsFlagSet(Vehicle.Flags.Arriving) && (data.m_cargoParent == 0) && data.m_flags.IsFlagSet(Vehicle.Flags.Spawned) && !data.m_flags.IsFlagSet(Vehicle.Flags.GoingBack) && data.m_targetBuilding != 0 && !data.m_flags.IsFlagSet(Vehicle.Flags.Parking)) { if ((Vector3.Distance(data.GetLastFramePosition(), Singleton <BuildingManager> .instance.m_buildings.m_buffer[data.m_targetBuilding].m_position) > CanNotStartGasTransferDistance) && (FindCargoStation(data.GetLastFramePosition(), ItemClass.Service.PublicTransport, ItemClass.SubService.PublicTransportShip) == 0) && (FindCargoStation(data.GetLastFramePosition(), ItemClass.Service.PublicTransport, ItemClass.SubService.PublicTransportPlane) == 0) && (FindCargoStation(data.GetLastFramePosition(), ItemClass.Service.PublicTransport, ItemClass.SubService.PublicTransportTrain) == 0)) { AI.SetTarget(vehicleID, ref data, offer.Building); } //else //{ //DebugLog.LogToFileOnly("Info: Cargo is near target position, do not go to gas station now."); //} } //else //{ // DebugLog.LogToFileOnly("Warning: Not a valid CargoTruckAI"); //} } else if (data.Info.m_vehicleAI is PassengerCarAI) { PassengerCarAI AI = (PassengerCarAI)data.Info.m_vehicleAI; MainDataStore.preTranferReason[vehicleID] = data.m_transferType; if (data.m_targetBuilding == 0) { MainDataStore.TargetGasBuilding[vehicleID] = offer.Building; data.m_transferType = 112; if (data.m_flags.IsFlagSet(Vehicle.Flags.Created) && !data.m_flags.IsFlagSet(Vehicle.Flags.Deleted) && !data.m_flags.IsFlagSet(Vehicle.Flags.Arriving) && (data.m_cargoParent == 0) && data.m_flags.IsFlagSet(Vehicle.Flags.Spawned) && !data.m_flags.IsFlagSet(Vehicle.Flags.GoingBack) && !data.m_flags.IsFlagSet(Vehicle.Flags.Parking)) { ushort citizen = CustomCarAI.GetDriverInstance(vehicleID, ref data); if (Singleton <CitizenManager> .instance.m_instances.m_buffer[citizen].m_targetBuilding != 0) { if ((Vector3.Distance(data.GetLastFramePosition(), Singleton <BuildingManager> .instance.m_buildings.m_buffer[Singleton <CitizenManager> .instance.m_instances.m_buffer[citizen].m_targetBuilding].m_position) > CanNotStartGasTransferDistance) && (FindCargoStation(data.GetLastFramePosition(), ItemClass.Service.PublicTransport, ItemClass.SubService.PublicTransportShip) == 0) && (FindCargoStation(data.GetLastFramePosition(), ItemClass.Service.PublicTransport, ItemClass.SubService.PublicTransportPlane) == 0) && (FindCargoStation(data.GetLastFramePosition(), ItemClass.Service.PublicTransport, ItemClass.SubService.PublicTransportTrain) == 0)) { AI.SetTarget(vehicleID, ref data, offer.Building); } //else //{ //DebugLog.LogToFileOnly("Info: PassengerCar is near target position, do not go to gas station now."); //} } //else //{ // DebugLog.LogToFileOnly("Warning: No targetBuilding for citizen"); //} } //else //{ // DebugLog.LogToFileOnly("Warning: Not a valid PassengerCarAI"); //} } //else //{ // DebugLog.LogToFileOnly("Error: PassengerCarAI should not have targetBuilding"); //} } } }