SDKHook(ent, SDKHook_OnTakeDamage, OnTakeDamageEnt);

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Здравствуйте все.
Такой вопрос, вот эта ф-я SDKHook(ent, SDKHook_OnTakeDamage, OnTakeDamageEnt);
Я эту функцию запускаю в блоке создания ENT.

PHP:
public Action:OnTakeDamageDrone(ent, &attacker, &inflictor, &Float:damage, &damagetype){
if(!IsValidEntity(ent) || !IsValidClient(attacker)) return;
PrintToChatAll("Attaker %i", attacker);
......
....
..

По идее у attacker id должно быть больше игроков (attacker == атакующее ENT(не игрок!)). Ироки Дрона не трогают вообще.
Или понятнее, у меня один Дрон атакует другово, С самой атакой все нормально, но у Дронов есть функция, как бы огрызания от стрельбы в него своими. Если член его команды стреляет в своего Дрона, он стреляет в ответ.
Я пытаюсь получить attacker - но атакер, это всегда id игрока создавшего этого Дрона, получается атакуемый Дрон стреляет в ответ, но стеляет в игрока, который создал атакующего Дрона (батю), а не в самого атакующего его Дрона.

Если посмотреть саму ф-ю:
PHP:
/**
 * @brief Applies damage to an entity
 * @note Force application is dependent on game and damage type(s)
  * @param    entity         Entity index taking damage
 * @param    inflictor      Inflictor entity index
 * @param    attacker       Attacker entity index
 * @param    damage         Amount of damage
 * @param    damageType     Bitfield of damage types
 * @param    weapon         Weapon index (orangebox and later) or -1 for unspecified
 * @param    damageForce    Velocity of damage force
 * @param    damagePosition Origin of damage
 * @noreturn
 */
native SDKHooks_TakeDamage(entity, inflictor, attacker, Float:damage, damageType=DMG_GENERIC, weapon=-1, const Float:damageForce[3]=NULL_VECTOR, const Float:damagePosition[3]=NULL_VECTOR);
 */
Вроде всё должно работать так как нужно, но результат всегда такой:
Attaker 1
Attaker 1
Attaker 1
Attaker 1
Attaker 1
Attaker 1
Attaker 1
и т.д.
Хоть на локальном сервере, хоть на выделенном.
Что то я видимо делаю не так до применения этой ф-ции.
Почему так происходит? Как мне получить id непосредственно наносящей ущерб entity.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
глянь хотя бы лазерные мины фроз дарка : там как раз реализован механизм разрушения

public Action:OnTakeDamageDrone(ent, &attacker, &inflictor, &Float:damage, &damagetype) - это каллбэк для SDKHook(entity, SDKHookType:type, SDKHookCB:callback)
а SDKHooks_TakeDamage(entity, inflictor, attacker, Float:damage, damageType=DMG_GENERIC, weapon=-1, const Float:damageForce[3]=NULL_VECTOR, const Float:damagePosition[3]=NULL_VECTOR) - это уже команда нанести урон, и она должна передавать значения, а не получать их
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Интересно смотреть кто, что и как делает.
Честно сказать - ничего не понял.
Я бы делал по другому, сделал бы трассировку от мины до конечной точки, с постоянным обновлением.
При изменении длинны созданного вектора, естественно изменилась бы и конечная точка, в ней нашел бы id твердого ENT, и уже с ней бы работал.
Да даже вектор не нужен, Просто, всё то что твердое и попало в трассировку грохать. Бочки, банки, склянки поджигать, людей тоже поджигать и убивать.
Хотя может быть так и сделано. У него там больше внимания уделено ориентации бомбы в пространстве.
Но разговор сейчас не об этом.

По теме - это вот то самое и есть. Плохо работать с готовыми функциями не зная принцип их работы.

а SDKHooks_TakeDamage(entity, inflictor, attacker, Float:damage, damageType=DMG_GENERIC, weapon=-1, const Float:damageForce[3]=NULL_VECTOR, const Float:damagePosition[3]=NULL_VECTOR) - это уже команда нанести урон, и она должна передавать значения, а не получать их
А как ей тогда передать значения?
Вот cмотри:
SDKHook(ent_dron, SDKHook_OnTakeDamage, OnTakeDamageDrone); Это основная функция.

public Action:OnTakeDamageDrone(dron, &attacker, &inflictor, &Float:damage, &damagetype)
{ Это запускаемая с основной функция.
здесь меня интересует только dron и &attacker
поэтому упрощу
public Action:OnTakeDamageDrone(dron, &attacker){
так понятнее.
dron - статичный id Дрона.
&attacker - id нападающего, я так понимаю получает и передает куда то значения по ссылке.

и вот теперь самое основное:
SDKHooks_TakeDamage(entity, inflictor, attacker, Float:damage, damageType=DMG_GENERIC, weapon=-1, const Float:damageForce[3]=NULL_VECTOR, const Float:damagePosition[3]=NULL_VECTOR)
Это что такое? Может быть это SDKHook_OnTakeDamage, если это так, то получается у меня нет именно её? Именно она получает и передаёт id нападающего?
Тогда как?
Или может быть нужно это повесить не на Дрона а на игрока? Проверять его при стрельбе.
Тогда не будет работать если стреляет Дрон в Дрона, и работать при стрельбе кого либо из игроков.
Запутался короче....
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #4
Это функция, которая имитирует нанесение урона. Пример юсейджа:
PHP:
public Action event_rps(Handle hEvent, const char[] name, bool dontBroadcast) {
  if (ASHCore().GameManager().RoundState != ASHRState_Active) {
    return Plugin_Stop;
  }
 
  int iWinner, iLoser;
  iWinner = GetEventInt(hEvent, "winner");
  iLoser = GetEventInt(hEvent, "loser");
  if (iLoser == Hale) {
    g_iRPSWins[iWinner]++;
    if (g_iRPSWins[iWinner] >= 3) {
      float DmgToHale = float(HaleHealth);
     
      CPrintToChat(iWinner, "{ash}[ASH] {default}%t", "ash_RPS_player_3times");
      CPrintToChat(Hale, "{ash}[ASH] {default}%t", "ash_RPS_boss_3times");
     
      SDKHooks_TakeDamage(iLoser, iWinner, iWinner, DmgToHale, DMG_CLUB, GetEntPropEnt(iWinner, Prop_Send, "m_hActiveWeapon")); // <--
    }
  } else g_iRPSWins[iLoser] = 0;
 
  return Plugin_Handled;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
для получения значений лучше используй SDKHook_OnTakeDamagePost, а не SDKHook_OnTakeDamage (если тебе не нужно изменять получаемые значения)
И каллбэк public(victim, attacker, inflictor, Float:damage, damagetype, weapon, const Float:damageForce[3], const Float:damagePosition[3])
--- Добавлено позже ---
И вообще есть справочник для старого синтаксиса: Main - SourceMod Scripting API Reference
И нового: SourceMod Scripting API Reference
Не говоря уж о вики: Category:Sourcemod scripting - AlliedModders Wiki
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Хотелось бы продолжить тему. Ответа так и неполучил. Вернее ничего не понял.
Вопрос так и остался, как получить атакуюшего, если id атакующего больше 32(64) (т.е. это не игрок)?
SDKHook(dron, SDKHook_OnTakeDamage, OnTakeDamageDrone); // здесь dron это ENT у которого id>MaxPlayer.

public Action:OnTakeDamageDrone(dron, &attacker){

dron - это мой Дрон.
&attacker - здесь должен быть id нападающего, нападающий, в данном случае, другой Дрон (или ENT, не игрок!), но я получаю id игрока создавшего этого Дрона, а не id самого Дрона.

Если эта функция не может работать так как мне нужно, я буду искать другие варианты.
--- Добавлено позже ---
PHP:
/**
* @brief Applies damage to an entity
* @note Force application is dependent on game and damage type(s)
* @param entity Entity index taking damage
* @param inflictor Inflictor entity index
* @param attacker Attacker entity index // здесь, по идее, я должен получать id атакующего Дрона а не id игрока создавшего атакующего Дрона
* @param damage Amount of damage
* @param damageType Bitfield of damage types
* @param weapon Weapon index (orangebox and later) or -1 for unspecified
* @param damageForce Velocity of damage force
* @param damagePosition Origin of damage
* @noreturn
*/
native SDKHooks_TakeDamage(entity, inflictor, attacker, Float:damage, damageType=DMG_GENERIC, weapon=-1, const Float:damageForce[3]=NULL_VECTOR, const Float:damagePosition[3]=NULL_VECTOR);
*/
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
попробуй использовать значение параметра
@param inflictor Inflictor entity index
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
попробуй использовать значение параметра
@param inflictor Inflictor entity index

Я это пробовал, выдаёт то-же - создателя атакующего Дрона, может еще выдать id дронов (или других ENT, игроков) находящихся рядом, видимо кому достается "до кучи", нечайно. Это не то.
Видимо этот хук работает только на игроков.

Нужно посмотреть исходник хука. Может быть натив сделать свой. Головняк, одно слово.

Не могу найти исходники. Кто нибудь знает где их искать?
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #11
это по всем инлюдам и инклюдам инклюд пройтись и т.ди и т.п.
Названия файлов исходников у SM как бы кричат порой, что в них содержится. Так что нет.
К тому же, Феникс кинул ссылку сразу на файл, и сразу на нужную функцию.

Да, он пишет расширения.
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@komashchenko,

Напиши урок, по настройке среды разработки под SourceSDK (на примере Microsoft Visual Studio например 2017, или какой там у тебя).
Практически нет уроков, а головняк с настройкой есть.
Я понимаю что с каждой студией свои проблемы, но хотя-бы на примере своей, которая рабочая.
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #13
@tonline_kms65_1, он под Линуксом только компилирует. Под Винду ему кто-то другой собирает.
 

DarklSide

Участник
Сообщения
931
Реакции
468
Я пытаюсь получить attacker - но атакер, это всегда id игрока создавшего этого Дрона

Нужно смотреть код создания ent.

Так же можете посмотреть в сторону HookEntityOutput / HookSingleEntityOutput
out: OnHealthChanged, OnTakeDamage и т.д.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Я это пробовал, выдаёт то-же - создателя атакующего Дрона, может еще выдать id дронов (или других ENT, игроков) находящихся рядом, видимо кому достается "до кучи", нечайно.
а как ты сделал нанесение дамага дроном?
Копай в эту сторону, тогда.
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@Grey83,
Хм... об этом я не думал.
А как можно использовать? Ущерб я делаю point_hurt
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
думаю, что нужно вот здесь менять: AcceptEntityInput(point_hurt, "Hurt", attacker);
хотя не проверял ещё
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Так.
Я так увлекся пониманием работы этой ф-ии что напрочь забыл зачем я это делаю.
Суть то моей проблемы была такая:
Есть Дрон, он может стрелять как в противников, так и в своих, в тех кто стреляет в него (защищается).
1. В противников игроков стрельба ведется из пулемета (ущерб делаю point_hurt). //работает без ошибок
2. В противников ENT (NPCs созданных мною) стрельба ведется самонаводящимися ракетами. //работает без ошибок
3. В игроков своей команды (если они обижают своего Дрона) стрельба ведется из пулемета (фун-ция OnTakeDamage ). //работает без ошибок

Так вот, что получается, при попадании ракетами противника в Дрона, он начинает в ответ стрелять из пулемета по игроку создавшему этот Дрон (использует ф-ю OnTakeDamage ), как будто ущерб Дрону причинил его создатель. Причина - я это и описывал выше. OnTakeDamage выдает атакующего не иначе как создателя Дрона.

Вот. А то я уже и забыл первопричину проблемы.
--- Добавлено позже ---
Поэтому
AcceptEntityInput(point_hurt, "Hurt", attacker);
не поможет.
Хотя, может быть я так зациклился, что чего-то явного не замечаю.
Сама суть Дрона на видео (это была начальная стадия, сейчас уже от этого далеко ушел).
Получается в момент этой перестрелки, при попадании ракетой в "моего" дрона, он стреляет ракетами в противника, как и положенно, но паралельно стреляет из пулемета в своего создателя.

 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #19
@tonline_kms65_1, по идее инфликтор должен быть равен нулю или самому игроку, если это point_hurt. Вот от этого уже можно отталкиваться и думать костыли.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
В public Action:OnTakeDamageDrone(dron, &attacker, &inflictor, &Float:damage, &damagetype) проверяй как attacker так и inflictor, и если они не равны, то это значит то, что дамаг нанёс не игрок.
Если это так, то проверяй класс энтити inflictor
 
Сверху Снизу