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