Example #1
0
 void monsterEngine_MonsterAttack(object sender, MonsterAttackInfoEventArgs e)
 {
     if (MonsterAttack != null)
     {
         MonsterAttack(sender, e);
     }
 }
Example #2
0
 void monsterEngine_MonsterAttack(object sender, MonsterAttackInfoEventArgs e)
 {
     if (MonsterAttack != null)
         MonsterAttack(sender, e);
 }
Example #3
0
        void mapEngine_MonsterAttack(object sender, MonsterAttackInfoEventArgs e)
        {
            MonsterAI monsterAI = sender as MonsterAI;
            MapEngine mapEngine = GetMapEngine(monsterAI.Monster.MapID);
            Client[] clients = GetClientsForChars(mapEngine.GetCharactersInRange(monsterAI.Monster.Position, 150).ToArray());
            BaseEntity Target = e.Info.Target;
            Character ch = null;
            Pet pet = null;
            Client c = null;
            if (Target == null)
            {
                monsterAI.Monster.Attacking = false;
                monsterAI.Monster.Target = null;
                return;
            }

            if (Target is Character)
            {
                ch = Target as Character;
                c = GetClientByCharacterID(ch.CharacterId);
            }
            if (Target is Pet)
            {
                pet = Target as Pet;
                c = GetClientByCharacterID(pet.OwnerID);
            }

            if (ch != null && ch.Alive && monsterAI.Monster.Alive)
            {
                AttackInfo atk = ch.OnAttack(monsterAI.Monster);
                if (atk != null)
                {
                    byte[] SendTargetHealMana = PacketManager.SendHealMana(ch.MaxHp, ch.CurrentHp, ch.MaxMana, ch.CurrentMana, 0);
                    c.Send(SendTargetHealMana);

                    byte[] SendAttack1 = PacketManager.SendAttack1(atk);
                    SendToClients(SendAttack1, clients);

                    byte[] SendAttack2 = PacketManager.SendAttack2(atk, c.MyCharacter);
                    SendToClients(SendAttack2, clients);

                    if (atk.DoRefDamage && !atk.Dead)
                    {
                        BaseSkill skill = c.MyCharacter.FindSkill((int)HardSkills.Reflection);
                        CastSkillInfo RefInfo = monsterAI.Monster.OnCast(c.MyCharacter, skill);
                        RefInfo.CasterType = 1;

                        byte[] SendRefdamage = PacketManager.SendCast2(skill, RefInfo, monsterAI.Monster);
                        SendToClients(SendRefdamage, clients);

                        if (RefInfo.Dead)
                        {
                            CharacterGainExperience(c, monsterAI.Monster, c.MyCharacter, false);

                            MonsterDropItem(monsterAI.Monster, c.MyCharacter);

                            byte[] SendMonsterDie = PacketManager.SendMonsterDie(monsterAI.Monster);
                            SendToClients(SendMonsterDie, clients);
                        }
                    }

                    if (atk.PetDamaged)
                    {
                        if (c.MyCharacter.tempPet != null)
                        {
                            byte[] SendPetHealth = PacketManager.SendPetHealth(c.MyCharacter.tempPet);
                            c.Send(SendPetHealth);

                            if (atk.PetDied)
                            {
                                BaseSkill skill = new BaseSkill();
                                if (c.MyCharacter.RemoveActiveSkill((int)HardSkills.Shadow_Strike))
                                {
                                    skill.SkillID = (int)HardSkills.Shadow_Strike;
                                    skill.SkillLevel = 1;
                                    c.Send(PacketManager.SendEndSkill(c.MyCharacter, skill));
                                }
                                if (c.MyCharacter.RemoveActiveSkill((int)AbsorbSkills.Shadow_Focus))
                                {
                                    skill.SkillID = (int)AbsorbSkills.Shadow_Focus;
                                    skill.SkillLevel = 1;
                                    c.Send(PacketManager.SendEndSkill(c.MyCharacter, skill));
                                }
                                if (c.MyCharacter.RemoveActiveSkill((int)RebirthSkills.Duplicate_Attack))
                                {
                                    skill.SkillID = (int)RebirthSkills.Duplicate_Attack;
                                    skill.SkillLevel = 1;
                                    c.Send(PacketManager.SendEndSkill(c.MyCharacter, skill));
                                }

                                byte[] RemovePet = PacketManager.SendMonsterDie(c.MyCharacter.tempPet);
                                SendToClients(RemovePet, clients);

                                c.MyCharacter.tempPet = null;
                            }
                        }
                    }

                    if (atk.Dead)
                    {
                        mapEngine.ActiveClientEntities.Remove(c.MyCharacter);
                        byte[] SendPlayerDead = PacketManager.SendPlayerDie(c.MyCharacter);
                        SendToClients(SendPlayerDead, clients);
                    }

                    monsterAI.Monster.LastAttack = DateTime.Now;
                }
            }
            else if (pet != null && pet.Alive && monsterAI.Monster.Alive)
            {
                AttackInfo atk = pet.OnAttack(monsterAI.Monster);
                if (atk != null)
                {
                    byte[] SendPetHealth = PacketManager.SendPetHealth(pet);
                    c.Send(SendPetHealth);

                    byte[] SendAttack1 = PacketManager.SendAttack1(atk);
                    SendToClients(SendAttack1, clients);

                    byte[] SendAttack2 = PacketManager.SendAttack2(atk, Target);
                    SendToClients(SendAttack2, clients);

                    if (atk.Dead)
                    {
                        byte[] SendPetDie = PacketManager.SendMonsterDie(pet);
                        SendToClients(SendPetDie, clients);

                        pet.Alive = false;
                        petManager.UpdatePet(pet);
                        c.MyCharacter.Pet = null;
                        mapEngine.ActiveClientEntities.Remove(pet);
                    }

                    monsterAI.Monster.LastAttack = DateTime.Now;
                }
            }
        }