Created
June 13, 2022 19:54
-
-
Save adamnejm/e226f671683a5ed20271a609bd6e5932 to your computer and use it in GitHub Desktop.
[Starfall] Pod Controller Library
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--@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