Ejemplo n.º 1
0
        public static List <TransportPipeInfo> GetNeighbourgPipesInfo(Vector3i position)
        {
            List <TransportPipeInfo> result = new List <TransportPipeInfo>();

            for (int i = -1; i <= 1; i++)
            {
                for (int j = -1; j <= 1; j++)
                {
                    for (int k = -1; k <= 1; k++)
                    {
                        if (i == 0 && j == 0 && k == 0)
                        {
                            continue;
                        }
                        if ((i == 0 && j == 0) || (i == 0 && k == 0) || (j == 0 && k == 0))
                        {
                            Vector3i          newPos = MakeWorldMod(new Vector3i(position.x + i, position.y + j, position.z + k));
                            TransportPipeInfo info   = null;
                            if (TransportPipeManager.pipesInfo.TryGetValue(newPos, out info))
                            {
                                result.Add(info);
                            }
                        }
                    }
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        public void RemoveConveyor(TransportPipeInfo info)
        {
            conveyors.Remove(info);
            bool electric = true;

            foreach (TransportPipeInfo i in conveyors)
            {
                if (i.type == PIPETYPE.Wooden)
                {
                    if (linkerPipeType != PIPETYPE.Wooden)
                    {
                        linkerPipeType = PIPETYPE.Wooden;
                        UpdateElectricityType();
                    }
                    electric = false;
                    break;
                }
            }
            if (electric)
            {
                if (linkerPipeType != PIPETYPE.Electric)
                {
                    linkerPipeType = PIPETYPE.Electric;
                    UpdateElectricityType();
                }
            }
            UpdateElectricityCost();
        }
Ejemplo n.º 3
0
 public void UpdateInfo(TransportPipeInfo info)
 {
     if (info.type == PIPETYPE.Wooden)
     {
         if (linkerPipeType != PIPETYPE.Wooden)
         {
             linkerPipeType = PIPETYPE.Wooden;
             UpdateElectricityType();
         }
     }
     else if (info.type == PIPETYPE.Electric)
     {
         if (linkerPipeType == PIPETYPE.Wooden)
         {
             linkerPipeType = PIPETYPE.Electric;
             foreach (TransportPipeInfo conv in conveyors)
             {
                 if (conv.type == PIPETYPE.Wooden)
                 {
                     linkerPipeType = PIPETYPE.Wooden;
                     break;
                 }
             }
             UpdateElectricityType();
         }
     }
     UpdateElectricityCost();
 }
Ejemplo n.º 4
0
 public void AddConveyor(TransportPipeInfo info)
 {
     if (info.type == PIPETYPE.Wooden)
     {
         if (linkerPipeType != PIPETYPE.Wooden)
         {
             linkerPipeType = PIPETYPE.Wooden;
             UpdateElectricityType();
         }
     }
     conveyors.Add(info);
     UpdateElectricityCost();
 }
Ejemplo n.º 5
0
        private void RecursifRebuild(TransportPipeInfo info)
        {
            info.beltLinker.AddConveyor(info);
            List <TransportPipeInfo> neighbourgs = Utils.GetNeighbourgPipesInfo(info.pos);

            foreach (TransportPipeInfo neighbourg in neighbourgs)
            {
                if (neighbourg.beltLinker == null)
                {
                    neighbourg.beltLinker = info.beltLinker;
                    RecursifRebuild(neighbourg);
                }
            }
        }
Ejemplo n.º 6
0
 public static void RecreateLinker(Vector3i pos, TransportPipeLinker linker)
 {
     for (int i = -1; i <= 1; i++)
     {
         for (int j = -1; j <= 1; j++)
         {
             for (int k = -1; k <= 1; k++)
             {
                 if (i == 0 && j == 0 && k == 0)
                 {
                     Vector3i          newPos = MakeWorldMod(new Vector3i(pos.x + i, pos.y + j, pos.z + k));
                     TransportPipeInfo info   = null;
                     if (TransportPipeManager.pipesInfo.TryGetValue(newPos, out info))
                     {
                         if (linker.ContainsConveyor(info) == false)
                         {
                             linker.AddConveyor(info);
                         }
                     }
                     continue;
                 }
                 if ((i == 0 && j == 0) || (i == 0 && k == 0) || (j == 0 && k == 0))
                 {
                     Vector3i          newPos = MakeWorldMod(new Vector3i(pos.x + i, pos.y + j, pos.z + k));
                     TransportPipeInfo info   = null;
                     if (TransportPipeManager.pipesInfo.TryGetValue(newPos, out info))
                     {
                         if (info.beltLinker == null)
                         {
                             info.beltLinker = linker;
                             RecreateLinker(newPos, linker);
                         }
                     }
                     else if (World.GetBlock(newPos) is BaseTransportPipeBlock || World.GetBlock(newPos) is PipeSlotBlock)
                     {
                         info            = new TransportPipeInfo();
                         info.pos        = newPos;
                         info.beltLinker = linker;
                         info.type       = World.GetBlock(newPos) is WoodenTransportPipeBlock ? PIPETYPE.Wooden : PIPETYPE.Electric;
                         TransportPipeManager.pipesInfo.TryAdd(newPos, info);
                         RecreateLinker(newPos, linker);
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 7
0
        public void RebuildLinker()
        {
            foreach (TransportPipeInfo con in conveyors)
            {
                con.beltLinker = null;
            }
            TransportPipeInfo toRebuild = null;

            while (true)
            {
                toRebuild = null;
                foreach (TransportPipeInfo p in conveyors)
                {
                    if (p.beltLinker == null)
                    {
                        p.beltLinker = new TransportPipeLinker();
                        toRebuild    = p;
                        break;
                    }
                }
                if (toRebuild != null)
                {
                    RecursifRebuild(toRebuild);
                    toRebuild.beltLinker.UpdateElectricityCost();
                }
                else
                {
                    break;
                }
            }
            List <ConnectorObject> copie = new List <ConnectorObject>();

            foreach (ConnectorObject pipe in inputConveyors)
            {
                copie.Add(pipe);
            }
            foreach (ConnectorObject pipe in outputConveyors)
            {
                copie.Add(pipe);
            }
            inputConveyors.Clear();
            outputConveyors.Clear();
            foreach (ConnectorObject pipe in copie)
            {
                pipe.InitInputOutput();
            }
        }
Ejemplo n.º 8
0
 public bool ContainsConveyor(TransportPipeInfo info)
 {
     return(conveyors.Contains(info));
 }
 public bool ContextOnInterraction(InteractionContext context)
 {
     if (context.Method == InteractionMethod.Left)
     {
         if (context.HasBlock && context.Block is BaseTransportPipeBlock && context.SelectedItem is HammerItem)
         {
             Item itemToAdd = Item.Create(BlockItem.CreatingItem(context.Block.GetType()).Type);
             if (itemToAdd != null && context.Player.User.Inventory.TryAddItem(itemToAdd))
             {
                 StringBuilder message = new StringBuilder();
                 message.AppendLocString("You received");
                 message.Append(" ");
                 message.Append(Item.Get(itemToAdd.TypeID).UILinkAndNumber(1));
                 context.Player.SendTemporaryMessage(message.ToStringAlreadyLocalized());
                 World.DeleteBlock(context.BlockPosition.Value);
                 TransportPipeInfo info = null;
                 Vector3i          pos  = Utils.MakeWorldMod(context.BlockPosition.Value);
                 if (TransportPipeManager.pipesInfo.TryGetValue(pos, out info))
                 {
                     info.beltLinker.RemoveConveyor(info);
                     TransportPipeManager.pipesInfo.TryRemove(pos, out info);
                     info.beltLinker.RebuildLinker();
                 }
             }
         }
         else if (context.HasTarget && context.Target is ConnectorObject && context.SelectedItem is HammerItem)
         {
             TransportPipeInfo info = null;
             Vector3i          pos  = Utils.MakeWorldMod((context.Target as ConnectorObject).Position3i);
             if (TransportPipeManager.pipesInfo.TryGetValue(pos, out info))
             {
                 Item itemToAdd = null;
                 if (info.type == PIPETYPE.Electric)
                 {
                     itemToAdd = Item.Create(typeof(ElectricTransportPipeItem));
                 }
                 else if (info.type == PIPETYPE.Wooden)
                 {
                     itemToAdd = Item.Create(typeof(WoodenTransportPipeItem));
                 }
                 if (context.Player.User.Inventory.TryAddItems(itemToAdd.Type, 1))
                 {
                     StringBuilder message = new StringBuilder();
                     message.AppendLocString("You received");
                     message.Append(" ");
                     message.Append(Item.Get(itemToAdd.TypeID).UILinkAndNumber(1));
                     context.Player.SendTemporaryMessage(message.ToStringAlreadyLocalized());
                     info.beltLinker.RemoveConnector(context.Target as ConnectorObject);
                     info.beltLinker.RemoveConveyor(info);
                     TransportPipeManager.pipesInfo.TryRemove((context.Target as ConnectorObject).Position3i, out info);
                     info.beltLinker.RebuildLinker();
                     (context.Target as ConnectorObject).Destroy();
                 }
             }
             else
             {
                 return(false);
             }
             return(true);
         }
         else if (context.HasTarget && context.Target is WorldObject && (context.Target as WorldObject).GetComponent <AutomaticCraftingComponent>() != null && context.SelectedItem is HammerItem)
         {
             (context.Target as WorldObject).GetComponent <AutomaticCraftingComponent>().RemoveComponent();
         }
     }
     else if (context.Method == InteractionMethod.Right)
     {
         if (context.HasBlock && context.SelectedItem != null && context.SelectedItem is HammerItem && context.CarriedItem != null && context.CarriedItem is BlockItem <BaseTransportPipeBlock> )
         {
             TransportPipeInfo info = new TransportPipeInfo();
             info.beltLinker = null;
             if (context.CarriedItem is ElectricTransportPipeItem)
             {
                 info.type = PIPETYPE.Electric;
             }
             else if (context.CarriedItem is WoodenTransportPipeItem)
             {
                 info.type = PIPETYPE.Wooden;
             }
             Vector3i pos = Utils.MakeWorldMod(context.BlockPosition.Value);
             List <TransportPipeInfo> neighbourgs = Utils.GetNeighbourgPipesInfo(pos);
             if (neighbourgs.Count > 0)
             {
                 foreach (TransportPipeInfo neighbourg in neighbourgs)
                 {
                     if (info.beltLinker == null)
                     {
                         info.beltLinker = neighbourg.beltLinker;
                     }
                     else if (neighbourg.beltLinker != null && info.beltLinker != neighbourg.beltLinker)
                     {
                         info.beltLinker.AbsorbLinker(neighbourg.beltLinker);
                     }
                 }
                 if (info.beltLinker == null)
                 {
                     info.beltLinker = new TransportPipeLinker();
                 }
                 info.beltLinker.AddConveyor(info);
             }
             else
             {
                 info.beltLinker = new TransportPipeLinker();
                 info.beltLinker.AddConveyor(info);
             }
             info.pos = pos;
             TransportPipeManager.pipesInfo[pos] = info;
         }
     }
     return(false);
 }