chestshops.txt 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. event.load("snuvi_click");
  2. event.load("inv_close");
  3. event.load("block_click");
  4. prefix_shop = "§6Shop";
  5. invid_to_sign_block = map.new();
  6. msg.string("dev", "§bChestShops §rloaded.");
  7. @main
  8. wait();
  9. ignoreGoto(event);
  10. goto("main");
  11. @snuvi_click
  12. title_string = string.removeFormat(string.text(inv_title));
  13. if(!string.startsWith(title_string, "ChestShop", 0)) {
  14. goto("main");
  15. }
  16. cancel = true;
  17. inv_id = inv.getId(inv);
  18. if(inv_slot == 17) {
  19. map.remove(invid_to_sign_block, inv_id);
  20. inv.close(player);
  21. goto("main");
  22. }
  23. sign_block = map.get(invid_to_sign_block, inv_id);
  24. if(sign_block == null) {
  25. inv.close(player);
  26. msg.prefix(player, prefix_shop, "Defect shop.");
  27. goto("main");
  28. }
  29. if(!block.isWallSign(sign_block)) {
  30. map.remove(invid_to_sign_block, inv_id);
  31. inv.close(player);
  32. msg.prefix(player, prefix_shop, "No longer a shop.");
  33. goto("main");
  34. }
  35. factor = 1;
  36. chest_block = block.getShopChest(sign_block);
  37. if(!block.isChest(chest_block)) {
  38. map.remove(invid_to_sign_block, inv_id);
  39. inv.close(player);
  40. msg.prefix(player, prefix_shop, "No longer a shop.");
  41. goto("main");
  42. }
  43. block_inv = block.getInventory(chest_block);
  44. if(inv_slot == 3) { //Buy
  45. itemstack = inv.getItem(inv, 4);
  46. if(click == "SHIFT_LEFT") {
  47. factor = math.roundDown(item.getMaxAmount(itemstack) / item.getAmount(itemstack));
  48. }
  49. buy_price = shop.getBuyPrice(inv) * factor;
  50. item.removeFlag(itemstack, "HIDE_DESTROYS");
  51. itemstack_2 = item.clone(itemstack);
  52. if(click == "SHIFT_LEFT") {
  53. item.setAmount(itemstack_2, item.getAmount(itemstack_2) * factor);
  54. }
  55. //Check players money
  56. if(!hasEnoughMoney(player, buy_price)) {
  57. msg.prefix(player, prefix_shop, "You do not have enough money.");
  58. goto("main");
  59. }
  60. itemamount = inv.getItemAmount(block_inv, itemstack);
  61. if(itemamount < item.getAmount(itemstack_2)) {
  62. msg.prefix(player, prefix_shop, "Not enough items in chest.");
  63. goto("main");
  64. }
  65. player.splitGiveItem(player, itemstack_2, true);
  66. inv.removeItem(block_inv, itemstack_2);
  67. owner_player_id = read.number(sign.getString(sign_block, "FRONT", 3));
  68. if(!isDouble(owner_player_id)) {
  69. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  70. goto("main");
  71. }
  72. if(player.getNameFromId(owner_player_id) == null) {
  73. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  74. goto("main");
  75. }
  76. money.add(owner_player_id, buy_price);
  77. money.sub(player, buy_price);
  78. } elseif(inv_slot == 12) { //Sell
  79. itemstack = inv.getItem(inv, 11);
  80. if(click == "SHIFT_LEFT") {
  81. factor = math.roundDown(item.getMaxAmount(itemstack) / item.getAmount(itemstack));
  82. }
  83. sell_price = shop.getSellPrice(inv) * factor;
  84. item.removeFlag(itemstack, "HIDE_DESTROYS");
  85. itemstack_2 = item.clone(itemstack);
  86. if(click == "SHIFT_LEFT") {
  87. item.setAmount(itemstack_2, item.getAmount(itemstack_2) * factor);
  88. }
  89. owner_player_id = read.number(sign.getString(sign_block, "FRONT", 3));
  90. if(!isDouble(owner_player_id)) {
  91. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  92. goto("main");
  93. }
  94. if(player.getNameFromId(owner_player_id) == null) {
  95. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  96. goto("main");
  97. }
  98. if(!hasEnoughMoney(owner_player_id, sell_price)) {
  99. msg.prefix(player, prefix_shop, "Shop owner does not have enough money.");
  100. goto("main");
  101. }
  102. //Items des Spielers checken
  103. if(player.getItemAmount(player, itemstack) < item.getAmount(itemstack_2)) {
  104. msg.prefix(player, prefix_shop, "You do not have enough items.");
  105. goto("main");
  106. }
  107. //Items in der Kiste unterbringen, ansonsten wieder entfernen, wenn kein Platz ist
  108. not_added = inv.addItem(block_inv, itemstack_2);
  109. if(not_added != 0) {
  110. msg.prefix(player, prefix_shop, "Not enough space in chest.");
  111. item.setAmount(itemstack_2, item.getAmount(itemstack_2) - not_added);
  112. inv.removeItem(block_inv, itemstack_2);
  113. goto("main");
  114. }
  115. money.sub(owner_player_id, sell_price);
  116. money.add(player, sell_price);
  117. player.removeItem(player, itemstack_2);
  118. }
  119. goto("main");
  120. @inv_close
  121. map.remove(invid_to_sign_block, inv.getId(inv));
  122. goto("main");
  123. @block_click
  124. if(block == null) {
  125. goto("main");
  126. }
  127. if(block.isWallSign(block)) {
  128. if(!block.isShopSign(block)) {
  129. goto("main");
  130. }
  131. chest_block = block.getShopChest(block);
  132. if(chest_block == null) {
  133. goto("main");
  134. }
  135. world = loc.getWorld(entity.getLocation(player));
  136. world_name = world.getName(world);
  137. if(!world.isSurvName(world_name)) {
  138. goto("main");
  139. }
  140. owner_id = shop.getOwner(block);
  141. if(owner_id == null) {
  142. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  143. goto("main");
  144. }
  145. owner_name = player.getNameFromId(owner_id);
  146. if(owner_name == null) {
  147. msg.prefix(player, prefix_shop, "Invalid shop owner.");
  148. goto("main");
  149. }
  150. item_stack = shop.getItem(chest_block);
  151. if(item_stack == null) {
  152. msg.prefix(player, prefix_shop, "No item in chest.");
  153. goto("main");
  154. }
  155. inv = inv.new("000200000000200002", text.new(string.concat("§8ChestShop of ", owner_name)));
  156. shop.setBuyElement(block, inv, item.clone(item_stack));
  157. shop.setSellElement(block, inv, item.clone(item_stack));
  158. inv.setItem(inv, 17, customitem.create("CROSS_RED", 1, "§fClose", null));
  159. inv.open(inv, player);
  160. map.add(invid_to_sign_block, inv.getId(inv), block);
  161. }
  162. goto("main");
  163. function shop.setBuyElement(sign_block, inv, item_stack) {
  164. buy_line = sign.getString(sign_block, "FRONT", 1);
  165. split_array = string.split(" ", buy_line);
  166. if(array.getSize(split_array) < 4) {
  167. return;
  168. }
  169. buy_amount = read.number(split_array[1]);
  170. if(!isDouble(buy_amount)) {
  171. return;
  172. }
  173. buy_price = read.number(split_array[3]);
  174. if(!isDouble(buy_price)) {
  175. return;
  176. }
  177. item.setAmount(item_stack, buy_amount);
  178. a = money.splitCap(buy_price);
  179. gold = a[0];
  180. silver = a[1];
  181. bronze = a[2];
  182. index = 2;
  183. if(bronze != 0) {
  184. inv.setItem(inv, index--, customitem.create("COPPER_COIN", bronze, null, null));
  185. }
  186. if(silver != 0) {
  187. inv.setItem(inv, index--, customitem.create("SILVER_COIN", silver, null, null));
  188. }
  189. if(gold != 0) {
  190. inv.setItem(inv, index, customitem.create("GOLD_COIN", gold, null, null));
  191. }
  192. inv.setItem(inv, 3, customitem.create("ARROW_RIGHT", 1, "§fBuy", null));
  193. inv.setItem(inv, 4, item_stack);
  194. }
  195. function shop.setSellElement(sign_block, inv, item_stack) {
  196. sell_line = sign.getString(sign_block, "FRONT", 2);
  197. split_array = string.split(" ", sell_line);
  198. if(array.getSize(split_array) < 4) {
  199. return;
  200. }
  201. sell_amount = read.number(split_array[1]);
  202. if(!isDouble(sell_amount)) {
  203. return;
  204. }
  205. sell_price = read.number(split_array[3]);
  206. if(!isDouble(sell_price)) {
  207. return;
  208. }
  209. sell_stack = item.clone(item_stack);
  210. item.setAmount(sell_stack, sell_amount);
  211. a = money.splitCap(sell_price);
  212. gold = a[0];
  213. silver = a[1];
  214. bronze = a[2];
  215. index = 13;
  216. if(bronze != 0) {
  217. inv.setItem(inv, index++, customitem.create("COPPER_COIN", bronze, null, null));
  218. }
  219. if(silver != 0) {
  220. inv.setItem(inv, index++, customitem.create("SILVER_COIN", silver, null, null));
  221. }
  222. if(gold != 0) {
  223. inv.setItem(inv, index, customitem.create("GOLD_COIN", gold, null, null));
  224. }
  225. inv.setItem(inv, 11, sell_stack);
  226. inv.setItem(inv, 12, customitem.create("ARROW_RIGHT", 1, "§fSell", null));
  227. }
  228. function shop.getItem(chest_block) {
  229. inv = block.getInventory(chest_block);
  230. for(i = 0; i < inv.getSize(inv); i++) {
  231. item_stack = inv.getItem(inv, i);
  232. if(!item.isAir(item_stack)) {
  233. return item.clone(item_stack);
  234. }
  235. }
  236. return null;
  237. }
  238. function block.getShopChest(sign_block) {
  239. chest_block = block.mod(sign_block, 0, -1, 0);
  240. if(block.isChest(chest_block)) {
  241. return chest_block;
  242. }
  243. return null;
  244. }
  245. function block.isShopSign(sign_block) {
  246. line0 = sign.getString(sign_block, "FRONT", 0);
  247. if(line0 == "[Shop]") {
  248. return true;
  249. }
  250. return false;
  251. }
  252. function shop.getItemAmount(inv, slot) {
  253. item = inv.getItem(inv, slot);
  254. if(item == null) {
  255. return 0;
  256. }
  257. if(customitem.isGoldCoin(item)) {
  258. return item.getAmount(item) * 64 * 64;
  259. }
  260. if(customitem.isSilverCoin(item)) {
  261. return item.getAmount(item) * 64;
  262. }
  263. if(customitem.isCopperCoin(item)) {
  264. return item.getAmount(item);
  265. }
  266. return 0;
  267. }
  268. function shop.getBuyPrice(inv) {
  269. snuvis = 0;
  270. snuvis += shop.getItemAmount(inv, 0);
  271. snuvis += shop.getItemAmount(inv, 1);
  272. snuvis += shop.getItemAmount(inv, 2);
  273. return snuvis;
  274. }
  275. function shop.getSellPrice(inv) {
  276. snuvis = 0;
  277. snuvis += shop.getItemAmount(inv, 13);
  278. snuvis += shop.getItemAmount(inv, 14);
  279. snuvis += shop.getItemAmount(inv, 15);
  280. return snuvis;
  281. }