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

View file

@ -27,6 +27,7 @@ package techreborn.blockentity.fusionReactor;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import reborncore.api.IToolDrop; import reborncore.api.IToolDrop;
@ -63,7 +64,9 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
int bottomStackSlot = 1; int bottomStackSlot = 1;
int outputStackSlot = 2; int outputStackSlot = 2;
FusionReactorRecipe currentRecipe = null; FusionReactorRecipe currentRecipe = null;
Identifier currentRecipeID = null;
boolean hasStartedCrafting = false; boolean hasStartedCrafting = false;
boolean checkNBTRecipe = false;
long lastTick = -1; long lastTick = -1;
public FusionControlComputerBlockEntity() { public FusionControlComputerBlockEntity() {
@ -224,6 +227,16 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
return; 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()){ if(lastTick == world.getTime()){
//Prevent tick accerators, blame obstinate for this. //Prevent tick accerators, blame obstinate for this.
return; return;
@ -246,7 +259,7 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
} }
if (currentRecipe != null) { if (currentRecipe != null) {
if (!hasStartedCrafting && inventory.hasChanged() && !validateRecipe(currentRecipe)) { if (!validateRecipe(currentRecipe)) {
resetCrafter(); resetCrafter();
return; return;
} }
@ -341,11 +354,7 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
this.neededPower = tagCompound.getInt("neededPower"); this.neededPower = tagCompound.getInt("neededPower");
this.hasStartedCrafting = tagCompound.getBoolean("hasStartedCrafting"); this.hasStartedCrafting = tagCompound.getBoolean("hasStartedCrafting");
if(tagCompound.contains("hasActiveRecipe") && tagCompound.getBoolean("hasActiveRecipe") && this.currentRecipe == null){ if(tagCompound.contains("hasActiveRecipe") && tagCompound.getBoolean("hasActiveRecipe") && this.currentRecipe == null){
for (final RebornRecipe reactorRecipe : ModRecipes.FUSION_REACTOR.getRecipes(getWorld())) { checkNBTRecipe = true;
if (validateRecipe((FusionReactorRecipe) reactorRecipe)) {
this.currentRecipe = (FusionReactorRecipe) reactorRecipe;
}
}
} }
if(tagCompound.contains("size")){ if(tagCompound.contains("size")){
this.size = tagCompound.getInt("size"); this.size = tagCompound.getInt("size");
@ -394,12 +403,15 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
public BuiltContainer createContainer(int syncID, final PlayerEntity player) { public BuiltContainer createContainer(int syncID, final PlayerEntity player) {
return new ContainerBuilder("fusionreactor").player(player.inventory).inventory().hotbar() 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() .addInventory().blockEntity(this).slot(0, 34, 47).slot(1, 126, 47).outputSlot(2, 80, 47).syncEnergyValue()
.syncIntegerValue(this::getCoilStatus, this::setCoilStatus) .sync(this::getCoilStatus, this::setCoilStatus)
.syncIntegerValue(this::getCrafingTickTime, this::setCrafingTickTime) .sync(this::getCrafingTickTime, this::setCrafingTickTime)
.syncIntegerValue(this::getFinalTickTime, this::setFinalTickTime) .sync(this::getFinalTickTime, this::setFinalTickTime)
.syncIntegerValue(this::getSize, this::setSize) .sync(this::getSize, this::setSize)
.syncIntegerValue(this::getState, this::setState) .sync(this::getState, this::setState)
.syncIntegerValue(this::getNeededPower, this::setNeededPower).addInventory().create(this, syncID); .sync(this::getNeededPower, this::setNeededPower)
.sync(this::getCurrentRecipeID, this::setCurrentRecipeID)
.addInventory()
.create(this, syncID);
} }
public int getCoilStatus() { public int getCoilStatus() {
@ -464,16 +476,50 @@ public class FusionControlComputerBlockEntity extends PowerAcceptorBlockEntity
this.state = state; 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(){ public String getStateString(){
if(state == -1){ if(state == -1){
return ""; return "";
} else if (state == 0){ } else if (state == 0){
return "No recipe"; return "No recipe";
} else if (state == 1){ } 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){ } else if (state == 2){
return "Crafting"; return "Crafting";
} }
return ""; 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", "type": "techreborn:fusion_reactor",
"power": 16384, "power": 16384,
"time": 2048, "time": 2048,
"start-power": 1, "start-power": 40000000,
"min-size": 1, "min-size": 1,
"ingredients": [ "ingredients": [
{ {
"fluid": "techreborn:tritium", "fluid": "techreborn:tritium",
"holder": "techreborn:cell" "holder": "techreborn:cell"
}, },
{ {
"fluid": "techreborn:deuterium", "fluid": "techreborn:deuterium",
"holder": "techreborn:cell" "holder": "techreborn:cell"
} }
], ],
"results": [ "results": [
{ {
"item": "techreborn:cell", "item": "techreborn:cell",
"nbt":{ "nbt":{
"fluid": "techreborn:helium3" "fluid": "techreborn:helium3"
} }
} }
] ]
} }

View file

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