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; }
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(); } }