• Просьба не публиковать сообщения с предложениями продажи модов или сборок!

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

[1.1] Модуль урона и дружественного огня

SlowSuicide

Middle Developer
Скриптер
Сообщения
64
Хотел поинтересоваться касаемо идеи реализации изменения стандартного урона GTA на собственный список (на текущий момент есть пара мыслей но в них не уверен). Существует ивент на получение урона OnPlayerDamage (на серверной стороне), в данном случае не удастся узнать какой игрок нанёс урон, из какого оружия для переопределения урона. В качестве аргументов у данного ивента выступает сам игрок получивший дамаг, потерянное здоровье и броня.

На клиенте же существуют ивенты: OutgoingDamage (описание вики: Срабатывает при повреждении, которое объект собирается нанести другому объекту) и IncomingDamage (Срабатывает при нанесении урона игроку). Вероятно резоннее использовать OutgoingDamage, однако тогда стоит другой вопрос: как отменить/запретить/привести значения урона к нулю игроку, находящийся в твоей команде при условии, если фракция прикреплена к игроку на серверной части.
И как всё же корректно попытаться использовать ивент нанесения дамага?
 
Решение
В результате подведения итогов текущих задач:
- В рамках данной темы была решена проблема настройки урона для оружия (протестировано, работает);
- Функции addRelationshipGroup, addRelationshipGroup работают только на НПС (PEDS), на игроков эти функции не распространяются и НЕ РАБОТАЮТ. Пришлось придумывать костыль и реализовывать данный модуль с нуля самостоятельно. В результате удалось решить проблему. Здесь я не стану описывать весь свой код, однако опишу главные моменты от которых можно отталкиваться:

Работал я исключительно с классом entity, для entity и для localplayer я добавил новую переменную team (entity.team=numteam, localplayer.team=numteam)

Присваивание команды сущности (entity) происходит в момент когда сущность входит в...
Кастомный урон на ивентах с большой долей вероятности будет лагать. Пинги, фпс, потери пакетов, плюс еще сами ивенты могут быть с "сюрпризами". Я видел как это делают челики в МТА и это боль. Это прям на крайний случай.

По friendly fire. Поковыряй этот ресурс: https://rage.mp/files/file/85-simple-teams/ Это не 100% что тебе нужно, но с этого можно начать.
Вообще должен быть какой-то функционал объдинения игроков в команды (team), т. к. это есть в сингле.

По оружию есть https://wiki.rage.mp/index.php?title=Player::setWeaponDamageModifier и https://wiki.rage.mp/index.php?title=Player::setPlayerWeaponDamageModifier. Я бы копал в сторону именно кастомизации оружия или урона через их характеристики.
 
Идеальный как я считаю вариант для оптимизации (смотрел на server-side c#) урона оружия: Нашёл ивент OnPlayerWeaponSwitch,
[ServerEvent(Event.PlayerWeaponSwitch)]
public void OnPlayerWeaponSwitch(Client player, WeaponHash oldWeapon, WeaponHash newWeapon)
{
// Some code
}
благодаря нему как раз и буду тестировать изменение урона. По результату отпишу.
 
Возникла проблема касаемо функции выставления урона на оружие
 

Вложения

  • 1.png
    1.png
    12,9 КБ · Просмотры: 23
Интересно, там на самой странице синтаксис такой:
JavaScript:
player.setWeaponDamageModifier(damageAmount);
а в списке клиентских функций записано как
Код:
mp.game.player.setWeaponDamageModifier

Ты как пробовал вызывать?
 
Интересное наблюдение: при установке значения player.setWeaponDamageModifier(damageAmount); - ругается,
mp.game.player.setWeaponDamageModifier = damageAmount - не ругается.
Данный параметр не распространяется на взрывные виды оружия (гранаты, бомбы-липучки, rpg и т.д.).
Переменная damageAmount имеет тип float (параметр здоровья у нас int), данный параметр является множителем урона (нужно тестировать и подбивать нужный урон вручную), т.е. при установлении значения damageAmount = 1 - расходуется примерно 8HP в тело персонажа. Данный вопрос решён, осталось решить вопрос с командами игроков и в связи с этим появился вопрос отображения ников игроков только для дружественной команды (чтобы чужая команда не могла видеть ники), или же ограничить радиус дистанции видимости ников (пока с этим так-же не разобрался), потому что при стандартных параметрах неймтега идёт просвет его в здании (что является некорректным поведением)
 
Интересное наблюдение: при установке значения player.setWeaponDamageModifier(damageAmount); - ругается,
mp.game.player.setWeaponDamageModifier = damageAmount - не ругается.
Это ж клиентская штука верно? Как оно синхронизируется с другими игроками? Нет рассинхрона по урону?

Ники игроков ты можешь свои реализовать.
Чтобы не показывать ники игроков которые находятся за преградами, можно проверять наличие этих самих преград. По идее вот эта штука решает этот вопрос: https://wiki.rage.mp/index.php?title=Worldprobe::castRayPointToPoint
 
Это ж клиентская штука верно? Как оно синхронизируется с другими игроками? Нет рассинхрона по урону?
Магия, но это действительно работает. Простой эксперимент: шокер (stungun) - по дефолту урон 0, поставил коэффициент на 100f - килл сразу же.
 
Это ж клиентская штука верно? Как оно синхронизируется с другими игроками? Нет рассинхрона по урону?
Магия, но это действительно работает. Простой эксперимент: шокер (stungun) - по дефолту урон 0, поставил коэффициент на 100f - килл сразу же.
Вот так установил?
JavaScript:
mp.game.player.setWeaponDamageModifier = 100;
А коэффициенты меньше 1 например 0.5 работают?
 
Вот так установил? - Не очень понял вопроса. Есть ивент на смену игроком оружия, в этом ивенте есть оператор выбора на оружие которое игрок взял, в зависимости от выбранного оружия вызывается клиентская функция, которой был передан урон.

А коэффициенты меньше 1 например 0.5 работают? -
Ещё не тестил, но если у этого параметра тип float, то думаю будет работать.
 
Магия, но это действительно работает. Простой эксперимент: шокер (stungun) - по дефолту урон 0, поставил коэффициент на 100f - килл сразу же.
Надеюсь у них хорошая защита от читов:LOL:
 
при установке значения player.setWeaponDamageModifier(damageAmount); - ругается,
mp.game.player.setWeaponDamageModifier = damageAmount - не ругается.
Вот так установил?
JavaScript:
mp.game.player.setWeaponDamageModifier = 100;
Вот так установил? - Не очень понял вопроса.

Правильно ли я понял, что верное использование setWeaponDamageModifier это присваивание нового значения свойству mp.game.player.setWeaponDamageModifier = damageAmount;, а не использование в качестве метода player.setWeaponDamageModifier(damageAmount); или mp.game.player.setWeaponDamageModifier(damageAmount); ?
 
Правильно ли я понял, что верное использование setWeaponDamageModifier это присваивание нового значения свойству mp.game.player.setWeaponDamageModifier = damageAmount;, а не использование в качестве метода player.setWeaponDamageModifier(damageAmount); или mp.game.player.setWeaponDamageModifier(damageAmount); ?
Потестируй самостоятельно - player.setWeaponDamageModifier = damageAmount или mp.game.player.setWeaponDamageModifier = damageAmount; ; Я в конечном итоге пошёл иным путём, так как пишу ещё дополнительно на C# - реализовал эту функцию на клиенте шарпа (Если у меня возникают трудности на JS - смотрю ещё функции и методы там):
private void SetWeaponDamage(object[] args)
{
RAGE.Game.Player.SetPlayerWeaponDamageModifier((float)args[0]);
}

В качестве теста думаю будет достаточно заспавнить ПЕДа, которому будет проходить урон.
 
Надеюсь у них хорошая защита от читов:LOL:
Ну так в данном случае ставятся дополнительные условия на проверку урона, например в качестве аргументов нужно передавать помимо урона ещё и оружие, и вероятно использовать уже ивент выстрела, в котором будет проверяться урон фактический от установленного разработчиком.
 
Касаемо отображения никнеймов: решил данную проблему скриптом из следующей темы https://rage.mp/forums/topic/393-implementing-custom-name-tags/?tab=comments#comment-2605 . Однако в нём внес поправки, при котором никнейм будет отображаться при условии прицеливания в игрока в установленной дистанции (из темы данного скрипта вырезал отображение хп и армора, в моём случае оно не требуется)
 
Остался вопрос всё таки с разделением игроков по командам и отключения friendly fire. Нашёл на вики клиентской части следующие функции:

player.setTeam(team);
player.setCanBeTargettedByTeam(team, flag);

Однако у меня не удалось привести их в работоспособное состояние
error.png.
 
Последнее редактирование:
Есть еще так называемые Relationship Groups.

И там есть возможность органичить урон
или

Игрался с ботами, объединял их в группу и натравливал на игрока. Урон не тестил, но сами группы создаются и работают.
 
Есть еще так называемые Relationship Groups.

И там есть возможность органичить урон
или

Игрался с ботами, объединял их в группу и натравливал на игрока. Урон не тестил, но сами группы создаются и работают.
Благодарствую, потестим, по результату дам фидбэк
 
В общем я потестил, пока что в соло (не проверял дамаг по своим из огнестрела) и разобрался. Вероятно кому-то будет это полезно, потому что половина не работает вариантов, а на половину нет инструкций по порядку взаимодействия и использования функционала.

Краткий туториал по созданию групп:

Для начала требуется обозначить уровни взаимоотношения между группами, у RAGE имеются следующие константы:
JavaScript:
    const RelationshipTypes = {
      Companion: 0,
      Respect: 1,
      Like: 2,
      Neutral: 3,
      Dislike: 4,
      Hate: 5,
      Pedestrians: 255
  };

Затем для удобства создадим наименования нашим группам, обозначив их так же как константы:
JavaScript:
  const RelationshipNames = {
    neutral: "NA",
    TeamOne: "TeamOne",
    TeamTwo: "TeamTwo"
};

Следующим этапом нам нужно "сформировать" HASH нашей группы (уникальный идентификатор группы), делается это с помощью функции mp.game.joaat(name), которая принимает строковое представление группы и переводит его в HASH значение (uint тип):
JavaScript:
const NAhash = mp.game.joaat(RelationshipNames.NA);
const TeamOnehash = mp.game.joaat(RelationshipNames.TeamOne);
const TeamTwohash = mp.game.joaat(RelationshipNames.TeamTwo);

После этого уже создаём сами группы, за создание новой группы отвечает функция addRelationshipGroup именно у Ped'a. Принимает функция строковое представление группы и её хэш:
JavaScript:
mp.game.ped.addRelationshipGroup(RelationshipNames.NA, NAhash);
mp.game.ped.addRelationshipGroup(RelationshipNames.TeamOne, TeamOnehash);
mp.game.ped.addRelationshipGroup(RelationshipNames.TeamOne, TeamTwohash);
mp.players.local.setRelationshipGroupHash(NAhash);//Делаю нашего игрока по умолчанию в группе нейтральных

Затем создаём взаимоотношения между группами с помощью ранее добавленной константы RelationshipTypes. Как я смог пока понять - тип Companion означает что урон проходить не будет (исключая вариант взрывов и сбития машиной), а тип Hate разрешает наносить дамаг соответствующей команде, в которой установлено данное взаимоотношение. Создаётся взаимоотношение с помощью функции
setRelationshipBetweenGroups, которая принимает из аргументов - тип взаимоотношения, первая группа, вторая группа:
JavaScript:
mp.game.ped.setRelationshipBetweenGroups(RelationshipTypes.Companion, NAhash, TeamOnehash);
mp.game.ped.setRelationshipBetweenGroups(RelationshipTypes.Companion, NAhash, TeamTwohash);
mp.game.ped.setRelationshipBetweenGroups(RelationshipTypes.Hate, TeamOnehash, TeamTwohash);

В данном примере описано взаимоотношение нейтральной группы к первой и второй команде, то есть они друг другу (ПО ИДЕЕ) урон нанести не смогут. А первая и вторая команда смогут друг другу нанести урон.

Далее дело остаётся за малым, нужно каждому игроку переопределить группу в зависимости от ваших потребностей. Лично у меня берётся JSON список ID игроков с серверной части на клиентскую (такой геморрой потому что группы определяются на сервере) и на клиентской части в цикле обозначаю каждому игроку его группу. Обозначается группа игроку следующей функцией:
JavaScript:
player.setRelationshipGroupHash(hash)
где hash - идентификатор группы.
Результат проверки в RAGE:MP:
1.png

Надеюсь это кому-то пригодится. Спасибо за внимание! По поводу дружественного огня по данному функционалу - проверю позже.
 
У меня корректно работают эти группы если я получаю хеш, как результат addRelationshipGroup

JavaScript:
const humanHash = mp.game.ped.addRelationshipGroup('human', 1);
const zombieHash = mp.game.ped.addRelationshipGroup('zombie', 2);
где 1 и 2 по сути рандомные числа которые не влияют ни на что.

И кстате mp.players.local.setCanBeDamagedByRelationshipGroup(false, 0); работает отлично. По крайней мере с ботами :)
20210209091236_1.jpg
Если ставлю всех в одну команду, то урон не проходит.​
 
Назад
Верх