mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-18 19:56:17 -04:00
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:
commit
3596208b14
@ -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 _ =>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user