Skip to content

Instantly share code, notes, and snippets.

@adamnejm
Created June 13, 2022 19:54
Show Gist options
  • Save adamnejm/e226f671683a5ed20271a609bd6e5932 to your computer and use it in GitHub Desktop.
Save adamnejm/e226f671683a5ed20271a609bd6e5932 to your computer and use it in GitHub Desktop.
[Starfall] Pod Controller Library
--@name Generic
--@author Name
local track_seats = {}
local track_drivers = {}
local empty_func = function(...) end
-------------------------------------------
local Pod = class("Pod")
function Pod:initialize(seat, whitelist)
self:set_seat(seat)
self:set_whitelist(whitelist)
self.axis = {}
end
function Pod:set_seat(seat)
if self.seat ~= nil then
track_seats[self.seat] = nil
end
if seat ~= nil then
assert(seat:getClass() == "prop_vehicle_prisoner_pod", "Invalid seat class")
track_seats[seat] = self
end
self.seat = seat
end
function Pod:get_seat()
local seat = self.seat
if seat and seat:isValid() then
return seat
end
end
function Pod:set_driver(driver)
if self.driver ~= nil then
track_drivers[self.driver] = nil
end
if driver ~= nil then
assert(type(driver) == "Player", "Driver is not a player!")
track_drivers[driver] = self
else
for _, axis in pairs(self.axis) do
axis.value = axis.default
end
end
self.driver = driver
self:driver_changed(driver)
end
function Pod:get_driver()
local driver = self.driver
if driver and driver:isValid() then
return driver
end
end
function Pod:set_whitelist(whitelist)
if whitelist == nil or type(whitelist) == "table" then
self.whitelist = whitelist
elseif type(whitelist) == "Player" then
self.whitelist = { whitelist }
else
error("Invalid whitelist type, must be one of: player, table, nil")
end
end
-------------------------------------------
function Pod:key_press(ply, key) end -- override me
function Pod:key_release(ply, key) end -- override me
function Pod:driver_changed(ply) end -- override me
function Pod:key_down(key)
return self.driver and self.driver:keyDown(key)
end
function Pod:set_axis(name, inputs)
if type(name) == "table" then
for k, v in pairs(name) do
self:set_axis(k, v)
end
else
local default = inputs.default
inputs.default = nil
self.axis[name] = {
inputs = inputs,
held = {},
value = default,
default = default,
}
end
end
function Pod:get_axis(name)
return self.axis[name].value
end
-------------------------------------------
local blacklisted_color = Color(255, 74, 74)
local function update_driver(ply, vehicle, role)
local pod = track_seats[vehicle]
if not pod then return end
if role and pod.whitelist and not table.hasValue(pod.whitelist, ply) then
enableHud(ply, true)
printHud(ply, blacklisted_color, "YOU ARE NOT PERMITTED TO USE THIS SEAT!")
enableHud(ply, false)
vehicle:ejectDriver()
return
end
pod:set_driver(role and ply)
end
hook.add("PlayerEnteredVehicle", "Pod.UpdateDriver", update_driver)
hook.add("PlayerLeaveVehicle", "Pod.UpdateDriver", update_driver)
-------------------------------------------
local function key_press(ply, key)
local pod = track_drivers[ply]
if not pod then return end
pod:key_press(ply, key)
for _, axis in pairs(pod.axis) do
local input = axis.inputs[key]
if input then
axis.held[key] = true
axis.value = input
end
end
end
local function key_release(ply, key)
local pod = track_drivers[ply]
if not pod then return end
pod:key_release(ply, key)
for _, axis in pairs(pod.axis) do
local input = axis.inputs[key]
if input then
axis.held[key] = nil
axis.value = axis.inputs[next(axis.held)] or axis.default
end
end
end
hook.add("KeyPress", "Pod.HandleInput", key_press)
hook.add("KeyRelease", "Pod.HandleInput", key_release)
-------------------------------------------
return Pod
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment