예제 #1
0
        //WvsGame::MobPool--------------------------------------------------------------------------------------------
        public static COutPacket MobEnterField(CMob mob)
        {
            var p = new COutPacket(SendOps.LP_MobEnterField);

            mob.EncodeInitData(p);
            return(p);
        }
예제 #2
0
        public override bool OnMobDamaged(CMob mob, int nDamage)
        {
            if (MapId != 240060200 && MapId != 240060201)
            {
                return(true);
            }

            if (CurSink is null)
            {
                OnClockEnd();                 // bad :(
            }
            else
            {
                if (mob.nMobTemplateId != CurSink.nMobTemplateId)
                {
                    CurSink.Damage(mob.Controller, nDamage, 0);
                }
                else
                {
                    CurSink.BroadcastHP();
                }
            }

            return(false);
        }
예제 #3
0
 /// <summary>
 /// Is mainly used for child classes to control mob death events.
 /// If the mob is dead (<= 0 HP) then OnMobDead function is called.
 /// </summary>
 /// <param name="removedMob"></param>
 public virtual void OnMobDie(CMob removedMob)
 {
     if (removedMob.Dead)
     {
         removedMob.OnMobDead();
     }
 }
예제 #4
0
        public override void OnInsertMob(CMob mob)
        {
            if (IsStatue(mob.nMobTemplateId))
            {
                switch (mob.nMobTemplateId)
                {
                case FIRST_DUMMY_MOB:
                    remove(8820020, 8820024);                             // solomon
                    break;

                case 8820002:                         // ariel
                    remove(8820019);
                    break;

                case 8820003:                         // solomon
                case 8820015:
                    remove(8820020, 8820024);
                    break;

                case 8820004:                         // rex
                case 8820016:
                    remove(8820021, 8820025);
                    break;

                case 8820005:                         // hugin
                case 8820017:
                    remove(8820022, 8820026);
                    break;

                case 8820006:                         // munin
                case 8820018:
                    remove(8820023, 8820027);
                    break;
                }
            }
            else if (mob.nMobTemplateId >= FIRST_DAMAGE_SINK && mob.nMobTemplateId <= LAST_DAMAGE_SINK)
            {
                CurSink = mob;
            }

            void remove(params int[] mobids)
            {
                foreach (var _mob in Mobs)
                {
                    if (mobids.Contains(_mob.nMobTemplateId))
                    {
                        //Mobs.Remove(_mob);
                        _mob.Stats.HP = 0;                         // roundabout way of force-removing it in the next field update cycle
                        Broadcast(_mob.MakeLeaveFieldPacket());
                    }
                }
            }
        }
예제 #5
0
            public static COutPacket MobEnterField(CMob mob)
            {
                var p = new COutPacket(SendOps.LP_MobEnterField);

                p.Encode4(mob.dwId);
                p.Encode1(5);                 //  nCalcDamageIndex | Controller
                p.Encode4(mob.nMobTemplateId);

                //CMob::Init
                mob.EncodeInitData(p);

                return(p);
            }
예제 #6
0
        public static COutPacket MobLeaveField(CMob mob, byte nDeadType)
        {
            var p = new COutPacket(SendOps.LP_MobLeaveField);

            p.Encode4(mob.dwMobId);
            p.Encode1(nDeadType); // 0 = dissapear, 1 = fade out, 2+ = special

            if (nDeadType == 4)
            {
                p.Encode4(-1); //m_dwSwallowCharacterID
            }
            return(p);
        }
예제 #7
0
        public override bool OnMobDamaged(CMob mob, int nDamage)
        {
            if (IsStatue(mob.nMobTemplateId))
            {
                CurSink.Damage(CurSink.Controller, nDamage, 0);
            }
            else if (IsDamageSink(mob.nMobTemplateId))
            {
                return(true);
            }

            return(mob.nMobTemplateId == MORTAL_PB);
        }
예제 #8
0
            public static COutPacket MobLeaveField(CMob mob)
            {
                var p = new COutPacket(SendOps.LP_MobLeaveField);

                p.Encode4(mob.dwId);
                p.Encode1((byte)mob.LeaveFieldType);                 // 0 = dissapear, 1 = fade out, 2+ = special

                if (mob.LeaveFieldType == MobLeaveFieldType.MOBLEAVEFIELD_SWALLOW)
                {
                    p.Encode4(mob.m_dwSwallowCharacterID);
                }

                return(p);
            }
예제 #9
0
        public override void OnUserDamaged(Character pUser, CMob pMob, int nDamage)
        {
            // TODO override drop expiration timer with template dropExpire attribute (10 sec on this map)

            if (!aTeams.ContainsKey(pUser.dwId) && pUser.Account.AccountData.Admin <= 0)
            {
                pUser.Action.SetField(ReturnMapId);
                return;
            }

            var nItemID = (int)(aTeams[pUser.dwId] == BattlefieldData.BattlefieldTeams.Wolves
                                ? BattlefieldData.BattleItems.ShepherdBoysLunch
                                : BattlefieldData.BattleItems.FineWool);

            if (nItemID == (int)BattlefieldData.BattleItems.ShepherdBoysLunch && Constants.Rand.Next() % 100 > 10)
            {
                return;
            }

            if (nItemID == (int)BattlefieldData.BattleItems.FineWool)
            {
                if (aSheepPoints[pUser.dwId] > 0)
                {
                    if (--aSheepPoints[pUser.dwId] == 0)
                    {
                        ChangePlayerTeam(pUser.dwId, BattlefieldData.BattlefieldTeams.SheepNaked);
                        BroadcastNotice($"{pUser.Stats.sCharacterName} has lost all their wool!");
                    }
                }
                else
                {
                    return;                     // cant drop wool if u already dropped all of it
                }
            }

            var item = MasterManager.CreateItem(nItemID);

            var drop = new CDrop(pUser.Position.CurrentXY, 0)
            {
                Item   = item,
                ItemId = item.nItemID,
                QR     = pUser.dwId.ToString()
            };

            drop.Position.X = drop.StartPosX;
            drop.CalculateY(this, drop.StartPosY);

            Drops.Add(drop);
        }
예제 #10
0
        public void HandleCommand(string[] split)
        {
            switch (split[0])
            {
            case "snail":
            {
                var mob = new CMob(100101);
                mob.dwMobId           = 1337;
                mob.Position.Position = Character.Position.Position;
                mob.Position.Foothold = Character.Position.Foothold;


                var p1 = CPacket.MobEnterField(mob);

                var field = GetCharField();
                field.Broadcast(p1);

                SendPacket(CPacket.MobChangeController(mob, 1));
                break;
            }

            case "pos":
            {
                var msg = $"Map: {Character.Stats.dwPosMap} - {Character.Position}";
                SendPacket(CPacket.BroadcastPinkMsg(msg));
                break;
            }

            case "map":
            {
                var mapId = Convert.ToInt32(split[1]);
                SetField(mapId, 0, 0);
                break;
            }

            case "lvl":
            {
                Character.Stats.nLevel = Convert.ToByte(split[1]);
                break;
            }

            case "meso":
            {
                Character.Stats.nMoney = Convert.ToInt32(split[1]);
                break;
            }
            }
        }
예제 #11
0
            public static COutPacket MobChangeController(CMob mob, byte nLevel)
            {
                var p = new COutPacket(SendOps.LP_MobChangeController);

                p.Encode1(nLevel);                 // 0 = None | 1 = Control | 2 = Aggro
                p.Encode4(mob.dwId);

                if (nLevel > 0)
                {
                    p.Encode1(5);                     //  nCalcDamageIndex | Controller
                    p.Encode4(mob.nMobTemplateId);
                    mob.EncodeInitData(p);
                }

                return(p);
            }
예제 #12
0
        public static COutPacket MobChangeController(CMob mob, byte nLevel)
        {
            var p = new COutPacket(SendOps.LP_MobChangeController);

            p.Encode1(nLevel); // 1 = remove i think

            if (nLevel == 0)
            {
                p.Encode4(mob.dwMobId);
            }
            else
            {
                mob.EncodeInitData(p);
            }

            return(p);
        }
예제 #13
0
        public override void OnMobDie(CMob removedMob)
        {
            base.OnMobDie(removedMob);             // has to come first so the next sink has been spawned (revived)

            int nextSinkID;

            switch (removedMob.nMobTemplateId)
            {
            case 8810026:                     // first dummy mob -> normal
                nextSinkID = 8810018;
                break;

            case 8810130:                     // first dummy mob -> chaos
                nextSinkID = 8810118;
                break;

            case 8810118:                     // first chaos sink
            case 8810119:                     // second chaos sink
            case 8810120:                     // third chaos sink
            case 8810121:                     // fourth chaos sink (fifth is last one)
                nextSinkID = removedMob.nMobTemplateId + 1;
                break;

            default:
                nextSinkID = 0;
                CurSink    = null;
                break;
            }

            if (nextSinkID <= 0)
            {
                return;
            }

            CurSink = Mobs.FirstOrDefault(mob => mob.nMobTemplateId == nextSinkID);

            if (CurSink != null)
            {
                return;
            }

            BroadcastNotice($"An error has occurred. (Null sink {nextSinkID})");
            OnClockEnd();             // error
        }
        public override bool OnMobDamaged(CMob mob, int nDamage)
        {
            if (tLastBossHpSent.MillisSinceStart() <= 500)
            {
                return(false);
            }

            FinalBossHP -= nDamage;

            tLastBossHpSent = DateTime.Now;

            new FieldEffectPacket(FieldEffect.MobHPTag)
            {
                dwMobTemplateID = 3220000,
                nHP             = FinalBossHP,
                nMaxHP          = FinalBossMaxHP,
                nColor          = 3,
                nBgColor        = 5,
            }.Broadcast(this);

            return(false);            // return false to disable default mob HP tag broadcasting
        }
        public override void OnMobDie(CMob removedMob)
        {
            var gain = (Constants.Rand.Next() % 13 + (removedMob.MaxHp / MobExpDenominator)) * DungeonFieldIndex;             // TODO maybe do dungeon points instead?

            StageExp      += gain;
            CumulativeExp += gain;

            ForceWeatherEffect(5120017, $"Stage Exp Earned: {StageExp}  |  Cumulative Exp Earned: {CumulativeExp}");

            if (Mobs.Count > 1)
            {
                return;
            }

            GiveRewards();

            DungeonTimeSeconds = (int)tFieldTimerExpiration.SecondsUntilEnd();

            if (DungeonTimeSeconds < 0)
            {
                DungeonTimeSeconds = 0;
            }

            WarpToNextField = true;

            if (DungeonFieldIndex == 5)
            {
                BroadcastWZMapEffect(CLEAR_EFFECT);
                CreateFieldClock(15);                 // enough time to grab any loot that is on the ground
            }
            else
            {
                BroadcastWZMapEffect(CLEAR_EFFECT);
                CreateFieldClock(8);                 // enough time to grab any loot that is on the ground
                Broadcast(CPacket.SystemMessage("You have won favor in the eyes of the gods, prepare to be sent to the next stage."));
            }
        }
예제 #16
0
        public override void OnMobDie(CMob removedMob)
        {
            // copy pos for the dojo item drop
            var pos = removedMob.Position.CurrentXY.Clone();

            // no drops/mesos
            removedMob.bRewardsDistributed = true;

            // need to call this to override the above statement for exp
            removedMob.DistributeEXP();

            base.OnMobDie(removedMob);

            if (_bossMob != removedMob.nMobTemplateId)
            {
                return;
            }

            TryDropDojoItem(pos);

            UpdatePoints();

            FieldEffectPacket.BroadcastDojoEffect(this, FieldEffectTypes.DojoEffect.Clear);
        }
예제 #17
0
 public MobTemporaryStatCollection(CMob parent)
 {
     Parent = parent;
 }
예제 #18
0
 /// <summary>
 /// Not used in the base class, only used in certain child classes.
 /// Return true if mob HP bar should be displayed, otherwise return false.
 /// Mob has already been damaged when this function is called.
 /// </summary>
 /// <param name="mob">The damaged mob.</param>
 /// <param name="nDamage">Final damage done to mob.</param>
 /// <returns></returns>
 public virtual bool OnMobDamaged(CMob mob, int nDamage)
 {
     return(true);
 }
예제 #19
0
 /// <summary>
 /// Triggered when a player takes damage from a mob.
 /// Will not trigger from map damage or misses.
 /// </summary>
 /// <param name="pUser">Player taking damage</param>
 /// <param name="pMob">Mob damaging player</param>
 /// <param name="nDamage">Final damage amount that player took after any reductions</param>
 public virtual void OnUserDamaged(Character pUser, CMob pMob, int nDamage)
 {
     // not used in base class
 }
예제 #20
0
 public abstract override void OnMobDie(CMob removedMob);
예제 #21
0
        public override void OnMobDie(CMob removedMob)
        {
            // remove statues
            switch (removedMob.nMobTemplateId)
            {
            case FIRST_DUMMY_MOB:
                break;

            case SECOND_DUMMY_MOB:
                // do nothing
                break;

            case FIRST_DAMAGE_SINK:
                remove(8820020, 8820024);                         // solomon
                remove(8820021, 8820025);                         // rex
                break;

            case 8820011:                     // second
                remove(8820020, 8820024);     // solomon
                remove(8820021, 8820025);     // rex
                remove(8820022, 8820026);     // hugin
                break;

            case 8820012:                     // third
                remove(8820020, 8820024);     // solomon
                remove(8820021, 8820025);     // rex
                remove(8820022, 8820026);     // hugin
                remove(8820023, 8820027);     // munin
                break;

            case 8820013:                     // fourth
                remove(8820020, 8820024);     // solomon
                remove(8820021, 8820025);     // rex
                remove(8820022, 8820026);     // hugin
                remove(8820023, 8820027);     // munin
                remove(8820019);              // ariel
                break;

            case LAST_DAMAGE_SINK:
                CurSink = null;
                remove(IMMORTAL_PB);
                // remove immortal pb
                //var pb = Mobs.FirstOrDefault(mob => mob.nMobTemplateId == IMMORTAL_PB);
                //Mobs.Remove(pb);
                break;
            }

            if (removedMob.nMobTemplateId == MORTAL_PB)
            {
                base.OnMobDie(removedMob);                 // give rewards
            }
            else
            {
                removedMob.DistributeEXP();                 // they always give exp
            }

            void remove(params int[] mobids)
            {
                foreach (var _mob in Mobs)
                {
                    if (mobids.Contains(_mob.nMobTemplateId))
                    {
                        //Mobs.Remove(_mob);
                        _mob.Stats.HP = 0;                         // roundabout way of force-removing it in the next field update cycle
                        //Broadcast(_mob.MakeLeaveFieldPacket());
                    }
                }
            }
        }
예제 #22
0
 protected override void Reset(bool bFromDispose = false)
 {
     CurSink = null;
     base.Reset(bFromDispose);
 }
예제 #23
0
 public static void Add(CMob i)
 {
     MobsList[i.Id] = i;
 }
예제 #24
0
 /// <summary>
 /// Is called before a mob is inserted into the mob pool.
 /// </summary>
 /// <param name="mob"></param>
 public virtual void OnInsertMob(CMob mob)
 {
     // not used in base class
 }