123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532 |
- event.load("custom_command");
- event.load("inv_click");
- event.load("inv_close");
- event.load("block_click");
- prefix_shop = "§6Shop";
- wall_signs_tag = block.getTag("minecraft:wall_signs");
- invid_to_sign_loc = map.new();
- msg.string("dev", "§bChestShops §rloaded.");
- @main
- wait();
- ignoreGoto(event);
- goto("main");
- @inv_click
- if(!string.contains(inv_title, "Shop")) {
- goto("main");
- }
- inv_id = inv.getId(inv);
- if(inv_slot == 10) {
- map.remove(invid_to_sign_loc, inv_id);
- inv.close(player);
- goto("main");
- }
- sign_loc = map.get(invid_to_sign_loc, inv_id);
- if(sign_loc == null) {
- inv.close(player);
- msg.prefix(player, prefix_shop, "Defect shop.");
- goto("main");
- }
- if(!isAWallSign(sign_loc)) {
- map.remove(invid_to_sign_loc, inv_id);
- inv.close(player);
- msg.prefix(player, prefix_shop, "No longer a shop.");
- goto("main");
- }
- factor = 1;
- if(click == "SHIFT_LEFT") {
- factor = 8;
- }
- adminshop = isAdminShop(sign_loc);
- buy_price = shop.getBuyPrice(inv) * factor;
- sell_price = shop.getSellPrice(inv) * factor;
- chestloc1 = loc.mod(sign_loc, 0, -1, 0);
- chestloc2 = block.getSecChest(chestloc1);
- if(!isAChest(chestloc1)) {
- map.remove(invid_to_sign_loc, inv_id);
- inv.close(player);
- msg.prefix(player, prefix_shop, "No longer a shop.");
- goto("main");
- }
- if(inv_slot == 3) { //Buy
- itemstack = inv.getItem(inv, 4);
- 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");
- }
- if(!adminshop) {
- itemamount2 = 0;
- if(chestloc2 != null) {
- itemamount2 = block.getItemAmount(chestloc2, true, itemstack);
- }
- itemamount1 = block.getItemAmount(chestloc1, true, itemstack);
- if(itemamount1 + itemamount2 < item.getAmount(itemstack_2)) {
- msg.prefix(player, prefix_shop, "Not enough items in chest.");
- goto("main");
- }
- }
- //Items ins Inventar geben oder droppen
- notgiven = player.giveItem(player, itemstack_2);
- if(notgiven != null) {
- item.drop(entity.getLocation(player), notgiven);
- }
- //In einem AdminShop werden keine Items abgelegt
- if(!adminshop) {
- itemstack_temp = item.clone(itemstack_2);
- notremoved = block.subItem(chestloc1, itemstack_temp);
- if(chestloc2 != null) {
- block.subItem(chestloc2, notremoved);
- }
- owner_player_id = text.convert(block.getSign(sign_loc, 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");
- }
- addMoney(owner_player_id, buy_price);
- }
- subMoney(player, buy_price);
- inv.update(player);
- } elseif(inv_slot == 6) { //Sell
- itemstack = inv.getItem(inv, 5);
- itemstack_2 = item.clone(itemstack);
- if(click == "SHIFT_LEFT") {
- item.setAmount(itemstack_2, item.getAmount(itemstack_2) * factor);
- }
- if(!adminshop) {
- owner_player_id = text.convert(block.getSign(sign_loc, 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, true, itemstack) < item.getAmount(itemstack_2)) {
- msg.prefix(player, prefix_shop, "You do not have enough items.");
- goto("main");
- }
- //Platz in der Kiste checken
- if(!adminshop) {
- //Versuche den ganzen ItemStack in der 1.Kiste unterzubringen
- itemstack_temp = item.clone(itemstack_2);
- notinchest1 = block.addItem(chestloc1, itemstack_temp);
- if(item.getType(notinchest1) != "minecraft:air") {
- //Versuche den Rest des ItemStack in der 2.Kiste unterzubringen
- notinchest2 = block.addItem(chestloc2, notinchest1);
- if(item.getType(notinchest1) != "minecraft:air") {
- //Entferne die ItemStacks wieder
- msg.prefix(player, prefix_shop, "Not enough space in chest.");
- block.subItem(chestloc1, itemstack_temp);
- block.addItem(chestloc1, notinchest2);
- goto("main");
- }
- }
- subMoney(owner_player_id, sell_price);
- }
- addMoney(player, sell_price);
- player.removeItem(player, itemstack_2);
- inv.update(player);
- }
- goto("main");
- @inv_close
- map.remove(invid_to_sign_loc, inv_id);
- goto("main");
- @custom_command
- if(!isPlayer(sender)) {
- goto("main");
- }
- player = sender;
- if(command == "shop") {
- size = list.getSize(args);
- if(size == 0) {
- @syntax
- msg.prefix(player, prefix_shop, "/shop ...");
- msg.string(player, "§6 - create §rCreates a shop");
- msg.string(player, "§6 - buy <amount> <price> §rSet buy settings");
- msg.string(player, "§6 - sell <amount> <price> §rSet sell settings");
- msg.string(player, "§6 - remove <buy/sell> §rRemove settings");
- if(perm.has("adminshop", player)) {
- msg.string(player, "§6 - admin §rSet to adminshop");
- }
- goto("main");
- }
- arg0 = text.toLowerCase(list.getIndex(args, 0));
- if(arg0 == "create") {
- if(size != 1) {
- msg.prefix(player, prefix_shop, "§6/shop create");
- goto("main");
- }
- sign_loc = player.getTarget(player, 5, false, false);
- if(!isAWallSign(sign_loc)) {
- msg.prefix(player, prefix_shop, "Look at a sign.");
- goto("main");
- }
- chest_loc = loc.mod(sign_loc, 0, -1, 0);
- if(!isAChest(chest_loc)) {
- msg.prefix(player, prefix_shop, "No chest under sign.");
- goto("main");
- }
- if(!plot.check(sign_loc, player, 0, false)) {
- msg.prefix(player, prefix_shop, "Not your plot.");
- goto("main");
- }
- block.setSign(sign_loc, 0, "[Shop]");
- block.setSign(sign_loc, 3, text.number(player.getId(player)));
- msg.prefix(player, prefix_shop, "§rCreated Shop.");
- goto("main");
- }
- if(arg0 == "admin") {
- if(!perm.has("adminshop", player)) {
- msg.prefix(player, prefix_shop, "§6No Permission.");
- goto("main");
- }
- if(size != 1) {
- msg.prefix(player, prefix_shop, "§6/shop admin");
- goto("main");
- }
- sign_loc = player.getTarget(player, 5, false, false);
- if(!isAWallSign(sign_loc)) {
- msg.prefix(player, prefix_shop, "Look at a sign.");
- goto("main");
- }
- chest_loc = loc.mod(sign_loc, 0, -1, 0);
- if(!isAChest(chest_loc)) {
- msg.prefix(player, prefix_shop, "No chest under sign.");
- goto("main");
- }
- block.setSign(sign_loc, 0, "[Admin Shop]");
- block.setSign(sign_loc, 3, "");
- msg.prefix(player, prefix_shop, "§rCreated Admin Shop.");
- goto("main");
- }
- if(arg0 == "buy" || arg0 == "sell") {
- if(size != 3) {
- msg.prefix(player, prefix_shop, string.concat("§6/shop ", arg0, " <amount> <price>"));
- goto("main");
- }
- amount = list.getIndex(args, 1);
- price = list.getIndex(args, 2);
- if(!isDouble(amount) || !isDouble(amount)) {
- msg.prefix(player, prefix_shop, "§rNumber expected.");
- goto("main");
- }
- if(price < 0) {
- msg.prefix(player, prefix_shop, "§rPositive number expected.");
- goto("main");
- }
- sign_loc = player.getTarget(player, 5, false, false);
- if(!isAWallSign(sign_loc)) {
- msg.prefix(player, prefix_shop, "Look at a sign.");
- goto("main");
- }
- chest_loc = loc.mod(sign_loc, 0, -1, 0);
- if(!isAChest(chest_loc)) {
- msg.prefix(player, prefix_shop, "No chest under sign.");
- goto("main");
- }
- if(!shop.isOwner(player, sign_loc)) {
- msg.prefix(player, prefix_shop, "You are not the owner.");
- goto("main");
- }
- if(arg0 == "buy") {
- block.setSign(sign_loc, 1, string.concat("Buy ", text.number(amount), " for ", text.number(price)));
- } else {
- block.setSign(sign_loc, 2, string.concat("Sell ", text.number(amount), " for ", text.number(price)));
- }
- msg.prefix(player, prefix_shop, "§rPrice set.");
- goto("main");
- }
- if(arg0 == "remove") {
- if(size != 2) {
- msg.prefix(player, prefix_shop, "§6/shop remove <buy/sell>");
- goto("main");
- }
- sign_loc = player.getTarget(player, 5, false, false);
- if(!isAWallSign(sign_loc)) {
- msg.prefix(player, prefix_shop, "Look at a sign.");
- goto("main");
- }
- chest_loc = loc.mod(sign_loc, 0, -1, 0);
- if(!isAChest(chest_loc)) {
- msg.prefix(player, prefix_shop, "No chest under sign.");
- goto("main");
- }
- if(!shop.isOwner(player, sign_loc)) {
- msg.prefix(player, prefix_shop, "You are not the owner.");
- goto("main");
- }
- arg1 = text.toLowerCase(list.getIndex(args, 1));
- if(arg1 == "buy") {
- block.setSign(sign_loc, 1, "");
- } elseif(arg1 == "sell") {
- block.setSign(sign_loc, 2, "");
- } else {
- msg.prefix(player, prefix_shop, "§6/shop remove <buy/sell>");
- goto("main");
- }
- msg.prefix(player, prefix_shop, "§rPrice removed.");
- goto("main");
- }
- goto("syntax");
- }
- 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");
- }
- owner_id = shop.getOwner(block);
- if(owner_id == null) {
- inv_title = "Admin Shop";
- } else {
- owner_name = player.getNameFromId(owner_id);
- if(owner_name == null) {
- msg.prefix(player, prefix_shop, "Invalid shop owner.");
- goto("main");
- }
- inv_title = string.concat("§8Shop of ", owner_name);
- }
- item_stack = shop.getItem(chest_block);
- if(item_stack == null) {
- msg.prefix(player, prefix_shop, "No item found.");
- goto("main");
- }
- inv = inv.new("222320000002322203", inv_title);
- shop.setBuyElement(inv, block, item.clone(item_stack));
- shop.setSellElement(inv, block, item.clone(item_stack));
- inv.setItem(inv, 10, read.item("km:cross_red", 1, "§rCancel"));
- inv.open(inv, player);
- map.add(invid_to_sign_loc, inv.getId(inv), sign_loc);
- }
- goto("main");
- function shop.setBuyElement(sign_block, inv, item_stack) {
- buy_line = block.getSign(sign_block, 1);
- split_list = string.split(" ", buy_line);
- buy_amount = list.getIndex(split_list, 1);
- if(!isDouble(buy_amount)) {
- return;
- }
- buy_price = list.getIndex(split_list, 3);
- if(!isDouble(buy_price)) {
- return;
- }
- item.setAmount(item_stack, buy_amount);
- a = money.split(buy_price);
- gold = a[0];
- silver = a[1];
- bronze = a[2];
- index = 2;
- if(bronze != 0) {
- inv.setItem(inv, index--, read.item("km:coin_copper", bronze));
- }
- if(silver != 0) {
- inv.setItem(inv, index--, read.item("km:coin_silver", silver));
- }
- if(gold != 0) {
- inv.setItem(inv, index, read.item("km:coin_gold", gold));
- }
- inv.setItem(inv, 3, read.item("km:arrow_right", 1, "§rBuy"));
- inv.setItem(inv, 4, item_stack);
- }
- function shop.setSellElement(sign_block, inv, item_stack) {
- sell_line = block.getSign(sign_block, 2);
- split_list = string.split(" ", sell_line);
- sell_amount = list.getIndex(split_list, 1);
- if(!isDouble(sell_amount)) {
- return;
- }
- sell_price = list.getIndex(split_list, 3);
- if(!isDouble(sell_price)) {
- return;
- }
- sell_stack = item.clone(item_stack);
- item.setAmount(sell_stack, sell_amount);
- a = money.split(sell_price);
- gold = a[0];
- silver = a[1];
- bronze = a[2];
- index = 7;
- if(bronze != 0) {
- inv.setItem(inv, index++, read.item("km:coin_copper", bronze));
- }
- if(silver != 0) {
- inv.setItem(inv, index++, read.item("km:coin_silver", silver));
- }
- if(gold != 0) {
- inv.setItem(inv, index, read.item("km:coin_gold", gold));
- }
- inv.setItem(inv, 5, sell_stack);
- inv.setItem(inv, 6, read.item("km:arrow_right", 1, "§rSell"));
- }
- function shop.getItem(chest_block) {
- inv = block.getInventory(chest_block);
- air = item.getAir();
- for(i = 0; i < inv.getSize(inv); i++) {
- item_stack = inv.getItem(inv, i);
- if(item.getType(item_stack) != air) {
- return item.clone(item_stack);
- }
- }
- return null;
- }
- function block.isChest(block) {
- return block.isType(block, "minecraft:chest");
- }
- function block.isWallSign(block) {
- if(block == null) {
- return false;
- }
- return block.hasTag($wall_signs_tag, block);
- }
- function block.getSignAbove(block) {
- sign_loc = loc.mod(block.getLocation(block), 0, 1, 0);
- sign_block = block.get(sign_loc);
- if(block.isAWallSign(sign_block)) {
- return sign_block;
- }
- return null;
- }
- function block.getSecChest(block) {
- loc = block.getLocation(block);
- mod_block = block.get(loc.mod(loc, 1, 0, 0));
- if(block.isChest(mod_block)) {
- return mod_block;
- }
- mod_block = block.get(loc.mod(loc, 0, 0, 1));
- if(block.isChest(mod_block)) {
- return mod_block;
- }
- mod_block = block.get(loc.mod(loc, -1, 0, 0));
- if(block.isChest(mod_block)) {
- return mod_block;
- }
- mod_block = block.get(loc.mod(loc, 0, 0, -1));
- if(block.isChest(mod_block)) {
- return mod_block;
- }
- return null;
- }
- function block.getShopChest(sign_block) {
- sign_loc = block.getLocation(sign_block);
- chest_loc = loc.mod(sign_loc, 0, -1, 0);
- chest_block = block.get(chest_loc);
- if(block.isChest(chest_block)) {
- return chest_block;
- }
- return null;
- }
- function block.getShopSign(chest_block) {
- sign_block == block.getSignAbove(chest_block);
- if(sign_block == null) {
- chest_block = block.getSecChest(chest_block);
- sign_block == block.getSignAbove(chest_block);
- if(sign_block == null) {
- return null;
- }
- }
- if(block.isShopSign(sign_block)) {
- return sign_block;
- }
- return null;
- }
- function block.isShopSign(sign_block) {
- line0 = string.text(block.getSign(sign_block, 0));
- if(line0 == "[Shop]") {
- return true;
- }
- if(line0 == "[Admin Shop]") {
- return true;
- }
- return false;
- }
- function shop.getOwner(sign_block) {
- owner_id = read.number(block.getSign(sign_block, 3));
- if(owner_id == null) {
- return null;
- }
- return owner_id;
- }
- function shop.isOwner(player, sign_block) {
- if(player.hasBypass(player)) {
- return true;
- }
- owner_id = read.number(block.getSign(sign_block, 3));
- if(owner_id == null) {
- return perm.has("adminshop", player);
- }
- owner_name = player.getNameFromId(owner_id);
- if(owner_name == null) {
- return false;
- }
- return owner_id == player.getId(player);
- }
- function shop.getItemAmount(item) {
- if(item.getType(item) == "km:coin_gold") {
- return item.getAmount(item) * 64 * 64;
- }
- if(item.getType(item) == "km:coin_silver") {
- return item.getAmount(item) * 64;
- }
- if(item.getType(item) == "km:coin_copper") {
- return item.getAmount(item);
- }
- return 0;
- }
- function shop.getBuyPrice(inv) {
- snuvis = 0;
- snuvis += shop.getItemAmount(inv.getItem(inv, 0));
- snuvis += shop.getItemAmount(inv.getItem(inv, 1));
- snuvis += shop.getItemAmount(inv.getItem(inv, 2));
- return snuvis;
- }
- function shop.getSellPrice(inv) {
- snuvis = 0;
- snuvis += shop.getItemAmount(inv.getItem(inv, 7));
- snuvis += shop.getItemAmount(inv.getItem(inv, 8));
- snuvis += shop.getItemAmount(inv.getItem(inv, 9));
- return snuvis;
- }
|