public override void DidConnectAt(IWorldAccessor world, BlockPos pos, BlockFacing face)
        {
            if (IsDeadEnd())
            {
                BlockFacing nowFace = BlockFacing.FromFirstLetter(LastCodePart()[0]);
                if (nowFace.IsAdjacent(face))
                {
                    AssetLocation loc          = new AssetLocation(FirstCodePart() + "-" + LastCodePart() + face.Code[0]);
                    Block         toPlaceBlock = world.GetBlock(loc);

                    if (toPlaceBlock == null)
                    {
                        loc          = new AssetLocation(FirstCodePart() + "-" + face.Code[0] + LastCodePart());
                        toPlaceBlock = world.GetBlock(loc);
                    }


                    MechanicalNetwork nw = GetNetwork(world, pos);

                    world.BlockAccessor.SetBlock(toPlaceBlock.BlockId, pos);

                    BEMPBase be = (world.BlockAccessor.GetBlockEntity(pos) as BEMPBase);
                    be.JoinNetwork(nw);
                }
            }
        }
예제 #2
0
        public override void Initialize(ICoreAPI api, JsonObject properties)
        {
            base.Initialize(api, properties);

            Shape = GetShape();

            manager = Api.ModLoader.GetModSystem <MechanicalPowerMod>();

            if (Api.World.Side == EnumAppSide.Client)
            {
                lightRbs = Api.World.BlockAccessor.GetLightRGBs(Blockentity.Pos);
                if (NetworkId > 0)
                {
                    network = manager.GetOrCreateNetwork(NetworkId);
                    JoinNetwork(network);
                }
            }

            manager.AddDeviceForRender(this);

            AxisSign = new int[3] {
                0, 0, 1
            };
            SetOrientations();

            if (api.Side == EnumAppSide.Server && OutFacingForNetworkDiscovery != null)
            {
                CreateJoinAndDiscoverNetwork(OutFacingForNetworkDiscovery);
            }
        }
예제 #3
0
        public MechanicalNetwork getNetworkById(long id)
        {
            MechanicalNetwork network = null;

            networksById.TryGetValue(id, out network);
            return(network);
        }
예제 #4
0
        public override void FromTreeAtributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
        {
            base.FromTreeAtributes(tree, worldAccessForResolve);

            long nowNetworkId = tree.GetLong("networkid");

            if (worldAccessForResolve.Side == EnumAppSide.Client)
            {
                propagationDir = BlockFacing.ALLFACES[tree.GetInt("turnDirFromFacing")];
                gearedRatio    = tree.GetFloat("g");

                if (NetworkId != nowNetworkId)   //don't ever change network settings from tree on server side - networkId is not data to be saved  (otherwise would mess up networks on chunk loading, if BE tree loaded after a BE has already had network assigned on the server by propagation from a neighbour)
                {
                    NetworkId = 0;
                    if (worldAccessForResolve.Side == EnumAppSide.Client)
                    {
                        NetworkId = nowNetworkId;
                        if (NetworkId == 0)
                        {
                            LeaveNetwork();
                            network = null;
                        }
                        else if (manager != null)
                        {
                            network = manager.GetOrCreateNetwork(NetworkId);
                            JoinNetwork(network);
                            Blockentity.MarkDirty();
                        }
                    }
                }
            }
        }
예제 #5
0
        public override void Initialize(ICoreAPI api)
        {
            base.Initialize(api);

            Block = api.World.BlockAccessor.GetBlock(pos);

            manager = api.ModLoader.GetModSystem <MechanicalPowerMod>();

            if (api.World.Side == EnumAppSide.Client)
            {
                lightRbs = api.World.BlockAccessor.GetLightRGBs(pos);
            }

            manager.AddDeviceForRender(this);
            if (NetworkId > 0)
            {
                network = manager.GetOrCreateNetwork(NetworkId);
            }

            AxisMapping = new int[3] {
                0, 1, 2
            };
            AxisSign = new int[3] {
                1, 1, 1
            };
        }
        protected void OnPacket(MechNetworkPacket networkMessage)
        {
            bool isNew = !data.networksById.ContainsKey(networkMessage.networkId);

            MechanicalNetwork network = GetOrCreateNetwork(networkMessage.networkId);

            network.UpdateFromPacket(networkMessage, isNew);
        }
예제 #7
0
        private void OnPacket(MechNetworkPacket networkMessage)
        {
            bool isNew = networksById.ContainsKey(networkMessage.networkId);

            MechanicalNetwork network = getOrCreateNetwork(networkMessage.networkId);

            network.updateFromPacket(networkMessage, isNew);
        }
 public void DeleteNetwork(MechanicalNetwork network)
 {
     data.networksById.Remove(network.networkId);
     serverNwChannel.BroadcastPacket <NetworkRemovedPacket>(new NetworkRemovedPacket()
     {
         networkId = network.networkId
     });
 }
예제 #9
0
        public MechanicalNetwork createAndRegisterNetwork(IMechanicalPowerNetworkNode originatorNode)
        {
            MechanicalNetwork network = createAndRegisterNetwork();

            network.register(originatorNode);
            network.firstPowerNode = originatorNode.getPosition();

            return(network);
        }
        public MechanicalNetwork CreateNetwork()
        {
            MechanicalNetwork nw = new MechanicalNetwork(this, nextNetworkId);

            networksById[nextNetworkId] = nw;
            nextNetworkId++;

            return(nw);
        }
예제 #11
0
        public override void OnNeighbourBlockChange(IWorldAccessor world, BlockPos pos, BlockPos neibpos)
        {
            string orients = Orientation;

            if (orients.Length == 2 && orients[0] == orients[1])
            {
                orients = "" + orients[0];
            }

            BlockFacing[] facings;
            facings = orients.Length == 1 ? new BlockFacing[] { BlockFacing.FromFirstLetter(orients[0]) } : new BlockFacing[] { BlockFacing.FromFirstLetter(orients[0]), BlockFacing.FromFirstLetter(orients[1]) };

            List <BlockFacing> lostFacings = new List <BlockFacing>();

            foreach (BlockFacing facing in facings)
            {
                BlockPos npos = pos.AddCopy(facing);
                IMechanicalPowerBlock nblock = world.BlockAccessor.GetBlock(npos) as IMechanicalPowerBlock;

                if (nblock == null || !nblock.HasMechPowerConnectorAt(world, npos, facing.Opposite) || world.BlockAccessor.GetBlockEntity(pos)?.GetBehavior <BEBehaviorMPBase>()?.disconnected == true)
                {
                    lostFacings.Add(facing);
                }
            }

            if (lostFacings.Count == orients.Length)
            {
                world.BlockAccessor.BreakBlock(pos, null);
                return;
            }

            if (lostFacings.Count > 0)
            {
                MechanicalNetwork nw = GetNetwork(world, pos);

                orients = orients.Replace("" + lostFacings[0].Code[0], "");
                Block toPlaceBlock = world.GetBlock(new AssetLocation(FirstCodePart() + "-" + orients));
                (toPlaceBlock as BlockMPBase).ExchangeBlockAt(world, pos);
                BlockEntity      be   = world.BlockAccessor.GetBlockEntity(pos);
                BEBehaviorMPBase bemp = be.GetBehavior <BEBehaviorMPBase>();
                bemp.LeaveNetwork();

                //check for connect to adjacent valid facings, similar to TryPlaceBlock
                BlockFacing           firstFace = BlockFacing.FromFirstLetter(orients[0]);
                BlockPos              firstPos  = pos.AddCopy(firstFace);
                BlockEntity           beNeib    = world.BlockAccessor.GetBlockEntity(firstPos);
                IMechanicalPowerBlock neighbour = beNeib?.Block as IMechanicalPowerBlock;

                BEBehaviorMPAxle bempaxle = beNeib?.GetBehavior <BEBehaviorMPAxle>();
                if (bempaxle != null && !BEBehaviorMPAxle.IsAttachedToBlock(world.BlockAccessor, neighbour as Block, firstPos))
                {
                    return;
                }
                neighbour?.DidConnectAt(world, firstPos, firstFace.Opposite);
                WasPlaced(world, pos, firstFace);
            }
        }
        public MechanicalNetwork[] getNetworks()
        {
            MechanicalNetwork network = MechNetworkManagerRegistry.ManagersByWorld[api.World].getNetworkById(networkId);

            if (network == null)
            {
                return(new MechanicalNetwork[0]);
            }
            return(new MechanicalNetwork[] { network });
        }
        public float getNetworkSpeed(BlockFacing facing)
        {
            MechanicalNetwork network = getNetwork(facing);

            if (network == null)
            {
                return(0);
            }
            return(network.getSpeed());
        }
        public void testFullyLoaded(MechanicalNetwork mw)
        {
            if (Api.Side != EnumAppSide.Server || mw.fullyLoaded)
            {
                return;
            }

            mw.fullyLoaded          = mw.testFullyLoaded(Api);
            allNetworksFullyLoaded &= mw.fullyLoaded;
        }
        public MechanicalNetwork CreateNetwork(IMechanicalPowerDevice powerProducerNode)
        {
            MechanicalNetwork nw = new MechanicalNetwork(this, data.nextNetworkId);

            nw.fullyLoaded = true;

            data.networksById[data.nextNetworkId] = nw;
            data.nextNetworkId++;

            return(nw);
        }
        public MechanicalNetwork GetOrCreateNetwork(long networkId)
        {
            MechanicalNetwork mw;

            if (!networksById.TryGetValue(networkId, out mw))
            {
                networksById[networkId] = mw = new MechanicalNetwork(this, networkId);
            }

            return(mw);
        }
예제 #17
0
 public virtual void LeaveNetwork()
 {
     if (DEBUG)
     {
         Api.Logger.Notification("Leaving network " + NetworkId + " at " + this.Position);
     }
     network?.Leave(this);
     network   = null;
     NetworkId = 0;
     Blockentity.MarkDirty();
 }
예제 #18
0
        public MechanicalNetwork createAndRegisterNetwork()
        {
            long networkId = findUniqueId();
            //System.out.println(world.isRemote + " from create instantiated new network with id " + networkId);

            MechanicalNetwork network = new MechanicalNetwork(this, networkId);

            networksById[networkId] = network;

            return(network);
        }
예제 #19
0
        public override void FromTreeAtributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
        {
            base.FromTreeAtributes(tree, worldAccessForResolve);

            NetworkId = tree.GetLong("networkid");
            if (manager != null)
            {
                network = manager.GetOrCreateNetwork(NetworkId);
            }

            turnDirFromFacing = BlockFacing.ALLFACES[tree.GetInt("turnDirFromFacing")];
        }
예제 #20
0
        public MechanicalNetwork getOrCreateNetwork(long networkid)
        {
            MechanicalNetwork network = getNetworkById(networkid);

            if (network == null)
            {
                //System.out.println("from get instantiated new network with id " + networkid);
                network = new MechanicalNetwork(this, networkid);
                networksById[networkid] = network;
            }
            return(network);
        }
예제 #21
0
        public void RebuildNetwork(MechanicalNetwork network, IMechanicalPowerDevice nowRemovedNode = null)
        {
            network.Valid = false;

            if (Api.Side == EnumAppSide.Server)
            {
                DeleteNetwork(network);
            }

            if (network.nodes.Values.Count == 0)
            {
                if (Api.Side == EnumAppSide.Server)
                {
                    Api.Logger.Notification("Network with id " + network.networkId + " had zero nodes?");
                }
                return;
            }

            var nnodes = network.nodes.Values.ToArray();

            foreach (var nnode in nnodes)
            {
                nnode.LeaveNetwork();
            }

            foreach (var nnode in nnodes)
            {
                if (!(nnode is IMechanicalPowerDevice))
                {
                    continue;
                }
                IMechanicalPowerDevice newnode = Api.World.BlockAccessor.GetBlockEntity((nnode as IMechanicalPowerDevice).Position)?.GetBehavior <BEBehaviorMPBase>() as IMechanicalPowerDevice;
                if (newnode == null)
                {
                    continue;
                }
                BlockFacing oldTurnDir = newnode.GetPropagationDirection();

                if (newnode.OutFacingForNetworkDiscovery != null && (nowRemovedNode == null || newnode.Position != nowRemovedNode.Position))
                {
                    MechanicalNetwork newnetwork = newnode.CreateJoinAndDiscoverNetwork(newnode.OutFacingForNetworkDiscovery);
                    bool reversed = newnode.GetPropagationDirection() == oldTurnDir.Opposite;
                    newnetwork.Speed                = reversed ? -network.Speed : network.Speed;
                    newnetwork.AngleRad             = network.AngleRad;
                    newnetwork.TotalAvailableTorque = reversed ? -network.TotalAvailableTorque : network.TotalAvailableTorque;
                    newnetwork.NetworkResistance    = network.NetworkResistance;
                    if (Api.Side == EnumAppSide.Server)
                    {
                        newnetwork.broadcastData();
                    }
                }
            }
        }
        public MechanicalNetwork GetOrCreateNetwork(long networkId)
        {
            MechanicalNetwork mw;

            if (!data.networksById.TryGetValue(networkId, out mw))
            {
                data.networksById[networkId] = mw = new MechanicalNetwork(this, networkId);
            }

            testFullyLoaded(mw);

            return(mw);
        }
예제 #23
0
        public void JoinNetwork(MechanicalNetwork network)
        {
            this.network = network;
            network.Join(this);

            if (network == null)
            {
                NetworkId = 0;
            }
            else
            {
                NetworkId = network.networkId;
            }
        }
예제 #24
0
        public override void JoinNetwork(MechanicalNetwork network)
        {
            base.JoinNetwork(network);

            //Speed limit when joining to an existing network: this is to prevent crazy bursts of speed on first connection if the network was spinning fast (with low resistances)
            // (if the network has enough torque to drive faster than this - which is going to be uncommon - then the network speed can increase after this is joined to the network)
            float speed = network == null ? 0f : Math.Abs(network.Speed * this.GearedRatio) * 1.6f;

            if (speed > 1f)
            {
                network.Speed       /= speed;
                network.clientSpeed /= speed;
            }
        }
예제 #25
0
        public override void DidConnectAt(IWorldAccessor world, BlockPos pos, BlockFacing face)
        {
            if (IsDeadEnd())
            {
                BlockFacing nowFace = BlockFacing.FromFirstLetter(Orientation[0]);
                if (nowFace.IsAdjacent(face))
                {
                    Block             toPlaceBlock = getGearBlock(world, false, Facings[0], face);
                    MechanicalNetwork nw           = GetNetwork(world, pos);

                    (toPlaceBlock as BlockMPBase).ExchangeBlockAt(world, pos);
                    BEBehaviorMPBase bemp = world.BlockAccessor.GetBlockEntity(pos)?.GetBehavior <BEBehaviorMPBase>();
                }
            }
        }
        public float getAngle()
        {
            MechanicalNetwork network = getNetwork(null);

            if (network == null)
            {
                return(lastAngle);
            }

            if (directionFromFacing != orientation)
            {
                return(lastAngle = 360 - network.getAngle());
            }

            return(lastAngle = network.getAngle());
        }
        public void loadNetworks(ITreeAttribute networks)
        {
            networksById.Clear();

            if (networks == null)
            {
                return;
            }

            foreach (var val in networks)
            {
                ITreeAttribute    attr    = (ITreeAttribute)val.Value;
                MechanicalNetwork network = new MechanicalNetwork(this, attr.GetInt("networkId"));

                networksById[network.networkId] = network;
                network.ReadFromTreeAttribute(attr);
            }
        }
예제 #28
0
        public void loadNetworks(ITreeAttribute networks)
        {
            //System.out.println("load networks for dimension " + world.provider.getDimensionId() + ", list: " + networks);
            networksById.Clear();

            if (networks == null)
            {
                return;
            }

            foreach (var val in networks)
            {
                ITreeAttribute    attr    = (ITreeAttribute)val.Value;
                MechanicalNetwork network = new MechanicalNetwork(this, attr.GetInt("networkId"));

                networksById[network.networkId] = network;
                network.readFromTreeAttribute(attr);
                network.rediscoverNetwork(api.World);
            }
        }
예제 #29
0
        public override void OnNeighourBlockChange(IWorldAccessor world, BlockPos pos, BlockPos neibpos)
        {
            string orients = LastCodePart();

            BlockFacing[] facings;
            facings = orients.Length == 1 ? new BlockFacing[] { BlockFacing.FromFirstLetter(orients[0]) } : new BlockFacing[] { BlockFacing.FromFirstLetter(orients[0]), BlockFacing.FromFirstLetter(orients[1]) };

            List <BlockFacing> lostFacings = new List <BlockFacing>();

            foreach (BlockFacing facing in facings)
            {
                BlockPos npos = pos.AddCopy(facing);
                IMechanicalPowerBlock nblock = world.BlockAccessor.GetBlock(npos) as IMechanicalPowerBlock;

                if (nblock == null || !nblock.HasConnectorAt(world, npos, facing.GetOpposite()))
                {
                    lostFacings.Add(facing);
                }
            }

            if (lostFacings.Count == orients.Length)
            {
                world.BlockAccessor.BreakBlock(pos, null);
                return;
            }

            if (lostFacings.Count > 0)
            {
                MechanicalNetwork nw = GetNetwork(world, pos);

                orients = orients.Replace("" + lostFacings[0].Code[0], "");
                Block toPlaceBlock = world.GetBlock(new AssetLocation(FirstCodePart() + "-" + orients));
                world.BlockAccessor.SetBlock(toPlaceBlock.BlockId, pos);

                BEMPBase be = (world.BlockAccessor.GetBlockEntity(pos) as BEMPBase);
                be.JoinNetwork(nw);
            }
        }
예제 #30
0
        protected virtual bool spreadTo(ICoreAPI api, MechanicalNetwork network, BlockPos exitPos, MechPowerPath propagatePath, out Vec3i missingChunkPos)
        {
            missingChunkPos = null;
            BEBehaviorMPBase      beMechBase = api.World.BlockAccessor.GetBlockEntity(exitPos)?.GetBehavior <BEBehaviorMPBase>();
            IMechanicalPowerBlock mechBlock  = beMechBase?.Block as IMechanicalPowerBlock;

            if (DEBUG)
            {
                api.Logger.Notification("attempting spread to " + exitPos + (beMechBase == null ? " -" : ""));
            }

            if (beMechBase == null && api.World.BlockAccessor.GetChunkAtBlockPos(exitPos) == null)
            {
                if (OutsideMap(api.World.BlockAccessor, exitPos))
                {
                    return(true);                                               //Network discovery should not fail if there cannot be a block in this position
                }
                missingChunkPos = new Vec3i(exitPos.X / api.World.BlockAccessor.ChunkSize, exitPos.Y / api.World.BlockAccessor.ChunkSize, exitPos.Z / api.World.BlockAccessor.ChunkSize);
                return(false);
            }

            if (beMechBase != null && mechBlock.HasMechPowerConnectorAt(api.World, exitPos, propagatePath.OutFacing.Opposite))
            {
                beMechBase.Api = api;
                if (!beMechBase.JoinAndSpreadNetworkToNeighbours(api, network, propagatePath, out missingChunkPos))
                {
                    return(false);
                }
            }
            else if (DEBUG)
            {
                api.Logger.Notification("no connector at " + exitPos + " " + propagatePath.OutFacing.Opposite);
            }

            return(true);
        }