Перейти к содержимому


Фотография

Как увеличить здоровье юниту (пехотинец)


Лучший Ответ Ibragim , 19 October 2021 - 08:01

Скрипт работает, но корректирует урон не так, как предполагалось.

Попробуй этот, его принцип точно такой же, но работает стабильно. Перекопируй это в инит бойца:

this addEventHandler [ "HandleDamage", {
	params ["_unit", "_hitSelection", "_damage","_source","_projectile","_hitPartIndex", "_instigator", "_hitPoint"];

	private _damageMultiplierHead = 0.3;
	private _damageMultiplierBody = 0.25;
	private _damageMultiplierLimbs = 0.15;
	private _damageMultiplierOverall = 0.25;
	
	private _limitHead = 1.0;
	private _limitBody = 0.25;
	private _limitLimbs = 0.1;
	private _limitOverall = 0.25;

	private _oldDamage = 0;
	if (_hitSelection isEqualTo "") then {_oldDamage = damage _unit} else {_oldDamage = _unit getHit _hitSelection};
	private _newDamage = _damage - _oldDamage max 0;
	private _incomingDamage = _newDamage;
	private _playerHealth = damage _unit;

	if (_newDamage > 0 && !(_projectile isEqualTo "")) then {
		
		private _damageMultiplier = _damageMultiplierBody;
		private _upperLimit = _limitBody;
		switch (_hitSelection) do {
			case "face_hub";
			case "head": {
				_damageMultiplier = _damageMultiplierHead;
				_upperLimit = _limitHead;
			};
			case "arms";
			case "hands";
			case "legs": {
				_damageMultiplier = _damageMultiplierLimbs;
				_upperLimit = _limitLimbs;
			};
			case "": {
				_damageMultiplier = _damageMultiplierOverall;
				_upperLimit = _limitOverall;
			};
			default { 
				_damageMultiplier = _damageMultiplierBody;
				_upperLimit = _limitBody;
			};
		};
		_newDamage = _newDamage * _damageMultiplier;

		
		if (_newDamage > _upperLimit) then {
			_newDamage = _upperLimit;
		};

		_damage = _oldDamage + _newDamage;
	};	

	_damage;	
}];

Если по простому, то переменные, которые будут существовать только в рамках блока, в котором они были созданы или в тех блоках, в которые они будут специально перенесены, называются локальными и обозначаются этой черточкой.
Если же переменная нужна для глобального использования во многих не связанных между собой скриптах, ее можно сделать глобальной, убрав черточку. Но нельзя сделать переменной то, что изначально является командой, например damage.
Почитай здесь.

И здесь.

Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 OFFLINE   mickeymen

mickeymen

    Ст. Прапорщик

  • Пользователи
  • 713 сообщений
  • Откуда:РФ

Отправлено 17 October 2021 - 19:32

Добрый день! Я бы хотел создать хардкорных босов, иногда в какой нибудь миссии.

Благо, что можно увеличивать тонну всяких настроек по ИИ с помощью 3DEditor Enhanced, но как сделать босса способным выдерживать немного больше урона чем остальные рядовые солдаты? Нет, Я не хочу делать терминаторов, но все же чтобы юнит был немого более стойкий или другими словами менее восприимчив к урону.

 

Например,  при попадании в туловище, без жилета ванильный юнит сразу умрает.

Или при попадании в жилет (в зависимости от калибра стреляющего) стабильно третья пуля попавшая в жилет убивает бойца. 

 

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

Нужно или уменьшить ему коэфициент урона как 0.5 или сделать ему запас здоровья 2.0

 

Хотелось бы понять, самый простой и надежный способ.


  • 0

#2 OFFLINE   Ibragim

Ibragim

    Сержант

  • Пользователи
  • 153 сообщений

Отправлено 17 October 2021 - 20:22

Добрый день. Попробуй использовать обработчик "HandleDamage" и в блоке поделить параметр _damage на коэффициент, снижающий урон:

_boss addEventHandler [ "HandleDamage", 
	{
		params ["", "", "_damage"];
		
		_damage = _damage / 5; /// Урон снизиться в 5 раз
		_damage;
	}];

  • 0

#3 OFFLINE   mickeymen

mickeymen

    Ст. Прапорщик

  • Пользователи
  • 713 сообщений
  • Откуда:РФ

Отправлено 19 October 2021 - 02:23


Добрый день. Попробуй использовать обработчик "HandleDamage" и в блоке поделить параметр _damage на коэффициент, снижающий урон:

 

 

Спасибо, но что то не сработало. 

Я назвал юнита boss и поместил ему в инит вышеуказанный скриптовый блок, но ничего не произошло. 

 

 

Так же я бы хотел понять, почему ты используешь нижнее подчеркивание в первой строке "_boss" и далее "_damage" Как я понимаю это переменные но почему нельзя их использовать без нижнего подчеркивания?

Я видел много раз, что нижнее подчеркивание используется, но до сих пор не могу понять для чего...

Почему нельзя просто написать так:

boss addEventHandler [ "HandleDamage",
    {
        params ["", "", "_damage"];
        
        damage = _damage / 5; /// Урон снизиться в 5 раз
        damage;
    }];

?


  • 0

#4 OFFLINE   Ibragim

Ibragim

    Сержант

  • Пользователи
  • 153 сообщений

Отправлено 19 October 2021 - 08:01   Лучший Ответ

Скрипт работает, но корректирует урон не так, как предполагалось.

Попробуй этот, его принцип точно такой же, но работает стабильно. Перекопируй это в инит бойца:

this addEventHandler [ "HandleDamage", {
	params ["_unit", "_hitSelection", "_damage","_source","_projectile","_hitPartIndex", "_instigator", "_hitPoint"];

	private _damageMultiplierHead = 0.3;
	private _damageMultiplierBody = 0.25;
	private _damageMultiplierLimbs = 0.15;
	private _damageMultiplierOverall = 0.25;
	
	private _limitHead = 1.0;
	private _limitBody = 0.25;
	private _limitLimbs = 0.1;
	private _limitOverall = 0.25;

	private _oldDamage = 0;
	if (_hitSelection isEqualTo "") then {_oldDamage = damage _unit} else {_oldDamage = _unit getHit _hitSelection};
	private _newDamage = _damage - _oldDamage max 0;
	private _incomingDamage = _newDamage;
	private _playerHealth = damage _unit;

	if (_newDamage > 0 && !(_projectile isEqualTo "")) then {
		
		private _damageMultiplier = _damageMultiplierBody;
		private _upperLimit = _limitBody;
		switch (_hitSelection) do {
			case "face_hub";
			case "head": {
				_damageMultiplier = _damageMultiplierHead;
				_upperLimit = _limitHead;
			};
			case "arms";
			case "hands";
			case "legs": {
				_damageMultiplier = _damageMultiplierLimbs;
				_upperLimit = _limitLimbs;
			};
			case "": {
				_damageMultiplier = _damageMultiplierOverall;
				_upperLimit = _limitOverall;
			};
			default { 
				_damageMultiplier = _damageMultiplierBody;
				_upperLimit = _limitBody;
			};
		};
		_newDamage = _newDamage * _damageMultiplier;

		
		if (_newDamage > _upperLimit) then {
			_newDamage = _upperLimit;
		};

		_damage = _oldDamage + _newDamage;
	};	

	_damage;	
}];

Если по простому, то переменные, которые будут существовать только в рамках блока, в котором они были созданы или в тех блоках, в которые они будут специально перенесены, называются локальными и обозначаются этой черточкой.
Если же переменная нужна для глобального использования во многих не связанных между собой скриптах, ее можно сделать глобальной, убрав черточку. Но нельзя сделать переменной то, что изначально является командой, например damage.
Почитай

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

.

И

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

.


  • 1

#5 OFFLINE   mickeymen

mickeymen

    Ст. Прапорщик

  • Пользователи
  • 713 сообщений
  • Откуда:РФ

Отправлено 20 October 2021 - 01:09


Скрипт работает, но корректирует урон не так, как предполагалось. Попробуй этот, его принцип точно такой же, но работает стабильно. Перекопируй это в инит бойца

 

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

Но это не работает как я хотел.

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

Я подозреваю это действие мода LOGIC FSM, где юниты падают при попадании в них и имеют возможность подняться.

Тут надо или отключать эту фичу в LOGIC FSM или принимать игру такой, какая она есть


  • 0

#6 OFFLINE   mickeymen

mickeymen

    Ст. Прапорщик

  • Пользователи
  • 713 сообщений
  • Откуда:РФ

Отправлено 18 November 2021 - 01:28


Попробуй этот, его принцип точно такой же, но работает стабильно. Перекопируй это в инит бойца:

 

когда отключил LOGIC FSM все заработало как надо!

Спасибо


  • 0




Яндекс.Метрика