Tous les collages #25741 Brut Modifier

Something

public text v1 · immuable
#25741 ·publié 2005-10-17 14:03 UTC
corps du collage affiché
//GameRegenItem.cs
//author : Dre


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>
	/// 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);
		}
	}
}