/// <summary> /// Copied from original game code at game version 1.2.2 f3. /// </summary> /// <param name="hearseAI">The hearse AI.</param> /// <param name="vehicleID">The vehicle identifier.</param> /// <param name="data">The data.</param> /// <returns>True if vehicle should return to source.</returns> private static bool HearseAI_ShouldReturnToSource_Original(HearseAI hearseAI, ushort vehicleID, ref Vehicle data) { if ((int)data.m_sourceBuilding != 0) { BuildingManager instance = Singleton <BuildingManager> .instance; if ((instance.m_buildings.m_buffer[(int)data.m_sourceBuilding].m_flags & (Building.Flags.Active | Building.Flags.Downgrading)) != Building.Flags.Active && (int)instance.m_buildings.m_buffer[(int)data.m_sourceBuilding].m_fireIntensity == 0) { return(true); } } return(false); }
public static bool Prefix(ref HearseAI __instance, ushort vehicleID, ref Vehicle data, ref bool __result) { if (data.m_targetBuilding == 0) { Singleton <VehicleManager> .instance.ReleaseVehicle(vehicleID); __result = true; return(false); } if (data.m_transferType == 42) { int num = 0; if ((data.m_flags & Vehicle.Flags.TransferToTarget) != (Vehicle.Flags) 0) { num = (int)data.m_transferSize; } if ((data.m_flags & Vehicle.Flags.TransferToSource) != (Vehicle.Flags) 0) { num = Mathf.Min(0, (int)data.m_transferSize - __instance.m_corpseCapacity); } BuildingManager instance = Singleton <BuildingManager> .instance; BuildingInfo info = instance.m_buildings.m_buffer[(int)data.m_targetBuilding].Info; info.m_buildingAI.ModifyMaterialBuffer(data.m_targetBuilding, ref instance.m_buildings.m_buffer[(int)data.m_targetBuilding], (TransferManager.TransferReason)data.m_transferType, ref num); ProcessDeadmoveIncomeArriveAtTarget(ref data, num); if ((data.m_flags & Vehicle.Flags.TransferToTarget) != (Vehicle.Flags) 0) { data.m_transferSize = (ushort)Mathf.Clamp((int)data.m_transferSize - num, 0, (int)data.m_transferSize); } if ((data.m_flags & Vehicle.Flags.TransferToSource) != (Vehicle.Flags) 0) { data.m_transferSize += (ushort)Mathf.Max(0, -num); } if (data.m_sourceBuilding != 0 && (instance.m_buildings.m_buffer[(int)data.m_sourceBuilding].m_flags & Building.Flags.IncomingOutgoing) == Building.Flags.Outgoing) { BuildingInfo info2 = instance.m_buildings.m_buffer[(int)data.m_sourceBuilding].Info; ushort num2 = instance.FindBuilding(instance.m_buildings.m_buffer[(int)data.m_sourceBuilding].m_position, 200f, info2.m_class.m_service, info2.m_class.m_subService, Building.Flags.Incoming, Building.Flags.Outgoing); if (num2 != 0) { instance.m_buildings.m_buffer[(int)data.m_sourceBuilding].RemoveOwnVehicle(vehicleID, ref data); data.m_sourceBuilding = num2; instance.m_buildings.m_buffer[(int)data.m_sourceBuilding].AddOwnVehicle(vehicleID, ref data); } } __instance.SetTarget(vehicleID, ref data, 0); __result = false; return(false); } return(true); }
/// <summary> /// Vehicles with no target should always return to source. /// </summary> /// <param name="hearseAI">The hearse AI.</param> /// <param name="vehicleId">The vehicle identifier.</param> /// <param name="vehicle">The vehicle.</param> /// <returns>True if vehicle should return to source.</returns> private static bool HearseAI_ShouldReturnToSource_Override(HearseAI hearseAI, ushort vehicleId, ref Vehicle vehicle) { Calls++; if (vehicle.m_sourceBuilding == 0) { return(false); } if (vehicle.m_targetBuilding == 0 && (vehicle.m_flags & Vehicle.Flags.TransferToTarget) == ~VehicleHelper.VehicleAll) { BuildingManager instance = Singleton <BuildingManager> .instance; if (instance.m_buildings.m_buffer[vehicle.m_sourceBuilding].m_fireIntensity == 0) { return(true); } } return(HearseAI_ShouldReturnToSource_Original(hearseAI, vehicleId, ref vehicle)); }
/// <summary> /// Vehicles with no target should always return to source. /// </summary> /// <param name="hearseAI">The hearse AI.</param> /// <param name="vehicleId">The vehicle identifier.</param> /// <param name="vehicle">The vehicle.</param> /// <returns>True if vehicle should return to source.</returns> private static bool HearseAI_ShouldReturnToSource_Override(HearseAI hearseAI, ushort vehicleId, ref Vehicle vehicle) { Calls++; if (vehicle.m_sourceBuilding == 0) { return false; } if (vehicle.m_targetBuilding == 0 && (vehicle.m_flags & Vehicle.Flags.TransferToTarget) == ~Vehicle.Flags.All) { BuildingManager instance = Singleton<BuildingManager>.instance; if (instance.m_buildings.m_buffer[vehicle.m_sourceBuilding].m_fireIntensity == 0) { return true; } } return HearseAI_ShouldReturnToSource_Original(hearseAI, vehicleId, ref vehicle); }
/// <summary> /// Copied from original game code at game version 1.2.2 f3. /// </summary> /// <param name="hearseAI">The hearse AI.</param> /// <param name="vehicleID">The vehicle identifier.</param> /// <param name="data">The data.</param> /// <returns>True if vehicle should return to source.</returns> private static bool HearseAI_ShouldReturnToSource_Original(HearseAI hearseAI, ushort vehicleID, ref Vehicle data) { if ((int)data.m_sourceBuilding != 0) { BuildingManager instance = Singleton<BuildingManager>.instance; if ((instance.m_buildings.m_buffer[(int)data.m_sourceBuilding].m_flags & (Building.Flags.Active | Building.Flags.Downgrading)) != Building.Flags.Active && (int)instance.m_buildings.m_buffer[(int)data.m_sourceBuilding].m_fireIntensity == 0) return true; } return false; }