Advertisement
BetaZavr

TreeCapitator v1.0

Sep 27th, 2019
388
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. English description:
  3. Cutting down trees. Always top to bottom and only with an ax or stick.
  4. - chop wood from bottom to top. Expenses:
  5. -- either 1 stick from the right hand on one block of wood
  6. -- or ax damage by 1 unit. for each block of wood
  7. -- any enchantments on axes are taken into account (unbreaking, efficiency, fortune)
  8. - chopping as many logs as sticks or ax strength
  9. - expl = 0.01% chance to get 1 unit. experience for every 10 felled tree blocks
  10. - plnt = 5% chance to get a seedling from a tree. (half as much for tropical)
  11. - appl = 0.5% chance to get an apple from oak foliage, tropical tree and dark oak.
  12. - stck = 4% additional chance to get a stick from the foliage;
  13. - if there are several trees nearby, only one type is cut!
  14. -----------------------------------------------------------------------------------
  15. Русское описание:
  16. Рубка деревьев. Всегда сверху вниз и только топором или палкой.
  17. - рубить дерево снизу вверх. Затраты:
  18. -- либо 1 палка из правой руки на один блок древесины
  19. -- либо поломка топора на 1 ед. за каждый блок древесины
  20. -- учитываются любые зачарования на топорах (прочность, эффективность, удача)
  21. - рубит столько брёвен, сколько палок или прочности топора
  22. - expl = 0,01% шанс получить 1 ед. опыта за каждые 10 срубленных блоков дерева
  23. - plnt = 5% шанс получить саженец с дерева. (вдвое меньше для тропических)
  24. - appl = 0,5% шанс получить яблоко с листвы дуба, тропического дерева и тёмного дуба.
  25. - stck = 4% дополнительно шанс получить палку с листвы;
  26. - если рядом несколько деревьев, рубится только один тип!
  27. */
  28. var expl=0.01/100,
  29.     plnt=5/100,
  30.     appl=0.5/100,
  31.     stck=4/100;
  32. var pl,wr,dLg,name,trg,logArr=[],t=0,hardness=false,fell,mtrl=[0,0],pi=3.141592653589793;
  33. function init(ev) {
  34.     pl = ev.player, wr=pl.world;
  35.     end(ev);
  36.     var temp=[wr.getBlock(0,0,0).getName(),wr.getBlock(0,0,0).getMetadata()]
  37.     wr.setBlock(0,0,0,'minecraft:log',0)
  38.     mtrl[0]=String(wr.getBlock(0,0,0).getMCBlockState().func_185904_a());
  39.     wr.setBlock(0,0,0,'minecraft:leaves',0)
  40.     mtrl[1]=String(wr.getBlock(0,0,0).getMCBlockState().func_185904_a());
  41.     wr.setBlock(0,0,0,temp[0],temp[1]);
  42. }
  43. function attack(ev) {
  44.     pl = ev.player, wr=pl.world;
  45.     var temp=[0,'',-1,'',[]];
  46.     if (ev.type == 2 && pl.getGamemode()==0) {
  47.         if (hardness==false) {hardness = ev.target.getMCBlockState().func_185887_b(wr.getMCWorld(), ev.target.getPos().getMCBlockPos())}
  48.         temp[0] = String(ev.target.getMCBlockState().func_185904_a())==mtrl[0];
  49.         temp[1] = ev.target.getName().indexOf('log')!=(-1);
  50.         temp[2] = pl.getMainhandItem().getName().indexOf('_axe')!=(-1);
  51.         temp[3] = pl.getMainhandItem().getName() == 'minecraft:stick';
  52.         if (temp[0] && temp[1] && temp[2] || temp[3]) { // для дерева если в руке палка или топор
  53.             trg=[ev.target.getX(),ev.target.getY(),ev.target.getZ(),ev.target.getMetadata(),ev.target.getName()];
  54.             if (trg[3]>=8) {trg[3]=trg[3]-8} else if (trg[3]>=4) {trg[3]=trg[3]-4}
  55.             compose(ev,ev.target);
  56.             pl.timers.forceStart(900,1,true);
  57.             fell=true;
  58.         }
  59.     }
  60. }
  61. function compose(ev,target) {
  62.     var max=2,cx,cy,cz,sx,sy,sz,mx,my,mz,temp,log,add,chk=[0,0];
  63.     var nx=trg[0],ny=trg[1],nz=trg[2];
  64.     temp=[[nx,ny,nz]];
  65.     logArr=[[nx,ny,nz]];
  66.     chk[0]=wr.createItem(trg[4],trg[3],1);
  67.     while (temp.length) { // найти все брёвна
  68.         if (temp[0][0]-1 < nx-max) {sx=temp[0][0]} else {sx=temp[0][0]-1}
  69.         sy=temp[0][1];
  70.         if (temp[0][2]-1 < nz-max) {sz=temp[0][2]} else {sz=temp[0][2]-1}
  71.         if (temp[0][0]+1 > nx+max) {mx=temp[0][0]} else {mx=temp[0][0]+1}
  72.         my=temp[0][1]+1;
  73.         if (temp[0][2]+1 > nz+max) {mz=temp[0][2]} else {mz=temp[0][2]+1}
  74.         cx=sx,cy=sy,cz=sz;
  75.         while (cy <= my) { // поиск по первой позиции из проверки
  76.             log=wr.getBlock(cx,cy,cz);
  77.             if (log.getMetadata()>=8) {chk[1]=wr.createItem(log.getName(),(log.getMetadata()-8),1)}
  78.             else if (log.getMetadata()>=4) {chk[1]=wr.createItem(log.getName(),(log.getMetadata()-4),1)}
  79.             else {chk[1]=wr.createItem(log.getName(),log.getMetadata(),1)}
  80.             if (String(log.getMCBlockState().func_185904_a())==mtrl[0] && chk[0].getDisplayName()==chk[1].getDisplayName()) { // для дерева
  81.                 add=true;
  82.                 for (var j=0; j<logArr.length; j++) {
  83.                     if (logArr[j][0]==cx && logArr[j][1]==cy && logArr[j][2]==cz) {
  84.                         add=false;
  85.                         break
  86.                     }
  87.                 }
  88.                 if (add) {
  89.                     logArr.push([cx,cy,cz]); // добавить бревно в массив
  90.                     if (cy-ny > 2 && Math.floor((cy-ny+1.25)/1.625)<11 && max < Math.floor((cy-ny+1.25)/1.625)) {max=Math.floor((cy-ny+1.25)/1.625)}
  91.                     if (temp[0][0]!=nx || temp[0][1]==ny || temp[0][2]==nz) {temp.push([cx,cy,cz])} // добавить бревно на поиск
  92.                 }
  93.             }
  94.             if (cx==mx || cx==nx+max) {
  95.                 cx=sx;
  96.                 if (cz==mz || cz==nz+max) {
  97.                     cz=sz;
  98.                     cy++;
  99.                 } else {cz++}
  100.             } else {cx++}
  101.         }
  102.         temp.splice(0,1); // удалить проверенную позицию
  103.     }
  104.     if (pl.getMainhandItem().getName()=='minecraft:stick') { // твёрдость рубящего блока для палок
  105.         if (pl.getMainhandItem().getStackSize() >= logArr.length) {
  106.             target.getMCBlock().func_149711_c(hardness*logArr.length);
  107.         } else {
  108.             target.getMCBlock().func_149711_c(hardness*pl.getMainhandItem().getStackSize());
  109.         }
  110.     }
  111.     else if (pl.getMainhandItem().getName().indexOf('_axe')!=(-1)) { // твёрдость рубящего блока для топоров
  112.         temp=pl.getMainhandItem().getMaxItemDamage()-pl.getMainhandItem().getItemDamage();
  113.         if (temp >= logArr.length || String(pl.getMainhandItem().getItemNbt().getMCNBT()).indexOf("id:34") != (-1)) {
  114.             target.getMCBlock().func_149711_c(hardness*logArr.length);
  115.         } else {
  116.             target.getMCBlock().func_149711_c(hardness*temp);
  117.         }
  118.     }
  119. }
  120. function broken(ev) {
  121.     pl = ev.player, wr=pl.world;
  122.     if (pl.getGamemode()==1) {return}
  123.     if (String(ev.block.getMCBlockState().func_185904_a())==mtrl[1] && Math.random() <= stck) { // дроп 2,5% палки из листвы
  124.         ev.API.executeCommand(wr, '/summon minecraft:item '+(ev.block.getX()+0.5)+' '+(ev.block.getY()+0.5)+' '+(ev.block.getZ()+0.5)+' {Motion:[0.0, 0.2, 0.0],Item:{id:"minecraft:stick",Count:1,Damage:0},PickupDelay:0,ownerName:"'+pl.getUUID()+'"}');
  125.     }
  126.     else if (logArr.length && fell) { // нет таймера и есть брёвна
  127.         ev.setCanceled(true);
  128.         if (pl.getMainhandItem().getName()!=='minecraft:stick' && pl.getMainhandItem().getName().indexOf('_axe')==(-1)) { // в руке не топор и не палка
  129.             pl.message('§cНеплохая попытка, но чтобы срубить дерево нужен топор или палка!');
  130.             ev.setCanceled(true);
  131.             return;        
  132.         }
  133.         pl.timers.stop(900);
  134.         var hrd=false,size=0,lv,ls,le,cx,cy,cz,sx,sy,sz,mx,my,mz,temp,angle,a=[0,0,0],lvs,lvsEx=false,cnt,lck;
  135.         if ((logArr[0][2]-Math.floor(pl.getZ()))<0) {
  136.             angle=90+Math.atan((logArr[0][0]-Math.floor(pl.getX()))/(logArr[0][2]-Math.floor(pl.getZ())))*180/pi;
  137.         } else {
  138.             angle=270+Math.atan((logArr[0][0]-Math.floor(pl.getX()))/(logArr[0][2]-Math.floor(pl.getZ())))*180/pi;
  139.         }
  140.         if (angle<337.5 && angle>=292.5) { // место появления предварительно
  141.             a=[logArr[0][0]-1,logArr[0][1],logArr[0][2]-1];
  142.         } else if (angle<292.5 && angle>=247.5) {
  143.             a=[logArr[0][0],logArr[0][1],logArr[0][2]-1];
  144.         } else if (angle<247.5 && angle>=202.5) {
  145.             a=[logArr[0][0]+1,logArr[0][1],logArr[0][2]-1];
  146.         } else if (angle<202.5 && angle>=157.5) {
  147.             a=[logArr[0][0]+1,logArr[0][1],logArr[0][2]];
  148.         } else if (angle<157.5 && angle>=112.5) {
  149.             a=[logArr[0][0]+1,logArr[0][1],logArr[0][2]+1];
  150.         } else if (angle<112.5 && angle>=67.5) {
  151.             a=[logArr[0][0],logArr[0][1],logArr[0][2]+1];
  152.         } else if (angle<67.5 && angle>=22.5) {
  153.             a=[logArr[0][0]-1,logArr[0][1],logArr[0][2]+1];
  154.         } else {
  155.             a=[logArr[0][0]-1,logArr[0][1],logArr[0][2]];
  156.         }
  157.         if (!wr.getBlock(a[0],a[1],a[2]).isAir()) { // место появления точно
  158.             if (wr.getBlock(a[0],a[1]+1,a[2]).isAir()) {
  159.                 a[1]++;
  160.             } else {
  161.                 a=[pl.getX(),pl.getY(),pl.getZ()];
  162.             }
  163.         }
  164.         for (var i=(logArr.length-1); i>=0; i--) { // по всем брёвнам начиная сверху
  165.             if (pl.getMainhandItem().getName().indexOf('_axe')!=(-1)) { // топоры с чарами прочность, потеря на каждое бревно
  166.                 temp=String(pl.getMainhandItem().getItemNbt().getMCNBT());
  167.                 if (pl.getMainhandItem().getNbt().has('unbreaking_pro')) {
  168.                     lv = pl.getMainhandItem().getNbt().getShort('unbreaking_pro');
  169.                     if (Math.random() <= (1/(lv+1))) {hrd=true} // потеря прочности со спец чаром
  170.                 } else if (pl.getMainhandItem().isEnchanted() && temp.indexOf("id:34") != (-1)) {
  171.                     for (var e=temp.indexOf("id:34"); e!=0; e--) {
  172.                         if (temp.charAt(e)=='s') {le=e}
  173.                         if (temp.charAt(e)==':') {
  174.                             ls=e+1;
  175.                             break;
  176.                         }
  177.                     }
  178.                     lv = Number(temp.substring(ls,le));
  179.                     if (Math.random() <= (1/(lv+1))) {hrd=true} // потеря прочности с чаром
  180.                 } else {
  181.                     hrd=true; // потеря прочности без чара
  182.                 }          
  183.             }
  184.             if (pl.getMainhandItem().getName()=='minecraft:stick' || pl.getMainhandItem().getName().indexOf('_axe')!=(-1)) {
  185.                 sx=logArr[(logArr.length-1)][0]-2;
  186.                 sy=logArr[(logArr.length-1)][1];
  187.                 sz=logArr[(logArr.length-1)][2]-2;
  188.                 mx=logArr[(logArr.length-1)][0]+2;
  189.                 my=logArr[(logArr.length-1)][1]+2;
  190.                 mz=logArr[(logArr.length-1)][2]+2;
  191.                 cx=sx,cy=sy,cz=sz;
  192.                 if (i==0) {a=[logArr[i][0]+0.5,logArr[i][1]+0.5,logArr[i][2]+0.5]}
  193.                 if (hrd) { // сломать топор на 1
  194.                     if (pl.getMainhandItem().getItemDamage()+1 >= pl.getMainhandItem().getMaxItemDamage()) {
  195.                         pl.setMainhandItem(wr.createItem('minecraft:air',0,1));
  196.                     } else {
  197.                         pl.getMainhandItem().setItemDamage(pl.getMainhandItem().getItemDamage()+1);
  198.                     }
  199.                 }
  200.                 else if (pl.getMainhandItem().getName()=='minecraft:stick') { // сломать одну палку
  201.                     if (pl.getMainhandItem().getStackSize()<=1) {
  202.                         pl.setMainhandItem(wr.createItem('minecraft:air',0,1));
  203.                     } else {
  204.                         pl.getMainhandItem().setStackSize(pl.getMainhandItem().getStackSize()-1);
  205.                     }
  206.                 }
  207.                 while (cy <= my) { // удаление листьев
  208.                     lvs=wr.getBlock(cx,cy,cz);
  209.                     if (String(lvs.getMCBlockState().func_185904_a())==mtrl[1]) { // если листва и от дерева
  210.                         temp=[false,lvs.getMetadata()];
  211.                         if (temp[1]>=12) {temp[1]=temp[1]-12} else if (temp[1]>=8) {temp[1]=temp[1]-8} else if (temp[1]>=4) {temp[1]=trg[3]-4}
  212.                         if (lvs.getName()=='minecraft:leaves2' && wr.getBlock(logArr[i][0],logArr[i][1],logArr[i][2]).getName()=='minecraft:log2' && temp[1]==trg[3]) {
  213.                             temp[0]=true;
  214.                         } else if (lvs.getName()=='minecraft:leaves' && wr.getBlock(logArr[i][0],logArr[i][1],logArr[i][2]).getName()=='minecraft:log' && temp[1]==trg[3]) {
  215.                             temp[0]=true;
  216.                         }
  217.                         if (temp[0]) {
  218.                             lvsEx=true;
  219.                             temp=[wr.getBlock(cx,cy,cz),false,0];
  220.                             if (pl.getMainhandItem().getName().indexOf('_axe')!=(-1)) { // чары удача
  221.                                 temp[2]=String(pl.getMainhandItem().getItemNbt().getMCNBT());
  222.                                 if (pl.getMainhandItem().getNbt().has('luck_pro')) {
  223.                                     lv = pl.getMainhandItem().getNbt().getShort('luck_pro');
  224.                                 } else if (pl.getMainhandItem().isEnchanted() && temp[2].indexOf("id:35") != (-1)) {
  225.                                     for (var e=temp[2].indexOf("id:35"); e!=0; e--) {
  226.                                         if (temp[2].charAt(e)=='s') {le=e}
  227.                                         if (temp[2].charAt(e)==':') {
  228.                                             ls=e+1;
  229.                                             break;
  230.                                         }
  231.                                     }
  232.                                     lv = Number(temp[2].substring(ls,le));
  233.                                 }
  234.                             } else {lv=0}
  235.                             //  дроп саженца
  236.                             if (lv) {lck==plnt*((lv+2.3333)/2.6666)} else {lck==plnt}
  237.                             if (temp[0].getName()=='minecraft:leaves' && temp[0].getMetadata()==3) {lck=lck/2}
  238.                             if (Math.random()<=lck) {
  239.                                 if (temp[0].getName()=='minecraft:leaves2') {
  240.                                     ev.API.executeCommand(wr,'/summon minecraft:item '+(cx+0.5)+' '+(cy+0.5)+' '+(cz+0.5)+' {Motion:[0.0, 0.2, 0.0],Item:{id:"minecraft:sapling",Count:1,Damage:'+(temp[0].getMetadata()+4)+'},PickupDelay:0,ownerName:"'+pl.getUUID()+'"}');
  241.                                 } else {
  242.                                     ev.API.executeCommand(wr,'/summon minecraft:item '+(cx+0.5)+' '+(cy+0.5)+' '+(cz+0.5)+' {Motion:[0.0, 0.2, 0.0],Item:{id:"minecraft:sapling",Count:1,Damage:'+temp[0].getMetadata()+'},PickupDelay:0,ownerName:"'+pl.getUUID()+'"}');
  243.                                 }
  244.                             }
  245.                             //  дроп яблока
  246.                             if (lv) {lck==appl*((lv+3)/3.6)} else {lck==appl}
  247.                             if (Math.random()<=lck) {
  248.                                 if (temp[0].getName()=='minecraft:leaves2' && temp[0].getMetadata()==1) {
  249.                                     temp[1]=true;
  250.                                 } else if (temp[0].getName()=='minecraft:leaves' && temp[0].getMetadata()==0 || temp[0].getMetadata()==3) {
  251.                                     temp[1]=true;
  252.                                 }
  253.                                 if (temp[1]) {ev.API.executeCommand(wr,'/summon minecraft:item '+(cx+0.5)+' '+(cy+0.5)+' '+(cz+0.5)+' {Motion:[0.0, 0.2, 0.0],Item:{id:"minecraft:apple",Count:1,Damage:0},PickupDelay:0,ownerName:"'+pl.getUUID()+'"}')}
  254.                             }
  255.                             wr.setBlock(cx,cy,cz,'minecraft:air',0);
  256.                         }
  257.                     } // материал - листва
  258.                     if (cx==mx) {
  259.                         cx=sx;
  260.                         if (cz==mz) {
  261.                             cz=sz;
  262.                             cy++;
  263.                         } else {cz++}
  264.                     } else {cx++}
  265.                 }
  266.                 wr.setBlock(logArr[i][0],logArr[i][1],logArr[i][2],'minecraft:air',0);
  267.                 size++;
  268.             } else {
  269.                 break;
  270.             }
  271.         }
  272.         if (size) {
  273.             if (lvsEx) { // дроп опыта
  274.                 lvsEx=[Math.floor(size/10),0]
  275.                 for (var exp=0; exp<=lvsEx[0]; exp++) {if (Math.random()<=expl) {lvsEx[1]++}}
  276.                 if (lvsEx[1]) {ev.API.executeCommand(wr,'/summon minecraft:xp_orb '+a[0]+' '+a[1]+' '+a[2]+' {Motion:[0.0, 0.32, 0.0],Value:'+lvsEx[1]+'}')}
  277.             }
  278.             while (size>0) { // дроп древесины
  279.                 if (size>64) {
  280.                     ev.API.executeCommand(wr, '/summon minecraft:item '+a[0]+' '+a[1]+' '+a[2]+' {Motion:[0.0, 0.2, 0.0],Item:{id:"'+trg[4]+'",Count:64,Damage:'+trg[3]+'},PickupDelay:0,ownerName:"'+pl.getUUID()+'"}');
  281.                     size=size-64;
  282.                 } else {
  283.                     ev.API.executeCommand(wr, '/summon minecraft:item '+a[0]+' '+a[1]+' '+a[2]+' {Motion:[0.0, 0.2, 0.0],Item:{id:"'+trg[4]+'",Count:'+size+',Damage:'+trg[3]+'},PickupDelay:0,ownerName:"'+pl.getUUID()+'"}');
  284.                     size=0;
  285.                 }
  286.             }
  287.         }
  288.         end(ev);
  289.     }
  290. }
  291. function timer(ev) {
  292.     pl = ev.player, wr=pl.world;
  293.     var temp=[0,0,0];
  294.     if (ev.id==900) {
  295.         temp[0]=pl.rayTraceBlock(5,0,1);
  296.         if (temp[0]) {
  297.             if (trg && temp[0].getBlock().getName()!=trg[4]) {
  298.                 end(ev);
  299.             } else if (!trg) {
  300.                 end(ev);
  301.             }
  302.         } else {end(ev)}
  303.     }
  304. }
  305. function end(ev) {
  306.     pl.timers.stop(900);
  307.     var temp=[wr.getBlock(0,0,0).getName(),wr.getBlock(0,0,0).getMetadata()]
  308.     wr.setBlock(0,0,0,'minecraft:log',0);
  309.     wr.getBlock(0,0,0).getMCBlock().func_149711_c(2.0);
  310.     wr.setBlock(0,0,0,'minecraft:log2',0);
  311.     wr.getBlock(0,0,0).getMCBlock().func_149711_c(2.0);
  312.     wr.setBlock(0,0,0,temp[0],temp[1]);
  313.     logArr=[]
  314.     fell=false;
  315.     hardness=false;
  316.     trg=undefined;
  317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement