Как мне вызвать функцию при нажатии кнопки vgui

#lua #garrys-mod

#lua #garrys-mod

Вопрос:

(Я довольно новичок в Lua, поэтому, пожалуйста, извините за любые ошибки, которые я допустил, пытаясь объяснить это) Я пытаюсь создать систему квестов, чтобы игрок мог щелкнуть по квесту, когда они открывают объект, и выбрать его запуск. Кажется, я не могу понять, как я могу сделать так, чтобы моя «функция npcquestkill ()» запускалась только тогда, когда игрок нажимает кнопку квеста, чтобы запустить ее. Кнопка поиска — «локальная кнопка = vgui.Создать («DButton», Frame)». Каким может быть способ, которым я мог бы это сделать.

 net.Receive("OBJ_OPEN", function()
        local Frame = vgui.Create("DFrame")
        Frame:SetPos( 700, 400 ) 
        Frame:SetSize( 500, 350 ) 
        Frame:SetTitle( "Objectives" ) 
        Frame:SetVisible( true ) 
        Frame:SetDraggable( false ) 
        Frame:ShowCloseButton( true ) 
        Frame:MakePopup()
        Frame.Paint = function( self, w, h ) 
            draw.RoundedBox( 0, 0, 0, w, h, Color( 231, 76, 60, 150 ) ) 
        end

        local Button = vgui.Create("DButton", Frame)
        Button:SetText( "Kill 10 Covenant in One Session" )
        Button:SetTextColor( Color(255,255,255) )
        Button:SetPos( 5, 30 )
        Button:SetSize( 490, 50 )
        Button.Paint = function( self, w, h )
            draw.RoundedBox( 0, 0, 0, w, h, Color( 41, 128, 185, 250 ) ) -- Draw a blue button
        end

        Button.DoClick = function()
            Button:SetText( "Kill 10 Covenant in One Session: In Progress")
            vbutton = 2
        end

        if (vbutton == 2) then
            Button:SetText( "Kill 10 Covenant in One Session: In Progress")
        elseif (vbutton == 1) then
            Button:SetText( "Kill 10 Covenant in One Session" )
        end
end)

function npcquestkill()
    npckills = npckills   1
    print(npckills)
end

function rewards(ply)
    if(npckills == 50)then
        ply:AddMoney(1000)
        vbutton = 1
    end
end
hook.Add("OnNPCKilled","npcquestkill", npcquestkill)

 

Комментарии:

1. в чем проблема с вашим кодом? вы реализуете doClick, так что, похоже, вы уже знаете, как обрабатывать нажатия кнопок. каково ожидаемое / наблюдаемое поведение, каков ваш актуальный вопрос? вы пробовали вызывать npcquestkill в doClick?

Ответ №1:

Согласно документации DButton, вы должны реализовать функцию

 Button.DoClick
 

Как вы уже сделали.

Эта функция будет вызываться при нажатии кнопки левой кнопкой мыши (нажмите и отпустите)

официальный пример

 local frame = vgui.Create( "DFrame" )
frame:SetSize( 300, 250 )
frame:Center()
frame:MakePopup()

local DermaButton = vgui.Create( "DButton", frame ) // Create the button and parent it to the frame
DermaButton:SetText( "Say hi" )                   // Set the text on the button
DermaButton:SetPos( 25, 50 )                  // Set the position on the frame
DermaButton:SetSize( 250, 30 )                    // Set the size
DermaButton.DoClick = function()              // A custom function run when clicked ( note the . instead of : )
  RunConsoleCommand( "say", "Hi" )            // Run the console command "say hi" when you click it ( command, args )
end
 

Пожалуйста, обратите внимание, что вы должны заменить // на --

Ответ №2:

Кажется, я не могу понять, как я могу сделать так, чтобы моя «функция npcquestkill ()» запускалась только тогда, когда игрок нажимает кнопку квеста, чтобы запустить ее.

В настоящее время эта функция подключена к событию «OnNPCKilled», которое вы подключаете к моменту запуска скрипта:

 hook.Add("OnNPCKilled","npcquestkill", npcquestkill)
 

Это означает, что функция npcquestkill выполняется каждый раз, когда убит npc.

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

С учетом всего сказанного, если это для многопользовательской игры, вам, вероятно, следует вместо этого создать класс, который создает объекты игрока, каждый из которых по отдельности поддерживает свое собственное количество. Если, конечно, это событие на уровне сервера, в котором имеет значение только один счетчик.