chestshops.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. event.load("custom_command");
  2. event.load("inv_click");
  3. event.load("inv_close");
  4. event.load("block_click");
  5. prefix_shop = "§6Shop";
  6. wall_signs_tag = block.getTag("minecraft:wall_signs");
  7. invid_to_sign_loc = map.new();
  8. msg("dev", "§bChestShops §rloaded.");
  9. @wait
  10. wait();
  11. ignoreGoto(event);
  12. goto("wait");
  13. @inv_click
  14. cancel = true;
  15. if(inv_slot == 10) {
  16. map.remove(invid_to_sign_loc, inv_id);
  17. inv.close(player);
  18. goto("wait");
  19. }
  20. sign_loc = map.get(invid_to_sign_loc, inv_id);
  21. if(!isAWallSign(sign_loc)) {
  22. map.remove(invid_to_sign_loc, inv_id);
  23. inv.close(player);
  24. msg.prefix(player, prefix_shop, "No longer a shop.");
  25. goto("wait");
  26. }
  27. adminshop = isAdminShop(sign_loc);
  28. buy_price = shop.getBuyPrice(inv);
  29. sell_price = shop.getSellPrice(inv);
  30. chestloc1 = loc.mod(sign_loc, 0, -1, 0);
  31. chestloc2 = block.getSecChest(chestloc1);
  32. if(!isAChest(chestloc1)) {
  33. map.remove(invid_to_sign_loc, inv_id);
  34. inv.close(player);
  35. msg.prefix(player, prefix_shop, "No longer a shop.");
  36. goto("wait");
  37. }
  38. if(inv_slot == 3) { //Buy
  39. itemstack = inv.getItem(inv, 4);
  40. //Check players money
  41. if(!hasEnoughMoney(player, buy_price)) {
  42. msg.prefix(player, prefix_shop, "You do not have enough money.");
  43. goto("wait");
  44. }
  45. if(!adminshop) {
  46. itemamount2 = 0;
  47. if(chestloc2 != null) {
  48. itemamount2 = block.getItemAmount(chestloc2, true, itemstack);
  49. }
  50. itemamount1 = block.getItemAmount(chestloc1, true, itemstack);
  51. if(itemamount1 + itemamount2 < item.getAmount(itemstack)) {
  52. msg.prefix(player, prefix_shop, "Not enough items in chest.");
  53. goto("wait");
  54. }
  55. }
  56. //Items ins Inventar geben oder droppen
  57. notgiven = player.giveItem(player, itemstack);
  58. if(notgiven != null) {
  59. item.drop(entity.getLocation(player), notgiven);
  60. }
  61. //In einem AdminShop werden keine Items abgelegt
  62. if(!adminshop) {
  63. itemstack2 = item.clone(itemstack);
  64. notremoved = block.subItem(chestloc1, itemstack2);
  65. if(chestloc2 != null) {
  66. block.subItem(chestloc2, notremoved);
  67. }
  68. owner_player_id = text.convert(block.getSign(sign_loc, 3));
  69. if(!isDouble(owner_player_id)) {
  70. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  71. goto("wait");
  72. }
  73. if(player.getNameFromId(owner_player_id) == null) {
  74. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  75. goto("wait");
  76. }
  77. addMoney(owner_player_id, buy_price);
  78. }
  79. subMoney(player, buy_price);
  80. inv.update(player);
  81. } elseif(inv_slot == 6) { //Sell
  82. itemstack = inv.getItem(inv, 5);
  83. if(!adminshop) {
  84. owner_player_id = text.convert(block.getSign(sign_loc, 3));
  85. if(!isDouble(owner_player_id)) {
  86. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  87. goto("wait");
  88. }
  89. if(player.getNameFromId(owner_player_id) == null) {
  90. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  91. goto("wait");
  92. }
  93. if(!hasEnoughMoney(owner_player_id, sell_price)) {
  94. msg.prefix(player, prefix_shop, "Shop owner does not have enough money.");
  95. goto("wait");
  96. }
  97. }
  98. //Items des Spielers checken
  99. if(player.getItemAmount(player, true, itemstack) < item.getAmount(itemstack)) {
  100. msg.prefix(player, prefix_shop, "You do not have enough items.");
  101. goto("wait");
  102. }
  103. //Platz in der Kiste checken
  104. if(!adminshop) {
  105. //Versuche den ganzen ItemStack in der 1.Kiste unterzubringen
  106. itemstack2 = item.clone(itemstack);
  107. notinchest1 = block.addItem(chestloc1, itemstack2);
  108. if(item.getType(notinchest1) != "minecraft:air") {
  109. //Versuche den Rest des ItemStack in der 2.Kiste unterzubringen
  110. notinchest2 = block.addItem(chestloc2, notinchest1);
  111. if(item.getType(notinchest1) != "minecraft:air") {
  112. //Entferne die ItemStacks wieder
  113. msg.prefix(player, prefix_shop, "Not enough space in chest.");
  114. block.subItem(chestloc1, itemstack2);
  115. block.addItem(chestloc1, notinchest2);
  116. goto("wait");
  117. }
  118. }
  119. subMoney(owner_player_id, sell_price);
  120. }
  121. addMoney(player, sell_price);
  122. player.removeItem(player, itemstack);
  123. inv.update(player);
  124. }
  125. goto("wait");
  126. @inv_close
  127. map.remove(invid_to_sign_loc, inv_id);
  128. goto("wait");
  129. @custom_command
  130. if(player == null) {
  131. goto("wait");
  132. }
  133. if(command == "shop") {
  134. size = list.getSize(args);
  135. if(size == 0) {
  136. @syntax
  137. msg.prefix(player, prefix_shop, "/shop ...");
  138. msg(player, "§6 - create §rCreates a shop");
  139. msg(player, "§6 - buy <amount> <price> §rSet buy settings");
  140. msg(player, "§6 - sell <amount> <price> §rSet sell settings");
  141. msg(player, "§6 - remove <buy/sell> §rRemove settings");
  142. if(perm.has(player, "adminshop")) {
  143. msg(player, "§6 - admin §rSet to adminshop");
  144. }
  145. goto("wait");
  146. }
  147. arg0 = text.toLowerCase(list.getIndex(args, 0));
  148. if(arg0 == "create") {
  149. if(size != 1) {
  150. msg.prefix(player, prefix_shop, "§6/shop create");
  151. goto("wait");
  152. }
  153. sign_loc = player.getTarget(player, 5, false, false);
  154. if(!isAWallSign(sign_loc)) {
  155. msg.prefix(player, prefix_shop, "Look at a sign.");
  156. goto("wait");
  157. }
  158. chest_loc = loc.mod(sign_loc, 0, -1, 0);
  159. if(!isAChest(chest_loc)) {
  160. msg.prefix(player, prefix_shop, "No chest under sign.");
  161. goto("wait");
  162. }
  163. if(!plot.check(sign_loc, player, 0, false)) {
  164. msg.prefix(player, prefix_shop, "Not your plot.");
  165. goto("wait");
  166. }
  167. block.setSign(sign_loc, 0, "[Shop]");
  168. block.setSign(sign_loc, 3, text.number(player.getId(player)));
  169. msg.prefix(player, prefix_shop, "§rCreated Shop.");
  170. goto("wait");
  171. }
  172. if(arg0 == "admin") {
  173. if(!perm.has(player, "adminshop")) {
  174. msg.prefix(player, prefix_shop, "§6No Permission.");
  175. goto("wait");
  176. }
  177. if(size != 1) {
  178. msg.prefix(player, prefix_shop, "§6/shop admin");
  179. goto("wait");
  180. }
  181. sign_loc = player.getTarget(player, 5, false, false);
  182. if(!isAWallSign(sign_loc)) {
  183. msg.prefix(player, prefix_shop, "Look at a sign.");
  184. goto("wait");
  185. }
  186. chest_loc = loc.mod(sign_loc, 0, -1, 0);
  187. if(!isAChest(chest_loc)) {
  188. msg.prefix(player, prefix_shop, "No chest under sign.");
  189. goto("wait");
  190. }
  191. block.setSign(sign_loc, 0, "[Admin Shop]");
  192. block.setSign(sign_loc, 3, "");
  193. msg.prefix(player, prefix_shop, "§rCreated Admin Shop.");
  194. goto("wait");
  195. }
  196. if(arg0 == "buy" || arg0 == "sell") {
  197. if(size != 3) {
  198. msg.prefix(player, prefix_shop, concat("§6/shop ", arg0, " <amount> <price>"));
  199. goto("wait");
  200. }
  201. amount = list.getIndex(args, 1);
  202. price = list.getIndex(args, 2);
  203. if(!isDouble(amount) || !isDouble(amount)) {
  204. msg.prefix(player, prefix_shop, "§rNumber expected.");
  205. goto("wait");
  206. }
  207. if(price < 0) {
  208. msg.prefix(player, prefix_shop, "§rPositive number expected.");
  209. goto("wait");
  210. }
  211. sign_loc = player.getTarget(player, 5, false, false);
  212. if(!isAWallSign(sign_loc)) {
  213. msg.prefix(player, prefix_shop, "Look at a sign.");
  214. goto("wait");
  215. }
  216. chest_loc = loc.mod(sign_loc, 0, -1, 0);
  217. if(!isAChest(chest_loc)) {
  218. msg.prefix(player, prefix_shop, "No chest under sign.");
  219. goto("wait");
  220. }
  221. if(!shop.isOwner(player, sign_loc)) {
  222. msg.prefix(player, prefix_shop, "You are not the owner.");
  223. goto("wait");
  224. }
  225. if(arg0 == "buy") {
  226. block.setSign(sign_loc, 1, concat("Buy ", text.number(amount), " for ", text.number(price)));
  227. } else {
  228. block.setSign(sign_loc, 2, concat("Sell ", text.number(amount), " for ", text.number(price)));
  229. }
  230. msg.prefix(player, prefix_shop, "§rPrice set.");
  231. goto("wait");
  232. }
  233. if(arg0 == "remove") {
  234. if(size != 2) {
  235. msg.prefix(player, prefix_shop, concat("§6/shop remove <buy/sell>"));
  236. goto("wait");
  237. }
  238. sign_loc = player.getTarget(player, 5, false, false);
  239. if(!isAWallSign(sign_loc)) {
  240. msg.prefix(player, prefix_shop, "Look at a sign.");
  241. goto("wait");
  242. }
  243. chest_loc = loc.mod(sign_loc, 0, -1, 0);
  244. if(!isAChest(chest_loc)) {
  245. msg.prefix(player, prefix_shop, "No chest under sign.");
  246. goto("wait");
  247. }
  248. if(!shop.isOwner(player, sign_loc)) {
  249. msg.prefix(player, prefix_shop, "You are not the owner.");
  250. goto("wait");
  251. }
  252. arg1 = text.toLowerCase(list.getIndex(args, 1));
  253. if(arg1 == "buy") {
  254. block.setSign(sign_loc, 1, "");
  255. } elseif(arg1 == "sell") {
  256. block.setSign(sign_loc, 2, "");
  257. } else {
  258. msg.prefix(player, prefix_shop, concat("§6/shop remove <buy/sell>"));
  259. goto("wait");
  260. }
  261. msg.prefix(player, prefix_shop, "§rPrice removed.");
  262. goto("wait");
  263. }
  264. goto("syntax");
  265. }
  266. goto("wait");
  267. @block_click
  268. if(isAChest(block_loc)) {
  269. chest_loc = block_loc;
  270. sign_loc = loc.mod(chest_loc, 0, 1, 0);
  271. if(!isAWallSign(sign_loc)) {
  272. chest_loc = block.getSecChest(chest_loc);
  273. if(chest_loc == null) {
  274. goto("wait");
  275. }
  276. sign_loc = loc.mod(chest_loc, 0, 1, 0);
  277. if(!isAWallSign(sign_loc)) {
  278. goto("wait");
  279. }
  280. }
  281. line0 = block.getSign(sign_loc, 0);
  282. if(line0 != "[Shop]" && line0 != "[Admin Shop]") {
  283. goto("wait");
  284. }
  285. if(shop.isOwner(player, sign_loc)) {
  286. goto("wait");
  287. }
  288. if(perm.has(player, "plot.bypass")) {
  289. goto("wait");
  290. }
  291. cancel = true;
  292. goto("wait");
  293. }
  294. if(isAWallSign(block_loc)) {
  295. sign_loc = block_loc;
  296. chest_loc = loc.mod(sign_loc, 0, -1, 0);
  297. if(!isAChest(chest_loc)) {
  298. goto("wait");
  299. }
  300. line0 = block.getSign(sign_loc, 0);
  301. if(line0 != "[Shop]" && line0 != "[Admin Shop]") {
  302. goto("wait");
  303. }
  304. buy_line = block.getSign(sign_loc, 1);
  305. sell_line = block.getSign(sign_loc, 2);
  306. owner_player_id = text.convert(block.getSign(sign_loc, 3));
  307. if(isDouble(owner_player_id)) {
  308. owner_name = player.getNameFromId(owner_player_id);
  309. if(owner_name == null) {
  310. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  311. goto("wait");
  312. }
  313. inv_title = concat("§8Shop von ", owner_name);
  314. } elseif(owner_player_id == "") {
  315. inv_title = "Admin Shop";
  316. } else {
  317. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  318. goto("wait");
  319. }
  320. item_stack = shop.getItem(chest_loc);
  321. if(item_stack == null) {
  322. buy_line = "";
  323. sell_line = "";
  324. }
  325. inv = inv.new("222320000002322203");
  326. if(buy_line != "") {
  327. split_list = text.split(" ", buy_line);
  328. buy_amount = list.getIndex(split_list, 1);
  329. if(!isDouble(buy_amount)) {
  330. msg.prefix(player, prefix_shop, "Invalid buy amount.");
  331. goto("wait");
  332. }
  333. buy_amount = read.number(buy_amount);
  334. buy_price = list.getIndex(split_list, 3);
  335. if(!isDouble(buy_price)) {
  336. msg.prefix(player, prefix_shop, "Invalid buy price.");
  337. goto("wait");
  338. }
  339. buy_price = read.number(buy_price);
  340. buy_stack = item.clone(item_stack);
  341. item.setAmount(buy_stack, buy_amount);
  342. a = money.split(buy_price);
  343. gold = a[0];
  344. silver = a[1];
  345. bronze = a[2];
  346. index = 2;
  347. if(bronze != 0) {
  348. inv.setItem(inv, index--, read.item("km:coin_copper", bronze));
  349. }
  350. if(silver != 0) {
  351. inv.setItem(inv, index--, read.item("km:coin_silver", silver));
  352. }
  353. if(gold != 0) {
  354. inv.setItem(inv, index, read.item("km:coin_gold", gold));
  355. }
  356. inv.setItem(inv, 3, read.item("km:arrow_right", 1, "§rBuy"));
  357. inv.setItem(inv, 4, buy_stack);
  358. }
  359. if(sell_line != "") {
  360. split_list = text.split(" ", sell_line);
  361. sell_amount = list.getIndex(split_list, 1);
  362. if(!isDouble(sell_amount)) {
  363. msg.prefix(player, prefix_shop, "Invalid buy amount.");
  364. goto("wait");
  365. }
  366. sell_amount = read.number(sell_amount);
  367. sell_price = list.getIndex(split_list, 3);
  368. if(!isDouble(sell_price)) {
  369. msg.prefix(player, prefix_shop, "Invalid buy price.");
  370. goto("wait");
  371. }
  372. sell_price = read.number(sell_price);
  373. sell_stack = item.clone(item_stack);
  374. item.setAmount(sell_stack, sell_amount);
  375. a = money.split(sell_price);
  376. gold = a[0];
  377. silver = a[1];
  378. bronze = a[2];
  379. inv.setItem(inv, 5, sell_stack);
  380. inv.setItem(inv, 6, read.item("km:arrow_right", 1, "§rSell"));
  381. index = 7;
  382. if(bronze != 0) {
  383. inv.setItem(inv, index++, read.item("km:coin_copper", bronze));
  384. }
  385. if(silver != 0) {
  386. inv.setItem(inv, index++, read.item("km:coin_silver", silver));
  387. }
  388. if(gold != 0) {
  389. inv.setItem(inv, index, read.item("km:coin_gold", gold));
  390. }
  391. }
  392. inv.setItem(inv, 10, read.item("km:cross_red", 1, "§rCancel"));
  393. inv.open(inv, player, inv_title);
  394. map.add(invid_to_sign_loc, inv.getId(inv), sign_loc);
  395. }
  396. goto("wait");
  397. function shop.getItem(chest_loc) {
  398. inv = block.getInv(chest_loc);
  399. for(i = 0; i < inv.getSize(inv); i++) {
  400. item_stack = item.clone(inv.getItem(inv, i));
  401. if(item.getType(item_stack) != "minecraft:air") {
  402. return item_stack;
  403. }
  404. }
  405. return null;
  406. }
  407. function isAChest(location) {
  408. return block.getType(location) == "minecraft:chest";
  409. }
  410. function isAWallSign(location) {
  411. return block.hasTag($wall_signs_tag, block.get(location));
  412. }
  413. function shop.isOwner(player, sign_loc) {
  414. owner_player_id = text.convert(block.getSign(sign_loc, 3));
  415. if(owner_player_id == "") {
  416. return perm.has(player, "adminshop");
  417. }
  418. if(isDouble(owner_player_id)) {
  419. owner_name = player.getNameFromId(owner_player_id);
  420. if(owner_name == null) {
  421. return false;
  422. }
  423. return owner_player_id == player.getId(player);
  424. }
  425. return false;
  426. }
  427. function shop.getItemAmount(item) {
  428. if(item.getType(item) == "km:coin_gold") {
  429. return item.getAmount(item) * 64 * 64;
  430. }
  431. if(item.getType(item) == "km:coin_silver") {
  432. return item.getAmount(item) * 64;
  433. }
  434. if(item.getType(item) == "km:coin_copper") {
  435. return item.getAmount(item);
  436. }
  437. return 0;
  438. }
  439. function shop.getBuyPrice(inv) {
  440. snuvis = 0;
  441. snuvis += shop.getItemAmount(inv.getItem(inv, 0));
  442. snuvis += shop.getItemAmount(inv.getItem(inv, 1));
  443. snuvis += shop.getItemAmount(inv.getItem(inv, 2));
  444. return snuvis;
  445. }
  446. function shop.getSellPrice(inv) {
  447. snuvis = 0;
  448. snuvis += shop.getItemAmount(inv.getItem(inv, 7));
  449. snuvis += shop.getItemAmount(inv.getItem(inv, 8));
  450. snuvis += shop.getItemAmount(inv.getItem(inv, 9));
  451. return snuvis;
  452. }