Jump to content

Общий мини "HELP ME" топик по скриптингу


Recommended Posts

Здравствуйте, помогите, пожалуйста, сделать отсортировку для 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

Уууу, Memory, ты конечно молодец, залил кучу кода, и предлагаешь нам его штрудировать, в поисках непонятно чего...

Давай-ка так, ты объяснишь подробно проблему, и, что конкретно у тебя не получаеться сделать... Тогда возможно, мы сможешь тебе помоч...

P.S. Я смотрю ты по олдскулу кодишь :lol:

ocal ME = getLocalPlayer() 
local ROOT = getRootElement() 
local ROOTRES = getResourceRootElement(getThisResource()) 

Уже давно есть глобальные переменные root, localPlayer, resourceRoot.

Link to comment
P.S. Я смотрю ты по олдскулу кодишь

А то :D

Так о проблеме, при команде /top в чате отображаются топ 10 игроков, ну это понятно, я думаю. Так я бы хотел теже топ 10 игроков, чтобы отображались в этом простом gui, а вот как послать туда отсортированных игроков подскажите, пожалуйста.

Link to comment

У тебя есть событие onReceiveTopTen с обработчиком соответственно, ты его можешь доработать и добавить туда обновление уже.

Очищай гридлист и заполняй новыми данными.

Вот список функций, которые тебе понадобятся для обновления гридлиста:

https://wiki.multitheftauto.com/wiki/GuiGridListClear

https://wiki.multitheftauto.com/wiki/GuiGridListAddRow

https://wiki.multitheftauto.com/wiki/Gui ... etItemText

Link to comment
P.S. Я смотрю ты по олдскулу кодишь

А то :D

Так о проблеме, при команде /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

В тему про top10 игроков: https://community.multitheftauto.com/ind ... ls&id=5715

Появился вопрос. Список игроков берется на клиенте с помощью getElementsByType("player"). Что вернет функция? Список всех игроков онлайн, или только тех, которые находятся поблизости и синхронизированы?

Link to comment

Решил сделать так чтобы при каждом попадании давало accountData, чтобы просматривать сколько всего попаданий было, но даже в таком простом коде накосячил :D

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 by Guest
Link to comment

Смотрю на код и становится страшно.. Что будет если 10 игроков начнут палить друг в друга с автоматов? Это ведь 2 запроса в SQLite на каждый вызов функции..

Link to comment

Можно облегчить нагрузку на сервер, подсчитывая её на стороне клиента. Это сложнее, так как скорее всего придется составлять таблицу(игрок, сколько нанес урона), и потом ее передавать на сервер (в конце раунда или конце =D). Поправьте, если я не прав.

Link to comment

Не сильна будет нагрузка от простого подсчёта убийств.. Проблема в том, что во время подсчёта идёт сразу запись в файл.. На каждый выстрел - одно сохранение (2 SQL запроса).. Такие данные надо сохранять по таймеру и перед выходом игрока.

Link to comment

Есть ли возможность объединить несколько инсертов или апдейтов в один запрос? Чтобы шли как бы в одной транзакции. Интересует именно для sqlite баз.

Link to comment
Есть ли возможность объединить несколько инсертов или апдейтов в один запрос? Чтобы шли как бы в одной транзакции. Интересует именно для 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
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

А что не получается конкретно? Если просто координаты не правильно задаешь, то мы врядли тебе поможем...

Вобщем-то ставишь зону и потом увеличиваешь ее ширину и высоту.

Можешь использовать это, что бы увидеть зону в игре: https://wiki.multitheftauto.com/wiki/Client_Commands#showcol

Link to comment

Хочу сделать определенное действие, если игрок берет пикап в 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
pickupID == "id"  

Это условие полностью неверно и никогда не будет выполнятся т.к переменная pickupID это число, ид пикапа, а ты проверяешь на строку "id" . Я не понимаю зачем тебе это условие нужно ..

Вообщем как всегда копипаст без разбора кода и что он собственно делает. Заканчивайте уже с этим. Вам же хуже.

Link to comment
pickupID == "id"  

Это условие полностью неверно и никогда не будет выполнятся т.к переменная pickupID это число, ид пикапа, а ты проверяешь на строку "id" . Я не понимаю зачем тебе это условие нужно ..

Вообщем как всегда копипаст без разбора кода и что он собственно делает. Заканчивайте уже с этим. Вам же хуже.

Да уже разобрался давно, спасибо)

if(pickupType == "vehiclechange" and vehicleModel == 425) then 

Скажите пожалуйста, как вытащить из meta.xml длительность карты?

Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...