private static Rage.Object[] CreateConesAtVehicleSide(Vehicle vehicle, float distanceFromVehicle, bool freezeConesPosition, bool createSideCones, bool createFrontCones, bool createRearCones, Vector3 sidePosition, Vector3 sideVector) { // TODO: CreateConesAtVehicleSide(): make the vehicles go around the cones instead of ramming into them List <Rage.Object> cones = new List <Rage.Object>(); Action <Vector3> createCone = (pos) => { Rage.Object o = new Rage.Object("prop_mp_cone_02", pos); float? z = World.GetGroundZ(o.Position, false, true); if (z.HasValue) { o.SetPositionZ(z.Value); } o.IsPositionFrozen = freezeConesPosition; cones.Add(o); }; float length = vehicle.Length; Vector3 forwardVector = vehicle.ForwardVector; const float separation = 2.0f; if (createSideCones) { // create cones at the side of the vehicle createCone(sidePosition + (sideVector * distanceFromVehicle)); // middle cone for (float i = separation, j = -separation; i < (length / 2); i += separation, j -= separation) { createCone(sidePosition + (sideVector * distanceFromVehicle) + (forwardVector * i)); // from middle to front cones createCone(sidePosition + (sideVector * distanceFromVehicle) + (forwardVector * j)); // from middle to rear cones } } float width = vehicle.Width; Vector3 rearPosition = vehicle.RearPosition; Vector3 frontPosition = vehicle.FrontPosition; float rearFrontConesdistanceFromVehicle = distanceFromVehicle * 2 + length / 2; // create cones at the front and rear, going from one side to the other for (float i = -(width / 2) - distanceFromVehicle; i < (width / 2); i += separation / 2) { if (createRearCones) { createCone(rearPosition + (forwardVector * -(rearFrontConesdistanceFromVehicle + (i * separation))) + (sideVector * -i)); // rear cones } if (createFrontCones) { createCone(frontPosition + (forwardVector * (rearFrontConesdistanceFromVehicle + (i * separation))) + (sideVector * -i)); // front cones } } return(cones.ToArray()); }
public static void dropSign(string selectedSign, bool swapHeading, Vector3 Location, float HeadingModifier) { GameFiber.StartNew(delegate { try { //string selectedCone = barriersToChooseFrom[EntryPoint.rnd.Next(barriersToChooseFrom.Length)]; //string selectedCone = "PROP_MP_ARROW_BARRIER_01"; if (TrafficPolicerHandler.IsLSPDFRPlusRunning) { API.LSPDFRPlusFunctions.AddCountToStatistic(Main.PluginName, "Road signs placed"); } Rage.Object trafficCone = new Rage.Object(selectedSign, Location); trafficCone.IsPersistent = true; trafficCone.IsInvincible = true; trafficCone.Rotation = RotationToPlaceAt; if (swapHeading) { trafficCone.Heading = Game.LocalPlayer.Character.Heading + 180f; } trafficCone.Heading += HeadingModifier; trafficCone.IsPositionFrozen = false; if (TrafficSignPreview.Exists()) { TrafficSignPreview.SetPositionZ(TrafficSignPreview.Position.Z + 3f); } int waitCount = 0; while (trafficCone.HeightAboveGround > 0.01f) { trafficCone.SetPositionZ(trafficCone.Position.Z - (trafficCone.HeightAboveGround * 0.75f)); waitCount++; if (waitCount >= 1000) { break; } } if (trafficCone.Exists()) { trafficCone.IsPositionFrozen = true; roadSignsDropped.Add(trafficCone); UInt32 handle = World.AddSpeedZone(trafficCone.Position, 5f, 5f); speedZones.Add(handle); Rage.Object invWall = new Rage.Object("p_ice_box_01_s", trafficCone.Position); invWall.IsPersistent = true; Ped invPed = new Ped(trafficCone.Position); invPed.MakeMissionPed(); invPed.IsVisible = false; invPed.IsPositionFrozen = true; invWall.Heading = Game.LocalPlayer.Character.Heading; invWall.IsVisible = false; RoadSignsWithInvisWallsAndPeds.Add(trafficCone, invWall, invPed); } } catch (Exception e) { Game.LogTrivial(e.ToString()); } }); }