Removed ConfigHost facade around AEConfig with explicit config options
Removed unused config options
This commit is contained in:
@@ -45,7 +45,7 @@ public abstract class AEBaseMEGui<T extends AEBaseContainer> extends AEBaseGui<T
|
|||||||
final Slot s = this.getSlot(x, y);
|
final Slot s = this.getSlot(x, y);
|
||||||
|
|
||||||
if (s instanceof SlotME && !stack.isEmpty()) {
|
if (s instanceof SlotME && !stack.isEmpty()) {
|
||||||
final int bigNumber = AEConfig.instance().useTerminalUseLargeFont() ? 999 : 9999;
|
final int bigNumber = AEConfig.instance().isUseLargeFonts() ? 999 : 9999;
|
||||||
|
|
||||||
IAEItemStack myStack = null;
|
IAEItemStack myStack = null;
|
||||||
final List<String> currentToolTip = this.getTooltipFromItem(stack);
|
final List<String> currentToolTip = this.getTooltipFromItem(stack);
|
||||||
|
|||||||
@@ -28,12 +28,7 @@ import net.minecraft.inventory.container.Slot;
|
|||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.util.text.ITextComponent;
|
||||||
|
|
||||||
import appeng.api.config.SearchBoxMode;
|
import appeng.api.config.*;
|
||||||
import appeng.api.config.Settings;
|
|
||||||
import appeng.api.config.SortDir;
|
|
||||||
import appeng.api.config.SortOrder;
|
|
||||||
import appeng.api.config.TerminalStyle;
|
|
||||||
import appeng.api.config.ViewItems;
|
|
||||||
import appeng.api.implementations.guiobjects.IPortableCell;
|
import appeng.api.implementations.guiobjects.IPortableCell;
|
||||||
import appeng.api.implementations.tiles.IMEChest;
|
import appeng.api.implementations.tiles.IMEChest;
|
||||||
import appeng.api.implementations.tiles.IViewCellStorage;
|
import appeng.api.implementations.tiles.IViewCellStorage;
|
||||||
@@ -42,11 +37,7 @@ import appeng.api.util.IConfigManager;
|
|||||||
import appeng.api.util.IConfigurableObject;
|
import appeng.api.util.IConfigurableObject;
|
||||||
import appeng.client.ActionKey;
|
import appeng.client.ActionKey;
|
||||||
import appeng.client.gui.AEBaseMEGui;
|
import appeng.client.gui.AEBaseMEGui;
|
||||||
import appeng.client.gui.widgets.GuiScrollbar;
|
import appeng.client.gui.widgets.*;
|
||||||
import appeng.client.gui.widgets.GuiSettingToggleButton;
|
|
||||||
import appeng.client.gui.widgets.GuiTabButton;
|
|
||||||
import appeng.client.gui.widgets.ISortSource;
|
|
||||||
import appeng.client.gui.widgets.MEGuiTextField;
|
|
||||||
import appeng.client.me.InternalSlotME;
|
import appeng.client.me.InternalSlotME;
|
||||||
import appeng.client.me.ItemRepo;
|
import appeng.client.me.ItemRepo;
|
||||||
import appeng.container.implementations.ContainerCraftingStatus;
|
import appeng.container.implementations.ContainerCraftingStatus;
|
||||||
@@ -158,8 +149,7 @@ public class GuiMEMonitorable<T extends ContainerMEMonitorable> extends AEBaseME
|
|||||||
getMinecraft().keyboardListener.enableRepeatEvents(true);
|
getMinecraft().keyboardListener.enableRepeatEvents(true);
|
||||||
|
|
||||||
this.maxRows = this.getMaxRows();
|
this.maxRows = this.getMaxRows();
|
||||||
TerminalStyle terminalStyle = (TerminalStyle) AEConfig.instance().getConfigManager()
|
TerminalStyle terminalStyle = AEConfig.instance().getTerminalStyle();
|
||||||
.getSetting(Settings.TERMINAL_STYLE);
|
|
||||||
|
|
||||||
if (terminalStyle != TerminalStyle.FULL) {
|
if (terminalStyle != TerminalStyle.FULL) {
|
||||||
this.perRow = 9;
|
this.perRow = 9;
|
||||||
@@ -214,16 +204,15 @@ public class GuiMEMonitorable<T extends ContainerMEMonitorable> extends AEBaseME
|
|||||||
Settings.SORT_DIRECTION, getSortDir(), this::toggleServerSetting));
|
Settings.SORT_DIRECTION, getSortDir(), this::toggleServerSetting));
|
||||||
offset += 20;
|
offset += 20;
|
||||||
|
|
||||||
SearchBoxMode searchMode = (SearchBoxMode) AEConfig.instance().getConfigManager()
|
SearchBoxMode searchMode = AEConfig.instance().getTerminalSearchMode();
|
||||||
.getSetting(Settings.SEARCH_MODE);
|
|
||||||
this.addButton(new GuiSettingToggleButton<>(this.guiLeft - 18, offset, Settings.SEARCH_MODE, searchMode,
|
this.addButton(new GuiSettingToggleButton<>(this.guiLeft - 18, offset, Settings.SEARCH_MODE, searchMode,
|
||||||
Platform::isSearchModeAvailable, this::toggleClientSetting));
|
Platform::isSearchModeAvailable, this::toggleTerminalSearchMode));
|
||||||
|
|
||||||
offset += 20;
|
offset += 20;
|
||||||
|
|
||||||
if (!(this instanceof GuiMEPortableCell) || this instanceof GuiWirelessTerm) {
|
if (!(this instanceof GuiMEPortableCell) || this instanceof GuiWirelessTerm) {
|
||||||
this.addButton(new GuiSettingToggleButton<>(this.guiLeft - 18, offset, Settings.TERMINAL_STYLE,
|
this.addButton(new GuiSettingToggleButton<>(this.guiLeft - 18, offset, Settings.TERMINAL_STYLE,
|
||||||
terminalStyle, this::toggleClientSetting));
|
terminalStyle, this::toggleTerminalStyle));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.searchField = new MEGuiTextField(this.font, this.guiLeft + Math.max(80, this.offsetX), this.guiTop + 4, 90,
|
this.searchField = new MEGuiTextField(this.font, this.guiLeft + Math.max(80, this.offsetX), this.guiTop + 4, 90,
|
||||||
@@ -364,8 +353,7 @@ public class GuiMEMonitorable<T extends ContainerMEMonitorable> extends AEBaseME
|
|||||||
}
|
}
|
||||||
|
|
||||||
int getMaxRows() {
|
int getMaxRows() {
|
||||||
return AEConfig.instance().getConfigManager().getSetting(Settings.TERMINAL_STYLE) == TerminalStyle.SMALL ? 6
|
return AEConfig.instance().getTerminalStyle() == TerminalStyle.SMALL ? 6 : Integer.MAX_VALUE;
|
||||||
: Integer.MAX_VALUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void repositionSlot(final AppEngSlot s) {
|
protected void repositionSlot(final AppEngSlot s) {
|
||||||
@@ -494,9 +482,16 @@ public class GuiMEMonitorable<T extends ContainerMEMonitorable> extends AEBaseME
|
|||||||
this.standardSize = standardSize;
|
this.standardSize = standardSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
private <S extends Enum<S>> void toggleClientSetting(GuiSettingToggleButton<S> btn, boolean backwards) {
|
private void toggleTerminalSearchMode(GuiSettingToggleButton<SearchBoxMode> btn, boolean backwards) {
|
||||||
S next = btn.getNextValue(backwards);
|
SearchBoxMode next = btn.getNextValue(backwards);
|
||||||
AEConfig.instance().getConfigManager().putSetting(btn.getSetting(), next);
|
AEConfig.instance().setTerminalSearchMode(next);
|
||||||
|
btn.set(next);
|
||||||
|
this.reinitalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toggleTerminalStyle(GuiSettingToggleButton<TerminalStyle> btn, boolean backwards) {
|
||||||
|
TerminalStyle next = btn.getNextValue(backwards);
|
||||||
|
AEConfig.instance().setTerminalStyle(next);
|
||||||
btn.set(next);
|
btn.set(next);
|
||||||
this.reinitalize();
|
this.reinitalize();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ public final class CommonButtons {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static GuiSettingToggleButton<PowerUnits> togglePowerUnit(int x, int y) {
|
public static GuiSettingToggleButton<PowerUnits> togglePowerUnit(int x, int y) {
|
||||||
return new GuiSettingToggleButton<>(x, y, Settings.POWER_UNITS, AEConfig.instance().selectedPowerUnit(),
|
return new GuiSettingToggleButton<>(x, y, Settings.POWER_UNITS, AEConfig.instance().getSelectedPowerUnit(),
|
||||||
CommonButtons::togglePowerUnit);
|
CommonButtons::togglePowerUnit);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void togglePowerUnit(GuiSettingToggleButton<PowerUnits> button, boolean backwards) {
|
private static void togglePowerUnit(GuiSettingToggleButton<PowerUnits> button, boolean backwards) {
|
||||||
AEConfig.instance().nextPowerUnit(backwards);
|
AEConfig.instance().nextPowerUnit(backwards);
|
||||||
button.set(AEConfig.instance().selectedPowerUnit());
|
button.set(AEConfig.instance().getSelectedPowerUnit());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,8 +91,7 @@ public class FluidRepo {
|
|||||||
|
|
||||||
final Enum viewMode = this.sortSrc.getSortDisplay();
|
final Enum viewMode = this.sortSrc.getSortDisplay();
|
||||||
final boolean needsZeroCopy = viewMode == ViewItems.CRAFTABLE;
|
final boolean needsZeroCopy = viewMode == ViewItems.CRAFTABLE;
|
||||||
final boolean terminalSearchToolTips = AEConfig.instance().getConfigManager()
|
final boolean terminalSearchToolTips = AEConfig.instance().getSearchTooltips() != YesNo.NO;
|
||||||
.getSetting(Settings.SEARCH_TOOLTIPS) != YesNo.NO;
|
|
||||||
|
|
||||||
boolean notDone = false;
|
boolean notDone = false;
|
||||||
for (IAEFluidStack fs : this.list) {
|
for (IAEFluidStack fs : this.list) {
|
||||||
|
|||||||
@@ -100,8 +100,8 @@ public class ItemRepo {
|
|||||||
|
|
||||||
this.view.ensureCapacity(this.list.size());
|
this.view.ensureCapacity(this.list.size());
|
||||||
|
|
||||||
final Enum viewMode = this.sortSrc.getSortDisplay();
|
ViewItems viewMode = this.sortSrc.getSortDisplay();
|
||||||
final Enum searchMode = AEConfig.instance().getConfigManager().getSetting(Settings.SEARCH_MODE);
|
SearchBoxMode searchMode = AEConfig.instance().getTerminalSearchMode();
|
||||||
final boolean needsZeroCopy = viewMode == ViewItems.CRAFTABLE;
|
final boolean needsZeroCopy = viewMode == ViewItems.CRAFTABLE;
|
||||||
|
|
||||||
if (searchMode == SearchBoxMode.JEI_AUTOSEARCH || searchMode == SearchBoxMode.JEI_MANUAL_SEARCH
|
if (searchMode == SearchBoxMode.JEI_AUTOSEARCH || searchMode == SearchBoxMode.JEI_MANUAL_SEARCH
|
||||||
@@ -111,8 +111,7 @@ public class ItemRepo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.innerSearch = this.searchString;
|
this.innerSearch = this.searchString;
|
||||||
final boolean terminalSearchToolTips = AEConfig.instance().getConfigManager()
|
final boolean terminalSearchToolTips = AEConfig.instance().getSearchTooltips() != YesNo.NO;
|
||||||
.getSetting(Settings.SEARCH_TOOLTIPS) != YesNo.NO;
|
|
||||||
|
|
||||||
boolean searchMod = false;
|
boolean searchMod = false;
|
||||||
if (this.innerSearch.startsWith("@")) {
|
if (this.innerSearch.startsWith("@")) {
|
||||||
|
|||||||
@@ -46,8 +46,7 @@ public class StackSizeRenderer {
|
|||||||
public void renderStackSize(FontRenderer fontRenderer, IAEItemStack aeStack, int xPos, int yPos) {
|
public void renderStackSize(FontRenderer fontRenderer, IAEItemStack aeStack, int xPos, int yPos) {
|
||||||
if (aeStack != null) {
|
if (aeStack != null) {
|
||||||
if (aeStack.getStackSize() == 0 && aeStack.isCraftable()) {
|
if (aeStack.getStackSize() == 0 && aeStack.isCraftable()) {
|
||||||
final String craftLabelText = AEConfig.instance().useTerminalUseLargeFont()
|
final String craftLabelText = AEConfig.instance().isUseLargeFonts() ? GuiText.LargeFontCraft.getLocal()
|
||||||
? GuiText.LargeFontCraft.getLocal()
|
|
||||||
: GuiText.SmallFontCraft.getLocal();
|
: GuiText.SmallFontCraft.getLocal();
|
||||||
|
|
||||||
renderSizeLabel(fontRenderer, xPos, yPos, craftLabelText);
|
renderSizeLabel(fontRenderer, xPos, yPos, craftLabelText);
|
||||||
@@ -64,9 +63,9 @@ public class StackSizeRenderer {
|
|||||||
|
|
||||||
public static void renderSizeLabel(FontRenderer fontRenderer, float xPos, float yPos, String text) {
|
public static void renderSizeLabel(FontRenderer fontRenderer, float xPos, float yPos, String text) {
|
||||||
|
|
||||||
final float scaleFactor = AEConfig.instance().useTerminalUseLargeFont() ? 0.85f : 0.5f;
|
final float scaleFactor = AEConfig.instance().isUseLargeFonts() ? 0.85f : 0.5f;
|
||||||
final float inverseScaleFactor = 1.0f / scaleFactor;
|
final float inverseScaleFactor = 1.0f / scaleFactor;
|
||||||
final int offset = AEConfig.instance().useTerminalUseLargeFont() ? 0 : -1;
|
final int offset = AEConfig.instance().isUseLargeFonts() ? 0 : -1;
|
||||||
|
|
||||||
TransformationMatrix tm = new TransformationMatrix(new Vector3f(0, 0, 300), // Taken from
|
TransformationMatrix tm = new TransformationMatrix(new Vector3f(0, 0, 300), // Taken from
|
||||||
// ItemRenderer.renderItemOverlayIntoGUI
|
// ItemRenderer.renderItemOverlayIntoGUI
|
||||||
@@ -83,7 +82,7 @@ public class StackSizeRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String getToBeRenderedStackSize(final long originalSize) {
|
private String getToBeRenderedStackSize(final long originalSize) {
|
||||||
if (AEConfig.instance().useTerminalUseLargeFont()) {
|
if (AEConfig.instance().isUseLargeFonts()) {
|
||||||
return SLIM_CONVERTER.toSlimReadableForm(originalSize);
|
return SLIM_CONVERTER.toSlimReadableForm(originalSize);
|
||||||
} else {
|
} else {
|
||||||
return WIDE_CONVERTER.toWideReadableForm(originalSize);
|
return WIDE_CONVERTER.toWideReadableForm(originalSize);
|
||||||
|
|||||||
@@ -18,20 +18,9 @@
|
|||||||
|
|
||||||
package appeng.core;
|
package appeng.core;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.EnumMap;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.function.DoubleSupplier;
|
import java.util.function.DoubleSupplier;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
|
|
||||||
@@ -47,23 +36,13 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
|
|||||||
import net.minecraftforge.fml.common.Mod;
|
import net.minecraftforge.fml.common.Mod;
|
||||||
import net.minecraftforge.fml.config.ModConfig;
|
import net.minecraftforge.fml.config.ModConfig;
|
||||||
|
|
||||||
import appeng.api.config.CondenserOutput;
|
import appeng.api.config.*;
|
||||||
import appeng.api.config.PowerMultiplier;
|
|
||||||
import appeng.api.config.PowerUnits;
|
|
||||||
import appeng.api.config.SearchBoxMode;
|
|
||||||
import appeng.api.config.Settings;
|
|
||||||
import appeng.api.config.TerminalStyle;
|
|
||||||
import appeng.api.config.YesNo;
|
|
||||||
import appeng.api.features.AEFeature;
|
import appeng.api.features.AEFeature;
|
||||||
import appeng.api.util.IConfigManager;
|
|
||||||
import appeng.api.util.IConfigurableObject;
|
|
||||||
import appeng.core.settings.TickRates;
|
import appeng.core.settings.TickRates;
|
||||||
import appeng.util.ConfigManager;
|
|
||||||
import appeng.util.EnumCycler;
|
import appeng.util.EnumCycler;
|
||||||
import appeng.util.IConfigManagerHost;
|
|
||||||
|
|
||||||
@Mod.EventBusSubscriber(modid = AppEng.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
|
@Mod.EventBusSubscriber(modid = AppEng.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
|
||||||
public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
public final class AEConfig {
|
||||||
|
|
||||||
public static final ClientConfig CLIENT;
|
public static final ClientConfig CLIENT;
|
||||||
public static final ForgeConfigSpec CLIENT_SPEC;
|
public static final ForgeConfigSpec CLIENT_SPEC;
|
||||||
@@ -91,10 +70,7 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
// Config instance
|
// Config instance
|
||||||
private static final AEConfig instance = new AEConfig();
|
private static final AEConfig instance = new AEConfig();
|
||||||
|
|
||||||
private final IConfigManager settings = new ConfigManager(this);
|
|
||||||
|
|
||||||
private final EnumSet<AEFeature> featureFlags = EnumSet.noneOf(AEFeature.class);
|
private final EnumSet<AEFeature> featureFlags = EnumSet.noneOf(AEFeature.class);
|
||||||
private boolean updatable = false;
|
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
private boolean removeCrashingItemsOnLoad;
|
private boolean removeCrashingItemsOnLoad;
|
||||||
@@ -107,9 +83,9 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
private PowerUnits selectedPowerUnit;
|
private PowerUnits selectedPowerUnit;
|
||||||
|
|
||||||
// GUI Buttons
|
// GUI Buttons
|
||||||
private int[] craftByStacks = new int[4];
|
private final int[] craftByStacks = new int[4];
|
||||||
private int[] priorityByStacks = new int[4];
|
private final int[] priorityByStacks = new int[4];
|
||||||
private int[] levelByStacks = new int[4];
|
private final int[] levelByStacks = new int[4];
|
||||||
private final int[] levelByMillibuckets = { 10, 100, 1000, 10000 };
|
private final int[] levelByMillibuckets = { 10, 100, 1000, 10000 };
|
||||||
|
|
||||||
// Spatial IO/Dimension
|
// Spatial IO/Dimension
|
||||||
@@ -128,9 +104,6 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
private int chargedStaffBattery;
|
private int chargedStaffBattery;
|
||||||
|
|
||||||
// Meteors
|
// Meteors
|
||||||
private int minMeteoriteDistance;
|
|
||||||
private int minMeteoriteDistanceSq;
|
|
||||||
private double meteoriteClusterChance;
|
|
||||||
private int meteoriteMaximumSpawnHeight;
|
private int meteoriteMaximumSpawnHeight;
|
||||||
private Set<String> meteoriteDimensionWhitelist;
|
private Set<String> meteoriteDimensionWhitelist;
|
||||||
|
|
||||||
@@ -150,93 +123,61 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void onModConfigEvent(final ModConfig.ModConfigEvent configEvent) {
|
public static void onModConfigEvent(final ModConfig.ModConfigEvent configEvent) {
|
||||||
if (configEvent.getConfig().getSpec() == CLIENT_SPEC) {
|
if (configEvent.getConfig().getSpec() == CLIENT_SPEC) {
|
||||||
instance.syncConfig(CLIENT);
|
instance.syncClientConfig();
|
||||||
} else if (configEvent.getConfig().getSpec() == COMMON_SPEC) {
|
} else if (configEvent.getConfig().getSpec() == COMMON_SPEC) {
|
||||||
instance.syncConfig(COMMON);
|
instance.syncCommonConfig();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void syncConfig(ClientConfig config) {
|
private void syncClientConfig() {
|
||||||
|
this.disableColoredCableRecipesInJEI = CLIENT.disableColoredCableRecipesInJEI.get();
|
||||||
this.disableColoredCableRecipesInJEI = config.disableColoredCableRecipesInJEI.get();
|
this.enableEffects = CLIENT.enableEffects.get();
|
||||||
this.enableEffects = config.enableEffects.get();
|
this.useLargeFonts = CLIENT.useLargeFonts.get();
|
||||||
this.useLargeFonts = config.useLargeFonts.get();
|
this.useColoredCraftingStatus = CLIENT.useColoredCraftingStatus.get();
|
||||||
this.useColoredCraftingStatus = config.useColoredCraftingStatus.get();
|
this.selectedPowerUnit = CLIENT.selectedPowerUnit.get();
|
||||||
this.selectedPowerUnit = config.selectedPowerUnit.get();
|
|
||||||
|
|
||||||
// load buttons..
|
// load buttons..
|
||||||
for (int btnNum = 0; btnNum < 4; btnNum++) {
|
for (int btnNum = 0; btnNum < 4; btnNum++) {
|
||||||
this.craftByStacks[btnNum] = config.craftByStacks.get(btnNum).get();
|
this.craftByStacks[btnNum] = CLIENT.craftByStacks.get(btnNum).get();
|
||||||
this.priorityByStacks[btnNum] = config.priorityByStacks.get(btnNum).get();
|
this.priorityByStacks[btnNum] = CLIENT.priorityByStacks.get(btnNum).get();
|
||||||
this.levelByStacks[btnNum] = config.levelByStacks.get(btnNum).get();
|
this.levelByStacks[btnNum] = CLIENT.levelByStacks.get(btnNum).get();
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME for( final Settings e : this.settings.getSettings() )
|
|
||||||
// FIXME {
|
|
||||||
// FIXME final String Category = "Client"; // e.getClass().getSimpleName();
|
|
||||||
// FIXME Enum<?> value = this.settings.getSetting( e );
|
|
||||||
// FIXME
|
|
||||||
// FIXME final Property p = this.get( Category, e.name(), value.name(),
|
|
||||||
// this.getListComment( value ) );
|
|
||||||
// FIXME
|
|
||||||
// FIXME try
|
|
||||||
// FIXME {
|
|
||||||
// FIXME value = Enum.valueOf( value.getClass(), p.getString() );
|
|
||||||
// FIXME }
|
|
||||||
// FIXME catch( final IllegalArgumentException er )
|
|
||||||
// FIXME {
|
|
||||||
// FIXME AELog.info( "Invalid value '" + p.getString() + "' for " + e.name() + "
|
|
||||||
// using '" + value.name() + "' instead" );
|
|
||||||
// FIXME }
|
|
||||||
// FIXME
|
|
||||||
// FIXME this.settings.putSetting( e, value );
|
|
||||||
// FIXME }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void syncConfig(CommonConfig config) {
|
private void syncCommonConfig() {
|
||||||
|
PowerUnits.EU.conversionRatio = COMMON.powerRatioIc2.get();
|
||||||
|
PowerUnits.RF.conversionRatio = COMMON.powerRatioForgeEnergy.get();
|
||||||
|
PowerMultiplier.CONFIG.multiplier = COMMON.powerUsageMultiplier.get();
|
||||||
|
|
||||||
// FIXME: why is this here exactly???
|
CondenserOutput.MATTER_BALLS.requiredPower = COMMON.condenserMatterBallsPower.get();
|
||||||
this.settings.registerSetting(Settings.SEARCH_TOOLTIPS, YesNo.YES);
|
CondenserOutput.SINGULARITY.requiredPower = COMMON.condenserSingularityPower.get();
|
||||||
this.settings.registerSetting(Settings.TERMINAL_STYLE, TerminalStyle.TALL);
|
|
||||||
this.settings.registerSetting(Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH);
|
|
||||||
|
|
||||||
PowerUnits.EU.conversionRatio = config.powerRatioIc2.get();
|
this.oreDoublePercentage = COMMON.oreDoublePercentage.get().floatValue();
|
||||||
PowerUnits.RF.conversionRatio = config.powerRatioForgeEnergy.get();
|
|
||||||
PowerMultiplier.CONFIG.multiplier = config.powerUsageMultiplier.get();
|
|
||||||
|
|
||||||
CondenserOutput.MATTER_BALLS.requiredPower = config.condenserMatterBallsPower.get();
|
this.meteoriteMaximumSpawnHeight = COMMON.meteoriteMaximumSpawnHeight.get();
|
||||||
CondenserOutput.SINGULARITY.requiredPower = config.condenserSingularityPower.get();
|
this.meteoriteDimensionWhitelist = new HashSet<>(COMMON.meteoriteDimensionWhitelist.get());
|
||||||
|
|
||||||
this.oreDoublePercentage = config.oreDoublePercentage.get().floatValue();
|
this.wirelessBaseCost = COMMON.wirelessBaseCost.get();
|
||||||
|
this.wirelessCostMultiplier = COMMON.wirelessCostMultiplier.get();
|
||||||
|
this.wirelessBaseRange = COMMON.wirelessBaseRange.get();
|
||||||
|
this.wirelessBoosterRangeMultiplier = COMMON.wirelessBoosterRangeMultiplier.get();
|
||||||
|
this.wirelessBoosterExp = COMMON.wirelessBoosterExp.get();
|
||||||
|
this.wirelessHighWirelessCount = COMMON.wirelessHighWirelessCount.get();
|
||||||
|
this.wirelessTerminalDrainMultiplier = COMMON.wirelessTerminalDrainMultiplier.get();
|
||||||
|
|
||||||
this.minMeteoriteDistance = config.minMeteoriteDistance.get();
|
this.formationPlaneEntityLimit = COMMON.formationPlaneEntityLimit.get();
|
||||||
this.minMeteoriteDistanceSq = this.minMeteoriteDistance * this.minMeteoriteDistance;
|
|
||||||
this.meteoriteClusterChance = config.meteoriteClusterChance.get();
|
|
||||||
this.meteoriteMaximumSpawnHeight = config.meteoriteMaximumSpawnHeight.get();
|
|
||||||
this.meteoriteDimensionWhitelist = new HashSet<>(config.meteoriteDimensionWhitelist.get());
|
|
||||||
|
|
||||||
this.wirelessBaseCost = config.wirelessBaseCost.get();
|
this.wirelessTerminalBattery = COMMON.wirelessTerminalBattery.get();
|
||||||
this.wirelessCostMultiplier = config.wirelessCostMultiplier.get();
|
this.chargedStaffBattery = COMMON.chargedStaffBattery.get();
|
||||||
this.wirelessBaseRange = config.wirelessBaseRange.get();
|
this.entropyManipulatorBattery = COMMON.entropyManipulatorBattery.get();
|
||||||
this.wirelessBoosterRangeMultiplier = config.wirelessBoosterRangeMultiplier.get();
|
this.portableCellBattery = COMMON.portableCellBattery.get();
|
||||||
this.wirelessBoosterExp = config.wirelessBoosterExp.get();
|
this.colorApplicatorBattery = COMMON.colorApplicatorBattery.get();
|
||||||
this.wirelessHighWirelessCount = config.wirelessHighWirelessCount.get();
|
this.matterCannonBattery = COMMON.matterCannonBattery.get();
|
||||||
this.wirelessTerminalDrainMultiplier = config.wirelessTerminalDrainMultiplier.get();
|
|
||||||
|
|
||||||
this.formationPlaneEntityLimit = config.formationPlaneEntityLimit.get();
|
|
||||||
|
|
||||||
this.wirelessTerminalBattery = config.wirelessTerminalBattery.get();
|
|
||||||
this.chargedStaffBattery = config.chargedStaffBattery.get();
|
|
||||||
this.entropyManipulatorBattery = config.entropyManipulatorBattery.get();
|
|
||||||
this.portableCellBattery = config.portableCellBattery.get();
|
|
||||||
this.colorApplicatorBattery = config.colorApplicatorBattery.get();
|
|
||||||
this.matterCannonBattery = config.matterCannonBattery.get();
|
|
||||||
|
|
||||||
this.featureFlags.clear();
|
this.featureFlags.clear();
|
||||||
for (final AEFeature feature : AEFeature.values()) {
|
for (final AEFeature feature : AEFeature.values()) {
|
||||||
if (feature.isVisible()) {
|
if (feature.isVisible()) {
|
||||||
if (config.enabledFeatures.get(feature).get()) {
|
if (COMMON.enabledFeatures.get(feature).get()) {
|
||||||
this.featureFlags.add(feature);
|
this.featureFlags.add(feature);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -244,29 +185,17 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME final ModContainer imb = net.minecraftforge.fml.common.Loader.instance().getIndexedModList().get( "ImmibisCore" );
|
|
||||||
// FIXME if( imb != null )
|
|
||||||
// FIXME {
|
|
||||||
// FIXME final List<String> version = Arrays.asList( "59.0.0", "59.0.1", "59.0.2" );
|
|
||||||
// FIXME if( version.contains( imb.getVersion() ) )
|
|
||||||
// FIXME {
|
|
||||||
// FIXME this.featureFlags.remove( AEFeature.ALPHA_PASS );
|
|
||||||
// FIXME }
|
|
||||||
// FIXME }
|
|
||||||
|
|
||||||
for (final TickRates tr : TickRates.values()) {
|
for (final TickRates tr : TickRates.values()) {
|
||||||
tr.setMin(config.tickRateMin.get(tr).get());
|
tr.setMin(COMMON.tickRateMin.get(tr).get());
|
||||||
tr.setMax(config.tickRateMin.get(tr).get());
|
tr.setMax(COMMON.tickRateMin.get(tr).get());
|
||||||
}
|
}
|
||||||
|
|
||||||
this.spatialPowerMultiplier = config.spatialPowerMultiplier.get();
|
this.spatialPowerMultiplier = COMMON.spatialPowerMultiplier.get();
|
||||||
this.spatialPowerExponent = config.spatialPowerExponent.get();
|
this.spatialPowerExponent = COMMON.spatialPowerExponent.get();
|
||||||
|
|
||||||
this.craftingCalculationTimePerTick = config.craftingCalculationTimePerTick.get();
|
this.craftingCalculationTimePerTick = COMMON.craftingCalculationTimePerTick.get();
|
||||||
|
|
||||||
this.removeCrashingItemsOnLoad = config.removeCrashingItemsOnLoad.get();
|
this.removeCrashingItemsOnLoad = COMMON.removeCrashingItemsOnLoad.get();
|
||||||
|
|
||||||
this.updatable = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AEConfig instance() {
|
public static AEConfig instance() {
|
||||||
@@ -295,21 +224,25 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
+ this.wirelessCostMultiplier * Math.pow(boosters, 1 + boosters / this.wirelessHighWirelessCount);
|
+ this.wirelessCostMultiplier * Math.pow(boosters, 1 + boosters / this.wirelessHighWirelessCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME @Override
|
public YesNo getSearchTooltips() {
|
||||||
// FIXME public Property get( final String category, final String key, final String defaultValue, final String comment, final Property.Type type )
|
return CLIENT.searchTooltips.get();
|
||||||
// FIXME {
|
}
|
||||||
// FIXME final Property prop = super.get( category, key, defaultValue, comment, type );
|
|
||||||
// FIXME
|
public TerminalStyle getTerminalStyle() {
|
||||||
// FIXME if( prop != null )
|
return CLIENT.terminalStyle.get();
|
||||||
// FIXME {
|
}
|
||||||
// FIXME if( !category.equals( "Client" ) )
|
|
||||||
// FIXME {
|
public void setTerminalStyle(TerminalStyle setting) {
|
||||||
// FIXME prop.setRequiresMcRestart( true );
|
CLIENT.terminalStyle.set(setting);
|
||||||
// FIXME }
|
}
|
||||||
// FIXME }
|
|
||||||
// FIXME
|
public SearchBoxMode getTerminalSearchMode() {
|
||||||
// FIXME return prop;
|
return CLIENT.terminalSearchMode.get();
|
||||||
// FIXME }
|
}
|
||||||
|
|
||||||
|
public void setTerminalSearchMode(SearchBoxMode setting) {
|
||||||
|
CLIENT.terminalSearchMode.set(setting);
|
||||||
|
}
|
||||||
|
|
||||||
public void save() {
|
public void save() {
|
||||||
if (CLIENT_SPEC.isLoaded()) {
|
if (CLIENT_SPEC.isLoaded()) {
|
||||||
@@ -322,34 +255,6 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateSetting(final IConfigManager manager, final Settings setting, final Enum<?> newValue) {
|
|
||||||
// FIXME for( final Settings e : this.settings.getSettings() )
|
|
||||||
// FIXME {
|
|
||||||
// FIXME if( e == setting )
|
|
||||||
// FIXME {
|
|
||||||
// FIXME final String Category = "Client";
|
|
||||||
// FIXME final Property p = this.get( Category, e.name(),
|
|
||||||
// this.settings.getSetting( e ).name(), this.getListComment( newValue ) );
|
|
||||||
// FIXME p.set( newValue.name() );
|
|
||||||
// FIXME }
|
|
||||||
// FIXME }
|
|
||||||
// FIXME
|
|
||||||
// FIXME if( this.updatable )
|
|
||||||
// FIXME {
|
|
||||||
// FIXME this.save();
|
|
||||||
// FIXME }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IConfigManager getConfigManager() {
|
|
||||||
return this.settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean useTerminalUseLargeFont() {
|
|
||||||
return this.useLargeFonts;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int craftItemsByStackAmounts(final int i) {
|
public int craftItemsByStackAmounts(final int i) {
|
||||||
return this.craftByStacks[i];
|
return this.craftByStacks[i];
|
||||||
}
|
}
|
||||||
@@ -366,31 +271,7 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
return this.levelByMillibuckets[i];
|
return this.levelByMillibuckets[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME public Enum getSetting( final String category, final Class<? extends Enum> class1, final Enum myDefault )
|
public PowerUnits getSelectedPowerUnit() {
|
||||||
// FIXME {
|
|
||||||
// FIXME final String name = class1.getSimpleName();
|
|
||||||
// FIXME final Property p = this.get( category, name, myDefault.name() );
|
|
||||||
// FIXME
|
|
||||||
// FIXME try
|
|
||||||
// FIXME {
|
|
||||||
// FIXME return (Enum) class1.getField( p.toString() ).get( class1 );
|
|
||||||
// FIXME }
|
|
||||||
// FIXME catch( final Throwable t )
|
|
||||||
// FIXME {
|
|
||||||
// FIXME // :{
|
|
||||||
// FIXME }
|
|
||||||
// FIXME
|
|
||||||
// FIXME return myDefault;
|
|
||||||
// FIXME }
|
|
||||||
|
|
||||||
// FIXME public void setSetting( final String category, final Enum s )
|
|
||||||
// FIXME {
|
|
||||||
// FIXME final String name = s.getClass().getSimpleName();
|
|
||||||
// FIXME this.get( category, name, s.name() ).set( s.name() );
|
|
||||||
// FIXME this.save();
|
|
||||||
// FIXME }
|
|
||||||
|
|
||||||
public PowerUnits selectedPowerUnit() {
|
|
||||||
return this.selectedPowerUnit;
|
return this.selectedPowerUnit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -430,22 +311,6 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
return this.craftingCalculationTimePerTick;
|
return this.craftingCalculationTimePerTick;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PowerUnits getSelectedPowerUnit() {
|
|
||||||
return this.selectedPowerUnit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int[] getCraftByStacks() {
|
|
||||||
return this.craftByStacks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int[] getPriorityByStacks() {
|
|
||||||
return this.priorityByStacks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int[] getLevelByStacks() {
|
|
||||||
return this.levelByStacks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getSpatialPowerExponent() {
|
public double getSpatialPowerExponent() {
|
||||||
return this.spatialPowerExponent;
|
return this.spatialPowerExponent;
|
||||||
}
|
}
|
||||||
@@ -494,18 +359,6 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
return COMMON.quartzOresClusterAmount.get();
|
return COMMON.quartzOresClusterAmount.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMinMeteoriteDistance() {
|
|
||||||
return this.minMeteoriteDistance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMinMeteoriteDistanceSq() {
|
|
||||||
return this.minMeteoriteDistanceSq;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getMeteoriteClusterChance() {
|
|
||||||
return this.meteoriteClusterChance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMeteoriteMaximumSpawnHeight() {
|
public int getMeteoriteMaximumSpawnHeight() {
|
||||||
return this.meteoriteMaximumSpawnHeight;
|
return this.meteoriteMaximumSpawnHeight;
|
||||||
}
|
}
|
||||||
@@ -514,34 +367,6 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
return this.meteoriteDimensionWhitelist;
|
return this.meteoriteDimensionWhitelist;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getWirelessBaseCost() {
|
|
||||||
return this.wirelessBaseCost;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getWirelessCostMultiplier() {
|
|
||||||
return this.wirelessCostMultiplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getWirelessTerminalDrainMultiplier() {
|
|
||||||
return this.wirelessTerminalDrainMultiplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getWirelessBaseRange() {
|
|
||||||
return this.wirelessBaseRange;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getWirelessBoosterRangeMultiplier() {
|
|
||||||
return this.wirelessBoosterRangeMultiplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getWirelessBoosterExp() {
|
|
||||||
return this.wirelessBoosterExp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getWirelessHighWirelessCount() {
|
|
||||||
return this.wirelessHighWirelessCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setters keep visibility as low as possible.
|
// Setters keep visibility as low as possible.
|
||||||
|
|
||||||
private static class ClientConfig {
|
private static class ClientConfig {
|
||||||
@@ -559,6 +384,11 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
public final List<ConfigValue<Integer>> priorityByStacks;
|
public final List<ConfigValue<Integer>> priorityByStacks;
|
||||||
public final List<ConfigValue<Integer>> levelByStacks;
|
public final List<ConfigValue<Integer>> levelByStacks;
|
||||||
|
|
||||||
|
// Terminal Settings
|
||||||
|
public final EnumValue<YesNo> searchTooltips;
|
||||||
|
public final EnumValue<TerminalStyle> terminalStyle;
|
||||||
|
public final EnumValue<SearchBoxMode> terminalSearchMode;
|
||||||
|
|
||||||
public ClientConfig(ForgeConfigSpec.Builder builder) {
|
public ClientConfig(ForgeConfigSpec.Builder builder) {
|
||||||
builder.push("client");
|
builder.push("client");
|
||||||
this.disableColoredCableRecipesInJEI = builder.comment("TODO").define("disableColoredCableRecipesInJEI",
|
this.disableColoredCableRecipesInJEI = builder.comment("TODO").define("disableColoredCableRecipesInJEI",
|
||||||
@@ -586,6 +416,14 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
}
|
}
|
||||||
|
|
||||||
builder.pop();
|
builder.pop();
|
||||||
|
|
||||||
|
builder.push("terminals");
|
||||||
|
this.searchTooltips = builder.comment("Should tooltips be searched. Performance impact")
|
||||||
|
.defineEnum("searchTooltips", YesNo.YES, YesNo.values());
|
||||||
|
this.terminalStyle = builder.defineEnum("terminalStyle", TerminalStyle.TALL, TerminalStyle.values());
|
||||||
|
this.terminalSearchMode = builder.defineEnum("terminalSearchMode", SearchBoxMode.AUTOSEARCH,
|
||||||
|
SearchBoxMode.values());
|
||||||
|
builder.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -621,8 +459,6 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
public final ConfigValue<Integer> quartzOresClusterAmount;
|
public final ConfigValue<Integer> quartzOresClusterAmount;
|
||||||
|
|
||||||
// Meteors
|
// Meteors
|
||||||
public final ConfigValue<Integer> minMeteoriteDistance;
|
|
||||||
public final ConfigValue<Double> meteoriteClusterChance;
|
|
||||||
public final ConfigValue<Integer> meteoriteMaximumSpawnHeight;
|
public final ConfigValue<Integer> meteoriteMaximumSpawnHeight;
|
||||||
public final ConfigValue<List<? extends String>> meteoriteDimensionWhitelist;
|
public final ConfigValue<List<? extends String>> meteoriteDimensionWhitelist;
|
||||||
|
|
||||||
@@ -709,8 +545,6 @@ public final class AEConfig implements IConfigurableObject, IConfigManagerHost {
|
|||||||
builder.push("worldGen");
|
builder.push("worldGen");
|
||||||
|
|
||||||
this.spawnChargedChance = builder.defineInRange("spawnChargedChance", 0.08, 0.0, 1.0);
|
this.spawnChargedChance = builder.defineInRange("spawnChargedChance", 0.08, 0.0, 1.0);
|
||||||
this.minMeteoriteDistance = builder.define("minMeteoriteDistance", 707);
|
|
||||||
this.meteoriteClusterChance = builder.define("meteoriteClusterChance", 0.1);
|
|
||||||
this.meteoriteMaximumSpawnHeight = builder.define("meteoriteMaximumSpawnHeight", 180);
|
this.meteoriteMaximumSpawnHeight = builder.define("meteoriteMaximumSpawnHeight", 180);
|
||||||
List<String> defaultDimensionWhitelist = new ArrayList<>();
|
List<String> defaultDimensionWhitelist = new ArrayList<>();
|
||||||
defaultDimensionWhitelist.add(DimensionType.getKey(DimensionType.OVERWORLD).toString());
|
defaultDimensionWhitelist.add(DimensionType.getKey(DimensionType.OVERWORLD).toString());
|
||||||
|
|||||||
@@ -56,13 +56,13 @@ public class FluidStackSizeRenderer {
|
|||||||
// Handle any value below 100 (large font) or 1000 (small font) Buckets with a
|
// Handle any value below 100 (large font) or 1000 (small font) Buckets with a
|
||||||
// custom formatter,
|
// custom formatter,
|
||||||
// otherwise pass it to the normal number converter
|
// otherwise pass it to the normal number converter
|
||||||
if (originalSize < 1000 * 100 && AEConfig.instance().useTerminalUseLargeFont()) {
|
if (originalSize < 1000 * 100 && AEConfig.instance().isUseLargeFonts()) {
|
||||||
return this.getSlimRenderedStacksize(originalSize);
|
return this.getSlimRenderedStacksize(originalSize);
|
||||||
} else if (originalSize < 1000 * 1000 && !AEConfig.instance().useTerminalUseLargeFont()) {
|
} else if (originalSize < 1000 * 1000 && !AEConfig.instance().isUseLargeFonts()) {
|
||||||
return this.getWideRenderedStacksize(originalSize);
|
return this.getWideRenderedStacksize(originalSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AEConfig.instance().useTerminalUseLargeFont()) {
|
if (AEConfig.instance().isUseLargeFonts()) {
|
||||||
return SLIM_CONVERTER.toSlimReadableForm(originalSize / 1000);
|
return SLIM_CONVERTER.toSlimReadableForm(originalSize / 1000);
|
||||||
} else {
|
} else {
|
||||||
return WIDE_CONVERTER.toWideReadableForm(originalSize / 1000);
|
return WIDE_CONVERTER.toWideReadableForm(originalSize / 1000);
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ public class Platform {
|
|||||||
public static String formatPowerLong(final long n, final boolean isRate) {
|
public static String formatPowerLong(final long n, final boolean isRate) {
|
||||||
double p = ((double) n) / 100;
|
double p = ((double) n) / 100;
|
||||||
|
|
||||||
final PowerUnits displayUnits = AEConfig.instance().selectedPowerUnit();
|
final PowerUnits displayUnits = AEConfig.instance().getSelectedPowerUnit();
|
||||||
p = PowerUnits.AE.convertTo(displayUnits, p);
|
p = PowerUnits.AE.convertTo(displayUnits, p);
|
||||||
|
|
||||||
final String[] preFixes = { "k", "M", "G", "T", "P", "T", "P", "E", "Z", "Y" };
|
final String[] preFixes = { "k", "M", "G", "T", "P", "T", "P", "E", "Z", "Y" };
|
||||||
|
|||||||
Reference in New Issue
Block a user