BetaZavr

store_for_currency (GUI) 1.12.2 CustomNPCs

Jun 17th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Продавец Пятёрочки:
  2. /* isA - массив; список товаров в каждой ячейке GUI. (оставляйте "0", если ячейка должна быть пустой);
  3. isA.buy - цена за покупку игроком товара у npc (учитывается как за стак из ячейки);
  4. isA.sale - цена за продажу игроком товара для npc (-.-.-.-.-);
  5. isA.amount - [текущее кол-во товара, минимальное кол-во товара, максимальное кол-во товара] ; каждый новый игровой день уснанавливает рандомно;
  6. isA.nbt - тэг в виде строки, для создания предмета;
  7. isA.item - предмет для манипуляций покупки/продажи (оставить "0", код сам его создаёт).
  8. */
  9. var isA = [0,
  10.     {buy:1.936,sale:0.484,amount:[10,8,15],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:cooked_porkchop",Count:4b,tag:{},Damage:0s}',item:0}, // жар. свинина
  11.     {buy:1.452,sale:0.363,amount:[10,8,15],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:cooked_mutton",Count:4b,tag:{},Damage:0s}',item:0}, // жар. баранина
  12.     {buy:1.452,sale:0.363,amount:[12,10,17],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:cooked_chicken",Count:4b,tag:{},Damage:0s}',item:0}, // жар. курятина
  13.     {buy:1.210,sale:0.302,amount:[8,6,12],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:cooked_fish",Count:4b,tag:{},Damage:0s}',item:0}, // жар. треска
  14.     0,0,0,0,0,0,0,0,
  15.     {buy:0.726,sale:0.181,amount:[10,8,15],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:carrot",Count:4b,tag:{},Damage:0s}',item:0}, // морковь
  16.     {buy:0.968,sale:0.242,amount:[10,8,15],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:potato",Count:16b,tag:{},Damage:0s}',item:0}, // картофель
  17.     {buy:0.968,sale:0.242,amount:[12,10,17],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:apple",Count:4b,tag:{},Damage:0s}',item:0}, // яблоки
  18.     {buy:1.210,sale:0.302,amount:[8,6,12],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:bread",Count:4b,tag:{},Damage:0s}',item:0}, // хлеб
  19.     0,0,
  20.     {buy:0.35,sale:0.088,amount:[16,16,24],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:potion",Count:1b,tag:{Potion:"minecraft:water",display:{Name:"Аартезианская вода"},quest:1b},Damage:0s}',item:0},
  21.     0,
  22.     {buy:10,sale:2.5,amount:[10,8,15],nbt:'{ForgeCaps:{"customnpcs:itemscripteddata":{}},id:"minecraft:potion",Count:1b,tag:{Potion:"minecraft:slowness",display:{Name:"Тормазное пойло"},quest:1b},Damage:0s}',item:0}];
  23. // money - [текущее кол-во денег у NPC, минимальное кол-во денег, максимальное кол-во денег] ; каждый новый игровой день уснанавливает рандомно
  24. // shop - кол-во слотов магазина ( = shop*9)
  25. var money = [250,225.500,285.450] ,shop=3 ,day ,ilA ,npcID, playerID, bpData;
  26. var home=[22,4,23,14,4,29]; // позиции npc днём и ночью
  27. function tick(event) {
  28.     npcID = event.npc;
  29.     if (npcID.world.getTime() <= 1000 || npcID.world.getTime() >= 16000) { // ночь
  30.         if (day==undefined || day==true) {
  31.             day = false;
  32.             try {npcID.getAdvanced().setLine(0,0,"Z…z…z…z",null)} catch (err) {}
  33.             try {npcID.getAdvanced().setLine(0,1,"Z…z…z…z.",null)} catch (err) {}
  34.             try {npcID.getAdvanced().setLine(0,2,"Ночью все спят! Я ничего не продаю ночью!",null)} catch (err) {}
  35.             npcID.say('Магазин закрывается. Пошли все вон!');
  36.             npcID.getAi().setAnimation(2); // лежать
  37.             // npcID.setHome(home[3],home[4],home[5]); // позиция ночью
  38.             tpAll(npcID);
  39.         }
  40.     } else if (day==undefined || day==false) { // день
  41.         day = true;
  42.         try {npcID.getAdvanced().setLine(0,0,"Всегда свежие товары!",null)} catch (err) {}
  43.         try {npcID.getAdvanced().setLine(0,1,"В Пятёрочке тебе всегда будут рады.",null)} catch (err) {}
  44.         try {npcID.getAdvanced().setLine(0,2,"Вы уже определились с покупкой?",null)} catch (err) {}
  45.         npcID.getAi().setAnimation(0); // нормально
  46.         // npcID.setHome(home[0],home[1],home[2]); // позиция днём
  47.         // пересоздание магазина
  48.         money[0]=Math.round((money[1]+Math.random()*(money[2]-money[1]))*1000)/1000; // установить случайное кол-во денег от min до max
  49.         for (var i=0;i<isA.length;i++) {
  50.             if (isA[i]) {
  51.                 isA[i].amount[0]=Math.round(isA[i].amount[1]+Math.random()*(isA[i].amount[2]-isA[i].amount[1])); // установить случайное кол-во товаров от min до max
  52.             }
  53.         }
  54.     }
  55.     if (npcID.world.getTime() >= 14995 && npcID.world.getTime() <= 15005) { // говорит перед закрытием магазина
  56.         npcID.say('Через час магазин закрывается! Оплачиваем покупки и по домам.')
  57.     }
  58. }
  59. function interact(event) {
  60.     playerID=event.player, npcID = event.npc;
  61.     if (npcID.world.getTime() <= 1000 || npcID.world.getTime() >= 16000) {return} // ночь
  62.     playerID.closeGui();
  63.     var name=playerID.getName(),item,lore,temp=[],s; // переменные для работы с массивом
  64.     var dPlArr = eval('JSON.parse(playerID.world.getStoreddata().get("data_'+name.toLowerCase()+'"))'); // данные игрока
  65.     if (!dPlArr) { // Магазин использует электронную валюту. Пример её сосздания:
  66.         dPlArr = {mana:0,money:150,key:[],spell:[[]],job:[0,0,[38]],lang:'ru',bonus:{addDamage:0,addProtect:0,manaCost:0,manaReg:0,maxLv:0}}; // создать пустую базу данных
  67.         eval('playerID.world.getStoreddata().put("data_'+name.toLowerCase()+'", JSON.stringify(dPlArr))'); // сохранить базу в мире
  68.     }
  69.     bpData = playerID.showChestGui(shop);
  70.     bpData.setName('Товары Пятёрочки:');
  71.     ilA = [0,0,0,0,0,0,0,0,0, // массив для дополнительных подписей, если подписи не нужны оставляйте "0"
  72.         0,0,0,0,0,0,0,0,0, // lore - как массив строк:
  73.         0,['§f§oОбычный, §f§oУровень'+1,'§7§oИз чистых горных источников.§r'],0,['§f§oОбычный, §f§oУровень'+5,'§7§oСильно ударяет по голове, и вы не чувствуете своих ног.§r']];
  74.     bpData;
  75.     // основные подписи:
  76.     for (var i=36;i<(36+shop*9);i++) { // расстановка предметов:
  77.         s=i-36;
  78.         if (isA[s]) {
  79.             if (isA[s].item) { // создание или выбор товара
  80.                 item = isA[s].item.copy();
  81.             } else {
  82.                 item = playerID.world.createItemFromNbt(event.API.stringToNbt(isA[s].nbt));
  83.                 isA[s].item = item.copy();
  84.             }
  85.             lore=loreSet(item.copy(),isA[s],ilA[s],dPlArr.money); // Изменение подписи
  86.             item.setLore(lore);
  87.             bpData.setSlot(i,item);
  88.             lore=[];
  89.         }
  90.     }
  91. }
  92. function customChestClicked(event){ // управление магазином
  93.     var name = playerID.getName(), dPlArr = eval('JSON.parse(playerID.world.getStoreddata().get("data_'+name.toLowerCase()+'"))');
  94.     var i = event.slot,s = i-36,item,lore,temp=[false,0,0];
  95.     if (isA[s] && event.heldItem.getName() == 'minecraft:air') { // покупка
  96.         if (dPlArr.money < isA[s].buy) { // нехватает денег:
  97.             playerID.message('§c§oУ вас не хватает денег для покупки!§r');
  98.             return;
  99.         }
  100.         if (!isA[s].amount[0]) { // товара нет в наличии:
  101.             playerID.message('§e§oТовар закончился, попробуйте прийти завтра.§r');
  102.             return;
  103.         }
  104.         item = isA[s].item.copy();
  105.         for (var inv=0;inv<(playerID.getInventory().getSize()-5);inv++) { // поиск свободного места:
  106.             if (playerID.getInventory().getSlot(inv).getName()=='minecraft:air') {
  107.                 temp[0]=true;
  108.                 break;
  109.             }
  110.             if (playerID.getInventory().getSlot(inv).getName()==item.getName()) { // поиск подобного предмета
  111.                 temp[1] = playerID.getInventory().getSlot(inv).copy();
  112.                 temp[2] = item.copy();
  113.                 temp[1].setStackSize(1); // игнорировать кол-во
  114.                 temp[1].setCustomName(temp[1].getItemName()); // игнорировать имя предмета
  115.                 temp[2].setStackSize(1);
  116.                 temp[2].setCustomName(temp[2].getItemName());
  117.                 if (String(temp[1].getItemNbt().getMCNBT())==String(temp[2].getItemNbt().getMCNBT()) && (playerID.getInventory().getSlot(inv).getStackSize()+item.getStackSize()) <= item.getMaxStackSize()) { // сверка их сходства
  118.                     temp[0]=true;
  119.                     break;
  120.                 }                  
  121.             }
  122.         }
  123.         if (temp[0]) { // выдать предмет
  124.             playerID.giveItem(item);
  125.             dPlArr.money = Math.round((dPlArr.money-isA[s].buy)*1000)/1000; // изменить монеты игрока
  126.             eval('playerID.world.getStoreddata().put("data_'+name.toLowerCase()+'", JSON.stringify(dPlArr))');
  127.             money[0] = Math.round((money[0]+isA[s].buy)*1000)/1000; // изменить монеты npc
  128.             isA[s].amount[0]=isA[s].amount[0]-1; // изменить кол-во товаров в магазине
  129.             playerID.message('§7Вы успешно купили: §r'+item.getDisplayName()+' §7- §f'+item.getStackSize()+' §7шт.');
  130.             lore=loreSet(item.copy(),isA[s],ilA[s],dPlArr.money); // Изменение подписи
  131.             event.slotItem.setLore(lore);
  132.         } else { // нет места
  133.             playerID.message('§cВ вашем инвентаре нет свободного места!');
  134.         }
  135.         return;
  136.     }
  137.     if (event.heldItem.getName() !== 'minecraft:air') { // продажа
  138.         var held = event.heldItem.copy();
  139.         for (var t=0;t<isA.length;t++) {
  140.             if (isA[t] && event.heldItem.getName()==isA[t].item.getName()) { // поиск подобного предмета в магазине
  141.                 temp[1] = event.heldItem.copy();
  142.                 temp[2] = isA[t].item.copy();
  143.                 temp[1].setStackSize(1); // игнорировать кол-во
  144.                 temp[1].setCustomName(isA[t].item.getItemName()); // игнорировать имя предмета
  145.                 temp[2].setStackSize(1);
  146.                 temp[2].setCustomName(isA[t].item.getItemName());
  147.                 if (String(temp[1].getItemNbt().getMCNBT())==String(temp[2].getItemNbt().getMCNBT()) && held.getStackSize() >= isA[t].item.getStackSize()) {
  148.                     held.setStackSize(held.getStackSize()-isA[t].item.getStackSize()); // убавить кол-во предметов в руке/мышке
  149.                     event.heldItem = held; // изменить предмет руки/мышки
  150.                     dPlArr.money = Math.round((dPlArr.money+isA[t].sale)*1000)/1000; // изменить монеты игрока
  151.                     eval('playerID.world.getStoreddata().put("data_'+name.toLowerCase()+'", JSON.stringify(dPlArr))');
  152.                     money[0] = Math.round((money[0]-isA[t].sale)*1000)/1000; // изменить монеты npc
  153.                     isA[t].amount[0]=isA[t].amount[0]+1; // изменить кол-во товаров в магазине
  154.                     playerID.message('§7Вы успешно продали: §r'+isA[t].item.getDisplayName()+' §7- §f'+isA[t].item.getStackSize()+' §7шт.; за §2'+isA[t].buy+'§7$, теперь у вас: §2'+dPlArr.money+'§7$.');
  155.                     lore=loreSet(isA[t].item.copy(),isA[t],ilA[t],dPlArr.money); // Изменение подписи
  156.                     bpData.getSlot(t+36).setLore(lore);
  157.                 }                  
  158.             }
  159.         }
  160.     }
  161. }
  162. function tpAll(npcID) { // телепортация всех игроков из магазина за входную дверь
  163.     var playerArr = npcID.world.getNearbyEntities(-455, 64, -48, 4, EntityType_PLAYER), plX, plY, plZ;
  164.     for (var i=0; i<playerArr.length;i++) {
  165.         if (!playerArr[i].hasActiveQuest(42)) { // если у игрока не активен квест
  166.             plX = playerArr[i].getBlockX();
  167.             plY = playerArr[i].getBlockY();
  168.             plZ = playerArr[i].getBlockZ();
  169.             if (plX>=-457&&plX<=-453&&plY>=63&&plY<=67&&plZ>=-52&&plZ<=-44) { // если игрок в магазине
  170.                 npcID.executeCommand('/teleport '+playerArr[i].getName()+' -450 64 -51 270'); // tp за дверь, ко входу в магазин
  171.             }
  172.         }
  173.     }
  174. }
  175. function loreSet(item,isA,ilA,mPl) { // пересоздаёт подпись предмета
  176.     var lore=[], temp;
  177.      // сбор подписей с предмета
  178.     if (item.getLore().length) {for (var itemLore=0;itemLore<item.getLore().length;itemLore++) {if (temp) {temp.push(item.getLore()[itemLore])} else {temp = [item.getLore(itemLore)]}}}
  179.     // добавление спец подписей
  180.     if (ilA) {for (var j=0;j<ilA.length;j++) {if (lore.length) {lore.push(ilA[j])} else {lore = [ilA[j]]}}}
  181.     // подписи цены покупки/продажи и инфо:
  182.     if (isA.amount[0]) {
  183.         temp = '§2§oКупить за: §r§f'+String(isA.buy).replace('.',',')+'§2§o$; §7§o(ЛКМ)§r'; // покупка
  184.         if (lore.length) {lore.push(temp)} else {lore = [temp]}
  185.         lore.push('§c§oПродать за: §r§f'+String(isA.sale).replace('.',',')+'§c§o$.§r'); // продажа
  186.         lore.push('§3§oВ наличии ещё: §r§f'+isA.amount[0]+' §3§oшт.§r'); // ещё в наличии
  187.     } else {
  188.         temp = '§c§oПродать за: §r§f'+String(isA.sale).replace('.',',')+'§c§o$.§r'; // продажа
  189.         if (lore.length) {lore.push(temp)} else {lore = [temp]}
  190.         lore.push('§e§oТовар закончился, попробуйте прийти завтра.§r'); // нет в наличии
  191.     }
  192.     lore.push('§7§oЧтобы продать предмет, возьмите его, перенесите на магазин и нажмите ЛКМ.§r'); // инфо как продать
  193.     lore.push('§7§oДенег у NPC: §r'+money[0]+'§7§o$; Денег у вас: §2'+mPl+'§7§o$'); // инфо по деньгам
  194.     return lore;
  195. }
Add Comment
Please, Sign In to add comment