public void WasPlaced(IWorldAccessor world, BlockPos ownPos, BlockFacing connectedOnFacing = null, IMechanicalPowerBlock connectedToBlock = null) { BEMPBase beMechBase = (world.BlockAccessor.GetBlockEntity(ownPos) as BEMPBase); MechanicalNetwork network; if (connectedOnFacing == null) { network = mechPower.CreateNetwork(); } else { network = connectedToBlock.GetNetwork(world, ownPos.AddCopy(connectedOnFacing)); IMechanicalPowerNode node = world.BlockAccessor.GetBlockEntity(ownPos.AddCopy(connectedOnFacing)) as IMechanicalPowerNode; beMechBase?.SetBaseTurnDirection(node.GetTurnDirection(connectedOnFacing.GetOpposite()), connectedOnFacing.GetOpposite()); } beMechBase?.JoinNetwork(network); }
public virtual MechanicalNetwork CreateJoinAndDiscoverNetwork(BlockFacing powerOutFacing) { BlockPos neibPos = Position.AddCopy(powerOutFacing); IMechanicalPowerBlock neibMechBlock = null; neibMechBlock = Api.World.BlockAccessor.GetBlock(neibPos) as IMechanicalPowerBlock; MechanicalNetwork neibNetwork = neibMechBlock == null ? null : neibMechBlock.GetNetwork(Api.World, neibPos); if (neibNetwork == null || !neibNetwork.Valid) { MechanicalNetwork newNetwork = this.network; if (newNetwork == null) { newNetwork = manager.CreateNetwork(this); JoinNetwork(newNetwork); if (DEBUG) { Api.Logger.Notification("===setting inturn at " + Position + " " + powerOutFacing); } SetPropagationDirection(new MechPowerPath(powerOutFacing, 1)); } Vec3i missingChunkPos; bool chunksLoaded = spreadTo(Api, newNetwork, neibPos, new MechPowerPath(GetPropagationDirection(), this.gearedRatio), out missingChunkPos); if (network == null) { if (DEBUG) { Api.Logger.Notification("Incomplete chunkloading, possible issues with mechanical network around block " + neibPos); } return(null); } if (!chunksLoaded) { network.AwaitChunkThenDiscover(missingChunkPos); manager.testFullyLoaded(network); // To trigger that allFullyLoaded gets false return(network); } else { IMechanicalPowerDevice node = Api.World.BlockAccessor.GetBlockEntity(neibPos)?.GetBehavior <BEBehaviorMPBase>() as IMechanicalPowerDevice; if (node != null) { BlockFacing facing = node.GetPropagationDirectionInput(); SetPropagationDirection(new MechPowerPath(facing, node.GetGearedRatio(facing), neibPos)); } } } else { BEBehaviorMPBase neib = Api.World.BlockAccessor.GetBlockEntity(neibPos).GetBehavior <BEBehaviorMPBase>(); if (OutFacingForNetworkDiscovery != null) { if (tryConnect(OutFacingForNetworkDiscovery)) { this.gearedRatio = neib.GetGearedRatio(OutFacingForNetworkDiscovery); //no need to set propagationDir, it's already been set by tryConnect } } else { JoinNetwork(neibNetwork); SetPropagationDirection(new MechPowerPath(neib.propagationDir, neib.GetGearedRatio(neib.propagationDir), neibPos)); } } return(network); }