-
Posts
6,097 -
Joined
-
Last visited
-
Days Won
218
IIYAMA last won the day on February 20
IIYAMA had the most liked content!
About IIYAMA
- Currently Viewing Forum: Scripting
- Birthday 01/01/2016
Member Title
- Global Moderator
Details
-
Gang
[HB]
-
Location
Netherlands
-
Occupation
I have never been to the streets of SA... so who knows?
-
Interests
Design, scripting, UX/UI
IIYAMA's Achievements
Gangsta (45/54)
1.5k
Reputation
-
I have no experience with C++ myself nor with modules. But I do know that Lua is fast enough for a basic gamemode. The moment C++ might become important is when you want to implement something like pathfinding. There are other things that can save you more resources. For example using less timers. Most of the time getTickCount / getRealTime is more than enough. Or use as less as possible element data. Sort of : https://wiki.multitheftauto.com/wiki/Modules_Introduction
-
For some changes it is a good way to save resource. Like for example statistics or car fuel. But do not do it for critical data. When for example your power shuts down, it could create weir de-syncs. (Like if you were buying a house ingame: you do not receive the house [in buffer] but the money has already been withdrawn [not in buffer]) You can use MySQL + dbConnect, instead of writing a custom module. The current MySQL module available is blocking the CPU thread, so that is not really an option for 200 players in my opinion. Also a way to save resources, is to enable multi_statements: local connection = dbConnect("sqlite", "database/database.db", "", "", "multi_statements=1") When for example if you want to remove data at multiple tables. dbExec(connection, "DELETE FROM shared_memory_file WHERE clientId = ?;DELETE FROM shared_memory_frame WHERE clientId = ?;DELETE FROM shared_memory_frame_position WHERE clientId = ?", clientId, clientId, clientId) Or get data from multiple tables: dbQuery(processRequestSharedMemory, { player, clientId }, connection, [[ SELECT variantKey, item, fileData FROM shared_memory_file WHERE clientId = ?; SELECT x, y, item FROM shared_memory_frame WHERE clientId = ?; SELECT x, y, z FROM shared_memory_frame_position WHERE clientId = ? LIMIT 1 ]], clientId, clientId, clientId)
-
IIYAMA started following [HELP] Technical Question on CEF Browsers , [Question] Server or Client and Help with data management
-
Or use both. Server for: Security/permissions to visit it. Any persisting data Client for: Every element you see ingame Move/animate Camera UI
-
Buffers can be useful. Because you can only pick a server with a good CPU once. Sometimes you can upgrade the CPU, but there is a limit. While with ram, it is easier to upgrade. MTA Lua processes are afaik still is single threaded. But you need to invest a lot of time. I can be. An example db resource I made a while a go, not very efficient storage (text/string based), but easy to use. Not sure why I build the types text based, I would have build it differently now a days. Also recommended to write automatic tests for your creation, like I did with mine in sub folder \dev\*. You can storage md5 hash validation strings for validation, if you are interested in that. Smaller hash storage [binary]: using the UNHEX(hash) function (convert back with HEX(binary). Example resource that uses hash validation for client screenshots. I am not one of them. But I do work often met databases. I have put my recommendation in a spoiler if you are still interested:
-
For a access scoped accounts. Step 1. Make a backup of your acl.xml file. Step 2. Create a new account with for example the name: /register user_XTrqveZgi8 {password} Step 3. Modify the acl.xml. Add a group: Used for defining who has access to what. The prefix user.{username} is used to define that it is a user account that is granted access. <group name="webaccess"> <acl name="webaccess_acl"></acl> <object name="user.user_XTrqveZgi8"></object> </group> And the access list: Used to define the access rights. Replace resource.{resourcename}.http with the resource that is allowed to be accessed to. You can also rename webaccess_acl, but you also have to update the same name in the acl tag located in the group: <acl name="{name}"></acl>) <acl name="webaccess_acl"> <right name="resource.resourcename.http" access="true"></right> </acl> This all will grand the user 'user_XTrqveZgi8' access to http requests to resource {X}. Things to keep in mind: Never use an old ACL, because not yet created -> known accountnames can be recreated by a random player in your server. Always make a backup of your ACL file.
-
Not sure what kind of backend you use. But here is an npm packets that could be used for inspiration. Probably some dependencies are deprecated. https://github.com/4O4/node-mtasa/tree/master The authOptions: https://github.com/4O4/node-mtasa/blob/aeac8ab9417a7b6a65f117491d1e648a6ad62422/src/client.ts#L107C17-L107C28 Using it in request: https://github.com/4O4/node-mtasa/blob/aeac8ab9417a7b6a65f117491d1e648a6ad62422/src/client.ts#L62 But under the hood (in JS) it is something like this: const credentials = `${username}:${password}`; const encodedCredentials = Buffer.from(credentials).toString('base64'); const result = "Authorization: Basic " + encodedCredentials The header is: Authorization The value is something like: Basic bWlqblVzZXI6Z2VoZWltV2FjaHR3b29yZA==
-
It should be for security concerns. You wouldn't want to visit a site that is designed to look for 'new functions' and starts call them. If you take a look at this page: https://wiki.multitheftauto.com/wiki/Meta.xml You can see that it is possible to call an export function over http What syntax do you need for calling an export function? http://<your IP>:<your port>/<resource_name>/call/<exported_function_name> https://wiki.multitheftauto.com/wiki/Resource_Web_Access How does authentication works? https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side A 'basic' authentication should the way to go. It requires login credentials of an MTA user account with the correct permissions. This has to be passed every request. When you connect through the browser: http://127.0.0.1:22005/resourcebrowser/ You more or less understand what to expect. There is also a section about 'Router', which is new. Might be useful. https://wiki.multitheftauto.com/wiki/Resource_Web_Access#Router For inspiration https://community.multitheftauto.com/index.php?p=resources&s=details&id=18781 This resource is about fetching data from MTA to a (remote) host. This is the opposite of what you are trying to achieve, but probably still useful. Fetching from MTA to remote host Creating a MTA user (installation_s.lua) that only has the correct permissions.
-
anti-cheat cheaters canceling onClientPlayerDamage
IIYAMA replied to MineX server's topic in Scripting
Just to verify, does this actually work? Because 'target' is afaik set by the player that fired the weapon and not by the player that got hit. And therefore there are a lot false positives, unless you let remote players decide the damage done to the localPlayer (which is not handy). addEventHandler("onPlayerWeaponFire", root, function(weapon, _, _, _, _, _, target) -
IIYAMA started following When the vehicle stops touching any objects
-
I am working with Cursor. Which is a fork of Visual Studio Code modified with AI in mind. It is my daily driver. The free version should give you enough monthly requests to finish your script. An no this is not a stupid AI, it is a optimised version for coding after all. You can even choose which AI you want to use, but some advanced may be behind a paywall.
-
There is also a baked in option in the map editor (extension). Make sure your editor is up to date and your map contains the latest extension file. For manual upgrades: https://github.com/multitheftauto/mtasa-resources/blob/master/[editor]/editor_main/server/mapEditorScriptingExtension_s.lua https://github.com/multitheftauto/mtasa-resources/blob/master/[editor]/editor_main/client/mapEditorScriptingExtension_c.lua Example map meta.xml with useLODS option enabled:
-
There is also this function : https://wiki.multitheftauto.com/wiki/EnginePreloadWorldArea
-
Might be because the (player/server) network can't catchup. -- (un)subscribe to the vehicle fuel element data of a specific vehicle addEventHandler("onVehicleEnter", getRootElement(), function(thePlayer, seat) if seat~=0 then return end -- Wiki Note: Before using addElementDataSubscriber you need to setup an initial value of element data in "subscribe" mode, otherwise the subscriber will not be added. if not getElementData(source, "plane:fuel") and getVehicleType(source) == "Plane" then setElementData(source, "plane:fuel", 0.18, "subscribe", "deny") end addElementDataSubscriber(source, "plane:fuel", thePlayer) end) addEventHandler("onVehicleExit", getRootElement(), function(thePlayer, seat) if seat~=0 then return end removeElementDataSubscriber(source, "plane:fuel", thePlayer) end) setTimer(function() -- Start with all players instead of all vehicles, because there are often more vehicles than players local players = getElementsByType("player") for i=1, #players do local player = players[i] local vehicle = getPedOccupiedVehicle(player) if vehicle and getVehicleType(vehicle) == "Plane" and getVehicleEngineState(vehicle) then local fuel = getElementData(vehicle, "plane:fuel") or 0.18 if fuel > 0 then -- do not update if fuel is 0 or lower, else you are wasting bandwidth by setting the data to the same value fuel = fuel - fuelUsePerSecond if fuel < 0 then fuel = 0 end setElementData(vehicle, "plane:fuel", fuel, "subscribe", "deny") end end end end, 1000, 0) Please let me know if the addElementDataSubscriber function works as expected, haven't used it myself yet.
-
anti-cheat cheaters canceling onClientPlayerDamage
IIYAMA replied to MineX server's topic in Scripting
You might be able to detect it using: https://wiki.multitheftauto.com/wiki/WasEventCancelled Though I do not know if this functions works correctly for native events. Something you have to test yourself. Make sure to set the addEventHandler to low priority. -
You have to put it at the location where you want to make your trace. If you do not put it inside of another function, it will return "in main chunk", because it is tracing function calls starting from the main chunk. For example: function test1() test2() -- call test2 end function test2() test3() -- call test3 end function test3() test4() -- call test4 end function test4() -- ENDS HERE print(debug.traceback()) end test1() -- STARTS HERE Will return: stack traceback: Main.lua:14: in function 'test4' Main.lua:10: in function 'test3' Main.lua:6: in function 'test2' Main.lua:2: in function 'test1' Main.lua:17: in main chunk [C]: in ? It will show all functions that have been called. And for your current code, it might give you the function(s) where, your onClick got lost.
-
Like this? function createButton(config) local self = setmetatable({}, Button) iprint(debug.traceback()) self.x = config.x self.y = config.y self.width = config.width self.height = config.height self.text = config.text or "Button" self.color = config.color or "blue" self.fade = config.fade ~= false self.onClick = config.onClick or false -- // This always returns false, even if I added onClick function. self.alpha = self.fade and 0 or 255 self.fade_step = 15 self.visible = true self.currentColor = Theme.colors.button[self.color].background table.insert(activeButtons, self) return self end
