rendered paste bodyusing System;
using System.Reflection;
using DOL.Database;
using DOL.Events;
using DOL.GS;
using DOL.GS.PacketHandler;
using log4net;
namespace DOL.GS.Scripts
{
/// <summary>
/// Summary description for GameRegenItem.
/// </summary>
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);
}
}
}