Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- English description:
- Cutting down trees. Always top to bottom and only with an ax or stick.
- - chop wood from bottom to top. Expenses:
- -- either 1 stick from the right hand on one block of wood
- -- or ax damage by 1 unit. for each block of wood
- -- any enchantments on axes are taken into account (unbreaking, efficiency, fortune)
- - chopping as many logs as sticks or ax strength
- - expl = 0.01% chance to get 1 unit. experience for every 10 felled tree blocks
- - plnt = 5% chance to get a seedling from a tree. (half as much for tropical)
- - appl = 0.5% chance to get an apple from oak foliage, tropical tree and dark oak.
- - stck = 4% additional chance to get a stick from the foliage;
- - if there are several trees nearby, only one type is cut!
- -----------------------------------------------------------------------------------
- Русское описание:
- Рубка деревьев. Всегда сверху вниз и только топором или палкой.
- - рубить дерево снизу вверх. Затраты:
- -- либо 1 палка из правой руки на один блок древесины
- -- либо поломка топора на 1 ед. за каждый блок древесины
- -- учитываются любые зачарования на топорах (прочность, эффективность, удача)
- - рубит столько брёвен, сколько палок или прочности топора
- - expl = 0,01% шанс получить 1 ед. опыта за каждые 10 срубленных блоков дерева
- - plnt = 5% шанс получить саженец с дерева. (вдвое меньше для тропических)
- - appl = 0,5% шанс получить яблоко с листвы дуба, тропического дерева и тёмного дуба.
- - stck = 4% дополнительно шанс получить палку с листвы;
- - если рядом несколько деревьев, рубится только один тип!
- */
- var expl=0.01/100,
- plnt=5/100,
- appl=0.5/100,
- stck=4/100;
- var pl,wr,dLg,name,trg,logArr=[],t=0,hardness=false,fell,mtrl=[0,0],pi=3.141592653589793;
- function init(ev) {
- pl = ev.player, wr=pl.world;
- end(ev);
- var temp=[wr.getBlock(0,0,0).getName(),wr.getBlock(0,0,0).getMetadata()]
- wr.setBlock(0,0,0,'minecraft:log',0)
- mtrl[0]=String(wr.getBlock(0,0,0).getMCBlockState().func_185904_a());
- wr.setBlock(0,0,0,'minecraft:leaves',0)
- mtrl[1]=String(wr.getBlock(0,0,0).getMCBlockState().func_185904_a());
- wr.setBlock(0,0,0,temp[0],temp[1]);
- }
- function attack(ev) {
- pl = ev.player, wr=pl.world;
- var temp=[0,'',-1,'',[]];
- if (ev.type == 2 && pl.getGamemode()==0) {
- if (hardness==false) {hardness = ev.target.getMCBlockState().func_185887_b(wr.getMCWorld(), ev.target.getPos().getMCBlockPos())}
- temp[0] = String(ev.target.getMCBlockState().func_185904_a())==mtrl[0];
- temp[1] = ev.target.getName().indexOf('log')!=(-1);
- temp[2] = pl.getMainhandItem().getName().indexOf('_axe')!=(-1);
- temp[3] = pl.getMainhandItem().getName() == 'minecraft:stick';
- if (temp[0] && temp[1] && temp[2] || temp[3]) { // для дерева если в руке палка или топор
- trg=[ev.target.getX(),ev.target.getY(),ev.target.getZ(),ev.target.getMetadata(),ev.target.getName()];
- if (trg[3]>=8) {trg[3]=trg[3]-8} else if (trg[3]>=4) {trg[3]=trg[3]-4}
- compose(ev,ev.target);
- pl.timers.forceStart(900,1,true);
- fell=true;
- }
- }
- }
- function compose(ev,target) {
- var max=2,cx,cy,cz,sx,sy,sz,mx,my,mz,temp,log,add,chk=[0,0];
- var nx=trg[0],ny=trg[1],nz=trg[2];
- temp=[[nx,ny,nz]];
- logArr=[[nx,ny,nz]];
- chk[0]=wr.createItem(trg[4],trg[3],1);
- while (temp.length) { // найти все брёвна
- if (temp[0][0]-1 < nx-max) {sx=temp[0][0]} else {sx=temp[0][0]-1}
- sy=temp[0][1];
- if (temp[0][2]-1 < nz-max) {sz=temp[0][2]} else {sz=temp[0][2]-1}
- if (temp[0][0]+1 > nx+max) {mx=temp[0][0]} else {mx=temp[0][0]+1}
- my=temp[0][1]+1;
- if (temp[0][2]+1 > nz+max) {mz=temp[0][2]} else {mz=temp[0][2]+1}
- cx=sx,cy=sy,cz=sz;
- while (cy <= my) { // поиск по первой позиции из проверки
- log=wr.getBlock(cx,cy,cz);
- if (log.getMetadata()>=8) {chk[1]=wr.createItem(log.getName(),(log.getMetadata()-8),1)}
- else if (log.getMetadata()>=4) {chk[1]=wr.createItem(log.getName(),(log.getMetadata()-4),1)}
- else {chk[1]=wr.createItem(log.getName(),log.getMetadata(),1)}
- if (String(log.getMCBlockState().func_185904_a())==mtrl[0] && chk[0].getDisplayName()==chk[1].getDisplayName()) { // для дерева
- add=true;
- for (var j=0; j<logArr.length; j++) {
- if (logArr[j][0]==cx && logArr[j][1]==cy && logArr[j][2]==cz) {
- add=false;
- break
- }
- }
- if (add) {
- logArr.push([cx,cy,cz]); // добавить бревно в массив
- 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)}
- if (temp[0][0]!=nx || temp[0][1]==ny || temp[0][2]==nz) {temp.push([cx,cy,cz])} // добавить бревно на поиск
- }
- }
- if (cx==mx || cx==nx+max) {
- cx=sx;
- if (cz==mz || cz==nz+max) {
- cz=sz;
- cy++;
- } else {cz++}
- } else {cx++}
- }
- temp.splice(0,1); // удалить проверенную позицию
- }
- if (pl.getMainhandItem().getName()=='minecraft:stick') { // твёрдость рубящего блока для палок
- if (pl.getMainhandItem().getStackSize() >= logArr.length) {
- target.getMCBlock().func_149711_c(hardness*logArr.length);
- } else {
- target.getMCBlock().func_149711_c(hardness*pl.getMainhandItem().getStackSize());
- }
- }
- else if (pl.getMainhandItem().getName().indexOf('_axe')!=(-1)) { // твёрдость рубящего блока для топоров
- temp=pl.getMainhandItem().getMaxItemDamage()-pl.getMainhandItem().getItemDamage();
- if (temp >= logArr.length || String(pl.getMainhandItem().getItemNbt().getMCNBT()).indexOf("id:34") != (-1)) {
- target.getMCBlock().func_149711_c(hardness*logArr.length);
- } else {
- target.getMCBlock().func_149711_c(hardness*temp);
- }
- }
- }
- function broken(ev) {
- pl = ev.player, wr=pl.world;
- if (pl.getGamemode()==1) {return}
- if (String(ev.block.getMCBlockState().func_185904_a())==mtrl[1] && Math.random() <= stck) { // дроп 2,5% палки из листвы
- 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()+'"}');
- }
- else if (logArr.length && fell) { // нет таймера и есть брёвна
- ev.setCanceled(true);
- if (pl.getMainhandItem().getName()!=='minecraft:stick' && pl.getMainhandItem().getName().indexOf('_axe')==(-1)) { // в руке не топор и не палка
- pl.message('§cНеплохая попытка, но чтобы срубить дерево нужен топор или палка!');
- ev.setCanceled(true);
- return;
- }
- pl.timers.stop(900);
- 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;
- if ((logArr[0][2]-Math.floor(pl.getZ()))<0) {
- angle=90+Math.atan((logArr[0][0]-Math.floor(pl.getX()))/(logArr[0][2]-Math.floor(pl.getZ())))*180/pi;
- } else {
- angle=270+Math.atan((logArr[0][0]-Math.floor(pl.getX()))/(logArr[0][2]-Math.floor(pl.getZ())))*180/pi;
- }
- if (angle<337.5 && angle>=292.5) { // место появления предварительно
- a=[logArr[0][0]-1,logArr[0][1],logArr[0][2]-1];
- } else if (angle<292.5 && angle>=247.5) {
- a=[logArr[0][0],logArr[0][1],logArr[0][2]-1];
- } else if (angle<247.5 && angle>=202.5) {
- a=[logArr[0][0]+1,logArr[0][1],logArr[0][2]-1];
- } else if (angle<202.5 && angle>=157.5) {
- a=[logArr[0][0]+1,logArr[0][1],logArr[0][2]];
- } else if (angle<157.5 && angle>=112.5) {
- a=[logArr[0][0]+1,logArr[0][1],logArr[0][2]+1];
- } else if (angle<112.5 && angle>=67.5) {
- a=[logArr[0][0],logArr[0][1],logArr[0][2]+1];
- } else if (angle<67.5 && angle>=22.5) {
- a=[logArr[0][0]-1,logArr[0][1],logArr[0][2]+1];
- } else {
- a=[logArr[0][0]-1,logArr[0][1],logArr[0][2]];
- }
- if (!wr.getBlock(a[0],a[1],a[2]).isAir()) { // место появления точно
- if (wr.getBlock(a[0],a[1]+1,a[2]).isAir()) {
- a[1]++;
- } else {
- a=[pl.getX(),pl.getY(),pl.getZ()];
- }
- }
- for (var i=(logArr.length-1); i>=0; i--) { // по всем брёвнам начиная сверху
- if (pl.getMainhandItem().getName().indexOf('_axe')!=(-1)) { // топоры с чарами прочность, потеря на каждое бревно
- temp=String(pl.getMainhandItem().getItemNbt().getMCNBT());
- if (pl.getMainhandItem().getNbt().has('unbreaking_pro')) {
- lv = pl.getMainhandItem().getNbt().getShort('unbreaking_pro');
- if (Math.random() <= (1/(lv+1))) {hrd=true} // потеря прочности со спец чаром
- } else if (pl.getMainhandItem().isEnchanted() && temp.indexOf("id:34") != (-1)) {
- for (var e=temp.indexOf("id:34"); e!=0; e--) {
- if (temp.charAt(e)=='s') {le=e}
- if (temp.charAt(e)==':') {
- ls=e+1;
- break;
- }
- }
- lv = Number(temp.substring(ls,le));
- if (Math.random() <= (1/(lv+1))) {hrd=true} // потеря прочности с чаром
- } else {
- hrd=true; // потеря прочности без чара
- }
- }
- if (pl.getMainhandItem().getName()=='minecraft:stick' || pl.getMainhandItem().getName().indexOf('_axe')!=(-1)) {
- sx=logArr[(logArr.length-1)][0]-2;
- sy=logArr[(logArr.length-1)][1];
- sz=logArr[(logArr.length-1)][2]-2;
- mx=logArr[(logArr.length-1)][0]+2;
- my=logArr[(logArr.length-1)][1]+2;
- mz=logArr[(logArr.length-1)][2]+2;
- cx=sx,cy=sy,cz=sz;
- if (i==0) {a=[logArr[i][0]+0.5,logArr[i][1]+0.5,logArr[i][2]+0.5]}
- if (hrd) { // сломать топор на 1
- if (pl.getMainhandItem().getItemDamage()+1 >= pl.getMainhandItem().getMaxItemDamage()) {
- pl.setMainhandItem(wr.createItem('minecraft:air',0,1));
- } else {
- pl.getMainhandItem().setItemDamage(pl.getMainhandItem().getItemDamage()+1);
- }
- }
- else if (pl.getMainhandItem().getName()=='minecraft:stick') { // сломать одну палку
- if (pl.getMainhandItem().getStackSize()<=1) {
- pl.setMainhandItem(wr.createItem('minecraft:air',0,1));
- } else {
- pl.getMainhandItem().setStackSize(pl.getMainhandItem().getStackSize()-1);
- }
- }
- while (cy <= my) { // удаление листьев
- lvs=wr.getBlock(cx,cy,cz);
- if (String(lvs.getMCBlockState().func_185904_a())==mtrl[1]) { // если листва и от дерева
- temp=[false,lvs.getMetadata()];
- 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}
- if (lvs.getName()=='minecraft:leaves2' && wr.getBlock(logArr[i][0],logArr[i][1],logArr[i][2]).getName()=='minecraft:log2' && temp[1]==trg[3]) {
- temp[0]=true;
- } else if (lvs.getName()=='minecraft:leaves' && wr.getBlock(logArr[i][0],logArr[i][1],logArr[i][2]).getName()=='minecraft:log' && temp[1]==trg[3]) {
- temp[0]=true;
- }
- if (temp[0]) {
- lvsEx=true;
- temp=[wr.getBlock(cx,cy,cz),false,0];
- if (pl.getMainhandItem().getName().indexOf('_axe')!=(-1)) { // чары удача
- temp[2]=String(pl.getMainhandItem().getItemNbt().getMCNBT());
- if (pl.getMainhandItem().getNbt().has('luck_pro')) {
- lv = pl.getMainhandItem().getNbt().getShort('luck_pro');
- } else if (pl.getMainhandItem().isEnchanted() && temp[2].indexOf("id:35") != (-1)) {
- for (var e=temp[2].indexOf("id:35"); e!=0; e--) {
- if (temp[2].charAt(e)=='s') {le=e}
- if (temp[2].charAt(e)==':') {
- ls=e+1;
- break;
- }
- }
- lv = Number(temp[2].substring(ls,le));
- }
- } else {lv=0}
- // дроп саженца
- if (lv) {lck==plnt*((lv+2.3333)/2.6666)} else {lck==plnt}
- if (temp[0].getName()=='minecraft:leaves' && temp[0].getMetadata()==3) {lck=lck/2}
- if (Math.random()<=lck) {
- if (temp[0].getName()=='minecraft:leaves2') {
- 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()+'"}');
- } else {
- 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()+'"}');
- }
- }
- // дроп яблока
- if (lv) {lck==appl*((lv+3)/3.6)} else {lck==appl}
- if (Math.random()<=lck) {
- if (temp[0].getName()=='minecraft:leaves2' && temp[0].getMetadata()==1) {
- temp[1]=true;
- } else if (temp[0].getName()=='minecraft:leaves' && temp[0].getMetadata()==0 || temp[0].getMetadata()==3) {
- temp[1]=true;
- }
- 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()+'"}')}
- }
- wr.setBlock(cx,cy,cz,'minecraft:air',0);
- }
- } // материал - листва
- if (cx==mx) {
- cx=sx;
- if (cz==mz) {
- cz=sz;
- cy++;
- } else {cz++}
- } else {cx++}
- }
- wr.setBlock(logArr[i][0],logArr[i][1],logArr[i][2],'minecraft:air',0);
- size++;
- } else {
- break;
- }
- }
- if (size) {
- if (lvsEx) { // дроп опыта
- lvsEx=[Math.floor(size/10),0]
- for (var exp=0; exp<=lvsEx[0]; exp++) {if (Math.random()<=expl) {lvsEx[1]++}}
- 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]+'}')}
- }
- while (size>0) { // дроп древесины
- if (size>64) {
- 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()+'"}');
- size=size-64;
- } else {
- 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()+'"}');
- size=0;
- }
- }
- }
- end(ev);
- }
- }
- function timer(ev) {
- pl = ev.player, wr=pl.world;
- var temp=[0,0,0];
- if (ev.id==900) {
- temp[0]=pl.rayTraceBlock(5,0,1);
- if (temp[0]) {
- if (trg && temp[0].getBlock().getName()!=trg[4]) {
- end(ev);
- } else if (!trg) {
- end(ev);
- }
- } else {end(ev)}
- }
- }
- function end(ev) {
- pl.timers.stop(900);
- var temp=[wr.getBlock(0,0,0).getName(),wr.getBlock(0,0,0).getMetadata()]
- wr.setBlock(0,0,0,'minecraft:log',0);
- wr.getBlock(0,0,0).getMCBlock().func_149711_c(2.0);
- wr.setBlock(0,0,0,'minecraft:log2',0);
- wr.getBlock(0,0,0).getMCBlock().func_149711_c(2.0);
- wr.setBlock(0,0,0,temp[0],temp[1]);
- logArr=[]
- fell=false;
- hardness=false;
- trg=undefined;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement