9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-26 18:39:20 +00:00

Merge branch 'Xiao-MoMi:dev' into dev

This commit is contained in:
jhqwqmc
2025-05-07 21:24:50 +08:00
committed by GitHub
28 changed files with 466 additions and 279 deletions

View File

@@ -2,8 +2,10 @@ package net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld;
import com.infernalsuite.aswm.api.events.LoadSlimeWorldEvent;
import com.infernalsuite.aswm.api.world.SlimeWorld;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.world.World;
import net.momirealms.craftengine.core.world.WorldManager;
import net.momirealms.craftengine.core.world.chunk.storage.CachedStorage;
import net.momirealms.craftengine.core.world.chunk.storage.DefaultStorageAdaptor;
import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage;
import org.bukkit.Bukkit;
@@ -22,7 +24,8 @@ public class LegacySlimeFormatStorageAdaptor extends DefaultStorageAdaptor imple
@EventHandler
public void onWorldLoad(LoadSlimeWorldEvent event) {
org.bukkit.World world = Bukkit.getWorld(event.getSlimeWorld().getName());
this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), new LegacySlimeWorldDataStorage(event.getSlimeWorld())));
this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world),
Config.enableChunkCache() ? new CachedStorage<>(new LegacySlimeWorldDataStorage(event.getSlimeWorld())) : new LegacySlimeWorldDataStorage(event.getSlimeWorld())));
}
public LegacySlimeFormatStorageAdaptor(WorldManager worldManager, int version) {

View File

@@ -42,7 +42,7 @@ public class LegacySlimeWorldDataStorage implements WorldDataStorage {
}
@Override
public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) {
public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) {
SlimeChunk slimeChunk = getWorld().getChunk(pos.x, pos.z);
if (slimeChunk == null) return;
CompoundTag nbt = DefaultChunkSerializer.serialize(chunk);

View File

@@ -3,9 +3,11 @@ package net.momirealms.craftengine.bukkit.compatibility.slimeworld;
import com.infernalsuite.asp.api.AdvancedSlimePaperAPI;
import com.infernalsuite.asp.api.events.LoadSlimeWorldEvent;
import com.infernalsuite.asp.api.world.SlimeWorld;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.util.ReflectionUtils;
import net.momirealms.craftengine.core.world.World;
import net.momirealms.craftengine.core.world.WorldManager;
import net.momirealms.craftengine.core.world.chunk.storage.CachedStorage;
import net.momirealms.craftengine.core.world.chunk.storage.DefaultStorageAdaptor;
import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage;
import org.bukkit.Bukkit;
@@ -24,7 +26,8 @@ public class SlimeFormatStorageAdaptor extends DefaultStorageAdaptor implements
@EventHandler
public void onWorldLoad(LoadSlimeWorldEvent event) {
org.bukkit.World world = Bukkit.getWorld(event.getSlimeWorld().getName());
this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), new SlimeWorldDataStorage(event.getSlimeWorld(), this)));
this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world),
Config.enableChunkCache() ? new CachedStorage<>(new SlimeWorldDataStorage(event.getSlimeWorld(), this)) : new SlimeWorldDataStorage(event.getSlimeWorld(), this)));
}
public SlimeFormatStorageAdaptor(WorldManager worldManager) {

View File

@@ -44,7 +44,7 @@ public class SlimeWorldDataStorage implements WorldDataStorage {
@SuppressWarnings("unchecked")
@Override
public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) {
public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) {
SlimeChunk slimeChunk = getWorld().getChunk(pos.x, pos.z);
if (slimeChunk == null) return;
CompoundTag nbt = DefaultChunkSerializer.serialize(chunk);

View File

@@ -31,6 +31,7 @@ import net.momirealms.craftengine.core.world.SectionPos;
import net.momirealms.craftengine.core.world.chunk.CEChunk;
import net.momirealms.craftengine.core.world.chunk.CESection;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.lang.reflect.Method;
@@ -143,7 +144,8 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
}
@Override
protected Operation commitBefore() {
public @Nullable Operation commit() {
Operation operation = super.commit();
saveAllChunks();
List<ChunkPos> chunks = new ArrayList<>(this.brokenChunks);
this.brokenChunks.clear();
@@ -155,7 +157,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
if (loaded == null) continue;
injectLevelChunk(chunkSource, loaded);
}
return super.commitBefore();
return operation;
}
private void processBlocks(Iterable<BlockVector3> region, Pattern pattern) {
@@ -196,7 +198,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
try {
for (CEChunk ceChunk : this.chunksToSave) {
CraftEngine.instance().debug(() -> "Saving chunk " + ceChunk.chunkPos());
this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true);
this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk);
}
this.chunksToSave.clear();
} catch (IOException e) {

View File

@@ -345,8 +345,9 @@ light-system:
force-update-light: false
chunk-system:
# Unloaded chunks may be loaded soon. Delaying serialization can improve performance, especially for those double-dimension mob farms.
delay-serialization: 20 # seconds -1 = disable
# With cache system, those frequently load/unload chunks would consume fewer resources on serialization
# Enabling this option will increase memory consumption to a certain extent
cache-system: true
# 1 = NONE | Compression Speed | Decompress Speed | Compression Ratio | Memory Usage |
# 2 = DEFLATE | Medium-Slow Medium Moderate Low |
# 3 = GZIP | Medium-Slow Medium Moderate Low |
@@ -356,11 +357,11 @@ chunk-system:
# Settings for injection
injection:
# Requires a restart to apply
# SECTION: Inject the LevelChunkSection (Faster, but may conflict with some plugins)
# SECTION: Inject the LevelChunkSection (Faster & Experimental) since 0.0.53
# PALETTE: Inject the PalettedContainer
target: PALETTE
# Enables faster injection method
# Note: May not work with certain server forks that alter chunk saving behavior
# Note: May not work with certain server forks that alter chunk class structure (In most cases it won't conflict)
use-fast-method: false
# Auto-convert custom blocks -> vanilla blocks when unloading chunks
#

View File

@@ -1,7 +1,6 @@
# Don't change this
lang-version: "${lang_version}"
# Commands
exception.invalid_syntax: "<red>Invalid syntax. Correct syntax: <white><arg:0></white></red>"
exception.invalid_argument: "<red>Invalid argument. Reason: <white><arg:0></white></red>"
exception.invalid_sender: "<red><arg:0> is not allowed to execute that command. Must be of type <arg:1></red>"
@@ -70,6 +69,8 @@ warning.config.type.float: "<yellow>Issue found in file <arg:0> - Failed to load
warning.config.type.double: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to double type for option '<arg:3>'.</yellow>"
warning.config.type.quaternionf: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to Quaternionf type for option '<arg:3>'.</yellow>"
warning.config.type.vector3f: "<yellow>Issue found in file <arg:0> - Failed to load '<arg:1>': Cannot cast '<arg:2>' to Vector3f type for option '<arg:3>'.</yellow>"
warning.config.number.missing_type: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is missing the required 'type' argument for number argument.</yellow>"
warning.config.number.invalid_type: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is using an invalid number argument type '<arg:2>'.</yellow>"
warning.config.number.missing_argument: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is missing the argument for 'number'.</yellow>"
warning.config.number.invalid_format: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is using an invalid number format '<arg:2>'.</yellow>"
warning.config.number.fixed.missing_value: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is missing the required 'value' argument for 'constant' number.</yellow>"
@@ -223,7 +224,7 @@ warning.config.block.behavior.sapling.missing_stage: "<yellow>Issue found in fil
warning.config.block.behavior.sapling.missing_feature: "<yellow>Issue found in file <arg:0> - The block '<arg:1>' is missing the required 'feature' argument for 'sapling_block' behavior.</yellow>"
warning.config.block.behavior.strippable.missing_stripped: "<yellow>Issue found in file <arg:0> - The block '<arg:1>' is missing the required 'stripped' argument for 'strippable_block' behavior.</yellow>"
warning.config.block.event.condition.missing_type: "<yellow>Issue found in file <arg:0> - The block '<arg:1>' is missing the required 'type' argument for event condition.</yellow>"
warning.config.block.event.condition.invalid_type: "<yellow>Issue found in file <arg:0> - The block '<arg:1>' is using an invalid 'type' argument for event condition.</yellow>"
warning.config.block.event.condition.invalid_type: "<yellow>Issue found in file <arg:0> - The block '<arg:1>' is using an invalid 'type' argument '<arg:2>' for event condition.</yellow>"
warning.config.model.generation.missing_parent: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' is missing the required 'parent' argument in 'generation' section.</yellow>"
warning.config.model.generation.conflict: "<yellow>Issue found in file <arg:0> - Failed to generate model for '<arg:1>' as two or more configurations attempt to generate different json models with the same path: '<arg:2>'.</yellow>"
warning.config.model.generation.texture.invalid: "<yellow>Issue found in file <arg:0> - The config '<arg:1>' has a texture '<arg:2>' with path '<arg:3>' that contains illegal characters. Please read https://minecraft.wiki/w/Resource_location#Legal_characters.</yellow>"
@@ -249,8 +250,6 @@ warning.config.loot_table.entry.exp.missing_count: "<yellow>Issue found in file
warning.config.loot_table.entry.item.missing_item: "<yellow>Issue found in file <arg:0> - '<arg:1>' has a misconfigured loot table, entry 'item' is missing the required 'item' argument.</yellow>"
warning.config.loot_table.condition.missing_type: "<yellow>Issue found in file <arg:0> - '<arg:1>' has a misconfigured loot table, one of the conditions is missing the required 'type' argument.</yellow>"
warning.config.loot_table.condition.invalid_type: "<yellow>Issue found in file <arg:0> - '<arg:1>' has a misconfigured loot table, one of the conditions is using an invalid condition type '<arg:2>'.</yellow>"
warning.config.loot_table.number.missing_type: "<yellow>Issue found in file <arg:0> - '<arg:1>' has a misconfigured loot table, one of the numbers is missing the required 'type' argument.</yellow>"
warning.config.loot_table.number.invalid_type: "<yellow>Issue found in file <arg:0> - '<arg:1>' has a misconfigured loot table, one of the numbers is using an invalid number type '<arg:2>'.</yellow>"
warning.config.host.missing_type: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'type' argument for host.</yellow>"
warning.config.host.invalid_type: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Host type '<arg:0>' is invalid. Please read https://mo-mi.gitbook.io/xiaomomi-plugins/craftengine/plugin-wiki/craftengine/resource-pack/host.</yellow>"
warning.config.host.external.missing_url: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'url' argument for external host.</yellow>"

View File

@@ -1,50 +1,50 @@
# Don't change this
lang-version: "${lang_version}"
exception.invalid_syntax: "<red>Geçersiz sözdizimi. Doğru sözdizimi: <white><arg:0></white></red>"
exception.invalid_argument: "<red>Geçersiz argüman. Sebep: <white><arg:0></white></red>"
exception.invalid_sender: "<red><arg:0> bu komutu çalıştırma izni yok. <arg:1> türünde olmalı</red>"
exception.unexpected: "<red>Bu komutu gerçekleştirmeye çalışırken dahili bir hata oluştu</red>"
exception.no_permission: "<red>Üzgünüm, bu komutu kullanma izniniz yok</red>"
exception.invalid_syntax: "<red>Geçersiz sözdizimi. Doğru kullanım: <white><arg:0></white></red>"
exception.invalid_argument: "<red>Geçersiz argüman. Neden: <white><arg:0></white></red>"
exception.invalid_sender: "<red><arg:0> bu komutu çalıştırmaya yetkili değil. <arg:1> türünde olmalı</red>"
exception.unexpected: "<red>Bu komutu gerçekleştirirken dahili bir hata oluştu</red>"
exception.no_permission: "<red>Üzgünüm, ancak bu komutu kullanma izniniz yok</red>"
exception.no_such_command: "Bilinmeyen komut."
argument.entity.notfound.player: "<red><lang:argument.entity.notfound.player></red>"
argument.entity.notfound.entity: "<red><lang:argument.entity.notfound.entity></red>"
argument.parse.failure.time: "<red>'<arg:0>' geçerli bir zaman formatı değil</red>"
argument.parse.failure.material: "<red>'<arg:0>' geçerli bir materyal adı değil</red>"
argument.parse.failure.time: "<red>'<arg:0>' geçerli bir zaman biçimi değil</red>"
argument.parse.failure.material: "<red>'<arg:0>' geçerli bir malzeme adı değil</red>"
argument.parse.failure.enchantment: "<red>'<arg:0>' geçerli bir büyü değil</red>"
argument.parse.failure.offlineplayer: "<red>'<arg:0>' için oyuncu bulunamadı</red>"
argument.parse.failure.player: "<red>'<arg:0>' için oyuncu bulunamadı</red>"
argument.parse.failure.offlineplayer: "<red>'<arg:0>' girişi için oyuncu bulunamadı</red>"
argument.parse.failure.player: "<red>'<arg:0>' girişi için oyuncu bulunamadı</red>"
argument.parse.failure.world: "<red>'<arg:0>' geçerli bir Minecraft dünyası değil</red>"
argument.parse.failure.location.invalid_format: "<red>'<arg:0>' geçerli bir konum değil. Gerekli format: '<arg:1> <arg:2> <arg:3></red>"
argument.parse.failure.location.mixed_local_absolute: "<red>Yerel ve mutlak koordinatlar karıştırılamaz. (ya tüm koordinatlar '^' kullanmalı ya da hiçbiri kullanmamalı)</red>"
argument.parse.failure.namespacedkey.namespace: "<red>Geçersiz ad alanı '<arg:0>'. [a-z0-9._-] olmalı</red>"
argument.parse.failure.location.mixed_local_absolute: "<red>Yerel ve mutlak koordinatlar karıştırılamaz. (ya tüm koordinatlar '^' kullanır ya da hiçbiri kullanmaz)</red>"
argument.parse.failure.namespacedkey.namespace: "<red>Geçersiz isim alanı '<arg:0>'. [a-z0-9._-] olmalı</red>"
argument.parse.failure.namespacedkey.key: "<red>Geçersiz anahtar '<arg:0>'. [a-z0-9/._-] olmalı</red>"
argument.parse.failure.namespacedkey.need_namespace: "<red>Geçersiz girdi '<arg:0>', açık bir ad alanı gerektirir</red>"
argument.parse.failure.boolean: "<red>'<arg:0>' değerinden boolean değeri ayrıştırılamadı</red>"
argument.parse.failure.number: "<red>'<arg:0>' <arg:1> ile <arg:2> aralığında geçerli bir sayı değil</red>"
argument.parse.failure.namespacedkey.need_namespace: "<red>Geçersiz giriş '<arg:0>', açık bir isim alanı gerektirir</red>"
argument.parse.failure.boolean: "<red>'<arg:0>' ifadesinden boolean değeri ayrıştırılamadı</red>"
argument.parse.failure.number: "<red>'<arg:0>', <arg:1> ile <arg:2> aralığında geçerli bir sayı değil</red>"
argument.parse.failure.char: "<red>'<arg:0>' geçerli bir karakter değil</red>"
argument.parse.failure.string: "<red>'<arg:0>' <arg:1> türünde geçerli bir dize değil</red>"
argument.parse.failure.string: "<red>'<arg:0>', <arg:1> türünde geçerli bir metin değil</red>"
argument.parse.failure.uuid: "<red>'<arg:0>' geçerli bir UUID değil</red>"
argument.parse.failure.enum: "<red>'<arg:0>' şunlardan biri değil: <arg:1></red>"
argument.parse.failure.regex: "<red>'<arg:0>' şununla eşleşmiyor: '<arg:1>'</red>"
argument.parse.failure.regex: "<red>'<arg:0>', '<arg:1>' ile eşleşmiyor</red>"
argument.parse.failure.flag.unknown: "<red>Bilinmeyen bayrak '<arg:0>'</red>"
argument.parse.failure.flag.duplicate_flag: "<red>Yinelenen bayrak '<arg:0>'</red>"
argument.parse.failure.flag.duplicate_flag: "<red>Tekrarlanan bayrak '<arg:0>'</red>"
argument.parse.failure.flag.no_flag_started: "<red>Hiçbir bayrak başlatılmadı. '<arg:0>' ile ne yapılacağı bilinmiyor</red>"
argument.parse.failure.flag.missing_argument: "<red>'<arg:0>' için eksik argüman</red>"
argument.parse.failure.flag.no_permission: "<red>'<arg:0>' kullanma izniniz yok</red>"
argument.parse.failure.color: "<red>'<arg:0>' geçerli bir renk değil</red>"
argument.parse.failure.duration: "<red>'<arg:0>' bir süre formatı değil</red>"
argument.parse.failure.duration: "<red>'<arg:0>' bir süre biçimi değil</red>"
argument.parse.failure.aggregate.missing: "<red>Eksik bileşen '<arg:0>'</red>"
argument.parse.failure.aggregate.failure: "<red>Geçersiz bileşen '<arg:0>': <arg:1></red>"
argument.parse.failure.either: "<red>'<arg:0>' için <arg:1> veya <arg:2> çözümlenemedi</red>"
argument.parse.failure.namedtextcolor: "<red>'<arg:0>' geçerli bir metin rengi adı değil</red>"
command.reload.config.success: "<white>Yapılandırmalar <green><arg:0></green> ms içinde yeniden yüklendi.</white> <gray>(Asenkron: <arg:1>ms | Senkron: <arg:2>ms)</gray>"
command.reload.config.failure: "<red>Yapılandırma yeniden yükleme başarısız oldu. Konsol günlüklerini kontrol edin.</red>"
argument.parse.failure.either: "<red>'<arg:0>' ifadesinden <arg:1> veya <arg:2> çözümlenemedi</red>"
argument.parse.failure.namedtextcolor: "<red>'<arg:0>' adlandırılmış bir metin rengi değil</red>"
command.reload.config.success: "<white>Yapılandırmalar <green><arg:0></green> ms içinde yeniden yüklendi.</white> <gray>(Eşzamansız: <arg:1>ms | Eşzamanlı: <arg:2>ms)</gray>"
command.reload.config.failure: "<red>Yapılandırma yeniden yüklemesi başarısız oldu. Konsol günlüklerini kontrol edin.</red>"
command.reload.pack.success: "<white>Kaynak paketi <green><arg:0></green> ms içinde yeniden yüklendi.</white>"
command.reload.pack.failure: "<red>Kaynak paketi yeniden yükleme başarısız oldu. Konsol günlüklerini kontrol edin.</red>"
command.reload.all.success: "<white>Yeniden yükleme <green><arg:0></green> ms içinde tamamlandı.</white> <gray>(Asenkron: <arg:1>ms | Senkron: <arg:2>ms | Paket: <arg:3>ms)</gray>"
command.reload.pack.failure: "<red>Kaynak paketi yeniden yüklemesi başarısız oldu. Konsol günlüklerini kontrol edin.</red>"
command.reload.all.success: "<white>Yeniden yükleme <green><arg:0></green> ms içinde tamamlandı.</white> <gray>(Eşzamansız: <arg:1>ms | Eşzamanlı: <arg:2>ms | Paket: <arg:3>ms)</gray>"
command.reload.all.failure: "<red>Yeniden yükleme başarısız oldu. Konsol günlüklerini kontrol edin.</red>"
command.item.get.success: "<white><arg:0> <arg:1> alındı</white>"
command.item.get.success: "<white><arg:0> adet <arg:1> alındı</white>"
command.item.get.failure.not_exist: "<red><lang:argument.item.id.invalid:'<arg:0>'></red>"
command.item.give.success.single: "<lang:commands.give.success.single:'<arg:0>':'<arg:1>':'<arg:2>'>"
command.item.give.success.multiple: "<lang:commands.give.success.multiple:'<arg:0>':'<arg:1>':'<arg:2>'>"
@@ -53,91 +53,219 @@ command.search_recipe.not_found: "<red>Bu eşya için tarif bulunamadı</red>"
command.search_usage.not_found: "<red>Bu eşya için kullanım bulunamadı</red>"
command.search_recipe.no_item: "<red>Bu komutu çalıştırmadan önce lütfen bir eşya tutun</red>"
command.search_usage.no_item: "<red>Bu komutu çalıştırmadan önce lütfen bir eşya tutun</red>"
command.totem_animation.failure.not_totem: "<red>Eşya '<arg:0>' minecraft:totem_of_undying değil</red>"
command.resource.enable.success: "<white><arg:0> kaynağı etkinleştirildi. Değişiklikleri uygulamak için <click:run_command:/ce reload all><u>/ce reload all</u></click> çalıştırın</white>"
command.totem_animation.failure.not_totem: "<red>'<arg:0>' eşyası minecraft:totem_of_undying değil</red>"
command.resource.enable.success: "<white><arg:0> kaynağı etkinleştirildi. Değişiklikleri uygulamak için <click:run_command:/ce reload all><u>/ce reload all</u></click> komutunu çalıştırın</white>"
command.resource.enable.failure.unknown: "<red>Bilinmeyen kaynak <arg:0></red>"
command.resource.disable.success: "<white><arg:0> kaynağı devre dışı bırakıldı. Değişiklikleri uygulamak için <click:run_command:/ce reload all><u>/ce reload all</u></click> çalıştırın</white>"
command.resource.disable.success: "<white><arg:0> kaynağı devre dışı bırakıldı. Değişiklikleri uygulamak için <click:run_command:/ce reload all><u>/ce reload all</u></click> komutunu çalıştırın</white>"
command.resource.disable.failure.unknown: "<red>Bilinmeyen kaynak <arg:0></red>"
command.resource.list: "<white>Etkin kaynaklar(<arg:0>): <green><arg:1></green><newline>Devre dışı kaynaklar(<arg:2>): <red><arg:3></red></white>"
command.upload.failure.not_supported: "<red>Mevcut barındırma yöntemi '<arg:0>' kaynak paketlerinin yüklenmesini desteklemiyor.</red>"
command.upload.on_progress: "<white>Yükleme süreci başlatıldı. Daha fazla bilgi için konsolu kontrol edin.</white>"
command.upload.on_progress: "<white>Yükleme işlemi başlatıldı. Daha fazla bilgi için konsola bakın.</white>"
command.send_resource_pack.success.single: "<white>Kaynak paketi <arg:0> kişisine gönderildi.</white>"
command.send_resource_pack.success.multiple: "<white>Kaynak paketleri <arg:0> oyuncuya gönderildi.</white>"
# Outdated, needs update
#warning.config.image.duplicated: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görseli yineleniyor.</yellow>"
#warning.config.image.lack_height: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görseli gerekli 'height' argümanı eksik.</yellow>"
#warning.config.image.height_smaller_than_ascent: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görseli bitmap görsel kuralını ihlal ediyor: 'height' 'ascent'ten düşük olmamalı.</yellow>"
#warning.config.image.no_file: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görseli gerekli 'file' argümanı eksik.</yellow>"
#warning.config.image.invalid_resource_location: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görselinin 'file' argümanı [<arg:2>] yasal karakterler içeriyor. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters adresini okuyun</yellow>"
#warning.config.image.invalid_font_name: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görselinin 'font' argümanı [<arg:2>] yasal karakterler içeriyor. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters adresini okuyun</yellow>"
#warning.config.image.lack_char: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görseli gerekli 'char' argümanı eksik.</yellow>"
#warning.config.image.codepoint_in_use: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görseli <arg:2> fontunda başka bir görsel olan '<arg:5>' tarafından kullanılmış bir karakter[<arg:3>(<arg:4>)] kullanıyor.</yellow>"
#warning.config.image.invalid_codepoint_grid: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görseli geçersiz bir 'chars' kod noktası ızgarasına sahip.</yellow>"
#warning.config.image.file_not_exist: "<yellow><arg:0> dosyasında sorun - '<arg:1>' görseli için '<arg:2>' PNG dosyası bulunamadı.</yellow>"
#warning.config.recipe.duplicated: "<yellow><arg:0> dosyasında sorun - Yinelenen tarif '<arg:1>'.</yellow>"
#warning.config.i18n.unknown_locale: "<yellow><arg:0> dosyasında sorun - Bilinmeyen yerel ayar '<arg:1>'.</yellow>"
#warning.config.template.duplicated: "<yellow><arg:0> dosyasında sorun - Yinelenen şablon '<arg:1>'.</yellow>"
#warning.config.vanilla_loot.type_not_exist: "<yellow><arg:0> dosyasında sorun - '<arg:1>' vanilla ganimeti için 'type' ayarlanmamış.</yellow>"
#warning.config.vanilla_loot.block.invalid_target: "<yellow><arg:0> dosyasında sorun - '<arg:1>' vanilla ganimetinde geçersiz blok hedefi [<arg:2>].</yellow>"
#warning.config.sound.duplicated: "<yellow><arg:0> dosyasında sorun - Yinelenen ses '<arg:1>'.</yellow>"
#warning.config.jukebox_song.duplicated: "<yellow><arg:0> dosyasında sorun - Yinelenen müzik kutusu şarkısı '<arg:1>'.</yellow>"
#warning.config.furniture.duplicated: "<yellow><arg:0> dosyasında sorun - Yinelenen mobilya '<arg:1>'.</yellow>"
#warning.config.furniture.lack_placement: "<yellow><arg:0> dosyasında sorun - '<arg:1>' mobilyası gerekli 'placement' argümanı eksik.</yellow>"
#warning.config.furniture.element.lack_item: "<yellow><arg:0> dosyasında sorun - '<arg:1>' mobilyasının elementlerinden biri için gerekli 'item' argümanı eksik.</yellow>"
#warning.config.item.duplicated: "<yellow><arg:0> dosyasında sorun - Yinelenen eşya '<arg:1>'.</yellow>"
#warning.config.item.lack_material: "<yellow><arg:0> dosyasında sorun - '<arg:1>' eşyası gerekli 'material' argümanı eksik.</yellow>"
#warning.config.item.invalid_material: "<yellow><arg:0> dosyasında sorun - '<arg:1>' eşyası geçersiz bir materyal türü olan '<arg:2>' kullanıyor.</yellow>"
#warning.config.item.bad_custom_model_data_value: "<yellow><arg:0> dosyasında sorun - '<arg:1>' eşyası çok büyük bir özel model verisi [<arg:2>] kullanıyor. 16.777.216'dan düşük bir değer kullanılması önerilir.</yellow>"
#warning.config.item.custom_model_data_conflict: "<yellow><arg:0> dosyasında sorun - '<arg:1>' eşyası '<arg:3>' eşyası tarafından zaten kullanılmış bir özel model verisi [<arg:2>] kullanıyor</yellow>"
#warning.config.item.lack_model_id: "<yellow><arg:0> dosyasında sorun - '<arg:1>' eşyası gerekli 'custom-model-data' veya 'item-model' argümanı eksik.</yellow>"
#warning.config.block.duplicated: "<yellow><arg:0> dosyasında sorun - Yinelenen blok '<arg:1>'.</yellow>"
#warning.config.block.lack_state: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu gerekli 'state' argümanı eksik.</yellow>"
#warning.config.block.state.lack_real_id: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu 'state' için gerekli 'id' argümanı eksik.</yellow>"
#warning.config.block.state.lack_state: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu 'state' için gerekli 'state' argümanı eksik.</yellow>"
#warning.config.block.state.lack_properties: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu 'states' için gerekli 'properties' bölümü eksik.</yellow>"
#warning.config.block.state.lack_appearances: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu 'states' için gerekli 'appearances' bölümü eksik.</yellow>"
#warning.config.block.state.lack_variants: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu 'states' için gerekli 'variants' bölümü eksik.</yellow>"
#warning.config.block.state.variant.lack_appearance: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu '<arg:2>' varyantı için gerekli 'appearance' argümanı eksik.</yellow>"
#warning.config.block.state.variant.invalid_appearance: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğunda '<arg:2>' varyantının var olmayan bir görünüm olan '<arg:3>' kullandığı hatası var.</yellow>"
#warning.config.block.state.invalid_state: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu geçersiz bir vanilla blok durumu olan '<arg:2>' kullanıyor."
#warning.config.block.state.unavailable_state: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu kullanılamayan bir vanilla blok durumu olan '<arg:2>' kullanıyor."
#warning.config.block.state.invalid_vanilla_state_id: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu mevcut slot aralığı '0~<arg:3>' dışında bir vanilla blok durumu '<arg:2>' kullanıyor."
#warning.config.block.state.conflict: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu '<arg:3>' tarafından zaten kullanılmış bir vanilla blok durumu '<arg:2>' kullanıyor."
#warning.config.block.state.bind_real_state: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu '<arg:2>' için gerçek blok durumu bağlanamadı çünkü durum '<arg:3>' tarafından kullanılıyor.</yellow>"
#warning.config.block.state.invalid_property_structure: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğunda geçersiz bir özellik yapısı '<arg:2>' var."
#warning.config.block.state.invalid_property: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu için '<arg:2>' özelliği oluşturulamadı: <arg:3>."
#warning.config.block.state.no_model_set: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu gerekli 'model' veya 'models' argümanı eksik.</yellow>"
#warning.config.block.state.invalid_real_state_id: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu mevcut slot aralığı '0~<arg:3>' dışında bir gerçek blok durumu '<arg:2>' kullanıyor. Eğer slotlar tükenmişse 'additional-real-blocks.yml' içine daha fazla gerçek durum eklemeyi düşünün.</yellow>"
#warning.config.block.state.model.lack_path: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğu 'model' için gerekli 'path' seçeneği eksik.</yellow>"
#warning.config.block.state.model.invalid_resource_location: "<yellow><arg:0> dosyasında sorun - '<arg:1>' bloğunun 'path' argümanı [<arg:2>] yasal karakterler içeriyor. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters adresini okuyun</yellow>"
#warning.config.model.generation.conflict: "<yellow><arg:0> dosyasında sorun - '<arg:1>' için model oluşturulamadı çünkü iki veya daha fazla yapılandırma aynı yolla farklı json modelleri oluşturmaya çalışıyor: '<arg:2>'</yellow>"
#warning.config.model.generation.texture.invalid_resource_location: "<yellow><arg:0> dosyasında sorun - '<arg:1>' yapılandırmasının '<arg:2>' doku argümanı [<arg:3>] yasal karakterler içeriyor. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters adresini okuyun</yellow>"
#warning.config.model.generation.parent.invalid_resource_location: "<yellow><arg:0> dosyasında sorun - '<arg:1>' yapılandırmasının parent argümanı [<arg:2>] yasal karakterler içeriyor. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters adresini okuyun</yellow>"
#warning.config.emoji.lack_keywords: "<yellow><arg:0> dosyasında sorun - '<arg:1>' emojisi gerekli 'keywords' argümanı eksik.</yellow>"
#warning.config.emoji.duplicated: "<yellow><arg:0> dosyasında sorun - Yinelenen emoji '<arg:1>'.</yellow>"
#warning.config.emoji.invalid_image: "<yellow><arg:0> dosyasında sorun - '<arg:1>' emojisi geçersiz bir 'image' argümanı '<arg:2>' kullanıyor.</yellow>"
#warning.config.advancement.duplicated: "<yellow><arg:0> dosyasında sorun - Yinelenen ilerleme '<arg:1>'.</yellow>"
#warning.config.host.lack_type: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Host için gerekli 'type' argümanı eksik.</yellow>"
#warning.config.host.invalid_type: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Host 'type' [<arg:0>] geçersiz. Lütfen https://mo-mi.gitbook.io/xiaomomi-plugins/craftengine/plugin-wiki/craftengine/resource-pack/host adresini okuyun</yellow>"
#warning.config.host.external.lack_url: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Harici host için gerekli 'url' argümanı eksik.</yellow>"
#warning.config.host.alist.lack_api_url: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Alist host için gerekli 'api-url' argümanı eksik.</yellow>"
#warning.config.host.alist.lack_username: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Alist host için gerekli 'username' argümanı veya 'CE_ALIST_USERNAME' ortam değişkeni eksik.</yellow>"
#warning.config.host.alist.lack_password: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Alist host için gerekli 'password' argümanı veya 'CE_ALIST_PASSWORD' ortam değişkeni eksik.</yellow>"
#warning.config.host.alist.lack_upload_path: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Alist host için gerekli 'upload-path' argümanı eksik.</yellow>"
#warning.config.host.dropbox.lack_app_key: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Dropbox host için gerekli 'app-key' argümanı veya 'CE_DROPBOX_APP_KEY' ortam değişkeni eksik.</yellow>"
#warning.config.host.dropbox.lack_app_secret: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Dropbox host için gerekli 'app-secret' argümanı veya 'CE_DROPBOX_APP_SECRET' ortam değişkeni eksik.</yellow>"
#warning.config.host.dropbox.lack_refresh_token: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Dropbox host için gerekli 'refresh-token' argümanı veya 'CE_DROPBOX_REFRESH_TOKEN' ortam değişkeni eksik.</yellow>"
#warning.config.host.dropbox.lack_upload_path: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Dropbox host için gerekli 'upload-path' argümanı eksik.</yellow>"
#warning.config.host.lobfile.lack_api_key: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Lobfile host için gerekli 'api-key' argümanı eksik.</yellow>"
#warning.config.host.onedrive.lack_client_id: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - OneDrive host için gerekli 'client-id' argümanı veya 'CE_ONEDRIVE_CLIENT_ID' ortam değişkeni eksik.</yellow>"
#warning.config.host.onedrive.lack_client_secret: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - OneDrive host için gerekli 'client-secret' argümanı veya 'CE_ONEDRIVE_CLIENT_SECRET' ortam değişkeni eksik.</yellow>"
#warning.config.host.onedrive.lack_refresh_token: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - OneDrive host için gerekli 'refresh-token' argümanı veya 'CE_ONEDRIVE_REFRESH_TOKEN' ortam değişkeni eksik.</yellow>"
#warning.config.host.onedrive.lack_upload_path: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - OneDrive host için gerekli 'upload-path' argümanı eksik.</yellow>"
#warning.config.host.s3.lack_endpoint: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - S3 host için gerekli 'endpoint' argümanı eksik.</yellow>"
#warning.config.host.s3.lack_bucket: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - S3 host için gerekli 'bucket' argümanı eksik.</yellow>"
#warning.config.host.s3.lack_access_key_id: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - S3 host için gerekli 'access-key-id' argümanı veya 'CE_S3_ACCESS_KEY_ID' ortam değişkeni eksik.</yellow>"
#warning.config.host.s3.lack_access_key_secret: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - S3 host için gerekli 'access-key-secret' argümanı veya 'CE_S3_ACCESS_KEY_SECRET' ortam değişkeni eksik.</yellow>"
#warning.config.host.s3.lack_upload_path: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - S3 host için gerekli 'upload-path' argümanı eksik.</yellow>"
#warning.config.host.self.lack_ip: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Self host için gerekli 'ip' argümanı eksik.</yellow>"
#warning.config.host.self.invalid_port: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' konumunda sorun - Self host için geçersiz 'port' [<arg:0>].</yellow>"
warning.config.pack.duplicated_files: "</red>Yinelenen dosyalar bulundu. Lütfen config.yml 'resource-pack.duplicated-files-handler' bölümünden bunları çözün.</red>"
warning.config.type.int: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' yüklenemedi: '<arg:2>' değeri '<arg:3>' seçeneği için tamsayı türüne dönüştürülemiyor.</yellow>"
warning.config.type.float: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' yüklenemedi: '<arg:2>' değeri '<arg:3>' seçeneği için ondalık türüne dönüştürülemiyor.</yellow>"
warning.config.type.double: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' yüklenemedi: '<arg:2>' değeri '<arg:3>' seçeneği için double türüne dönüştürülemiyor.</yellow>"
warning.config.type.quaternionf: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' yüklenemedi: '<arg:2>' değeri '<arg:3>' seçeneği için Quaternionf türüne dönüştürülemiyor.</yellow>"
warning.config.type.vector3f: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' yüklenemedi: '<arg:2>' değeri '<arg:3>' seçeneği için Vector3f türüne dönüştürülemiyor.</yellow>"
warning.config.structure.not_section: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' yapılandırması bir yapılandırma bölümü olması beklenirken aslında bir '<arg:2>' türündedir.</yellow>"
warning.config.image.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen resim '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.image.missing_height: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resmi gerekli 'height' argümanı eksik.</yellow>"
warning.config.image.height_ascent_conflict: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resmi bitmap resim kuralını ihlal ediyor: 'height' argümanı '<arg:2>', 'ascent' argümanı '<arg:3>' değerinden düşük olmamalı.</yellow>"
warning.config.image.missing_file: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resmi gerekli 'file' argümanı eksik.</yellow>"
warning.config.image.invalid_file_chars: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resmi, yasak karakterler içeren '<arg:2>' 'file' argümanına sahip. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters sayfasını okuyun.</yellow>"
warning.config.image.invalid_font_chars: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resmi, yasak karakterler içeren '<arg:2>' 'font' argümanına sahip. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters sayfasını okuyun.</yellow>"
warning.config.image.missing_char: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resmi gerekli 'char' argümanı eksik.</yellow>"
warning.config.image.codepoint_conflict: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resmi, <arg:2> yazı tipinde başka bir resim '<arg:5>' tarafından kullanılmış olan '<arg:3>(<arg:4>)' karakterini kullanıyor.</yellow>"
warning.config.image.invalid_codepoint_grid: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resminin geçersiz bir 'chars' kod noktası ızgarası var.</yellow>"
warning.config.image.file_not_found: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resmi için '<arg:2>' PNG dosyası bulunamadı.</yellow>"
warning.config.image.invalid_hex_value: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' resmi, geçerli bir onaltılık (16 tabanlı) değer olmayan '<arg:2>' unicode karakterini kullanıyor.</yellow>"
warning.config.recipe.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen tarif '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.recipe.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' tarifi gerekli 'type' argümanı eksik.</yellow>"
warning.config.recipe.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' tarifi geçersiz bir tarif türü '<arg:2>' kullanıyor.</yellow>"
warning.config.recipe.invalid_item: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' tarifi geçersiz bir eşya '<arg:2>' kullanıyor.</yellow>"
warning.config.recipe.missing_ingredient: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' pişirme tarifi gerekli 'ingredient' argümanı eksik.</yellow>"
warning.config.recipe.missing_result: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' tarifi gerekli 'result' argümanı eksik.</yellow>"
warning.config.recipe.result.missing_id: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' tarifi, tarif sonucu için gerekli 'id' argümanı eksik.</yellow>"
warning.config.recipe.crafting.invalid_category: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' üretim tarifi geçersiz bir kategori '<arg:2>' kullanıyor. İzin verilen kategoriler: [<arg:3>].</yellow>"
warning.config.recipe.cooking.invalid_category: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' pişirme tarifi geçersiz bir kategori '<arg:2>' kullanıyor. İzin verilen kategoriler: [<arg:3>].</yellow>"
warning.config.recipe.shaped.missing_pattern: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' şekilli tarifi gerekli 'pattern' argümanı eksik.</yellow>"
warning.config.recipe.shaped.invalid_pattern: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' şekilli tarifi geçersiz bir desen '<arg:2>' kullanıyor.</yellow>"
warning.config.recipe.shaped.invalid_symbol: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' şekilli tarifi, desende geçersiz bir sembol '<arg:2>' kullanıyor.</yellow>"
warning.config.recipe.smithing_transform.post_processor.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' demircilik dönüşüm tarifi, işlem sonrası işleyicilerinden biri için gerekli 'type' argümanı eksik.</yellow>"
warning.config.recipe.smithing_transform.post_processor.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' demircilik dönüşüm tarifi geçersiz bir işlem sonrası işleyici türü '<arg:2>' kullanıyor.</yellow>"
warning.config.recipe.smithing_transform.post_processor.keep_component.missing_components: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' demircilik dönüşüm tarifi, 'keep_components' işlem sonrası işleyicisi için gerekli 'components' argümanı eksik.</yellow>"
warning.config.recipe.smithing_transform.post_processor.keep_component.missing_tags: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' demircilik dönüşüm tarifi, 'keep_tags' işlem sonrası işleyicisi için gerekli 'tags' argümanı eksik.</yellow>"
warning.config.i18n.unknown_locale: "<yellow><arg:0> dosyasında sorun bulundu - Bilinmeyen yerel ayar '<arg:1>'.</yellow>"
warning.config.template.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen şablon '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.template.argument.self_increase_int.invalid_range: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' şablonu, 'self_increase_int' argümanında 'to' '<arg:3>' değerinden daha büyük bir 'from' '<arg:2>' değeri kullanıyor.</yellow>"
warning.config.template.argument.list.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' şablonu, argüman olarak bir 'List' bekleyen bir 'list' argümanı kullanıyor, ancak giriş argümanı bir '<arg:2>' türünde.</yellow>"
warning.config.vanilla_loot.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' vanilya ganimeti gerekli 'type' argümanı eksik.</yellow>"
warning.config.vanilla_loot.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' vanilya ganimeti geçersiz bir tür '<arg:2>' kullanıyor. İzin verilen türler: [<arg:3>].</yellow>"
warning.config.vanilla_loot.block.invalid_target: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' vanilya ganimetinde geçersiz blok hedefi '<arg:2>'.</yellow>"
warning.config.sound.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen ses '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.sound.missing_sounds: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' sesi gerekli 'sounds' argümanı eksik.</yellow>"
warning.config.sound.missing_name: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' sesi gerekli 'name' argümanı eksik.</yellow>"
warning.config.jukebox_song.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen müzik çalar şarkısı '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.jukebox_song.missing_sound: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' müzik çalar şarkısı gerekli 'sound' argümanı eksik.</yellow>"
warning.config.furniture.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen mobilya '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.furniture.missing_placement: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' mobilyası gerekli 'placement' argümanı eksik.</yellow>"
warning.config.furniture.element.missing_item: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' mobilyası, elementlerinden biri için gerekli 'item' argümanı eksik.</yellow>"
warning.config.furniture.settings.unknown: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' mobilyası bilinmeyen bir ayar türü '<arg:2>' kullanıyor.</yellow>"
warning.config.furniture.hitbox.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' mobilyası geçersiz bir hitbox türü '<arg:2>' kullanıyor.</yellow>"
warning.config.furniture.hitbox.custom.invalid_entity: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' mobilyası, geçersiz varlık türü '<arg:2>' olan özel bir hitbox kullanıyor.</yellow>"
warning.config.item.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen eşya '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.item.settings.unknown: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası bilinmeyen bir ayar türü '<arg:2>' kullanıyor.</yellow>"
warning.config.item.missing_material: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası gerekli 'material' argümanı eksik.</yellow>"
warning.config.item.invalid_material: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası geçersiz bir malzeme türü '<arg:2>' kullanıyor.</yellow>"
warning.config.item.bad_custom_model_data: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası çok büyük bir özel model verisi '<arg:2>' kullanıyor. 16.777.216'dan düşük bir değer kullanmanız önerilir.</yellow>"
warning.config.item.custom_model_data_conflict: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, '<arg:3>' eşyası tarafından işgal edilmiş bir özel model verisi '<arg:2>' kullanıyor.</yellow>"
warning.config.item.missing_model_id: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası gerekli 'custom-model-data' veya 'item-model' argümanı eksik.</yellow>"
warning.config.item.behavior.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, eşya davranışı için gerekli 'type' argümanı eksik.</yellow>"
warning.config.item.behavior.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası geçersiz bir eşya davranış türü '<arg:2>' kullanıyor.</yellow>"
warning.config.item.behavior.block.missing_block: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'block_item' davranışı için gerekli 'block' argümanı eksik.</yellow>"
warning.config.item.behavior.furniture.missing_furniture: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'furniture_item' davranışı için gerekli 'furniture' argümanı eksik.</yellow>"
warning.config.item.behavior.liquid_collision.missing_block: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'liquid_collision_block_item' davranışı için gerekli 'block' argümanı eksik.</yellow>"
warning.config.item.model.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası geçersiz bir model türü '<arg:2>' kullanıyor.</yellow>"
warning.config.item.model.tint.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, renk tonu için gerekli 'type' argümanı eksik.</yellow>"
warning.config.item.model.tint.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası geçersiz bir renk tonu türü '<arg:2>' kullanıyor.</yellow>"
warning.config.item.model.tint.constant.missing_value: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, sabit renk tonu için gerekli 'value' argümanı eksik.</yellow>"
warning.config.item.model.tint.grass.invalid_temp: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, çimen renk tonu için 0 ile 1 arasında olması beklenen geçersiz bir sıcaklık '<arg:2>' kullanıyor.</yellow>"
warning.config.item.model.tint.grass.invalid_downfall: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, çimen renk tonu için 0 ile 1 arasında olması beklenen geçersiz bir yağış '<arg:2>' kullanıyor.</yellow>"
warning.config.item.model.tint.invalid_value: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası geçersiz bir renk tonu '<arg:2>' kullanıyor.</yellow>"
warning.config.item.model.base.missing_path: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:model' modeli için gerekli 'path' argümanı eksik.</yellow>"
warning.config.item.model.base.invalid_path: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyasının, yasak karakterler içeren geçersiz bir 'path' argümanı '<arg:2>' var. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters sayfasını okuyun.</yellow>"
warning.config.item.model.condition.missing_property: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:condition' modeli için gerekli 'property' argümanı eksik.</yellow>"
warning.config.item.model.condition.invalid_property: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:condition' modeli için geçersiz bir özellik '<arg:2>' kullanıyor.</yellow>"
warning.config.item.model.condition.missing_on_true: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:condition' modeli için gerekli 'on-true' argümanı eksik.</yellow>"
warning.config.item.model.condition.missing_on_false: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:condition' modeli için gerekli 'on-false' argümanı eksik.</yellow>"
warning.config.item.model.condition.keybind.missing: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:keybind_down' özelliği için gerekli 'keybind' argümanı eksik.</yellow>"
warning.config.item.model.condition.has_component.missing_component: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:has_component' özelliği için gerekli 'component' argümanı eksik.</yellow>"
warning.config.item.model.composite.missing_models: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:composite' modeli için gerekli 'models' argümanı eksik.</yellow>"
warning.config.item.model.range_dispatch.missing_property: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:range_dispatch' modeli için gerekli 'property' argümanı eksik.</yellow>"
warning.config.item.model.range_dispatch.invalid_property: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:range_dispatch' modeli için geçersiz bir özellik '<arg:2>' kullanıyor.</yellow>"
warning.config.item.model.range_dispatch.missing_entries: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:composite' modeli için gerekli 'entries' argümanı eksik.</yellow>"
warning.config.item.model.range_dispatch.entry.missing_model: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:composite' modelindeki girişlerden biri için gerekli 'model' argümanı eksik.</yellow>"
warning.config.item.model.range_dispatch.compass.missing_target: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:compass' özelliği için gerekli 'target' argümanı eksik.</yellow>"
warning.config.item.model.range_dispatch.time.missing_source: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:time' özelliği için gerekli 'source' argümanı eksik.</yellow>"
warning.config.item.model.select.missing_property: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:select' modeli için gerekli 'property' argümanı eksik.</yellow>"
warning.config.item.model.select.invalid_property: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:select' modeli için geçersiz bir özellik '<arg:2>' kullanıyor.</yellow>"
warning.config.item.model.select.missing_cases: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:select' modeli için gerekli 'cases' argümanı eksik.</yellow>"
warning.config.item.model.select.case.missing_when: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:select' modelindeki durumlardan biri için gerekli 'when' argümanı eksik.</yellow>"
warning.config.item.model.select.case.missing_model: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:select' modelindeki durumlardan biri için gerekli 'model' argümanı eksik.</yellow>"
warning.config.item.model.select.block_state.missing_property: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:block_state' özelliği için gerekli 'block-state-property' argümanı eksik.</yellow>"
warning.config.item.model.select.local_time.missing_pattern: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:local_time' özelliği için gerekli 'pattern' argümanı eksik.</yellow>"
warning.config.item.model.special.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:special' modeli için gerekli 'type' argümanı eksik.</yellow>"
warning.config.item.model.special.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:special' modeli için geçersiz bir tür '<arg:2>' kullanıyor.</yellow>"
warning.config.item.model.special.banner.missing_color: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:banner' özel modeli için gerekli 'color' argümanı eksik.</yellow>"
warning.config.item.model.special.bed.missing_texture: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:bed' özel modeli için gerekli 'texture' argümanı eksik.</yellow>"
warning.config.item.model.special.sign.missing_wood_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:hanging_sign'/'minecraft:standing_sign' özel modeli için gerekli 'wood-type' argümanı eksik.</yellow>"
warning.config.item.model.special.sign.missing_texture: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:hanging_sign'/'minecraft:standing_sign' özel modeli için gerekli 'texture' argümanı eksik.</yellow>"
warning.config.item.model.special.chest.missing_texture: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:chest' özel modeli için gerekli 'texture' argümanı eksik.</yellow>"
warning.config.item.model.special.chest.invalid_openness: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:chest' özel modeli için geçersiz bir 'openness' değeri '<arg:2>' kullanıyor. Geçerli aralık '0~1.'</yellow>"
warning.config.item.model.special.shulker_box.missing_texture: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:shulker_box' özel modeli için gerekli 'texture' argümanı eksik.</yellow>"
warning.config.item.model.special.shulker_box.invalid_openness: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:shulker_box' özel modeli için geçersiz bir 'openness' değeri '<arg:2>' kullanıyor. Geçerli aralık '0~1.'</yellow>"
warning.config.item.model.special.head.missing_kind: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:head' özel modeli için gerekli 'kind' argümanı eksik.</yellow>"
warning.config.item.model.special.head.missing_texture: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' eşyası, 'minecraft:head' özel modeli için gerekli 'texture' argümanı eksik.</yellow>"
warning.config.block.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen blok '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.block.missing_state: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu gerekli 'state' argümanı eksik.</yellow>"
warning.config.block.state.property.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, '<arg:2>' özelliği için gerekli 'type' argümanı eksik.</yellow>"
warning.config.block.state.property.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, '<arg:3>' özelliği için geçersiz bir 'type' argümanı '<arg:2>' kullanıyor.</yellow>"
warning.config.block.state.property.integer.invalid_range: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, '<arg:3>' tamsayı özelliği için geçersiz bir 'range' argümanı '<arg:2>' kullanıyor. Doğru sözdizimi: 1~2.</yellow>"
warning.config.block.state.property.invalid_format: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, geçersiz bir blok durum özelliği formatı '<arg:2>' kullanıyor.</yellow>"
warning.config.block.state.missing_real_id: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'state' için gerekli 'id' argümanı eksik. 'id', her blok durumu türü için benzersiz olan sunucu tarafı blok kimliğidir. 'note_block' ve id 30 ile bir sunucu tarafı blok oluşturursanız, gerçek blok kimliği 'craftengine:note_block_30' olur.</yellow>"
warning.config.block.state.missing_state: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'state' için gerekli 'state' argümanı eksik.</yellow>"
warning.config.block.state.missing_properties: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'states' için gerekli 'properties' bölümü eksik.</yellow>"
warning.config.block.state.missing_appearances: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'states' için gerekli 'appearances' bölümü eksik.</yellow>"
warning.config.block.state.missing_variants: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'states' için gerekli 'variants' bölümü eksik.</yellow>"
warning.config.block.state.variant.missing_appearance: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, '<arg:2>' varyantı için gerekli 'appearance' argümanı eksik.</yellow>"
warning.config.block.state.variant.invalid_appearance: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğunda, '<arg:2>' varyantının var olmayan bir görünüm '<arg:3>' kullandığı bir hata var.</yellow>"
warning.config.block.state.invalid_vanilla: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu geçersiz bir vanilya blok durumu '<arg:2>' kullanıyor.</yellow>"
warning.config.block.state.unavailable_vanilla: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu kullanılamayan bir vanilya blok durumu '<arg:2>' kullanıyor. Lütfen bu durumu mappings.yml dosyasında serbest bırakın.</yellow>"
warning.config.block.state.invalid_vanilla_id: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, mevcut yuva aralığı '0~<arg:3>' aşan bir vanilya blok durumu '<arg:2>' kullanıyor.</yellow>"
warning.config.block.state.conflict: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, '<arg:3>' tarafından işgal edilmiş bir vanilya blok durumu '<arg:2>' kullanıyor.</yellow>"
warning.config.block.state.bind_failed: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, durum '<arg:3>' tarafından işgal edildiği için '<arg:2>' için gerçek blok durumu bağlamada başarısız oldu.</yellow>"
warning.config.block.state.missing_model: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu gerekli 'model' veya 'models' argümanı eksik.</yellow>"
warning.config.block.state.invalid_real_id: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, mevcut yuva aralığı '0~<arg:3>' aşan bir gerçek blok durumu '<arg:2>' kullanıyor. Yuvalar kullanılmışsa, 'additional-real-blocks.yml' dosyasına daha fazla gerçek durum eklemeyi düşünün.</yellow>"
warning.config.block.state.model.missing_path: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'model' için gerekli 'path' seçeneği eksik.</yellow>"
warning.config.block.state.model.invalid_path: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğunun, yasak karakterler içeren bir 'path' argümanı '<arg:2>' var. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters sayfasını okuyun.</yellow>"
warning.config.block.settings.unknown: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu bilinmeyen bir ayar türü '<arg:2>' kullanıyor.</yellow>"
warning.config.block.behavior.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, blok davranışı için gerekli 'type' argümanı eksik.</yellow>"
warning.config.block.behavior.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu geçersiz bir blok davranış türü '<arg:2>' kullanıyor.</yellow>"
warning.config.block.behavior.concrete.missing_solid: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'concrete_block' davranışı için gerekli 'solid-block' seçeneği eksik.</yellow>"
warning.config.block.behavior.crop.missing_age: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'crop_block' davranışı için gerekli 'age' özelliği eksik.</yellow>"
warning.config.block.behavior.sugar_cane.missing_age: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'sugar_cane_block' davranışı için gerekli 'age' özelliği eksik.</yellow>"
warning.config.block.behavior.leaves.missing_persistent: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'leaves_block' davranışı için gerekli 'persistent' özelliği eksik.</yellow>"
warning.config.block.behavior.leaves.missing_distance: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'leaves_block' davranışı için gerekli 'distance' özelliği eksik.</yellow>"
warning.config.block.behavior.sapling.missing_stage: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'sapling_block' davranışı için gerekli 'stage' özelliği eksik.</yellow>"
warning.config.block.behavior.sapling.missing_feature: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'sapling_block' davranışı için gerekli 'feature' argümanı eksik.</yellow>"
warning.config.block.behavior.strippable.missing_stripped: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' bloğu, 'strippable_block' davranışı için gerekli 'stripped' argümanı eksik.</yellow>"
warning.config.model.generation.missing_parent: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' yapılandırması, 'generation' bölümünde gerekli 'parent' argümanı eksik.</yellow>"
warning.config.model.generation.conflict: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' için model oluşturulurken hata; iki veya daha fazla yapılandırma aynı yolla farklı json modelleri oluşturmaya çalışıyor: '<arg:2>'.</yellow>"
warning.config.model.generation.texture.invalid: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' yapılandırması, yasak karakterler içeren '<arg:3>' yoluna sahip bir '<arg:2>' dokusuna sahip. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters sayfasını okuyun.</yellow>"
warning.config.model.generation.parent.invalid: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' yapılandırması, yasak karakterler içeren bir parent argümanı '<arg:2>' kullanıyor. Lütfen https://minecraft.wiki/w/Resource_location#Legal_characters sayfasını okuyun.</yellow>"
warning.config.emoji.missing_keywords: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' emojisi gerekli 'keywords' argümanı eksik.</yellow>"
warning.config.emoji.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen emoji '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.emoji.invalid_image: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>' emojisi geçersiz bir 'image' argümanı '<arg:2>' kullanıyor.</yellow>"
warning.config.advancement.duplicate: "<yellow><arg:0> dosyasında sorun bulundu - Yinelenen ilerleme '<arg:1>'. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin.</yellow>"
warning.config.loot_table.missing_pools: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', gerekli 'pools' argümanı eksik olan yanlış yapılandırılmış bir ganimet tablosuna sahip.</yellow>"
warning.config.loot_table.invalid_pools_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'pools' bir dizi/harita listesi olmalı, mevcut tür: '<arg:2>'.</yellow>"
warning.config.loot_table.invalid_conditions_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'conditions' bir harita listesi olmalı, mevcut tür: '<arg:2>'.</yellow>"
warning.config.loot_table.invalid_functions_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'functions' bir harita listesi olmalı, mevcut tür: '<arg:2>'.</yellow>"
warning.config.loot_table.invalid_entries_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'entries' bir harita listesi olmalı, mevcut tür: '<arg:2>'.</yellow>"
warning.config.loot_table.function.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, fonksiyonlardan biri için gerekli 'type' argümanı eksik.</yellow>"
warning.config.loot_table.function.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, fonksiyonlardan biri geçersiz bir fonksiyon türü '<arg:2>' kullanıyor.</yellow>"
warning.config.loot_table.function.apply_bonus.missing_enchantment: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'apply_bonus' fonksiyonu için gerekli 'enchantment' argümanı eksik.</yellow>"
warning.config.loot_table.function.apply_bonus.missing_formula: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'apply_bonus' fonksiyonu için gerekli 'formula' argümanı eksik.</yellow>"
warning.config.loot_table.function.drop_exp.missing_count: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'drop_exp' fonksiyonu için gerekli 'count' argümanı eksik.</yellow>"
warning.config.loot_table.function.set_count.missing_count: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'set_count' fonksiyonu için gerekli 'count' argümanı eksik.</yellow>"
warning.config.loot_table.entry.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, girişlerden biri için gerekli 'type' argümanı eksik.</yellow>"
warning.config.loot_table.entry.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, girişlerden biri geçersiz bir giriş türü '<arg:2>' kullanıyor.</yellow>"
warning.config.loot_table.entry.exp.missing_count: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'exp' girişi için gerekli 'count' argümanı eksik.</yellow>"
warning.config.loot_table.entry.item.missing_item: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, 'item' girişi için gerekli 'item' argümanı eksik.</yellow>"
warning.config.loot_table.condition.missing_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, koşullardan biri için gerekli 'type' argümanı eksik.</yellow>"
warning.config.loot_table.condition.invalid_type: "<yellow><arg:0> dosyasında sorun bulundu - '<arg:1>', yanlış yapılandırılmış bir ganimet tablosuna sahip, koşullardan biri geçersiz bir koşul türü '<arg:2>' kullanıyor.</yellow>"
warning.config.host.missing_type: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - Host için gerekli 'type' argümanı eksik.</yellow>"
warning.config.host.invalid_type: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - Host türü '<arg:0>' geçersiz. Lütfen https://mo-mi.gitbook.io/xiaomomi-plugins/craftengine/plugin-wiki/craftengine/resource-pack/host sayfasını okuyun.</yellow>"
warning.config.host.external.missing_url: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - Harici host için gerekli 'url' argümanı eksik.</yellow>"
warning.config.host.alist.missing_api_url: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - alist host için gerekli 'api-url' argümanı eksik.</yellow>"
warning.config.host.alist.missing_username: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - alist host için gerekli 'username' argümanı veya 'CE_ALIST_USERNAME' ortam değişkeni eksik.</yellow>"
warning.config.host.alist.missing_password: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - alist host için gerekli 'password' argümanı veya 'CE_ALIST_PASSWORD' ortam değişkeni eksik.</yellow>"
warning.config.host.alist.missing_upload_path: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - alist host için gerekli 'upload-path' argümanı eksik.</yellow>"
warning.config.host.dropbox.missing_app_key: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - dropbox host için gerekli 'app-key' argümanı veya 'CE_DROPBOX_APP_KEY' ortam değişkeni eksik.</yellow>"
warning.config.host.dropbox.missing_app_secret: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - dropbox host için gerekli 'app-secret' argümanı veya 'CE_DROPBOX_APP_SECRET' ortam değişkeni eksik.</yellow>"
warning.config.host.dropbox.missing_refresh_token: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - dropbox host için gerekli 'refresh-token' argümanı veya 'CE_DROPBOX_REFRESH_TOKEN' ortam değişkeni eksik.</yellow>"
warning.config.host.dropbox.missing_upload_path: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - dropbox host için gerekli 'upload-path' argümanı eksik.</yellow>"
warning.config.host.lobfile.missing_api_key: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - lobfile host için gerekli 'api-key' argümanı eksik.</yellow>"
warning.config.host.onedrive.missing_client_id: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - onedrive host için gerekli 'client-id' argümanı veya 'CE_ONEDRIVE_CLIENT_ID' ortam değişkeni eksik.</yellow>"
warning.config.host.onedrive.missing_client_secret: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - onedrive host için gerekli 'client-secret' argümanı veya 'CE_ONEDRIVE_CLIENT_SECRET' ortam değişkeni eksik.</yellow>"
warning.config.host.onedrive.missing_refresh_token: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - onedrive host için gerekli 'refresh-token' argümanı veya 'CE_ONEDRIVE_REFRESH_TOKEN' ortam değişkeni eksik.</yellow>"
warning.config.host.onedrive.missing_upload_path: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - onedrive host için gerekli 'upload-path' argümanı eksik.</yellow>"
warning.config.host.s3.missing_endpoint: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - s3 host için gerekli 'endpoint' argümanı eksik.</yellow>"
warning.config.host.s3.missing_bucket: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - s3 host için gerekli 'bucket' argümanı eksik.</yellow>"
warning.config.host.s3.missing_access_key: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - s3 host için gerekli 'access-key-id' argümanı veya 'CE_S3_ACCESS_KEY_ID' ortam değişkeni eksik.</yellow>"
warning.config.host.s3.missing_secret: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - s3 host için gerekli 'access-key-secret' argümanı veya 'CE_S3_ACCESS_KEY_SECRET' ortam değişkeni eksik.</yellow>"
warning.config.host.s3.missing_upload_path: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - s3 host için gerekli 'upload-path' argümanı eksik.</yellow>"
warning.config.host.self.missing_ip: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - self host için gerekli 'ip' argümanı eksik.</yellow>"
warning.config.host.self.invalid_port: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - self host için geçersiz port '<arg:0>'.</yellow>"
warning.config.host.gitlab.missing_url: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - gitlab host için gerekli 'gitlab-url' argümanı eksik.</yellow>"
warning.config.host.gitlab.missing_token: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - gitlab host için gerekli 'access-token' argümanı eksik.</yellow>"
warning.config.host.gitlab.missing_project: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - gitlab host için gerekli 'project-id' argümanı eksik.</yellow>"
warning.config.host.proxy.missing_host: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - proxy için gerekli 'host' argümanı eksik.</yellow>"
warning.config.host.proxy.missing_port: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - proxy için gerekli 'port' argümanı eksik.</yellow>"
warning.config.host.proxy.missing_scheme: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - proxy için gerekli 'scheme' argümanı eksik.</yellow>"
warning.config.host.proxy.invalid: "<yellow>config.yml dosyasında 'resource-pack.delivery.hosting' bölümünde sorun bulundu - Geçersiz proxy '<arg:0>'.</yellow>"
warning.config.conflict_matcher.missing_type: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - İşleyicilerden biri için gerekli 'type' argümanı eksik.</yellow>"
warning.config.conflict_matcher.invalid_type: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - Terimlerden biri geçersiz bir tür '<arg:0>' kullanıyor.</yellow>"
warning.config.conflict_matcher.exact.missing_path: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'exact' eşleştiricisi için gerekli 'path' argümanı eksik.</yellow>"
warning.config.conflict_matcher.contains.missing_path: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'contains' eşleştiricisi için gerekli 'path' argümanı eksik.</yellow>"
warning.config.conflict_matcher.filename.missing_name: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'filename' eşleştiricisi için gerekli 'path' argümanı eksik.</yellow>"
warning.config.conflict_matcher.pattern.missing_pattern: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'pattern' eşleştiricisi için gerekli 'pattern' argümanı eksik.</yellow>"
warning.config.conflict_matcher.parent_prefix.missing_prefix: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'parent_path_prefix' eşleştiricisi için gerekli 'prefix' argümanı eksik.</yellow>"
warning.config.conflict_matcher.parent_suffix.missing_suffix: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'parent_path_suffix' eşleştiricisi için gerekli 'suffix' argümanı eksik.</yellow>"
warning.config.conflict_matcher.inverted.missing_term: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'inverted' eşleştiricisi için gerekli 'term' argümanı eksik.</yellow>"
warning.config.conflict_matcher.all_of.missing_terms: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'all_of' eşleştiricisi için gerekli 'terms' argümanı eksik.</yellow>"
warning.config.conflict_matcher.any_of.missing_terms: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - 'any_of' eşleştiricisi için gerekli 'terms' argümanı eksik.</yellow>"
warning.config.conflict_resolution.missing_type: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - Çözümlerden biri için gerekli 'type' argümanı eksik.</yellow>"
warning.config.conflict_resolution.invalid_type: "<yellow>config.yml dosyasında 'resource-pack.duplicated-files-handler' bölümünde sorun bulundu - Çözümlerden biri geçersiz bir tür '<arg:0>' kullanıyor.</yellow>"

View File

@@ -1,7 +1,6 @@
# 别动这个
lang-version: "${lang_version}"
# 命令
exception.invalid_syntax: "<red>无效语法. 正确语法: <white><arg:0></white></red>"
exception.invalid_argument: "<red>无效参数. 原因: <white><arg:0></white></red>"
exception.invalid_sender: "<red><arg:0> 不允许执行该命令. 执行者必须是 <arg:1></red>"
@@ -70,6 +69,8 @@ warning.config.type.float: "<yellow>在文件 <arg:0> 发现问题 - 无法加
warning.config.type.double: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为双精度类型 (选项 '<arg:3>')</yellow>"
warning.config.type.quaternionf: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为四元数类型 (选项 '<arg:3>')</yellow>"
warning.config.type.vector3f: "<yellow>在文件 <arg:0> 发现问题 - 无法加载 '<arg:1>': 无法将 '<arg:2>' 转换为三维向量类型 (选项 '<arg:3>')</yellow>"
warning.config.number.missing_type: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 缺少数字类型所需的 'type' 参数</yellow>"
warning.config.number.invalid_type: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 使用了无效的数字类型 '<arg:2>'</yellow>"
warning.config.number.missing_argument: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 缺少数字参数</yellow>"
warning.config.number.invalid_format: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 使用了无效的数字格式 '<arg:2>'</yellow>"
warning.config.number.fixed.missing_value: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 缺少 'constant' 数字类型所需的 'value' 参数</yellow>"
@@ -222,6 +223,8 @@ warning.config.block.behavior.leaves.missing_distance: "<yellow>在文件 <arg:0
warning.config.block.behavior.sapling.missing_stage: "<yellow>在文件 <arg:0> 发现问题 - 方块 '<arg:1>' 的 'sapling_block' 行为缺少必需的 'stage' 属性</yellow>"
warning.config.block.behavior.sapling.missing_feature: "<yellow>在文件 <arg:0> 发现问题 - 方块 '<arg:1>' 的 'sapling_block' 行为缺少必需的 'feature' 参数</yellow>"
warning.config.block.behavior.strippable.missing_stripped: "<yellow>在文件 <arg:0> 发现问题 - 方块 '<arg:1>' 的 'strippable_block' 行为缺少必需的 'stripped' 参数</yellow>"
warning.config.block.event.condition.missing_type: "<yellow>在文件 <arg:0> - 方块 '<arg:1>' 的事件条件缺少 'type' 参数</yellow>"
warning.config.block.event.condition.invalid_type: "<yellow>在文件 <arg:0> - 方块 '<arg:1>' 使用了无效的事件条件类型 '<arg:2>'</yellow>"
warning.config.model.generation.missing_parent: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 的 'generation' 段落缺少必需的 'parent' 参数</yellow>"
warning.config.model.generation.conflict: "<yellow>在文件 <arg:0> 发现问题 - 无法为 '<arg:1>' 生成模型 存在多个配置尝试使用相同路径 '<arg:2>' 生成不同的 JSON 模型</yellow>"
warning.config.model.generation.texture.invalid: "<yellow>在文件 <arg:0> 发现问题 - 配置项 '<arg:1>' 的纹理 '<arg:2>' 路径 '<arg:3>' 包含非法字符 请参考 https://zh.minecraft.wiki/w/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4ID#%E5%90%88%E6%B3%95%E5%AD%97%E7%AC%A6</yellow>"
@@ -247,10 +250,6 @@ warning.config.loot_table.entry.exp.missing_count: "<yellow>在文件 <arg:0>
warning.config.loot_table.entry.item.missing_item: "<yellow>在文件 <arg:0> 发现问题 - '<arg:1>' 的战利品表配置错误 'item' 条目缺少必需的 'item' 参数</yellow>"
warning.config.loot_table.condition.missing_type: "<yellow>在文件 <arg:0> 发现问题 - '<arg:1>' 的战利品表配置错误 某个条件缺少必需的 'type' 参数</yellow>"
warning.config.loot_table.condition.invalid_type: "<yellow>在文件 <arg:0> 发现问题 - '<arg:1>' 的战利品表配置错误 某个条件使用了无效的条件类型 '<arg:2>'</yellow>"
warning.config.loot_table.condition.table_bonus.missing_enchantment: "<yellow>在文件 <arg:0> 发现问题 - '<arg:1>' 的战利品表配置错误 'table_bonus' 条件缺少必需的 'enchantment' 参数</yellow>"
warning.config.loot_table.condition.table_bonus.missing_chances: "<yellow>在文件 <arg:0> 发现问题 - '<arg:1>' 的战利品表配置错误 'table_bonus' 条件缺少必需的 'chances' 参数</yellow>"
warning.config.loot_table.number.missing_type: "<yellow>在文件 <arg:0> 发现问题 - '<arg:1>' 的战利品表配置错误 某个数值缺少必需的 'type' 参数</yellow>"
warning.config.loot_table.number.invalid_type: "<yellow>在文件 <arg:0> 发现问题 - '<arg:1>' 的战利品表配置错误 某个数值使用了无效的数值类型 '<arg:2>'</yellow>"
warning.config.host.missing_type: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 缺少必需的 'type' 参数</yellow>"
warning.config.host.invalid_type: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 无效的托管类型 '' 请参考 https://mo-mi.gitbook.io/xiaomomi-plugins/craftengine/plugin-wiki/craftengine/resource-pack/host</yellow>"
warning.config.host.external.missing_url: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 外部托管缺少必需的 'url' 参数</yellow>"

View File

@@ -157,7 +157,7 @@ public class CropBlockBehavior extends BushBlockBehavior {
if (i > maxAge) {
i = maxAge;
}
FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, immutableBlockState.with(this.ageProperty, i).customBlockState().handle(), UpdateOption.UPDATE_NONE.flags());
FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, immutableBlockState.with(this.ageProperty, i).customBlockState().handle(), UpdateOption.UPDATE_ALL.flags());
if (sendParticles) {
world.spawnParticle(ParticleUtils.getParticle("HAPPY_VILLAGER"), x + 0.5, y + 0.5, z + 0.5, 15, 0.25, 0.25, 0.25);
}

View File

@@ -17,6 +17,7 @@ import net.bytebuddy.implementation.bind.annotation.AllArguments;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import net.bytebuddy.implementation.bind.annotation.This;
import net.bytebuddy.implementation.bytecode.assign.Assigner;
import net.bytebuddy.implementation.bytecode.assign.TypeCasting;
import net.bytebuddy.implementation.bytecode.member.FieldAccess;
import net.bytebuddy.implementation.bytecode.member.MethodReturn;
@@ -77,6 +78,7 @@ public class BukkitInjector {
private static Class<?> clazz$InjectedPalettedContainer;
private static Class<?> clazz$InjectedLevelChunkSection;
private static MethodHandle constructor$InjectedLevelChunkSection;
private static VarHandle varHandle$InjectedPalettedContainer$target;
@@ -104,6 +106,7 @@ public class BukkitInjector {
.name("net.minecraft.world.level.chunk.InjectedPalettedContainer")
.implement(InjectedHolder.Palette.class)
.defineField("target", Reflections.clazz$PalettedContainer, Visibility.PUBLIC)
.defineField("active", boolean.class, Visibility.PUBLIC)
.defineField("cesection", CESection.class, Visibility.PRIVATE)
.defineField("cechunk", CEChunk.class, Visibility.PRIVATE)
.defineField("cepos", SectionPos.class, Visibility.PRIVATE)
@@ -116,6 +119,10 @@ public class BukkitInjector {
.intercept(MethodDelegation.to(GetAndSetInterceptor.INSTANCE))
.method(ElementMatchers.named("target"))
.intercept(FieldAccessor.ofField("target"))
.method(ElementMatchers.named("setTarget"))
.intercept(FieldAccessor.ofField("target").withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC))
.method(ElementMatchers.named("isActive").or(ElementMatchers.named("setActive")))
.intercept(FieldAccessor.ofField("active"))
.method(ElementMatchers.named("ceSection"))
.intercept(FieldAccessor.ofField("cesection"))
.method(ElementMatchers.named("ceChunk"))
@@ -125,13 +132,14 @@ public class BukkitInjector {
.make()
.load(BukkitInjector.class.getClassLoader())
.getLoaded();
varHandle$InjectedPalettedContainer$target = Objects.requireNonNull(ReflectionUtils.findVarHandle(clazz$InjectedPalettedContainer, "target", Reflections.clazz$PalettedContainer));
//varHandle$InjectedPalettedContainer$target = Objects.requireNonNull(ReflectionUtils.findVarHandle(clazz$InjectedPalettedContainer, "target", Reflections.clazz$PalettedContainer));
// Level Chunk Section
clazz$InjectedLevelChunkSection = byteBuddy
.subclass(Reflections.clazz$LevelChunkSection)
.subclass(Reflections.clazz$LevelChunkSection, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING)
.name("net.minecraft.world.level.chunk.InjectedLevelChunkSection")
.implement(InjectedHolder.Section.class)
.defineField("active", boolean.class, Visibility.PUBLIC)
.defineField("cesection", CESection.class, Visibility.PRIVATE)
.defineField("cechunk", CEChunk.class, Visibility.PRIVATE)
.defineField("cepos", SectionPos.class, Visibility.PRIVATE)
@@ -143,10 +151,16 @@ public class BukkitInjector {
.intercept(FieldAccessor.ofField("cechunk"))
.method(ElementMatchers.named("cePos"))
.intercept(FieldAccessor.ofField("cepos"))
.method(ElementMatchers.named("isActive").or(ElementMatchers.named("setActive")))
.intercept(FieldAccessor.ofField("active"))
.make()
.load(BukkitInjector.class.getClassLoader())
.getLoaded();
constructor$InjectedLevelChunkSection = MethodHandles.publicLookup().in(clazz$InjectedLevelChunkSection)
.findConstructor(clazz$InjectedLevelChunkSection, MethodType.methodType(void.class, Reflections.clazz$PalettedContainer, Reflections.clazz$PalettedContainer))
.asType(MethodType.methodType(Reflections.clazz$LevelChunkSection, Reflections.clazz$PalettedContainer, Reflections.clazz$PalettedContainer));
// State Predicate
DynamicType.Unloaded<?> alwaysTrue = byteBuddy
.subclass(Reflections.clazz$StatePredicate)
@@ -408,32 +422,50 @@ public class BukkitInjector {
try {
if (Config.injectionTarget()) {
Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection);
if (!(container instanceof InjectedHolder.Palette)) {
if (!(container instanceof InjectedHolder.Palette holder)) {
InjectedHolder.Palette injectedObject;
if (Config.fastInjection()) {
injectedObject = FastNMS.INSTANCE.createInjectedPalettedContainerHolder(container);
} else {
injectedObject = (InjectedHolder.Palette) Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer);
varHandle$InjectedPalettedContainer$target.set(injectedObject, container);
injectedObject.setTarget(container);
//varHandle$InjectedPalettedContainer$target.set(injectedObject, container);
}
injectedObject.ceChunk(chunk);
injectedObject.ceSection(ceSection);
injectedObject.cePos(pos);
injectedObject.setActive(true);
Reflections.varHandle$PalettedContainer$data.setVolatile(injectedObject, Reflections.varHandle$PalettedContainer$data.get(container));
Reflections.field$LevelChunkSection$states.set(targetSection, injectedObject);
} else {
holder.ceChunk(chunk);
holder.ceSection(ceSection);
holder.cePos(pos);
holder.setActive(true);
}
} else {
InjectedHolder.Section injectedObject;
if (true) {
injectedObject = FastNMS.INSTANCE.createInjectedLevelChunkSectionHolder(targetSection);
if (!(targetSection instanceof InjectedHolder.Section holder)) {
InjectedHolder.Section injectedObject;
if (Config.fastInjection()) {
injectedObject = FastNMS.INSTANCE.createInjectedLevelChunkSectionHolder(targetSection);
} else {
injectedObject = (InjectedHolder.Section) constructor$InjectedLevelChunkSection.invoke(
FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection), FastNMS.INSTANCE.field$LevelChunkSection$biomes(targetSection));
}
injectedObject.ceChunk(chunk);
injectedObject.ceSection(ceSection);
injectedObject.cePos(pos);
injectedObject.setActive(true);
callback.accept(injectedObject);
} else {
holder.ceChunk(chunk);
holder.ceSection(ceSection);
holder.cePos(pos);
holder.setActive(true);
}
injectedObject.ceChunk(chunk);
injectedObject.ceSection(ceSection);
injectedObject.cePos(pos);
callback.accept(injectedObject);
}
} catch (Exception e) {
CraftEngine.instance().logger().severe("Failed to inject chunk section", e);
} catch (Throwable e) {
CraftEngine.instance().logger().severe("Failed to inject chunk section " + pos, e);
}
}
@@ -450,15 +482,17 @@ public class BukkitInjector {
if (Config.injectionTarget()) {
Object states = FastNMS.INSTANCE.field$LevelChunkSection$states(section);
if (states instanceof InjectedHolder.Palette holder) {
try {
Reflections.field$LevelChunkSection$states.set(section, holder.target());
} catch (ReflectiveOperationException e) {
CraftEngine.instance().logger().severe("Failed to uninject palette", e);
}
holder.setActive(false);
// try {
// Reflections.field$LevelChunkSection$states.set(section, holder.target());
// } catch (ReflectiveOperationException e) {
// CraftEngine.instance().logger().severe("Failed to uninject palette", e);
// }
}
} else {
if (section instanceof InjectedHolder.Section holder) {
return FastNMS.INSTANCE.constructor$LevelChunkSection(holder);
holder.setActive(false);
//return FastNMS.INSTANCE.constructor$LevelChunkSection(holder);
}
}
return section;
@@ -730,7 +764,9 @@ public class BukkitInjector {
int z = (int) args[2];
Object newState = args[3];
Object previousState = superMethod.call();
compareAndUpdateBlockState(x, y, z, newState, previousState, holder);
if (holder.isActive()) {
compareAndUpdateBlockState(x, y, z, newState, previousState, holder);
}
return previousState;
}
}
@@ -747,7 +783,9 @@ public class BukkitInjector {
int z = (int) args[2];
Object newState = args[3];
Object previousState = FastNMS.INSTANCE.method$PalettedContainer$getAndSet(targetStates, x, y, z, newState);
compareAndUpdateBlockState(x, y, z, newState, previousState, holder);
if (holder.isActive()) {
compareAndUpdateBlockState(x, y, z, newState, previousState, holder);
}
return previousState;
}
}

View File

@@ -59,6 +59,7 @@ import org.bukkit.inventory.PlayerInventory;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.util.RayTraceResult;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.InvocationTargetException;
import java.nio.charset.StandardCharsets;
@@ -1484,7 +1485,7 @@ public class PacketConsumers {
if (state == null) return;
Key itemId = state.settings().itemId();
if (itemId == null) return;
pickItem(player, itemId);
pickItem(player, itemId, pos, null);
}
// 1.21.4+
@@ -1523,18 +1524,24 @@ public class PacketConsumers {
private static void handlePickItemFromEntityOnMainThread(Player player, LoadedFurniture furniture) throws Exception {
Key itemId = furniture.config().settings().itemId();
if (itemId == null) return;
pickItem(player, itemId);
pickItem(player, itemId, null, FastNMS.INSTANCE.method$CraftEntity$getHandle(furniture.baseEntity()));
}
private static void pickItem(Player player, Key itemId) throws IllegalAccessException, InvocationTargetException {
private static void pickItem(Player player, Key itemId, @Nullable Object blockPos, @Nullable Object entity) throws IllegalAccessException, InvocationTargetException {
ItemStack itemStack = BukkitCraftEngine.instance().itemManager().buildCustomItemStack(itemId, BukkitCraftEngine.instance().adapt(player));
if (itemStack == null) {
CraftEngine.instance().logger().warn("Item: " + itemId + " is not a valid item");
return;
}
assert Reflections.method$ServerGamePacketListenerImpl$tryPickItem != null;
Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke(
Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack));
if (VersionHelper.isOrAbove1_21_5()) {
Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke(
Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)),
FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack), blockPos, entity, true);
} else {
Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke(
Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack));
}
}
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> ADD_ENTITY_BYTEBUFFER = (user, event) -> {

View File

@@ -4967,10 +4967,10 @@ public class Reflections {
public static final Method method$BonemealableBlock$isValidBonemealTarget = requireNonNull(
VersionHelper.isOrAbove1_20_2() ?
ReflectionUtils.getMethod(
ReflectionUtils.getInstanceMethod(
clazz$BonemealableBlock, boolean.class, clazz$LevelReader, clazz$BlockPos, clazz$BlockState
) :
ReflectionUtils.getMethod(
ReflectionUtils.getInstanceMethod(
clazz$BonemealableBlock, boolean.class, clazz$LevelReader, clazz$BlockPos, clazz$BlockState, boolean.class
)
);
@@ -5034,6 +5034,10 @@ public class Reflections {
);
public static final Method method$ServerGamePacketListenerImpl$tryPickItem =
VersionHelper.isOrAbove1_21_5() ?
ReflectionUtils.getDeclaredMethod(
clazz$ServerGamePacketListenerImpl, void.class, clazz$ItemStack, clazz$BlockPos, clazz$Entity, boolean.class
) :
ReflectionUtils.getDeclaredMethod(
clazz$ServerGamePacketListenerImpl, void.class, clazz$ItemStack
);

View File

@@ -266,27 +266,24 @@ public class BukkitWorldManager implements WorldManager, Listener {
if (ceChunk != null) {
if (ceChunk.dirty()) {
try {
world.worldDataStorage().writeChunkAt(pos, ceChunk, false);
this.plugin.debug(() -> "[Dirty Chunk]" + pos + " unloaded");
world.worldDataStorage().writeChunkAt(pos, ceChunk);
ceChunk.setDirty(false);
} catch (IOException e) {
this.plugin.logger().warn("Failed to write chunk tag at " + chunk.getX() + " " + chunk.getZ(), e);
}
}
if (Config.restoreVanillaBlocks()) {
boolean unsaved = false;
CESection[] ceSections = ceChunk.sections();
Object worldServer = FastNMS.INSTANCE.field$CraftChunk$worldServer(chunk);
Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer);
Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, chunk.getX(), chunk.getZ());
Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk);
for (int i = 0; i < ceSections.length; i++) {
CESection ceSection = ceSections[i];
Object section = sections[i];
Object uninjectedSection = BukkitInjector.uninjectLevelChunkSection(section);
if (uninjectedSection != section) {
sections[i] = uninjectedSection;
section = uninjectedSection;
}
boolean unsaved = false;
CESection[] ceSections = ceChunk.sections();
Object worldServer = FastNMS.INSTANCE.field$CraftChunk$worldServer(chunk);
Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer);
Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, chunk.getX(), chunk.getZ());
Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk);
for (int i = 0; i < ceSections.length; i++) {
CESection ceSection = ceSections[i];
Object section = sections[i];
BukkitInjector.uninjectLevelChunkSection(section);
if (Config.restoreVanillaBlocks()) {
if (!ceSection.statesContainer().isEmpty()) {
for (int x = 0; x < 16; x++) {
for (int z = 0; z < 16; z++) {
@@ -301,9 +298,9 @@ public class BukkitWorldManager implements WorldManager, Listener {
}
}
}
if (unsaved && !FastNMS.INSTANCE.method$LevelChunk$isUnsaved(levelChunk)) {
FastNMS.INSTANCE.method$LevelChunk$markUnsaved(levelChunk);
}
}
if (unsaved && !FastNMS.INSTANCE.method$LevelChunk$isUnsaved(levelChunk)) {
FastNMS.INSTANCE.method$LevelChunk$markUnsaved(levelChunk);
}
ceChunk.unload();
}

View File

@@ -14,6 +14,10 @@ public class UpdateOption {
return flags;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private int flags;

View File

@@ -101,7 +101,7 @@ public class Config {
protected boolean chunk_system$restore_vanilla_blocks_on_chunk_unload;
protected boolean chunk_system$restore_custom_blocks_on_chunk_load;
protected boolean chunk_system$sync_custom_blocks_on_chunk_load;
protected int chunk_system$delay_serialization;
protected boolean chunk_system$cache_system;
protected boolean chunk_system$injection$use_fast_method;
protected boolean chunk_system$injection$target;
@@ -274,7 +274,7 @@ public class Config {
chunk_system$restore_vanilla_blocks_on_chunk_unload = config.getBoolean("chunk-system.restore-vanilla-blocks-on-chunk-unload", true);
chunk_system$restore_custom_blocks_on_chunk_load = config.getBoolean("chunk-system.restore-custom-blocks-on-chunk-load", true);
chunk_system$sync_custom_blocks_on_chunk_load = config.getBoolean("chunk-system.sync-custom-blocks-on-chunk-load", false);
chunk_system$delay_serialization = config.getInt("chunk-system.delay-serialization", 20);
chunk_system$cache_system = config.getBoolean("chunk-system.cache-system", true);
chunk_system$injection$use_fast_method = config.getBoolean("chunk-system.injection.use-fast-method", false);
if (firstTime) {
chunk_system$injection$target = config.getEnum("chunk-system.injection.target", InjectionTarget.class, InjectionTarget.PALETTE) == InjectionTarget.PALETTE;
@@ -699,8 +699,8 @@ public class Config {
return instance.furniture$collision_entity_type;
}
public static int delaySerialization() {
return instance.chunk_system$delay_serialization;
public static boolean enableChunkCache() {
return instance.chunk_system$cache_system;
}
public static boolean fastInjection() {

View File

@@ -43,11 +43,11 @@ public class NumberProviders {
}
public static NumberProvider fromMap(Map<String, Object> map) {
String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.number.missing_type");
String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.number.missing_type");
Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE);
Factory<NumberProvider> factory = BuiltInRegistries.NUMBER_PROVIDER_FACTORY.getValue(key);
if (factory == null) {
throw new LocalizedResourceConfigException("warning.config.loot_table.number.invalid_type", type);
throw new LocalizedResourceConfigException("warning.config.number.invalid_type", type);
}
return factory.create(map);
}

View File

@@ -246,6 +246,27 @@ public class ReflectionUtils {
return null;
}
@Nullable
public static Method getInstanceMethod(final Class<?> clazz, Class<?> returnType, final Class<?>... parameterTypes) {
outer:
for (Method method : clazz.getMethods()) {
if (method.getParameterCount() != parameterTypes.length) {
continue;
}
if (Modifier.isStatic(method.getModifiers())) {
continue;
}
Class<?>[] types = method.getParameterTypes();
for (int i = 0; i < types.length; i++) {
if (types[i] != parameterTypes[i]) {
continue outer;
}
}
if (returnType.isAssignableFrom(method.getReturnType())) return method;
}
return null;
}
@Nullable
public static Method getDeclaredMethod(final Class<?> clazz, Class<?> returnType, final String[] possibleMethodNames, final Class<?>... parameterTypes) {
outer:

View File

@@ -49,7 +49,7 @@ public abstract class CEWorld {
for (Map.Entry<Long, CEChunk> entry : this.loadedChunkMap.entrySet()) {
CEChunk chunk = entry.getValue();
if (chunk.dirty()) {
worldDataStorage.writeChunkAt(new ChunkPos(entry.getKey()), chunk, true);
worldDataStorage.writeChunkAt(new ChunkPos(entry.getKey()), chunk);
chunk.setDirty(false);
}
}

View File

@@ -68,4 +68,17 @@ public class ChunkPos {
public static long asLong(int chunkX, int chunkZ) {
return (long) chunkX & 4294967295L | ((long) chunkZ & 4294967295L) << 32;
}
@Override
public final boolean equals(Object o) {
if (!(o instanceof ChunkPos chunkPos)) return false;
return x == chunkPos.x && z == chunkPos.z;
}
@Override
public int hashCode() {
int result = x;
result = 31 * result + z;
return result;
}
}

View File

@@ -4,6 +4,10 @@ import net.momirealms.craftengine.core.world.SectionPos;
public interface InjectedHolder {
boolean isActive();
void setActive(boolean active);
CESection ceSection();
void ceSection(CESection section);
@@ -22,5 +26,7 @@ public interface InjectedHolder {
interface Palette extends InjectedHolder {
Object target();
void setTarget(Object target);
}
}

View File

@@ -0,0 +1,53 @@
package net.momirealms.craftengine.core.world.chunk.storage;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.Scheduler;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.world.CEWorld;
import net.momirealms.craftengine.core.world.ChunkPos;
import net.momirealms.craftengine.core.world.chunk.CEChunk;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class CachedStorage<T extends WorldDataStorage> implements WorldDataStorage {
private final T storage;
private final Cache<ChunkPos, CEChunk> chunkCache;
public CachedStorage(T storage) {
this.storage = storage;
this.chunkCache = Caffeine.newBuilder()
.executor(CraftEngine.instance().scheduler().async())
.scheduler(Scheduler.systemScheduler())
.expireAfterAccess(30, TimeUnit.SECONDS)
.build();
}
@Override
public @NotNull CEChunk readChunkAt(@NotNull CEWorld world, @NotNull ChunkPos pos) throws IOException {
CEChunk chunk = this.chunkCache.getIfPresent(pos);
if (chunk != null) {
return chunk;
}
chunk = this.storage.readChunkAt(world, pos);
this.chunkCache.put(pos, chunk);
return chunk;
}
@Override
public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) throws IOException {
this.storage.writeChunkAt(pos, chunk);
}
@Override
public void close() throws IOException {
this.storage.close();
}
@Override
public void flush() throws IOException {
this.storage.flush();
}
}

View File

@@ -147,7 +147,7 @@ public class DefaultRegionFileStorage implements WorldDataStorage {
}
@Override
public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) throws IOException {
public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) throws IOException {
CompoundTag nbt = DefaultChunkSerializer.serialize(chunk);
writeChunkTagAt(pos, nbt);
}

View File

@@ -9,8 +9,8 @@ public class DefaultStorageAdaptor implements StorageAdaptor {
@Override
public @NotNull WorldDataStorage adapt(@NotNull World world) {
if (Config.delaySerialization() > 0) {
return new DelayedDefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY), Config.delaySerialization());
if (Config.enableChunkCache()) {
return new CachedStorage<>(new DefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY)));
} else {
return new DefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY));
}

View File

@@ -1,85 +0,0 @@
package net.momirealms.craftengine.core.world.chunk.storage;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.RemovalCause;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.world.CEWorld;
import net.momirealms.craftengine.core.world.ChunkPos;
import net.momirealms.craftengine.core.world.chunk.CEChunk;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.nio.channels.ClosedChannelException;
import java.nio.file.Path;
import java.util.concurrent.TimeUnit;
public class DelayedDefaultRegionFileStorage extends DefaultRegionFileStorage {
private final Cache<ChunkPos, CEChunk> chunkCache;
private boolean isClosed;
public DelayedDefaultRegionFileStorage(Path directory, int time) {
super(directory);
this.chunkCache = Caffeine.newBuilder()
.expireAfterWrite(time, TimeUnit.SECONDS)
.removalListener((ChunkPos key, CEChunk value, RemovalCause cause) -> {
if (key == null || value == null || isClosed) {
return;
}
if (cause == RemovalCause.EXPIRED || cause == RemovalCause.SIZE) {
try {
super.writeChunkAt(key, value, true);
} catch (ClosedChannelException e) {
if (this.isClosed) {
return;
}
CraftEngine.instance().logger().warn("Failed to write chunk at " + key, e);
} catch (IOException e) {
CraftEngine.instance().logger().warn("Failed to write chunk at " + key, e);
}
}
})
.build();
}
@Override
public @NotNull CEChunk readChunkAt(@NotNull CEWorld world, @NotNull ChunkPos pos) throws IOException {
CEChunk chunk = this.chunkCache.asMap().remove(pos);
if (chunk != null) {
return chunk;
}
return super.readChunkAt(world, pos);
}
@Override
public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) throws IOException {
if (immediately) {
super.writeChunkAt(pos, chunk, true);
return;
}
if (chunk.isEmpty()) {
super.writeChunkTagAt(pos, null);
return;
}
this.chunkCache.put(pos, chunk);
}
@Override
public synchronized void close() throws IOException {
this.isClosed = true;
this.saveCache();
this.chunkCache.cleanUp();
super.close();
}
private void saveCache() {
try {
for (var chunk : this.chunkCache.asMap().entrySet()) {
super.writeChunkAt(chunk.getKey(), chunk.getValue(), true);
}
} catch (IOException e) {
CraftEngine.instance().logger().warn("Failed to save chunks", e);
}
this.chunkCache.invalidateAll();
}
}

View File

@@ -309,9 +309,6 @@ public class RegionFile implements AutoCloseable {
}
public void clear(ChunkPos pos) throws IOException {
if (!this.fileChannel.isOpen()) {
throw new ClosedChannelException();
}
int chunkLocation = RegionFile.getChunkLocation(pos);
int sectorInfo = this.sectorInfo.get(chunkLocation);
if (sectorInfo != INFO_NOT_PRESENT) {
@@ -325,9 +322,6 @@ public class RegionFile implements AutoCloseable {
@SuppressWarnings("ResultOfMethodCallIgnored")
protected synchronized void write(ChunkPos pos, ByteBuffer buf) throws IOException {
if (!this.fileChannel.isOpen()) {
throw new ClosedChannelException();
}
// get old offset info
int offsetIndex = RegionFile.getChunkLocation(pos);
int previousSectorInfo = this.sectorInfo.get(offsetIndex);

View File

@@ -12,7 +12,7 @@ public interface WorldDataStorage {
@NotNull
CEChunk readChunkAt(@NotNull CEWorld world, @NotNull ChunkPos pos) throws IOException;
void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk, boolean immediately) throws IOException;
void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) throws IOException;
void flush() throws IOException;

View File

@@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G
# Project settings
# Rule: [major update].[feature update].[bug fix]
project_version=0.0.53-beta.6
project_version=0.0.53
config_version=32
lang_version=12
project_group=net.momirealms
@@ -50,7 +50,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3
snake_yaml_version=2.4
anti_grief_version=0.15
nms_helper_version=0.65.12
nms_helper_version=0.65.15
evalex_version=3.5.0
reactive_streams_version=1.0.4
amazon_awssdk_version=2.31.23