Skip to content

Commit

Permalink
Terminal hw upgrade (#128)
Browse files Browse the repository at this point in the history
* spawn terminal for new players

* gen guide files from resources

* simplified App framework

* backgroud app bug fix

* hw system

* hw capability

* fix capability

* fix file seystem

* fix capitalization on terminal icon folders (#125)

* terminal root path

Co-authored-by: froot <[email protected]>
  • Loading branch information
Yefancy and kumquat-ir authored Aug 31, 2021
1 parent ab0b16f commit cbfaca7
Show file tree
Hide file tree
Showing 141 changed files with 823 additions and 189 deletions.
5 changes: 1 addition & 4 deletions src/main/java/gregtech/GregTechMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import gregtech.api.model.ResourcePackHook;
import gregtech.api.net.NetworkHandler;
import gregtech.api.recipes.RecipeMap;
import gregtech.api.terminal.util.GuideJsonLoader;
import gregtech.api.terminal.TerminalRegistry;
import gregtech.api.unification.OreDictUnifier;
import gregtech.api.unification.material.IMaterialHandler;
import gregtech.api.unification.material.MaterialRegistry;
Expand All @@ -37,8 +37,6 @@
import gregtech.common.worldgen.WorldGenRubberTree;
import gregtech.integration.theoneprobe.TheOneProbeCompatibility;
import gregtech.loaders.dungeon.DungeonLootLoader;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.SimpleReloadableResourceManager;
import gregtech.loaders.recipe.component.AnnotatedComponentHandlerLoader;
import net.minecraftforge.classloading.FMLForgePlugin;
import net.minecraftforge.fluids.FluidRegistry;
Expand Down Expand Up @@ -66,7 +64,6 @@ public class GregTechMod {
BlockOreFactory.init();
BlockCompressedFactory.init();
BlockFrameFactory.init();
((SimpleReloadableResourceManager)Minecraft.getMinecraft().getResourceManager()).registerReloadListener(new GuideJsonLoader());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import gregtech.api.capability.tool.IScrewdriverItem;
import gregtech.api.capability.tool.ISoftHammerItem;
import gregtech.api.capability.tool.IWrenchItem;
import gregtech.api.terminal.hardware.HardwareProvider;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.capabilities.Capability;
Expand Down Expand Up @@ -41,6 +42,9 @@ public class GregtechCapabilities {
@CapabilityInject(IMultiblockController.class)
public static Capability<IMultiblockController> CAPABILITY_MULTIBLOCK_CONTROLLER = null;

@CapabilityInject(HardwareProvider.class)
public static Capability<HardwareProvider> CAPABILITY_HARDWARE_PROVIDER = null;

private static final ResourceLocation CAPABILITY_EU_TO_FE = new ResourceLocation(GTValues.MODID, "fe_capability");

@SubscribeEvent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import gregtech.api.capability.tool.ISoftHammerItem;
import gregtech.api.capability.tool.IWrenchItem;
import gregtech.api.cover.ICoverable;
import gregtech.api.terminal.hardware.HardwareProvider;
import gregtech.api.worldgen.generator.GTWorldGenCapability;
import net.minecraft.nbt.NBTBase;
import net.minecraft.util.EnumFacing;
Expand Down Expand Up @@ -44,6 +45,7 @@ public static void init() {
registerCapabilityWithNoDefault(IFuelable.class);
registerCapabilityWithNoDefault(IMultiblockController.class);
registerCapabilityWithNoDefault(AbstractRecipeLogic.class);
registerCapabilityWithNoDefault(HardwareProvider.class);

registerCapabilityWithNoDefault(IWrenchItem.class);
registerCapabilityWithNoDefault(ICutterItem.class);
Expand Down
163 changes: 141 additions & 22 deletions src/main/java/gregtech/api/terminal/TerminalRegistry.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package gregtech.api.terminal;

import gregtech.api.GTValues;
import gregtech.api.terminal.app.*;
import gregtech.api.terminal.app.AbstractApplication;
import gregtech.api.terminal.hardware.BatteryHardware;
import gregtech.api.terminal.hardware.Hardware;
import gregtech.api.terminal.util.GuideJsonLoader;
import gregtech.api.util.FileUtility;
import gregtech.api.util.GTLog;
import gregtech.common.ConfigHolder;
import gregtech.common.terminal.app.ThemeSettingApp;
import gregtech.common.terminal.app.console.ConsoleApp;
import gregtech.common.terminal.app.guide.ItemGuideApp;
Expand All @@ -11,43 +17,156 @@
import gregtech.common.terminal.app.guideeditor.GuideEditorApp;
import gregtech.common.terminal.app.prospector.OreProspectorApp;
import gregtech.common.terminal.app.recipechart.RecipeChartApp;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.SimpleReloadableResourceManager;
import net.minecraft.util.registry.RegistryDefaulted;
import net.minecraft.util.registry.RegistrySimple;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import java.util.*;
import javax.annotation.Nullable;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class TerminalRegistry {
private static final Map<String, AbstractApplication> appRegister = new HashMap<>();
private static final List<String> defaultApps = new ArrayList<>();
public static final RegistrySimple<String, AbstractApplication> APP_REGISTER = new RegistrySimple<>();
public static final RegistrySimple<String, Hardware> HW_REGISTER = new RegistrySimple<>();
public static final RegistrySimple<String, List<Hardware>> APP_HW_DEMAND = new RegistryDefaulted<>(Collections.emptyList());
public static final RegistrySimple<String, List<List<Object>>> APP_UPGRADE_CONDITIONS = new RegistryDefaulted<>(Collections.emptyList());
public static final List<String> DEFAULT_APPS = new ArrayList<>();
@SideOnly(Side.CLIENT)
public static final File TERMINAL_PATH = new File(Loader.instance().getConfigDir(), ConfigHolder.clientConfig.terminalRootPath);

public static void init() {
registerApp(new SimpleMachineGuideApp(), true);
registerApp(new MultiBlockGuideApp(), true);
registerApp(new ItemGuideApp(), true);
registerApp(new TutorialGuideApp(), true);
registerApp(new GuideEditorApp(), true);
registerApp(new ThemeSettingApp(), true);
registerApp(new OreProspectorApp(), true);
// register hardware
registerHardware(new BatteryHardware());
// register applications
AppBuilder.create(new SimpleMachineGuideApp()).defaultApp(true).build();
AppBuilder.create(new MultiBlockGuideApp()).defaultApp(true).build();
AppBuilder.create(new ItemGuideApp()).defaultApp(true).build();
AppBuilder.create(new TutorialGuideApp()).defaultApp(true).build();
AppBuilder.create(new GuideEditorApp()).defaultApp(true).build();
AppBuilder.create(new ThemeSettingApp()).defaultApp(true).build();
AppBuilder.create(new OreProspectorApp()).defaultApp(false).build();
if (GTValues.isModLoaded(GTValues.MODID_JEI)) {
registerApp(new RecipeChartApp(), true);
AppBuilder.create(new RecipeChartApp()).defaultApp(false).build();
}
registerApp(new ConsoleApp(), true);
AppBuilder.create(new ConsoleApp()).defaultApp(false).build();

}

@SideOnly(Side.CLIENT)
public static void initTerminalFiles() {
FileUtility.extractJarFiles(String.format("/assets/%s/%s", GTValues.MODID, "terminal"), TERMINAL_PATH, false);
((SimpleReloadableResourceManager) Minecraft.getMinecraft().getResourceManager()).registerReloadListener(new GuideJsonLoader());
}

public static void registerApp(AbstractApplication application) {
String name = application.getRegistryName();
if (APP_REGISTER.containsKey(name)) {
GTLog.logger.warn("Duplicate APP registry names exist: {}", name);
return;
}
APP_REGISTER.putObject(name, application);
}

public static void registerHardware(Hardware hardware) {
String name = hardware.getRegistryName();
if (APP_REGISTER.containsKey(name)) {
GTLog.logger.warn("Duplicate APP registry names exist: {}", name);
return;
}
HW_REGISTER.putObject(name, hardware);
}

public static void registerApp(AbstractApplication application, boolean isDefaultApp) {
appRegister.put(application.getRegistryName(), application);
if (isDefaultApp) {
defaultApps.add(application.getRegistryName());
public static void registerHardwareDemand(String name, boolean isDefaultApp, @Nullable List<Hardware> hardware, @Nullable List<List<Object>> upgrade) {
if (name != null && APP_REGISTER.containsKey(name)) {
if (isDefaultApp) {
DEFAULT_APPS.add(name);
}
if (hardware != null && !hardware.isEmpty()) {
APP_HW_DEMAND.putObject(name, hardware);
}
if (upgrade != null && !upgrade.isEmpty()) {
APP_UPGRADE_CONDITIONS.putObject(name, upgrade);
}
} else {
GTLog.logger.error("Not found the app {}", name);
}
}

public static List<String> getDefaultApps() {
return defaultApps;
public static List<AbstractApplication> getDefaultApps() {
return DEFAULT_APPS.stream().map(APP_REGISTER::getObject).collect(Collectors.toList());
}

public static List<String> getAllApps() {
return new ArrayList<>(appRegister.keySet());
public static List<AbstractApplication> getAllApps() {
return APP_REGISTER.getKeys().stream().map(APP_REGISTER::getObject).collect(Collectors.toList());
}

public static AbstractApplication getApplication(String name) {
return appRegister.get(name);
return APP_REGISTER.getObject(name);
}

public static List<Hardware> getAllHardware() {
return HW_REGISTER.getKeys().stream().map(HW_REGISTER::getObject).collect(Collectors.toList());
}

public static Hardware getHardware(String name) {
return HW_REGISTER.getObject(name);
}

public static List<Hardware> getAppHardwareDemand(String name) {
return APP_HW_DEMAND.getObject(name);
}

public static List<List<Object>> getAppHardwareUpgradeConditions(String name) {
return APP_UPGRADE_CONDITIONS.getObject(name);
}

private static class AppBuilder {
AbstractApplication app;
boolean isDefaultApp;
List<Hardware> hardware;
List<List<Object>> upgrade;

public static AppBuilder create(AbstractApplication app){
AppBuilder builder = new AppBuilder();
builder.app = app;
builder.hardware = new ArrayList<>();
builder.upgrade = new ArrayList<>(Collections.nCopies(app.getMaxTier(), null));
return builder;
}

public AppBuilder defaultApp(boolean isDefaultApp){
this.isDefaultApp = isDefaultApp;
return this;
}

public AppBuilder battery(int tier, long cost) {
this.hardware.add(new BatteryHardware.BatteryDemand(tier, cost));
return this;
}

public AppBuilder hardware(Hardware... hardware) {
this.hardware.addAll(Arrays.asList(hardware));
return this;
}

public AppBuilder upgrade(int tier, List<Object> objects) {
if (tier < upgrade.size()) {
upgrade.set(tier, objects);
}
return this;
}

public void build() {
TerminalRegistry.registerApp(app);
TerminalRegistry.registerHardwareDemand(app.getRegistryName(), isDefaultApp, hardware, upgrade);
}
}
}
29 changes: 24 additions & 5 deletions src/main/java/gregtech/api/terminal/app/AbstractApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import gregtech.api.util.GTLog;
import gregtech.api.util.Position;
import gregtech.api.util.Size;
import gregtech.common.terminal.app.guide.GuideApp;
import gregtech.common.items.behaviors.TerminalBehaviour;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.PacketBuffer;
Expand All @@ -20,6 +20,8 @@ public abstract class AbstractApplication extends AnimaWidgetGroup {
protected final String name;
protected final IGuiTexture icon;
protected TerminalOSWidget os;
protected boolean isClient;
protected NBTTagCompound nbt;

public AbstractApplication(String name, IGuiTexture icon) {
super(Position.ORIGIN, new Size(333, 232));
Expand All @@ -44,20 +46,23 @@ public IGuiTexture getIcon() {
return icon;
}

public AbstractApplication createApp(TerminalOSWidget os, boolean isClient, NBTTagCompound nbt) {
public AbstractApplication createAppInstance(TerminalOSWidget os, boolean isClient, NBTTagCompound nbt) {
try {
return this.getClass().newInstance().setOs(os).initApp(isClient, nbt);
AbstractApplication app = this.getClass().newInstance();
app.isClient = isClient;
app.nbt = nbt;
return app;
} catch (InstantiationException | IllegalAccessException e) {
GTLog.logger.error("Error while create default app. {}", this.getClass(), e);
}
return null;
}

protected AbstractApplication initApp(boolean isClient, NBTTagCompound nbt) {
public AbstractApplication initApp() {
return this;
}

public NBTTagCompound closeApp(boolean isClient, NBTTagCompound nbt) {
public NBTTagCompound closeApp() {
return null;
}

Expand All @@ -79,6 +84,20 @@ public boolean canPlayerUse(EntityPlayer player) {
return true;
}

public final int getAppTier() {
if (nbt != null) {
if (TerminalBehaviour.isCreative(getOs().itemStack)) {
return getMaxTier();
}
return Math.min(nbt.getInteger("_tier"), getMaxTier());
}
return 0;
}

public int getMaxTier() {
return 0;
}

@Override
protected void writeClientAction(int id, Consumer<PacketBuffer> packetBufferWriter) {
if (!isClientSideApp()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,12 @@ public TreeNode<K, T> jumpTo(List<K> path) {
list.add(index + 1 + j, node.getChildren().get(j));
}
}
index = i + 1;
index++;
dim++;
flag = true;
break;
} else {
index++;
}
}
if (!flag) return null;
Expand Down
Loading

0 comments on commit cbfaca7

Please sign in to comment.