示例#1
0
        private AbstractLoadedMapleLife LoadLife(IMapleData life, string id, string type)
        {
            var myLife = MapleLifeFactory.GetLife(int.Parse(id), type);

            myLife.Cy = MapleDataTool.GetInt(life.GetChildByPath("cy"));
            var dF = life.GetChildByPath("f");

            if (dF != null)
            {
                myLife.F = MapleDataTool.GetInt(dF);
            }
            myLife.Fh  = MapleDataTool.GetInt(life.GetChildByPath("fh"));
            myLife.Rx0 = MapleDataTool.GetInt(life.GetChildByPath("rx0"));
            myLife.Rx1 = MapleDataTool.GetInt(life.GetChildByPath("rx1"));
            var x = MapleDataTool.GetInt(life.GetChildByPath("x"));
            var y = MapleDataTool.GetInt(life.GetChildByPath("y"));

            myLife.Position = new Point(x, y);

            var hide = MapleDataTool.GetInt("hide", life, 0);

            if (hide == 1)
            {
                myLife.IsHide = true;
            }
            else if (hide > 1)
            {
                Console.WriteLine("Hide > 1 ({0})", hide);
            }
            return(myLife);
        }
示例#2
0
        private AbstractLoadedMapleLife LoadLife(int id, int f, bool hide, int fh, int cy, int rx0, int rx1, int x,
                                                 int y, string type)
        {
            var myLife = MapleLifeFactory.GetLife(id, type);

            myLife.Cy       = cy;
            myLife.F        = f;
            myLife.Fh       = fh;
            myLife.Rx0      = rx0;
            myLife.Rx1      = rx1;
            myLife.Position = new Point(x, y);
            myLife.IsHide   = hide;
            return(myLife);
        }
示例#3
0
        public MapleCharacter KillBy(MapleCharacter killer)
        {
            long totalBaseExpL;

            // update exp
            //if (killer.inTutorialMap())
            //{
            //    totalBaseExpL = Stats.Exp*killer.Client.ChannelServer.ExpRate; /** killer.hasEXPCard();*/
            //}
            //else
            //{
            totalBaseExpL = Stats.Exp * killer.Client.ChannelServer.ExpRate;
            /** killer.getClient().getPlayer().hasEXPCard();*/
            //}

            var            totalBaseExp = (int)Math.Min(int.MaxValue, totalBaseExpL);
            IAttackerEntry highest      = null;
            var            highdamage   = 0;

            foreach (var attackEntry in m_attackers)
            {
                if (attackEntry.GetDamage() > highdamage)
                {
                    highest    = attackEntry;
                    highdamage = attackEntry.GetDamage();
                }
            }

            foreach (var attackEntry in m_attackers)
            {
                var baseExp = (int)Math.Ceiling(totalBaseExp * ((double)attackEntry.GetDamage() / MaxHp));
                attackEntry.KilledMob(killer.Map, baseExp, attackEntry == highest);
            }

            if (GetController() != null)
            {
                // this can/should only happen when a hidden gm attacks the monster
                GetController().Client.Send(PacketCreator.StopControllingMonster(ObjectId));
                GetController().StopControllingMonster(this);
            }
            if (IsBoss)
            {
                //killer.finishAchievement(6);
            }

            var toSpawn = Stats.Revives;

            var canSpawn = true;

            if (EventInstanceManager != null)
            {
                if (EventInstanceManager.Name.IndexOf("BossQuest", 0, StringComparison.Ordinal) != -1)
                {
                    canSpawn = false;
                }
            }

            if (toSpawn != null && canSpawn)
            {
                var reviveMap = killer.Map;

                TimerManager.Instance.RunOnceTask(() =>
                {
                    foreach (var mid in toSpawn)
                    {
                        var mob = MapleLifeFactory.GetMonster(mid);
                        EventInstanceManager?.RegisterMonster(mob);
                        mob.Position = Position;
                        //if (dropdisabled)
                        //    mob.dropdisabled;
                        reviveMap.SpawnRevives(mob);
                    }
                }, Stats.GetAnimationTime("die1"));
            }
            if (EventInstanceManager != null)
            {
                //EventInstanceManager.unregisterMonster(this);
            }
            foreach (var listener in Listeners)
            {
                var arg = new MonsterKilledEventArgs {
                    Monster = this, HighestDamageChar = m_highestDamageChar
                };
                listener(this, arg);
            }
            var ret = m_highestDamageChar;

            m_highestDamageChar = null; // may not keep hard references to chars outside of PlayerStorage or MapleMap
            return(ret);
        }
示例#4
0
        public void ApplyEffect(MapleCharacter player, MapleMonster monster, bool skill)
        {
            MonsterStatus?monStat = null;
            MapleDisease? disease = null;
            var           heal    = false;
            var           dispel  = false;
            var           banish  = false;

            switch (SkillId)
            {
            case 100:
            case 110:
                monStat = MonsterStatus.WeaponAttackUp;
                break;

            case 101:
            case 111:
                monStat = MonsterStatus.MagicAttackUp;
                break;

            case 102:
            case 112:
                monStat = MonsterStatus.WeaponDefenseUp;
                break;

            case 103:
            case 113:
                monStat = MonsterStatus.MagicDefenseUp;
                break;

            case 114:     // Heal
                heal = true;
                break;

            case 120:
                disease = MapleDisease.Seal;
                break;

            case 121:
                disease = MapleDisease.Darkness;
                break;

            case 122:
                disease = MapleDisease.Weaken;
                break;

            case 123:
                disease = MapleDisease.Stun;
                break;

            case 124:
                disease = MapleDisease.Curse;
                break;

            case 125:
                //disease = MapleDisease.POISON;
                break;

            case 126:
                disease = MapleDisease.Slow;
                break;

            case 127:
                dispel = true;
                break;

            case 128:     // Seduce
                if (MakeChanceResult())
                {
                    // HT is 100%, yet some others mobs aren't - we can handle those later
                    var htSquad = player.Client.ChannelServer.GetMapleSquad(MapleSquadType.Horntail);
                    if (htSquad != null && htSquad.ContainsMember(player))
                    {
                        var i = 0;
                        foreach (var htMember in htSquad.Members)
                        {
                            if (htMember.IsAlive && htMember.Map == player.Map)
                            {
                                if (i < Count)
                                {
                                    htMember.GiveDebuff(MapleDisease.Seduce, this);
                                    i++;
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
                break;

            case 129:     // Banish
                if (Lt != Point.Empty && Rb != Point.Empty && skill)
                {
                    foreach (var chr in GetPlayersInRange(monster, player))
                    {
                        chr.ChangeMapBanish(monster.Stats.Banish.MapId, monster.Stats.Banish.Portal,
                                            monster.Stats.Banish.Msg);
                    }
                }
                else
                {
                    player.ChangeMapBanish(monster.Stats.Banish.MapId, monster.Stats.Banish.Portal,
                                           monster.Stats.Banish.Msg);
                }
                break;

            case 131:     // Poison Mist
                // TODO: make this work
                break;

            case 140:
                if (MakeChanceResult() && !monster.MonsterBuffs.Contains(MonsterStatus.MagicImmunity))
                {
                    monStat = MonsterStatus.WeaponImmunity;
                }
                break;

            case 141:
                if (MakeChanceResult() && !monster.MonsterBuffs.Contains(MonsterStatus.WeaponImmunity))
                {
                    monStat = MonsterStatus.MagicImmunity;
                }
                break;

            case 200:
                var canSpawn = true;
                //if (player.getEventInstance() != null)
                //{
                //    if (player.getEventInstance().getName().indexOf("FoJ", 0) != -1)
                //    {
                //        canSpawn = false;
                //    }
                //    else if (player.getEventInstance().getName().indexOf("BossQuest", 0) != -1 && monster.getId() == 8500001)
                //    {
                //        canSpawn = false;
                //    }
                //}
                if (monster.Map.SpawnedMonstersOnMap.Value < 50 && canSpawn)
                {
                    foreach (var mobId in ToSummon)
                    {
                        var toSpawn = MapleLifeFactory.GetMonster(mobId);
                        toSpawn.Position = monster.Position;
                        var xpos = monster.Position.X;
                        var ypos = monster.Position.Y;
                        switch (mobId)
                        {
                        case 8500003:         // Pap bomb high
                            toSpawn.Fh = (int)Math.Ceiling(Randomizer.NextDouble() * 19.0);
                            ypos       = -590;
                            goto case 8500004;

                        case 8500004:         // Pap bomb
                            //Spawn between -500 and 500 from the monsters X position
                            xpos =
                                (int)(monster.Position.X + Math.Ceiling(Randomizer.NextDouble() * 1000.0) - 500);
                            if (ypos != -590)
                            {
                                ypos = monster.Position.Y;
                            }
                            break;

                        case 8510100:         //Pianus bomb
                            if (Math.Abs(Math.Ceiling(Randomizer.NextDouble() * 5) - 1) < Epsinon)
                            {
                                ypos = 78;
                                xpos = (int)(0 + Math.Ceiling(Randomizer.NextDouble() * 5)) +
                                       (Math.Abs(Math.Ceiling(Randomizer.NextDouble() * 2) - 1) < Epsinon
                                                   ? 180
                                                   : 0);
                            }
                            else
                            {
                                xpos =
                                    (int)
                                    (monster.Position.X + Math.Ceiling(Randomizer.NextDouble() * 1000.0) - 500);
                            }
                            break;
                        }
                        // Get spawn coordinates (This fixes monster lock)
                        // TODO get map left and right wall. Any suggestions? PM TheRamon
                        switch (monster.Map.MapId)
                        {
                        case 220080001:         //Pap map
                            if (xpos < -890)
                            {
                                xpos = (int)(-890 + Math.Ceiling(Randomizer.NextDouble() * 150));
                            }
                            else if (xpos > 230)
                            {
                                xpos = (int)(230 - Math.Ceiling(Randomizer.NextDouble() * 150));
                            }
                            break;

                        case 230040420:         // Pianus map
                            if (xpos < -239)
                            {
                                xpos = (int)(-239 + Math.Ceiling(Randomizer.NextDouble() * 150));
                            }
                            else if (xpos > 371)
                            {
                                xpos = (int)(371 - Math.Ceiling(Randomizer.NextDouble() * 150));
                            }
                            break;
                        }
                        toSpawn.Position = new Point(xpos, ypos);
                        monster.Map.SpawnMonsterWithEffect(toSpawn, SpawnEffect, toSpawn.Position);
                    }
                }
                break;
            }

            if (monStat != null || heal)
            {
                if (Lt != Point.Empty && Rb != Point.Empty && skill)
                {
                    var objects = GetObjectsInRange(monster, MapleMapObjectType.Monster);
                    if (heal)
                    {
                        foreach (var mons in objects)
                        {
                            ((MapleMonster)mons).Heal(X, Y);
                        }
                    }
                    else
                    {
                        foreach (var mons in objects)
                        {
                            if (!monster.MonsterBuffs.Contains(monStat.Value))
                            {
                                ((MapleMonster)mons).ApplyMonsterBuff(monStat.Value, X, SkillId, Duration, this);
                            }
                        }
                    }
                }
                else
                {
                    if (heal)
                    {
                        monster.Heal(X, Y);
                    }
                    else
                    {
                        if (!monster.MonsterBuffs.Contains(monStat.Value))
                        {
                            monster.ApplyMonsterBuff(monStat.Value, X, SkillId, Duration, this);
                        }
                    }
                }
            }

            if (disease != null || dispel || banish)
            {
                if (skill && Lt != Point.Empty && Rb != Point.Empty)
                {
                    var characters = GetPlayersInRange(monster, player);
                    foreach (var character in characters)
                    {
                        if (dispel)
                        {
                            character.Dispel();
                        }
                        else if (banish)
                        {
                            if (player.EventInstanceManager == null)
                            {
                                var to  = player.Map.ReturnMap;
                                var pto = to.GetPortal((short)(0 + 10 * Randomizer.NextDouble()));
                                character.ChangeMap(to, pto);
                            }
                        }
                        else
                        {
                            character.GiveDebuff(disease.Value, this);
                        }
                    }
                }
                else
                {
                    if (dispel)
                    {
                        player.Dispel();
                    }
                    else
                    {
                        player.GiveDebuff(disease.Value, this);
                    }
                }
            }
            monster.UsedSkill(SkillId, SkillLevel, Cooltime);
            monster.Mp -= MpCon;
        }