Flaker Posted November 22, 2012 Share Posted November 22, 2012 Ну я советую тебе поступить именно так... Лучше конечно использовать MySQL Но если нет возможности или желания, то можно и SQLite... Вот начни познавать базы данных, с этой статьи: https://forum.multitheftauto.com/viewtopic.php?f=153&t=37482 Link to comment
Memory Posted November 24, 2012 Share Posted November 24, 2012 Здравствуйте, помогите, пожалуйста, сделать отсортировку для gui, чтобы отображалось имя аккаунта и поинты. Код отсортировки и отображения в чате. function sortAccounts( ) local rowdata = { } for _, account in pairs( getAccounts( ) ) do rowdata[ #rowdata + 1 ] = { account = getAccountName( account ), points = getAccountData( account,"Points" ) } end table.sort( rowdata, function ( a, b ) return ( tonumber( a.points ) or 0 ) > ( tonumber( b.points ) or 0 ) end ) return rowdata end function tables( ) outputChatBox( "Top 10 points:", root, 255,255,255 ) for index, data in ipairs( sortAccounts( ) ) do outputChatBox(tostring( index )..": ".. tostring( data.account ) .." - ".. tostring( data.points ), root, 255, 255, 255 ) if index == 10 then break end end triggerClientEvent( 'onAccountsSend',root,sortAccounts( ) ) end addCommandHandler( "top", tables ) Gui local ME = getLocalPlayer() local ROOT = getRootElement() local ROOTRES = getResourceRootElement(getThisResource()) local TOPTEN = {} local GUI = {} addEvent("onReceiveTopTen", true) addEventHandler("onReceiveTopTen", ROOT, function(t) TOPTEN = t end) addCommandHandler("topten", function() toggleGUI() end) addEventHandler("onClientResourceStart", ROOTRES, function() triggerServerEvent("onClientRequestTopTen", ME) toptenGUI() bindKey("F1", "down", toggleGUI) end) function toggleGUI() if guiGetVisible(GUI.wdw) then guiSetVisible(GUI.wdw, false) showCursor(false) else triggerServerEvent("onClientRequestTopTen", ME) guiGridListClear(GUI.list) for _, rank in ipairs(TOPTEN) do local row = guiGridListAddRow(GUI.list) guiGridListSetItemText(GUI.list, row, 1, data.account, false, false) guiGridListSetItemText(GUI.list, row, 2, data.points, false, false) end showCursor(true) guiSetVisible(GUI.wdw, true) end end function toptenGUI() GUI.wdw = guiCreateWindow(0.300, 0.330, 0.400, 0.400, "Top ten", true) guiWindowSetSizable(GUI.wdw, false) guiWindowSetMovable(GUI.wdw, false) GUI.list = guiCreateGridList(0, 0.11, 1, 0.750, true, GUI.wdw) guiGridListAddColumn(GUI.list, "name", 0.6) guiGridListAddColumn(GUI.list, "points", 0.3) GUI.close = guiCreateButton(0, 0.890, 1, 0.060, "exit", true, GUI.wdw) addEventHandler("onClientGUIClick", GUI.close, toggleGUI, false) guiSetAlpha(GUI.wdw, 0.6) guiSetFont(GUI.list, "default-small") guiSetFont(GUI.close, "default-small") guiSetVisible(GUI.wdw, false) end Link to comment
Flaker Posted November 24, 2012 Share Posted November 24, 2012 Уууу, Memory, ты конечно молодец, залил кучу кода, и предлагаешь нам его штрудировать, в поисках непонятно чего... Давай-ка так, ты объяснишь подробно проблему, и, что конкретно у тебя не получаеться сделать... Тогда возможно, мы сможешь тебе помоч... P.S. Я смотрю ты по олдскулу кодишь ocal ME = getLocalPlayer() local ROOT = getRootElement() local ROOTRES = getResourceRootElement(getThisResource()) Уже давно есть глобальные переменные root, localPlayer, resourceRoot. Link to comment
Memory Posted November 24, 2012 Share Posted November 24, 2012 P.S. Я смотрю ты по олдскулу кодишь А то Так о проблеме, при команде /top в чате отображаются топ 10 игроков, ну это понятно, я думаю. Так я бы хотел теже топ 10 игроков, чтобы отображались в этом простом gui, а вот как послать туда отсортированных игроков подскажите, пожалуйста. Link to comment
Kenix Posted November 24, 2012 Share Posted November 24, 2012 У тебя есть событие onReceiveTopTen с обработчиком соответственно, ты его можешь доработать и добавить туда обновление уже. Очищай гридлист и заполняй новыми данными. Вот список функций, которые тебе понадобятся для обновления гридлиста: https://wiki.multitheftauto.com/wiki/GuiGridListClear https://wiki.multitheftauto.com/wiki/GuiGridListAddRow https://wiki.multitheftauto.com/wiki/Gui ... etItemText Link to comment
Flaker Posted November 24, 2012 Share Posted November 24, 2012 P.S. Я смотрю ты по олдскулу кодишь А то Так о проблеме, при команде /top в чате отображаются топ 10 игроков, ну это понятно, я думаю. Так я бы хотел теже топ 10 игроков, чтобы отображались в этом простом gui, а вот как послать туда отсортированных игроков подскажите, пожалуйста. Ну приблизительно так: В этом коде for index, data in ipairs( sortAccounts( ) ) do outputChatBox(tostring( index )..": ".. tostring( data.account ) .." - ".. tostring( data.points ), root, 255, 255, 255 ) --GuiGridListAddRow вот сюда --GuiGridListSetItemText для вставки текста функция if index == 10 then break end end https://wiki.multitheftauto.com/wiki/GuiGridListAddRow https://wiki.multitheftauto.com/wiki/GuiGridListSetItemText Заменяешь outputChatBox на GuiGridListAddRow и GuiGridListSetItemText. Естественно перед этим нужно создать Gridlist и тд... Link to comment
Hitori Posted November 25, 2012 Share Posted November 25, 2012 В тему про top10 игроков: https://community.multitheftauto.com/ind ... ls&id=5715 Появился вопрос. Список игроков берется на клиенте с помощью getElementsByType("player"). Что вернет функция? Список всех игроков онлайн, или только тех, которые находятся поблизости и синхронизированы? Link to comment
Astari Posted November 25, 2012 Share Posted November 25, 2012 (edited) Решил сделать так чтобы при каждом попадании давало accountData, чтобы просматривать сколько всего попаданий было, но даже в таком простом коде накосячил function DamageHit(attacker) local attack = getPlayerAccount(attacker) local hit = getAccountData(attack, "hit") if not hit then setAccountData(attack, "hit", 1) else setAccountData(attack, "hit", tonumber(hin) + 1) end end addEventHandler ("onPlayerDamage", getRootElement (), DamageHit) Edited November 25, 2012 by Guest Link to comment
Flaker Posted November 25, 2012 Share Posted November 25, 2012 tonumber(player_exp) + 1 player_exp - это откуда вобще взялось? Link to comment
Astari Posted November 25, 2012 Share Posted November 25, 2012 tonumber(player_exp) + 1player_exp - это откуда вобще взялось? сорри, просто переделывал со скрипта опыта Link to comment
Kernell Posted November 25, 2012 Share Posted November 25, 2012 Смотрю на код и становится страшно.. Что будет если 10 игроков начнут палить друг в друга с автоматов? Это ведь 2 запроса в SQLite на каждый вызов функции.. Link to comment
Memory Posted November 25, 2012 Share Posted November 25, 2012 Flaker, Kenix, спасибо за помощь, буду дорабатывать Link to comment
TheNormalnij Posted November 28, 2012 Share Posted November 28, 2012 Можно облегчить нагрузку на сервер, подсчитывая её на стороне клиента. Это сложнее, так как скорее всего придется составлять таблицу(игрок, сколько нанес урона), и потом ее передавать на сервер (в конце раунда или конце =D). Поправьте, если я не прав. Link to comment
Kernell Posted November 28, 2012 Share Posted November 28, 2012 Не сильна будет нагрузка от простого подсчёта убийств.. Проблема в том, что во время подсчёта идёт сразу запись в файл.. На каждый выстрел - одно сохранение (2 SQL запроса).. Такие данные надо сохранять по таймеру и перед выходом игрока. Link to comment
Hitori Posted November 29, 2012 Share Posted November 29, 2012 Есть ли возможность объединить несколько инсертов или апдейтов в один запрос? Чтобы шли как бы в одной транзакции. Интересует именно для sqlite баз. Link to comment
Flaker Posted November 29, 2012 Share Posted November 29, 2012 Есть ли возможность объединить несколько инсертов или апдейтов в один запрос? Чтобы шли как бы в одной транзакции. Интересует именно для sqlite баз. INSERT допускает вставку нескольких строк одним оператором: INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); Подробности в http://dev.mysql.com/doc/refman/5.0/en/insert.html документации. Link to comment
Silum Posted November 30, 2012 Share Posted November 30, 2012 CLEO скрипты можно в мта запустить? Link to comment
TheNormalnij Posted December 1, 2012 Share Posted December 1, 2012 Нет, но есть возможность используя ту же логику сделать свое, такое же на Lua Link to comment
Silum Posted December 2, 2012 Share Posted December 2, 2012 x, y, size = -3330.6999511719, 1240.4000244141, -35.299999237061, 9999, 9999 local greenzone = createColRectangle ( -3330.6999511719, 1240.4000244141, -35.299999237061, 9999, 9999 ) local greenzonemaparea = createRadarArea (-3330.6999511719, 1240.4000244141, -35.299999237061, 9999, 9999, 255, 0, 120) function greenzoneEnter ( thePlayer, matchingDimension ) if getElementType( thePlayer ) ~= "player" then return end outputChatBox ( "* You Entered The Greenzone!", thePlayer, 50, 252, 3 ) toggleControl ( thePlayer, "fire", false ) toggleControl ( thePlayer, "next_weapon", false ) toggleControl ( thePlayer, "previous_weapon", false ) setPedWeaponSlot ( thePlayer, 0 ) toggleControl ( thePlayer, "aim_weapon", false ) toggleControl ( thePlayer, "vehicle_fire", false ) toggleControl ( thePlayer, "vehicle_secondary_fire", false ) end addEventHandler ( "onColShapeHit", greenzone, greenzoneEnter ) function greenzoneExit ( thePlayer, matchingDimension ) if getElementType( thePlayer ) ~= "player" then return end outputChatBox ( "* You Left The Greenzone!", thePlayer, 50, 252, 3 ) toggleControl ( thePlayer, "fire", true ) toggleControl ( thePlayer, "next_weapon", true ) toggleControl ( thePlayer, "previous_weapon", true ) toggleControl ( thePlayer, "aim_weapon", true ) toggleControl ( thePlayer, "vehicle_fire", true ) toggleControl ( thePlayer, "vehicle_secondary_fire", true ) end addEventHandler ( "onColShapeLeave", greenzone, greenzoneExit ) мне надо чтоб safe zona закрыла весь городок в углу и даже чучуть больше что я неправильно делаю? Link to comment
Flaker Posted December 3, 2012 Share Posted December 3, 2012 А что не получается конкретно? Если просто координаты не правильно задаешь, то мы врядли тебе поможем... Вобщем-то ставишь зону и потом увеличиваешь ее ширину и высоту. Можешь использовать это, что бы увидеть зону в игре: https://wiki.multitheftauto.com/wiki/Client_Commands#showcol Link to comment
Silum Posted December 3, 2012 Share Posted December 3, 2012 я вот и хочу узнать как её растянуть Link to comment
N1kS Posted December 3, 2012 Share Posted December 3, 2012 Хочу сделать определенное действие, если игрок берет пикап в race и его авто меняется на NRG-500, но почему то это не работает... Из вики: onPlayerPickUpRacePickup Параметры int/string pickupID, string pickupType, int vehicleModel pickupID: номер пикапа при синтаксисе MTA:Race (начиная с 1) или атрибут "id" пикапа в случае синтаксиса DM. pickupType: тип пикапа. Может быть "nitro", "repair" или "vehiclechange". vehicleModel: если тип пикапа - vehiclechange, то это - модель нового транспортного средства, которую он устанавливает. Source Source - игрок, подобравший пикап. Функция: function _f5(pickupID, pickupType, vehicleModel) if(pickupID == "id" and pickupType == "vehiclechange" and vehicleModel == 522) then outputChatBox("ok", source) end end addEvent("onPlayerPickUpRacePickup", true) addEventHandler("onPlayerPickUpRacePickup", root, _f5) Если же делаем так, то получаем "ok" при въезде на любой пикап, но мне нужно именно при смене на NRG-500: function _f5(pickupID, pickupType, vehicleModel) outputChatBox("ok", source) end addEventHandler("onPlayerPickUpRacePickup", root, _f5) Link to comment
Kenix Posted December 3, 2012 Share Posted December 3, 2012 pickupID == "id" Это условие полностью неверно и никогда не будет выполнятся т.к переменная pickupID это число, ид пикапа, а ты проверяешь на строку "id" . Я не понимаю зачем тебе это условие нужно ..Вообщем как всегда копипаст без разбора кода и что он собственно делает. Заканчивайте уже с этим. Вам же хуже. Link to comment
N1kS Posted December 3, 2012 Share Posted December 3, 2012 pickupID == "id" Это условие полностью неверно и никогда не будет выполнятся т.к переменная pickupID это число, ид пикапа, а ты проверяешь на строку "id" . Я не понимаю зачем тебе это условие нужно ..Вообщем как всегда копипаст без разбора кода и что он собственно делает. Заканчивайте уже с этим. Вам же хуже. Да уже разобрался давно, спасибо) if(pickupType == "vehiclechange" and vehicleModel == 425) then Скажите пожалуйста, как вытащить из meta.xml длительность карты? Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now