点击 vgui 按钮时如何调用函数

(我对 Lua 还比较陌生,请原谅我在解释时可能犯的错误)我正试图制作一个任务系统,以便玩家可以在打开实体并选择开始任务时点击任务。我似乎无法想出如何让我的“function npcquestkill()”仅在玩家点击开始任务按钮时启动。任务按钮是“local Button = vgui.Create("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 ) ) -- 绘制蓝色按钮
        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)
点赞
用户2858170
用户2858170

根据 DButton 文档,您需要实现以下函数:

Button.DoClick

就像您已经做了一样。

此函数将在鼠标左键单击(按下和释放)按钮时调用。

官方示例

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

local DermaButton = vgui.Create( "DButton", frame ) // 创建按钮并将其父级指定为框架
DermaButton:SetText( "Say hi" )                   // 在按钮上设置文本
DermaButton:SetPos( 25, 50 )                  // 在框架上设置位置
DermaButton:SetSize( 250, 30 )                    // 设置大小
DermaButton.DoClick = function()              // 单击时执行自定义函数(注意冒号 “:” 的点 “.” 替换)
  RunConsoleCommand( "say", "Hi" )            // 单击时运行控制台命令 "say hi"(命令、参数)
end

请注意,您需要将 // 替换为 --

2021-02-02 09:06:17
用户11251604
用户11251604

我似乎弄不清楚如何使我的“function npcquestkill()”只有在玩家点击任务按钮以开始它时才会启动。

当前该函数已挂钩到事件“OnNPCKilled”,即在脚本运行时即可挂钩:

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

这意味着每次杀死 NPC 时都会执行函数 npcquestkill。

您可以使挂钩在按下按钮时添加,或者使用条件,这样只有在按下按钮后才会增加计数。

话虽如此,如果这是针对多人游戏的,您应该创建一个类,创建玩家对象,每个对象都保持自己的计数。除非当然它是一个全服事件,只有单个计数相关。

2021-02-04 14:52:14