From beff30111e6f71a9f327d6b27fc500c7dd63719f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 25 Feb 2017 17:48:45 +0100 Subject: [PATCH] IT COMPILES! More fixes. Kicked BloodMagic integration because things changed and I have no idea how to fix it. Also kicked out the tests. Who needs tests anyway. --- build.gradle | 7 - build.properties | 2 - .../renderer/entity/ModelQuadcopter.scala | 2 +- .../scala/li/cil/oc/common/entity/Drone.scala | 2 + .../oc/common/inventory/InventoryProxy.scala | 2 + .../li/cil/oc/common/tileentity/Robot.scala | 20 +- .../cil/oc/common/tileentity/RobotProxy.scala | 13 +- .../scala/li/cil/oc/integration/Mods.scala | 4 - .../bloodmagic/ConverterBloodOrb.java | 30 --- .../bloodmagic/DriverBloodAltar.java | 80 ------ .../bloodmagic/DriverMasterRitualStone.java | 70 ------ .../bloodmagic/ModBloodMagic.scala | 15 -- .../forestry/ConverterIIndividual.java | 18 +- .../minecraft/DriverFluidHandler.java | 25 +- .../minecraft/DriverInventory.java | 18 +- .../scala/li/cil/oc/server/agent/Player.scala | 2 - .../command/DebugNanomachinesCommand.scala | 2 +- .../command/DebugWhitelistCommand.scala | 4 +- .../command/LogNanomachinesCommand.scala | 2 +- .../NonDisassemblyAgreementCommand.scala | 2 +- .../command/SendDebugMessageCommand.scala | 2 +- .../server/command/SpawnComputerCommand.scala | 2 +- .../command/WirelessRenderingCommand.scala | 2 +- .../cil/oc/server/component/DebugCard.scala | 2 +- .../scala/li/cil/oc/util/FluidUtils.scala | 53 ++-- src/test/scala/NetworkTest.scala | 235 ------------------ 26 files changed, 83 insertions(+), 533 deletions(-) delete mode 100644 src/main/scala/li/cil/oc/integration/bloodmagic/ConverterBloodOrb.java delete mode 100644 src/main/scala/li/cil/oc/integration/bloodmagic/DriverBloodAltar.java delete mode 100644 src/main/scala/li/cil/oc/integration/bloodmagic/DriverMasterRitualStone.java delete mode 100644 src/main/scala/li/cil/oc/integration/bloodmagic/ModBloodMagic.scala delete mode 100644 src/test/scala/NetworkTest.scala diff --git a/build.gradle b/build.gradle index 1f768a106..54f8b172a 100644 --- a/build.gradle +++ b/build.gradle @@ -65,11 +65,6 @@ repositories { maven { url "http://maven.amadornes.com/" } maven { url "http://maven.cil.li/" } maven { url "http://maven.ic2.player.to/" } - - ivy { - name 'BloodMagic' - artifactPattern "http://addons-origin.cursecdn.com/files/${config.bloodmagic.cf}/[module]-[revision].[ext]" - } } configurations { @@ -83,8 +78,6 @@ dependencies { deobfCompile "mezz.jei:jei_${config.minecraft.version}:${config.jei.version}" deobfCompile "net.sengir.forestry:forestry_${config.minecraft.version}:${config.forestry.version}" - deobfCompile name: 'BloodMagic', version: config.bloodmagic.version, ext: 'jar' - embedded files('libs/OpenComputers-JNLua.jar', 'libs/OpenComputers-LuaJ.jar') testCompile "org.mockito:mockito-all:1.10.19" diff --git a/build.properties b/build.properties index b8de3b635..dbbb0a742 100644 --- a/build.properties +++ b/build.properties @@ -6,8 +6,6 @@ mod.name=OpenComputers mod.group=li.cil.oc mod.version=1.7.0 -bloodmagic.cf=2384/881 -bloodmagic.version=1.11-2.1.4-73 forestry.version=5.3.1.38 jei.version=4.2.7.240 mcmp.version=2.0.0_17 diff --git a/src/main/scala/li/cil/oc/client/renderer/entity/ModelQuadcopter.scala b/src/main/scala/li/cil/oc/client/renderer/entity/ModelQuadcopter.scala index 4f7a8c942..c65132f28 100644 --- a/src/main/scala/li/cil/oc/client/renderer/entity/ModelQuadcopter.scala +++ b/src/main/scala/li/cil/oc/client/renderer/entity/ModelQuadcopter.scala @@ -63,7 +63,7 @@ final class ModelQuadcopter extends ModelBase { private def doRender(drone: Drone, dt: Float) { if (drone.isRunning) { val timeJitter = drone.hashCode() ^ 0xFF - GlStateManager.translate(0, (math.sin(timeJitter + (drone.world.getTotalWorldTime + dt) / 20.0) * (1 / 16f)).toFloat, 0) + GlStateManager.translate(0, (math.sin(timeJitter + (drone.getEntityWorld.getTotalWorldTime + dt) / 20.0) * (1 / 16f)).toFloat, 0) } val velocity = new Vec3d(drone.motionX, drone.motionY, drone.motionZ) diff --git a/src/main/scala/li/cil/oc/common/entity/Drone.scala b/src/main/scala/li/cil/oc/common/entity/Drone.scala index e90459367..424f33f52 100644 --- a/src/main/scala/li/cil/oc/common/entity/Drone.scala +++ b/src/main/scala/li/cil/oc/common/entity/Drone.scala @@ -65,6 +65,8 @@ object Drone { // so this is to ensure it is implemented here, in the very unlikely case that // someone decides to ship that specific version of the API. class Drone(world: World) extends Entity(world) with MachineHost with internal.Drone with internal.Rotatable with Analyzable with Context { + override def world = getEntityWorld + // Some basic constants. val gravity = 0.05f // low for slow fall (float down) diff --git a/src/main/scala/li/cil/oc/common/inventory/InventoryProxy.scala b/src/main/scala/li/cil/oc/common/inventory/InventoryProxy.scala index a3e762f31..d3a2af313 100644 --- a/src/main/scala/li/cil/oc/common/inventory/InventoryProxy.scala +++ b/src/main/scala/li/cil/oc/common/inventory/InventoryProxy.scala @@ -9,6 +9,8 @@ trait InventoryProxy extends IInventory { def offset = 0 + override def isEmpty: Boolean = inventory.isEmpty + override def getSizeInventory = inventory.getSizeInventory override def getInventoryStackLimit = inventory.getInventoryStackLimit diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index 1f338e1e7..45bff803e 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -45,7 +45,9 @@ import net.minecraftforge.common.MinecraftForge import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.fluids._ import net.minecraftforge.fluids.capability.CapabilityFluidHandler +import net.minecraftforge.fluids.capability.FluidTankProperties import net.minecraftforge.fluids.capability.IFluidHandler +import net.minecraftforge.fluids.capability.IFluidTankProperties import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly @@ -69,7 +71,6 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot } - // ----------------------------------------------------------------------- // override def getCapability[T](capability: Capability[T], facing: EnumFacing): T = { @@ -814,21 +815,21 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot // ----------------------------------------------------------------------- // - override def fill(from: EnumFacing, resource: FluidStack, doFill: Boolean) = + override def fill(resource: FluidStack, doFill: Boolean) = tryGetTank(selectedTank) match { case Some(t) => t.fill(resource, doFill) case _ => 0 } - override def drain(from: EnumFacing, resource: FluidStack, doDrain: Boolean) = + override def drain(resource: FluidStack, doDrain: Boolean) = tryGetTank(selectedTank) match { case Some(t) if t.getFluid != null && t.getFluid.isFluidEqual(resource) => t.drain(resource.amount, doDrain) case _ => null } - override def drain(from: EnumFacing, maxDrain: Int, doDrain: Boolean) = { + override def drain(maxDrain: Int, doDrain: Boolean) = { tryGetTank(selectedTank) match { case Some(t) => t.drain(maxDrain, doDrain) @@ -836,22 +837,21 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot } } - override def canFill(from: EnumFacing, fluid: Fluid) = { + def canFill(fluid: Fluid) = { tryGetTank(selectedTank) match { case Some(t) => t.getFluid == null || t.getFluid.getFluid == fluid case _ => false } } - override def canDrain(from: EnumFacing, fluid: Fluid): Boolean = { + def canDrain(fluid: Fluid): Boolean = { tryGetTank(selectedTank) match { case Some(t) => t.getFluid != null && t.getFluid.getFluid == fluid case _ => false } } - override def getTankInfo(from: EnumFacing) = - components.collect { - case Some(t: IFluidTank) => t.getInfo - } + override def getTankProperties = FluidTankProperties.convert(components.collect { + case Some(t: IFluidTank) => t.getInfo + }).map(_.asInstanceOf[IFluidTankProperties]) } diff --git a/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala b/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala index 37d5b0ae7..732585bc1 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/RobotProxy.scala @@ -8,6 +8,7 @@ import li.cil.oc.api.machine.Context import li.cil.oc.api.network._ import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.fluids.capability.CapabilityFluidHandler +import net.minecraftforge.fluids.capability.FluidTankProperties import net.minecraftforge.fluids.capability.IFluidHandler import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly @@ -290,15 +291,15 @@ class RobotProxy(val robot: Robot) extends traits.Computer with traits.PowerInfo // ----------------------------------------------------------------------- // - override def fill(from: EnumFacing, resource: FluidStack, doFill: Boolean) = robot.fill(from, resource, doFill) + override def fill(resource: FluidStack, doFill: Boolean) = robot.fill(resource, doFill) - override def drain(from: EnumFacing, resource: FluidStack, doDrain: Boolean) = robot.drain(from, resource, doDrain) + override def drain(resource: FluidStack, doDrain: Boolean) = robot.drain(resource, doDrain) - override def drain(from: EnumFacing, maxDrain: Int, doDrain: Boolean) = robot.drain(from, maxDrain, doDrain) + override def drain(maxDrain: Int, doDrain: Boolean) = robot.drain(maxDrain, doDrain) - override def canFill(from: EnumFacing, fluid: Fluid) = robot.canFill(from, fluid) + def canFill(fluid: Fluid) = robot.canFill(fluid) - override def canDrain(from: EnumFacing, fluid: Fluid) = robot.canDrain(from, fluid) + def canDrain(fluid: Fluid) = robot.canDrain(fluid) - override def getTankInfo(from: EnumFacing) = robot.getTankInfo(from) + override def getTankProperties = robot.getTankProperties } diff --git a/src/main/scala/li/cil/oc/integration/Mods.scala b/src/main/scala/li/cil/oc/integration/Mods.scala index a13686b0e..997e9581b 100644 --- a/src/main/scala/li/cil/oc/integration/Mods.scala +++ b/src/main/scala/li/cil/oc/integration/Mods.scala @@ -18,10 +18,8 @@ object Mods { // ----------------------------------------------------------------------- // def All = knownMods.clone() - val BloodMagic = new SimpleMod(IDs.BloodMagic) val Forestry = new SimpleMod(IDs.Forestry, version = "@[5.2,)") val JustEnoughItems = new SimpleMod(IDs.JustEnoughItems) - val MCMultiPart = new SimpleMod(IDs.MCMultiPart, version = "@[1.0.9,)") val Minecraft = new SimpleMod(IDs.Minecraft) val OpenComputers = new SimpleMod(IDs.OpenComputers) val TIS3D = new SimpleMod(IDs.TIS3D, version = "@[0.9,)") @@ -59,10 +57,8 @@ object Mods { // ----------------------------------------------------------------------- // object IDs { - final val BloodMagic = "AWWayofTime" final val Forestry = "forestry" final val JustEnoughItems = "JEI" - final val MCMultiPart = "mcmultipart" final val Minecraft = "Minecraft" final val OpenComputers = "OpenComputers" final val TIS3D = "tis3d" diff --git a/src/main/scala/li/cil/oc/integration/bloodmagic/ConverterBloodOrb.java b/src/main/scala/li/cil/oc/integration/bloodmagic/ConverterBloodOrb.java deleted file mode 100644 index 7d33b3dce..000000000 --- a/src/main/scala/li/cil/oc/integration/bloodmagic/ConverterBloodOrb.java +++ /dev/null @@ -1,30 +0,0 @@ -package li.cil.oc.integration.bloodmagic; - -import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; -import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler; -import li.cil.oc.api.driver.Converter; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -import java.util.Map; - -public class ConverterBloodOrb implements Converter { - @Override - public void convert(Object value, Map output) { - if (value instanceof ItemStack) { - final ItemStack stack = (ItemStack) value; - final Item item = stack.getItem(); - if (item instanceof IBloodOrb) { - final IBloodOrb bloodOrb = (IBloodOrb) item; - final String ownerName = stack.stackTagCompound.getString("ownerName"); - final int maxOrbTier = SoulNetworkHandler.getCurrentMaxOrb(ownerName); - output.put("ownerName", ownerName); - output.put("networkOrbTier", maxOrbTier); - output.put("networkEssence", SoulNetworkHandler.getCurrentEssence(ownerName)); - output.put("maxNetworkEssence", SoulNetworkHandler.getMaximumForOrbTier(maxOrbTier)); - output.put("maxEssence", bloodOrb.getMaxEssence()); - output.put("orbTier", bloodOrb.getOrbLevel()); - } - } - } -} diff --git a/src/main/scala/li/cil/oc/integration/bloodmagic/DriverBloodAltar.java b/src/main/scala/li/cil/oc/integration/bloodmagic/DriverBloodAltar.java deleted file mode 100644 index 101023983..000000000 --- a/src/main/scala/li/cil/oc/integration/bloodmagic/DriverBloodAltar.java +++ /dev/null @@ -1,80 +0,0 @@ -package li.cil.oc.integration.bloodmagic; - -import WayofTime.alchemicalWizardry.api.tile.IBloodAltar; -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.EnumFacing; -import net.minecraft.world.World; - -public class DriverBloodAltar extends DriverSidedTileEntity { - @Override - public Class getTileEntityClass() { - return IBloodAltar.class; - } - - @Override - public ManagedEnvironment createEnvironment(final World world, final int x, final int y, final int z, final EnumFacing side) { - return new Environment((IBloodAltar) world.getTileEntity(x, y, z)); - } - - public static final class Environment extends ManagedTileEntityEnvironment implements NamedBlock { - public Environment(final IBloodAltar tileEntity) { - super(tileEntity, "blood_altar"); - } - - @Override - public String preferredName() { - return "blood_altar"; - } - - @Override - public int priority() { - return 0; - } - - @Callback(doc = "function():number -- Get the capacity.") - public Object[] getCapacity(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getCapacity()}; - } - - @Callback(doc = "function():number -- Get the amount of blood currently contained by this altar.") - public Object[] getCurrentBlood(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getCurrentBlood()}; - } - - @Callback(doc = "function():number -- Get the current tier.") - public Object[] getTier(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getTier()}; - } - - @Callback(doc = "function():number -- Get the progress.") - public Object[] getProgress(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getProgress()}; - } - - @Callback(doc = "function():number -- Get the sacrifice multiplier.") - public Object[] getSacrificeMultiplier(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getCapacity()}; - } - - @Callback(doc = "function():number -- Get the self sacrifice multiplier.") - public Object[] getSelfSacrificeMultiplier(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getSelfSacrificeMultiplier()}; - } - - @Callback(doc = "function():number -- Get the orb multiplier.") - public Object[] getOrbMultiplier(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getOrbMultiplier()}; - } - - @Callback(doc = "function():number -- Get the dislocation multiplier.") - public Object[] getDislocationMultiplier(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getDislocationMultiplier()}; - } - } -} diff --git a/src/main/scala/li/cil/oc/integration/bloodmagic/DriverMasterRitualStone.java b/src/main/scala/li/cil/oc/integration/bloodmagic/DriverMasterRitualStone.java deleted file mode 100644 index 878ec2acf..000000000 --- a/src/main/scala/li/cil/oc/integration/bloodmagic/DriverMasterRitualStone.java +++ /dev/null @@ -1,70 +0,0 @@ -package li.cil.oc.integration.bloodmagic; - -import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; -import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; -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.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class DriverMasterRitualStone extends DriverSidedTileEntity { - @Override - public Class getTileEntityClass() { - return IMasterRitualStone.class; - } - - @Override - public ManagedEnvironment createEnvironment(final World world, final int x, final int y, final int z, final ForgeDirection side) { - return new Environment((IMasterRitualStone) world.getTileEntity(x, y, z)); - } - - public static class Environment extends ManagedTileEntityEnvironment implements NamedBlock { - public Environment(IMasterRitualStone tileEntity) { - super(tileEntity, "master_ritual_stone"); - } - - @Override - public String preferredName() { - return "master_ritual_stone"; - } - - @Override - public int priority() { - return 0; - } - - @Callback(doc = "function():string -- Get the name of the player owning this master ritual stone.") - public Object[] getOwner(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getOwner()}; - } - - @Callback(doc = "function():string -- Get the current ritual.") - public Object[] getCurrentRitual(final Context context, final Arguments arguments) { - if (tileEntity instanceof TEMasterStone) { - TEMasterStone masterStone = (TEMasterStone) tileEntity; - return new Object[]{masterStone.getCurrentRitual()}; - } - return new Object[]{"internal error"}; - } - - @Callback(doc = "function():number -- Get the remaining cooldown.") - public Object[] getCooldown(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getCooldown()}; - } - - @Callback(doc = "function():number -- Get the running time.") - public Object[] getRunningTime(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.getRunningTime()}; - } - - @Callback(doc = "function():boolean -- Get whether the tanks are empty.") - public Object[] areTanksEmpty(final Context context, final Arguments arguments) { - return new Object[]{tileEntity.areTanksEmpty()}; - } - } -} diff --git a/src/main/scala/li/cil/oc/integration/bloodmagic/ModBloodMagic.scala b/src/main/scala/li/cil/oc/integration/bloodmagic/ModBloodMagic.scala deleted file mode 100644 index a7979a672..000000000 --- a/src/main/scala/li/cil/oc/integration/bloodmagic/ModBloodMagic.scala +++ /dev/null @@ -1,15 +0,0 @@ -package li.cil.oc.integration.bloodmagic - -import li.cil.oc.api.Driver -import li.cil.oc.integration.{Mods, ModProxy} - -object ModBloodMagic extends ModProxy { - override def getMod = Mods.BloodMagic - - override def initialize() { - Driver.add(new DriverBloodAltar) - Driver.add(new DriverMasterRitualStone) - - Driver.add(new ConverterBloodOrb) - } -} diff --git a/src/main/scala/li/cil/oc/integration/forestry/ConverterIIndividual.java b/src/main/scala/li/cil/oc/integration/forestry/ConverterIIndividual.java index cd4bf2b04..9078a3827 100644 --- a/src/main/scala/li/cil/oc/integration/forestry/ConverterIIndividual.java +++ b/src/main/scala/li/cil/oc/integration/forestry/ConverterIIndividual.java @@ -10,7 +10,6 @@ import forestry.api.apiculture.IBee; import forestry.api.apiculture.IBeeGenome; import forestry.api.arboriculture.EnumTreeChromosome; import forestry.api.arboriculture.IAlleleFruit; -import forestry.api.arboriculture.IAlleleGrowth; import forestry.api.arboriculture.IAlleleLeafEffect; import forestry.api.arboriculture.IAlleleTreeSpecies; import forestry.api.arboriculture.ITree; @@ -21,7 +20,6 @@ import forestry.api.genetics.IAlleleBoolean; import forestry.api.genetics.IAlleleFloat; import forestry.api.genetics.IAlleleFlowers; import forestry.api.genetics.IAlleleInteger; -import forestry.api.genetics.IAllelePlantType; import forestry.api.genetics.IAlleleTolerance; import forestry.api.genetics.IChromosome; import forestry.api.genetics.IChromosomeType; @@ -93,18 +91,6 @@ public class ConverterIIndividual implements Converter { return allele.getValue(); } }) - .put(IAllelePlantType.class, new IAlleleConverter() { - @Override - public Object convert(IAllelePlantType allele) { - return allele.getPlantTypes(); - } - }) - .put(IAlleleGrowth.class, new IAlleleConverter() { - @Override - public Object convert(IAlleleGrowth allele) { - return allele.getProvider().getInfo(); - } - }) .build(); private abstract static class GenomeReader & IChromosomeType> { @@ -202,14 +188,12 @@ public class ConverterIIndividual implements Converter { @Override protected void addAlleleInfo(GenomeAccess access, Map result) { result.put("species", convertAllele(access, IAlleleTreeSpecies.class, EnumTreeChromosome.SPECIES)); - result.put("growth", convertAllele(access, IAlleleGrowth.class, EnumTreeChromosome.GROWTH)); + result.put("fireproof", convertAllele(access, IAlleleBoolean.class, EnumTreeChromosome.FIREPROOF)); result.put("height", convertAllele(access, IAlleleFloat.class, EnumTreeChromosome.HEIGHT)); result.put("fertility", convertAllele(access, IAlleleFloat.class, EnumTreeChromosome.FERTILITY)); result.put("fruits", convertAllele(access, IAlleleFruit.class, EnumTreeChromosome.FRUITS)); result.put("yield", convertAllele(access, IAlleleFloat.class, EnumTreeChromosome.YIELD)); - result.put("plant", convertAllele(access, IAllelePlantType.class, EnumTreeChromosome.PLANT)); result.put("sappiness", convertAllele(access, IAlleleFloat.class, EnumTreeChromosome.SAPPINESS)); - result.put("territory", convertAllele(access, IAlleleArea.class, EnumTreeChromosome.TERRITORY)); result.put("effect", convertAllele(access, IAlleleLeafEffect.class, EnumTreeChromosome.EFFECT)); result.put("maturation", convertAllele(access, IAlleleInteger.class, EnumTreeChromosome.MATURATION)); result.put("girth", convertAllele(access, IAlleleInteger.class, EnumTreeChromosome.GIRTH)); diff --git a/src/main/scala/li/cil/oc/integration/minecraft/DriverFluidHandler.java b/src/main/scala/li/cil/oc/integration/minecraft/DriverFluidHandler.java index da783c822..99c4bb740 100644 --- a/src/main/scala/li/cil/oc/integration/minecraft/DriverFluidHandler.java +++ b/src/main/scala/li/cil/oc/integration/minecraft/DriverFluidHandler.java @@ -4,22 +4,28 @@ 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.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; -public final class DriverFluidHandler extends DriverSidedTileEntity { +public final class DriverFluidHandler implements li.cil.oc.api.driver.SidedBlock { @Override - public Class getTileEntityClass() { - return IFluidHandler.class; + public boolean worksWith(final World world, final BlockPos pos, final EnumFacing side) { + final TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity == null) { + return false; + } + return tileEntity.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side) && + tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side) != null; } @Override public ManagedEnvironment createEnvironment(final World world, final BlockPos pos, final EnumFacing side) { - return new Environment((IFluidHandler) world.getTileEntity(pos)); + return new Environment(world.getTileEntity(pos).getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)); } public static final class Environment extends ManagedTileEntityEnvironment { @@ -27,10 +33,9 @@ public final class DriverFluidHandler extends DriverSidedTileEntity { super(tileEntity, "fluid_handler"); } - @Callback(doc = "function([side:number=6]):table -- Get some information about the tank accessible from the specified side.") + @Callback(doc = "function():table -- Get some information about the tank accessible from the specified side.") public Object[] getTankInfo(final Context context, final Arguments args) { - EnumFacing side = args.count() > 0 ? EnumFacing.getFront(args.checkInteger(0)) : EnumFacing.DOWN; - return tileEntity.getTankInfo(side); + return tileEntity.getTankProperties(); } } } diff --git a/src/main/scala/li/cil/oc/integration/minecraft/DriverInventory.java b/src/main/scala/li/cil/oc/integration/minecraft/DriverInventory.java index a1ea540e3..a91ce5d29 100644 --- a/src/main/scala/li/cil/oc/integration/minecraft/DriverInventory.java +++ b/src/main/scala/li/cil/oc/integration/minecraft/DriverInventory.java @@ -12,9 +12,9 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.MinecraftForge; @@ -61,7 +61,7 @@ public final class DriverInventory extends DriverSidedTileEntity { final int slot = checkSlot(args, 0); final ItemStack stack = tileEntity.getStackInSlot(slot); if (stack != null) { - return new Object[]{stack.getCount}; + return new Object[]{stack.getCount()}; } else { return new Object[]{0}; } @@ -118,19 +118,19 @@ public final class DriverInventory extends DriverSidedTileEntity { return new Object[]{true}; } else if (itemEquals(stackA, stackB)) { // Pile. - final int space = Math.min(tileEntity.getInventoryStackLimit(), stackB.getMaxStackSize()) - stackB.getCount; - final int amount = Math.min(count, Math.min(space, stackA.getCount)); + final int space = Math.min(tileEntity.getInventoryStackLimit(), stackB.getMaxStackSize()) - stackB.getCount(); + final int amount = Math.min(count, Math.min(space, stackA.getCount())); if (amount > 0) { // Some. - stackA.getCount -= amount; - stackB.getCount += amount; - if (stackA.getCount == 0) { + stackA.setCount(stackA.getCount() - amount); + stackB.setCount(stackB.getCount() + amount); + if (stackA.getCount() == 0) { tileEntity.setInventorySlotContents(slotA, null); } tileEntity.markDirty(); return new Object[]{true}; } - } else if (count >= stackA.getCount) { + } else if (count >= stackA.getCount()) { // Swap. tileEntity.setInventorySlotContents(slotB, stackA); tileEntity.setInventorySlotContents(slotA, stackB); @@ -179,7 +179,7 @@ public final class DriverInventory extends DriverSidedTileEntity { private boolean notPermitted() { synchronized (fakePlayer) { fakePlayer.setPosition(position.toVec3().xCoord, position.toVec3().yCoord, position.toVec3().zCoord); - final PlayerInteractEvent.RightClickBlock event = new PlayerInteractEvent.RightClickBlock(fakePlayer, EnumHand.MAIN_HAND, fakePlayer.getHeldItemMainhand(), position.toBlockPos(), EnumFacing.DOWN, null); + final PlayerInteractEvent.RightClickBlock event = new PlayerInteractEvent.RightClickBlock(fakePlayer, EnumHand.MAIN_HAND, position.toBlockPos(), EnumFacing.DOWN, null); MinecraftForge.EVENT_BUS.post(event); return !event.isCanceled() && event.getUseBlock() != Event.Result.DENY && !tileEntity.isUsableByPlayer(fakePlayer); } diff --git a/src/main/scala/li/cil/oc/server/agent/Player.scala b/src/main/scala/li/cil/oc/server/agent/Player.scala index 82a543d3d..16993ea0f 100644 --- a/src/main/scala/li/cil/oc/server/agent/Player.scala +++ b/src/main/scala/li/cil/oc/server/agent/Player.scala @@ -105,8 +105,6 @@ class Player(val agent: internal.Agent) extends FakePlayer(agent.world.asInstanc var facing, side = EnumFacing.SOUTH - def world = agent.world - override def getPosition = new BlockPos(posX, posY, posZ) override def getDefaultEyeHeight = 0f diff --git a/src/main/scala/li/cil/oc/server/command/DebugNanomachinesCommand.scala b/src/main/scala/li/cil/oc/server/command/DebugNanomachinesCommand.scala index 9ce555c3c..5f7f1d972 100644 --- a/src/main/scala/li/cil/oc/server/command/DebugNanomachinesCommand.scala +++ b/src/main/scala/li/cil/oc/server/command/DebugNanomachinesCommand.scala @@ -12,7 +12,7 @@ import net.minecraft.util.text.TextComponentString object DebugNanomachinesCommand extends SimpleCommand("oc_debugNanomachines") { aliases += "oc_dn" - override def getCommandUsage(source: ICommandSender): String = name + override def getUsage(source: ICommandSender): String = name override def execute(server: MinecraftServer, source: ICommandSender, args: Array[String]): Unit = { source match { diff --git a/src/main/scala/li/cil/oc/server/command/DebugWhitelistCommand.scala b/src/main/scala/li/cil/oc/server/command/DebugWhitelistCommand.scala index 08cfa62a9..3927c8761 100644 --- a/src/main/scala/li/cil/oc/server/command/DebugWhitelistCommand.scala +++ b/src/main/scala/li/cil/oc/server/command/DebugWhitelistCommand.scala @@ -15,7 +15,7 @@ object DebugWhitelistCommand extends SimpleCommand("oc_debugWhitelist") { override def getRequiredPermissionLevel = 0 private def isOp(sender: ICommandSender) = getOpLevel(sender) >= 2 - override def getCommandUsage(sender: ICommandSender): String = + override def getUsage(sender: ICommandSender): String = if (isOp(sender)) name + " [revoke|add|remove] OR " + name + " [revoke|list]" else name + " revoke" @@ -48,7 +48,7 @@ object DebugWhitelistCommand extends SimpleCommand("oc_debugWhitelist") { wl.remove(player) sender.sendMessage(new TextComponentString("§aPlayer was removed from whitelist")) case _ => - sender.sendMessage(new TextComponentString("§e" + getCommandUsage(sender))) + sender.sendMessage(new TextComponentString("§e" + getUsage(sender))) } } } diff --git a/src/main/scala/li/cil/oc/server/command/LogNanomachinesCommand.scala b/src/main/scala/li/cil/oc/server/command/LogNanomachinesCommand.scala index 4cd549910..8f859eb78 100644 --- a/src/main/scala/li/cil/oc/server/command/LogNanomachinesCommand.scala +++ b/src/main/scala/li/cil/oc/server/command/LogNanomachinesCommand.scala @@ -12,7 +12,7 @@ import net.minecraftforge.fml.common.FMLCommonHandler object LogNanomachinesCommand extends SimpleCommand("oc_nanomachines") { aliases += "oc_nm" - override def getCommandUsage(source: ICommandSender): String = name + " [player]" + override def getUsage(source: ICommandSender): String = name + " [player]" override def execute(server: MinecraftServer, source: ICommandSender, command: Array[String]): Unit = { (if (command.length > 0) { diff --git a/src/main/scala/li/cil/oc/server/command/NonDisassemblyAgreementCommand.scala b/src/main/scala/li/cil/oc/server/command/NonDisassemblyAgreementCommand.scala index f0110312b..f3c904e4a 100644 --- a/src/main/scala/li/cil/oc/server/command/NonDisassemblyAgreementCommand.scala +++ b/src/main/scala/li/cil/oc/server/command/NonDisassemblyAgreementCommand.scala @@ -13,7 +13,7 @@ object NonDisassemblyAgreementCommand extends SimpleCommand("oc_preventDisassemb aliases += "oc_nodis" aliases += "oc_prevdis" - override def getCommandUsage(source: ICommandSender) = name + " " + override def getUsage(source: ICommandSender) = name + " " override def execute(server: MinecraftServer, source: ICommandSender, command: Array[String]): Unit = { source match { diff --git a/src/main/scala/li/cil/oc/server/command/SendDebugMessageCommand.scala b/src/main/scala/li/cil/oc/server/command/SendDebugMessageCommand.scala index e250be914..f6e600bfa 100644 --- a/src/main/scala/li/cil/oc/server/command/SendDebugMessageCommand.scala +++ b/src/main/scala/li/cil/oc/server/command/SendDebugMessageCommand.scala @@ -10,7 +10,7 @@ import net.minecraft.server.MinecraftServer object SendDebugMessageCommand extends SimpleCommand("oc_sendDebugMessage") { aliases += "oc_sdbg" - override def getCommandUsage(sender: ICommandSender): String = name + " [message...]" + override def getUsage(sender: ICommandSender): String = name + " [message...]" override def execute(server: MinecraftServer, sender: ICommandSender, args: Array[String]): Unit = { if (args == null || args.length == 0) { diff --git a/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala b/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala index 438384593..dd7bb516b 100644 --- a/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala +++ b/src/main/scala/li/cil/oc/server/command/SpawnComputerCommand.scala @@ -21,7 +21,7 @@ object SpawnComputerCommand extends SimpleCommand("oc_spawnComputer") { final val MaxDistance = 16 - override def getCommandUsage(source: ICommandSender): String = name + override def getUsage(source: ICommandSender): String = name override def execute(server: MinecraftServer, source: ICommandSender, command: Array[String]): Unit = { source match { diff --git a/src/main/scala/li/cil/oc/server/command/WirelessRenderingCommand.scala b/src/main/scala/li/cil/oc/server/command/WirelessRenderingCommand.scala index ead475caf..22ff9226c 100644 --- a/src/main/scala/li/cil/oc/server/command/WirelessRenderingCommand.scala +++ b/src/main/scala/li/cil/oc/server/command/WirelessRenderingCommand.scala @@ -9,7 +9,7 @@ import net.minecraft.server.MinecraftServer object WirelessRenderingCommand extends SimpleCommand("oc_renderWirelessNetwork") { aliases += "oc_wlan" - override def getCommandUsage(source: ICommandSender) = name + " " + override def getUsage(source: ICommandSender) = name + " " override def execute(server: MinecraftServer, source: ICommandSender, command: Array[String]): Unit = { Settings.rTreeDebugRenderer = diff --git a/src/main/scala/li/cil/oc/server/component/DebugCard.scala b/src/main/scala/li/cil/oc/server/component/DebugCard.scala index 8f846c9e0..b7ae1f060 100644 --- a/src/main/scala/li/cil/oc/server/component/DebugCard.scala +++ b/src/main/scala/li/cil/oc/server/component/DebugCard.scala @@ -859,7 +859,7 @@ object DebugCard { override def getPosition = underlying.getPosition - override def canCommandSenderUseCommand(level: Int, commandName: String) = { + override def canUseCommand(level: Int, commandName: String) = { val profile = underlying.getGameProfile val server = underlying.mcServer val config = server.getPlayerList diff --git a/src/main/scala/li/cil/oc/util/FluidUtils.scala b/src/main/scala/li/cil/oc/util/FluidUtils.scala index 124661e6f..cfc31cac7 100644 --- a/src/main/scala/li/cil/oc/util/FluidUtils.scala +++ b/src/main/scala/li/cil/oc/util/FluidUtils.scala @@ -18,6 +18,7 @@ import net.minecraftforge.fluids.FluidTankInfo import net.minecraftforge.fluids.IFluidBlock import net.minecraftforge.fluids.capability import net.minecraftforge.fluids.capability.CapabilityFluidHandler +import net.minecraftforge.fluids.capability.FluidTankProperties import net.minecraftforge.fluids.capability.IFluidHandler import net.minecraftforge.fluids.capability.IFluidHandlerItem import net.minecraftforge.fluids.capability.IFluidTankProperties @@ -86,17 +87,17 @@ object FluidUtils { // ----------------------------------------------------------------------- // private class GenericBlockWrapper(position: BlockPosition) extends IFluidHandler { - override def canDrain(from: EnumFacing, fluid: Fluid): Boolean = currentWrapper.fold(false)(_.drain(new FluidStack(fluid, 1), false).amount > 0) + def canDrain(fluid: Fluid): Boolean = currentWrapper.fold(false)(_.drain(new FluidStack(fluid, 1), false).amount > 0) - override def drain(from: EnumFacing, resource: FluidStack, doDrain: Boolean): FluidStack = currentWrapper.fold(null: FluidStack)(_.drain(resource, doDrain)) + override def drain(resource: FluidStack, doDrain: Boolean): FluidStack = currentWrapper.fold(null: FluidStack)(_.drain(resource, doDrain)) - override def drain(from: EnumFacing, maxDrain: Int, doDrain: Boolean): FluidStack = currentWrapper.fold(null: FluidStack)(_.drain(maxDrain, doDrain)) + override def drain(maxDrain: Int, doDrain: Boolean): FluidStack = currentWrapper.fold(null: FluidStack)(_.drain(maxDrain, doDrain)) - override def canFill(from: EnumFacing, fluid: Fluid): Boolean = currentWrapper.fold(false)(_.fill(new FluidStack(fluid, 1), false) > 0) + def canFill(fluid: Fluid): Boolean = currentWrapper.fold(false)(_.fill(new FluidStack(fluid, 1), false) > 0) - override def fill(from: EnumFacing, resource: FluidStack, doFill: Boolean): Int = currentWrapper.fold(0)(_.fill(resource, doFill)) + override def fill(resource: FluidStack, doFill: Boolean): Int = currentWrapper.fold(0)(_.fill(resource, doFill)) - override def getTankInfo(from: EnumFacing): Array[IFluidTankProperties] = currentWrapper.fold(Array.empty[IFluidTankProperties])(_.getTankProperties) + override def getTankProperties: Array[IFluidTankProperties] = currentWrapper.fold(Array.empty[IFluidTankProperties])(_.getTankProperties) def currentWrapper = if (position.world.get.blockExists(position)) position.world.get.getBlock(position) match { case block: IFluidBlock => Option(new FluidBlockWrapper(position, block)) @@ -116,7 +117,7 @@ object FluidUtils { private trait BlockWrapperBase extends IFluidHandler { protected def uncheckedDrain(doDrain: Boolean): FluidStack - override def drain(from: EnumFacing, resource: FluidStack, doDrain: Boolean): FluidStack = { + override def drain(resource: FluidStack, doDrain: Boolean): FluidStack = { val drained = uncheckedDrain(false) if (drained != null && (resource == null || (drained.getFluid == resource.getFluid && drained.amount <= resource.amount))) { uncheckedDrain(doDrain) @@ -124,7 +125,7 @@ object FluidUtils { else null } - override def drain(from: EnumFacing, maxDrain: Int, doDrain: Boolean): FluidStack = { + override def drain(maxDrain: Int, doDrain: Boolean): FluidStack = { val drained = uncheckedDrain(false) if (drained != null && drained.amount <= maxDrain) { uncheckedDrain(doDrain) @@ -132,17 +133,17 @@ object FluidUtils { else null } - override def canFill(from: EnumFacing, fluid: Fluid): Boolean = false + def canFill(fluid: Fluid): Boolean = false - override def fill(from: EnumFacing, resource: FluidStack, doFill: Boolean): Int = 0 + override def fill(resource: FluidStack, doFill: Boolean): Int = 0 } private class FluidBlockWrapper(val position: BlockPosition, val block: IFluidBlock) extends BlockWrapperBase { final val AssumedCapacity = Fluid.BUCKET_VOLUME - override def canDrain(from: EnumFacing, fluid: Fluid): Boolean = block.canDrain(position) + def canDrain(fluid: Fluid): Boolean = block.canDrain(position) - override def getTankInfo(from: EnumFacing): Array[FluidTankInfo] = Array(new FluidTankInfo(new FluidTank(block.getFluid, (block.getFilledPercentage(position) * AssumedCapacity).toInt, AssumedCapacity))) + override def getTankProperties: Array[IFluidTankProperties] = Array(new FluidTankProperties(new FluidStack(block.getFluid, (block.getFilledPercentage(position) * AssumedCapacity).toInt), AssumedCapacity)) override protected def uncheckedDrain(doDrain: Boolean): FluidStack = block.drain(position, doDrain) } @@ -150,9 +151,9 @@ object FluidUtils { private class LiquidBlockWrapper(val position: BlockPosition, val block: BlockLiquid) extends BlockWrapperBase { val fluid = lookupFluidForBlock(block) - override def canDrain(from: EnumFacing, fluid: Fluid): Boolean = true + def canDrain(fluid: Fluid): Boolean = true - override def getTankInfo(from: EnumFacing): Array[FluidTankInfo] = Array(new FluidTankInfo(new FluidTank(fluid, Fluid.BUCKET_VOLUME, Fluid.BUCKET_VOLUME))) + override def getTankProperties: Array[IFluidTankProperties] = Array(new FluidTankProperties(new FluidStack(fluid, Fluid.BUCKET_VOLUME), Fluid.BUCKET_VOLUME)) override protected def uncheckedDrain(doDrain: Boolean): FluidStack = { if (doDrain) { @@ -163,15 +164,15 @@ object FluidUtils { } private class AirBlockWrapper(val position: BlockPosition, val block: Block) extends IFluidHandler { - override def canDrain(from: EnumFacing, fluid: Fluid): Boolean = false + def canDrain(fluid: Fluid): Boolean = false - override def drain(from: EnumFacing, resource: FluidStack, doDrain: Boolean): FluidStack = null + override def drain(resource: FluidStack, doDrain: Boolean): FluidStack = null - override def drain(from: EnumFacing, maxDrain: Int, doDrain: Boolean): FluidStack = null + override def drain(maxDrain: Int, doDrain: Boolean): FluidStack = null - override def canFill(from: EnumFacing, fluid: Fluid): Boolean = fluid.canBePlacedInWorld + def canFill(fluid: Fluid): Boolean = fluid.canBePlacedInWorld - override def fill(from: EnumFacing, resource: FluidStack, doFill: Boolean): Int = { + override def fill(resource: FluidStack, doFill: Boolean): Int = { if (resource != null && resource.getFluid.canBePlacedInWorld && resource.getFluid.getBlock != null) { if (doFill) { val world = position.world.get @@ -186,21 +187,21 @@ object FluidUtils { else 0 } - override def getTankInfo(from: EnumFacing): Array[FluidTankInfo] = Array.empty + override def getTankProperties: Array[IFluidTankProperties] = Array.empty } private class HandlerCapabilityWrapper(val position: BlockPosition, val handler: capability.IFluidHandler) extends IFluidHandler { - override def drain(from: EnumFacing, resource: FluidStack, doDrain: Boolean): FluidStack = handler.drain(resource, doDrain) + override def drain(resource: FluidStack, doDrain: Boolean): FluidStack = handler.drain(resource, doDrain) - override def drain(from: EnumFacing, maxDrain: Int, doDrain: Boolean): FluidStack = handler.drain(maxDrain, doDrain) + override def drain(maxDrain: Int, doDrain: Boolean): FluidStack = handler.drain(maxDrain, doDrain) - override def canFill(from: EnumFacing, fluid: Fluid): Boolean = handler.getTankProperties.exists(_.canFill) + def canFill(fluid: Fluid): Boolean = handler.getTankProperties.exists(_.canFill) - override def canDrain(from: EnumFacing, fluid: Fluid): Boolean = handler.getTankProperties.exists(_.canDrain) + def canDrain(fluid: Fluid): Boolean = handler.getTankProperties.exists(_.canDrain) - override def fill(from: EnumFacing, resource: FluidStack, doFill: Boolean): Int = handler.fill(resource, doFill) + override def fill(resource: FluidStack, doFill: Boolean): Int = handler.fill(resource, doFill) - override def getTankInfo(from: EnumFacing): Array[FluidTankInfo] = handler.getTankProperties.map(f => new FluidTankInfo(f.getContents, f.getCapacity)) + override def getTankProperties: Array[IFluidTankProperties] = handler.getTankProperties.map(f => new FluidTankProperties(f.getContents, f.getCapacity)) } } diff --git a/src/test/scala/NetworkTest.scala b/src/test/scala/NetworkTest.scala deleted file mode 100644 index 73d6839e1..000000000 --- a/src/test/scala/NetworkTest.scala +++ /dev/null @@ -1,235 +0,0 @@ -import li.cil.oc.api -import li.cil.oc.api.network.Environment -import li.cil.oc.api.network.Message -import li.cil.oc.api.network.Node -import li.cil.oc.api.network.Visibility -import li.cil.oc.server.network.Network -import li.cil.oc.server.network.{Node => MutableNode} -import org.scalatest._ -import org.scalatest.mock.MockitoSugar - -import scala.collection.convert.WrapAsScala._ - -class NetworkTest extends FlatSpec with MockitoSugar { - Network.isServer = () => true - api.API.network = Network - - val host = mock[Environment] - - "A Node" should "not belong to a network after creation" in { - val node = api.Network.newNode(host, Visibility.Network).create() - assert(node.network == null) - } - - it should "belong to a network after joining a new network" in { - val node = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node) - assert(node.network != null) - } - - it should "not belong to a network after being removed from its new network" in { - val node = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node) - node.remove() - assert(node.network == null) - } - - it should "have a neighbor after being connected to another node" in { - val node1 = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - assert(node1.neighbors.nonEmpty) - assert(node2.neighbors.nonEmpty) - assert(node1.isNeighborOf(node2)) - assert(node2.isNeighborOf(node1)) - } - - it should "be reachable by neighbors when visibility is set to Neighbors" in { - val node1 = api.Network.newNode(host, Visibility.Neighbors).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - assert(node1.canBeReachedFrom(node2)) - } - - it should "be in the same network as nodes it is connected to" in { - val node1 = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - val node3 = api.Network.newNode(host, Visibility.Network).create() - node2.connect(node3) - - assert(node1.network == node2.network) - assert(node2.network == node3.network) - assert(node1.network == node3.network) - } - - it should "have a different address than nodes it is connected to" in { - val node1 = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - val node3 = api.Network.newNode(host, Visibility.Network).create() - node2.connect(node3) - - assert(node1.address != node2.address) - assert(node2.address != node3.address) - assert(node1.address != node3.address) - } - - it should "not be reachable by non neighbors when visibility is set to Neighbors" in { - val node1 = api.Network.newNode(host, Visibility.Neighbors).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - val node3 = api.Network.newNode(host, Visibility.Network).create() - node2.connect(node3) - assert(!node1.canBeReachedFrom(node3)) - } - - it should "be reachable by all nodes when visibility is set to Network" in { - val node1 = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - val node3 = api.Network.newNode(host, Visibility.Network).create() - node2.connect(node3) - assert(node1.canBeReachedFrom(node2)) - assert(node1.canBeReachedFrom(node3)) - } - - it should "not be reachable by any node when visibility is set to None" in { - val node1 = api.Network.newNode(host, Visibility.None).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - val node3 = api.Network.newNode(host, Visibility.Network).create() - node2.connect(node3) - assert(!node1.canBeReachedFrom(node2)) - assert(!node1.canBeReachedFrom(node3)) - } - - it should "be in a separate network after a netsplit" in { - val node1 = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - val node3 = api.Network.newNode(host, Visibility.Network).create() - node2.connect(node3) - - node2.remove() - - assert(node1.network != null) - assert(node2.network == null) - assert(node3.network != null) - assert(node1.network != node3.network) - } - - it should "change its address when joining a network containing a node with its address" in { - val node1 = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node2.asInstanceOf[MutableNode].address = node1.address - node1.connect(node2) - assert(node1.address != node2.address) - } - - "A Network" should "keep its local layout after being merged with another network" in { - val node1 = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - val node3 = api.Network.newNode(host, Visibility.Network).create() - node2.connect(node3) - - val node4 = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node4) - val node5 = api.Network.newNode(host, Visibility.Network).create() - node4.connect(node5) - val node6 = api.Network.newNode(host, Visibility.Network).create() - node5.connect(node6) - - node2.connect(node5) - - assert(node1.neighbors.size == 1 && node1.isNeighborOf(node2)) - assert(node3.neighbors.size == 1 && node3.isNeighborOf(node2)) - - assert(node4.neighbors.size == 1 && node4.isNeighborOf(node5)) - assert(node6.neighbors.size == 1 && node6.isNeighborOf(node5)) - - assert(node2.isNeighborOf(node5)) - } - - it should "keep its local layout after being merged with another network containing nodes with duplicate addresses at bridge points" in { - val node1 = api.Network.newNode(host, Visibility.Network).create() - api.Network.joinNewNetwork(node1) - val node2 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node2) - val node3 = api.Network.newNode(host, Visibility.Network).create() - node1.connect(node3) - val node4 = api.Network.newNode(host, Visibility.Network).create() - node3.connect(node4) - - val node5 = api.Network.newNode(host, Visibility.Network).create() - node5.asInstanceOf[MutableNode].address = node1.address - api.Network.joinNewNetwork(node5) - val node6 = api.Network.newNode(host, Visibility.Network).create() - node6.asInstanceOf[MutableNode].address = node2.address - node5.connect(node6) - val node7 = api.Network.newNode(host, Visibility.Network).create() - node7.asInstanceOf[MutableNode].address = node3.address - node5.connect(node7) - val node8 = api.Network.newNode(host, Visibility.Network).create() - node8.asInstanceOf[MutableNode].address = node4.address - node7.connect(node8) - - node3.connect(node7) - - assert(node1.neighbors.size == 2 && node1.isNeighborOf(node2) && node1.isNeighborOf(node3)) - assert(node2.neighbors.size == 1 && node2.isNeighborOf(node1)) - assert(node3.neighbors.size == 3 && node3.isNeighborOf(node1) && node3.isNeighborOf(node4) && node3.isNeighborOf(node7)) - assert(node4.neighbors.size == 1 && node4.isNeighborOf(node3)) - - assert(node5.neighbors.size == 2 && node5.isNeighborOf(node6) && node5.isNeighborOf(node7)) - assert(node6.neighbors.size == 1 && node6.isNeighborOf(node5)) - assert(node7.neighbors.size == 3 && node7.isNeighborOf(node5) && node7.isNeighborOf(node8) && node7.isNeighborOf(node3)) - assert(node8.neighbors.size == 1 && node8.isNeighborOf(node7)) - } - - it should "not error when nodes disconnect themselves in a remapping operation" in { - val host = new Environment { - val node1 = api.Network.newNode(this, Visibility.Network).create() - val node2 = api.Network.newNode(this, Visibility.Network).create() - - api.Network.joinNewNetwork(node1) - - override def node: Node = node1 - - override def onMessage(message: Message): Unit = {} - - override def onConnect(node: Node): Unit = { - if (node == node1) { - node.connect(node2) - } - } - - override def onDisconnect(node: Node): Unit = { - if (node == node1) { - node2.remove() - } - } - } - - val node3 = api.Network.newNode(host, Visibility.Network).create() - node3.asInstanceOf[MutableNode].address = host.node.address - api.Network.joinNewNetwork(node3) - - node3.connect(host.node) - - assert(host.node1.neighbors.size == 2 && host.node1.isNeighborOf(host.node2) && host.node1.isNeighborOf(node3)) - assert(host.node2.neighbors.size == 1 && host.node2.isNeighborOf(host.node1)) - assert(node3.neighbors.size == 1 && node3.isNeighborOf(host.node1)) - } -}