diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index b0a8d1e..e34377b 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -407,7 +407,7 @@ long curWait = 0L; long curPickWait = 0L; - for (long lastTick = 0L; this.serverRunning; this.serverIsRunning = true) + for (long lastTick = System.nanoTime() - TICK_TIME; this.serverRunning; this.serverIsRunning = true) { long curTime = System.nanoTime(); long wait = TICK_TIME - (curTime - lastTick); diff --git a/src/main/java/org/ultramine/commands/basic/TechCommands.java b/src/main/java/org/ultramine/commands/basic/TechCommands.java index b655d1e..d223279 100644 --- a/src/main/java/org/ultramine/commands/basic/TechCommands.java +++ b/src/main/java/org/ultramine/commands/basic/TechCommands.java @@ -62,11 +62,11 @@ int load = (int)Math.round((50-downtime)/50*100); int pickload = (int)Math.round((50-pickdowntime)/50*100); int uptime = (int)((System.currentTimeMillis() - ctx.getServer().startTime)/1000); - ChatComponentText pickloadcomp = new ChatComponentText(Integer.toString(pickload)); + ChatComponentText pickloadcomp = new ChatComponentText(Integer.toString(pickload).concat("%")); pickloadcomp.getChatStyle().setColor(pickload >= 200 ? RED : DARK_GREEN); ctx.sendMessage(DARK_GREEN, "command.uptime.msg.up", String.format("%dd %dh %dm %ds", uptime/(60*60*24), uptime/(60*60)%24, uptime/60%60, uptime%60)); - ctx.sendMessage(load > 100 ? RED : DARK_GREEN, "command.uptime.msg.load", load, pickloadcomp); - ctx.sendMessage(tps < 15 ? RED : DARK_GREEN, "command.uptime.msg.tps", tps, (int)(tps/20*100)); + ctx.sendMessage(load > 100 ? RED : DARK_GREEN, "command.uptime.msg.load", Integer.toString(load).concat("%"), pickloadcomp); + ctx.sendMessage(tps < 15 ? RED : DARK_GREEN, "command.uptime.msg.tps", tps, Integer.toString((int)(tps/20*100)).concat("%")); } @Command( diff --git a/src/main/java/org/ultramine/server/MultiWorld.java b/src/main/java/org/ultramine/server/MultiWorld.java index 0f31815..3b5b089 100644 --- a/src/main/java/org/ultramine/server/MultiWorld.java +++ b/src/main/java/org/ultramine/server/MultiWorld.java @@ -1,5 +1,6 @@ package org.ultramine.server; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -315,6 +316,11 @@ return nameToWorldMap.keySet(); } + public Collection getLoadedWorlds() + { + return dimToWorldMap.valueCollection(); + } + public String getNameByID(int id) { return dimToNameMap.get(id); diff --git a/src/main/java/org/ultramine/server/UMEventHandler.java b/src/main/java/org/ultramine/server/UMEventHandler.java index dc79a63..615c485 100644 --- a/src/main/java/org/ultramine/server/UMEventHandler.java +++ b/src/main/java/org/ultramine/server/UMEventHandler.java @@ -1,18 +1,24 @@ package org.ultramine.server; +import org.ultramine.server.UltramineServerConfig.SettingsConf.MessagesConf.AutoBroacastConf; import org.ultramine.server.util.BasicTypeParser; import org.ultramine.server.util.WarpLocation; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.functions.GenericIterableFactory; import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerChangedDimensionEvent; import cpw.mods.fml.common.gameevent.TickEvent; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChatComponentStyle; import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.WorldServer; +import static net.minecraft.util.EnumChatFormatting.*; import net.minecraftforge.event.ServerChatEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.player.PlayerEvent; @@ -41,9 +47,69 @@ if(e.phase == TickEvent.Phase.START) { Teleporter.tick(); + + AutoBroacastConf cfg = ConfigurationHandler.getServerConfig().settings.messages.autobroadcast; + MinecraftServer server = MinecraftServer.getServer(); + if(cfg.enabled && server.getTickCounter() % (cfg.intervalSeconds*20) == 0) + { + if(cfg.showDebugInfo) + { + double tps = Math.round(server.currentTPS*10)/10d; + double downtime = server.currentWait/1000/1000d; + double pickdowntime = server.pickWait/1000/1000d; + int load = (int)Math.round((50-downtime)/50*100); + int pickload = (int)Math.round((50-pickdowntime)/50*100); + ChatComponentText loadcomp = new ChatComponentText(Integer.toString(load).concat("%")); + ChatComponentText pickloadcomp = new ChatComponentText(Integer.toString(pickload).concat("%")); + ChatComponentText tpscomp = new ChatComponentText(Double.toString(tps)); + loadcomp.getChatStyle().setColor(load > 100 ? RED : DARK_GREEN); + pickloadcomp.getChatStyle().setColor(pickload >= 200 ? RED : DARK_GREEN); + tpscomp.getChatStyle().setColor(tps < 15 ? RED : DARK_GREEN); + + int mobcount = 0; + int itemcount = 0; + + for(WorldServer world : server.getMultiWorld().getLoadedWorlds()) + { + for(Entity ent : GenericIterableFactory.newCastingIterable(world.loadedEntityList, Entity.class)) + { + if(ent.isEntityLiving() && !ent.isEntityPlayer()) + mobcount++; + else if(ent instanceof EntityItem) + itemcount++; + } + } + + ChatComponentTranslation full = new ChatComponentTranslation("ultramine.autobroadcast.debugmsg", loadcomp, pickloadcomp, tpscomp, + Integer.toString(mobcount), Integer.toString(itemcount)); + full.getChatStyle().setColor(YELLOW); + + server.getConfigurationManager().sendChatMsg(full); + } + + if(cfg.messages.length != 0) + { + if(cfg.showAllMessages) + { + for(String msg : cfg.messages) + broadcastMessage(msg); + } + else + { + broadcastMessage(cfg.messages[server.getTickCounter() % (cfg.intervalSeconds*20*cfg.messages.length) / (cfg.intervalSeconds*20)]); + } + } + } } } + private static void broadcastMessage(String msg) + { + ChatComponentText msgcomp = new ChatComponentText(msg); + msgcomp.getChatStyle().setColor(DARK_GREEN); + MinecraftServer.getServer().getConfigurationManager().sendChatMsg(msgcomp); + } + @SubscribeEvent public void onPlayerClone(PlayerEvent.Clone e) { diff --git a/src/main/java/org/ultramine/server/UltramineServerConfig.java b/src/main/java/org/ultramine/server/UltramineServerConfig.java index f9c0996..20e103f 100644 --- a/src/main/java/org/ultramine/server/UltramineServerConfig.java +++ b/src/main/java/org/ultramine/server/UltramineServerConfig.java @@ -88,8 +88,18 @@ public static class MessagesConf { + public AutoBroacastConf autobroadcast = new AutoBroacastConf(); public boolean announcePlayerAchievements = true; public String motd = "A Minecraft Server"; + + public static class AutoBroacastConf + { + public boolean enabled = false; + public int intervalSeconds = 600; + public boolean showDebugInfo = false; + public String[] messages = new String[0]; + public boolean showAllMessages = false; + } } public static class WatchdogThreadConf diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index cf76310..ce1cabb 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -3,6 +3,8 @@ teleporter.delay=You will be teleported in %s seconds teleporter.canceled=Teleportation canceled +ultramine.autobroadcast.debugmsg=Server load: %s (Peak: %s), TPS: %s/20, Mobs: %s, Items: %s + #Command generic commands.generic.world.invalid=Can't find world '%s' commands.generic.itemstack.data=Failed to parse item data: %s @@ -148,8 +150,8 @@ command.uptime.usage=/uptime command.uptime.description=Displays server's up time and load information command.uptime.msg.up=UP: %s -command.uptime.msg.load=Load average: %s%% (Pick: %s%%) -command.uptime.msg.tps=Ticks per second: %s/20 (%s%%) +command.uptime.msg.load=Load average: %s (Peak: %s) +command.uptime.msg.tps=Ticks per second: %s/20 (%s) command.debuginfo.usage=/debuginfo [world/player] command.debuginfo.description=Some debug information diff --git a/src/main/resources/assets/ultramine/lang/ru_RU.lang b/src/main/resources/assets/ultramine/lang/ru_RU.lang index 3c8336f..bdc6cfd 100644 --- a/src/main/resources/assets/ultramine/lang/ru_RU.lang +++ b/src/main/resources/assets/ultramine/lang/ru_RU.lang @@ -3,6 +3,8 @@ teleporter.delay=Вы будете телепортированы через %s секунд teleporter.canceled=Телепортация отменена +ultramine.autobroadcast.debugmsg=Сервер нагружен на %s (В пике - %s), Тиков в секунду: %s/20, Мобов: %s, Предметов: %s + #Command generic commands.generic.world.invalid=Указанный мир не существует или неинициализирован '%s' commands.generic.itemstack.data=Не удалось разобрать предмет: %s @@ -148,7 +150,7 @@ command.uptime.usage=/uptime command.uptime.description=Показыват информацию о загруженности сервера command.uptime.msg.up=Работает: %s -command.uptime.msg.load=Загруженность: %s%% (В пике: %s%%) +command.uptime.msg.load=Загруженность: %s (В пике: %s) command.uptime.msg.tps=Тиков в секунду: %s/20 (%s) command.debuginfo.usage=/debuginfo [мир/игрок]