Skip to content

Commit

Permalink
Switched to an adapter system. Currently has adapters for 1.10 and 1.11.
Browse files Browse the repository at this point in the history
Currently, due to the small number of changes it's loading the 1.11 adapter for 1.10. This needs fixing.
  • Loading branch information
me4502 authored and wizjany committed Dec 29, 2016
1 parent a438347 commit e967ddf
Show file tree
Hide file tree
Showing 19 changed files with 361 additions and 709 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ out
run

/dependency-reduced-pom.xml
*-private.sh
*-private.sh

!impl/*.class
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

import com.flowpowered.math.vector.Vector3d;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.sponge.nms.SpongeNMSWorld;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.World;

Expand All @@ -31,7 +30,7 @@ private SpongeAdapter() {
}

public static World adapt(org.spongepowered.api.world.World world) {
return new SpongeNMSWorld(world);
return SpongeWorldEdit.inst().getAdapter().getWorld(world);
}

public static Location adapt(org.spongepowered.api.world.Location<org.spongepowered.api.world.World> loc, Vector3d rot) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

package com.sk89q.worldedit.sponge;

import com.sk89q.worldedit.sponge.nms.IDHelper;
import com.sk89q.worldedit.world.biome.BaseBiome;
import com.sk89q.worldedit.world.biome.BiomeData;
import com.sk89q.worldedit.world.registry.BiomeRegistry;
Expand All @@ -45,15 +44,15 @@ public BaseBiome createFromId(int id) {
public List<BaseBiome> getBiomes() {
List<BaseBiome> list = new ArrayList<BaseBiome>();
for (BiomeType biome : Sponge.getGame().getRegistry().getAllOf(BiomeType.class)) {
list.add(new BaseBiome(IDHelper.resolve(biome)));
list.add(new BaseBiome(SpongeWorldEdit.inst().getAdapter().resolve(biome)));
}
return list;
}

@Nullable
@Override
public BiomeData getData(BaseBiome biome) {
return new SpongeBiomeData(IDHelper.resolveBiome(biome.getId()));
return new SpongeBiomeData(SpongeWorldEdit.inst().getAdapter().resolveBiome(biome.getId()));
}

private static class SpongeBiomeData implements BiomeData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.entity.metadata.EntityType;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.sponge.nms.NMSHelper;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.NullWorld;
import org.spongepowered.api.world.World;
Expand All @@ -47,7 +46,7 @@ class SpongeEntity implements Entity {
public BaseEntity getState() {
org.spongepowered.api.entity.Entity entity = entityRef.get();
if (entity != null) {
return NMSHelper.createBaseEntity(entity);
return SpongeWorldEdit.inst().getAdapter().createBaseEntity(entity);
} else {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,32 @@

package com.sk89q.worldedit.sponge;

import org.spongepowered.api.Sponge;
import org.spongepowered.api.command.CommandCallable;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.service.context.Contextual;
import org.spongepowered.api.service.permission.PermissionDescription;
import org.spongepowered.api.service.permission.PermissionService;

import java.util.stream.Collectors;

public class SpongePermissionsProvider {

public boolean hasPermission(Player player, String permission) {
return player.hasPermission(permission);
}

public void registerPermission(CommandCallable command, String permission) { }
public void registerPermission(CommandCallable command, String permission) {
Sponge.getGame().getServiceManager().getRegistration(PermissionService.class).ifPresent((permissionService -> {
PermissionDescription.Builder permissionBuilder = permissionService.getProvider().newDescriptionBuilder(SpongeWorldEdit.inst()).get();
permissionBuilder.id(permission).register();
}));
}

public String[] getGroups(Player player) {
PermissionService permissionService = Sponge.getGame().getServiceManager().getRegistration(PermissionService.class).get().getProvider();
return player.getParents().stream()
.filter(subject -> subject.getContainingCollection().equals(permissionService.getGroupSubjects()))
.map(Contextual::getIdentifier).collect(Collectors.toList()).toArray(new String[0]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
import com.sk89q.worldedit.event.platform.CommandSuggestionEvent;
import com.sk89q.worldedit.extension.platform.*;
import com.sk89q.worldedit.sponge.config.SpongeConfiguration;
import com.sk89q.worldedit.sponge.nms.IDHelper;
import com.sk89q.worldedit.sponge.nms.SpongeNMSWorld;
import com.sk89q.worldedit.util.command.CommandMapping;
import com.sk89q.worldedit.util.command.Dispatcher;
import com.sk89q.worldedit.world.World;
Expand Down Expand Up @@ -61,11 +59,8 @@ public int resolveItem(String name) {

Optional<ItemType> optType = Sponge.getRegistry().getType(ItemType.class, name);

if (optType.isPresent()) {
return IDHelper.resolve(optType.get());
}
return optType.map(itemType -> SpongeWorldEdit.inst().getAdapter().resolve(itemType)).orElse(0);

return 0;
}

@Override
Expand All @@ -89,7 +84,7 @@ public List<? extends com.sk89q.worldedit.world.World> getWorlds() {
Collection<org.spongepowered.api.world.World> worlds = Sponge.getServer().getWorlds();
List<com.sk89q.worldedit.world.World> ret = new ArrayList<>(worlds.size());
for (org.spongepowered.api.world.World world : worlds) {
ret.add(new SpongeNMSWorld(world));
ret.add(SpongeWorldEdit.inst().getAdapter().getWorld(world));
}
return ret;
}
Expand All @@ -113,7 +108,7 @@ public World matchWorld(World world) {
} else {
for (org.spongepowered.api.world.World ws : Sponge.getServer().getWorlds()) {
if (ws.getName().equals(world.getName())) {
return new SpongeNMSWorld(ws);
return SpongeWorldEdit.inst().getAdapter().getWorld(ws);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import com.sk89q.worldedit.internal.LocalWorldAdapter;
import com.sk89q.worldedit.internal.cui.CUIEvent;
import com.sk89q.worldedit.session.SessionKey;
import com.sk89q.worldedit.sponge.nms.IDHelper;
import com.sk89q.worldedit.util.Location;
import org.spongepowered.api.data.type.HandTypes;
import org.spongepowered.api.entity.living.player.Player;
Expand Down Expand Up @@ -62,7 +61,7 @@ public UUID getUniqueId() {
@Override
public int getItemInHand() {
Optional<ItemStack> is = this.player.getItemInHand(HandTypes.MAIN_HAND);
return is.isPresent() ? IDHelper.resolve(is.get().getItem()) : 0;
return is.isPresent() ? SpongeWorldEdit.inst().getAdapter().resolve(is.get().getItem()) : 0;
}

@Override
Expand Down Expand Up @@ -106,7 +105,7 @@ public double getYaw() {

@Override
public void giveItem(int type, int amt) {
this.player.getInventory().offer(ItemStack.of(IDHelper.resolveItem(type), amt));
this.player.getInventory().offer(ItemStack.of(SpongeWorldEdit.inst().getAdapter().resolveItem(type), amt));
}

@Override
Expand Down Expand Up @@ -160,7 +159,7 @@ public void setPosition(Vector pos, float pitch, float yaw) {

@Override
public String[] getGroups() {
return new String[]{}; // WorldEditMod.inst.getPermissionsResolver().getGroups(this.player.username);
return SpongeWorldEdit.inst().getPermissionsProvider().getGroups(this.player);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.sponge.nms.IDHelper;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.AbstractWorld;
import com.sk89q.worldedit.world.biome.BaseBiome;
Expand Down Expand Up @@ -142,10 +141,7 @@ public boolean setBlock(Vector position, BaseBlock block, boolean notifyAndLight
// Create the TileEntity
if (block.hasNbtData()) {
// Kill the old TileEntity
Optional<TileEntity> optTile = world.getTileEntity(pos);
if (optTile.isPresent()) {
applyTileEntityData(optTile.get(), block);
}
world.getTileEntity(pos).ifPresent(tileEntity -> applyTileEntityData(tileEntity, block));
}

return true;
Expand Down Expand Up @@ -177,15 +173,15 @@ public int getBlockLightLevel(Vector position) {
@Override
public BaseBiome getBiome(Vector2D position) {
checkNotNull(position);
return new BaseBiome(IDHelper.resolve(getWorld().getBiome(position.getBlockX(), 0, position.getBlockZ())));
return new BaseBiome(SpongeWorldEdit.inst().getAdapter().resolve(getWorld().getBiome(position.getBlockX(), 0, position.getBlockZ())));
}

@Override
public boolean setBiome(Vector2D position, BaseBiome biome) {
checkNotNull(position);
checkNotNull(biome);

getWorld().setBiome(position.getBlockX(), 0, position.getBlockZ(), IDHelper.resolveBiome(biome.getId()));
getWorld().setBiome(position.getBlockX(), 0, position.getBlockZ(), SpongeWorldEdit.inst().getAdapter().resolveBiome(biome.getId()));
return true;
}

Expand Down Expand Up @@ -214,7 +210,7 @@ public WorldData getWorldData() {

@Override
public boolean isValidBlockType(int id) {
return (id == 0) || (IDHelper.resolveBlock(id) != null);
return id == 0 || SpongeWorldEdit.inst().getAdapter().resolveBlock(id) != null;
}

@Override
Expand All @@ -231,10 +227,9 @@ public boolean equals(Object o) {
World otherWorld = other.worldRef.get();
World thisWorld = worldRef.get();
return otherWorld != null && thisWorld != null && otherWorld.equals(thisWorld);
} else if (o instanceof com.sk89q.worldedit.world.World) {
return ((com.sk89q.worldedit.world.World) o).getName().equals(getName());
} else {
return false;
return o instanceof com.sk89q.worldedit.world.World
&& ((com.sk89q.worldedit.world.World) o).getName().equals(getName());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,13 @@
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.event.platform.PlatformReadyEvent;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extension.platform.Capability;
import com.sk89q.worldedit.extension.platform.Platform;
import com.sk89q.worldedit.internal.LocalWorldAdapter;
import com.sk89q.worldedit.sponge.adapter.AdapterLoadException;
import com.sk89q.worldedit.sponge.adapter.SpongeImplAdapter;
import com.sk89q.worldedit.sponge.adapter.SpongeImplLoader;
import com.sk89q.worldedit.sponge.config.SpongeConfiguration;
import com.sk89q.worldedit.sponge.nms.NMSHelper;
import com.sk89q.worldedit.sponge.nms.SpongeNMSWorld;
import org.slf4j.Logger;
import org.spongepowered.api.block.BlockSnapshot;
import org.spongepowered.api.block.BlockType;
Expand All @@ -50,6 +52,7 @@
import org.spongepowered.api.world.World;

import java.io.File;
import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

Expand Down Expand Up @@ -84,6 +87,7 @@ public static SpongeWorldEdit inst() {
}

private SpongePlatform platform;
private SpongeImplAdapter spongeAdapter;

@Inject
private SpongeConfiguration config;
Expand Down Expand Up @@ -134,6 +138,44 @@ public void serverStopping(GameStoppingServerEvent event) {
@Listener
public void serverStarted(GameStartedServerEvent event) {
WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent());

loadAdapter();
}

private void loadAdapter() {
WorldEdit worldEdit = WorldEdit.getInstance();

// Attempt to load a Sponge adapter
SpongeImplLoader adapterLoader = new SpongeImplLoader();

try {
adapterLoader.addFromPath(getClass().getClassLoader());
} catch (IOException e) {
logger.warn("Failed to search path for Sponge adapters");
}

try {
adapterLoader.addFromJar(container.getSource().get().toFile());
} catch (IOException e) {
logger.warn("Failed to search " + container.getSource().get().toFile() + " for Sponge adapters", e);
}
try {
spongeAdapter = adapterLoader.loadAdapter();
logger.info("Using " + spongeAdapter.getClass().getCanonicalName() + " as the Sponge adapter");
} catch (AdapterLoadException e) {
Platform platform = worldEdit.getPlatformManager().queryCapability(Capability.WORLD_EDITING);
if (platform instanceof SpongePlatform) {
logger.warn(e.getMessage());
} else {
logger.info("WorldEdit could not find a Sponge adapter for this MC version, " +
"but it seems that you have another implementation of WorldEdit installed (" + platform.getPlatformName() + ") " +
"that handles the world editing.");
}
}
}

public SpongeImplAdapter getAdapter() {
return this.spongeAdapter;
}

@Listener
Expand Down Expand Up @@ -199,7 +241,7 @@ public void onPlayerInteract(InteractBlockEvent event, @Root Player spongePlayer
}

public static ItemStack toSpongeItemStack(BaseItemStack item) {
return NMSHelper.makeSpongeStack(item);
return inst().getAdapter().makeSpongeStack(item);
}

/**
Expand Down Expand Up @@ -249,7 +291,7 @@ public LocalSession getSession(Player player) {
*/
public SpongeWorld getWorld(World world) {
checkNotNull(world);
return new SpongeNMSWorld(world);
return getAdapter().getWorld(world);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,25 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package com.sk89q.worldedit.sponge.nms;
package com.sk89q.worldedit.sponge.adapter;

import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.TileEntityBlock;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
/**
* Thrown when no adapter can be found.
*/
public class AdapterLoadException extends Exception {

@Deprecated
public class TileEntityBaseBlock extends BaseBlock implements TileEntityBlock {
public AdapterLoadException() {
}

public TileEntityBaseBlock(int type, int data, TileEntity tile) {
super(type, data);
setNbtData(NBTConverter.fromNative(copyNbtData(tile)));
public AdapterLoadException(String message) {
super(message);
}

private static NBTTagCompound copyNbtData(TileEntity tile) {
NBTTagCompound tag = new NBTTagCompound();
tile.writeToNBT(tag);
return tag;
public AdapterLoadException(String message, Throwable cause) {
super(message, cause);
}

}
public AdapterLoadException(Throwable cause) {
super(cause);
}
}
Loading

0 comments on commit e967ddf

Please sign in to comment.