public bool Update() { switch (nType) { case AffectedAreaType.UserSkill: foreach (var mob in Field.Mobs) { if (!rcArea.PointInRect(mob.Position.CurrentXY)) { continue; } mob.TryApplySkillDamageStatus (Field.Users[dwOwnerId], nSkillID, nSLV, 0); } break; case AffectedAreaType.BlessedMist: // TODO fix the recovery numbers, its incorrect rn { var rate = MasterManager.SkillTemplates[nSkillID].X(nSLV) * 0.01; foreach (var user in Field.Users) { if (!rcArea.PointInRect(user.Position.CurrentXY)) { continue; } user.Modify.Heal(0, (int)(user.BasicStats.nMMP * rate)); var effect = new UserEffectPacket(UserEffect.SkillAffected) { nSkillID = nSkillID, nSLV = nSLV, }; effect.BroadcastEffect(user); } } break; case AffectedAreaType.MobSkill: foreach (var user in Field.Users) { if (!rcArea.PointInRect(user.Position.CurrentXY)) { continue; } var toAdd = new Debuff(nSkillID, nSLV); toAdd.StatType = SecondaryStatFlag.Poison; toAdd.Generate(); user.Buffs.Remove(toAdd.nBuffID); user.Buffs.Add(toAdd); } break; } return(StartTime.MillisSinceStart() >= Duration); }