Files
2006Scape/2006Redone Server/src/com/rebotted/game/globalworldobjects/DoubleDoors.java
T
Mr Extremez 8af938548b More fixes (#235)
- 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
2019-12-05 12:55:25 -05:00

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();
}
}
}