Jump to content

IIYAMA

Moderators
  • Posts

    5,972
  • Joined

  • Last visited

  • Days Won

    191

Everything posted by IIYAMA

  1. IIYAMA

    Help

    Double check if the serverside file is running and init as serverside. Do not enable remote for native events. This is a security risk. Use the predefined client variable for remote triggers, else cheaters can kill a whole server instantly. iprint(triggerClientEvent and "serverside" or "clientside") -- inspect if the file is running serverside addEvent("onPlayerDamage", false) -- disable remote function handlePlayerDamage(attacker, weapon, bodypart, loss) if client ~= source then return end local victim = client triggerEvent("onPlayerDamage", victim, attacker, weapon, bodypart, loss) -- emulate the (client) cancelled onPlayerDamage event if getElementHealth(victim) > 0 then setElementHealth(victim, getElementHealth(victim) - loss) if getElementHealth(victim) <= 0 then setElementData(victim, "isDead", true) killPed(victim) end end end addEvent("onCustomPlayerDamage", true) addEventHandler("onCustomPlayerDamage", root, handlePlayerDamage) function isPlayerDead(player) return getElementData(player, "isDead") or false end function onClientPlayerDamage(attacker, weapon, bodypart, loss) if attacker and getElementType(attacker) == "player" then triggerServerEvent("onCustomPlayerDamage", localPlayer, attacker, weapon, bodypart, loss) cancelEvent() end end addEventHandler("onClientPlayerDamage", root, onClientPlayerDamage)
  2. IIYAMA

    Help

    Technically it is possible, but it will only work as intended when the latency is very low (< 60 ping) and stable internet (no packet loss). How it technically works is that the server is used as mediator for all the damage. When a player it's health is 0, all future damage done by this player is ignored. But keep in mind that this will look very weird when the latency is too high. (unplayable) Some basics: Clientside onClientPlayerDamage cancelEvent triggerServerEvent Serverside addEvent addEventHandler getElementHealth setElementHealth killPed
  3. If the parameter matchingDimension contains the value true, the marker is hit in the same dimension. Instead of setting a timer. Which currently is being created infinity > crashing the server at a given point. Do the following: When giving a jetpack, check if the player is inside of the marker. Based on that, give the Jetpack yes / no. -- Making the marker find able inside of another resource local antiJetpack = createElement ( "antiJetpackType", "antiJetpackID" ) local marker = createMarker ( 0, 0, 0, "cylinder", 1.5, 255, 255, 0, 170 ) setElementParent(marker, antiJetpack) (Other resource) local parent = getElementByID ("antiJetpackID") if not parent then return end local marker = getElementChildren ( parent )[1] local status = isElementWithinMarker ( thePlayer, marker ) https://wiki.multitheftauto.com/wiki/IsElementWithinMarker
  4. Can't you just copy your Program Files (x86)\MTA San Andreas 1.6\server to the server? (maybe I am missing something, but a windows server should be able to start up windows stuff)
  5. Then the code looks fine. Unless the numbers are a mixture of numbers and strings. 123 vs "123" In theory it shouldn't be possible because this function is ran single threaded. There will always be one that is first. The whole function chain-call should have been ended before a new call can be made. The following should be finished before the root function can be called again.
  6. What is inside of data[1] and data[2]? (to be more specific, what type is inside: table, string, number etc.) And what are you clicking on?
  7. For those that have already downloaded the definition files. In the last week, there have been some missing/incorrect types being discovered and fixed. See here the list of changes. Thanks to @srslyyyy for helping me with that!
  8. It can be an issue if you used the config of an older build. You checked the logs as well? (sometimes not all errors are visible in the console) And what kind of server are you running? Windows or linux? If it is Windows, you should be able to copy over your local server and try that one. If Linux, you might consider starting it up with sudo, so that it does not run in to any permission issues while creating/moving the initial files.
  9. Is this server installed with MTA or did you download the stable version separately? Things to check/do: Check your virus scan, maybe some server files have been quarantined. Reset the config, maybe it is missing something: https://github.com/multitheftauto/mtasa-blue/blob/master/Server/mods/deathmatch/mtaserver.conf.template You might consider, just reinstall MTA competently.
  10. A hard function skip maybe, just to figure out if it is actually the models. addDebugHook( "preFunction", function ( ) return "skip" end, {"engineLoadCOL", "engineReplaceCOL", "engineLoadTXD", "engineImportTXD", "engineLoadDFF", "engineReplaceModel"}) (if possible run the hook on a resource with higher download priority) If that is the issue, then rewrite the resources so that the models are loaded slower. For example load a model every X frame(s).
  11. You could start with disabling all models, number 1 in causing cashes.
  12. Is the web panel accessible? (and other resources)
  13. Not sure but, would the > operator not make more sense? if health > loss then --- ... else setElementExtraHealth(source, 0) -- clean dead status (not sure if this is a good idea) end
  14. The first version of the MTA definition files for Lua Language Server are now available. 🥳

     

     

  15. I believe you should first understand the underlying problem. They are not stealing your files. You are sending those files to them. When they host your files, this is where they are using your files without permission. This is where I recommend to solve your problem. They are using your files because they are appealing to be used. If you make them less appealing, for example by adding branding to them, this will become advertisement for your server (in their server).
  16. You could try to use the dxDrawPrimitive3D function to mimic the marker and set postGUI to true, just keep in mind the downsides of postGUI. © MTA wiki
  17. You probably already did the following, but just checking. What happens if you visit those URL's manually? (maybe it is asking for a login authorisation)
  18. You have to index the variable veh one time less. Since the pairs loop did the first index already for you. dxDrawText(veh[1].." | "..veh[2], sx/2-370,sy/2-297,sx/2,sy/2, tocolor(255, 255, 255, 220), 3, "default-bold", "left", "top", false, false, false, true )
  19. Sometimes it really helps when you use the iprint function to print the current table. It shows you the current depth and helps you to decide how to index the next table. When I for example I am working with a secret table. iprint(result) > { ["test"] = { { { [133]="found me!" } } } } The first step is to peel it down. Layer 1 iprint(result["test"]) > { { { [133]="found me!" } } } Layer 2 iprint(result["test"][1]) > { { [133]="found me!" } } Layer 3 iprint(result["test"][1][1]) > { [133]="found me!" } Layer 4 iprint(result["test"][1][1][133]) > "found me!"
  20. It helps if you write every table modification inside of a new function. This way you keep your code more readable. The following examples are re-written code. You could use this as a start, but make sure to test it, because I didn't test it for you. local farm = createFarm(123, 1, 1, 1) local horse = createHorse(player, horseId) local farm = getFarmFromID (123) -- If the farm does exist if farm then addHorseToFarm(horse, farm) end local horseCollection = {} -- all horses local farmCollection = {} -- all farms ---@param player userdata ---@param horseId integer ---@return table function createHorse(player, horseId) local horse = { id = horseId } horseCollection[horseId] = horse return horse end ---@param farmId integer ---@param x number ---@param y number ---@param z number ---@return table function createFarm (farmId, x, y, z) local marker = createMarker(x, y, z) local farm = { marker = marker, id = farmId, location = { x, y, z }, owner = nil, creator = nil, creationTime = getTickCount(), price = 0, horses = {} } farmCollection[farmId] = farm return farm end ---@param farmId integer ---@return table|false function getFarmFromID (farmId) return farmCollection[farmId] or false end ---@param farm table ---@param player userdata ---@return table function setFarmCreator (farm, player) farm.creator = player return farm end ---@param horse table ---@param farm table function addHorseToFarm (horse, farm) table.insert(farm, horse) end ---@param horse table ---@param farm table ---@return boolean function isHorseInFarm(horse, farm) for i=1, #farm do if farm[i] == horse then return true end end return false end ---@param farmId integer ---@return boolean function doesFarmExist(farmId) return farmCollection[farmId] and true or false end
  21. @Wasilij0814 You might want to leave a reply, even if you were not able to solve your issue with my response.
  22. https://dev.mysql.com/doc/mysqld-version-reference/en/keywords-8-0.html groups is a reserved keyword in MySQL: 8.0.2 Change: SELECT * FROM groups to SELECT * FROM `groups` You probably will have to fix the other queries as well.
  23. Lua Language Server - Definition files The Lua language server is a powerful tool that enhances the development experience for Lua programming. It provides a comprehensive set of code editing features, including suggestions, auto-completion, and error checking. With the Lua language server, developers can effortlessly navigate through their resource files, access documentation easily, and ensure code correctness by giving warnings. Why should you care? The language server will inform you about all sorts of problems: type mismatches, missing function arguments, missing variables, etc. You have access to a lot of MTA syntax/autocomplete out of the box. The syntax information will remain while writing. You do not have to restart your resource so often in order to validate if everything is working. Type validation Having value type validation in your code editor is one of the main key features of the Lua Language Server. When working with variables, parameters, and arguments in Lua, you are not restricted to specific value types. This flexibility can make mistakes more likely to happen. However, being able to validate those mistakes instantly saves you a lot of time and frustration. Type annotations for your own functions Adding type annotations to your own functions can help improve validation and catch logic mistakes. It is particularly useful when calling functions from different parts of your code, as the annotations provide clarity on the expected input (arguments) and output (return values). Additionally, comments that are placed above or adjacent to a variable or function are visible when hovering over them in another file or line. This can provide helpful information and context when working with the code. How that looks like: How can I quickly add annotations in less than a second? Open the spoiler: AddEventHandler auto-complete Most MTA addEventHandler functions have full eventName autocompletion. And the attached anonymous function is fully autocompleted and typed as well. Navigation features of Lua Language Server It can be time consuming to find out where a (global) function or variable is located. Being able to jump right to it, saves you a lot of time. Other information which you can find in the readme Installation for the Lua Language Server How to use the definition files? Known issues Make sure to always have an empty new line at the end of your files, as recommended in this issue. Currently, the Lua server language definition files do not have a clear separation between serverside functions/events and clientside functions/events. However, it is possible to enforce this separation for specific functions if needed. outputChatBox--[[@as outputChatBox_server]]("Serverside", player) In certain cases, certain functions in the Lua server language definition files may return multiple types, even if you have selected a different syntax. To handle this situation, you can use the `cast` or `as` notation to explicitly specify the desired type or adjust the returned type. See `Casting and as` syntax below. Casting and as In certain situations, you may have a strong understanding of the type(s) that a variable or expression will have. This is where the keywords "cast" and "as" come into play. These keywords enable you to explicitly specify the intended type, ensuring proper type handling. local varName = exampleFunc() ---@cast varName string local varName = exampleFunc() ---@cast varName string | number local varName = exampleFunc() --[[@as string]] local varName = exampleFunc() --[[@as string | number]] Download The definition files can be downloaded here.
×
×
  • Create New...