2

Minecraft の一種の「ハック」または「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;
}

主に、バイトを宣言するコードのチャンクに注目する必要があります。コードの残りの部分は、ブロックをループしてブロックを壊しているだけで、特別なことは何もありません。

では、そのコードのチャンクをより効率的にするにはどうすればよいでしょうか? 関数を作ろうと思っているのですが、関数を作るのにあまり詳しくないのですが、どうすればそのようなことができますか? たとえば、コードfunctionname (number of rows to break); を使用します。

ありがとう、ブラッド

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 に答える
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 の時間が節約され、加算回数が 2 倍減少します: "k--" と "d1 = mc.thePlayer.posX + k" のペアの代わりに -- "d1 -= 1.0" だけになります。 "。

また、値 d1/d3/d5 が常に正の場合 (これについてはよくわかりません)、これらの値を int として定義し、k1/l1/i2 へのキャストを削除できます。

于 2013-09-06T22:34:56.550 に答える
-1

ご存じない場合は、いくつかの if(){} を使用すると、コンパイラは逆の順序でそれらをチェックし、最後の if をチェックし、その前の if をチェックし、その前の if(){} をチェックします。

if(){}else if(){} とは異なります

それ以外の場合、コンパイラーに書かれた順序でそれらをチェックさせる場合、コードの最初のものが最初にチェックされます

とにかく、これはある種の再フォーマットされたコードです

// 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 に答える