TOOL.Category = "Wire - I/O" TOOL.Name = "TextReceiver" TOOL.Command = nil TOOL.ConfigName = "" if ( CLIENT ) then language.Add( "Tool_wire_textreceiver_name", "TextReceiver Tool (Wire)" ) language.Add( "Tool_wire_textreceiver_desc", "Spawns a TextReceiver for use with the wire system." ) language.Add( "Tool_wire_textreceiver_0", "Primary: Create/Update TextReceiver Secondary: Copy Settings" ) language.Add( "WiretextreceiverTool_global", "Global:" ) language.Add("Tool_wire_textreceiver_text1", "Text 1:") language.Add("Tool_wire_textreceiver_text2", "Text 2:") language.Add("Tool_wire_textreceiver_text3", "Text 3:") language.Add("Tool_wire_textreceiver_text4", "Text 4:") language.Add("Tool_wire_textreceiver_text5", "Text 5:") language.Add("Tool_wire_textreceiver_text6", "Text 6:") language.Add("Tool_wire_textreceiver_text7", "Text 7:") language.Add("Tool_wire_textreceiver_text8", "Text 8:") language.Add("Tool_wire_textreceiver_text9", "Text 9:") language.Add("Tool_wire_textreceiver_text10", "Text 10:") language.Add("Tool_wire_textreceiver_text11", "Text 12:") language.Add("Tool_wire_textreceiver_text12", "Text 12:") language.Add("WiretextreceiverTool_trigger","Trigger:") language.Add("Tool_wire_textreceiver_parsetext","Parser Text:") language.Add("WiretextreceiverTool_utrigger","Default:") language.Add("WiretextreceiverTool_hold","Trigger Hold Length:") language.Add("WiretextreceiverTool_outputtext", "Display Output Text:") language.Add("WiretextreceiverTool_SELF", "Include Self:") language.Add("WiretextreceiverTool_toggle", "Toggle:") language.Add("WiretextreceiverTool_sensitivity", "Sensitivity:") language.Add("exact","Exact") language.Add("case_insensitive","Case Insensitive") language.Add("anywhere_exact","Anywhere Exact") language.Add("anywhere_case_insensitive","Anywhere Case Insensitive") language.Add( "sboxlimit_wire_textreceivers", "You've hit TextReceiver limit!" ) language.Add( "Undone_TextReceiver", "Undone Wire TextReceiver" ) end if (SERVER) then CreateConVar('sbox_maxwire_textreceivers', 10) end TOOL.ClientConVar[ "global" ] = "0" TOOL.ClientConVar[ "hold" ] = ".1" TOOL.ClientConVar[ "trigger" ] = "1" TOOL.ClientConVar[ "secure" ] = "0" for i = 1, 12 do TOOL.ClientConVar["text"..i] = "" end TOOL.ClientConVar[ "outputtext" ] = "1" TOOL.ClientConVar["SELF"] = "1" TOOL.ClientConVar["sensitivity"] = "1" TOOL.ClientConVar["toggle"] = "0" TOOL.ClientConVar["utrigger"] = "0" TOOL.ClientConVar["parsetext"] = "" TOOL.ClientConVar["playerout"] = "0" TOOL.Model = "models/jaanus/wiretool/wiretool_range.mdl" local MaxTextLength = 500 cleanup.Register( "wire_textreceivers" ) function TOOL:LeftClick( trace ) if trace.Entity && trace.Entity:IsPlayer() then return false end // If there's no physics object then we can't constraint it! if ( SERVER && !util.IsValidPhysicsObject( trace.Entity, trace.PhysicsBone ) ) then return false end if (CLIENT) then return true end local ply = self:GetOwner() local global = (self:GetClientNumber("global") ~= 0) local hold = self:GetClientNumber("hold") local trigger = self:GetClientNumber("trigger") local lines = {} for i = 1,12 do if (self:GetClientInfo("text"..i) != "") then table.insert(lines,self:GetClientInfo("text"..i)) end end local outputtext = (self:GetClientNumber("outputtext") ~= 0) local SELF = (self:GetClientNumber("SELF") ~= 0) local sensitivity = self:GetClientNumber("sensitivity") local toggle = (self:GetClientNumber("toggle") ~= 0) local secure = (self:GetClientNumber("secure") ~= 0) local utrigger = self:GetClientNumber("utrigger") local parsetext = self:GetClientInfo("parsetext") local playerout = (self:GetClientNumber("playerout") ~= 0) if (parsetext == "") then parsetext = '""' end if (string.len(parsetext) == 1) then parsetext = parsetext .. parsetext end if (string.len(parsetext) > 2) then self:GetOwner():SendLua( "GAMEMODE:AddNotify('Parse text cannot be more than 2 characters!', NOTIFY_GENERIC, 7);" ) return false end if (table.Count(lines)==0) then return false end if (sensitivity <1 || sensitivity > 4) then self:GetOwner():SendLua( "GAMEMODE:AddNotify('Invalid Sensitivity!', NOTIFY_GENERIC, 7);" ) return false end if ( trace.Entity:IsValid() && trace.Entity:GetClass() == "gmod_wire_textreceiver" && trace.Entity.pl == ply ) then trace.Entity:Setup( lines,global,outputtext,hold,trigger,SELF,sensitivity,toggle,utrigger,parsetext,secure,playerout) return true end if ( !self:GetSWEP():CheckLimit( "wire_textreceivers" ) ) then return false end if (not util.IsValidModel(self.Model)) then return false end if (not util.IsValidProp(self.Model)) then return false end // Allow ragdolls to be used? local Ang = trace.HitNormal:Angle() Ang.pitch = Ang.pitch + 90 text_receiver = MakeWireReceiver( ply, Ang, trace.HitPos, lines,global,outputtext,hold,trigger,SELF,sensitivity,toggle,utrigger,parsetext,secure,playerout) local min = text_receiver:OBBMins() text_receiver:SetPos( trace.HitPos - trace.HitNormal * min.z ) local const = WireLib.Weld(text_receiver, trace.Entity, trace.PhysicsBone, true) undo.Create("TextReceiver") undo.AddEntity( text_receiver ) undo.AddEntity( const ) undo.SetPlayer( ply ) undo.Finish() ply:AddCleanup( "text_receivers", text_receiver ) ply:AddCleanup( "text_receivers", const ) ply:AddCleanup( "text_receivers", nocollide ) return true end local function BtoI(bool) if (bool == nil) then return 0 end if (bool == true) then return 1 end if (bool == false) then return 0 end end function TOOL:RightClick( trace ) if (!trace.HitPos) then return false end if (trace.Entity:IsPlayer()) then return false end if ( CLIENT ) then return true end local ply = self:GetOwner() if ( trace.Entity:IsValid() && trace.Entity:GetClass() == "gmod_wire_textreceiver" ) then local Receiver = trace.Entity if (Receiver.CLines == nil) then self:GetOwner():SendLua( "GAMEMODE:AddNotify('No Lines', NOTIFY_GENERIC, 7);" ) return true end for i = 1,12 do self:GetOwner():ConCommand("wire_textreceiver_text"..i.." "..(Receiver.CLines[i] or '""')) end self:GetOwner():ConCommand("wire_textreceiver_sensitivity "..(Receiver.Sensitivity or 1)) self:GetOwner():ConCommand("wire_textreceiver_SELF "..BtoI(Receiver.Iself)) self:GetOwner():ConCommand("wire_textreceiver_toggle "..BtoI(Receiver.Toggle)) self:GetOwner():ConCommand("wire_textreceiver_outputtext "..BtoI(Receiver.OutputText)) self:GetOwner():ConCommand("wire_textreceiver_global "..BtoI(Receiver.global)) self:GetOwner():ConCommand("wire_textreceiver_secure "..BtoI(Receiver.secure)) self:GetOwner():ConCommand("wire_textreceiver_parsetext "..'"' .. (Receiver.char1 or "") .. (Receiver.char2 or "") .. '"') self:GetOwner():ConCommand("wire_textreceiver_hold "..(Receiver.Hold or 0.1)) self:GetOwner():ConCommand("wire_textreceiver_trigger "..(Receiver.Trig or 1)) self:GetOwner():ConCommand("wire_textreceiver_utrigger "..(Receiver.UTrig or 0)) self:GetOwner():ConCommand("wire_textreceiver_secure "..(Receiver.secure or 0)) self:GetOwner():ConCommand("wire_textreceiver_playerout "..(Receiver.playerout or 0)) return true end return false end if (SERVER) then function MakeWireReceiver( pl, Ang, Pos, liness, globall,outputtextt,holdd,triggerr,SELFF,sensitivityy,togglee,utriggerr,parsetextt,secure,playerout) if ( !pl:CheckLimit( "wire_textreceivers" ) ) then return false end local text_receiver = ents.Create( "gmod_wire_textreceiver" ) if (!text_receiver:IsValid()) then return false end text_receiver:SetAngles( Ang ) text_receiver:SetPos( Pos ) text_receiver:SetModel( Model("models/jaanus/wiretool/wiretool_range.mdl") ) text_receiver:Spawn() text_receiver:Setup(liness, globall,outputtextt,holdd,triggerr,SELFF,sensitivityy,togglee,utriggerr,parsetextt,secure,playerout) text_receiver:SetPlayer( pl ) local ttable = { pl = pl, liness = liness, globall = globall, outputtextt = outputtextt, holdd = holdd, triggerr = triggerr, SELFF = SELFF, sensitivityy = sensitivityy, togglee = togglee, utriggerr = utriggerr, parsetextt = parsetextt, } table.Merge(text_receiver:GetTable(), ttable ) pl:AddCount( "wire_textreceivers", text_receiver ) return text_receiver end duplicator.RegisterEntityClass("gmod_wire_textreceiver", MakeWireReceiver, "Ang", "Pos", "liness", "globall","outputtextt","holdd","triggerr","SELFF","sensitivityy","togglee","utriggerr","parsetextt","secure","playerout") end function TOOL:UpdateGhostWireTextReceiver( ent, player ) if ( !ent ) then return end if ( !ent:IsValid() ) then return end local tr = utilx.GetPlayerTrace( player, player:GetCursorAimVector() ) local trace = util.TraceLine( tr ) if (!trace.Hit) then return end if (trace.Entity && trace.Entity:GetClass() == "gmod_wire_textreceiver" || trace.Entity:IsPlayer()) then ent:SetNoDraw( true ) return end local Ang = trace.HitNormal:Angle() Ang.pitch = Ang.pitch + 90 local min = ent:OBBMins() ent:SetPos( trace.HitPos - trace.HitNormal * min.z ) ent:SetAngles( Ang ) ent:SetNoDraw( false ) end function TOOL:Think() if (!self.GhostEntity || !self.GhostEntity:IsValid() || self.GhostEntity:GetModel() != self.Model ) then self:MakeGhostEntity( self.Model, Vector(0,0,0), Angle(0,0,0) ) end self:UpdateGhostWireTextReceiver( self.GhostEntity, self:GetOwner() ) end function TOOL.BuildCPanel(panel) panel:AddControl("Header", { Text = "#Tool_wire_textreceiver_name", Description = "#Tool_wire_textreceiver_desc" }) panel:AddControl("Slider", { Label = "#WiretextreceiverTool_utrigger", Type = "Float", Min = "0", Max = "10", Command = "wire_textreceiver_utrigger" }) panel:AddControl("Slider", { Label = "#WiretextreceiverTool_trigger", Type = "Float", Min = "1", Max = "10", Command = "wire_textreceiver_trigger" }) panel:AddControl("Slider", { Label = "#WiretextreceiverTool_hold", Type = "Float", Min = "0.1", Max = "10", Command = "wire_textreceiver_hold" }) panel:AddControl("TextBox", {Label = "#Tool_wire_textreceiver_parsetext", MaxLength = tostring(2), Command = "wire_textreceiver_parsetext"}) panel:AddControl("CheckBox", { Label = "#WiretextreceiverTool_global", Command = "wire_textreceiver_global" }) panel:AddControl("CheckBox", { Label = "#WiretextreceiverTool_toggle", Command = "wire_textreceiver_toggle" }) panel:AddControl("CheckBox", { Label = "#WiretextreceiverTool_outputtext", Command = "wire_textreceiver_outputtext" }) panel:AddControl("CheckBox", { Label = "#WiretextreceiverTool_SELF", Command = "wire_textreceiver_SELF" }) panel:AddControl("CheckBox", { Label = "Secure Args", Command = "wire_textreceiver_secure" }) panel:AddControl("CheckBox", { Label = "Player Outputs", Command = "wire_textreceiver_playerout" }) panel:AddControl("ComboBox", { Label = "#WiretextreceiverTool_sensitivity", MenuButton = "0", Options = { ["#exact"] = { wire_textreceiver_sensitivity = "1" }, ["#case_insensitive"] = { wire_textreceiver_sensitivity = "2" }, ["#anywhere_exact"] = { wire_textreceiver_sensitivity = "3" }, ["#anywhere_case_insensitive"] = { wire_textreceiver_sensitivity = "4" }, } }) for i = 1,12 do panel:AddControl("TextBox", {Label = "#Tool_wire_textreceiver_text"..i, MaxLength = tostring(MaxTextLength), Command = "wire_textreceiver_text"..i}) end end