[FIXED] Removed obsolete code from some hispeed devices [FIXED] Misc ZASM error [ADDED] "Connected" outputs to data socket and data plug [FIXED] Added a neater error display in GPU [FIXED] Added small fix for when other player removes your keyboard and you cant get out
161 lines
3.8 KiB
Lua
161 lines
3.8 KiB
Lua
|
|
AddCSLuaFile( "cl_init.lua" )
|
|
AddCSLuaFile( "shared.lua" )
|
|
|
|
include('shared.lua')
|
|
|
|
ENT.WireDebugName = "Socket"
|
|
|
|
local MODEL = Model( "models/hammy/pci_slot.mdl" )
|
|
|
|
//Time after loosing one plug to search for another
|
|
local NEW_PLUG_WAIT_TIME = 2
|
|
local PLUG_IN_SOCKET_CONSTRAINT_POWER = 5000
|
|
local PLUG_IN_ATTACH_RANGE = 3
|
|
|
|
function ENT:Initialize()
|
|
self.Entity:SetModel( MODEL )
|
|
self.Entity:PhysicsInit( SOLID_VPHYSICS )
|
|
self.Entity:SetMoveType( MOVETYPE_VPHYSICS )
|
|
self.Entity:SetSolid( SOLID_VPHYSICS )
|
|
|
|
self.MyPlug = nil
|
|
self.Memory = nil
|
|
self.Const = nil
|
|
|
|
self.Outputs = Wire_CreateOutputs(self.Entity, { "Memory" })
|
|
self:SetOverlayText( "Data socket" )
|
|
Wire_TriggerOutput(self.Entity, "Memory", 0)
|
|
end
|
|
|
|
function ENT:SetMemory(mement)
|
|
self.Memory = mement
|
|
Wire_TriggerOutput(self.Entity, "Memory", 1)
|
|
end
|
|
|
|
function ENT:Setup(a,ar,ag,ab,aa)
|
|
self.A = a or 0
|
|
self.AR = ar or 255
|
|
self.AG = ag or 0
|
|
self.AB = ab or 0
|
|
self.AA = aa or 255
|
|
|
|
self.Entity:SetColor(ar, ag, ab, aa)
|
|
end
|
|
|
|
function ENT:ReadCell( Address )
|
|
if (self.Memory) then
|
|
if (self.Memory.ReadCell) then
|
|
return self.Memory:ReadCell( Address )
|
|
else
|
|
return nil
|
|
end
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
function ENT:WriteCell( Address, value )
|
|
if (self.Memory) then
|
|
if (self.Memory.WriteCell) then
|
|
return self.Memory:WriteCell( Address, value )
|
|
else
|
|
return false
|
|
end
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function ENT:Think()
|
|
self.BaseClass.Think(self)
|
|
|
|
// If we were unplugged, reset the plug and socket to accept new ones.
|
|
if (self.Const) and (not self.Const:IsValid()) then
|
|
self.Const = nil
|
|
self.NoCollideConst = nil
|
|
if (self.MyPlug) and (self.MyPlug:IsValid()) then
|
|
self.MyPlug:SetSocket(nil)
|
|
self.MyPlug = nil
|
|
end
|
|
|
|
self.Memory = nil //We're now getting no signal
|
|
Wire_TriggerOutput(self.Entity, "Memory", 0)
|
|
|
|
self.Entity:NextThink( CurTime() + NEW_PLUG_WAIT_TIME ) //Give time before next grabbing a plug.
|
|
return true
|
|
end
|
|
|
|
// If we have no plug in us
|
|
if (not self.MyPlug) or (not self.MyPlug:IsValid()) then
|
|
|
|
// Find entities near us
|
|
local sockCenter = self:GetOffset( Vector(-1.75, 0, 0) )
|
|
local local_ents = ents.FindInSphere( sockCenter, PLUG_IN_ATTACH_RANGE )
|
|
for key, plug in pairs(local_ents) do
|
|
|
|
// If we find a plug, try to attach it to us
|
|
if ( plug:IsValid() && plug:GetClass() == "gmod_wire_dataplug" ) then
|
|
|
|
// If no other sockets are using it
|
|
if plug.MySocket == nil then
|
|
local plugpos = plug:GetPos()
|
|
local dist = (sockCenter-plugpos):Length()
|
|
|
|
self:AttachPlug(plug)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function ENT:AttachPlug( plug )
|
|
// Set references between them
|
|
plug:SetSocket(self.Entity)
|
|
self.MyPlug = plug
|
|
|
|
// Position plug
|
|
local newpos = self:GetOffset( Vector(-1.75, 0, 0) )
|
|
local socketAng = self.Entity:GetAngles()
|
|
plug:SetPos( newpos )
|
|
plug:SetAngles( socketAng )
|
|
|
|
self.NoCollideConst = constraint.NoCollide(self.Entity, plug, 0, 0)
|
|
if (not self.NoCollideConst) then
|
|
self.MyPlug = nil
|
|
plug:SetSocket(nil)
|
|
self.Memory = nil
|
|
Wire_TriggerOutput(self.Entity, "Memory", 0)
|
|
return
|
|
end
|
|
|
|
// Constrain together
|
|
self.Const = constraint.Weld( self.Entity, plug, 0, 0, PLUG_IN_SOCKET_CONSTRAINT_POWER, true )
|
|
if (not self.Const) then
|
|
self.NoCollideConst:Remove()
|
|
self.NoCollideConst = nil
|
|
self.MyPlug = nil
|
|
plug:SetSocket(nil)
|
|
self.Memory = nil
|
|
Wire_TriggerOutput(self.Entity, "Memory", 0)
|
|
return
|
|
end
|
|
|
|
// Prepare clearup incase one is removed
|
|
plug:DeleteOnRemove( self.Const )
|
|
self.Entity:DeleteOnRemove( self.Const )
|
|
self.Const:DeleteOnRemove( self.NoCollideConst )
|
|
|
|
plug:AttachedToSocket(self.Entity)
|
|
end
|
|
|
|
function ENT:OnRestore()
|
|
self.A = self.A or 0
|
|
self.AR = self.AR or 255
|
|
self.AG = self.AG or 0
|
|
self.AB = self.AB or 0
|
|
self.AA = self.AA or 255
|
|
|
|
self.BaseClass.OnRestore(self)
|
|
end
|