> For the complete documentation index, see [llms.txt](https://gravitycraft.gitbook.io/gravitycraft/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gravitycraft.gitbook.io/gravitycraft/gaidy-logi-sparki/tekstovyi-gaid-po-sparkam.md).

# Текстовый гайд по спаркам

by Lady\_Mirtis, Wolf\_TMB

### Из чего состоит строка?

Строка в спарке состоит из **пакета**, **класса** и **метода**.

Пакет - своеобразная “папка” в программировании, которая помогает организовать и сгруппировать связанные классы (тут обычно можно найти название мода) Класс - такой себе план или чертеж. Он описывает, как должен выглядеть и вести себя объект. Например, если у вас есть класс “Машина”, он может содержать описание того, что у машины есть колеса, двигатель и методы, которые позволяют машине ехать или останавливаться. Метод — это как инструкция или команда которую должен выполнить класс

То есть в строке `net.minecraft.server.MinecraftServer.runServer()` пакетом будет `net.minecraft.server`, классом - `MinecraftServer`, методом - `runServer()`

### Как понять что конкретно нагружает?

Чаще всего в названии **метода** указывается предмет это, блок, сущность или еще что-то, а так же иногда название самого объекта. К примеру `EntityPlayer` - сущность игрок (игрок), `TileInterface` - тайл (блок, имеющий логику работы) интерфейс, `PartImportBus` - часть (потому что шины это подчасти кабеля) шина импорта Иногда бывает так же спарки без указания определенного объекта, в таком случае придется искать процесс, к примеру `NBTTagCompound` - сравнение НБТ тэгов в таком случае придется анализировать спарк комплексно и думать что может вызывать этот процесс

### Как понять что искать и где искать?

Искать всегда следует строго в **прогруженных чанках**, чанки прогружаются якорями или игроками (иногда еще багами, но об этом не будем). То есть телепортация по якорям и игрокам поможет найти проблему в 95% случаев. В зависимости от информации, которую мы получаем в методах мы понимаем где искать объект (на полу, в игроке, на базе):

Существует несколько видов объектов в майнкрафте: Энтити, сущности (Entity) - все динамические объекты в майнкрафте (мобы, вагонетки, лежащие предметы, рамки, предметы в рамках, стойки для брони, искры и т.д.) Блоки (Block) - квадратики из которых состоит майнкрафт Предметы (Item) - объекты которые можно взять в ручку, все что лежит в инвентаре сундуков, игроков, мэ, механизмов и т.д.

Полезно знать: Логика работы блока (Tile, BlockEntity) - метод в котором указывается как работает блок, что он должен делать, по сути указывает нам, что нам нужно искать **модовый блок который имеет функционал**

Важно понимать, что объект в майнкрафте может менять свое состояние: если мы зайдем в шахту и увидим камень, то это будет блок, когда мы его сломаем это будет энтити, когда подберем - предмет

### Еще немного инфы как читать спарк:

* В первую очередь обращаем внимание на проценты - чем больше процент, тем больше нагрузка от конкретной ветки.
* Важно знать основные секции спарка, внутри которых находится определенная логика. Среди которых: тик TileEntity, тик мобов, тик загрузчика чанков, тик пакетки, pre/post world tick. Переходить к секции updateTimeLightAndEntities стоит только после того, как вы убедились, что нет высокой нагрузки от секций onPostServerTick и onPostServerTick.
* Во время плавного спуска по этим секциям вниз нужно пытаться поймать названия модов, блоков/энтити/пакетов, цепляться к названиям разных вещей из модов, возможно пользоваться переводчиком.
* Если получится найти в ветке упоминание нескольких разных тайлов/мобов, нужно установить между ними логическую связь. То, что написано выше заставляет отрабатывать логику, которая располагается ниже по ветке.
* В самом низу расположена нативка - пакеты java.util…, java.net…, java.что-то ещё…, sun…, некоторые пакеты net.minecraft…, библиотеки linux со страшными названиями, которые заканчиваются на .so. Пытаться вникать в них очень глубоко не стоит, туда даже при большом желании разработчики не всегда лезут, особенно в linux-библиотеки. Смотрите на то, что выше.

### Шпаргалка:

(тут перечислено далеко не все, но как подсказку можно использовать):

* `ChunkProviderServer.provideChunk()` - явно указывает на загрузку чанка
* `PathFinder.*()` - логика мобов по поиску маршрута куда-то/к кому-то
* `io.netty.channel.*.*` - пакетка
* `net.minecraft.world.World.updateEntity()` - обновление Entity, рядом обычно находится много обновлений разных TileEntity
* `crazypants.enderio.conduit.item.NetworkedInventory.transferItems()` - трубы EnderIO передают предметы
* `crazypants.enderio.conduits.conduit.TileConduitBundle.doUpdate()` - обновление труб из EnderIO
* `net.minecraft.nbt.NBTTagCompound.writeEntry()`, `net.minecraft.nbt.NBTTagIntArray.write()`, `java.io.DataOutputStream.writeInt()` - запись NBT на диск
* `appeng.parts.automation.PartImportBus.canInsert()` - проверка шиной импорта может ли оно положить предмет в МЭ.
* `appeng.me.storage.DriveWatcher.extractItems()` - извлечение предметов из МЭ сети
* `appeng.tile.misc.TileInterface.tickingRequest()` - обновление интерфейса из AE2
* `appeng.tile.grid.AENetworkPowerTile.onChunkUnload()` - вызывается при выгрузке из памяти чанка, в котором находится МЭ сеть
* `mekanism.common.content.transporter.TransporterPathfinder$IdlePath.find()` - просчёт оптимального пути передачи предметов транспортёрами из меканизма
* `ic3.common.tile.machine.TileEntityTierMachineBase.updateEntityServer()` - обновление механизмов из IC3
* `com.hrznstudio.titanium.component.progress.MultiProgressBarHandler.update()` - обновление прогресс бара у механизмов из Industrial Foregoing

### Что же такое НБТ?

Забежим еще чутка в саппортку, но это тоже важно для понимания работы для ТопМодеров

НБТ - описание предмета, его состояния (кол-во накопленной энергии, прочность, гены у пчел и другие особенности) НБТ прописываются в мете предмета. Мета - буквенный идентификатор предмета `'minecraft:diamond_pickaxe'`

К примеру только что созданная кирка будет иметь мету `'minecraft:diamond_pickaxe'`, поврежденная - `'minecraft:diamond_pickaxe', '{Damage:56}'` Яйца призыва пчел имеют общую мету - `'productivebees:spawn_egg_configurable_bee'`, НБТ отличает вид пчелы, которая может вылупится из яйца `'productivebees:spawn_egg_configurable_bee', '{EntityTag:{type:"productivebees:draconium"}}'`

Предметы с большим кол-вом НБТ вероятнее всего не будут стакаться в МЭ, поэтому и запрещен нестак в МЭ.&#x20;

⚠️ВНИМАНИЕ!!! Это не нагружает сервер, а ломает чанки, т.е. МЭ сеть с большим количеством нестака может сломать чанк и туда нельзя будет зайти (краш-зона)
