init.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. -- API Documentation can be found in README.txt
  2. guideBooks = {}
  3. local c = {}
  4. guideBooks.registered = {}
  5. guideBooks.indices = {}
  6. guideBooks.locks={}
  7. local genSecList=function(reg, meta, reader, book, def)
  8. if not reg.sections.Main.Pages.Index.registered then
  9. local y=0.5
  10. local x=1
  11. local num=0
  12. local form=reg.pageTmp
  13. for _,v in pairs(reg.sectionOrder) do
  14. local _ = v
  15. local v= reg.sections[_]
  16. if _ ~= "Main" and _ ~= "Hidden" and not v.hidden and not v.slave and v.isUnLocked(reader, book:get_name(), _) then
  17. if def.ptype then
  18. if v.master then
  19. form=form.."style[gotoM_".._..";border=false]image_button["..x..","..y..";"..((def.style.page.w)-2)..",0.7;"..def.style.buttonGeneric..";gotoM_".._..";"..(v.description or _).."]"
  20. y=y+0.6
  21. num=num+1
  22. else
  23. form=form.."style[goto_".._..";border=false]image_button["..x..","..y..";"..((def.style.page.w)-2)..",0.7;"..def.style.buttonGeneric..";goto_".._..";"..(v.description or _).."]"
  24. y=y+0.6
  25. num=num+1
  26. end
  27. else
  28. if v.master then
  29. form=form.."style[gotoM_".._..";border=false]image_button["..x..","..y..";"..((def.style.page.w/2)-2)..",0.5;"..def.style.buttonGeneric..";gotoM_".._..";"..(v.description or _).."]"
  30. y=y+0.6
  31. num=num+1
  32. if num>13 then x=(def.style.page.w/2)+1 y=-0.1 num=0 end
  33. else
  34. form=form.."style[goto_".._..";border=false]image_button["..x..","..y..";"..((def.style.page.w/2)-2)..",0.5;"..def.style.buttonGeneric..";goto_".._..";"..(v.description or _).."]"
  35. y=y+0.6
  36. num=num+1
  37. if num>13 then x=(def.style.page.w/2)+1 y=-0.1 num=0 end
  38. end
  39. end
  40. end
  41. end
  42. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), form)
  43. meta:set_string("guidebooks:place", "Main:Index")
  44. else
  45. local form=reg.sections.Main.Pages.Index.form
  46. if reg.sections.Main.Pages.Index.text1 then form=form.."textarea[0.5,0.5;"..((def.style.page.w/2)-1)..","..(def.style.page.h-1)..";;;"..reg.sections.Main.Pages.Index.text1.."]" end
  47. if reg.sections.Main.Pages.Index.text2 then form=form.."textarea["..((def.style.page.w/2)+0.5)..",0.5;"..((def.style.page.w/2)-0.5)..","..(def.style.page.h-1)..";;;"..reg.sections.Main.Pages.Index.text2.."]" end
  48. form=form..reg.prevTmp
  49. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), form)
  50. meta:set_string("guidebooks:place", "Main:Index")
  51. end
  52. end
  53. c.register_guideBook = function(name, def)
  54. local _def = {}
  55. _def.ptype=def.pad_type or def.ptype or false
  56. _def.description=def.description_short or string.split(name, ":")[1].." Guidebook"
  57. if def.description_long then _def.description=_def.description.."\n"..def.description_long end
  58. _def.inventory_image=def.inventory_image or "guidebooks_book.png"
  59. _def.wield_image=def.wield_image or _def.inventory_image
  60. _def.stack_max=1
  61. _def.style={}
  62. if def.style.cover then
  63. _def.style.cover={w=def.style.cover.w or 5, h=def.style.cover.h or 8, bg=def.style.cover.bg or "guidebooks_cover.png", next=def.style.cover.next or "guidebooks_nxtBtn.png"}
  64. else
  65. _def.style.cover={w=5, h=8, bg="guidebooks_cover.png", next="guidebooks_nxtBtn.png"}
  66. end
  67. if def.style.page then
  68. local textcolor = def.style.page.textcolor
  69. _def.style.page={w=def.style.page.w or 10, h=def.style.page.h or 8, bg=def.style.page.bg or "guidebooks_bg.png", next=def.style.page.next or "guidebooks_nxtBtn.png",
  70. prev=def.style.page.prev or "guidebooks_prvBtn.png", begn=def.style.page.start or "guidebooks_bgnBtn.png", textcolor=textcolor or "white",
  71. label_textcolor=def.style.page.label_textcolor or textcolor}
  72. else
  73. _def.style.page= {w=10, h=8, bg="guidebooks_bg.png", next="guidebooks_nxtBtn.png", prev="guidebooks_prvBtn.png", begn="guidebooks_bgnBtn.png", textcolor="white", label_textcolor = "white"}
  74. end
  75. _def.style.buttonGeneric=def.style.buttonGeneric or "guidebooks_bscBtn.png"
  76. _def.groups={book=1, guide=1, flammable=1}
  77. minetest.register_craft({
  78. type="fuel",
  79. recipe=name,
  80. burntime=30
  81. })
  82. _def.on_use=function(book, reader, pointed_thing)
  83. local meta=book:get_meta()
  84. local def=minetest.registered_items[book:get_name()]
  85. local reg=guideBooks.registered[book:get_name()]
  86. meta:set_string("guidebooks:place", nil)
  87. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), reg.coverTmp)
  88. return book
  89. end
  90. if def.droppable~=nil and def.droppable==false then
  91. _def.on_drop=function() end
  92. end
  93. minetest.register_on_player_receive_fields(function(reader, formname, fields)
  94. local book=reader:get_wielded_item()
  95. local meta=book:get_meta()
  96. if formname=="guideBooks:book_"..book:get_name() then
  97. local def=minetest.registered_items[book:get_name()]
  98. local reg=guideBooks.registered[book:get_name()]
  99. local seg=string.split(meta:get_string("guidebooks:place"), ":")
  100. if fields.beginning then
  101. genSecList(reg, meta, reader, book, def)
  102. elseif fields.next then
  103. if #seg == 2 then
  104. local pn=tonumber(seg[2])
  105. if type(pn)=="number" then
  106. pn=pn+1
  107. if reg.sections[seg[1]] then
  108. if reg.sections[seg[1]].Pages[pn] then
  109. local form=reg.sections[seg[1]].Pages[pn].form
  110. if reg.ptype then
  111. if reg.sections[seg[1]].Pages[pn].text1 then form=form.."textarea[0.5,0.5;"..((def.style.page.w))..","..(def.style.page.h-1)..";;;"..reg.sections[seg[1]].Pages[pn].text1.."]" end
  112. else
  113. if reg.sections[seg[1]].Pages[pn].text1 then form=form.."textarea[0.5,0.5;"..((def.style.page.w/2)-1)..","..(def.style.page.h-1)..";;;"..reg.sections[seg[1]].Pages[pn].text1.."]" end
  114. if reg.sections[seg[1]].Pages[pn].text2 then form=form.."textarea["..((def.style.page.w/2)+0.5)..",0.5;"..((def.style.page.w/2)-0.5)..","..(def.style.page.h-1)..";;;"..reg.sections[seg[1]].Pages[pn].text2.."]" end
  115. end
  116. if reg.sections[seg[1]].Pages[pn+1] then
  117. form=form..reg.nextTmp
  118. end
  119. if reg.sections[seg[1]].Pages[pn-1] then
  120. form=form..reg.prevTmp
  121. end
  122. meta:set_string("guidebooks:place", seg[1]..":"..pn)
  123. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), form)
  124. else
  125. meta:set_string("guidebooks:place", nil)
  126. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), reg.coverTmp)
  127. end
  128. else
  129. meta:set_string("guidebooks:place", nil)
  130. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), reg.coverTmp)
  131. end
  132. else
  133. meta:set_string("guidebooks:place", nil)
  134. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), reg.coverTmp)
  135. end
  136. else
  137. genSecList(reg, meta, reader, book, def)
  138. end
  139. minetest.after(0, function()reader:set_wielded_item(book)end)
  140. elseif fields.prev then
  141. if #seg == 2 then
  142. local pn=tonumber(seg[2])
  143. if type(pn)=="number" then
  144. pn=pn-1
  145. if reg.sections[seg[1]] then
  146. if reg.sections[seg[1]].Pages[pn] then
  147. local form=reg.sections[seg[1]].Pages[pn].form
  148. if reg.ptype then
  149. if reg.sections[seg[1]].Pages[pn].text1 then form=form.."textarea[0.5,0.5;"..((def.style.page.w))..","..(def.style.page.h-1)..";;;"..reg.sections[seg[1]].Pages[pn].text1.."]" end
  150. else
  151. if reg.sections[seg[1]].Pages[pn].text1 then form=form.."textarea[0.5,0.5;"..((def.style.page.w/2)-1)..","..(def.style.page.h-1)..";;;"..reg.sections[seg[1]].Pages[pn].text1.."]" end
  152. if reg.sections[seg[1]].Pages[pn].text2 then form=form.."textarea["..((def.style.page.w/2)+0.5)..",0.5;"..((def.style.page.w/2)-0.5)..","..(def.style.page.h-1)..";;;"..reg.sections[seg[1]].Pages[pn].text2.."]" end
  153. end
  154. if reg.sections[seg[1]].Pages[pn+1] then
  155. form=form..reg.nextTmp
  156. end
  157. if reg.sections[seg[1]].Pages[pn-1] then
  158. form=form..reg.prevTmp
  159. end
  160. meta:set_string("guidebooks:place", seg[1]..":"..pn)
  161. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), form)
  162. else
  163. if meta:get_string("guidebooks:place")=="Main:Index" then
  164. meta:set_string("guidebooks:place", nil)
  165. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), reg.coverTmp)
  166. else
  167. genSecList(reg, meta, reader, book, def)
  168. end
  169. end
  170. else
  171. if meta:get_string("guidebooks:place")=="Main:Index" then
  172. meta:set_string("guidebooks:place", nil)
  173. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), reg.coverTmp)
  174. else
  175. genSecList(reg, meta, reader, book, def)
  176. end
  177. end
  178. else
  179. if meta:get_string("guidebooks:place")=="Main:Index" then
  180. meta:set_string("guidebooks:place", nil)
  181. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), reg.coverTmp)
  182. else
  183. genSecList(reg, meta, reader, book, def)
  184. end
  185. end
  186. end
  187. reader:set_wielded_item(book)
  188. else
  189. for _,v in pairs(reg.sections) do
  190. if fields["goto_".._] then
  191. if v.Pages[1] then
  192. local form=v.Pages[1].form
  193. if reg.ptype then
  194. if v.Pages[1].text1 then form=form.."textarea[0.5,0.5;"..((def.style.page.w))..","..(def.style.page.h-0.5)..";;;"..v.Pages[1].text1.."]" end
  195. else
  196. if v.Pages[1].text1 then form=form.."textarea[0.5,0.5;"..((def.style.page.w/2)-1)..","..(def.style.page.h-0.5)..";;;"..v.Pages[1].text1.."]" end
  197. if v.Pages[1].text2 then form=form.."textarea["..((def.style.page.w/2)+0.5)..",0.5;"..((def.style.page.w/2)-0.5)..","..(def.style.page.h-0.5)..";;;"..v.Pages[1].text2.."]" end
  198. end
  199. if v.Pages[2] then
  200. form=form..reg.nextTmp
  201. end
  202. meta:set_string("guidebooks:place", _..":".."1")
  203. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), form)
  204. end
  205. end
  206. if fields["gotoM_".._] then
  207. if v.master then
  208. if guideBooks.indices[book:get_name().._] then
  209. local y=0.5
  210. local x=1
  211. local num=0
  212. local form=reg.pageTmp
  213. for __,v in pairs(reg.sections) do
  214. if v.slave and v.slave==_ and not v.hidden and v.isUnLocked(reader, book:get_name(), __) then
  215. form=form.."style[goto_"..__..";border=false]image_button["..x..","..y..";"..((def.style.page.w/2)-2)..",0.5;"..def.style.buttonGeneric..";goto_"..__..";"..(v.description or _).."]"
  216. y=y+0.6
  217. num=num+1
  218. if num>13 then x=(def.style.page.w/2)+1 y=-0.1 num=0 end
  219. end
  220. end
  221. minetest.show_formspec(reader:get_player_name(), "guideBooks:book_"..book:get_name(), form)
  222. meta:set_string("guidebooks:place", "Sub:Index")
  223. end
  224. end
  225. end
  226. end
  227. reader:set_wielded_item(book)
  228. end
  229. end
  230. end)
  231. local cover=""..
  232. "size[".._def.style.cover.w..",".._def.style.cover.h.."]"..
  233. "background[0,0;0,0;".._def.style.cover.bg..";true]"..
  234. "style[next;border=false]"..
  235. "image_button["..(_def.style.cover.w-0.7)..","..(_def.style.cover.h-0.5)..";1,1;".._def.style.cover.next..";next;]"
  236. local page=""..
  237. "size[".._def.style.page.w..",".._def.style.page.h.."]"..
  238. "background[0,0;0,0;".._def.style.page.bg..";true]"..
  239. "style[beginning;border=false]image_button[-0.3,-0.3;1,1;".._def.style.page.begn..";beginning;]"..
  240. "style_type[textarea;textcolor=".._def.style.page.textcolor.."]" ..
  241. "style_type[image_button;textcolor=".._def.style.page.label_textcolor.."]"
  242. local next="style[next;border=false]image_button["..(_def.style.page.w-0.7)..","..(_def.style.page.h-0.5)..";1,1;".._def.style.page.next..";next;]"
  243. local prev="style[prev;border=false]image_button[0,"..(_def.style.page.h-0.5)..";1,1;".._def.style.page.prev..";prev;]"
  244. local begn="style[beginning;border=false]image_button[-0.3,-0.3;1,1;".._def.style.page.begn..";beginning;]"
  245. guideBooks.registered[name]={coverTmp=cover, pageTmp=page, nextTmp=next, prevTmp=prev, begnTmp=begn, sections={Main={Pages={Index={}}}, Hidden={Pages={}}}, sectionOrder={}, ptype=_def.ptype}
  246. minetest.register_craftitem(name, _def)
  247. end
  248. c.register_section = function(book, name, def)
  249. if guideBooks.registered[book] then
  250. def.Pages = def.Pages or {}
  251. if def.Pages.Index then
  252. def.Pages.Index.Registered=true
  253. end
  254. def.name=name
  255. if def.slave and def.master then error("Attempt to register slave as index") end
  256. if def.slave then
  257. if guideBooks.registered[book].sections[def.slave] and guideBooks.registered[book].sections[def.slave].master and guideBooks.indices[book..def.slave] then
  258. guideBooks.indices[book..def.slave][name]=def
  259. else
  260. error("Attempt to register slave to non-existent master")
  261. end
  262. end
  263. if def.master then
  264. guideBooks.indices[book..name]={}
  265. end
  266. def.name=name
  267. def.isUnLocked = function(player, book, section)
  268. return (not def.locked) or player:get_meta():get_string(book..":"..section..":".."unlocked") == "true"
  269. end
  270. guideBooks.registered[book].sections[name]=def
  271. guideBooks.registered[book].sectionOrder[#guideBooks.registered[book].sectionOrder+1]=name
  272. else
  273. error("Attempt to register section in non-existent guide")
  274. end
  275. end
  276. c.register_page = function(book, section, num, def)
  277. if guideBooks.registered[book] then
  278. if guideBooks.registered[book].sections[section] then
  279. local _def={}
  280. _def.registered=true
  281. _def.form =def.form or guideBooks.registered[book].pageTmp
  282. if def.textcolor then _def.form=_def.form .. "style_type[textarea;textcolor=".. def.textcolor .. "]" end
  283. if def.extra then _def.form=_def.form..def.extra end
  284. if def.text1 then _def.text1=def.text1 end
  285. if def.text2 then _def.text2=def.text2 end
  286. guideBooks.registered[book].sections[section].Pages[num]=_def
  287. else
  288. error("Attempt to register page in non-existent section")
  289. end
  290. else
  291. error("Attempt to register page in non-existent guide")
  292. end
  293. end
  294. guideBooks.Common=c