Client :  
MoteInfo = {} 
SentMessage = { 
    Button = {} 
} 
MoreInfo = { 
    Button = {} 
} 
Chat = {} 
Message = { 
    Edit = {} 
} 
X = { 
    Button = {} 
} 
Search = { 
    Edit = {} 
} 
Chatting = {} 
PlayerStatus = { 
    Button = {} 
} 
Messages = { 
    Memo = {} 
} 
GUIEditor = { 
    gridlist = {}, 
    label = {} 
} 
  
setElementData(localPlayer, "Chatting", nil) 
setElementData(localPlayer, "Status", "Online") 
local screenW, screenH = guiGetScreenSize() 
Chat.pWindow = guiCreateWindow(screenW - 297 - 10, (screenH - 420) / 2, 297, 420, "# - | Chat system | - #", false) 
guiWindowSetSizable(Chat.pWindow, false) 
guiSetAlpha(Chat.pWindow, 1.00) 
guiSetProperty(Chat.pWindow, "CaptionColour", "FF00F5FE") 
guiSetVisible(Chat.pWindow, false) 
GUIEditor.gridlist[1] = guiCreateGridList(10, 57, 229, 319, false, Chat.pWindow) 
guiGridListSetSelectionMode(GUIEditor.gridlist[1], 0) 
guiSetFont(GUIEditor.gridlist[1], "default-bold-small") 
guiGridListAddColumn(GUIEditor.gridlist[1], "# Player", 0.6) 
guiGridListAddColumn(GUIEditor.gridlist[1], "# Status", 0.3) 
Search.Edit.pWindow = guiCreateEdit(10, 27, 229, 24, "Search", false, Chat.pWindow) 
GUIEditor.label[1] = guiCreateLabel(10, 383, 68, 27, "My status : ", false, Chat.pWindow) 
guiSetFont(GUIEditor.label[1], "default-bold-small") 
guiLabelSetColor(GUIEditor.label[1], 0, 239, 253) 
guiLabelSetVerticalAlign(GUIEditor.label[1], "center") 
PlayerStatus.Button.pWindow = guiCreateButton(88, 383, 151, 27, "# Offline ~", false, Chat.pWindow) 
guiSetFont(PlayerStatus.Button.pWindow, "default-bold-small") 
guiSetProperty(PlayerStatus.Button.pWindow, "NormalTextColour", "FFFC0000") 
X.Button.pWindow = guiCreateButton(257, 383, 30, 27, "X", false, Chat.pWindow) 
guiSetFont(X.Button.pWindow, "default-bold-small") 
guiSetProperty(X.Button.pWindow, "NormalTextColour", "FFFC0000") 
MoreInfo.Button.pWindow = guiCreateButton(257, 27, 30, 27, "؟", false, Chat.pWindow) 
guiSetFont(MoreInfo.Button.pWindow, "default-bold-small") 
guiSetProperty(MoreInfo.Button.pWindow, "NormalTextColour", "FF2FFB00") 
GUIEditor.label[2] = guiCreateLabel(277, 57, 15, 319, "|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|", false, Chat.pWindow) 
guiSetFont(GUIEditor.label[2], "default-bold-small") 
guiLabelSetColor(GUIEditor.label[2], 245, 0, 0) 
guiLabelSetHorizontalAlign(GUIEditor.label[2], "center", false) 
guiLabelSetVerticalAlign(GUIEditor.label[2], "center") 
  
  
MoteInfo.MoreInfoWindow = guiCreateWindow(0.54, 0.07, 0.23, 0.17, "# - | More Info about | - #", true) 
guiWindowSetSizable(MoteInfo.MoreInfoWindow, false) 
guiSetAlpha(MoteInfo.MoreInfoWindow, 1.00) 
guiSetProperty(MoteInfo.MoreInfoWindow, "CaptionColour", "FF13FE1E") 
guiSetVisible(MoteInfo.MoreInfoWindow, false) 
GUIEditor.label[3] = guiCreateLabel(10, 21, 98, 23, "- Player status :  ", false, MoteInfo.MoreInfoWindow) 
guiSetFont(GUIEditor.label[3], "default-bold-small") 
guiLabelSetColor(GUIEditor.label[3], 39, 120, 255) 
guiLabelSetVerticalAlign(GUIEditor.label[3], "center") 
GUIEditor.label[4] = guiCreateLabel(10, 44, 243, 46, "* If you set your status to \"Offline\", \n you can't send any message,\n and everyone can't send you a messages", false, MoteInfo.MoreInfoWindow) 
guiSetFont(GUIEditor.label[4], "default-bold-small") 
X.Button.MoreInfoWindow = guiCreateButton(269, 100, 33, 21, "X", false, MoteInfo.MoreInfoWindow) 
guiSetFont(X.Button.MoreInfoWindow, "default-bold-small") 
guiSetProperty(X.Button.MoreInfoWindow, "NormalTextColour", "FFF50000") 
  
  
Chatting.ChattingWindow = guiCreateWindow((screenW - 566) / 2, (screenH - 370) / 2, 566, 370, "", false) 
guiWindowSetSizable(Chatting.ChattingWindow, false) 
guiSetAlpha(Chatting.ChattingWindow, 1.00) 
guiSetProperty(Chatting.ChattingWindow, "CaptionColour", "FF00E6F5") 
guiSetVisible(Chatting.ChattingWindow, false) 
Messages.Memo.ChattingWindow = guiCreateMemo(9, 24, 547, 304, "", false, Chatting.ChattingWindow) 
guiMemoSetReadOnly(Messages.Memo.ChattingWindow, true) 
Message.Edit.ChattingWindow = guiCreateEdit(10, 332, 399, 28, "", false, Chatting.ChattingWindow) 
SentMessage.Button.ChattingWindow = guiCreateButton(413, 332, 93, 28, "# Send ~", false, Chatting.ChattingWindow) 
guiSetFont(SentMessage.Button.ChattingWindow, "default-bold-small") 
guiSetProperty(SentMessage.Button.ChattingWindow, "NormalTextColour", "FF0BF500") 
X.Button.ChattingWindow = guiCreateButton(522, 332, 34, 28, "X", false, Chatting.ChattingWindow) 
guiSetFont(X.Button.ChattingWindow, "default-bold-small") 
guiSetProperty(X.Button.ChattingWindow, "NormalTextColour", "FFF50000") 
  
function refreshList_() 
guiGridListClear(GUIEditor.gridlist[1]) 
for _, player_ in ipairs(getElementsByType('player')) do 
local itemPlayer = guiGridListAddRow(GUIEditor.gridlist[1]) 
local itemText = guiGridListSetItemText(GUIEditor.gridlist[1], itemPlayer, 1, getPlayerName(player_), false, false) 
local itemStatus = guiGridListSetItemText(GUIEditor.gridlist[1], itemPlayer, 2, getElementData(player_, "Status"), false, false) 
if (getElementData(player_, "Status") == "Online") then 
guiGridListSetItemColor(GUIEditor.gridlist[1], itemPlayer, 2, 0, 255, 0) 
else guiGridListSetItemColor(GUIEditor.gridlist[1], itemPlayer, 2, 255, 0, 0) 
end 
end 
end 
  
addEvent( 'RefreshList', true ) 
addEventHandler( 'RefreshList', root, 
function() 
setTimer(function() 
refreshList_() 
end, 50, 1) 
guiGridListClear(GUIEditor.gridlist[1]) 
for _, player_ in ipairs(getElementsByType('player')) do 
local itemPlayer = guiGridListAddRow(GUIEditor.gridlist[1]) 
local itemText = guiGridListSetItemText(GUIEditor.gridlist[1], itemPlayer, 1, getPlayerName(player_), false, false) 
local itemStatus = guiGridListSetItemText(GUIEditor.gridlist[1], itemPlayer, 2, getElementData(player_, "Status"), false, false) 
if (getElementData(player_, "Status") == "Online") then 
guiGridListSetItemColor(GUIEditor.gridlist[1], itemPlayer, 2, 0, 255, 0) 
else guiGridListSetItemColor(GUIEditor.gridlist[1], itemPlayer, 2, 255, 0, 0) 
end 
end 
end 
) 
  
guiGridListClear(GUIEditor.gridlist[1]) 
for _, player_ in ipairs(getElementsByType('player')) do 
local itemPlayer = guiGridListAddRow(GUIEditor.gridlist[1]) 
local itemText = guiGridListSetItemText(GUIEditor.gridlist[1], itemPlayer, 1, getPlayerName(player_), false, false) 
local itemStatus = guiGridListSetItemText(GUIEditor.gridlist[1], itemPlayer, 2, getElementData(player_, "Status"), false, false) 
if (getElementData(player_, "Status") == "Online") then 
guiGridListSetItemColor(GUIEditor.gridlist[1], itemPlayer, 2, 0, 255, 0) 
else guiGridListSetItemColor(GUIEditor.gridlist[1], itemPlayer, 2, 255, 0, 0) 
end 
end 
  
addEventHandler( 'onClientGUIClick', root, 
function() 
if (source == X.Button.pWindow) then 
guiSetVisible(Chat.pWindow, false) 
guiSetInputEnabled(false) 
showCursor(false) 
elseif (source == X.Button.MoreInfoWindow) then 
guiSetVisible(MoteInfo.MoreInfoWindow, false) 
elseif (source == X.Button.ChattingWindow) then 
guiSetVisible(Chatting.ChattingWindow, false) 
setElementData(localPlayer, "Chatting", nil) 
elseif (source == MoreInfo.Button.pWindow) then 
guiSetVisible(MoteInfo.MoreInfoWindow, true) 
elseif (source == PlayerStatus.Button.pWindow) then 
if (guiGetText(PlayerStatus.Button.pWindow) == "# Offline ~") then 
triggerServerEvent( 'setPlayerStatusOffline', localPlayer ) 
guiSetText(PlayerStatus.Button.pWindow, "# Online ~") 
guiSetProperty(PlayerStatus.Button.pWindow, "NormalTextColour", "FF13FE1E") 
guiSetEnabled(GUIEditor.gridlist[1], false) 
else  
triggerServerEvent( 'setPlayerStatusOnline', localPlayer ) 
guiSetText(PlayerStatus.Button.pWindow, "# Offline ~") 
guiSetProperty(PlayerStatus.Button.pWindow, "NormalTextColour", "FFFC0000") 
guiSetEnabled(GUIEditor.gridlist[1], true) 
end 
elseif (source == SentMessage.Button.ChattingWindow) then 
local getMessage = guiGetText(Message.Edit.ChattingWindow) 
if (getMessage == "") then outputChatBox('* ERROR : #FFFFFF Please write a message !', 255, 0, 0, true) return end 
local playerSelected_ = guiGridListGetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1], 1)) 
guiSetText (Messages.Memo.ChattingWindow, "" ..guiGetText(Messages.Memo.ChattingWindow).. ""..getPlayerName(localPlayer).." : "..guiGetText (Message.Edit.ChattingWindow).."") 
local playerName = getPlayerName(localPlayer) 
local MemoMessages = guiGetText(Messages.Memo.ChattingWindow) 
local getMessage_ = guiGetText(Message.Edit.ChattingWindow) 
local playerSource = getPlayerFromName(playerSelected_) 
triggerServerEvent ( "SentMessageToPlayer", playerSource, MemoMessages, playerName, getMessage_) 
guiSetText(Message.Edit.ChattingWindow, "") 
end 
end 
) 
  
addEvent( 'SentMessageTo', true ) 
addEventHandler( 'SentMessageTo', root, 
function(MemoMessages, playerName, getMessage_ ) 
guiSetText (Messages.Memo.ChattingWindow,"" ..MemoMessages.. "" ..playerName.. " : " ..getMessage_.. "") 
end 
) 
  
addEventHandler( 'onClientGUIDoubleClick', root, 
function() 
if (source == GUIEditor.gridlist[1]) then 
local Selected = guiGridListGetSelectedItem(GUIEditor.gridlist[1]) 
if (Selected == -1) then return end 
local playerSelected = guiGridListGetItemText(GUIEditor.gridlist[1], guiGridListGetSelectedItem(GUIEditor.gridlist[1], 1)) 
local playerStatus = getPlayerFromName(playerSelected) 
if (playerSelected) then 
if (getElementData(playerStatus, "Status") == "Offline") then outputChatBox('* ERROR : #FFFFFF This player is offline !', 255, 0, 0, true) return end 
--if (playerStatus == localPlayer) then outputChatBox('* ERROR : #FFFFFF You can\'t chatting with yourself !', 255, 0, 0, true) return end 
guiSetVisible(Chatting.ChattingWindow, true) 
guiSetText(Chatting.ChattingWindow, playerSelected) 
setElementData(localPlayer, "Chatting", playerSelected) 
end 
end 
end 
) 
  
function openChatpWindow() 
if (guiGetVisible(Chat.pWindow) == false) then 
if (getElementData(localPlayer, "Chatting") ~= nil) then 
guiSetInputEnabled(true) 
guiSetVisible(Chatting.ChattingWindow, true) 
guiSetVisible(Chat.pWindow, true) 
showCursor(true) 
else guiSetVisible(Chat.pWindow, true) showCursor(true) guiSetInputEnabled(true) end 
else 
guiSetInputEnabled(false) 
guiSetVisible(Chat.pWindow, false) 
guiSetVisible(Chatting.ChattingWindow, false) 
showCursor(false) 
end 
end 
bindKey( "F2", "down", openChatpWindow) 
  
 
Server :  
  
addEvent( 'SentMessageToPlayer', true ) 
addEventHandler( 'SentMessageToPlayer', root, 
function(MemoMessages, playerName, getMessage_) 
triggerClientEvent( source, "SentMessageTo", source, MemoMessages, playerName, getMessage_ ) 
end 
) 
  
addEventHandler( 'onPlayerChangeNick', root,  
function() 
triggerClientEvent( 'RefreshList', source ) 
end 
) 
  
addEventHandler( 'onPlayerQuit', root,  
function() 
triggerClientEvent( 'RefreshList', source ) 
end 
) 
  
addEventHandler( 'onPlayerJoin', root, 
function() 
setElementData(source, "Status", "Online") 
triggerClientEvent( 'RefreshList', source ) 
end 
) 
  
  
  
addEvent( 'setPlayerStatusOffline', true ) 
addEventHandler( 'setPlayerStatusOffline', root, 
function() 
setElementData(source, "Status", "Offline") 
triggerClientEvent( 'RefreshList', source ) 
end 
) 
  
  
addEvent( 'setPlayerStatusOnline', true ) 
addEventHandler( 'setPlayerStatusOnline', root, 
function() 
setElementData(source, "Status", "Online") 
triggerClientEvent( 'RefreshList', source ) 
end 
) 
  
 
المشلة أني يوم اجي اراسل احد واجي مرة ثانية اراسل واحد ثاني  
الرسائل اللي بيني وبين الشخص الأول تجي نفسها وكأنه مراسل الأول !! 
أعرف تحتاج جداول لاكن ابي خبرتكم شوي تفيدني لآن الجداول لآحسه مخي