Noclip fix thanks to ethan

This commit is contained in:
dginovker
2019-12-19 21:47:27 -05:00
parent cfa59f4a4d
commit 00500a072b
7 changed files with 74 additions and 46 deletions
@@ -8,6 +8,7 @@ import java.util.Scanner;
import com.rebotted.GameEngine; import com.rebotted.GameEngine;
import com.rebotted.game.objects.Objects; import com.rebotted.game.objects.Objects;
import com.rebotted.game.players.Player; import com.rebotted.game.players.Player;
import com.rebotted.world.clip.Region;
public class Doors { public class Doors {
@@ -68,6 +69,18 @@ public class Doors {
//todo: improvment: if player manage to get to door then open the door. //todo: improvment: if player manage to get to door then open the door.
if(player.distanceToPoint(x, y) > 1) return false; if(player.distanceToPoint(x, y) > 1) return false;
/**
* Here we shall remove the clipping from the door
* We can't add the clipping back when it is closed, because we apparently never update the d.open value....
*/
if(d != null) {
if(d.open == 0) {
Region.removeClipping(x, y, z);
} else {
//Region.addClipping(x, y, z, 0);
}
}
int xAdjustment = 0, yAdjustment = 0; int xAdjustment = 0, yAdjustment = 0;
if (d.type == 0) { if (d.type == 0) {
if (d.open == 0) { if (d.open == 0) {
@@ -130,15 +130,22 @@ public class Walking implements PacketType {
player.mageAllowed = true; player.mageAllowed = true;
} }
if(player.openDuel) { if (player.WildernessWarning == false && player.wildLevel > 0) {
player.resetWalkingQueue();
player.WildernessWarning = true;
player.getPacketSender().sendFrame126("WARNING!", 6940);
player.getPacketSender().showInterface(1908);
}
if (player.openDuel) {
Client o = (Client) PlayerHandler.players[player.duelingWith]; Client o = (Client) PlayerHandler.players[player.duelingWith];
if(o != null) { if (o != null) {
o.getDueling().declineDuel(); o.getDueling().declineDuel();
} }
player.getDueling().declineDuel(); player.getDueling().declineDuel();
} }
if((player.duelStatus >= 1 && player.duelStatus <= 4) || player.duelStatus == 6) { if ((player.duelStatus >= 1 && player.duelStatus <= 4) || player.duelStatus == 6) {
if(player.duelStatus == 6) { if (player.duelStatus == 6) {
player.getDueling().claimStakedItems(); player.getDueling().claimStakedItems();
} }
return; return;
@@ -153,49 +160,36 @@ public class Walking implements PacketType {
if (packetType == 248) { if (packetType == 248) {
packetSize -= 14; packetSize -= 14;
} }
player.newWalkCmdSteps = (packetSize - 5) / 2;
if (++player.newWalkCmdSteps > player.walkingQueueSize) {
player.newWalkCmdSteps = 0;
return;
}
int steps = (packetSize - 5) / 2;
player.getNewWalkCmdX()[0] = player.getNewWalkCmdY()[0] = 0; player.getNewWalkCmdX()[0] = player.getNewWalkCmdY()[0] = 0;
int firstStepX, firstStepY; int[][] path = new int[steps][2];
int realX = 0; int firstStepX = player.getInStream().readSignedWordBigEndianA();
int realY = 0; for (int i = 0; i < steps; i++) {
path[i][0] = player.getInStream().readSignedByte();
if (player.clickToTele) { path[i][1] = player.getInStream().readSignedByte();
firstStepX = player.getInStream().readSignedWordBigEndianA();
} else {
realX = player.getInStream().readSignedWordBigEndianA();
firstStepX = realX - player.getMapRegionX() * 8;
} }
for (int i = 1; i < player.newWalkCmdSteps; i++) { int firstStepY = player.getInStream().readSignedWordBigEndian();
player.getNewWalkCmdX()[i] = player.getInStream().readSignedByte(); int x = firstStepX;
player.getNewWalkCmdY()[i] = player.getInStream().readSignedByte(); int y = firstStepY;
} player.setNewWalkCmdIsRunning(player.isRunning2 && player.playerEnergy > 0);
for (int i = 0; i < steps; i++) {
if (player.clickToTele) { path[i][0] += firstStepX;
firstStepY = player.getInStream().readSignedWordBigEndian(); path[i][1] += firstStepY;
} else { x = path[i][0];
realY = player.getInStream().readSignedWordBigEndian(); y = path[i][1];
firstStepY = realY - player.getMapRegionY() * 8;
} }
if (!player.clickToTele) { if (!player.clickToTele) {
if (player.distanceToPoint(realX, realY) > 30) { if (player.distanceToPoint(x, y) > 30) {
return; return;
} }
} }
//System.out.println("Player has requested to walk to: "+x+","+y);
player.getPlayerAssistant().playerWalk(x, y);
player.setNewWalkCmdIsRunning(player.getInStream().readSignedByteC() == 1 && player.playerEnergy > 0);
for (int i1 = 0; i1 < player.newWalkCmdSteps; i1++) {
if (player.clickToTele)
player.getPlayerAssistant().movePlayer(player.getNewWalkCmdX()[i1] + firstStepX, player.getNewWalkCmdY()[i1] + firstStepY, player.heightLevel);
player.getNewWalkCmdX()[i1] += firstStepX;
player.getNewWalkCmdY()[i1] += firstStepY;
}
} }
} }
@@ -62,6 +62,27 @@ public class Region {
clips[height][x - regionAbsX][y - regionAbsY] |= shift; clips[height][x - regionAbsX][y - regionAbsY] |= shift;
} }
private void removeClip(int x, int y, int height) {
final int regionAbsX = (id >> 8) * 64;
final int regionAbsY = (id & 0xff) * 64;
if (clips[height] == null) {
clips[height] = new int[64][64];
}
clips[height][x - regionAbsX][y - regionAbsY] = 0;
}
public static void removeClipping(int x, int y, int height) {
final int regionX = x >> 3;
final int regionY = y >> 3;
final int regionId = ((regionX / 8) << 8) + (regionY / 8);
for (Region r : regions) {
if (r.id() == regionId) {
r.removeClip(x, y, height);
break;
}
}
}
private void addProjectileClip(int x, int y, int height, int shift) { private void addProjectileClip(int x, int y, int height, int shift) {
int regionAbsX = (id >> 8) * 64; int regionAbsX = (id >> 8) * 64;
int regionAbsY = (id & 0xff) * 64; int regionAbsY = (id & 0xff) * 64;