using System; using System.Collections.Generic; using System.Linq; using System.Text; using DuckEmulator.Security; using DuckEmulator.HabboHotel.Outside.Messages.Types; using System.Data; using DuckEmulator.HabboHotel.Inside.Storage.MySql.Database.Interfaces; namespace DuckEmulator.HabboHotel.Outside.Habbos.HabStructure { class UserEffects { private HabboData Habbo; internal SecurityList Effects; internal uint CurrentEffectId = 0; internal UserEffects(HabboData Habbo) { this.Habbo = Habbo; this.LoadEffects(); } internal void LoadEffects() { Effects = new SecurityList(); DataTable Data = null; using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.setQuery("SELECT * FROM user_effects WHERE user_id = '" + Habbo.Id + "'"); Data = Adapter.getTable(); } if (Data == null) return; foreach (DataRow Row in Data.Rows) { Effect Effect = new Effect((uint)Row["effect_id"], (int)Row["expire_time"], (string)Row["activated"],Habbo); Effects.Add(Effect); } } internal void AddEffect(uint EffectId, int ExpireTime) { if (EffectId <= 0) return; Effects.Add(new Effect(EffectId, ExpireTime, "",Habbo)); ServerMessage Message = new ServerMessage(461); Message.AppendUInt(EffectId); Message.AppendInt32(ExpireTime); Habbo.SendResponse(Message); using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.runFastQuery("INSERT INTO user_effects (user_id,effect_id,expire_time) VALUES ('" + Habbo.Id + "','" + EffectId + "','" + ExpireTime + "')"); } } internal void EnableEffect(uint EffectId) { if (!HasEffect(EffectId)) return; Effect Effect = GetEffect(EffectId); if (CurrentEffectId != EffectId) { ApplyEffect(EffectId); } ServerMessage Message = new ServerMessage(462); Message.AppendUInt(Effect.EffectId); Message.AppendInt32(Effect.ExpireTime); Habbo.SendResponse(Message); using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.runFastQuery("UPDATE user_effects SET activated = '" + DateTime.Now + "' WHERE user_id = '" + Habbo.Id + "' AND effect_id = '" + EffectId + "' LIMIT 1"); } } internal void CleanUpEffect(Effect Effect) { if (!Effects.Contains(Effect)) return; if (!Effect.Expired) return; ServerMessage Message = new ServerMessage(463); Message.AppendUInt(Effect.EffectId); Habbo.SendResponse(Message); Effects.Remove(Effect); if (CurrentEffectId > 0) { ApplyEffect(0); } using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.runFastQuery("DELETE FROM user_effects WHERE user_id = '" + Habbo.Id + "' AND effect_id = '" + Effect.EffectId + "' AND activated != '' LIMIT 1"); } } internal void ApplyEffect(uint EffectId) { if ((!HasEffect(EffectId) && EffectId > 0) || !Habbo.InRoom) return; if (Habbo.GetRoomUser() == null) return; CurrentEffectId = EffectId; ServerMessage Message = new ServerMessage(485); Message.AppendUInt(Habbo.GetRoomUser().VirtualId); if (EffectId > 0) { Message.AppendUInt(EffectId); } else if (EffectId <= 0) { Message.AppendInt32(-1); } Habbo.GetCurrentRoom().BroadcastResponse(Message); } internal ServerMessage Serialize() { ServerMessage Message = new ServerMessage(460); Message.AppendInt32(Effects.Count); foreach (Effect Effect in Effects) { Message.AppendUInt(Effect.EffectId); Message.AppendInt32(Effect.ExpireTime); Message.AppendBoolean(!Effect.Activated); Message.AppendInt32(Effect.TimeLeft); } return Message; } internal void CheckExpired() { foreach (Effect Effect in Effects) { if (Effect.Activated && Effect.Expired) { CleanUpEffect(Effect); } } } internal Effect GetEffect(uint EffectId) { foreach (Effect Effect in Effects) { if (Effect.EffectId == EffectId) { return Effect; } } return null; } internal Boolean HasEffect(uint EffectId) { return GetEffect(EffectId) != null; } } class Effect { internal uint EffectId; internal int ExpireTime = 360; internal string ActivatedTime; internal HabboData Habbo; internal Boolean Activated { get { DateTime parser = new DateTime(); return DateTime.TryParse(ActivatedTime, out parser); } } internal int TimeLeft { get { if (!Activated) { return -1; } var Diff = (ExpireTime - (int)(DateTime.Now - DateTime.Parse(ActivatedTime)).TotalSeconds); if (Diff >= ExpireTime) { return 0; } return (int)Diff; } } internal bool Expired { get { return TimeLeft != -1 && TimeLeft <= 0; } } internal Effect(uint Id, int ExpireTime, string ActivatedTime, HabboData Habbo) { this.EffectId = Id; this.ExpireTime = ExpireTime; this.ActivatedTime = ActivatedTime; this.Habbo = Habbo; } } }