Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Суицидники на сервере.
tonline_kms65 Дата: Суббота, 07.11.2015, 17:39:02 | Сообщение # 1
Сообщений: 215
Репутация: 3 [ +/- ]
Проблема такая - создаю свое оружие, проще энтитьку от которой взрыв - ущерб.
Так вот когда игрока убивают, получается что он как бы сам себя убил, в моем случае гранатой. Не отображается атакующий. Какой функцией это отобразить?

Кусок кода:


Делаю HookEvent("bullet_impact", Event_BulletImpact);
public Action:Event_BulletImpact(Handle:event, const String:weaponName[], bool:dontBroadcast)
Может быть ошибка в регистрации?

Вот что нашел. Это явно то что нужно. Только не пойму как задействовать. Проблема с определением Player и Index.
new Handle:HookDeathMsg = CreateEvent ( "player_death" );
SetEventInt ( HookDeathMsg, "userid", GetClientUserId ( Player ) );
SetEventInt ( HookDeathMsg, "attacker", GetClientUserId ( Index ) );
SetEventString ( HookDeathMsg, "weapon", "world" );
FireEvent ( HookDeathMsg );

Player и Index - я так понимаю их нужно сначала определить в радиусе поражения, делать наверно надо в цикле. Цикл судя по всему нужно запускать в момент взрыва.
Что то заморочено напрочь. Может я что то не так понимаю?
Для уточнения - такие суицидники появляются после попадания их в радиус взрыва. Если попасть прямо в тело или в голову то все отображается правильно. То-есть косяк только при убийстве энтитькой.

Гости не могут скачивать файлы


Сообщение отредактировал tonline_kms65 - Суббота, 07.11.2015, 17:45:42
 
BarD Дата: Суббота, 07.11.2015, 18:38:55 | Сообщение # 2
Сообщений: 943
Репутация: 137 [ +/- ]
Попробуй разобрать плагин LaserMines или TripMines. Там есть код взрыва, вроде. Что-то там видел про оффсет "LastAttacker" (или что-то в этом роде). Он отвечает за запоминание индекса последнего атакующего, чтоб от его лица убивать других. Может, и тебе поможет.
 
_wS_ Дата: Суббота, 07.11.2015, 23:00:27 | Сообщение # 3
Если я правильно понял, и такой вариант подойдет наверно:
Код
new bool:g_bNeedBlock[MAXPLAYERS + 1];
public OnClientPutInServer(client) g_bNeedBlock[client] = false;

1. SDKHook_OnTakeDamage - проверяешь attacker/inflictor, если атакующий тот, кто тебе нужен, и damage >= GetEntProp(client, Prop_Send, "m_iHealth"), делаешь g_bNeedBlock[client] = true (если attacker/inflictor не определяются, то создать взрыв без повреждений можно, просто эффект + звук, только самому расстояние к игрокам проверять придетц и дамаг им наносить)

2. Pre хук player_death

public Action:player_death(Handle:event, const String:name[], bool:silent)
{
  new client = GetClientOfUserId(GetEventInt(event, "userid"));
  if (g_bNeedBlock[client])
  {
    g_bNeedBlock[client] = false;
    CreateTimer(0.01, zzz, client, TIMER_FLAG_NO_MAPCHANGE);
    return Plugin_Handled;
  }
  return Plugin_Continue;
}

public Action:zzz(Handle:timer, any:client)
{
  // тут уже создаешь player_death событие с нужными параметрами
  return Plugin_Stop;
}
 
  • Страница 1 из 1
  • 1
Поиск: