Added 'B'ackwards option

Fixed opening of gates with a fixed destination
Added block metadata support
This commit is contained in:
Drakia
2011-07-12 21:07:53 -07:00
parent 4968927528
commit e1e3cd5e39
4 changed files with 98 additions and 85 deletions

View File

@ -31,8 +31,9 @@ public class Gate {
private static HashSet<Integer> frameBlocks = new HashSet<Integer>();
private String filename;
private Integer[][] layout;
private Character[][] layout;
private HashMap<Character, Integer> types;
private HashMap<Character, Integer> metadata;
private RelativeBlockVector[] entrances = new RelativeBlockVector[0];
private RelativeBlockVector[] border = new RelativeBlockVector[0];
private RelativeBlockVector[] controls = new RelativeBlockVector[0];
@ -47,9 +48,10 @@ public class Gate {
private int destroyCost = 0;
private boolean toOwner = false;
private Gate(String filename, Integer[][] layout, HashMap<Character, Integer> types) {
private Gate(String filename, Character[][] layout, HashMap<Character, Integer> types, HashMap<Character, Integer> metadata) {
this.filename = filename;
this.layout = layout;
this.metadata = metadata;
this.types = types;
populateCoordinates();
@ -61,21 +63,20 @@ public class Gate {
ArrayList<RelativeBlockVector> controlList = new ArrayList<RelativeBlockVector>();
RelativeBlockVector[] relativeExits = new RelativeBlockVector[layout[0].length];
int[] exitDepths = new int[layout[0].length];
//int bottom = 0;
RelativeBlockVector lastExit = null;
for (int y = 0; y < layout.length; y++) {
for (int x = 0; x < layout[y].length; x++) {
Integer id = layout[y][x];
Integer id = types.get(layout[y][x]);
if (layout[y][x] == '-') {
controlList.add(new RelativeBlockVector(x, y, 0));
}
if (id == ENTRANCE || id == EXIT) {
entranceList.add(new RelativeBlockVector(x, y, 0));
exitDepths[x] = y;
if (id == EXIT)
this.exitBlock = new RelativeBlockVector(x, y, 0);
//bottom = y;
} else if (id == CONTROL) {
controlList.add(new RelativeBlockVector(x, y, 0));
} else if (id != ANYTHING) {
borderList.add(new RelativeBlockVector(x, y, 0));
}
@ -102,8 +103,6 @@ public class Gate {
}
public void save(String gateFolder) {
HashMap<Integer, Character> reverse = new HashMap<Integer, Character>();
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(gateFolder + filename));
@ -119,14 +118,18 @@ public class Gate {
for (Character type : types.keySet()) {
Integer value = types.get(type);
if (!type.equals('-')) {
reverse.put(value, type);
}
// Skip control values
if (value < 0) continue;
bw.append(type);
bw.append('=');
bw.append(value.toString());
Integer mData = metadata.get(type);
// Append metadata
if (mData != null) {
bw.append(':');
bw.append(mData.toString());
}
bw.newLine();
}
@ -134,23 +137,7 @@ public class Gate {
for (int y = 0; y < layout.length; y++) {
for (int x = 0; x < layout[y].length; x++) {
Integer id = layout[y][x];
Character symbol;
if (id == ENTRANCE) {
symbol = '.';
} else if (id == ANYTHING) {
symbol = ' ';
} else if (id == CONTROL) {
symbol = '-';
} else if (id == EXIT) {
symbol = '*';
} else if (reverse.containsKey(id)) {
symbol = reverse.get(id);
} else {
symbol = '?';
}
Character symbol = layout[y][x];
bw.append(symbol);
}
bw.newLine();
@ -158,7 +145,7 @@ public class Gate {
bw.close();
} catch (IOException ex) {
Stargate.log.log(Level.SEVERE, "Could not load Gate " + filename + " - " + ex.getMessage());
Stargate.log.log(Level.SEVERE, "Could not save Gate " + filename + " - " + ex.getMessage());
}
}
@ -172,7 +159,7 @@ public class Gate {
bw.newLine();
}
public Integer[][] getLayout() {
public Character[][] getLayout() {
return layout;
}
@ -234,20 +221,20 @@ public class Gate {
public boolean matches(Blox topleft, int modX, int modZ) {
for (int y = 0; y < layout.length; y++) {
for (int x = 0; x < layout[y].length; x++) {
int id = layout[y][x];
int id = types.get(layout[y][x]);
if (id == ENTRANCE || id == EXIT) {
if (topleft.modRelative(x, y, 0, modX, 1, modZ).getType() != portalBlockClosed) {
return false;
}
} else if (id == CONTROL) {
if (topleft.modRelative(x, y, 0, modX, 1, modZ).getType() != getControlBlock()) {
return false;
}
} else if (id != ANYTHING) {
if (topleft.modRelative(x, y, 0, modX, 1, modZ).getType() != id) {
return false;
}
Integer mData = metadata.get(layout[y][x]);
if (mData != null && topleft.modRelative(x, y, 0, modX, 1, modZ).getData() != mData) {
return false;
}
}
}
}
@ -270,10 +257,16 @@ public class Gate {
private static Gate loadGate(File file) {
Scanner scanner = null;
boolean designing = false;
ArrayList<ArrayList<Integer>> design = new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Character>> design = new ArrayList<ArrayList<Character>>();
HashMap<Character, Integer> types = new HashMap<Character, Integer>();
HashMap<Character, Integer> metadata = new HashMap<Character, Integer>();
HashMap<String, String> config = new HashMap<String, String>();
int cols = 0;
// Init types map
types.put('.', ENTRANCE);
types.put('*', EXIT);
types.put(' ', ANYTHING);
try {
scanner = new Scanner(file);
@ -282,31 +275,18 @@ public class Gate {
String line = scanner.nextLine();
if (designing) {
ArrayList<Integer> row = new ArrayList<Integer>();
ArrayList<Character> row = new ArrayList<Character>();
if (line.length() > cols) {
cols = line.length();
}
for (Character symbol : line.toCharArray()) {
Integer id = ANYTHING;
if (symbol.equals('.')) {
id = ENTRANCE;
} else if (symbol.equals('*')) {
id = EXIT;
} else if (symbol.equals(' ')) {
id = ANYTHING;
} else if (symbol.equals('-')) {
id = CONTROL;
} else if ((symbol.equals('?')) || (!types.containsKey(symbol))) {
if ((symbol.equals('?')) || (!types.containsKey(symbol))) {
Stargate.log.log(Level.SEVERE, "Could not load Gate " + file.getName() + " - Unknown symbol '" + symbol + "' in diagram");
return null;
} else {
id = types.get(symbol);
}
row.add(id);
row.add(symbol);
}
design.add(row);
@ -320,6 +300,13 @@ public class Gate {
if (key.length() == 1) {
Character symbol = key.charAt(0);
// Check for metadata
if (value.contains(":")) {
split = value.split(":");
value = split[0].trim();
String mData = split[1].trim();
metadata.put(symbol, Integer.parseInt(mData));
}
Integer id = Integer.parseInt(value);
types.put(symbol, id);
@ -337,24 +324,24 @@ public class Gate {
if (scanner != null) scanner.close();
}
Integer[][] layout = new Integer[design.size()][cols];
Character[][] layout = new Character[design.size()][cols];
for (int y = 0; y < design.size(); y++) {
ArrayList<Integer> row = design.get(y);
Integer[] result = new Integer[cols];
ArrayList<Character> row = design.get(y);
Character[] result = new Character[cols];
for (int x = 0; x < cols; x++) {
if (x < row.size()) {
result[x] = row.get(x);
} else {
result[x] = ANYTHING;
result[x] = ' ';
}
}
layout[y] = result;
}
Gate gate = new Gate(file.getName(), layout, types);
Gate gate = new Gate(file.getName(), layout, types, metadata);
gate.portalBlockOpen = readConfig(config, gate, file, "portal-open", gate.portalBlockOpen);
gate.portalBlockClosed = readConfig(config, gate, file, "portal-closed", gate.portalBlockClosed);
@ -407,18 +394,22 @@ public class Gate {
public static void populateDefaults(String gateFolder) {
int Obsidian = Material.OBSIDIAN.getId();
Integer[][] layout = new Integer[][] {
{ANYTHING, Obsidian,Obsidian, ANYTHING},
{Obsidian, ENTRANCE, ENTRANCE, Obsidian},
{CONTROL, ENTRANCE, ENTRANCE, CONTROL},
{Obsidian, EXIT, ENTRANCE, Obsidian},
{ANYTHING, Obsidian, Obsidian, ANYTHING},
Character[][] layout = new Character[][] {
{' ', 'X','X', ' '},
{'X', '.', '.', 'X'},
{'-', '.', '.', '-'},
{'X', '*', '.', 'X'},
{' ', 'X', 'X', ' '},
};
HashMap<Character, Integer> types = new HashMap<Character, Integer>();
types.put('.', ENTRANCE);
types.put('*', EXIT);
types.put(' ', ANYTHING);
types.put('X', Obsidian);
types.put('-', Obsidian);
HashMap<Character, Integer> metadata = new HashMap<Character, Integer>();
Gate gate = new Gate("nethergate.gate", layout, types);
Gate gate = new Gate("nethergate.gate", layout, types, metadata);
gate.save(gateFolder);
registerGate(gate);
}

View File

@ -16,7 +16,6 @@ import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Minecart;
import org.bukkit.entity.Player;
import org.bukkit.entity.StorageMinecart;
import org.bukkit.entity.Vehicle;
@ -56,10 +55,13 @@ public class Portal {
private String network;
private Gate gate;
private String owner = "";
// Options
private boolean hidden = false;
private boolean alwaysOn = false;
private boolean priv = false;
private boolean free = false;
private boolean backwards = false;
private World world;
// Gate options
private boolean verified;
@ -74,8 +76,8 @@ public class Portal {
private Portal(Blox topLeft, int modX, int modZ,
float rotX, SignPost id, Blox button,
String dest, String name,
boolean verified, String network, Gate gate,
String owner, boolean hidden, boolean alwaysOn, boolean priv, boolean free) {
boolean verified, String network, Gate gate, String owner,
boolean hidden, boolean alwaysOn, boolean priv, boolean free, boolean backwards) {
this.topLeft = topLeft;
this.modX = modX;
this.modZ = modZ;
@ -93,6 +95,7 @@ public class Portal {
this.alwaysOn = alwaysOn;
this.priv = priv;
this.free = free;
this.backwards = backwards;
this.world = topLeft.getWorld();
if (this.alwaysOn && !this.fixed) {
@ -126,6 +129,10 @@ public class Portal {
return free;
}
public boolean isBackwards() {
return backwards;
}
public boolean isFree(Player player, Portal dest) {
// This gate is free, the player gets all gates free, or we don't charge for free dest and dest is free
boolean isFree = isFree() || Stargate.hasPerm(player, "stargate.free.use", player.isOp()) ||
@ -155,7 +162,7 @@ public class Portal {
player = openFor;
Portal end = getDestination();
if (end != null && !end.isFixed() && !end.isOpen()) {
if (end != null && !end.isAlwaysOn() && !end.isOpen()) {
end.open(openFor, false);
end.setDestination(this);
if (end.isVerified()) end.drawSign();
@ -218,7 +225,9 @@ public class Portal {
Location traveller = player.getLocation();
Location exit = getExit(traveller);
exit.setYaw(origin.getRotation() - traveller.getYaw() + this.getRotation() + 180);
// Handle backwards gates
int adjust = isBackwards() ? 0 :180;
exit.setYaw(origin.getRotation() - traveller.getYaw() + this.getRotation() + adjust);
// The new method to teleport in a move event is set the "to" field.
event.setTo(exit);
@ -278,14 +287,14 @@ public class Portal {
// Check if the gate has an exit block
if (gate.getExit() != null) {
Blox exit = getBlockAt(gate.getExit());
loc = exit.modRelativeLoc(0D, 0D, 1D, traveller.getYaw(), traveller.getPitch(), modX, 1, modZ);
int back = (isBackwards()) ? -1 : 1;
loc = exit.modRelativeLoc(0D, 0D, 1D, traveller.getYaw(), traveller.getPitch(), modX * back, 1, modZ * back);
} else {
Stargate.log.log(Level.WARNING, "[Stargate] Missing destination point in .gate file " + gate.getFilename());
}
if (loc != null) {
Block block = getWorld().getBlockAt(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
if (block.getType() == Material.STEP) {
if (getWorld().getBlockTypeIdAt(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()) == Material.STEP.getId()) {
loc.setY(loc.getY() + 0.5);
}
@ -517,17 +526,12 @@ public class Portal {
public Blox[] getFrame() {
if (frame == null) {
RelativeBlockVector[] border = gate.getBorder();
RelativeBlockVector[] controls = gate.getControls();
frame = new Blox[border.length + controls.length];
frame = new Blox[border.length];
int i = 0;
for (RelativeBlockVector vector : border) {
frame[i++] = getBlockAt(vector);
}
for (RelativeBlockVector vector : controls) {
frame[i++] = getBlockAt(vector);
}
}
return frame;
@ -631,12 +635,14 @@ public class Portal {
boolean alwaysOn = (options.indexOf('a') != -1 || options.indexOf('A') != -1);
boolean priv = (options.indexOf('p') != -1 || options.indexOf('P') != -1);
boolean free = (options.indexOf('f') != - 1|| options.indexOf('F') != -1);
boolean backwards = (options.indexOf('b') != -1 || options.indexOf('B') != -1);
// Check permissions for options.
if (!Stargate.hasPerm(player, "stargate.option.hidden", player.isOp())) hidden = false;
if (!Stargate.hasPerm(player, "stargate.option.alwayson", player.isOp())) alwaysOn = false;
if (!Stargate.hasPerm(player, "stargate.option.private", player.isOp())) priv = false;
if (!Stargate.hasPerm(player, "stargate.option.free", player.isOp())) free = false;
if (!Stargate.hasPerm(player, "stargate.option.backwards", player.isOp())) backwards = false;
// Can not create a non-fixed always-on gate.
if (alwaysOn && destName.length() == 0) {
@ -644,7 +650,7 @@ public class Portal {
}
// Debug
Stargate.debug("createPortal", "h = " + hidden + " a = " + alwaysOn + " p = " + priv + " f = " + free);
Stargate.debug("createPortal", "h = " + hidden + " a = " + alwaysOn + " p = " + priv + " f = " + free + " b = " + backwards);
if ((network.length() < 1) || (network.length() > 11)) {
network = Stargate.getDefaultNetwork();
@ -773,7 +779,7 @@ public class Portal {
button.setType(Material.STONE_BUTTON.getId());
button.setData(facing);
}
portal = new Portal(topleft, modX, modZ, rotX, id, button, destName, name, true, network, gate, player.getName(), hidden, alwaysOn, priv, free);
portal = new Portal(topleft, modX, modZ, rotX, id, button, destName, name, true, network, gate, player.getName(), hidden, alwaysOn, priv, free, backwards);
// Open always on gate
if (portal.isAlwaysOn()) {
@ -861,6 +867,8 @@ public class Portal {
builder.append(portal.world.getName());
builder.append(':');
builder.append(portal.isFree());
builder.append(':');
builder.append(portal.isBackwards());
bw.append(builder.toString());
bw.newLine();
@ -927,8 +935,9 @@ public class Portal {
boolean alwaysOn = (split.length > 12) ? split[12].equalsIgnoreCase("true") : false;
boolean priv = (split.length > 13) ? split[13].equalsIgnoreCase("true") : false;
boolean free = (split.length > 15) ? split[15].equalsIgnoreCase("true") : false;
boolean backwards = (split.length > 16) ? split[16].equalsIgnoreCase("true") : false;
Portal portal = new Portal(topLeft, modX, modZ, rotX, sign, button, dest, name, false, network, gate, owner, hidden, alwaysOn, priv, free);
Portal portal = new Portal(topLeft, modX, modZ, rotX, sign, button, dest, name, false, network, gate, owner, hidden, alwaysOn, priv, free, backwards);
portal.close(true);
}
scanner.close();

View File

@ -1,6 +1,6 @@
name: Stargate
main: net.TheDgtl.Stargate.Stargate
version: 0.5.1
version: 0.5.5
description: Stargate mod for Bukkit
author: Drakia
website: http://www.thedgtl.net