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

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

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

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

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

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

В данном гайде мы рассмотрим возвращение болезней,которые были на ранних стадиях разработки дейза, а именно : Холера и сальмонелла.
За основу брался "мод" из мастерской 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 это лишь конфиг моего сервера и видения как должна работать болезнь конкретно на мое сервере, вы же можете настроить как вам угодно.

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

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


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





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

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

 

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

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

 

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


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

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

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


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

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

 

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


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

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

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


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

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

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


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

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

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


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

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

 

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


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

paranoyk шутка за 200?

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


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

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

 

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


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

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

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

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


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

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

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


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

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

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


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

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

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

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


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

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

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

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


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

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

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

 

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


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

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

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


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

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

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

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

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

 

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


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

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

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

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

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

 

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

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


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

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

А тут ты )))

 

 

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


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

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

 

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

 

 

 

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


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

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

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

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


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

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

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

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

 

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


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

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

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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