aboutsummaryrefslogtreecommitdiff
path: root/init.lua
blob: d73632cc8abafeb4f9d9d1108fb451d02a7ce1fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
-- Farebox mod

-- adds a box that emmits a mesecons signal when the requested
-- quantity is paid. Ideal to charge admission from visitors to your
-- buildings
farebox = {}
function farebox.show_formspec(pos, player)
   local spos = pos.x .. "," ..pos.y .. "," .. pos.z
   local meta = minetest.get_meta(pos)
   local inv = meta:get_inventory()
   local owner = meta:get_string("owner")
   local formspec = ""
   if owner and player:get_player_name()==owner then
      formspec = "size[8,10]"..
	 "label[0.5,0.5; Entrance fee:]"..
	 "list[nodemeta:" .. spos .. ";request;2.5,0.25;1,1;]" ..
	 "button[6,0.25;2,1;open;Open]"..
	 "list[nodemeta:" .. spos .. ";main;0,1.5;8,4]"..
	 "list[current_player;main;0,5.75;8,1;]"..
	 "list[current_player;main;0,7;8,3;8]"..
	 "listring[]"..      default.get_hotbar_bg(0, 4.25)      
   else
      formspec = "size[8,4]"..
	 "label[0.5,1.5; Owner Wants:]"..
	 "item_image_button[2.5,1.25;1,1;"..inv:get_stack("request",1):get_name()..";buy;\n\n\b\b\b\b\b"..inv:get_stack("request",1):get_count() .."]"..
	 "label[3.5,1.5; (Click on the item to pay)]"..
	 "listring[]"..      default.get_hotbar_bg(0, 4.25)
   end
   minetest.after((0.1), function(gui)
	 return minetest.show_formspec(player:get_player_name(), "farebox:"..spos,gui)
			 end, formspec)
end


farebox.rules =
{{x=0,  y=-1,  z=0},
      {x=0,  y=1,  z=0}}

minetest.register_on_player_receive_fields(function(player, form, pressed)

      if string.sub(form,1,string.len("farebox:")) == "farebox:" then
	 local spos = string.sub(form,string.len("farebox:")+1,-1)
	 local pos = minetest.string_to_pos(spos)
	 local pinv=player:get_inventory()
	 local meta = minetest.get_meta(pos)
	 local inv = meta:get_inventory()
	 local open = false
	 if pressed.buy then
	    if pinv:contains_item("main", inv:get_stack("request",1)) and inv:room_for_item("main", inv:get_stack("request",1)) then
	       if not (creative and creative.is_enabled_for
		       and creative.is_enabled_for(player:get_player_name())) then
		  pinv:remove_item("main", inv:get_stack("request",1))
	       end
	       inv:add_item("main", inv:get_stack("request",1))
	       open = true
	    elseif not pinv:contains_item("main", inv:get_stack("request",1)) then
	       minetest.chat_send_player(player:get_player_name(), "You don't have enough items to enter")
	    elseif not inv:room_for_item("main", inv:get_stack("request",1)) then
	       minetest.chat_send_player(player:get_player_name(), "Owner's inventory is full")
	    end
	 end
	 if pressed.open or open then
	    minetest.chat_send_player(player:get_player_name(), "Payment accepted.")
	    mesecon.receptor_on(pos,farebox.rules)
	    minetest.after(3, function (_)
			      mesecon.receptor_off(pos,farebox.rules)

	    end)
	 end
      end
	 
end)



minetest.register_node("farebox:farebox", {
			  description = "Farebox",
			  tiles = {
			     "farebox_side.png", "farebox_side.png",
			     "farebox_side.png", "farebox_side.png",
			     "farebox_side.png", "farebox_front.png"
			  },
			  paramtype2 = "facedir",
			  groups = {cracky=2},
			  legacy_facedir_simple = true,
			  is_ground_content = false,
			  sounds = default.node_sound_stone_defaults(),
			  mesecons = {receptor = {
					 state = mesecon.state.off,
					 rules = farebox.rules
				     }},
			  can_dig = can_dig,
			  after_place_node = function(pos, player, _)
			     local meta = minetest.get_meta(pos)
			     local player_name = player:get_player_name()

			     meta:set_string("owner", player_name)
			     meta:set_string("infotext", "Owned by "..player_name)
			     
			     local inv = meta:get_inventory()
			     inv:set_size("request", 1)
			     inv:set_size("drop", 1)
			     inv:set_size("main", 32)
			  end,

			  on_rightclick = function(pos, node, player, itemstack, pointed_thing)
			     farebox.show_formspec(pos, player)
			  end,
			  
})