-
Posts
6,020 -
Joined
-
Last visited
-
Days Won
203
Everything posted by IIYAMA
-
Thx for preserving the original content!
-
You could use for the markers: local markers = { { -- marker data otherProp = '????', element = '<marker element>' }, { -- marker data otherProp = '????', element = '<marker element>' }, } Loops are not needed if you use the `player` as key. And as for the players and their data: ---@type {[userdata]: {[string]: any}} local playerData = {} --- Give a player their own table/data ---@param player userdata function initPlayerData(player) if playerData[player] then return end playerData[player] = {} -- < sub table end ---@param player userdata ---@param key string ---@param data any function setPlayerData(player, key, data) if not playerData[player] then return end playerData[player][key] = data end ---@param player userdata ---@param key string ---@return unknown|nil function getPlayerData(player, key) if not playerData[player] then return end return playerData[player][key] end Usage example: --- SET setPlayerData(player, "nextMarker", marker) --- GET local marker = getPlayerData(player, "nextMarker")
-
Clientside is basically that. Every client=player runs a copy of the same code on their own pc and the (variable) data is not shared. Going for clientside? As long as you do not mind the following, go for it! Cheater can take advantage of this. (for example being able to win in an instance) It is harder to maintain round management/win/lose etc. Note: Remote players(other players than yourself) can also trigger some events in your copy of the code. So adding checks like this are important: if(hitElement == localPlayer) then Going for serverside? Using tables is an essential for the serverside version of your current code. If you want to create bug free code on serverside, it is one of the things you have to master first. Tables are used to give every player their own piece of data, for example to keep track of the race/checkpoint progress for every player separately. Simple does not always equal better unfortunately. Give serverside a try if you are ready for it, but shouldn't be ignored completely. You are playing a multiplayer game after all.
-
You could try: To remove the blend mode: dxSetBlendMode Not using a custom font
-
Here is a fix for a vulnerability for cheaters to abuse (else cheaters can create accounts for other players): addEvent("onAccountManage", true) addEventHandler("onAccountManage", root, function(typ, username, password, save_log) if source ~= client then return end -- Fix vulnerability The addAccount function returns the new created account, but can fail. Not the end of the world. addAccount(username, password) Are there any errors in this code? I can't find the variable declaration of idTablo, is this one located in another file?
- 7 replies
-
- help
- loginpanel
-
(and 1 more)
Tagged with:
-
We might have more luck with that one.
- 7 replies
-
- help
- loginpanel
-
(and 1 more)
Tagged with:
-
Thx, merged!
- 15 replies
-
- lua
- lua language server
- (and 13 more)
-
Yea true, but everything can be faked, even files. But that does not mean that you can't personalize data based on user specifications mixed with salt/private key. I will lock/close your topic, good luck with your new solution!
-
What is wrong with fileCreate? And transfer the file data with triggerLatentClientEvent.
-
There are a lot of things wrong with this code. I also noticed that the code contains both tabs and spaces, which mean two different users have been messing with this code (80% sure). And on top of that 50% of the code is broken... I have fixed the spaces/tabs for you, and showed you where mistakes are located. But the rest is up to you, especially since I have not clue how this is suppose to be working. function getIDFromPlayer(id) if id then local theid -- Issue: not defined idTablo = getElementsByType("id") -- Issue: Returns a table of elements, the order can vary and the index does not necessary means it's the correct it. for id, p in pairs(idTablo) do if id == p then -- Issue: Comparing integer with an element theid = i -- Issue: `i` not defined -- Issue: loop should have been broken with `break` end end return theid else return false end end function getPlayerFromID(id) if id then id = tonumber(id) -- Issue: tonumber should be before the `if id then` local theplayer -- Issue: Value is nil idTablo = getElementsByType("id") -- Issue: Returns a table of elements, the order can vary and the index does not necessary means it's the correct it. for id, p in pairs(idTablo) do if theID == id then -- Issue: theID is not defined, comparing nil with integer theplayer = p -- Issue: loop should have been broken with `break` end end return theplayer else return false end end addEventHandler("onPlayerLogin", root, function(_, hesap) setElementData(source, "loggedin", true) setElementData(source, "TuningMenuTrue", false) local hesapID = getAccountID(hesap) if idTablo[hesapID] then -- Issue: idTablo might not be defined ozelID = idTablo[hesapID] setElementID(source, ozelID) -- ozelID if from getElementsByType is an element, not an integer/string else setElementID(source, hesapID) end local oyuncu = (string.gsub(getPlayerName(source), "#%x%x%x%x%x%x", "")) local id = getElementID(source) or "-1" -- Variable `oyuncu` and `id` not being used end) addEventHandler("onResourceStart", resourceRoot, function() -- Issue: `id` is not defined if id then id = tonumber(id) -- Issue: tonumber should be before the `if id then` local theplayer -- Issue: Value is nil idTablo = getElementsByType("id") for id, p in ipairs(getElementsByType("player")) do -- Issue: neither variable `id` nor `p` are being used -- Issue: player is not defined. (shouldn't have been variable `p`?) setElementData(player, "loggedin", not isGuestAccount(getPlayerAccount(player))) setElementData(player, "TuningMenuTrue", isGuestAccount(getPlayerAccount(player))) if getPlayerAccount(player) then local hesapID = getAccountID(getPlayerAccount(player)) if idTablo[hesapID] then ozelID = idTablo[hesapID] -- Issue: Should be a local, ozelID is an element, not an id setElementID(player, ozelID) -- ozelID if from getElementsByType is an element, not an integer/string end end end end end)
- 7 replies
-
- help
- loginpanel
-
(and 1 more)
Tagged with:
-
Most likely because of another resource. Use the AddDebugHook function on outputChatBox, to figure out which one. (this function shows you where a MTA function is called or event is triggered)
-
If these are the only lines of code that trigger 'destroyTimers'/'destroyTrepassor', then I don't think you have to check element data on clientside. But if they are not, you could use triggerClientEvent arguments instead. But keep in mind that the clientside handler functions also has to do other things, else it doesn't make sense to have the condition isInResArea in the first place. Server triggerClientEvent ( pla, -- receiver (player) "destroyTrepassor", g_root, -- source true -- < isInResArea ) Clientside addEvent ( "destroyTrepassor", true ) addEventHandler ( "destroyTrepassor", g_loc_root, function (isInResArea) -- ... if isInResArea == true then -- ...
-
I have added the missing file/directory path functions. For the rest of the missing functions events please check: issue
- 15 replies
-
- 1
-
-
- lua
- lua language server
- (and 13 more)
-
This topic is not relevant any more. LOCKED
-
There have been some updates for the new 1.6 functions, but it is still an ongoing process. Feel free to pull for newest version if you want to try out some of the new stuff with it's up to date syntax. Of course for the patches as well. Special thanks to: @srslyyyy @FernandoMTA Known syntax to-do's in the near future: fxCreateParticle (wiki link) Done! by FileEX EngineSet/GetPoolCapacity by TheNormalnij
- 15 replies
-
- 2
-
-
- lua
- lua language server
- (and 13 more)
-
You can bind keys with the following command. You can also use the bind key tab interface for that (main menu). https://wiki.multitheftauto.com/wiki/Client_Commands#bind /bind m down <command> But I have no idea to which command your m key was bound to. Some more context is required.
-
Just some context why your code is not working as intended. You are currently closing the file after running the first command. Do this on onClientResourceStop + resourceRoot. Don't forget to add newlines with \n. After every command run fileFlush, so that the file writes are actually written to the file.
-
No, this will do the opposite. disableac = disable specific detections
-
This is the function: https://wiki.multitheftauto.com/wiki/GetElementBoundingBox (box size only) The function was missing on the Clientside element section, but now it is added.
- 1 reply
-
- 1
-
-
For multiplayer you have to store data for each player. And one of the ways to do that is using tables. Here some basic functions you could use. Init the storage first: initPlayerData (onPlayerJoin) And after that you can set and get data from the table, for each player: getPlayerData, setPlayerData When a player disconnects: deletePlayerData (onPlayerQuit) ---@type {[userdata]: {[string]: unknown}|nil} local playerDataCollection = {} ---@param player userdata ---@param key string ---@return unknown|nil function getPlayerData(player, key) local playerData = playerDataCollection[player] if not playerData then return end return playerData[key] end ---@param player userdata ---@param key string ---@param value any function setPlayerData(player, key, value) local playerData = playerDataCollection[player] if not playerData then return end playerData[key] = value end --- Create a storage table for data of a specific player ---@param player userdata function initPlayerData(player) if playerDataCollection[player] then return end playerDataCollection[player] = {} end --- Remove all player data and remove it's storage table ---@param player userdata function deletePlayerData(player) if not playerDataCollection[player] then return end playerDataCollection[player] = nil end
-
Your initial code looked fine except for a duplicated message when you are in the marker: Stage time: Stage finished! Time: Here you have an alternative version + debug lines so that you can validate what is wrong. View in debug console: /debugscript 3 Also keep in mind that this code will not work very good in multiplayer, as startTime, startMarker and finishMarker are shared between all players. You can ignore the ---@ annotations, those are helping me to automatic validate your code. (and perhaps help you to improve readability) ---------- -- Add to top of script (local's making sure other scripts can't modify these values by accident) ---@type integer local startTime = 0 ---@type userdata|nil local startMarker ---@type userdata|nil local finishMarker --------- -- ... -- --------- ---@param player userdata function checkStageProgress(player) iprint("Validate player", player, isElement(player) and getElementType(player)) if not isElement(startMarker) or not isElement(finishMarker) then iprint("Not startMarker:", isElement(startMarker) and "It exist" or "does not exist", "or not finishMarker:", isElement(finishMarker) and "It exist" or "does not exist") return end if not raceInProgress then iprint("Race is not in progress") local startX, startY, startZ = getElementPosition(startMarker) local playerX, playerY, playerZ = getElementPosition(player) local distanceToStart = getDistanceBetweenPoints2D(startX, startY, playerX, playerY) if distanceToStart <= 3 then raceInProgress = true startTime = getTickCount() -- Start counting time outputChatBox("Stage started!", player) end return end ------------------------- -- Race is in progress -- local elapsedTime = math.floor((getTickCount() - startTime) / 1000) if isElementWithinMarker(player, finishMarker) then outputChatBox("Stage finished! Time: " .. elapsedTime .. " seconds.", player) raceInProgress = false return end ----------------------------- -- Player is not in marker -- outputChatBox("Stage time: " .. elapsedTime .. " seconds.", player) end
-
Visual Studio Code (for everything). While I must say that I definitely love Sublime it's responsiveness, but it was (for me) not enough to change editors.
- 15 replies
-
- lua
- lua language server
- (and 13 more)
-
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)
-
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
-
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