Skip to content

Commit

Permalink
1.9.0-rc1: Parking restrictions added
Browse files Browse the repository at this point in the history
  • Loading branch information
VictorPhilipp committed May 15, 2017
1 parent cdb0fbe commit 3bac079
Show file tree
Hide file tree
Showing 28 changed files with 671 additions and 64 deletions.
11 changes: 11 additions & 0 deletions TLM/TLM/Custom/AI/CustomCitizenAI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,17 @@ public bool CustomStartPathFind(ushort instanceID, ref CitizenInstance citizenDa
carUsageMode = CarUsagePolicy.Allowed;
}
}

/*if (Options.parkingRestrictionsEnabled && carUsageMode == CarUsagePolicy.Allowed && parkedVehicleId != 0) {
// force removal of illegaly parked vehicle
PathUnit.Position parkedPathPos;
if (PathManager.FindPathPosition(Singleton<VehicleManager>.instance.m_parkedVehicles.m_buffer[parkedVehicleId].m_position, ItemClass.Service.Road, NetInfo.LaneType.Parking, VehicleInfo.VehicleType.Car, false, false, 32f, out parkedPathPos)) {
if (! ParkingRestrictionsManager.Instance.IsParkingAllowed(parkedPathPos.m_segment, Singleton<NetManager>.instance.m_segments.m_buffer[parkedPathPos.m_segment].Info.m_lanes[parkedPathPos.m_lane].m_finalDirection)) {
carUsageMode = CarUsagePolicy.Forced;
vehicleInfo = Singleton<VehicleManager>.instance.m_parkedVehicles.m_buffer[parkedVehicleId].Info;
}
}
}*/
// NON-STOCK CODE END

NetInfo.LaneType laneTypes = NetInfo.LaneType.Pedestrian;
Expand Down
66 changes: 59 additions & 7 deletions TLM/TLM/Custom/AI/CustomPassengerCarAI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,33 @@ public bool CustomStartPathFind(ushort vehicleID, ref Vehicle vehicleData, Vecto
return false;
}

public void CustomUpdateParkedVehicle(ushort parkedId, ref VehicleParked data) {
float x = this.m_info.m_generatedInfo.m_size.x;
float z = this.m_info.m_generatedInfo.m_size.z;
float minSqrDist = 256f;
bool parkingSpotFound = false;
uint ownerCitizen = data.m_ownerCitizen;
ushort homeID = 0;
if (ownerCitizen != 0u) {
homeID = Singleton<CitizenManager>.instance.m_citizens.m_buffer[(int)((UIntPtr)ownerCitizen)].m_homeBuilding;
}

ExtParkingSpaceLocation parkingSpaceLocation;
ushort parkingSpaceLocationId;
Vector3 parkPos;
Quaternion parkRot;
float parkOffset;

if (AdvancedParkingManager.Instance.FindParkingSpaceInVicinity(data.m_position, data.Info, homeID, 0, out parkingSpaceLocation, out parkingSpaceLocationId, out parkPos, out parkRot, out parkOffset)) {
Singleton<VehicleManager>.instance.RemoveFromGrid(parkedId, ref data);
data.m_position = parkPos;
data.m_rotation = parkRot;
Singleton<VehicleManager>.instance.AddToGrid(parkedId, ref data);
} else {
Singleton<VehicleManager>.instance.ReleaseParkedVehicle(parkedId);
}
}

internal static bool FindParkingSpaceRoadSide(ushort ignoreParked, ushort requireSegment, Vector3 refPos, float width, float length, out Vector3 parkPos, out Quaternion parkRot, out float parkOffset) {
Log.Error("FindParkingSpaceRoadSide is not overridden!");
parkPos = Vector3.zero;
Expand Down Expand Up @@ -595,7 +622,7 @@ public bool CustomParkVehicle(ushort vehicleID, ref Vehicle vehicleData, PathUni
return true;
}

private static bool CustomFindParkingSpace(VehicleInfo vehicleInfo, ushort homeID, Vector3 refPos, Vector3 searchDir, ushort segment, out Vector3 parkPos, out Quaternion parkRot, out float parkOffset) {
private static bool CustomFindParkingSpace(VehicleInfo vehicleInfo, ushort homeID, Vector3 refPos, Vector3 searchDir, ushort segmentId, out Vector3 parkPos, out Quaternion parkRot, out float parkOffset) {
float searchRadius = Options.prohibitPocketCars ? 32f : 16f;
uint chanceOfParkingOffRoad = 3u;

Expand Down Expand Up @@ -624,22 +651,47 @@ private static bool CustomFindParkingSpace(VehicleInfo vehicleInfo, ushort homeI
float width = vehicleInfo.m_generatedInfo.m_size.x;
float length = vehicleInfo.m_generatedInfo.m_size.z;

if (FindParkingSpaceRoadSide(0, segment, refPos, width - 0.2f, length, out parkPos, out parkRot, out parkOffset)) {
return true;
if (FindParkingSpaceRoadSide(0, segmentId, refPos, width - 0.2f, length, out parkPos, out parkRot, out parkOffset)) {
if (Options.parkingRestrictionsEnabled) {
Vector3 innerParkPos;
uint laneId;
int laneIndex;
float laneOffset;
if (Singleton<NetManager>.instance.m_segments.m_buffer[segmentId].GetClosestLanePosition(refPos, NetInfo.LaneType.Parking, VehicleInfo.VehicleType.Car, out innerParkPos, out laneId, out laneIndex, out laneOffset)) {
if (ParkingRestrictionsManager.Instance.IsParkingAllowed(segmentId, Singleton<NetManager>.instance.m_segments.m_buffer[segmentId].Info.m_lanes[laneIndex].m_finalDirection)) {
return true;
}
}
} else {
return true;
}
}
if (AdvancedParkingManager.Instance.FindParkingSpaceBuilding(vehicleInfo, homeID, 0, segment, refPos2, GlobalConfig.Instance.MaxBuildingToPedestrianLaneDistance, searchRadius, out parkPos, out parkRot, out parkOffset)) {

if (AdvancedParkingManager.Instance.FindParkingSpaceBuilding(vehicleInfo, homeID, 0, segmentId, refPos2, GlobalConfig.Instance.MaxBuildingToPedestrianLaneDistance, searchRadius, out parkPos, out parkRot, out parkOffset)) {
return true;
}
} else {
if (AdvancedParkingManager.Instance.FindParkingSpaceBuilding(vehicleInfo, homeID, 0, segment, refPos2, GlobalConfig.Instance.MaxBuildingToPedestrianLaneDistance, searchRadius, out parkPos, out parkRot, out parkOffset)) {
if (AdvancedParkingManager.Instance.FindParkingSpaceBuilding(vehicleInfo, homeID, 0, segmentId, refPos2, GlobalConfig.Instance.MaxBuildingToPedestrianLaneDistance, searchRadius, out parkPos, out parkRot, out parkOffset)) {
return true;
}

float width = vehicleInfo.m_generatedInfo.m_size.x;
float length = vehicleInfo.m_generatedInfo.m_size.z;

if (FindParkingSpaceRoadSide(0, segment, refPos, width - 0.2f, length, out parkPos, out parkRot, out parkOffset)) {
return true;
if (FindParkingSpaceRoadSide(0, segmentId, refPos, width - 0.2f, length, out parkPos, out parkRot, out parkOffset)) {
if (Options.parkingRestrictionsEnabled) {
Vector3 innerParkPos;
uint laneId;
int laneIndex;
float laneOffset;
if (Singleton<NetManager>.instance.m_segments.m_buffer[segmentId].GetClosestLanePosition(refPos, NetInfo.LaneType.Parking, VehicleInfo.VehicleType.Car, out innerParkPos, out laneId, out laneIndex, out laneOffset)) {
if (ParkingRestrictionsManager.Instance.IsParkingAllowed(segmentId, Singleton<NetManager>.instance.m_segments.m_buffer[segmentId].Info.m_lanes[laneIndex].m_finalDirection)) {
return true;
}
}
} else {
return true;
}
}
}
return false;
Expand Down
4 changes: 2 additions & 2 deletions TLM/TLM/Custom/PathFinding/CustomPathFind.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ private bool Terminated {
//private float _speedRand;
//private bool _extPublicTransport;
private float _vehicleCosts;
private static ushort laneChangeRandCounter = 0;
//private static ushort laneChangeRandCounter = 0;
#if DEBUG
public uint _failedPathFinds = 0;
public uint _succeededPathFinds = 0;
Expand Down Expand Up @@ -1352,7 +1352,7 @@ private bool ProcessItemCosts(bool debug, bool allowAdvancedAI, bool obeyStockLa
#if DEBUGNEWPF && DEBUG
debug = debug && _conf.DebugSwitches[1];
#else
bool debug = false;
debug = false;
#endif
//Log.Message($"THREAD #{Thread.CurrentThread.ManagedThreadId} Path finder: " + this._pathFindIndex + " vehicle types: " + this._vehicleTypes);
#if DEBUGNEWPF && DEBUG
Expand Down
51 changes: 51 additions & 0 deletions TLM/TLM/LoadingExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,43 @@ public void initDetours() {
detourFailed = true;
}

/*Log.Info("Reverse-Redirection PassengerCarAI::FindParkingSpaceBuilding calls");
try {
Detours.Add(new Detour(typeof(CustomPassengerCarAI).GetMethod("FindParkingSpaceBuilding",
BindingFlags.NonPublic | BindingFlags.Static,
null,
new[]
{
typeof (ushort),
typeof (ushort),
typeof (Vector3),
typeof (float),
typeof (float),
typeof (float),
typeof (Vector3).MakeByRefType(),
typeof (Quaternion).MakeByRefType()
},
null),
typeof(PassengerCarAI).GetMethod("FindParkingSpaceBuilding",
BindingFlags.NonPublic | BindingFlags.Static,
null,
new[]
{
typeof (ushort),
typeof (ushort),
typeof (Vector3),
typeof (float),
typeof (float),
typeof (float),
typeof (Vector3).MakeByRefType(),
typeof (Quaternion).MakeByRefType()
},
null)));
} catch (Exception) {
Log.Error("Could not reverse-redirect PassengerCarAI::FindParkingSpaceBuilding");
detourFailed = true;
}*/

Log.Info("Reverse-Redirection PassengerCarAI::FindParkingSpace calls");
try {
Detours.Add(new Detour(typeof(CustomPassengerCarAI).GetMethod("FindParkingSpace",
Expand Down Expand Up @@ -1054,6 +1091,19 @@ public void initDetours() {
detourFailed = true;
}

Log.Info("Redirecting PassengerCarAI UpdateParkedVehicle Calls");
try {
Detours.Add(new Detour(typeof(PassengerCarAI).GetMethod("UpdateParkedVehicle",
new[] {
typeof (ushort),
typeof (VehicleParked).MakeByRefType()
}),
typeof(CustomPassengerCarAI).GetMethod("CustomUpdateParkedVehicle")));
} catch (Exception) {
Log.Error("Could not redirect PassengerCarAI::UpdateParkedVehicle.");
detourFailed = true;
}

Log.Info("Redirection PassengerCarAI::ParkVehicle calls");
try {
Detours.Add(new Detour(typeof(PassengerCarAI).GetMethod("ParkVehicle",
Expand Down Expand Up @@ -1767,6 +1817,7 @@ private void RegisterCustomManagers() {
RegisteredManagers.Add(LaneArrowManager.Instance);
RegisteredManagers.Add(LaneConnectionManager.Instance);
RegisteredManagers.Add(OptionsManager.Instance);
RegisteredManagers.Add(ParkingRestrictionsManager.Instance);
RegisteredManagers.Add(RoutingManager.Instance);
RegisteredManagers.Add(SegmentEndManager.Instance);
RegisteredManagers.Add(SpeedLimitManager.Instance);
Expand Down
36 changes: 21 additions & 15 deletions TLM/TLM/Manager/AdvancedParkingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -458,17 +458,19 @@ internal ushort FindParkingSpaceAtRoadSide(ushort ignoreParked, Vector3 refPos,
Quaternion innerParkRot;
float innerParkOffset;
if (netManager.m_segments.m_buffer[segmentId].GetClosestLanePosition(refPos, NetInfo.LaneType.Parking, VehicleInfo.VehicleType.Car, out innerParkPos, out laneId, out laneIndex, out laneOffset)) {
if (CustomPassengerCarAI.FindParkingSpaceRoadSide(ignoreParked, segmentId, innerParkPos, width, length, out innerParkPos, out innerParkRot, out innerParkOffset)) {
#if DEBUG
if (GlobalConfig.Instance.DebugSwitches[4])
Log._Debug($"FindParkingSpaceRoadSide: Found a parking space for refPos {refPos} @ {innerParkPos}, laneId {laneId}, laneIndex {laneIndex}!");
#endif
foundSegmentId = segmentId;
myParkPos = innerParkPos;
myParkRot = innerParkRot;
myParkOffset = innerParkOffset;
if (!randomize || rng.Int32(GlobalConfig.Instance.VicinityParkingSpaceSelectionRand) != 0)
return false;
if (!Options.parkingRestrictionsEnabled || ParkingRestrictionsManager.Instance.IsParkingAllowed(segmentId, netManager.m_segments.m_buffer[segmentId].Info.m_lanes[laneIndex].m_finalDirection)) {
if (CustomPassengerCarAI.FindParkingSpaceRoadSide(ignoreParked, segmentId, innerParkPos, width, length, out innerParkPos, out innerParkRot, out innerParkOffset)) {
#if DEBUG
if (GlobalConfig.Instance.DebugSwitches[4])
Log._Debug($"FindParkingSpaceRoadSide: Found a parking space for refPos {refPos} @ {innerParkPos}, laneId {laneId}, laneIndex {laneIndex}!");
#endif
foundSegmentId = segmentId;
myParkPos = innerParkPos;
myParkRot = innerParkRot;
myParkOffset = innerParkOffset;
if (!randomize || rng.Int32(GlobalConfig.Instance.VicinityParkingSpaceSelectionRand) != 0)
return false;
}
}
} else {
/*if (GlobalConfig.Instance.DebugSwitches[2])
Expand Down Expand Up @@ -755,16 +757,20 @@ public bool FindParkingSpaceRoadSideForVehiclePos(VehicleInfo vehicleInfo, ushor
NetManager netManager = Singleton<NetManager>.instance;
if ((netManager.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Created) != NetSegment.Flags.None) {
if (netManager.m_segments.m_buffer[segmentId].GetClosestLanePosition(refPos, NetInfo.LaneType.Parking, VehicleInfo.VehicleType.Car, out parkPos, out laneId, out laneIndex, out parkOffset)) {
if (CustomPassengerCarAI.FindParkingSpaceRoadSide(ignoreParked, segmentId, parkPos, width, length, out parkPos, out parkRot, out parkOffset)) {
if (!Options.parkingRestrictionsEnabled || ParkingRestrictionsManager.Instance.IsParkingAllowed(segmentId, netManager.m_segments.m_buffer[segmentId].Info.m_lanes[laneIndex].m_finalDirection)) {
if (CustomPassengerCarAI.FindParkingSpaceRoadSide(ignoreParked, segmentId, parkPos, width, length, out parkPos, out parkRot, out parkOffset)) {
#if DEBUG
if (GlobalConfig.Instance.DebugSwitches[4])
Log._Debug($"FindParkingSpaceRoadSideForVehiclePos: Found a parking space for refPos {refPos} @ {parkPos}, laneId {laneId}, laneIndex {laneIndex}!");
if (GlobalConfig.Instance.DebugSwitches[4])
Log._Debug($"FindParkingSpaceRoadSideForVehiclePos: Found a parking space for refPos {refPos} @ {parkPos}, laneId {laneId}, laneIndex {laneIndex}!");
#endif
return true;
return true;
}
}
}
}

//

parkPos = default(Vector3);
parkRot = default(Quaternion);
laneId = 0;
Expand Down
12 changes: 11 additions & 1 deletion TLM/TLM/Manager/OptionsManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,14 @@ public bool LoadData(byte[] data) {
Options.setInstantEffects(data[29] == (byte)1);
}

if (data.Length >= 31) {
Options.setParkingRestrictionsEnabled(data[30] == (byte)1);
}

if (data.Length >= 32) {
Options.setParkingRestrictionsOverlay(data[31] == (byte)1);
}

return true;
}

Expand Down Expand Up @@ -174,7 +182,9 @@ public byte[] SaveData(ref bool success) {
(byte)(Options.preferOuterLane ? 1 : 0),
(byte)(Options.realisticSpeeds ? 1 : 0),
(byte)(Options.evacBussesMayIgnoreRules ? 1 : 0),
(byte)(Options.instantEffects ? 1 : 0)
(byte)(Options.instantEffects ? 1 : 0),
(byte)(Options.parkingRestrictionsEnabled ? 1 : 0),
(byte)(Options.parkingRestrictionsOverlay ? 1 : 0)
};
}
}
Expand Down
Loading

0 comments on commit 3bac079

Please sign in to comment.