Jump to content

[HELP ME] Why not working this PM system?


Turbe$Z

Recommended Posts

Posted (edited)
--client

local beszelget = { }
local localPlayer = getLocalPlayer ()
local root = getRootElement ()
local w,h = guiGetScreenSize()
local y = h-35-340
local gomb = guiCreateButton ( w*0.275,h-35, 100, 35, "Privát üzenetek", false )
guiSetAlpha ( gomb, 1 ) 
local options = { colorCode=false, chatbox=true, noti=true, bind=false, bindbutton="" }
local players 
local img_default = { w=30, h=75, x=w*0.275 + 120, y=h}
local img
local speed_default = 0.09
local speed
local hideTimer
local refreshTimer
local lastSearch = ""
local backTimer
local wrongTable = { "mouse1", "mouse2", "mouse3", "mouse4", "mouse5", "mouse_wheel_up", "mouse_wheel_down", "arrow_l", "arrow_u",
 "arrow_r", "arrow_d", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
 "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "num_0", "num_1", "num_2", "num_3", "num_4", "num_5",
 "num_6", "num_7", "num_8", "num_9", "num_mul", "num_add", "num_sep", "num_sub", "num_div", "num_dec", "F1", "F2", "F3", "F4", "F5",
 "F6", "F7", "F8", "F9", "F10", "F11", "F12", "backspace", "tab", "lalt", "ralt", "enter", "space", "pgup", "pgdn", "end", "home",
 "insert", "delete", "lshift", "rshift", "lctrl", "rctrl", "[", "]", "pause", "capslock", "scroll", ";", ",", "-", ".", "/", "#", "\\", "=" }
 local keyTable = {}

function togglePM ( ) 
    if isElement ( ablak ) then
        if guiGetVisible ( ablak ) then
            guiSetVisible ( ablak, false ) 
            guiSetInputEnabled(false)
        else
            guiSetVisible ( ablak, true ) 
        end
    end
end

function loadSettings ()
    for i, v in ipairs ( wrongTable ) do
        keyTable[ v ] = true
    end
    if fileExists ( "settings.xml" ) then
        local file = xmlLoadFile ( "settings.xml" )
        for i, v in ipairs ( xmlNodeGetChildren ( file ) ) do
            if xmlNodeGetValue ( v ) == "true" or xmlNodeGetValue ( v ) == "false" then
                options [ xmlNodeGetName ( v ) ] = loadstring ( "return " .. xmlNodeGetValue ( v ) )()
            else
                options [ xmlNodeGetName ( v ) ] = xmlNodeGetValue ( v )
            end
        end
        if options.bind then
            bindWindowTo ( options.bindbutton )
        end
        xmlUnloadFile ( file )
    end
end

function saveSettings ()
    local file = xmlLoadFile ( "settings.xml" ) or xmlCreateFile ( "settings.xml", "settings" )
    for k, v in pairs ( options ) do
        local child = xmlFindChild ( file, k, 0 ) or xmlCreateChild ( file, k )
        xmlNodeSetValue ( child, tostring(v) )
    end
    xmlSaveFile ( file )
    xmlUnloadFile ( file )
end

function bindWindowTo ( button )
    if keyTable[ button ] then
        guiSetText ( bindedit, button )
        if options.bindbutton and options.bindbutton ~= "" then
            unbindKey ( options.bindbutton, "down", togglePM )
        end
        bindKey ( button, "down", togglePM )
        options.bindbutton = button
    else
        guiSetText ( bindedit, options.bindbutton )
    end
end

function refreshList (  )
    local name = guiGetText ( keres )    
    if name ~= lastSearch then
        lastSearch = name
        for i, v in pairs(players) do
            if string.find(v.name:lower(), tostring(name):lower(), 1, true) then
                v.hide = false
            else 
                v.hide = true
            end
        end
        reCreateNameList ( true )
    end
end
addEventHandler ( "onClientResourceStop", resourceRoot, saveSettings )

function onClick ( )
--outputChatBox ( "a: " .. tostring(guiGetInputEnabled()) )
    if source ~= keres and isTimer ( refreshTimer ) then
        killTimer ( refreshTimer )
        lastSearch = ""
    end
    if source == keres then
        if guiGetText ( keres ) == "Keresés" then guiSetText(keres,"") end
        guiSetInputEnabled ( true )
        if not isTimer ( refreshTimer ) then
            refreshTimer = setTimer ( refreshList, 1000, 0 )
        end
    elseif source == grid then
        local r, c = guiGridListGetSelectedItem(grid)
        if r and r ~= -1 then
            kezoOldal ( false ) 
            local player = guiGridListGetItemData(grid,r,1)
            if beszelget[player] then
                guiSetText(memo,beszelget[player])
                guiMemoSetCaretIndex(memo,string.len(guiGetText(memo))-1)
            end
        end
    elseif source == kuld then
    --outputChatBox ( "b: " .. tostring(guiGetInputEnabled()) )
        local text = guiGetText(msg)
        if text == "" then
            guiSetInputEnabled(false)
        end
        local r, c = guiGridListGetSelectedItem(grid)
        if text and r and text ~= "" and r ~= -1 then
        local player = guiGridListGetItemData(grid,r,1)
           if not beszelget[player] then
                beszelget[player] = players [ localPlayer ].name .. ": "..text
                kijelol(player)
           else
           beszelget[player] = beszelget[player] .."\n".. players [ localPlayer ].name .. ": "..text
            
           end
           local leng = string.len(beszelget[player])
           if leng > 3000 then
            beszelget[player] = string.sub(beszelget[player], leng-3000)
           end
            
           guiSetText(msg,"")

           if string.len(guiGetText ( memo ) ) <= 1 then 
                guiSetText(memo,players [ localPlayer ].name .. ": "..text)
           else
                guiSetText(memo,guiGetText(memo)..players [ localPlayer ].name .. ": "..text)
           end
           if options.chatbox then
            outputChatBox ( "-> " .. players [ player ].name .. ": "..text, 255, 170, 0 )
           end
           guiMemoSetCaretIndex(memo,string.len(guiGetText(memo))-1)
           guiBringToFront(msg)
           guiSetInputEnabled(true)
           triggerServerEvent("uzenet",getLocalPlayer(),player,text) 
 --outputChatBox ( "c: " .. tostring(guiGetInputEnabled()) )          
        end
    elseif source == msg then
        guiSetInputEnabled(true)
    elseif source == color then
        options.colorCode = not guiCheckBoxGetSelected ( color )
        reCreateNameList ()
    elseif source == chatbox then
        options.chatbox = guiCheckBoxGetSelected ( chatbox )
    elseif source == noti then
        options.noti = guiCheckBoxGetSelected ( noti )
    elseif source == bind then
        if guiCheckBoxGetSelected ( bind ) then
            guiSetEnabled ( bindedit, true )
        else
            guiSetText ( bindedit, options.bindbutton or "" )
            guiSetEnabled ( bindedit, false )
        end
        options.bind = guiCheckBoxGetSelected ( bind )
        if options.bind then
            bindWindowTo ( options.bindbutton )
        elseif options.bindbutton and options.bindbutton ~= "" then
            unbindKey ( options.bindbutton, "down", togglePM )
        end
     elseif source == bindedit then
        guiSetInputEnabled ( true )
     elseif source ~= memo then
        kezoOldal ( true )    
    end    
end

function draw ( time )
    if img.y >= h - img.h then
        img.y = img.y - (time * speed )
    end
    dxDrawImage ( img.x, img.y, img.w, img.h, "fl.png" )
end

function startAnim ( state )
if state == nil then state = true end
    if state == true then
        img = img_default
        speed = speed_default
        if isTimer ( hideTimer ) then
            killTimer ( hideTimer )
        elseif isTimer ( backTimer ) then
            killTimer ( backTimer )
        end
        if not drawing then
            addEventHandler ( "onClientPreRender", root, draw )
            drawing = true
        end
        backTimer = setTimer ( startAnim, 5000, 1, "back" )
    elseif state == "back" and drawing then
        speed = -1 * speed
        img.y = img.y + ( h - img.h - img.y )
        hideTimer = setTimer ( startAnim, 2100, 1, false )
    elseif drawing then
        removeEventHandler ( "onClientPreRender", root, draw )
        drawing = false
    end
end

addEvent("uzenet_jott",true)
addEventHandler("uzenet_jott",getRootElement(),
    function(text)
        local r, c = guiGridListGetSelectedItem(grid)
        local player
        if text and r and text ~= "" and r ~= -1 then
            player = guiGridListGetItemData(grid,r,1)
        end
        if player ~= source or not guiGetVisible(ablak) then
            guiSetText(gomb,"Privát üenetek\n ( Új üzenet! )")
        end
        if options.chatbox then
            outputChatBox ( "* PM from " .. players [ source ].name .. ": ".. text, 255, 100, 100 )
        end
        if options.noti and not guiGetVisible ( ablak ) then
            startAnim ()
        end
        text = "> ".. players [ source ].name .. ": "..text
        if not beszelget[source] then
            beszelget[source] = text
           kivesz(source)
           local row = guiGridListInsertRowAfter(grid,-1)
           guiGridListSetItemText(grid,row,column,players [ source ].name,false,false)
           guiGridListSetItemColor(grid,0,1,10,200,255)
           guiGridListSetItemData ( grid, row, 1, source )
        else
           beszelget[source] = beszelget[source] .."\n".. text
        end

        if player == source then
            guiSetText(memo,guiGetText(memo)..text) 
            guiMemoSetCaretIndex(memo,string.len(guiGetText(memo))-1)    
        end
        if guiGetVisible ( msg ) then
            guiSetInputEnabled(true)
        end        
    end)


function onClick_gomb ( )
    guiSetText(gomb,"Privát üzenetek")
    startAnim ( false )
    togglePM ( )
end  

  addEventHandler ( "onClientGUIClick", gomb, onClick_gomb)
  
  addEventHandler("onClientPlayerJoin",getRootElement(),
    function(arg)
        if grid and isElement(grid) then
        local row = guiGridListInsertRowAfter ( grid, guiGridListGetRowCount ( grid ) )
            guiGridListSetItemData ( grid, row, 1, source )
            players[ source ] = { name=options.colorCode and getPlayerName(source) or string.gsub(getPlayerName ( source ), '#%x%x%x%x%x%x', ''), blue=false }
            guiGridListSetItemText(grid,row,column,players [ source ].name, false,false)
        end
    end)

    addEventHandler( "onClientPlayerQuit", getRootElement(), 
    function()
        kivesz(source)
        players[ source ] = nil 
    end)

    addEventHandler ( "onClientPlayerChangeNick", getRootElement(),
    function ( regi, uj)
            if grid and isElement(grid) then
            -- outputChatBox("nev")
        for i = 0, guiGridListGetRowCount(grid) do
            if guiGridListGetItemData(grid,i,1) == source then
                players[ source ].name = options.colorCode and getPlayerName(source) or string.gsub(getPlayerName ( source ), '#%x%x%x%x%x%x', '')
                guiGridListSetItemText(grid,i,1, players[ source ].name,false,false)
            end
        end  
    end
end
)

function kivesz(player)
    if grid and isElement(grid) then
        for i = 0, guiGridListGetRowCount(grid) do
            if guiGridListGetItemData(grid,i,1) == player then
                guiGridListRemoveRow(grid,i,1)
                break
            end
        end     
    end
end
    
function kijelol(player)
    if grid and isElement(grid) then
        players[ player ].blue = true
        kivesz ( player )
        local row = guiGridListInsertRowAfter ( grid, -1, 1 )
        guiGridListSetItemText(grid,row,1,players[ player ].name,false,false) 
        guiGridListSetItemColor(grid,row,1,10,200,255)   
        guiGridListSetItemData ( grid, row, 1, player )
        guiGridListSetSelectedItem ( grid, row, 1 )
        --triggerEvent("onClientGUIClick",grid)
    end
end

function reCreateNameList ( noRescan )
    guiGridListClear ( grid )
        if not noRescan or not players then
            players = {}
            lastSearch = ""
            for i, v in ipairs(getElementsByType("player")) do
                --if v ~= localPlayer then
                players[ v ] = { name=options.colorCode and getPlayerName ( v ) or string.gsub(getPlayerName ( v ), '#%x%x%x%x%x%x', ''), blue=beszelget[v] and true or false } 
                --end
            end
        end
    for k, v in pairs ( players ) do
        if not v.hide then
            if not v.blue then
                local row = guiGridListAddRow(grid)
                guiGridListSetItemText ( grid, row, column, v.name, false, false)
                guiGridListSetItemData ( grid, row, column, k )
            else
                local row = guiGridListInsertRowAfter(grid, 0)
                guiGridListSetItemText ( grid, row, column, v.name, false, false)
                guiGridListSetItemColor(grid,row,column,10,200,255)
                guiGridListSetItemData ( grid, row, column, k )
            end
        end
    end 
end

function kezoOldal ( state )
    if state then
        guiSetText ( memo, "Légy üdvözölve kedves Játékos!\n\nVálassz egy nevet oldalról a listából akivel beszélgetni szeretnél, és írj neki!\nHa úgy szeretnél a rendes chat-be írni, hogy közben ez az ablak is nyitva van, nyomj úgy entert vagy kattints a Küldés gombra, hogy nincs beí­rva üzenet. Ezután írhatsz (t-vel általában...) a chatbox-ba, majd ide visszakattintva újra ide." )
        guiSetSize ( memo, 0.75, 0.40, true )
        guiSetInputEnabled ( false )
    else
        guiSetSize ( memo, 0.75, 0.7324, true )
        guiSetText ( memo, "" )
    end
        guiSetVisible ( color, state )
        guiSetVisible ( chatbox, state )
        guiSetVisible ( noti, state )
        guiSetVisible ( bind, state )
        guiSetVisible ( bindedit, state )
        guiSetVisible ( kuld, not state )
        guiSetVisible ( msg, not state )
        guiSetVisible ( help, state)
end

function init()
    ablak = guiCreateWindow (  w*0.275, y, 550, 340, "PM ablak", false ) 
    guiSetVisible(ablak,false)
    guiWindowSetMovable( ablak, false )
    guiWindowSetSizable( ablak, false )
    grid = guiCreateGridList (  0.017, 0.0706, 0.1989, 0.8265, true, ablak ) 
    guiGridListSetSortingEnabled(grid,false)
    guiGridListSetSelectionMode ( grid, 2 ) 
    bindedit = guiCreateEdit(128, 296, 130, 23, options.bindbutton, false, ablak)
    guiEditSetMaxLength ( bindedit, 16 )
    loadSettings ()
    column = guiGridListAddColumn ( grid, "Játékosok", 1.2 ) 

    reCreateNameList ( )

    keres = guiCreateEdit ( 0.017, 0.9176, 0.1989, 0.0559, "Keresés", true, ablak ) 
    --guiSetEnabled(keres, false)
    help = guiCreateLabel ( 0.2348, 0.0765, 0.7311, 0.0706, "Válassz egy játékost, akivel beszélgetni szeretnél. Akivel már van megkezdett beszélgetésed, azt a lista elején, kék szí­nnel kiemelve találod.", true, ablak ) 
    guiLabelSetHorizontalAlign ( help, "left", true ) 
    guiSetFont ( help, "default-small" ) 
    memo = guiCreateMemo(0.23, 0.16, 0.75, 0.40, "Légy üdvözölve kedves Játékos!\n\nVálassz egy nevet oldalról a listából akivel beszélgetni szeretnél, és írj neki!\nHa úgy szeretnél a rendes chat-be írni, hogy közben ez az ablak is nyitva van, nyomj úgy entert vagy kattints a Küldés gombra, hogy nincs beí­rva üzenet. Ezután írhatsz (t-vel általában...) a chatbox-ba, majd ide visszakattintva újra ide.", true, ablak)
    guiMemoSetReadOnly ( memo, true )
    color = guiCreateCheckBox(0.23, 0.59, 0.69, 0.04, "Színkodok elrejtése a nevekben (Hide color codes in names)", true, true, ablak)
    guiCheckBoxSetSelected ( color, not options.colorCode )
    chatbox = guiCreateCheckBox(0.23, 0.66, 0.69, 0.04, "Üzenet kiírása a chatboxba (Output messages to the chatbox)", true, true, ablak)
    guiCheckBoxSetSelected ( chatbox,options.chatbox )
    noti = guiCreateCheckBox(0.23, 0.74, 0.68, 0.04, "Feltűnőbb üzenetjelző használata (More visible notification)", true, true, ablak)
    guiCheckBoxSetSelected ( noti, options.noti )
    bind = guiCreateCheckBox(0.23, 0.81, 0.71, 0.04, "Ablak megnyitása a következő gombbal (Bind opening this window)", true, true, ablak)
    guiCheckBoxSetSelected ( bind, options.bind )
    help = guiCreateLabel ( 260, 300, 270, 25, "Nyomj entert a mentéshez (Press enter to save)", false, ablak )
    guiSetEnabled ( bindedit, options.bind )
    msg = guiCreateEdit ( 0.2292, 0.9147, 0.6364, 0.0588, "", true, ablak ) 
    guiEditSetMaxLength ( msg, 128 )
    kuld = guiCreateButton ( 0.8693, 0.9059, 0.1136, 0.0676, "Küldés", true, ablak ) 
    kezoOldal ( true )
    addEventHandler( "onClientGUIAccepted", root,
        function( theElement )
            if theElement == msg then
            --guiSetInputEnabled ( false )
                guiBringToFront ( msg )
                triggerEvent("onClientGUIClick",kuld)
            elseif theElement == bindedit then
                local text = guiGetText ( bindedit )
                if text then
                    guiSetInputEnabled ( false )
                    guiMoveToBack ( bindedit )
                    bindWindowTo ( text )
                end
            end
        end )
     addEventHandler ( "onClientGUIClick", ablak, onClick, true)
end 
    
addEventHandler("onClientResourceStart",getResourceRootElement(),init)

addCommandHandler ( "pm", togglePM )

--server

addEvent("uzenet", true)
addEventHandler("uzenet", getRootElement(), 
	function(toplayer, text)
		triggerClientEvent(toplayer, "uzenet_jott", source, source, text)
	end
)

 

What wrong? :|

client.lua:228: attempt to concatenate local 'text' a userdata value

 

Edited by jhxp
Merged posts, added [code] tags
Posted

i really dont understand how your code works so you might wanna wait till someone with the knowledge helps ya, but also, you posted this in the wrong category, it belongs into "Scripting", not resources.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...