chestshops.txt 14 KB

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