dobrograd-13-06-2022/garrysmod/addons/feature-wire/lua/entities/gmod_wire_relay.lua
Jonny_Bro (Nikita) e4d5311906 first commit
2023-11-16 15:01:19 +05:00

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")