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

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

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

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

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

Отражение урона убийце

Как сделать отражение урона убийце? Имеется PVE сервер (убивать нельзя) и чтобы игроки соблюдали это правило нужно как-то отключить урон или зазеркалить.

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


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

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

  • 1

Славик Отключить урон полностью SetAllowDamage(false) - это значит не будет урона вообще - никогда - никакого - те God MOde что не катит по понятным причинам

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

 

Так вот

Отключить урон от ударов и выстрелов игроков можно тут

Класс PlayerBase

Функция EEHitBy

Там же можно и зазеркалить

 

 

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


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

BorizzK Спасибо за быстрый ответ ))) Я ещё только учусь, поэтому не знаю где это всё находится. В какком файле это пишется? В Init.c?

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


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

Славик Класс PlayerBase это PlayerBase.c в scripts\4_World\Entities\ManBase

 

В общих чертах распишу

 

1 Для начала Вам надо понять что такое моддинг, скриптинг, как устроен язык enfusion, структуру и тп

Для этого читаем

 

и

 

https://community.bistudio.com/wiki/DayZ:Enforce_Script_Syntax

 

сопоставляем

 

можно еще вкратце прочитать про C#

 

Далее

 

открываем pbo-менеджером (скачать, уствновить) файл scripts.pbo из папки dta

его содержимое вытаскиваем в папку scripts в корне сервера

в параметр запуска сервера добавляем -filepatching

в конфиге сервера (по нему и параметрам запуска читаем отдельную тему (поиск рулит) на форуме и в вики богемии (и на их форуме forums.dayz.com)

отключаем проверку сигнатур (на время тестов - отладки и тп - что бы тестить было проще без постоянной перепаковки серверного мода)

и приступаем

 

хотим отмоддидь этот PlayerBase

копируем PlayerBase.c рядом в PlayerBase_mymod.c

 

открываем

 

видим

 

class PlayerBase extends ManBase
{
 

тут содержимое класса (тело) - его переменные функциии и тп

это класс игрока - когда подключается игрок для него создается экземпляр класса и все операции с игроком идут через него

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

часть функций вызывается из функций класса или из других классов и тп

 

}

 

конец  тела класса

 

меняем - добавляем modded - движок (его компилятор при старте поймет что это мод и что оно перекроет/дополнит существующий класс)

modded class PlayerBase extends ManBase
{
 

все содержимое удаляем кроме функции

 

override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos)
{

 

тут код функции


}

 

}

 

функцию EEHitBy движок вызывает для конкретного игрока всякий раз когда по нему прилетает от игрков, зомби, машин и тп - кроме прямого попадания в бошку

override это означает что функция перекрывает существующую в нативном классе функцию или функцию в родительском классе (если в ее нет в нативном))

ну и дальше

 

Однако  - прямое попадание в бошку можно перехватить чуть ранее в DayZPlayerImplement.c - однако игрок всеравно будет мертвый - посему пофиг и туда не лезем

 

и вот берем мы эту функцию и видим

 

	override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos)
	{
		/*
		Print("ProjectileDebugging | Damage Health: " + damageResult.GetDamage(dmgZone,"Health") + " | Zone: " + dmgZone);
		Print("ProjectileDebugging | Damage Blood: " + damageResult.GetDamage(dmgZone,"Blood") + " | Zone: " + dmgZone);
		Print("ProjectileDebugging | speedCoef: " + speedCoef);
		Print("-----------------------------------------------");*/
		
		if( m_AdminLog )
		{
			m_AdminLog.PlayerHitBy( damageResult, damageType, this, source, component, dmgZone, ammo );
		}
		
		super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos);
		
		if( damageResult != null && damageResult.GetDamage(dmgZone, "Shock") > 0)
		{
			m_LastShockHitTime = GetGame().GetTime();
		}
		
		 //! DT_EXPLOSION & FlashGrenade
		if( damageType == DT_EXPLOSION && ammo == "FlashGrenade_Ammo" )
		{
			GetStaminaHandler().DepleteStamina(EStaminaModifiers.OVERALL_DRAIN);
		}
		
		//new bleeding computation
		//---------------------------------------
		if( damageResult != null && GetBleedingManagerServer() )
		{
			float dmg = damageResult.GetDamage(dmgZone, "Blood");
			GetBleedingManagerServer().ProcessHit(dmg, source, component, dmgZone, ammo, modelPos);
		}
		//---------------------------------------
		
		#ifdef DEVELOPER
		if(DiagMenu.GetBool(DiagMenuIDs.DM_MELEE_DEBUG_ENABLE))
		{
			Print("EEHitBy() | Charater " + GetDisplayName() + " hit by " + source.GetDisplayName() + " to " + dmgZone);
		}
		
		PluginRemotePlayerDebugServer plugin_remote_server = PluginRemotePlayerDebugServer.Cast( GetPlugin(PluginRemotePlayerDebugServer) );
		if(plugin_remote_server)
		{
			plugin_remote_server.OnDamageEvent(this, damageResult);
		}
		#endif
		if( GetGame().IsDebugMonitor() )
			m_DebugMonitorValues.SetLastDamage(source.GetDisplayName());
		
		if( m_ActionManager )
			m_ActionManager.Interrupt();
		
		//analytics
		GetGame().GetAnalyticsServer().OnEntityHit( source, this );
	}

Видим мы что в функцию передаются различные параметры

Сам игрок по которому прилетело там не указан тк он тут везде по умолчанию - экземпляр класса же его и двигло свам его где надо подпихивает

ну или можно самому указать где надо - this - в этой переменной он и будет

 

Так вот

нас интерисует уСЧерб и от кого оно прилетело

 

по коду функции все в приниципе понятно

 

Продолжение следует

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


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

BorizzK Всё, понял. Сейчас разбираться буду. От этого языка программирования я далёк конечно, в основном только сайты делал... Вижу, что опять предстоит путь познаний длинною в жизнь ))))) Спасибо тебе огромное

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


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

А можно же сделать не отсутствие урона по игроку, а отсутствие возможности прицеливания на игрока? Как в сейф зоне.
Да, это не спасет от гранаты или рукопашного боя. Но у меня вот сервер без гранат и это было бы классным решением. За небольшой ценник приобрел бы такой скрипт.

Отзеркаливание максимально неудобное решение, т.к не каждый выстрел от противника, выстрел может быть шальной от напарника.

 

 

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

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


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

@BorizzK @Славик  EEHitBy годится только для отзеркаливания урона
но есть вполне легкий способ как именно заблокировать урон именно от игрока, в том числе и от хеадшота
 

modded class PlayerBase
{
	override bool EEOnDamageCalculated(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
	{
		if (IsAlive())
		{
			PlayerBase pk;
			float dmg = damageResult.GetDamage(dmgZone, "Health");
			
			if (CastTo(pk, source) || CastTo(pk, source.GetHierarchyRootPlayer()))
			{
				AddHealth("", "Shock", -dmg * 2);
				pk.AddHealth("", "Shock", -dmg * 2);
				return false;
			}
			else if (damageType == DamageType.EXPLOSION || damageType == DamageType.FIRE_ARM)
			{
				AddHealth("", "Shock", -dmg * 2);
				return false;
			}
		}
		return super.EEOnDamageCalculated(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
	}
}

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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

Поддержка