Java源码示例:org.spongepowered.api.block.tileentity.TileEntity
示例1
public static Sign getSign(Location<World> location) {
if (location == null) {
return null;
}
final TileEntity tileEntity = location.getTileEntity().orElse(null);
if (tileEntity == null) {
return null;
}
if (!(tileEntity instanceof Sign)) {
return null;
}
return (Sign) tileEntity;
}
示例2
@GET
@ExplicitDetails
@Permission("list")
@ApiOperation(
value = "List tile entities",
notes = "Get a list of all tile entities on the server (in all worlds, unless specified).")
public Collection<CachedTileEntity> listTileEntities(
@QueryParam("world") @ApiParam("The world to filter tile entities by") CachedWorld world,
@QueryParam("type") @ApiParam("The type if of tile entities to filter by") String typeId,
@QueryParam("min") @ApiParam("The minimum coordinates at which the tile entity must be, min=x|y|z") Vector3i min,
@QueryParam("max") @ApiParam("The maximum coordinates at which the tile entity must be, max=x|y|z") Vector3i max,
@QueryParam("limit") @ApiParam("The maximum amount of tile entities returned") int limit) {
Predicate<TileEntity> filter = te -> typeId == null || te.getType().getId().equalsIgnoreCase(typeId);
return cacheService.getTileEntities(world, min, max, filter, limit);
}
示例3
private void handleFakePlayerInteractBlockSecondary(InteractBlockEvent event, User user, Object source) {
final BlockSnapshot clickedBlock = event.getTargetBlock();
final Location<World> location = clickedBlock.getLocation().orElse(null);
final GDClaim claim = this.dataStore.getClaimAt(location);
final TileEntity tileEntity = clickedBlock.getLocation().get().getTileEntity().orElse(null);
final TrustType trustType = (tileEntity != null && NMSUtil.getInstance().containsInventory(tileEntity)) ? TrustTypes.CONTAINER : TrustTypes.ACCESSOR;
final Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, location, claim, Flags.INTERACT_BLOCK_SECONDARY, source, event.getTargetBlock(), user, trustType, true);
if (result == Tristate.FALSE) {
event.setCancelled(true);
}
}
示例4
public GDClaim getSourceClaim(Cause cause) {
BlockSnapshot blockSource = cause.first(BlockSnapshot.class).orElse(null);
LocatableBlock locatableBlock = null;
TileEntity tileEntitySource = null;
Entity entitySource = null;
if (blockSource == null) {
locatableBlock = cause.first(LocatableBlock.class).orElse(null);
if (locatableBlock == null) {
entitySource = cause.first(Entity.class).orElse(null);
}
if (locatableBlock == null && entitySource == null) {
tileEntitySource = cause.first(TileEntity.class).orElse(null);
}
}
GDClaim sourceClaim = null;
if (blockSource != null) {
sourceClaim = this.dataStore.getClaimAt(blockSource.getLocation().get());
} else if (locatableBlock != null) {
sourceClaim = this.dataStore.getClaimAt(locatableBlock.getLocation());
} else if (tileEntitySource != null) {
sourceClaim = this.dataStore.getClaimAt(tileEntitySource.getLocation());
} else if (entitySource != null) {
Entity entity = entitySource;
if (entity instanceof Player) {
Player player = (Player) entity;
GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId());
sourceClaim = this.dataStore.getClaimAtPlayer(playerData, player.getLocation());
} else {
sourceClaim = this.dataStore.getClaimAt(entity.getLocation());
}
}
return sourceClaim;
}
示例5
public static Object getEventFakePlayerSource(Event event) {
Object source = event.getSource();
if (NMSUtil.getInstance().isFakePlayer(source)) {
final Object actualSource = event.getCause().last(Object.class).orElse(null);
if (actualSource != source && (actualSource instanceof TileEntity || actualSource instanceof Entity)) {
return actualSource;
}
}
return source;
}
示例6
/**
* Tries to get a tile entity at the specified location.
* @param world The world in which the tile entity is located.
* @param x The x-coordinate of the location where the tile entity is located.
* @param y The y-coordinate of the location where the tile entity is located.
* @param z The z-coordinate of the location where the tile entity is located.
* @return An optional containing the tile entity if it was found, empty otherwise.
*/
public Optional<CachedTileEntity> getTileEntity(CachedWorld world, int x, int y, int z) {
return WebAPI.runOnMain(() -> {
Optional<?> w = world.getLive();
if (!w.isPresent())
throw new InternalServerErrorException("Could not get live world");
Optional<TileEntity> ent = ((World)w.get()).getTileEntity(x, y, z);
if (!ent.isPresent() || !ent.get().isValid()) {
return Optional.empty();
}
return Optional.of(new CachedTileEntity(ent.get()));
});
}
示例7
public CachedTileEntity(TileEntity te) {
super(te);
this.type = te.getType() instanceof CatalogType ? new CachedCatalogType(te.getType()) : null;
this.location = new CachedLocation(te.getLocation());
if (te instanceof TileEntityCarrier) {
this.inventory = new CachedInventory(((TileEntityCarrier)te).getInventory());
}
}
示例8
public GPClaim getSourceClaim(Cause cause) {
BlockSnapshot blockSource = cause.first(BlockSnapshot.class).orElse(null);
LocatableBlock locatableBlock = null;
TileEntity tileEntitySource = null;
Entity entitySource = null;
if (blockSource == null) {
locatableBlock = cause.first(LocatableBlock.class).orElse(null);
if (locatableBlock == null) {
entitySource = cause.first(Entity.class).orElse(null);
}
if (locatableBlock == null && entitySource == null) {
tileEntitySource = cause.first(TileEntity.class).orElse(null);
}
}
GPClaim sourceClaim = null;
if (blockSource != null) {
sourceClaim = this.dataStore.getClaimAt(blockSource.getLocation().get());
} else if (locatableBlock != null) {
sourceClaim = this.dataStore.getClaimAt(locatableBlock.getLocation());
} else if (tileEntitySource != null) {
sourceClaim = this.dataStore.getClaimAt(tileEntitySource.getLocation());
} else if (entitySource != null) {
Entity entity = entitySource;
if (entity instanceof Player) {
Player player = (Player) entity;
GPPlayerData playerData = GriefPreventionPlugin.instance.dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId());
sourceClaim = this.dataStore.getClaimAtPlayer(playerData, player.getLocation());
} else {
sourceClaim = this.dataStore.getClaimAt(entity.getLocation());
}
}
return sourceClaim;
}
示例9
public static long getRegionValue(Region r) {
long regionCost = 0;
World w = RedProtect.get().getServer().getWorld(r.getWorld()).get();
int maxX = r.getMaxMbrX();
int minX = r.getMinMbrX();
int maxZ = r.getMaxMbrZ();
int minZ = r.getMinMbrZ();
for (int x = minX; x < maxX; x++) {
for (int y = 0; y < 256; y++) {
for (int z = minZ; z < maxZ; z++) {
BlockSnapshot b = w.createSnapshot(x, y, z);
if (b.getState().getType().equals(BlockTypes.AIR)) {
continue;
}
if (b.getLocation().get().getTileEntity().isPresent()) {
TileEntity invTile = b.getLocation().get().getTileEntity().get();
if (invTile instanceof TileEntityInventory) {
TileEntityInventory<?> inv = (TileEntityInventory<?>) invTile;
regionCost += getInvValue(inv.slots());
}
} else {
regionCost += RedProtect.get().config.ecoRoot().items.values.get(b.getState().getType().getName());
}
}
}
}
r.setValue(regionCost);
return regionCost;
}
示例10
@Listener(order = Order.FIRST, beforeModifications = true)
public void onBlockNotify(NotifyNeighborBlockEvent event) {
LocatableBlock locatableBlock = event.getCause().first(LocatableBlock.class).orElse(null);
TileEntity tileEntity = event.getCause().first(TileEntity.class).orElse(null);
Location<World> sourceLocation = locatableBlock != null ? locatableBlock.getLocation() : tileEntity != null ? tileEntity.getLocation() : null;
GDClaim sourceClaim = null;
GDPlayerData playerData = null;
if (sourceLocation != null) {
if (GriefDefenderPlugin.isSourceIdBlacklisted("block-notify", event.getSource(), sourceLocation.getExtent().getProperties())) {
return;
}
}
final User user = CauseContextHelper.getEventUser(event);
if (user == null) {
return;
}
if (sourceLocation == null) {
Player player = event.getCause().first(Player.class).orElse(null);
if (player == null) {
return;
}
sourceLocation = player.getLocation();
playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId());
sourceClaim = this.dataStore.getClaimAtPlayer(playerData, player.getLocation());
} else {
playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(sourceLocation.getExtent(), user.getUniqueId());
sourceClaim = this.dataStore.getClaimAt(sourceLocation);
}
if (!GriefDefenderPlugin.getInstance().claimsEnabledForWorld(sourceLocation.getExtent().getUniqueId())) {
return;
}
GDTimings.BLOCK_NOTIFY_EVENT.startTimingIfSync();
Iterator<Direction> iterator = event.getNeighbors().keySet().iterator();
GDClaim targetClaim = null;
while (iterator.hasNext()) {
Direction direction = iterator.next();
Location<World> location = sourceLocation.getBlockRelative(direction);
Vector3i pos = location.getBlockPosition();
targetClaim = this.dataStore.getClaimAt(location, targetClaim);
if (sourceClaim.isWilderness() && targetClaim.isWilderness()) {
if (playerData != null) {
playerData.eventResultCache = new EventResultCache(targetClaim, "block-notify", Tristate.TRUE);
}
continue;
} else if (!sourceClaim.isWilderness() && targetClaim.isWilderness()) {
if (playerData != null) {
playerData.eventResultCache = new EventResultCache(targetClaim, "block-notify", Tristate.TRUE);
}
continue;
} else if (sourceClaim.getUniqueId().equals(targetClaim.getUniqueId())) {
if (playerData != null) {
playerData.eventResultCache = new EventResultCache(targetClaim, "block-notify", Tristate.TRUE);
}
continue;
} else {
if (playerData.eventResultCache != null && playerData.eventResultCache.checkEventResultCache(targetClaim, "block-notify") == Tristate.TRUE) {
continue;
}
// Needed to handle levers notifying doors to open etc.
if (targetClaim.isUserTrusted(user, TrustTypes.ACCESSOR)) {
if (playerData != null) {
playerData.eventResultCache = new EventResultCache(targetClaim, "block-notify", Tristate.TRUE, TrustTypes.ACCESSOR.getName().toLowerCase());
}
continue;
}
}
// no claim crossing unless trusted
iterator.remove();
}
GDTimings.BLOCK_NOTIFY_EVENT.stopTimingIfSync();
}
示例11
@Listener(order = Order.FIRST, beforeModifications = true)
public void onExplosionPre(final ExplosionEvent.Pre event)
{
final EventContext context = event.getContext();
final Cause cause = event.getCause();
User user = null;
if (cause.root() instanceof TileEntity) {
user = context.get(EventContextKeys.OWNER)
.orElse(context.get(EventContextKeys.NOTIFIER)
.orElse(context.get(EventContextKeys.CREATOR)
.orElse(null)));
} else {
user = context.get(EventContextKeys.NOTIFIER)
.orElse(context.get(EventContextKeys.OWNER)
.orElse(context.get(EventContextKeys.CREATOR)
.orElse(null)));
}
if(event.getCause().containsType(Player.class))
{
user = event.getCause().first(Player.class).get();
}
else if(event.getCause().containsType(User.class))
{
user = event.getCause().first(User.class).get();
}
final Location<World> location = event.getExplosion().getLocation();
if (user == null)
{
if(!super.getPlugin().getProtectionManager().canExplode(location).hasAccess())
{
event.setCancelled(true);
return;
}
}
else
{
if (!super.getPlugin().getProtectionManager().canExplode(location, user, false).hasAccess())
{
event.setCancelled(true);
return;
}
}
}
示例12
@Listener(order = Order.FIRST, beforeModifications = true)
public void onExplosion(final ExplosionEvent.Detonate event)
{
final List<Location<World>> locationList = new ArrayList<>(event.getAffectedLocations());
final List<Entity> entityList = new ArrayList<>(event.getEntities());
User user = null;
final Cause cause = event.getCause();
final EventContext context = event.getContext();
if (cause.root() instanceof TileEntity) {
user = context.get(EventContextKeys.OWNER)
.orElse(context.get(EventContextKeys.NOTIFIER)
.orElse(context.get(EventContextKeys.CREATOR)
.orElse(null)));
} else {
user = context.get(EventContextKeys.NOTIFIER)
.orElse(context.get(EventContextKeys.OWNER)
.orElse(context.get(EventContextKeys.CREATOR)
.orElse(null)));
}
if(event.getCause().containsType(Player.class))
{
user = event.getCause().first(Player.class).get();
}
else if(event.getCause().containsType(User.class))
{
user = event.getCause().first(User.class).get();
}
for(final Entity entity : entityList)
{
final Location<World> entityLocation = entity.getLocation();
if(user != null)
{
if(!super.getPlugin().getProtectionManager().canExplode(entityLocation, user, false).hasAccess())
{
event.getEntities().remove(entity);
}
}
else if(!super.getPlugin().getProtectionManager().canExplode(entityLocation).hasAccess())
{
event.getEntities().remove(entity);
}
}
for(final Location<World> location : locationList)
{
if(user != null)
{
if(!super.getPlugin().getProtectionManager().canExplode(location, user, false).hasAccess())
{
event.getAffectedLocations().remove(location);
}
}
else if(!super.getPlugin().getProtectionManager().canExplode(location).hasAccess())
{
event.getAffectedLocations().remove(location);
}
}
}
示例13
@PUT
@Path("/{world}/{x}/{y}/{z}")
@Permission("modify")
@ApiOperation(
value = "Modify tile entity",
notes = "Modify the properties of an existing tile entity.")
public CachedTileEntity modifyTileEntity(
@PathParam("world") @ApiParam("The world the tile entity is in") CachedWorld world,
@PathParam("x") @ApiParam("The x-coordinate of the tile-entity") Integer x,
@PathParam("y") @ApiParam("The y-coordinate of the tile-entity") Integer y,
@PathParam("z") @ApiParam("The z-coordinate of the tile-entity") Integer z,
UpdateTileEntityRequest req)
throws NotFoundException, BadRequestException {
if (req == null) {
throw new BadRequestException("Request body is required");
}
Optional<CachedTileEntity> optTe = cacheService.getTileEntity(world, x, y, z);
if (!optTe.isPresent()) {
throw new NotFoundException("Tile entity in world '" + world.getName() +
"' at [" + x + "," + y + "," + z + "] could not be found");
}
return WebAPI.runOnMain(() -> {
Optional<TileEntity> optLive = optTe.get().getLive();
if (!optLive.isPresent())
throw new InternalServerErrorException("Could not get live tile entity");
TileEntity live = optLive.get();
if (req.hasInventory()) {
if (!(live instanceof TileEntityCarrier)) {
throw new BadRequestException("Tile entity does not have an inventory!");
}
try {
Inventory inv = ((TileEntityCarrier) live).getInventory();
inv.clear();
for (ItemStack stack : req.getInventory()) {
inv.offer(stack);
}
} catch (Exception e) {
throw new InternalServerErrorException(e.getMessage());
}
}
return new CachedTileEntity(live);
});
}
示例14
/**
* Returns the specified object as a cached object. Performs a deep copy if necessary. Converts all applicable
* data types to their cached variants. This is especially useful if you're working with an object whose type
* you don't know. Just call this method on it and the returned object will be a thread safe copy, or null if
* a thread safe copy cannot be created because the object is of an unknown type.
* @param obj The object which is returned in it's cached form.
* @return The cached version of the object. Not necessarily the same type as the original object. {@code Null}
* if the object is of an unknown type.
*/
public Object asCachedObject(Object obj) {
// If the object is already clearly a cached object then just return it
if (obj instanceof CachedObject)
return obj;
// If the object is a primitive type we don't have to do anything either
if (obj instanceof Boolean)
return obj;
if (obj instanceof Integer)
return obj;
if (obj instanceof Float)
return obj;
if (obj instanceof Double)
return obj;
if (obj instanceof String)
return obj;
// Other POJOs
if (obj instanceof Instant)
return Instant.ofEpochMilli(((Instant)obj).toEpochMilli());
// If the object is of a type that we have a cached version for, then create one of those
if (obj instanceof Player)
return getPlayer((Player)obj);
if (obj instanceof World)
return getWorld((World)obj);
if (obj instanceof Entity)
return new CachedEntity((Entity)obj);
if (obj instanceof Chunk)
return new CachedChunk((Chunk)obj);
if (obj instanceof TileEntity)
return new CachedTileEntity((TileEntity)obj);
if (obj instanceof PluginContainer)
return getPlugin((PluginContainer)obj);
if (obj instanceof Inventory)
return new CachedInventory((Inventory)obj);
if (obj instanceof CommandMapping)
return getCommand((CommandMapping)obj);
if (obj instanceof Advancement)
return new CachedAdvancement((Advancement)obj);
if (obj instanceof ItemStack)
return ((ItemStack)obj).copy();
if (obj instanceof ItemStackSnapshot)
return ((ItemStackSnapshot)obj).copy();
if (obj instanceof Cause)
return new CachedCause((Cause)obj);
if (obj instanceof Location)
return new CachedLocation((Location)obj);
if (obj instanceof Transform)
return new CachedTransform((Transform)obj);
if (obj instanceof CatalogType)
return new CachedCatalogType((CatalogType)obj);
// If this is an unknown object type then we can't create a cached version of it, so we better not try
// and save it because we don't know if it's thread safe or not.
return obj.getClass().getName();
}
示例15
@Override
public Optional<TileEntity> getLive() {
Optional<Location> obj = location.getLive();
return obj.flatMap(o -> ((Location<World>) o).getTileEntity());
}
示例16
@Listener
public void onPlayerInteractBlock(InteractBlockEvent event, @Root Player player)
{
if (EssentialCmds.frozenPlayers.contains(player.getUniqueId()))
{
player.sendMessage(Text.of(TextColors.DARK_RED, "Error! ", TextColors.RED, "You cannot interact while frozen."));
event.setCancelled(true);
return;
}
if (EssentialCmds.jailedPlayers.contains(player.getUniqueId()))
{
player.sendMessage(Text.of(TextColors.DARK_RED, "Error! ", TextColors.RED, "You cannot interact while jailed."));
event.setCancelled(true);
return;
}
Optional<Location<World>> optLocation = event.getTargetBlock().getLocation();
if (optLocation.isPresent() && optLocation.get().getTileEntity().isPresent())
{
Location<World> location = optLocation.get();
TileEntity clickedEntity = location.getTileEntity().get();
if (event.getTargetBlock().getState().getType().equals(BlockTypes.STANDING_SIGN) || event.getTargetBlock().getState().getType().equals(BlockTypes.WALL_SIGN))
{
Optional<SignData> signData = clickedEntity.getOrCreate(SignData.class);
if (signData.isPresent())
{
SignData data = signData.get();
CommandManager cmdService = Sponge.getGame().getCommandManager();
String line0 = data.getValue(Keys.SIGN_LINES).get().get(0).toPlain();
String line1 = data.getValue(Keys.SIGN_LINES).get().get(1).toPlain();
String command = "warp " + line1;
if (line0.equals("[Warp]"))
{
if (player.hasPermission("essentialcmds.warps.use.sign"))
{
cmdService.process(player, command);
}
else
{
player.sendMessage(Text.of(TextColors.DARK_RED, "Error! ", TextColors.RED, "You do not have permission to use Warp Signs!"));
}
}
}
}
}
}