Пример #1
0
        private static Box2 GetTileBox(this TileRef turf)
        {
            var map      = IoCManager.Resolve <IMapManager>();
            var tileGrid = map.GetGrid(turf.GridIndex);

            return(Box2.UnitCentered.Scale(tileGrid.TileSize));
        }
        public PathfindingNode GetNode(TileRef tile)
        {
            var chunkX = tile.X - _indices.X;
            var chunkY = tile.Y - _indices.Y;

            return(_nodes[chunkX, chunkY]);
        }
        /// <summary>
        /// Return the corresponding PathfindingNode for this tile
        /// </summary>
        /// <param name="tile"></param>
        /// <returns></returns>
        public PathfindingNode GetNode(TileRef tile)
        {
            var chunk = GetChunk(tile);
            var node  = chunk.GetNode(tile);

            return(node);
        }
Пример #4
0
    public void AddTileRef(GameObject go, int x, int y)
    {
        TileRef tr = go.AddComponent <TileRef>();

        tr.x = x;
        tr.y = y;
    }
Пример #5
0
    /// <summary>
    /// Gets the safe nieghbour.
    /// </summary>
    public TileRef GetSafeNieghbour(TileRef tr)
    {
        List <TileRef> stepToList = new List <TileRef>();

        if ((tr.x - 1 >= 0) && (m_tiles[tr.x - 1, tr.y].m_isBlown == false))
        {
            stepToList.Add(m_tiles[tr.x - 1, tr.y].m_tile.GetComponent <TileRef>());
        }
        if ((tr.x + 1 < m_rowWidth) && (m_tiles[tr.x + 1, tr.y].m_isBlown == false))
        {
            stepToList.Add(m_tiles[tr.x + 1, tr.y].m_tile.GetComponent <TileRef>());
        }
        if ((tr.y - 1 >= 0) && (m_tiles[tr.x, tr.y - 1].m_isBlown == false))
        {
            stepToList.Add(m_tiles[tr.x, tr.y - 1].m_tile.GetComponent <TileRef>());
        }
        if ((tr.y + 1 < m_rowHeight) && (m_tiles[tr.x, tr.y + 1].m_isBlown == false))
        {
            stepToList.Add(m_tiles[tr.x, tr.y + 1].m_tile.GetComponent <TileRef>());
        }

        if (stepToList.Count <= 0)
        {
            return(null);
        }

        return(stepToList[Random.Range(0, stepToList.Count)]);
    }
Пример #6
0
        FixedPoint2 ITileReaction.TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume)
        {
            var entities = IoCManager.Resolve <IEntityLookup>().GetEntitiesIntersecting(tile).ToArray();
            var amount   = FixedPoint2.Zero;
            var entMan   = IoCManager.Resolve <IEntityManager>();

            foreach (var entity in entities)
            {
                if (entMan.TryGetComponent(entity, out CleanableComponent? cleanable))
                {
                    var next = amount + (cleanable.CleanAmount * CleanAmountMultiplier);
                    // Nothing left?
                    if (reactVolume < next)
                    {
                        break;
                    }

                    amount = next;
                    entMan.QueueDeleteEntity(entity);
                }
            }

            var decalSystem = EntitySystem.Get <DecalSystem>();

            foreach (var uid in decalSystem.GetDecalsInRange(tile.GridIndex, tile.GridIndices + new Vector2(0.5f, 0.5f), validDelegate: x => x.Cleanable))
            {
                decalSystem.RemoveDecal(tile.GridIndex, uid);
            }

            return(amount);
        }
Пример #7
0
        public static bool PryTile(this TileRef tileRef,
                                   IMapManager?mapManager = null, ITileDefinitionManager?tileDefinitionManager = null, IEntityManager?entityManager = null)
        {
            var tile    = tileRef.Tile;
            var indices = tileRef.GridIndices;

            // If the arguments are null, resolve the needed dependencies.
            mapManager ??= IoCManager.Resolve <IMapManager>();
            tileDefinitionManager ??= IoCManager.Resolve <ITileDefinitionManager>();
            entityManager ??= IoCManager.Resolve <IEntityManager>();

            if (tile.IsEmpty)
            {
                return(false);
            }

            var tileDef = (ContentTileDefinition)tileDefinitionManager[tile.TypeId];

            if (!tileDef.CanCrowbar)
            {
                return(false);
            }

            var mapGrid = mapManager.GetGrid(tileRef.GridIndex);

            var plating = tileDefinitionManager[tileDef.BaseTurfs[^ 1]];
Пример #8
0
        public ReagentUnit ReactionTile(TileRef tile, ReagentUnit reactVolume)
        {
            var removed = ReagentUnit.Zero;

            if (tile.Tile.IsEmpty)
            {
                return(removed);
            }

            foreach (var reaction in _tileReactions)
            {
                removed += reaction.TileReact(tile, this, reactVolume - removed);

                if (removed > reactVolume)
                {
                    throw new Exception("Removed more than we have!");
                }

                if (removed == reactVolume)
                {
                    break;
                }
            }

            return(removed);
        }
        public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume)
        {
            if (reactVolume <= FixedPoint2.Zero || tile.Tile.IsEmpty)
            {
                return(FixedPoint2.Zero);
            }

            var atmosphereSystem = EntitySystem.Get <AtmosphereSystem>();

            var environment = atmosphereSystem.GetTileMixture(tile.GridIndex, tile.GridIndices, true);

            if (environment == null || !atmosphereSystem.IsHotspotActive(tile.GridIndex, tile.GridIndices))
            {
                return(FixedPoint2.Zero);
            }

            environment.Temperature =
                MathF.Max(MathF.Min(environment.Temperature - (_coolingTemperature * 1000f),
                                    environment.Temperature / _coolingTemperature), Atmospherics.TCMB);

            atmosphereSystem.React(tile.GridIndex, tile.GridIndices);
            atmosphereSystem.HotspotExtinguish(tile.GridIndex, tile.GridIndices);

            return(FixedPoint2.Zero);
        }
Пример #10
0
        private static Box2 GetWorldTileBox(TileRef turf)
        {
            var map      = IoCManager.Resolve <IMapManager>();
            var tileGrid = map.GetGrid(turf.GridIndex);
            var tileBox  = Box2.UnitCentered.Scale(tileGrid.TileSize);

            return(tileBox.Translated(tileGrid.GridTileToWorldPos(turf.GridIndices)));
        }
Пример #11
0
        public override void onPlayerOpenChest(PlayerChestOpenEvent Event)
        {
            TileRef tileRef = Server.tile.At((int)Server.chest[Event.ID].x, (int)Server.chest[Event.ID].y);

            Program.tConsole.WriteLine("Chest Type: " + tileRef.Data.Type.ToString());
            Event.Cancelled = CancelEvent(Event.Sender.Name);
            base.onPlayerOpenChest(Event);
        }
Пример #12
0
            public Tile this[int x, int y]
            {
                get
                {
                    Point chunkPos = new Point(
                        (int)Math.Floor((float)x / ChunkSize),
                        (int)Math.Floor((float)y / ChunkSize)
                        );
                    Chunk chunk;
                    if (mm.chunks.TryGetValue(chunkPos, out chunk))
                    {
                        return(chunk.Tiles[(y - chunkPos.Y * ChunkSize) * ChunkSize + (x - chunkPos.X * ChunkSize)]);
                    }
                    else
                    {
                        return(default(Tile)); // SPAAAAAAAAAAAAAACE!!!
                    }
                }
                set
                {
                    Point chunkPos = new Point(
                        (int)Math.Floor((float)x / ChunkSize),
                        (int)Math.Floor((float)y / ChunkSize)
                        );
                    Chunk chunk;
                    if (!mm.chunks.TryGetValue(chunkPos, out chunk))
                    {
                        if (value.IsSpace)
                        {
                            return;
                        }
                        else
                        {
                            mm.chunks[chunkPos] = chunk = new Chunk();
                        }
                    }

                    int  index   = (y - chunkPos.Y * ChunkSize) * ChunkSize + (x - chunkPos.X * ChunkSize);
                    Tile oldTile = chunk.Tiles[index];
                    if (oldTile == value)
                    {
                        return;
                    }

                    chunk.Tiles[index] = value;
                    var tileRef = new TileRef(mm, x, y, chunk, index);

                    if (mm.TileChanged != null)
                    {
                        mm.TileChanged(tileRef, oldTile);
                    }

                    if (!mm.suppressNetworkUpdatesOnTileChanged)
                    {
                        mm.NetworkUpdateTile(tileRef);
                    }
                }
            }
Пример #13
0
        public void AttachToTile(TileRef tilePos)
        {
            var transComp = Owner.GetComponent <TransformComponent>(ComponentFamily.Transform);

            if (transComp != null)
            {
                transComp.Position = new Vector2f(tilePos.X + 0.5f, tilePos.Y + 0.5f);
            }
        }
Пример #14
0
        public ReagentUnit TileReact(TileRef tile, ReagentPrototype reagent, ReagentUnit reactVolume)
        {
            if (reactVolume < 5 || !tile.TryGetPuddle(null, out _))
            {
                return(ReagentUnit.Zero);
            }

            return(tile.SpillAt(new Solution(reagent.ID, reactVolume), "PuddleSmear", true, false) != null ? reactVolume : ReagentUnit.Zero);
        }
Пример #15
0
 static void ErrorLogger(TileRef tile, Exception ex)
 {
     if (_output != null)
     {
         lock (_errorLoggerLock)
         {
             _output.WriteLine(tile.Serialize());
         }
     }
 }
Пример #16
0
        private void CreateNode(TileRef tile, PathfindingChunk?parent = null)
        {
            parent ??= this;

            var node    = new PathfindingNode(parent, tile);
            var offsetX = tile.X - Indices.X;
            var offsetY = tile.Y - Indices.Y;

            _nodes[offsetX, offsetY] = node;
        }
 public static void writeTile(this IValueWriter writer, TileRef tile)
 {
     writer.WriteInt32((int)tile.ter);
     writer.WriteInt32(tile.resources.Count);
     foreach (var(resource, amount) in tile.resources)
     {
         writer.WriteInt32(resource);
         writer.WriteInt64(amount);
     }
 }
Пример #18
0
        /*
         * private void HandleTurfClick(NetIncomingMessage message)
         * {
         *  // Who clicked and on what tile.
         *  Atom.Atom clicker = SS13Server.Singleton.playerManager.GetSessionByConnection(message.SenderConnection).attachedAtom;
         *  short x = message.ReadInt16();
         *  short y = message.ReadInt16();
         *
         *  if (Vector2.Distance(clicker.position, new Vector2(x * tileSpacing + (tileSpacing / 2), y * tileSpacing + (tileSpacing / 2))) > 96)
         *  {
         *      return; // They were too far away to click us!
         *  }
         *  bool Update = false;
         *  if (IsSaneArrayPosition(x, y))
         *  {
         *      Update = tileArray[x, y].ClickedBy(clicker);
         *      if (Update)
         *      {
         *          if (tileArray[x, y].tileState == TileState.Dead)
         *          {
         *              Tiles.Atmos.GasCell g = tileArray[x, y].gasCell;
         *              Tiles.Tile t = GenerateNewTile(x, y, tileArray[x, y].tileType);
         *              tileArray[x, y] = t;
         *              tileArray[x, y].gasCell = g;
         *          }
         *          NetworkUpdateTile(x, y);
         *      }
         *  }
         * }*/// TODO HOOK ME BACK UP WITH ENTITY SYSTEM

        public void NetworkUpdateTile(TileRef tile)
        {
            NetOutgoingMessage message = IoCManager.Resolve <ISS14NetServer>().CreateMessage();

            message.Write((byte)NetMessage.MapMessage);
            message.Write((byte)MapMessage.TurfUpdate);

            message.Write((int)tile.X);
            message.Write((int)tile.Y);
            message.Write((uint)tile.Tile);
            IoCManager.Resolve <ISS14NetServer>().SendToAll(message);
        }
Пример #19
0
 public bool InBounds(TileRef tile)
 {
     if (tile.X < _indices.X || tile.Y < _indices.Y)
     {
         return(false);
     }
     if (tile.X >= _indices.X + ChunkSize || tile.Y >= _indices.Y + ChunkSize)
     {
         return(false);
     }
     return(true);
 }
        public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume)
        {
            var spillSystem = EntitySystem.Get <SpillableSystem>();

            if (reactVolume < 5 || !spillSystem.TryGetPuddle(tile, out _))
            {
                return(FixedPoint2.Zero);
            }

            return(spillSystem.SpillAt(tile, new Solution(reagent.ID, reactVolume), "PuddleSmear", true, false, true) != null
                ? reactVolume
                : FixedPoint2.Zero);
        }
    private void ReleaseToFloor(EntityCoordinates clickLocation, AbsorbentComponent absorbent, Solution?absorbedSolution)
    {
        if ((_mapManager.TryGetGrid(clickLocation.GetGridUid(EntityManager), out var mapGrid)) && // needs valid grid
            absorbedSolution is not null)    // needs a solution to place on the tile
        {
            TileRef tile = mapGrid.GetTileRef(clickLocation);

            // Drop some of the absorbed liquid onto the ground
            var releaseAmount    = FixedPoint2.Min(absorbent.ResidueAmount, absorbedSolution.CurrentVolume);        // The release amount specified on the absorbent component, or the amount currently absorbed (whichever is less).
            var releasedSolution = _solutionSystem.SplitSolution(absorbent.Owner, absorbedSolution, releaseAmount); // Remove releaseAmount of solution from the absorbent component
            _spillableSystem.SpillAt(tile, releasedSolution, puddlePrototypeId);                                    // And spill it onto the tile.
        }
    }
Пример #22
0
    public bool TryGetPuddle(TileRef tileRef, [NotNullWhen(true)] out PuddleComponent?puddle)
    {
        foreach (var entity in _entityLookup.GetEntitiesIntersecting(tileRef))
        {
            if (EntityManager.TryGetComponent(entity, out PuddleComponent? p))
            {
                puddle = p;
                return(true);
            }
        }

        puddle = null;
        return(false);
    }
Пример #23
0
 public PathfindingNode(PathfindingChunk parent, TileRef tileRef, List <int> collisionLayers = null)
 {
     _parentChunk = parent;
     TileRef      = tileRef;
     if (collisionLayers == null)
     {
         CollisionLayers = new List <int>();
     }
     else
     {
         CollisionLayers = collisionLayers;
     }
     GenerateMask();
 }
    public bool TryGetPuddle(TileRef tileRef, [NotNullWhen(true)] out PuddleComponent?puddle)
    {
        foreach (var entity in tileRef.GetEntitiesInTileFast(_gridTileLookupSystem))
        {
            if (EntityManager.TryGetComponent(entity, out PuddleComponent? p))
            {
                puddle = p;
                return(true);
            }
        }

        puddle = null;
        return(false);
    }
Пример #25
0
    private void Awake()
    {
        health         = GetComponent <Health>();
        mc             = GetComponent <MovementController>();
        ic             = GetComponent <InputController>();
        itemController = GetComponent <ItemController>();

        if (colliderGo == null)
        {
            colliderGo = GetComponentInChildren <Collider2D>().gameObject;
        }
        tileRef = GetComponent <TileRef>();
        Initialize(this);
    }
Пример #26
0
        public static bool TryGetPuddle(this TileRef tileRef, GridTileLookupSystem?gridTileLookupSystem, [NotNullWhen(true)] out PuddleComponent?puddle)
        {
            foreach (var entity in tileRef.GetEntitiesInTileFast(gridTileLookupSystem))
            {
                if (entity.TryGetComponent(out PuddleComponent? p))
                {
                    puddle = p;
                    return(true);
                }
            }

            puddle = null;
            return(false);
        }
        public static float OctileDistance(TileRef endTile, TileRef startTile)
        {
            // "Fast Euclidean" / octile.
            // This implementation is written down in a few sources; it just saves doing sqrt.
            int dstX = Math.Abs(startTile.X - endTile.X);
            int dstY = Math.Abs(startTile.Y - endTile.Y);

            if (dstX > dstY)
            {
                return(1.4f * dstY + (dstX - dstY));
            }

            return(1.4f * dstX + (dstY - dstX));
        }
Пример #28
0
        /*
         * private void HandleTurfClick(NetIncomingMessage message)
         * {
         *  // Who clicked and on what tile.
         *  Atom.Atom clicker = SS13Server.Singleton.playerManager.GetSessionByConnection(message.SenderConnection).attachedAtom;
         *  short x = message.ReadInt16();
         *  short y = message.ReadInt16();
         *
         *  if (Vector2.Distance(clicker.position, new Vector2(x * tileSpacing + (tileSpacing / 2), y * tileSpacing + (tileSpacing / 2))) > 96)
         *  {
         *      return; // They were too far away to click us!
         *  }
         *  bool Update = false;
         *  if (IsSaneArrayPosition(x, y))
         *  {
         *      Update = tileArray[x, y].ClickedBy(clicker);
         *      if (Update)
         *      {
         *          if (tileArray[x, y].tileState == TileState.Dead)
         *          {
         *              Tiles.Atmos.GasCell g = tileArray[x, y].gasCell;
         *              Tiles.Tile t = GenerateNewTile(x, y, tileArray[x, y].tileType);
         *              tileArray[x, y] = t;
         *              tileArray[x, y].gasCell = g;
         *          }
         *          NetworkUpdateTile(x, y);
         *      }
         *  }
         * }*/// TODO HOOK ME BACK UP WITH ENTITY SYSTEM

        private static void NetworkUpdateTile(TileRef tile)
        {
            var net     = IoCManager.Resolve <IServerNetManager>();
            var message = net.CreateNetMessage <MsgMap>();

            message.MessageType = MapMessage.TurfUpdate;
            message.SingleTurf  = new MsgMap.Turf
            {
                X    = tile.X,
                Y    = tile.Y,
                Tile = (uint)tile.Tile
            };

            net.ServerSendToAll(message);
        }
Пример #29
0
        public void Test_TileRef_Serialization()
        {
            var tr  = new TileRef("abc", 1, 2, 3);
            var str = tr.Serialize();

            Assert.Equal("1/2/3/abc", str);

            var tr2 = TileRef.Parse(str);

            Assert.NotNull(tr2);
            Assert.Equal(1, tr2.Value.Row);
            Assert.Equal(2, tr2.Value.Col);
            Assert.Equal(3, tr2.Value.Scale);
            Assert.Equal("abc", tr2.Value.GroupName);
        }
        public static TileRef readTile(this IValueReader reader)
        {
            var tile = new TileRef();

            tile.ter = (Map.Terrain)reader.ReadInt32();
            var resourceCount = reader.ReadInt32();

            tile.resources = new List <(int, long)>(resourceCount);
            for (var i = 0; i < resourceCount; i++)
            {
                tile.resources.Add((reader.ReadInt32(), reader.ReadInt64()));
            }

            return(tile);
        }
 public static Boolean IsValidTreeRootTile(TileRef tile)
 {
     return (tile.Active && (tile.Type == 2 || tile.Type == 23 || tile.Type == 60));
 }