kpoppel
2013-07-02 053fa59739f4b772174bf0a090969b3395ab3f98
commit | author | age
773382 1 -- default GUI page
R 2 stargate.default_page = "main"
d01564 3 stargate_network["players"]={}
773382 4 stargate.current_page={}
R 5
d01564 6 stargate.save_data = function(table_pointer)
R 7     local data = minetest.serialize( stargate_network[table_pointer] )
8     local path = minetest.get_worldpath().."/stargate_"..table_pointer..".data"
773382 9     local file = io.open( path, "w" )
R 10     if( file ) then
11         file:write( data )
12         file:close()
13         return true
14     else return nil
15     end
16 end
17
d01564 18 stargate.restore_data = function(table_pointer)
R 19     local path = minetest.get_worldpath().."/stargate_"..table_pointer..".data"
773382 20     local file = io.open( path, "r" )
R 21     if( file ) then
22         local data = file:read("*all")
d01564 23         stargate_network[table_pointer] = minetest.deserialize( data )
773382 24         file:close()
R 25     return true
26     else return nil
27     end
28 end
29
30 -- load Stargates network data
d01564 31 if stargate.restore_data("registered_players") ~= nil then
R 32     for __,tab in ipairs(stargate_network["registered_players"]) do
33         if stargate.restore_data(tab["player_name"]) == nil  then
34             print ("[stargate] Error loading data!")
35         end
773382 36     end
d01564 37 else
R 38     print ("[stargate] Error loading data! Creating new file.")
39     stargate_network["registered_players"]={}
40     stargate.save_data("registered_players")
773382 41 end
R 42
43 -- register_on_joinplayer
44 minetest.register_on_joinplayer(function(player)
45     local player_name = player:get_player_name()
d01564 46     local registered=nil
R 47     for __,tab in ipairs(stargate_network["registered_players"]) do
48         if tab["player_name"] ==  player_name then registered = true break end
49     end
50     if registered == nil then
51         local new={}
52         new["player_name"]=player_name
53         table.insert(stargate_network["registered_players"],new)
1d101c 54         stargate_network[player_name]={}
d01564 55         stargate.save_data("registered_players")
R 56         stargate.save_data(player_name)
57     end
58     stargate_network["players"][player_name]={}
59     stargate_network["players"][player_name]["formspec"]=""
60     stargate_network["players"][player_name]["current_page"]=stargate.default_page
61     stargate_network["players"][player_name]["own_gates"]={}
62     stargate_network["players"][player_name]["own_gates_count"]=0
63     stargate_network["players"][player_name]["public_gates"]={}
64     stargate_network["players"][player_name]["public_gates_count"]=0
65     stargate_network["players"][player_name]["current_index"]=0
e7b7eb 66     stargate_network["players"][player_name]["temp_gate"]={}
773382 67 end)
R 68
92c9f6 69 stargate.registerGate = function(player_name,pos,dir)
773382 70     if stargate_network[player_name]==nil then
R 71         stargate_network[player_name]={}
72     end
73     local new_gate ={}
74     new_gate["pos"]=pos
75     new_gate["type"]="private"
76     new_gate["description"]=""
92c9f6 77     new_gate["dir"]=dir
1d101c 78     new_gate["owner"]=player_name
773382 79     table.insert(stargate_network[player_name],new_gate)
d01564 80     if stargate.save_data(player_name)==nil then
773382 81         print ("[stargate] Couldnt update network file!")
R 82     end
83 end
84
85 stargate.unregisterGate = function(player_name,pos)
86     for __,gates in ipairs(stargate_network[player_name]) do
87         if gates["pos"].x==pos.x and gates["pos"].y==pos.y and gates["pos"].z==pos.z then
88             table.remove(stargate_network[player_name], __)
89             break
90         end
91     end
d01564 92     if stargate.save_data(player_name)==nil then
773382 93         print ("[stargate] Couldnt update network file!")
R 94     end
95 end
96
1d101c 97 stargate.findGate = function(pos)
R 98     for __,tab in ipairs(stargate_network["registered_players"]) do
99         local player_name=tab["player_name"]
100         if type(stargate_network[player_name])=="table" then
101             for __,gates in ipairs(stargate_network[player_name]) do
102                 if gates then 
103                     if gates["pos"].x==pos.x and gates["pos"].y==pos.y and gates["pos"].z==pos.z then
104                         return gates
105                     end
106                 end
107             end
92c9f6 108         end
R 109     end
110     return nil
111 end
112
773382 113 --show formspec to player
R 114 stargate.gateFormspecHandler = function(pos, node, clicker, itemstack)
115     local player_name = clicker:get_player_name()
116     local meta = minetest.env:get_meta(pos)
117     local owner=meta:get_string("owner")
118     if player_name~=owner then return end
119     local current_gate=nil
d01564 120     stargate_network["players"][player_name]["own_gates"]={}
R 121     stargate_network["players"][player_name]["public_gates"]={}
773382 122     local own_gates_count=0
1d101c 123     local public_gates_count=0
R 124
773382 125     for __,gates in ipairs(stargate_network[player_name]) do
R 126         if gates["pos"].x==pos.x and gates["pos"].y==pos.y and gates["pos"].z==pos.z then
127             current_gate=gates
128         else
129         own_gates_count=own_gates_count+1
d01564 130         table.insert(stargate_network["players"][player_name]["own_gates"],gates)
773382 131         end
R 132     end
d01564 133     stargate_network["players"][player_name]["own_gates_count"]=own_gates_count
1d101c 134
R 135     -- get all public gates
136     for __,tab in ipairs(stargate_network["registered_players"]) do
137         local temp=tab["player_name"]
138         if type(stargate_network[temp])=="table" and temp~=player_name then
139             for __,gates in ipairs(stargate_network[temp]) do
140                 if gates["type"]=="public" then 
141                     public_gates_count=public_gates_count+1
142                     table.insert(stargate_network["players"][player_name]["public_gates"],gates)
143                     end
144                 end
145             end
146         end
147
148     print(dump(stargate_network["players"][player_name]["public_gates"]))
773382 149     if current_gate==nil then 
R 150         print ("Gate not registered in network! Please remove it and place once again.")
151         return nil
152     end
d01564 153     stargate_network["players"][player_name]["current_index"]=0
e7b7eb 154     stargate_network["players"][player_name]["temp_gate"]["type"]=current_gate["type"]
R 155     stargate_network["players"][player_name]["temp_gate"]["description"]=current_gate["description"]
156     stargate_network["players"][player_name]["temp_gate"]["pos"]={}
157     stargate_network["players"][player_name]["temp_gate"]["pos"].x=current_gate["pos"].x
158     stargate_network["players"][player_name]["temp_gate"]["pos"].y=current_gate["pos"].y
159     stargate_network["players"][player_name]["temp_gate"]["pos"].z=current_gate["pos"].z
160     if current_gate["destination"] then 
161         stargate_network["players"][player_name]["temp_gate"]["destination_description"]=current_gate["destination_description"]
92c9f6 162         stargate_network["players"][player_name]["temp_gate"]["destination_dir"]=current_gate["destination_dir"]
e7b7eb 163         stargate_network["players"][player_name]["temp_gate"]["destination"]={}
R 164         stargate_network["players"][player_name]["temp_gate"]["destination"].x=current_gate["destination"].x
165         stargate_network["players"][player_name]["temp_gate"]["destination"].y=current_gate["destination"].y
166         stargate_network["players"][player_name]["temp_gate"]["destination"].z=current_gate["destination"].z
167     else
168         stargate_network["players"][player_name]["temp_gate"]["destination"]=nil
169     end
d01564 170     stargate_network["players"][player_name]["current_gate"]=current_gate
R 171     stargate_network["players"][player_name]["dest_type"]="own"
773382 172     local formspec=stargate.get_formspec(player_name,"main")
d01564 173     stargate_network["players"][player_name]["formspec"]=formspec
R 174     if formspec ~=nil then minetest.show_formspec(player_name, "stargate_main", formspec) end
773382 175 end
R 176
177 -- get_formspec
178 stargate.get_formspec = function(player_name,page)
d01564 179     if player_name==nil then return nil end
R 180     stargate_network["players"][player_name]["current_page"]=page
e7b7eb 181     local temp_gate=stargate_network["players"][player_name]["temp_gate"]
773382 182     local formspec = "size[14,10]"
R 183     --background
184     formspec = formspec .."background[-0.19,-0.2,;14.38,10.55;ui_form_bg.png]"
e7b7eb 185     formspec = formspec.."label[0,0.0;Stargate DHD]"
R 186     formspec = formspec.."label[0,.5;Position: ("..temp_gate["pos"].x..","..temp_gate["pos"].y..","..temp_gate["pos"].z..")]"
773382 187     formspec = formspec.."image_button[3.5,.6;.6,.6;toggle_icon.png;toggle_type;]"
e7b7eb 188     formspec = formspec.."label[4,.5;Type: "..temp_gate["type"].."]"
773382 189     formspec = formspec.."image_button[6.5,.6;.6,.6;pencil_icon.png;edit_desc;]"
R 190     formspec = formspec.."label[0,1.1;Destination: ]"
e7b7eb 191     if temp_gate["destination"] then 
R 192         formspec = formspec.."label[2.5,1.1;("..temp_gate["destination"].x..","
193                                               ..temp_gate["destination"].y..","
194                                               ..temp_gate["destination"].z..") "
195                                               ..temp_gate["destination_description"].."]"
196         formspec = formspec.."image_button[2,1.2;.6,.6;cancel_icon.png;remove_dest;]"
197     else
198     formspec = formspec.."label[2,1.1;Not connected]"
199     end
773382 200     formspec = formspec.."label[0,1.7;Aviable destinations:]"
R 201     formspec = formspec.."image_button[3.5,1.8;.6,.6;toggle_icon.png;toggle_dest_type;]"
d01564 202     formspec = formspec.."label[4,1.7;Filter: "..stargate_network["players"][player_name]["dest_type"].."]"
773382 203
R 204     if page=="main" then
205     formspec = formspec.."image_button[6.5,.6;.6,.6;pencil_icon.png;edit_desc;]"
e7b7eb 206     formspec = formspec.."label[7,.5;Description: "..temp_gate["description"].."]"
773382 207     end
R 208     if page=="edit_desc" then
209     formspec = formspec.."image_button[6.5,.6;.6,.6;ok_icon.png;save_desc;]"
e7b7eb 210     formspec = formspec.."field[7.3,.7;5,1;desc_box;Edit gate description:;"..temp_gate["description"].."]"
773382 211     end
R 212     
d01564 213     local list_index=stargate_network["players"][player_name]["current_index"]
832137 214     local page=math.floor(list_index / 24 + 1)
1d101c 215     local pagemax
R 216     if stargate_network["players"][player_name]["dest_type"] == "own" then 
217         pagemax = math.floor((stargate_network["players"][player_name]["own_gates_count"] / 24) + 1)
218         local x,y
219         for y=0,7,1 do
220         for x=0,2,1 do
221             local gate_temp=stargate_network["players"][player_name]["own_gates"][list_index+1]
222             if gate_temp then
223                 formspec = formspec.."image_button["..(x*4.5)..","..(2.5+y*.87)..";.6,.6;stargate_icon.png;list_button"..list_index..";]"
224                 formspec = formspec.."label["..(x*4.5+.5)..","..(2.3+y*.87)..";("..gate_temp["pos"].x..","..gate_temp["pos"].y..","..gate_temp["pos"].z..") "..gate_temp["type"].."]"
225                 formspec = formspec.."label["..(x*4.5+.5)..","..(2.7+y*.87)..";"..gate_temp["description"].."]"
226             end
227             list_index=list_index+1
773382 228         end
1d101c 229         end
R 230     else
231         pagemax = math.floor((stargate_network["players"][player_name]["public_gates_count"] / 24) + 1)
232         local x,y
233         for y=0,7,1 do
234         for x=0,2,1 do
235             local gate_temp=stargate_network["players"][player_name]["public_gates"][list_index+1]
236             if gate_temp then
237                 formspec = formspec.."image_button["..(x*4.5)..","..(2.5+y*.87)..";.6,.6;stargate_icon.png;list_button"..list_index..";]"
238                 formspec = formspec.."label["..(x*4.5+.5)..","..(2.3+y*.87)..";("..gate_temp["pos"].x..","..gate_temp["pos"].y..","..gate_temp["pos"].z..") "..gate_temp["owner"].."]"
239                 formspec = formspec.."label["..(x*4.5+.5)..","..(2.7+y*.87)..";"..gate_temp["description"].."]"
240             end
241             list_index=list_index+1
242         end
243         end
773382 244     end
1d101c 245     formspec=formspec.."label[7.5,1.7;Page: "..page.." of "..pagemax.."]"
d01564 246     formspec = formspec.."image_button[6.5,1.8;.6,.6;left_icon.png;page_left;]"
R 247     formspec = formspec.."image_button[6.9,1.8;.6,.6;right_icon.png;page_right;]"
e7b7eb 248     formspec = formspec.."image_button_exit[6.1,9.3;.8,.8;ok_icon.png;save_changes;]"
R 249     formspec = formspec.."image_button_exit[7.1,9.3;.8,.8;cancel_icon.png;discard_changes;]"
773382 250     return formspec
R 251 end
252
253 -- register_on_player_receive_fields
254 minetest.register_on_player_receive_fields(function(player, formname, fields)
832137 255     if not formname == "stargate_main" then return "" end
773382 256     local player_name = player:get_player_name()
e7b7eb 257     local temp_gate=stargate_network["players"][player_name]["temp_gate"]
d01564 258     local current_gate=stargate_network["players"][player_name]["current_gate"]
773382 259     local formspec
R 260
261     if fields.toggle_type then
e7b7eb 262         if temp_gate["type"] == "private" then 
R 263             temp_gate["type"] = "public"
264         else temp_gate["type"] = "private" end
1d101c 265         stargate_network["players"][player_name]["current_index"]=0
773382 266         formspec= stargate.get_formspec(player_name,"main")
d01564 267         stargate_network["players"][player_name]["formspec"] = formspec
832137 268         minetest.show_formspec(player_name, "stargate_main", formspec)
773382 269         minetest.sound_play("click", {to_player=player_name, gain = 0.5})
R 270         return
271     end
272     if fields.toggle_dest_type then
1d101c 273         if stargate_network["players"][player_name]["dest_type"] == "own" then 
d01564 274             stargate_network["players"][player_name]["dest_type"] = "all public"
1d101c 275         else stargate_network["players"][player_name]["dest_type"] = "own" end
d01564 276         stargate_network["players"][player_name]["current_index"] = 0
R 277         formspec = stargate.get_formspec(player_name,"main")
278         stargate_network["players"][player_name]["formspec"] = formspec
832137 279         minetest.show_formspec(player_name, "stargate_main", formspec)
773382 280         minetest.sound_play("click", {to_player=player_name, gain = 0.5})
R 281         return
282     end
283     if fields.edit_desc then
284         formspec= stargate.get_formspec(player_name,"edit_desc")
d01564 285         stargate_network["players"][player_name]["formspec"]=formspec
832137 286         minetest.show_formspec(player_name, "stargate_main", formspec)
773382 287         minetest.sound_play("click", {to_player=player_name, gain = 0.5})
R 288         return
289     end
290
291     if fields.save_desc then
e7b7eb 292         temp_gate["description"]=fields.desc_box
773382 293         formspec= stargate.get_formspec(player_name,"main")
d01564 294         stargate_network["players"][player_name]["formspec"]=formspec
832137 295         minetest.show_formspec(player_name, "stargate_main", formspec)
773382 296         minetest.sound_play("click", {to_player=player_name, gain = 0.5})
R 297         return
298     end
d01564 299     
R 300     -- page controls
832137 301     local start=math.floor(stargate_network["players"][player_name]["current_index"]/24 +1 )
d01564 302     local start_i=start
832137 303     local pagemax = math.floor(((stargate_network["players"][player_name]["own_gates_count"]-1) / 24) + 1)
d01564 304     
R 305     if fields.page_left then
306         minetest.sound_play("paperflip2", {to_player=player_name, gain = 1.0})
307         start_i = start_i - 1
308         if start_i < 1 then    start_i = 1    end
309         if not (start_i    == start) then
832137 310             stargate_network["players"][player_name]["current_index"] = (start_i-1)*24
d01564 311             formspec = stargate.get_formspec(player_name,"main")
R 312             stargate_network["players"][player_name]["formspec"] = formspec
832137 313             minetest.show_formspec(player_name, "stargate_main", formspec)
d01564 314         end
R 315     end
316     if fields.page_right then
317         minetest.sound_play("paperflip2", {to_player=player_name, gain = 1.0})
318         start_i = start_i + 1 
319         if start_i > pagemax then start_i =  pagemax end
320         if not (start_i    == start) then
832137 321             stargate_network["players"][player_name]["current_index"] = (start_i-1)*24
d01564 322             formspec = stargate.get_formspec(player_name,"main")
R 323             stargate_network["players"][player_name]["formspec"] = formspec
832137 324             minetest.show_formspec(player_name, "stargate_main", formspec)
d01564 325         end
R 326     end
e7b7eb 327
R 328     if fields.remove_dest then
329         minetest.sound_play("click", {to_player=player_name, gain = 0.5})
330         temp_gate["destination"]=nil
331         temp_gate["destination_description"]=nil
332         formspec = stargate.get_formspec(player_name,"main")
333         stargate_network["players"][player_name]["formspec"] = formspec
334         minetest.show_formspec(player_name, "stargate_main", formspec)
335     end
336
337     if fields.save_changes then
338         minetest.sound_play("click", {to_player=player_name, gain = 0.5})
1d101c 339         local meta = minetest.env:get_meta(temp_gate["pos"])
R 340         local infotext=""
e7b7eb 341         current_gate["type"]=temp_gate["type"]
R 342         current_gate["description"]=temp_gate["description"]
343         current_gate["pos"]={}
344         current_gate["pos"].x=temp_gate["pos"].x
345         current_gate["pos"].y=temp_gate["pos"].y
346         current_gate["pos"].z=temp_gate["pos"].z
92c9f6 347         current_gate["dest"]=temp_gate["dest"]
e7b7eb 348         if temp_gate["destination"] then 
R 349             current_gate["destination"]={}
350             current_gate["destination"].x=temp_gate["destination"].x
351             current_gate["destination"].y=temp_gate["destination"].y
352             current_gate["destination"].z=temp_gate["destination"].z
92c9f6 353             current_gate["destination_description"]=temp_gate["destination_description"]
R 354             current_gate["destination_dir"]=temp_gate["destination_dir"]
e7b7eb 355         else
R 356             current_gate["destination"]=nil
357         end
358         if current_gate["destination"] then 
1d101c 359             activateGate (current_gate["pos"])
e7b7eb 360         else
1d101c 361             deactivateGate (current_gate["pos"])
e7b7eb 362         end
1d101c 363         if current_gate["type"]=="private" then infotext="Private"    else infotext="Public" end
R 364         infotext=infotext.." Gate: "..current_gate["description"].."\n"
365         infotext=infotext.."Owned by "..player_name.."\n"
366         if current_gate["destination"] then 
989b35 367             infotext=infotext.."Destination: ("..current_gate["destination"].x..","..current_gate["destination"].y..","..current_gate["destination"].z..") "
1d101c 368             infotext=infotext..current_gate["destination_description"]
R 369         end
370         meta:set_string("infotext",infotext)
e7b7eb 371         if stargate.save_data(player_name)==nil then
R 372             print ("[stargate] Couldnt update network file!")
373         end
374     end
375
376     if fields.discard_changes then
377         minetest.sound_play("click", {to_player=player_name, gain = 0.5})
378     end
379
832137 380     local list_index=stargate_network["players"][player_name]["current_index"]
R 381     local i
382     for i=0,23,1 do
383     local button="list_button"..i+list_index
384     if fields[button] then 
92c9f6 385         minetest.sound_play("click", {to_player=player_name, gain = 1.0})
e7b7eb 386         local gate=stargate_network["players"][player_name]["temp_gate"]
1d101c 387         local dest_gate
R 388         if stargate_network["players"][player_name]["dest_type"] == "own" then
389             dest_gate=stargate_network["players"][player_name]["own_gates"][list_index+i+1]
390         else
391             dest_gate=stargate_network["players"][player_name]["public_gates"][list_index+i+1]
392         end
832137 393         gate["destination"]={}
R 394         gate["destination"].x=dest_gate["pos"].x
395         gate["destination"].y=dest_gate["pos"].y
396         gate["destination"].z=dest_gate["pos"].z
e7b7eb 397         gate["destination_description"]=dest_gate["description"]
92c9f6 398         gate["destination_dir"]=dest_gate["dir"]
e7b7eb 399         formspec = stargate.get_formspec(player_name,"main")
R 400         stargate_network["players"][player_name]["formspec"] = formspec
401         minetest.show_formspec(player_name, "stargate_main", formspec)
832137 402     end
R 403     end
773382 404 end)