event.load("snuvi_click"); event.load("inv_close"); event.load("block_click"); prefix_shop = "§6Shop"; invid_to_sign_block = map.new(); msg.string("dev", "§bChestShops §rloaded."); @main wait(); ignoreGoto(event); goto("main"); @snuvi_click title_string = string.removeFormat(string.text(inv_title)); if(!string.startsWith(title_string, "ChestShop", 0)) { goto("main"); } cancel = true; custom = item.getCustom(inv.getItem(inv, inv_slot)); if(custom == null) { goto("main"); } inv_id = inv.getId(inv); if(inv_slot == 17) { map.remove(invid_to_sign_block, inv_id); inv.close(player); goto("main"); } sign_block = map.get(invid_to_sign_block, inv_id); if(sign_block == null) { inv.close(player); msg.prefix(player, prefix_shop, "Defect shop."); goto("main"); } if(!block.isWallSign(sign_block)) { map.remove(invid_to_sign_block, inv_id); inv.close(player); msg.prefix(player, prefix_shop, "No longer a shop."); goto("main"); } factor = 1; chest_block = block.getShopChest(sign_block); if(!block.isChest(chest_block)) { map.remove(invid_to_sign_block, inv_id); inv.close(player); msg.prefix(player, prefix_shop, "No longer a shop."); goto("main"); } block_inv = block.getInventory(chest_block); if(inv_slot == 3) { //Buy itemstack = inv.getItem(inv, 4); if(click == "SHIFT_LEFT") { factor = math.roundDown(item.getMaxAmount(itemstack) / item.getAmount(itemstack)); } buy_price = shop.getBuyPrice(inv) * factor; item.removeFlag(itemstack, "HIDE_DESTROYS"); itemstack_2 = item.clone(itemstack); if(click == "SHIFT_LEFT") { item.setAmount(itemstack_2, item.getAmount(itemstack_2) * factor); } //Check players money if(!hasEnoughMoney(player, buy_price)) { msg.prefix(player, prefix_shop, "You do not have enough money."); goto("main"); } itemamount = inv.getItemAmount(block_inv, itemstack); if(itemamount < item.getAmount(itemstack_2)) { msg.prefix(player, prefix_shop, "Not enough items in chest."); goto("main"); } player.splitGiveItem(player, itemstack_2, true); inv.removeItem(block_inv, itemstack_2); owner_player_id = read.number(sign.getString(sign_block, 3)); if(!isDouble(owner_player_id)) { msg.prefix(player, prefix_shop, "Invalid shop owner."); goto("main"); } if(player.getNameFromId(owner_player_id) == null) { msg.prefix(player, prefix_shop, "Invalid shop owner."); goto("main"); } money.add(owner_player_id, buy_price); money.sub(player, buy_price); } elseif(inv_slot == 12) { //Sell itemstack = inv.getItem(inv, 11); if(click == "SHIFT_LEFT") { factor = math.roundDown(item.getMaxAmount(itemstack) / item.getAmount(itemstack)); } sell_price = shop.getSellPrice(inv) * factor; item.removeFlag(itemstack, "HIDE_DESTROYS"); itemstack_2 = item.clone(itemstack); if(click == "SHIFT_LEFT") { item.setAmount(itemstack_2, item.getAmount(itemstack_2) * factor); } owner_player_id = read.number(sign.getString(sign_block, 3)); if(!isDouble(owner_player_id)) { msg.prefix(player, prefix_shop, "Invalid shop owner."); goto("main"); } if(player.getNameFromId(owner_player_id) == null) { msg.prefix(player, prefix_shop, "Invalid shop owner."); goto("main"); } if(!hasEnoughMoney(owner_player_id, sell_price)) { msg.prefix(player, prefix_shop, "Shop owner does not have enough money."); goto("main"); } //Items des Spielers checken if(player.getItemAmount(player, itemstack) < item.getAmount(itemstack_2)) { msg.prefix(player, prefix_shop, "You do not have enough items."); goto("main"); } //Items in der Kiste unterbringen, ansonsten wieder entfernen, wenn kein Platz ist not_added = inv.addItem(block_inv, itemstack_2); if(not_added != 0) { msg.prefix(player, prefix_shop, "Not enough space in chest."); item.setAmount(itemstack_2, item.getAmount(itemstack_2) - not_added); inv.removeItem(block_inv, itemstack_2); goto("main"); } money.sub(owner_player_id, sell_price); money.add(player, sell_price); player.removeItem(player, itemstack_2); } goto("main"); @inv_close map.remove(invid_to_sign_block, inv.getId(inv)); goto("main"); @block_click if(block == null) { goto("main"); } if(block.isWallSign(block)) { if(!block.isShopSign(block)) { goto("main"); } chest_block = block.getShopChest(block); if(chest_block == null) { goto("main"); } world = loc.getWorld(entity.getLocation(player)); world_name = world.getName(world); if(!world.isSurvName(world_name)) { goto("main"); } owner_id = shop.getOwner(block); if(owner_id == null) { msg.prefix(player, prefix_shop, "Invalid shop owner."); goto("main"); } owner_name = player.getNameFromId(owner_id); if(owner_name == null) { msg.prefix(player, prefix_shop, "Invalid shop owner."); goto("main"); } item_stack = shop.getItem(chest_block); if(item_stack == null) { msg.prefix(player, prefix_shop, "No item in chest."); goto("main"); } inv = inv.new("000200000000200002", text.new(string.concat("§8ChestShop of ", owner_name))); shop.setBuyElement(block, inv, item.clone(item_stack)); shop.setSellElement(block, inv, item.clone(item_stack)); inv.setItem(inv, 17, item.custom.create("CROSS_RED", 1, "§fClose", null)); inv.open(inv, player); map.add(invid_to_sign_block, inv.getId(inv), block); } goto("main"); function shop.setBuyElement(sign_block, inv, item_stack) { buy_line = sign.getString(sign_block, 1); split_array = string.split(" ", buy_line); if(array.getSize(split_array) < 4) { return; } buy_amount = read.number(split_array[1]); if(!isDouble(buy_amount)) { return; } buy_price = read.number(split_array[3]); if(!isDouble(buy_price)) { return; } item.setAmount(item_stack, buy_amount); a = money.splitCap(buy_price); gold = a[0]; silver = a[1]; bronze = a[2]; index = 2; if(bronze != 0) { inv.setItem(inv, index--, item.custom.create("COPPER_COIN", bronze, null, null)); } if(silver != 0) { inv.setItem(inv, index--, item.custom.create("SILVER_COIN", silver, null, null)); } if(gold != 0) { inv.setItem(inv, index, item.custom.create("GOLD_COIN", gold, null, null)); } inv.setItem(inv, 3, item.custom.create("ARROW_RIGHT", 1, "§fBuy", null)); inv.setItem(inv, 4, item_stack); } function shop.setSellElement(sign_block, inv, item_stack) { sell_line = sign.getString(sign_block, 2); split_array = string.split(" ", sell_line); if(array.getSize(split_array) < 4) { return; } sell_amount = read.number(split_array[1]); if(!isDouble(sell_amount)) { return; } sell_price = read.number(split_array[3]); if(!isDouble(sell_price)) { return; } sell_stack = item.clone(item_stack); item.setAmount(sell_stack, sell_amount); a = money.splitCap(sell_price); gold = a[0]; silver = a[1]; bronze = a[2]; index = 13; if(bronze != 0) { inv.setItem(inv, index++, item.custom.create("COPPER_COIN", bronze, null, null)); } if(silver != 0) { inv.setItem(inv, index++, item.custom.create("SILVER_COIN", silver, null, null)); } if(gold != 0) { inv.setItem(inv, index, item.custom.create("GOLD_COIN", gold, null, null)); } inv.setItem(inv, 11, sell_stack); inv.setItem(inv, 12, item.custom.create("ARROW_RIGHT", 1, "§fSell", null)); } function shop.getItem(chest_block) { inv = block.getInventory(chest_block); for(i = 0; i < inv.getSize(inv); i++) { item_stack = inv.getItem(inv, i); if(!item.isAir(item_stack)) { return item.clone(item_stack); } } return null; } function block.getShopChest(sign_block) { chest_block = block.mod(sign_block, 0, -1, 0); if(block.isChest(chest_block)) { return chest_block; } return null; } function block.isShopSign(sign_block) { line0 = sign.getString(sign_block, 0); if(line0 == "[Shop]") { return true; } return false; } function shop.getItemAmount(inv, slot) { item = inv.getItem(inv, slot); if(item == null) { return 0; } custom = item.getCustom(item); if(isGoldCoin(custom)) { return item.getAmount(item) * 64 * 64; } if(isSilverCoin(custom)) { return item.getAmount(item) * 64; } if(isCopperCoin(custom)) { return item.getAmount(item); } return 0; } function shop.getBuyPrice(inv) { snuvis = 0; snuvis += shop.getItemAmount(inv, 0); snuvis += shop.getItemAmount(inv, 1); snuvis += shop.getItemAmount(inv, 2); return snuvis; } function shop.getSellPrice(inv) { snuvis = 0; snuvis += shop.getItemAmount(inv, 13); snuvis += shop.getItemAmount(inv, 14); snuvis += shop.getItemAmount(inv, 15); return snuvis; } function isCopperCoin(custom_item) { return string(custom_item) == "COPPER_COIN"; } function isSilverCoin(custom_item) { return string(custom_item) == "SILVER_COIN"; } function isGoldCoin(custom_item) { return string(custom_item) == "GOLD_COIN"; }