195 lines
5 KiB
Lua
195 lines
5 KiB
Lua
AddCSLuaFile()
|
|
DEFINE_BASECLASS( "base_wire_entity" )
|
|
ENT.PrintName = "Wire Plug"
|
|
ENT.Author = "Divran"
|
|
ENT.Purpose = "Links with a socket"
|
|
ENT.Instructions = "Move a plug close to a socket to link them, and data will be transferred through the link."
|
|
ENT.WireDebugName = "Plug"
|
|
|
|
function ENT:GetSocketClass()
|
|
return "gmod_wire_socket"
|
|
end
|
|
|
|
function ENT:GetClosestSocket()
|
|
local sockets = ents.FindInSphere( self:GetPos(), 100 )
|
|
|
|
local ClosestDist
|
|
local Closest
|
|
|
|
for k,v in pairs( sockets ) do
|
|
if (v:GetClass() == self:GetSocketClass() and not v:GetNWBool( "Linked", false )) then
|
|
local pos, _ = v:GetLinkPos()
|
|
local Dist = self:GetPos():Distance( pos )
|
|
if (ClosestDist == nil or ClosestDist > Dist) then
|
|
ClosestDist = Dist
|
|
Closest = v
|
|
end
|
|
end
|
|
end
|
|
|
|
return Closest
|
|
end
|
|
|
|
if CLIENT then
|
|
function ENT:DrawEntityOutline()
|
|
if (GetConVar("wire_plug_drawoutline"):GetBool()) then
|
|
BaseClass.DrawEntityOutline( self )
|
|
end
|
|
end
|
|
return -- No more client
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Helper functions & variables
|
|
------------------------------------------------------------
|
|
local LETTERS = { "A", "B", "C", "D", "E", "F", "G", "H" }
|
|
local LETTERS_INV = {}
|
|
for k,v in pairs( LETTERS ) do
|
|
LETTERS_INV[v] = k
|
|
end
|
|
|
|
function ENT:Initialize()
|
|
self:PhysicsInit( SOLID_VPHYSICS )
|
|
self:SetMoveType( MOVETYPE_VPHYSICS )
|
|
self:SetSolid( SOLID_VPHYSICS )
|
|
|
|
self:SetNWBool( "Linked", false )
|
|
|
|
self.Memory = {}
|
|
end
|
|
|
|
function ENT:Setup( ArrayInput )
|
|
local old = self.ArrayInput
|
|
self.ArrayInput = ArrayInput or false
|
|
|
|
if not (self.Inputs and self.Outputs and self.ArrayInput == old) then
|
|
if (self.ArrayInput) then
|
|
self.Inputs = WireLib.CreateInputs( self, { "In [ARRAY]" } )
|
|
self.Outputs = WireLib.CreateOutputs( self, { "Out [ARRAY]" } )
|
|
else
|
|
self.Inputs = WireLib.CreateInputs( self, LETTERS )
|
|
self.Outputs = WireLib.CreateOutputs( self, LETTERS )
|
|
end
|
|
end
|
|
|
|
self:ShowOutput()
|
|
end
|
|
|
|
function ENT:TriggerInput( name, value )
|
|
if (self.Socket and self.Socket:IsValid()) then
|
|
self.Socket:SetValue( name, value )
|
|
end
|
|
self:ShowOutput()
|
|
end
|
|
|
|
function ENT:SetValue( name, value )
|
|
if not (self.Socket and self.Socket:IsValid()) then return end
|
|
if (name == "In") then
|
|
if (self.ArrayInput) then -- Both have array
|
|
WireLib.TriggerOutput( self, "Out", table.Copy( value ) )
|
|
else -- Target has array, this does not
|
|
for i=1,#LETTERS do
|
|
local val = (value or {})[i]
|
|
if isnumber(val) then
|
|
WireLib.TriggerOutput( self, LETTERS[i], val )
|
|
end
|
|
end
|
|
end
|
|
else
|
|
if (self.ArrayInput) then -- Target does not have array, this does
|
|
if (value ~= nil) then
|
|
local data = table.Copy( self.Outputs.Out.Value )
|
|
data[LETTERS_INV[name]] = value
|
|
WireLib.TriggerOutput( self, "Out", data )
|
|
end
|
|
else -- Niether have array
|
|
if (value ~= nil) then
|
|
WireLib.TriggerOutput( self, name, value )
|
|
end
|
|
end
|
|
end
|
|
self:ShowOutput()
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- WriteCell
|
|
-- Hi-speed support
|
|
------------------------------------------------------------
|
|
function ENT:WriteCell( Address, Value, WriteToMe )
|
|
Address = math.floor(Address)
|
|
if (WriteToMe) then
|
|
self.Memory[Address or 1] = Value or 0
|
|
return true
|
|
else
|
|
if (self.Socket and self.Socket:IsValid()) then
|
|
self.Socket:WriteCell( Address, Value, true )
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- ReadCell
|
|
-- Hi-speed support
|
|
------------------------------------------------------------
|
|
function ENT:ReadCell( Address )
|
|
Address = math.floor(Address)
|
|
return self.Memory[Address or 1] or 0
|
|
end
|
|
|
|
function ENT:Think()
|
|
BaseClass.Think( self )
|
|
self:SetNWBool( "PlayerHolding", self:IsPlayerHolding() )
|
|
end
|
|
|
|
function ENT:ResetValues()
|
|
if (self.ArrayInput) then
|
|
WireLib.TriggerOutput( self, "Out", {} )
|
|
else
|
|
for i=1,#LETTERS do
|
|
WireLib.TriggerOutput( self, LETTERS[i], 0 )
|
|
end
|
|
end
|
|
self.Memory = {}
|
|
self:ShowOutput()
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- ResendValues
|
|
-- Resends the values when plugging in
|
|
------------------------------------------------------------
|
|
function ENT:ResendValues()
|
|
if (not self.Socket) then return end
|
|
if (self.ArrayInput) then
|
|
self.Socket:SetValue( "In", self.Inputs.In.Value )
|
|
else
|
|
for i=1,#LETTERS do
|
|
self.Socket:SetValue( LETTERS[i], self.Inputs[LETTERS[i]].Value )
|
|
end
|
|
end
|
|
end
|
|
|
|
function ENT:ShowOutput()
|
|
local OutText = "Plug [" .. self:EntIndex() .. "]\n"
|
|
if (self.ArrayInput) then
|
|
OutText = OutText .. "Array input/outputs."
|
|
else
|
|
OutText = OutText .. "Number input/outputs."
|
|
end
|
|
if (self.Socket and self.Socket:IsValid()) then
|
|
OutText = OutText .. "\nLinked to socket [" .. self.Socket:EntIndex() .. "]"
|
|
end
|
|
self:SetOverlayText(OutText)
|
|
end
|
|
|
|
duplicator.RegisterEntityClass( "gmod_wire_plug", WireLib.MakeWireEnt, "Data", "ArrayInput" )
|
|
|
|
function ENT:ApplyDupeInfo(ply, ent, info, GetEntByID)
|
|
if (info.Plug ~= nil) then
|
|
ent:Setup( info.Plug.ArrayInput )
|
|
end
|
|
|
|
BaseClass.ApplyDupeInfo(self, ply, ent, info, GetEntByID)
|
|
end
|