Files
Rekkit/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java
EdGruberman efe8e9a7f5 Always return a TravelAgent; Fixes BUKKIT-3541
Recent changes caused PlayerPortalEvent to suddenly return null
unexpectedly and could end up in NPEs resulting that did not before.
This commit addresses that situation by always ensuring a TravelAgent
instance is returned.

The TravelAgent for world 0 is returned arbitrarily in an effort to
compensate for plugins that are implementation dependent and expect some
form of a TravelAgent to be accessible in the event at all times.
2013-02-04 18:53:06 -06:00

80 lines
2.6 KiB
Java

package org.bukkit.craftbukkit;
import net.minecraft.server.ChunkCoordinates;
import net.minecraft.server.PortalTravelAgent;
import net.minecraft.server.WorldServer;
import org.bukkit.Location;
import org.bukkit.TravelAgent;
public class CraftTravelAgent extends PortalTravelAgent implements TravelAgent {
public static TravelAgent DEFAULT = null;
private int searchRadius = 128;
private int creationRadius = 16;
private boolean canCreatePortal = true;
public CraftTravelAgent(WorldServer worldserver) {
super(worldserver);
if (DEFAULT == null && worldserver.dimension == 0) {
DEFAULT = (TravelAgent) worldserver.s();
}
}
public Location findOrCreate(Location target) {
WorldServer worldServer = ((CraftWorld) target.getWorld()).getHandle();
boolean before = worldServer.chunkProviderServer.forceChunkLoad;
worldServer.chunkProviderServer.forceChunkLoad = true;
Location found = this.findPortal(target);
if (found == null) {
if (this.getCanCreatePortal() && this.createPortal(target)) {
found = this.findPortal(target);
} else {
found = target; // fallback to original if unable to find or create
}
}
worldServer.chunkProviderServer.forceChunkLoad = before;
return found;
}
public Location findPortal(Location location) {
PortalTravelAgent pta = ((CraftWorld) location.getWorld()).getHandle().s();
ChunkCoordinates found = pta.findPortal(location.getX(), location.getY(), location.getZ(), this.getSearchRadius());
return found != null ? new Location(location.getWorld(), found.x, found.y, found.z, location.getYaw(), location.getPitch()) : null;
}
public boolean createPortal(Location location) {
PortalTravelAgent pta = ((CraftWorld) location.getWorld()).getHandle().s();
return pta.createPortal(location.getX(), location.getY(), location.getZ(), this.getCreationRadius());
}
public TravelAgent setSearchRadius(int radius) {
this.searchRadius = radius;
return this;
}
public int getSearchRadius() {
return this.searchRadius;
}
public TravelAgent setCreationRadius(int radius) {
this.creationRadius = radius < 2 ? 0 : radius;
return this;
}
public int getCreationRadius() {
return this.creationRadius;
}
public boolean getCanCreatePortal() {
return this.canCreatePortal;
}
public void setCanCreatePortal(boolean create) {
this.canCreatePortal = create;
}
}