145 lines
3.5 KiB
Lua
145 lines
3.5 KiB
Lua
AddCSLuaFile()
|
|
DEFINE_BASECLASS( "base_wire_entity" )
|
|
ENT.PrintName = "Wire Text Receiver"
|
|
ENT.WireDebugName = "Text Receiver"
|
|
|
|
if CLIENT then return end -- No more client
|
|
|
|
local receivers = {}
|
|
|
|
local function RegisterReceiver( ent )
|
|
receivers[ent] = true
|
|
end
|
|
|
|
local function RemoveReceiver( ent )
|
|
receivers[ent] = nil
|
|
end
|
|
|
|
hook.Add( "PlayerSay", "Wire Text receiver PlayerSay", function( ply, txt )
|
|
for ent,_ in pairs( receivers ) do
|
|
if not ent or not ent:IsValid() then
|
|
RemoveReceiver( ent )
|
|
else
|
|
ent:PlayerSpoke( ply, txt )
|
|
end
|
|
end
|
|
end)
|
|
|
|
function ENT:Initialize()
|
|
self:PhysicsInit( SOLID_VPHYSICS )
|
|
self:SetMoveType( MOVETYPE_VPHYSICS )
|
|
self:SetSolid( SOLID_VPHYSICS )
|
|
|
|
RegisterReceiver( self )
|
|
|
|
self.Outputs = WireLib.CreateOutputs( self, { "Message [STRING]", "Player [ENTITY]", "Clk" } )
|
|
|
|
self.UseLuaPatterns = false
|
|
self.CaseInsensitive = true
|
|
self.Matches = {}
|
|
end
|
|
|
|
function ENT:Setup( UseLuaPatterns, Matches, CaseInsensitive )
|
|
local outputs = { "Message", "Player", "Clk" }
|
|
local types = { "STRING", "ENTITY", "NORMAL" }
|
|
|
|
if UseLuaPatterns then
|
|
outputs[#outputs+1] = "PatternError"
|
|
types[#types+1] = "STRING"
|
|
end
|
|
|
|
if #Matches > 0 then
|
|
local txt = "Matches:"
|
|
for i=1,#Matches do
|
|
outputs[#outputs+1] = "Match " .. i
|
|
types[#types+1] = "NORMAL"
|
|
txt = txt .. "\n" .. Matches[i]
|
|
if UseLuaPatterns then
|
|
outputs[#outputs+1] = "Matches " .. i
|
|
types[#types+1] = "ARRAY"
|
|
end
|
|
end
|
|
self:SetOverlayText(txt)
|
|
end
|
|
self.Outputs = WireLib.AdjustSpecialOutputs( self, outputs, types )
|
|
|
|
self:PlayerSpoke( nil, "" ) -- Reset outputs
|
|
|
|
self.UseLuaPatterns = UseLuaPatterns
|
|
self.Matches = Matches
|
|
self.CaseInsensitive = CaseInsensitive
|
|
end
|
|
|
|
function ENT:OnRemove()
|
|
RemoveReceiver( self )
|
|
end
|
|
|
|
local string_find = string.find
|
|
local string_lower = string.lower
|
|
local string_match = string.match
|
|
|
|
function ENT:PcallFind( text, match )
|
|
local ok, ret = pcall( string_find, text, match, 1, not self.UseLuaPatterns )
|
|
|
|
if ok == true then
|
|
return ret ~= nil
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function ENT:AddError( err, idx )
|
|
self.PatternError = self.PatternError .. err .. " at match nr " .. idx .. "\n"
|
|
end
|
|
|
|
function ENT:PcallMatch( text, match, idx )
|
|
local ret = { pcall( string_match, text, match ) }
|
|
|
|
if ret[1] == true then
|
|
table.remove( ret, 1 )
|
|
return ret
|
|
else
|
|
self:AddError( ret[2], idx )
|
|
return {}
|
|
end
|
|
end
|
|
|
|
function ENT:PlayerSpoke( ply, text )
|
|
WireLib.TriggerOutput( self, "Message", text )
|
|
WireLib.TriggerOutput( self, "Player", ply )
|
|
|
|
WireLib.TriggerOutput( self, "Clk", 1 )
|
|
timer.Simple( 0, function()
|
|
if self and self:IsValid() then
|
|
WireLib.TriggerOutput( self, "Clk", 0 )
|
|
end
|
|
end )
|
|
|
|
if self.CaseInsensitive then text = string_lower(text) end
|
|
|
|
if self.UseLuaPatterns then
|
|
-- Reset error
|
|
self.PatternError = ""
|
|
WireLib.TriggerOutput( self, "PatternError", self.PatternError )
|
|
end
|
|
|
|
for i=1,#self.Matches do
|
|
local match = self.Matches[i]
|
|
if self.CaseInsensitive then match = string_lower(match) end
|
|
if self:PcallFind( text, match ) then
|
|
WireLib.TriggerOutput( self, "Match " .. i, 1 )
|
|
else
|
|
WireLib.TriggerOutput( self, "Match " .. i, 0 )
|
|
end
|
|
|
|
if self.UseLuaPatterns then
|
|
WireLib.TriggerOutput( self, "Matches " .. i, self:PcallMatch( text, match, i ) )
|
|
end
|
|
end
|
|
|
|
if self.UseLuaPatterns then
|
|
WireLib.TriggerOutput( self, "PatternError", string.sub( self.PatternError, 1, -2 ) )
|
|
end
|
|
end
|
|
|
|
duplicator.RegisterEntityClass("gmod_wire_textreceiver", WireLib.MakeWireEnt, "Data", "UseLuaPatterns", "Matches", "CaseInsensitive" )
|