Roleplay Custom Chatbox

Hi!
I found a custom chatbox , for roleplay, but i cant fix it.
The ooc,yell,whisper etc. doesn’t work.
And it doesn’t show the prints.
Can anybody help me to fix it, because i like that chatbox ?
[lua]// Custom Chatbox
surface.CreateFont( “Tahoma”, 16, 1000, true, false, “DarklandChatBox” )
function FluctuateColor(a)
a = a or 1
return math.abs(math.sin(CurTime()*a))
end
teamchat = false
chaton = false

local realtext = ""  
local chattext = ""  
local maxlines = 10  
local history = {}  
local cursorpos = 0  
 
local COLOR_CHAT = Color( 255, 255, 255, 255 )  
local COLOR_CONSOLE = Color( 217, 0, 25, 255 )  
local COLOR_WHISPER = Color( 101, 202, 36, 255 )  
local COLOR_NOTIFY = Color( 101, 202, 36, 255 )  
local COLOR_HINT = Color( 77, 131, 240, 255 )
local COLOR_PRINT = Color( 127, 127, 127, 255)

function AddHistory( pl, msg, type )

   type = tonumber(type) or 0  
 
   local col = COLOR_CONSOLE  
   if type == 1 then  
       col = COLOR_CHAT  
   elseif type == 2 then  
       col = COLOR_WHISPER  
   elseif type == 3 then  
       col = COLOR_NOTIFY  
   elseif type == 4 then  
       col = COLOR_HINT 
   elseif type == 5 then
	   col = COLOR_PRINT
   end  
       if pl == 0 then pl = nil end  
       if tonumber(pl) == pl  then  
           for k, v in pairs( player.GetAll() ) do  
               if v:UserID() == pl then  
                   pl = v  
                   break  
               end  
           end  
       end  
   if pl and pl:IsPlayer() and pl.UserID then  
           local r,g,b,a = pl:GetColor()  
           local color = Color( r, g, b, 255 )  
           if (    r == 255    and  
               g == 255    and  
               b == 255    and  
               a == 255    ) then  
               color = team.GetColor( pl:Team() )  
           end  
           local chatInfo = {  
               pl = pl,  
               admin = pl:IsAdmin(),  
               name = pl:GetName(),  
               color = color,  
               textcolor = col,  
               msg = msg,  
               type = type or 1,  
               time = RealTime()+10  
           };  
       if type == 6 then  
           print("PM from " .. pl:GetName().." - "..msg)         
       elseif type == 7 then  
           chatInfo = {  
               pl = pl,  
               admin = false,  
               name = "(Advert)",  
               color = Color(46,116,24,255),  
               textcolor = Color(255,255,255,255),  
               msg = msg,  
               type = type or 1,  
               time = RealTime()+10  
           };  
       elseif type == 8 then  
           chatInfo = {  
               pl = pl,  
               admin = false,  
               name = "(Request)",  
               color = Color(66,218,241,255),  
               textcolor = Color(255,255,255,255),  
               msg = msg,  
               type = type or 1,  
               time = RealTime()+10  
          };  
       elseif type == 9 then  
           chatInfo = {  
               pl = pl,  
               admin = false,  
               name = "(Radio)",  
               color = Color(43,117,208,255),  
               textcolor = Color(255,255,255,255),  
               msg = msg,  
               type = type or 1,  
               time = RealTime()+10  
          };  
      elseif type == 10 then  
          chatInfo = {  
              pl = pl,  
              admin = false,  
              name = "(Broadcast)",  
              color = Color(225,96,51,255),  
              textcolor = Color(255,255,255,255),  
              msg = msg,  
             type = type or 1,  
              time = RealTime()+10  
          };  
      elseif type == 11 then  
          chatInfo = {  
              admin = false,  
              color = Color(225,128,0,255),  
              textcolor = Color(255,128,0,255),  
              msg = pl:GetName().." "..msg,  
              type = type or 1,  
              time = RealTime()+10  
          };  
          print(pl:GetName().." "..msg)  
      elseif type == 12 then  
          chatInfo = {  
              pl = pl,  
              admin = false,  
              name = "(Gang)",  
              color = Color(80,80,80,255),  
              textcolor = Color(255,255,255,255),  
              msg = msg,  
              type = type or 1,  
              time = RealTime()+10  
          };  
      elseif type == 13 then  
          chatInfo = {  
              pl = pl,  
              admin = true,  
              name = pl:Name(),  
              color = Color(43,117,208,255),  
              textcolor = Color(120,120,255,255),  
              msg = msg,  
              type = type or 1,  
              time = RealTime()+10  
         };  
      end  
      table.insert(history,1,chatInfo)  
 else  
          local chatInfo = {  
          textcolor = col,  
         msg = msg,  
          type = type or 1,  
          time = RealTime()+10  
      };  
      table.insert(history,1,chatInfo)  
  end  
  history[maxlines+1] = nil  

end

usermessage.Hook("__chatprint",function(um) local msg = um:ReadString() AddHistory(NULL,msg,0) print(msg) end)
function OnPlayerChat( player, msg )
if !IsValid(player) then
AddHistory( nil, msg, 0 )
print(msg)
else
local name = player:Name()
AddHistory( player, msg, 1 )
MsgN(name…": "…msg)
end
return true
end
hook.Add(“OnPlayerChat”,“SeriousChat”,OnPlayerChat)
function TW(s,f)
local w = surface.GetTextSize(s,f)
return w
end
function ChatPaint()

 local x, y = 80, ScrH()-140  
  if ChatOffset then   
      x = ChatOffset.x or x   
      y = ChatOffset.y or y   
  end  
  local num = 0  
  local total = 0  
  for i,v in pairs(history) do  
      if v.time > RealTime() or chaton then  
          if v.pl then  
              local x2 = x  
              /*if v.admin and v.pl:GetNWBool("disguised") == false then  
                  draw.SimpleText("(Admin)","DarklandChatBox",x-4,(y-i*15)+1,Color(0,0,0,255),2)  
                  draw.SimpleText("(Admin)","DarklandChatBox",x-5,(y-i*15),Color(FluctuateColor(2)*255,0,0,255),2)  
              end  */
              draw.SimpleText(v.name,"DarklandChatBox",x+1,(y-i*15)+1,Color(0,0,0,255))  
              draw.SimpleText(v.name,"DarklandChatBox",x,y-i*15,v.color)  
                
              x2 = x2+TW(v.name,"DarklandChatBox")+1  
              draw.SimpleText(": "..v.msg,"DarklandChatBox",x2+1,(y-i*15)+1,Color(0,0,0,255))  
             draw.SimpleText(": "..v.msg,"DarklandChatBox",x2,y-i*15,v.textcolor)  
          else  
              draw.SimpleText(v.msg,"DarklandChatBox",x+1,(y-i*15)+1,Color(0,0,0,255))  
              draw.SimpleText(v.msg,"DarklandChatBox",x,y-i*15,v.textcolor)  
          end  
      end  
 end  

  -- Draw text input  
 if chaton then  

      local prefix = "Say"  
     if string.find(GAMEMODE.Name,"RP") then  
          if string.find( realtext, "//" ) == 1 then  
              prefix = "OOC"  
         elseif string.find( realtext, "/y" ) == 1 then  
              prefix = "Yell"  
          elseif string.find( realtext, "/w" ) == 1 then  
             prefix = "Whisper"  
          elseif teamchat then  
              prefix = "Team"  
          /*elseif string.find( realtext, "/" ) == 1 then  
              prefix = "Cmd"  */
          end  
      end  
      local endstring = prefix..": "..chattext  

      local w, h = surface.GetTextSize( endstring )  

      if prefix ~= "Cmd" then  
          cursorpos = w  
      end  

      draw.RoundedBox( 4, x-5, y+5, w+14, h+1, Color( 0, 0, 0, 200 ) )  

      surface.SetTextColor( 255, 255, 255, 255 )  

      surface.SetTextPos( x+2, y+5 )  
      surface.DrawText( endstring )  

      if ((math.sin(CurTime() * 5) * 10) > 0) then  
          surface.SetTextPos( x+cursorpos+1, y+5 )  
          surface.DrawText( "|" )  
      end  

  end  

end
hook.Add(“HUDPaint”,“DrawChat”,ChatPaint)
function StartChat()
chaton = true
return true
end
hook.Add(“StartChat”,“SeriousStartChat”,StartChat)
function FinishChat()
chaton = false
teamchat = false
chattext = “”
realtext = “”
end
hook.Add(“FinishChat”,“SeriousFinishChat”,FinishChat)
function ChatTextChanged( text )
realtext = text
if string.find( text, “/|” ) ~= 1 then
chattext = text
else
if string.len(text) > 1 then
chattext = string.Right( text, string.len(text) )
chattext = CommandHelp( chattext )
else
chattext = “”
chattext = CommandHelp( chattext )
end
end
end
hook.Add(“ChatTextChanged”,“ChatMoved”,ChatTextChanged)
function CommandHelp( command )
surface.SetFont( “ScoreboardText” )
local prefix = “Cmd: "
local text = command
local sep = string.Explode(” “, text)
local w, h = surface.GetTextSize( prefix…text )
cursorpos = w
if sep[1] == “givemoney” then
if !sep[2] then
sep[2] = “{Amount}”
else
sep[2] = “{”…sep[2]…” }"
w, h = surface.GetTextSize( prefix…text…"{" )
cursorpos = w
end
elseif string.find(sep[1],"") == 1 then
sep[1] = string.sub(sep[1],2)
elseif sep[1] == “” then
sep[1] = “”
elseif sep[1] == “” then
sep[1] = “”
end

  return string.Implode( " ", sep )  

end

function StartTeamChat(ply, bind)
if string.find( bind, “messagemode2” ) then
teamchat = true
end
end
hook.Add(“PlayerBindPress”, “TeamChat”, StartTeamChat ) [/lua]

Errm you are aware thats the Darklands chatbox. So it will only work with there gamemode.

make your own instead of ripping darkland’s from your cache and then we will help

i found it on facepunch.
I tried to make my own, but i couldnt :frowning:
i just need a simple template

This should be in request section because you dont want to do any work

I just want to learn. I f****d my whole day with this.
I dont want that other people do the whole chatbox for me.

Yet your using someone elses chatbox?

Now i use the normal chatbox, because that one doesn’t work.
I dont know how to start a new chatbox, that’s why i tried to find a working custom chatbox.

very constructive comments… you have 2posts and both just flaming? why dont u leave?

Full quide to making a custom chat box in GMod:
A) Learn Lua.
B) Learn Lua.
C) Learn Lua.
D) Make chatbox derma/HUD.
C) Overwrite the chatbox binds.
D) Overwrite chat.AddText.
E) Learn Lua.

Understand?

Also notice how nearly every post here but his has 2XDumb.

I’ve already read:

And Garry’s Mod Wiki.
But i didnt know how to start it.

But thank you for that.Finally someone, who gave me a start.

I have over 2k posts here and 90% of them is flaming people who dont want to learn and want everything done for them, So if you dont like it Why dont you just leave?

July 2010
4 Posts

Orly?

My other accounts were misplaced

Why do you visit the newbie questions section? You don’t even know how to answer any of the questions posted here.

blackops posted a stripped down version of his chatbox earlier. You could find that and use it as a base.

Hm thank you very much :slight_smile:
I try to find it.
I found it. Thanks for the tip!

Ok now i start to work on the chatbox.
It goes well, but when i press Y, the cursor is not in the DTextEntry, so i have to click in. How can i fix it?
[lua]–These two hooks should stop the default chatbox from ever showing up
hook.Add( “StartChat”, “ChatStartChat”, function(t) return true end )
hook.Add( “HUDShouldDraw”, “ChatNoOldChatPlox”, function ( x ) if ( x == “CHudChat” ) then return false end end ) --Disable that fucking shitty chat

function ChatBox() 

--Create your chatbox vgui here  
 
 local x, y = 80, ScrH()-300  

surface.CreateFont (“coolvetica”,17, 700, true, false, “ChatSay”)
local DermaFrame = vgui.Create( “DFrame” )
DermaFrame:SetPos( x-25, y-50 )
DermaFrame:SetSize( 475, 220 )
DermaFrame:SetTitle( “” )
DermaFrame:SetVisible( true )
DermaFrame:SetDraggable( false )
DermaFrame:ShowCloseButton( true )
DermaFrame:MakePopup()
DermaFrame.Paint = function()

		draw.RoundedBox(2, 4, 4, DermaFrame:GetWide()-8, DermaFrame:GetTall() - 8, Color(0, 0, 0, 100))
		end

local TestingPanel = vgui.Create( "DPanel",DermaFrame )

TestingPanel:SetPos( x-25, y-50 )
TestingPanel:SetSize( 475, 200 )
TestingPanel.Paint = function()
surface.SetDrawColor( 1, 1, 1, 100 )
surface.DrawRect( 0, 0, TestingPanel:GetWide(), TestingPanel:GetTall() )

end
local DermaText = vgui.Create( “DTextEntry”,DermaFrame )
DermaText:SetPos( 42,196 )
DermaText:SetTall( 20 )
DermaText:SetWide( 425 )
DermaText:SetEnterAllowed( true )
DermaText.OnEnter = function()
DermaFrame:Remove()
end

local Say= vgui.Create(“DLabel”,DermaFrame)
Say:SetText(“Say :”)
Say:SetPos( 10,200 )
Say:SetFont(“ChatSay”)

end  
 hook.Add( "Initialize", "ChatInitialize")
concommand.Add( "ChatBox",ChatBox )
  
hook.Add("PlayerBindPress", "ChatOverrideChat", function( ply, bind, pressed )  
   if ply == LocalPlayer() then  
       if string.find( bind, "messagemode" ) and pressed then  
             
           local teamchat = string.find( bind, "messagemode2" ) != nil  
             
           --Do some stuff, this hooks into when a player presses their chat key 
		   ply:ConCommand("ChatBox")
             
           return true --Don't run the command  
       end  
   end  

end )

hook.Add( “ChatText”, “ChatChatText”, function( entindex, name, text, msgtype )

   --Useful information that you can use for your chatbox  
   return true --Don't display in default chatbox  

end )

hook.Add( “OnPlayerChat”, “ChatOnPlayerChat”, function( ply, text, teamchat, dead )
–When a player talks you can do stuff

end )

oldChatAddText = chat.AddText – Save a reference to the original function, you could use it later to print to console in color! It’s actually printing to both the original chat and console, but you already disabled the original chat

function chat.AddText( … ) --fix

   for k, v in pairs( {...} ) do  
       --Even override the addtext function to use with your custom chatbox  
   end  

end[/lua]
Another problem for me: how can i write on the messages?
( I know thats a newbie question , but thats why im here in the newbie topic)

That isn’t going to work.
You have no text display, Your going to need to code one. Either use a HUD or a custom DTextEntry or custom DLabel. Either way this is most deffinatly going to be to much work for you. Chatbox prints in multicolor and that means writing a custom draw function. This will then need to be linked into your chat.AddText() function.

Second of all you need to request focus on your Textbox to make the cursor be focused on it when chat box opens.

do something like
[lua]
function updatetext( text )
updatetext = text
end
hook.Add( “ChatTextChanged”, “updatetext”, updatetext );
// then in the derma code do
myText:SetText(updatetext)
[/lua]

Im not 100% sure if the derma will update but that should give you the idea of how to get the text