Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --message box
- --online icon16/status_online
- surface.CreateFont("mbox_message",{
- font="Segoe UI",
- size=24,
- weight=500
- })
- --Get Player by Steam ID
- local function GPBSID(sid)
- for k,v in pairs(player.GetAll()) do
- if v:SteamID() == sid then
- return v
- end
- end
- return nil
- end
- local function SendMessage(Address,Message)
- net.Start("SanicMessages")
- net.WriteEntity(LocalPlayer())
- net.WriteEntity(Address)
- net.WriteString(Message)
- net.SendToServer()
- end
- local Chat = {}
- local showed = -1
- net.Receive("SanicMessages",function()
- local Sender = net.ReadEntity()
- local Message = net.ReadString()
- ShowMessage(Sender,Message)
- end)
- function ShowMessage(sender,message)
- showed = showed + 1
- surface.SetFont("mbox_message")
- local tw1,th = surface.GetTextSize(message)
- local tw2 = surface.GetTextSize("New message from "..sender:GetName())
- local tw = tw1
- if tw1 < tw2 then tw = tw2 end
- local de = {}
- de.main = vgui.Create("DPanel")
- de.main:SetAlpha(0)
- de.main:SetSize(tw+20+48,58)
- de.main.Paint = function(self,w,h)
- draw.RoundedBox(0,0,0,w,h,Color(0,0,0,150))
- end
- de.main.avatar = vgui.Create("AvatarImage",de.main)
- de.main.avatar:SetSize(48,48)
- de.main.avatar:SetPos(5,5)
- de.main.avatar:SetPlayer(sender,64)
- de.main.new = vgui.Create("DLabel",de.main)
- de.main.new:SetPos(58,5)
- de.main.new:SetText("New message from "..sender:GetName())
- de.main.new:SetFont("mbox_message")
- de.main.new:SizeToContents()
- de.main.textbox = vgui.Create("DLabel",de.main)
- de.main.textbox:SetPos(58,30)
- de.main.textbox:SetFont("mbox_message")
- de.main.textbox:SetText(message)
- de.main.textbox:SizeToContents()
- de.main:SetPos(10,th+((th*1+37)*showed))
- local y = 0
- timer.Create("ShowMessageSlow"..message..math.random(-999,999),0.001,255/50,function()
- y = y + 50
- de.main:SetAlpha(y)
- end)
- surface.PlaySound("garrysmod/content_downloaded.wav")
- timer.Create("MessageRemove"..message..math.random(-999,999),10,1,function() //because fuck timers with one name
- de.main:Remove()
- showed = showed - 1
- end)
- local wtf = false
- for k,v in pairs(Chat) do
- if v.Player == sender:SteamID() then
- wtf = true
- table.insert(v.History,{Sender = sender:SteamID(),Message = message})
- end
- end
- if wtf == false then
- table.insert(Chat,{Player = sender:SteamID(),History = {{Sender = sender:SteamID(), Message = message,Sended = false}}})
- end
- end
- local function CreateChatWindow()
- local mchat = vgui.Create("DFrame")
- mchat:SetSize(ScrW()/3,ScrH()/2)
- mchat:Center()
- mchat:SetSizable(true)
- mchat:MakePopup()
- mchat.ps = vgui.Create("DPropertySheet",mchat)
- mchat.ps:Dock(FILL)
- for k,v in pairs(Chat) do
- local chatpanel = vgui.Create("DPanel",mchat.ps)
- chatpanel.Player = v.Player
- chatpanel:SetBackgroundColor(Color(255,255,255,0))
- chatpanel.enter = vgui.Create("DTextEntry",chatpanel)
- chatpanel.enter:Dock(BOTTOM)
- chatpanel.enter:DockMargin(0,5,0,0)
- chatpanel.enter.OnKeyCodeTyped = function(self,key)
- if key == KEY_ENTER then
- SendMessage(GPBSID(v.Player),self:GetValue())
- table.insert(Chat[k].History,{Sender = LocalPlayer():SteamID(),Message = self:GetValue(),Sended=true})
- chatpanel.history:Clear()
- for x,y in pairs(v.History) do
- local pnl = vgui.Create("DPanel")
- pnl:Dock(TOP)
- pnl:SetHeight(26)
- pnl.avatar = vgui.Create("AvatarImage",pnl)
- pnl.avatar:SetPlayer(GPBSID(y.Sender),16)
- pnl.avatar:SetSize(16,16)
- pnl.avatar:SetPos(5,5)
- pnl.text = vgui.Create("DLabel",pnl)
- pnl.text:SetPos(26,6)
- pnl.text:SetText(y.Message)
- pnl.text:SizeToContents()
- pnl.text:SetTextColor(Color(0,0,0,255))
- if y.Sended then
- pnl.Paint = function(self,w,h)
- local tw = surface.GetTextSize(y.Message)
- tw = tw + 12.5 + 16
- draw.RoundedBox(5,1,1,tw,26,Color(255,255,255,255))
- end
- else
- pnl.Paint = function(self,w,h)
- local tw = surface.GetTextSize(y.Message)
- tw = tw + 12.5 + 16
- draw.RoundedBox(5,1,1,tw,26,Color(218,227,237,255))
- end
- end
- chatpanel.history:AddItem(pnl)
- end
- end
- end
- chatpanel.history = vgui.Create("DScrollPanel",chatpanel)
- chatpanel.history:Dock(FILL)
- chatpanel.history.LH = v.History
- chatpanel.history.Think = function(self)
- if v.History != self.LH then
- self:Clear()
- for x,y in pairs(v.History) do
- local pnl = vgui.Create("DPanel")
- pnl:Dock(TOP)
- pnl:SetHeight(26)
- pnl.avatar = vgui.Create("AvatarImage",pnl)
- pnl.avatar:SetPlayer(GPBSID(y.Sender),16)
- pnl.avatar:SetSize(16,16)
- pnl.avatar:SetPos(5,5)
- pnl.text = vgui.Create("DLabel",pnl)
- pnl.text:SetPos(26,6)
- pnl.text:SetText(y.Message)
- pnl.text:SizeToContents()
- pnl.text:SetTextColor(Color(0,0,0,255))
- if y.Sended then
- pnl.Paint = function(self,w,h)
- local tw = surface.GetTextSize(y.Message)
- tw = tw + 12.5 + 16
- draw.RoundedBox(5,1,1,tw,26,Color(255,255,255,255))
- end
- else
- pnl.Paint = function(self,w,h)
- local tw = surface.GetTextSize(y.Message)
- tw = tw + 12.5 + 16
- draw.RoundedBox(5,1,1,tw,26,Color(218,227,237,255))
- end
- end
- self:AddItem(pnl)
- self:ScrollToChild(pnl)
- end
- end
- end
- for x,y in pairs(v.History) do
- local pnl = vgui.Create("DPanel")
- pnl:Dock(TOP)
- pnl:SetHeight(26)
- pnl.avatar = vgui.Create("AvatarImage",pnl)
- pnl.avatar:SetPlayer(GPBSID(y.Sender),16)
- pnl.avatar:SetSize(16,16)
- pnl.avatar:SetPos(5,5)
- pnl.text = vgui.Create("DLabel",pnl)
- pnl.text:SetPos(26,6)
- pnl.text:SetText(y.Message)
- pnl.text:SizeToContents()
- pnl.text:SetTextColor(Color(0,0,0,255))
- if y.Sended then
- pnl.Paint = function(self,w,h)
- local tw = surface.GetTextSize(y.Message)
- tw = tw + 12.5 + 16
- draw.RoundedBox(5,1,1,tw,26,Color(255,255,255,255))
- end
- else
- pnl.Paint = function(self,w,h)
- local tw = surface.GetTextSize(y.Message)
- tw = tw + 12.5 + 16
- draw.RoundedBox(5,1,1,tw,26,Color(218,227,237,255))
- end
- end
- chatpanel.history:AddItem(pnl)
- end
- mchat.ps:AddSheet(GPBSID(chatpanel.Player):GetName(),chatpanel,"icon16/status_online.png")
- end
- end
- concommand.Add("sanicchat_open",CreateChatWindow)
- function CreateChat(ply,cmd,args)
- local sid = args[1]..args[2]..args[3]..args[4]..args[5]
- table.insert(Chat,{Player=sid,History={}})
- print("Chat with "..GPBSID(sid):GetName().." ("..sid..") created")
- end
- concommand.Add("sanicchat_create",CreateChat)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement