Page 1 of 1

GUI Buttons

Posted: Wed Oct 22, 2014 7:59 pm
by Turtle
Hi all! I've tried looking at other mods to see how buttons work, but they're kinda complicated and I can't seem to follow. I just want some buttons to simply click and perform one action. For example: click one button and it gives me one copper plate, click another and it gives me one iron plate. I'd appreciate it if anyone can point me in the right direction!

Re: GUI Buttons

Posted: Wed Oct 22, 2014 8:54 pm
by Devcod

Code: Select all

game.onevent(defines.events.onguiclick, function(event)
  if event.element.name == "your-button-name" then
    -- example: heal player
    game.player.character.health = 100
    -- example: add 10 iron plate
    game.player.insert({name="iron-plate", count="10"})
  end
end)
Not tested, but it does look like that.

Re: GUI Buttons

Posted: Thu Oct 23, 2014 7:26 pm
by Turtle
Devcod wrote:

Code: Select all

game.onevent(defines.events.onguiclick, function(event)
  if event.element.name == "your-button-name" then
    -- example: heal player
    game.player.character.health = 100
    -- example: add 10 iron plate
    game.player.insert({name="iron-plate", count="10"})
  end
end)
Not tested, but it does look like that.
Thanks! That helped me understand how it works.

I got it to work once, but now clicking the buttons does nothing at all. Here's my control.lua:

Code: Select all

require "defines"

game.onevent(defines.events.ontick, function(event)
	if game.player.vehicle and game.player.vehicle.valid and game.player.vehicle.type == "car" then
		if game.player.gui.left.frameDA ~= nil then game.player.gui.left.frameDA.destroy() end
		frameDA = game.player.gui.left.add{type = "frame", name = "frameDA", direction = "horizontal"}
		local tab = frameDA.add{type ="table", name = "tableDA", colspan = 3}
		tab.add{type = "label", name = "DAblank1", caption = " "}
		tab.add{type = "button", name = "buttonDANorth", caption = "N"}
		tab.add{type = "label", name = "DAblank2", caption = " "}
		tab.add{type = "button", name = "buttonDAWest", caption = "W"}
		tab.add{type = "button", name = "buttonDASouth", caption = "S"}
		tab.add{type = "button", name = "buttonDAEast", caption = "E"}
	elseif game.player.gui.left.frameDA then
		game.player.gui.left.frameDA.destroy()
	end
end)

game.onevent(defines.events.onguiclick, function(event)
	if event.element.name == "buttonDANorth" then
		game.player.vehicle.orientation = 0.0
		game.player.print("North")
  elseif event.element.name == "buttonDAWest" then
		game.player.vehicle.orientation = 0.75
		game.player.print("West")
	elseif event.element.name == "buttonDASouth" then
		game.player.vehicle.orientation = 0.5
		game.player.print("South")
	elseif event.element.name == "buttonDAEast" then
		game.player.vehicle.orientation = 0.25
		game.player.print("East")
  end
end)
I just want to make buttons to point the car in a straight line in the direction clicked to make it easier to drive around in bases. I was able to make the GUI appear when the player is in the car and disappears when the player leaves the car. I'm using the prints to test the buttons, but nothing is printing when I click the buttons.

Re: GUI Buttons

Posted: Fri Oct 24, 2014 7:18 am
by Devcod
You can add this little code to your if elseif statement in onguiclick event, before end:

Code: Select all

    else
        game.player.print(event.element.name or "Element missing name!")
It should print you a name of gui element clicked or "Element name missing!" in case it doesn't exists (== nil). It should never be nil, so it will give you name of clicked element - this is first step to see where is your problem.

If it doesn't print anything then your event is not fired when it should be. In this case I do not know anything that may help you.

PS. You should not check if player entered car every tick. It will be checked 60 times a second (and if player is in vehicle then all of your code inside will be done 60 times a second). You can do it every 30 or 60 ticks (0.5 or 1 second). To do so, add one of these to your ontick event:

Code: Select all

if math.mod(event.tick, 30) == 0 then

Code: Select all

if math.mod(event.tick, 60) == 0 then
It need to be new if statement (starting before if game.player.vehicle ... and ending after end in your statement). It is not important as long as you are only testing, but it is good to do it anyway.

Re: GUI Buttons

Posted: Fri Oct 24, 2014 4:47 pm
by Turtle
Thanks for pointing me in the right direction Devcod. I got it working now. Something seemed very off about the way things were coded and didn't make sense to me, but I changed some of the code and now understand it. I'm using

Code: Select all

if game.tick%20 == 0 then
instead of what you suggested because it was throwing me an error about invalid mod. Not sure if I was supposed to change "mod" to the actual mod name, but regardless, got it working. I'm using tick%20 because tick%60 (1 second I believe) was too slow.

I was also using a line I copied from another mod to resolve a crashing issue, but I've deleted that line and added my own way of handling it. It hasn't crashed and works as it should in my initial testing, but I'm going to play with it some more to check for other bugs. If all goes well, I'll release it in the next couple of days. :D

For reference for others having similar issues:
original code I copied from another mod:

Code: Select all

if game.player.gui.left.frameDA ~= nil then game.player.gui.left.frameDA.destroy() end
translated to English: if frameDA exists, then destroy it. Then create the frame again in the next part of the code. That didn't make sense to me, but it was preventing a crash. I've changed it to:

Code: Select all

if game.player.gui.left.frameDA == nil then
translated to English: if frameDA doesn't exist then... create frame

Re: GUI Buttons

Posted: Tue Feb 21, 2017 11:39 pm
by darkfrei
I'm learning GUI now, but it's not enough easy examples. So, I have fixed the one.

Same code, but for 0.14.22:

Code: Select all

script.on_event(defines.events.on_tick, function(event)
	local player = game.players[1] -- bad coded for single player
	if player.vehicle and player.vehicle.valid and player.vehicle.type == "car" then
		if player.gui.left.frameDA ~= nil then 
			player.gui.left.frameDA.destroy() 
		end
		frameDA = player.gui.left.add{type = "frame", name = "frameDA", direction = "horizontal"}
		local tab = frameDA.add{type ="table", name = "tableDA", colspan = 3}
		tab.add{type = "label", name = "DAblank1", caption = " "}
		tab.add{type = "button", name = "buttonDANorth", caption = "N"}
		tab.add{type = "label", name = "DAblank2", caption = " "}
		tab.add{type = "button", name = "buttonDAWest", caption = "W"}
		tab.add{type = "button", name = "buttonDASouth", caption = "S"}
		tab.add{type = "button", name = "buttonDAEast", caption = "E"}
	elseif player.gui.left.frameDA then
		player.gui.left.frameDA.destroy()
	end
end)

script.on_event(defines.events.on_gui_click, function(event)
	local player = game.players[event.player_index]
	if event.element.name == "buttonDANorth" then
		player.vehicle.orientation = 0.0
		player.print("North")
	elseif event.element.name == "buttonDAWest" then
		player.vehicle.orientation = 0.75
		player.print("West")
	elseif event.element.name == "buttonDASouth" then
		player.vehicle.orientation = 0.5
		player.print("South")
	elseif event.element.name == "buttonDAEast" then
		player.vehicle.orientation = 0.25
		player.print("East")
	end
end)
But all buttons do nothing.