wiremod-svn-archive/wire/lua/entities/gmod_wire_datasocket/init.lua
blackphoenix 4f32b835f3 Added:
Console Screen (30x18 dos-like console)
Address Bus (To join up to 4 address spaces)
Data Port (Aka old ports in CPU, but external)
Data Plug (Connects address spaces)
32KB RAM module
CPU Protected Mode (Simple)
CPU Interrupts (in PM)
Strings supported in DB macro.
Lots more I forgot.
CPU Frequency limit to 5000Hz
Fixed:
CPU is now V2.00, added lots and lots of opcodes, around 100 (but 8 are disabled due to some reasons)
Digital Screen (new inputs)
Wired Numpad (Hi-Speed link added, acts as buffer)
New examples for CPU
CPU supports writing to ROM, i.e. program will be restored each reset.
ZCPU & ZASM bugs.

Known bugs:
Address Bus settings do not save when duping
Console screen does not dupe (duplications of it result in things connected to old copy)
Removed in-game editor, reworking it into VGUI. You can always use notepad, or my editor, it might be posted on forum
Some other misc little bugs.
2007-04-12 19:16:47 +00:00

155 lines
3.7 KiB
Lua

AddCSLuaFile( "cl_init.lua" )
AddCSLuaFile( "shared.lua" )
include('shared.lua')
ENT.WireDebugName = "Socket"
local MODEL = Model( "models/props_lab/tpplugholder_single.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" })
end
function ENT:SetMemory(mement)
self.Memory = mement
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
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(8, -13, -10) )
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(8, -13, -5) )
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
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
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