Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
BorizzK

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

Рекомендованные сообщения

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

Прикрутить охлаждение содержимого кастрюли как 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, а если это кастрюля с содержимым, то и ее содержимое

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

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
MagicByte MagicByte MagicByte

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

//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 град кастрюлю в голые руки им быстро приходит хана, но хана рукам никак не отображается для игрока

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем OskarDallas (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
42 минуты назад, OskarDallas сказал:

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

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

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

 

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

 

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

 

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

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

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, paranoyk сказал:

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

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

 

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

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

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 минут назад, paranoyk сказал:

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 часов назад, berkac сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
42 минуты назад, berkac сказал:

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

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

 

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
47 минут назад, paranoyk сказал:

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

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

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

там все есть

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

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

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
41 минуту назад, paranoyk сказал:

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

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

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

Я сеня допилю

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: Makliion
      Всем добрый вечер..
      У меня такой вопрос где найти или заказать скрипт для обыска зомбей & игроков 
      что-бы каждую вещь снимать через действие а не тупо через таб
      Шлем отдельно
      Рюкзак отдельно
      ну и на все остальные слоты
      искал долго не нашёл ничего
      есть мод на обыск но он просто открывает  инвентарь и все 
       
    • Автор: Troy1
      Всем привет. Подскжите ну или помогите пожалуйста решить вопрос.
      Вопрос звучит так. На сервере есть трейдер зоны и базы игроков. 
      Если в течение определённого времени, на пример 1 - 2 часа с машиной не кто не взаимодействует и машина не находится в зоне трейдера или на теретории базы, то машина отлетает в гараж или на штраф стоянку.
      На сервере используется TraderPlus.
       
      Есть такие решения у кого?
      За ранние благодарю.
    • Автор: Troy1
      Всем привет. Подскжите ну или помогите пожалуйста решить вопрос.
      Вопрос звучит так. Нужно сделать так, что бы на всей карте был запрет на строительство. 
      Если нужно построить например базу с палатками, то нужно установить верстак или флаг, который установит зону для строительства с радиусом примерно 20-25 метров от центра и желательно что бы зона была квадратной.
      Есть такие решения у кого?
      За ранние благодарю.
    • Автор: BR0wi
      Подскажите где найти людей, которые делаю моды на заказ. К кому вообще обращаться? Или что бы реализовать свои идеи нужно самому "год" сидеть и изучать все механики модинга?
    • Автор: CubeIn
      Приветствую господа, хочу создать новый проект, уникальный, но для этого нужен маппер.
      Я оставлю здесь свой дискрод, напишите в лс, кто готов взяться за крупный проект.
      4me#4542
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.

Поддержка