Jump to content

Klesh

Members
  • Posts

    306
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by Klesh

  1. Only replacing the function and running your script can should work? i will test then.

    Edit: I did it, that is what happenning, running with your script and replacing only line 272 dxDrawColoredText:

    killmessage.jpg

  2. Sorry for the double posting, i edited the textlib.lua, making the function dxDrawColorText, replacing line 270, 272 with dxDrawColorText, but the kills are not showing.

    dxText = {} 
    dxText_mt = { __index = dxText }
    local idAssign,idPrefix = 0,"c"
    local g_screenX,g_screenY = guiGetScreenSize()
    local visibleText = {}
    ------
    local defaults = {
        fX                          = 0.5,
        fY                          = 0.5,
        bRelativePosition           = true,
        strText                     = "",
        bVerticalAlign              = "center",
        bHorizontalAlign            = "center",
        tColor                      = {255,255,255,255},
        fScale                      = 1,
        strFont                     = "default",
        strType                     = "normal",
        tAttributes                 = {},
        bPostGUI                    = false,
        bClip                       = false,
        bWordWrap                   = true,
        bVisible                    = true,
        tBoundingBox                = false, --If a bounding box is not set, it will not be used.
        bRelativeBoundingBox        = true,
    }
     
    local validFonts = {
        default                     = true,
        ["default-bold"]            = true,
        clear                       = true,
        arial                       = true,
        pricedown                   = true,
        bankgothic                  = true,
        diploma                     = true,
        beckett                     = true,
    }
     
    local validTypes = {
        normal                      = true,
        shadow                      = true,
        border                      = true,
        stroke                      = true, --Clone of border
    }
     
    local validAlignTypes = {
        center                      = true,
        left                        = true,
        right                       = true,
    }
     
    function dxText:create( text, x, y, relative )
        assert(not self.fX, "attempt to call method 'create' (a nil value)")
        if ( type(text) ~= "string" ) or ( not tonumber(x) ) or ( not tonumber(y) ) then
            outputDebugString ( "dxText:create - Bad argument", 0, 112, 112, 112 )
            return false
        end
        local new = {}
        setmetatable( new, dxText_mt )
        --Add default settings
        for i,v in pairs(defaults) do
            new[i] = v
        end
        idAssign = idAssign + 1
        new.id = idPrefix..idAssign
        new.strText = text or new.strText
        new.fX = x or new.fX
        new.fY = y or new.fY
        if type(relative) == "boolean" then
            new.bRelativePosition = relative
        end
        visibleText[new] = true
        return new
    end
     
    function dxText:text(text)
        if type(text) ~= "string" then return self.strText end
        self.strText = text
        return true
    end
     
    function dxText:position(x,y,relative)
        if not tonumber(x) then return self.fX, self.fY end
        self.fX = x
        self.fY = y
        if type(relative) == "boolean" then
            self.bRelativePosition = relative
        else
            self.bRelativePosition = true
        end
        return true
    end
     
    function dxText:color(r,g,b,a)
        if not tonumber(r) then return unpack(self.tColor) end
        g = g or self.tColor[2]
        b = b or self.tColor[3]
        a = a or self.tColor[4]
        self.tColor = { r,g,b,a }
        return true
    end
     
    function dxText:scale(scale)
        if not tonumber(scale) then return self.fScale end
        self.fScale = scale
        return true
    end
     
    function dxText:visible(bool)
        if type(bool) ~= "boolean" then return self.bVisible end
        self.bVisible = bool
        if bool then
            visibleText[self] = true
        else
            visibleText[self] = nil
        end
        return true
    end
     
    function dxText:destroy()
        self.bDestroyed = true
        setmetatable( self, self )
        return true
    end
     
    function dxText:extent()
        local extent = dxGetTextWidth ( self.strText, self.fScale, self.strFont )
        if self.strType == "stroke" or self.strType == "border" then
            extent = extent + self.tAttributes[1]
        end
        return extent
    end
     
    function dxText:height()
        local height = dxGetFontHeight ( self.fScale, self.strFont )
        if self.strType == "stroke" or self.strType == "border" then
            height = height + self.tAttributes[1]
        end
        return height
    end
     
    function dxText:font(font)
        if not validFonts[font] then return self.strFont end
        self.strFont = font
        return true
    end
     
    function dxText:postGUI(bool)
        if type(bool) ~= "boolean" then return self.bPostGUI end
        self.bPostGUI = bool
        return true
    end
     
    function dxText:clip(bool)
        if type(bool) ~= "boolean" then return self.bClip end
        self.bClip = bool
        return true
    end
     
    function dxText:wordWrap(bool)
        if type(bool) ~= "boolean" then return self.bWordWrap end
        self.bWordWrap = bool
        return true
    end
     
    function dxText:type(type,...)
        if not validTypes[type] then return self.strType, unpack(self.tAttributes) end
        self.strType = type
        self.tAttributes = {...}
        return true
    end
     
    function dxText:align(horzA, vertA)
        if not validAlignTypes[horzA] then return self.bHorizontalAlign, self.bVerticalAlign end
        vertA = vertA or self.bVerticalAlign
        self.bHorizontalAlign, self.bVerticalAlign = horzA, vertA
        return true
    end
     
    function dxText:boundingBox(left,top,right,bottom,relative)
        if left == nil then
            if self.tBoundingBox then
                return unpack(boundingBox)
            else
                return false
            end
        elseif tonumber(left) and tonumber(right) and tonumber(top) and tonumber(bottom) then
            self.tBoundingBox = {left,top,right,bottom}
            if type(relative) == "boolean" then
                self.bRelativeBoundingBox = relative
            else
                self.bRelativeBoundingBox = true
            end
        else
            self.tBoundingBox = false
        end
        return true
    end
     
    addEventHandler ( "onClientRender", getRootElement(),
        function()
            for self,_ in pairs(visibleText) do
                while true do
                    if self.bDestroyed then
                        visibleText[self] = nil
                        break
                    end
                    local l,t,r,b
                    --If we arent using a bounding box
                    if not self.tBoundingBox then
                        --Decide if we use relative or absolute
                        local p_screenX,p_screenY = 1,1
                        if self.bRelativePosition then
                            p_screenX,p_screenY = g_screenX,g_screenY
                        end
                        local fX,fY = (self.fX)*p_screenX,(self.fY)*p_screenY
                        if self.bHorizontalAlign == "left" then
                            l = fX
                            r = fX + g_screenX
                        elseif self.bHorizontalAlign == "right" then
                            l = fX - g_screenX
                            r = fX
                        else
                            l = fX - g_screenX
                            r = fX + g_screenX
                        end
                        if self.bVerticalAlign == "top" then
                            t = fY
                            b = fY + g_screenY
                        elseif self.bVerticalAlign == "bottom" then
                            t = fY - g_screenY
                            b = fY
                        else
                            t = fY - g_screenY
                            b = fY + g_screenY
                        end
                    elseif type(self.tBoundingBox) == "table" then
                        local b_screenX,b_screenY = 1,1
                        if self.bRelativeBoundingBox then
                            b_screenX,b_screenY = g_screenX,g_screenY
                        end
                        l,t,r,b = self.tBoundingBox[1],self.tBoundingBox[2],self.tBoundingBox[3],self.tBoundingBox[4]
                        l = l*b_screenX
                        t = t*b_screenY
                        r = r*b_screenX
                        b = b*b_screenY
                    end
                    local type,att1,att2,att3,att4,att5 = self:type()
                    if type == "border" or type == "stroke" then
                        att2 = att2 or 0
                        att3 = att3 or 0
                        att4 = att4 or 0
                        att5 = att5
  3. Im trying to enable hexadecimal in killmessages resource, but now its no showing, here is the edited code:

    local customKills = {} 
    local config = {
    ["lines"] = 5,
    ["startY"] = 0.35,
    ["textHeight"] = 16,
    ["iconPosOffY"] = -10,
    ["iconHeight"] = 20,
    ["iconSpacing"] = 4,
    ["defaultWeapon"] = 255,
    ["fadeTime"] = 5000,
    ["startFade"] = 15000,
    ["align"] = "right",
    ["startX"] = -10
    }
    local default = {
    ["lines"] = 5,
    ["startY"] = 0.25,
    ["textHeight"] = 16,
    ["iconPosOffY"] = -10,
    ["iconHeight"] = 20,
    ["iconSpacing"] = 4,
    ["defaultWeapon"] = 255,
    ["fadeTime"] = 5000,
    ["startFade"] = 15000,
    ["align"] = "right",
    ["startX"] = -10
    }
    local endTime
    local screenX,screenY = guiGetScreenSize ()
    local contentMessages = {}
    local fadingLines = {}
    ---
    local iconOrder = {}
     
     
    function setupTextOnStart ( resource )
        if resource ~= getThisResource() then return end
        triggerServerEvent ( "onClientKillmessagesLoaded", getLocalPlayer() )
    end
    addEventHandler ( "onClientResourceStart", getRootElement(), setupTextOnStart )
     
    addEvent ("doSetKillMessageStyle",true)
    function setKillMessageStyle ( startX,startY,align,lines,fadeStart,fadeAnimTime )
        if ( not startX ) then startX = default.startX end
        if ( not startY ) then startY = default.startY end
        if ( not align ) then align = default.align end
        if ( not lines ) then lines = default.lines end
        if ( not fadeStart ) then fadeStart = default.startFade end
        if ( not fadeAnimTime ) then fadeAnimTime = default.fadeTime end
        config.startX = startX
        config.startY = startY
        config.align = align
        config.lines = lines
        config.startFade = fadeStart
        config.fadeTime = fadeAnimTime
        if #contentMessages ~= 0 then
            for i=1,config.lines do
                if contentMessages[i] then
                    destroyLine ( i )
                end
            end
        end
        fadingLines = {}
        killMessages = {}
        if ( config.startY < 0 ) then
            config.startY = screenY - math.abs(config.startY*screenY) - (config.iconHeight*config.lines)
            config.startY = config.startY/screenY
        end
        createKillMessageGUI()
        return true
    end
    addEventHandler ( "doSetKillMessageStyle",getRootElement(),setKillMessageStyle)
     
    function createKillMessageGUI()
        local gap = config.iconHeight - config.textHeight
        gap = gap/2
        for i=1,config.lines do
            local y = config.startY*screenY + (config.iconHeight*(i-1))
            y = y + gap
            contentMessages[i] = { dxText:create("",0,y) }
        end
        endTime = config.fadeTime + config.startFade
    end
     
    function shiftUpGUI()
        local i = 1
        for i=config.lines,2,-1 do
            local y = config.startY*screenY + (config.iconHeight*(i-1)) + (config.iconHeight - config.textHeight)/2
            local targetY = config.startY*screenY + (config.iconHeight*(i-2)) + (config.iconHeight - config.textHeight)/2
            for k,part in ipairs(contentMessages[i]) do
                local x,realY = getWidgetPosition(part)
     
                local diffY = realY - y
                setWidgetPosition(part,x,targetY + diffY)
            end
        end 
        for i=1,config.lines-1 do
            ---shift up the alpha too
            local tick = fadingLines[i+1]
            fadingLines[i] = tick
            fadingLines[i+1] = nil
        end 
    end
     
    addEvent ( "doOutputMessage", true )
    function outputMessage ( message, r, g, b, font )
        if type(message) ~= "string" and type(message) ~= "table" then
            outputDebugString ( "outputMessage - Bad 'message' argument", 0, 112, 112, 112 )
            return false
        end
        if type(font) ~= "string" then
            font = "default"
        end
        r = tonumber(r) or 255
        g = tonumber(g) or 255
        b = tonumber(b) or 255
        ---shift everything up
        shiftUpGUI()
        --Delete the first line
        destroyLine (1)
        table.remove ( contentMessages, 1 )
        if type(message) == "string" then
            message = {message}
        end
        local y = config.startY*screenY + (config.iconHeight*(config.lines-1)) + (config.iconHeight - config.textHeight)/2
        local startX = config.startX
        if startX < 1 and startX > -1 then --auto calculate whether its relative or absolute
            startX = screenX/startX --make it relative
        end
        if startX < 0 then
            startX = screenX + startX
        end
       
        for i,part in ipairs(message) do
            if type(part) == "table" and part[1] == "image" then
                if not part.resource and not part.resourceName then
                    part.resource = sourceResource
                end
            end
        end
       
        drawLine ( message, startX, y, config.align, config.lines, r, g, b, font, 1 )
        fadeLine ( config.lines )   
    end
    addEventHandler ( "doOutputMessage", getRootElement(), outputMessage )
     
    function drawLine ( message, x,y, align, line, r, g, b, font, scale )
        --First draw it and work out the width
        local width = 0
        contentMessages[line] = {}
        for i,part in ipairs(message) do
            if type(part) == "string" then
                local text = dxDrawColoredText:create ( part, width, y, false )
                text:font ( font )
                text:scale ( scale )
                text:type("shadow",1)
                text:align"left"
                text:color ( r,g,b )
                table.insert ( contentMessages[line], text )
                width = width + text:extent()
            elseif part[1] == "icon" then
                local iconWidth = part.width or iconWidths[part.id or -1] or iconWidths[255]
                local iconHeight = part.height or config.iconHeight
                local image = dxImage:create ( icons[part.id or 0] or icons[255], width, y + (part.posOffY or config.iconPosOffY), iconWidth, iconHeight, false )
                image:color ( part.r or 255, part.g or 255, part.b or 255 )
                image:rotation ( part.rot or 0, part.rotOffX or 0, part.rotOffY or 0 )
                width = width + iconWidth
                table.insert ( contentMessages[line], image )
            elseif part[1] == "image" then
                if part.width and part.path then
                    if part.resourceName then
                        part.resource = getResourceFromName(tostring(part.resourceName)) or part.resource
                    end
                    local image = dxImage:create ( ":"..getResourceName(part.resource).."/"..part.path, width, y + (part.posOffY or config.iconPosOffY), part.width, part.height or config.iconHeight, false )
                    image:color ( part.r or 255, part.g or 255, part.b or 255 )
                    image:rotation ( part.rot or 0, part.rotOffX or 0, part.rotOffY or 0 )             
                    width = width + part.width
                    table.insert ( contentMessages[line], image )
                end 
            elseif part[1] == "color" or part[1] == "colour" then
                r = part.r or r
                g = part.g or g
                b = part.b or b
            elseif part[1] == "padding" then
                width = width + part.width or 0
            end
            contentMessages[line].scale = scale
        end
        --Now reposition everything properly
        if align == "center" or align == "centre" then
            x = x - width/2
        elseif align == "right" then
            x = x - width
        end
        for i,widget in ipairs(contentMessages[line]) do
            local wx,wy = getWidgetPosition ( widget )
            setWidgetPosition ( widget, x + wx, wy )
        end
        return true
    end
     
    function fadeLine ( line )
        setLineAlpha ( line, 1 )
        fadingLines[line] = getTickCount()
    end
    -----
    addEventHandler ( "onClientRender",getRootElement(),
    function()
        for line,originalTick in pairs(fadingLines) do
            local tickDifference = getTickCount() - originalTick
            if tickDifference > endTime then
                destroyLine ( line )
                setLineAlpha ( line, 1 )
                fadingLines[line] = nil
            elseif tickDifference >  config.startFade then
                local fadeTimeDifference = tickDifference - config.startFade
                --calculate the alpha
                local newAlpha = 1 - fadeTimeDifference/config.fadeTime
                --Set all the alphas
                setLineAlpha ( line, newAlpha )
            end
        end
    end )
     
    function setLineAlpha ( line, alpha )
        for i,part in ipairs(contentMessages[line]) do
            setWidgetAlpha ( part, alpha )
        end
    end
     
    function destroyLine ( line )
        for k,part in ipairs(contentMessages[line]) do
            destroyWidget(part)
        end
        contentMessages[line] = {}
    end
     
    function destroyWidget ( widget )
        if isElement(widget) then
            destroyElement ( widget )
        elseif type(widget) == "table" and widget.destroy then
            widget:destroy()
        end
    end
     
    function getWidgetPosition ( widget )
        if isElement(widget) then
            return guiGetPosition ( widget, false )
        elseif type(widget) == "table" and widget.position then
            return widget:position()
        end
  4. I want to cancel kill, nobody cant kill.

    function playerDamage_text ( attacker, weapon, bodypart, loss ) --when a player is damaged 
    cancelEvent() 
    end 
    addEventHandler ( "onPlayerDamage", getRootElement (), playerDamage_text ) 
    

  5. That data will save the current function you are creating:

    function housePrice (thePlayer) 
    -----Complete your code 
    setElementData(thePlayer, "price.data") 
    end 
    

    I recomendete to you, use database, is stored on the db, more effective, try to start learn if you don't know.

  6. Did you delete the scoreboard resource ? That's the trouble, the resource don't find it, check if you have it, if you renamed, you must put the old name "scoreboard", directory C:\Program Files\MTA San Andreas 1.2\server\mods\deathmatch\resources\[gameplay]

    • Like 1
  7. Hello i want this script to allow hexadecimal colors, it show's grey:

    addEvent ("onClientPlayerKillMessage",true) 
    function onClientPlayerKillMessage ( killer,weapon,wr,wg,wb,kr,kg,kb,width,resource ) 
        if wasEventCancelled() then return end 
        outputKillMessage ( source, wr,wg,wb,killer,kr,kg,kb,weapon,width,resource ) 
    end 
    addEventHandler ("onClientPlayerKillMessage",getRootElement(),onClientPlayerKillMessage) 
      
    function outputKillMessage ( source, wr,wg,wb,killer,kr,kg,kb,weapon,width,resource ) 
        if not iconWidths[weapon] then  
            if type(weapon) ~= "string" then 
                weapon = 999  
            end 
        end 
        local killerName 
        local wastedName 
        if not tonumber(wr) then wr = 255 end 
        if not tonumber(wg) then wg = 255 end 
        if not tonumber(wb) then wb = 255 end 
        if not tonumber(kr) then kr = 255 end 
        if not tonumber(kg) then kg = 255 end 
        if not tonumber(kb) then kb = 255 end 
        if ( source ) then 
            if isElement ( source ) then 
                if getElementType ( source ) == "player" then  
                    wastedName = getPlayerName ( source ) 
                else  
                outputDebugString ( "outputKillMessage - Invalid 'wasted' player specified",0,0,0,100) 
                return false end 
            elseif type(source) == "string" then 
                wastedName = source 
            end 
        else  
            outputDebugString ( "outputKillMessage - Invalid 'wasted' player specified",0,0,0,100) 
        return false end 
        if ( killer ) then 
            if isElement ( killer ) then 
                if getElementType ( killer ) == "player" then 
                    killerName = getPlayerName ( killer ) 
                else  
                    outputDebugString ( "outputKillMessage - Invalid 'killer' player specified",0,0,0,100) 
                return false end 
            elseif type(killer) == "string" then 
                killerName = killer 
            else 
                killerName = "" 
            end 
        else killerName = "" end 
        --create the new text 
        if not killerName then 
          killerName = killerName:gsub("#%x%x%x%x%x%x", "") 
        end 
        return outputMessage ( {killerName, {"padding",width=3}, {"icon",id=weapon}, 
            {"padding",width=3},{"color",r=wr,g=wg,b=wb}, wastedName}, 
            kr,kg,kb ) 
            killerName = killerName:gsub("#%x%x%x%x%x%x", "") 
    end 
    

    edit : New way but the message shows in grey.

  8. Don't double post, so easy like this, try with it, its not needed to call getAccountData,is stored, and when you logged the data is unpack, so with this you know how many cash you have, so simple like that.

    ffunction loginMoney (source) 
    local playerMoney = getPlayerMoney(source) 
    outputChatBox("Your current money is " .. playerMoney.. " $ cash.", source, 255, 0, 0, true) 
    end 
    addEventHandler("onPlayerLogin", getRootElement(), loginMoney) 
      
    function commandMoney(source,commandName) 
    local money = getPlayerMoney(source) 
    outputChatBox("Your current money is " .. money.. " $ cash.", source, 255, 0, 0, true) 
    end 
    addCommandHandler("money", commandMoney) 
    

    Tested.

    Ps: The code show's the current money, the code works when playerJoin, and /money command.

    moneyloginandcommand.png

  9. It cant be, cuz you are joining, are you sure the money is saving on your server? Default server doesn't save money.

    Removed : addCommandHandler("show", loginMoney) totally useless if you want to show when player joins.

  10. Is not more easy using getElementData() ?

    Its more effective than this, you will set the team, put them on it, when player quit and joins again, it returns to the team, i was made that.

  11. If do you want get the Playermoney when player joins try that:

    Easy code

    function loginMoney (thePlayer) 
    if (getPlayerMoney(thePlayer) then  
        outputChatBox("Welcome to my server, your current money is" ..getPlayerMoney(thePlayer)..".",thePlayer, 255, 0, 0, true) 
    end 
        if isGuestAccount then  
            outputChatBox("Sorry you can see how money you have, you must be logged in", thePlayer, 255, 0, 0, true) 
        end 
    end) 
    addEventHandler("onPlayerJoin", getRootElement(), loginMoney) 
      
    

×
×
  • Create New...