mirror of
https://github.com/2006-Scape/2006Scape.git
synced 2026-07-03 00:31:51 +00:00
8af938548b
- Dwarf cannon can now be seen by anyone and not just the person who sets it down (they can also see the rotation now) - Fixed doors being removed when clicking them - Removed banking command for regular players - Fixed nulodion now only gives if you have space - Updated nulodion message so it doesnt say to find him at home - Npcs wont follow you if you turn on the cantAttack comamand (for admins - Fixed gate at KBD - Fixed the gates at Ice giants in wildy #closes 132 #closes 203 #closes 211 #closes 6 also this one should be closed from previous patch #closes 219
389 lines
11 KiB
Java
389 lines
11 KiB
Java
package com.rebotted.game.globalworldobjects;
|
|
|
|
import java.io.File;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileReader;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Scanner;
|
|
|
|
import com.rebotted.GameEngine;
|
|
import com.rebotted.game.objects.Objects;
|
|
import com.rebotted.game.players.Player;
|
|
|
|
/**
|
|
*
|
|
* @author Killamess
|
|
*
|
|
*/
|
|
public class DoubleDoors {
|
|
|
|
private static DoubleDoors singleton = null;
|
|
|
|
private List<DoubleDoors> doors = new ArrayList<DoubleDoors>();
|
|
|
|
private File doorFile;
|
|
|
|
public static DoubleDoors getSingleton() {
|
|
if (singleton == null) {
|
|
singleton = new DoubleDoors("./data/doubledoors.txt");
|
|
}
|
|
return singleton;
|
|
}
|
|
|
|
private DoubleDoors(String file){
|
|
doorFile = new File(file);
|
|
}
|
|
|
|
private DoubleDoors getDoor(int id, int x, int y, int z) {
|
|
for (DoubleDoors d : doors) {
|
|
if (d.doorId == id) {
|
|
if (d.x == x && d.y == y && d.z == z) {
|
|
return d;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public boolean handleDoor(Player player, int id, int x, int y, int z) {
|
|
DoubleDoors doorClicked = getDoor(id, x, y, z);
|
|
|
|
if (doorClicked == null) {
|
|
//GameEngine.objectHandler.placeObject(new Objects(-1, x, y, z, 0, 0, 0));
|
|
return true;
|
|
}
|
|
if (doorClicked.doorId > 12000) {
|
|
return true; //nearly all of these are not opened
|
|
}
|
|
if (doorClicked.open == 0) {
|
|
if (doorClicked.originalFace == 0) {
|
|
DoubleDoors lowerDoor = getDoor(id - 3, x, y -1, z);
|
|
DoubleDoors upperDoor = getDoor(id + 3, x, y +1, z);
|
|
if (lowerDoor != null) {
|
|
changeLeftDoor(lowerDoor);
|
|
changeRightDoor(doorClicked);
|
|
} else if (upperDoor != null) {
|
|
changeLeftDoor(doorClicked);
|
|
changeRightDoor(upperDoor);
|
|
}
|
|
} else if (doorClicked.originalFace == 1) {
|
|
DoubleDoors westDoor = getDoor(id - 3, x -1, y, z);
|
|
DoubleDoors eastDoor = getDoor(id + 3, x +1, y, z);
|
|
if (westDoor != null) {
|
|
changeLeftDoor(westDoor);
|
|
changeRightDoor(doorClicked);
|
|
} else if (eastDoor != null) {
|
|
changeLeftDoor(doorClicked);
|
|
changeRightDoor(eastDoor);
|
|
}
|
|
} else if (doorClicked.originalFace == 2) {
|
|
DoubleDoors lowerDoor = getDoor(id - 3, x, y +1, z);
|
|
DoubleDoors upperDoor = getDoor(id + 3, x, y -1, z);
|
|
if (lowerDoor != null) {
|
|
changeLeftDoor(lowerDoor);
|
|
changeRightDoor(doorClicked);
|
|
} else if (upperDoor != null) {
|
|
changeLeftDoor(doorClicked);
|
|
changeRightDoor(upperDoor);
|
|
}
|
|
} else if (doorClicked.originalFace == 3) {
|
|
DoubleDoors westDoor = getDoor(id + 3, x -1, y, z);
|
|
DoubleDoors eastDoor = getDoor(id - 3, x +1, y, z);
|
|
if (westDoor != null) {
|
|
changeLeftDoor(westDoor);
|
|
changeRightDoor(doorClicked);
|
|
} else if (eastDoor != null) {
|
|
changeLeftDoor(doorClicked);
|
|
changeRightDoor(eastDoor);
|
|
}
|
|
}
|
|
} else if (doorClicked.open == 1) {
|
|
if (doorClicked.originalFace == 0) {
|
|
DoubleDoors westDoor = getDoor(id - 3, x -1, y, z);
|
|
DoubleDoors upperDoor = getDoor(id + 3, x +1, y, z);
|
|
if (westDoor != null) {
|
|
changeLeftDoor(westDoor);
|
|
changeRightDoor(doorClicked);
|
|
} else if (upperDoor != null) {
|
|
changeLeftDoor(doorClicked);
|
|
changeRightDoor(upperDoor);
|
|
}
|
|
} else if (doorClicked.originalFace == 1) {
|
|
DoubleDoors northDoor = getDoor(id - 3, x, y + 1, z);
|
|
DoubleDoors southDoor = getDoor(id + 3, x, y -1, z);
|
|
if (northDoor != null) {
|
|
changeLeftDoor(northDoor);
|
|
changeRightDoor(doorClicked);
|
|
} else if (southDoor != null) {
|
|
changeLeftDoor(doorClicked);
|
|
changeRightDoor(southDoor);
|
|
}
|
|
} else if (doorClicked.originalFace == 2) {
|
|
DoubleDoors westDoor = getDoor(id - 3, x -1, y, z);
|
|
DoubleDoors eastDoor = getDoor(id + 3, x, y -1, z);
|
|
if (westDoor != null) {
|
|
changeLeftDoor(westDoor);
|
|
changeRightDoor(doorClicked);
|
|
} else if (eastDoor != null) {
|
|
changeLeftDoor(doorClicked);
|
|
changeRightDoor(eastDoor);
|
|
}
|
|
} else if (doorClicked.originalFace == 3) {
|
|
DoubleDoors northDoor = getDoor(id - 3, x, y + 1, z);
|
|
DoubleDoors southDoor = getDoor(id + 3, x, y -1, z);
|
|
if (northDoor != null) {
|
|
changeLeftDoor(northDoor);
|
|
changeRightDoor(doorClicked);
|
|
} else if (southDoor != null) {
|
|
changeLeftDoor(doorClicked);
|
|
changeRightDoor(southDoor);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void changeLeftDoor(DoubleDoors d) {
|
|
int xAdjustment = 0, yAdjustment = 0;
|
|
|
|
if (d.open == 0) {
|
|
if (d.originalFace == 0 && d.currentFace == 0) {
|
|
xAdjustment = -1;
|
|
} else if (d.originalFace == 1 && d.currentFace == 1) {
|
|
yAdjustment = 1;
|
|
} else if (d.originalFace == 2 && d.currentFace == 2) {
|
|
xAdjustment = +1;
|
|
} else if (d.originalFace == 3 && d.currentFace == 3) {
|
|
yAdjustment = -1;
|
|
}
|
|
} else if (d.open == 1) {
|
|
if (d.originalFace == 0 && d.currentFace == 0) {
|
|
yAdjustment = -1;
|
|
} else if (d.originalFace == 1 && d.currentFace == 1) {
|
|
xAdjustment = -1;
|
|
} else if (d.originalFace == 2 && d.currentFace == 2) {
|
|
xAdjustment = -1;
|
|
} else if (d.originalFace == 3 && d.currentFace == 3) {
|
|
xAdjustment = -1;
|
|
}
|
|
}
|
|
if (xAdjustment != 0 || yAdjustment != 0) {
|
|
GameEngine.objectHandler.placeObject(new Objects(-1, d.x, d.y, d.z, 0, 0, 0));
|
|
}
|
|
if (d.x == d.originalX && d.y == d.originalY) {
|
|
d.x += xAdjustment;
|
|
d.y += yAdjustment;
|
|
} else {
|
|
GameEngine.objectHandler.placeObject(new Objects(-1, d.x, d.y, d.z, 0, 0, 0));
|
|
d.x = d.originalX;
|
|
d.y = d.originalY;
|
|
}
|
|
if (d.doorId == d.originalId) {
|
|
if (d.open == 0) {
|
|
d.doorId += 1;
|
|
} else if (d.open == 1) {
|
|
d.doorId -= 1;
|
|
}
|
|
} else if (d.doorId != d.originalId) {
|
|
if (d.open == 0) {
|
|
d.doorId = d.originalId;
|
|
} else if (d.open == 1) {
|
|
d.doorId = d.originalId;
|
|
}
|
|
}
|
|
GameEngine.objectHandler.placeObject(new Objects(d.doorId, d.x, d.y, d.z, getNextLeftFace(d), 0, 0));
|
|
}
|
|
|
|
private int getNextLeftFace(DoubleDoors d) {
|
|
int f = d.originalFace;
|
|
|
|
if (d.open == 0) {
|
|
if (d.originalFace == 0 && d.currentFace == 0) {
|
|
f = 3;
|
|
} else if (d.originalFace == 1 && d.currentFace == 1) {
|
|
f = 0;
|
|
} else if (d.originalFace == 2 && d.currentFace == 2) {
|
|
f = 1;
|
|
} else if (d.originalFace == 3 && d.currentFace == 3) {
|
|
f = 0;
|
|
} else if (d.originalFace != d.currentFace){
|
|
f = d.originalFace;
|
|
}
|
|
} else if (d.open == 1) {
|
|
if (d.originalFace == 0 && d.currentFace == 0) {
|
|
f = 1;
|
|
} else if (d.originalFace == 1 && d.currentFace == 1) {
|
|
f = 2;
|
|
} else if (d.originalFace == 2 && d.currentFace == 2) {
|
|
f = 1;
|
|
} else if (d.originalFace == 3 && d.currentFace == 3) {
|
|
f = 2;
|
|
} else if (d.originalFace != d.currentFace){
|
|
f = d.originalFace;
|
|
}
|
|
}
|
|
d.currentFace = f;
|
|
return f;
|
|
}
|
|
|
|
public void changeRightDoor(DoubleDoors d) {
|
|
int xAdjustment = 0, yAdjustment = 0;
|
|
|
|
if (d.open == 0) {
|
|
if (d.originalFace == 0 && d.currentFace == 0) {
|
|
xAdjustment = -1;
|
|
} else if (d.originalFace == 1 && d.currentFace == 1) {
|
|
yAdjustment = 1;
|
|
} else if (d.originalFace == 2 && d.currentFace == 2) {
|
|
xAdjustment = +1;
|
|
} else if (d.originalFace == 3 && d.currentFace == 3) {
|
|
yAdjustment = -1;
|
|
}
|
|
} else if (d.open == 1) {
|
|
if (d.originalFace == 0 && d.currentFace == 0) {
|
|
xAdjustment = 1;
|
|
} else if (d.originalFace == 1 && d.currentFace == 1) {
|
|
xAdjustment = -1;
|
|
} else if (d.originalFace == 2 && d.currentFace == 2) {
|
|
yAdjustment = -1;
|
|
} else if (d.originalFace == 3 && d.currentFace == 3) {
|
|
xAdjustment = -1;
|
|
}
|
|
}
|
|
if (xAdjustment != 0 || yAdjustment != 0) {
|
|
GameEngine.objectHandler.placeObject(new Objects(-1, d.x, d.y, d.z, 0, 0, 0));
|
|
}
|
|
if (d.x == d.originalX && d.y == d.originalY) {
|
|
d.x += xAdjustment;
|
|
d.y += yAdjustment;
|
|
} else {
|
|
GameEngine.objectHandler.placeObject(new Objects(-1, d.x, d.y, d.z, 0, 0, 0));
|
|
d.x = d.originalX;
|
|
d.y = d.originalY;
|
|
}
|
|
if (d.doorId == d.originalId) {
|
|
if (d.open == 0) {
|
|
d.doorId += 1;
|
|
} else if (d.open == 1) {
|
|
d.doorId -= 1;
|
|
}
|
|
} else if (d.doorId != d.originalId) {
|
|
if (d.open == 0) {
|
|
d.doorId = d.originalId;
|
|
} else if (d.open == 1) {
|
|
d.doorId = d.originalId;
|
|
}
|
|
}
|
|
GameEngine.objectHandler.placeObject(new Objects(d.doorId, d.x, d.y, d.z, getNextRightFace(d), 0, 0));
|
|
}
|
|
|
|
private int getNextRightFace(DoubleDoors d) {
|
|
int f = d.originalFace;
|
|
|
|
if (d.open == 0) {
|
|
if (d.originalFace == 0 && d.currentFace == 0) {
|
|
f = 1;
|
|
} else if (d.originalFace == 1 && d.currentFace == 1) {
|
|
f = 2;
|
|
} else if (d.originalFace == 2 && d.currentFace == 2) {
|
|
f = 3;
|
|
} else if (d.originalFace == 3 && d.currentFace == 3) {
|
|
f = 2;
|
|
} else if (d.originalFace != d.currentFace){
|
|
f = d.originalFace;
|
|
}
|
|
} else if (d.open == 1) {
|
|
if (d.originalFace == 0 && d.currentFace == 0) {
|
|
f = 3;
|
|
} else if (d.originalFace == 1 && d.currentFace == 1) {
|
|
f = 0;
|
|
} else if (d.originalFace == 2 && d.currentFace == 2) {
|
|
f = 1;
|
|
} else if (d.originalFace == 3 && d.currentFace == 3) {
|
|
f = 2;
|
|
} else if (d.originalFace != d.currentFace){
|
|
f = d.originalFace;
|
|
}
|
|
}
|
|
d.currentFace = f;
|
|
return f;
|
|
}
|
|
|
|
private int doorId;
|
|
private int originalId;
|
|
private int open;
|
|
private int x;
|
|
private int y;
|
|
private int z;
|
|
private int originalX;
|
|
private int originalY;
|
|
private int currentFace;
|
|
private int originalFace;
|
|
|
|
public DoubleDoors(int id, int x, int y, int z, int f, int open) {
|
|
this.doorId = id;
|
|
this.originalId = id;
|
|
this.open = open;
|
|
this.x = x;
|
|
this.originalX = x;
|
|
this.y = y;
|
|
this.z = z;
|
|
this.originalY = y;
|
|
this.currentFace = f;
|
|
this.originalFace = f;
|
|
}
|
|
|
|
public boolean isOpenDoor(int id){
|
|
for (int i = 0; i < openDoors.length; i++) {
|
|
if (id == openDoors[i] || id + 3 == openDoors[i]) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//Have not found any others yet. Maybe only 1 type of double
|
|
//doors exist to operate.
|
|
private static int[] openDoors = {
|
|
1520, 1517
|
|
};
|
|
|
|
public void load() {
|
|
//long start = System.currentTimeMillis();
|
|
try {
|
|
singleton.processLineByLine();
|
|
} catch (FileNotFoundException e) {
|
|
e.printStackTrace();
|
|
}
|
|
//System.out.println("Loaded "+ doors.size() +" Double doors in "+ (System.currentTimeMillis() - start) +"ms.");
|
|
}
|
|
|
|
private final void processLineByLine() throws FileNotFoundException {
|
|
Scanner scanner = new Scanner(new FileReader(doorFile));
|
|
try {
|
|
while(scanner.hasNextLine()) {
|
|
processLine(scanner.nextLine());
|
|
}
|
|
} finally {
|
|
scanner.close();
|
|
}
|
|
}
|
|
|
|
protected void processLine(String line){
|
|
Scanner scanner = new Scanner(line);
|
|
scanner.useDelimiter(" ");
|
|
try {
|
|
while(scanner.hasNextLine()) {
|
|
int id = Integer.parseInt(scanner.next());
|
|
int x = Integer.parseInt(scanner.next());
|
|
int y = Integer.parseInt(scanner.next());
|
|
int f = Integer.parseInt(scanner.next());
|
|
int z = Integer.parseInt(scanner.next());
|
|
doors.add(new DoubleDoors(id, x, y, z, f, isOpenDoor(id) ? 1 : 0));
|
|
}
|
|
} finally {
|
|
scanner.close();
|
|
}
|
|
}
|
|
} |