#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.
Вы можете сделать так, чтобы хук добавлялся при нажатии кнопки, или использовать условие, чтобы ваш счет увеличивался только после нажатия кнопки. Была нажата кнопка.
С учетом всего сказанного, если это для многопользовательской игры, вам, вероятно, следует вместо этого создать класс, который создает объекты игрока, каждый из которых по отдельности поддерживает свое собственное количество. Если, конечно, это событие на уровне сервера, в котором имеет значение только один счетчик.