🔥Update to latest paper version

🔨Add possibility to kick an offline or online player from the game.
🍗Add Saturation effect.
🎙️Change VoiceChat to Simple Voice Chat.
😨Werewolf one shot player now.
This commit is contained in:
2025-11-11 13:29:46 +01:00
parent 9ab31b2fe1
commit 2c533c443e
12 changed files with 103 additions and 73 deletions

View File

@@ -1,13 +1,19 @@
plugins { plugins {
kotlin("jvm") version "2.2.0-Beta1" kotlin("jvm") version "2.2.0-Beta1"
id("com.gradleup.shadow") version "8.3.0" id("com.gradleup.shadow") version "9.2.2"
id("xyz.jpenilla.run-paper") version "2.3.1" id("xyz.jpenilla.run-paper") version "3.0.2"
id("io.papermc.paperweight.userdev") version "2.0.0-beta.16" id("io.papermc.paperweight.userdev") version "2.0.0-beta.19"
} }
group = "fr.azur" group = "fr.azur"
version = "1.0-SNAPSHOT" version = "1.0-SNAPSHOT"
val minecraftVersion: String by project
val paperVersion: String by project
val skinRestorerVersion: String by project
val voiceChatVersion: String by project
val voiceChatApiVersion: String by project
repositories { repositories {
mavenCentral() mavenCentral()
gradlePluginPortal() gradlePluginPortal()
@@ -20,16 +26,17 @@ repositories {
maven("https://repo.codemc.org/repository/maven-public/") { maven("https://repo.codemc.org/repository/maven-public/") {
name = "codemc" name = "codemc"
} }
maven("https://repo.plasmoverse.com/releases") maven("https://maven.maxhenkel.de/repository/public") {
maven("https://repo.plasmoverse.com/snapshots") name = "svc"
}
} }
dependencies { dependencies {
paperweight.paperDevBundle("1.21.4-R0.1-SNAPSHOT") paperweight.paperDevBundle("$minecraftVersion-$paperVersion")
compileOnly("net.skinsrestorer:skinsrestorer-api:15.6.3") implementation("net.skinsrestorer:skinsrestorer-api:$skinRestorerVersion")
compileOnly("su.plo.voice.api:server:2.1.4") implementation("de.maxhenkel.voicechat:voicechat-api:$voiceChatApiVersion")
implementation(kotlin("stdlib-jdk8")) implementation(kotlin("stdlib-jdk8"))
} }
@@ -42,10 +49,10 @@ kotlin {
tasks { tasks {
runServer { runServer {
downloadPlugins { downloadPlugins {
modrinth("plasmo-voice", "spigot-2.1.4") modrinth("plasmo-voice", "bukkit-$voiceChatVersion")
modrinth("skinsrestorer", "15.6.3") modrinth("skinsrestorer", skinRestorerVersion)
} }
minecraftVersion("1.21.4") minecraftVersion(minecraftVersion)
} }
build { build {
dependsOn("shadowJar") dependsOn("shadowJar")

View File

@@ -0,0 +1,5 @@
paperVersion=R0.1-SNAPSHOT
minecraftVersion=1.21.8
skinRestorerVersion=15.8.2
voiceChatApiVersion=2.6.0
voiceChatVersion=2.6.6

View File

@@ -1 +1 @@
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip

View File

@@ -1,32 +1,32 @@
package fr.azur.tcoww package fr.azur.tcoww
import de.maxhenkel.voicechat.api.BukkitVoicechatService
import fr.azur.tcoww.events.GameEvent import fr.azur.tcoww.events.GameEvent
import fr.azur.tcoww.events.ToolsEvents import fr.azur.tcoww.events.ToolsEvents
import fr.azur.tcoww.plasmovoice.addon.PlasmoAddon
import fr.azur.tcoww.roles.* import fr.azur.tcoww.roles.*
import fr.azur.tcoww.utils.Skin import fr.azur.tcoww.utils.Skin
import fr.azur.tcoww.voicechat.VoiceChatPlugin
import net.skinsrestorer.api.SkinsRestorer import net.skinsrestorer.api.SkinsRestorer
import net.skinsrestorer.api.SkinsRestorerProvider import net.skinsrestorer.api.SkinsRestorerProvider
import org.bukkit.plugin.java.JavaPlugin import org.bukkit.plugin.java.JavaPlugin
import su.plo.voice.api.server.PlasmoVoiceServer
class Tcoww : JavaPlugin() { class Tcoww : JavaPlugin() {
private lateinit var skinsRestorer: SkinsRestorer private lateinit var skinsRestorer: SkinsRestorer
private lateinit var skinManager: Skin private lateinit var skinManager: Skin
val plasmoAddon = PlasmoAddon()
override fun onEnable() { override fun onEnable() {
saveResource("config.yml", false) saveResource("config.yml", false)
saveDefaultConfig() saveDefaultConfig()
PlasmoVoiceServer.getAddonsLoader().load(plasmoAddon)
skinsRestorer = SkinsRestorerProvider.get() skinsRestorer = SkinsRestorerProvider.get()
skinManager = Skin(this, skinsRestorer) skinManager = Skin(this, skinsRestorer)
server.pluginManager.registerEvents(ToolsEvents(this), this) server.pluginManager.registerEvents(ToolsEvents(this), this)
server.pluginManager.registerEvents(GameEvent(this, skinManager), this) server.pluginManager.registerEvents(GameEvent(this, skinManager), this)
val vcservice = server.servicesManager.load(BukkitVoicechatService::class.java)
vcservice?.registerPlugin(VoiceChatPlugin())
registerRoles() registerRoles()
} }
@@ -34,10 +34,9 @@ class Tcoww : JavaPlugin() {
} }
fun reload(withPlasmoAddon: Boolean) { fun reload() {
this.reloadConfig() this.reloadConfig()
skinManager.reloadSkin() skinManager.reloadSkin()
if (withPlasmoAddon) plasmoAddon.onConfigLoaded()
} }
private fun registerRoles() { private fun registerRoles() {

View File

@@ -1,5 +1,6 @@
package fr.azur.tcoww package fr.azur.tcoww
import fr.azur.tcoww.commands.Exclude
import fr.azur.tcoww.commands.Power import fr.azur.tcoww.commands.Power
import fr.azur.tcoww.commands.GameCommand import fr.azur.tcoww.commands.GameCommand
import fr.azur.tcoww.commands.ReloadCommands import fr.azur.tcoww.commands.ReloadCommands
@@ -19,6 +20,7 @@ class TcowwBootstrap : PluginBootstrap {
commands.registrar().register(GameCommand().root.build()) commands.registrar().register(GameCommand().root.build())
commands.registrar().register(Vote().root.build()) commands.registrar().register(Vote().root.build())
commands.registrar().register(ReloadCommands().root.build()) commands.registrar().register(ReloadCommands().root.build())
commands.registrar().register(Exclude().root.build())
} }
} }
} }

View File

@@ -0,0 +1,40 @@
package fr.azur.tcoww.commands
import com.mojang.brigadier.Command
import com.mojang.brigadier.builder.LiteralArgumentBuilder
import fr.azur.tcoww.game.Game
import io.papermc.paper.command.brigadier.CommandSourceStack
import io.papermc.paper.command.brigadier.Commands
import io.papermc.paper.command.brigadier.argument.ArgumentTypes
import io.papermc.paper.command.brigadier.argument.resolvers.PlayerProfileListResolver
import org.bukkit.Bukkit
import org.bukkit.GameMode
class Exclude {
val root: LiteralArgumentBuilder<CommandSourceStack> = Commands.literal("exclude")
.requires { sender ->
sender.sender.isOp
}.then(
Commands.literal("start")
.then(
Commands.argument("players", ArgumentTypes.playerProfiles()).executes { ctx ->
val targetResolver = ctx.getArgument("players", PlayerProfileListResolver::class.java)
val target = targetResolver.resolve(ctx.source).first()
val uuid = target.id
if (uuid != null) {
val player = Bukkit.getPlayer(uuid)
if (player != null) {
val game = Game.current ?: return@executes Command.SINGLE_SUCCESS
player.gameMode = GameMode.SPECTATOR
player.isInvulnerable = false
game.playersMutable.remove(player)
}
}
Command.SINGLE_SUCCESS
}
)
)
}

View File

@@ -62,15 +62,15 @@ class Tools {
} }
) )
).then( ).then(
Commands.literal("reload").executes { ctx -> Commands.literal("reload").executes {
val plugin = Bukkit.getPluginManager().getPlugin("tcoww") as Tcoww val plugin = Bukkit.getPluginManager().getPlugin("tcoww") as Tcoww
plugin.reload(true) plugin.reload()
Command.SINGLE_SUCCESS Command.SINGLE_SUCCESS
} }
).then( ).then(
Commands.literal("customitem").then( Commands.literal("customitem").then(
Commands.argument("item", StringArgumentType.greedyString()) Commands.argument("item", StringArgumentType.greedyString())
.suggests { ctx, builder -> .suggests { _, builder ->
CustomItems.entries.forEach { CustomItems.entries.forEach {
builder.suggest(it.name) builder.suggest(it.name)
} }

View File

@@ -282,8 +282,7 @@ class GameEvent(val plugin: Plugin, val skinUtils: Skin) : Listener {
current.wwcankill current.wwcankill
) { ) {
current.wwcankill = false current.wwcankill = false
target.addPotionEffect(PotionEffect(PotionEffectType.WITHER, 1200, 10)) target.health = 0.0
target.addPotionEffect(PotionEffect(PotionEffectType.POISON, 1200, 10))
target.persistentDataContainer.set(NamespacedKey("tcoww", "insomie"), PersistentDataType.BOOLEAN, true) target.persistentDataContainer.set(NamespacedKey("tcoww", "insomie"), PersistentDataType.BOOLEAN, true)
if (target.isSleeping) target.wakeup(false) if (target.isSleeping) target.wakeup(false)
} }
@@ -303,15 +302,6 @@ class GameEvent(val plugin: Plugin, val skinUtils: Skin) : Listener {
false false
) )
) )
event.player.addPotionEffect(
PotionEffect(
PotionEffectType.SATURATION,
PotionEffect.INFINITE_DURATION,
1,
false,
false
)
)
} }
@EventHandler( @EventHandler(
@@ -319,7 +309,6 @@ class GameEvent(val plugin: Plugin, val skinUtils: Skin) : Listener {
ignoreCancelled = true ignoreCancelled = true
) )
fun endSleep(event: PlayerBedLeaveEvent) { fun endSleep(event: PlayerBedLeaveEvent) {
event.player.removePotionEffect(PotionEffectType.SATURATION)
event.player.removePotionEffect(PotionEffectType.REGENERATION) event.player.removePotionEffect(PotionEffectType.REGENERATION)
} }
@@ -385,7 +374,7 @@ class GameEvent(val plugin: Plugin, val skinUtils: Skin) : Listener {
speedatr.addModifier( speedatr.addModifier(
AttributeModifier( AttributeModifier(
NamespacedKey("tcoww", "wwtranform"), NamespacedKey("tcoww", "wwtranform"),
0.1, 0.05,
AttributeModifier.Operation.ADD_NUMBER AttributeModifier.Operation.ADD_NUMBER
) )
) )

View File

@@ -12,6 +12,8 @@ import org.bukkit.World
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
import org.bukkit.plugin.Plugin import org.bukkit.plugin.Plugin
import org.bukkit.potion.PotionEffect
import org.bukkit.potion.PotionEffectType
import org.bukkit.scheduler.BukkitTask import org.bukkit.scheduler.BukkitTask
import kotlin.math.ceil import kotlin.math.ceil
@@ -29,6 +31,15 @@ class Game(var plugin: Plugin, val world: World, val players: Iterable<Player>,
player.teleport(plugin.config.getLocation("spawnLocation")!!) player.teleport(plugin.config.getLocation("spawnLocation")!!)
player.inventory.clear() player.inventory.clear()
player.health = 20.0 player.health = 20.0
player.addPotionEffect(
PotionEffect(
PotionEffectType.SATURATION,
PotionEffect.INFINITE_DURATION,
1,
false,
false
)
)
} }
assignRoles() assignRoles()

View File

@@ -1,37 +0,0 @@
package fr.azur.tcoww.plasmovoice.addon
import su.plo.voice.api.addon.AddonInitializer
import su.plo.voice.api.addon.InjectPlasmoVoice
import su.plo.voice.api.addon.annotation.Addon
import su.plo.voice.api.event.EventSubscribe
import su.plo.voice.api.server.PlasmoVoiceServer
import su.plo.voice.api.server.event.player.PlayerInfoCreateEvent
@Addon(
id = "tcoww",
name = "The court of werewolf",
version = "1.0.0",
authors = ["Azur"]
)
class PlasmoAddon : AddonInitializer {
@InjectPlasmoVoice
private lateinit var voiceServer: PlasmoVoiceServer
override fun onAddonInitialize() {
onConfigLoaded()
}
override fun onAddonShutdown() {
}
fun onConfigLoaded() {
}
@EventSubscribe
fun onPlayerInfoCreate(event: PlayerInfoCreateEvent) {
event.voicePlayerInfo.playerNick = "..."
}
}

View File

@@ -0,0 +1,14 @@
package fr.azur.tcoww.voicechat
import de.maxhenkel.voicechat.api.VoicechatPlugin
import de.maxhenkel.voicechat.api.events.EventRegistration
class VoiceChatPlugin: VoicechatPlugin {
override fun getPluginId(): String {
return "tcow"
}
override fun registerEvents(registration: EventRegistration) {
}
}

View File

@@ -11,6 +11,6 @@ dependencies:
load: BEFORE load: BEFORE
required: true required: true
join-classpath: true join-classpath: true
PlasmoVoice: voicechat:
load: BEFORE load: BEFORE
required: true required: true