163 lines
4.4 KiB
Lua
163 lines
4.4 KiB
Lua
AddCSLuaFile()
|
|
DEFINE_BASECLASS( "base_wire_entity" )
|
|
ENT.PrintName = "Wire Relay"
|
|
ENT.WireDebugName = "Relay"
|
|
ENT.Author = "tad2020"
|
|
|
|
if CLIENT then return end -- No more client
|
|
|
|
function ENT:Initialize()
|
|
self:PhysicsInit( SOLID_VPHYSICS )
|
|
self:SetMoveType( MOVETYPE_VPHYSICS )
|
|
self:SetSolid( SOLID_VPHYSICS )
|
|
|
|
|
|
self.Value = {} //stores current output value
|
|
self.Last = {} //stores last input value for each input
|
|
|
|
self.Inputs = Wire_CreateInputs(self, { "1A", "2A", "Switch" })
|
|
self.Outputs = Wire_CreateOutputs(self, { "A" })
|
|
end
|
|
|
|
function ENT:Setup(keygroup1, keygroup2, keygroup3, keygroup4, keygroup5, keygroupoff, toggle, normclose, poles, throws, nokey)
|
|
|
|
local outpoles = {"A", "B", "C", "D", "E", "F", "G", "H"} //output names
|
|
|
|
// Clamp
|
|
throws = throws > 10 and 10 or throws
|
|
poles = poles > #outpoles and #outpoles or poles
|
|
|
|
local inputs = {} //wont need this outside setup
|
|
|
|
self.outputs = {} //need to rebuild output names
|
|
|
|
self.keygroup1 = keygroup1
|
|
self.keygroup2 = keygroup2
|
|
self.keygroup3 = keygroup3
|
|
self.keygroup4 = keygroup4
|
|
self.keygroup5 = keygroup5
|
|
self.keygroupoff = keygroupoff
|
|
self.toggle = toggle
|
|
self.normclose = normclose or 0
|
|
self.selinput = normclose or 0
|
|
self.poles = poles
|
|
self.throws = throws
|
|
self.nokey = nokey
|
|
|
|
//build inputs and putputs, init all nil values
|
|
for p=1, self.poles do
|
|
self.outputs[p] = outpoles[p]
|
|
self.Value[p] = self.Value[p] or 0
|
|
for t=1, self.throws do
|
|
//inputs[ p * self.poles + t ] = t .. outpoles[p]
|
|
table.insert(inputs, ( t .. outpoles[p] ))
|
|
self.Last[ t .. outpoles[p] ] = self.Last[ t .. outpoles[p] ] or 0
|
|
end
|
|
end
|
|
//add switch input to end of input list
|
|
table.insert(inputs, "Switch")
|
|
|
|
Wire_AdjustInputs(self, inputs)
|
|
Wire_AdjustOutputs(self, self.outputs)
|
|
|
|
//set the switch to its new normal state
|
|
self:Switch( normclose )
|
|
|
|
if not nokey then
|
|
local pl = self:GetPlayer()
|
|
if (keygroupoff) then
|
|
numpad.OnDown( pl, keygroupoff, "WireRelay_On", self, 0 )
|
|
numpad.OnUp( pl, keygroupoff, "WireRelay_Off", self, 0 )
|
|
end
|
|
if (keygroup1) then
|
|
numpad.OnDown( pl, keygroup1, "WireRelay_On", self, 1 )
|
|
numpad.OnUp( pl, keygroup1, "WireRelay_Off", self, 1 )
|
|
end
|
|
if (keygroup2) then
|
|
numpad.OnDown( pl, keygroup2, "WireRelay_On", self, 2 )
|
|
numpad.OnUp( pl, keygroup2, "WireRelay_Off", self, 2 )
|
|
end
|
|
if (keygroup3) then
|
|
numpad.OnDown( pl, keygroup3, "WireRelay_On", self, 3 )
|
|
numpad.OnUp( pl, keygroup3, "WireRelay_Off", self, 3 )
|
|
end
|
|
if (keygroup4) then
|
|
numpad.OnDown( pl, keygroup4, "WireRelay_On", self, 4 )
|
|
numpad.OnUp( pl, keygroup4, "WireRelay_Off", self, 4 )
|
|
end
|
|
if (keygroup5) then
|
|
numpad.OnDown( pl, keygroup5, "WireRelay_On", self, 5 )
|
|
numpad.OnUp( pl, keygroup5, "WireRelay_Off", self, 5 )
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function ENT:TriggerInput(iname, value)
|
|
if (iname == "Switch") then
|
|
if (math.abs(value) >= 0 && math.abs(value) <= self.throws) then
|
|
self:Switch(math.abs(value))
|
|
end
|
|
elseif (iname) then
|
|
self.Last[iname] = value or 0
|
|
self:Switch(self.selinput)
|
|
end
|
|
end
|
|
|
|
|
|
function ENT:Switch( mul )
|
|
if (!self:IsValid()) then return false end
|
|
self.selinput = mul
|
|
for p,v in ipairs(self.outputs) do
|
|
self.Value[p] = self.Last[ mul .. v ] or 0
|
|
Wire_TriggerOutput(self, v, self.Value[p])
|
|
end
|
|
self:ShowOutput()
|
|
return true
|
|
end
|
|
|
|
|
|
function ENT:ShowOutput()
|
|
local txt = self.poles .. "P" .. self.throws .. "T "
|
|
if (self.selinput == 0) then
|
|
txt = txt .. "Sel: off"
|
|
else
|
|
txt = txt .. "Sel: " .. self.selinput
|
|
end
|
|
|
|
for p,v in ipairs(self.outputs) do
|
|
txt = txt .. "\n" .. v .. ": " .. self.Value[p]
|
|
end
|
|
|
|
self:SetOverlayText( txt )
|
|
end
|
|
|
|
|
|
function ENT:InputActivate( mul )
|
|
if ( self.toggle && self.selinput == mul) then //only toggle for the same key
|
|
return self:Switch( self.normclose )
|
|
else
|
|
return self:Switch( mul )
|
|
end
|
|
end
|
|
|
|
function ENT:InputDeactivate( mul )
|
|
if ( self.toggle ) then return true end
|
|
return self:Switch( self.normclose )
|
|
end
|
|
|
|
|
|
local function On( pl, ent, mul )
|
|
if (!ent:IsValid()) then return false end
|
|
return ent:InputActivate( mul )
|
|
end
|
|
|
|
local function Off( pl, ent, mul )
|
|
if (!ent:IsValid()) then return false end
|
|
return ent:InputDeactivate( mul )
|
|
end
|
|
|
|
numpad.Register( "WireRelay_On", On )
|
|
numpad.Register( "WireRelay_Off", Off )
|
|
|
|
duplicator.RegisterEntityClass("gmod_wire_relay", WireLib.MakeWireEnt, "Data", "keygroup1", "keygroup2", "keygroup3", "keygroup4", "keygroup5", "keygroupoff", "toggle", "normclose", "poles", "throws", "nokey")
|