Example #1
0
        private void Initialize()
        {
            ServerLogger.Log("Ragnarok Rebuild Zone Server, starting up!");


            DistanceCache.Init();
            DataManager.Initialize();

            world = new World();
            NetworkManager.Init(world);

            Profiler.Init(0.005f); //logs events for frames that take longer than 5ms

            Time.Start();

            GC.Collect();
            GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
        }
Example #2
0
        public void PerformMeleeAttack(CombatEntity target)
        {
#if DEBUG
            if (!target.IsValidTarget(this))
            {
                throw new Exception("Entity attempting to attack an invalid target! This should be checked before calling PerformMeleeAttack.");
            }
#endif
            if (Character.AttackCooldown + Time.DeltaTimeFloat + 0.005f < Time.ElapsedTimeFloat)
            {
                Character.AttackCooldown = Time.ElapsedTimeFloat + Stats.AttackMotionTime;                 //they are consecutively attacking
            }
            else
            {
                Character.AttackCooldown += Stats.AttackMotionTime;
            }

            Character.FacingDirection = DistanceCache.Direction(Character.Position, target.Character.Position);

            var atk1 = Stats.Atk;
            var atk2 = Stats.Atk2;
            if (atk1 <= 0)
            {
                atk1 = 1;
            }
            if (atk2 < atk1)
            {
                atk2 = atk1;
            }

            var damage = (short)GameRandom.Next(Stats.Atk, Stats.Atk2);

            var di = new DamageInfo()
            {
                Damage    = damage,
                HitCount  = 1,
                KnockBack = 0,
                Source    = Entity,
                Target    = target.Entity,
                Time      = Time.ElapsedTimeFloat + Stats.SpriteAttackTiming
            };

            //ServerLogger.Log($"{aiCooldown} {character.AttackCooldown} {angle} {dir}");

            Character.Map.GatherPlayersForMultiCast(ref Entity, Character);
            CommandBuilder.AttackMulti(Character, target.Character, di);
            CommandBuilder.ClearRecipients();

            target.QueueDamage(di);

            if (target.Character.Type == CharacterType.Monster && di.Damage > target.Stats.Hp)
            {
                var mon = target.Entity.Get <Monster>();
                mon.AddDelay(Stats.SpriteAttackTiming);                 //make sure it stops acting until it dies
            }

            if (Character.Type == CharacterType.Player && di.Damage > target.Stats.Hp)
            {
                var player = Entity.Get <Player>();
                player.ClearTarget();
            }
        }