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); } } }
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); } }
public MechanicalNetwork getNetworkById(long id) { MechanicalNetwork network = null; networksById.TryGetValue(id, out network); return(network); }
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(); } } } } }
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); }
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 }); }
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); }
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); }
public virtual void LeaveNetwork() { if (DEBUG) { Api.Logger.Notification("Leaving network " + NetworkId + " at " + this.Position); } network?.Leave(this); network = null; NetworkId = 0; Blockentity.MarkDirty(); }
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); }
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")]; }
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); }
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); }
public void JoinNetwork(MechanicalNetwork network) { this.network = network; network.Join(this); if (network == null) { NetworkId = 0; } else { NetworkId = network.networkId; } }
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; } }
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); } }
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); } }
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); } }
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); }