Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1.20.1 Backport] Vector mode (part of #7475) #8297

Open
wants to merge 1 commit into
base: 1.20.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/api/java/mekanism/api/gear/config/IHasModeIcon.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package mekanism.api.gear.config;

import mekanism.api.text.IHasTextComponent;
import net.minecraft.resources.ResourceLocation;

/**
* Conveys that an option should be represented by the corresponding mode icon when displayed in the module tweaker.
*
* @apiNote Currently only supported for {@link ModuleEnumData}.
* @since 10.5.3
*/
public interface IHasModeIcon extends IHasTextComponent {

/**
* @return The icon to use for displaying this mode.
*
* @implNote The file is currently expected to be 16x16, and be 5 wide, down two pixels and eight pixels tall. Ideally this will be made less strict, but for now just
* look at how the jetpack icons are.
*/
ResourceLocation getModeIcon();
}
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,7 @@
"jetpack.mekanism.hover": "ɹǝʌoH",
"jetpack.mekanism.mode_change": "%s :oʇ pǝᵷuɐɥɔ ǝpoɯ ʞɔɐdʇǝՐ",
"jetpack.mekanism.normal": "ɹɐꞁnᵷǝᴚ",
"jetpack.mekanism.vector": "ɹoʇɔǝΛ",
"key.mekanism.chest_mode": "ɥɔʇᴉʍS ǝpoW ʇsǝɥƆ",
"key.mekanism.description": "uoᴉʇdᴉɹɔsǝᗡ ʍoɥS",
"key.mekanism.details": "sꞁᴉɐʇǝᗡ ʍoɥS",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,7 @@
"jetpack.mekanism.hover": "Hover",
"jetpack.mekanism.mode_change": "Jetpack mode changed to: %1$s",
"jetpack.mekanism.normal": "Regular",
"jetpack.mekanism.vector": "Vector",
"key.mekanism.chest_mode": "Chest Mode Switch",
"key.mekanism.description": "Show Description",
"key.mekanism.details": "Show Details",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1299,6 +1299,7 @@ private void addMisc() {
add(MekanismLang.JETPACK_MODE_CHANGE, "Jetpack mode changed to: %1$s");
add(MekanismLang.JETPACK_NORMAL, "Regular");
add(MekanismLang.JETPACK_HOVER, "Hover");
add(MekanismLang.JETPACK_VECTOR, "Vector");
add(MekanismLang.JETPACK_DISABLED, "Disabled");
//Disassembler Mode
add(MekanismLang.DISASSEMBLER_MODE_CHANGE, "Mode toggled to: %1$s (%2$s)");
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/mekanism/client/ClientTickHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public static boolean isJetpackInUse(Player player, ItemStack jetpack) {
boolean guiOpen = minecraft.screen != null;
boolean ascending = minecraft.player.input.jumping;
boolean rising = ascending && !guiOpen;
if (mode == JetpackMode.NORMAL) {
if (mode == JetpackMode.NORMAL || mode == JetpackMode.VECTOR) {
return rising;
} else if (mode == JetpackMode.HOVER) {
boolean descending = minecraft.player.input.shiftKeyDown;
Expand Down Expand Up @@ -203,7 +203,8 @@ public void tickStart() {
JetpackMode primaryMode = ((IJetpackItem) primaryJetpack.getItem()).getJetpackMode(primaryJetpack);
JetpackMode mode = IJetpackItem.getPlayerJetpackMode(minecraft.player, primaryMode, () -> minecraft.player.input.jumping);
MekanismClient.updateKey(minecraft.player.input.jumping, KeySync.ASCEND);
if (jetpackInUse && IJetpackItem.handleJetpackMotion(minecraft.player, mode, () -> minecraft.player.input.jumping)) {
double jetpackThrust = ((IJetpackItem) primaryJetpack.getItem()).getJetpackThrust(primaryJetpack);
if (jetpackInUse && IJetpackItem.handleJetpackMotion(minecraft.player, mode, jetpackThrust, () -> minecraft.player.input.jumping)) {
minecraft.player.resetFallDistance();
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package mekanism.client.gui.element.custom.module;

import java.util.List;

import mekanism.api.gear.config.IHasModeIcon;
import mekanism.api.gear.config.ModuleEnumData;
import mekanism.api.text.IHasTextComponent;
import mekanism.client.gui.GuiUtils;
import mekanism.common.MekanismLang;
import mekanism.common.content.gear.ModuleConfigItem;
import mekanism.common.util.MekanismUtils;
import mekanism.common.util.MekanismUtils.ResourceType;
Expand All @@ -20,18 +24,21 @@ class EnumToggle<TYPE extends Enum<TYPE> & IHasTextComponent> extends MiniElemen
private final int BAR_LENGTH;
private final ModuleConfigItem<TYPE> data;
private final int optionDistance;
private final boolean usesIcons;
boolean dragging = false;

EnumToggle(GuiModuleScreen parent, ModuleConfigItem<TYPE> data, int xPos, int yPos, int dataIndex) {
super(parent, xPos, yPos, dataIndex);
this.data = data;
BAR_LENGTH = this.parent.getScreenWidth() - 24;
this.optionDistance = (BAR_LENGTH / (getData().getEnums().size() - 1));
List<TYPE> options = getData().getEnums();
this.optionDistance = (BAR_LENGTH / (options.size() - 1));
this.usesIcons = options.stream().findFirst().filter(option -> option instanceof IHasModeIcon).isPresent();
}

@Override
protected int getNeededHeight() {
return 28;
return usesIcons ? 31 : 28;
}

private ModuleEnumData<TYPE> getData() {
Expand All @@ -48,25 +55,42 @@ protected void renderBackground(GuiGraphics guiGraphics, int mouseX, int mouseY)
@Override
protected void renderForeground(GuiGraphics guiGraphics, int mouseX, int mouseY) {
int textColor = parent.screenTextColor();
parent.drawTextWithScale(guiGraphics, data.getDescription(), getRelativeX() + 3, getRelativeY(), textColor, 0.8F);
Component description = data.getDescription();
if (usesIcons) {
description = MekanismLang.GENERIC_STORED.translate(description, getData().get());
}
parent.drawTextWithScale(guiGraphics, description, getRelativeX() + 3, getRelativeY(), textColor, usesIcons ? 0.75F : 0.8F);
List<TYPE> options = getData().getEnums();
for (int i = 0, count = options.size(); i < count; i++) {
int center = optionDistance * i;
Component text = options.get(i).getTextComponent();
TYPE option = options.get(i);
Component text = option.getTextComponent();
//Similar to logic for drawScaledCenteredText except shifts values slightly if they go past the max length
int textWidth = parent.getStringWidth(text);
float widthScaling = (textWidth / 2F) * TEXT_SCALE;
float left = BAR_START + center - widthScaling;
float widthScaling = usesIcons ? 2.5F : (textWidth / 2F) * TEXT_SCALE;
int optionCenter = BAR_START + center;
float left = optionCenter - widthScaling;
if (left < 0) {
left = 0;
} else {
int max = parent.getScreenWidth() - 1;
int end = xPos + (int) Math.ceil(left + textWidth * TEXT_SCALE);
float objectWidth = usesIcons ? 5 : textWidth * TEXT_SCALE;
int end = xPos + Mth.ceil(left + objectWidth);
if (end > max) {
left -= end - max;
}
}
parent.drawTextWithScale(guiGraphics, text, getRelativeX() + left, getRelativeY() + 20, textColor, TEXT_SCALE);
int color = textColor;
if (text.getStyle().getColor() != null) {
color = 0xFF000000 | text.getStyle().getColor().getValue();
}
GuiUtils.fill(guiGraphics, getRelativeX() + optionCenter, getRelativeY() + 17, 1, 3, color);
if (usesIcons) {
IHasModeIcon hasModeIcon = (IHasModeIcon) option;
guiGraphics.blit(hasModeIcon.getModeIcon(), (int) (getRelativeX() + optionCenter - 8), getRelativeY() + 19, 0, 0, 16, 16, 16, 16);
} else {
parent.drawTextWithScale(guiGraphics, text, getRelativeX() + left, getRelativeY() + 20, textColor, TEXT_SCALE);
}
}
}

Expand Down
6 changes: 4 additions & 2 deletions src/main/java/mekanism/common/CommonPlayerTickHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,12 @@ private void tickEnd(Player player) {
if (!jetpack.isEmpty()) {
ItemStack primaryJetpack = IJetpackItem.getPrimaryJetpack(player);
if (!primaryJetpack.isEmpty()) {
JetpackMode primaryMode = ((IJetpackItem) primaryJetpack.getItem()).getJetpackMode(primaryJetpack);
IJetpackItem jetpackItem = (IJetpackItem) primaryJetpack.getItem();
JetpackMode primaryMode = jetpackItem.getJetpackMode(primaryJetpack);
JetpackMode mode = IJetpackItem.getPlayerJetpackMode(player, primaryMode, () -> Mekanism.keyMap.has(player.getUUID(), KeySync.ASCEND));
if (mode != JetpackMode.DISABLED) {
if (IJetpackItem.handleJetpackMotion(player, mode, () -> Mekanism.keyMap.has(player.getUUID(), KeySync.ASCEND))) {
double jetpackThrust = jetpackItem.getJetpackThrust(primaryJetpack);
if (IJetpackItem.handleJetpackMotion(player, mode, jetpackThrust, () -> Mekanism.keyMap.has(player.getUUID(), KeySync.ASCEND))) {
player.resetFallDistance();
if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.connection.aboveGroundTickCount = 0;
Expand Down
1 change: 1 addition & 0 deletions src/main/java/mekanism/common/MekanismLang.java
Original file line number Diff line number Diff line change
Expand Up @@ -643,6 +643,7 @@ public enum MekanismLang implements ILangEntry {
JETPACK_MODE_CHANGE("jetpack", "mode_change"),
JETPACK_NORMAL("jetpack", "normal"),
JETPACK_HOVER("jetpack", "hover"),
JETPACK_VECTOR("jetpack", "vector"),
JETPACK_DISABLED("jetpack", "disabled"),
//Disassembler Mode
DISASSEMBLER_MODE_CHANGE("disassembler", "mode_change"),
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/mekanism/common/content/gear/Module.java
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,12 @@ public void onRemoved(boolean last) {

@Override
public void displayModeChange(Player player, Component modeName, IHasTextComponent mode) {
player.sendSystemMessage(MekanismUtils.logFormat(MekanismLang.MODULE_MODE_CHANGE.translate(modeName, EnumColor.INDIGO, mode)));
Component modeComponent = mode.getTextComponent();
if (modeComponent.getStyle().getColor() != null) {
player.sendSystemMessage(MekanismUtils.logFormat(MekanismLang.MODULE_MODE_CHANGE.translate(modeName, modeComponent)));
} else {
player.sendSystemMessage(MekanismUtils.logFormat(MekanismLang.MODULE_MODE_CHANGE.translate(modeName, EnumColor.INDIGO, modeComponent)));
}
}

@Override
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/mekanism/common/item/gear/ItemJetpack.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ public JetpackMode getJetpackMode(ItemStack stack) {
return JetpackMode.byIndexStatic(ItemDataUtils.getInt(stack, NBTConstants.MODE));
}

@Override
public double getJetpackThrust(ItemStack stack) {
return 0.15;
}

@Override
public void useJetpackFuel(ItemStack stack) {
useGas(stack, 1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,12 @@ public JetpackMode getJetpackMode(ItemStack stack) {
return JetpackMode.DISABLED;
}

@Override
public double getJetpackThrust(ItemStack stack) {
//The control mekasuit thrust feature is not available at this time due to large code differences between branches.
return 0.15;
}

@Override
public void useJetpackFuel(ItemStack stack) {
useGas(stack, MekanismGases.HYDROGEN.get(), 1);
Expand Down
67 changes: 45 additions & 22 deletions src/main/java/mekanism/common/item/interfaces/IJetpackItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.util.function.Predicate;
import mekanism.api.IIncrementalEnum;
import mekanism.api.annotations.NothingNullByDefault;
import mekanism.api.gear.config.IHasModeIcon;
import mekanism.api.math.MathUtils;
import mekanism.api.text.EnumColor;
import mekanism.api.text.IHasTextComponent;
Expand All @@ -29,23 +30,28 @@ public interface IJetpackItem {

JetpackMode getJetpackMode(ItemStack stack);

double getJetpackThrust(ItemStack stack);

void useJetpackFuel(ItemStack stack);

@NothingNullByDefault
enum JetpackMode implements IIncrementalEnum<JetpackMode>, IHasTextComponent {
NORMAL(MekanismLang.JETPACK_NORMAL, EnumColor.DARK_GREEN, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_normal.png")),
HOVER(MekanismLang.JETPACK_HOVER, EnumColor.DARK_AQUA, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_hover.png")),
DISABLED(MekanismLang.JETPACK_DISABLED, EnumColor.DARK_RED, MekanismUtils.getResource(ResourceType.GUI_HUD, "jetpack_off.png"));
enum JetpackMode implements IIncrementalEnum<JetpackMode>, IHasModeIcon {
NORMAL(MekanismLang.JETPACK_NORMAL, EnumColor.DARK_GREEN, "jetpack_normal.png"),
HOVER(MekanismLang.JETPACK_HOVER, EnumColor.DARK_AQUA, "jetpack_hover.png"),
VECTOR(MekanismLang.JETPACK_VECTOR, EnumColor.ORANGE, "jetpack_vector.png"),
DISABLED(MekanismLang.JETPACK_DISABLED, EnumColor.DARK_RED, "jetpack_off.png");

private static final JetpackMode[] MODES = values();
private final ILangEntry langEntry;
private final EnumColor color;
private final ResourceLocation hudIcon;
private final ResourceLocation modeIcon;

JetpackMode(ILangEntry langEntry, EnumColor color, ResourceLocation hudIcon) {
JetpackMode(ILangEntry langEntry, EnumColor color, String icon) {
this.langEntry = langEntry;
this.color = color;
this.hudIcon = hudIcon;
this.hudIcon = MekanismUtils.getResource(ResourceType.GUI_HUD, icon);
this.modeIcon = MekanismUtils.getResource(ResourceType.GUI_MODE, icon);
}

@Override
Expand All @@ -65,6 +71,12 @@ public ResourceLocation getHUDIcon() {
public static JetpackMode byIndexStatic(int index) {
return MathUtils.getByIndexMod(MODES, index);
}

@Override
public ResourceLocation getModeIcon() {
return modeIcon;
}

}

/**
Expand Down Expand Up @@ -108,38 +120,49 @@ private static ItemStack getJetpack(LivingEntity entity, Predicate<ItemStack> ma
/**
* @return If fall distance should get reset or not
*/
static boolean handleJetpackMotion(Player player, JetpackMode mode, BooleanSupplier ascendingSupplier) {
static boolean handleJetpackMotion(Player player, JetpackMode mode, double thrust, BooleanSupplier ascendingSupplier) {
Vec3 motion = player.getDeltaMovement();
if (mode == JetpackMode.NORMAL) {
if (player.isFallFlying()) {
Vec3 forward = player.getLookAngle();
Vec3 delta = forward.multiply(forward.scale(0.15))
.add(forward.scale(1.5).subtract(motion).scale(0.5));
player.setDeltaMovement(motion.add(delta));
return false;
} else {
player.setDeltaMovement(motion.x(), Math.min(motion.y() + 0.15D, 0.5D), motion.z());
}
if (mode == JetpackMode.VECTOR && player.isShiftKeyDown()) {
//TODO: Do we want to expand holding shift to some sort of secondary behavior
mode = JetpackMode.NORMAL;
}
if ((mode == JetpackMode.NORMAL || mode == JetpackMode.VECTOR) && player.isFallFlying()) {
Vec3 forward = player.getLookAngle();
Vec3 drag = forward.scale(1.5).subtract(motion).scale(0.5);
Vec3 delta = forward.scale(thrust).add(drag);
player.addDeltaMovement(delta);
return false;
} else if (mode == JetpackMode.NORMAL) {
Vec3 delta = new Vec3(0, thrust * getVerticalCoefficient(motion.y()), 0);
player.addDeltaMovement(delta);
} else if (mode == JetpackMode.VECTOR) {
Vec3 thrustVec = player.getUpVector(1F).scale(thrust);
Vec3 delta = new Vec3(thrustVec.x, thrustVec.y * getVerticalCoefficient(motion.y()), thrustVec.z);
player.addDeltaMovement(delta);
} else if (mode == JetpackMode.HOVER) {
boolean ascending = ascendingSupplier.getAsBoolean();
boolean descending = player.isDescending();
if (ascending == descending) {
if (motion.y() > 0) {
player.setDeltaMovement(motion.x(), Math.max(motion.y() - 0.15D, 0), motion.z());
player.setDeltaMovement(motion.x(), Math.max(motion.y() - thrust, 0), motion.z());
} else if (motion.y() < 0) {
if (!CommonPlayerTickHandler.isOnGroundOrSleeping(player)) {
player.setDeltaMovement(motion.x(), Math.min(motion.y() + 0.15D, 0), motion.z());
player.setDeltaMovement(motion.x(), Math.min(motion.y() + thrust, 0), motion.z());
}
}
} else if (ascending) {
player.setDeltaMovement(motion.x(), Math.min(motion.y() + 0.15D, 0.2D), motion.z());
player.setDeltaMovement(motion.x(), Math.min(motion.y() + thrust, 2 * thrust), motion.z());
} else if (!CommonPlayerTickHandler.isOnGroundOrSleeping(player)) {
player.setDeltaMovement(motion.x(), Math.max(motion.y() - 0.15D, -0.2D), motion.z());
player.setDeltaMovement(motion.x(), Math.max(motion.y() - thrust, -2 * thrust), motion.z());
}
}
return true;
}

private static double getVerticalCoefficient(double currentYVelocity) {
return Math.min(1, Math.exp(-currentYVelocity));
}

static JetpackMode getPlayerJetpackMode(Player player, JetpackMode mode, BooleanSupplier ascendingSupplier) {
if (!player.isSpectator()) {
if (mode != JetpackMode.DISABLED) {
Expand All @@ -148,7 +171,7 @@ static JetpackMode getPlayerJetpackMode(Player player, JetpackMode mode, Boolean
if (ascending && !player.isDescending() || !CommonPlayerTickHandler.isOnGroundOrSleeping(player)) {
return mode;
}
} else if (mode == JetpackMode.NORMAL && ascending) {
} else if (ascending) {
return mode;
}
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/mekanism/common/util/MekanismUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -852,6 +852,7 @@ public enum ResourceType {
GUI_GAUGE("gui/gauge"),
GUI_HUD("gui/hud"),
GUI_ICONS("gui/icons"),
GUI_MODE("gui/mode"),
GUI_PROGRESS("gui/progress"),
GUI_RADIAL("gui/radial"),
GUI_SLOT("gui/slot"),
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions src/main/resources/assets/mekanism/lang/ca_es.json
Original file line number Diff line number Diff line change
Expand Up @@ -1221,6 +1221,7 @@
"jetpack.mekanism.hover": "Flotar",
"jetpack.mekanism.mode_change": "Mode de motxilla propulsora canviat a: %1$s",
"jetpack.mekanism.normal": "Normal",
"jetpack.mekanism.vector": "Vector",
"key.mekanism.chest_mode": "Interruptor de Mode de Cofre",
"key.mekanism.description": "Show description",
"key.mekanism.details": "Show details",
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/assets/mekanism/lang/cs_cz.json
Original file line number Diff line number Diff line change
Expand Up @@ -831,6 +831,7 @@
"item.mekanism.sulfuric_acid_bucket": "Kbelík tekuté kyseliny sírové",
"item.mekanism.yellow_cake_uranium": "Koláč z Žlutého Uranu",
"jetpack.mekanism.disabled": "Vypnuto",
"jetpack.mekanism.vector": "Vektor",
"key.mekanism.chest_mode": "Přepínání Módů Brnění",
"key.mekanism.description": "Show description",
"key.mekanism.details": "Show details",
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/assets/mekanism/lang/de_at.json
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,7 @@
"jetpack.mekanism.hover": "Schweben",
"jetpack.mekanism.mode_change": "Jetpack-Modus geändert zu: %1$s",
"jetpack.mekanism.normal": "Regulär",
"jetpack.mekanism.vector": "Vektor",
"key.mekanism.chest_mode": "Brust Modus wechseln",
"key.mekanism.description": "Show description",
"key.mekanism.details": "Show details",
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/assets/mekanism/lang/de_ch.json
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,7 @@
"jetpack.mekanism.hover": "Schweben",
"jetpack.mekanism.mode_change": "Jetpack-Modus geändert zu: %1$s",
"jetpack.mekanism.normal": "Regulär",
"jetpack.mekanism.vector": "Vektor",
"key.mekanism.chest_mode": "Brust Modus wechseln",
"key.mekanism.description": "Show description",
"key.mekanism.details": "Show details",
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/assets/mekanism/lang/de_de.json
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,7 @@
"jetpack.mekanism.hover": "Schweben",
"jetpack.mekanism.mode_change": "Jetpack-Modus geändert zu: %1$s",
"jetpack.mekanism.normal": "Regulär",
"jetpack.mekanism.vector": "Vektor",
"key.mekanism.chest_mode": "Brust Modus wechseln",
"key.mekanism.description": "Zeige Beschreibung",
"key.mekanism.details": "Zeige Details",
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/assets/mekanism/lang/es_ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,7 @@
"jetpack.mekanism.hover": "Flotar",
"jetpack.mekanism.mode_change": "Modo del Jetpack cambiado a: %1$s",
"jetpack.mekanism.normal": "Normal",
"jetpack.mekanism.vector": "Vector",
"key.mekanism.chest_mode": "Interruptor de Modo de cofre",
"key.mekanism.description": "Mostrar descripción",
"key.mekanism.details": "Mostrar detalles",
Expand Down
Loading