using System; using System.Reflection; using DOL.Database; using DOL.Events; using DOL.GS; using DOL.GS.PacketHandler; using log4net; namespace DOL.GS.Scripts { /// /// Summary description for GameRegenItem. /// public class GameRegenItem : GameStaticItem { private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public RegionTimer RegenTimer; public int Percent; public ushort Radius; public uint Intervalle; //En 100ms public bool RegenHealth; public bool RegenEndu; public bool RegenMana; public DBRegen DBregen; #region Initialisation [GameServerStartedEvent] public static void OnScriptsCompiled(DOLEvent e, object sender, EventArgs args) { foreach(DBRegen DB in GameServer.Database.SelectAllObjects(typeof(DBRegen))) { GameRegenItem item = new GameRegenItem(); item.LoadFromDatabase(DB); item.AddToWorld(); } } #endregion public GameRegenItem() { } public override bool AddToWorld() { if(!base.AddToWorld ()) return false; if(RegenTimer != null) return true; RegenTimer = new RegionTimer(this, new RegionTimerCallback(RegenPlayers), 1000); RegenTimer.Start(1000); return true; } public override void LoadFromDatabase(DOL.Database.DataObject obj) { InternalID = obj.ObjectId; DBRegen regenDB = obj as DBRegen; X = regenDB.X; Y = regenDB.Y; Z = regenDB.Z; Heading = regenDB.Heading; CurrentRegionID = regenDB.Region; Name = regenDB.Name; Model = regenDB.Model; Emblem = regenDB.Emblem; Radius = regenDB.Radius; Percent = regenDB.Percent; Intervalle = regenDB.Intervalle; RegenHealth = regenDB.RegenHealth; RegenEndu = regenDB.RegenEndu; RegenMana = regenDB.RegenMana; DBregen = regenDB; RegenTimer = new RegionTimer(this, new RegionTimerCallback(RegenPlayers), 1000); RegenTimer.Start(1000); } public override void SaveIntoDatabase() { if(DBregen == null) { DBRegen regenDB = new DBRegen(); regenDB.X = X; regenDB.Y = Y; regenDB.Z = Z; regenDB.Heading = Heading; regenDB.Region = CurrentRegionID; regenDB.Name = Name; regenDB.Model = Model; regenDB.Emblem = Emblem; regenDB.ClassType = GetType().ToString(); regenDB.Intervalle = Intervalle; regenDB.Percent = Percent; regenDB.Radius = Radius; regenDB.RegenEndu = RegenEndu; regenDB.RegenHealth = RegenHealth; regenDB.RegenMana = RegenMana; GameServer.Database.AddNewObject(regenDB); InternalID = regenDB.ObjectId; DBregen = regenDB; return; } DBregen.X = X; DBregen.Y = Y; DBregen.Z = Z; DBregen.Heading = Heading; DBregen.Region = CurrentRegionID; DBregen.Name = Name; DBregen.Model = Model; DBregen.Emblem = Emblem; DBregen.ClassType = GetType().ToString(); DBregen.Intervalle = Intervalle; DBregen.Percent = Percent; DBregen.Radius = Radius; DBregen.RegenEndu = RegenEndu; DBregen.RegenHealth = RegenHealth; DBregen.RegenMana = RegenMana; GameServer.Database.SaveObject(DBregen); } public override void DeleteFromDatabase() { if(DBregen == null) { DBregen = (DBRegen)GameServer.Database.FindObjectByKey(typeof(DBRegen), InternalID); if (DBregen == null) return; } GameServer.Database.DeleteObject(DBregen); } public int RegenPlayers(RegionTimer timer) { if(Radius == 0) Radius = 400; if(Percent == 0) Percent = 100; //1% if(!RegenHealth && !RegenEndu && !RegenMana) return (int)(Intervalle*100); foreach(GamePlayer pl in GetPlayersInRadius(Radius)) { if(!pl.Sitting) continue; //Regen Vie if(RegenHealth) { if(pl.HealthPercent < 100) { int health = (pl.MaxHealth*Percent)/100; if(pl.Health + health > pl.MaxHealth) pl.Health = pl.MaxHealth; else pl.Health += health; } } //Regen Endu if(RegenEndu) { if(pl.EndurancePercent < 100) { int endu = (pl.MaxEndurance*Percent)/100; if(pl.Endurance + endu > pl.MaxEndurance) pl.Endurance = pl.MaxEndurance; else pl.Endurance += endu; } } //Regen Mana if(RegenMana) { if(pl.ManaPercent < 100) { int mana = (pl.MaxMana*Percent)/100; if(pl.Mana + mana > pl.MaxMana) pl.Mana = pl.MaxMana; else pl.Mana += mana; } } } return (int)(Intervalle*100); } } }