我正在为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;
}
您主要必须关注我声明字节的代码块。其余代码循环遍历块并打破它们,没什么特别的。
那么我如何才能使这一块代码更有效率呢?我正在考虑创建一个函数,但是我不太了解函数的功能,我该怎么做呢?例如,我将使用代码 functionname (要破坏的行数);
谢谢, 布拉德
答案 0 :(得分: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);
}
我现在说你就是你需要的地方。
答案 1 :(得分: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
}
答案 2 :(得分: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是函数的参数,在函数内部没有++。
编辑4:在循环声明之前缺少'int'。
Edit5:'玩家'。缺少'pos':s
Edit6:重命名变量并添加了LIMIT
答案 3 :(得分: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&lt; - &gt; int的时间,并且两次减少添加次数:而不是对“k--”和“d1 = mc.thePlayer.posX + k” - 将会有“d1 - = 1.0”。
此外,如果值d1 / d3 / d5始终为正(我不确定),您可以将这些值定义为整数,并将强制转换为k1 / l1 / i2。
答案 4 :(得分:-1)
如果您不知道,有几个if(){}使编译器以相反的顺序检查它们,它会检查最后一个if if然后是if之前的那个然后等等
与if(){}不同,if if(){}
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));
}
}
}
}
}