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

180 lines
4.4 KiB
Lua

AddCSLuaFile()
DEFINE_BASECLASS( "base_wire_entity" )
ENT.PrintName = "Wire Button"
ENT.WireDebugName = "Button"
function ENT:SetupDataTables()
self:NetworkVar( "Bool", 0, "On" )
end
if CLIENT then
local halo_ent, halo_blur
function ENT:Initialize()
self.PosePosition = 0.0
end
function ENT:Think()
baseclass.Get("gmod_button").UpdateLever(self)
end
function ENT:Draw()
self:DoNormalDraw(true,false)
if LocalPlayer():GetEyeTrace().Entity == self and EyePos():Distance( self:GetPos() ) < 512 then
if self:GetOn() then
halo_ent = self
halo_blur = 4 + math.sin(CurTime()*20)*2
else
self:DrawEntityOutline()
end
end
Wire_Render(self)
end
hook.Add("PreDrawHalos", "Wiremod_button_overlay_halos", function()
if halo_ent then
halo.Add({halo_ent}, Color(255,100,100), halo_blur, halo_blur, 1, true, true)
halo_ent = nil
end
end)
return -- No more client
end
ENT.OutputEntID = false
ENT.EntToOutput = NULL
local anims = {
-- ["model"] = { on_anim, off_anim }
["models/props/switch001.mdl"] = { 2, 1 },
["models/props_combine/combinebutton.mdl"] = { 3, 2 },
["models/props_mining/control_lever01.mdl"] = { 1, 4 },
["models/props_mining/freightelevatorbutton01.mdl"] = { 1, 2 },
["models/props_mining/freightelevatorbutton02.mdl"] = { 1, 2 },
["models/props_mining/switch01.mdl"] = { 1, 2 },
["models/bull/buttons/rocker_switch.mdl"] = { 1, 2 },
["models/bull/buttons/toggle_switch.mdl"] = { 1, 2 },
["models/bull/buttons/key_switch.mdl"] = { 1, 2 },
["models/props_mining/switch_updown01.mdl"] = { 2, 3 },
}
function ENT:Initialize()
self:PhysicsInit( SOLID_VPHYSICS )
self:SetMoveType( MOVETYPE_VPHYSICS )
self:SetSolid( SOLID_VPHYSICS )
self:SetUseType( SIMPLE_USE )
self.Outputs = Wire_CreateOutputs(self, { "Out" })
self.Inputs = Wire_CreateInputs(self, { "Set" })
local anim = anims[self:GetModel()]
if anim then self:SetSequence(anim[2]) end
end
function ENT:TriggerInput(iname, value)
if iname == "Set" then
if (self.toggle) then
self:Switch(value ~= 0)
self.PrevUser = nil
self.podpress = nil
end
end
end
function ENT:Use(ply, caller)
if (not ply:IsPlayer()) then return end
if (self.PrevUser) and (self.PrevUser:IsValid()) then return end
if self.OutputEntID then
self.EntToOutput = ply
end
if (self:GetOn()) then
if (self.toggle) then self:Switch(false) end
return
end
if IsValid(caller) and caller:GetClass() == "gmod_wire_pod" then
self.podpress = true
end
self:Switch(true)
self.PrevUser = ply
end
function ENT:Think()
BaseClass.Think(self)
if ( self:GetOn() ) then
if (not self.PrevUser)
or (not self.PrevUser:IsValid())
or (not self.podpress and not self.PrevUser:KeyDown(IN_USE))
or (self.podpress and not self.PrevUser:KeyDown( IN_ATTACK )) then
if (not self.toggle) then
self:Switch(false)
end
self.PrevUser = nil
self.podpress = nil
end
self:NextThink(CurTime()+0.05)
return true
end
end
function ENT:Setup(toggle, value_off, value_on, description, entityout)
self.toggle = toggle
self.value_off = value_off
self.value_on = value_on
self.entityout = entityout
if entityout then
WireLib.AdjustSpecialOutputs(self, { "Out", "EntID" , "Entity" }, { "NORMAL", "NORMAL" , "ENTITY" })
Wire_TriggerOutput(self, "EntID", 0)
Wire_TriggerOutput(self, "Entity", nil)
self.OutputEntID=true
else
Wire_AdjustOutputs(self, { "Out" })
self.OutputEntID=false
end
if toggle then
Wire_AdjustInputs(self, { "Set" })
else
Wire_AdjustInputs(self, {})
end
self:Switch(self:GetOn())
end
function ENT:Switch(on)
if (not self:IsValid()) then return end
self:SetOn( on )
if (on) then
self:ShowOutput(self.value_on)
self.Value = self.value_on
local anim = anims[self:GetModel()]
if anim then self:SetSequence(anim[1]) end
else
self:ShowOutput(self.value_off)
self.Value = self.value_off
local anim = anims[self:GetModel()]
if anim then self:SetSequence(anim[2]) end
if self.OutputEntID then self.EntToOutput = NULL end
end
Wire_TriggerOutput(self, "Out", self.Value)
if self.OutputEntID then
Wire_TriggerOutput(self, "EntID", self.EntToOutput:EntIndex())
Wire_TriggerOutput(self, "Entity", self.EntToOutput)
end
return true
end
function ENT:ShowOutput(value)
self:SetOverlayText( "(" .. self.value_off .. " - " .. self.value_on .. ") = " .. value )
end
duplicator.RegisterEntityClass("gmod_wire_button", WireLib.MakeWireEnt, "Data", "toggle", "value_off", "value_on", "description", "entityout" )