From 3306676910b903abf9b9e844dbc1d7c293054979 Mon Sep 17 00:00:00 2001 From: RealBadAngel Date: Mon, 27 Jan 2014 12:15:25 +0100 Subject: [PATCH] Initial waypoints tab upload --- bags.lua | 3 +- datastorage.lua | 83 ++++++++++++++++++++ init.lua | 2 + register.lua | 8 +- textures/ui_cancel_icon.png | Bin 0 -> 3593 bytes textures/ui_ok_icon.png | Bin 0 -> 2427 bytes textures/ui_pencil_icon.png | Bin 0 -> 1258 bytes textures/ui_waypoint_set_icon.png | Bin 0 -> 2036 bytes waypoints.lua | 121 ++++++++++++++++++++++++++++++ 9 files changed, 213 insertions(+), 4 deletions(-) create mode 100644 datastorage.lua create mode 100644 textures/ui_cancel_icon.png create mode 100644 textures/ui_ok_icon.png create mode 100644 textures/ui_pencil_icon.png create mode 100644 textures/ui_waypoint_set_icon.png create mode 100644 waypoints.lua diff --git a/bags.lua b/bags.lua index 2a21d5d..40943eb 100644 --- a/bags.lua +++ b/bags.lua @@ -7,7 +7,8 @@ unified_inventory.register_page("bags", { get_formspec = function(player) local player_name = player:get_player_name() local formspec = "background[0.06,0.99;7.92,7.52;ui_bags_main_form.png]" - formspec = formspec.."label[0,0;Bags]" + formspec = formspec.."image[0,0;1,1;ui_bags_icon.png]" + formspec = formspec.."label[1,0;Bags]" formspec = formspec.."button[0,2;2,0.5;bag1;Bag 1]" formspec = formspec.."button[2,2;2,0.5;bag2;Bag 2]" formspec = formspec.."button[4,2;2,0.5;bag3;Bag 3]" diff --git a/datastorage.lua b/datastorage.lua new file mode 100644 index 0000000..096e35e --- /dev/null +++ b/datastorage.lua @@ -0,0 +1,83 @@ +datastorage={} +datastorage["!registered_players"]={} + +datastorage.save_data = function(table_pointer) + local data = minetest.serialize( datastorage[table_pointer] ) + local path = minetest.get_worldpath().."/datastorage_"..table_pointer..".data" + local file = io.open( path, "w" ) + if( file ) then + file:write( data ) + file:close() + return true + else return nil + end +end + +datastorage.load_data = function(table_pointer) + local path = minetest.get_worldpath().."/datastorage_"..table_pointer..".data" + local file = io.open( path, "r" ) + if( file ) then + local data = file:read("*all") + datastorage[table_pointer] = minetest.deserialize( data ) + file:close() + return true + else return nil + end +end + +datastorage.get_container = function (player, key) + local player_name = player:get_player_name() + local container = datastorage[player_name] + if container[key] == nil then + container[key] = {} + end + datastorage.save_data(player_name) + return container[key] +end + +-- forced save of all player's data +datastorage.save_container = function (player) + local player_name = player:get_player_name() + datastorage.save_data(player_name) +end + + +-- Init +if datastorage.load_data("!registered_players") == nil then + datastorage["!registered_players"]={} + datastorage.save_data("!registered_players") +end + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local registered = nil + for __,tab in ipairs(datastorage["!registered_players"]) do + if tab["player_name"] == player_name then registered = true break end + end + if registered == nil then + local new={} + new["player_name"]=player_name + table.insert(datastorage["!registered_players"],new) + datastorage[player_name]={} + datastorage.save_data("!registered_players") + datastorage.save_data(player_name) + else + datastorage.load_data(player_name) + end +end +) + +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + datastorage.save_data(player_name) + datastorage[player_name] = nil +end +) + +minetest.register_on_shutdown(function() + for __,tab in ipairs(datastorage["!registered_players"]) do + if datastorage[tab["player_name"]] == nil then break end + datastorage.save_data(tab["player_name"]) + end +end +) diff --git a/init.lua b/init.lua index ec4105f..9c9c44c 100644 --- a/init.lua +++ b/init.lua @@ -35,8 +35,10 @@ if creative_inventory then end end +dofile(modpath.."/datastorage.lua") dofile(modpath.."/api.lua") dofile(modpath.."/internal.lua") dofile(modpath.."/callbacks.lua") dofile(modpath.."/register.lua") dofile(modpath.."/bags.lua") +dofile(modpath.."/waypoints.lua") diff --git a/register.lua b/register.lua index 7725aaa..4f258a6 100644 --- a/register.lua +++ b/register.lua @@ -120,7 +120,8 @@ unified_inventory.register_page("craft", { local player_name = player:get_player_name() local formspec = "background[0,1;8,3;ui_crafting_form.png]" formspec = formspec.."background[0,4.5;8,4;ui_main_inventory.png]" - formspec = formspec.."label[0,0;Crafting]" + formspec = formspec.."image[0,0;1,1;ui_craft_icon.png]" + formspec = formspec.."label[1,0;Crafting]" formspec = formspec.."listcolors[#00000000;#00000000]" formspec = formspec.."list[current_player;craftpreview;6,1;1,1;]" formspec = formspec.."list[current_player;craft;2,1;3,3;]" @@ -139,14 +140,15 @@ unified_inventory.register_page("craftguide", { local player_name = player:get_player_name() local formspec = "background[0,1;8,3;ui_craftguide_form.png]" formspec = formspec.."background[0,4.5;8,4;ui_main_inventory.png]" - formspec = formspec.."label[0,0;Crafting Guide]" + formspec = formspec.."image[0,0;1,1;ui_craftguide_icon.png]" + formspec = formspec.."label[1,0;Crafting Guide]" formspec = formspec.."listcolors[#00000000;#00000000]" formspec = formspec.."list[detached:"..player_name.."craftrecipe;output;6,1;1,1;]" formspec = formspec.."label[6,3.35;Method:]" local item_name = unified_inventory.current_item[player_name] local craft = nil if item_name then - formspec = formspec.."textarea[0.3,0.6;10,1;;Result: "..item_name..";]" + formspec = formspec.."textarea[1.3,0.6;10,1;;Result: "..item_name..";]" local alternates = 0 local alternate = unified_inventory.alternate[player_name] local crafts = unified_inventory.crafts_table[item_name] diff --git a/textures/ui_cancel_icon.png b/textures/ui_cancel_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6c36fae4c897c52f5b903e9cf4a5326828c40f69 GIT binary patch literal 3593 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 P00000NkvXXu0mjf{1Li} literal 0 HcmV?d00001 diff --git a/textures/ui_ok_icon.png b/textures/ui_ok_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..779fc3b6f54886f188dcae8b5e4316519203987e GIT binary patch literal 2427 zcmV->3552EP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*e- z4jPf|J{XJjpEaAjv8b}=q6ASiWnX>MmA zNlHf`N>D{dAa*t~DJ&pybzy92ba@~>AUQA!utivt000QCNkle8L8GhdH zJLj&sxyj8+E@4YRmL$U>5dxGNtyLTWt5z)|ZLM0XXwf2eEYqnCjzXP^j$LqcXjPor zvDSqtV~e7O0kK3;VwJ50l0ZV1yKm>5?|b_r&QwK9KoaPb=lA`dd7u04?*Y!@EdIYi zXQELlD`u|Q^?1>NB~F&!+<&AyvA0 zZs|qM3+fl9&S(LD-TzYAhQohe{ZX>@+N2XVnE`_&=R2Xp)imM$nXWlcTr+QR_LFbK znPU9xYi@nRaJe?D_jR|E={6xv3B#0-rU9?lgZykhYLfN6(~D=Xnm%XR z-p_Ivr_p%v`@L&^o-n)T?dj_fhSvi@0tA4FK~ivtLNp>WK0B-I{0C>us(*p#*j^w{ zmw^0v^4syegUk2l4g}K5h7^*d5RgJbN`X>e5rx{rs5cweUwq*u_YzV1^LS262tD)R zx+!K^>gIO)a8bm{z%WcQ31Uyy^{MHro^XW zEjEN8qJHzG5GXK$?AcdHqj};Bv!~5|d?1`d7DC$+&3SC5uaAkox+o_gg#1t38wUJt zALkt@q;Py<>({4V+C)Bb2EsdJ9@u?!=lote`hz|h1w*hYhzJBt8ZPPL604MgM@MF6 zjcWW^K{)>(1LYkO4{Yk*IH}9tw>s|WCR;EY(jdbyAWZ{8O0EhFr|f$Y6aCYETQhb1 zpH75(&;>9v?TNj!(k_UFqnv{zNv7xG{o7CJPW)!)YsEX0+o#zwI~At# zCX&&uqoR{{d}qcDJp&4z=U6;CzNsZw**5u*6@d^0f`HZxCPulph~sZLRF^&fm2(Rl zuNc=bEOjyhjtL>&$+UI&8L9G}=zQ(f0IuJ+`N|J)GTT)xrscJz(K9mf6} zQ-NN%g2VxTkU6N)TikZ_{=#?GHT`|re187Zo6#rH(%v#LY93sYFth%&lO-^qHA86) zLl`V#5`|rrs4brIKy6LU_AirT#|U_>YooVIcg!?=fJ?X_AW4uQuL>gI4{^G*@0^1L zt!q|P+;&gzMpf|H_j`85@>_G8?@st4)p1TSfuS`+YXt_w%N}@-6re;^zC5;g;(DTi zHLQUru?5n$c0n+NBn^PU8X5}1GRY?jV1{UPdwJ^}zYHv0#mt^h=F>L0?&3aI+XXR- zn_4rJVrZ?Q0XBu9sY{ZlyZBJpTeUVkp}h0UR=HyYOrR+VS6AN4nFAV@vIR-%Pdu%m zwF7nlQ~TK)@CDjOyno&D=9_*UeTqu~@UyLdD9!kLuZS42@`RIv?PyX;Ln#I;hD=J~ zJ5rn(X^vmtICt*rr=mRS)-BOLOTCuc^`(-2V!sgwpg3Q8#`rC4Y}VZ01w)~J^A$6ovt5v5Lr zfX{7YjkOo00j$33cXu9&=#I77b8`8n5Udmk!~hhSnTTC*%b+V6ZogthZfWm`zLJWh zH#t0~a!{JV3@`(N6cy_-7@dKm-bmvAeM4L7I>oCES9cnZW(; zm>CS_EG6MYZ7Sh1*g;EYmDB$l?k}4KW+4aLi=F(BMnCtX?=8EPh$2IJ++F|jlMSzn z4Ueg+)Fik+{#!x)0vHTpc8ms8sP)812C9abAQWV zKq&>U$Ap=3^Z0+x|+^Hbb^$v6XXR=N#lR zIWRPg!+D}He9@kU`dJSS=Du;#8`+%~{P^vuu9>$6BPB>$Ddax(fTJ~%(JZEmuOJ)@ z-$CXVAEgGZkqsz$h?tq5=S{S9Q{<&J-Tn>;Wx$peS9jM^_3+xq$_hukIoKQDms%-_ z$m;HjJQ3Rw8}?T0jb%wQO8I>y;=+&F&{RKDppXvTZ?i t{RCwC# z*>7kYWgG|a-~GR9{#^6_lBR0w+Szt6ojQCW+pEby_i9v-;b3gKWpuO@CL4uHp)jZj zg$_G61#!3``bu9+_GTc+pe;;=H7L4{Ze#5h+oeg{PAme+knr&4jRw?>tzJ%a-9*=D z(;NH0)?SCDr@(b&!d!qV;sw<0cn#A_p18w|DOM-}X*j|KW9X@581&ug-0% z5-Pw4P`96N497eTZXiiCrMp{z^>`t&`!%SK`nu5l!Koj|w{4mL1$eDg2Ha7EkMam2 zgX;R%i7nm*PjfSPTU)iV>fICp3h*@Q4!I(sn78qN@Tlfh(hWfK5NYMnd#Kni@3{n9 z1FYdGmeRVzu5d8sd)8AF?_iVg_)Y@ktTejwQfkJw0EPJJ8`nQ^hWs(#bKa8pg-1&; z8^5dFI&WJE>F^_tfG_56_Lsz`63cLJA`YOco$YUTPTCSckFWE4y8_P#4B@B8CPB^R z4k7%v(sE|wS7IH0xXxGK72FmC94mqUD+Bk&<7@aU8Xi3Z8yi56=RACOpe1Ask48SH zD2I*Us}ewm|Cp_JcL%o%KwwHye0nasGV-hV%SP~)2Y3q4yL&_1!-nu$&F5tKNI7^* z1L*KWjLX>@dI90_vhZJ&gSRYz4u6hzIZlV#BF6Aq*~s#-O7NBh(BTJZN8K5rtpP~1 zt1OD27xQ>Y((s>Gf;SyNhaaFET%XWh8o&5NLJ#buhCglwZz_Ne-%oLDzt9$4*%Ft+ zPmkROMU+k={6#bPiUa8IeI&;Y2pv(Ns1o?(fAFJb@f8Ko;m?pPGZ=2y@L&Kxso_sq zg)cjR4u6_p=yQUGr;Fp47UVoWD{A=jR^iJ!6YKEZ1WgTvI~svzFk>U16??44mldD@ z-$hW=u+Ux>{!}&aWd&HpzmHSoi1xrT9By>BsT#hl00@5+C&^E>sgmJ{l8cl!&s#a$ zmi=Xn*sdV-e!aFB?HV}>$w(u z>z)0Od;pwy-{`LLnAz=tCF{V<_a_{xBJT6;ISW+eMG*Zj7d=VYfiJ$0Vc1zFxFds+ zEbzNe0v6~1k@c*5hDG?p8;vhoLO992$wqcL@?mgbBQL>nHVK)W0(5pBoXnH_PahQ= z1FIeYl}{r^aV?amX{9eF5Hd3ll&={i3-*e*!s{I=uQFCm;d$TqyfuHohMEXb*ujGTT9sv^hJ@mqz>%07*qoM6N<$g3H2L@c;k- literal 0 HcmV?d00001 diff --git a/textures/ui_waypoint_set_icon.png b/textures/ui_waypoint_set_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb46e34f1d9b55c37b156b26f1c1c8927702497 GIT binary patch literal 2036 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^f2 z04EawQS|DAH2S~; zkj8{~V}d;RV2BbQBvI1`gT`-dG!oRngOpxAtOU_&qXET_Xs}{5k|=~y+qAdzdQ0!z z_RgJ|bIx8LKFpaixw+g@+R~{z*_qk%anAp@_J6It_W}Oj+mG(sdHFr}-biJ6(AX_{CQnB$5 z`Npj?b31;u^}Uyzg;v_z<2R?*QG4c@bme<~`t&z{zvY=+Iy*1R-njdY>;5(~@&H~Y z2Mg&;bIe7Sj9s<$9XGtQD2neLKE8j)*PrbD29TYNbk*L^eBdwnNCFTMF~3|v)pBr6 zZPOJS!$Xh5t#u7KybJ_gp7i@1(*ehl^i6uww!>) zZC|6CNMML0N^kem19{S{NzWyRuh@3g9Fr6y#tSF%90|e`F@D73$ zFn3lpXbF^|q;6iKD5M!7xg|-XTR#1WPaA~?BE*w-PZa-t9W2B&m;rZp^^z2&g+cT! z=b#-cC5QLLTPPi(%B84@7|g(q(yS!J${Vtz{<$>EKL6Q0^}oB@WR|Sh{k0okJbqyS zm=ML>cMu$EB~%L-a+KCXkPb@8p{`IhgwkMYD8(S9LB&80L@|RR0x>`ld6v|DtiJl% zByL{YEl%y&zBfD`adLlJYyRTS>z|kNnZ&27ki$v6fFNg)94cLuoFCdm%@Sc_4Gc|$3O~p+5qRmRPAO=-45G;ZNv0D^HmL(0;(=kip zhSj1vV#+M$6hvgrbhTZ*Zu||`T=}6-#hmQR%l7WuAH~XZTZ#MDuLe#7--~sjDu6ju zjinTb8l*H9F^B?Y&O`v15fO2kG|jNw>n30eEz_6ubh8? zh#&aj1pamITM2VAH8=ow@j~aQl)^*<91b;O4Q8SS5wM6_P=lE=0AnU_vZRSx)Br$yqJ1QEirFX4Z8C|Qdv7WNvO|sM3Jk z9dNL@_megNBFaGw77VV&27|kU7#zinM%F}{)Vb6y=1(2}r@HQ{Md|KuZ#(hd{#{xZ za5rjBs)j1)?tKU|)j{+*sF{f(sIj=28vp`x1h3U?i|ZB@jem0nh-z4DLo?rCNeh%y>*tOuEK@{K14c5H7-bz|FnNfq{iY zjIA_?8q6GG#$t*z)mL z{tqLY1k*$JOkj4jPGltPR*T#%au7n{m~VIZ&($g`t+q>PJAb7A^z zrqH4cox?LnAA#e3BKq@PH;ZEg+Ohz7{XkO4!tBWnPp#p@>sNhe;@KP{)|LgxdYezK zsjV$rGjHmC;S<|OPW%}GP-Zhx#`DC)m*j&jWk2@`)M~Z3JwJaoJ{m+ls~`q59aYP+4Ryc300g*4=Kg9e zFo=3%$U0u#M~8Y?G7Jz}ON%QgwYbR$CT8RZ06tGGFHZbpR`dB2SCNd-d5;W3IXlfyF~0 zx(LS43ZN(p4_n^8x>7_}Woi0u0P_T# ztRODB_*Yz@wrtt*zSXPO?CW*Ao~9{vyIpTK8g%H;!H*w3c5K(kZ>QITR-;e z+1V3vVE=xbo1I0PB!Auf*3D0i+Ie8vJ