список модов сервера несовместим
Список модов сервера несовместим
Звание: Где-то рядом с нами
Спасибо за ответ. Но у меня 16 гб оперативки. И я же говорил, например я установил 5 модов они работают, ставлю еще какой то мод, он перестает запускаться(сервер), удаляю его(мод который добавил), скачиваю допустим другие 10 модов, они работают и сервер запускается
NastyaMeow,
Может еще есть варианты? Буду рад любой помощи!
Dil1_1
Звание: Где-то рядом с нами
Вот ошибка которая записана в крешрепорт:
// Why is it breaking 🙁
Time: 17.03.19 19:39
Description: Exception in server tick loop
Missing Mods:
unknown : need [5.6.0.199,): have missing
Missing Mods:
unknown : need [3.1.1,): have missing
unknown : need any: have missing
Missing Mods:
unknown : need [3.1.0,): have missing
net.minecraftforge.fml.common.MultipleModsErrored
at net.minecraftforge.fml.common.Loader.sortModList(Loader.java:298)
at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:570)
at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandl
er.java:98)
at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.ja
va:333)
at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java
:125)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486)
at java.lang.Thread.run(Unknown Source)
obscurus
Звание: V.I.P на хуторе
Аддоны к Forestry стоят, а самого мода нет
+ так же требуется еще какой-то мод, возможно McJtyLib
Dil1_1
Звание: Где-то рядом с нами
Спасибо, сейчас установил весь модпак, выдает ошибку, но не крашает сервер. Попробую установить McJtyLib.
Вот новый краш тег:
Time: 18.03.19 16:23
Description: Exception in server tick loop
net.minecraftforge.fml.common.LoaderException: java.lang.NoClassDefFoundError: net/minecraft/client/renderer/color/IItemColor
at net.minecraftforge.fml.common.AutomaticEventSubscriber.inject(AutomaticEventSubs
criber.java:89)
at net.minecraftforge.fml.common.FMLModContainer.constructMod(FMLModContainer.java:
599)
at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMet
hod(Subscriber.java:150)
at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecu
tors.java:399)
at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatc
her.java:116)
at com.google.common.eventbus.EventBus.post(EventBus.java:217)
at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadControl
ler.java:219)
at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadControlle
r.java:197)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMet
hod(Subscriber.java:150)
at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecu
tors.java:399)
at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatc
her.java:116)
at com.google.common.eventbus.EventBus.post(EventBus.java:217)
at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadControll
er.java:136)
at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:593)
at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandl
er.java:98)
at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.ja
va:333)
at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java
:125)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/renderer/color/IItemColor
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.privateGetPublicMethods(Unknown Source)
at java.lang.Class.getMethods(Unknown Source)
at net.minecraftforge.fml.common.eventhandler.EventBus.register(EventBus.java:82)
at net.minecraftforge.fml.common.AutomaticEventSubscriber.inject(AutomaticEventSubs
criber.java:82)
. 31 more
Caused by: java.lang.ClassNotFoundException: net.minecraft.client.renderer.color.IItemColor
at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:1
91)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
. 37 more
Caused by: java.lang.NullPointerException
Dil1_1
Звание: Где-то рядом с нами
south_park
Звание: Чоткий паря
Так, я тут полный нуб, но сколько оперативки выделено для сервера?
Случаем ли не 1304мб?
Memory: 1082330208 bytes (1032 MB) / 1367867392 bytes (1304 MB) up to 3795845120 bytes (3620 MB)
Этого мало, и видимо сервер предлагает повысить лимит до 3600.
Во вторых, у вас есть моды, а большинство крупных модов требуют зависимости и прилично оперативки, и бездумно запускать половину сборки нельзя, так как не очевидно какая библиотека нужна для какого мода.
Я могу посоветовать вам:
1) Разобраться с оперативкой, узнать точно сколько выделено, и выделить много, гигабайта 4-5.
2) По хорошему стоит так же обновить все моды, я думаю 99% всех модов в сборке присутствуют у нас на сайте и мы их обновляем ежедневно, потому не поленитесь, пройдитесь по новостям и скачайте самые новые версии модов, иногда бывают несовместимости старых модов и нового форджа или наоборот.
Как вы запускаете сервер? По идее в команде запуска сервера должен быть параметр отвечающий за количество оперативки, либо в каком то конфиге.
Не пользовался я фордж сервером, да и прочими всего пару раз.
Dil1_1
Звание: Где-то рядом с нами
Спасибо большое, сейчас займусь этим.
south_park, С версией фордж должно работать, так как я установил самую новую и сделал сервер и сейчас установил ту которую советовал разработчик этой сборки. Все равно крашается. Буду разбираться с оперативной памятью. Но и на всякий обновлю моды как вы и сказали. Отпишусь если заработает и буду очень благодарен)
south_park
Звание: Чоткий паря
Обновить моды если не помогает вариант с оперативкой.
Dil1_1
Звание: Где-то рядом с нами
obscurus
Звание: V.I.P на хуторе
chaiz
Sinistari
chaiz,
Ну вообще, в батнике вроде как прописывается кол-во ОЗУ
Господа и дамы (если таковые тут имеются), Точно как и у автора крашится сервак, честно говоря мало что понимаю, есть кто может помочь?
south_park
Звание: Чоткий паря
chaiz,
Страница
создать батник для запуска
Sinistari,
1) Использовать последнюю версию Forge
2) Добавлять моды частями, НЕ ЗАБЫВАТЬ про зависимости этих модов, ядра, библиотеки, другие моды.
3) Выделить достаточное количество оперативной памяти для сервера.
4) Решать вопросы с конкретным модом после установки которого перестал запускаться сервер.
искать обновления этого мода или альтернативу, пробовать только один этот мод (мб он конфликтует с другим)
Sinistari
Totty0322
_Brop
Reifold
Здравствуйте. Установил сервер 1.12 с модами на forge
Сервер не запускается, помогите понять крашрепорт.
Time: 2021-04-20 01:41:12 KRAT
Description: Exception in server tick loop
Duplicate Mods:
replaymod-restrictions : C:\Users\user\Desktop\Пушка серв\.\mods\replaymod-1.12.2-2.2.0-b7.jar
replaymod-restrictions : C:\Users\user\Desktop\Пушка серв\.\mods\replaymod-1.12.2-2.2.0-b7.jar
net.minecraftforge.fml.common.DuplicateModsFoundException
at net.minecraftforge.fml.common.Loader.identifyDuplicates(Loader.java:466)
at net.minecraftforge.fml.common.Loader.identifyMods(Loader.java:428)
at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:568)
at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandl
er.java:98)
at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.ja
va:333)
at net.minecraft.server.dedicated.DedicatedServer.init(DedicatedServer.java:125)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486)
at java.lang.Thread.run(Unknown Source)
Reifold
| | bigreactors | 1.12.2-0.4.5.67 | extremereactors-1.12.2-0.4.5.67.jar | None |
| | foamfix | 0.10.10-1.12.2 | foamfix-0.10.10-1.12.2.jar | None |
| | forbidden_arcanus | 1.12.2-1.1.4 | forbidden_arcanus-1.12.2-1.1.4 (1).jar | None |
| | cfm | 6.3.0 | furniture_6.3.0_1.12.2.jar | None |
| | waila | 1.8.26 | Hwyla-1.8.26-B41_1.12.2.jar | None |
| | immersivecables | 1.3.2 | ImmersiveCables_1.12.2_1.3.2.jar | None |
| | immersivepetroleum | @[email protected] | immersivepetroleum_1.12.2_1.1.5 (1).jar | None |
| | ic2 | 2.8.182-ex112 | industrialcraft_2_2.8.182_ex112.jar | None |
| | industrialwires | 1.6-23 | IndustrialWires_1.12.2_1.6_23 (1).jar | None |
| | infinitylib | 1.12.2-1.12.0 | infinitylib-1.12.0.jar | None |
| | ingameinfoxml | 2.8.2.94 | InGameInfoXML-1.12.2-2.8.2.94-universal.jar | None |
| | ironbackpacks | 1.12.2-3.0.8-12 | IronBackpacks_1.12.2_3.0.8_12.jar | None |
| | ironchest | 1.12.2-7.0.67.844 | ironchest_1.12.2_7.0.67.844.jar | None |
| | jei | 4.15.0.268 | jei_1.12.2-4.15.0.268.jar | None |
| | journeymap | 1.12.2-5.5.5 | journeymap-1.12.2-5.5.5.jar | None |
| | kythsopmoss | 0.1 | kythsopmoss-0_2.jar | None |
| | laggoggles | FAT-1.12.2-4.8 | laggoggles-fat-1.12.2-4.8.jar | None |
| | lunatriuscore | 1.2.0.42 | LunatriusCore_1.12.2_1.2.0.42_universal (1).jar | None |
| | mantle | 1.12-1.3.3.49 | Mantle-1.12-1.3.3.49.jar | None |
| | mcef | 0.9 | mcef-1.12.2-0.9.jar | None |
| | mtrm | 1.2.2.30 | MineTweakerRecipeMaker-1.12.2-1.2.2.30.jar | None |
| | moartinkers | 0.6.0 | moartinkers-0.6.0.jar | None |
| | modtweaker | 4.0.12 | modtweaker-4.0.12.jar | None |
| | mtlib | 3.0.6 | MTLib-3.0.6.jar | None |
| | mysticalagradditions | 1.3.2 | MysticalAgradditions-1.12.2-1.3.2.jar | None |
| | mysticalagriculture | 1.7.5 | MysticalAgriculture-1.12.2-1.7.5.jar | None |
| | mysticallib | 1.12.2-1.3.1 | mysticallib-1.12.2-1.3.1.jar | None |
| | mysticalworld | 1.12.2-1.3.2 | MysticWorld-1.12.2-1.3.2.jar | None |
| | neid | 1.5.4.4 | NotEnoughIDs-1.5.4.4.jar | None |
| | openblocks | 1.8 | OpenBlocks-1.12.2-1.8.jar | None |
| | openmods | 0.12 | OpenModsLib-1.12.2-0.12.jar | None |
| | packagedauto | 1.12.2-1.0.3.13 | PackagedAuto-1.12.2-1.0.3.14.jar | None |
| | packagedavaritia | 1.12.2-1.0.1.4 | PackagedAvaritia-1.12.2-1.0.1.4.jar | None |
| | patchouli | 1.0-20 | Patchouli-1.0-20.jar | None |
| | primitivetools | 1.1.9 | PrimitiveTools_1.12_1.1.9.jar | None |
| | psi | r1.1-72 | Psi-1.12.2-r1.1-72.jar | None |
| | randomthings | 4.2.7.2 | RandomThings_MC1.12.2_4.2.7.2.jar | None |
| | reborncore | 3.13.3.416 | RebornCore-1.12.2-3.13.3.416-universal.jar | None |
| | redstoneflux | 2.1.0 | RedstoneFlux-1.12-2.1.0.6-universal (5).jar | None |
| | replaymod-restrictions | 1.12.2-2.2.0-b7 | replaymod-1.12.2-2.2.0-b7.jar | None |
| | roots | 1.12.2-3.0.4 | Roots-1.12.2-3.0.4 (1).jar | None |
| | storagedrawers | 1.12-5.2.5 | StorageDrawers-1.12.1-5.3.3.jar | None |
| | super_solar_panels | 1.0.0 | SuperSolarPanels-1.2.1.jar | None |
| | surge | 2.0.77 | Surge-1.12.2-2.0.77.jar | None |
| | tammodized | 0.13.7 | TamModized-1.12-0.13.7.jar | None |
| | tconstruct | 1.12.2-2.12.0.135 | TConstruct-1.12.2-2.12.0.135.jar | None |
| | techreborn | 2.20.10.926 | TechReborn-1.12.2-2.20.10.926-universal.jar | None |
| | thaumcraft | 6.1.BETA26 | Thaumcraft_1.12.2_6.1.BETA26 (1).jar | None |
| | thaumicenergistics | 2.0.0 | thaumicenergistics_1.12.2_2.0.0.jar | None |
| | thaumictinkerer | 1.12.2-5.0-353c71c | thaumictinkerer_1.12.2_5.0_353c71c.jar | None |
| | theoneprobe | 1.4.28 | theoneprobe-1.12-1.4.28.jar | None |
| | thermalcultivation | 0.3.1 | Thermal-Cultivation-Mod-1.12.2.jar | None |
| | thermaldynamics | 2.5.5 | ThermalDynamics-1.12.2-2.5.5.21-universal.jar | None |
| | thermalexpansion | 5.5.4 | ThermalExpansion-1.12.2-5.5.4.43-universal (4).jar | None |
| | thermalfoundation | 2.6.3 | ThermalFoundation-1.12.2-2.6.3.27-universal (2).jar | None |
| | tinkertoolleveling | 1.12-1.0.3.DEV.56fac4f | Tinkers_Tool_Leveling_Mod_1.12.2.jar | None |
| | twilightforest | 3.9.888 | twilightforest_1.12.2_3.9.888_universal.jar | None |
| | vanillafix | 1.0.10-SNAPSHOT | vanillafix-1.0.10-99.jar | None |
| | voidcraft | 0.23.1 | VoidCraft-1_12-0_23_1.jar | None |
| | wanionlib | 1.12.2-1.5 | WanionLib-1.12.2-1.5.jar | None |
| | webdisplays | 1.0 | webdisplays-1.12.2-1.0.jar | None |
| | zerocore | 1.12.2-0.1.2.8 | zerocore-1.12.2-0.1.2.8.jar | None |
| | immersiveengineering | 0.12-87 | ImmersiveEngineering_0.12_87.jar | None |
| | techreborn_compat | 1.0.0 | TechReborn-ModCompatibility-1.12.2-1.1.0.22.jar | None |
Loaded coremods (and transformers): IELoadingPlugin (ImmersiveEngineering-core-0.12-87.jar)
blusunrize.immersiveengineering.common.asm.IEClassTransformer
Botania Tweaks Core (botania-tweaks-mod-1_12_2.jar)
quaternary.botaniatweaks.asm.BotaniaTweakerTransformer
OpenModsCorePlugin (OpenModsLib-1.12.2-0.12.jar)
openmods.core.OpenModsClassTransformer
EnderCorePlugin (EnderCore-1.12.2-0.5.65-core.jar)
com.enderio.core.common.transform.EnderCoreTransformer
com.enderio.core.common.transform.SimpleMixinPatcher
ShutdownPatcher (mcef-1.12.2-0.9-coremod.jar)
net.montoyo.mcef.coremod.ShutdownPatcher
CTMCorePlugin (CTM-MC1.12.2-0.3.3.22.jar)
team.chisel.ctm.client.asm.CTMTransformer
Plugin (NotEnoughIDs-1.5.4.4.jar)
ru.fewizz.neid.asm.Transformer
VanillaFixLoadingPlugin (vanillafix-1.0.10-99.jar)
ClientFixer (clientfixer-1.12.2-1.9 (2).jar)
com.gamerforea.clientfixer.asm.ASMTransformer
ModFixLC (ModFix-1.12.2-1.0.0.1.jar)
modfix.ModFixCT
Do not report to Forge! (If you haven’t disabled the FoamFix coremod, try disabling it in the config! Note that this bit of text will still appear.) (foamfix-0.10.10-1.12.2.jar)
pl.asie.foamfix.coremod.FoamFixTransformer
LoadingPlugin (RandomThings_MC1.12.2_4.2.7.2.jar)
lumien.randomthings.asm.ClassTransformer
RBLoadingPlugin (RealBench_1.12.2_1.3.3.jar)
pw.prok.realbench.asm.RBTransformer
SurgeLoadingPlugin (Surge-1.12.2-2.0.77.jar)
CoreMod (Aroma1997Core-1.12.2-2.0.0.2.b167.jar)
Suspected Mods: Forge Mod Loader (FML), Minecraft Forge (forge)
Profiler Position: N/A (disabled)
Is Modded: Definitely; Server brand changed to ‘fml,forge’
Type: Dedicated Server (map_server.txt)
Статистика форума
Администраторы | Главные редакторы | Модератор | Дедушки | Журналисты | HENTAI BOY | Goldфаги | Журналисты-олдфаги | ТруЪ Олдфаги-с | ТруЪ Плагинщик | Олдфаги | true Художник | Модератор бездны | Картоделы | XXXL ПХЛ | Просто хорошие люди | Посетители | Новички
Оптимизация сервера Minecraft
В нашем блоге мы уже рассказывали, как создать свой сервер Minecraft, однако с тех пор прошло 5 лет и многое поменялось. Делимся с вами актуальными способами создания и оптимизации серверной части столь популярной игры.
За свою 9-летнюю историю (если считать от даты релиза) Minecraft заработал потрясающее количество поклонников и хейтеров как среди обычных игроков, так и среди гиков. Простая концепция мира из кубиков превратилась из обычного развлечения в универсальную среду для общения и создания различных объектов из реального мира.
Помимо строительства, в игре есть возможность создавать логические схемы, которые позволяют реализовывать полноценные алгоритмы внутри Minecraft. На YouTube полно весьма впечатляющих роликов, где люди, приложив огромное количество сил и потратив множество времени, создали копию того или иного электронного устройства или построили детальную копию существующих и вымышленных архитектурных сооружений. Все ограничивается лишь фантазией геймера и возможностями игровой вселенной.
Но не будем дальше говорить о том, что именно игроки создают, а посмотрим на серверную часть приложения и осветим проблемы (порой весьма сложные), которые могут возникнуть в процессе работы под нагрузкой. Сразу оговоримся, что речь пойдет только о Java Edition.
Виды серверов
Самым простым вариантом является сервер, встроенный в клиент игры. Создали мир, нажали на одну кнопочку, и вот сервер стал доступен по локальной сети. Никакой серьезной нагрузки такой вариант выдержать не может, а поэтому мы не будем его даже рассматривать.
Vanilla
Компания Mojang Studios распространяет серверную часть игры в виде Java-приложения бесплатно на официальном сайте. Это позволяет создать свой собственный выделенный сервер и персональный мир, сделав его доступным для подключения из любой точки планеты. Для тех, кто делает это впервые, есть отличный туториал, доступный в соответствующей игровой Wiki.
У этого подхода есть один серьезный недостаток, а именно — отсутствие возможностей «из коробки» подключать плагины, расширяющие функционал сервера и позволяющие не только автоматизировать многие процессы, но и оптимизировать производительность. Кроме того, у официального сервера достаточно большое потребление оперативной памяти на каждого подключенного игрока.
Bukkit
Созданное энтузиастами на базе Vanilla-версии серверное приложение Bukkit значительно расширяло возможности игры за счет поддержки плагинов и модов (модификаций). Оно позволило не только добавлять в игровой процесс новые блоки, но и выполнять различные манипуляции, недоступные ванильному ПО. Что интересно, памяти это приложение требовало значительно меньше.
Установить Bukkit не составляет особого труда, соответствующая инструкция есть на ресурсе GamePedia. Но это не имеет смысла, так как с 2014 года команда Bukkit распалась, разработчики проекта стали сотрудниками Mojang Studios, а репозиторий заброшен. Таким образом, Bukkit фактически мертв, и имеет смысл обратить внимание на два следующих проекта.
SpigotMC
Для облегчения жизни разработчиков плагинов была необходимость в API для взаимодействия с игровым миром. Именно эту задачу и решили создатели Spigot, взяв за основу ядро Bukkit и переработав его для достижения лучшей надежности и производительности. Тем не менее, Git-репозиторий проекта был заблокирован в связи с Законом об авторском праве в цифровую эпоху (DMCA), и скачать оттуда исходники невозможно.
На текущий момент SpigotMC активно развивается и используется. Он поддерживает все плагины, созданные под Bukkit, однако с ним обратно не совместим. Чтобы обойти запрет DMCA Takedown, был придуман элегантный способ под названием BuildTools. Этот инструмент избавляет от необходимости дистрибуции скомпилированного приложения и позволяет пользователям выполнить компиляцию Spigot, CraftBukkit и Bukkit из исходного кода. Все это делает запрет DMCA бесполезным.
PaperMC
Казалось бы, все круто, и Spigot стал прекрасным вариантом. Но некоторым энтузиастам этого показалось мало, и они запилили свой собственный форк Spigot «на стероидах». На странице проекта ключевым достоинством указано, что “It’s stupid fast”. Развитое коммьюнити позволяет оперативно решать возникающие вопросы, а расширенное API — делать интересные плагины. Запустить PaperMC можно одной простой командой, приведенной в документации.
С совместимостью у PaperMC все прекрасно, так что написанные плагины под SpigotMC легко заработают и на PaperMC, но без официальной поддержки. Обратная совместимость со SpigotMC также присутствует. Теперь, когда мы перечислили различные варианты создания сервера, перейдем к тем проблемам производительности, которые могут возникать.
Проблемы и решения
Главное, что нужно понимать, — все, что касается обработки игрового мира будет обрабатываться только на одном вычислительном ядре физического сервера. Так что если вдруг у вас прекрасный сервер с десятком вычислительных ядер, то загружено будет только одно. Все остальные будут фактически простаивать. Такова уж архитектура приложения, и ничего вы с этим поделать не сможете. Так что при выборе сервера следует обращать внимание не на количество ядер, а на тактовую частоту. Чем она будет выше, тем лучше будет производительность.
Что касается вопроса об объеме оперативной памяти, тут следует исходить из следующих показателей:
Для запуска серверной части рекомендуем воспользоваться флагами, указанными в статье Tuning the JVM – G1GC Garbage Collector Flags for Minecraft. Эта «черная магия» позволяет серверу грамотно настроить «сборщик мусора» и оптимизирует использование оперативной памяти. Не стоит выделять памяти больше, чем реально потребляет сервер при пиковом наплыве игроков.
Генерация карты блоков
“Вы действительно считаете, что Луна существует, только когда вы на неё смотрите?” (Альберт Эйнштейн)
Абсолютно новый сервер. Как только игрок первый раз успешно подключается, игровой персонаж появляется на общей точке сбора (спаун). Это единственное место, где игровой мир предварительно генерируется сервером. В этот же момент клиентская часть смотрит в настройки, и ключевым параметром является дальность прорисовки. Измеряется она в чанках (область карты 16×16 и высотой в 256 блоков) Сколько чанков там указано, именно столько и будет запрошено у сервера.
На сервере хранится глобальная карта мира, и если в ней еще нет сгенерированных блоков в точке появления игрового персонажа, то сервер их динамически генерирует и сохраняет у себя. Мало того, что это требует больших вычислительных ресурсов, так еще и постоянно увеличивает размер карты мира. На одном из старейших анархических серверов 2b2t (2builders2tools) размер карты уже превысил 8 Tb, а граница мира проходит на отметке в 30 млн блоков. С этим сервером связаны тысячи историй, и он заслуживает отдельной статьи серии статей.
Генерация мира вокруг одного игрока — не проблема. Генерация мира вокруг сотни игроков вызовет незначительные тормоза сервера на протяжении короткого времени, после чего нагрузка снизится. Генерация мира на дальность прорисовки клиента вокруг тысячи игроков уже способна «уронить» сервер и повыбрасывать с него всех клиентов по таймауту.
В серверном ПО имеется такое значение, как TPS (Ticks per Server — тактов в секунду). Штатно 1 такт равен 50 мс. (1 секунда реального мира равна 20 тактам игрового мира). Если обработка одного такта вырастет до 60 секунд — серверное приложение будет закрыто, выкинув всех игроков.
Выход — ограничить мир определенными координатами и выполнить предварительную генерацию блоков. Тем самым мы снимаем необходимость динамической генерации в процессе игры, и серверу будет достаточно прочитать уже существующую карту. Оба вопроса решаются одним-единственным плагином WorldBorder.
Проще всего задать границу мира в виде окружности относительно точки спауна (хотя можно ее сделать любой формы) одной командой:
Если игровой персонаж попытается пересечь границу, то будет отброшен на несколько блоков назад. Если это проделать несколько раз за ограниченное время, то нарушитель будет принудительно телепортирован на точку спауна. Предварительная генерация мира выполняется еще проще, командой:
Поскольку данное действие потенциально может затронуть игроков, находящихся на сервере, не забудьте подтвердить выполнение:
В общей сложности на то, чтобы сгенерировать мир радиусом в 5000 блоков (
40 млрд блоков) ушло примерно 2 часа на процессоре Intel® Xeon® Gold 6240. Поэтому, если хотите запустить прегенерацию большей карты, учитывайте, что этот процесс займет приличное количество времени, а TPS сервера будет серьезно снижено. Кроме того, помните, что даже радиус в 5000 блоков потребует примерно 2 Гб места на дисковом накопителе.
Несмотря на то, что крайняя версия плагина была разработана для Minecraft версии 1.14, опытным путем выяснено, что она прекрасно работает и на последующих версиях. Полный список команд с пояснениями доступен на форуме плагина.
Проблемные блоки
Если блоков TNT несколько, то детонация одного блока вызывает детонацию и включение гравитации у соседних блоков, разбрасывая их во все стороны. Вся эта красивая механика на стороне сервера выглядит как множество операций по подсчету траектории каждого из блоков, а также взаимодействия с соседними блоками. Задача крайне ресурсоемкая, что легко может проверить каждый. Сгенерируйте и подорвите куб из блоков TNT, размером хотя бы 30x30x30. И если вы думали, что у вас хороший мощный игровой компьютер, то сильно заблуждались 😉
Подобный «эксперимент» на сервере с Intel® Xeon® Gold 6240 привел к серьезной «просадке» TPS и 80% нагрузке на CPU в течение всего времени детонации блоков. А следовательно, если кто-либо из игроков сможет проделать подобное, то проблема с производительностью затронет всех находящихся на сервере игроков.
Еще более жесткий вариант — Кристаллы Края. Если TNT все же взрывается последовательно, то Кристаллы Края детонируют все одновременно, что в теории может вообще остановить работу серверного приложения.
Избежать этого сценария можно, только полностью запретив использование данных блоков в игровом мире. Например, с помощью плагина WorldGuard. Обратите внимание, что сам по себе этот плагин не работает без другого плагина WorldEdit. Так что устанавливаете вначале WorldEdit, а затем WorldGuard.
Заключение
Грамотное управление игровым сервером — задача не из простых. Сложности и снижение производительности будут поджидать на каждом шагу, особенно если не брать в расчет саму механику игрового процесса. Предусмотреть все невозможно, ведь игроки порой бывают очень изобретательны в попытках заставить сервер выполнить то, для чего он не был предназначен. Только разумный баланс между рисками и устанавливаемыми ограничениями позволит серверу работать в непрерывном режиме и не снижать свою производительность до критичных значений.
На карантине некоторые наши сотрудники соскучились по любимым офисам и решили воссоздать их внутри Minecraft. У вас тоже есть шанс заглянуть к нам в гости, не рискуя своим здоровьем и не тратя время на дорогу.
Для этого мы приглашаем всех желающих на наш сервер minecraft.selectel.ru (версия клиента 1.15.2), где воссозданы дата-центры Цветочная-1 и Цветочная-2. Не забудьте согласиться со скачиванием дополнительных ресурсов, они необходимы для корректного отображения некоторых локаций.
Вас ждут квесты, промокоды, «пасхалки» и приятное общение.