Jump to content

IIYAMA

Moderators
  • Posts

    5,973
  • Joined

  • Last visited

  • Days Won

    191

Everything posted by IIYAMA

  1. 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)
  2. 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
  3. IIYAMA

    Help with SQL

    It is intended behaviour, your query is doing something that is not allowed: 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!
  4. Not sure if it is related, but there are missing some .. after the variable user: outputChatBox ( user .. " " .. pass .. " " .. mail, player, 255, 0, 0,) This code is located in Checkplayer.lua or Connect.lua?
  5. 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.
  6. In that case you might want to view those in the debug console and check how they differ. iprint(result[1]["password"], pass)
  7. See this post with a similar issue.
  8. 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.
  9. 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 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
  10. In that case it might be handy if we know at which line + file the error is occurring.
  11. 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
  12. 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))
  13. 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).
  14. IIYAMA

    HELP

    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 )
  15. IIYAMA

    Help ! acl

    @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
  16. 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).
  17. 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
  18. Is the error it still at this line? Or a different line? (note the resource has to be restarted) for i, item in pairs(inv) do
  19. Directly after getting the element data:
  20. There is also this serverside function: https://wiki.multitheftauto.com/wiki/GetPlayerIdleTime Or check when the player is pressing a button: https://wiki.multitheftauto.com/wiki/OnClientKey
  21. How validation works? When data comes from an external source, in this case element-data, there is no way of knowing that it is valid. Therefore checking if the data is OK is essential. For example if the script tries to get the element-data under the key "char:items" before it has an value assigned to it, the script without data validation will most likely end up with an warning or error at a certain point. Are you suggesting that it is not good for you? Well this is more or less the format in which you receive help in this forum section. If I misunderstand you, please let me know.
  22. Always validate your element-data before you are going to do something with it: local inv = getElementData(localPlayer, "char:items"); ----------------------------------------------- assert(type(inv) == "table", "inv must be a table") -- hard error -- or if type(inv) != "table" then -- outputChatBox("OH NO, I need a table to put my head on...") return end If element data is not set, the variable inv does not contain a table, but false instead.
  23. Another way would be manually modify the ACL: <right name="command.theCommand" access="false" /> <right name="command.theCommand" access="true" /> And set restricted to true (this is the syntax for addCommandHandler): bool addCommandHandler ( string commandName, function handlerFunction [, bool restricted = false, bool caseSensitive = true ] ) This will restrict specific commands based on the ACL. The choice depends where you want the restriction/validation being placed. During executing the command or in the function of the script.
  24. IIYAMA

    [HELP]DATABSE

    You might consider using another filename. Also stopping the resource on onResourceStart is a good way for error handling, since this resource is not very useful without a databasse. addEventHandler ( "onResourceStart", resourceRoot, function () vehDB = dbConnect( 'sqlite', 'veiculosdatabase.db' ) if not vehDB then return cancelEvent (true, "Unable to connect to database.") end dbExec( vehDB, ' CREATE TABLE IF NOT EXISTS `VehiclesSystem_Players` (pSerial, vehID, vehName, vehPrice, Subscription) ' ) end, false)
  25. For easy and fast management. For looping speed. (complexer management) Note: you can also go for both. Or you could go for this one: https://wiki.multitheftauto.com/wiki/CreateElement (as parent) https://wiki.multitheftauto.com/wiki/SetElementParent Benefits: No need to clean up after a ped is deleted. Able to get specific streamedin peds at clientside. Attach eventHandlers to all your peds and only those. (Whipe all peds with just one destroyElement call > propagation.)
×
×
  • Create New...