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
thessend

Болезни [1.03]

Recommended Posts

В данном гайде мы рассмотрим возвращение болезней,которые были на ранних стадиях разработки дейза, а именно : Холера и сальмонелла.
За основу брался "мод" из мастерской MedicalAttention но там он реализован в виде мода, и имеет другие эффекты при болезни (или заражение там происходит настолько медленно что почти нереально заразится)
Все это будет реализовано в виде скриптов без использования модификации клиентской части.

  1. Для начала распаковываем scripts.pbo (в корне сервера папка "dta" распаковать его можно с помощью  Pbo manager распакованную папку кидаем в корень сервера);
  2. В параметры запуска сервера прописываем "-FilePatching";
  3. Далее в уже распакованной папке scripts ищем scripts\4_World\Classes\TransmissionAgents\Agents в этой папке мы видимо так называемые "Агенты" они то нам и нужны.

    В этих файлах мы можем настроить как быстро заражение будет накапливаться, как быстро лечиться, при каком иммунитете.

    Скрытый текст

            m_Type                     = eAgents.CHOLERA; - Собственно название самой болезни
            m_Invasibility             = 1.0; - Количество единиц накапливаемых в секунду при заражении.
            m_TransferabilityIn        = 0.5; - К игроку (не совсем понимаю что это,но это связано с передачей вируса игроку)
            m_TransferabilityOut    = 0.5; - От игрока (тоже не совсем понимаю, но это связано с передачей вируса игроку)
            m_AntibioticsResistance = 0;//[0..1], - Действие антибиотиков на болезнь (0= антибиотики действуют, 1= антибиотики не действуют)
            m_MaxCount                 = 1000; - Максимальное кол-во единиц вируса
            m_Potency = EStatLevels.GREAT; - Минимальный уровень иммунитета при котором болезнь не будет действовать на персонажа (не совсем понимаю принцип работы иммунитета)
            m_DieOffSpeed = 0.5; - Кол-во единиц которые будут уходить в секунду при лечении.

    Тоже самое находится и в сальмонелле, поэтому тут можете настроить как вам будет нужно.

       4. Далее по пути scripts\4_World\Classes\PlayerModifiers\Modifiers\diseases тоже видим эти же агенты нас тут интересуют два файла Cholera.c и Salmonella.c
           в файл Cholera.c вставляет код с 28 строки. В этом файле мы прописываем какие симптомы будут при активации агента. В моем случае прописано уменьшение  100             единиц воды , 3 единицы здоровья а так же тошнота, а так же это происходит с определенным шансом(например тут задано что при максимальном значении агента             шанс срабатывания всех этих симптомов будет равен 70% каждые 10 тиков :
 

Скрытый текст

override protected void OnActivate(PlayerBase player)
	{
		m_IsVomiting = false;
		if( player.m_NotifiersManager ) player.m_NotifiersManager.ActivateByType(eNotifiers.NTF_SICK);
		player.IncreaseDiseaseCount();
	}

	override protected void OnDeactivate(PlayerBase player)
	{
		player.DecreaseDiseaseCount();
	}

	override protected bool DeactivateCondition(PlayerBase player)
	{
		if(player.GetSingleAgentCount(eAgents.CHOLERA) < CHOLERA_AGENT_THRESHOLD_DEACTIVATE) 
		{
			return true;
		}
		else 
		{
			return false;
		}
	}

	override protected void OnTick(PlayerBase player, float deltaT)
	{
		static const float chanceModMin = 10;
		static const float chanceModMax = 20;
		float chanceMod = player.GetSingleAgentCountNormalized(eAgents.CHOLERA) * (chanceModMax - chanceModMin) + chanceModMin;
		chanceMod = chanceModMax - chanceMod + chanceModMin;
		float chance_of_vomit = player.GetSingleAgentCountNormalized(eAgents.CHOLERA)*0.7;
		if(i % 10==0)
		{
			
			if( Math.RandomFloat01() < chance_of_vomit )
			{
				SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
			
				if( symptom )
				{ 
					symptom.SetDuration(Math.RandomIntInclusive(4,8));
					player.GetStatWater().Add(-100);
					float currenthealth = player.GetHealth("GlobalHealth", "Health");
					player.SetHealth("GlobalHealth", "Health" ,  currenthealth - 3 );
				}
			}
		}
		i=i+1;
	}
};

В начале файла так же есть параметра:
    static const int CHOLERA_AGENT_THRESHOLD_ACTIVATE = 33; - это значение при котором будет активироваться вирус.
    static const int CHOLERA_AGENT_THRESHOLD_DEACTIVATE = 20; - Соответственно значение, при котором вирус деактивируется.
 После этих параметров вставляем :
int i = 0;

Для файла сальмонеллы следующие настройки: 
А так же тут настроена на 3 стадии со своими симптомами.
 

Скрытый текст

override protected void OnActivate(PlayerBase player)
	{
		if( player.m_NotifiersManager ) player.m_NotifiersManager.ActivateByType(eNotifiers.NTF_SICK);
		player.IncreaseDiseaseCount();
		
	}

	override protected void OnDeactivate(PlayerBase player)
	{
		player.DecreaseDiseaseCount();
	}

	override protected bool DeactivateCondition(PlayerBase player)
	{
		if(player.GetSingleAgentCount(eAgents.SALMONELLA) < SALMONELLA_AGENT_THRESHOLD_DEACTIVATE) 
		{
			return true;
		}
		else 
		{
			return false;
		}
	}

	override protected void OnTick(PlayerBase player, float deltaT)
	{
		float currenthealth = player.GetHealth("GlobalHealth", "Blood");
		if( player.GetSingleAgentCountNormalized(eAgents.SALMONELLA) >= 0.125 &&  player.GetSingleAgentCountNormalized(eAgents.SALMONELLA)< 0.4)
		{
					player.GetStatEnergy().Add(-2);
		}
		else
		{
			if( player.GetSingleAgentCountNormalized(eAgents.SALMONELLA) >= 0.4 &&  player.GetSingleAgentCountNormalized(eAgents.SALMONELLA)< 0.8)
			{
				player.GetStatEnergy().Add(-4);
				player.SetHealth("GlobalHealth", "Blood" ,  currenthealth - 0.5 );
			}
			else
			{
				if( player.GetSingleAgentCountNormalized(eAgents.SALMONELLA) >= 0.8)
				{
					player.GetStatEnergy().Add(-6);
					player.SetHealth("GlobalHealth", "Blood" ,  currenthealth - 1 );
					if(i % 10==0)
					{	
						SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_FREEZE);
						if( symptom )
						{
							symptom.SetDuration(Math.RandomIntInclusive(4,8));
						}
						
					
					}
					
					i=i+1;
				}
				
			}
		
		}
		
	}
};

Вставлять с 25 строки.
Эти строки так же по аналогии с холерой:
static const int SALMONELLA_AGENT_THRESHOLD_ACTIVATE = 100;

 static const int SALMONELLA_AGENT_THRESHOLD_DEACTIVATE = 20;
Тут так же после них вставляем :
int i = 0;

5. Так же нам нужно назначить что бы при поедании сырого мяса вызывалась сальмонелла делается это в scripts\4_World\Classes\UserActionsComponent\Actions\Continuous файл ActionEatMeat.с после 35 строки вставляем следующий код:
 

Скрытый текст

override void OnEndAnimationLoopServer( ActionData action_data )
    {
        Edible_Base food_item = Edible_Base.Cast( action_data.m_MainItem );
        if (food_item.IsFoodRaw())
        {
        PluginLifespan module_lifespan = PluginLifespan.Cast( GetPlugin( PluginLifespan ) );
        module_lifespan.UpdateBloodyHandsVisibility( action_data.m_Player, true );
		action_data.m_Player.InsertAgent(eAgents.SALMONELLA, 1);
        }
    }

При поедании сырого мяса мы будем получать одну единицу сальмонеллы + руки будут кровавыми.
Так же нужно починить сало, если вы не хотите что бы оно заражало при поедании его приготовленным нужно найти  файл cooking.c в scripts\4_World\Classes\Cooking
Строку (67)   else if ( item_to_cook.IsFoodBaked() && item_to_cook.Type() != Lard )        и удалить != Lard что бы она имела следующий вид:
                else if ( item_to_cook.IsFoodBaked() && item_to_cook.Type())

6. Так же не обязательно можно сделать определения заражения с помощью теста крови:
в файле ActionTestBloodSelf.с который находится scripts\4_World\Classes\UserActionsComponent\Actions\Continuous\Medical
Добавляем следующий код: 
 

Скрытый текст


		EStatLevels immunityLevel = action_data.m_Player.GetImmunityLevel();
		string immunityLevelStr;
		switch (immunityLevel)
		{
			case EStatLevels.GREAT: immunityLevelStr = "Как у быка"; break;
			case EStatLevels.HIGH: immunityLevelStr = "Высокий"; break;
			case EStatLevels.MEDIUM: immunityLevelStr = "Средний"; break;
			case EStatLevels.LOW: immunityLevelStr = "Низкий"; break;
			case EStatLevels.CRITICAL: immunityLevelStr = "Амебка кусь кусь"; break;
		}
		SendMessageToClient(action_data.m_Player, "Медицинский отчет:");
		SendMessageToClient(action_data.m_Player, "Иммунитет: " + immunityLevelStr);
		SendMessageToClient(action_data.m_Player, "Холера: " + action_data.m_Player.GetSingleAgentCount(eAgents.CHOLERA).ToString());
		SendMessageToClient(action_data.m_Player, "Сальмонелла: " + action_data.m_Player.GetSingleAgentCount(eAgents.SALMONELLA).ToString());

Этот кусок кода мы вставляем в функцию override void OnFinishProgressServer( ActionData action_data ) после последнего action_data.m_Player.GetSoftSkillsManager().AddSpecialty( m_SpecialtyWeight );
в итоге весь файл будет выглядеть :
 


class ActionTestBloodSelfCB : ActionContinuousBaseCB
{
	override void CreateActionComponent()
	{
		m_ActionData.m_ActionComponent = new CAContinuousTime(UATimeSpent.TEST_BLOOD);
	}
};

class ActionTestBloodSelf: ActionContinuousBase
{
	void ActionTestBloodSelf()
	{
		m_CallbackClass = ActionTestBloodSelfCB;
		m_MessageStartFail = "It's used up.";
		m_MessageStart = "I have started testing my blood.";
		m_MessageSuccess = "I have tested my blood.";
		m_MessageFail = "I have moved and testing was canceled.";
		m_MessageCancel = "I stopped testing my blood.";
		//m_Animation = "INJECTS";
		m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_CRAFTING;
		m_FullBody = true;
		m_StanceMask = DayZPlayerConstants.STANCEMASK_CROUCH;
		m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_LOW;
	}
	
	override void CreateConditionComponents()  
	{	
		m_ConditionItem = new CCINonRuined;
		m_ConditionTarget = new CCTSelf;
	}

	override int GetType()
	{
		return AT_TEST_BLOOD_S;
	}

	override bool HasTarget()
	{
		return false;
	}
		
	override string GetText()
	{
		return "#test_blood";
	}

	override void OnFinishProgressServer( ActionData action_data )
	{	
		PluginLifespan module_lifespan = PluginLifespan.Cast( GetPlugin( PluginLifespan ) );
		int blood_type = action_data.m_Player.GetStatBloodType().Get();
		
		module_lifespan.UpdateBloodType( action_data.m_Player, blood_type );
		module_lifespan.UpdateBloodTypeVisibility( action_data.m_Player, true );
		
		action_data.m_MainItem.Delete();
		action_data.m_Player.GetSoftSkillsManager().AddSpecialty( m_SpecialtyWeight );
		
		EStatLevels immunityLevel = action_data.m_Player.GetImmunityLevel();
		string immunityLevelStr;
		switch (immunityLevel)
		{
			case EStatLevels.GREAT: immunityLevelStr = "Как у быка"; break;
			case EStatLevels.HIGH: immunityLevelStr = "Высокий"; break;
			case EStatLevels.MEDIUM: immunityLevelStr = "Средний"; break;
			case EStatLevels.LOW: immunityLevelStr = "Низкий"; break;
			case EStatLevels.CRITICAL: immunityLevelStr = "Амебка кусь кусь"; break;
		}
		SendMessageToClient(action_data.m_Player, "Медицинский отчет:");
		SendMessageToClient(action_data.m_Player, "Иммунитет: " + immunityLevelStr);
		SendMessageToClient(action_data.m_Player, "Холера: " + action_data.m_Player.GetSingleAgentCount(eAgents.CHOLERA).ToString());
		SendMessageToClient(action_data.m_Player, "Сальмонелла: " + action_data.m_Player.GetSingleAgentCount(eAgents.SALMONELLA).ToString());
		//SendMessageToClient(action_data.m_Player, "Influenza: " + action_data.m_Player.GetSingleAgentCount(eAgents.INFLUENZA).ToString());

	}
};

 

На этом вроде все..
P.s это лишь конфиг моего сервера и видения как должна работать болезнь конкретно на мое сервере, вы же можете настроить как вам угодно.

Edited by thessend (see edit history)

Share this post


Link to post
Share on other sites









thessend Бум пробовать,но....бегемоты должны быть повешены!

Столько времени прошло,а болезни так и не до пилили.

 

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

Дикое желание задействовать как можно больше медикаментов.

 

Share this post


Link to post
Share on other sites

paranoyk Пока не нашел способа, да и я сам не очень то разбираюсь, что смог то сделал, но это хотя бы что-то, мне не понятен принцип работы иммунитета, если кто-то поможет в этом разобраться 

Share this post


Link to post
Share on other sites

thessend Иммунитет вроде какой то встречал в настройках игрока,то есть он не даёт заразиться. Повышает по идее витамины и здоровое питание.

 

Share this post


Link to post
Share on other sites

paranoyk Это я знаю,но где именно он дается начальный,как действует витамины тоже не совсем понятно, но если я не ошибаюсь они после принятия повышают иммунитет на максимум на 300 секунд но могу ошибаться..

Share this post


Link to post
Share on other sites

thessend вот это я понимаю. Реально нужный игре контент. Пойду заболею, пожалуй :wink:

Share this post


Link to post
Share on other sites

Так, ну у меня 2 болезни например активны, а значек один вируса. Так и должно быть? Кто знает как иконку с желудком выводить?

Share this post


Link to post
Share on other sites

Пробежка на 5 км помогает.Ну или вызвать ихтиандра.

 

Share this post


Link to post
Share on other sites

Equadro Иконка с желудком-переедание,или выпить пару кастрюль.Не так прочитал изночально, сорри.

 

Share this post


Link to post
Share on other sites

Equadro думаю надо искать функцию когда персонаж перепил, там она и выводится скорее всего, может получится её от туда достать 

Edited by thessend (see edit history)

Share this post


Link to post
Share on other sites

thessend ок, спасибо поищу. Если что я твою версию замодил и начал сырые продукты бациллами и амебами заражать. =)

Share this post


Link to post
Share on other sites

Кто знает если речную воду в бутылку залить она все еще будет речная или обычная?

Share this post


Link to post
Share on other sites
Только что, Equadro сказал:

Кто знает если речную воду в бутылку залить она все еще будет речная или обычная?

Да,она по прежнему будет грязной)

Share this post


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

Да,она по прежнему будет грязной)

Ну не знаю, ставил проверку на LIQUID_RIVERWATER болезнь не выдается, а на обычную LIQUID_WATER на ура, амебки кусь кусь =)

Share this post


Link to post
Share on other sites

thessend Аффтару респект

Но я с Вашего позволения оптимизирую и доработаю для более простого внедрения

 

Share this post


Link to post
Share on other sites

BorizzK Да пожалуйста, я же говорил что можете переделывать как хотите,ибо мои навыки мягко говоря не очень)

Share this post


Link to post
Share on other sites

thessend ну я просто делал почти то же

только не доделал

руки не доходили

теперь можно все свести воедино

 

Share this post


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

thessend ну я просто делал почти то же

только не доделал

руки не доходили

теперь можно все свести воедино

 

А что у тебя интересного там?))

Share this post


Link to post
Share on other sites

thessend да я ток начал, а потом переключился на серверный айрдроп

А тут ты )))

 

 

Share this post


Link to post
Share on other sites

BorizzK Если есть возможность, сделать холеру заразной от зомбей с малым, но шансом....особенно если закровили. И переделать лечение сальмонелы на активированный уголь,а  инфлюенции-кодеин.(соррри, за наглость.)

 

thessend Кстати,а в настройках болезней дробные значения работают?

 

 

 

Share this post


Link to post
Share on other sites

paranoyk Делать холеру от зомбей можно,но это какой то бред уже конечно..

Edited by thessend (see edit history)

Share this post


Link to post
Share on other sites

paranoyk не, там вроде целочисленные

Заражение в от зомбей можно в EEHitBy в playerbase организовать

Пооверяем кто ударил, проверяем кровотечение, добавляем агента если условие удволетворяет

 

Share this post


Link to post
Share on other sites

thessend Чисто как вариант.....с малым шансом. Или как вариант через воду,если только это не банки с напитками,кипячоная вода или после таблеток....

 

BorizzK Да,похоже только целые удолетворяют. Хреново.

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

×
×
  • 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.