示例#1
0
        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);
        }
示例#2
0
        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);
        }