diff --git a/lua/acf/contraption/seats_sv.lua b/lua/acf/contraption/seats_sv.lua index 4ffe0303b..f96fb8f38 100644 --- a/lua/acf/contraption/seats_sv.lua +++ b/lua/acf/contraption/seats_sv.lua @@ -1,5 +1,40 @@ -- Optional functionality for legality checking on all vehicles +-- A whitelist of allowed seats, prevents setting your seat to something with a microscopic physics object +local ValidSeatModels = { + -- Default HL2 seats + ["models/nova/airboat_seat.mdl"] = true, + ["models/nova/chair_office02.mdl"] = true, + ["models/props_phx/carseat2.mdl"] = true, + ["models/props_phx/carseat2.mdl"] = true, + ["models/props_phx/carseat3.mdl"] = true, + ["models/props_phx/carseat2.mdl"] = true, + ["models/nova/chair_plastic01.mdl"] = true, + ["models/nova/jeep_seat.mdl"] = true, + ["models/nova/chair_office01.mdl"] = true, + ["models/nova/chair_wood01.mdl"] = true, + ["models/vehicles/prisoner_pod_inner.mdl"] = true, + + -- ACF default seats + ["models/vehicles/driver_pod.mdl"] = true, + ["models/vehicles/pilot_seat.mdl"] = true, + + -- Playerstart seats + ["models/chairs_playerstart/airboatpose.mdl"] = true, + ["models/chairs_playerstart/jeeppose.mdl"] = true, + ["models/chairs_playerstart/podpose.mdl"] = true, + ["models/chairs_playerstart/sitposealt.mdl"] = true, + ["models/chairs_playerstart/pronepose.mdl"] = true, + ["models/chairs_playerstart/sitpose.mdl"] = true, + ["models/chairs_playerstart/standingpose.mdl"] = true, + + -- Racing seats + ["models/lubprops/seat/raceseat.mdl"] = true, + ["models/lubprops/seat/raceseat2.mdl"] = true, +} + +ACF.ValidSeatModels = ValidSeatModels + hook.Add("OnEntityCreated", "ACF_SeatLegality", function(Entity) timer.Simple(0, function() if not IsValid(Entity) then return end @@ -12,7 +47,7 @@ hook.Add("OnEntityCreated", "ACF_SeatLegality", function(Entity) Entity.ACF = {} Entity.ACF.PhysObj = PhysObj Entity.ACF.LegalMass = PhysObj:GetMass() - Entity.ACF.Model = Entity:GetModel() + Entity.ACF.Model = Entity.VehicleTable.Model or Entity:GetModel() Entity.ACF.LegalSeat = true Entity.WireDebugName = Entity.WireDebugName or Entity.VehicleTable.Name or "ACF Legal Vehicle" @@ -34,6 +69,17 @@ hook.Add("OnEntityCreated", "ACF_SeatLegality", function(Entity) end) end) +hook.Add("ACF_IsLegal", "ACF_CheckLegal_SeatLegality", function(Entity) + if not ACF.VehicleLegalChecks then return end + if not Entity:IsVehicle() then return end + + local ModelPath = Entity:GetModel() + + if not ValidSeatModels[ModelPath] and ModelPath ~= Entity.VehicleTable.Model then + return false, "Bad Seat Model", "This seat model is not on the whitelist." + end +end) + hook.Add("CanPlayerEnterVehicle", "ACF_SeatLegality", function(Player, Entity) if not Entity.ACF then return end @@ -41,4 +87,4 @@ hook.Add("CanPlayerEnterVehicle", "ACF_SeatLegality", function(Player, Entity) ACF.SendNotify(Player, false, "[ACF] Seat is not legal and is currently disabled.") return false end -end) \ No newline at end of file +end) diff --git a/lua/tests/acf/core/validation_sv/is_legal.lua b/lua/tests/acf/core/validation_sv/is_legal.lua index 016ecd1c8..3b551cdfb 100644 --- a/lua/tests/acf/core/validation_sv/is_legal.lua +++ b/lua/tests/acf/core/validation_sv/is_legal.lua @@ -19,6 +19,10 @@ return { return true end, + IsVehicle = function() + return false + end, + GetCollisionGroup = function() return COLLISION_GROUP_NONE end