//WvsGame::MobPool-------------------------------------------------------------------------------------------- public static COutPacket MobEnterField(CMob mob) { var p = new COutPacket(SendOps.LP_MobEnterField); mob.EncodeInitData(p); return(p); }
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); }
/// <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(); } }
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()); } } } }
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); }
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); }
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); }
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); }
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); }
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; } } }
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); }
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); }
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.")); } }
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); }
public MobTemporaryStatCollection(CMob parent) { Parent = parent; }
/// <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); }
/// <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 }
public abstract override void OnMobDie(CMob removedMob);
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()); } } } }
protected override void Reset(bool bFromDispose = false) { CurSink = null; base.Reset(bFromDispose); }
public static void Add(CMob i) { MobsList[i.Id] = i; }
/// <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 }