////////////////

        private void CreateCursedBrambleNearbyIf(Func <int, int, bool> validateAt)
        {
            if (!this.IsPlayerProducingBrambleWake)
            {
                return;
            }
            if (!this.CanCreateCursedBramblesThisTick())
            {
                return;
            }

            string timerName = CursedBramblesPlayer.TimerNameBase + "_" + this.player.whoAmI;

            Timers.SetTimer(timerName, this.BrambleWakeTickRate.Invoke(out _), false, () => {
                if (this.OldPosition != default)
                {
                    CursedBrambleTile.CreateNearbyIf(
                        worldPos: this.OldPosition,
                        radius: this.BrambleWakeRadius,
                        validateAt: validateAt,
                        sync: true
                        );
                }

                this.OldPosition = this.player.Center;
                return(false);
            });
        }
        ////

        private bool RunBloom()
        {
            if (this.Cooldown++ > 20)
            {
                this.Cooldown = 0;
            }
            else
            {
                return(false);
            }

            int           nearby;
            UnifiedRandom rand = TmlHelpers.SafelyGetRand();

            foreach (BrambleBloomTendril tendril in this.Tendrils.ToArray())
            {
                if (tendril.IsSplit())
                {
                    this.Tendrils.Add(tendril.CloneAsSplit());
                }

                (int x, int y)growAt = tendril.Grow();
                nearby = this.CountBramblesNear(growAt.x, growAt.y) + 1;

                if (nearby <= 1 || rand.NextFloat() < (1f - ((float)nearby / 10f)))
                {
                    CursedBrambleTile.CreateBrambleAt(growAt.x, growAt.y);
                }
            }

            return(true);
        }
        private static void UpdateBrambleErode()
        {
            var config  = CursedBramblesConfig.Instance;
            var myworld = ModContent.GetInstance <CursedBramblesWorld>();

            //

            float erodePercSec  = config.Get <float>(nameof(config.BrambleErodePercentChancePerSecond));
            float erodePercTick = erodePercSec / 60f;

            int brambleType = ModContent.TileType <CursedBrambleTile>();

            foreach ((int x, int y) in myworld.BramblesSnapshot.ToArray())
            {
                Tile tile = Framing.GetTileSafely(x, y);
                if (tile?.active() != true || tile.type != brambleType)
                {
                    myworld.BramblesSnapshot.Remove((x, y));

                    continue;
                }

                if (Main.rand.NextFloat() < erodePercTick)
                {
                    if (CursedBrambleTile.ErodeBrambleAt(x, y, Main.netMode == NetmodeID.Server))
                    {
                        myworld.BramblesSnapshot.Remove((x, y));
                    }
                }
            }
        }
Exemple #4
0
        private void RunCleanup(ref bool cleanupComplete)
        {
            int tileX = this.TileX;
            int tileY = this.TileY;
            int rad   = AmbushesMod.Config.AmbushEntrapmentRadius + AmbushesMod.Config.BrambleThickness + 1;
            IList <(int, int)> brambles = CursedBrambleTile.FindBrambles(tileX - rad, tileY - rad, tileX + rad, tileY + rad);

            if (brambles.Count > 0)
            {
                if (brambles.Count < 48)
                {
                    if (Main.netMode != 1)
                    {
                        foreach ((int x, int y) in brambles)
                        {
                            CursedBrambleTile.RemoveBrambleAt(x, y);
                        }
                    }

                    cleanupComplete = true;
                }
            }
            else
            {
                cleanupComplete = true;
            }

            if (cleanupComplete)
            {
                if (AmbushesMod.Config.DebugModeInfoBrambles)
                {
                    Main.NewText("Brambles at " + tileX + ", " + tileY + " cleaned up.");
                }
            }
        }
        ////////////////

        protected override bool OnActivate(int clearTileX, int clearTileY)
        {
            Main.NewText("Look out!", Color.Red);

            int radius = AmbushesMod.Config.AmbushEntrapmentRadius;
            IDictionary <int, ISet <int> > tileTrace = CursedBrambleTile.TraceTileWall(clearTileX, clearTileY, radius, this.IsHorizontal);

            CursedBrambleTile.CreateBramblesAt(tileTrace);

            return(true);
        }
Exemple #6
0
        ////

        private void RunErode()
        {
            if (Main.netMode == 1)
            {
                return;
            }

            int rad = AmbushesMod.Config.AmbushEntrapmentRadius + AmbushesMod.Config.BrambleThickness + 1;

            for (int i = 0; i < 120; i++)
            {
                CursedBrambleTile.ErodeRandomBrambleWithinRadius(this.TileX, this.TileY, rad);
            }
        }
Exemple #7
0
        ////////////////

        protected void CreateBrambleEnclosureIfEntrapping()
        {
            if (Main.netMode == 1)
            {
                return;
            }

            if (this.IsEntrapping)
            {
                int radius = AmbushesMod.Config.AmbushEntrapmentRadius;
                IDictionary <int, ISet <int> > tileTrace = CursedBrambleTile.TraceTileEnclosure(this.TileX, this.TileY, radius);

                CursedBrambleTile.CreateBramblesAt(tileTrace);
            }
        }
Exemple #8
0
        ////

        private void CreateCursedBrambleTrail(NPC npc)
        {
            int tileX     = (int)npc.Center.X / 16;
            int tileY     = (int)npc.Center.Y / 16;
            int thickness = npc.width > npc.height ? npc.width : npc.height;

            thickness = (int)Math.Ceiling((double)thickness / 16d);

            CursedBrambleTile.CreateBramblePatchAt(
                tileX: tileX,
                tileY: tileY,
                radius: thickness,
                densityPercent: 0.05f,
                validateAt: null,
                sync: Main.netMode == NetmodeID.Server
                );
        }
        public static void ApplyExternalEffectsIf(NPC npc)
        {
            if (Main.netMode == NetmodeID.MultiplayerClient)
            {
                return;
            }

            //

            var    mymod = EnragedMod.Instance;
            string uid   = NPCID.GetUniqueKey(npc.type);

            if (mymod.EnragedNpcHooks.ContainsKey(uid))
            {
                (bool isBramble, bool _)? behavior = mymod.EnragedNpcHooks[uid].Invoke(npc.whoAmI);
                if (behavior.HasValue && !behavior.Value.isBramble)
                {
                    return;
                }
            }

            //

            var   config    = EnragedConfig.Instance;
            int   thickness = config.Get <int>(nameof(EnragedConfig.EnragedBrambleTrailThickness));
            float density   = config.Get <float>(nameof(EnragedConfig.EnragedBrambleTrailDensity));

            if (thickness > 0 && density > 0f)
            {
                int created = CursedBrambleTile.CreateBramblePatchAt(
                    tileX: (int)npc.Center.X / 16,
                    tileY: (int)npc.Center.Y / 16,
                    radius: thickness,
                    densityPercent: density,
                    sync: true
                    );
            }
        }