commands.lua 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112
  1. local function get_valid_arena() end
  2. local function get_looking_node_pos() end
  3. local function from_chest_to_string() end
  4. local function from_treasure_to_string() end
  5. local function get_wielded_item() end
  6. ChatCmdBuilder.new("skywars", function(cmd)
  7. cmd:sub("tutorial", function(sender)
  8. skywars.print_msg(sender, "You can read it from TUTORIAL.txt in the mod folder.")
  9. end)
  10. cmd:sub("create :arena", function(name, arena_name)
  11. arena_lib.create_arena(name, "skywars", arena_name)
  12. end)
  13. cmd:sub("create :arena :minplayers:int :maxplayers:int", function(name, arena_name, min_players, max_players)
  14. arena_lib.create_arena(name, "skywars", arena_name, min_players, max_players)
  15. end)
  16. cmd:sub("remove :arena", function(name, arena_name)
  17. local arena = get_valid_arena(arena_name, name)
  18. if not arena then return end
  19. arena_lib.remove_arena(name, "skywars", arena.name)
  20. end)
  21. cmd:sub("list", function(name)
  22. arena_lib.print_arenas(name, "skywars")
  23. end)
  24. cmd:sub("info :arena", function(name, arena_name)
  25. local arena = get_valid_arena(arena_name, name)
  26. if not arena then return end
  27. arena_lib.print_arena_info(name, "skywars", arena.name)
  28. end)
  29. cmd:sub("setspawn :arena", function(name, arena_name)
  30. local arena = get_valid_arena(arena_name, name)
  31. if not arena then return end
  32. arena_lib.set_spawner(name, "skywars", arena.name)
  33. end)
  34. cmd:sub("setsign :arena", function(name, arena_name)
  35. local arena = get_valid_arena(arena_name, name)
  36. if not arena then return end
  37. arena_lib.set_sign(name, nil, nil, "skywars", arena.name)
  38. end)
  39. cmd:sub("edit :arena", function(name, arena_name)
  40. local arena = get_valid_arena(arena_name, name)
  41. if not arena then return end
  42. arena_lib.enter_editor(name, "skywars", arena.name)
  43. end)
  44. cmd:sub("enable :arena", function(name, arena_name)
  45. local arena = get_valid_arena(arena_name, name)
  46. if not arena then return end
  47. arena_lib.enable_arena(name, "skywars", arena.name)
  48. end)
  49. cmd:sub("fast enable :arena", function(name, arena_name)
  50. local arena = get_valid_arena(arena_name, name)
  51. if not arena then return end
  52. arena_lib.enable_arena(name.."@", "skywars", arena.name)
  53. end)
  54. cmd:sub("disable :arena", function(name, arena_name)
  55. local arena = get_valid_arena(arena_name, name)
  56. if not arena then return end
  57. arena_lib.disable_arena(name, "skywars", arena.name)
  58. end)
  59. --------------------
  60. -- ! CHEST CMDS ! --
  61. --------------------
  62. cmd:sub("addtreasure :arena :treasure :count:int :preciousness:int :rarity:number",
  63. function(sender, arena_name, treasure_name, count, preciousness, rarity)
  64. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  65. if not arena then
  66. return
  67. elseif count < 1 then
  68. skywars.print_error(sender, skywars.T("Count has to be greater than 0!"))
  69. return
  70. elseif rarity < 1 or rarity > 10 then
  71. skywars.print_error(sender, skywars.T("Rarity has to be between 1 and 10!"))
  72. return
  73. elseif ItemStack(treasure_name):is_known() == false then
  74. skywars.print_error(sender, skywars.T("@1 doesn't exist!", treasure_name))
  75. return
  76. end
  77. local item_id = skywars.generate_treasure_id(arena)
  78. local treasure = {
  79. name = treasure_name,
  80. rarity = rarity,
  81. count = count,
  82. preciousness = preciousness,
  83. id = item_id
  84. }
  85. table.insert(arena.treasures, treasure)
  86. arena_lib.change_arena_property(sender, "skywars", arena_name, "treasures", arena.treasures, false)
  87. skywars.print_msg(sender, "+ " .. from_treasure_to_string(treasure))
  88. skywars.reorder_treasures(arena)
  89. end)
  90. cmd:sub("addtreasure hand :arena :rarity:number :preciousness:int",
  91. function(sender, arena_name, preciousness, rarity)
  92. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  93. local wielded_itemstack = get_wielded_item(sender)
  94. local treasure = {}
  95. if not arena or not wielded_itemstack then
  96. return
  97. elseif rarity < 1 or rarity > 10 then
  98. skywars.print_error(sender, skywars.T("Rarity has to be between 1 and 10!"))
  99. return
  100. end
  101. local item_id = skywars.generate_treasure_id(arena)
  102. treasure = {
  103. name = wielded_itemstack.name,
  104. rarity = rarity,
  105. count = wielded_itemstack.count,
  106. preciousness = preciousness,
  107. id = item_id
  108. }
  109. table.insert(arena.treasures, treasure)
  110. arena_lib.change_arena_property(sender, "skywars", arena_name, "treasures", arena.treasures, false)
  111. skywars.print_msg(sender, "+ " .. from_treasure_to_string(treasure))
  112. skywars.reorder_treasures(arena)
  113. end)
  114. cmd:sub("removetreasure hand :arena",
  115. function(sender, arena_name)
  116. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  117. local found = {true, false} -- the first is used to repeat the for until nothing is found
  118. local wielded_itemstack = get_wielded_item(sender)
  119. if not arena or not wielded_itemstack then
  120. return
  121. end
  122. -- Removing all the treasures with that name.
  123. while found[1] do
  124. found[1] = false
  125. for i, treasure in pairs(arena.treasures) do
  126. if treasure.name == wielded_itemstack.name then
  127. table.remove(arena.treasures, i)
  128. found[1] = true
  129. found[2] = true
  130. end
  131. end
  132. end
  133. arena_lib.change_arena_property(sender, "skywars", arena_name, "treasures", arena.treasures, false)
  134. if found[2] then skywars.print_msg(sender, skywars.T("@1 removed from @2!", wielded_itemstack.name, arena.name))
  135. else skywars.print_error(sender, skywars.T("Treasure not found!")) end
  136. skywars.reorder_treasures(arena)
  137. end)
  138. cmd:sub("removetreasure :arena :treasure",
  139. function(sender, arena_name, treasure_name)
  140. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  141. local found = {true, false} -- the first is used to repeat the for until nothing is found
  142. if not arena then
  143. return
  144. end
  145. -- Removing all the treasures with that name.
  146. while found[1] do
  147. found[1] = false
  148. for i, treasure in pairs(arena.treasures) do
  149. if treasure.name == treasure_name then
  150. table.remove(arena.treasures, i)
  151. i = i-1
  152. found[1] = true
  153. found[2] = true
  154. end
  155. end
  156. end
  157. arena_lib.change_arena_property(sender, "skywars", arena_name, "treasures", arena.treasures, false)
  158. if found[2] then skywars.print_msg(sender, skywars.T("@1 removed from @2!", treasure_name, arena_name))
  159. else skywars.print_error(sender, skywars.T("Treasure not found!")) end
  160. skywars.reorder_treasures(arena)
  161. end)
  162. cmd:sub("removetreasure id :arena :id:int",
  163. function(sender, arena_name, treasure_id)
  164. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  165. local treasure_name = ""
  166. if not arena then
  167. return
  168. end
  169. for i=1, #arena.treasures do
  170. if arena.treasures[i].id == treasure_id then
  171. treasure_name = arena.treasures[i].name
  172. table.remove(arena.treasures, i)
  173. break
  174. end
  175. end
  176. arena_lib.change_arena_property(sender, "skywars", arena_name, "treasures", arena.treasures, false)
  177. if treasure_name ~= "" then skywars.print_msg(sender, skywars.T("@1 removed from @2!", treasure_name, arena_name))
  178. else skywars.print_error(sender, skywars.T("Treasure not found!")) end
  179. skywars.reorder_treasures(arena)
  180. end)
  181. cmd:sub("copytreasures :fromarena :toarena",
  182. function(sender, from_name, to_name)
  183. local from_arena, from_name = get_valid_arena(from_name, sender)
  184. local to_arena, to_name = get_valid_arena(to_name, sender, true)
  185. if not to_arena or not from_arena then
  186. return
  187. elseif from_arena == to_arena then
  188. skywars.print_error(sender, skywars.T("The arenas must be different!"))
  189. return
  190. end
  191. to_arena.treasures = table.copy(from_arena.treasures)
  192. arena_lib.change_arena_property(sender, "skywars", to_name, "treasures", to_arena.treasures, false)
  193. skywars.print_msg(sender, skywars.T("@1 treasures have been copied to @2!", from_name, to_name))
  194. end)
  195. cmd:sub("gettreasures :arena",
  196. function(sender, arena_name)
  197. local arena = get_valid_arena(arena_name, sender)
  198. if not arena then
  199. return
  200. end
  201. skywars.print_msg(sender, skywars.T("Treasures list:"))
  202. for i=1, #arena.treasures do
  203. skywars.print_msg(sender, from_treasure_to_string(arena.treasures[i]) .. "\n\n")
  204. end
  205. end)
  206. cmd:sub("searchtreasure :arena :treasure",
  207. function(sender, arena_name, treasure_name)
  208. local arena, arena_name = get_valid_arena(arena_name, sender)
  209. if not arena then
  210. return
  211. end
  212. skywars.print_msg(sender, skywars.T("Treasures list:"))
  213. for i=1, #arena.treasures do
  214. local treasure = arena.treasures[i]
  215. if treasure.name:find(treasure_name) then
  216. skywars.print_msg(sender, from_treasure_to_string(treasure) .. "\n\n")
  217. end
  218. end
  219. end)
  220. cmd:sub("filter treasures rarity :arena :rarity:number",
  221. function(sender, arena_name, rarity)
  222. local arena, arena_name = get_valid_arena(arena_name, sender)
  223. if not arena then
  224. return
  225. end
  226. skywars.print_msg(sender, skywars.T("Treasures list:"))
  227. for i=1, #arena.treasures do
  228. local treasure = arena.treasures[i]
  229. if treasure.rarity == rarity then
  230. skywars.print_msg(sender, from_treasure_to_string(treasure) .. "\n\n")
  231. end
  232. end
  233. end)
  234. cmd:sub("filter treasures preciousness :arena :preciousness:number",
  235. function(sender, arena_name, preciousness)
  236. local arena, arena_name = get_valid_arena(arena_name, sender)
  237. if not arena then
  238. return
  239. end
  240. skywars.print_msg(sender, skywars.T("Treasures list:"))
  241. for i=1, #arena.treasures do
  242. local treasure = arena.treasures[i]
  243. if treasure.preciousness == preciousness then
  244. skywars.print_msg(sender, from_treasure_to_string(treasure) .. "\n\n")
  245. end
  246. end
  247. end)
  248. cmd:sub("filter treasures preciousness+rarity :arena :preciousness:number :rarity:number",
  249. function(sender, arena_name, preciousness, rarity)
  250. local arena, arena_name = get_valid_arena(arena_name, sender)
  251. if not arena then
  252. return
  253. end
  254. skywars.print_msg(sender, skywars.T("Treasures list:"))
  255. for i=1, #arena.treasures do
  256. local treasure = arena.treasures[i]
  257. if treasure.preciousness == preciousness and treasure.rarity == rarity then
  258. skywars.print_msg(sender, from_treasure_to_string(treasure) .. "\n\n")
  259. end
  260. end
  261. end)
  262. cmd:sub("addchest :minpreciousness:int :maxpreciousness:int :tmin:int :tmax:int",
  263. function(sender, min_preciousness, max_preciousness, min_treasures, max_treasures)
  264. local arena, arena_name = get_valid_arena("@", sender, true)
  265. local pos = get_looking_node_pos(sender)
  266. local exists = false
  267. if not pos then
  268. return
  269. elseif not arena then
  270. return
  271. end
  272. if min_treasures <= 0 or max_treasures <= 0 then
  273. skywars.print_error(sender, skywars.T("The minimum or maximum amount of treasures has to be greater than 0!"))
  274. return
  275. end
  276. local chest_id = skywars.generate_chest_id(arena)
  277. local chest =
  278. {
  279. pos = pos,
  280. min_preciousness = min_preciousness,
  281. max_preciousness = max_preciousness,
  282. min_treasures = min_treasures,
  283. max_treasures = max_treasures,
  284. id = chest_id
  285. }
  286. for i=1, #arena.chests do
  287. if vector.equals(arena.chests[i].pos, pos) then
  288. exists = true
  289. break
  290. end
  291. end
  292. if exists then
  293. skywars.print_error(sender, skywars.T("The chest already exists!"))
  294. return
  295. end
  296. skywars.print_msg(sender, "+ " .. from_chest_to_string(chest))
  297. table.insert(arena.chests, chest)
  298. arena_lib.change_arena_property(sender, "skywars", arena_name, "chests", arena.chests, false)
  299. end)
  300. cmd:sub("getchests :arena",
  301. function(sender, arena_name)
  302. local arena = get_valid_arena(arena_name, sender)
  303. if not arena then
  304. return
  305. end
  306. skywars.print_msg(sender, skywars.T("Chest list:"))
  307. for i=1, #arena.chests do
  308. skywars.print_msg(sender, from_chest_to_string(arena.chests[i]) .. "\n\n")
  309. end
  310. end)
  311. cmd:sub("removechest",
  312. function(sender)
  313. local arena, arena_name = get_valid_arena("@", sender, true)
  314. local found = false
  315. local pos = get_looking_node_pos(sender)
  316. if not pos then
  317. return
  318. elseif not arena then
  319. return
  320. end
  321. for i=1, #arena.chests do
  322. if vector.equals(arena.chests[i].pos, pos) then
  323. table.remove(arena.chests, i)
  324. found = true
  325. break
  326. end
  327. end
  328. arena_lib.change_arena_property(sender, "skywars", arena_name, "chests", arena.chests, false)
  329. if found then
  330. skywars.print_msg(sender, skywars.T("Chest removed!"))
  331. else
  332. skywars.print_error(sender, skywars.T("Chest not found!"))
  333. end
  334. end)
  335. cmd:sub("inspect",
  336. function(sender)
  337. local arena, arena_name = get_valid_arena("@", sender)
  338. local found = false
  339. local pos = get_looking_node_pos(sender)
  340. if not pos then
  341. return
  342. elseif not arena then
  343. return
  344. end
  345. for i=1, #arena.chests do
  346. local chest = arena.chests[i]
  347. if vector.equals(chest.pos, pos) then
  348. skywars.print_msg(sender, from_chest_to_string(chest) .. "\n\n")
  349. found = true
  350. break
  351. end
  352. end
  353. if not found then
  354. skywars.print_error(sender, skywars.T("Chest not found!"))
  355. end
  356. end)
  357. cmd:sub("removechest id :arena :id:int",
  358. function(sender, arena_name, chest_id)
  359. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  360. local found = false
  361. if not arena then
  362. return
  363. end
  364. for i=1, #arena.chests do
  365. if arena.chests[i].id == id then
  366. table.remove(arena.chests, i)
  367. found = true
  368. break
  369. end
  370. end
  371. arena_lib.change_arena_property(sender, "skywars", arena_name, "chests", arena.chests, false)
  372. if found then
  373. skywars.print_msg(sender, skywars.T("Chest removed!"))
  374. else
  375. skywars.print_error(sender, skywars.T("Chest not found!"))
  376. end
  377. end)
  378. -------------------
  379. -- ! KITS CMDS ! --
  380. -------------------
  381. cmd:sub("createkit :name :texture",
  382. function(sender, kit_name, texture)
  383. local kits = skywars.load_table("kits")
  384. if kits[kit_name] then
  385. skywars.print_error(sender, skywars.T("@1 already exists!", kit_name))
  386. return
  387. end
  388. kits[kit_name] = {texture = texture, items={}}
  389. skywars.overwrite_table("kits", kits)
  390. skywars.print_msg(sender, skywars.T("Kit @1 created!", kit_name))
  391. end)
  392. cmd:sub("additem :kit :item :count:int",
  393. function(sender, kit_name, item_name, item_count)
  394. local kits = skywars.load_table("kits")
  395. local itemstack = {}
  396. if ItemStack(item_name):is_known() == false then
  397. skywars.print_error(sender, skywars.T("@1 doesn't exist!", item_name))
  398. return
  399. elseif kits[kit_name] == nil then
  400. skywars.print_error(sender, skywars.T("@1 doesn't exist!", kit_name))
  401. return
  402. elseif item_count <= 0 then
  403. skywars.print_error(sender, skywars.T("Count has to be greater than 0!"))
  404. return
  405. end
  406. itemstack.name = item_name
  407. itemstack.count = item_count
  408. table.insert(kits[kit_name].items, itemstack)
  409. skywars.overwrite_table("kits", kits)
  410. skywars.print_msg(sender, skywars.T("x@1 @2 added to @3!", item_count, item_name, kit_name))
  411. end)
  412. cmd:sub("additem hand :kit",
  413. function(sender, kit_name)
  414. local kits = skywars.load_table("kits")
  415. local wielded_itemstack = get_wielded_item(sender)
  416. if not wielded_itemstack then
  417. return
  418. elseif kits[kit_name] == nil then
  419. skywars.print_error(sender, skywars.T("@1 doesn't exist!", kit_name))
  420. return
  421. end
  422. table.insert(kits[kit_name].items, wielded_itemstack)
  423. skywars.overwrite_table("kits", kits)
  424. skywars.print_msg(sender, skywars.T("x@1 @2 added to @3!", wielded_itemstack.count, wielded_itemstack.name, kit_name))
  425. end)
  426. cmd:sub("deletekit :kit",
  427. function(sender, kit_name)
  428. local kits = skywars.load_table("kits")
  429. if kits[kit_name] == nil then
  430. skywars.print_error(sender, skywars.T("@1 doesn't exist!", kit_name))
  431. return
  432. end
  433. kits[kit_name] = nil
  434. skywars.overwrite_table("kits", kits)
  435. skywars.print_msg(sender, skywars.T("Kit @1 deleted!", kit_name))
  436. end)
  437. cmd:sub("removeitem hand :kit",
  438. function(sender, kit_name)
  439. local kits = skywars.load_table("kits")
  440. local wielded_itemstack = get_wielded_item(sender)
  441. local found = false
  442. if not wielded_itemstack then
  443. return
  444. elseif kits[kit_name] == nil then
  445. skywars.print_error(sender, skywars.T("@1 doesn't exist!", wielded_itemstack.name))
  446. return
  447. end
  448. for i=1, #kits[kit_name].items do
  449. if kits[kit_name].items[i].name == wielded_itemstack.name then
  450. table.remove(kits[kit_name].items, i)
  451. found = true
  452. break
  453. end
  454. end
  455. skywars.overwrite_table("kits", kits)
  456. if found then
  457. skywars.print_msg(sender, skywars.T("@1 removed from @2!", wielded_itemstack.name, kit_name))
  458. else
  459. skywars.print_error(sender, skywars.T("@1 doesn't exist!", wielded_itemstack.name))
  460. end
  461. end)
  462. cmd:sub("removeitem :kit :item",
  463. function(sender, kit_name, item_name)
  464. local kits = skywars.load_table("kits")
  465. local itemstack = {}
  466. local found = false
  467. if kits[kit_name] == nil then
  468. skywars.print_error(sender, skywars.T("@1 doesn't exist!", kit_name))
  469. return
  470. end
  471. itemstack.name = item_name
  472. itemstack.count = item_count
  473. for i=1, #kits[kit_name].items do
  474. if kits[kit_name].items[i].name == item_name then
  475. table.remove(kits[kit_name].items, i)
  476. found = true
  477. break
  478. end
  479. end
  480. skywars.overwrite_table("kits", kits)
  481. if found then
  482. skywars.print_msg(sender, skywars.T("@1 removed from @2!", item_name, kit_name))
  483. else
  484. skywars.print_error(sender, skywars.T("@1 doesn't exist!", item_name))
  485. end
  486. end)
  487. cmd:sub("kittexture :kit :texture",
  488. function(sender, kit_name, texture_name)
  489. local kits = skywars.load_table("kits")
  490. if kits[kit_name] == nil then
  491. skywars.print_error(sender, skywars.T("@1 doesn't exist!", kit_name))
  492. return
  493. end
  494. kits[kit_name].texture = texture_name
  495. skywars.overwrite_table("kits", kits)
  496. skywars.print_msg(sender, skywars.T("@1 texture set to @2!", kit_name, texture_name))
  497. end)
  498. cmd:sub("resetkit :kit",
  499. function(sender, kit_name)
  500. local kits = skywars.load_table("kits")
  501. if kits[kit_name] == nil then
  502. skywars.print_error(sender, skywars.T("@1 doesn't exist!", kit_name))
  503. return
  504. end
  505. kits[kit_name].items = {}
  506. skywars.overwrite_table("kits", kits)
  507. skywars.print_msg(sender, skywars.T("@1 reset!", kit_name))
  508. end)
  509. cmd:sub("getkits",
  510. function(sender)
  511. local kits = skywars.load_table("kits")
  512. skywars.print_msg(sender, skywars.T("Kits list:"))
  513. for name in pairs(kits) do
  514. skywars.print_msg(sender, name)
  515. end
  516. end)
  517. cmd:sub("getitems :kit",
  518. function(sender, kit_name)
  519. local kits = skywars.load_table("kits")
  520. if kits[kit_name] == nil then
  521. skywars.print_error(sender, skywars.T("@1 doesn't exist!", kit_name))
  522. return
  523. end
  524. skywars.print_msg(sender, skywars.T("@1 items:", kit_name))
  525. for i=1, #kits[kit_name].items do
  526. skywars.print_msg(sender, "x" .. kits[kit_name].items[i].count .. " " .. kits[kit_name].items[i].name)
  527. end
  528. end)
  529. cmd:sub("arenakit add :arena :kit",
  530. function(sender, arena_name, kit_name)
  531. local kits = skywars.load_table("kits")
  532. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  533. if not arena then
  534. return
  535. elseif kits[kit_name] == nil then
  536. skywars.print_error(sender, skywars.T("@1 doesn't exist!", kit_name))
  537. return
  538. end
  539. table.insert(arena.kits, kit_name)
  540. arena_lib.change_arena_property(sender, "skywars", arena_name, "kits", arena.kits, false)
  541. skywars.print_msg(sender, skywars.T("@1 added to @2!", kit_name, arena_name))
  542. end)
  543. cmd:sub("arenakit remove :arena :kit",
  544. function(sender, arena_name, kit_name)
  545. local kits = skywars.load_table("kits")
  546. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  547. local found = false
  548. if not arena then
  549. return
  550. elseif kits[kit_name] == nil then
  551. skywars.print_error(sender, skywars.T("@1 doesn't exist!", kit_name))
  552. return
  553. end
  554. for i=1, #arena.kits do
  555. if arena.kits[i] == kit_name then
  556. table.remove(arena.kits, i)
  557. found = true
  558. break
  559. end
  560. end
  561. arena_lib.change_arena_property(sender, "skywars", arena_name, "kits", arena.kits, false)
  562. if found then skywars.print_msg(sender, skywars.T("@1 removed from @2!", kit_name, arena_name))
  563. else skywars.print_error(sender, skywars.T("Kit not found!")) end
  564. end)
  565. cmd:sub("copykits :fromarena :toarena",
  566. function(sender, from_name, to_name)
  567. local from_arena, from_name = get_valid_arena(from_name, sender)
  568. local to_arena, to_name = get_valid_arena(to_name, sender, true)
  569. if not from_arena or not to_arena then
  570. return
  571. elseif from_arena == to_arena then
  572. skywars.print_error(sender, skywars.T("The arenas must be different!"))
  573. return
  574. end
  575. to_arena.kits = table.copy(from_arena.kits)
  576. arena_lib.change_arena_property(sender, "skywars", to_name, "kits", to_arena.kits, false)
  577. skywars.print_msg(sender, skywars.T("@1 kits have been copied to @2!", from_name, to_name))
  578. end)
  579. ------------------
  580. -- ! MAP CMDS ! --
  581. ------------------
  582. cmd:sub("pos1 :arena",
  583. function(sender, arena_name)
  584. local player = minetest.get_player_by_name(sender)
  585. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  586. if not arena then
  587. return
  588. end
  589. arena.min_pos = player:get_pos()
  590. arena_lib.change_arena_property(sender, "skywars", arena.name, "min_pos", arena.min_pos)
  591. skywars.print_msg(sender, skywars.T("Position saved!"))
  592. end)
  593. cmd:sub("pos2 :arena",
  594. function(sender, arena_name)
  595. local player = minetest.get_player_by_name(sender)
  596. local arena, arena_name = get_valid_arena(arena_name, sender, true)
  597. if not arena then
  598. return
  599. end
  600. arena.max_pos = player:get_pos()
  601. arena_lib.change_arena_property(sender, "skywars", arena.name, "max_pos", arena.max_pos)
  602. skywars.print_msg(sender, skywars.T("Position saved!"))
  603. end)
  604. cmd:sub("reset :arena",
  605. function(sender, arena_name)
  606. local player = minetest.get_player_by_name(sender)
  607. local arena, arena_name = get_valid_arena(arena_name, sender)
  608. if not arena then
  609. return
  610. end
  611. if arena.enabled then
  612. skywars.reset_map(arena)
  613. skywars.print_msg(sender, skywars.T("@1 reset!", arena.name))
  614. else
  615. skywars.print_error(sender, skywars.T("@1 must be enabled!", arena_name))
  616. end
  617. end)
  618. --------------------
  619. -- ! DEBUG CMDS ! --
  620. --------------------
  621. cmd:sub("clearchangednodes :arena",
  622. function(sender, arena_name)
  623. local maps = skywars.load_table("maps")
  624. maps[arena_name].changed_nodes = {}
  625. skywars.overwrite_table("maps", maps)
  626. skywars.print_msg(sender, arena_name .. " changed nodes table reset!")
  627. end)
  628. cmd:sub("getpos",
  629. function(sender)
  630. local pos = minetest.get_player_by_name(sender):get_pos()
  631. local readable_pos = "[X Y Z] " .. minetest.pos_to_string(pos, 1)
  632. skywars.print_msg(sender, readable_pos)
  633. end)
  634. cmd:sub("test reset :arena",
  635. function(sender, arena_name)
  636. local player = minetest.get_player_by_name(sender)
  637. local arena, arena_name = get_valid_arena(arena_name, sender)
  638. if not arena then return end
  639. if arena.enabled then
  640. local result = skywars.map_reset_test(arena)
  641. if result then skywars.print_msg(sender, "Reset system working!")
  642. else skywars.print_error(sender, "Reset system doesn't work!") end
  643. else
  644. skywars.print_error(sender, skywars.T("@1 must be enabled!", arena_name))
  645. end
  646. end)
  647. cmd:sub("test asyncspeed :arena",
  648. function(sender, arena_name)
  649. local player = minetest.get_player_by_name(sender)
  650. local arena, arena_name = get_valid_arena(arena_name, sender)
  651. if not arena then return end
  652. skywars.print_msg(sender, "Placing 1000 nodes, the server may lag...")
  653. if arena.enabled then
  654. skywars.test_async_speed(arena)
  655. skywars.print_msg(sender, "Nodes placed at " .. minetest.pos_to_string(arena.min_pos, 0) .. "!")
  656. else
  657. skywars.print_error(sender, skywars.T("@1 must be enabled!", arena_name))
  658. end
  659. end)
  660. end, {
  661. description = [[
  662. ADMIN COMMANDS
  663. (Use /help skywars to read it all)
  664. Arena_lib:
  665. - create <arena name> [min players] [max players]
  666. - edit <arena name>
  667. - remove <arena name>
  668. - list
  669. - enable <arena name>
  670. - fast enable <arena name>:
  671. enables the arena without checking if there are nodes with inventories;
  672. use this just if after disabling the arena you didn't add nodes with an
  673. inventory (e.g. a chest or a furnace)
  674. - disable <arena name>
  675. Skywars:
  676. - tutorial
  677. MAP:
  678. - pos1 <arena name>
  679. - pos2 <arena name>
  680. - reset <arena name>
  681. TREASURES:
  682. - addtreasure <arena name> <item> <count> <preciousness>
  683. <rarity (min 1.0, max 10.0)>
  684. - addtreasure hand <arena name> <preciousness>
  685. <rarity (min 1.0, max 10.0)>
  686. - gettreasures <arena name>
  687. - searchtreasure <arena name> <treasure name>: shows all the treasures with that name
  688. - filter treasures rarity <arena name> <rarity>
  689. - filter treasures preciousness <arena name> <preciousness>
  690. - filter treasures preciousness+rarity <arena name> <preciousness> <rarity>
  691. - removetreasure <arena name> <treasure name>: remove all treasures with that name
  692. - removetreasure hand <arena name>
  693. - removetreasure id <arena name> <treasure id>
  694. - copytreasures <(from) arena name> <(to) arena name>
  695. CHESTS:
  696. - addchest <min_preciousness> <max_preciousness> <min_treasures_amount (min. 1)>
  697. <max_treasures_amount>
  698. - getchests <arena name>
  699. - inspect: gives you information about the chest you're looking at
  700. - removechest
  701. - removechest id <arena name> <id>
  702. KITS:
  703. - createkit <kit name> <texture name>
  704. - deletekit <kit name>
  705. - additem <kit name> <item> <count>
  706. - additem hand <kit name>
  707. - kittexture <kit name> <texture name>
  708. - removeitem <kit name> <item>
  709. - removeitem hand <kit name>
  710. - arenakit add <arena name> <kit name>
  711. - arenakit remove <arena name> <kit name>
  712. - getkits
  713. - resetkit <kit name>
  714. - getitems <kit name>
  715. - copykits <(from) arena name> <(to) arena name>
  716. DEBUG (don't use them if you don't know what you're doing):
  717. - clearchangednodes <arena name>: clears the changed nodes table of each map without resetting them
  718. - getpos
  719. - test reset <arena name>: tests the reset system, make sure your map is properly reset
  720. before using it, 'cause it will clear the maps table first
  721. - test asyncspeed <arena name>: places a 10x10 area full of nodes, useful to test the
  722. async reset system speed (read the server logs to know the reset speed)
  723. ]],
  724. privs = { skywars_admin = true }
  725. })
  726. minetest.register_privilege("skywars_admin", {
  727. description = "With this you can use /skywars"
  728. })
  729. function get_valid_arena(arena_name, sender, property_is_changing)
  730. local arena = nil
  731. if arena_name == "@" then
  732. local player_pos = minetest.get_player_by_name(sender):get_pos()
  733. arena = skywars.get_arena_by_pos(player_pos)
  734. if arena then arena_name = arena.name end
  735. else
  736. local id, arena_ = arena_lib.get_arena_by_name("skywars", arena_name)
  737. arena = arena_
  738. end
  739. if not arena then
  740. skywars.print_error(sender, skywars.T("@1 doesn't exist!", arena_name))
  741. return nil
  742. elseif arena_lib.is_arena_in_edit_mode(arena_name) and property_is_changing then
  743. skywars.print_error(sender, skywars.T("Nobody must be in the editor!"))
  744. return nil
  745. elseif arena.enabled and property_is_changing then
  746. arena_lib.disable_arena(sender, "skywars", arena_name)
  747. local couldnt_disable = arena.enabled
  748. if couldnt_disable then
  749. skywars.print_error(sender, skywars.T("@1 must be disabled!", arena_name))
  750. return nil
  751. end
  752. end
  753. return arena, arena_name
  754. end
  755. function get_looking_node_pos(pl_name)
  756. local player = minetest.get_player_by_name(pl_name)
  757. local look_dir = player:get_look_dir()
  758. local pos_head = vector.add(player:get_pos(), {x=0, y=1.5, z=0})
  759. local result, pos = minetest.line_of_sight(
  760. vector.add(pos_head, vector.divide(look_dir, 4)),
  761. vector.add(pos_head, vector.multiply(look_dir, 10))
  762. )
  763. if result then
  764. skywars.print_error(pl_name, skywars.T("You're not looking at anything!"))
  765. return nil
  766. end
  767. return pos
  768. end
  769. function from_chest_to_string(chest)
  770. local chest_pos = minetest.pos_to_string(chest.pos, 0)
  771. return skywars.T(
  772. "ID: @1, position: @2, preciousness: @3-@4, treasures amount: @5-@6",
  773. chest.id, chest_pos, chest.min_preciousness, chest.max_preciousness,
  774. chest.min_treasures, chest.max_treasures
  775. )
  776. end
  777. function from_treasure_to_string(treasure)
  778. return skywars.T(
  779. "ID: @1, name: @2, rarity: @3, preciousness: @4, count: @5",
  780. treasure.id, treasure.name, treasure.rarity, treasure.preciousness, treasure.count
  781. )
  782. end
  783. function get_wielded_item(player)
  784. local item_name = minetest.get_player_by_name(player):get_wielded_item():get_name()
  785. local item_count = minetest.get_player_by_name(player):get_wielded_item():get_count()
  786. local itemstack = {}
  787. if ItemStack(item_name):is_known() == false then
  788. skywars.print_error(player, skywars.T("@1 doesn't exist!", item_name))
  789. return nil
  790. elseif item_name == "" then
  791. skywars.print_error(player, skywars.T("Your hand is empty!"))
  792. return nil
  793. end
  794. itemstack.name = item_name
  795. itemstack.count = item_count
  796. return itemstack
  797. end