diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/NewFrontiers.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/NewFrontiers.kt index 7815330..b2b9b4d 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/NewFrontiers.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/NewFrontiers.kt @@ -1,9 +1,6 @@ package de.wulkanat.www.new_frontiers -import de.wulkanat.www.new_frontiers.init.Blocks -import de.wulkanat.www.new_frontiers.init.Items -import de.wulkanat.www.new_frontiers.init.registerBiomes -import de.wulkanat.www.new_frontiers.init.registerDimensions +import de.wulkanat.www.new_frontiers.init.* import net.minecraft.block.Block import net.minecraft.client.main.Main import net.minecraft.item.Item @@ -14,22 +11,16 @@ import net.minecraftforge.fml.common.Mod import net.minecraftforge.fml.common.event.FMLInitializationEvent import net.minecraftforge.fml.common.event.FMLPostInitializationEvent import net.minecraftforge.fml.common.event.FMLPreInitializationEvent +import net.minecraftforge.fml.common.event.FMLServerStartingEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @Mod( - modid = NewFrontiers.MOD_ID, - name = NewFrontiers.MOD_NAME, - version = NewFrontiers.VERSION, + modid = MOD_ID, + name = MOD_NAME, + version = VERSION, modLanguageAdapter = "net.shadowfacts.forgelin.KotlinAdapter" ) object NewFrontiers { - const val MOD_ID = "new_frontiers" - const val MOD_NAME = "New Frontiers" - const val VERSION = "1.0-SNAPSHOT" - - @Mod.Instance - lateinit var instance: Main - @Mod.EventHandler fun preinit(event: FMLPreInitializationEvent) { // TODO: register world generator @@ -42,6 +33,7 @@ object NewFrontiers { @Mod.EventHandler fun init(event: FMLInitializationEvent) { + } @Mod.EventHandler @@ -49,6 +41,13 @@ object NewFrontiers { } + @Mod.EventHandler + fun start(event: FMLServerStartingEvent) { + for (command in Commands.values()) { + event.registerServerCommand(command.value) + } + } + @Mod.EventBusSubscriber(modid = MOD_ID) object ObjectRegistryHandler { @SubscribeEvent diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/StaticValues.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/StaticValues.kt index 164470d..e72349d 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/StaticValues.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/StaticValues.kt @@ -1,5 +1,5 @@ package de.wulkanat.www.new_frontiers -object StaticValues { - -} +const val MOD_ID = "new_frontiers" +const val MOD_NAME = "New Frontiers" +const val VERSION = "1.0-SNAPSHOT" diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFBlock.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFBlock.kt index f983cba..2b563b1 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFBlock.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFBlock.kt @@ -1,9 +1,8 @@ package de.wulkanat.www.new_frontiers.abstract_helpers -import de.wulkanat.www.new_frontiers.NewFrontiers +import de.wulkanat.www.new_frontiers.MOD_ID import de.wulkanat.www.new_frontiers.proxy.registerItemRenderer import net.minecraft.block.Block -import net.minecraft.block.BlockHorizontal import net.minecraft.block.SoundType import net.minecraft.block.material.Material import net.minecraft.block.properties.PropertyDirection @@ -41,7 +40,7 @@ abstract class NFBlock( blockResistance = hardness * 5.0f } - setRegistryName("${NewFrontiers.MOD_ID}:$name") + setRegistryName("${MOD_ID}:$name") this.translationKey = name this.lightValue = lightLevel this.lightOpacity = lightOpacity diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFCommand.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFCommand.kt new file mode 100644 index 0000000..36ce6f1 --- /dev/null +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFCommand.kt @@ -0,0 +1,56 @@ +package de.wulkanat.www.new_frontiers.abstract_helpers + +import net.minecraft.command.CommandBase +import net.minecraft.command.ICommandSender +import net.minecraft.server.MinecraftServer +import net.minecraft.util.text.ITextComponent +import java.awt.Color + +abstract class NFCommand( + name: String, + usage: String, + val action: (ExecuteParams) -> Unit, + val hasPermission: (HasPermissionParams) -> Boolean = { true }, + requiredPermissionLevel: Int = 0 +) : CommandBase() { + private val commandName = name + private val commandUsage = "/$name $usage" + private val permissionLevel = requiredPermissionLevel + + override fun getName(): String { + return commandName + } + + override fun getRequiredPermissionLevel(): Int { + return permissionLevel + } + + override fun execute(server: MinecraftServer, sender: ICommandSender, command: Array) { + action(ExecuteParams(server, sender, command)) + } + + override fun getUsage(p0: ICommandSender): String { + return commandUsage + } + + override fun checkPermission(server: MinecraftServer, sender: ICommandSender): Boolean { + return hasPermission(HasPermissionParams(server, sender)) + } + + class ExecuteParams( + val server: MinecraftServer, + val sender: ICommandSender, + val command: Array + ) + + class HasPermissionParams( + val server: MinecraftServer, + val sender: ICommandSender + ) + + companion object { + fun textLine(text: String, color: String = "white"): ITextComponent { + return ITextComponent.Serializer.jsonToComponent("[{\"text\": \"$text\",\"color\":\"$color\"}]") as ITextComponent + } + } +} diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFItem.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFItem.kt index 1c2f4e4..33d0993 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFItem.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/abstract_helpers/NFItem.kt @@ -1,14 +1,9 @@ package de.wulkanat.www.new_frontiers.abstract_helpers -import de.wulkanat.www.new_frontiers.NewFrontiers +import de.wulkanat.www.new_frontiers.MOD_ID import de.wulkanat.www.new_frontiers.proxy.registerItemRenderer import net.minecraft.creativetab.CreativeTabs -import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.Item -import net.minecraft.item.ItemStack -import net.minecraft.util.ActionResult -import net.minecraft.util.EnumHand -import net.minecraft.world.World abstract class NFItem( name: String, @@ -16,7 +11,7 @@ abstract class NFItem( val hasCustomModel: Boolean = true ) : Item() { init { - setRegistryName("${NewFrontiers.MOD_ID}:$name") + setRegistryName("${MOD_ID}:$name") this.translationKey = name this.creativeTab = creativeTab } diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/blocks/BlockSpaceTeleporter.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/blocks/BlockSpaceTeleporter.kt index 49ec57f..885c36a 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/blocks/BlockSpaceTeleporter.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/blocks/BlockSpaceTeleporter.kt @@ -1,7 +1,9 @@ package de.wulkanat.www.new_frontiers.blocks import de.wulkanat.www.new_frontiers.abstract_helpers.NFBlock +import de.wulkanat.www.new_frontiers.dimensions.teleporter.NFTeleporter import net.minecraft.block.material.Material +import net.minecraft.command.CommandBase import net.minecraft.entity.player.EntityPlayerMP class BlockSpaceTeleporter : NFBlock( @@ -13,8 +15,7 @@ class BlockSpaceTeleporter : NFBlock( onClick = { if (it.player is EntityPlayerMP) { - it.player.changeDimension(40000) - it.player.setPositionAndUpdate(0.0, 0.0, 0.0) + it.player.changeDimension(40000, NFTeleporter(it.player.server.getWorld(40000))) true } else { false diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/blocks/SpaceshipController.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/blocks/SpaceshipController.kt index cb09cba..e44d65c 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/blocks/SpaceshipController.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/blocks/SpaceshipController.kt @@ -11,7 +11,7 @@ class SpaceshipController : NFBlock( facingDirections = BlockHorizontal.FACING, onClick = { - it.player.openGui(NewFrontiers.instance, 0, it.world, it.pos.x, it.pos.y, it.pos.z) + it.player.openGui(NewFrontiers, 0, it.world, it.pos.x, it.pos.y, it.pos.z) true } ) diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/commands/CommandTPDim.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/commands/CommandTPDim.kt new file mode 100644 index 0000000..d14ce3d --- /dev/null +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/commands/CommandTPDim.kt @@ -0,0 +1,28 @@ +package de.wulkanat.www.new_frontiers.commands + +import de.wulkanat.www.new_frontiers.abstract_helpers.NFCommand +import de.wulkanat.www.new_frontiers.dimensions.teleporter.NFTeleporter +import net.minecraft.command.NumberInvalidException +import net.minecraft.util.math.MathHelper +import java.lang.NullPointerException + +class CommandTPDim : NFCommand( + name = "tpdim", + usage = " [ ]", + + action = { + when (it.command.size) { + 1, 4 -> { + try { + val player = it.sender.commandSenderEntity + player?.changeDimension(parseInt(it.command[0]), NFTeleporter(it.server.getWorld(parseInt(it.command[0])))) + it.sender.sendMessage(textLine("Teleporting you to dimension ${it.command[0]}")) + } catch (e: NumberInvalidException) { + it.sender.sendMessage(textLine("Invalid dimension '${it.command[0]}'")) + } + } + else -> it.sender.sendMessage(textLine(" [ ]")) + } + + } +) diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/DimensionBody.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/DimensionBody.kt index d52bf2e..70d6cac 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/DimensionBody.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/DimensionBody.kt @@ -4,16 +4,13 @@ import de.wulkanat.www.new_frontiers.abstract_helpers.NFDimension import net.minecraft.world.biome.Biome import net.minecraft.world.biome.BiomeProviderSingle import net.minecraft.world.gen.ChunkGeneratorOverworld -import net.minecraft.world.gen.IChunkGenerator -class DimensionBody(id: Int, name: String) : NFDimension( +class DimensionBody : NFDimension( name = "planetary_body", id = 40001, canRespawn = true, surfaceDimension = true, biomeProvider = BiomeProviderSingle(Biome.getBiomeForId(29) as Biome) ) { - override fun createChunkGenerator(): IChunkGenerator { - return ChunkGeneratorOverworld(this.world, 19203, false, name) - } + override fun createChunkGenerator() = ChunkGeneratorOverworld(this.world, 19203, false, name) } diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/DimensionSpace.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/DimensionSpace.kt index af5ecf2..8d11ed7 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/DimensionSpace.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/DimensionSpace.kt @@ -13,7 +13,5 @@ class DimensionSpace : NFDimension( surfaceDimension = false, biomeProvider = BiomeProviderSingle(Biomes.DEEP_SPACE.value) ) { - override fun createChunkGenerator(): IChunkGenerator { - return VoidChunkGenerator(this.world) - } + override fun createChunkGenerator() = VoidChunkGenerator(this.world) } diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/teleporter/NFTeleporter.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/teleporter/NFTeleporter.kt new file mode 100644 index 0000000..4e677b5 --- /dev/null +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/dimensions/teleporter/NFTeleporter.kt @@ -0,0 +1,20 @@ +package de.wulkanat.www.new_frontiers.dimensions.teleporter + +import net.minecraft.entity.Entity +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.MathHelper +import net.minecraft.world.Teleporter +import net.minecraft.world.WorldServer + +class NFTeleporter(private val worldInstance: WorldServer) : Teleporter(worldInstance) { + override fun placeInPortal(entity: Entity, p5: Float) { + val i = MathHelper.floor(entity.posX) + val j = MathHelper.floor(entity.posY) + val k = MathHelper.floor(entity.posZ) + + // Dummy chunk loading + worldInstance.getChunk(BlockPos(i, j, k)) + val height = worldInstance.getHeight(i, k) + entity.setPosition(i.toDouble(), j.toDouble(), k.toDouble()) + } +} diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/init/command_init.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/init/command_init.kt new file mode 100644 index 0000000..4695897 --- /dev/null +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/init/command_init.kt @@ -0,0 +1,8 @@ +package de.wulkanat.www.new_frontiers.init + +import de.wulkanat.www.new_frontiers.abstract_helpers.NFCommand +import de.wulkanat.www.new_frontiers.commands.CommandTPDim + +enum class Commands(val value: NFCommand) { + TP_DIM(CommandTPDim()) +} diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/init/dimension_init.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/init/dimension_init.kt index 9e87b70..b225e38 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/init/dimension_init.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/init/dimension_init.kt @@ -2,10 +2,12 @@ package de.wulkanat.www.new_frontiers.init import de.wulkanat.www.new_frontiers.dimensions.DimensionSpace import de.wulkanat.www.new_frontiers.abstract_helpers.NFDimension +import de.wulkanat.www.new_frontiers.dimensions.DimensionBody import net.minecraftforge.common.DimensionManager enum class DimensionTypes(val value: NFDimension) { - SPACE(DimensionSpace()); + SPACE(DimensionSpace()), + PLANET_BODY(DimensionBody()) } fun registerDimensions() { diff --git a/src/main/kotlin/de/wulkanat/www/new_frontiers/proxy/client-proxy.kt b/src/main/kotlin/de/wulkanat/www/new_frontiers/proxy/client-proxy.kt index 09d1ec2..e62ac5f 100644 --- a/src/main/kotlin/de/wulkanat/www/new_frontiers/proxy/client-proxy.kt +++ b/src/main/kotlin/de/wulkanat/www/new_frontiers/proxy/client-proxy.kt @@ -1,6 +1,5 @@ package de.wulkanat.www.new_frontiers.proxy -import jdk.nashorn.internal.ir.Block import net.minecraft.client.renderer.block.model.ModelResourceLocation import net.minecraft.item.Item import net.minecraft.util.ResourceLocation