2

我正在为 Minecraft 制作一种“hack”或“mod”。它会删除你周围的块,然后向前移动,删除更多,向前移动等。经过一定时间后,它会移动到一边并返回。这就像世界正在慢慢地自我删除:D

if(Camb.nuker){
    whenToStop++;
    byte byte0 = 3;
    if(whenToStop < 60){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 60 && whenToStop < 65){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 65 && whenToStop < 124){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
    if(whenToStop > 124 && whenToStop < 129){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 129 && whenToStop < 188){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 188 && whenToStop < 193){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 193 && whenToStop < 252){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
    if(whenToStop > 252 && whenToStop < 257){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 257 && whenToStop < 316){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 316 && whenToStop < 321){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 321 && whenToStop < 376){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }

    for(int k = byte0; k > -byte0; k--)
    {
        for(int i1 = byte0; i1 > -byte0; i1--)
        {
            for(int j1 = byte0; j1 > -byte0; j1--)
            {
                double d1 = mc.thePlayer.posX + (double)k;
                double d3 = mc.thePlayer.posY + (double)i1;
                double d5 = mc.thePlayer.posZ + (double)j1;
                int k1 = (int)d1;
                int l1 = (int)d3;
                int i2 = (int)d5;
                int j2 = mc.theWorld.getBlockId(k1, l1, i2);
                Block block = Block.blocksList[j2];
                if(block != null){
                    ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(0, k1, l1, i2, 1));
                    ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(2, k1, l1, i2, 1));   
                }
            }
        }
    }
}
if(Camb.nuker==false){
    whenToStop = 0;
}

您主要必须关注我声明字节的代码块。其余代码循环遍历块并破坏它们,没什么特别的。

那么如何让这段代码更有效率呢?我正在考虑制作一个功能,但我对制作功能不太了解,我该怎么做呢?例如,我会使用代码函数名(要中断的行数);

谢谢,布拉德

4

5 回答 5

5

第一次点击 if 块可能是这样的:

double dx = 0, dy = 0, dz = 0;
whenToStop++;
if (whenToStop < 60) {
  dz = -1.5;
} else if (whenToStop < 65) {
  dx = -1.2;
} else if (whenToStop < 124) {
  dz = +1.5;
} else if (whenToStop < 129) {
  dx = -1.2;
} else if (whenToStop < 188) {
  dz = -1.5;
} else if (whenToStop < 193) {
  dx = -1.2;
} else if (whenToStop < 252) {
  dz = +1.5;
} else if (whenToStop < 257) {
  dx = -1.2;
} else if (whenToStop < 316) {
  dz = -1.5;
} else if (whenToStop < 321) {
  dx = -1.2;
} else if (whenToStop < 376) {
  dz = +1.5;
}
setPosition(posX + dx, posY + dy, posZ + dz);

但这提出了一个问题,当值完全等于 60 时会发生什么?这种效果是故意的吗?

现在是这种形式,您应该能够使用某种形式的数组作为分割点。

class D {
  final int p;
  final double x;
  final double y;
  final double z;

  public D(int p, double x, double y, double z) {
    this.p = p;
    this.x = x;
    this.y = y;
    this.z = z;
  }
}

D[] d = {
  new D(60,     0,   0, -1.5),
  new D(65,  -1.2,   0,    0),
  new D(124,    0,   0, +1.5),
  new D(129, -1.2,   0,    0),
  new D(188,    0,   0, -1.5),
  new D(193, -1.2,   0,    0),
  new D(252,    0,   0, +1.5),
  new D(257, -1.2,   0,    0),
  new D(316,    0,   0, -1.5),
  new D(321, -1.2,   0,    0),
  new D(376,    0,   0, +1.5),
};

...
  whenToStop++;
  D delta = null;
  for ( int i = 0; i < d.length && whenToStop < d[i].p; i++ ) {
    delta = d[i];
  }
  if ( delta != null ) {
    setPosition(posX + delta.x, posY + delta.y, posZ + delta.z);
  }

我会说现在你在你需要的地方。

于 2013-09-06T22:21:59.913 回答
1

我将详细说明@MadProgrammer 的建议:

创建一个结构来保存每个条件的限制和增量:

class Entry {
  int upper_limit;
  double delta_x;
  double delta_y;
  double delta_z;
}

然后用数据填充结构列表:

ArrayList<Entry> entries;
entries.add(new Entry(60, 0., 0., -1.5));
entries.add(new Entry(65, -1.2, 0., 0.));
// Continue with the remaining entries.

然后将 List 传递给函数:

DoMove(List<Entry> entries, int when_to_stop, SomeClass mc,
       double pos_x, double pos_y, double pos_z) {

  for (Entry entry : entries) {
    if (when_to_stop < entry.upper_limit) {
      // move
    }
  }
 //  Default case or error
}
于 2013-09-06T22:26:04.250 回答
0

我修改过的 OldCurmudgeons 代码。使其成为一个完整的功能(我假设播放器是 PlayerType):

void move(PlayerType player, int step) {
    double dx = 0, dy = 0, dz = 0;
    int cycle = step % 128;
    if (cycle < 60) {
      dz = -1.5;
    } else if (cycle < 64) {
      dx = -1.2;
    } else if (cycle < 124) {
      dz = +1.5;
    } else {
      dx = -1.2;
    } 
    player.setPosition(player.posX + dx, player.posY + dy, player.posZ + dz);

}

然后你的“主程序”会这样称呼它:

final int LIMIT = 1000; // this will stop the movement

if (Camb.nuker) {
   move(mc.thePlayer, step++);
   <your for loop>
   if (step == LIMIT)
     Camb.nuker = false;
} else
  step = 0;

现在,您可以根据需要无限地使用 whenToStop 的大值。

我还认为您在索引中存在轻微错误,因此我将其调整为 64/128 周期。

编辑:最后一块不需要“if”。

Edit2:使它成为一个功能和“主程序”

Edit3:whenToStop 是函数的参数,在所需的函数内部没有++。

Edit4:循环声明之前缺少“int”。

Edit5:“玩家。” 'pos'中缺少:s

Edit6:重命名变量并添加了 LIMIT

于 2013-09-06T22:30:09.580 回答
0

循环可以重写为:

public void checkBytes(byte byte0) {
    double d1e = mc.thePlayer.posX - byte0;
    double d3e = mc.thePlayer.posY - byte0;
    double d5e = mc.thePlayer.posZ - byte0;
    for(double d1 = mc.thePlayer.posX + byte0; d1 > d1e; d1 -= 1.0) {
        for(double d3 = mc.thePlayer.posY + byte0; d3 > d3e; d3 -= 1.0) {
          for(double d1 = mc.thePlayer.posZ + byte0; d5 > d5e; d5 -= 1.0) {
                int k1 = (int)d1;
                int l1 = (int)d3;
                int i2 = (int)d5;
                int j2 = mc.theWorld.getBlockId(k1, l1, i2);
                Block block = Block.blocksList[j2];
                if(block != null){
                   ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(0, k1, l1, i2, 1));
                   ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(2, k1, l1, i2, 1));
                }
            }
        }

    }
}

这将节省转换 double <->int 的时间,并减少两倍的添加次数:而不是对 "k--" 和 "d1 = mc.thePlayer.posX + k" -- 将只有 "d1 -= 1.0 ”。

此外,如果值 d1/d3/d5 始终为正(我不确定),您可以将这些值定义为整数,并删除转换为 k1/l1/i2。

于 2013-09-06T22:34:56.550 回答
-1

万一你不知道,几个 if(){} 让编译器以相反的顺序检查它们,它检查最后一个 if 然后是它之前的 if 然后是它之前的一个,依此类推

不像 if(){}else if(){}

如果 else 使编译器按书面顺序检查它们,则代码中的第一个是第一个检查的

无论如何,这是某种重新格式化的代码

// in your Camb class if possible
//...
private boolean nuker = false;
// more code that changes the nuker variable
public static boolean isNuker(){
    return nuker;
}


// in this class
if(Camb.isNuker()){
        whenToStop++;
        byte byte0 = 3;
        checkWhenToStop(whenToStop)
        checkBytes(byte0)
}else{
    whenToStop = 0;
}

public void checkWhenToStop(int whenToStop){
    if(whenToStop < 60){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 60 && whenToStop < 65){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 65 && whenToStop < 124){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
    if(whenToStop > 124 && whenToStop < 129){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 129 && whenToStop < 188){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 188 && whenToStop < 193){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 193 && whenToStop < 252){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
    if(whenToStop > 252 && whenToStop < 257){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 257 && whenToStop < 316){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 316 && whenToStop < 321){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 321 && whenToStop < 376){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
}

public void checkBytes(byte byte0){
        for(int k = byte0; k > -byte0; k--){
            for(int i1 = byte0; i1 > -byte0; i1--){
                for(int j1 = byte0; j1 > -byte0; j1--){
                    double d1 = mc.thePlayer.posX + (double)k;
                    double d3 = mc.thePlayer.posY + (double)i1;
                    double d5 = mc.thePlayer.posZ + (double)j1;
                    int k1 = (int)d1;
                    int l1 = (int)d3;
                    int i2 = (int)d5;
                    int j2 = mc.theWorld.getBlockId(k1, l1, i2);
                    Block block = Block.blocksList[j2];
                    if(block != null){
                       ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(0, k1, l1, i2, 1));
                       ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(2, k1, l1, i2, 1));
                    }
                }
            }

        }
}
于 2013-09-06T22:17:00.567 回答