Skip to content
This repository has been archived by the owner on Jun 4, 2023. It is now read-only.

Commit

Permalink
Upgrade Immortal
Browse files Browse the repository at this point in the history
  • Loading branch information
emortaldev committed Apr 30, 2023
1 parent 6bf86aa commit 2fe5644
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 49 deletions.
10 changes: 5 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
id("org.jetbrains.kotlin.jvm") version "1.8.0"
kotlin("plugin.serialization") version "1.8.0"
id("org.jetbrains.kotlin.jvm") version "1.8.10"
kotlin("plugin.serialization") version "1.8.10"
id("com.github.johnrengelman.shadow") version "7.1.2"

java
Expand All @@ -18,9 +18,9 @@ repositories {
dependencies {
//compileOnly(kotlin("stdlib"))

implementation("com.github.Minestom:Minestom:8eb089bf3e")
// implementation("dev.emortal.immortal:Immortal:3.0.1")
implementation("com.github.EmortalMC:Immortal:30f89199e2")
implementation("com.github.hollow-cube:Minestom:b7690d1b1b")
implementation("dev.emortal.immortal:Immortal:3.0.2")
// implementation("com.github.EmortalMC:Immortal:bb0a38dc47")

// compileOnly("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
compileOnly("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1")
Expand Down
65 changes: 56 additions & 9 deletions src/main/kotlin/dev/emortal/parkourtag/ParkourTagMain.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,96 @@ package dev.emortal.parkourtag
import dev.emortal.immortal.Immortal
import dev.emortal.immortal.config.ConfigHelper
import dev.emortal.immortal.game.GameManager
import dev.emortal.parkourtag.ParkourTagMain.Companion.config
import dev.emortal.parkourtag.ParkourTagMain.Companion.instances
import dev.emortal.parkourtag.ParkourTagMain.Companion.mapNameTag
import dev.emortal.parkourtag.commands.RigCommand
import dev.emortal.parkourtag.game.ParkourTagGame
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor
import net.kyori.adventure.text.format.TextDecoration
import net.minestom.server.MinecraftServer
import org.tinylog.kotlin.Logger
import net.minestom.server.instance.AnvilLoader
import net.minestom.server.instance.Chunk
import net.minestom.server.instance.InstanceContainer
import net.minestom.server.tag.Tag
import org.slf4j.LoggerFactory
import java.nio.file.Files
import java.nio.file.Path
import java.util.concurrent.CompletableFuture
import java.util.concurrent.ConcurrentHashMap
import java.util.stream.Collectors
import kotlin.io.path.nameWithoutExtension

private val LOGGER = LoggerFactory.getLogger(ParkourTagMain::class.java)

fun main() {
Immortal.initAsServer()

val maps = Files.list(Path.of("./maps/parkourtag/")).map { it.nameWithoutExtension }.collect(Collectors.toSet())
Logger.info("Found ${maps.size} maps:\n- ${maps.joinToString("\n- ")}")
val maps = Files.list(Path.of("./maps/parkourtag/")).collect(Collectors.toSet())

val parkourConfig = ParkourConfig()
val mapConfigMap = ConcurrentHashMap<String, MapConfig>()

maps.forEach {
mapConfigMap[it] = MapConfig()
mapConfigMap[it.nameWithoutExtension] = MapConfig()
}

parkourConfig.mapSpawnPositions = mapConfigMap
ParkourTagMain.config = ConfigHelper.initConfigFile(Path.of("./parkour.json"), parkourConfig)
config = ConfigHelper.initConfigFile(Path.of("./parkour.json"), parkourConfig)
LOGGER.info("Loaded parkourtag config")

maps.forEach {
preloadInstance(it)
LOGGER.info("Preloading map ${it.nameWithoutExtension}")
}

GameManager.registerGame<ParkourTagGame>(
"parkourtag",
Component.text("ParkourTag", NamedTextColor.GREEN, TextDecoration.BOLD),
showsInSlashPlay = true
GameManager.registerGame(
{ ParkourTagGame() },
"parkourtag"
)

val cm = MinecraftServer.getCommandManager()
cm.register(RigCommand)
}

fun preloadInstance(map: Path): InstanceContainer {
val newInstance = MinecraftServer.getInstanceManager().createInstanceContainer()

newInstance.chunkLoader = AnvilLoader(map)

newInstance.setTag(mapNameTag, map.nameWithoutExtension)
newInstance.setTag(GameManager.doNotUnregisterTag, true)
newInstance.setTag(GameManager.doNotAutoUnloadChunkTag, true)

newInstance.time = 0
newInstance.timeRate = 0
newInstance.timeUpdate = null

newInstance.enableAutoChunkLoad(false)
newInstance.setTag(Tag.Boolean("doNotAutoUnloadChunk"), true)

val radius = 5
val chunkFutures = mutableListOf<CompletableFuture<Chunk>>()
var i = 0
for (x in -radius..radius) {
for (z in -radius..radius) {
chunkFutures.add(newInstance.loadChunk(x, z))
i++
}
}

instances.add(newInstance)

return newInstance
}

class ParkourTagMain {

companion object {
lateinit var config: ParkourConfig
val instances: MutableSet<InstanceContainer> = ConcurrentHashMap.newKeySet()
val mapNameTag = Tag.String("mapName")
}

}
56 changes: 21 additions & 35 deletions src/main/kotlin/dev/emortal/parkourtag/game/ParkourTagGame.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.emortal.parkourtag.game

import dev.emortal.immortal.game.GameManager
import dev.emortal.immortal.game.GameState
import dev.emortal.immortal.game.PvpGame
import dev.emortal.immortal.game.Team
Expand Down Expand Up @@ -30,6 +31,7 @@ import net.minestom.server.event.trait.InstanceEvent
import net.minestom.server.instance.AnvilLoader
import net.minestom.server.instance.Chunk
import net.minestom.server.instance.Instance
import net.minestom.server.instance.SharedInstance
import net.minestom.server.instance.block.Block
import net.minestom.server.item.firework.FireworkEffect
import net.minestom.server.item.firework.FireworkEffectType
Expand All @@ -40,7 +42,7 @@ import net.minestom.server.scoreboard.Sidebar
import net.minestom.server.sound.SoundEvent
import net.minestom.server.tag.Tag
import net.minestom.server.timer.TaskSchedule
import org.tinylog.kotlin.Logger
import org.slf4j.LoggerFactory
import java.nio.file.Files
import java.nio.file.Path
import java.time.Duration
Expand All @@ -52,7 +54,11 @@ import kotlin.io.path.nameWithoutExtension
import kotlin.math.roundToInt
import kotlin.math.sqrt

private val LOGGER = LoggerFactory.getLogger(ParkourTagGame::class.java)

class ParkourTagGame : PvpGame() {


private val goonsTeam =
Team(
"Goons",
Expand All @@ -76,6 +82,10 @@ class ParkourTagGame : PvpGame() {
override val showsJoinLeaveMessages: Boolean = true
override val allowsSpectators: Boolean = true

override val gameName = "parkourtag"
override val gameComponent = Component.text("ParkourTag", NamedTextColor.GREEN, TextDecoration.BOLD)


private val miniMessage = MiniMessage.miniMessage()

private val booped = Tag.Boolean("booped")
Expand Down Expand Up @@ -333,11 +343,11 @@ class ParkourTagGame : PvpGame() {

if (taggersTeam.players.isEmpty()) {
victory(goonsTeam)
Logger.warn("Taggers died")
LOGGER.warn("Taggers died")
}
if (goonsTeam.players.isEmpty()) {
victory(taggersTeam)
Logger.warn("goons died")
LOGGER.warn("goons died")
}

scoreboard!!.updateLineContent(
Expand Down Expand Up @@ -477,7 +487,6 @@ class ParkourTagGame : PvpGame() {
}

private fun startTimer() {
Logger.info("Timer started")
val playerCount = players.size
val glowingTime = 15 + ((playerCount * 15) / 8) // 30 seconds with 8 players, 18 with 2
val doubleJumpTime = glowingTime / 2 // 15 seconds with 8 players, 9 with 2
Expand Down Expand Up @@ -633,40 +642,17 @@ class ParkourTagGame : PvpGame() {
}

override fun instanceCreate(): CompletableFuture<Instance> {
val instanceFuture = CompletableFuture<Instance>()

val randomMap = Files.list(Path.of("./maps/parkourtag/"))
.collect(Collectors.toSet())
.random()

val newInstance = MinecraftServer.getInstanceManager().createInstanceContainer()

newInstance.chunkLoader = AnvilLoader(randomMap)
val randomInstance = ParkourTagMain.instances.random()
mapConfig = ParkourTagMain.config.mapSpawnPositions[randomInstance.getTag(ParkourTagMain.mapNameTag)] ?: MapConfig()

mapConfig = ParkourTagMain.config.mapSpawnPositions[randomMap.nameWithoutExtension] ?: MapConfig()
val shared = MinecraftServer.getInstanceManager().createSharedInstance(randomInstance)
shared.setTag(GameManager.doNotAutoUnloadChunkTag, true)

newInstance.time = 0
newInstance.timeRate = 0
newInstance.timeUpdate = null

newInstance.enableAutoChunkLoad(false)
newInstance.setTag(Tag.Boolean("doNotAutoUnloadChunk"), true)

val radius = 5
val chunkFutures = mutableListOf<CompletableFuture<Chunk>>()
var i = 0
for (x in -radius..radius) {
for (z in -radius..radius) {
chunkFutures.add(newInstance.loadChunk(x, z))
i++
}
}

CompletableFuture.allOf(*chunkFutures.toTypedArray()).thenRun {
instanceFuture.complete(newInstance)
}
shared.time = 0
shared.timeRate = 0
shared.timeUpdate = null

return instanceFuture
return CompletableFuture.completedFuture(shared)
}

}

0 comments on commit 2fe5644

Please sign in to comment.