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

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

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

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

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
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 (история изменений)

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


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





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

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

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


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

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

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


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

@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 сказал:

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

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

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

Я сеня допилю

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: BR0wi
      Подскажите где найти людей, которые делаю моды на заказ. К кому вообще обращаться? Или что бы реализовать свои идеи нужно самому "год" сидеть и изучать все механики модинга?
    • Автор: CubeIn
      Приветствую господа, хочу создать новый проект, уникальный, но для этого нужен маппер.
      Я оставлю здесь свой дискрод, напишите в лс, кто готов взяться за крупный проект.
      4me#4542
    • Автор: 6agu
      Поставил
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
    • Автор: 123new
      Много вопросов на данную тему наблюдаю от новичков, попробую прояснить немного сей вопрос.
       
      Предположим. что вы уже знаете на каких координатах вам надо спавнить определенное здание или объект\животное\бота, с каким углом поворота. И так. эта тема для вас.
       
      Сразу делаю пометку, метод, который добавили нам разработчики игры в патче 1.15, очень хорошо описал наш товарищ в сообщении форума:
      Рекоммендую вам использовать именно его!
      Ниже опубликованы старые методы.
       
      Если вы с расставили их с модифицированной версии Offline (Offline by Arksenor это называется), то вы получили и нашли код вида:
      GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13251.875000 0.0 3748.525879").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13254.599609 0.0 3722.703613").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13257.344727 0.0 3696.718750").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13260.040039 0.0 3670.984131").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13262.756836 0.0 3645.180176").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13265.441406 0.0 3619.531982").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13268.124023 0.0 3593.995361").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13270.844727 0.0 3568.186523").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13273.514648 0.0 3542.561279").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13276.195313 0.0 3517.048828").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13278.399414 0.0 3496.097900").SetOrientation("-96.000000 0.000000 0.000000"); Здесь (по примеру первой строки) 1 значение в скобках - id постройки/объекта, 2 значение - координаты в формате X Y Z, разделенные пробелом, 3 - значение поворота примерно в том же формате.
      Как это делать в Offline - статья от автора Offine:
      https://github.com/Arkensor/DayZCommunityOfflineMode/wiki/Add-custom-objects-to-your-server-or-mission
       
      И так, инструкция:
      1. Добавляем в начало init.c файла в вашей mpmissions следующий код:
      #include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\spawn_buildings.c" 2. Создаем в папке вашей активной mpmissions файлик spawn_buildings.c и заполняем его следующей информацией.
      void SpawnObject( string type, vector position, vector orientation ) { private string NameBlockLog = "[CreateObject] "; private string InfoLog = ""; if(type != "") { auto obj = GetGame().CreateObject( type, "0 0 0" ); if(obj) { if ((position[0] != 0) && (position[1] != 0) && (position[2] != 0)) { obj.SetPosition( position ); obj.SetOrientation( orientation ); obj.Update(); if (obj.CanAffectPathgraph()) { obj.SetAffectPathgraph(true, false); GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(GetGame().UpdatePathgraphRegionByObject, 100, false, obj); } InfoLog = "[Type: '" + obj.GetType() + "' Position: '" + obj.GetPosition().ToString() + "' Orientation: '" + obj.GetOrientation().ToString() + "']"; Write_Log(NameBlockLog + " Object has been created successfully! Info " + InfoLog); } else { InfoLog = "[Type: '" + type + "' Position: '" + position + "' Orientation: '" + orientation + "']"; Write_Log(NameBlockLog + " Object can't be created! Incorrect writed position. Info " + InfoLog); } } else { InfoLog = "[Type: '" + type + "' Position: '" + position + "' Orientation: '" + orientation + "']"; Write_Log(NameBlockLog + " Object can't be created! Info " + InfoLog); } } else { InfoLog = "[Type: '" + type + "' Position: '" + position + "' Orientation: '" + orientation + "']"; Write_Log(NameBlockLog + " Object can't be created! Incorrect writed type. Info " + InfoLog); } } void Write_Log(string message) { Print(String(message)); } 3. Открываем созданный нами файл,  и в конце файла дописываем следующее:
      void SpawnAirfeeldBuildings() { SpawnObject( "Land_CementWorks_ExpeditionB", "13251.875000 0.0 3748.525879", "-96.000000 0.000000 0.000000"); SpawnObject( "Land_CementWorks_ExpeditionB", "13254.599609 0.0 3722.703613", "-96.000000 0.000000 0.000000"); SpawnObject( "Land_CementWorks_ExpeditionB", "13257.344727 0.0 3696.718750", "-96.000000 0.000000 0.000000"); } void SpawnKrasnoBuildings() { SpawnObject( "Land_CementWorks_ExpeditionB", "13251.875000 0.0 3748.525879", "-96.000000 0.000000 0.000000"); SpawnObject( "Land_CementWorks_ExpeditionB", "13254.599609 0.0 3722.703613", "-96.000000 0.000000 0.000000"); SpawnObject( "Land_CementWorks_ExpeditionB", "13257.344727 0.0 3696.718750", "-96.000000 0.000000 0.000000"); } Где после void - название функции идет, а между открытыми скобками вызов спавна самих зданий на указанных координатах.
      На примере 1 строки:
      Land_CementWorks_ExpeditionB - id постройки (type)
      13251.875000 0.0 3748.525879 - координаты в формате X Y Z
      -96.000000 0.000000 0.000000 - значение поворота в формате X Y Z
      Внимание: id постройки и координаты в примере указаны не верные и требуют подключения дополнительной модификации для корректной работы!!! Координаты не соответствуют названию функции!!!
      4. открываем в MpMissions в папке с вашей активной миссией init.c и перед ЗАКРЫВАЮЩЕЙ скобкой '}' дописываем нужную нам функцию (это будет активация спавна на карте):
      SpawnAirfeeldBuildings(); 5. Готово, Запускайте сервер, и в scripts.log вы увидите процедуру спавна ваших зданий и увидите, спавнятся ли они на карте или нет.
      Можно написать конечно и более готовую, универсальную систему спавна на карте со считыванием конфигурации из файла, но я считаю это лишним.
       
      Как заполнить добавленные здания лутом на карте:
      вариант 1:
      https://github.com/Arkensor/DayZCommunityOfflineMode/wiki/Enable-loot-for-custom-placed-objects
      вариант 2: вручную заполнить xml-файл  mapgrouppos.xml в mpmssions данными о местоположении зданий, где rpy - значение поворота здания в формате Z Y X
       
      С помощью данной статьи вы можете разместить любой элемент игры(постройку, животное, зомби, бота), доступный к спавну через любую модификацию-админ. панель. Очень полезный мод в этом смысле BuilderItems, с его помощью можно творить поистину интересные локации!
    • Автор: Venom21
      Появилась такая проблема, нужно закрыть некоторые слоты под одежду, когда на определённый слот одет предмет…
      пример: возьмём экзоскелет от Фидова, там есть две версии которая одеваеться как на тело и ноги, и есть которая одеваться на разгрузку и пояс, так вот, нужно например чтобы при одетом экзаче на тело и ноги слоты под пояс и разгрузку блокировались, либо только под определенные предметы, если есть интерес то цену можем в личке обсудить…
      P.S. Разрешение от Фидова на переделку и переупаковку есть)
  • Наш выбор

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

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

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