Jump to content

IIYAMA

Moderators
  • Posts

    6,056
  • Joined

  • Last visited

  • Days Won

    208

Posts posted by IIYAMA

  1. -- Run this one time
    local fuelImage = dxCreateTexture ("fuel.png", "argb", true, "clamp")

     

    And:

    dxDrawImageSection(screenX - ScaleY(289), screenY - ScaleY(19), ScaleY(47), ScaleY(-(123*(fuel/100))), 0, 0, ScaleY(47), ScaleY(-(123*(fuel/100))), fuelImage , 0, 0, 0, tocolor(2,153,0,255), false)

     

  2. 18 hours ago, erisP said:

    I m trying to sort it Will I have any problems if I use it this way? or how can I do it better?

    This is fine.

     

    You could transform it in 1 query. But that basically means that you will have to split them up later with Lua.

    SELECT 
    	name, 
    	'time' AS type, 
    	time, 
    	NULL AS kills 
    FROM general ORDER BY time DESC LIMIT 20
    
    UNION ALL
    
    SELECT 
    	name, 
    	'kills' AS type, 
    	NULL AS time, 
    	kills 
    FROM general ORDER BY kills DESC LIMIT 20

     

     

     

    • Thanks 1
  3. To solve this problem, you have to use debug lines(iprint) to get to the problem.

     

    I fixed here a logic issue, where the player is not removed from the database when he is not ingame.

    function unmutePlayer(serial, punisherName, ruleNumber, ruleDescription)
        local player = getPlayerFromSerial(serial)
        iprint(
            "<unmutePlayer> mutedPlayers[serial]:",
            mutedPlayers[serial],
            ", player:",
            player
        )
        if mutedPlayers[serial] then
            if mutedPlayers[serial].unmuteTimer then
                killTimer(mutedPlayers[serial].unmuteTimer)
            end
    
            mutedPlayers[serial] = nil
            iprint("<unmutePlayer> remove from database")
            executeSQLQuery("DELETE FROM punishments WHERE serial = ?", serial)
    
            if player then
                local playerName = getPlayerName(player)
                setPlayerMuted(player, false)
                outputChatBox("#00FF00" .. playerName .. " has been unmuted by #FFFFFF" .. punisherName .. " #006600[#FFFFFFReason: Manual unmute#006600]", getRootElement(), 255, 255, 255, true)
            end
        elseif player then
            local playerName = getPlayerName(player)
            outputChatBox(playerName .. " is not currently muted.", getRootElement(), 255, 255, 255, true)
        end
    end

     

    And here I added some debug lines, tweaked the select query and removed the loop.

    
    addEventHandler("onPlayerJoin", root, function()
        local player = source
        local playerName = getPlayerName(player)
        local playerSerial = getPlayerSerial(player)
        local query = executeSQLQuery("SELECT * FROM punishments WHERE serial = ? LIMIT 1", playerSerial)
        iprint('<onPlayerJoin> query:', query)
        if query and #query > 0 then
            
    
            local row = query[1]
            local totalDuration = tonumber(row.duration)
            local ruleNumber = row.reason
            local ruleDescription = rulesTable[ruleNumber]
            
            iprint('<onPlayerJoin>', 
                "totalDuration:", totalDuration, 
                ", difference:", (getRealTime().timestamp - row.timestamp), 
                ", remaining:", totalDuration - (getRealTime().timestamp - row.timestamp))
    
            local remainingDuration = totalDuration - (getRealTime().timestamp - row.timestamp)
            if remainingDuration <= 0 then
                executeSQLQuery("DELETE FROM punishments WHERE serial = ?", playerSerial)
            else
                setPlayerMuted(player, true)
                
                mutedPlayers[playerSerial] = { duration = remainingDuration, startTime = row.timestamp }
    
                mutedPlayers[playerSerial].unmuteTimer = setTimer(unmutePlayer, remainingDuration * 1000, 1, playerSerial, "Console", ruleNumber, ruleDescription)
    
                outputChatBox("#FFFFFF".. playerName .. " has been muted by #FFFFFFConsole. Reason: RULE #" .. ruleNumber .. ": " .. ruleDescription .. ". Duration: " .. formatTime(remainingDuration), getRootElement(), 255, 255, 255, true)
            end
        end
    end)

     

  4. 2 hours ago, Snakegold said:

    THIS MESSAGE IS NOT APPEARING IN THE CHATBOX AFTER THE PLAYER RECONNECTS

    Don't use playername, use serial.

     

    And don't pass the player to this function:

    function unmutePlayer(player, punisherName, ruleNumber, ruleDescription)

    Pass over it's serial

    function unmutePlayer(serial, punisherName, ruleNumber, ruleDescription)
    	local player = getPlayerFromSerial ( serial ) -- utility function copy from: https://wiki.multitheftauto.com/wiki/GetPlayerFromSerial
    	if player then -- is the player in the server?
    		-- inform the player that he has been unmuted
    	end

     

     

     

    • Like 1
  5. 21 hours ago, Xwaw said:

    It's the same with the rest, the middle line, when it notices something

     

    Keep it simple:

    local hit = processLineOfSight(pedX, pedY, pedZ + distanceOfStart, lineEndX, lineEndY, pedZ+ distanceOfStart, true, false, false)
    
    local colorSet = hit and 1 or 2
    
    dxDrawLine3D(pedX, pedY, pedZ + distanceOfStart, lineEndX, lineEndY, pedZ+ distanceOfStart, tocolor(color[colorSet][1], color[colorSet][2], color[colorSet][3]), 2)

     

  6. 3 hours ago, Father0625 said:
    triggerClientEvent("raceCevent", thePlayer) 

     

    3 hours ago, Father0625 said:
    addEventHandler("raceCevent", localPlayer, function()

    Normally this combination should be working.

     

    But there is one thing that is incorrect, and that is where the event is triggered.

    Currently it should trigger for all players, but multiplied by the amount of players. Since there is no player target set to where the event is sending to.

    triggerClientEvent("raceCevent", thePlayer) 

     

    My recommendations:

    Serverside

    triggerClientEvent(
      thePlayer, -- send to this player
      "raceCevent", 
      resourceRoot -- source is resourceRoot
    ) 

     

    Clientside

    addEvent("raceCevent", true)
    addEventHandler("raceCevent", 
    resourceRoot, -- activate the event based on the source resourceRoot
    function ()
        
    end, false) -- disable propagate for security reasons

     

    • Thanks 2
  7. 3 hours ago, ewxlyz said:

    can you help me fix this SQ


    It is intended behaviour, your query is doing something that is not allowed:

    Quote

     

    The correct way to solve this (making sure it will always work) is to insert those default values when you insert a new row inside of the database.

    INSERT INTO 
    	accounts (
    		name,
    		email,
    		... etc,
    		usedEmails /* the column */
    	)
    	VALUES (
    		?,
    		?,
    		... etc,
    		'[ [ ] ]' /* the intial value */
    	)

     

    Note: I do not expect that you will be able to fix this in one go. Make sure to make a backup!

  8. 24 minutes ago, Father0625 said:
    outputChatBox ( user" "..pass.." "..mail, player, 255, 0, 0,)

    Not sure if it is related, but there are missing some .. after the variable user:

    outputChatBox ( user .. " " .. pass .. " " .. mail, player, 255, 0, 0,)

     

    24 minutes ago, Father0625 said:

    Server side (the event):

    This code is located in Checkplayer.lua or Connect.lua?

  9. 5 hours ago, Egor_Varaksa said:

    ^[A-Za-z_0-9]+$

    And what if you do:

    ^[A-Za-z_0-9]+$|^$

     

    | = OR

    ^ = START

    $ = END

    ^$ = allows empty string since there is nothing between the START and the END.

  10. 42 minutes ago, Firespider said:

    but the system indicates that the password is not correct and I enter it correctly

    In that case you might want to view those in the debug console and check how they differ.

    iprint(result[1]["password"], pass)

     

  11. 9 hours ago, Firespider said:
    if result[2]["password"] == pass then

    if result[2]["password"] == pass then

    And if you do:

    if result[1]["password"] == pass then

    Since normally you want to get the username and password from the same row.

     

  12. 53 minutes ago, ironimust said:

    but when I want to add a new information object, it gives an error while uploading x, y, z, measure, internal values to the server.

     

    58 minutes ago, ironimust said:

    Why is this code "tonumber" contains a line?

    The tonumber function is used to convert a string to a number. A string is basically text "abcdef12345!@$#%" and a number is 1234567890.

    local thisIsAString = "1234"
    
    print(type(thisIsAString)) -- string
    
    thisIsAString = tonumber(thisIsAString) -- convert a string to number
    
    print(type(thisIsAString)) -- number

     

    Why is it trying to convert a string to a number? Probably just to be sure, since the code will not work if strings are using for example for the position x, y, z

     

    7 hours ago, ironimust said:
    function makeInformationIcon(thePlayer, commandName, ...)

    This function is used to add information icons.

    Please specify errors are shown when using the following command:

    /addii

     

    And mark them in the function with a comment:

    local id = SmallestID() -- for example this line
    Spoiler
    function makeInformationIcon(thePlayer, commandName, ...)
        if exports.integration:isPlayerTrialAdmin(thePlayer) then
        if ... then
            local arg = {...}
            local information = table.concat( arg, " " )
            local x, y, z = getElementPosition(thePlayer)
            --z = z + 0.5 only use for i object
            local rx, ry, rz = getElementRotation(thePlayer)
            local interior = getElementInterior(thePlayer)
            local dimension = getElementDimension(thePlayer)
            local id = SmallestID()
            local createdby = getPlayerName(thePlayer):gsub("_", " ")
            local query = mysql:query_free("INSERT INTO informationicons SET id="..mysql:escape_string(id)..",createdby='"..mysql:escape_string(createdby).."',x='"..mysql:escape_string(x).."', y='"..mysql:escape_string(y).."', z='"..mysql:escape_string(z).."', rx='"..mysql:escape_string(rx).."', ry='"..mysql:escape_string(ry).."', rz='"..mysql:escape_string(rz).."', interior='"..mysql:escape_string(interior).."', dimension='"..mysql:escape_string(dimension).."', information='"..mysql:escape_string(information).."'")
            if query then
                informationicons[id] = createPickup(x, y, z, 3, 1239, 0)--createObject(1239, x, y, z, rx, ry, rz)
                setElementInterior(informationicons[id], interior)
                setElementDimension(informationicons[id], dimension)
                setElementData(informationicons[id], "informationicon:id", id)
                setElementData(informationicons[id], "informationicon:createdby", createdby)
                setElementData(informationicons[id], "informationicon:x", x)
                setElementData(informationicons[id], "informationicon:y", y)
                setElementData(informationicons[id], "informationicon:z", z)
                setElementData(informationicons[id], "informationicon:rx", rx)
                setElementData(informationicons[id], "informationicon:ry", ry)
                setElementData(informationicons[id], "informationicon:rz", rz)
                setElementData(informationicons[id], "informationicon:interior", interior)
                setElementData(informationicons[id], "informationicon:dimension", dimension)
                setElementData(informationicons[id], "informationicon:information", information)
                outputChatBox("Information icon created with ID: "..id, thePlayer, 0, 255, 0)
            else
                outputChatBox("Error creating information icon. Please report on the mantis.", thePlayer, 255, 0, 0)
            end
            else
                outputChatBox("SYNTAX: /addii [Information]", thePlayer, 255, 194, 14)
            end
        end
    end
    addCommandHandler("addii", makeInformationIcon, false, false)
    

     

     

  13. On 08/08/2023 at 18:27, Firespider said:

    Thanks, but I've already created the data, so the problem won't be there. At least I think so

    In that case it might be handy if we know at which line + file the error is occurring.

  14. 6 hours ago, ironimust said:

    info-system command lines;

     

    SELECT 
    	* 
    FROM 
    	`informationicons` AS infoIcons
    WHERE 
    	infoIcons.id IS NULL 
    	OR infoIcons.x IS NULL 
    	OR infoIcons.y IS NULL 
    	OR infoIcons.z IS NULL
    	OR infoIcons.interior IS NULL
    	OR infoIcons.dimension IS NULL

    Does this query gives you any results? (run in mysql interface)

    (note this query does only check for null values)

     

    If this query does not give you results.

    Add a log to the following function, in case of a missing x, y or z, it will log the ID of that database row (and abort the loading process).

    function loadAllInformationIcons()
        local ticks = getTickCount( )
        local counter = 0
        local result = mysql:query("SELECT * FROM `informationicons`")
        while true do
            local row = mysql:fetch_assoc(result)
            if not row then break end
            local id = tonumber(row["id"])
            local createdby = tostring(row["createdby"])
            local x = tonumber(row["x"])
            local y = tonumber(row["y"])   -- bunlar tuhaf
            local z = tonumber(row["z"])
            local rx = tonumber(row["rx"])
            local ry = tonumber(row["ry"])
            local rz = tonumber(row["rz"])
            local interior = tonumber(row["interior"])
            local dimension = tonumber(row["dimension"])
            local information = tostring(row["information"])
        	---------------------------------------------
        	if not x or not y or not z then
          		iprint("Data is corruption starts at ID", id)
          		break
          	end
        	---------------------------------------------
            informationicons[id] = createPickup(x, y, z, 3, 1239, 0)--createObject(1239, x, y, z, rx, ry, rz)
            setElementInterior(informationicons[id], interior)
            setElementDimension(informationicons[id], dimension)
            setElementData(informationicons[id], "informationicon:id", id)
            setElementData(informationicons[id], "informationicon:createdby", createdby)
            setElementData(informationicons[id], "informationicon:x", x)
            setElementData(informationicons[id], "informationicon:y", y)
            setElementData(informationicons[id], "informationicon:z", z)
            setElementData(informationicons[id], "informationicon:rx", rx)
            setElementData(informationicons[id], "informationicon:ry", ry)
            setElementData(informationicons[id], "informationicon:rz", rz)
            setElementData(informationicons[id], "informationicon:interior", interior)
            setElementData(informationicons[id], "informationicon:dimension", dimension)
            setElementData(informationicons[id], "informationicon:information", information)
            counter = counter + 1
        end

    After wards you can look the id up like this (replace ID 1 with the one in the debug logs)

    SELECT 
    	* 
    FROM 
    	`informationicons` AS infoIcons
    WHERE infoIcons.id = 1

     

     

  15. 1 hour ago, Firespider said:

    But for some reason this line of code is not good.

     

    You might want to check if there is actually is data and what the data structure is.

    iprint("Validating variable Data:", inspect(Data)) -- debug in /debugscript 3
    
    if not Data then return LogAlert("EmptyRectangle") end -- something is really wrong
    
    local loginCredentials = Data[1]
    if not loginCredentials then return LogAlert("EmptyRectangle") end -- no loginCredentials
    
    local username = loginCredentials[1] 
    local pass = loginCredentials[2] 
    if (username ~= "" or pass ~= "") then return LogAlert("EmptyRectangle") end -- no user name of password
    
    triggerServerEvent("attemptLogin", resourceRoot, username, hash("sha512", pass))

     

     

  16. On 02/08/2023 at 16:29, Burak5312 said:

    how can i convert pt unit to mta dx scale unit in photoshop?

    The units of png and jpg are always measured in pixels. In Photoshop you can edit your settings to pixels. (Edit > Preferences > Units & Rulers)


    Scaling of images can be optimised by enable mipmap. Mipmaps are smaller copies of the original, making rendering smaller variants faster. Mipmaps will be recreated every time you create a texture with dxCreateTexture (by default mipmaps are enabled, see argument mipmaps).

     

     

    • Thanks 1
  17. 1 hour ago, Sr.black said:

    I want to stop the process of riding any car, whether I am glued 

    You will have to cancel the following event when you are glued. You can for example check if the player is attached to anything and then cancel the event.

    https://wiki.multitheftauto.com/wiki/OnVehicleStartEnter

    addEventHandler ( "onVehicleStartEnter", root, 
    function (player) 
    	if getElementAttachedTo (player) then -- check here if you are glued or not.
    		cancelEvent()
    	end 
    end )

     

    • Thanks 1
  18. @scolen

    You can give this utility function a try (untested). It is important to know that you can only check this information serverside.

    --[[
        Check if the player is inside of an acl group with a specific name
        Argument 1: player element
        Argument 2: aclGroupName string
    ]]
    function isPlayerInAclGroupWithName (player, aclGroupName) 
        -- Check if the player argument is filled in correctly
        if not isElement(player) or getElementType(player) ~= "player" then
            error("Expected player element at argument 1, got " .. inspect(player), 2)
        end
    
        -- Check if the aclGroupName is filled in correctly
        if type(aclGroupName) ~= "string" then
            error("Expected string at argument 2, got " .. inspect(aclGroupName), 2)
        end
    
        -- Get the player account and check if the player is logged in
        local account = getPlayerAccount ( player )
        if isGuestAccount(account) then return false end
    
        -- Get the acl group
        local aclGroup = aclGetGroup ( aclGroupName ) 
        if not aclGroup then return false end
    
        -- Check if the account name of the user is inside of the acl group
        local accountName = getAccountName ( account )
        return isObjectInACLGroup ("user." .. accountName, aclGroup)
    end

    Usage:

    if isPlayerInAclGroupWithName(player, "police") then 
    	outputChatBox("I am the police", player)
    end

     

    • Thanks 1
  19. 2 hours ago, lgeri000 said:

    Probably i dont know something about mysql or JSON

    Please show the JSON, that is the easiest way of checking why the conversion is failing.

     

    Also don't use the following array formatting:

    {
    [1] = {},
    [2] = {}
    }

    Keep it clean, no gaps if possible, if you do have gaps add a false value or an empty table:

    {
    	{},
    	{}
    }

    The conversion between Lua and JSON is rather sensitive if you do not follow the JavaScript Object Notion rules.


    Another golden rule:
    Don't mix keys of different key types, it is either strings or integer each (sub)table. If one of them is a string, all of them become strings. There is no such thing as a table in JavaScript, there is only an default object(key strings) or an array(key integers).

     

    • Like 1
  20. 1 hour ago, Salchy said:

    but what does each of them mean?

    A matrix is a mixture of a position and orientation(rotation). With as main purpose able to calculating offset. For example you want to place a ramp in front of a vehicle, a matix helps you with that.

    But you do NOT need to know how a matrix works, don't waste your time XD.

     

    I prefer to use the Matrix class(without oop), instead of getElementMatrix:

    local x, y, z = getElementPosition(vehicle)
    local xr, yr, zr = getElementRotation(vehicle)
    
    local vehicleMatix = Matrix (Vector3(x, y, z), Vector3(xr, yr, zr)) -- build your matrix with position and rotation
    
    local offset = Vector3(0, 0, 0) -- fill in!
    
    local newPosition = matrix:transformPosition(offset)
    
    iprint(newPosition.x, newPosition.y, newPosition.z)

     

    See docs:

    https://wiki.multitheftauto.com/wiki/Matrix

     

    Utility function:

    function getMatrixFromElement (element)
    	return Matrix (Vector3(getElementPosition(element)), Vector3(getElementRotation(element)))
    end

     

     

     

     

     

     

     

  21.  

    21 hours ago, kukimuki said:

    nono, I just want to know that where I need to write this code? 

    Directly after getting the element data:

    On 12/07/2023 at 16:49, kukimuki said:
    local inv = getElementData(localPlayer, "char:items");
×
×
  • Create New...