Search the Community
Showing results for tags 'shared'.
-
Hi I want to create an easy utility / library resource where I would store functions that is used often but not provided in MTA by default. This resource, called Lib looks like this: Lib/ G_Libs.lua meta.xml libs/ C_dx.lua C_gui.lua C_screen.lua G_element.lua G_math.lua G_table.lua ... the meta.xml for the Lib resource: <meta> <info author="driphunnid" type="utility" name="Libs" /> <download_priority_group>3</download_priority_group> <min_mta_version client="1.6.0" server="1.6.0" /> <!-- <include resource="" /> --> <!-- a config must be an xml file, types: client or server --> <!-- <config src=".xml" type="client" /> <config src=".xml" type="server" /> --> <oop>true</oop> <!-- <settings> <setting name="" value="" /> </settings> --> <!-- <aclrequest> <right name="function.startResource" access="true" /> <right name="function.stopResource" access="true" /> </aclrequest> --> <!-- Shared --> <script src="libs/G_number.lua" type="shared" /> <script src="libs/G_string.lua" type="shared" /> <script src="libs/G_table.lua" type="shared" /> <script src="libs/G_color.lua" type="shared" /> <script src="libs/G_math.lua" type="shared" /> <script src="libs/G_vector.lua" type="shared" /> <script src="libs/G_matrix.lua" type="shared" /> <script src="libs/G_position.lua" type="shared" /> <script src="libs/G_rotation.lua" type="shared" /> <script src="libs/G_material.lua" type="shared" /> <script src="libs/G_bone.lua" type="shared" /> <script src="libs/G_weapon.lua" type="shared" /> <script src="libs/G_world.lua" type="shared" /> <script src="libs/G_element.lua" type="shared" /> <script src="libs/G_vehicle.lua" type="shared" /> <script src="libs/G_cfg.lua" type="shared" /> <!-- Client --> <script src="libs/C_screen.lua" type="client" /> <script src="libs/C_gui.lua" type="client" /> <script src="libs/C_dx.lua" type="client" /> <script src="libs/C_ped.lua" type="client" /> <script src="libs/C_vehicle.lua" type="client" /> <script src="G_Libs.lua" type="shared" /> <export function="load" type="shared" /> </meta> and the G_Libs.lua contains this simple fileReading logic - we return the content of a read file: LIBS_FOLDER = "libs" function load(name, side) -- side = prefix - client, server or shared / global - C, S, G assert(type(name) == "string", "Bad argument @'load' [Expected string at argument 1, got "..type(name).."]") side = type(side) == "string" and side or "G" local libPath = string.format("%s/%s_%s.lua", LIBS_FOLDER, side, name) assert(fileExists(libPath), "Library not found: " .. libPath .. " - you might need to specify a /different/ side (C, S, G).") local file = fileOpen(libPath) local content = fileRead(file, fileGetSize(file)) fileClose(file) return content end For example, content of libs/G_element.lua and C_screen.lua: C_screen.lua: SCREEN_SIZE = Vector2(guiGetScreenSize()) MEDIAN_SCREEN_SIZE = Vector2(1440, 900) function ssX(x) return x / MEDIAN_SCREEN_SIZE.x * SCREEN_SIZE.x end function ssY(y) return y / MEDIAN_SCREEN_SIZE.y * SCREEN_SIZE.y end function isCursorInPosition(x, y, width, height) if (not isCursorShowing()) then return false end local cx, cy = getCursorPosition() local cx, cy = (cx * SCREEN_SIZE.x), (cy * SCREEN_SIZE.y) return ((cx >= x and cx <= x + width) and (cy >= y and cy <= y + height)) end function isCursorInCircle(x, y, r) if (not isCursorShowing()) then return false end local cx, cy = getCursorPosition() local cx, cy = cx*SCREEN_SIZE.x, cy*SCREEN_SIZE.y return (x-cx)^2+(y-cy)^2 <= r^2 end G_element.lua: function isPlayer(element) if not isElement(element) then return false end if not (getElementType(element) == "player") then return false end return true end function isPed(element) if not isElement(element) then return false end if not (getElementType(element) == "ped") then return false end return true end function isCharacter(element) if not isElement(element) then return false end if not (isPed(element) or isPlayer(element)) then return false end if not (element.model == 0) then return false end return true end function isVehicle(element) if not isElement(element) then return false end if not (getElementType(element) == "vehicle") then return false end return true end function isObject(element) if not isElement(element) then return false end if not (getElementType(element) == "object") then return false end return true end function isBuilding(element) if not isElement(element) then return false end if not (getElementType(element) == "building") then return false end return true end When I use loadstring with this concept, it works as far as I use loadstring inside a client side script, other than that, when I try to load a lib using loadstring in a server or global / shared script, I get an Access denied error for "loadstring" and "call". Example - other test resource: C_test.lua (script type in xml is "client") loadstring(exports.Lib:load("element"))() -- loads the G_element.lua file contents from Lib/libs as expected loadstring(exports.Lib:load("screen", "C"))() -- loads the C_screen.lua file contents from Lib/libs as expected however if I change the script type from client to server or shared, I get an error from the test.lua: G_test.lua / S_test.lua (script type in xml is "shared" / "server") loadstring(exports.Lib:load("element"))() -- yields an error on resource start saying Access denied for loadstring and call I tried this setting in the test resource xml file and allowing the request via console for the resource, but same issue, still access denied: <aclrequest> <right name="function.loadstring" access="true" /> <right name="function.call" access="true" /> </aclrequest> Are there any workarounds or fixes for this issue? I really would like to use this concept, I've been coming into so many restriction errors lately, I feel like I can't fully do what I want and have potential for. Why does loadstring not work on shared and server side scripts, or what am I missing? This concept would make editing and using utility functions so much easier, nicer and simpler for me, I don't want to let go of this. Also I am planning to create a framework, a boilerplate "gamemode" engine, where you have so much utility functions and systems to use, that you'll only have to worry about the final gamemode concept you will be creating, this essentially will be a free open source multiplayer gta game engine, and this Lib resource would be a huge part of it. How can I make this work? Thank you for your time!