diff options
| author | BlueWeabo <ilia.iliev2005@gmail.com> | 2023-02-26 13:16:07 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-26 12:16:07 +0100 |
| commit | b8d1ecf8b9b6348304392d09e4490d473dbb120d (patch) | |
| tree | 1cdc59a1b660510fe2abd40686b2abed8b0ab40f /src/main/java/gregtech/common/misc/spaceprojects/base | |
| parent | ebd7df3a1ddba9105df008d44ab046d159279628 (diff) | |
| download | GT5-Unofficial-b8d1ecf8b9b6348304392d09e4490d473dbb120d.tar.gz GT5-Unofficial-b8d1ecf8b9b6348304392d09e4490d473dbb120d.tar.bz2 GT5-Unofficial-b8d1ecf8b9b6348304392d09e4490d473dbb120d.zip | |
Add a completely new system for late/endgame content (#1754)
* basic work
* typo fixes
* make an enum folder
* location enums
* space project manager
* implement the space project teams
* commands
* move things around and new things
* upgrade work
* requirement work
* if possible use an upgrades values
* cleanup
* more helpers in command
* fix AOOBE
* fix world saved data
* builder for requirements
* add command autocomplete
* fix command npe
* mark world saved data dirty
* switch to saving to json string. this is fine
* fix npe
* fix files not saving correctly. serialization
* spotless
* part 1 of fixing json saving
* working json file saving
* rename fields
* full implementation of SP_Upgrade
* fixes
* cleanup
* texture prep
* documentation part 1
* documentation part 2 and rework of json saving
* fix the missed conversions
* set texture when copying
* more interface usage and fixes
* rework saving.
* Added rudimentary NEI handler for projects
* Revert "Added rudimentary NEI handler for projects"
This reverts commit 6d8210e25b27fee7dc1865d1afa91708a8d9b875.
* address NPEs
* some textures
* higher quality textures, put in the moon as a temp texture
* add a check to create a team if one smt weird happens
* command work
* add ability to localize the space bodies
* Added disabled button and toggle button
* Added possibility to not render the original stacksize of item stacks in NEI
* Added NEI handler
* Fixes item count on tooltip always rendering as 1
* Fix refactor
* 5 new body textures
* fix misspelled texture name
---------
Co-authored-by: minecraft7771 <maxim235@gmx.de>
Diffstat (limited to 'src/main/java/gregtech/common/misc/spaceprojects/base')
3 files changed, 864 insertions, 0 deletions
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java new file mode 100644 index 0000000000..0cce6f08f0 --- /dev/null +++ b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java @@ -0,0 +1,77 @@ +package gregtech.common.misc.spaceprojects.base; + +import java.util.ArrayList; +import java.util.List; + +import gregtech.common.misc.spaceprojects.enums.SpaceBodyType; +import gregtech.common.misc.spaceprojects.enums.StarType; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Requirements; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Upgrade; + +/** + * @author BlueWeabo + */ +public class SP_Requirements implements ISP_Requirements { + + // #region Variables + + protected SpaceBodyType spaceBody = SpaceBodyType.NONE; + protected StarType star = StarType.NotAStar; + protected List<ISpaceProject> spaceProjects = new ArrayList<>(); + protected List<ISP_Upgrade> upgrades = new ArrayList<>(); + + // #endregion + + // #region Getters + + @Override + public SpaceBodyType getBodyType() { + return spaceBody; + } + + @Override + public StarType getStarType() { + return star; + } + + @Override + public List<ISpaceProject> getProjects() { + return spaceProjects; + } + + @Override + public List<ISP_Upgrade> getUpgrades() { + return upgrades; + } + + // #endregion + + // #region Setters/Builder + + public SP_Requirements setSpaceBodyType(SpaceBodyType spaceBodyType) { + spaceBody = spaceBodyType; + return this; + } + + public SP_Requirements setStarType(StarType starType) { + star = starType; + return this; + } + + public SP_Requirements setUpgrades(ISP_Upgrade... requirementUpgrades) { + for (ISP_Upgrade upgrade : requirementUpgrades) { + upgrades.add(upgrade); + } + return this; + } + + public SP_Requirements setSpaceProjects(ISpaceProject... requirementProjects) { + for (ISpaceProject project : requirementProjects) { + spaceProjects.add(project); + } + return this; + } + + // #endregion +} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java new file mode 100644 index 0000000000..6a1fe82791 --- /dev/null +++ b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java @@ -0,0 +1,347 @@ +package gregtech.common.misc.spaceprojects.base; + +import java.util.UUID; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.common.misc.spaceprojects.SpaceProjectManager; +import gregtech.common.misc.spaceprojects.enums.UpgradeStatus; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Upgrade; + +/** + * @author BlueWeabo + */ +public class SP_Upgrade implements ISP_Upgrade { + + // #region Variables + + protected String name; + protected String unlocalizedName; + protected ItemStack[] itemsCost; + protected FluidStack[] fluidsCost; + protected int totalStages; + protected int currentStage; + protected int buildTime; + protected long voltage; + protected SP_Requirements requirements; + protected ISpaceProject projectBelongingTo; + + // #endregion + + // #region Getters + + @Override + public String getUpgradeName() { + return name; + } + + @Override + public String getUnlocalizedName() { + return unlocalizedName; + } + + @Override + public String getLocalizedName() { + return StatCollector.translateToLocal(unlocalizedName); + } + + @Override + public ItemStack[] getItemsCostPerStage() { + return itemsCost; + } + + @Override + public ItemStack getItemCostPerStage(int index) { + if (itemsCost == null || index < 0 || index >= itemsCost.length) { + return null; + } + + return itemsCost[index]; + } + + @Override + public ItemStack[] getCurrentItemsProgress() { + ItemStack[] currentItemsProgress = new ItemStack[itemsCost.length]; + int index = 0; + for (ItemStack item : itemsCost) { + ItemStack copy = item.copy(); + copy.stackSize *= getCurrentStage(); + currentItemsProgress[index++] = copy; + } + + return currentItemsProgress; + } + + @Override + public ItemStack getCurrentItemProgress(int index) { + if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) { + return null; + } + + ItemStack item = itemsCost[index].copy(); + item.stackSize *= getCurrentStage(); + return item; + } + + @Override + public ItemStack[] getTotalItemsCost() { + ItemStack[] totalItemsCost = new ItemStack[itemsCost.length]; + int index = 0; + for (ItemStack item : itemsCost) { + ItemStack copy = item.copy(); + copy.stackSize *= getTotalStages(); + totalItemsCost[index++] = copy; + } + + return totalItemsCost; + } + + @Override + public ItemStack getTotalItemCost(int index) { + if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) { + return null; + } + + ItemStack item = itemsCost[index].copy(); + item.stackSize *= getTotalStages(); + return item; + } + + @Override + public FluidStack[] getFluidsCostPerStage() { + return fluidsCost; + } + + @Override + public FluidStack getFluidCostPerStage(int index) { + if (fluidsCost == null || index < 0 || index >= fluidsCost.length) { + return null; + } + + return fluidsCost[index]; + } + + @Override + public FluidStack[] getCurrentFluidsProgress() { + if (fluidsCost == null) { + return null; + } + + FluidStack[] currentFluidsProgress = new FluidStack[fluidsCost.length]; + int index = 0; + for (FluidStack fluid : fluidsCost) { + FluidStack copy = fluid.copy(); + copy.amount *= getCurrentStage(); + currentFluidsProgress[index++] = copy; + } + + return currentFluidsProgress; + } + + @Override + public FluidStack getCurrentFluidProgress(int index) { + if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) { + return null; + } + + FluidStack fluid = fluidsCost[index].copy(); + fluid.amount *= getCurrentStage(); + return fluid; + } + + @Override + public FluidStack[] getTotalFluidsCost() { + if (fluidsCost == null) { + return null; + } + + FluidStack[] totalFluidsCost = new FluidStack[fluidsCost.length]; + int index = 0; + for (FluidStack fluid : fluidsCost) { + FluidStack copy = fluid.copy(); + copy.amount *= getTotalStages(); + totalFluidsCost[index++] = copy; + } + + return totalFluidsCost; + } + + @Override + public FluidStack getTotalFluidCost(int index) { + if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) { + return null; + } + + FluidStack fluid = fluidsCost[index].copy(); + fluid.amount *= getTotalStages(); + return fluid; + } + + @Override + public int getTotalStages() { + return totalStages; + } + + @Override + public int getUpgradeBuildTime() { + return buildTime; + } + + @Override + public int getCurrentStage() { + return currentStage; + } + + @Override + public float getCurrentProgress() { + return currentStage / totalStages * 100.0f; + } + + @Override + public long getVoltage() { + return voltage; + } + + @Override + public UpgradeStatus getStatus() { + if (requirements == null) { + return UpgradeStatus.Unlocked; + } + + if (isFinished()) { + return UpgradeStatus.Finished; + } + return UpgradeStatus.Locked; + } + + @Override + public SP_Requirements getUpgradeRequirements() { + return requirements; + } + + @Override + public ISpaceProject getParentProject() { + return projectBelongingTo; + } + + // #endregion + + // #region Setter/Builder + + public SP_Upgrade() {} + + public SP_Upgrade setUpgradeName(String upgradeName) { + name = upgradeName; + return this; + } + + public SP_Upgrade setUpgradeUnlocalizedName(String upgradeUnlocalizedName) { + unlocalizedName = upgradeUnlocalizedName; + return this; + } + + public SP_Upgrade setUpgradeItemsCost(ItemStack... upgradeItemsCost) { + itemsCost = upgradeItemsCost; + return this; + } + + public SP_Upgrade setUpgradeFluidsCost(FluidStack... upgradeFluidsCost) { + fluidsCost = upgradeFluidsCost; + return this; + } + + public SP_Upgrade setUpgradeRequirements(SP_Requirements upgradeRequirements) { + requirements = upgradeRequirements; + return this; + } + + public SP_Upgrade setUpgradeTotalStages(int upgradeTotalStages) { + totalStages = upgradeTotalStages; + return this; + } + + public SP_Upgrade setUpgradeBuildTime(int upgradeBuildTime) { + buildTime = upgradeBuildTime; + return this; + } + + public SP_Upgrade setUpgradeVoltage(long upgradeVoltage) { + voltage = upgradeVoltage; + return this; + } + + @Override + public void setUpgradeProject(ISpaceProject project) { + projectBelongingTo = project; + } + + @Override + public void setUpgradeCurrentStage(int stage) { + currentStage = stage; + } + + // #endregion + + // #region Other + + @Override + public boolean meetsRequirements(UUID aTeam) { + if (requirements == null) { + return true; + } + + if (requirements.getBodyType() != null) { + if (!requirements.getBodyType().equals(projectBelongingTo.getProjectLocation().getType())) { + return false; + } + } + + if (requirements.getStarType() != null) { + if (!requirements.getStarType().equals(projectBelongingTo.getProjectLocation().getStarType())) { + return false; + } + } + + if (requirements.getProjects() != null) { + for (ISpaceProject tProject : requirements.getProjects()) { + if (!SpaceProjectManager.teamHasProject(aTeam, tProject)) { + return false; + } + } + } + + if (requirements.getUpgrades() != null) { + for (ISP_Upgrade upgrade : requirements.getUpgrades()) { + if (!projectBelongingTo.hasUpgrade(upgrade.getUpgradeName())) { + return false; + } + } + } + + return true; + } + + @Override + public SP_Upgrade copy() { + SP_Upgrade copy = new SP_Upgrade().setUpgradeName(name).setUpgradeUnlocalizedName(unlocalizedName) + .setUpgradeBuildTime(buildTime).setUpgradeFluidsCost(fluidsCost).setUpgradeItemsCost(itemsCost) + .setUpgradeRequirements(requirements).setUpgradeTotalStages(totalStages).setUpgradeVoltage(voltage); + return copy; + } + + @Override + public void goToNextStage() { + currentStage++; + } + + @Override + public boolean isFinished() { + return currentStage == totalStages; + } + + // #endregion + +} diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java new file mode 100644 index 0000000000..57625f083e --- /dev/null +++ b/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java @@ -0,0 +1,440 @@ +package gregtech.common.misc.spaceprojects.base; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraftforge.fluids.FluidStack; + +import com.gtnewhorizons.modularui.api.drawable.UITexture; + +import gregtech.common.misc.spaceprojects.SpaceProjectManager; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceBody; +import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject; + +/** + * @author BlueWeabo + */ +public class SpaceProject implements ISpaceProject { + + // #region Variables + + protected String name; + protected String unlocalizedName; + protected long voltage; + protected int buildTime; + protected int projectTier; + protected int currentStage; + protected int totalStage; + protected Map<String, ISP_Upgrade> upgradesAvailable = new HashMap<>(); + protected Map<String, ISP_Upgrade> upgradesInstalled = new HashMap<>(); + protected ISP_Requirements requirements; + protected ISP_Upgrade currentUpgrade; + protected ItemStack[] itemsCost; + protected FluidStack[] fluidsCost; + protected ISpaceBody location; + protected UITexture texture; + + // #endregion + + // #region Getters + + @Override + public String getProjectName() { + return name; + } + + @Override + public String getUnlocalizedName() { + return unlocalizedName; + } + + public String getLocalizedName() { + return StatCollector.translateToLocal(unlocalizedName); + } + + @Override + public long getProjectVoltage() { + return voltage; + } + + @Override + public int getProjectBuildTime() { + return buildTime; + } + + @Override + public float getProjectCurrentProgress() { + return currentStage / totalStage * 100.0f; + } + + @Override + public int getProjectTier() { + return projectTier; + } + + @Override + public int getCurrentStage() { + return currentStage; + } + + @Override + public int getTotalStages() { + return totalStage; + } + + @Override + public Collection<ISP_Upgrade> getAllUpgrades() { + return upgradesAvailable.values(); + } + + @Override + public Map<String, ISP_Upgrade> getUpgradesBuiltMap() { + return upgradesInstalled; + } + + @Override + public Collection<ISP_Upgrade> getAllBuiltUpgrades() { + return upgradesInstalled.values(); + } + + @Override + public ISP_Upgrade getUpgrade(String upgradeName) { + return upgradesAvailable.get(upgradeName); + } + + @Override + public ItemStack[] getItemsCostPerStage() { + return itemsCost; + } + + @Override + public ItemStack getItemCostPerStage(int index) { + if (itemsCost == null || index < 0 || index >= itemsCost.length) { + return null; + } + + return itemsCost[index]; + } + + @Override + public ItemStack[] getCurrentItemsProgress() { + ItemStack[] currentItemsProgress = new ItemStack[itemsCost.length]; + int index = 0; + for (ItemStack item : itemsCost) { + if (item == null) { + currentItemsProgress[index++] = null; + continue; + } + ItemStack copy = item.copy(); + copy.stackSize *= getCurrentStage(); + currentItemsProgress[index++] = copy; + } + + return currentItemsProgress; + } + + @Override + public ItemStack getCurrentItemProgress(int index) { + if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) { + return null; + } + + ItemStack item = itemsCost[index].copy(); + item.stackSize *= getCurrentStage(); + return item; + } + + @Override + public ItemStack[] getTotalItemsCost() { + ItemStack[] totalItemsCost = new ItemStack[itemsCost.length]; + int index = 0; + for (ItemStack item : itemsCost) { + if (item == null) { + totalItemsCost[index++] = null; + continue; + } + ItemStack copy = item.copy(); + copy.stackSize *= getTotalStages(); + totalItemsCost[index++] = copy; + } + + return totalItemsCost; + } + + @Override + public ItemStack getTotalItemCost(int index) { + if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) { + return null; + } + + ItemStack item = itemsCost[index].copy(); + item.stackSize *= getTotalStages(); + return item; + } + + @Override + public FluidStack[] getFluidsCostPerStage() { + return fluidsCost; + } + + @Override + public FluidStack getFluidCostPerStage(int index) { + if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) { + return null; + } + + return fluidsCost[index]; + } + + @Override + public FluidStack[] getCurrentFluidsProgress() { + if (fluidsCost == null) { + return null; + } + + FluidStack[] currentFluidsProgress = new FluidStack[fluidsCost.length]; + int index = 0; + for (FluidStack fluid : fluidsCost) { + if (fluid == null) { + currentFluidsProgress[index++] = null; + continue; + } + FluidStack copy = fluid.copy(); + copy.amount *= getCurrentStage(); + currentFluidsProgress[index++] = copy; + } + + return currentFluidsProgress; + } + + @Override + public FluidStack getCurrentFluidProgress(int index) { + if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) { + return null; + } + + FluidStack fluid = fluidsCost[index].copy(); + fluid.amount *= getCurrentStage(); + return fluid; + } + + @Override + public FluidStack[] getTotalFluidsCost() { + if (fluidsCost == null) { + return null; + } + + FluidStack[] totalFluidsCost = new FluidStack[fluidsCost.length]; + int index = 0; + for (FluidStack fluid : fluidsCost) { + if (fluid == null) { + totalFluidsCost[index++] = null; + continue; + } + FluidStack copy = fluid.copy(); + copy.amount *= getTotalStages(); + totalFluidsCost[index++] = copy; + } + + return totalFluidsCost; + } + + @Override + public FluidStack getTotalFluidCost(int index) { + if (fluidsCost == null || index < 0 || index >= fluidsCost.length) { + return null; + } + + FluidStack fluid = fluidsCost[index].copy(); + fluid.amount *= getTotalStages(); + return fluid; + } + + @Override + public ISP_Upgrade getUpgradeBeingBuilt() { + return currentUpgrade; + } + + @Override + public ISpaceBody getProjectLocation() { + return location; + } + + @Override + public UITexture getTexture() { + return texture; + } + + // #endregion + + // #region Setter/Builder + + public SpaceProject setProjectName(String spaceProjectName) { + name = spaceProjectName; + return this; + } + + public SpaceProject setProjectUnlocalizedName(String spaceProjectUnlocalizedName) { + unlocalizedName = spaceProjectUnlocalizedName; + return this; + } + + public SpaceProject setProjectVoltage(long spaceProjectVoltage) { + voltage = spaceProjectVoltage; + return this; + } + + public SpaceProject setProjectBuildTime(int spaceProjectBuildTime) { + buildTime = spaceProjectBuildTime; + return this; + } + + public SpaceProject setProjectStages(int spaceProjectTotalStages) { + totalStage = spaceProjectTotalStages; + return this; + } + + public SpaceProject setProjectItemsCost(ItemStack... spaceProjectItemsCost) { + itemsCost = spaceProjectItemsCost; + return this; + } + + public SpaceProject setProjectFluidsCost(FluidStack... spaceProjectFluidsCost) { + fluidsCost = spaceProjectFluidsCost; + return this; + } + + public SpaceProject setProjectUpgrades(ISP_Upgrade... spaceProjectUpgrades) { + for (ISP_Upgrade upgrade : spaceProjectUpgrades) { + upgradesAvailable.put(upgrade.getUpgradeName(), upgrade); + } + return this; + } + + public SpaceProject setProjectTexture(UITexture projectTexture) { + texture = projectTexture; + return this; + } + + public SpaceProject setProjectRequirements(ISP_Requirements projectRequirements) { + requirements = projectRequirements; + return this; + } + + @Override + public void setCurrentUpgradeBeingBuilt(ISP_Upgrade newCurrentUpgrade) { + if (newCurrentUpgrade == null) { + return; + } + + if (totalStage == currentStage) { + currentUpgrade = newCurrentUpgrade.copy(); + currentUpgrade.setUpgradeProject(this); + } + } + + @Override + public void setProjectCurrentStage(int newCurrentStage) { + currentStage = newCurrentStage; + } + + @Override + public void setProjectLocation(ISpaceBody newLocation) { + location = newLocation; + } + + @Override + public void setBuiltUpgrade(ISP_Upgrade... upgrades) { + if (upgrades == null) { + return; + } + + for (ISP_Upgrade upgrade : upgrades) { + upgradesInstalled.put(upgrade.getUpgradeName(), upgrade); + } + } + + // #endregion + + // #region Other + + @Override + public ISpaceProject copy() { + SpaceProject copy = new SpaceProject().setProjectName(name).setProjectUnlocalizedName(unlocalizedName) + .setProjectVoltage(voltage).setProjectBuildTime(buildTime).setProjectItemsCost(itemsCost) + .setProjectFluidsCost(fluidsCost).setProjectStages(totalStage).setProjectTexture(texture) + .setProjectRequirements(requirements); + if (upgradesAvailable != null) { + ISP_Upgrade[] upgrades = new SP_Upgrade[upgradesAvailable.size()]; + int index = 0; + for (ISP_Upgrade upgrade : upgradesAvailable.values()) { + upgrades[index++] = upgrade.copy(); + } + copy.setProjectUpgrades(upgrades); + } + return copy; + } + + @Override + public void goToNextStage() { + currentStage++; + } + + @Override + public boolean meetsRequirements(UUID team) { + return meetsRequirements(team, true); + } + + @Override + public boolean meetsRequirements(UUID team, boolean checkLocation) { + if (requirements == null) { + return true; + } + + if (requirements.getBodyType() != null && checkLocation) { + if (!requirements.getBodyType().equals(location.getType())) { + return false; + } + } + + if (requirements.getStarType() != null && checkLocation) { + if (!requirements.getStarType().equals(location.getStarType())) { + return false; + } + } + + if (requirements.getProjects() != null) { + for (ISpaceProject project : requirements.getProjects()) { + if (!SpaceProjectManager.teamHasProject(team, project)) { + return false; + } + } + } + + return true; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof SpaceProject)) { + return false; + } + return getProjectName().equals(((SpaceProject) obj).getProjectName()); + } + + @Override + public boolean isFinished() { + return currentStage == totalStage; + } + + @Override + public boolean hasUpgrade(String upgradeName) { + return upgradesInstalled.containsKey(upgradeName); + } + + // #endregion +} |
