Fix fusion reactor closes #1894

This commit is contained in:
modmuss50 2019-11-28 16:59:27 +00:00
parent eebdf9a4b5
commit 797e66f8ca
4 changed files with 169 additions and 124 deletions

View file

@ -1,85 +1,84 @@
/*
* This file is part of TechReborn, licensed under the MIT License (MIT).
*
* Copyright (c) 2018 TechReborn
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package techreborn.api.recipe.recipes;
import com.google.gson.JsonObject;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DefaultedList;
import net.minecraft.util.Identifier;
import net.minecraft.util.JsonHelper;
import reborncore.common.crafting.RebornRecipe;
import reborncore.common.crafting.RebornRecipeType;
import reborncore.common.crafting.ingredient.RebornIngredient;
import techreborn.blockentity.fusionReactor.FusionControlComputerBlockEntity;
/**
* @author drcrazy
*
*/
public class FusionReactorRecipe extends RebornRecipe {
private int startE;
private int minSize;
public FusionReactorRecipe(RebornRecipeType<?> type, Identifier name) {
super(type, name);
}
public FusionReactorRecipe(RebornRecipeType<?> type, Identifier name, DefaultedList<RebornIngredient> ingredients, DefaultedList<ItemStack> outputs, int power, int time, int startE, int minSize) {
super(type, name, ingredients, outputs, power, time);
this.startE = startE;
this.minSize = minSize;
}
public int getStartEnergy () {
return startE;
}
@Override
public void deserialize(JsonObject jsonObject) {
super.deserialize(jsonObject);
startE = JsonHelper.getInt(jsonObject, "start-power");
minSize = JsonHelper.getInt(jsonObject, "min-size");
}
@Override
public void serialize(JsonObject jsonObject) {
super.serialize(jsonObject);
jsonObject.addProperty("start-power", startE);
jsonObject.addProperty("min-size", minSize);
}
@Override
public boolean canCraft(final BlockEntity blockEntity) {
if (blockEntity instanceof FusionControlComputerBlockEntity) {
final FusionControlComputerBlockEntity reactor = (FusionControlComputerBlockEntity) blockEntity;
return reactor.getSize() >= minSize && reactor.getEnergy() >= startE;
}
return false;
}
}
/*
* This file is part of TechReborn, licensed under the MIT License (MIT).
*
* Copyright (c) 2018 TechReborn
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package techreborn.api.recipe.recipes;
import com.google.gson.JsonObject;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DefaultedList;
import net.minecraft.util.Identifier;
import net.minecraft.util.JsonHelper;
import reborncore.common.crafting.RebornRecipe;
import reborncore.common.crafting.RebornRecipeType;
import reborncore.common.crafting.ingredient.RebornIngredient;
import techreborn.blockentity.fusionReactor.FusionControlComputerBlockEntity;
/**
* @author drcrazy
*
*/
public class FusionReactorRecipe extends RebornRecipe {
private int startE;
private int minSize;
public FusionReactorRecipe(RebornRecipeType<?> type, Identifier name) {
super(type, name);
}
public FusionReactorRecipe(RebornRecipeType<?> type, Identifier name, DefaultedList<RebornIngredient> ingredients, DefaultedList<ItemStack> outputs, int power, int time, int startE, int minSize) {
super(type, name, ingredients, outputs, power, time);
this.startE = startE;
this.minSize = minSize;
}
public int getStartEnergy () {
return startE;
}
@Override
public void deserialize(JsonObject jsonObject) {
super.deserialize(jsonObject);
startE = JsonHelper.getInt(jsonObject, "start-power");
minSize = JsonHelper.getInt(jsonObject, "min-size");
}
@Override
public void serialize(JsonObject jsonObject) {
super.serialize(jsonObject);
jsonObject.addProperty("start-power", startE);
jsonObject.addProperty("min-size", minSize);
}
@Override
public boolean canCraft(final BlockEntity blockEntity) {
if (blockEntity instanceof FusionControlComputerBlockEntity) {
final FusionControlComputerBlockEntity reactor = (FusionControlComputerBlockEntity) blockEntity;
return reactor.getSize() >= minSize;
}
return false;
}
}

View file

@ -27,6 +27,7 @@ package techreborn.blockentity.fusionReactor;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import reborncore.api.IToolDrop;
@ -63,7 +64,9 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
int bottomStackSlot = 1;
int outputStackSlot = 2;
FusionReactorRecipe currentRecipe = null;
Identifier currentRecipeID = null;
boolean hasStartedCrafting = false;
boolean checkNBTRecipe = false;
long lastTick = -1;
public FusionControlComputerBlockEntity() {
@ -224,6 +227,16 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
return;
}
//Move this to here from the nbt read method, as it now requires the world as of 1.14
if(checkNBTRecipe) {
checkNBTRecipe = false;
for (final RebornRecipe reactorRecipe : ModRecipes.FUSION_REACTOR.getRecipes(getWorld())) {
if (validateRecipe((FusionReactorRecipe) reactorRecipe)) {
this.currentRecipe = (FusionReactorRecipe) reactorRecipe;
}
}
}
if(lastTick == world.getTime()){
//Prevent tick accerators, blame obstinate for this.
return;
@ -246,7 +259,7 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
}
if (currentRecipe != null) {
if (!hasStartedCrafting && inventory.hasChanged() && !validateRecipe(currentRecipe)) {
if (!validateRecipe(currentRecipe)) {
resetCrafter();
return;
}
@ -341,11 +354,7 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
this.neededPower = tagCompound.getInt("neededPower");
this.hasStartedCrafting = tagCompound.getBoolean("hasStartedCrafting");
if(tagCompound.contains("hasActiveRecipe") && tagCompound.getBoolean("hasActiveRecipe") && this.currentRecipe == null){
for (final RebornRecipe reactorRecipe : ModRecipes.FUSION_REACTOR.getRecipes(getWorld())) {
if (validateRecipe((FusionReactorRecipe) reactorRecipe)) {
this.currentRecipe = (FusionReactorRecipe) reactorRecipe;
}
}
checkNBTRecipe = true;
}
if(tagCompound.contains("size")){
this.size = tagCompound.getInt("size");
@ -394,12 +403,15 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
public BuiltContainer createContainer(int syncID, final PlayerEntity player) {
return new ContainerBuilder("fusionreactor").player(player.inventory).inventory().hotbar()
.addInventory().blockEntity(this).slot(0, 34, 47).slot(1, 126, 47).outputSlot(2, 80, 47).syncEnergyValue()
.syncIntegerValue(this::getCoilStatus, this::setCoilStatus)
.syncIntegerValue(this::getCrafingTickTime, this::setCrafingTickTime)
.syncIntegerValue(this::getFinalTickTime, this::setFinalTickTime)
.syncIntegerValue(this::getSize, this::setSize)
.syncIntegerValue(this::getState, this::setState)
.syncIntegerValue(this::getNeededPower, this::setNeededPower).addInventory().create(this, syncID);
.sync(this::getCoilStatus, this::setCoilStatus)
.sync(this::getCrafingTickTime, this::setCrafingTickTime)
.sync(this::getFinalTickTime, this::setFinalTickTime)
.sync(this::getSize, this::setSize)
.sync(this::getState, this::setState)
.sync(this::getNeededPower, this::setNeededPower)
.sync(this::getCurrentRecipeID, this::setCurrentRecipeID)
.addInventory()
.create(this, syncID);
}
public int getCoilStatus() {
@ -464,16 +476,50 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
this.state = state;
}
public Identifier getCurrentRecipeID() {
if(currentRecipe == null) {
return new Identifier("null", "null");
}
return currentRecipe.getId();
}
public void setCurrentRecipeID(Identifier currentRecipeID) {
if(currentRecipeID.getPath().equals("null")) {
currentRecipeID = null;
}
this.currentRecipeID = currentRecipeID;
}
public FusionReactorRecipe getCurrentRecipeFromID() {
if(currentRecipeID == null) return null;
return ModRecipes.FUSION_REACTOR.getRecipes(world).stream()
.filter(recipe -> recipe.getId().equals(currentRecipeID))
.findFirst()
.orElse(null);
}
public String getStateString(){
if(state == -1){
return "";
} else if (state == 0){
return "No recipe";
} else if (state == 1){
return "Charging";
FusionReactorRecipe r = getCurrentRecipeFromID();
if(r == null) {
return "Charging";
}
int percentage = percentage(r.getStartEnergy(), getEnergy());
return "Charging (" + percentage + "%)";
} else if (state == 2){
return "Crafting";
}
return "";
}
private int percentage(double MaxValue, double CurrentValue) {
if (CurrentValue == 0) {
return 0;
}
return (int) ((CurrentValue * 100.0f) / MaxValue);
}
}

View file

@ -1,25 +1,25 @@
{
"type": "techreborn:fusion_reactor",
"power": 16384,
"time": 2048,
"start-power": 1,
"min-size": 1,
"ingredients": [
{
"fluid": "techreborn:tritium",
"holder": "techreborn:cell"
},
{
"fluid": "techreborn:deuterium",
"holder": "techreborn:cell"
}
],
"results": [
{
"item": "techreborn:cell",
"nbt":{
"fluid": "techreborn:helium3"
}
}
]
}
{
"type": "techreborn:fusion_reactor",
"power": 16384,
"time": 2048,
"start-power": 40000000,
"min-size": 1,
"ingredients": [
{
"fluid": "techreborn:tritium",
"holder": "techreborn:cell"
},
{
"fluid": "techreborn:deuterium",
"holder": "techreborn:cell"
}
],
"results": [
{
"item": "techreborn:cell",
"nbt":{
"fluid": "techreborn:helium3"
}
}
]
}

View file

@ -2,7 +2,7 @@
"type": "techreborn:fusion_reactor",
"power": 16384,
"time": 2048,
"start-power": 1,
"start-power": 40000000,
"min-size": 1,
"ingredients": [
{