AddCSLuaFile("cl_init.lua")

include("cl_init.lua")

function ENT:Initialize()
	self:PhysicsInit( SOLID_VPHYSICS )
	self:SetMoveType( MOVETYPE_VPHYSICS )
	self:SetSolid( SOLID_VPHYSICS )
	
	self.Inputs  = WireLib.CreateInputs (self, { "OnlyPlayers" })
	self.Outputs = WireLib.CreateOutputs(self, { "Touched", "Toucher [ENTITY]", "Touchers [ARRAY]" })
	
	local phys = self:GetPhysicsObject()
	if phys:IsValid() then
		phys:Wake()
	end
	
	self.touchers = {}
	self.only_players = false
	
	self:UpdateOutputs()
end

function ENT:TriggerInput(name, value)
	if name == "OnlyPlayers" then
		self.only_players = value ~= 0
	end
end

function ENT:UpdateOutputs()
	local NumTouchers = #self.touchers
	WireLib.TriggerOutput(self, "Touched", NumTouchers>0 and 1 or 0)
	WireLib.TriggerOutput(self, "Toucher", self.touchers[NumTouchers] or NULL)
	WireLib.TriggerOutput(self, "Touchers", self.touchers)
end

function ENT:StartTouch(ent)
	if not self:MyPassesTriggerFilters(ent) then return end
	table.insert(self.touchers, ent)
	self:UpdateOutputs()
end

function ENT:EndTouch(ent)
	for i,v in ipairs(self.touchers) do
		if v == ent then
			table.remove(self.touchers, i)
			self:UpdateOutputs()
			break
		end
	end
end

function ENT:MyPassesTriggerFilters(ent)
	return ent:IsPlayer() or not self.only_players
end

function MakeWireTouchplate(pl, Pos, Ang, model, only_players)
	-- Create the entity
	local ent = ents.Create("gmod_wire_touchplate")
	
	ent:SetModel(Model(model))
	ent:SetAngles( Ang )
	ent:SetPos( Pos )
	
	ent:SetPlayer( pl )
	ent:Spawn()
	
	ent.only_players = only_players
	
	return ent
end

duplicator.RegisterEntityClass("gmod_wire_touchplate", MakeWireTouchplate, "Pos", "Ang", "model", "only_players")
