-
Posts
4,121 -
Joined
-
Last visited
-
Days Won
2
Everything posted by Kenix
-
https://community.multitheftauto.com/index.php?p=resources&s=details&id=57
-
При вызове рендера у вас происходит вызов функции глобальной. Чтобы это оптимизировать вы объявляете функцию локальной. Т.е чтобы добиться максимального эффекта вы можете сделать в одном ресурсе (в одном скрипте) следующее: local tocolor = tocolor; local dxDrawText = dxDrawText; local function dxDrawFramedText ( message , left , top , width , height , color , scale , font , alignX , alignY , clip , wordBreak , postGUI ) dxDrawText ( message , left + 1 , top + 1 , width + 1 , height + 1 , tocolor ( 0 , 0 , 0 , 255 ) , scale , font , alignX , alignY , clip , wordBreak , postGUI ) dxDrawText ( message , left , top , width , height , color , scale , font , alignX , alignY , clip , wordBreak , postGUI ) end addEventHandler( "onClientRender", root, function() -- Тут вызываете dxDrawFramedText end ); Также вы можете добавить условия, например по дистанции игрока от вас, если слишком далеко то соотвественно вызов функции у вас не будет и вы сэкономите FPS. В плане производительности - да. В плане написания больших проектов - нет, вам нужно будет так или иначе разделять логику по скриптам для удобства. UPD: То что я показал это самый быстрый вариант, далее по убыванию более худшие это: - Вызов глобальной функции (которая находится в другом скрипте, в том же ресурсе). - Использование OOP - метатаблиц. В Lua оно не особо быстрое, особенно в циклах. - Вызов функции, которая в другом ресурсе. Через call/exports[ "resourse" ]:Функция( аргументы ); Тоже занимает какое-то время. - Также занимает время вызов из Lua функции C++ (что мта и делает), но тут вы уже ничего не сделаете, даже попытка разработчиков MTA внедртить LuaJIT не имеет смысла. Такие хаки следует использовать на критичных по производительности местах (рендер и большие циклы). В обычном случае такого делать не стоит, вы только усложните все. Вроде ответил очень подробно, но если у вас есть вопросы то пишите.
-
На Wiki функции centerWindow есть пример. addEventHandler( "onClientResourceStart", resourceRoot, function() myWindow = guiCreateWindow( 350, 100, 200, 250, "Window Title", false ) end ) addCommandHandler( "center", function() if myWindow then centerWindow( myWindow ) end end ) При старте ресурса появится окно. Как только вы напишите команду /center окно будет отцентрировано под ваше разрешение экрана. Не забудьте функцию centerWindow скопировать и вставить в код.
-
1. MTA должна идти по идее на всех разрешениях. Если у вас не пошло на весь экран, то нужно создать отчет на баг трекере и приложить всю информацию. https://bugs.multitheftauto.com/ 2. В МТА используется абсолютные размеры интерфейсов (px) или относительные размеры (в % от экрана). В большинстве случаев используют абсолютные значения. Я в проектах использовал позиционирование вот так: Если это диалоговое окно на весь экран. https://wiki.multitheftauto.com/wiki/CenterWindow Если это HUD элемент то от ширины/высоты окна вычитал/прибавлял px размера интерфейса.
-
+ Определить все функции локальными переменными.
-
Intro Gamemode based on Battlefied 3/4. Fully rewrited if you ever played before. About the server Teams: - USA - RUS Classes: - Assault - Support - Engineer - Recon Modes: 2 different modes. CP - Capture Point Assault - Destroy the transmitters and move on. Progress: Open new weapons and upgrades for vehicles. Lobbies: - Large - Medium - Small. Features - Lobbies - Progress - Customization (Skins only) - New UI - 3D HUD - Squad - Voice (/w squad or not) - Settings (Audio, Video, HUD and etc) - Shaders, HD Textures - Weapon fire mode - New weapons - Upgrades for vehicles (In progress) - First person mode for vehicles - Multi-language (English, Russian) you can send your translates. - Improved performance Media Join us: IP: mtasa://178.33.224.67:22003 Website: bfmta.com Discord: Discord
-
Вот полный список что нужно изучить в MTA, это и языки программирования и софт. Вам придется это изучить если вы хотите делать проекты любого уровня и возможностей, либо помогать MTA. Разработка игровых режимов Lua - https://forum.multitheftauto.com/topic/27040-русские-доки-мануалы-туториалы-по-lua-и-mtasa/ База данных MySQL - Если хотите сохранять удаленно/локально, очень популярна для больших проектов в MTA. SQLite - MTA Использует по умолчанию для локальной базы, также есть множество функции, которые работают с ней (Account функции). Чаще используют мелкие проекты. Язык структурированных запросов SQL Шейдеры: HLSL - https://wiki.multitheftauto.com/wiki/Element/Shader Остальное: XML - MTA использует такой формат данных в конфигах JSON - Обработка ответа от веб запроса Создание UI используя CEF. HTML CSS Javascript CEF - https://wiki.multitheftauto.com/wiki/CEF_Tutorial Модули/Патчи/Разработка MTA C++ - В основном вся MTA, модули и некоторые библиотеки. C - Используется в библиотеках Модули - https://wiki.multitheftauto.com/wiki/Modules Visual Studio - Разработчики MTA используют именно её. Система контроля версий Git Реверс Assembler IDA Pro - Программа для дизассемблирования CheatEngine - Нахождение адресов памяти Стиль написания кода MTA: https://wiki.multitheftauto.com/wiki/Coding_guidelines Стиль написания кода для игрового мода: https://forum.multitheftauto.com/topic/34355-как-лучше-всего-выложить-код/
-
Карту в пределах SA делайте
-
https://wiki.multitheftauto.com/wiki/MacOS
-
Sometimes needs more speed in Lua, using LuaJIT will resolve this problem. I don't know a current progress level of LuaJIT integration into MTA, maybe someone can answer on this question?
-
https://wiki.multitheftauto.com/wiki/SetAmbientSoundEnabled
-
Максимум что может сделать клиент это вызвать серверное событие через triggerServerEvent Но если на сервере есть функция в событии вроде loadstring , тогда можно сделать все что угодно. Также клиент может поменять элемент дату. setElementData Которая будет синхронизироваться и на сервере тоже.
-
Скорее всего у вас создание всех UI интерфейсов происходит вместе с событием onClientResourceStart, который привязан к root, а не к resourceRoot. Именно по этому у вас все так и возникает. resourceRoot означает, что событие будет вызываться только для этого ресурса. Примечание: В вашем ресурсе может быть либо root либо getRootElement(). root это предопределенная переменная, root и getRootElement() имеют одинаковое значение.
-
loadstring( "outputDebugString( 1 )" )(); loadstring возвращает функцию и строку ошибки (если есть). Функцию вы должны вызвать сами. На примере показ вызов функции сразу.
-
Используйте оператор BINARY. Пример. SELECT * FROM `table` WHERE `column` = BINARY 'value'
-
Вы можете через клиент только запустить событие вызвав функцию triggerServerEvent .
-
Это нельзя сделать стандартными средствами МТА. Все ресурсы запускаются для всех клиентов. Придется тебе все делать самому. Через следующие функции: loadstring Через неё можно запускать Lua код на клиенте/сервере. Если хочешь сделать скачивание файлов с сервера, то нужно использовать (можно выбрать между downloadFile и triggerLatentClientEvent): downloadFile triggerLatentClientEvent
-
Вы создаете каждый раз локальную переменную в функции, где она хранит уникальные данные для каждого игрока. Ничего не будет. У вас есть один просчет, вы вызываете dbPoll используя аргумент ожидания ( - 1 ), сервер в этот момент ожидает. Используйте каллбэк в функции dbQuery, тогда когда запрос будет получен, то вызовется каллбек функции и потом обрабатывайте его через dbPoll. Есть примеры, советую вам внимательно прочитать все, чтобы понять как работать с базами в MTA. UPD: Вот ещё ссылка, изучите
-
Данные можете хранить в таблицах, где ключ = игрок. Либо в элемент дате. set/getElementData. (Но только без функций) После выхода из сервера не забудьте обнулять таблицу. Пример псевдо-кода: -- Таблица данных g_pPlayersData = {}; function Add( pPlayer ) -- Функция содержащая что-то. local function vFunction() return math.random( 1, 100 ); end; -- Добавляем в таблицу по индексу ключ = игрок, значение = функция. g_pPlayersData[ pPlayer ] = vFunction; end function Call( pPlayer ) -- Получаем из таблицы функцию. local vFunction = g_pPlayersData[ pPlayer ]; -- Вызываем её. Выведет число в рандоме от 1 до 100. outputDebugString( vFunction() ); end -- Добавляем при вводе команды. addCommandHandler( "test_add", function( pPlayer ) Add( pPlayer ); end ); -- Вызываем при вводе команды. addCommandHandler( "test_call", function( pPlayer ) Call( pPlayer ); end ); addEventHandler( "onPlayerQuit", root, function() -- Удаляем при выходе из сервера. g_pPlayersData[ source ] = nil; end ); По данному примеру вы можете добавлять что угодно таблицы/числа/строки/.... Вообщем не совсем понятно о чем идет речь, что вы конкретно хотите сделать?
-
1. Вы должны использовать параметр multi_statements в dbConnect . 2. В обычном случае вы используете: local result, num_affected_rows, last_insert_id = dbPoll ( qh, -1 ) Но здесь у вас будет local multiResults = dbPoll(queryhandle, -1) for sid, statementResult in ipairs ( multiResults ) do local resultRows, num_affected_rows, last_insert_id = unpack(statementResult) -- TODO: Какой то код дальше.. end