chestshops.txt 8.4 KB

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