-
Posts
160 -
Joined
-
Last visited
Everything posted by iAxel
-
Lua Construct — Recommended Источник http://coronalabs.com/blog/2013/03/12/performance-optimizations/
-
Ребята, на днях подумал о оптимизация... Вопрос - что как и лучше использовать в MTA для производительности мода? Ах да и какой цикл все же использовать? https://ilovelua.wordpress.com/tag/%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F/
-
To save, I use mysql Load player date: addEvent('onLogged', true) function onLogged(player) local serial = player:getSerial() local name = player:getName() local query = getDB():query('SELECT * FROM `accounts` WHERE `serial` = "'..serial..'" LIMIT 1') if (query) then local data = query:poll(-1) local pos = fromJSON(data[1]['pos']) local needs, status, items = fromJSON(data[1]['needs']), fromJSON(data[1]['status']), fromJSON(data[1]['items']) player:spawn(pos[1], pos[2], pos[3]) player:setHealth(data[1]['health']) player:fadeCamera(true) player:setCameraTarget() for i, data in ipairs(Table.need) do player:setData(data[1], needs[i]) end for i, data in ipairs(Table.stat) do player:setData(data[1], stats[i]) end for i, data in ipairs(Table.item) do player:setData(data[1], items[i]) end end end addEventHandler('onLogged', root, onLogged) Save player date: function onSave(player) local serial = player:getSerial() local name = player:getName() local health = player:getHealth() local x, y, z = getElementPosition(player) local pos = toJSON({x, y, z}) local needs, status, items = {}, {}, {} for i, data in ipairs(Table.need) do needs[i] = player:getData(data[1]) end for i, data in ipairs(Table.stat) do status[i] = player:getData(data[1]) end for i, data in ipairs(Table.item) do items[i] = player:getData(data[1]) end player:setData('Logged', false) needs, status, items = toJSON(needs), toJSON(status), toJSON(items) getDB():exec('UPDATE `accounts` SET `login` = "'..name..'", `health` = "'..health..'", `pos` = "'..pos..'", `needs` = "'..needs..'", `status` = "'..status..'", `items` = "'..items..'", `lastdate` = NOW() WHERE `serial` = "'..serial..'" LIMIT 1') outputDebugString('Account Name: '..name..' was saved automatically.') end Register player: addEvent('onRegister', true) function onRegister(player) local iRand = math.random(#spawnPos) player:spawn(spawnPos[iRand][1], spawnPos[iRand][2], spawnPos[iRand][3]) player:fadeCamera(true) player:setCameraTarget() for _, data in pairs(Table) do for _, value in pairs(data) do player:setData(value[1], value[2]) end end end addEventHandler('onRegister', root, onRegister) I need an optimized version of the data load
-
Hello everyone! Please help with the decision I am using a table to change the data Table: Table = { need = { {'Test1', 100}, {'Test2', 100} }, stat = { {'Test3', false}, {'Test4', false} }, item = { {'Test5', 0}, {'Test6', 0} } } When registering: --Version 1 for i, data in ipairs(Table.need) do source:setData(data[1], data[2]) end for i, data in ipairs(Table.stat) do source:setData(data[1], data[2]) end for i, data in ipairs(Table.item) do source:setData(data[1], data[2]) end --Version 2 for _, v in pairs(Table) do for _, v2 in pairs(v) do source:setData(v2[1], v2[2]) end end When loading(MySQL): --Version 1 local needs = fromJSON(data[1]['needs']) local status = fromJSON(data[1]['status']) local items = fromJSON(data[1]['items']) for i, data in ipairs(Table.need) do source:setData(data[1], needs[i]) end for i, data in ipairs(Table.stat) do source:setData(data[1], status[i]) end for i, data in ipairs(Table.item) do source:setData(data[1], items[i]) end --Version 2 not : ( Question - is there any other optimized version? P.S I need an optimized version.
-
Еще один вопрос а если я буду использовать JSON? local needs = fromJSON(data[1]['needs']) local status = fromJSON(data[1]['status']) local items = fromJSON(data[1]['items']) for i, data in ipairs(Table.need) do player:setData(data[1], needs[i]) end for i, data in ipairs(Table.stat) do player:setData(data[1], status[i]) end for i, data in ipairs(Table.item) do player:setData(data[1], items[i]) end
-
Спасибо!
-
Ну крч, вот таблица: Table = { need = { {'Test1', 100}, {'Test2', 100} }, stat = { {'Test3', false}, {'Test4', false} }, item = { {'Test5', 0}, {'Test6', 0} } } Использую его так: for i, data in ipairs(Table.need) do source:setData(data[1], data[2]) end for i, data in ipairs(Table.stat) do source:setData(data[1], data[2]) end for i, data in ipairs(Table.item) do source:setData(data[1], data[2]) end Вопрос - можно как то использовать все в одном цикле? Если да то можно пример? Заранее благодарен!
-
Я беру те функции которые мне полезны, но теперь понял что лучше писать самому P.S Спасибо
-
Генерация пароля: local symbols = { 'A', 'b', 'D', 'G', 'N', 'f', 'j', 'T', 'R', 'e', 'z', 'Z', 'X', 'x', 'V', 'v', 'E', 'H', 'h', 's', 'S', 'a', 'B', 'n', 'm', 'M', 'l', 'L', 'g', 'F', 'y', 'Y', 'U', 'u', 'p', 'P' } -- function RandomPassword(sym_num) local pass = '' for i = 1, sym_num do if math.random(1, 2) == 1 then pass = pass..tostring(math.random(0, 9)) else pass = pass..symbols[math.random(1, #symbols)] end end return pass end Вопрос можно как-то сократить код? пример не используя таблицу
-
Буду химичить, Новый нюанс ребята), знаю руки не из того места растут... Сделал систему транспорта, но тут уже не загрузка а сохранение не пашет Создание транспорта: addCommandHandler("addvehicle", function (player, cmd, model) local x, y, z = getElementPosition(player) local rx, ry, rz = getElementRotation(player) local pos = toJSON({x, y, z, rx, ry, rz}) local query = getDB():query("INSERT INTO `vehicles` (`model`, `repos`, `pos`) VALUES ('"..model.."', '"..pos.."', '"..pos.."')") if (query) then local result, num_affected_rows, last_insert_id = query:poll(-1) addVehicle(last_insert_id, model, 1000, pos, pos) player:outputChat(last_insert_id) else outputConsole("MySQL error occured when tried to create the vehicle.") end end ) Функция addVehicle: function addVehicle(id, model, health, pos, repos) local vpos = fromJSON(pos) local vrepos = fromJSON(repos) local vehicle = Vehicle(model, vpos[1], vpos[2], vpos[3], vpos[4], vpos[5], vpos[6]) vehicle:setHealth(health) vehicle:setRotation(vpos[4], vpos[5], vpos[6]) vehicle:setData("dbid", id) setVehicleRespawnPosition(vehicle, vrepos[1], vrepos[2], vrepos[3], vrepos[4], vrepos[5], vrepos[6]) end Загрузка: addEventHandler("onResourceStart", resourceRoot, function () local query = getDB():query("SELECT * FROM `vehicles`") if (query) then local result, num_affected_rows, errmsg = query:poll(-1) if (num_affected_rows > 0) then for result, row in pairs(result) do addVehicle(row["id"], row["model"], row["health"], row["pos"], row["repos"]) end else outputConsole("0 vehicles loaded.") end else outputConsole("MySQL query failed when tried to fetch all vehicles.") end end ) Сохранение: addEventHandler("onResourceStop", resourceRoot, function () for i, v in ipairs(getElementsByType("vehicle")) do saveVehicle(v) end end ) Функция сохранение: function saveVehicle(element) local id = tonumber(element:getData("dbid")) or -1 if isElement(element) and element:getType() == "vehicle" and id >= 0 then local health = element:getHealth() local x, y, z = getElementPosition(element) local rx, ry, rz = getElementRotation(element) local query = getDB():exec("UPDATE `vehicles` SET `health` = '"..health.."', `pos` = '"..toJSON({x, y, z, rx, ry, rz}).."' WHERE `id` = '"..id.."'") if (query) then outputConsole("Vehicle was saved automatically.") else outputConsole("MySQL query failed when trying to save vehicle.") end end end Знаю наверное задолбал всех со своими ошибками... Добавил 5 машин Что выдает мне консоль при отключение мода: [2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] [2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] [2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] [2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] [2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] UPD: Разобрался , странно но связь с бд отключался до того как сервер успевал сохранять т/с. Пришлось таким способом сохранять т/с и игрока. addEventHandler("onResourceStop", resourceRoot, function() for i, p in ipairs(getElementsByType("player")) do if p:getData("Logged") then onPlayerSave(p) end end for i, v in ipairs(getElementsByType("vehicle")) do saveVehicle(v:getData("dbid"), v) end if (isElement(connection)) then connection:destroy() end end )
-
его нет
-
Сделал простой инвентарь. Таблицу использую для сохранение и загрузки так и для регистрации. local itemTable = { --таблица с данными {"Burger", 1},-- {"Pizza", 1}, {"Hot-Dog", 2}, {"Apple", 3}, {"Peach", 0}, {"Banana", 3}, {"Meat", 1}, {"Raw-Meat", 2}, {"Bandage", 0}, {"Drug", 0} } Регистрация addEvent("onPlayerRegister", true) addEventHandler("onPlayerRegister", root, function(player) local numb = math.random(#spawnPos) local x, y, z = spawnPos[numb][1], spawnPos[numb][2], spawnPos[numb][3] player:spawn(x, y, z) player:fadeCamera(true) player:setCameraTarget(player) for i, data in ipairs(itemTable) do player:setData(data[1], data[2])--думаю понятно end end ) Чтобы не засорять базу данных решил использовать toJSON(Посоветовал знакомый) addEventHandler("onPlayerQuit", root, function() local name = source:getName() local pos = {getElementPosition(source)} local inventory = {} for i, data in ipairs(itemTable) do inventory[i] = source:getData(data[1]) end inventory = toJSON(inventory) exports.mysql:getDB():exec("UPDATE `accounts` SET `pos` = '"..pos[1]..", "..pos[2]..", "..pos[3].."', `inventory` = '"..inventory.."' WHERE `username` = '"..name.."' LIMIT 1") end ) Но вот с загрузкой трабла. addEvent("onPlayerLogged", true) addEventHandler("onPlayerLogged", root, function(player) local name = player:getName() local query = exports.mysql:getDB():query("SELECT * FROM `accounts` WHERE `username` = '"..name.."' LIMIT 1") local result = query:poll(-1) local pos = split(result[1]["pos"], ",") player:spawn(pos[1], pos[2], pos[3]) player:fadeCamera(true) player:setCameraTarget(player) for i, data in ipairs(itemTable) do --извлекаю название предмета for k, v in pairs(fromJSON(result[1]["inventory"])) do--извлекаю количество предмета local elementData = unpack(v) player:setData(data[1], elementData)--тут ясно end end end ) Использовать цикл в цикле как то глупо, да и функция не работает. UPD: Решено
-
Да, когда запускаю сервер не выводит сообщение в консоль о outputServerLog("Error: MySQL connection is established!") Может быть проблемы с самым mysql-сервером ? Уже решил проблему) Хотел сделать автологин, но когда нажимаю на "войти", ничего не происходит вот что выводит консоль: [2014-11-16 20:16:33] CONNECT: Axel connected (IP: 10.5.28.187 Serial: AF921EEAEF4F416B07912FE7123EF634 Version: 1.4.0-9.06928.0) [2014-11-16 20:16:39] JOIN: Axel joined the game (IP: 10.5.28.187) [2014-11-16 20:16:48] WARNING: [new_project]\project\Login\login_s.lua:32: dbPoll failed; Unknown column 'Axel' in 'where clause' [2014-11-16 20:16:48] WARNING: [new_project]\project\Login\login_s.lua:36: dbPoll failed; Unknown column 'Axel' in 'where clause' [2014-11-16 20:16:48] ERROR: [new_project]\project\Login\login_s.lua:38: bad argument #1 to 'pairs' (table expected, got boolean) [2014-11-16 20:24:05] QUIT: Axel left the game [Quit] Выручайте: addEvent("onSendPlayerJoin", true) addEventHandler("onSendPlayerJoin", root, function () local serial = source:getSerial() local name = source:getName() local ip = source:getIP() local query = dbQuery(connection, "SELECT `id` FROM `accounts` WHERE `username` = `"..name.."` LIMIT 1") if (query) then local result, num_affected_rows, errmsg = dbPoll(query, -1) if (num_affected_rows > 0) then local query = dbQuery(connection, "SELECT * FROM `accounts` WHERE `username` = `"..name.."` LIMIT 1") if (query) then local result, num_affected_rows = dbPoll(query, -1) if (num_affected_rows > 0) then for result, row in pairs(result) do local query = dbExec(connection, "UPDATE `accounts` SET `serial` = '"..serial.."' WHERE `id` = '"..row["id"].."'") if (query) then triggerClientEvent(source, "onPlayerDoneLogin", source) source:outputChat("Welcome back "..name) source:spawn(1450.32421875, -2287.287109375, 13.546875) source:fadeCamera(true) source:setCameraTarget() else source:outputChat("Error: MySQL query failed when trying to save new login date "..name) end break end else source:outputChat("Error: MySQL query failed when trying to save new login date1 "..name) end else source:outputChat("Error: MySQL query failed when trying to save new login date2 "..name) end else local pass = createRandomPassword(10) local realtime = getRealTime() local timestamp = realtime.timestamp local query = dbExec(connection, "INSERT INTO `accounts` (`username`, `password`, `serial`, `ip`, `registerdate`) VALUES ('"..name.."', '"..pass.."', '"..serial.."', '"..ip.."', '"..timestamp.."')") if (query) then triggerClientEvent(source, "onPlayerDoneLogin", source) source:outputChat("Register complate!") source:spawn(1450.32421875, -2287.287109375, 13.546875) source:fadeCamera(true) source:setCameraTarget() else source:outputChat("Register failed1!") end end else source:outputChat("Register failed2!") end end ) UPD: Разобрался сам, не правильно запросы отправлял)
-
Да, когда запускаю сервер не выводит сообщение в консоль о outputServerLog("Error: MySQL connection is established!")
-
Я ничего не пропустил?)) local hostname = "127.0.0.1" local username = "root" local password = "" local database = "mta" local port = 3306 local connection = nil addEventHandler("onResourceStart", resourceRoot, function() connection = dbConnect("mysql", "dbname="..database..";host="..hostname..";port="..port, username, password) if (not connection) then outputServerLog("Error: MySQL connection is established!") else outputServerLog("Notice: MySQL connection is established!") end end ) addEventHandler("onResourceStop", resourceRoot, function() if (isElement(connection)) then connection:destroy() end end
-
Я не про функции а про самого скриптера, он из сампа ?)
-
dbConnect dbExec dbQuery dbPoll dbFree db = dbConnect("type", "dbname= ; host= ", username, password) Это я знаю, и даже пробовал. Но для меня этот метод неудобен. Использую тот, где mysql_connnect, mysql_query и т.п Из сампа?
-
Ну, можно и в которой происходил вызов, но это только лишние проверки на то, кто ее вызвал и не понятные ветвления. Лучше всего другую функцию. Т.е. разбить одну функцию на две: одна до ивента, другая после. Вот так, которая после, и должна вызываться ивентом. Да, сделал именно так. Глупый вопрос был( Опять напасть на ньюфага. Подключаюсь к MySQL серверу db = mysql_connect("******", "****", "*****", "****") В консоль ошибка: "attempt to call global 'mysql_connect' (a nil value)" В чем проблема? Не понятно, на wiki написано что эта MySQL библиотека включена в МТА. Не поверил, решил найти библиотеку .dll - не нашел. В чем дело, ребят? UPD: Решено. Все-таки модуль не встроен в МТА, нашел на Google Code, подключил и все хорошо dbConnect dbExec dbQuery dbPoll dbFree db = dbConnect("type", "dbname= ; host= ", username, password)
-
Я знаю, но как новичок я открыл вики https://wiki.multitheftauto.com/wiki/OnPlayerChat
-
Да вообще использовать: setElementData Медленнее, чем таблицы. Уже не раз на буржуйском форуме это показывали, доказывали и т.д. По поводу элемент даты - прочитай предыдущей пост от Kernell'a, он там доходчиво изложил. От себя единственное добавлю, что еще есть смысл использовать элемент дату для синхронизации от сервер к клиенту. По поводу вашего локального чата - нужно проверить, что делается быстрее, но мне кажется, что лучше через: getDistanceBetweenPoints3D Так же рекомендую добавить в ваш локальный чат функцию, она добавит реализма: isLineOfSightClear Большое спасибо! Можете привести примеры isLineOfSightClear для чата
-
И еще подтяните в коде) Какой вариант лучше? function PlayerChat(msg, mType) if mType == 0 then cancelEvent() local x, y, z = getElementPosition(source) local chatSphere = createColSphere(x, y, z, 30) destroyElement(chatSphere) for k, v in ipairs(getElementsWithinColShape(chatSphere, "player")) do outputChatBox(string.gsub((getPlayerName(source).." : "..msg), '#%x%x%x%x%x%x', ''), v, 211, 211, 211, true) end end end addEventHandler("onPlayerChat", root, PlayerChat) function PlayerChat(msg, mtype) if mtype == 0 then cancelEvent() local x, y, z = getElementPosition(source) for k, v in ipairs(getElementsByType("player")) do local x2, y2, z2 = getElementPosition(v) if getDistanceBetweenPoints3D(x, y, z, x2, y2, z2) < 30 then outputChatBox(string.gsub((getPlayerName(source).." : "..msg), '#%x%x%x%x%x%x', ''), v, 211, 211, 211, true) end end end end addEventHandler("onPlayerChat", root, PlayerChat)
-
Может и тупой вопрос, но как быть с ООП в МТА? использовать то что дано в МТА? или же писать свои? Не давно заглянул в проект Open Dayz Source, правда ничего не понял =) Так вот, что делать? использовать свои? или то что не давно добавили в 1.4 OFFTOP: Есть идея сделать проект но смотря на все ваши проекты, как-то стало обидно и завидно)
-
Слышал что использовать ElemetData в клиентской части не надежно, как с этим быть?
-
Ребята можете помочь? Попробовал несколько вариантов чтобы отображались иконки но они не отображаются.
