From 9a0cadaf9d91a698ae8814af7e27feb6c37549b6 Mon Sep 17 00:00:00 2001 From: Bufka2011 Date: Sat, 23 Aug 2025 18:10:46 -0600 Subject: [PATCH] I18n implementation for guns --- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 145 +++++++++--------- src/main/resources/assets/hbm/lang/en_US.lang | 121 +++++++++++++++ src/main/resources/assets/hbm/lang/ru_RU.lang | 134 ++++++++++++++-- 3 files changed, 315 insertions(+), 85 deletions(-) diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index 704eb09a6..c43550972 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -29,6 +29,7 @@ import com.hbm.render.util.RenderScreenOverlay; import com.hbm.sound.AudioWrapper; import com.hbm.util.BobMathUtil; import com.hbm.util.EnumUtil; +import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -55,10 +56,10 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public long[] lastShot; /** [0;1] randomized every shot for various rendering applications */ public double shotRand = 0D; - + public static List secrets = new ArrayList(); public List recognizedMods = new ArrayList(); - + public static final DecimalFormatSymbols SYMBOLS_US = new DecimalFormatSymbols(Locale.US); public static final DecimalFormat FORMAT_DMG = new DecimalFormat("#.##", SYMBOLS_US); @@ -68,20 +69,20 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public static float recoilRebound = 0.25F; public static float offsetVertical = 0; public static float offsetHorizontal = 0; - + public static void setupRecoil(float vertical, float horizontal, float decay, float rebound) { recoilVertical += vertical; recoilHorizontal += horizontal; recoilDecay = decay; recoilRebound = rebound; } - + public static void setupRecoil(float vertical, float horizontal) { setupRecoil(vertical, horizontal, 0.75F, 0.25F); } public static final String O_GUNCONFIG = "O_GUNCONFIG_"; - + public static final String KEY_DRAWN = "drawn"; public static final String KEY_AIMING = "aiming"; public static final String KEY_MODE = "mode_"; @@ -98,28 +99,28 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public static final String KEY_LOCKEDON = "lockedon"; public static final String KEY_CANCELRELOAD = "cancel"; public static final String KEY_EQUIPPED = "eqipped"; - + public static ConcurrentHashMap loopedSounds = new ConcurrentHashMap(); public static float prevAimingProgress; public static float aimingProgress; - + /** NEVER ACCESS DIRECTLY - USE GETTER */ protected GunConfig[] configs_DNA; - + public Function LAMBDA_NAME_MUTATOR; public WeaponQuality quality; - + public GunConfig getConfig(ItemStack stack, int index) { GunConfig cfg = configs_DNA[index]; if(stack == null) return cfg; return WeaponModManager.eval(cfg, stack, O_GUNCONFIG + index, this, index); } - + public int getConfigCount() { return configs_DNA.length; } - + public ItemGunBaseNT(WeaponQuality quality, GunConfig... cfg) { this.setMaxStackSize(1); this.configs_DNA = cfg; @@ -130,7 +131,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I if(quality == WeaponQuality.LEGENDARY || quality == WeaponQuality.SECRET) this.secrets.add(this); this.setTextureName(RefStrings.MODID + ":gun_darter"); } - + public static enum WeaponQuality { A_SIDE, B_SIDE, @@ -148,73 +149,73 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I RELOADING, //forced delay after which a reload action happens, may be canceled (TBI) JAMMED, //forced delay due to jamming } - + public ItemGunBaseNT setNameMutator(Function lambda) { this.LAMBDA_NAME_MUTATOR = lambda; return this; } public String getItemStackDisplayName(ItemStack stack) { - + if(this.LAMBDA_NAME_MUTATOR != null) { String unloc = this.LAMBDA_NAME_MUTATOR.apply(stack); if(unloc != null) return (StatCollector.translateToLocal(unloc + ".name")).trim(); } - + return super.getItemStackDisplayName(stack); } - + @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - + int configs = this.configs_DNA.length; for(int i = 0; i < configs; i++) { GunConfig config = getConfig(stack, i); for(Receiver rec : config.getReceivers(stack)) { IMagazine mag = rec.getMagazine(stack); - list.add("Ammo: " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); + list.add(I18nUtil.resolveKey("gui.weapon.ammo") + ": " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); float dmg = rec.getBaseDamage(stack); - list.add("Base Damage: " + FORMAT_DMG.format(dmg)); + list.add(I18nUtil.resolveKey("gui.weapon.baseDamage") + ": " + FORMAT_DMG.format(dmg)); if(mag.getType(stack, player.inventory) instanceof BulletConfig) { BulletConfig bullet = (BulletConfig) mag.getType(stack, player.inventory); int min = (int) (bullet.projectilesMin * rec.getSplitProjectiles(stack)); int max = (int) (bullet.projectilesMax * rec.getSplitProjectiles(stack)); - list.add("Damage with current ammo: " + FORMAT_DMG.format(dmg * bullet.damageMult) + (min > 1 ? (" x" + (min != max ? (min + "-" + max) : min)) : "")); + list.add(I18nUtil.resolveKey("gui.weapon.damageWithAmmo") + ": " + FORMAT_DMG.format(dmg * bullet.damageMult) + (min > 1 ? (" x" + (min != max ? (min + "-" + max) : min)) : "")); } } - + float maxDura = config.getDurability(stack); if(maxDura > 0) { int dura = MathHelper.clamp_int((int)((maxDura - this.getWear(stack, i)) * 100 / maxDura), 0, 100); - list.add("Condition: " + dura + "%"); + list.add(I18nUtil.resolveKey("gui.weapon.condition") + ": " + dura + "%"); } - + for(ItemStack upgrade : WeaponModManager.getUpgradeItems(stack, i)) { list.add(EnumChatFormatting.YELLOW + upgrade.getDisplayName()); } } - + switch(this.quality) { - case A_SIDE: list.add(EnumChatFormatting.YELLOW + "Standard Arsenal"); break; - case B_SIDE: list.add(EnumChatFormatting.GOLD + "B-Side"); break; - case LEGENDARY: list.add(EnumChatFormatting.RED + "Legendary Weapon"); break; - case SPECIAL: list.add(EnumChatFormatting.AQUA + "Special Weapon"); break; - case UTILITY: list.add(EnumChatFormatting.GREEN + "Utility"); break; - case SECRET: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.DARK_RED : EnumChatFormatting.RED) + "SECRET"); break; - case DEBUG: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.YELLOW : EnumChatFormatting.GOLD) + "DEBUG"); break; + case A_SIDE: list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.weapon.quality.aside")); break; + case B_SIDE: list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("gui.weapon.quality.bside")); break; + case LEGENDARY: list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.weapon.quality.legendary")); break; + case SPECIAL: list.add(EnumChatFormatting.AQUA + I18nUtil.resolveKey("gui.weapon.quality.special")); break; + case UTILITY: list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("gui.weapon.quality.utility")); break; + case SECRET: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.DARK_RED : EnumChatFormatting.RED) + I18nUtil.resolveKey("gui.weapon.quality.secret")); break; + case DEBUG: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.YELLOW : EnumChatFormatting.GOLD) + I18nUtil.resolveKey("gui.weapon.quality.debug")); break; } - + if(Minecraft.getMinecraft().currentScreen instanceof GUIWeaponTable && !this.recognizedMods.isEmpty()) { - list.add(EnumChatFormatting.RED + "Accepts:"); + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.weapon.accepts" + ":")); for(ComparableStack comp : this.recognizedMods) list.add(EnumChatFormatting.RED + " " + comp.toStack().getDisplayName()); } } - + @Override public boolean canHandleKeybind(EntityPlayer player, ItemStack stack, EnumKeybind keybind) { return keybind == EnumKeybind.GUN_PRIMARY || keybind == EnumKeybind.GUN_SECONDARY || keybind == EnumKeybind.GUN_TERTIARY || keybind == EnumKeybind.RELOAD; } - + @Override public void handleKeybind(EntityPlayer player, ItemStack stack, EnumKeybind keybind, boolean newState) { handleKeybind(player, player.inventory, stack, keybind, newState); @@ -222,13 +223,13 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public void handleKeybind(EntityLivingBase entity, IInventory inventory, ItemStack stack, EnumKeybind keybind, boolean newState) { if(!GeneralConfig.enableGuns) return; - + int configs = this.configs_DNA.length; - + for(int i = 0; i < configs; i++) { GunConfig config = getConfig(stack, i); LambdaContext ctx = new LambdaContext(config, entity, inventory, i); - + if(keybind == EnumKeybind.GUN_PRIMARY && newState && !getPrimary(stack, i)) { if(config.getPressPrimary(stack) != null) config.getPressPrimary(stack).accept(stack, ctx); this.setPrimary(stack, i, newState); continue; } if(keybind == EnumKeybind.GUN_PRIMARY && !newState && getPrimary(stack, i)) { if(config.getReleasePrimary(stack) != null) config.getReleasePrimary(stack).accept(stack, ctx); this.setPrimary(stack, i, newState); continue; } if(keybind == EnumKeybind.GUN_SECONDARY && newState && !getSecondary(stack, i)) { if(config.getPressSecondary(stack) != null) config.getPressSecondary(stack).accept(stack, ctx); this.setSecondary(stack, i, newState); continue; } @@ -243,7 +244,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I @Override public void onEquip(EntityPlayer player, ItemStack stack) { for(int i = 0; i < this.configs_DNA.length; i++) { - if(this.getLastAnim(stack, i) == AnimType.EQUIP && this.getAnimTimer(stack, i) < 5) continue; + if(this.getLastAnim(stack, i) == AnimType.EQUIP && this.getAnimTimer(stack, i) < 5) continue; playAnimation(player, stack, AnimType.EQUIP, i); this.setPrimary(stack, i, false); this.setSecondary(stack, i, false); @@ -251,7 +252,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I this.setReloadKey(stack, i, false); } } - + public static void playAnimation(EntityPlayer player, ItemStack stack, AnimType type, int index) { if(player instanceof EntityPlayerMP) { PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(type.ordinal(), 0, index), (EntityPlayerMP) player); @@ -262,7 +263,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isHeld) { - + if(!(entity instanceof EntityLivingBase)) return; EntityPlayer player = entity instanceof EntityPlayer ? (EntityPlayer) entity : null; int confNo = this.configs_DNA.length; @@ -272,17 +273,17 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I configs[i] = this.getConfig(stack, i); ctx[i] = new LambdaContext(configs[i], (EntityLivingBase) entity, player != null ? player.inventory : null, i); } - + if(world.isRemote) { - + if(isHeld && player == MainRegistry.proxy.me()) { - + /// DEBUG /// /*Vec3 offset = Vec3.createVectorHelper(-0.2, -0.1, 0.75); offset.rotateAroundX(-entity.rotationPitch / 180F * (float) Math.PI); offset.rotateAroundY(-entity.rotationYaw / 180F * (float) Math.PI); world.spawnParticle("flame", entity.posX + offset.xCoord, entity.posY + entity.getEyeHeight() + offset.yCoord, entity.posZ + offset.zCoord, 0, 0, 0);*/ - + /// AIMING /// prevAimingProgress = aimingProgress; boolean aiming = this.getIsAiming(stack); @@ -290,12 +291,12 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I if(aiming && aimingProgress < 1F) aimingProgress += aimSpeed; if(!aiming && aimingProgress > 0F) aimingProgress -= aimSpeed; aimingProgress = MathHelper.clamp_float(aimingProgress, 0F, 1F); - + /// SMOKE NODES /// for(int i = 0; i < confNo; i++) if(configs[i].getSmokeHandler(stack) != null) { configs[i].getSmokeHandler(stack).accept(stack, ctx[i]); } - + for(int i = 0; i < confNo; i++) { BiConsumer orchestra = configs[i].getOrchestra(stack); if(orchestra != null) orchestra.accept(stack, ctx[i]); @@ -303,18 +304,18 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I } return; } - + /// ON EQUIP /// if(player != null) { boolean wasHeld = this.getIsEquipped(stack); - + if(!wasHeld && isHeld && player != null) { this.onEquip(player, stack); } } - + this.setIsEquipped(stack, isHeld); - + /// RESET WHEN NOT EQUIPPED /// if(!isHeld) { for(int i = 0; i < confNo; i++) { @@ -329,13 +330,13 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I this.setReloadCancel(stack, false); return; } - + for(int i = 0; i < confNo; i++) for(int k = 0; k == 0 || (k < 2 && ArmorTrenchmaster.isTrenchMaster(player) && this.getState(stack, i) == GunState.RELOADING); k++) { BiConsumer orchestra = configs[i].getOrchestra(stack); if(orchestra != null) orchestra.accept(stack, ctx[i]); - + setAnimTimer(stack, i, getAnimTimer(stack, i) + 1); - + /// STTATE MACHINE /// int timer = this.getTimer(stack, i); if(timer > 0) this.setTimer(stack, i, timer - 1); @@ -371,7 +372,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public static void setLastAnim(ItemStack stack, int index, AnimType value) { setValueInt(stack, KEY_LASTANIM + index, value.ordinal()); } public static int getAnimTimer(ItemStack stack, int index) { return getValueInt(stack, KEY_ANIMTIMER + index); } public static void setAnimTimer(ItemStack stack, int index, int value) { setValueInt(stack, KEY_ANIMTIMER + index, value); } - + // BUTTON STATES // public static boolean getPrimary(ItemStack stack, int index) { return getValueBool(stack, KEY_PRIMARY + index); } public static void setPrimary(ItemStack stack, int index, boolean value) { setValueBool(stack, KEY_PRIMARY + index, value); } @@ -387,28 +388,28 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I // EQUIPPED // public static boolean getIsEquipped(ItemStack stack) { return getValueBool(stack, KEY_EQUIPPED); } public static void setIsEquipped(ItemStack stack, boolean value) { setValueBool(stack, KEY_EQUIPPED, value); } - - + + /// UTIL /// public static int getValueInt(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getInteger(name); return 0; } public static void setValueInt(ItemStack stack, String name, int value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setInteger(name, value); } - + public static float getValueFloat(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getFloat(name); return 0; } public static void setValueFloat(ItemStack stack, String name, float value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setFloat(name, value); } - + public static byte getValueByte(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getByte(name); return 0; } public static void setValueByte(ItemStack stack, String name, byte value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setByte(name, value); } - + public static boolean getValueBool(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getBoolean(name); return false; } public static void setValueBool(ItemStack stack, String name, boolean value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setBoolean(name, value); } - + /** Wrapper for extra context used in most Consumer lambdas which are part of the guncfg */ public static class LambdaContext { public final GunConfig config; public final EntityLivingBase entity; public final IInventory inventory; public final int configIndex; - + public LambdaContext(GunConfig config, EntityLivingBase player, IInventory inventory, int configIndex) { this.config = config; this.entity = player; @@ -425,42 +426,42 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I @Override @SideOnly(Side.CLIENT) public void renderHUD(Pre event, ElementType type, EntityPlayer player, ItemStack stack) { - + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - + if(type == ElementType.CROSSHAIRS) { event.setCanceled(true); GunConfig config = gun.getConfig(stack, 0); if(config.getHideCrosshair(stack) && aimingProgress >= 1F) return; RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, config.getCrosshair(stack)); } - + int confNo = this.configs_DNA.length; - + for(int i = 0; i < confNo; i++) { IHUDComponent[] components = gun.getConfig(stack, i).getHUDComponents(stack); - + if(components != null) for(IHUDComponent component : components) { int bottomOffset = 0; component.renderHUDComponent(event, type, player, stack, bottomOffset, i); bottomOffset += component.getComponentHeight(player, stack); } } - + Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } - + /*@Override public boolean getShareTag() { return false; }*/ // nbt sync dupe fix, didn't work - + public static class SmokeNode { - + public double forward = 0D; public double side = 0D; public double lift = 0D; public double alpha; public double width = 1D; - + public SmokeNode(double alpha) { this.alpha = alpha; } } } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cf7cfd858..12707d8ac 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6282,3 +6282,124 @@ gui.recipe.enabledFor=Enabled for gui.recipe.setRecipe=Click to set recipe tile.oc_cable_paintable.name=Paintable Network Cable + +# shared recipe / machine labels +gui.recipe.duration=Duration +gui.recipe.consumption=Consumption +gui.recipe.input=Input +gui.recipe.output=Output +gui.recipe.mB=mB +gui.recipe.atPressure=at +gui.recipe.autoswitch=Auto-switch group +gui.recipe.enabledFor=Enabled for +gui.recipe.setRecipe=Click to set recipe + +# --- Missile / parts (generic) --- +gui.missile.warhead=Warhead +gui.missile.strength=Strength +gui.missile.fuelType=Fuel Type +gui.missile.fuelAmount=Fuel amount +gui.missile.chipInaccuracy=Chip inaccuracy +gui.missile.finInaccuracy=Fin inaccuracy +gui.missile.size=Size +gui.missile.health=Health +gui.missile.fuel=Fuel +gui.missile.fuelCapacity=Fuel capacity +gui.missile.notLaunchable=Not launchable! + +# missile tiers +missile.tier.tier0=Tier 0 +missile.tier.tier1=Tier 1 +missile.tier.tier2=Tier 2 +missile.tier.tier3=Tier 3 +missile.tier.tier4=Tier 4 + +# missile fuel names +missile.fuel.solid=Solid Fuel +missile.fuel.ethanol_peroxide=Ethanol / Hydrogen Peroxide +missile.fuel.kerosene_peroxide=Kerosene / Hydrogen Peroxide +missile.fuel.kerosene_loxy=Kerosene / Liquid Oxygen +missile.fuel.jetfuel_loxy=Jet Fuel / Liquid Oxygen + +# warheads (used by parts) +warhead.he=HE +warhead.incendiary=Incendiary +warhead.cluster=Cluster +warhead.bunker_buster=Bunker Buster +warhead.nuclear=Nuclear +warhead.thermonuclear=Thermonuclear (TX) +warhead.n2=N² +warhead.balefire=BF +warhead.schrabidium=Schrabidium +warhead.taint=Taint +warhead.cloud=Cloud +warhead.turbine=Turbine + +# part keys +part.inaccuracy=Inaccuracy +part.size=Size +part.type=Type +part.strength=Strength +part.weight=Weight +part.topSize=Top size +part.bottomSize=Bottom size +part.fuelType=Fuel type +part.fuelAmount=Fuel amount +part.fuelConsumption=Fuel consumption +part.maxPayload=Max. payload +part.health=Health +part.rarity=Rarity +part.by=by +part.size.any=Any +part.size.none=None + +# fuel extras used by parts +fuel.xenon=Xenon +fuel.balefire=BF Rocket Fuel + +# part rarity keys (enum-based) +part.rarity.common=Common +part.rarity.uncommon=Uncommon +part.rarity.rare=Rare +part.rarity.epic=Epic +part.rarity.legendary=Legendary +part.rarity.strange=Strange + +# generic / fallback +general.na=N/A +error.generic=### I AM ERROR ### + +# --- Satellite chips --- +satchip.frequency=Satellite frequency +satchip.foeq=Gives you an achievement. That's it. +satchip.gerald.line1=Single use. +satchip.gerald.line2=Requires orbital module. +satchip.gerald.line3=Melter of CPUs, bane of every server owner. +satchip.laser=Allows to summon lasers with a 15 second cooldown. +satchip.mapper=Displays currently loaded chunks. +satchip.miner=Will deliver ore powders to a cargo landing pad. +satchip.lunar_miner=Mines moon turf to deliver it to a cargo landing pad. +satchip.radar=Shows a map of active entities. +satchip.resonator=Allows for teleportation with no cooldown. +satchip.scanner=Creates a topdown map of underground ores. + +# --- Items (bomb components) --- +item.bomb_part.used_in=Used in: +item.n2.mine=N² Mine +item.fleija.name=F.L.E.I.J.A. +item.solinium.name=Solinium Bomb + +# --- Weapon / gun tooltips --- +gui.weapon.ammo=Ammo +gui.weapon.baseDamage=Base Damage +gui.weapon.damageWithAmmo=Damage with current ammo +gui.weapon.condition=Condition +gui.weapon.accepts=Accepts + +gui.weapon.quality.aside=Standard Arsenal +gui.weapon.quality.bside=B-Side +gui.weapon.quality.legendary=Legendary Weapon +gui.weapon.quality.special=Special Weapon +gui.weapon.quality.utility=Utility +gui.weapon.quality.secret=SECRET +gui.weapon.quality.debug=DEBUG diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 09e404bdf..4b342ef2d 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -4588,19 +4588,6 @@ item.sat_radar.name=Спутник с радиолокационным зонд item.sat_resonator.name=Спутник с Зен-Резонатором item.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования -item.sat.desc.frequency=Частота спутника -item.sat.desc.foeq=Даёт тебе достижение. Это всё. -item.sat.desc.gerald.single_use=Одноразовое. -item.sat.desc.gerald.orbital_module=Требует орбитальный модуль. -item.sat.desc.gerald.melter=Расплавитель процессоров, проклятие каждого владельца сервера. -item.sat.desc.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд. -item.sat.desc.mapper=Отображает загруженные в данный момент чанки. -item.sat.desc.miner=Доставит рудные порошки на грузовую посадочную площадку. -item.sat.desc.lunar_miner=Добывает лунный грунт, чтобы доставить его на грузовую посадочную площадку. -item.sat.desc.radar=Показывает карту активных объектов. -item.sat.desc.resonator=Позволяет телепортироваться без перезарядки. -item.sat.desc.scanner=Создаёт карту подземных руд сверху вниз. - item.sawblade.name=Лезвие пилорамы item.schnitzel_vegan.name=Вегетарианский шницель item.schrabidium_axe.name=Шрабидиевый топор @@ -6625,4 +6612,125 @@ gui.recipe.autoswitch=Группа автоматического переклю gui.recipe.enabledFor=Включено для gui.recipe.setRecipe=Нажмите, чтобы выбрать рецепт +# shared recipe / machine labels +gui.recipe.duration=Время +gui.recipe.consumption=Потребление +gui.recipe.input=Вход +gui.recipe.output=Выход +gui.recipe.mB=mB +gui.recipe.atPressure=при +gui.recipe.autoswitch=Автопереключение группы +gui.recipe.enabledFor=Доступно для +gui.recipe.setRecipe=Нажмите, чтобы установить рецепт + +# --- Missile / parts (generic) --- +gui.missile.warhead=Боеголовка +gui.missile.strength=Мощность +gui.missile.fuelType=Тип топлива +gui.missile.fuelAmount=Количество топлива +gui.missile.chipInaccuracy=Неточность чипа +gui.missile.finInaccuracy=Неточность стабилизаторов +gui.missile.size=Размер +gui.missile.health=Прочность +gui.missile.fuel=Топливо +gui.missile.fuelCapacity=Ёмкость топлива +gui.missile.notLaunchable=Невозможно запустить! + +# missile tiers +missile.tier.tier0=Уровень 0 +missile.tier.tier1=Уровень 1 +missile.tier.tier2=Уровень 2 +missile.tier.tier3=Уровень 3 +missile.tier.tier4=Уровень 4 + +# missile fuel names +missile.fuel.solid=Твердое топливо +missile.fuel.ethanol_peroxide=Этанол / Перекись водорода +missile.fuel.kerosene_peroxide=Керосин / Перекись водорода +missile.fuel.kerosene_loxy=Керосин / Жидкий кислород +missile.fuel.jetfuel_loxy=Авиационное топливо / Жидкий кислород + +# warheads (used by parts) +warhead.he=HE +warhead.incendiary=Зажигательная +warhead.cluster=Кассетная +warhead.bunker_buster=Противобункерная +warhead.nuclear=Ядерная +warhead.thermonuclear=Термоядерная (TX) +warhead.n2=N² +warhead.balefire=Жар-ядерная +warhead.schrabidium=Шрабидевая +warhead.taint=Порча +warhead.cloud=Облако +warhead.turbine=Турбина + +# part keys +part.inaccuracy=Неточность +part.size=Размер +part.type=Тип +part.strength=Прочность +part.weight=Вес +part.topSize=Верхний размер +part.bottomSize=Нижний размер +part.fuelType=Тип топлива +part.fuelAmount=Количество топлива +part.fuelConsumption=Расход топлива +part.maxPayload=Макс. нагрузка +part.health=Прочность +part.rarity=Редкость +part.by=Автор +part.size.any=Любой +part.size.none=Нет + +# fuel extras used by parts +fuel.xenon=Ксенон +fuel.balefire=Жар-ракетное топливо + +# part rarity keys (enum-based, neuter) +part.rarity.common=Обычное +part.rarity.uncommon=Необычное +part.rarity.rare=Редкое +part.rarity.epic=Эпическое +part.rarity.legendary=Легендарное +part.rarity.strange=Странное + +# generic / fallback +general.na=Н/Д +error.generic=### Я ОШИБКА ### + +# --- Satellite chips --- +satchip.frequency=Частота спутника +satchip.foeq=Даёт достижение. И всё. +satchip.gerald.line1=Одноразовый. +satchip.gerald.line2=Требуется орбитальный модуль. +satchip.gerald.line3=Расплавитель процессоров, проклятие каждого владельца сервера. +satchip.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд. +satchip.mapper=Отображает загруженные в данный момент чанки. +satchip.miner=Доставляет рудные порошки на посадочную площадку. +satchip.lunar_miner=Добывает лунный грунт и доставляет на посадочную площадку. +satchip.radar=Показывает карту активных сущностей +satchip.resonator=Позволяет телепортироваться без перезарядки. +satchip.scanner=Создаёт карту подземных руд сверху вниз. + +# --- Items (bomb components) --- +item.bomb_part.used_in=Используется в: +item.n2.mine=Мина N² +item.fleija.name=Ф.Л.Е.Я. +item.solinium.name=Синий Ополаскиватель + +# --- Weapon / gun tooltips --- +gui.weapon.ammo=Боеприпасы +gui.weapon.baseDamage=Базовый урон +gui.weapon.damageWithAmmo=Урон с текущими боеприпасами +gui.weapon.condition=Состояние +gui.weapon.accepts=Принимает + +gui.weapon.quality.aside=Стандартный арсенал +gui.weapon.quality.bside=Би-Сайд +gui.weapon.quality.legendary=Легендарное оружие +gui.weapon.quality.special=Специальное оружие +gui.weapon.quality.utility=Утилитарное +gui.weapon.quality.secret=СЕКРЕТ +gui.weapon.quality.debug=ОТЛАДКА + // Last updated 23.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa //