initial
This commit is contained in:
10
.idea/.gitignore
generated
vendored
Normal file
10
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Environment-dependent path to Maven home directory
|
||||
/mavenHomeManager.xml
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
13
.idea/compiler.xml
generated
Normal file
13
.idea/compiler.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<annotationProcessing>
|
||||
<profile name="Maven default annotation processors profile" enabled="true">
|
||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||
<outputRelativeToContentRoot value="true" />
|
||||
<module name="server_info" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
</component>
|
||||
</project>
|
||||
7
.idea/encodings.xml
generated
Normal file
7
.idea/encodings.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/src/main/kotlin" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
||||
30
.idea/jarRepositories.xml
generated
Normal file
30
.idea/jarRepositories.xml
generated
Normal file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RemoteRepositoriesConfiguration">
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Central Repository" />
|
||||
<option name="url" value="https://repo.maven.apache.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="sonatype" />
|
||||
<option name="name" value="sonatype" />
|
||||
<option name="url" value="https://oss.sonatype.org/content/groups/public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="papermc-repo" />
|
||||
<option name="name" value="papermc-repo" />
|
||||
<option name="url" value="https://repo.papermc.io/repository/maven-public/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Maven Central repository" />
|
||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jboss.community" />
|
||||
<option name="name" value="JBoss Community repository" />
|
||||
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
||||
</remote-repository>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/kotlinc.xml
generated
Normal file
6
.idea/kotlinc.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="KotlinJpsPluginSettings">
|
||||
<option name="version" value="2.2.0-Beta1" />
|
||||
</component>
|
||||
</project>
|
||||
14
.idea/misc.xml
generated
Normal file
14
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_24" default="true" project-jdk-name="openjdk-24" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/server_info.iml" filepath="$PROJECT_DIR$/server_info.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
72
dependency-reduced-pom.xml
Normal file
72
dependency-reduced-pom.xml
Normal file
@@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.server_info</groupId>
|
||||
<artifactId>server_info</artifactId>
|
||||
<name>server_info</name>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<build>
|
||||
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
|
||||
<defaultGoal>clean package</defaultGoal>
|
||||
<resources>
|
||||
<resource>
|
||||
<filtering>true</filtering>
|
||||
<directory>src/main/resources</directory>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-maven-plugin</artifactId>
|
||||
<version>${kotlin.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>compile</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>compile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<jvmTarget>${java.version}</jvmTarget>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.5.3</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>papermc-repo</id>
|
||||
<url>https://repo.papermc.io/repository/maven-public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>sonatype</id>
|
||||
<url>https://oss.sonatype.org/content/groups/public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>io.papermc.paper</groupId>
|
||||
<artifactId>paper-api</artifactId>
|
||||
<version>1.21.5-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<kotlin.version>2.2.0-Beta1</kotlin.version>
|
||||
<java.version>21</java.version>
|
||||
</properties>
|
||||
</project>
|
||||
87
pom.xml
Normal file
87
pom.xml
Normal file
@@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.server_info</groupId>
|
||||
<artifactId>server_info</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>server_info</name>
|
||||
|
||||
<properties>
|
||||
<java.version>21</java.version>
|
||||
<kotlin.version>2.2.0-Beta1</kotlin.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<defaultGoal>clean package</defaultGoal>
|
||||
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-maven-plugin</artifactId>
|
||||
<version>${kotlin.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>compile</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>compile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<jvmTarget>${java.version}</jvmTarget>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.5.3</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>papermc-repo</id>
|
||||
<url>https://repo.papermc.io/repository/maven-public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>sonatype</id>
|
||||
<url>https://oss.sonatype.org/content/groups/public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>io.papermc.paper</groupId>
|
||||
<artifactId>paper-api</artifactId>
|
||||
<version>1.21.5-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-stdlib-jdk8</artifactId>
|
||||
<version>${kotlin.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
13
server_info.iml
Normal file
13
server_info.iml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="minecraft" name="Minecraft">
|
||||
<configuration>
|
||||
<autoDetectTypes>
|
||||
<platformType>PAPER</platformType>
|
||||
</autoDetectTypes>
|
||||
<projectReimportVersion>1</projectReimportVersion>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
</module>
|
||||
187
src/main/kotlin/org/server_info/server_info/Server_info.kt
Normal file
187
src/main/kotlin/org/server_info/server_info/Server_info.kt
Normal file
@@ -0,0 +1,187 @@
|
||||
package org.server_info.server_info
|
||||
|
||||
import net.kyori.adventure.text.Component
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.command.Command
|
||||
import org.bukkit.command.CommandExecutor
|
||||
import org.bukkit.command.CommandSender
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.plugin.java.JavaPlugin
|
||||
import org.bukkit.scheduler.BukkitRunnable
|
||||
import java.lang.management.ManagementFactory
|
||||
import java.text.DecimalFormat
|
||||
|
||||
class Server_info : JavaPlugin() {
|
||||
|
||||
private var lastTickTime = System.currentTimeMillis()
|
||||
private var tickCount = 0
|
||||
private val tickTimeList = ArrayList<Long>()
|
||||
private var tps = 20.0
|
||||
private val df = DecimalFormat("#.##")
|
||||
|
||||
override fun onEnable() {
|
||||
// Register command
|
||||
getCommand("serverinfo")?.setExecutor(ServerInfoCommand(this))
|
||||
|
||||
// Start server info collectors
|
||||
startTPSCalculation()
|
||||
startTabListUpdater()
|
||||
|
||||
logger.info("ServerInfo plugin has been enabled!")
|
||||
}
|
||||
|
||||
override fun onDisable() {
|
||||
logger.info("ServerInfo plugin has been disabled!")
|
||||
}
|
||||
|
||||
private fun startTPSCalculation() {
|
||||
// Better TPS calculation method with moving average
|
||||
object : BukkitRunnable() {
|
||||
override fun run() {
|
||||
tickCount++
|
||||
|
||||
val now = System.currentTimeMillis()
|
||||
val elapsed = now - lastTickTime
|
||||
lastTickTime = now
|
||||
|
||||
// Store data point - time per tick in ms
|
||||
// Only add if we've gone through at least one tick to avoid startup anomalies
|
||||
if (tickCount > 1) {
|
||||
tickTimeList.add(elapsed)
|
||||
}
|
||||
|
||||
// Keep only the last 600 data points (30 seconds at 20 TPS)
|
||||
while (tickTimeList.size > 600) {
|
||||
tickTimeList.removeAt(0)
|
||||
}
|
||||
|
||||
// Calculate average tick time and TPS if we have data
|
||||
if (tickTimeList.isNotEmpty()) {
|
||||
val avgTickTime = tickTimeList.average()
|
||||
tps = 1000.0 / avgTickTime
|
||||
|
||||
// Clamp TPS between 0 and 20
|
||||
if (tps > 20.0) tps = 20.0
|
||||
if (tps < 0.0) tps = 0.0
|
||||
}
|
||||
}
|
||||
}.runTaskTimer(this, 1L, 1L) // Run every tick
|
||||
}
|
||||
|
||||
private fun startTabListUpdater() {
|
||||
object : BukkitRunnable() {
|
||||
override fun run() {
|
||||
updateTabList()
|
||||
}
|
||||
}.runTaskTimer(this, 20L, 20L) // Update every second
|
||||
}
|
||||
|
||||
private fun updateTabList() {
|
||||
val header = getTabListHeader()
|
||||
val footer = getTabListFooter()
|
||||
|
||||
for (player in Bukkit.getOnlinePlayers()) {
|
||||
player.sendPlayerListHeaderAndFooter(header, footer)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getTabListHeader(): Component {
|
||||
val serverName = server.name
|
||||
return Component.text("§6§l$serverName\n§r§7Online players: §f${server.onlinePlayers.size}/${server.maxPlayers}")
|
||||
}
|
||||
|
||||
private fun getTabListFooter(): Component {
|
||||
// Memory information
|
||||
val runtime = Runtime.getRuntime()
|
||||
val maxMemory = runtime.maxMemory() / (1024 * 1024)
|
||||
val allocatedMemory = runtime.totalMemory() / (1024 * 1024)
|
||||
val freeMemory = runtime.freeMemory() / (1024 * 1024)
|
||||
val usedMemory = allocatedMemory - freeMemory
|
||||
|
||||
// CPU usage
|
||||
val osBean = ManagementFactory.getOperatingSystemMXBean()
|
||||
var cpuLoad = osBean.systemLoadAverage
|
||||
if (cpuLoad < 0) {
|
||||
cpuLoad = osBean.availableProcessors * ManagementFactory.getThreadMXBean().threadCount / 100.0
|
||||
}
|
||||
|
||||
val tpsColor = when {
|
||||
tps >= 18.0 -> "§2" // Dark green
|
||||
tps >= 15.0 -> "§e" // Yellow
|
||||
else -> "§c" // Red
|
||||
}
|
||||
|
||||
return Component.text(
|
||||
"\n§7RAM: §f${usedMemory}MB / ${maxMemory}MB" +
|
||||
"\n§7CPU: §f${df.format(cpuLoad)}%" +
|
||||
"\n§7TPS: $tpsColor${df.format(tps)}"
|
||||
)
|
||||
}
|
||||
|
||||
fun getServerInfo(): String {
|
||||
val info = StringBuilder()
|
||||
|
||||
// Memory information
|
||||
val runtime = Runtime.getRuntime()
|
||||
val maxMemory = runtime.maxMemory() / (1024 * 1024)
|
||||
val allocatedMemory = runtime.totalMemory() / (1024 * 1024)
|
||||
val freeMemory = runtime.freeMemory() / (1024 * 1024)
|
||||
val usedMemory = allocatedMemory - freeMemory
|
||||
|
||||
// CPU usage
|
||||
val osBean = ManagementFactory.getOperatingSystemMXBean()
|
||||
var cpuLoad = osBean.systemLoadAverage
|
||||
if (cpuLoad < 0) {
|
||||
cpuLoad = osBean.availableProcessors * ManagementFactory.getThreadMXBean().threadCount / 100.0
|
||||
}
|
||||
|
||||
// Format server info using string templates
|
||||
info.append("§6===== SERVER INFO =====\n")
|
||||
info.append("§aRAM Usage: §f${usedMemory}MB / ${allocatedMemory}MB\n")
|
||||
info.append("§aMax RAM: §f${maxMemory}MB\n")
|
||||
info.append("§aCPU Load: §f${df.format(cpuLoad)}%\n") // Added % sign
|
||||
info.append("§aTPS: ${formatTPS(tps)}\n")
|
||||
|
||||
return info.toString()
|
||||
}
|
||||
|
||||
private fun formatTPS(tps: Double): String {
|
||||
return when {
|
||||
tps >= 18.0 -> "§2${df.format(tps)}" // Dark green
|
||||
tps >= 15.0 -> "§e${df.format(tps)}" // Yellow
|
||||
else -> "§c${df.format(tps)}" // Red
|
||||
}
|
||||
}
|
||||
|
||||
fun getPingForPlayer(player: Player): Int {
|
||||
return try {
|
||||
// Get player ping using reflection
|
||||
val entityPlayer = player.javaClass.getMethod("getHandle").invoke(player)
|
||||
val pingField = entityPlayer.javaClass.getField("ping")
|
||||
pingField.getInt(entityPlayer)
|
||||
} catch (e: Exception) {
|
||||
logger.warning("Failed to get ping for player: ${e.message}")
|
||||
-1
|
||||
}
|
||||
}
|
||||
|
||||
// Command executor inner class
|
||||
private inner class ServerInfoCommand(private val plugin: Server_info) : CommandExecutor {
|
||||
|
||||
override fun onCommand(sender: CommandSender, cmd: Command, label: String, args: Array<out String>): Boolean {
|
||||
if (cmd.name.equals("serverinfo", ignoreCase = true)) {
|
||||
// Send server info
|
||||
sender.sendMessage(plugin.getServerInfo())
|
||||
|
||||
// If the sender is a player, show their ping
|
||||
if (sender is Player) {
|
||||
val ping = plugin.getPingForPlayer(sender)
|
||||
sender.sendMessage("§aYour Ping: §f${ping}ms")
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
15
src/main/resources/plugin.yml
Normal file
15
src/main/resources/plugin.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
name: ServerInfo
|
||||
version: 1.0-SNAPSHOT
|
||||
main: org.server_info.server_info.Server_info
|
||||
api-version: 1.19
|
||||
description: Displays server performance metrics
|
||||
commands:
|
||||
serverinfo:
|
||||
description: Shows server performance metrics
|
||||
usage: /<command>
|
||||
aliases: [sinfo, si]
|
||||
permission: serverinfo.use
|
||||
permissions:
|
||||
serverinfo.use:
|
||||
description: Allows using the serverinfo command
|
||||
default: true
|
||||
BIN
target/classes/META-INF/server_info.kotlin_module
Normal file
BIN
target/classes/META-INF/server_info.kotlin_module
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
target/classes/org/server_info/server_info/Server_info.class
Normal file
BIN
target/classes/org/server_info/server_info/Server_info.class
Normal file
Binary file not shown.
15
target/classes/plugin.yml
Normal file
15
target/classes/plugin.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
name: ServerInfo
|
||||
version: 1.0-SNAPSHOT
|
||||
main: org.server_info.server_info.Server_info
|
||||
api-version: 1.19
|
||||
description: Displays server performance metrics
|
||||
commands:
|
||||
serverinfo:
|
||||
description: Shows server performance metrics
|
||||
usage: /<command>
|
||||
aliases: [sinfo, si]
|
||||
permission: serverinfo.use
|
||||
permissions:
|
||||
serverinfo.use:
|
||||
description: Allows using the serverinfo command
|
||||
default: true
|
||||
3
target/maven-archiver/pom.properties
Normal file
3
target/maven-archiver/pom.properties
Normal file
@@ -0,0 +1,3 @@
|
||||
artifactId=server_info
|
||||
groupId=org.server_info
|
||||
version=1.0-SNAPSHOT
|
||||
BIN
target/original-server_info-1.0-SNAPSHOT.jar
Normal file
BIN
target/original-server_info-1.0-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
target/server_info-1.0-SNAPSHOT.jar
Normal file
BIN
target/server_info-1.0-SNAPSHOT.jar
Normal file
Binary file not shown.
Reference in New Issue
Block a user