diff --git a/patches/net/minecraft/FileUtil.java.patch b/patches/net/minecraft/FileUtil.java.patch index a562efd52c..ce5a608872 100644 --- a/patches/net/minecraft/FileUtil.java.patch +++ b/patches/net/minecraft/FileUtil.java.patch @@ -14,20 +14,20 @@ + private static final Pattern RESERVED_WINDOWS_FILENAMES_NEOFORGE = Pattern.compile(".*\\.|(?:CON|PRN|AUX|NUL|CLOCK\\$|CONIN\\$|CONOUT\\$|(?:COM|LPT)[¹²³0-9])(?:\\..*)?", 2); // Neo: Fix MC-268617 - See PR #767 private static final Pattern STRICT_PATH_SEGMENT_CHECK = Pattern.compile("[-._a-z0-9]+"); - public static String sanitizeName(String p_352262_) { -@@ -31,7 +_,7 @@ - public static String findAvailableName(Path p_133731_, String p_133732_, String p_133733_) throws IOException { - p_133732_ = sanitizeName(p_133732_); +@@ -27,7 +_,7 @@ + } + + p_133732_ = p_133732_.replaceAll("[./\"]", "_"); - if (RESERVED_WINDOWS_FILENAMES.matcher(p_133732_).matches()) { + if ((net.neoforged.neoforge.common.NeoForgeMod.getProperFilenameValidation() ? RESERVED_WINDOWS_FILENAMES_NEOFORGE : RESERVED_WINDOWS_FILENAMES).matcher(p_133732_).matches()) { p_133732_ = "_" + p_133732_ + "_"; } -@@ -78,7 +_,7 @@ +@@ -74,7 +_,7 @@ public static boolean isPathPortable(Path p_133735_) { - for (Path path : p_133735_) { + for(Path path : p_133735_) { - if (RESERVED_WINDOWS_FILENAMES.matcher(path.toString()).matches()) { + if ((net.neoforged.neoforge.common.NeoForgeMod.getProperFilenameValidation() ? RESERVED_WINDOWS_FILENAMES_NEOFORGE : RESERVED_WINDOWS_FILENAMES).matcher(path.toString()).matches()) { return false; diff --git a/patches/net/minecraft/client/particle/ParticleEngine.java.patch b/patches/net/minecraft/client/particle/ParticleEngine.java.patch index ffbb1d2839..a6a863a67a 100644 --- a/patches/net/minecraft/client/particle/ParticleEngine.java.patch +++ b/patches/net/minecraft/client/particle/ParticleEngine.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/particle/ParticleEngine.java +++ b/net/minecraft/client/particle/ParticleEngine.java -@@ -81,11 +_,11 @@ +@@ -79,11 +_,11 @@ ParticleRenderType.CUSTOM ); protected ClientLevel level; @@ -14,7 +14,7 @@ private final Queue particlesToAdd = Queues.newArrayDeque(); private final Map spriteSets = Maps.newHashMap(); private final TextureAtlas textureAtlas; -@@ -216,10 +_,14 @@ +@@ -214,10 +_,14 @@ this.register(ParticleTypes.OMINOUS_SPAWNING, FlyStraightTowardsParticle.OminousSpawnProvider::new); } @@ -30,7 +30,7 @@ public void register(ParticleType p_273423_, ParticleProvider.Sprite p_273134_) { this.register( p_273423_, -@@ -236,10 +_,12 @@ +@@ -234,10 +_,12 @@ ); } @@ -44,7 +44,7 @@ } @Override -@@ -365,7 +_,7 @@ +@@ -363,7 +_,7 @@ private Particle makeParticle( T p_107396_, double p_107397_, double p_107398_, double p_107399_, double p_107400_, double p_107401_, double p_107402_ ) { @@ -53,16 +53,17 @@ return particleprovider == null ? null : particleprovider.createParticle(p_107396_, this.level, p_107397_, p_107398_, p_107399_, p_107400_, p_107401_, p_107402_); -@@ -441,11 +_,20 @@ +@@ -439,11 +_,21 @@ } } ++ /** @deprecated Neo: use {@link #render(LightTexture, Camera, float, net.minecraft.client.renderer.culling.Frustum)} with Frustum as additional parameter */ + @Deprecated public void render(LightTexture p_107339_, Camera p_107340_, float p_107341_) { -+ render(p_107339_, p_107340_, p_107341_, null, type -> true); ++ render(p_107339_, p_107340_, p_107341_, null); + } + -+ public void render(LightTexture p_107339_, Camera p_107340_, float p_107341_, @Nullable net.minecraft.client.renderer.culling.Frustum frustum, java.util.function.Predicate renderTypePredicate) { ++ public void render(LightTexture p_107339_, Camera p_107340_, float p_107341_, @Nullable net.minecraft.client.renderer.culling.Frustum frustum) { p_107339_.turnOnLightLayer(); RenderSystem.enableDepthTest(); + //TODO porting: is this even needed with the particle render order fix??? @@ -70,20 +71,20 @@ + RenderSystem.activeTexture(org.lwjgl.opengl.GL13.GL_TEXTURE0); - for (ParticleRenderType particlerendertype : RENDER_ORDER) { -+ for (ParticleRenderType particlerendertype : this.particles.keySet()) { // Neo: allow custom IParticleRenderType's -+ if (particlerendertype == ParticleRenderType.NO_RENDER || !renderTypePredicate.test(particlerendertype)) continue; - Queue queue = this.particles.get(particlerendertype); - if (queue != null && !queue.isEmpty()) { ++ for(ParticleRenderType particlerendertype : this.particles.keySet()) { // Forge: allow custom IParticleRenderType's ++ if (particlerendertype == ParticleRenderType.NO_RENDER) continue; + Iterable iterable = this.particles.get(particlerendertype); + if (iterable != null) { RenderSystem.setShader(GameRenderer::getParticleShader); -@@ -453,6 +_,7 @@ - BufferBuilder bufferbuilder = particlerendertype.begin(tesselator, this.textureManager); - if (bufferbuilder != null) { - for (Particle particle : queue) { -+ if (frustum != null && !frustum.isVisible(particle.getRenderBoundingBox(p_107341_))) continue; - try { - particle.render(bufferbuilder, p_107340_, p_107341_); - } catch (Throwable throwable) { -@@ -484,7 +_,7 @@ +@@ -452,6 +_,7 @@ + particlerendertype.begin(bufferbuilder, this.textureManager); + + for (Particle particle : iterable) { ++ if (frustum != null && !frustum.isVisible(particle.getRenderBoundingBox(p_107341_))) continue; + try { + particle.render(bufferbuilder, p_107340_, p_107341_); + } catch (Throwable throwable) { +@@ -479,7 +_,7 @@ } public void destroy(BlockPos p_107356_, BlockState p_107357_) { @@ -92,7 +93,7 @@ VoxelShape voxelshape = p_107357_.getShape(this.level, p_107356_); double d0 = 0.25; voxelshape.forAllBoxes( -@@ -516,7 +_,7 @@ +@@ -511,7 +_,7 @@ d6 - 0.5, p_107357_, p_107356_ @@ -101,7 +102,7 @@ ); } } -@@ -561,12 +_,28 @@ +@@ -556,12 +_,28 @@ d0 = (double)i + aabb.maxX + 0.1F; } diff --git a/patches/net/minecraft/client/particle/SingleQuadParticle.java.patch b/patches/net/minecraft/client/particle/SingleQuadParticle.java.patch index 8d33bc3e60..57275ec8b7 100644 --- a/patches/net/minecraft/client/particle/SingleQuadParticle.java.patch +++ b/patches/net/minecraft/client/particle/SingleQuadParticle.java.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/client/particle/SingleQuadParticle.java +++ b/net/minecraft/client/particle/SingleQuadParticle.java -@@ -80,6 +_,12 @@ - .setLight(p_345037_); +@@ -81,6 +_,12 @@ + .endVertex(); } + @Override diff --git a/patches/net/minecraft/client/renderer/GameRenderer.java.patch b/patches/net/minecraft/client/renderer/GameRenderer.java.patch index 11bab7256f..17aa1a7f5a 100644 --- a/patches/net/minecraft/client/renderer/GameRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/GameRenderer.java.patch @@ -1,15 +1,15 @@ --- a/net/minecraft/client/renderer/GameRenderer.java +++ b/net/minecraft/client/renderer/GameRenderer.java -@@ -311,6 +_,8 @@ - this.loadEffect(ResourceLocation.withDefaultNamespace("shaders/post/spider.json")); +@@ -310,6 +_,8 @@ + this.loadEffect(new ResourceLocation("shaders/post/spider.json")); } else if (p_109107_ instanceof EnderMan) { - this.loadEffect(ResourceLocation.withDefaultNamespace("shaders/post/invert.json")); + this.loadEffect(new ResourceLocation("shaders/post/invert.json")); + } else { + net.neoforged.neoforge.client.ClientHooks.loadEntityShader(p_109107_, this); } } -@@ -714,6 +_,7 @@ +@@ -735,6 +_,7 @@ ) ); this.loadBlurEffect(p_250719_); @@ -17,7 +17,7 @@ } catch (IOException ioexception) { list1.forEach(p_172729_ -> p_172729_.getFirst().close()); throw new RuntimeException("could not reload shaders", ioexception); -@@ -872,7 +_,7 @@ +@@ -893,7 +_,7 @@ d0 *= Mth.lerp(this.minecraft.options.fovEffectScale().get(), 1.0, 0.85714287F); } @@ -26,7 +26,7 @@ } } -@@ -888,6 +_,10 @@ +@@ -909,6 +_,10 @@ return; } @@ -37,7 +37,7 @@ f2 /= (float)livingentity.hurtDuration; f2 = Mth.sin(f2 * f2 * f2 * f2 * (float) Math.PI); float f3 = livingentity.getHurtDir(); -@@ -1036,12 +_,12 @@ +@@ -1058,12 +_,12 @@ (float)((double)window.getHeight() / window.getGuiScale()), 0.0F, 1000.0F, @@ -52,29 +52,29 @@ RenderSystem.applyModelViewMatrix(); Lighting.setupFor3DItems(); GuiGraphics guigraphics = new GuiGraphics(this.minecraft, this.renderBuffers.bufferSource()); -@@ -1079,7 +_,7 @@ +@@ -1097,7 +_,7 @@ } } else if (flag && this.minecraft.screen != null) { try { -- this.minecraft.screen.renderWithTooltip(guigraphics, i, j, p_348648_.getRealtimeDeltaTicks()); -+ net.neoforged.neoforge.client.ClientHooks.drawScreen(this.minecraft.screen, guigraphics, i, j, this.minecraft.getTimer().getRealtimeDeltaTicks()); +- this.minecraft.screen.renderWithTooltip(guigraphics, i, j, this.minecraft.getDeltaFrameTime()); ++ net.neoforged.neoforge.client.ClientHooks.drawScreen(this.minecraft.screen, guigraphics, i, j, this.minecraft.getDeltaFrameTime()); } catch (Throwable throwable1) { CrashReport crashreport1 = CrashReport.forThrowable(throwable1, "Rendering screen"); CrashReportCategory crashreportcategory1 = crashreport1.addCategory("Screen render details"); -@@ -1253,12 +_,18 @@ +@@ -1273,12 +_,18 @@ } this.resetProjectionMatrix(matrix4f); -+ net.neoforged.neoforge.client.event.ViewportEvent.ComputeCameraAngles cameraSetup = net.neoforged.neoforge.client.ClientHooks.onCameraSetup(this, camera, f); ++ net.neoforged.neoforge.client.event.ViewportEvent.ComputeCameraAngles cameraSetup = net.neoforged.neoforge.client.ClientHooks.onCameraSetup(this, camera, p_109090_); + camera.setAnglesInternal(cameraSetup.getYaw(), cameraSetup.getPitch()); - Quaternionf quaternionf = camera.rotation().conjugate(new Quaternionf()); - Matrix4f matrix4f1 = new Matrix4f().rotation(quaternionf); + Matrix4f matrix4f1 = new Matrix4f() + .rotationXYZ(camera.getXRot() * (float) (Math.PI / 180.0), camera.getYRot() * (float) (Math.PI / 180.0) + (float) Math.PI, 0.0F); + // Neo: Use matrix multiplication so roll is stacked on top of vanilla XY rotations + matrix4f1 = new Matrix4f().rotationZ(cameraSetup.getRoll() * (float) (Math.PI / 180.0)).mul(matrix4f1); this.minecraft .levelRenderer .prepareCullFrustum(camera.getPosition(), matrix4f1, this.getProjectionMatrix(Math.max(d0, (double)this.minecraft.options.fov().get().intValue()))); - this.minecraft.levelRenderer.renderLevel(p_348589_, flag, camera, this, this.lightTexture, matrix4f1, matrix4f); + this.minecraft.levelRenderer.renderLevel(p_109090_, p_109091_, flag, camera, this, this.lightTexture, matrix4f1, matrix4f); + this.minecraft.getProfiler().popPush("neoforge_render_last"); + net.neoforged.neoforge.client.ClientHooks.dispatchRenderStage(net.neoforged.neoforge.client.event.RenderLevelStageEvent.Stage.AFTER_LEVEL, this.minecraft.levelRenderer, null, matrix4f1, matrix4f, this.minecraft.levelRenderer.getTicks(), camera, this.minecraft.levelRenderer.getFrustum()); this.minecraft.getProfiler().popPush("hand"); diff --git a/patches/net/minecraft/server/level/ChunkMap.java.patch b/patches/net/minecraft/server/level/ChunkMap.java.patch index 947e62b315..1744917df1 100644 --- a/patches/net/minecraft/server/level/ChunkMap.java.patch +++ b/patches/net/minecraft/server/level/ChunkMap.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ChunkMap.java +++ b/net/minecraft/server/level/ChunkMap.java -@@ -395,6 +_,7 @@ +@@ -422,6 +_,7 @@ this.modified = true; } @@ -8,27 +8,50 @@ return p_140179_; } } -@@ -508,8 +_,11 @@ +@@ -533,8 +_,11 @@ + this.scheduleUnload(p_140182_, p_140183_); } else { - ChunkAccess chunkaccess = p_140183_.getLatestChunk(); - if (this.pendingUnloads.remove(p_140182_, p_140183_) && chunkaccess != null) { -+ net.neoforged.neoforge.common.CommonHooks.onChunkUnload(this.poiManager, chunkaccess); // Neo: Must be called for all chunk unloading. Not just LevelChunks. -+ this.chunkTypeCache.remove(chunkaccess.getPos().toLong()); // Neo: Prevent chunk type cache from permanently retaining data for unloaded chunks - if (chunkaccess instanceof LevelChunk levelchunk) { - levelchunk.setLoaded(false); -+ net.neoforged.neoforge.common.NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.level.ChunkEvent.Unload(chunkaccess)); + if (this.pendingUnloads.remove(p_140182_, p_140183_) && p_203002_ != null) { ++ net.neoforged.neoforge.common.CommonHooks.onChunkUnload(this.poiManager, p_203002_); // Neo: Must be called for all chunk unloading. Not just LevelChunks. ++ this.chunkTypeCache.remove(p_203002_.getPos().toLong()); // Neo: Prevent chunk type cache from permanently retaining data for unloaded chunks + if (p_203002_ instanceof LevelChunk) { + ((LevelChunk)p_203002_).setLoaded(false); ++ net.neoforged.neoforge.common.NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.level.ChunkEvent.Unload(p_203002_)); } - this.save(chunkaccess); -@@ -756,6 +_,7 @@ + this.save(p_203002_); +@@ -735,11 +_,22 @@ + } + + levelchunk.setFullStatus(() -> ChunkLevel.fullStatus(p_140384_.getTicketLevel())); ++ try { ++ p_140384_.currentlyLoading = levelchunk; // Neo: bypass the future chain when getChunk is called, this prevents deadlocks. + levelchunk.runPostLoad(); ++ } finally { ++ p_140384_.currentlyLoading = null; // Neo: Stop bypassing the future chain. ++ } + if (this.entitiesInLevel.add(chunkpos.toLong())) { + levelchunk.setLoaded(true); ++ try { ++ p_140384_.currentlyLoading = levelchunk; // Neo: bypass the future chain when getChunk is called, this prevents deadlocks. + levelchunk.registerAllBlockEntitiesAfterLevelLoad(); + levelchunk.registerTickContainerInLevel(this.level); ++ net.neoforged.neoforge.common.NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.level.ChunkEvent.Load(levelchunk, !(protochunk instanceof ImposterProtoChunk))); ++ } finally { ++ p_140384_.currentlyLoading = null; // Neo: Stop bypassing the future chain. ++ } + } + + return levelchunk; +@@ -839,6 +_,7 @@ this.level.getProfiler().incrementCounter("chunkSave"); CompoundTag compoundtag = ChunkSerializer.write(this.level, p_140259_); + net.neoforged.neoforge.common.NeoForge.EVENT_BUS.post(new net.neoforged.neoforge.event.level.ChunkDataEvent.Save(p_140259_, p_140259_.getLevel() != null ? p_140259_.getLevel() : this.level, compoundtag)); - this.write(chunkpos, compoundtag).exceptionally(p_351776_ -> { - this.level.getServer().reportChunkSaveFailure(p_351776_, this.storageInfo(), chunkpos); + this.write(chunkpos, compoundtag).exceptionallyAsync(p_329914_ -> { + this.level.getServer().reportChunkSaveFailure(chunkpos); return null; -@@ -817,9 +_,11 @@ +@@ -901,9 +_,11 @@ private static void markChunkPendingToSend(ServerPlayer p_295834_, LevelChunk p_296281_) { p_295834_.connection.chunkSender.markChunkPendingToSend(p_296281_); @@ -40,7 +63,7 @@ p_294215_.connection.chunkSender.dropChunk(p_294215_, p_294758_); } -@@ -1018,6 +_,7 @@ +@@ -1102,6 +_,7 @@ this.playerMap.unIgnorePlayer(p_140185_); } @@ -48,7 +71,7 @@ this.updateChunkTracking(p_140185_); } } -@@ -1069,7 +_,7 @@ +@@ -1153,7 +_,7 @@ } protected void addEntity(Entity p_140200_) { @@ -57,7 +80,7 @@ EntityType entitytype = p_140200_.getType(); int i = entitytype.clientTrackingRange() * 16; if (i != 0) { -@@ -1313,5 +_,20 @@ +@@ -1397,5 +_,20 @@ this.updatePlayer(serverplayer); } } diff --git a/patches/net/minecraft/world/entity/Mob.java.patch b/patches/net/minecraft/world/entity/Mob.java.patch index 8ea8d22b67..481c013482 100644 --- a/patches/net/minecraft/world/entity/Mob.java.patch +++ b/patches/net/minecraft/world/entity/Mob.java.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -131,6 +_,9 @@ - private Leashable.LeashData leashData; +@@ -133,6 +_,9 @@ + private Either delayedLeashInfo; private BlockPos restrictCenter = BlockPos.ZERO; private float restrictRadius = -1.0F; + @Nullable @@ -10,7 +10,7 @@ protected Mob(EntityType p_21368_, Level p_21369_) { super(p_21368_, p_21369_); -@@ -237,7 +_,10 @@ +@@ -239,7 +_,10 @@ } public void setTarget(@Nullable LivingEntity p_21544_) { @@ -22,20 +22,20 @@ } @Override -@@ -346,6 +_,12 @@ - if (!this.level().isClientSide && this.tickCount % 5 == 0) { - this.updateControlFlags(); +@@ -351,6 +_,12 @@ + this.updateControlFlags(); + } } + + // Neo: Animal armor tick patch -+ if (this.canUseSlot(EquipmentSlot.BODY)) { ++ if (this.canWearBodyArmor()) { + ItemStack stack = this.getBodyArmorItem(); + if (isBodyArmorItem(stack)) stack.onAnimalArmorTick(level(), this); + } } protected void updateControlFlags() { -@@ -425,6 +_,9 @@ +@@ -444,6 +_,9 @@ if (this.isNoAi()) { p_21484_.putBoolean("NoAI", this.isNoAi()); } @@ -45,7 +45,7 @@ } @Override -@@ -484,6 +_,14 @@ +@@ -510,6 +_,14 @@ } this.setNoAi(p_21450_.getBoolean("NoAI")); @@ -60,24 +60,31 @@ } @Override -@@ -539,7 +_,7 @@ +@@ -565,7 +_,7 @@ && this.canPickUpLoot() && this.isAlive() && !this.dead - && this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ && net.neoforged.neoforge.event.EventHooks.canEntityGrief(this.level(), this)) { ++ && net.neoforged.neoforge.event.EventHooks.getMobGriefingEvent(this.level(), this)) { Vec3i vec3i = this.getPickupReach(); for (ItemEntity itementity : this.level() -@@ -701,6 +_,7 @@ - - @Override - public void checkDespawn() { -+ if (net.neoforged.neoforge.event.EventHooks.checkMobDespawn(this)) return; - if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.shouldDespawnInPeaceful()) { +@@ -736,6 +_,14 @@ this.discard(); } else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) { -@@ -1133,6 +_,11 @@ + Entity entity = this.level().getNearestPlayer(this, -1.0); ++ net.neoforged.bus.api.Event.Result result = net.neoforged.neoforge.event.EventHooks.canEntityDespawn(this, (ServerLevel) this.level()); ++ if (result == net.neoforged.bus.api.Event.Result.DENY) { ++ noActionTime = 0; ++ entity = null; ++ } else if (result == net.neoforged.bus.api.Event.Result.ALLOW) { ++ this.discard(); ++ entity = null; ++ } + if (entity != null) { + double d0 = entity.distanceToSqr(this); + int i = this.getType().getCategory().getDespawnDistance(); +@@ -1135,6 +_,11 @@ } } @@ -89,15 +96,15 @@ @Nullable public SpawnGroupData finalizeSpawn(ServerLevelAccessor p_21434_, DifficultyInstance p_21435_, MobSpawnType p_21436_, @Nullable SpawnGroupData p_21437_) { RandomSource randomsource = p_21434_.getRandom(); -@@ -1144,6 +_,7 @@ - } - +@@ -1143,6 +_,7 @@ + new AttributeModifier("Random spawn bonus", randomsource.triangle(0.0, 0.11485000000000001), AttributeModifier.Operation.ADD_MULTIPLIED_BASE) + ); this.setLeftHanded(randomsource.nextFloat() < 0.05F); + this.spawnType = p_21436_; return p_21437_; } -@@ -1470,14 +_,24 @@ +@@ -1530,14 +_,24 @@ } @Override @@ -122,8 +129,8 @@ + @VisibleForTesting public void removeFreeWill() { - this.removeAllGoals(p_351790_ -> true); -@@ -1503,5 +_,40 @@ + this.removeAllGoals(p_262562_ -> true); +@@ -1564,5 +_,40 @@ public ItemStack getPickResult() { SpawnEggItem spawneggitem = SpawnEggItem.byId(this.getType()); return spawneggitem == null ? null : new ItemStack(spawneggitem); diff --git a/patches/net/minecraft/world/entity/monster/Slime.java.patch b/patches/net/minecraft/world/entity/monster/Slime.java.patch index 27fde65da4..0750ec4dd4 100644 --- a/patches/net/minecraft/world/entity/monster/Slime.java.patch +++ b/patches/net/minecraft/world/entity/monster/Slime.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java -@@ -139,6 +_,8 @@ +@@ -137,6 +_,8 @@ float f = this.getDimensions(this.getPose()).width() * 2.0F; float f1 = f / 2.0F; @@ -9,7 +9,7 @@ for (int i = 0; (float)i < f * 16.0F; i++) { float f2 = this.random.nextFloat() * (float) (Math.PI * 2); float f3 = this.random.nextFloat() * 0.5F + 0.5F; -@@ -204,6 +_,8 @@ +@@ -202,6 +_,8 @@ int j = i / 2; int k = 2 + this.random.nextInt(3); @@ -18,7 +18,7 @@ for (int l = 0; l < k; l++) { float f2 = ((float)(l % 2) - 0.5F) * f1; float f3 = ((float)(l / 2) - 0.5F) * f1; -@@ -218,8 +_,13 @@ +@@ -216,8 +_,13 @@ slime.setInvulnerable(this.isInvulnerable()); slime.setSize(j, true); slime.moveTo(this.getX() + (double)f2, this.getY() + 0.5, this.getZ() + (double)f3, this.random.nextFloat() * 360.0F, 0.0F); @@ -33,7 +33,7 @@ } } -@@ -334,6 +_,7 @@ +@@ -332,6 +_,7 @@ Vec3 vec3 = this.getDeltaMovement(); this.setDeltaMovement(vec3.x, (double)this.getJumpPower(), vec3.z); this.hasImpulse = true; @@ -41,7 +41,7 @@ } @Nullable -@@ -363,6 +_,12 @@ +@@ -361,6 +_,12 @@ public EntityDimensions getDefaultDimensions(Pose p_316359_) { return super.getDefaultDimensions(p_316359_).scale((float)this.getSize()); } diff --git a/patches/net/minecraft/world/level/block/GrowingPlantHeadBlock.java.patch b/patches/net/minecraft/world/level/block/GrowingPlantHeadBlock.java.patch index a0cdaee4d2..aaeafb00a4 100644 --- a/patches/net/minecraft/world/level/block/GrowingPlantHeadBlock.java.patch +++ b/patches/net/minecraft/world/level/block/GrowingPlantHeadBlock.java.patch @@ -5,11 +5,11 @@ @Override protected void randomTick(BlockState p_221350_, ServerLevel p_221351_, BlockPos p_221352_, RandomSource p_221353_) { - if (p_221350_.getValue(AGE) < 25 && p_221353_.nextDouble() < this.growPerTickProbability) { -+ if (p_221350_.getValue(AGE) < 25 && net.neoforged.neoforge.common.CommonHooks.canCropGrow(p_221351_, p_221352_.relative(this.growthDirection), p_221350_, p_221353_.nextDouble() < this.growPerTickProbability)) { ++ if (p_221350_.getValue(AGE) < 25 && net.neoforged.neoforge.common.CommonHooks.onCropsGrowPre(p_221351_, p_221352_.relative(this.growthDirection), p_221350_, p_221353_.nextDouble() < this.growPerTickProbability)) { BlockPos blockpos = p_221352_.relative(this.growthDirection); if (this.canGrowInto(p_221351_.getBlockState(blockpos))) { p_221351_.setBlockAndUpdate(blockpos, this.getGrowIntoState(p_221350_, p_221351_.random)); -+ net.neoforged.neoforge.common.CommonHooks.fireCropGrowPost(p_221351_, blockpos, p_221351_.getBlockState(blockpos)); ++ net.neoforged.neoforge.common.CommonHooks.onCropsGrowPost(p_221351_, blockpos, p_221351_.getBlockState(blockpos)); } } } diff --git a/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch b/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch index cd80ce062a..c7ce1ede63 100644 --- a/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch +++ b/patches/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch @@ -22,7 +22,7 @@ mob.setPersistenceRequired(); spawndata.getEquipment().ifPresent(mob::equip); -@@ -405,5 +_,14 @@ +@@ -416,5 +_,14 @@ TrialSpawnerState getState(); void markUpdated(); diff --git a/patches/net/minecraft/world/level/chunk/storage/SectionStorage.java.patch b/patches/net/minecraft/world/level/chunk/storage/SectionStorage.java.patch index e19c187a3b..81fa50d20c 100644 --- a/patches/net/minecraft/world/level/chunk/storage/SectionStorage.java.patch +++ b/patches/net/minecraft/world/level/chunk/storage/SectionStorage.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/storage/SectionStorage.java +++ b/net/minecraft/world/level/chunk/storage/SectionStorage.java -@@ -238,4 +_,12 @@ +@@ -231,4 +_,12 @@ public void close() throws IOException { this.simpleRegionStorage.close(); } diff --git a/patches/net/minecraft/world/phys/AABB.java.patch b/patches/net/minecraft/world/phys/AABB.java.patch index 334c4f33b7..6f8f6d4698 100644 --- a/patches/net/minecraft/world/phys/AABB.java.patch +++ b/patches/net/minecraft/world/phys/AABB.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/phys/AABB.java +++ b/net/minecraft/world/phys/AABB.java -@@ -10,6 +_,7 @@ +@@ -9,6 +_,7 @@ public class AABB { private static final double EPSILON = 1.0E-7; @@ -8,7 +8,7 @@ public final double minX; public final double minY; public final double minZ; -@@ -528,5 +_,13 @@ +@@ -511,5 +_,13 @@ p_165883_.y + p_165885_ / 2.0, p_165883_.z + p_165886_ / 2.0 ); diff --git a/src/main/java/net/neoforged/neoforge/client/ParticleBoundsDebugRenderer.java b/src/main/java/net/neoforged/neoforge/client/ParticleBoundsDebugRenderer.java index 9b57ae8f05..df8937d9dc 100644 --- a/src/main/java/net/neoforged/neoforge/client/ParticleBoundsDebugRenderer.java +++ b/src/main/java/net/neoforged/neoforge/client/ParticleBoundsDebugRenderer.java @@ -34,18 +34,14 @@ public static void onRenderLevelStage(RenderLevelStageEvent event) { PoseStack poseStack = event.getPoseStack(); poseStack.pushPose(); + poseStack.translate(-camPos.x, -camPos.y, -camPos.z); VertexConsumer consumer = Minecraft.getInstance().renderBuffers().bufferSource().getBuffer(RenderType.lines()); Minecraft.getInstance().particleEngine.iterateParticles(particle -> { - var bb = particle.getRenderBoundingBox(event.getPartialTick().getGameTimeDeltaPartialTick(false)); + var bb = particle.getRenderBoundingBox(event.getPartialTick()); if (!bb.isInfinite() && event.getFrustum().isVisible(bb)) { - poseStack.pushPose(); - var offset = particle.getPos().subtract(camPos); - poseStack.translate(offset.x, offset.y, offset.z); - bb = bb.move(-particle.getPos().x, -particle.getPos().y, -particle.getPos().z); LevelRenderer.renderLineBox(poseStack, consumer, bb, 1F, 0F, 0F, 1F); - poseStack.popPose(); } }); diff --git a/src/main/java/net/neoforged/neoforge/common/CommonHooks.java b/src/main/java/net/neoforged/neoforge/common/CommonHooks.java index d59c272a0e..bb93ea6f70 100644 --- a/src/main/java/net/neoforged/neoforge/common/CommonHooks.java +++ b/src/main/java/net/neoforged/neoforge/common/CommonHooks.java @@ -42,7 +42,6 @@ import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; -import net.minecraft.core.HolderLookup.RegistryLookup; import net.minecraft.core.HolderSet; import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; @@ -59,12 +58,12 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TextColor; import net.minecraft.network.chat.contents.PlainTextContents; +import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.packs.PackType; @@ -80,7 +79,6 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffectUtil; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -114,6 +112,8 @@ import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.item.enchantment.ItemEnchantments; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.GameType; @@ -124,9 +124,7 @@ import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.GameMasterBlock; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.pattern.BlockInWorld; import net.minecraft.world.level.chunk.ChunkAccess; @@ -142,11 +140,10 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import net.neoforged.bus.api.Event; import net.neoforged.fml.ModList; import net.neoforged.fml.ModLoader; import net.neoforged.fml.i18n.MavenVersionTranslator; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.neoforge.client.ClientHooks; import net.neoforged.neoforge.common.conditions.ConditionalOps; import net.neoforged.neoforge.common.extensions.IEntityExtension; import net.neoforged.neoforge.common.loot.IGlobalLootModifier; @@ -184,21 +181,18 @@ import net.neoforged.neoforge.event.entity.living.LivingKnockBackEvent; import net.neoforged.neoforge.event.entity.living.LivingSwapItemsEvent; import net.neoforged.neoforge.event.entity.living.LivingUseTotemEvent; -import net.neoforged.neoforge.event.entity.living.MobEffectEvent; +import net.neoforged.neoforge.event.entity.living.LootingLevelEvent; import net.neoforged.neoforge.event.entity.living.ShieldBlockEvent; import net.neoforged.neoforge.event.entity.player.AnvilRepairEvent; import net.neoforged.neoforge.event.entity.player.AttackEntityEvent; import net.neoforged.neoforge.event.entity.player.CriticalHitEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; -import net.neoforged.neoforge.event.level.BlockDropsEvent; import net.neoforged.neoforge.event.level.BlockEvent; import net.neoforged.neoforge.event.level.NoteBlockEvent; -import net.neoforged.neoforge.event.level.block.CropGrowEvent; import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.NeoForgeRegistries; import net.neoforged.neoforge.resource.ResourcePackLoader; -import net.neoforged.neoforge.server.ServerLifecycleHooks; import net.neoforged.neoforge.server.permission.PermissionAPI; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -270,8 +264,8 @@ public static boolean onLivingDeath(LivingEntity entity, DamageSource src) { return NeoForge.EVENT_BUS.post(new LivingDeathEvent(entity, src)).isCanceled(); } - public static boolean onLivingDrops(LivingEntity entity, DamageSource source, Collection drops, boolean recentlyHit) { - return NeoForge.EVENT_BUS.post(new LivingDropsEvent(entity, source, drops, recentlyHit)).isCanceled(); + public static boolean onLivingDrops(LivingEntity entity, DamageSource source, Collection drops, int lootingLevel, boolean recentlyHit) { + return NeoForge.EVENT_BUS.post(new LivingDropsEvent(entity, source, drops, lootingLevel, recentlyHit)).isCanceled(); } @Nullable @@ -280,6 +274,21 @@ public static float[] onLivingFall(LivingEntity entity, float distance, float da return (NeoForge.EVENT_BUS.post(event).isCanceled() ? null : new float[] { event.getDistance(), event.getDamageMultiplier() }); } + public static int getLootingLevel(Entity target, @Nullable Entity killer, @Nullable DamageSource cause) { + int looting = 0; + if (killer instanceof LivingEntity) + looting = EnchantmentHelper.getMobLooting((LivingEntity) killer); + if (target instanceof LivingEntity) + looting = getLootingLevel((LivingEntity) target, cause, looting); + return looting; + } + + public static int getLootingLevel(LivingEntity target, @Nullable DamageSource cause, int level) { + LootingLevelEvent event = new LootingLevelEvent(target, cause, level); + NeoForge.EVENT_BUS.post(event); + return event.getLootingLevel(); + } + public static double getEntityVisibilityMultiplier(LivingEntity entity, Entity lookingEntity, double originalMultiplier) { LivingEvent.LivingVisibilityEvent event = new LivingEvent.LivingVisibilityEvent(entity, lookingEntity, originalMultiplier); NeoForge.EVENT_BUS.post(event); @@ -430,72 +439,60 @@ else if (end.length() > 0) return ichat; } - /** - * Fires the {@link BlockDropsEvent} when block drops (items and experience) are determined. - * If the event is not cancelled, all drops will be added to the world, and then {@link BlockBehaviour#spawnAfterBreak} will be called. - * - * @param level The level - * @param pos The broken block's position - * @param state The broken block's state - * @param blockEntity The block entity from the given position - * @param drops The list of all items dropped by the block, captured from {@link Block#getDrops} - * @param breaker The entity who broke the block, or null if unknown - * @param tool The tool used when breaking the block; may be empty - */ - public static void handleBlockDrops(ServerLevel level, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, List drops, @Nullable Entity breaker, ItemStack tool) { - BlockDropsEvent event = new BlockDropsEvent(level, pos, state, blockEntity, drops, breaker, tool); - NeoForge.EVENT_BUS.post(event); - if (!event.isCanceled()) { - for (ItemEntity entity : event.getDrops()) { - level.addFreshEntity(entity); - } - // Always pass false for the dropXP (last) param to spawnAfterBreak since we handle XP. - state.spawnAfterBreak((ServerLevel) level, pos, tool, false); - if (event.getDroppedExperience() > 0) { - state.getBlock().popExperience(level, pos, event.getDroppedExperience()); - } - } + public static void dropXpForBlock(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack) { + int fortuneLevel = stack.getEnchantmentLevel(Enchantments.FORTUNE); + int silkTouchLevel = stack.getEnchantmentLevel(Enchantments.SILK_TOUCH); + int exp = state.getExpDrop(level, level.random, pos, fortuneLevel, silkTouchLevel); + if (exp > 0) + state.getBlock().popExperience(level, pos, exp); } - /** - * Fires {@link BlockEvent.BreakEvent}, pre-emptively canceling the event based on the conditions that will cause the block to not be broken anyway. - *

- * Note that undoing the pre-cancel will not permit breaking the block, since the vanilla conditions will always be checked. - * - * @param level The level - * @param gameType The game type of the breaking player - * @param player The breaking player - * @param pos The position of the block being broken - * @param state The state of the block being broken - * @return The event - */ - public static BlockEvent.BreakEvent fireBlockBreak(Level level, GameType gameType, ServerPlayer player, BlockPos pos, BlockState state) { + public static int onBlockBreakEvent(Level level, GameType gameType, ServerPlayer entityPlayer, BlockPos pos) { + // Logic from tryHarvestBlock for pre-canceling the event boolean preCancelEvent = false; - - ItemStack itemstack = player.getMainHandItem(); - if (!itemstack.isEmpty() && !itemstack.getItem().canAttackBlock(state, level, pos, player)) { + ItemStack itemstack = entityPlayer.getMainHandItem(); + if (!itemstack.isEmpty() && !itemstack.getItem().canAttackBlock(level.getBlockState(pos), level, pos, entityPlayer)) { preCancelEvent = true; } - if (player.blockActionRestricted(level, pos, gameType)) { - preCancelEvent = true; + if (gameType.isBlockPlacingRestricted()) { + if (gameType == GameType.SPECTATOR) + preCancelEvent = true; + + if (!entityPlayer.mayBuild()) { + AdventureModePredicate adventureModePredicate = itemstack.get(DataComponents.CAN_BREAK); + if (itemstack.isEmpty() || adventureModePredicate == null || !adventureModePredicate.test(new BlockInWorld(level, pos, false))) { + preCancelEvent = true; + } + } } - if (state.getBlock() instanceof GameMasterBlock && !player.canUseGameMasterBlocks()) { - preCancelEvent = true; + // Tell client the block is gone immediately then process events + if (level.getBlockEntity(pos) == null) { + entityPlayer.connection.send(new ClientboundBlockUpdatePacket(pos, level.getFluidState(pos).createLegacyBlock())); } // Post the block break event - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(level, pos, state, player); + BlockState state = level.getBlockState(pos); + BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(level, pos, state, entityPlayer); event.setCanceled(preCancelEvent); NeoForge.EVENT_BUS.post(event); - // If the event is canceled, let the client know the block still exists + // Handle if the event is canceled if (event.isCanceled()) { - player.connection.send(new ClientboundBlockUpdatePacket(pos, state)); + // Let the client know the block still exists + entityPlayer.connection.send(new ClientboundBlockUpdatePacket(level, pos)); + + // Update any tile entity data for this block + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity != null) { + Packet pkt = blockEntity.getUpdatePacket(); + if (pkt != null) { + entityPlayer.connection.send(pkt); + } + } } - - return event; + return event.isCanceled() ? -1 : event.getExpToDrop(); } public static InteractionResult onPlaceItemIntoWorld(UseOnContext context) { @@ -552,7 +549,7 @@ public static InteractionResult onPlaceItemIntoWorld(UseOnContext context) { // revert back all captured blocks for (BlockSnapshot blocksnapshot : Lists.reverse(blockSnapshots)) { level.restoringBlockSnapshots = true; - blocksnapshot.restore(blocksnapshot.getFlags() | Block.UPDATE_CLIENTS); + blocksnapshot.restore(true, false); level.restoringBlockSnapshots = false; } } else { @@ -561,8 +558,8 @@ public static InteractionResult onPlaceItemIntoWorld(UseOnContext context) { itemstack.applyComponents(newComponents); for (BlockSnapshot snap : blockSnapshots) { - int updateFlag = snap.getFlags(); - BlockState oldBlock = snap.getState(); + int updateFlag = snap.getFlag(); + BlockState oldBlock = snap.getReplacedBlock(); BlockState newBlock = level.getBlockState(snap.getPos()); newBlock.onPlace(level, snap.getPos(), oldBlock, false); @@ -789,35 +786,24 @@ public interface BiomeCallbackFunction { Biome apply(final Biome.ClimateSettings climate, final BiomeSpecialEffects effects, final BiomeGenerationSettings gen, final MobSpawnSettings spawns); } - /** - * Checks if a crop can grow by firing {@link CropGrowEvent.Pre}. - * - * @param level The level the crop is in - * @param pos The position of the crop - * @param state The state of the crop - * @param def The result of the default checks performed by the crop. - * @return true if the crop can grow - */ - public static boolean canCropGrow(Level level, BlockPos pos, BlockState state, boolean def) { - var ev = new CropGrowEvent.Pre(level, pos, state); + public static boolean onCropsGrowPre(Level level, BlockPos pos, BlockState state, boolean def) { + BlockEvent ev = new BlockEvent.CropGrowEvent.Pre(level, pos, state); NeoForge.EVENT_BUS.post(ev); - return (ev.getResult() == CropGrowEvent.Pre.Result.GROW || (ev.getResult() == CropGrowEvent.Pre.Result.DEFAULT && def)); + return (ev.getResult() == Event.Result.ALLOW || (ev.getResult() == Event.Result.DEFAULT && def)); } - public static void fireCropGrowPost(Level level, BlockPos pos, BlockState state) { - NeoForge.EVENT_BUS.post(new CropGrowEvent.Post(level, pos, state, level.getBlockState(pos))); + public static void onCropsGrowPost(Level level, BlockPos pos, BlockState state) { + NeoForge.EVENT_BUS.post(new BlockEvent.CropGrowEvent.Post(level, pos, state, level.getBlockState(pos))); } - /** - * Fires the {@link CriticalHitEvent} and returns the resulting event. - * - * @param player The attacking player - * @param target The attack target - * @param vanillaCritical If the attack would have been a critical hit by vanilla's rules in {@link Player#attack(Entity)}. - * @param damageModifier The base damage modifier. Vanilla critical hits have a damage modifier of 1.5. - */ - public static CriticalHitEvent fireCriticalHit(Player player, Entity target, boolean vanillaCritical, float damageModifier) { - return NeoForge.EVENT_BUS.post(new CriticalHitEvent(player, target, damageModifier, vanillaCritical)); + @Nullable + public static CriticalHitEvent getCriticalHit(Player player, Entity target, boolean vanillaCritical, float damageModifier) { + CriticalHitEvent hitResult = new CriticalHitEvent(player, target, damageModifier, vanillaCritical); + NeoForge.EVENT_BUS.post(hitResult); + if (hitResult.getResult() == Event.Result.ALLOW || (vanillaCritical && hitResult.getResult() == Event.Result.DEFAULT)) { + return hitResult; + } + return null; } /** @@ -915,7 +901,7 @@ public static boolean canEntityDestroy(Level level, BlockPos pos, LivingEntity e if (!level.isLoaded(pos)) return false; BlockState state = level.getBlockState(pos); - return EventHooks.canEntityGrief(level, entity) && state.canEntityDestroy(level, pos, entity) && EventHooks.onEntityDestroyBlock(entity, pos, state); + return EventHooks.getMobGriefingEvent(level, entity) && state.canEntityDestroy(level, pos, entity) && EventHooks.onEntityDestroyBlock(entity, pos, state); } /** @@ -1138,7 +1124,7 @@ public static MobEffect loadMobEffect(CompoundTag nbt, String key, @Nullable Mob return fallback; } try { - return BuiltInRegistries.MOB_EFFECT.get(ResourceLocation.parse(registryName)); + return BuiltInRegistries.MOB_EFFECT.get(new ResourceLocation(registryName)); } catch (ResourceLocationException e) { return fallback; } @@ -1374,36 +1360,4 @@ public static void onChunkUnload(PoiManager poiManager, ChunkAccess chunkAccess) poiManager.remove(sectionPosKey); } } - - /** - * Checks if a mob effect can be applied to an entity by firing {@link MobEffectEvent.Applicable}. - * - * @param entity The target entity the mob effect is being applied to. - * @param effect The mob effect being applied. - * @return True if the mob effect can be applied, otherwise false. - */ - public static boolean canMobEffectBeApplied(LivingEntity entity, MobEffectInstance effect) { - var event = new MobEffectEvent.Applicable(entity, effect); - return NeoForge.EVENT_BUS.post(event).getApplicationResult(); - } - - /** - * Attempts to resolve a {@link RegistryLookup} using the current global state. - *

- * Prioritizes the server's lookup, only attempting to retrieve it from the client if the server is unavailable. - * - * @param The type of registry being looked up - * @param key The resource key for the target registry - * @return A registry access, if one was available. - */ - @Nullable - public static RegistryLookup resolveLookup(ResourceKey> key) { - MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); - if (server != null) { - return server.registryAccess().lookup(key).orElse(null); - } else if (FMLEnvironment.dist.isClient()) { - return ClientHooks.resolveLookup(key); - } - return null; - } } diff --git a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java index 535ce408b9..8a9d3cee6d 100644 --- a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java +++ b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java @@ -388,6 +388,15 @@ public class NeoForgeMod { public static final DeferredHolder, FluidIngredientType> DIFFERENCE_FLUID_INGREDIENT_TYPE = FLUID_INGREDIENT_TYPES.register("difference", () -> new FluidIngredientType<>(DifferenceFluidIngredient.CODEC)); public static final DeferredHolder, FluidIngredientType> INTERSECTION_FLUID_INGREDIENT_TYPE = FLUID_INGREDIENT_TYPES.register("intersection", () -> new FluidIngredientType<>(IntersectionFluidIngredient.CODEC)); + private static final DeferredRegister> FLUID_INGREDIENT_TYPES = DeferredRegister.create(NeoForgeRegistries.Keys.FLUID_INGREDIENT_TYPES, NeoForgeVersion.MOD_ID); + public static final DeferredHolder, FluidIngredientType> SINGLE_FLUID_INGREDIENT_TYPE = FLUID_INGREDIENT_TYPES.register("single", () -> new FluidIngredientType<>(SingleFluidIngredient.CODEC)); + public static final DeferredHolder, FluidIngredientType> TAG_FLUID_INGREDIENT_TYPE = FLUID_INGREDIENT_TYPES.register("tag", () -> new FluidIngredientType<>(TagFluidIngredient.CODEC)); + public static final DeferredHolder, FluidIngredientType> EMPTY_FLUID_INGREDIENT_TYPE = FLUID_INGREDIENT_TYPES.register("empty", () -> new FluidIngredientType<>(EmptyFluidIngredient.CODEC)); + public static final DeferredHolder, FluidIngredientType> COMPOUND_FLUID_INGREDIENT_TYPE = FLUID_INGREDIENT_TYPES.register("compound", () -> new FluidIngredientType<>(CompoundFluidIngredient.CODEC)); + public static final DeferredHolder, FluidIngredientType> DATA_COMPONENT_FLUID_INGREDIENT_TYPE = FLUID_INGREDIENT_TYPES.register("components", () -> new FluidIngredientType<>(DataComponentFluidIngredient.CODEC)); + public static final DeferredHolder, FluidIngredientType> DIFFERENCE_FLUID_INGREDIENT_TYPE = FLUID_INGREDIENT_TYPES.register("difference", () -> new FluidIngredientType<>(DifferenceFluidIngredient.CODEC)); + public static final DeferredHolder, FluidIngredientType> INTERSECTION_FLUID_INGREDIENT_TYPE = FLUID_INGREDIENT_TYPES.register("intersection", () -> new FluidIngredientType<>(IntersectionFluidIngredient.CODEC)); + private static final DeferredRegister> CONDITION_CODECS = DeferredRegister.create(NeoForgeRegistries.Keys.CONDITION_CODECS, NeoForgeVersion.MOD_ID); public static final DeferredHolder, MapCodec> AND_CONDITION = CONDITION_CODECS.register("and", () -> AndCondition.CODEC); public static final DeferredHolder, MapCodec> FALSE_CONDITION = CONDITION_CODECS.register("false", () -> FalseCondition.CODEC); diff --git a/src/main/java/net/neoforged/neoforge/event/EventHooks.java b/src/main/java/net/neoforged/neoforge/event/EventHooks.java index 36a3023286..1a03715e31 100644 --- a/src/main/java/net/neoforged/neoforge/event/EventHooks.java +++ b/src/main/java/net/neoforged/neoforge/event/EventHooks.java @@ -7,8 +7,6 @@ import com.mojang.authlib.GameProfile; import com.mojang.brigadier.CommandDispatcher; -import com.mojang.datafixers.util.Either; -import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenCustomHashSet; import java.io.File; import java.util.EnumSet; import java.util.List; @@ -18,14 +16,12 @@ import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementProgress; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; -import net.minecraft.core.HolderLookup.RegistryLookup; import net.minecraft.core.NonNullList; import net.minecraft.core.RegistryAccess; import net.minecraft.network.chat.Component; @@ -42,10 +38,8 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.stats.Stat; import net.minecraft.util.RandomSource; -import net.minecraft.util.Unit; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.Container; -import net.minecraft.world.Difficulty; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -65,14 +59,13 @@ import net.minecraft.world.entity.SpawnPlacements; import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.Player.BedSleepingProblem; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.ThrownEnderpearl; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.ItemStackLinkedSet; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.crafting.RecipeType; @@ -85,29 +78,26 @@ import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.NaturalSpawner; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.SpawnData; import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.levelgen.PhantomSpawner; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; import net.minecraft.world.level.levelgen.feature.treedecorators.AlterGroundDecorator; import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; -import net.minecraft.world.level.portal.DimensionTransition; import net.minecraft.world.level.portal.PortalShape; import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import net.neoforged.bus.api.Event.Result; import net.neoforged.fml.ModLoader; import net.neoforged.neoforge.common.EffectCure; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.ToolAction; -import net.neoforged.neoforge.common.extensions.IFluidStateExtension; import net.neoforged.neoforge.common.extensions.IOwnedSpawner; import net.neoforged.neoforge.common.util.BlockSnapshot; import net.neoforged.neoforge.common.util.MutableHashedLinkedMap; @@ -129,48 +119,49 @@ import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; import net.neoforged.neoforge.event.entity.living.LivingExperienceDropEvent; import net.neoforged.neoforge.event.entity.living.LivingHealEvent; -import net.neoforged.neoforge.event.entity.living.MobDespawnEvent; +import net.neoforged.neoforge.event.entity.living.LivingPackSizeEvent; import net.neoforged.neoforge.event.entity.living.MobEffectEvent; +import net.neoforged.neoforge.event.entity.living.MobSpawnEvent.AllowDespawn; import net.neoforged.neoforge.event.entity.living.MobSpawnEvent.PositionCheck; import net.neoforged.neoforge.event.entity.living.MobSpawnEvent.SpawnPlacementCheck; import net.neoforged.neoforge.event.entity.living.MobSplitEvent; -import net.neoforged.neoforge.event.entity.living.SpawnClusterSizeEvent; +import net.neoforged.neoforge.event.entity.living.ZombieEvent.SummonAidEvent; import net.neoforged.neoforge.event.entity.player.AdvancementEvent.AdvancementEarnEvent; import net.neoforged.neoforge.event.entity.player.AdvancementEvent.AdvancementProgressEvent; import net.neoforged.neoforge.event.entity.player.AdvancementEvent.AdvancementProgressEvent.ProgressType; import net.neoforged.neoforge.event.entity.player.ArrowLooseEvent; import net.neoforged.neoforge.event.entity.player.ArrowNockEvent; import net.neoforged.neoforge.event.entity.player.BonemealEvent; -import net.neoforged.neoforge.event.entity.player.CanContinueSleepingEvent; -import net.neoforged.neoforge.event.entity.player.CanPlayerSleepEvent; -import net.neoforged.neoforge.event.entity.player.ItemEntityPickupEvent; +import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; +import net.neoforged.neoforge.event.entity.player.FillBucketEvent; import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; import net.neoforged.neoforge.event.entity.player.PermissionsChangedEvent; import net.neoforged.neoforge.event.entity.player.PlayerDestroyItemEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.entity.player.PlayerFlyableFallEvent; -import net.neoforged.neoforge.event.entity.player.PlayerHeartTypeEvent; import net.neoforged.neoforge.event.entity.player.PlayerRespawnPositionEvent; import net.neoforged.neoforge.event.entity.player.PlayerSetSpawnEvent; +import net.neoforged.neoforge.event.entity.player.PlayerSleepInBedEvent; import net.neoforged.neoforge.event.entity.player.PlayerSpawnPhantomsEvent; import net.neoforged.neoforge.event.entity.player.PlayerWakeUpEvent; +import net.neoforged.neoforge.event.entity.player.SleepingLocationCheckEvent; +import net.neoforged.neoforge.event.entity.player.SleepingTimeCheckEvent; import net.neoforged.neoforge.event.furnace.FurnaceFuelBurnTimeEvent; import net.neoforged.neoforge.event.level.AlterGroundEvent; import net.neoforged.neoforge.event.level.AlterGroundEvent.StateProvider; import net.neoforged.neoforge.event.level.BlockEvent; import net.neoforged.neoforge.event.level.BlockEvent.BlockToolModificationEvent; +import net.neoforged.neoforge.event.level.BlockEvent.CreateFluidSourceEvent; import net.neoforged.neoforge.event.level.BlockEvent.EntityMultiPlaceEvent; import net.neoforged.neoforge.event.level.BlockEvent.EntityPlaceEvent; import net.neoforged.neoforge.event.level.BlockEvent.NeighborNotifyEvent; -import net.neoforged.neoforge.event.level.BlockGrowFeatureEvent; import net.neoforged.neoforge.event.level.ChunkTicketLevelUpdatedEvent; import net.neoforged.neoforge.event.level.ChunkWatchEvent; import net.neoforged.neoforge.event.level.ExplosionEvent; -import net.neoforged.neoforge.event.level.ExplosionKnockbackEvent; import net.neoforged.neoforge.event.level.LevelEvent; import net.neoforged.neoforge.event.level.PistonEvent; +import net.neoforged.neoforge.event.level.SaplingGrowTreeEvent; import net.neoforged.neoforge.event.level.SleepFinishedTimeEvent; -import net.neoforged.neoforge.event.level.block.CreateFluidSourceEvent; import net.neoforged.neoforge.event.tick.EntityTickEvent; import net.neoforged.neoforge.event.tick.LevelTickEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent; @@ -222,7 +213,8 @@ public static void onPlayerDestroyItem(Player player, ItemStack stack, @Nullable @ApiStatus.Internal public static boolean checkSpawnPlacements(EntityType entityType, ServerLevelAccessor level, MobSpawnType spawnType, BlockPos pos, RandomSource random, boolean defaultResult) { var event = new SpawnPlacementCheck(entityType, level, spawnType, pos, random, defaultResult); - return NeoForge.EVENT_BUS.post(event).getPlacementCheckResult(); + NeoForge.EVENT_BUS.post(event); + return event.getResult() == Result.DEFAULT ? defaultResult : event.getResult() == Result.ALLOW; } /** @@ -238,26 +230,26 @@ public static boolean checkSpawnPlacements(EntityType entityType, ServerLevel public static boolean checkSpawnPosition(Mob mob, ServerLevelAccessor level, MobSpawnType spawnType) { var event = new PositionCheck(mob, level, spawnType, null); NeoForge.EVENT_BUS.post(event); - if (event.getResult() == PositionCheck.Result.DEFAULT) { + if (event.getResult() == Result.DEFAULT) { return mob.checkSpawnRules(level, spawnType) && mob.checkSpawnObstruction(level); } - return event.getResult() == PositionCheck.Result.SUCCEED; + return event.getResult() == Result.ALLOW; } /** - * Specialized variant of {@link #checkSpawnPosition} for spawners, as they have slightly different checks, and pass through the {@link BaseSpawner} to the event. + * Specialized variant of {@link #checkSpawnPosition} for spawners, as they have slightly different checks. * - * @see #checkSpawnPosition(Mob, ServerLevelAccessor, MobSpawnType) + * @see #CheckSpawnPosition * @implNote See in-line comments about custom spawn rules. */ public static boolean checkSpawnPositionSpawner(Mob mob, ServerLevelAccessor level, MobSpawnType spawnType, SpawnData spawnData, BaseSpawner spawner) { - var event = new PositionCheck(mob, level, spawnType, spawner); + var event = new PositionCheck(mob, level, spawnType, null); NeoForge.EVENT_BUS.post(event); - if (event.getResult() == PositionCheck.Result.DEFAULT) { + if (event.getResult() == Result.DEFAULT) { // Spawners do not evaluate Mob#checkSpawnRules if any custom rules are present. This is despite the fact that these two methods do not check the same things. return (spawnData.getCustomSpawnRules().isPresent() || mob.checkSpawnRules(level, spawnType)) && mob.checkSpawnObstruction(level); } - return event.getResult() == PositionCheck.Result.SUCCEED; + return event.getResult() == Result.ALLOW; } /** @@ -351,38 +343,16 @@ public static FinalizeSpawnEvent finalizeMobSpawnSpawner(Mob mob, ServerLevelAcc return event; } - /** - * Called from {@link PhantomSpawner#tick} just before the spawn conditions for phantoms are evaluated. - * Fires the {@link PlayerSpawnPhantomsEvent} and returns the event. - * - * @param player The player for whom a spawn attempt is being made - * @param level The level of the player - * @param pos The block position of the player - */ - public static PlayerSpawnPhantomsEvent firePlayerSpawnPhantoms(ServerPlayer player, ServerLevel level, BlockPos pos) { - Difficulty difficulty = level.getCurrentDifficultyAt(pos).getDifficulty(); - var event = new PlayerSpawnPhantomsEvent(player, 1 + level.random.nextInt(difficulty.getId() + 1)); + public static PlayerSpawnPhantomsEvent onPhantomSpawn(ServerPlayer player, int phantomsToSpawn) { + var event = new PlayerSpawnPhantomsEvent(player, phantomsToSpawn); NeoForge.EVENT_BUS.post(event); return event; } - /** - * Fires {@link MobDespawnEvent} and returns true if the default logic should be ignored. - * - * @param entity The entity being despawned. - * @return True if the event result is not {@link MobDespawnEvent.Result#DEFAULT}, and the vanilla logic should be ignored. - */ - public static boolean checkMobDespawn(Mob mob) { - MobDespawnEvent event = new MobDespawnEvent(mob, (ServerLevel) mob.level()); + public static Result canEntityDespawn(Mob entity, ServerLevelAccessor level) { + AllowDespawn event = new AllowDespawn(entity, level); NeoForge.EVENT_BUS.post(event); - - switch (event.getResult()) { - case ALLOW -> mob.discard(); - case DEFAULT -> {} - case DENY -> mob.setNoActionTime(0); - } - - return event.getResult() != MobDespawnEvent.Result.DEFAULT; + return event.getResult(); } public static int getItemBurnTime(ItemStack itemStack, int burnTime, @Nullable RecipeType recipeType) { @@ -399,19 +369,10 @@ public static int getExperienceDrop(LivingEntity entity, Player attackingPlayer, return event.getDroppedExperience(); } - /** - * Fires {@link SpawnClusterSizeEvent} and returns the size as a result of the event. - *

- * Called in {@link NaturalSpawner#spawnCategoryForPosition} where {@link Mob#getMaxSpawnClusterSize()} would normally be called. - * - * @param entity The entity whose max spawn cluster size is being queried. - * - * @return The new spawn cluster size. - */ - public static int getMaxSpawnClusterSize(Mob entity) { - var event = new SpawnClusterSizeEvent(entity); - NeoForge.EVENT_BUS.post(event); - return event.getSize(); + public static int getMaxSpawnPackSize(Mob entity) { + LivingPackSizeEvent maxCanSpawnEvent = new LivingPackSizeEvent(entity); + NeoForge.EVENT_BUS.post(maxCanSpawnEvent); + return maxCanSpawnEvent.getResult() == Result.ALLOW ? maxCanSpawnEvent.getMaxPackSize() : entity.getMaxSpawnClusterSize(); } public static Component getPlayerDisplayName(Player player, Component username) { @@ -438,6 +399,12 @@ public static ItemTooltipEvent onItemTooltip(ItemStack itemStack, @Nullable Play return event; } + public static SummonAidEvent fireZombieSummonAid(Zombie zombie, Level level, int x, int y, int z, LivingEntity attacker, double summonChance) { + SummonAidEvent summonEvent = new SummonAidEvent(zombie, level, x, y, z, attacker, summonChance); + NeoForge.EVENT_BUS.post(summonEvent); + return summonEvent; + } + public static boolean onEntityStruckByLightning(Entity entity, LightningBolt bolt) { return NeoForge.EVENT_BUS.post(new EntityStruckByLightningEvent(entity, bolt)).isCanceled(); } @@ -488,18 +455,36 @@ public static BlockState onToolUse(BlockState originalState, UseOnContext contex return NeoForge.EVENT_BUS.post(event).isCanceled() ? null : event.getFinalState(); } - /** - * Called when bone meal (or equivalent) is used on a block. Fires the {@link BonemealEvent} and returns the event. - * - * @param player The player who used the item, if any - * @param level The level - * @param pos The position of the target block - * @param state The state of the target block - * @param stack The bone meal item stack - * @return The event - */ - public static BonemealEvent fireBonemealEvent(@Nullable Player player, Level level, BlockPos pos, BlockState state, ItemStack stack) { - return NeoForge.EVENT_BUS.post(new BonemealEvent(player, level, pos, state, stack)); + public static int onApplyBonemeal(Player player, Level level, BlockPos pos, BlockState state, ItemStack stack) { + BonemealEvent event = new BonemealEvent(player, level, pos, state, stack); + if (NeoForge.EVENT_BUS.post(event).isCanceled()) return -1; + if (event.getResult() == Result.ALLOW) { + if (!level.isClientSide) + stack.shrink(1); + return 1; + } + return 0; + } + + @Nullable + public static InteractionResultHolder onBucketUse(Player player, Level level, ItemStack stack, @Nullable HitResult target) { + FillBucketEvent event = new FillBucketEvent(player, stack, level, target); + if (NeoForge.EVENT_BUS.post(event).isCanceled()) return new InteractionResultHolder(InteractionResult.FAIL, stack); + + if (event.getResult() == Result.ALLOW) { + if (player.getAbilities().instabuild) + return new InteractionResultHolder(InteractionResult.SUCCESS, stack); + + stack.shrink(1); + if (stack.isEmpty()) + return new InteractionResultHolder(InteractionResult.SUCCESS, event.getFilledBucket()); + + if (!player.getInventory().add(event.getFilledBucket())) + player.drop(event.getFilledBucket(), false); + + return new InteractionResultHolder(InteractionResult.SUCCESS, stack); + } + return null; } public static PlayLevelSoundEvent.AtEntity onPlaySoundAtEntity(Entity entity, Holder name, SoundSource category, float volume, float pitch) { @@ -521,29 +506,10 @@ public static int onItemExpire(ItemEntity entity, ItemStack item) { return event.getExtraLife(); } - /** - * Called in {@link ItemEntity#playerTouch(Player)} before any other processing occurs. - *

- * Fires {@link ItemEntityPickupEvent.Pre} and returns the event. - * - * @param itemEntity The item entity that a player collided with - * @param player The player that collided with the item entity - */ - public static ItemEntityPickupEvent.Pre fireItemPickupPre(ItemEntity itemEntity, Player player) { - return NeoForge.EVENT_BUS.post(new ItemEntityPickupEvent.Pre(player, itemEntity)); - } - - /** - * Called in {@link ItemEntity#playerTouch(Player)} after an item was successfully picked up. - *

- * Fires {@link ItemEntityPickupEvent.Post}. - * - * @param itemEntity The item entity that a player collided with - * @param player The player that collided with the item entity - * @param copy A copy of the item entity's item stack before the pickup - */ - public static void fireItemPickupPost(ItemEntity itemEntity, Player player, ItemStack copy) { - NeoForge.EVENT_BUS.post(new ItemEntityPickupEvent.Post(player, itemEntity, copy)); + public static int onItemPickup(ItemEntity entityItem, Player player) { + var event = new EntityItemPickupEvent(player, entityItem); + if (NeoForge.EVENT_BUS.post(event).isCanceled()) return -1; + return event.getResult() == Result.ALLOW ? 1 : 0; } public static boolean canMountEntity(Entity entityMounting, Entity entityBeingMounted, boolean isMounting) { @@ -560,10 +526,10 @@ public static boolean onAnimalTame(Animal animal, Player tamer) { return NeoForge.EVENT_BUS.post(new AnimalTameEvent(animal, tamer)).isCanceled(); } - public static Either canPlayerStartSleeping(ServerPlayer player, BlockPos pos, Either vanillaResult) { - CanPlayerSleepEvent event = new CanPlayerSleepEvent(player, pos, vanillaResult.left().orElse(null)); + public static Player.BedSleepingProblem onPlayerSleepInBed(Player player, Optional pos) { + PlayerSleepInBedEvent event = new PlayerSleepInBedEvent(player, pos); NeoForge.EVENT_BUS.post(event); - return event.getProblem() != null ? Either.left(event.getProblem()) : Either.right(Unit.INSTANCE); + return event.getResultStatus(); } public static void onPlayerWakeup(Player player, boolean wakeImmediately, boolean updateLevel) { @@ -601,22 +567,6 @@ public static void onExplosionDetonate(Level level, Explosion explosion, List { + BlockState state = player.level().getBlockState(pos); + return state.getBlock().isBed(state, player.level(), pos, player); + }).orElse(false); + } else + return canContinueSleep == Result.ALLOW; + } + + public static boolean fireSleepingTimeCheck(Player player, Optional sleepingLocation) { + SleepingTimeCheckEvent evt = new SleepingTimeCheckEvent(player, sleepingLocation); + NeoForge.EVENT_BUS.post(evt); + + Result canContinueSleep = evt.getResult(); + if (canContinueSleep == Result.DEFAULT) + return !player.level().isDay(); + else + return canContinueSleep == Result.ALLOW; } public static InteractionResultHolder onArrowNock(ItemStack item, Level level, Player player, InteractionHand hand, boolean hasAmmo) { @@ -689,12 +655,12 @@ public static LootTable loadLootTable(ResourceLocation name, LootTable table) { return event.getTable(); } - /** - * Checks if a fluid is allowed to create a fluid source. This fires the {@link CreateFluidSourceEvent}. - * By default, a fluid can create a source if it returns true to {@link IFluidStateExtension#canConvertToSource(Level, BlockPos)} - */ - public static boolean canCreateFluidSource(Level level, BlockPos pos, BlockState state) { - return NeoForge.EVENT_BUS.post(new CreateFluidSourceEvent(level, pos, state)).canConvert(); + public static boolean canCreateFluidSource(Level level, BlockPos pos, BlockState state, boolean def) { + CreateFluidSourceEvent evt = new CreateFluidSourceEvent(level, pos, state); + NeoForge.EVENT_BUS.post(evt); + + Result result = evt.getResult(); + return result == Result.DEFAULT ? def : result == Result.ALLOW; } public static Optional onTrySpawnPortal(LevelAccessor level, BlockPos pos, Optional size) { @@ -712,33 +678,21 @@ public static boolean onEntityDestroyBlock(LivingEntity entity, BlockPos pos, Bl return !NeoForge.EVENT_BUS.post(new LivingDestroyBlockEvent(entity, pos, state)).isCanceled(); } - /** - * Checks if an entity can perform a griefing action. - *

- * If an entity is provided, this method fires {@link EntityMobGriefingEvent}. - * If an entity is not provided, this method returns the value of {@link GameRules#RULE_MOBGRIEFING}. - * - * @param level The level of the action - * @param entity The entity performing the action, or null if unknown. - * @return - */ - public static boolean canEntityGrief(Level level, @Nullable Entity entity) { + public static boolean getMobGriefingEvent(Level level, @Nullable Entity entity) { if (entity == null) return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); - return NeoForge.EVENT_BUS.post(new EntityMobGriefingEvent(level, entity)).canGrief(); + EntityMobGriefingEvent event = new EntityMobGriefingEvent(entity); + NeoForge.EVENT_BUS.post(event); + + Result result = event.getResult(); + return result == Result.DEFAULT ? level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) : result == Result.ALLOW; } - /** - * Fires the {@link BlockGrowFeatureEvent} and returns the event object. - * - * @param level The level the feature will be grown in - * @param rand The random source - * @param pos The position the feature will be grown at - * @param holder The feature to be grown, if any - */ - public static BlockGrowFeatureEvent fireBlockGrowFeature(LevelAccessor level, RandomSource rand, BlockPos pos, @Nullable Holder> holder) { - return NeoForge.EVENT_BUS.post(new BlockGrowFeatureEvent(level, rand, pos, holder)); + public static SaplingGrowTreeEvent blockGrowFeature(LevelAccessor level, RandomSource randomSource, BlockPos pos, @Nullable Holder> holder) { + SaplingGrowTreeEvent event = new SaplingGrowTreeEvent(level, randomSource, pos, holder); + NeoForge.EVENT_BUS.post(event); + return event; } /** @@ -882,8 +836,8 @@ public static void firePlayerLoggedOut(Player player) { * @param fromEndFight Whether the player is respawning because they jumped through the End return portal * @return The event */ - public static PlayerRespawnPositionEvent firePlayerRespawnPositionEvent(ServerPlayer player, DimensionTransition dimensionTransition, boolean fromEndFight) { - return NeoForge.EVENT_BUS.post(new PlayerRespawnPositionEvent(player, dimensionTransition, fromEndFight)); + public static PlayerRespawnPositionEvent firePlayerRespawnPositionEvent(ServerPlayer player, ServerLevel respawnLevel, float respawnAngle, @Nullable Vec3 respawnPosition, boolean fromEndFight) { + return NeoForge.EVENT_BUS.post(new PlayerRespawnPositionEvent(player, respawnLevel, respawnAngle, respawnPosition, fromEndFight)); } /** @@ -896,6 +850,10 @@ public static void firePlayerRespawnEvent(ServerPlayer player, boolean fromEndFi NeoForge.EVENT_BUS.post(new PlayerEvent.PlayerRespawnEvent(player, fromEndFight)); } + public static void firePlayerItemPickupEvent(Player player, ItemEntity item, ItemStack clone) { + NeoForge.EVENT_BUS.post(new PlayerEvent.ItemPickupEvent(player, item, clone)); + } + public static void firePlayerCraftingEvent(Player player, ItemStack crafted, Container craftMatrix) { NeoForge.EVENT_BUS.post(new PlayerEvent.ItemCraftedEvent(player, crafted, craftMatrix)); } @@ -904,18 +862,6 @@ public static void firePlayerSmeltedEvent(Player player, ItemStack smelted) { NeoForge.EVENT_BUS.post(new PlayerEvent.ItemSmeltedEvent(player, smelted)); } - /** - * Called by {@link Gui.HeartType#forPlayer} to allow for modification of the displayed heart type in the - * health bar. - * - * @param player The local {@link Player} - * @param heartType The {@link Gui.HeartType} which would be displayed by vanilla - * @return The heart type which should be displayed - */ - public static Gui.HeartType firePlayerHeartTypeEvent(Player player, Gui.HeartType heartType) { - return NeoForge.EVENT_BUS.post(new PlayerHeartTypeEvent(player, heartType)).getType(); - } - /** * Fires {@link EntityTickEvent.Pre}. Called from the head of {@link LivingEntity#tick()}. * @@ -1036,15 +982,10 @@ public static boolean onEffectRemoved(LivingEntity entity, MobEffectInstance eff * @param ench The enchantment being queried for. * @return The new level of the enchantment. */ - public static int getEnchantmentLevelSpecific(int level, ItemStack stack, Holder ench) { - RegistryLookup lookup = ench.unwrapLookup(); - if (lookup == null) { // Pretty sure this is never null, but I can't *prove* that it isn't. - return level; - } - + public static int getEnchantmentLevelSpecific(int level, ItemStack stack, Enchantment ench) { var enchantments = new ItemEnchantments.Mutable(ItemEnchantments.EMPTY); enchantments.set(ench, level); - var event = new GetEnchantmentLevelEvent(stack, enchantments, ench, ench.unwrapLookup()); + var event = new GetEnchantmentLevelEvent(stack, enchantments, ench); NeoForge.EVENT_BUS.post(event); return enchantments.getLevel(ench); } @@ -1056,9 +997,9 @@ public static int getEnchantmentLevelSpecific(int level, ItemStack stack, Holder * @param stack The stack being queried against. * @return The new enchantment map. */ - public static ItemEnchantments getAllEnchantmentLevels(ItemEnchantments enchantments, ItemStack stack, RegistryLookup lookup) { + public static ItemEnchantments getEnchantmentLevel(ItemEnchantments enchantments, ItemStack stack) { var mutableEnchantments = new ItemEnchantments.Mutable(enchantments); - var event = new GetEnchantmentLevelEvent(stack, mutableEnchantments, null, lookup); + var event = new GetEnchantmentLevelEvent(stack, mutableEnchantments, null); NeoForge.EVENT_BUS.post(event); return mutableEnchantments.toImmutable(); } @@ -1075,30 +1016,14 @@ public static ItemEnchantments getAllEnchantmentLevels(ItemEnchantments enchantm */ @ApiStatus.Internal public static void onCreativeModeTabBuildContents(CreativeModeTab tab, ResourceKey tabKey, CreativeModeTab.DisplayItemsGenerator originalGenerator, CreativeModeTab.ItemDisplayParameters params, CreativeModeTab.Output output) { - final var searchDupes = new ObjectLinkedOpenCustomHashSet(ItemStackLinkedSet.TYPE_AND_TAG); - // The ItemStackLinkedSet.TYPE_AND_TAG strategy cannot be used for the MutableHashedLinkedMap due to vanilla - // adding multiple identical ItemStacks with different TabVisibility values. The values also cannot be merged - // because it does not abide by the intended order. For example, vanilla adds all max enchanted books to the - // "ingredient" tab with "parent only" visibility, then also adds all enchanted books again in increasing order - // to their max values but with the "search only" visibility. Because the parent-only is added first and then - // the search-only entries are added after, the max enchantments would show up first and then the enchantments - // in increasing order up to max-1. - final var entries = new MutableHashedLinkedMap(MutableHashedLinkedMap.BASIC, (stack, tabVisibility) -> { - if (!searchDupes.add(stack) && tabVisibility != CreativeModeTab.TabVisibility.SEARCH_TAB_ONLY) { - throw new IllegalStateException( - "Accidentally adding the same item stack twice " - + stack.getDisplayName().getString() - + " to a Creative Mode Tab: " - + tab.getDisplayName().getString()); - } - return true; - }); + final var entries = new MutableHashedLinkedMap(); originalGenerator.accept(params, (stack, vis) -> { if (stack.getCount() != 1) throw new IllegalArgumentException("The stack count must be 1"); entries.put(stack, vis); }); + ModLoader.postEvent(new BuildCreativeModeTabContentsEvent(tab, tabKey, params, entries)); for (var entry : entries) diff --git a/src/main/java/net/neoforged/neoforge/event/entity/living/MobSpawnEvent.java b/src/main/java/net/neoforged/neoforge/event/entity/living/MobSpawnEvent.java index e646db48af..b75d35b116 100644 --- a/src/main/java/net/neoforged/neoforge/event/entity/living/MobSpawnEvent.java +++ b/src/main/java/net/neoforged/neoforge/event/entity/living/MobSpawnEvent.java @@ -8,19 +8,17 @@ import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.SpawnPlacements; -import net.minecraft.world.entity.SpawnPlacements.SpawnPredicate; import net.minecraft.world.level.BaseSpawner; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.SpawnData.CustomSpawnRules; import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.ICancellableEvent; import net.neoforged.fml.LogicalSide; +import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.EntityEvent; -import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; import net.neoforged.neoforge.event.entity.SpawnPlacementRegisterEvent; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -89,13 +87,22 @@ public double getZ() { * Spawn Placement checks include light levels, slime chunks, grass blocks for animals, and others in the same vein.
* The purpose of this event is to permit runtime changes to any or all spawn placement logic without having to wrap the placement for each entity. *

- * This event is only fired on the {@linkplain LogicalSide#SERVER logical server}. + * This event {@linkplain HasResult has a result}.
+ * To change the result of this event, use {@link #setResult}. Results are interpreted in the following manner: + *

    + *
  • Allow - The check will succeed, and the spawn process will continue.
  • + *
  • Default - The value of the vanilla check will be used to determine success.
  • + *
  • Deny - The check will fail, and the spawn process will abort.
  • + *
+ * This event is fired on the {@linkplain NeoForge#EVENT_BUS main Forge event bus}, + * only on the {@linkplain LogicalSide#SERVER logical server}. *

* This event is not fired for mob spawners which utilize {@link CustomSpawnRules}, as they do not check spawn placements. * * @apiNote If your modifications are for a single entity, and do not vary at runtime, use {@link SpawnPlacementRegisterEvent}. * @see SpawnPlacementRegisterEvent */ + @HasResult public static class SpawnPlacementCheck extends Event { private final EntityType entityType; private final ServerLevelAccessor level; @@ -103,7 +110,6 @@ public static class SpawnPlacementCheck extends Event { private final BlockPos pos; private final RandomSource random; private final boolean defaultResult; - private Result result = Result.DEFAULT; /** * Internal. @@ -168,53 +174,6 @@ public RandomSource getRandom() { public boolean getDefaultResult() { return this.defaultResult; } - - /** - * Changes the result of this event. - * - * @see {@link Result} for the possible states. - */ - public void setResult(Result result) { - this.result = result; - } - - /** - * {@return the result of this event, which controls if the placement check will succeed} - */ - public Result getResult() { - return this.result; - } - - /** - * {@return If the placement check will succeed or not, based on the current event result} - */ - public boolean getPlacementCheckResult() { - if (this.result == Result.SUCCEED) { - return true; - } - return this.result == Result.DEFAULT && this.getDefaultResult(); - } - - public static enum Result { - /** - * Forces the event to cause the placement check to succeed. - */ - SUCCEED, - - /** - * The result of {@link SpawnPredicate#test(EntityType, ServerLevelAccessor, MobSpawnType, BlockPos, RandomSource)} will be used to determine if the check will succeed. - *

- * If the mob does not have a spawn predicate, the check will always succeed. - * - * @see {@link SpawnPlacementCheck#getDefaultResult()} - */ - DEFAULT, - - /** - * Forces the event to cause the placement check to fail. - */ - FAIL; - } } /** @@ -227,17 +186,28 @@ public static enum Result { *

  • Spawn Block - Ocelots check if the below block is grass or leaves.
  • * *

    - * This event is only fired on the {@linkplain LogicalSide#SERVER logical server}. + * These checks are performed by the vanilla methods {@link Mob#checkSpawnRules} and {@link Mob#checkSpawnObstruction}.
    + * The logical-and of both methods forms the default result of this event. + *

    + * This event {@linkplain HasResult has a result}.
    + * To change the result of this event, use {@link #setResult}. Results are interpreted in the following manner: + *

      + *
    • Allow - The position will be accepted, and the spawn process will continue.
    • + *
    • Default - The position will be accepted if {@link Mob#checkSpawnRules} and {@link Mob#checkSpawnObstruction} are both true.
    • + *
    • Deny - The position will not be accepted. The spawn process will abort, and further events will not be called.
    • + *
    + * This event is fired on the {@linkplain NeoForge#EVENT_BUS main Forge event bus}, + * only on the {@linkplain LogicalSide#SERVER logical server}. * * @apiNote This event fires after Spawn Placement checks, which are the primary set of spawn checks. * @see {@link SpawnPlacementRegisterEvent} To modify spawn placements statically at startup. * @see {@link SpawnPlacementCheck} To modify the result of spawn placements at runtime. */ + @HasResult public static class PositionCheck extends MobSpawnEvent { @Nullable private final BaseSpawner spawner; private final MobSpawnType spawnType; - private Result result = Result.DEFAULT; public PositionCheck(Mob mob, ServerLevelAccessor level, MobSpawnType spawnType, @Nullable BaseSpawner spawner) { super(mob, level, mob.getX(), mob.getY(), mob.getZ()); @@ -265,40 +235,30 @@ public BaseSpawner getSpawner() { public MobSpawnType getSpawnType() { return this.spawnType; } + } - /** - * Changes the result of this event. - * - * @see {@link Result} for the possible states. - */ - public void setResult(Result result) { - this.result = result; - } - - /** - * {@return the result of this event, which controls if the position check will succeed} - */ - public Result getResult() { - return this.result; - } - - public static enum Result { - /** - * Forces the event to cause the position check to succeed. - */ - SUCCEED, - - /** - * The results of {@link Mob#checkSpawnRules(LevelAccessor, MobSpawnType)} and {@link Mob#checkSpawnObstruction(LevelReader)} will be used to determine if the check will succeed. - *

    - * If this is being called from a spawner, the {@link Mob#checkSpawnRules(LevelAccessor, MobSpawnType)} call will be skipped if any {@link CustomSpawnRules} are present. - */ - DEFAULT, - - /** - * Forces the event to cause the position check to fail. - */ - FAIL; + /** + * This event is fired from {@link Mob#checkDespawn()}.
    + * It fires once per tick per mob that is attempting to despawn.
    + * It is not fired if the mob is persistent (meaning it may not despawn).
    + *

    + * This event is not {@linkplain ICancellableEvent cancellable}, but does {@linkplain HasResult have a result}. + * {@link Result#DEFAULT} indicates that default despawn mechanics should be used. + * {@link Result#ALLOW} indicates that the mob should forcefully despawn. + * {@link Result#DENY} indicates that the mob should forcefully stay spawned. + *

    + * This event is fired on the {@linkplain NeoForge#EVENT_BUS main Forge event bus}, + * only on the {@linkplain LogicalSide#SERVER logical server}. + * + * @see LivingEntity#checkDespawn() + * @author cpw + */ + // TODO: 1.20 Move to standalone class, as it is unrelated to the complex mob spawning flow. + // Such a refactor will allow the BaseSpawner and MobSpawnType params to be hoisted to MobSpawnEvent. + @HasResult + public static class AllowDespawn extends MobSpawnEvent { + public AllowDespawn(Mob mob, ServerLevelAccessor level) { + super(mob, level, mob.getX(), mob.getY(), mob.getZ()); } } } diff --git a/src/main/java/net/neoforged/neoforge/fluids/crafting/FluidIngredient.java b/src/main/java/net/neoforged/neoforge/fluids/crafting/FluidIngredient.java index 0fc411645d..e2a2e8bd8e 100644 --- a/src/main/java/net/neoforged/neoforge/fluids/crafting/FluidIngredient.java +++ b/src/main/java/net/neoforged/neoforge/fluids/crafting/FluidIngredient.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.function.Predicate; import java.util.stream.Stream; +import javax.annotation.Nullable; import net.minecraft.core.Holder; import net.minecraft.core.NonNullList; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -25,7 +26,6 @@ import net.neoforged.neoforge.common.util.NeoForgeExtraCodecs; import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.registries.NeoForgeRegistries; -import org.jetbrains.annotations.Nullable; /** * This class serves as the fluid analogue of an item {@link Ingredient}, diff --git a/src/main/java/net/neoforged/neoforge/server/command/generation/GenerationTask.java b/src/main/java/net/neoforged/neoforge/server/command/generation/GenerationTask.java index ae841912e9..a68dbc7f4f 100644 --- a/src/main/java/net/neoforged/neoforge/server/command/generation/GenerationTask.java +++ b/src/main/java/net/neoforged/neoforge/server/command/generation/GenerationTask.java @@ -157,7 +157,7 @@ private void enqueueChunks(LongList chunks) { continue; } - holder.scheduleChunkGenerationTask(ChunkStatus.FULL, chunkMap).whenCompleteAsync((result, throwable) -> { + holder.getOrScheduleFuture(ChunkStatus.FULL, chunkMap).whenCompleteAsync((result, throwable) -> { if (throwable == null) { this.acceptChunkResult(chunkLongPos, result); } else { diff --git a/src/main/resources/assets/neoforge/lang/da_dk.json b/src/main/resources/assets/neoforge/lang/da_dk.json index 4b9b71293d..ab9d27a860 100644 --- a/src/main/resources/assets/neoforge/lang/da_dk.json +++ b/src/main/resources/assets/neoforge/lang/da_dk.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Click to get to the homepage of this mod", "fml.modmismatchscreen.table.reason": "Årsag", "fml.modmismatchscreen.table.visit.mod_page": "Open the mod page of the mod that registers the channel: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resource pack", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "This channel is missing on the server side, but required on the client!", "neoforge.network.negotiation.failure.missing.server.client": "This channel is missing on the client side, but required on the server!", "neoforge.network.negotiation.failure.flow.client.missing": "The client wants the payload to flow: %s, but the server does not support it!", diff --git a/src/main/resources/assets/neoforge/lang/de_de.json b/src/main/resources/assets/neoforge/lang/de_de.json index b57615cb88..4736194de4 100644 --- a/src/main/resources/assets/neoforge/lang/de_de.json +++ b/src/main/resources/assets/neoforge/lang/de_de.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Klicke hier, um zur Homepage dieser Mod zu gelangen", "fml.modmismatchscreen.table.reason": "Grund", "fml.modmismatchscreen.table.visit.mod_page": "Öffne die Mod-Seite der Mod, die folgenden Kanal registriert: %s", - "fml.modmismatchscreen.simplifiedview": "Vereinfachte Ansicht", "fml.resources.modresources": "Ressourcen für %1$s Mod-Dateien", "fml.resources.moddata": "Daten für %1$s Mod-Dateien", "loadwarning.neoforge.prbuild": "Diese Version von NeoForge wurde von einem Communitymitglied erstellt und wird daher §c§lNICHT UNTERSTÜTZT§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge Daten-/Ressourcenpaket", "pack.neoforge.source.child": "untergeordnet", - "neoforge.network.negotiation.failure.mod": "Kanal von Mod \"%1$s\" konnte sich nicht verbinden: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "Dieser Kanal fehlt auf der Serverseite, wird aber auf dem Client benötigt!", "neoforge.network.negotiation.failure.missing.server.client": "Dieser Kanal fehlt auf der Client-Seite, wird aber auf dem Server benötigt!", "neoforge.network.negotiation.failure.flow.client.missing": "Der Client möchte, dass die Payload in Richtung: %s fließt, aber der Server unterstützt dies nicht!", diff --git a/src/main/resources/assets/neoforge/lang/en_gb.json b/src/main/resources/assets/neoforge/lang/en_gb.json index 176ab208b1..f860ee9017 100644 --- a/src/main/resources/assets/neoforge/lang/en_gb.json +++ b/src/main/resources/assets/neoforge/lang/en_gb.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Click to get to the homepage of this mod", "fml.modmismatchscreen.table.reason": "Reason", "fml.modmismatchscreen.table.visit.mod_page": "Open the mod page of the mod that registers the channel: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resource pack", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "This channel is missing on the server side, but required on the client!", "neoforge.network.negotiation.failure.missing.server.client": "This channel is missing on the client side, but required on the server!", "neoforge.network.negotiation.failure.flow.client.missing": "The client wants the payload to flow: %s, but the server does not support it!", diff --git a/src/main/resources/assets/neoforge/lang/es_es.json b/src/main/resources/assets/neoforge/lang/es_es.json index a16060d6d4..c52d1e4af9 100644 --- a/src/main/resources/assets/neoforge/lang/es_es.json +++ b/src/main/resources/assets/neoforge/lang/es_es.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Haz clic para ir a la página principal de este mod", "fml.modmismatchscreen.table.reason": "Razón", "fml.modmismatchscreen.table.visit.mod_page": "Abrir la página de mods del mod que registra el canal: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "Esta versión de NeoForge ha sido creada por un miembro de la comunidad y por lo tanto no es §c§lSOPORTADA§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "Paquete de recursos de NeoForge", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "Este canal no está en el lado del servidor, ¡pero es necesario en el cliente!", "neoforge.network.negotiation.failure.missing.server.client": "Este canal no está en el lado del cliente, ¡pero es necesario en el servidor!", "neoforge.network.negotiation.failure.flow.client.missing": "El cliente quiere que el payload fluya: %s, ¡pero el servidor no lo admite!", diff --git a/src/main/resources/assets/neoforge/lang/et_ee.json b/src/main/resources/assets/neoforge/lang/et_ee.json index a528fff76c..1209b455df 100644 --- a/src/main/resources/assets/neoforge/lang/et_ee.json +++ b/src/main/resources/assets/neoforge/lang/et_ee.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Klõpsa, et jõuda selle modi kodulehele", "fml.modmismatchscreen.table.reason": "Põhjus", "fml.modmismatchscreen.table.visit.mod_page": "Ava modi modileht, mis registreerib kanali: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "See NeoForge versioon loodi kogukonnaliikme poolt ning on seega §c§lMITTETOETATUD§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge andme-/ressursipakk", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "See kanal puudub serveri poolel, ent on nõutud kliendi poolel!", "neoforge.network.negotiation.failure.missing.server.client": "See kanal puudub kliendi poolel, ent on nõutud serveri poolel!", "neoforge.network.negotiation.failure.flow.client.missing": "Klient soovib, et last liiguks: %s, kuid server seda ei toeta!", diff --git a/src/main/resources/assets/neoforge/lang/fr_fr.json b/src/main/resources/assets/neoforge/lang/fr_fr.json index 40cb91d7ff..690fc0c062 100644 --- a/src/main/resources/assets/neoforge/lang/fr_fr.json +++ b/src/main/resources/assets/neoforge/lang/fr_fr.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Cliquez pour accéder à la page d'accueil de ce mod", "fml.modmismatchscreen.table.reason": "Raison", "fml.modmismatchscreen.table.visit.mod_page": "Ouvrir la page du mod qui enregistre le canal : %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "Ce build de NeoForge a été créé par un membre de la communauté et est donc §c§lUNSUPPORTED§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "Pack de ressources/données de NeoForge", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "Ce canal est manquant du côté du serveur, mais requis par le client !", "neoforge.network.negotiation.failure.missing.server.client": "Ce canal est manquant du côté du client, mais requis par le serveur !", "neoforge.network.negotiation.failure.flow.client.missing": "Le client souhaite que les données passent par : %s, mais le serveur ne le supporte pas !", diff --git a/src/main/resources/assets/neoforge/lang/hu_hu.json b/src/main/resources/assets/neoforge/lang/hu_hu.json index c7ba155191..fa60188cd0 100644 --- a/src/main/resources/assets/neoforge/lang/hu_hu.json +++ b/src/main/resources/assets/neoforge/lang/hu_hu.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Kattintson ide a mod kezdőlapjának eléréséhez", "fml.modmismatchscreen.table.reason": "Ok", "fml.modmismatchscreen.table.visit.mod_page": "Open the mod page of the mod that registers the channel: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resource pack", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "This channel is missing on the server side, but required on the client!", "neoforge.network.negotiation.failure.missing.server.client": "This channel is missing on the client side, but required on the server!", "neoforge.network.negotiation.failure.flow.client.missing": "The client wants the payload to flow: %s, but the server does not support it!", diff --git a/src/main/resources/assets/neoforge/lang/it_it.json b/src/main/resources/assets/neoforge/lang/it_it.json index bb458d8a6a..7b8f9960b7 100644 --- a/src/main/resources/assets/neoforge/lang/it_it.json +++ b/src/main/resources/assets/neoforge/lang/it_it.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Fare clic per raggiungere la pagina principale di questa mod", "fml.modmismatchscreen.table.reason": "Ragione", "fml.modmismatchscreen.table.visit.mod_page": "Apri la pagina della mod che registra il canale: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "Questa build di NeoForge è stata creata da un membro della community ed è quindi §c§lNON SUPPORTATA§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "Pacchetto dati/risorse NeoForge", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "Questo canale manca sul lato del server, ma è richiesto sul client!", "neoforge.network.negotiation.failure.missing.server.client": "Questo canale manco sul lato del client, ma è richiesto sul server!", "neoforge.network.negotiation.failure.flow.client.missing": "Il client vuole che il payload scorra: %s, ma il server non lo supporta!", diff --git a/src/main/resources/assets/neoforge/lang/ja_jp.json b/src/main/resources/assets/neoforge/lang/ja_jp.json index bdc15a0789..808a8a23bb 100644 --- a/src/main/resources/assets/neoforge/lang/ja_jp.json +++ b/src/main/resources/assets/neoforge/lang/ja_jp.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "クリックすると、このModのホームページに移動します", "fml.modmismatchscreen.table.reason": "原因:", "fml.modmismatchscreen.table.visit.mod_page": "チャンネルを登録するModのページを開きます:%s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "%1$s個のModファイルのリソース", "fml.resources.moddata": "%1$s個のModファイルのデータ", "loadwarning.neoforge.prbuild": "このNeoForgeのビルドはコミュニティメンバーによって作成されたものであり、§c§lサポートされていません§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge データ/リソースパック", "pack.neoforge.source.child": "子", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "このチャンネルはサーバー側にありませんが、クライアント側で必要です!", "neoforge.network.negotiation.failure.missing.server.client": "このチャンネルはクライアント側にありませんが、サーバー側で必要です!", "neoforge.network.negotiation.failure.flow.client.missing": "クライアントはペイロードの%sにフローすることを希望していますが、サーバーはそれをサポートしていません!", diff --git a/src/main/resources/assets/neoforge/lang/ko_kr.json b/src/main/resources/assets/neoforge/lang/ko_kr.json index 7a61257b44..05915bd97e 100644 --- a/src/main/resources/assets/neoforge/lang/ko_kr.json +++ b/src/main/resources/assets/neoforge/lang/ko_kr.json @@ -8,177 +8,175 @@ "fml.menu.mods.config": "설정", "fml.menu.mods.openmodsfolder": "모드 폴더 열기", "fml.menu.modoptions": "모드 설정...", - "fml.menu.mods.info.version": "버전: %1$s", - "fml.menu.mods.info.idstate": "모드 ID: %1$s 상태: {1,lower}", - "fml.menu.mods.info.credits": "도움을 준 이들: %1$s", - "fml.menu.mods.info.authors": "제작자들: %1$s", - "fml.menu.mods.info.displayurl": "홈페이지: %1$s", - "fml.menu.mods.info.license": "라이선스: %1$s", - "fml.menu.mods.info.securejardisabled": "보안 기능이 비활성화됐습니다, JDK를 업데이트 해주세요", - "fml.menu.mods.info.signature": "파일 서명: %1$s", + "fml.menu.mods.info.version": "Version: %1$s", + "fml.menu.mods.info.idstate": "ModID: %1$s State: {1,lower}", + "fml.menu.mods.info.credits": "Credits: %1$s", + "fml.menu.mods.info.authors": "Authors: %1$s", + "fml.menu.mods.info.displayurl": "Homepage: %1$s", + "fml.menu.mods.info.license": "License: %1$s", + "fml.menu.mods.info.securejardisabled": "모드 보안 기능이 비활성화됐습니다, JDK를 업데이트 해주세요", + "fml.menu.mods.info.signature": "Signature: %1$s", "fml.menu.mods.info.signature.unsigned": "서명 없음", - "fml.menu.mods.info.trust": "신뢰성: %1$s", + "fml.menu.mods.info.trust": "Trust: %1$s", "fml.menu.mods.info.trust.noauthority": "없음", "fml.menu.mods.info.nochildmods": "하위 모드 없음", - "fml.menu.mods.info.childmods": "하위 모드들: %1$s", - "fml.menu.mods.info.updateavailable": "업데이트 설치 가능: %1$s", + "fml.menu.mods.info.childmods": "Child mods: %1$s", + "fml.menu.mods.info.updateavailable": "Update available: %1$s", "fml.menu.mods.info.changelogheader": "변경 사항:", - "fml.menu.multiplayer.compatible": "호환되는 FML 모드 서버\n모드 {0,choice,1#1|1<%1$s}개 설치됨", + "fml.menu.multiplayer.compatible": "Compatible FML modded server\n{0,choice,1#1 mod|1<%1$s mods} present", "fml.menu.multiplayer.incompatible": "호환되지 않는 FML 모드 서버", - "fml.menu.multiplayer.incompatible.extra": "호환되지 않는 FML 모드 서버\n%1$s", + "fml.menu.multiplayer.incompatible.extra": "Incompatible FML modded server\n%1$s", "fml.menu.multiplayer.truncated": "프로토콜의 크기 제한 때문에 데이터가 부정확할 수 있습니다.", "fml.menu.multiplayer.vanilla": "바닐라 서버", "fml.menu.multiplayer.vanilla.incompatible": "호환되지 않는 바닐라 서버", - "fml.menu.multiplayer.unknown": "알 수 없는 서버 %1$s", - "fml.menu.multiplayer.serveroutdated": "구버전 네오 포지 서버 네트워크", - "fml.menu.multiplayer.clientoutdated": "구버전 네오 포지 클라이언트 네트워크", - "fml.menu.multiplayer.extraservermods": "해당 서버에 접속하기 위해 다른 모드들이 필요할 수 있습니다.", + "fml.menu.multiplayer.unknown": "Unknown server %1$s", + "fml.menu.multiplayer.serveroutdated": "구버전 Forge 서버 네트워크", + "fml.menu.multiplayer.clientoutdated": "구버전 NeoForge 클라이언트 네트워크", + "fml.menu.multiplayer.extraservermods": "해당 서버에 접속하려면 설치해야 하는 모드들이 있을 수 있습니다", "fml.menu.multiplayer.modsincompatible": "호환되지 않는 서버 모드 목록", "fml.menu.multiplayer.networkincompatible": "서버의 네트워크 메시지들이 호환되지 않음", - "fml.menu.multiplayer.missingdatapackregistries": "필요한 데이터팩 레지스트리가 누락됨: %1$s", - "fml.menu.loadingmods": "모드 {0,choice,0#No mods|1#1|1<%s}개 불러옴", + "fml.menu.multiplayer.missingdatapackregistries": "Missing required datapack registries: %1$s", + "fml.menu.loadingmods": "{0,choice,0#No mods|1#1 mod|1<%s mods} loaded", "fml.menu.notification.title": "시작 알림", "fml.menu.accessdenied.title": "서버 접속이 거부되었습니다", - "fml.menu.accessdenied.message": "Fancy Mod Loader가 서버에 접속할 수 없습니다.\n이 서버(%1$s)는 모드가 설치된 클라이언트의 접속을 거부합니다.", + "fml.menu.accessdenied.message": "Fancy Mod Loader could not connect to this server\nThe server %1$s has forbidden modded access", "fml.menu.backupfailed.title": "백업에 실패함", - "fml.menu.backupfailed.message": "백업 파일 %1$s을(를) 저장하는 도중 오류가 발생했습니다.\n문제 해결 후 다시 시도해 주세요.", - "fml.button.open.file": "%1$s 열기", + "fml.menu.backupfailed.message": "There was an error saving the archive %1$s\nPlease fix the problem and try again", + "fml.button.open.file": "Open %1$s", "fml.button.open.log": "출력 로그 열기", "fml.button.open.crashreport": "충돌 보고서 열기", "fml.button.open.mods.folder": "모드 폴더 열기", "fml.button.continue.launch": "메인 메뉴로 이동", - "fml.modmismatchscreen.missingmods.client": "서버 접속에 필요한 모드 일부가 클라이언트에 없습니다. 서버에 접속하려면 아래 모드를 설치해야 합니다:", - "fml.modmismatchscreen.missingmods.server": "클라이언트에 서버와 호환되지 않는 모드가 설치되어 있습니다. 서버에 접속하려면 아래 모드를 제거해야 합니다:", - "fml.modmismatchscreen.mismatchedmods": "서버와 클라이언트에 설치된 모드들의 버전이 호환되지 않아 접속할 수 없습니다. 서버에 접속하려면 아래 모드를 서버와 동일한 버전으로 설치해야 합니다:", + "fml.modmismatchscreen.missingmods.client": "클라이언트 내 일부 모드가 누락됐습니다, 아래 모드를 설치해야 서버에 참가할 수 있습니다:", + "fml.modmismatchscreen.missingmods.server": "서버 내 일부 모드가 누락됐습니다, 클라이언트 내에서 아래 모드를 제거해야 서버에 참가할 수 있습니다:", + "fml.modmismatchscreen.mismatchedmods": "일부 모드의 버전이 일치하지 않습니다, 서버와 아래 모드의 버전을 동일하게 설치해야 서버에 참가할 수 있습니다:", "fml.modmismatchscreen.table.channelname": "채널 이름", "fml.modmismatchscreen.table.youneed": "필요한 것:", "fml.modmismatchscreen.table.youhave": "현재 설치된 것:", "fml.modmismatchscreen.table.serverhas": "서버에 설치된 것:", - "fml.modmismatchscreen.additional": "[그 외 %1$s개, 전체 목록은 latest.log 참고]", - "fml.modmismatchscreen.homepage": "여기를 클릭해 해당 모드의 홈페이지를 여세요.", + "fml.modmismatchscreen.additional": "[%1$s additional, see latest.log for the full list]", + "fml.modmismatchscreen.homepage": "링크를 클릭해 해당 모드의 홈페이지를 여세요", "fml.modmismatchscreen.table.reason": "이유", - "fml.modmismatchscreen.table.visit.mod_page": "이 채널을 등록한 모드(%s)의 페이지를 엽니다.", - "fml.modmismatchscreen.simplifiedview": "간략하게 보기", - "fml.resources.modresources": "모드 파일 %1$s개의 리소스", - "fml.resources.moddata": "모드 파일 %1$s개의 데이터", - "loadwarning.neoforge.prbuild": "이 네오 포지 빌드는 커뮤니티 멤버가 만든 것이며 §c§l공식 지원되지 않습니다§r", - "commands.neoforge.arguments.enum.invalid": "잘못된 값입니다. [%1$s] 중 하나가 필요한데, '%2$s'가 입력되었습니다.", - "commands.neoforge.dimensions.list": "현재 등록된 차원들:", - "commands.neoforge.dump.success": "%s 레지스트리의 내용을 파일 %s에 출력했습니다.", - "commands.neoforge.dump.failure": "%s 레지스트리의 내용을 파일 %s에 출력하는 데 실패했습니다.", + "fml.modmismatchscreen.table.visit.mod_page": "이 채널을 등록하는 모드(%s)의 페이지를 엽니다", + "fml.resources.modresources": "Resources for %1$s mod files", + "fml.resources.moddata": "Data for %1$s mod files", + "loadwarning.neoforge.prbuild": "이 NeoForge 빌드는 커뮤니티 멤버가 만든 것이며 §c§l지원되지 않습니다§r", + "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", + "commands.neoforge.dimensions.list": "현재 등록된 차원의 종류별 목록:", + "commands.neoforge.dump.success": "%s 레지스트리의 내용을 파일 %s에 출력했습니다", + "commands.neoforge.dump.failure": "%s 레지스트리의 내용을 파일 %s에 출력하는데 실패했습니다", "commands.neoforge.dump.error.unknown_registry": "알 수 없는 레지스트리 '%s'", - "commands.neoforge.entity.list.invalid": "잘못된 필터입니다. 일치하는 엔티티를 찾을 수 없습니다. /neoforge entity list에서 올바른 필터 목록을 참고하세요.", - "commands.neoforge.entity.list.invalidworld": "차원 '%1$s'의 세계를 불러올 수 없습니다. 올바른 차원을 선택해 주세요.", - "commands.neoforge.entity.list.none": "개체를 찾을 수 없습니다.", - "commands.neoforge.entity.list.single.header": "엔티티: %1$s 전체: %2$s개", - "commands.neoforge.entity.list.multiple.header": "전체: %1$s개", - "commands.neoforge.setdim.invalid.entity": "'%1$s'은(는) 잘못된 엔티티입니다.", - "commands.neoforge.setdim.invalid.dim": "'%1$s'은(는) 잘못된 차원입니다.", - "commands.neoforge.setdim.invalid.nochange": "해당 엔티티('%1$s')은(는) 이미 지정된 차원('%2$s')에 있습니다.", - "commands.neoforge.setdim.deprecated": "이 명령어는 1.17에서 제거될 예정입니다. %s을(를) 대신 사용하세요.", - "commands.neoforge.tps.invalid": "'%1$s'은(는) 잘못된 차원입니다. 올바른 차원들: %2$s", - "commands.neoforge.tps.summary.all": "총합: 평균 틱 처리 시간: %1$s ms. 평균 TPS: %2$s", - "commands.neoforge.mods.list": "모드 목록: %1$s", - "commands.neoforge.tps.summary.basic": "차원 %1$s: 평균 틱 처리 시간: %2$s ms. 평균 TPS: %3$s", - "commands.neoforge.tps.summary.named": "차원 %1$s (%2$s): 평균 틱 처리 시간: %3$s ms. 평균 TPS: %4$s", - "commands.neoforge.tracking.entity.enabled": "엔티티 처리 시간을 %d초간 수집합니다...", - "commands.neoforge.tracking.entity.reset": "엔티티 처리 시간 정보를 삭제합니다!", - "commands.neoforge.tracking.invalid": "처리 시간 정보가 손상되었습니다.", - "commands.neoforge.tracking.be.enabled": "블록 엔티티 처리 시간을 %d초간 수집합니다...", - "commands.neoforge.tracking.be.reset": "블록 엔티티 처리 시간 정보를 삭제합니다!", + "commands.neoforge.entity.list.invalid": "잘못된 필터입니다, 일치하는 엔티티를 찾을 수 없습니다. /neoforge entity list 를 통해 올바른 필터 목록을 참고하세요.", + "commands.neoforge.entity.list.invalidworld": "Could not load world for dimension %1$s. Please select a valid dimension.", + "commands.neoforge.entity.list.none": "해당 엔티티를 찾을 수 없습니다.", + "commands.neoforge.entity.list.single.header": "Entity: %1$s Total: %2$s", + "commands.neoforge.entity.list.multiple.header": "Total: %1$s", + "commands.neoforge.setdim.invalid.entity": "The entity selected (%1$s) is not valid.", + "commands.neoforge.setdim.invalid.dim": "The dimension ID specified (%1$s) is not valid.", + "commands.neoforge.setdim.invalid.nochange": "The entity selected (%1$s) is already in the dimension specified (%2$s).", + "commands.neoforge.setdim.deprecated": "이 명령어는 1.17에서 제거될 예정입니다, %s 을(를) 대신 사용하세요.", + "commands.neoforge.tps.invalid": "Invalid dimension %1$s Possible values: %2$s", + "commands.neoforge.tps.summary.all": "Overall: Mean tick time: %1$s ms. Mean TPS: %2$s", + "commands.neoforge.mods.list": "Mod List: %1$s", + "commands.neoforge.tps.summary.basic": "Dim %1$s: Mean tick time: %2$s ms. Mean TPS: %3$s", + "commands.neoforge.tps.summary.named": "Dim %1$s (%2$s): Mean tick time: %3$s ms. Mean TPS: %4$s", + "commands.neoforge.tracking.entity.enabled": "엔티티 추적이 %d초 동안 활성화되었습니다.", + "commands.neoforge.tracking.entity.reset": "엔티티 타이밍 데이터를 비웠습니다!", + "commands.neoforge.tracking.invalid": "잘못된 추적 데이터입니다.", + "commands.neoforge.tracking.be.enabled": "블록 엔티티 추적을 %d초 동안 활성화했습니다.", + "commands.neoforge.tracking.be.reset": "블록 엔티티 타이밍 데이터를 비웠습니다!", "commands.neoforge.tracking.timing_entry": "%1$s - %2$s [%3$s, %4$s, %5$s]: %6$s", - "commands.neoforge.tracking.no_data": "아직 수집된 정보가 없습니다.", + "commands.neoforge.tracking.no_data": "아직 기록된 데이터가 없습니다.", "commands.neoforge.tags.error.unknown_registry": "알 수 없는 레지스트리 '%s'", - "commands.neoforge.tags.error.unknown_tag": "레지스트리 {1}의 알 수 없는 태그 {0}", - "commands.neoforge.tags.error.unknown_element": "레지스트리 {1}의 알 수 없는 요소 {0}", + "commands.neoforge.tags.error.unknown_tag": "레지스트리 {1} 의 알 수 없는 태그 {0}", + "commands.neoforge.tags.error.unknown_element": "레지스트리 {1} 의 알 수 없는 요소 {0}", "commands.neoforge.tags.registry_key": "%s", - "commands.neoforge.tags.tag_count": "태그 수: %s", - "commands.neoforge.tags.copy_tag_names": "여기를 클릭해 모든 태그 이름들을 복사하세요.", + "commands.neoforge.tags.tag_count": "레지스트리의 태그 수: %s", + "commands.neoforge.tags.copy_tag_names": "클릭하여 모든 태그 이름들을 클립보드에 복사하세요.", "commands.neoforge.tags.element_count": "요소 개수: %s", - "commands.neoforge.tags.copy_element_names": "여기를 클릭해 모든 요소 이름들을 복사하세요.", + "commands.neoforge.tags.copy_element_names": "클릭하여 모든 요소 이름들을 클립보드에 복사하세요.", "commands.neoforge.tags.tag_key": "%s / %s", "commands.neoforge.tags.containing_tag_count": "해당 요소의 태그 수: %s", "commands.neoforge.tags.element": "%s : %s", - "commands.neoforge.tags.page_info": "%s ", - "commands.neoforge.chunkgen.progress_bar_title": "청크 생성 중...", - "commands.neoforge.chunkgen.progress_bar_progress": "청크 %1$s개 생성 중 - ", - "commands.neoforge.chunkgen.progress_bar_errors": "(오류 %1$s개 발생!)", - "commands.neoforge.chunkgen.already_running": "이미 청크를 생성 중입니다. 청크 생성을 다시 시작하려면 먼저 '/neoforge generate stop'으로 중단하세요.", - "commands.neoforge.chunkgen.started": "%2$s×%3$s 청크 (%4$s×%5$s 블록) 범위 안에 청크 %1$s개 생성 중.", + "commands.neoforge.tags.page_info": "{0} <{2}쪽 중 {1}쪽>", + "commands.neoforge.chunkgen.progress_bar_title": "청크 생성중...", + "commands.neoforge.chunkgen.progress_bar_progress": "Generating %1$s chunks - ", + "commands.neoforge.chunkgen.progress_bar_errors": "(%1$s errors!)", + "commands.neoforge.chunkgen.already_running": "생성이 이미 진행 중입니다. 새로 만들려면 먼저 '/neoforge generate stop' 을 실행하십시오.", + "commands.neoforge.chunkgen.started": "Generating %1$s chunks, in an area of %2$sx%3$s chunks (%4$sx%5$s blocks).", "commands.neoforge.chunkgen.success": "생성 완료!", - "commands.neoforge.chunkgen.error": "청크 생성 중 %1$s개의 오류가 발생했습니다! 출력 로그에서 자세한 내용을 확인하세요.", - "commands.neoforge.chunkgen.stopped": "청크 생성 중단됨! %1$s/%2$s개의 청크를 생성했습니다. (%3$s%)", - "commands.neoforge.chunkgen.status": "청크 생성 진행률! %1$s/%2$s개의 청크를 생성했습니다. (%3$s%)", - "commands.neoforge.chunkgen.not_running": "현재 청크를 생성하고 있지 않습니다. `/neoforge generate help`를 참고하여 청크 사전 생성 명령어 사용 방법을 확인하세요.", - "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start <범위> [진행률 표시] §r§f- 주어진 위치를 중심으로 범위 * 2 길이의 정사각형 구역 내 청크를 생성합니다.\n§2/neoforge generate stop §r§f- 진행 중인 청크 사전 생성을 중단하고 진행률을 표시합니다.\n§2/neoforge generate status §r- 이미 진행 중인 청크 생성 작업의 진행률을 표시합니다.\n§2/neoforge generate help §r- 이 도움말을 표시합니다.\n팁: 다른 차원의 청크를 사전 생성할 땐 '/execute in <차원> neoforge generate...' 식으로 다른 차원에서 명령을 실행하세요.", - "commands.config.getwithtype": "모드 %s의 설정 %s이(가) %s에서 발견됨", - "commands.config.noconfig": "모드 %s의 설정 %s을(를) 찾을 수 없음", - "neoforge.update.beta.1": "%s경고: %s 네오 포지 베타 버전입니다", - "neoforge.update.beta.2": "아직 불안정하니, 오류 발생 시 확인 후 신고해 주세요.", - "neoforge.update.newversion": "새로운 네오 포지 버전으로 업데이트할 수 있습니다: %s", + "commands.neoforge.chunkgen.error": "Generation experienced %1$s errors! Check the log for more information.", + "commands.neoforge.chunkgen.stopped": "Generation stopped! %1$s out of %2$s chunks generated. (%3$s%)", + "commands.neoforge.chunkgen.status": "Generation status! %1$s out of %2$s chunks generated. (%3$s%)", + "commands.neoforge.chunkgen.not_running": "현재 청크를 미리 생성하고 있지 않습니다. `/neoforge generate help`를 참고하여 청크 사전 생성 명령어 사용 방법을 확인하세요.", + "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start <범위> [진행률 표시] §r§f- 주어진 위치를 중심으로 범위 * 2 길이의 정사각형 구역 내 청크를 생성함.\n§2/neoforge generate stop §r§f- 진행중인 청크 사전 생성을 중단하고 진행률을 표시함.\n§2/neoforge generate status §r- 진행중인 청크 사전 생성의 진행률을 표시함.\n§2/neoforge generate help §r- 이 도움말 표시.\n팁: 다른 차원의 청크를 사전 생성할 땐 /execute in <차원> neoforge generate... 형식으로 사용함.", + "commands.config.getwithtype": "모드 %s의 설정 %s이 %s에서 발견됨", + "commands.config.noconfig": "모드 %s의 설정 %s을 찾을 수 없음", + "neoforge.update.beta.1": "%s경고: %sForge 배타 버전입니다", + "neoforge.update.beta.2": "심각한 문제가 발생할 수 있습니다, 확인 후 신고해 주세요.", + "neoforge.update.newversion": "새로운 포지 버전으로 업데이트할 수 있습니다: %s", "neoforge.menu.updatescreen.title": "모드 업데이트", - "neoforge.configgui.removeErroringEntities.tooltip": "엔티티 업데이트 중 오류 발생 시, 서버를 종료하고 오류 보고를 하는 대신, 해당 엔티티를 가차 없이 제거합니다. 주의: *이로 인해 서버가 고장날 수 있으니, 조심스럽게 소규모로만 사용하세요.*", + "neoforge.configgui.removeErroringEntities.tooltip": "엔티티 업데이트중 오류 발생시, 서버를 종료하고 오류 보고를 하는 대신, 해당 엔티티를 가차없이 제거합니다. 주의: *이로 인해 모든게 망가질 수 있으니, 조심스럽게 소규모로만 사용하세요. 이로 인해 발생하는 피해는 전혀 책임지지 않습니다.*", "neoforge.configgui.removeErroringEntities": "오류가 나는 엔티티 제거", - "neoforge.configgui.removeErroringBlockEntities.tooltip": "블록 엔티티 업데이트 중 오류 발생 시, 서버를 종료하고 오류 보고를 하는 대신, 해당 블록 엔티티를 가차없이 제거합니다. 주의: *이로 인해 서버가 고장날 수 있으니, 조심스럽게 소규모로만 사용하세요.*", + "neoforge.configgui.removeErroringBlockEntities.tooltip": "엔티티 업데이트중 오류 발생시, 서버를 종료하고 오류 보고를 하는 대신, 해당 블록 엔티티를 가차없이 제거합니다. 주의: *이로 인해 모든게 망가질 수 있으니, 조심스럽게 소규모로만 사용하세요. 이로 인해 발생하는 피해는 전혀 책임지지 않습니다.*", "neoforge.configgui.removeErroringBlockEntities": "오류가 발생한 블록 엔티티 제거", - "neoforge.configgui.fullBoundingBoxLadders.tooltip": "엔티티의 위치만 확인하는 것이 아니라, 엔티티의 히트박스 전체를 사다리와 비교합니다. 게임 플레이에 지장을 주는 설정이라 기본적으로 비활성화되어 있습니다.", + "neoforge.configgui.fullBoundingBoxLadders.tooltip": "활성화시, 엔티티의 위치만 확인하는 것이 아니라, 엔티티의 히트박스 전체를 사다리와 비교합니다. 게임 플레이에 눈에 띄는 변화를 일으키니 기본적으로 비활성화 되어있습니다.", "neoforge.configgui.fullBoundingBoxLadders": "사다리 히트박스 전체 검사", - "neoforge.configgui.logCascadingWorldGeneration.tooltip": "지형을 꾸미다 발생하는 폭발적 월드 생성 문제를 로그에 출력합니다.", - "neoforge.configgui.logCascadingWorldGeneration": "폭발적 세계 생성시 로그에 출력하기", - "neoforge.configgui.fixVanillaCascading.tooltip": "폭발적으로 세계를 생성하는 바닐라 마인크래프트의 문제를 해결합니다. 활성화 시 생성되는 월드가 바뀌니 주의하세요.", + "neoforge.configgui.logCascadingWorldGeneration.tooltip": "지형을 꾸미면서 발생하는 폭발적 월드 생성 문제를 로그에 출력합니다.", + "neoforge.configgui.logCascadingWorldGeneration": "폭발적 월드 생성 로그에 출력하기", + "neoforge.configgui.fixVanillaCascading.tooltip": "폭발적인 월드 생성을 일으키는 바닐라 마인크래프트의 문제를 해겨합니다. 활성화시 월드 생성 방식이 바뀔 것이기에, 생성된 월드가 달라지는 것은 당연합니다, 그러니 이에 대한 버그 제보를 하지 마세요.", "neoforge.configgui.fixVanillaCascading": "폭발적 월드 생성 문제 해결", - "neoforge.configgui.dimensionUnloadQueueDelay.tooltip": "서버가 차원을 해제하기 전 기다릴 시간을 정합니다. 단위는 틱입니다. 차원을 짧은 간격으로 자주 불러오는 것을 막아줍니다.", - "neoforge.configgui.dimensionUnloadQueueDelay": "차원 해제 전 대기 시간", - "neoforge.configgui.clumpingThreshold.tooltip": "변경된 블록 엔티티가 많을 경우 패킷을 각각 보내는 대신 청크 전체를 한 번에 전송하는 임계값을 설정합니다. 기본값: 64, 최댓값: 1024.", + "neoforge.configgui.dimensionUnloadQueueDelay.tooltip": "서버가 차원을 언로드할 때 기다릴 틱 단위 시간입니다. 빠르게 차원을 불러오고 언로드할 때 유용합니다. 예를 들어 네더 차원문에 초당 여러 번씩 아이템을 던질 때 등입니다.", + "neoforge.configgui.dimensionUnloadQueueDelay": "차원을 불러오지 않을 때에는 지연", + "neoforge.configgui.clumpingThreshold.tooltip": "변경된 블록 엔티티가 많을 경우 패킷을 각각 보내는 대신 청크 전체를 한번에 전송하는 임계값을 설정합니다. 기본값: 64, 최대값: 1024.", "neoforge.configgui.clumpingThreshold": "청크 전체 전송 임계값", - "neoforge.configgui.treatEmptyTagsAsAir.tooltip": "바닐라는 제작법의 빈 태그를 공기로 치부해, 해당 슬롯이 비어 있더라도 제작할 수 있도록 합니다. 활성화 시 공기 대신 방벽을 사용해 공기로 조합하는 것을 방지합니다.", - "neoforge.configgui.treatEmptyTagsAsAir": "공기 조합법 방지", - "neoforge.configgui.skipEmptyShapelessCheck.tooltip": "무형 조합법을 불러올 때 재료가 비어있는지 검사하는 것을 건너뛰어 복잡한 재료가 태그를 너무 빨리 캐싱하는 걸 방지합니다.", + "neoforge.configgui.treatEmptyTagsAsAir.tooltip": "바닐라는 빈 태그를 사용하는 제작법을 공기처럼 취급해, 해당 슬롯이 비어 있더라도 제작할 수 있도록 합니다. 이것은 BARRIER 를 아이템으로 사용하도록 빈 태그를 변경합니다. 이것으로 공기를 사용하여 제작하는 것을 방지합니다.", + "neoforge.configgui.treatEmptyTagsAsAir": "빈 태그를 공기로 치부", + "neoforge.configgui.skipEmptyShapelessCheck.tooltip": "형태가 없는 조합법을 역 직렬화 중 재료가 비어있으면 건너뛰어 복잡한 재료가 태그를 너무 일찍 캐싱하는 걸 방지합니다.", "neoforge.configgui.skipEmptyShapelessCheck": "무형 조합법을 불러올 때, 비어있는 재료를 확인하지 않습니다.", - "neoforge.configgui.forceSystemNanoTime.tooltip": "클라이언트에서 시스템 시간을 가져올 때 glfwGetTime 말고 System.nanoTime을 대신 사용하도록 강제합니다.", + "neoforge.configgui.forceSystemNanoTime.tooltip": "클라이언트의 주 시간 제공자로 glfwGetTime 말고 System.nanoTime 을 사용하도록 강제합니다.", "neoforge.configgui.forceSystemNanoTime": "System.nanoTime 강제", - "neoforge.configgui.zoomInMissingModelTextInGui.tooltip": "모델을 찾을 수 없다는 문구를 확대합니다.", - "neoforge.configgui.zoomInMissingModelTextInGui": "모델 누락 시 오류 메세지 확대", - "neoforge.configgui.forgeCloudsEnabled.tooltip": "구름의 모양을 GPU로 전송해 더 빨리 그립니다.", - "neoforge.configgui.forgeCloudsEnabled": "네오 포지 구름 렌더러 사용", - "neoforge.configgui.disableStairSlabCulling.tooltip": "계단, 또는 반 블록의 보이지 않는 면을 자르지 않고 냅둡니다. 보이지 않는 부분을 그려 성능 저하가 발생하나 일부 리소스팩의 호환성 문제를 해결할 수도 있습니다.", + "neoforge.configgui.zoomInMissingModelTextInGui.tooltip": "비활성화시, 모델을 찾을 수 없다는 gui 속 문구를 슬롯에 맞도록 합니다.", + "neoforge.configgui.zoomInMissingModelTextInGui": "GUI의 누락된 모델 텍스트 확대", + "neoforge.configgui.forgeCloudsEnabled.tooltip": "구름의 모양을 GPU로 전송해 더 빨리 처리합니다.", + "neoforge.configgui.forgeCloudsEnabled": "네오포지 구름 렌더러 사용", + "neoforge.configgui.disableStairSlabCulling.tooltip": "계단, 또는 반 블록의 보이지 않는 면을 잘라내지 않도록 합니다. 보이지 않는 부분을 렌더링하게 만들지만 바닐라 마인크레프트 메카닉을 의도치 않은 방법으로 사용하는 리소스팩과의 호환성 문제를 해결할 수도 있습니다.", "neoforge.configgui.disableStairSlabCulling": "계단/반 블록 컬링 해제", - "neoforge.configgui.alwaysSetupTerrainOffThread.tooltip": "네오 포지가 청크 업데이트 스레드에 모든 청크 업데이트들을 요청하도록 합니다.\nFPS가 눈에 띄게 증가할 수도 있지만, 그래픽 랙을 유발할 수도 있습니다.\n사용 가능한 코어가 많이 없는 컴퓨터에게는 추천하지 않습니다.", + "neoforge.configgui.alwaysSetupTerrainOffThread.tooltip": "포지가 청크 업데이트 스레드에 모든 청크 업데이트들을 요청하도록 합니다. FPS가 눈에 띄게 증가할 수도 있지만, 이상한 렌더링 랙을 유발할 수도 있습니다. 사용 가능한 코어가 많이 없는 컴퓨터에게는 추천하지 않습니다.", "neoforge.configgui.alwaysSetupTerrainOffThread": "강제로 청크 렌더링을 같이 진행", - "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "네오 포지의 블록 렌더링 파이프라인을 사용해 모델의 조명 문제를 해결합니다.", - "neoforge.configgui.forgeLightPipelineEnabled": "네오 포지 조명 파이프라인 사용", - "neoforge.configgui.selectiveResourceReloadEnabled.tooltip": "언어 변경처럼 특정 리소스만 다시 불러와도 되는 작업을 더욱 빠르게 수행합니다.", - "neoforge.configgui.selectiveResourceReloadEnabled": "선택적으로 리소스 불러오기", - "neoforge.configgui.showLoadWarnings.tooltip": "네오 포지가 게임을 불러오며 발생한 모든 경고 메세지들을 표시합니다.", - "neoforge.configgui.showLoadWarnings": "게임을 불러오는 중 발생한 경고 표시", - "neoforge.configgui.disableVersionCheck.tooltip": "네오 포지 자동 업데이트 확인을 끌 수 있습니다. 네오 포지는 버전 json 파일을 저희 서버에 요청하여 버전 정보를 받아옵니다. 자세한 정보는 저희 깃헙 리포지토리의 ForgeVersion 클래스에서 확인하실 수 있습니다.", - "neoforge.configgui.disableVersionCheck": "네오 포지 자동 업데이트 확인 비활성화", - "neoforge.configgui.cachePackAccess.tooltip": "리소스팩 및 데이터팩의 자원 목록을 캐시에 저장합니다.", + "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "네오포지의 블록 렌더링 파이프라인을 사용해 모델의 조명 문제를 해결합니다.", + "neoforge.configgui.forgeLightPipelineEnabled": "네오포지 조명 파이프라인 사용", + "neoforge.configgui.selectiveResourceReloadEnabled.tooltip": "언어 변경처럼 특정 부분만 리로드 하는 작업을 더욱 빠르게 수행할 수 있도록 합니다.", + "neoforge.configgui.selectiveResourceReloadEnabled": "선택된 리소스 불러오기 활성화", + "neoforge.configgui.showLoadWarnings.tooltip": "활성화 되었을 때, 포지가 게임을 불러오며 발생한 모든 경고 메세지들을 표시할 것입니다.", + "neoforge.configgui.showLoadWarnings": "게임을 불러오는중 발생한 경고 표시", + "neoforge.configgui.disableVersionCheck.tooltip": "이 옵션을 활성화하여, 포지 업데이트 자동 확인을 비활성화할 수 있습니다. 포지는 버전 json 파일을 저희 서버에 요청하여 버전 정보를 받아옵니다. 자세한 정보는 저희 깃헙 리포지토리의 ForgeVersion 클래스에서 확인하실 수 있습니다.", + "neoforge.configgui.disableVersionCheck": "포지 자동 업데이트 확인 비활성화", + "neoforge.configgui.cachePackAccess.tooltip": "활성화시, 리소스팩 및 데이터팩의 자원 목록을 캐시에 저장합니다.", "neoforge.configgui.cachePackAccess": "리소스팩/데이터팩 접근시 캐시 이용", - "neoforge.configgui.indexVanillaPackCachesOnThread.tooltip": "바닐라 리소스팩과 데이터팩을 여러 코어를 사용해 색인합니다.", - "neoforge.configgui.indexVanillaPackCachesOnThread": "바닐라 마인크래프트 리소스팩 색인 시 다중 코어 사용", - "neoforge.configgui.indexModPackCachesOnThread.tooltip": "모드의 리소스팩과 데이터팩을 여러 코어를 사용해 색인합니다.", - "neoforge.configgui.indexModPackCachesOnThread": "모드 리소스팩 색인 시 다중 코어 사용", + "neoforge.configgui.indexVanillaPackCachesOnThread.tooltip": "활성화시, 바닐라 리소스팩과 데이터팩을 스레드에서 색인합니다", + "neoforge.configgui.indexVanillaPackCachesOnThread": "스레드에서 바닐라 마인크래프트 리소스팩 색인하기", + "neoforge.configgui.indexModPackCachesOnThread.tooltip": "활성화시, 모드 리소스팩과 데이터팩을 스레드에서 색인합니다", + "neoforge.configgui.indexModPackCachesOnThread": "스레드에서 모드 리소스팩 색인하기", "neoforge.controlsgui.shift": "SHIFT + %s", "neoforge.controlsgui.control": "CTRL + %s", "neoforge.controlsgui.control.mac": "CMD + %s", "neoforge.controlsgui.alt": "ALT + %s", "neoforge.container.enchant.limitedEnchantability": "제한된 마법부여 가능성", "neoforge.swim_speed": "수영 속도", - "neoforge.name_tag_distance": "이름표 표시 거리", + "neoforge.name_tag_distance": "이름표 렌더 거리", "neoforge.creative_flight": "크리에이티브 비행", "fluid_type.minecraft.milk": "우유", "fluid_type.minecraft.flowing_milk": "우유", "neoforge.froge.warningScreen.title": "네오 포지 스냅샷 경고", "neoforge.froge.warningScreen.text": "Froge is not officially supported. Bugs and instability are expected.", - "neoforge.froge.supportWarning": "Froge는 네오 포지에서 공식적으로 지원하지 않습니다.", + "neoforge.froge.supportWarning": "Froge는 네오포지에서 공식적으로 지원하지 않습니다.", "neoforge.gui.exit": "나가기", - "neoforge.experimentalsettings.tooltip": "이 세계는 언제든지 고장날 수 있는 실험적 설정을 사용합니다.", - "neoforge.selectWorld.backupWarning.experimental.additional": "이 메세지는 앞으로 이 세계에 표시되지 않습니다.", + "neoforge.experimentalsettings.tooltip": "이 월드는 언제든지 고장날 수 있는 실험적 설정을 사용합니다.", + "neoforge.selectWorld.backupWarning.experimental.additional": "이 월드에는 이 메세지가 더 이상 표시되지 않을 것입니다.", "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "네오 포지 데이터/리소스 팩", - "pack.neoforge.source.child": "하위 팩", - "neoforge.network.negotiation.failure.mod": "모드 \"%1$s\"에 연결하는 데 실패했습니다: %2$s", + "pack.neoforge.source.child": "child", "neoforge.network.negotiation.failure.missing.client.server": "클라이언트에 필요한 네트워크 채널이 서버에 존재하지 않습니다!", "neoforge.network.negotiation.failure.missing.server.client": "서버에 필요한 네트워크 채널이 클라이언트에 존재하지 않습니다!", "neoforge.network.negotiation.failure.flow.client.missing": "클라이언트가 요구하는 패킷 방향(%s)을 서버에서 지원하지 않습니다!", @@ -189,16 +187,16 @@ "neoforge.network.negotiation.failure.version.server.missing": "서버의 패킷 버전(%s)이 클라이언트에서 지원되지 않습니다!", "neoforge.network.negotiation.failure.version.mismatch": "클라이언트의 패킷 버전(%s)과 서버의 패킷 버전(%s)이 달라 처리할 수 없습니다!", "neoforge.network.invalid_flow": "패킷이 잘못된 방향으로 전송되어 처리할 수 없습니다: %s", - "neoforge.network.negotiation.failure.vanilla.client.not_supported": "서버에 접속할 수 없습니다. 접속하시려는 서버엔 네오 포지가 설치되어 있지만 귀하의 클라이언트엔 없습니다. 네오 포지 %s 설치 이후 다시 접속하세요.", - "neoforge.network.negotiation.failure.vanilla.server.not_supported": "서버에 접속할 수 없습니다. 클라이언트에 설치된 모드중 일부는 접속하는 서버에 무조건 네오 포지가 필요합니다. 그러나 접속하시려는 서버에는 네오 포지가 설치되어 있지 않습니다.", + "neoforge.network.negotiation.failure.vanilla.client.not_supported": "서버에 접속할 수 없습니다. 접속하시려는 서버엔 네오포지가 설치되어 있지만 귀하의 클라이언트엔 없습니다. 네오포지 %s 설치 이후 다시 접속하세요.", + "neoforge.network.negotiation.failure.vanilla.server.not_supported": "서버에 접속할 수 없습니다. 귀하가 설치하신 모드중 일부는 네오포지가 없는 서버에선 사용할 수 없으나 접속하시려는 서버는 네오포지가 없습니다.", "neoforge.network.packet_splitter.unknown": "등록된 패킷 분할기가 없습니다!", - "neoforge.network.advanced_add_entity.failed": "추가 엔티티 데이터 패킷을 처리하는 데 실패했습니다: %s", - "neoforge.network.advanced_open_screen.failed": "추가 화면 데이터 패킷을 처리하는 데 실패했습니다: %s", + "neoforge.network.advanced_add_entity.failed": "추가 엔티티 데이터 패킷을 처리하는데 실패했습니다: %s", + "neoforge.network.advanced_open_screen.failed": "추가 스크린 데이터 패킷을 처리하는데 실패했습니다: %s", "neoforge.network.registries.sync.missing": "서버에서 일부 레지스트리를 전달받지 못했습니다!: %s", "neoforge.network.registries.sync.server-with-unknown-keys": "서버에서 알 수 없는 레지스트리 항목을 전송했습니다: %s", - "neoforge.network.registries.sync.failed": "서버와 레지스트리 동기화 중 오류가 발생했습니다: %s", - "neoforge.network.aux_light_data.failed": "청크 %s의 추가 조명 데이터를 처리하는 중 오류가 발생했습니다: %s", - "neoforge.network.data_maps.failed": "%s 레지스트리 동기화 중 오류가 발생했습니다: %s", - "neoforge.network.data_maps.missing_our": "클라이언트에 필요한 데이터 맵들이 서버에 없어 접속할 수 없습니다: %s", - "neoforge.network.data_maps.missing_their": "서버 접속에 필요한 데이터 맵들이 클라이언트에 없어 접속할 수 없습니다: %s" + "neoforge.network.registries.sync.failed": "서버와 레지스트리 동기화중 오류가 발생했습니다: %s", + "neoforge.network.aux_light_data.failed": "청크 %s의 추가 조명 데이터를 처리하는중 오류가 발생했습니다: %s", + "neoforge.network.data_maps.failed": "%s 레지스트리 동기화중 오류가 발생했습니다: %s", + "neoforge.network.data_maps.missing_our": "클라이언트가 필요로 하는 데이터 맵들이 서버에 누락되어 있어 접속할 수 없습니다: %s", + "neoforge.network.data_maps.missing_their": "서버 접속에 필요한 데이터 맵들이 클라이언트에 누락되어 있습니다: %s" } diff --git a/src/main/resources/assets/neoforge/lang/nl_nl.json b/src/main/resources/assets/neoforge/lang/nl_nl.json index 9a3ea2bae1..55b01df48b 100644 --- a/src/main/resources/assets/neoforge/lang/nl_nl.json +++ b/src/main/resources/assets/neoforge/lang/nl_nl.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Klik om naar de startpagina van deze mod te gaan", "fml.modmismatchscreen.table.reason": "Reden", "fml.modmismatchscreen.table.visit.mod_page": "Open de modpagina van de mod die dit kanaal registreert: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "Deze build van NeoForge was gemaakt door een lid van de gemeenschap en wordt daarom §c§lNIET ONDERSTEUND§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resourcepakket", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "Dit kanaal ontbreekt aan de serverzijde, maar is voor de cliënt vereist!", "neoforge.network.negotiation.failure.missing.server.client": "Dit kanaal ontbreekt aan de cliëntzijde, maar is voor de server vereist!", "neoforge.network.negotiation.failure.flow.client.missing": "De cliënt wilt dat de payload stroomt: %s, maar de server ondersteunt dit niet!", diff --git a/src/main/resources/assets/neoforge/lang/pl_pl.json b/src/main/resources/assets/neoforge/lang/pl_pl.json index d5507e5892..9b0f420f3f 100644 --- a/src/main/resources/assets/neoforge/lang/pl_pl.json +++ b/src/main/resources/assets/neoforge/lang/pl_pl.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Kliknij, aby przejść na stronę główną modyfikacji", "fml.modmismatchscreen.table.reason": "Powód", "fml.modmismatchscreen.table.visit.mod_page": "Przejdź na stronę modyfikacji %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resource pack", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "This channel is missing on the server side, but required on the client!", "neoforge.network.negotiation.failure.missing.server.client": "This channel is missing on the client side, but required on the server!", "neoforge.network.negotiation.failure.flow.client.missing": "The client wants the payload to flow: %s, but the server does not support it!", diff --git a/src/main/resources/assets/neoforge/lang/ro_ro.json b/src/main/resources/assets/neoforge/lang/ro_ro.json index 9664c316ba..1b9372754c 100644 --- a/src/main/resources/assets/neoforge/lang/ro_ro.json +++ b/src/main/resources/assets/neoforge/lang/ro_ro.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Click to get to the homepage of this mod", "fml.modmismatchscreen.table.reason": "Reason", "fml.modmismatchscreen.table.visit.mod_page": "Open the mod page of the mod that registers the channel: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resource pack", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "This channel is missing on the server side, but required on the client!", "neoforge.network.negotiation.failure.missing.server.client": "This channel is missing on the client side, but required on the server!", "neoforge.network.negotiation.failure.flow.client.missing": "The client wants the payload to flow: %s, but the server does not support it!", diff --git a/src/main/resources/assets/neoforge/lang/ru_ru.json b/src/main/resources/assets/neoforge/lang/ru_ru.json index 96cfd17251..cff8c57404 100644 --- a/src/main/resources/assets/neoforge/lang/ru_ru.json +++ b/src/main/resources/assets/neoforge/lang/ru_ru.json @@ -1,35 +1,35 @@ { "fml.menu.mods": "Моды", "fml.menu.mods.title": "Моды", - "fml.menu.mods.normal": "Выкл.", + "fml.menu.mods.normal": "Выкл", "fml.menu.mods.search": "Поиск", "fml.menu.mods.a_to_z": "А-Я", "fml.menu.mods.z_to_a": "Я-А", "fml.menu.mods.config": "Настройки", - "fml.menu.mods.openmodsfolder": "Папка с модами", - "fml.menu.modoptions": "Настройки мода", - "fml.menu.mods.info.version": "Версия: %1$s", - "fml.menu.mods.info.idstate": "Идентификатор мода: %1$s; Состояние: {1,lower}", - "fml.menu.mods.info.credits": "Способствовали разработке: {0}", - "fml.menu.mods.info.authors": "Авторы: %1$s", - "fml.menu.mods.info.displayurl": "Главная страница: %1$s", - "fml.menu.mods.info.license": "Лицензия: %1$s", + "fml.menu.mods.openmodsfolder": "Открыть папку модов", + "fml.menu.modoptions": "Настройки мода...", + "fml.menu.mods.info.version": "Version: %1$s", + "fml.menu.mods.info.idstate": "ModID: %1$s State: {1,lower}", + "fml.menu.mods.info.credits": "Credits: %1$s", + "fml.menu.mods.info.authors": "Authors: %1$s", + "fml.menu.mods.info.displayurl": "Homepage: %1$s", + "fml.menu.mods.info.license": "License: %1$s", "fml.menu.mods.info.securejardisabled": "Функции безопасности модов отключены, обновите JDK", - "fml.menu.mods.info.signature": "Подпись: %1$s", - "fml.menu.mods.info.signature.unsigned": "НЕПОДПИСАН", - "fml.menu.mods.info.trust": "Доверять: %1$s", + "fml.menu.mods.info.signature": "Signature: %1$s", + "fml.menu.mods.info.signature.unsigned": "НЕ ПОДПИСАННЫЙ", + "fml.menu.mods.info.trust": "Trust: %1$s", "fml.menu.mods.info.trust.noauthority": "Нет", - "fml.menu.mods.info.nochildmods": "Дочерних модов не имеет", - "fml.menu.mods.info.childmods": "Дочерние моды: %1$s", - "fml.menu.mods.info.updateavailable": "Вышло обновление: %1$s", + "fml.menu.mods.info.nochildmods": "Дочерние моды не найдены", + "fml.menu.mods.info.childmods": "Child mods: %1$s", + "fml.menu.mods.info.updateavailable": "Update available: %1$s", "fml.menu.mods.info.changelogheader": "Список изменений:", - "fml.menu.multiplayer.compatible": "Совместимый модифицированный сервер на Forge\nпредставлено {0,choice,1#1 mod|1<%1$s модов}", - "fml.menu.multiplayer.incompatible": "Несовместимый сервер на Forge", - "fml.menu.multiplayer.incompatible.extra": "Несовместимый модифицированный сервер на Forge\n%1$s", + "fml.menu.multiplayer.compatible": "Compatible FML modded server\n{0,choice,1#1 mod|1<%1$s mods} present", + "fml.menu.multiplayer.incompatible": "Несовместимый модифицированный FML сервер", + "fml.menu.multiplayer.incompatible.extra": "Incompatible FML modded server\n%1$s", "fml.menu.multiplayer.truncated": "Возможны неточности данных из-за ограничений размера протокола.", - "fml.menu.multiplayer.vanilla": "Ванильный сервер", - "fml.menu.multiplayer.vanilla.incompatible": "Несовместимый ванильный сервер", - "fml.menu.multiplayer.unknown": "Неизвестный сервер %1$s", + "fml.menu.multiplayer.vanilla": "Vanilla сервер", + "fml.menu.multiplayer.vanilla.incompatible": "Несовместимый сервер Vanilla", + "fml.menu.multiplayer.unknown": "Unknown server %1$s", "fml.menu.multiplayer.serveroutdated": "Сетевая версия сервера NeoForge устарела", "fml.menu.multiplayer.clientoutdated": "Сетевая версия клиента NeoForge устарела", "fml.menu.multiplayer.extraservermods": "На сервере установлены дополнительные моды, которые могут потребоваться на клиенте", @@ -37,15 +37,15 @@ "fml.menu.multiplayer.networkincompatible": "Список сетевых сообщений сервера несовместим", "fml.menu.multiplayer.missingdatapackregistries": "Missing required datapack registries: %1$s", "fml.menu.loadingmods": "{0,choice,0#No mods|1#1 mod|1<%s mods} loaded", - "fml.menu.notification.title": "Уведомление при запуске игры", + "fml.menu.notification.title": "Уведомление о запуске", "fml.menu.accessdenied.title": "Отказано в доступе к серверу", "fml.menu.accessdenied.message": "Fancy Mod Loader could not connect to this server\nThe server %1$s has forbidden modded access", "fml.menu.backupfailed.title": "Резервное копирование не удалось", "fml.menu.backupfailed.message": "There was an error saving the archive %1$s\nPlease fix the problem and try again", - "fml.button.open.file": "Открыть %1$s", + "fml.button.open.file": "Open %1$s", "fml.button.open.log": "Открыть файл журнала", "fml.button.open.crashreport": "Открыть отчёт об ошибке", - "fml.button.open.mods.folder": "Папка с модами", + "fml.button.open.mods.folder": "Открыть папку модов", "fml.button.continue.launch": "Перейти в главное меню", "fml.modmismatchscreen.missingmods.client": "Ваш клиент не содержит следующих модов, установите их, чтобы присоединиться к серверу:", "fml.modmismatchscreen.missingmods.server": "На сервере отсутствуют следующие моды, удалите их из вашего клиента, чтобы присоединиться к серверу:", @@ -58,9 +58,8 @@ "fml.modmismatchscreen.homepage": "Нажмите, чтобы перейти на главную страницу этого мода", "fml.modmismatchscreen.table.reason": "Причина", "fml.modmismatchscreen.table.visit.mod_page": "Откройте страницу мода, который регистрирует канал: %s", - "fml.modmismatchscreen.simplifiedview": "Упрощённый вид", - "fml.resources.modresources": "Ресурсы %1$s файлов модов", - "fml.resources.moddata": "Данные %1$s файлов модов", + "fml.resources.modresources": "Resources for %1$s mod files", + "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "Эта версия NeoForge была создана участником сообщества и поэтому §c§lНЕ ПОДДЕРЖИВАЕТСЯ§r", "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Зарегистрированные измерения по типу:", @@ -70,15 +69,15 @@ "commands.neoforge.entity.list.invalid": "Неверный фильтр, не соответствует ни одной сущности. Используйте /neoforge entity list для корректного списка", "commands.neoforge.entity.list.invalidworld": "Could not load world for dimension %1$s. Please select a valid dimension.", "commands.neoforge.entity.list.none": "Сущности не найдены.", - "commands.neoforge.entity.list.single.header": "Сущность: %1$s; Всего: %2$s", - "commands.neoforge.entity.list.multiple.header": "Всего: %1$s", + "commands.neoforge.entity.list.single.header": "Entity: %1$s Total: %2$s", + "commands.neoforge.entity.list.multiple.header": "Total: %1$s", "commands.neoforge.setdim.invalid.entity": "The entity selected (%1$s) is not valid.", "commands.neoforge.setdim.invalid.dim": "The dimension ID specified (%1$s) is not valid.", "commands.neoforge.setdim.invalid.nochange": "The entity selected (%1$s) is already in the dimension specified (%2$s).", "commands.neoforge.setdim.deprecated": "Эта команда устарела и помечена для удаления начиная с 1.17, вместо нее используйте %s.", "commands.neoforge.tps.invalid": "Invalid dimension %1$s Possible values: %2$s", "commands.neoforge.tps.summary.all": "Overall: Mean tick time: %1$s ms. Mean TPS: %2$s", - "commands.neoforge.mods.list": "Список модов: %1$s", + "commands.neoforge.mods.list": "Mod List: %1$s", "commands.neoforge.tps.summary.basic": "Dim %1$s: Mean tick time: %2$s ms. Mean TPS: %3$s", "commands.neoforge.tps.summary.named": "Dim %1$s (%2$s): Mean tick time: %3$s ms. Mean TPS: %4$s", "commands.neoforge.tracking.entity.enabled": "Отслеживание сущностей включено на %d секунд.", @@ -102,7 +101,7 @@ "commands.neoforge.tags.page_info": "%s <стр %s / %s>", "commands.neoforge.chunkgen.progress_bar_title": "Генерация чанков...", "commands.neoforge.chunkgen.progress_bar_progress": "Generating %1$s chunks - ", - "commands.neoforge.chunkgen.progress_bar_errors": "(%1$s ошибок!)", + "commands.neoforge.chunkgen.progress_bar_errors": "(%1$s errors!)", "commands.neoforge.chunkgen.already_running": "Генерация уже запущена. Пожалуйста, сначала выполните команду '/neoforge generate stop', а затем можете начать новую генерацию.", "commands.neoforge.chunkgen.started": "Generating %1$s chunks, in an area of %2$sx%3$s chunks (%4$sx%5$s blocks).", "commands.neoforge.chunkgen.success": "Генерация завершена!", @@ -110,28 +109,28 @@ "commands.neoforge.chunkgen.stopped": "Generation stopped! %1$s out of %2$s chunks generated. (%3$s%)", "commands.neoforge.chunkgen.status": "Generation status! %1$s out of %2$s chunks generated. (%3$s%)", "commands.neoforge.chunkgen.not_running": "Предварительная генерация не запущена. Выполните команду `/neoforge generate help`, чтобы увидеть команды для запуска генерации.", - "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start [шкалапрогресса] §r§f- создаёт квадрат, центрированный на указанной точке, с длиной сторон, равной chunkRadius * 2.\n§2/neoforge generate stop §r§f- останавливает текущую генерацию и отображает завершённый прогресс.\n§2/neoforge generate status §r- отображает прогресс текущей генерации.\n§2/neoforge generate help §r- отображает данное сообщение.\nСовет: Если вы запускаете команды из консоли сервера, вы можете выполнять генерацию в разных измерениях с помощью /execute in neoforge generate…", + "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start <радиус_в_чанках> [progressBar] §r§f- Генерирует квадратную область с центром в заданных координатах и длиной стороны радиус_в_чанках * 2.\n§2/neoforge generate stop §r§f- Останавливает текущую генерацию и отображает достигнутый прогресс.\n§2/neoforge generate status §r- Отображает текущий прогресс активной генерации.\n§2/neoforge generate help §r- Отображает это сообщение.\nОбщие рекомендации: Если команды выполняются из серверной консоли, вы можете запустить генерацию для разных измерений, используя /execute in neoforge generate...", "commands.config.getwithtype": "Конфиг для %s типа %s обнаружен в %s", "commands.config.noconfig": "Конфиг для %s типа %s не найден", "neoforge.update.beta.1": "%sВНИМАНИЕ: %sNeoForge Бета", "neoforge.update.beta.2": "Возможны серьезные проблемы, проверьте их, прежде чем сообщать.", "neoforge.update.newversion": "Доступна новая версия NeoForge: %s", "neoforge.menu.updatescreen.title": "Обновление мода", - "neoforge.configgui.removeErroringEntities.tooltip": "Установите значение true, чтобы удалять любые сущности, которые вызывают ошибку в методе обновления, вместо завершения работы сервера и создания отчёта об ошибке. БУДЬТЕ ОСТОРОЖНЫ, ЭТО МОЖЕТ ПРИВЕСТИ К НЕИСПРАВНОСТЯМ; ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОСТЬЮ, МЫ НЕ НЕСЁМ ОТВЕТСТВЕННОСТИ ЗА УЩЕРБ.", + "neoforge.configgui.removeErroringEntities.tooltip": "Установите значение true, чтобы удалять любую Сущность, вызывающую ошибку в своем методе обновления, вместо того чтобы остановить сервер и сформировать отчёт об ошибке. БУДЬТЕ ВНИМАТЕЛЬНЫ, ЭТО МОЖЕТ НАВРЕДИТЬ ВСЕМУ, ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОСТЬЮ, МЫ НЕ НЕСЕМ ОТВЕТСТВЕННОСТИ ЗА УРОН.", "neoforge.configgui.removeErroringEntities": "Удалять сущности, вызывающие ошибки", - "neoforge.configgui.removeErroringBlockEntities.tooltip": "Установите значение true, чтобы удалять любые BlockEntity, которые вызывают ошибку в методе обновления, вместо завершения работы сервера и создания отчёта об ошибке. БУДЬТЕ ОСТОРОЖНЫ, ЭТО МОЖЕТ ПРИВЕСТИ К НЕИСПРАВНОСТЯМ; ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОСТЬЮ, МЫ НЕ НЕСЁМ ОТВЕТСТВЕННОСТИ ЗА УЩЕРБ.", + "neoforge.configgui.removeErroringBlockEntities.tooltip": "Установите значение true, чтобы удалять любую Блочную сущность, вызывающую ошибку в своем методе обновления, вместо того чтобы остановить сервер и сформировать отчёт об ошибке. БУДЬТЕ ВНИМАТЕЛЬНЫ, ЭТО МОЖЕТ НАВРЕДИТЬ ВСЕМУ, ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОСТЬЮ, МЫ НЕ НЕСЕМ ОТВЕТСТВЕННОСТИ ЗА УРОН.", "neoforge.configgui.removeErroringBlockEntities": "Удалять блочные сущности, вызывающие ошибки", - "neoforge.configgui.fullBoundingBoxLadders.tooltip": "Установите значение true, чтобы проверять всю коробку столкновений сущности на соприкосновение с лестницами, а не только блоками, в котором они находятся. Это вызывает заметные изменения в механике, поэтому по умолчанию используется ванильное поведение. По умолчанию: false.", + "neoforge.configgui.fullBoundingBoxLadders.tooltip": "Установите значение true, чтобы проверять область коллизии сущности целиком для лестниц вместо только блока, в котором она находится. Приводит к значительным различиям в механиках, поэтому по умолчанию ванильное поведение. По умолчанию: false.", "neoforge.configgui.fullBoundingBoxLadders": "Полная область коллизии для лестниц", "neoforge.configgui.logCascadingWorldGeneration.tooltip": "Логирует проблемы при каскадной генерации чанков во время формирования местности.", "neoforge.configgui.logCascadingWorldGeneration": "Логирование каскадной генерации", - "neoforge.configgui.fixVanillaCascading.tooltip": "Исправляет проблемы ванили, приводящие к каскадной генерации мира. Эта настройка ИЗМЕНЯЕТ ванильную генерацию мира, поэтому НЕ сообщайте о том, что ваш мир сгенерировался как-то иначе, если включена эта опция.", + "neoforge.configgui.fixVanillaCascading.tooltip": "Исправляет ванильные ошибки, приводящие к каскадной генерации. Это ИЗМЕНЯЕТ ванильную генерацию, поэтому НЕ СООБЩАЙТЕ об ошибках, связанных с различием миров, если эта опция включена.", "neoforge.configgui.fixVanillaCascading": "Исправление ванильных каскадов", - "neoforge.configgui.dimensionUnloadQueueDelay.tooltip": "Время в тактах, которое сервер будет ожидать, пока измерение помещено в очередь на выгрузку. Может быть полезно при быстрых загрузках и выгрузках измерений, например, при многочисленных бросках предметов в портал в Незер несколько раз в секунду.", + "neoforge.configgui.dimensionUnloadQueueDelay.tooltip": "Время в тиках, которое сервер будет ожидать, когда измерение добавлено в очередь на выгрузку. Может быть полезно, когда измерения постоянно загружаются и выгружаются, например при бросках предметов в портал Незера несколько раз в секунду.", "neoforge.configgui.dimensionUnloadQueueDelay": "Задержка при выгрузке измерения", "neoforge.configgui.clumpingThreshold.tooltip": "Управляет пороговым значением, при котором Packet51 является предпочтительнее Packet52. По умолчанию минимальное значение - 64, максимум - 1024.", "neoforge.configgui.clumpingThreshold": "Порог объединения пакетов", - "neoforge.configgui.treatEmptyTagsAsAir.tooltip": "В ванили в рецептах создания в качестве пустых тегов используется воздух, что позволяет создавать предметы с пустыми слотами. Эта настройка позволяет сменить воздух на БАРЬЕР, чтобы предотвратить создание предметов из воздуха.", + "neoforge.configgui.treatEmptyTagsAsAir.tooltip": "Ванила использует воздух в качестве представления пустых тегов для рецептов крафта, что позволяет создавать предметы, оставляя соответствующие слоты пустыми. Здесь вы можете заменить пустые теги предметом БАРЬЕР, чтобы исключить возможность крафта с использованием воздуха.", "neoforge.configgui.treatEmptyTagsAsAir": "Использование воздуха для пустых тегов", "neoforge.configgui.skipEmptyShapelessCheck.tooltip": "Пропускать проверку на наличие пустых ингредиентов во время десериализации бесформенных рецептов, чтобы предотвратить слишком раннее кеширование тегов комплексных ингредиентов.", "neoforge.configgui.skipEmptyShapelessCheck": "Пропуск проверки на пустые ингредиенты при десериализации бесформенных рецептов", @@ -141,9 +140,9 @@ "neoforge.configgui.zoomInMissingModelTextInGui": "Увеличение текста отсутствующей модели в GUI", "neoforge.configgui.forgeCloudsEnabled.tooltip": "Включает загрузку геометрии облаков в GPU для ускорения рендеринга.", "neoforge.configgui.forgeCloudsEnabled": "Использование рендера облаков NeoForge", - "neoforge.configgui.disableStairSlabCulling.tooltip": "Отключает отсечение скрытых сторон ступенек и плит. Приводит к дополнительной отрисовке, но может исправить некоторые наборы ресурсов, которые используют эту ванильную механику.", + "neoforge.configgui.disableStairSlabCulling.tooltip": "Отключает отбраковку скрытых сторон ступенек и плит. Приводит к дополнительному рендерингу, однако, может исправить проблемы в некоторых наборах ресурсов, которые используют эту ванильную механику.", "neoforge.configgui.disableStairSlabCulling": "Отключить отбраковку ступенек/плит", - "neoforge.configgui.alwaysSetupTerrainOffThread.tooltip": "Активирует возможность NeoForge для постановки всех обновлений чанков в очередь потока обновления чанков.\nЭто может значительно увеличить количество кадров в секунду, но также может вызывать странные задержки при отрисовке.\nНе рекомендуется для компьютеров с небольшим количеством ядер.", + "neoforge.configgui.alwaysSetupTerrainOffThread.tooltip": "Активирует возможность NeoForge для добавления всех обновлений чанков в очередь потока обновления чанков.\nЭто может значительно повысить FPS, но также может вызвать странные задержки при рендеринге.\nНе рекомендуется для компьютеров с небольшим количеством доступных ядер.", "neoforge.configgui.alwaysSetupTerrainOffThread": "Принудительный многопоточный рендеринг чанков", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Активирует конвейер NeoForge для рендеринга блоков - исправляет освещение кастомных моделей.", "neoforge.configgui.forgeLightPipelineEnabled": "Включить конвейер света NeoForge", @@ -151,7 +150,7 @@ "neoforge.configgui.selectiveResourceReloadEnabled": "Включить выборочную загрузку ресурсов", "neoforge.configgui.showLoadWarnings.tooltip": "Если эта функция включена, NeoForge покажет все предупреждения, возникшие во время загрузки.", "neoforge.configgui.showLoadWarnings": "Показывать предупреждения при загрузке", - "neoforge.configgui.disableVersionCheck.tooltip": "Установите значение true, чтобы отключить проверку версии NeoForge. NeoForge запрашивает небольшой JSON-файл с нашего сервера для получения информации о версиях. Для получения более подробной информации смотрите класс ForgeVersion на нашем GitHub.", + "neoforge.configgui.disableVersionCheck.tooltip": "Установите значение true, чтобы отключить механизм проверки версии NeoForge. NeoForge запрашивает небольшой JSON-файл с нашего сервера для получения информации о версии. Более подробную информацию см. в классе ForgeVersion на нашем GitHub.", "neoforge.configgui.disableVersionCheck": "Отключить проверку версии NeoForge", "neoforge.configgui.cachePackAccess.tooltip": "Установите значение true, чтобы кешировать списки ресурсов в наборах ресурсов и данных", "neoforge.configgui.cachePackAccess": "Кеш для доступа к пакам", @@ -177,8 +176,7 @@ "neoforge.selectWorld.backupWarning.experimental.additional": "Это сообщение больше не появится для этого мира.", "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "Набор ресурсов/данных NeoForge", - "pack.neoforge.source.child": "дочерний", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", + "pack.neoforge.source.child": "child", "neoforge.network.negotiation.failure.missing.client.server": "Этот канал отсутствует на стороне сервера, но необходим на клиенте!", "neoforge.network.negotiation.failure.missing.server.client": "Этот канал отсутствует на стороне клиента, но необходим на сервере!", "neoforge.network.negotiation.failure.flow.client.missing": "Клиент хочет, чтобы полезная нагрузка передавалась в: %s, но сервер ее не поддерживает!", diff --git a/src/main/resources/assets/neoforge/lang/sk_sk.json b/src/main/resources/assets/neoforge/lang/sk_sk.json index 254c96c682..97a3febe49 100644 --- a/src/main/resources/assets/neoforge/lang/sk_sk.json +++ b/src/main/resources/assets/neoforge/lang/sk_sk.json @@ -8,41 +8,41 @@ "fml.menu.mods.config": "Nastavenia", "fml.menu.mods.openmodsfolder": "Otvoriť priečinok pre módy", "fml.menu.modoptions": "Nastavenia módu... ", - "fml.menu.mods.info.version": "Verzia: %1$s", - "fml.menu.mods.info.idstate": "ID Módu: %1$s Status: {1,lower}", - "fml.menu.mods.info.credits": "Kredity: %1$s", - "fml.menu.mods.info.authors": "Autori: %1$s", - "fml.menu.mods.info.displayurl": "Domovská stránka: %1$s", - "fml.menu.mods.info.license": "Licencia: %1$s", + "fml.menu.mods.info.version": "Version: %1$s", + "fml.menu.mods.info.idstate": "ModID: %1$s State: {1,lower}", + "fml.menu.mods.info.credits": "Credits: %1$s", + "fml.menu.mods.info.authors": "Authors: %1$s", + "fml.menu.mods.info.displayurl": "Homepage: %1$s", + "fml.menu.mods.info.license": "License: %1$s", "fml.menu.mods.info.securejardisabled": "Bezpečnostné funkcie módu vypnuté, aktualizujte JDK", - "fml.menu.mods.info.signature": "Podpis: %1$s", + "fml.menu.mods.info.signature": "Signature: %1$s", "fml.menu.mods.info.signature.unsigned": "NEPODPÍSANÉ", - "fml.menu.mods.info.trust": "Dôvera: %1$s", + "fml.menu.mods.info.trust": "Trust: %1$s", "fml.menu.mods.info.trust.noauthority": "Žiadna", "fml.menu.mods.info.nochildmods": "Nenájdené žiadne prídavné módy", - "fml.menu.mods.info.childmods": "Prídavné módy: %1$s", - "fml.menu.mods.info.updateavailable": "Dostupná aktualizácia: %1$s", + "fml.menu.mods.info.childmods": "Child mods: %1$s", + "fml.menu.mods.info.updateavailable": "Update available: %1$s", "fml.menu.mods.info.changelogheader": "Novinky:", - "fml.menu.multiplayer.compatible": "Kompatibilný FML módovaný server {{0,choice,1#1 mod|1<%1$s mods} je prítomný", + "fml.menu.multiplayer.compatible": "Compatible FML modded server\n{0,choice,1#1 mod|1<%1$s mods} present", "fml.menu.multiplayer.incompatible": "Nekompatibilný módovaný FML server", - "fml.menu.multiplayer.incompatible.extra": "Nekompatibilný módovaný FML server %1$s", + "fml.menu.multiplayer.incompatible.extra": "Incompatible FML modded server\n%1$s", "fml.menu.multiplayer.truncated": "Dáta môžu byť nepresné kvôli veľkostným limitom protokolu.", "fml.menu.multiplayer.vanilla": "Základný server", "fml.menu.multiplayer.vanilla.incompatible": "Nekompatibilný Základný server", - "fml.menu.multiplayer.unknown": "Neznámy server %1$s", + "fml.menu.multiplayer.unknown": "Unknown server %1$s", "fml.menu.multiplayer.serveroutdated": "Serverová sieť NeoForge je zastaralá", "fml.menu.multiplayer.clientoutdated": "Klientská sieť NeoForge je zastaralá", "fml.menu.multiplayer.extraservermods": "Server obsahuje pridané módy, ktoré môžu byť potrebné u klienta", "fml.menu.multiplayer.modsincompatible": "Zoznam módov pre server je nekompatibilný", "fml.menu.multiplayer.networkincompatible": "Serverový sieťový list správ nie je kompatibilný", - "fml.menu.multiplayer.missingdatapackregistries": "Chýbajúce potrebné registre pre datapack: %1$s", - "fml.menu.loadingmods": "{0,choice,0#No mods|1#1 mod|1<%s mods} načítané", + "fml.menu.multiplayer.missingdatapackregistries": "Missing required datapack registries: %1$s", + "fml.menu.loadingmods": "{0,choice,0#No mods|1#1 mod|1<%s mods} loaded", "fml.menu.notification.title": "Spúšťacie upozornenie", "fml.menu.accessdenied.title": "Prístup k Serveru Zamietnutý", - "fml.menu.accessdenied.message": "Fancy Mod Loader sa nemohol pripojiť na tento server\nServer %1$s má zakázaný prístup s módmi", + "fml.menu.accessdenied.message": "Fancy Mod Loader could not connect to this server\nThe server %1$s has forbidden modded access", "fml.menu.backupfailed.title": "Zálohovanie Zlyhalo", - "fml.menu.backupfailed.message": "Chyba pri ukladaní archívu %1$s\nProsím opravte problém a skúste to znova", - "fml.button.open.file": "Otvoriť %1$s", + "fml.menu.backupfailed.message": "There was an error saving the archive %1$s\nPlease fix the problem and try again", + "fml.button.open.file": "Open %1$s", "fml.button.open.log": "Otvoriť súbor „log“", "fml.button.open.crashreport": "Otvoriť správu o spadnutí hry", "fml.button.open.mods.folder": "Otvoriť priečinok pre módy", @@ -54,33 +54,32 @@ "fml.modmismatchscreen.table.youneed": "Potrebujete", "fml.modmismatchscreen.table.youhave": "Máte", "fml.modmismatchscreen.table.serverhas": "Server má", - "fml.modmismatchscreen.additional": "[%1$s prípadne, pozrite latest.log pre plný zoznam]", + "fml.modmismatchscreen.additional": "[%1$s additional, see latest.log for the full list]", "fml.modmismatchscreen.homepage": "Kliknite pre dosiahnutie domovskej stránky tohto módu", "fml.modmismatchscreen.table.reason": "Dôvod", "fml.modmismatchscreen.table.visit.mod_page": "Otvorte stránku módu ktorá registruje kanál: %s", - "fml.modmismatchscreen.simplifiedview": "Zjednodušené zobrazenie", - "fml.resources.modresources": "Zdroje pre %1$s súbory módov", - "fml.resources.moddata": "Dáta pre %1$s súborov módov", + "fml.resources.modresources": "Resources for %1$s mod files", + "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "Táto verzia NeoForgu bola vytvorená členom komunity, a preto je §c§lNEPODPOROVANÁ§r", - "commands.neoforge.arguments.enum.invalid": "Konštanta Enum musí byť jedna z %1$s, nájdené %2$s", + "commands.neoforge.arguments.enum.invalid": "Enum constant must be one of %1$s, found %2$s", "commands.neoforge.dimensions.list": "Aktuálne registrované dimenzie podľa typu:", "commands.neoforge.dump.success": "Nový súbor vytvorený s %s registrovým obsahom je vo %s", "commands.neoforge.dump.failure": "Zlyhanie tvorby nového súboru s %s registrového obsahu vo %s", "commands.neoforge.dump.error.unknown_registry": "Neznámy register '%s'", "commands.neoforge.entity.list.invalid": "Invalidný filter, nezhoduje sa zo žiadnou entitou. Použite /neoforge entity list pre správny zoznam", - "commands.neoforge.entity.list.invalidworld": "Nebolo možné načítať správne svet pre dimenziu %1$s. Prosím vyberte validnú dimenziu.", + "commands.neoforge.entity.list.invalidworld": "Could not load world for dimension %1$s. Please select a valid dimension.", "commands.neoforge.entity.list.none": "Nenájdené žiadne entity.", - "commands.neoforge.entity.list.single.header": "Entita: %1$s Dokopy: %2$s", - "commands.neoforge.entity.list.multiple.header": "Dokopy: %1$s", - "commands.neoforge.setdim.invalid.entity": "Vybraná entita (%1$s) nie je validná.", - "commands.neoforge.setdim.invalid.dim": "Dimenzia s vybraným ID (%1$s) nie je validná.", - "commands.neoforge.setdim.invalid.nochange": "Vybraná entita (%1$s) už existuje v špecifikovanej dimenzii (%2$s).", + "commands.neoforge.entity.list.single.header": "Entity: %1$s Total: %2$s", + "commands.neoforge.entity.list.multiple.header": "Total: %1$s", + "commands.neoforge.setdim.invalid.entity": "The entity selected (%1$s) is not valid.", + "commands.neoforge.setdim.invalid.dim": "The dimension ID specified (%1$s) is not valid.", + "commands.neoforge.setdim.invalid.nochange": "The entity selected (%1$s) is already in the dimension specified (%2$s).", "commands.neoforge.setdim.deprecated": "Tento príkaz je zastaralý a bude vymazaný v 1.17, použite %s namiesto neho.", - "commands.neoforge.tps.invalid": "Invalidná dimenzia %1$s Možné hodnoty: %2$s", - "commands.neoforge.tps.summary.all": "Celkovo: Priemerný čas ticku: %1$s ms. Priemerné TPS: %2$s", - "commands.neoforge.mods.list": "List módov: %1$s", - "commands.neoforge.tps.summary.basic": "Dim %1$s: Priemerný čas ticku: %2$s ms. Priemerné TPS: %3$s", - "commands.neoforge.tps.summary.named": "Dim %1$s (%2$s): Priemerný čas ticku: %3$s ms. Priemerné TPS: %4$s", + "commands.neoforge.tps.invalid": "Invalid dimension %1$s Possible values: %2$s", + "commands.neoforge.tps.summary.all": "Overall: Mean tick time: %1$s ms. Mean TPS: %2$s", + "commands.neoforge.mods.list": "Mod List: %1$s", + "commands.neoforge.tps.summary.basic": "Dim %1$s: Mean tick time: %2$s ms. Mean TPS: %3$s", + "commands.neoforge.tps.summary.named": "Dim %1$s (%2$s): Mean tick time: %3$s ms. Mean TPS: %4$s", "commands.neoforge.tracking.entity.enabled": "Sledovanie entít povolené na %d sekúnd.", "commands.neoforge.tracking.entity.reset": "Údaje o časovaní entít boli vymazané!", "commands.neoforge.tracking.invalid": "Neplatné dáta sledovania.", @@ -101,14 +100,14 @@ "commands.neoforge.tags.element": "%s : %s", "commands.neoforge.tags.page_info": "%s ", "commands.neoforge.chunkgen.progress_bar_title": "Generovanie chunkov...", - "commands.neoforge.chunkgen.progress_bar_progress": "Generovanie %1$s chunkov - ", - "commands.neoforge.chunkgen.progress_bar_errors": "(%1$s errorov!)", + "commands.neoforge.chunkgen.progress_bar_progress": "Generating %1$s chunks - ", + "commands.neoforge.chunkgen.progress_bar_errors": "(%1$s errors!)", "commands.neoforge.chunkgen.already_running": "Generovanie je už spustené. Prosím spustite '/neoforge generation stop' a potom môžete spustiť nové generovanie.", - "commands.neoforge.chunkgen.started": "Generovanie %1$s chunkov, v zóne %2$sx%3$s chunkov (%4$sx%5$s blokov).", + "commands.neoforge.chunkgen.started": "Generating %1$s chunks, in an area of %2$sx%3$s chunks (%4$sx%5$s blocks).", "commands.neoforge.chunkgen.success": "Generovanie Dokončené!", - "commands.neoforge.chunkgen.error": "Generovanie zaznamenalo %1$s chýb! Pozrite log pre viac informácií.", - "commands.neoforge.chunkgen.stopped": "Generovanie sa zastavilo! %1$s z %2$s chunkov vygenerovaných. (%3$s%)", - "commands.neoforge.chunkgen.status": "Aktuálny status generovania! %1$s z celkových %2$s chunkov vygenerovaných. (%3$s%)", + "commands.neoforge.chunkgen.error": "Generation experienced %1$s errors! Check the log for more information.", + "commands.neoforge.chunkgen.stopped": "Generation stopped! %1$s out of %2$s chunks generated. (%3$s%)", + "commands.neoforge.chunkgen.status": "Generation status! %1$s out of %2$s chunks generated. (%3$s%)", "commands.neoforge.chunkgen.not_running": "Žiadne pregenerovnie chunkov nie je spustené. Spustite `/neoforge generate help` pre zobrazenie príkazov na začatie generovania.", "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start [progressBar] §r§f- Vygeneruje štvorcovo centrovane od danej pozície ktoreá je chunkRadius * 2 na každej strane\n§2/neoforge generate stop §r§f- Zastavý aktuálne generovanie a zobrazí sa docielený progres.\n§2/neoforge generate status §r- Zobrazí docielený progres aktuálne bežiacej generácie.\n§2/neoforge generate help §r- Zobrazí túto správu.\nVšeobecné rady: Pokiaľ je generovanie spúštané z konzoly serveru, môžete spustiť generovanie v iných dimenziách použitím /execute in neoforge generate...", "commands.config.getwithtype": "Konfigurácia pre %s typu %s nájdená v %s", @@ -177,8 +176,7 @@ "neoforge.selectWorld.backupWarning.experimental.additional": "Táto správa sa už nezobrazí znovu pre tento svet.", "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resource pack", - "pack.neoforge.source.child": "pomocný", - "neoforge.network.negotiation.failure.mod": "Kanál módu %1$s zlyhal s pripojením: %2$s", + "pack.neoforge.source.child": "child", "neoforge.network.negotiation.failure.missing.client.server": "Tento kanál nie je obsiahnutý na strane servera, ale je požadovaný u klienta!", "neoforge.network.negotiation.failure.missing.server.client": "Tento kanál nie je obsiahnutý na strane klienta, ale je požadovaný na serveri!", "neoforge.network.negotiation.failure.flow.client.missing": "Klient chce zaťaženie plynúť: %s, ale server to nepodporuje!", diff --git a/src/main/resources/assets/neoforge/lang/tr_tr.json b/src/main/resources/assets/neoforge/lang/tr_tr.json index eb91d6095f..c316785fca 100644 --- a/src/main/resources/assets/neoforge/lang/tr_tr.json +++ b/src/main/resources/assets/neoforge/lang/tr_tr.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Click to get to the homepage of this mod", "fml.modmismatchscreen.table.reason": "Reason", "fml.modmismatchscreen.table.visit.mod_page": "Open the mod page of the mod that registers the channel: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resource pack", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "This channel is missing on the server side, but required on the client!", "neoforge.network.negotiation.failure.missing.server.client": "This channel is missing on the client side, but required on the server!", "neoforge.network.negotiation.failure.flow.client.missing": "The client wants the payload to flow: %s, but the server does not support it!", diff --git a/src/main/resources/assets/neoforge/lang/tt_ru.json b/src/main/resources/assets/neoforge/lang/tt_ru.json index af13efb78b..ba453a1ac8 100644 --- a/src/main/resources/assets/neoforge/lang/tt_ru.json +++ b/src/main/resources/assets/neoforge/lang/tt_ru.json @@ -1,10 +1,10 @@ { - "fml.menu.mods": "Модлар", - "fml.menu.mods.title": "Модлар", - "fml.menu.mods.normal": "Сүнек", - "fml.menu.mods.search": "Эзләү", - "fml.menu.mods.a_to_z": "А-Я", - "fml.menu.mods.z_to_a": "Я-А", + "fml.menu.mods": "Mods", + "fml.menu.mods.title": "Mods", + "fml.menu.mods.normal": "Off", + "fml.menu.mods.search": "Search", + "fml.menu.mods.a_to_z": "A-Z", + "fml.menu.mods.z_to_a": "Z-A", "fml.menu.mods.config": "Config", "fml.menu.mods.openmodsfolder": "Open mods folder", "fml.menu.modoptions": "Mod Options...", @@ -18,7 +18,7 @@ "fml.menu.mods.info.signature": "Signature: %1$s", "fml.menu.mods.info.signature.unsigned": "UNSIGNED", "fml.menu.mods.info.trust": "Trust: %1$s", - "fml.menu.mods.info.trust.noauthority": "Юк", + "fml.menu.mods.info.trust.noauthority": "None", "fml.menu.mods.info.nochildmods": "No child mods found", "fml.menu.mods.info.childmods": "Child mods: %1$s", "fml.menu.mods.info.updateavailable": "Update available: %1$s", @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "Click to get to the homepage of this mod", "fml.modmismatchscreen.table.reason": "Reason", "fml.modmismatchscreen.table.visit.mod_page": "Open the mod page of the mod that registers the channel: %s", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "This build of NeoForge was created by a community member and is thus §c§lUNSUPPORTED§r", @@ -167,18 +166,17 @@ "neoforge.swim_speed": "Swim Speed", "neoforge.name_tag_distance": "Nametag Render Distance", "neoforge.creative_flight": "Creative Flight", - "fluid_type.minecraft.milk": "Сөт", - "fluid_type.minecraft.flowing_milk": "Сөт", + "fluid_type.minecraft.milk": "Milk", + "fluid_type.minecraft.flowing_milk": "Milk", "neoforge.froge.warningScreen.title": "NeoForge snapshots notice", "neoforge.froge.warningScreen.text": "Froge is not officially supported. Bugs and instability are expected.", "neoforge.froge.supportWarning": "WARNING: Froge is not supported by NeoForge", - "neoforge.gui.exit": "Чыгарга", + "neoforge.gui.exit": "Exit", "neoforge.experimentalsettings.tooltip": "This world uses experimental settings, which could stop working at any time.", "neoforge.selectWorld.backupWarning.experimental.additional": "This message will not show again for this world.", "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge data/resource pack", - "pack.neoforge.source.child": "ярдәмче", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", + "pack.neoforge.source.child": "child", "neoforge.network.negotiation.failure.missing.client.server": "This channel is missing on the server side, but required on the client!", "neoforge.network.negotiation.failure.missing.server.client": "This channel is missing on the client side, but required on the server!", "neoforge.network.negotiation.failure.flow.client.missing": "The client wants the payload to flow: %s, but the server does not support it!", diff --git a/src/main/resources/assets/neoforge/lang/uk_ua.json b/src/main/resources/assets/neoforge/lang/uk_ua.json index 4ff6bb8048..a63890499a 100644 --- a/src/main/resources/assets/neoforge/lang/uk_ua.json +++ b/src/main/resources/assets/neoforge/lang/uk_ua.json @@ -35,7 +35,7 @@ "fml.menu.multiplayer.extraservermods": "На сервері є додаткові моди, які можуть бути потрібні для клієнта", "fml.menu.multiplayer.modsincompatible": "Перелік модів сервера не сумісний", "fml.menu.multiplayer.networkincompatible": "Перелік мережевих повідомлень сервера не сумісний", - "fml.menu.multiplayer.missingdatapackregistries": "Відсутні необхідні реєстри наборів даних: %1$s", + "fml.menu.multiplayer.missingdatapackregistries": "Відсутні необхідні Datapack реєстри: %1$s", "fml.menu.loadingmods": "{0,choice,0#0 модів|1#1 мод|1<%s модів} завантажено", "fml.menu.notification.title": "Сповіщення запуску", "fml.menu.accessdenied.title": "Відмовлено в доступі до сервера", @@ -57,8 +57,7 @@ "fml.modmismatchscreen.additional": "[%1$s додатково, перегляньте latest.log для повного списку]", "fml.modmismatchscreen.homepage": "Натисніть, щоб перейти на домашню сторінку цього моду", "fml.modmismatchscreen.table.reason": "Причина", - "fml.modmismatchscreen.table.visit.mod_page": "Відкрийте сторінку мода, який реєструє канал: %s", - "fml.modmismatchscreen.simplifiedview": "Спрощений вигляд", + "fml.modmismatchscreen.table.visit.mod_page": "Відкрийте сторінку моду, який реєструє канал: %s", "fml.resources.modresources": "Ресурси для %1$s файлів модів", "fml.resources.moddata": "Дані для %1$s файлів модів", "loadwarning.neoforge.prbuild": "Ця збірка NeoForge була створена членом спільноти й тому §c§lНЕ ПІДТРИМУЄТЬСЯ§r", @@ -87,7 +86,7 @@ "commands.neoforge.tracking.be.enabled": "Відстеження блок-сутностей увімкнено на %d секунд.", "commands.neoforge.tracking.be.reset": "Данні таймінгів блок-сутностей були очищені!", "commands.neoforge.tracking.timing_entry": "%1$s - %2$s [%3$s, %4$s, %5$s]: %6$s", - "commands.neoforge.tracking.no_data": "Данні не були ще записаними.", + "commands.neoforge.tracking.no_data": "Ніякі данні не були ще записаними.", "commands.neoforge.tags.error.unknown_registry": "Невідомий реєстр '%s'", "commands.neoforge.tags.error.unknown_tag": "Невідомий тег '%s' в реєстрі '%s'", "commands.neoforge.tags.error.unknown_element": "Невідомий елемент '%s' в реєстрі '%s", @@ -101,9 +100,9 @@ "commands.neoforge.tags.element": "%s : %s", "commands.neoforge.tags.page_info": "%s ", "commands.neoforge.chunkgen.progress_bar_title": "Генерація чанків...", - "commands.neoforge.chunkgen.progress_bar_progress": "Генерація %1$s чанків - ", + "commands.neoforge.chunkgen.progress_bar_progress": "Генерування %1$s чанків - ", "commands.neoforge.chunkgen.progress_bar_errors": "(%1$s помилок!)", - "commands.neoforge.chunkgen.already_running": "Генерація вже виконується. Будь ласка, виконайте спочатку '/neoforge generate stop' і тоді вже можете почати нову генерацію.", + "commands.neoforge.chunkgen.already_running": "Генерація вже виконується. Будь ласка, виконайте спочатку '/neoforge generate stop', а потім ви можете почати нову генерацію.", "commands.neoforge.chunkgen.started": "Генерація %1$s чанків, в області %2$sx%3$s чанків (%4$sx%5$s блоків).", "commands.neoforge.chunkgen.success": "Генерація виконана!", "commands.neoforge.chunkgen.error": "Генерація зазнала %1$s помилок! Перевірте журнал для отримання додаткової інформації.", @@ -124,8 +123,8 @@ "neoforge.configgui.fullBoundingBoxLadders.tooltip": "Встановіть значення \"true\", для повної перевірки колізії сутностей з драбинами, замість просто блоку, в якому вони знаходяться. Спричиняє помітні відмінності в механіці, тому за замовчуванням використовується ванільна поведінка. За замовчуванням: false.", "neoforge.configgui.fullBoundingBoxLadders": "Повні області колізії з драбиною", "neoforge.configgui.logCascadingWorldGeneration.tooltip": "Логує проблеми каскадної генерації чанків при формуванні місцевості.", - "neoforge.configgui.logCascadingWorldGeneration": "Записувати каскадне генерування світу", - "neoforge.configgui.fixVanillaCascading.tooltip": "Виправити ванільні помилки, що призводять до каскадної генерації світу. Це ТОЧНО змінює ванільну генерацію, так що НЕ повідомляйте про помилки, пов'язані з різницями світів, коли цей прапор увімкнено.", + "neoforge.configgui.logCascadingWorldGeneration": "Записувати Каскадне Генерування Світу", + "neoforge.configgui.fixVanillaCascading.tooltip": "Виправити ванільні, що призводять до каскадної генерації світу. Це ТОЧНО змінює ванільну генерацію так, що НЕ повідомляйте про помилки, пов'язані з різницями світів, коли цей прапор увімкнено.", "neoforge.configgui.fixVanillaCascading": "Виправити ванільне каскадування", "neoforge.configgui.dimensionUnloadQueueDelay.tooltip": "Час в тіках, при якому сервер буде чекати, поки вимір в черзі на відвантаження. Це може бути корисним при швидкому завантаженні та вивантаженні вимірів, як, наприклад, кидання предметів через портал в незер кілька разів на секунду.", "neoforge.configgui.dimensionUnloadQueueDelay": "Затримка при відвантаженні виміру", @@ -144,17 +143,17 @@ "neoforge.configgui.disableStairSlabCulling.tooltip": "Вимкнути вибракування прихованих сторін сходів і планів. Призводить до додаткового рендерингу, але може виправити деякі пакети ресурсів, які використовують цю ванільну механіку.", "neoforge.configgui.disableStairSlabCulling": "Вимкнути вибракування сходів/плиток", "neoforge.configgui.alwaysSetupTerrainOffThread.tooltip": "Активує можливість NeoForge для додавання всіх оновлень чанків в чергу потоку оновлення чанків.\nЦе може значно підвищити FPS, але також може викликати дивні затримки при рендерингу.\nНе рекомендується для комп'ютерів з невеликою кількістю доступних ядер.", - "neoforge.configgui.alwaysSetupTerrainOffThread": "Примушувати багатопотоковий рендеринг чанків", + "neoforge.configgui.alwaysSetupTerrainOffThread": "Примушувати багатопотокового рендерингу чанків", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "Активує конвеєр NeoForge для рендерингу блоків — виправляє освітлення користувацьких моделей.", "neoforge.configgui.forgeLightPipelineEnabled": "Конвеєр світла NeoForge увімкнено", "neoforge.configgui.selectiveResourceReloadEnabled.tooltip": "Коли ввімкнено, пришвидшує деякі завдання перезавантаження, такі як зміна мови.", "neoforge.configgui.selectiveResourceReloadEnabled": "Увімкнути вибіркове завантаження ресурсів", "neoforge.configgui.showLoadWarnings.tooltip": "Коли увімкнено, NeoForge покаже всі попередження, що сталися під час завантаження.", "neoforge.configgui.showLoadWarnings": "Показувати попередження при завантаженні", - "neoforge.configgui.disableVersionCheck.tooltip": "Встановіть значення \"true\", щоб вимкнути механіку перевірки версій NeoForge. NeoForge запитує маленький json файл на нашому сервері для отримання інформації про версії. Для більш детальної інформації дивіться клас ForgeVersion у нашому GitHub.", + "neoforge.configgui.disableVersionCheck.tooltip": "Встановіть значення \"true\", щоб відімкнути механіку перевірки версій NeoForge. NeoForge запитує маленький json файл на нашому сервері для отримання інформації про версії. Для більш детальної інформації дивіться клас ForgeVersion у нашому GitHub.", "neoforge.configgui.disableVersionCheck": "Вимкнути перевірку версій NeoForge", "neoforge.configgui.cachePackAccess.tooltip": "Встановіть значення \"true\" для кешування списки ресурсів в наборах ресурсів та даних", - "neoforge.configgui.cachePackAccess": "Кешувати доступ до пакетів", + "neoforge.configgui.cachePackAccess": "Доступ до кешу пакетам", "neoforge.configgui.indexVanillaPackCachesOnThread.tooltip": "Встановіть значення \"true\" для індексування ванільних пакетів ресурсів та даних в потоці", "neoforge.configgui.indexVanillaPackCachesOnThread": "Індексувати ванільні пакети ресурсів в потоці", "neoforge.configgui.indexModPackCachesOnThread.tooltip": "Встановіть значення \"true\" для індексування наборів ресурсів і пакетів даних у потоці", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "Пакет даних/ресурсів NeoForge", "pack.neoforge.source.child": "є дочірнім", - "neoforge.network.negotiation.failure.mod": "Не вдалося з'єднатися з каналом моду \"%1$s\": %2$s", "neoforge.network.negotiation.failure.missing.client.server": "Цей канал відсутній на стороні сервера, але необхідний на клієнті!", "neoforge.network.negotiation.failure.missing.server.client": "Цей канал відсутній на стороні клієнта, але необхідний на сервері!", "neoforge.network.negotiation.failure.flow.client.missing": "Клієнт хоче передати корисне навантаження на потік: %s, але сервер не підтримує це!", @@ -199,6 +197,6 @@ "neoforge.network.registries.sync.failed": "Не вдалося синхронізувати реєстри з сервера: %s", "neoforge.network.aux_light_data.failed": "Не вдалося опрацювати допоміжні дані для освітлення чанку %s: %s", "neoforge.network.data_maps.failed": "Не вдалося опрацювати синхронізацію реєстрових мап даних для реєстру %s: %s", - "neoforge.network.data_maps.missing_our": "Не вдається приєднатися до сервера, оскільки на клієнті відсутні обов'язкові мапи даних реєстру: %s", - "neoforge.network.data_maps.missing_their": "Не вдається приєднатися до сервера, оскільки присутні обов'язкові мапи даних реєстру, що відсутні на клієнті: %s" + "neoforge.network.data_maps.missing_our": "Не вдається під'єднатися до сервера, оскільки на клієнті відсутні обов'язкові мапи даних реєстру: %s", + "neoforge.network.data_maps.missing_their": "Не вдається під'єднатися до сервера, оскільки присутні обов'язкові мапи даних реєстру, що відсутні на клієнті: %s" } diff --git a/src/main/resources/assets/neoforge/lang/zh_cn.json b/src/main/resources/assets/neoforge/lang/zh_cn.json index ba8d69b3d3..b4b99a312b 100644 --- a/src/main/resources/assets/neoforge/lang/zh_cn.json +++ b/src/main/resources/assets/neoforge/lang/zh_cn.json @@ -25,14 +25,14 @@ "fml.menu.mods.info.changelogheader": "更新日志:", "fml.menu.multiplayer.compatible": "兼容的 FML 服务器\n有 {0,choice,0<%1$s 个} 模组", "fml.menu.multiplayer.incompatible": "不兼容的 FML 模组服务器", - "fml.menu.multiplayer.incompatible.extra": "不兼容的 FML 模组服务器\n%1$s", + "fml.menu.multiplayer.incompatible.extra": "不兼容的 FML 服务器\n%1$s", "fml.menu.multiplayer.truncated": "由于协议大小限制,数据可能不准确。", "fml.menu.multiplayer.vanilla": "原版服务器", "fml.menu.multiplayer.vanilla.incompatible": "不兼容的原版服务器", "fml.menu.multiplayer.unknown": "未知服务器\n%1$s", "fml.menu.multiplayer.serveroutdated": "NeoForge 服务端网络版本已过时", "fml.menu.multiplayer.clientoutdated": "NeoForge 客户端网络版本已过时", - "fml.menu.multiplayer.extraservermods": "服务器上安装了可能需要同时在客户端安装的额外模组", + "fml.menu.multiplayer.extraservermods": "服务器上安装了客户端可能也需要的其他模组", "fml.menu.multiplayer.modsincompatible": "服务器模组列表不兼容", "fml.menu.multiplayer.networkincompatible": "服务器网络消息列表不兼容", "fml.menu.multiplayer.missingdatapackregistries": "缺少所需的数据包注册项:%1$s", @@ -50,24 +50,23 @@ "fml.modmismatchscreen.missingmods.client": "您的客户端缺少以下模组,安装这些模组来加入此服务器:", "fml.modmismatchscreen.missingmods.server": "服务器缺少以下模组,请从客户端移除这些模组以加入此服务器:", "fml.modmismatchscreen.mismatchedmods": "以下模组版本不匹配,请安装相同版本的这些模组以加入此服务器:", - "fml.modmismatchscreen.table.channelname": "网络通道名称", - "fml.modmismatchscreen.table.youneed": "需要安装", + "fml.modmismatchscreen.table.channelname": "频道名称", + "fml.modmismatchscreen.table.youneed": "你需要", "fml.modmismatchscreen.table.youhave": "客户端已安装", "fml.modmismatchscreen.table.serverhas": "服务器已安装", "fml.modmismatchscreen.additional": "[还有 %1$s 个,查看 latest.log 获取完整列表]", - "fml.modmismatchscreen.homepage": "点击以访问此模组的主页", + "fml.modmismatchscreen.homepage": "点击来访问这个模组的主页", "fml.modmismatchscreen.table.reason": "原因", - "fml.modmismatchscreen.table.visit.mod_page": "打开注册此网络通道的模组(%s)页面", - "fml.modmismatchscreen.simplifiedview": "简化视图", + "fml.modmismatchscreen.table.visit.mod_page": "打开注册此频道的模组(%s)页面", "fml.resources.modresources": "%1$s 模组文件的资源", "fml.resources.moddata": "%1$s 模组文件数据", "loadwarning.neoforge.prbuild": "这个 NeoForge 构建由社区成员创建,是 §c§l不受支持§r 的", "commands.neoforge.arguments.enum.invalid": "枚举常量必须是 %1$s 之一,但发现了 %2$s", - "commands.neoforge.dimensions.list": "当前已注册的维度,按维度类型展示:", + "commands.neoforge.dimensions.list": "当前按类型注册的维度:", "commands.neoforge.dump.success": "据 %s 注册表内容创建的新文件位于 %s", "commands.neoforge.dump.failure": "未能据 %s 注册表内容于 %s 创建新文件", "commands.neoforge.dump.error.unknown_registry": "未知注册表 ‘%s’", - "commands.neoforge.entity.list.invalid": "无效的过滤器,与任何实体不匹配。使用 /neoforge entity list 以获取正确列表。", + "commands.neoforge.entity.list.invalid": "无效的过滤器,与任何实体不匹配。/neoforge entity list 提供正确列表。", "commands.neoforge.entity.list.invalidworld": "无法加载存档中的维度 %1$s。请选择一个有效维度。", "commands.neoforge.entity.list.none": "找不到实体。", "commands.neoforge.entity.list.single.header": "实体:%1$s 总计:%2$s", @@ -106,8 +105,8 @@ "commands.neoforge.chunkgen.already_running": "生成已在进行。请先执行 '/neoforge generate stop' 再开始新生成。", "commands.neoforge.chunkgen.started": "正在于 %2$sx%3$s 区块范围(%4$sx%5$s 个方块)中生成 %1$s 个区块。", "commands.neoforge.chunkgen.success": "生成完毕!", - "commands.neoforge.chunkgen.error": "生成中发生了 %1$s 个错误!请检查日志以获取更多信息。", - "commands.neoforge.chunkgen.stopped": "生成停止!%1$s/%2$s 个区块已生成。(%3$s%)", + "commands.neoforge.chunkgen.error": "Generation experienced %1$s errors! Check the log for more information.", + "commands.neoforge.chunkgen.stopped": "Generation stopped! %1$s out of %2$s chunks generated. (%3$s%)", "commands.neoforge.chunkgen.status": "生成状态!已生成 %2$s 区块中的 %1$s。(%3$s%)", "commands.neoforge.chunkgen.not_running": "无进行中的预生成。运行 `/neoforge generate help` 以查看开始生成的命令。", "commands.neoforge.chunkgen.help_line": "§2/neoforge generate start [progressBar] §r§f- 生成一个以给定坐标为中心的、边长为 chunkRadius * 2 的正方形。\n§2/neoforge generate stop §r§f- 停止当前生成,显示完成进度。\n§2/neoforge generate status §r- 显示当前生成的完成进度。\n§2/neoforge generate help §r- 显示此消息\n通用提示:如果从服务器控制台执行,可以通过 '/execute in neoforge generate...' 在特定维度执行。", @@ -117,23 +116,23 @@ "neoforge.update.beta.2": "可能会出现重大问题,请在报告之前进行核实。", "neoforge.update.newversion": "新版本 NeoForge 可用:%s", "neoforge.menu.updatescreen.title": "模组更新", - "neoforge.configgui.removeErroringEntities.tooltip": "将此项设置为 true,以删除任何在其 update 方法中抛出异常的实体,而不是关闭服务器和报告崩溃日志。 警告:这可能损坏一切,请谨慎使用,我们不对可能造成的损失负任何责任。", + "neoforge.configgui.removeErroringEntities.tooltip": "将此设置为 true,以删除任何在\"update\"方法中出现错误的实体,而不是关闭服务器和报告崩溃日志。 警告:这可能损坏一切,我们不对此负任何责任。", "neoforge.configgui.removeErroringEntities": "删除错误实体", - "neoforge.configgui.removeErroringBlockEntities.tooltip": "将此项设置为 true,以删除任何在其 update 方法中抛出异常的方块实体,而不是关闭服务器和报告崩溃日志。 警告:这可能损坏一切,请谨慎使用,我们不对可能造成的损失负任何责任。", + "neoforge.configgui.removeErroringBlockEntities.tooltip": "将此设置为 true,以删除任何在\"update\"方法中出现错误的方块实体,而不是关闭服务器和报告崩溃日志。 警告:这可能损坏一切,我们不对此负任何责任。", "neoforge.configgui.removeErroringBlockEntities": "删除错误方块实体", - "neoforge.configgui.fullBoundingBoxLadders.tooltip": "将此项设置为true,以使梯子检查整个实体的碰撞箱,而不仅仅是它们所处的方块。这将导致明显的机制差异,因此默认使用原版行为。默认:false。", - "neoforge.configgui.fullBoundingBoxLadders": "梯子使用完整实体碰撞箱", + "neoforge.configgui.fullBoundingBoxLadders.tooltip": "将此设置为true,以为梯子检查整个实体的绑定箱,而不仅仅是它们所处的方块。导致明显的机制差异,因此默认是原版行为。默认:false。", + "neoforge.configgui.fullBoundingBoxLadders": "全绑定箱梯子", "neoforge.configgui.logCascadingWorldGeneration.tooltip": "记录地形生成中的连锁生成问题。", "neoforge.configgui.logCascadingWorldGeneration": "记录连锁世界生成", - "neoforge.configgui.fixVanillaCascading.tooltip": "修复原版中导致连锁世界生成的问题。这将改变原版世界生成,因此启用此项时请不要报告与世界差异相关的错误。", + "neoforge.configgui.fixVanillaCascading.tooltip": "修复导致连锁世界生成的原版问题。 此会改变原版世界生成。如果打开这个,请不要报告与世界差异相关的错误。", "neoforge.configgui.fixVanillaCascading": "修复原版连锁生成", "neoforge.configgui.dimensionUnloadQueueDelay.tooltip": "服务器等待某维度排队卸载时的延迟,以游戏刻为单位。 当快速加载和卸载维度时,这可能是有用的,例如每秒通过下界传送门扔物品。", "neoforge.configgui.dimensionUnloadQueueDelay": "卸载维度时的延迟", - "neoforge.configgui.clumpingThreshold.tooltip": "控制 Packet51 优先于 Packet52 的阈值,默认和最小为 64,最大为 1024。", + "neoforge.configgui.clumpingThreshold.tooltip": "控制 Packet51 优先于 Packet52,默认和最小为 64,最多 1024。", "neoforge.configgui.clumpingThreshold": "数据包克隆阈值", - "neoforge.configgui.treatEmptyTagsAsAir.tooltip": "原版将把合成配方中的空标签视为空气,并允许您在合成时在对应的栏位中不使用任何物品。 此项会更改空标签对应的物品为屏障,以防止在合成中使用空气。", + "neoforge.configgui.treatEmptyTagsAsAir.tooltip": "原版将使用空标签合成配方视为空气,并允许您在这个格子中没有任何东西。 这会更改空标签以使用屏障作为条目。防止与空气一起合成。", "neoforge.configgui.treatEmptyTagsAsAir": "将空标签视为空气", - "neoforge.configgui.skipEmptyShapelessCheck.tooltip": "在无序配方反序列化过程中跳过检查原材料是否为空,以防止复杂的原材料过早缓存标签。", + "neoforge.configgui.skipEmptyShapelessCheck.tooltip": "在无序配方反序列化过程中跳过检查成分是否为空,以防止复杂的成分过早缓存标签。", "neoforge.configgui.skipEmptyShapelessCheck": "跳过无须配方反序列化中的空成分检查", "neoforge.configgui.forceSystemNanoTime.tooltip": "强制使用 System.nanoTime 而不是 glfwGetTime 为主要客户端提供时间。", "neoforge.configgui.forceSystemNanoTime": "强制使用 System.nanoTime", @@ -141,9 +140,9 @@ "neoforge.configgui.zoomInMissingModelTextInGui": "放大图形界面中缺少的模型文本", "neoforge.configgui.forgeCloudsEnabled.tooltip": "启用上传云几何图形到 GPU 以便更快渲染。", "neoforge.configgui.forgeCloudsEnabled": "使用 NeoForge 云渲染器", - "neoforge.configgui.disableStairSlabCulling.tooltip": "禁用剔除楼梯和台阶旁边的隐藏面。这会造成额外的渲染,但可能会修复一些会导致原版机制出错的资源包。", + "neoforge.configgui.disableStairSlabCulling.tooltip": "禁用剔除楼梯和板块旁边的隐藏面。造成额外的渲染,但可能会修复一些会导致原版机制出错的资源包。", "neoforge.configgui.disableStairSlabCulling": "禁用楼梯/台阶剔除", - "neoforge.configgui.alwaysSetupTerrainOffThread.tooltip": "启用以让 NeoForge 将所有区块更新移动到专门的线程。\n可能显著提升 FPS,但同时也可能导致奇怪的渲染延迟。\n只推荐在处理器核心足够的电脑上启用。", + "neoforge.configgui.alwaysSetupTerrainOffThread.tooltip": "启用来使所有区块更新移动到专门的线程。\n可能显著提升 FPS", "neoforge.configgui.alwaysSetupTerrainOffThread": "强制线程化区块渲染", "neoforge.configgui.forgeLightPipelineEnabled.tooltip": "启用 NeoForge 方块渲染管线 - 修复自定义模型的光照问题。", "neoforge.configgui.forgeLightPipelineEnabled": "NeoForge 光照渲染管线启用", @@ -163,7 +162,7 @@ "neoforge.controlsgui.control": "CTRL + %s", "neoforge.controlsgui.control.mac": "CMD + %s", "neoforge.controlsgui.alt": "ALT + %s", - "neoforge.container.enchant.limitedEnchantability": "附魔能力受限", + "neoforge.container.enchant.limitedEnchantability": "有限附魔性", "neoforge.swim_speed": "游泳速度", "neoforge.name_tag_distance": "名称标签渲染距离", "neoforge.creative_flight": "创造模式飞行", @@ -177,10 +176,9 @@ "neoforge.selectWorld.backupWarning.experimental.additional": "此消息将不会再为这个世界显示。", "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge 数据/资源包", - "pack.neoforge.source.child": "子项", - "neoforge.network.negotiation.failure.mod": "模组的网络通道 \"%1$s\" 连接失败:%2$s", - "neoforge.network.negotiation.failure.missing.client.server": "服务端缺少此客户端需要的网络通道!", - "neoforge.network.negotiation.failure.missing.server.client": "客户端缺少此服务端需要的网络通道!", + "pack.neoforge.source.child": "child", + "neoforge.network.negotiation.failure.missing.client.server": "服务器端无此客户端需要的频道!", + "neoforge.network.negotiation.failure.missing.server.client": "客户端无此服务器端需要的频道!", "neoforge.network.negotiation.failure.flow.client.missing": "客户端希望传输在流 %s 上传输载荷,但服务器端不支持!", "neoforge.network.negotiation.failure.flow.server.missing": "服务器端希望传输在流 %s 上传输载荷,但客户端不支持!", "neoforge.network.negotiation.failure.flow.client.mismatch": "客户端希望在 %s 流上传输此载荷,但服务器端希望在 %s!", @@ -199,6 +197,6 @@ "neoforge.network.registries.sync.failed": "从服务器同步注册表失败:%s", "neoforge.network.aux_light_data.failed": "无法处理区块 %s 的辅助光线数据:%s", "neoforge.network.data_maps.failed": "处理注册表数据映射同步失败 %s: %s", - "neoforge.network.data_maps.missing_our": "无法连接至服务器,因为客户端缺少必要的注册表数据映射:%s", - "neoforge.network.data_maps.missing_their": "无法连接至服务器,因为客户端上不存在必要的注册表数据映射:%s" + "neoforge.network.data_maps.missing_our": "无法连接服务器,因为缺少客户端上存在的强制注册表数据映射:%s", + "neoforge.network.data_maps.missing_their": "无法连接服务器,应为客户端上不存在强制的注册表数据映射:%s" } diff --git a/src/main/resources/assets/neoforge/lang/zh_hk.json b/src/main/resources/assets/neoforge/lang/zh_hk.json index 7fb543d894..36a6694e3c 100644 --- a/src/main/resources/assets/neoforge/lang/zh_hk.json +++ b/src/main/resources/assets/neoforge/lang/zh_hk.json @@ -58,7 +58,6 @@ "fml.modmismatchscreen.homepage": "點擊以前往這個模組的主頁", "fml.modmismatchscreen.table.reason": "原因", "fml.modmismatchscreen.table.visit.mod_page": "開啟登錄此頻道的模組(%s)頁面", - "fml.modmismatchscreen.simplifiedview": "Simplified view", "fml.resources.modresources": "Resources for %1$s mod files", "fml.resources.moddata": "Data for %1$s mod files", "loadwarning.neoforge.prbuild": "這個 NeoForge 由社群成員建立,是 §c§l不受支援§r 的", @@ -178,7 +177,6 @@ "neoforge.chatType.system": "%1$s", "pack.neoforge.description": "NeoForge 資料/資源包", "pack.neoforge.source.child": "child", - "neoforge.network.negotiation.failure.mod": "Channel of mod \"%1$s\" failed to connect: %2$s", "neoforge.network.negotiation.failure.missing.client.server": "伺服器端缺少這個頻道,但用戶端需要它!", "neoforge.network.negotiation.failure.missing.server.client": "用戶端缺少這個頻道,但伺服器需要它!", "neoforge.network.negotiation.failure.flow.client.missing": "用戶端希望在串流 %s 上傳輸承載,但伺服器端不支援!", diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/resources/BulkKnownPackTest.java b/tests/src/main/java/net/neoforged/neoforge/debug/resources/BulkKnownPackTest.java index 9fb96b479a..49ccfa8db7 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/resources/BulkKnownPackTest.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/resources/BulkKnownPackTest.java @@ -66,7 +66,7 @@ public void onEnabled(TestFramework framework, Test test, @Nullable Entity chang RegistryAccess access = changer.registryAccess(); access.registry(Registries.BIOME).ifPresentOrElse(biomes -> { for (int i = 0; i < 128; i++) { - var id = ResourceLocation.fromNamespaceAndPath(NAMESPACE, "entry_" + i); + var id = new ResourceLocation(NAMESPACE, "entry_" + i); if (biomes.getHolder(id).isEmpty()) { framework.changeStatus(test, Test.Status.failed("Entry " + id + " that should be synced by KnownPack not found"), changer); return; @@ -94,6 +94,6 @@ private static void generateEntry(LoginPacketSplitTest.InMemoryResourcePack pack json.add("spawn_costs", new JsonObject()); json.add("carvers", new JsonObject()); json.add("features", new JsonArray()); - pack.putData(ResourceLocation.fromNamespaceAndPath(NAMESPACE, "worldgen/biome/entry_" + i + ".json"), json); + pack.putData(new ResourceLocation(NAMESPACE, "worldgen/biome/entry_" + i + ".json"), json); } }