diff --git a/build.gradle b/build.gradle index 46d88cc..f2aa80d 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1+', changing: true + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '[6.0.24,6.2)', changing: true classpath group: 'org.spongepowered', name: 'mixingradle', version: '0.7-SNAPSHOT' classpath group: 'gradle.plugin.com.modrinth.minotaur', name: 'Minotaur', version: '1.2.1' classpath group: 'gradle.plugin.com.matthewprenger', name: 'CurseGradle', version: '1.4.0' @@ -19,7 +19,7 @@ buildscript { plugins { id 'maven-publish' - id 'net.minecraftforge.gradle' version '5.1.+' + id 'net.minecraftforge.gradle' version '[6.0.24,6.2)' id 'org.parchmentmc.librarian.forgegradle' version '1.+' } @@ -55,7 +55,7 @@ version = config.VERSION group = "${config.GROUP}.${config.ARTIFACT}" archivesBaseName = "${config.ARCHIVES_BASE_NAME}-${config.MINECRAFT_VERSION}" -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java.toolchain.languageVersion = JavaLanguageVersion.of(21) minecraft { mappings channel: config.MAPPINGS_CHANNEL, version: config.MAPPINGS_VERSION @@ -120,6 +120,7 @@ repositories { dependencies { minecraft "net.minecraftforge:forge:${config.MINECRAFT_VERSION}-${config.FORGE_VERSION}" annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' + implementation('net.sf.jopt-simple:jopt-simple:5.0.4') { version { strictly '5.0.4' } } } jar { @@ -222,3 +223,9 @@ idea { downloadSources = true } } + +sourceSets.each { + def dir = layout.buildDirectory.dir("sourcesSets/$it.name") + it.output.resourcesDir = dir + it.java.destinationDirectory = dir +} \ No newline at end of file diff --git a/build.properties b/build.properties index 183e07e..2cfcf20 100644 --- a/build.properties +++ b/build.properties @@ -1,8 +1,8 @@ VERSION=1.2.0 -MINECRAFT_VERSION=1.20.1 -FORGE_VERSION=47.1.0 +MINECRAFT_VERSION=1.21.1 +FORGE_VERSION=52.0.38 MAPPINGS_CHANNEL=parchment -MAPPINGS_VERSION=2023.07.30-1.20.1 +MAPPINGS_VERSION=2024.11.17-1.21.1 GROUP=org.infernalstudios ARTIFACT=shieldexp diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e583..c1962a7 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8049c68..bb6c191 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index a69d9cb..aeb74cb 100644 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -143,12 +140,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +194,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in diff --git a/gradlew.bat b/gradlew.bat index f127cfd..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% diff --git a/settings.gradle b/settings.gradle index 8867a6d..001f972 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,14 @@ pluginManagement { repositories { gradlePluginPortal() - maven { url = 'https://maven.minecraftforge.net/' } + maven { + name = 'MinecraftForge' + url = 'https://maven.minecraftforge.net/' + } maven { url = 'https://maven.parchmentmc.org' } } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' } \ No newline at end of file diff --git a/src/main/java/org/infernalstudios/shieldexp/ShieldExpansion.java b/src/main/java/org/infernalstudios/shieldexp/ShieldExpansion.java index d4f87ba..21649c3 100644 --- a/src/main/java/org/infernalstudios/shieldexp/ShieldExpansion.java +++ b/src/main/java/org/infernalstudios/shieldexp/ShieldExpansion.java @@ -40,12 +40,12 @@ public class ShieldExpansion { public static final String MOD_ID = "shieldexp"; public static final Logger LOGGER = LogManager.getLogger(NAME); - public ShieldExpansion() { - IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); + public ShieldExpansion(FMLJavaModLoadingContext context) { + IEventBus modBus = context.getModEventBus(); ItemsInit.ITEMS.register(modBus); SoundsInit.SOUND_EVENTS.register(modBus); - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.CONFIG, "ShieldExpansion-common.toml"); + context.registerConfig(ModConfig.Type.COMMON, Config.CONFIG, "ShieldExpansion-common.toml"); modBus.addListener(this::clientSetup); modBus.addListener(this::commonSetup); diff --git a/src/main/java/org/infernalstudios/shieldexp/compat/BetterCombatAttackListener.java b/src/main/java/org/infernalstudios/shieldexp/compat/BetterCombatAttackListener.java index 0f074a9..83c4441 100644 --- a/src/main/java/org/infernalstudios/shieldexp/compat/BetterCombatAttackListener.java +++ b/src/main/java/org/infernalstudios/shieldexp/compat/BetterCombatAttackListener.java @@ -17,7 +17,7 @@ public static void register() { BetterCombatClientEvents.ATTACK_START.register((LocalPlayer player, AttackHand hand) -> { Item item = player.getOffhandItem().getItem(); if (Boolean.TRUE.equals(Config.isShield(item))) { - player.getAttribute(Attributes.MOVEMENT_SPEED).removeModifier(player.getUUID()); + player.getAttribute(Attributes.MOVEMENT_SPEED).removeModifiers(); LivingEntityAccess.get(player).setBlocking(false); LivingEntityAccess.get(player).setParryWindow(0); if (!player.getCooldowns().isOnCooldown(item)) diff --git a/src/main/java/org/infernalstudios/shieldexp/events/ClientEvents.java b/src/main/java/org/infernalstudios/shieldexp/events/ClientEvents.java index c96d052..0c00fbc 100644 --- a/src/main/java/org/infernalstudios/shieldexp/events/ClientEvents.java +++ b/src/main/java/org/infernalstudios/shieldexp/events/ClientEvents.java @@ -52,7 +52,7 @@ public static void setup() { private static void initShields() { ItemPropertyFunction blockFn = (stack, world, entity, seed) -> entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1.0F : 0.0F; for (RegistryObject shieldItem : ItemsInit.SHIELDS) - ItemProperties.register(shieldItem.get(), new ResourceLocation("minecraft:blocking"), blockFn); + ItemProperties.register(shieldItem.get(), ResourceLocation.parse("minecraft:blocking"), blockFn); } //desyncs from the server to allow the player to attack despite currently blocking, state is resynced on server-side useTick diff --git a/src/main/java/org/infernalstudios/shieldexp/events/ShieldExpansionEvents.java b/src/main/java/org/infernalstudios/shieldexp/events/ShieldExpansionEvents.java index 25a367d..82162ff 100644 --- a/src/main/java/org/infernalstudios/shieldexp/events/ShieldExpansionEvents.java +++ b/src/main/java/org/infernalstudios/shieldexp/events/ShieldExpansionEvents.java @@ -3,6 +3,7 @@ import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -53,8 +54,8 @@ public void onStartUsing(LivingEntityUseItemEvent.Start event) { LivingEntityAccess.get(player).setParryWindow(parryTicks); LivingEntityAccess.get(player).setBlockedCooldown(10); LivingEntityAccess.get(player).setUsedStamina(0); - AttributeModifier speedModifier = new AttributeModifier(player.getUUID() , "Blocking Speed", 4.0*getShieldValue(item, "speedFactor"), AttributeModifier.Operation.MULTIPLY_TOTAL); - if (!player.getAttribute(Attributes.MOVEMENT_SPEED).hasModifier(speedModifier) && !Config.speedModifierDisabled()) + AttributeModifier speedModifier = new AttributeModifier(ResourceLocation.parse("blockingspeed"), 4.0*getShieldValue(item, "speedFactor"), AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); + if (!player.getAttribute(Attributes.MOVEMENT_SPEED).hasModifier(ResourceLocation.parse("blockingspeed")) && !Config.speedModifierDisabled()) player.getAttribute(Attributes.MOVEMENT_SPEED).addTransientModifier(speedModifier); if (!LivingEntityAccess.get(player).getBlocking()) LivingEntityAccess.get(player).setBlocking(true); @@ -164,7 +165,7 @@ public void onProjectileImpact(ProjectileImpactEvent event) { damageItem(player, 1); stamina(player, item, 1); } - event.setCanceled(true); + event.setImpactResult(ProjectileImpactEvent.ImpactResult.STOP_AT_CURRENT_NO_DAMAGE); } } @@ -231,7 +232,7 @@ public void onExplosionImpact(LivingAttackEvent event) { //removes the blocking state public void removeBlocking(Player player) { - player.getAttribute(Attributes.MOVEMENT_SPEED).removeModifier(player.getUUID()); + player.getAttribute(Attributes.MOVEMENT_SPEED).removeModifier(ResourceLocation.parse("blockingspeed")); if (LivingEntityAccess.get(player).getBlocking()) LivingEntityAccess.get(player).setBlocking(false); LivingEntityAccess.get(player).setParryWindow(0); @@ -267,10 +268,6 @@ public void stamina(Player player, Item item, int stamina) { //reduces durability of the given player's used shield, and removes the blocking state if it breaks public void damageItem(Player player, int amount) { - player.getUseItem().hurtAndBreak(amount, player, (player1) -> { - player1.broadcastBreakEvent(player.getUsedItemHand() == InteractionHand.MAIN_HAND ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND); - removeBlocking(player); - player.stopUsingItem(); - }); + player.getUseItem().hurtAndBreak(amount, player, player.getUsedItemHand() == InteractionHand.MAIN_HAND ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND); } } \ No newline at end of file diff --git a/src/main/java/org/infernalstudios/shieldexp/init/DamageTypesInit.java b/src/main/java/org/infernalstudios/shieldexp/init/DamageTypesInit.java index f85623e..0d87b17 100644 --- a/src/main/java/org/infernalstudios/shieldexp/init/DamageTypesInit.java +++ b/src/main/java/org/infernalstudios/shieldexp/init/DamageTypesInit.java @@ -1,13 +1,13 @@ package org.infernalstudios.shieldexp.init; import net.minecraft.core.registries.Registries; -import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.damagesource.DamageType; public class DamageTypesInit { - public static final ResourceKey PARTIALBLAST = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("shieldexp", "partialblast")); + public static final ResourceKey PARTIALBLAST = ResourceKey.create(Registries.DAMAGE_TYPE, ResourceLocation.fromNamespaceAndPath("shieldexp", "partialblast")); - public static void bootstrap(BootstapContext context) { context.register(PARTIALBLAST, new DamageType("partialblast", 0.1F)); } + public static void bootstrap(BootstrapContext context) { context.register(PARTIALBLAST, new DamageType("partialblast", 0.1F)); } } diff --git a/src/main/java/org/infernalstudios/shieldexp/init/NetworkInit.java b/src/main/java/org/infernalstudios/shieldexp/init/NetworkInit.java index 6d145c5..24bc0ec 100644 --- a/src/main/java/org/infernalstudios/shieldexp/init/NetworkInit.java +++ b/src/main/java/org/infernalstudios/shieldexp/init/NetworkInit.java @@ -1,26 +1,31 @@ package org.infernalstudios.shieldexp.init; +import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.network.ChannelBuilder; +import net.minecraftforge.network.NetworkDirection; import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; +import net.minecraftforge.network.SimpleChannel; import org.infernalstudios.shieldexp.ShieldExpansion; import org.infernalstudios.shieldexp.network.ClearShields; import org.infernalstudios.shieldexp.network.SyncShields; public class NetworkInit { public static SimpleChannel INSTANCE; - private static int ID = 0; - - public static int nextID() { - return ID++; - } public static void registerPackets() { - INSTANCE = NetworkRegistry.newSimpleChannel(new ResourceLocation(ShieldExpansion.MOD_ID, "packets"), () -> "1.0", s -> true, s -> true); + INSTANCE = ChannelBuilder.named(ResourceLocation.fromNamespaceAndPath(ShieldExpansion.MOD_ID, "packets")) + .optional() + .acceptedVersions((status, version) -> true) + .networkProtocolVersion(1) + .simpleChannel(); - INSTANCE.registerMessage(nextID(), SyncShields.class, SyncShields::encode, SyncShields::new, SyncShields::handle); + INSTANCE.messageBuilder(SyncShields.class, NetworkDirection.PLAY_TO_CLIENT).encoder(SyncShields::encode).decoder(SyncShields::new).consumerNetworkThread(SyncShields::handle).add(); // TODO Delete - This is only kept here so the network isn't angry - INSTANCE.registerMessage(nextID(), ClearShields.class, ClearShields::encode, ClearShields::new, ClearShields::handle); + INSTANCE.messageBuilder(ClearShields.class, NetworkDirection.PLAY_TO_CLIENT).encoder(ClearShields::encode).decoder(ClearShields::new).consumerNetworkThread(ClearShields::handle).add(); + + MinecraftForge.EVENT_BUS.register(new NetworkInit()); } } diff --git a/src/main/java/org/infernalstudios/shieldexp/init/ShieldDataLoader.java b/src/main/java/org/infernalstudios/shieldexp/init/ShieldDataLoader.java index 79f68e2..9a6ec0b 100644 --- a/src/main/java/org/infernalstudios/shieldexp/init/ShieldDataLoader.java +++ b/src/main/java/org/infernalstudios/shieldexp/init/ShieldDataLoader.java @@ -63,10 +63,10 @@ public static void syncShieldsOnJoin(PlayerEvent.PlayerLoggedInEvent event) { Player player = event.getEntity(); if (!player.level().isClientSide()){ - NetworkInit.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new ClearShields()); + NetworkInit.INSTANCE.send(new ClearShields(), PacketDistributor.PLAYER.with((ServerPlayer) player)); for (Map.Entry file : toSync){ - NetworkInit.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new SyncShields(file.getKey(), file.getValue())); + NetworkInit.INSTANCE.send(new SyncShields(file.getKey(), file.getValue()), PacketDistributor.PLAYER.with((ServerPlayer) player)); } } } diff --git a/src/main/java/org/infernalstudios/shieldexp/init/SoundsInit.java b/src/main/java/org/infernalstudios/shieldexp/init/SoundsInit.java index 6cea494..decad56 100644 --- a/src/main/java/org/infernalstudios/shieldexp/init/SoundsInit.java +++ b/src/main/java/org/infernalstudios/shieldexp/init/SoundsInit.java @@ -15,7 +15,7 @@ public class SoundsInit { public static final RegistryObject PARRY_SOUND = registerSoundEvent("parry_sound"); private static RegistryObject registerSoundEvent(String name) { - ResourceLocation id = new ResourceLocation(ShieldExpansion.MOD_ID, name); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath(ShieldExpansion.MOD_ID, name); return SOUND_EVENTS.register(name, () -> SoundEvent.createVariableRangeEvent(id)); } } \ No newline at end of file diff --git a/src/main/java/org/infernalstudios/shieldexp/mixin/LivingEntityMixin.java b/src/main/java/org/infernalstudios/shieldexp/mixin/LivingEntityMixin.java index 9c9e6f2..8567a3c 100644 --- a/src/main/java/org/infernalstudios/shieldexp/mixin/LivingEntityMixin.java +++ b/src/main/java/org/infernalstudios/shieldexp/mixin/LivingEntityMixin.java @@ -41,6 +41,6 @@ public LivingEntityMixin(EntityType type, Level world) { @Inject(method = "isBlocking", at = @At(value = "RETURN", ordinal = 1), cancellable = true) private void shieldexp$isBlocking(CallbackInfoReturnable ci) { - ci.setReturnValue(this.useItem.getItem().getUseDuration(this.useItem) - this.useItemRemaining >= 0); + ci.setReturnValue(this.useItem.getItem().getUseDuration(this.useItem, (LivingEntity) (Object) this) - this.useItemRemaining >= 0); } } \ No newline at end of file diff --git a/src/main/java/org/infernalstudios/shieldexp/mixin/PlayerMixin.java b/src/main/java/org/infernalstudios/shieldexp/mixin/PlayerMixin.java index 28af584..a4acb4f 100644 --- a/src/main/java/org/infernalstudios/shieldexp/mixin/PlayerMixin.java +++ b/src/main/java/org/infernalstudios/shieldexp/mixin/PlayerMixin.java @@ -54,12 +54,12 @@ protected PlayerMixin(EntityType entityType, Level world } @Inject(method = "defineSynchedData", at = @At("TAIL")) - private void shieldexp$defineSynchedData(CallbackInfo ci) { - this.entityData.define(PARRY_COOLDOWN, 0); - this.entityData.define(BLOCKED_COOLDOWN, 0); - this.entityData.define(USED_STAMINA, 0); - this.entityData.define(LAST_SHIELD, new ItemStack(Items.AIR)); - this.entityData.define(IS_BLOCKING, false); + private void shieldexp$defineSynchedData(SynchedEntityData.Builder pBuilder, CallbackInfo ci) { + pBuilder.define(PARRY_COOLDOWN, 0); + pBuilder.define(BLOCKED_COOLDOWN, 0); + pBuilder.define(USED_STAMINA, 0); + pBuilder.define(LAST_SHIELD, new ItemStack(Items.AIR)); + pBuilder.define(IS_BLOCKING, false); } @Inject(method = "tick", at = @At("TAIL")) diff --git a/src/main/java/org/infernalstudios/shieldexp/network/ClearShields.java b/src/main/java/org/infernalstudios/shieldexp/network/ClearShields.java index b5c9bf6..06325f5 100644 --- a/src/main/java/org/infernalstudios/shieldexp/network/ClearShields.java +++ b/src/main/java/org/infernalstudios/shieldexp/network/ClearShields.java @@ -1,9 +1,7 @@ package org.infernalstudios.shieldexp.network; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - -import java.util.function.Supplier; +import net.minecraftforge.event.network.CustomPayloadEvent; // TODO Delete - This is only kept here so the network isn't angry public class ClearShields { @@ -16,7 +14,7 @@ public void encode(FriendlyByteBuf buf){ public ClearShields() { } - public void handle(Supplier ctx){ - ctx.get().setPacketHandled(true); + public void handle(CustomPayloadEvent.Context ctx){ + ctx.setPacketHandled(true); } } diff --git a/src/main/java/org/infernalstudios/shieldexp/network/SyncShields.java b/src/main/java/org/infernalstudios/shieldexp/network/SyncShields.java index 5ee2952..3c07459 100644 --- a/src/main/java/org/infernalstudios/shieldexp/network/SyncShields.java +++ b/src/main/java/org/infernalstudios/shieldexp/network/SyncShields.java @@ -6,7 +6,7 @@ import net.minecraft.util.GsonHelper; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.event.network.CustomPayloadEvent; import org.infernalstudios.shieldexp.init.ShieldDataLoader; import java.util.function.Supplier; @@ -31,9 +31,9 @@ public SyncShields(ResourceLocation shield, JsonElement data){ this.data = data; } - public void handle(Supplier ctx){ - ctx.get().enqueueWork(this::handle); - ctx.get().setPacketHandled(true); + public void handle(CustomPayloadEvent.Context ctx){ + ctx.enqueueWork(this::handle); + ctx.setPacketHandled(true); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/resources/assets/shieldexp/lang/tr_tr.json b/src/main/resources/assets/shieldexp/lang/tr_tr.json new file mode 100644 index 0000000..52d1fc4 --- /dev/null +++ b/src/main/resources/assets/shieldexp/lang/tr_tr.json @@ -0,0 +1,31 @@ +{ + "shieldexp.tooltip.instructions": "Talimatlar için Shift tuşunu basılı tut", + "shieldexp.tooltip.instructions.parry": "Saldırıları savuşturmak için vurulmadan hemen önce kalkanını kaldır!", + + "shieldexp.tooltip.attribute": "Kalkan olarak kullanıldığında:", + "shieldexp.tooltip.attribute.cooldown_ticks": " %ss Bekleme Süresi", + "shieldexp.tooltip.attribute.speed_factor_slow": " Yavaş Hareket", + "shieldexp.tooltip.attribute.speed_factor_fast": " Hızlı Hareket", + "shieldexp.tooltip.attribute.parry_damage": " %s Savuşturma Hasarı", + "shieldexp.tooltip.attribute.parry_ticks": " %ss Savuşturma Süresi", + "shieldexp.tooltip.attribute.stamina": " %s Dayanma Gücü", + "shieldexp.tooltip.attribute.blast_resistance": " %s Patlama Direnci", + + "item.shieldexp.wooden_shield": "Ahşap Kalkan", + "item.shieldexp.golden_shield": "Altın Kalkan", + "item.shieldexp.iron_shield": "Demir Kalkan", + "item.shieldexp.diamond_shield": "Elmas Kalkan", + "item.shieldexp.netherite_shield": "Netherit Kalkan", + "item.shieldexp.paragon_shield": "Paragon Kalkanı", + "item.shieldexp.griefer_shield": "Griefer Kalkanı", + + "sounds.shieldexp.parry_sound": "Başarılı savuşturma", + + "death.attack.partialblast": "%1$s havaya uçtu çünkü kalkanı patlamaya dayanamadı.", + + "shieldexp.advancements.get_diamond_shield.title": "Elmas Kırılmaz", + "shieldexp.advancements.get_diamond_shield.description": "Elmas Kalkan üret", + + "shieldexp.advancements.get_netherite_shield.title": "Hareket Ettirilemeyen Nesne", + "shieldexp.advancements.get_netherite_shield.description": "Netherit Kalkan üret" +} \ No newline at end of file