Merge branch 'master-MC1.10' into master-MC1.11

# Conflicts:
#	src/main/scala/li/cil/oc/common/EventHandler.scala
#	src/main/scala/li/cil/oc/server/component/UpgradeCrafting.scala
This commit is contained in:
payonel 2018-09-22 05:42:44 -07:00
commit 3596208b14
4 changed files with 128 additions and 20 deletions

View File

@ -112,10 +112,14 @@ object EventHandler {
@Optional.Method(modid = Mods.IDs.IndustrialCraft2)
def scheduleIC2Add(tileEntity: power.IndustrialCraft2Experimental) {
if (SideTracker.isServer) pendingServer.synchronized {
pendingServer += (() => if (!tileEntity.addedToIC2PowerGrid && !tileEntity.isInvalid) {
MinecraftForge.EVENT_BUS.post(new ic2.api.energy.event.EnergyTileLoadEvent(tileEntity.asInstanceOf[ic2.api.energy.tile.IEnergyTile]))
tileEntity.addedToIC2PowerGrid = true
})
tileEntity match {
case tile: ic2.api.energy.tile.IEnergyTile =>
pendingServer += (() => if (!tileEntity.addedToIC2PowerGrid && !tileEntity.isInvalid) {
MinecraftForge.EVENT_BUS.post(new ic2.api.energy.event.EnergyTileLoadEvent(tile))
tileEntity.addedToIC2PowerGrid = true
})
case _ =>
}
}
}

View File

@ -0,0 +1,87 @@
package li.cil.oc.integration.ic2;
import ic2.api.reactor.IReactor;
import ic2.api.reactor.IReactorChamber;
import li.cil.oc.api.driver.NamedBlock;
import li.cil.oc.api.machine.Arguments;
import li.cil.oc.api.machine.Callback;
import li.cil.oc.api.machine.Context;
import li.cil.oc.api.network.ManagedEnvironment;
import li.cil.oc.api.prefab.DriverSidedTileEntity;
import li.cil.oc.integration.ManagedTileEntityEnvironment;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
public final class DriverReactorChamber extends DriverSidedTileEntity {
@Override
public Class<?> getTileEntityClass() {
return IReactorChamber.class;
}
@Override
public ManagedEnvironment createEnvironment(final World world, final BlockPos pos, final EnumFacing side) {
return new Environment((IReactorChamber) world.getTileEntity(pos));
}
public static final class Environment extends ManagedTileEntityEnvironment<IReactorChamber> implements NamedBlock {
public Environment(final IReactorChamber tileEntity) {
super(tileEntity, "reactor_chamber");
}
@Override
public String preferredName() {
return "reactor_chamber";
}
@Override
public int priority() {
return 0;
}
@Callback(doc = "function():number -- Get the reactor's heat.")
public Object[] getHeat(final Context context, final Arguments args) {
final IReactor reactor = tileEntity.getReactorInstance();
if (reactor != null) {
return new Object[]{reactor.getHeat()};
} else {
return new Object[]{0};
}
}
@Callback(doc = "function():number -- Get the reactor's maximum heat before exploding.")
public Object[] getMaxHeat(final Context context, final Arguments args) {
final IReactor reactor = tileEntity.getReactorInstance();
if (reactor != null) {
return new Object[]{tileEntity.getReactorInstance().getMaxHeat()};
} else {
return new Object[]{0};
}
}
@Callback(doc = "function():number -- Get the reactor's energy output. Not multiplied with the base EU/t value.")
public Object[] getReactorEnergyOutput(final Context context, final Arguments args) {
final IReactor reactor = tileEntity.getReactorInstance();
if (reactor != null) {
return new Object[]{tileEntity.getReactorInstance().getReactorEnergyOutput()};
} else {
return new Object[]{0};
}
}
@Callback(doc = "function():number -- Get the reactor's base EU/t value.")
public Object[] getReactorEUOutput(final Context context, final Arguments args) {
return new Object[]{tileEntity.getReactorInstance().getReactorEUEnergyOutput()};
}
@Callback(doc = "function():boolean -- Get whether the reactor is active and supposed to produce energy.")
public Object[] producesEnergy(final Context context, final Arguments args) {
final IReactor reactor = tileEntity.getReactorInstance();
if (reactor != null) {
return new Object[]{tileEntity.getReactorInstance().produceEnergy()};
} else {
return new Object[]{false};
}
}
}
}

View File

@ -29,6 +29,7 @@ object ModIndustrialCraft2 extends ModProxy {
Driver.add(new DriverEnergyConductor)
Driver.add(new DriverEnergy)
Driver.add(new DriverReactor)
Driver.add(new DriverReactorChamber)
Driver.add(new ConverterElectricItem)
}

View File

@ -13,7 +13,6 @@ import li.cil.oc.api.machine.Arguments
import li.cil.oc.api.machine.Callback
import li.cil.oc.api.machine.Context
import li.cil.oc.api.network._
import li.cil.oc.api.prefab
import li.cil.oc.api.prefab.AbstractManagedEnvironment
import li.cil.oc.util.InventoryUtils
import net.minecraft.entity.player.EntityPlayer
@ -21,8 +20,7 @@ import net.minecraft.inventory
import net.minecraft.inventory.IInventory
import net.minecraft.item.ItemStack
import net.minecraft.item.crafting.CraftingManager
import net.minecraftforge.common.MinecraftForge
import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent
import net.minecraftforge.common.ForgeHooks
import net.minecraftforge.fml.common.FMLCommonHandler
import scala.collection.convert.WrapAsJava._
@ -55,7 +53,7 @@ class UpgradeCrafting(val host: EnvironmentHost with internal.Robot) extends Abs
var amountPossible = 0
def craft(wantedCount: Int): Seq[_] = {
var player = host.player
val player = host.player
load(player.inventory)
val cm = CraftingManager.getInstance
var countCrafted = 0
@ -66,32 +64,50 @@ class UpgradeCrafting(val host: EnvironmentHost with internal.Robot) extends Abs
breakable {
while (countCrafted < wantedCount) {
val result = cm.findMatchingRecipe(CraftingInventory, host.world)
if (result == null || result.getCount < 1) break()
if (result == null || result.isEmpty) break()
if (!originalCraft.isItemEqual(result)) {
break()
}
countCrafted += result.getCount
result.onCrafting(host.world, player, result.getCount)
FMLCommonHandler.instance.firePlayerCraftingEvent(player, result, this)
ForgeHooks.setCraftingPlayer(player)
val nonNullRefs = cm.getRemainingItems(this, host.world)
ForgeHooks.setCraftingPlayer(null)
val surplus = mutable.ArrayBuffer.empty[ItemStack]
for (slot <- 0 until getSizeInventory) {
val stack = getStackInSlot(slot)
if (!stack.isEmpty) {
for (slot <- 0 until nonNullRefs.size) {
var clean = getStackInSlot(slot)
// use 1 of this item
if (!clean.isEmpty) {
decrStackSize(slot, 1)
val item = stack.getItem
if (item.hasContainerItem(stack)) {
val container = item.getContainerItem(stack)
if (container.isItemStackDamageable && container.getItemDamage > container.getMaxDamage) {
MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(player, container, null))
clean = getStackInSlot(slot)
}
nonNullRefs.get(slot) match {
// the item remains
case used: ItemStack if !used.isEmpty => {
// but we thought we used it up
if (clean.isEmpty) {
// put it back
setInventorySlotContents(slot, used)
}
else if (!getStackInSlot(slot).isEmpty) {
surplus += container
else if (ItemStack.areItemsEqual(clean, used) && ItemStack.areItemStackTagsEqual(clean, used)) {
// the recipe doesn't actually consume this item
used.grow(clean.getCount)
setInventorySlotContents(slot, used)
}
else {
setInventorySlotContents(slot, container)
// the used item doesn't stack with the clean (could be a container, could be a damaged tool)
surplus += used
}
}
case _ =>
}
}
save(player.inventory)
InventoryUtils.addToPlayerInventory(result, player)
for (stack <- surplus) {