diff --git a/platforms/sponge/build.gradle.kts b/platforms/sponge/build.gradle.kts index 76394c1af..3962b6381 100644 --- a/platforms/sponge/build.gradle.kts +++ b/platforms/sponge/build.gradle.kts @@ -1,5 +1,4 @@ plugins { - id("org.spongepowered.plugin").version("0.9.0") id("org.spongepowered.gradle.vanilla").version("0.2") } @@ -9,16 +8,16 @@ repositories { } } -dependencies { - "shadedApi"(project(":common:implementation")) - annotationProcessor(implementation("org.spongepowered:spongeapi:9.0.0-SNAPSHOT")!!) - annotationProcessor("org.spongepowered:mixin:0.8.2:processor") +java { + sourceCompatibility = JavaVersion.VERSION_16 + targetCompatibility = JavaVersion.VERSION_16 } -sponge { - plugin { - id = "terra" - } +dependencies { + "shadedApi"(project(":common:implementation")) + "annotationProcessor"("org.spongepowered:spongeapi:9.0.0-SNAPSHOT") + "shadedImplementation"("org.spongepowered:spongeapi:9.0.0-SNAPSHOT") + "annotationProcessor"("org.spongepowered:mixin:0.8.2:processor") } minecraft { diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/SpongeListener.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/SpongeListener.java new file mode 100644 index 000000000..22b74a321 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/SpongeListener.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.sponge; + +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; +import org.spongepowered.api.Server; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.lifecycle.StartingEngineEvent; + +public class SpongeListener { + private final TerraSpongePlugin plugin; + + public SpongeListener(TerraSpongePlugin plugin) { + this.plugin = plugin; + } + + @Listener + public void initialize(StartingEngineEvent event) { + plugin.getTerraPlugin().getEventManager().callEvent(new PlatformInitializationEvent()); + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraPluginImpl.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraPluginImpl.java new file mode 100644 index 000000000..695479217 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraPluginImpl.java @@ -0,0 +1,65 @@ +package com.dfsek.terra.sponge; + +import com.dfsek.terra.AbstractTerraPlugin; +import com.dfsek.terra.api.Logger; +import com.dfsek.terra.api.handle.ItemHandle; +import com.dfsek.terra.api.handle.WorldHandle; +import com.dfsek.terra.sponge.handle.SpongeWorldHandle; +import org.spongepowered.api.Sponge; + +import java.io.File; + + +public class TerraPluginImpl extends AbstractTerraPlugin { + private final TerraSpongePlugin plugin; + private final SpongeWorldHandle worldHandle = new SpongeWorldHandle(); + public TerraPluginImpl(TerraSpongePlugin plugin) { + this.plugin = plugin; + load(); + } + + @Override + public WorldHandle getWorldHandle() { + return worldHandle; + } + + @Override + public File getDataFolder() { + return Sponge.configManager().pluginConfig(plugin.getPluginContainer()).directory().toFile(); + } + + @Override + public boolean reload() { + return false; + } + + @Override + public ItemHandle getItemHandle() { + return null; + } + + @Override + public String platformName() { + return "Sponge"; + } + + @Override + protected Logger createLogger() { + return new Logger() { + @Override + public void info(String message) { + plugin.getPluginContainer().logger().info(message); + } + + @Override + public void warning(String message) { + plugin.getPluginContainer().logger().warn(message); + } + + @Override + public void severe(String message) { + plugin.getPluginContainer().logger().error(message); + } + }; + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java new file mode 100644 index 000000000..128cdcb0e --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.sponge; + +import com.google.inject.Inject; +import org.spongepowered.plugin.PluginContainer; +import org.spongepowered.plugin.jvm.Plugin; + +@Plugin("terra") +public class TerraSpongePlugin { + private final PluginContainer plugin; + private final TerraPluginImpl terraPlugin; + @Inject + public TerraSpongePlugin(PluginContainer plugin) { + this.plugin = plugin; + this.terraPlugin = new TerraPluginImpl(this); + } + + public PluginContainer getPluginContainer() { + return plugin; + } + + public TerraPluginImpl getTerraPlugin() { + return terraPlugin; + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/block/SpongeBlockState.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/block/SpongeBlockState.java new file mode 100644 index 000000000..41f91936c --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/block/SpongeBlockState.java @@ -0,0 +1,64 @@ +package com.dfsek.terra.sponge.block; + +import com.dfsek.terra.api.block.BlockType; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.block.state.properties.Property; +import org.spongepowered.api.block.BlockTypes; + +public class SpongeBlockState implements BlockState { + private final org.spongepowered.api.block.BlockState delegate; + + public SpongeBlockState(org.spongepowered.api.block.BlockState delegate) { + this.delegate = delegate; + } + + @Override + public org.spongepowered.api.block.BlockState getHandle() { + return delegate; + } + + @Override + public BlockType getBlockType() { + return new SpongeBlockType(delegate.type()); + } + + @Override + public boolean matches(BlockState other) { + return delegate.type().equals(((SpongeBlockType) other.getBlockType()).getHandle()); + } + + @Override + public BlockState clone() { + return this; + } + + @Override + public String getAsString() { + return delegate.toString(); + } + + @Override + public boolean isAir() { + return delegate.type().equals(BlockTypes.AIR.get()); + } + + @Override + public boolean isStructureVoid() { + return delegate.type().equals(BlockTypes.STRUCTURE_VOID.get()); + } + + @Override + public boolean has(Property property) { + return false; + } + + @Override + public T get(Property property) { + return null; + } + + @Override + public BlockState set(Property property, T value) { + return this; + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/block/SpongeBlockType.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/block/SpongeBlockType.java new file mode 100644 index 000000000..27c5a388d --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/block/SpongeBlockType.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.sponge.block; + +import com.dfsek.terra.api.block.BlockType; +import com.dfsek.terra.api.block.state.BlockState; +import org.spongepowered.api.block.BlockTypes; +import org.spongepowered.api.data.Keys; + +public class SpongeBlockType implements BlockType { + private final org.spongepowered.api.block.BlockType delegate; + + public SpongeBlockType(org.spongepowered.api.block.BlockType delegate) { + this.delegate = delegate; + } + + @Override + public org.spongepowered.api.block.BlockType getHandle() { + return delegate; + } + + @Override + public BlockState getDefaultData() { + return new SpongeBlockState(delegate.defaultState()); + } + + @Override + public boolean isSolid() { + return !delegate.getOrElse(Keys.IS_SOLID, false); + } + + @Override + public boolean isWater() { + return delegate.equals(BlockTypes.WATER.get()); + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/handle/SpongeWorldHandle.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/handle/SpongeWorldHandle.java new file mode 100644 index 000000000..4b1483cb9 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/handle/SpongeWorldHandle.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.sponge.handle; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.entity.EntityType; +import com.dfsek.terra.api.handle.WorldHandle; +import com.dfsek.terra.sponge.block.SpongeBlockState; +import org.spongepowered.api.block.BlockTypes; + +public class SpongeWorldHandle implements WorldHandle { + private final SpongeBlockState air; + + public SpongeWorldHandle() { + air = new SpongeBlockState(BlockTypes.AIR.get().defaultState()); + } + + @Override + public BlockState createBlockData(String data) { + return new SpongeBlockState(org.spongepowered.api.block.BlockState.fromString(data)); + } + + @Override + public BlockState air() { + return air; + } + + @Override + public EntityType getEntity(String id) { + return null; + } +} diff --git a/platforms/sponge/src/main/resources/META-INF/plugins.json b/platforms/sponge/src/main/resources/META-INF/plugins.json new file mode 100644 index 000000000..77077496b --- /dev/null +++ b/platforms/sponge/src/main/resources/META-INF/plugins.json @@ -0,0 +1,24 @@ +{ + "plugins": [ + { + "loader": "java_plain", + "id": "terra", + "name": "Terra", + "version": "@VERSION@", + "main-class": "com.dfsek.terra.sponge.TerraSpongePlugin", + "description": "@DESCRIPTION@", + "links": { + "source": "@SOURCE@", + "issues": "@ISSUES@" + }, + "contributors": [ + ], + "dependencies": [ + { + "id": "spongeapi", + "version": "9.0.0" + } + ] + } + ] +} \ No newline at end of file