Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
BorizzK

Охлаждение еды и кастрюли после готовки

Recommended Posts

Posted (edited)

Довольно тупое охлаждение жратвы и кастрюли если они оказались на земле

Прикрутить охлаждение содержимого кастрюли как 2 байта сами знаете что

Сделать охлаждение после снятия с костра и тп вобщем то же не проблема

 

Просто код и ничего лишнего

 

Комментарии к коду добавлю позже
Логгирование в коде закомментировано - раскомментируйте, что бы наблюдать за процессом

 

Для жратвы убавление температуры раз в 10 сек на 1 градус

Для кастрюли на 2 градуса

 

Охлаждается до дневной температуры воздуха далее охлаждение прекращается

У бгемотов есть 2 температуры воздуха - дневная и ночная

Идиотизм? Однозначно

Я пытался в погоде сделать ее плавное изменение в зависимости от Overcast, Rain и тп, но забил - потом как-нибудь

 

Есть вопросы, задавайте, отвечу если будет время.

 

Вобщем как-то так:
 

//08.05.2020

modded class ItemBase extends InventoryItem
{
	ref Timer m_TemperatureDecrease;

	private float m_InitTemperature;
	private float m_DecreaseTempTime 	= 10;
	private float m_TempDecreaseCoef	= -1;

	void ItemBase()
	{
		m_InitTemperature = 12; //g_Game.GetMission().GetWorldData().GetDayTemperature(); // Не работает ((( какого художника - я хз
		if ( IsInherited(Pot) /* GetInventory().GetCargo() */ )
		{
			m_TempDecreaseCoef = -2;
		}
	}

	override void AfterStoreLoad()
	{	
		super.AfterStoreLoad();

		if (!IsInherited(FireplaceBase)) TryToStartTempDecrease();
	}

	private void TryToStartTempDecrease()
	{
		if (GetTemperature() > GetInitTemperature())
		{
			if (!GetHierarchyParent())
			{
				if (!m_TemperatureDecrease)
				{
					Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: Init: TryToStartTempDecrease: this: " + this + ": GetHierarchyParent(): " + GetHierarchyParent() + ": GetTemperature(): " + GetTemperature());
					StartTemperatureDecrease();
				}
			}
		}
	}

	override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
	{
		super.EEItemLocationChanged(oldLoc,newLoc);
		
		//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": newLoc.GetType(): " + newLoc.GetType() + ": newLoc.GetParent(): " + newLoc.GetParent() + ": GetTemperature(): " + GetTemperature());
		if (GetTemperature() > GetInitTemperature())
		{
			if (!newLoc.GetParent() || newLoc.GetType() == InventoryLocationType.GROUND)
			{
				if (!m_TemperatureDecrease)
				{
					Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": Begin decrease temperature: GetTemperature(): " + GetTemperature());
					StartTemperatureDecrease();
				}
			}
		}
		else
		{
			if (m_TemperatureDecrease)
			{
				Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": End decrease temperature: GetTemperature(): " + GetTemperature());
				StopTemperatureDecrease();
			}
		}
	}

	private void StartTemperatureDecrease()
	{
		m_TemperatureDecrease = new Timer( CALL_CATEGORY_SYSTEM );
		m_TemperatureDecrease.Run(m_DecreaseTempTime, this, "DecreaseTemperature", NULL, true);
	}
	
	private void StopTemperatureDecrease()
	{
		m_TemperatureDecrease.Stop();
		m_TemperatureDecrease = NULL;
	}

	void DecreaseTemperature()
	{
		if (GetTemperature() > GetInitTemperature())
		{
			AddTemperature(GetTempDecreaseCoef());
			if ( IsInherited(Pot) /* GetInventory().GetCargo() */)
			{
				DecreaseCargoTemperature();
			}
			Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: this: " + this + ": Decrease: GetTemperature(): " + GetTemperature());
		}
		else
		{
			SetTemperature(GetInitTemperature());
			StopTemperatureDecrease();
			Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: this: " + this + ": Stop decrease: GetTemperature(): " + GetTemperature());
		}
	}
	
	void DecreaseCargoTemperature()
	{
		ItemBase item;
		int item_count = GetInventory().GetCargo().GetItemCount();
		for (int i = 0; i < item_count; i++)
		{
			item = ItemBase.Cast(GetInventory().GetCargo().GetItem(i));
			if (item)
			{
				if (item.GetTemperature() > item.GetInitTemperature())
				{
					item.AddTemperature(item.GetTempDecreaseCoef());
					Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: this: " + this + ": Decrease: item: " + item + ":  item.GetTemperature(): " + item.GetTemperature());
				}
				else
				{
					item.SetTemperature(item.GetInitTemperature());
					Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: this: " + this + ": Stop decrease: item: " + item + ":  item.GetTemperature(): " + item.GetTemperature());
				}
			}
		}
	}
	
	float GetInitTemperature()
	{
		return m_InitTemperature;
	}

	float GetTempDecreaseCoef()
	{
		return m_TempDecreaseCoef;
	}
}

Немного переделал код

Теперь охлаждается все если оно имеет Т выше 12, а если это кастрюля с содержимым, то и ее содержимое

Получить Т воздуха в конструкторе не выходит потому указал руками

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites



Изменил немного код только что

Оставил коммменты и принты

Share this post


Link to post
Share on other sites

На днях выложу доработанную систему

Share this post


Link to post
Share on other sites

@BorizzK Не могу из-за этой чёртовой работы покопаться....
Но может проще-вещь нагревается на костре, значит скрипт не работает,если вещь  не на костре-остывает....

Share this post


Link to post
Share on other sites
Posted (edited)

Обновленный вариант с учетом дождя, а так же дамагом игроку если он что-то взял в руки

С коэффициентами  надо еще поиграться

Принты все закомменчены

 

//15.05.2020

modded class ItemBase extends InventoryItem
{
	ref Timer m_TemperatureDecrease;

	private float m_InitTemperature;
	private float m_DecreaseTempTime 		= 10;
	private float m_TempDecreaseCoef		= 1;
	private float m_TempDecreaseCoefPot		= 2;
	
	private float m_DamageTemperatureBorder = 54;
	private float m_TempDamageCoef			= 0.01;

	private int	m_CurrentLocation			= InventoryLocationType.UNKNOWN;

	void ItemBase()
	{
		m_InitTemperature = 20; //g_Game.GetMission().GetWorldData().GetDayTemperature(); // Не работает ((( какого художника - я хз
		if ( IsInherited(Pot) /* GetInventory().GetCargo() */ )
		{
			m_TempDecreaseCoef = m_TempDecreaseCoefPot;
		}
	}

	override void AfterStoreLoad()
	{	
		super.AfterStoreLoad();
		
		if ( !IsInherited(FireplaceBase) ) TryToStartTempDecrease();
	}

	private void TryToStartTempDecrease()
	{
		if (GetTemperature() > GetInitTemperature())
		{
			if (!GetHierarchyParent())
			{
				if (!m_TemperatureDecrease)
				{
					//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: TryToStartTempDecrease: this: " + this + ": GetHierarchyParent(): " + GetHierarchyParent() + ": GetTemperature(): " + GetTemperature());
					DecreaseTemperature();
					StartTemperatureDecrease();
				}
			}
			else if (GetHierarchyParent().IsInherited(PlayerBase))
			{
				PlayerBase player = PlayerBase.Cast(GetHierarchyParent());
				if (player)
				{
					if (player.GetHumanInventory().GetEntityInHands() == this)
					{
						m_CurrentLocation = InventoryLocationType.HANDS;
						//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: TryToStartTempDecrease: this: " + this + ": GetHierarchyParent(): " + GetHierarchyParent() + ": GetTemperature(): " + GetTemperature());
						DecreaseTemperature();
						StartTemperatureDecrease();
					}
				}
			}
		}
	}

	override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
	{
		super.EEItemLocationChanged(oldLoc,newLoc);
		
		//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": newLoc.GetType(): " + newLoc.GetType() + ": newLoc.GetParent(): " + newLoc.GetParent() + ": GetTemperature(): " + GetTemperature());

		if (GetTemperature() > GetInitTemperature())
		{
			if (!newLoc.GetParent() || newLoc.GetType() == InventoryLocationType.GROUND)
			{
				m_CurrentLocation = InventoryLocationType.GROUND;
				if (!m_TemperatureDecrease)
				{
					//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": GROUND: Begin decrease temperature: GetTemperature(): " + GetTemperature());
					DecreaseTemperature();
					StartTemperatureDecrease();
				}
			}
			else if (newLoc.GetParent() && newLoc.GetType() == InventoryLocationType.HANDS)
			{
				m_CurrentLocation = InventoryLocationType.HANDS;
				if (!m_TemperatureDecrease)
				{
					//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": HANDS: Begin decrease temperature: GetTemperature(): " + GetTemperature());
					DecreaseTemperature();
					StartTemperatureDecrease();
				}
			}
			else
			{
				m_CurrentLocation = InventoryLocationType.UNKNOWN;
			}
		}
		else
		{
			if (m_TemperatureDecrease)
			{
				//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": End decrease temperature: GetTemperature(): " + GetTemperature());
				StopTemperatureDecrease();
				m_CurrentLocation = InventoryLocationType.UNKNOWN;
			}
		}
	}

	private void StartTemperatureDecrease()
	{
		m_TemperatureDecrease = new Timer( CALL_CATEGORY_SYSTEM );
		m_TemperatureDecrease.Run(m_DecreaseTempTime, this, "DecreaseTemperature", NULL, true);
	}
	
	private void StopTemperatureDecrease()
	{
		m_TemperatureDecrease.Stop();
		m_TemperatureDecrease = NULL;
	}

	// == COOLING ==
	void DecreaseTemperature()
	{
		if (GetTemperature() > GetInitTemperature())
		{
			if (m_CurrentLocation == InventoryLocationType.HANDS)
			{
				if (GetTemperature() >= GetDamageTemperatureBorder())
				{
					AddTemperatureDamageToPlayer();
				}
			}

			AddTemperature(-GetTempDecreaseCoef());
			//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: " + GetGame().GetTickTime() + ": this: " + this + ": Decrease: GetTemperature(): " + GetTemperature());
			if ( IsInherited(Pot) /* GetInventory().GetCargo() */)
			{
				DecreaseCargoTemperature();
			}
		}
		else
		{
			SetTemperature(GetInitTemperature());
			StopTemperatureDecrease();
			//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: " + GetGame().GetTickTime() + ": this: " + this + ": Stop decrease: GetTemperature(): " + GetTemperature());
		}
	}
	
	void DecreaseCargoTemperature()
	{
		ItemBase item;
		int item_count = GetInventory().GetCargo().GetItemCount();
		for (int i = 0; i < item_count; i++)
		{
			item = ItemBase.Cast(GetInventory().GetCargo().GetItem(i));
			if (item)
			{
				if (item.GetTemperature() > item.GetInitTemperature())
				{
					item.AddTemperature(-item.GetTempDecreaseCoef());
					//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: this: " + this + ": Decrease: item: " + item + ":  item.GetTemperature(): " + item.GetTemperature());
				}
				else
				{
					item.SetTemperature(item.GetInitTemperature());
					//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: this: " + this + ": Stop decrease: item: " + item + ":  item.GetTemperature(): " + item.GetTemperature());
				}
			}
		}
	}
	// == COOLING END ==
	
	// == DAMAGE ==
	void AddTemperatureDamageToPlayer()
	{
		PlayerBase player = PlayerBase.Cast(GetHierarchyParent());
		if (player)
		{
			float idmg = GetDamageTemperature();

			ItemBase gloves = ItemBase.Cast(player.GetInventory().FindAttachment(InventorySlots.GLOVES));
			if (gloves)
			{
				gloves.AddHealth("","Health", -idmg);
				//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: AddTemperatureDamageToParent: this: " + this + ": player: " + player + ": idmg: " + idmg + ": Gloves Health: " + gloves.GetHealth() + ": Gloves Max Health: " + gloves.GetMaxHealth());
				if (gloves.GetHealth() > gloves.GetMaxHealth() * 0.5)
				{
					return;
				}
				else if (gloves.GetHealth() > gloves.GetMaxHealth() * 0.25)
				{
					idmg = idmg * 0.75;
				}
			}

			player.ProcessDirectDamage(DT_CUSTOM, this, "RightHand", "FireDamage", "0.5 0.5 0.5", idmg);
			if (IsInherited(Pot)) player.ProcessDirectDamage(DT_CUSTOM, this, "LeftHand", "FireDamage", "0.5 0.5 0.5", idmg);
			//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: AddTemperatureDamageToParent: this: " + this + ": player: " + player + ": idmg: " + idmg + ": Health: " + player.GetHealth() + ": RightHand: " + player.GetHealth("RightHand","Health") + ": LeftHand: " + player.GetHealth("LeftHand","Health"));
		}
	}
	
	float GetDamageTemperatureBorder()
	{
		return m_DamageTemperatureBorder;
	}
	
	float GetDamageTemperature()
	{
		return (GetTemperature() * m_TempDamageCoef);
	}
	// == DAMAGE END ==
	
	float GetInitTemperature()
	{
		return m_InitTemperature;
	}

	float GetTempDecreaseCoef()
	{
		if (!IsUnderRoof())
		{
			return m_TempDecreaseCoef * (1 + GetRainAbove());
		}

		return m_TempDecreaseCoef;
	}
	
	float GetRainAbove()
	{
		return GetGame().GetWeather().GetRain().GetActual();
	}

	bool IsUnderRoof()
	{
		float actual_height;
		bool hit;
		FireplaceBase.LineHit( this, 20, hit, actual_height ); //Используем готовую нативную функцию из класса FireplaceBase что бы не засорять код - функция static потому и вызов такой - FireplaceBase.LineHit
		return hit;
	}
}

Минус - если взять раскаленную до 200 град кастрюлю в голые руки им быстро приходит хана, но хана рукам никак не отображается для игрока

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
Posted (edited)

Борис, всё работает, но если переместить из костра сразу  в инвентарь, не остывает 

Edited by OskarDallas (see edit history)

Share this post


Link to post
Share on other sites

Попробовал по разному. Вот еще один момент. Те же предметы, что были сразу переложены из кастрюли, стоящей на костре, сразу в инвентарь, не будут остывать, пока не выложить на землю или взять в руки. Даже если переложить в другой контейнер, все равно не остынет. Пробовал с машиной, вложил туда не остывающую еду, остывание не пошло. 

Share this post


Link to post
Share on other sites
Posted (edited)
42 минуты назад, OskarDallas сказал:

Борис, всё работает, но если переместить из костра сразу  в инвентарь, не остывает 

я доработаю что бы остывал в инвентаре

чет не подумал про это

 

ну и как бы это по большому счету рыбка - те не финал ниразу

 

просто еще времени нет все доделать

 

а так добавлю и поправлю

вечером или завтра

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

Теперь будет охлаждаться всегда

хотя я для снижения нагрузки на серв оставил бы охлаждение только на земле или в руках

 

//15.05.2020

modded class ItemBase extends InventoryItem
{
	ref Timer m_TemperatureDecrease;

	private float m_InitTemperature;
	private float m_DecreaseTempTime 		= 10;
	private float m_TempDecreaseCoef		= 1;
	private float m_TempDecreaseCoefPot		= 2;
	
	private float m_DamageTemperatureBorder = 54;
	private float m_TempDamageCoef			= 0.01;

	private int	m_CurrentLocation			= InventoryLocationType.UNKNOWN;

	void ItemBase()
	{
		m_InitTemperature = 20; //g_Game.GetMission().GetWorldData().GetDayTemperature(); // Не работает ((( какого художника - я хз
		if ( IsInherited(Pot) /* GetInventory().GetCargo() */ )
		{
			m_TempDecreaseCoef = m_TempDecreaseCoefPot;
		}
	}

	override void AfterStoreLoad()
	{	
		super.AfterStoreLoad();
		
		if ( !IsInherited(FireplaceBase) ) TryToStartTempDecrease();
	}

	private void TryToStartTempDecrease()
	{
		if (GetTemperature() > GetInitTemperature())
		{
			if (GetHierarchyParent().IsInherited(PlayerBase))
			{
				PlayerBase player = PlayerBase.Cast(GetHierarchyParent());
				if (player)
				{
					if (player.GetHumanInventory().GetEntityInHands() == this)
					{
						m_CurrentLocation = InventoryLocationType.HANDS;
					}
					else
					{
						m_CurrentLocation = InventoryLocationType.UNKNOWN;
					}
				}
				else
				{
					m_CurrentLocation = InventoryLocationType.UNKNOWN;
				}
			}
			else
			{
				m_CurrentLocation = InventoryLocationType.UNKNOWN;
			}

			if (!m_TemperatureDecrease)
			{
				StartTemperatureDecrease();
			}
		}
	}

	override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
	{
		super.EEItemLocationChanged(oldLoc,newLoc);
		
		if (GetTemperature() > GetInitTemperature())
		{
			if (newLoc.GetParent() && newLoc.GetType() == InventoryLocationType.HANDS)
			{
				m_CurrentLocation = InventoryLocationType.HANDS;
			}
			else
			{
				m_CurrentLocation = InventoryLocationType.UNKNOWN;
			}
			
			if (!m_TemperatureDecrease)
			{
				//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": Start decrease temperature: GetTemperature(): " + GetTemperature());
				DecreaseTemperature();
				StartTemperatureDecrease();
			}
		}
		else
		{
			if (m_TemperatureDecrease)
			{
				//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": End decrease temperature: GetTemperature(): " + GetTemperature());
				StopTemperatureDecrease();
			}
		}
	}

	private void StartTemperatureDecrease()
	{
		m_TemperatureDecrease = new Timer;
		m_TemperatureDecrease.Run(m_DecreaseTempTime, this, "DecreaseTemperature", NULL, true);
	}
	
	private void StopTemperatureDecrease()
	{
		m_CurrentLocation = InventoryLocationType.UNKNOWN;
		m_TemperatureDecrease.Stop();
		m_TemperatureDecrease = NULL;
	}

	// == COOLING ==
	void DecreaseTemperature()
	{
		if (GetTemperature() > GetInitTemperature())
		{
			if (m_CurrentLocation == InventoryLocationType.HANDS)
			{
				if (GetTemperature() >= GetDamageTemperatureBorder())
				{
					AddTemperatureDamageToPlayer();
				}
			}

			AddTemperature(-GetTempDecreaseCoef());
			//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: " + GetGame().GetTickTime() + ": this: " + this + ": Decrease: GetTemperature(): " + GetTemperature());
			if ( IsInherited(Pot) /* GetInventory().GetCargo() */)
			{
				DecreaseCargoTemperature();
			}
		}
		else
		{
			SetTemperature(GetInitTemperature());
			StopTemperatureDecrease();
			//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: " + GetGame().GetTickTime() + ": this: " + this + ": Stop decrease: GetTemperature(): " + GetTemperature());
		}
	}
	
	void DecreaseCargoTemperature()
	{
		ItemBase item;
		int item_count = GetInventory().GetCargo().GetItemCount();
		for (int i = 0; i < item_count; i++)
		{
			item = ItemBase.Cast(GetInventory().GetCargo().GetItem(i));
			if (item)
			{
				if (item.GetTemperature() > item.GetInitTemperature())
				{
					item.AddTemperature(-item.GetTempDecreaseCoef());
					//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: this: " + this + ": Decrease: item: " + item + ":  item.GetTemperature(): " + item.GetTemperature());
				}
				else
				{
					item.SetTemperature(item.GetInitTemperature());
					//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: this: " + this + ": Stop decrease: item: " + item + ":  item.GetTemperature(): " + item.GetTemperature());
				}
			}
		}
	}
	// == COOLING END ==
	
	// == DAMAGE ==
	void AddTemperatureDamageToPlayer()
	{
		PlayerBase player = PlayerBase.Cast(GetHierarchyParent());
		if (player)
		{
			float idmg = GetDamageTemperature();

			ItemBase gloves = ItemBase.Cast(player.GetInventory().FindAttachment(InventorySlots.GLOVES));
			if (gloves)
			{
				gloves.AddHealth("","Health", -idmg);
				//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: AddTemperatureDamageToParent: this: " + this + ": player: " + player + ": idmg: " + idmg + ": Gloves Health: " + gloves.GetHealth() + ": Gloves Max Health: " + gloves.GetMaxHealth());
				if (gloves.GetHealth() > gloves.GetMaxHealth() * 0.5)
				{
					return;
				}
				else if (gloves.GetHealth() > gloves.GetMaxHealth() * 0.25)
				{
					idmg = idmg * 0.75;
				}
			}
			player.ProcessDirectDamage(DT_CUSTOM, this, "RightHand", "FireDamage", "0.5 0.5 0.5", idmg * 0.5);
			if (IsInherited(Pot)) player.ProcessDirectDamage(DT_CUSTOM, this, "LeftHand", "FireDamage", "0.5 0.5 0.5", idmg * 0.5);
			//Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: AddTemperatureDamageToParent: this: " + this + ": player: " + player + ": idmg: " + idmg + ": Health: " + player.GetHealth() + ": RightHand: " + player.GetHealth("RightHand","Health") + ": LeftHand: " + player.GetHealth("LeftHand","Health"));
		}
	}
	
	float GetDamageTemperatureBorder()
	{
		return m_DamageTemperatureBorder;
	}
	
	float GetDamageTemperature()
	{
		return GetTemperature() * m_TempDamageCoef;
	}
	// == DAMAGE END ==
	
	float GetInitTemperature()
	{
		return m_InitTemperature;
	}

	float GetTempDecreaseCoef()
	{
		if (!IsUnderRoof())
		{
			return m_TempDecreaseCoef * (1 + GetRainAbove());
		}
		return m_TempDecreaseCoef;
	}
	
	float GetRainAbove()
	{
		return GetGame().GetWeather().GetRain().GetActual();
	}

	bool IsUnderRoof()
	{
		float actual_height;
		bool hit;
		FireplaceBase.LineHit( this, 20, hit, actual_height ); //Используем готовую нативную функцию из класса FireplaceBase что бы не засорять код - функция static потому и вызов такой - FireplaceBase.LineHit
		return hit;
	}
}

 

Share this post


Link to post
Share on other sites

Борис, подскажи, какой параметр поправить, чтобы еда остывала до 0, а не до 20 градусов? 

Share this post


Link to post
Share on other sites

@OskarDallas ИМХО m_InitTemperature = 20; тут цапу крутить надо.

@BorizzK Если я скажу когда не охлаждается-меня сильно пинать ногами будут? 🧐
(когда зажаришь мясо, пока оно на палке в руках-не остывает, но это мелочь. Вопли игроков "Аааа, меня кастрюля дамажит!" прям соловьиная песня для моих ушей,Ыещё раз спасибо.)

 

Share this post


Link to post
Share on other sites

m_InitTemperature стоит 20 - это нижняя граница

вообще до 0 как-то странно ))))
 

МОжно убрать операцию присваивания в конструкторе и указать значение прям в классе где обьявляется переменная

Share this post


Link to post
Share on other sites
Posted (edited)
1 минуту назад, paranoyk сказал:

@OskarDallas ИМХО m_InitTemperature = 20; тут цапу крутить надо.

@BorizzK Если я скажу когда не охлаждается-меня сильно пинать ногами будут? 🧐
(когда зажаришь мясо, пока оно на палке в руках-не остывает, но это мелочь. Вопли игроков "Аааа, меня кастрюля дамажит!" прям соловьиная песня для моих ушей,Ыещё раз спасибо.)

 

Так кастрюля 200 - 100 град - попробуй такую в руки возьми )))) особенно 200 град

Пусть берут в перчатках

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

@BorizzK Нее,ничего не скажу,пусть страдают ибо для того и отдельный подвал инквизиции на сервере что б игрокам жизнь мёдом не казалась. Если игроку лекго-это наша недоработка!
Кстати,для своего сервера можете забабахать и нагрев ствола что бы был и обжигал (ну и глушителя конечно).

Share this post


Link to post
Share on other sites
9 минут назад, paranoyk сказал:

@BorizzK Нее,ничего не скажу,пусть страдают ибо для того и отдельный подвал инквизиции на сервере что б игрокам жизнь мёдом не казалась. Если игроку лекго-это наша недоработка!
Кстати,для своего сервера можете забабахать и нагрев ствола что бы был и обжигал (ну и глушителя конечно).

Оно там есть но недоделано

Займусь на досуге

 

Share this post


Link to post
Share on other sites

И теперь самый главный вопрос, так как в скриптинге ни бум бум, куда это засунуть?😬

Share this post


Link to post
Share on other sites
12 часов назад, berkac сказал:

И теперь самый главный вопрос, так как в скриптинге ни бум бум, куда это засунуть?😬

собрать в серверный мод или запихнуть в имеющийся

это чисто ДЛЯ сервера

Share this post


Link to post
Share on other sites
42 минуты назад, berkac сказал:

@BorizzK  в папку скриптс?

да уж
где лежит файл с классом ItemBase

 

вот по этому пути создайте файл .c - хоть ohlazhdenie.c в него код и пакуем в серверный мод

 

совсем народ думать НЕ ХОЧЕТ

 

Share this post


Link to post
Share on other sites

@BorizzK Как не хочет.....мне вот думать нельзя ибо что подумаю-игроки страдают:))))
Я же не предупреждал что кастрюлька теперь после костра "тяжёлая". Требуют мазь от ожогов.
Кстати,вам не попадался параметр скорости перемещения игрока? Всмысле "вперёд" с такой скоростью,стрейф-с такой...

Share this post


Link to post
Share on other sites
47 минут назад, paranoyk сказал:

@BorizzK Как не хочет.....мне вот думать нельзя ибо что подумаю-игроки страдают:))))
Я же не предупреждал что кастрюлька теперь после костра "тяжёлая". Требуют мазь от ожогов.
Кстати,вам не попадался параметр скорости перемещения игрока? Всмысле "вперёд" с такой скоростью,стрейф-с такой...

перемещения на сервере и клиенте обрабатываются в классе DayZPlayerImplement

Для сервера в функции  OnStepEvent
Каждый шаг проходит через эту функцию кроме пыжков и тп - оно в PlayerBase так же на сервере

там все есть

Share this post


Link to post
Share on other sites
Posted (edited)

Переделал, но тестить и тп времени нет и сил
Нужно чуть поправить и тп

 

сделал связь с костром и тд итп (класс костра прям тут же ниже)

 

Там еще экшаны на питье отмоддил что бы от кипятка дох - потом выложу
 

//20.05.2020

modded class ItemBase extends InventoryItem
{
	ref Timer m_TemperatureDecrease;

	private float m_InitTemperature;
	private float m_DecreaseTempTime 		= 10;
	private float m_TempDecreaseCoef		= 1;
	
	private float m_DamageTemperaturePlayer = 54;
	private float m_TempDamageCoef			= 0.015;

	private int	m_CurrentLocation			= InventoryLocationType.GROUND;
	
	// ==================================================================================================================

	private bool m_DecTempAllow	= true;
	
	bool IsDecTempAllow()
	{
		return m_DecTempAllow;
	}
	
	void SetDecTempAllow(bool value = true) //Uses for stop/start decrease temp if cooking on fireplace etc. //Используем для остановки остывания во время готовки и запуска остывания после прекращения
	{
		m_DecTempAllow = value;

		Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: SetDecTempAllow: " + GetGame().GetTickTime() + ": this: " + this + ": m_DecTempAllow: " + m_DecTempAllow);

		if (!m_DecTempAllow)
		{
			if (m_TemperatureDecrease)
			{
				StopTemperatureDecrease();
			}
		}
		else
		{
			TryToStartTempDecrease();
		}
	}
	
	void SetDecTempAllowToCargo(bool value = true) //End-to-end call for all inventory in cargo //Сквозной вызов для всего инвентаря
	{
		ItemBase item;

		Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: SetDecTempAllowToCargo: " + GetGame().GetTickTime() + ": this: " + this + ": Items count: " + GetInventory().GetCargo().GetItemCount() + ": m_DecTempAllow: " + m_DecTempAllow);

		for (int i = 0; i < GetInventory().GetCargo().GetItemCount(); i++)
		{
			item = ItemBase.Cast(GetInventory().GetCargo().GetItem(i));
			if (item)
			{
				if (item.IsDecTempAllow() != value) item.SetDecTempAllow(value);
			}
		}
	}

	// ==================================================================================================================

	void ItemBase()
	{
		m_InitTemperature = 20;
		if ( IsInherited(Pot) )
		{
			m_TempDecreaseCoef = m_TempDecreaseCoef * 2;
		}
		else if (IsInherited(FireplaceBase))
		{
			m_DecTempAllow = false;
		}
	}

	void ~ItemBase()
	{
		if (m_TemperatureDecrease)
		{
			StopTemperatureDecrease();
		}
	}

	// ==================================================================================================================

	override void AfterStoreLoad()
	{	
		super.AfterStoreLoad();
		
		if ( !IsInherited(FireplaceBase) ) TryToStartTempDecrease();
	}

	private void TryToStartTempDecrease()
	{
		if (GetTemperature() > GetInitTemperature())
		{
			if (GetHierarchyParent())
			{
				if (GetHierarchyParent().IsInherited(PlayerBase))
				{
					PlayerBase player = PlayerBase.Cast(GetHierarchyParent());
					if (player)
					{
						if (player.GetHumanInventory().GetEntityInHands() == this)
						{
							m_CurrentLocation = InventoryLocationType.HANDS;
						}
					}
					else
					{
						m_CurrentLocation = -1; //Игрок есть, но он не на сервере!
					}
				}
			}

			if (m_CurrentLocation != -1)
			{
				if (!m_TemperatureDecrease)
				{
					Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: TryToStartTempDecrease: " + GetGame().GetTickTime() + ": this: " + this + ": Start decrease temperature: GetTemperature(): " + GetTemperature() + ": GetHierarchyParent(): " + GetHierarchyParent());
					StartTemperatureDecrease();
				}
			}
		}
	}

	// ==================================================================================================================

	override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
	{
		super.EEItemLocationChanged(oldLoc,newLoc);
		
		if (GetTemperature() > GetInitTemperature())
		{
			if ( !IsInherited(FireplaceBase) )
			{
				m_CurrentLocation = newLoc.GetType();
				if (!m_TemperatureDecrease)
				{
					//if (IsDecTempAllow())
					//{
						m_DecTempAllow = true;
						Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: " + GetGame().GetTickTime() + ": this: " + this + ": Start decrease temperature: GetTemperature(): " + GetTemperature() + ": newLoc.GetParent(): " + newLoc.GetParent());
						StartTemperatureDecrease();
					//}
				}
			}
		}
		else
		{
			if (m_TemperatureDecrease)
			{
				Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: " + GetGame().GetTickTime() + ": this: " + this + ": End decrease temperature: GetTemperature(): " + GetTemperature() + ": newLoc.GetParent(): " + newLoc.GetParent());
				StopTemperatureDecrease();
			}
		}
	}

	// ==================================================================================================================

	private void StartTemperatureDecrease()
	{
		DecreaseTemperature();
		m_TemperatureDecrease = new Timer;
		m_TemperatureDecrease.Run(m_DecreaseTempTime, this, "DecreaseTemperature", NULL, true);

		if (GetInventory().GetCargo())
		{
			SetDecTempAllowToCargo(true);
		}
	}
	
	private void StopTemperatureDecrease()
	{
		m_CurrentLocation = InventoryLocationType.UNKNOWN;
		m_TemperatureDecrease.Stop();
		m_TemperatureDecrease = NULL;
	}

	// == COOLING ==
	void DecreaseTemperature()
	{
		if (GetTemperature() > GetInitTemperature())
		{
			if (m_CurrentLocation == InventoryLocationType.HANDS)
			{
				if (GetTemperature() >= GetDamageTemperaturePlayer())
				{
					AddTemperatureDamageToPlayer();
				}
			}
			AddTemperature(-GetTempDecreaseCoef());
			Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: " + GetGame().GetTickTime() + ": this: " + this + ": Decrease: GetTemperature(): " + GetTemperature());
		}
		else
		{
			SetTemperature(GetInitTemperature());
			StopTemperatureDecrease();
			Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: " + GetGame().GetTickTime() + ": this: " + this + ": Stop decrease: GetTemperature(): " + GetTemperature());
		}
	}

	private bool m_CargoDecTempState = false;
	void DecreaseCargoTemperature()
	{
		ItemBase item;
		m_CargoDecTempState = false;
		int item_count = GetInventory().GetCargo().GetItemCount();
		for (int i = 0; i < item_count; i++)
		{
			item = ItemBase.Cast(GetInventory().GetCargo().GetItem(i));
			if (item)
			{
				if (item.GetTemperature() > item.GetInitTemperature())
				{
					m_CargoDecTempState = true;
					item.AddTemperature(-item.GetTempDecreaseCoef());
					Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: " + GetGame().GetTickTime() + ": this: " + this + ": Decrease: item: " + item + ":  item.GetTemperature(): " + item.GetTemperature());
				}
				else
				{
					item.SetTemperature(item.GetInitTemperature());
					Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: " + GetGame().GetTickTime() + ": this: " + this + ": Stop decrease: item: " + item + ":  item.GetTemperature(): " + item.GetTemperature());
				}
			}
		}
	}
	// == COOLING END ==

	// ==================================================================================================================
	
	// == DAMAGE ==
	void AddTemperatureDamageToPlayer()
	{
		PlayerBase player = PlayerBase.Cast(GetHierarchyParent());
		if (player && player.IsAlive())
		{
			float idmg = GetDamageTemperature();

			ItemBase gloves = ItemBase.Cast(player.GetInventory().FindAttachment(InventorySlots.GLOVES));
			if (gloves)
			{
				gloves.AddHealth("","Health", -idmg);
				Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: AddTemperatureDamageToParent: " + GetGame().GetTickTime() + ": this: " + this + ": player: " + player + ": idmg: " + idmg + ": Gloves Health: " + gloves.GetHealth() + ": Gloves Max Health: " + gloves.GetMaxHealth());
				if (gloves.GetHealth() > gloves.GetMaxHealth() * 0.5)
				{
					return;
				}
				else if (gloves.GetHealth() > gloves.GetMaxHealth() * 0.25)
				{
					idmg = idmg * 0.75;
				}
			}

			player.ProcessDirectDamage(DT_CUSTOM, this, "RightHand", "FireDamage", "0.5 0.5 0.5", idmg * 0.5);
			if (IsInherited(Pot)) player.ProcessDirectDamage(DT_CUSTOM, this, "LeftHand", "FireDamage", "0.5 0.5 0.5", idmg * 0.5);
			Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: AddTemperatureDamageToParent: " + GetGame().GetTickTime() + ": this: " + this + ": player: " + player + ": idmg: " + idmg + ": Health: " + player.GetHealth() + ": RightHand: " + player.GetHealth("RightHand","Health") + ": LeftHand: " + player.GetHealth("LeftHand","Health"));
		}
	}
	
	float GetDamageTemperaturePlayer()
	{
		return m_DamageTemperaturePlayer;
	}
	
	float GetDamageTemperature()
	{
		return GetTemperature() * m_TempDamageCoef;
	}
	// == DAMAGE END ==
	
	// ==================================================================================================================

	float GetInitTemperature()
	{
		return m_InitTemperature;
	}

	float GetTempDecreaseCoef()
	{
		if (!IsUnderRoof())
		{
			return m_TempDecreaseCoef * (1 + GetRainAbove());
		}
		return m_TempDecreaseCoef;
	}
	
	float GetRainAbove()
	{
		return GetGame().GetWeather().GetRain().GetActual();
	}

	bool IsUnderRoof()
	{
		float actual_height;
		bool hit;
		FireplaceBase.LineHit( this, 20, hit, actual_height );
		return hit;
	}

	// ==================================================================================================================
}

	// ==================================================================================================================
	// ==================================================================================================================

modded class FireplaceBase extends ItemBase
{
	override void DestroyFireplace()
	{
		if (m_CookingEquipment) 
		{
			if (m_CookingEquipment.IsInherited(Pot))
			{
				m_CookingEquipment.SetDecTempAllow(true);
			}
		}
		super.DestroyFireplace();
	}
	
	//Add cooking equipment
	override void SetCookingEquipment( ItemBase equipment )
	{
		m_CookingEquipment = equipment;
		if (m_CookingEquipment)
		{
			if (m_CookingEquipment.IsInherited(Pot))
			{
				Print("::: SERVER: [FireplaceBase extends ItemBase: Decreasetemp]: SetCookingEquipment: " + GetGame().GetTickTime() + ": this: " + this + ": m_CookingEquipment " + m_CookingEquipment);
				if (m_HeatingTimer)
				{
					m_CookingEquipment.SetDecTempAllow(false);
				}
				else
				{
					m_CookingEquipment.SetDecTempAllow(true);
				}
			}
		}
		
	}

	//Start heating
	protected void StartHeating()
	{
		if (m_CookingEquipment && m_CookingEquipment.IsInherited(Pot))
		{
			Print("::: SERVER: [FireplaceBase extends ItemBase: Decreasetemp]: StartHeating: " + GetGame().GetTickTime() + ": this: " + this + ": m_CookingEquipment " + m_CookingEquipment);
			m_CookingEquipment.SetDecTempAllow(false);
		}
		super.StartHeating();
	}

	//Stop heating
	protected void StopHeating()
	{
		super.StopHeating();
		if (m_CookingEquipment && m_CookingEquipment.IsInherited(Pot))
		{
			Print("::: SERVER: [FireplaceBase extends ItemBase: Decreasetemp]: StopHeating: " + GetGame().GetTickTime() + ": this: " + this + ": m_CookingEquipment " + m_CookingEquipment);
			m_CookingEquipment.SetDecTempAllow(true);
		}
	}	
}

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

Понятно,доползу со смены попробую протестить. Если буду в состоянии стояния.

(бду краток-бегемоты козлы)

Share this post


Link to post
Share on other sites
41 минуту назад, paranoyk сказал:

Понятно,доползу со смены попробую протестить. Если буду в состоянии стояния.

(бду краток-бегемоты козлы)

Да там еще хвосты с теста итп - эксперементировал с кодом итп

Я сеня допилю

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By BorizzK
      В эксперементалке 1.08 если сбросить предмет находясь на машине (крыше, багажнике, капоте в кузове) предмет проваливается сквозь машину на землю или оказывается в ее текстурах
       
      Тикет
      https://feedback.bistudio.com/T152071
       
      ответ богемии поразителен - сейчас нет простого решения
       
      А ниже что? Проще не бывает...
       
      Собственно код фикса (Автор Я)
       
      Code ``` modded class ItemBase extends InventoryItem { override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc) { super.EEItemLocationChanged(oldLoc,newLoc); if (newLoc.GetType() == InventoryLocationType.GROUND) { if (oldLoc.GetParent()) { PlayerBase player = PlayerBase.Cast(oldLoc.GetParent()); if (player) { FixPositionIfDropOnCar(player); } } } } void FixPositionIfDropOnCar(PlayerBase player) { vector m_RayStart; vector m_RayEnd; m_RayStart = player.GetPosition(); m_RayStart[1] = m_RayStart[1] + 0.5; m_RayEnd = m_RayStart; m_RayEnd[1] = m_RayEnd[1] - 1; RaycastRVParams m_RayCastInput = new RaycastRVParams(m_RayStart, m_RayEnd, this, 0.05); array<ref RaycastRVResult> m_RayCastResults = new array<ref RaycastRVResult>; m_RayCastInput.with = player; m_RayCastInput.flags = CollisionFlags.FIRSTCONTACT; if (DayZPhysics.RaycastRVProxy(m_RayCastInput, m_RayCastResults)) { if (m_RayCastResults.Count() > 0) { Car car; if (Class.CastTo(car, m_RayCastResults[0].obj) || Class.CastTo(car, m_RayCastResults[0].parent)) { this.SetPosition(m_RayCastResults[0].pos + (player.GetDirection() * 0.1)); } } } } } ``` Наверное имеет смысл чуть приподнять предмет над поверхностью, но необходимость этого зависит от типа предмета, потому не стал этого делать
       
      чуть откорректировал код
    • By DrTauren
      Что нам понадобится:
      1) Архив
      2) Notepad


      Инструкция:
      1) Качаем архив и копируем из него папку custom в вашу папку с миссией
      2) Открываем init.sqf и ищем такие строки:
      if (!isDedicated) then { 0 fadeSound 0; waitUntil {!isNil "dayz_loadScreenMsg"}; dayz_loadScreenMsg = (localize "STR_AUTHENTICATING"); _id = player addEventHandler ["Respawn", {_id = [] spawn player_death;}]; }; 3) Перед закрывающей скобкой }; прописываем это:
      _nil = [] execVM "custom\JAEM\EvacChopper_init.sqf"; 4) Выбираем одно из двух, выполняем действия указанные ниже:
      Если у вас нет своего variables.sqf в папке с миссией:  
       
      Если у вас есть свой variables.sqf в папке с миссией:  

      5) Копируем файлы remoteexec.txt, waypointcondition.txt, waypointstatement.txt в вашу папку с фильтрами BattlEye (\instance_11_Chernarus\BattlEye)

      Настройка параметров:
      Открываем файл EvacChopper_init.sqf (custom\JAEM\EvacChopper_init.sqf), находим нужную строку, редактируем по своему усмотрению:
      evac_chopperPrice = 3; Цена вашего спасения евреями. По умолчанию 3 Брифкейса
       
      evac_needRadio = 0; Обязательно ли радио для того, что бы вызвать хапуг? (0-не нужно, 1-таки извольте)
       
      evac_zoneMarker = 0; Дымовая граната на месте эвакуации (0-не надо, 1-таки не увидим мы без дыма)
       
      evac_minDistance = 500; Дословно: минимальное расстояние, что бы вызвать евреев. Меньше 500 не ставить!
    • By Serdce
      Ссылка на первоисточник - https://github.com/BrettNordin/Exile
      Я всего лишь перевёл
      Собственно переходим по ссылке, и скачиваем архив.
      Для тех, кто не знает как качать с хаба скрин 
      И так, едем дальше
      Скачанный архив распаковываем в удобное место для работы,
      Идём в ваш @ExileServer, там нас интересуют файлы - extDB2.dll , extDB2.so , extDB2-conf.ini , XM8.dll , XM8.so Удаляем эти файлы
      Далее идём в @ExileServer которую мы скачали, всё её содержимое копируем в аналогичную папку на сервере.
      Теперь идём в вашу MPmissions и там распаковываем вашу миссию "Exile.название карты",
      Туда мы копируем содержимое папки Exile.MapName из архива,
      Далее открываем ваш config.cpp и ищем там class CfgExileCustomCode 
      В него мы добавляем - #include "CfgExileCustomCode.cpp"
      Должно получится так
      Запаковываем обратно)
      Ну и теперь из архива мы копируем tbbmalloc.dll, tbbmalloc_x64.dll в папку расположения вашего Arma3_server.exe
      Не забываем поменять в вашем файле запуска сервера с arma3server.exe на arma3server_x64.exe 
      Ну и финишная прямая, открываем вашу базу данных ( желательно с название exile ) и добавляем файл Exile_Database_Update_64x.sql
      Далее настройте под себя ваш extdb3-conf.ini
       
    • By Astrahrom
      Столкнулся с цикличной проблемой в лаунчере, при установке ботов A3EAI:
      Script @epochhive\A3EAI_config.sqf not found Оказалось, что все дело в том, что в открытом доступе лежат старые версии этого скрипта, и все кто пытается воткнуть в Epochhive, как я, данный скрипт - делают это по старой схеме, не актуальной для последних версий.
       
      Решение
       
      Скачиваем - https://yadi.sk/d/HfXeB1pEAGoRtw
       
      Устанавливаем:
      1. Взять из папки архива "1. Installation Package" папку "@A3EAI" и вложить её в папку с вашим сервером;
      2. Прописать скрипт в вашем запускаторе, примерно так:
      -servermod=@EpochHive;@A3EAI; Пример моего запускатора:
      @echo off start "arma3" "arma3server.exe" -servermod=@EpochHive;@A3EAI; -mod=@Epoch; -config=C:\Arma3Server\sc\server.cfg -port=2307 -profiles=sc -cfg=C:\Arma3Server\sc\basic.cfg -name=sc -autoINIT Варианты настройки, которые хранятся в самой папке @A3EAI\addons\a3eai_config в файле config.cpp.
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.