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); }
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(); }
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(); }
public void AddConveyor(TransportPipeInfo info) { if (info.type == PIPETYPE.Wooden) { if (linkerPipeType != PIPETYPE.Wooden) { linkerPipeType = PIPETYPE.Wooden; UpdateElectricityType(); } } conveyors.Add(info); UpdateElectricityCost(); }
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); } } }
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); } } } } } }
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(); } }
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); }