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

98 lines
2.4 KiB
Lua

AddCSLuaFile()
DEFINE_BASECLASS( "base_wire_entity" )
ENT.PrintName = "Wire Address Bus"
ENT.WireDebugName = "AddressBus"
if CLIENT then return end -- No more client
function ENT:Initialize()
self:PhysicsInit(SOLID_VPHYSICS)
self:SetMoveType(MOVETYPE_VPHYSICS)
self:SetSolid(SOLID_VPHYSICS)
self:SetUseType(SIMPLE_USE)
self.Outputs = Wire_CreateOutputs(self, {"Memory"})
self.Inputs = Wire_CreateInputs(self,{"Memory1","Memory2","Memory3","Memory4"})
self.DataRate = 0
self.DataBytes = 0
self.Memory = {}
self.MemStart = {}
self.MemEnd = {}
for i = 1,4 do
self.Memory[i] = nil
self.MemStart[i] = 0
self.MemEnd[i] = 0
end
self:SetOverlayText("Data rate: 0 bps")
end
function ENT:Setup(Mem1st, Mem2st, Mem3st, Mem4st, Mem1sz, Mem2sz, Mem3sz, Mem4sz)
local starts = {Mem1st,Mem2st,Mem3st,Mem4st}
local sizes = {Mem1sz,Mem2sz,Mem3sz,Mem4sz}
for i = 1,4 do
starts[i] = tonumber(starts[i]) or 0
sizes[i] = tonumber(sizes[i]) or 0
self.MemStart[i] = starts[i]
self.MemEnd[i] = starts[i] + sizes[i] - 1
self["Mem"..i.."st"] = starts[i]
self["Mem"..i.."sz"] = sizes[i]
end
end
function ENT:Think()
BaseClass.Think(self)
self.DataRate = self.DataBytes
self.DataBytes = 0
Wire_TriggerOutput(self, "Memory", self.DataRate)
self:SetOverlayText("Data rate: "..math.floor(self.DataRate*2).." bps")
self:NextThink(CurTime()+0.5)
return true
end
function ENT:ReadCell(Address)
Address = math.floor(Address)
for i = 1,4 do
if (Address >= self.MemStart[i]) and (Address <= self.MemEnd[i]) then
if self.Memory[i] then
if self.Memory[i].ReadCell then
self.DataBytes = self.DataBytes + 1
local val = self.Memory[i]:ReadCell(Address - self.MemStart[i])
return val or 0
end
else
return 0
end
end
end
return nil
end
function ENT:WriteCell(Address, value)
Address = math.floor(Address)
local res = false
for i = 1,4 do
if (Address >= self.MemStart[i]) and (Address <= self.MemEnd[i]) then
if self.Memory[i] then
if self.Memory[i].WriteCell then
self.Memory[i]:WriteCell(Address - self.MemStart[i], value)
end
end
self.DataBytes = self.DataBytes + 1
res = true
end
end
return res
end
function ENT:TriggerInput(iname, value)
for i = 1,4 do
if iname == "Memory"..i then
self.Memory[i] = self.Inputs["Memory"..i].Src
end
end
end
duplicator.RegisterEntityClass("gmod_wire_addressbus", WireLib.MakeWireEnt, "Data", "Mem1st", "Mem2st", "Mem3st", "Mem4st", "Mem1sz", "Mem2sz", "Mem3sz", "Mem4sz")