Half-Life и Adrenaline Gamer форум

Всё об игре в Халф-Лайф и АГ
Текущее время: 19 апр 2024, 08:10

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: No Wallgauss
СообщениеДобавлено: 17 янв 2017, 00:10 
Не в сети
Аватара пользователя
Зарегистрирован:
15 апр 2011, 22:26
Последнее посещение:
20 май 2018, 00:43
Сообщения: 164
Откуда: Астрахань
Не получается заблокировать прострел с гаусса, если человек стоит за стеной прямо в прицеле. Убивает с WG всё равно :unknown: Помогите, пожалуйста, решить проблему

В приложении есть исходный код из HLSDK, в котором описана функция стрельбы из гаусса. Там же и видно, в каких моментах и как вызывается RadiusDamage, то есть наш WG (а так ли это?)

Код:
#pragma semicolon 1

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <xs>

#define PROJECT "No Wallgauss"
#define VERSION "0.1.0a"

new const m_fPrimaryFire = 49;
new const EXTRAOFFSET_WEAPONS = 4;

new beam_tr;

public plugin_precache() {
   beam_tr = create_tr2();
}

public plugin_init() {
   register_plugin(PROJECT, VERSION, "Amezoure");
   RegisterHamPlayer(Ham_TraceAttack, "TraceAttack_Pre", 0);
}

public plugin_end() {
   free_tr2(beam_tr);
}

public TraceAttack_Pre(ent, attacker, Float:damage, Float:direction[3], traceresult, damagebits) {
   static classname[13];
   pev(attacker, pev_classname, classname, charsmax(classname));

   if (!equali(classname, "weapon_gauss")) {
      return HAM_IGNORED;
   }

   // try punching through wall if secondary attack (primary is incapable of breaking through)
   if (!get_pdata_int(attacker, m_fPrimaryFire, EXTRAOFFSET_WEAPONS)) {
      static Float:end[3], Float:start[3];
      get_tr2(traceresult, TR_vecEndPos, end);

      xs_vec_mul_scalar(direction, 8192.0, start);
      xs_vec_sub(end, start, start);

      static Float:temp[3];
      xs_vec_mul_scalar(direction, 8.0, temp);
      xs_vec_add(end, temp, temp);

      engfunc(EngFunc_TraceLine, temp, end, DONT_IGNORE_MONSTERS, ent, beam_tr);

      if (!get_tr2(beam_tr, TR_AllSolid)) {
         static Float:beam_end[3];
         get_tr2(beam_tr, TR_vecEndPos, beam_end);

         // trace backwards to find exit point
         engfunc(EngFunc_TraceLine, beam_end, end, DONT_IGNORE_MONSTERS, ent, beam_tr);

         static Float:n;
         xs_vec_sub(beam_end, end, temp);
         n = xs_vec_len(temp);

         if (n < damage) {
            if (!n) n = 1.0;
            damage -= n;

            xs_vec_mul_scalar(direction, 8.0, temp);
            xs_vec_add(beam_end, temp, temp);

            if ((ent = engfunc(EngFunc_FindEntityInSphere, ent, temp, damage * 1.75)) != 0) {
               return HAM_SUPERCEDE;
            }
         }
      }
   }

   return HAM_IGNORED;
}

 CGauss::Fire

_________________
Изображение


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: No Wallgauss
СообщениеДобавлено: 17 янв 2017, 09:18 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
18 апр 2024, 17:14
Сообщения: 6867
При прямом наведении есть ещё урон
Код:
      if (pEntity->pev->takedamage)
      {
         ClearMultiDamage();
         pEntity->TraceAttack( m_pPlayer->pev, flDamage, vecDir, &tr, DMG_BULLET );
         ApplyMultiDamage(m_pPlayer->pev, m_pPlayer->pev);
      }


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: No Wallgauss
СообщениеДобавлено: 17 янв 2017, 17:05 
Не в сети
Аватара пользователя
Зарегистрирован:
15 апр 2011, 22:26
Последнее посещение:
20 май 2018, 00:43
Сообщения: 164
Откуда: Астрахань
Сделал проверку, виден ли игрок при выстреле. В таком случае не работает прострел, если стоять вплотную к стене. Но если игрок хоть краем пятки виден на экране, то проверка не проходит :(

Код:
public TakeDamage_Pre(victim, inflictor, attacker, Float:damage, damagebits) {
   if (attacker < 1 || attacker > MaxClients) {
      return HAM_IGNORED;
   }

   static classname[13];
   pev(inflictor, pev_classname, classname, charsmax(classname));

   if (equali(classname, "weapon_gauss")) {
      if (get_pdata_int(attacker, m_fPrimaryFire, EXTRAOFFSET_WEAPONS)) return HAM_IGNORED;
   }
   else {
      return HAM_IGNORED;
   }

   static Float:start[3], Float:end[3];
   pev(attacker, pev_origin, start);
   pev(attacker, pev_view_ofs, end);
   xs_vec_add(start, end, start);

   pev(victim, pev_origin, end);
   engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, attacker, 0);

   static Float:fraction;
   get_tr2(0, TR_flFraction, fraction);
   return (fraction == 1.0 || get_tr2(0, TR_pHit) == victim) ? HAM_IGNORED : HAM_SUPERCEDE;
}

_________________
Изображение


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: No Wallgauss
СообщениеДобавлено: 17 янв 2017, 18:22 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
18 апр 2024, 17:14
Сообщения: 6867
Ну, я вообще не понял что ты хочешь узнать.


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: No Wallgauss
СообщениеДобавлено: 17 янв 2017, 19:05 
Не в сети
Аватара пользователя
Зарегистрирован:
15 апр 2011, 22:26
Последнее посещение:
20 май 2018, 00:43
Сообщения: 164
Откуда: Астрахань
Цитата:
Ну, я вообще не понял что ты хочешь узнать.

Я хочу заблокировать WG, если игрок стоит за стеной, и выстрел идёт прямо в игрока. В TakeDamage_Pre() я подобные выстрелы заблокировал, но если игрок хоть немного виден - то его убивает.

_________________
Изображение


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: No Wallgauss
СообщениеДобавлено: 17 янв 2017, 19:06 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
18 апр 2024, 17:14
Сообщения: 6867
А если не прямо в игрока, то блокировать не надо?


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: No Wallgauss
СообщениеДобавлено: 17 янв 2017, 19:52 
Не в сети
Аватара пользователя
Зарегистрирован:
15 апр 2011, 22:26
Последнее посещение:
20 май 2018, 00:43
Сообщения: 164
Откуда: Астрахань
А если не прямо в игрока - то я уже заблокировал WG в функции TraceAttack_Pre();

_________________
Изображение


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: No Wallgauss
СообщениеДобавлено: 19 янв 2017, 00:15 
Не в сети
Аватара пользователя
Зарегистрирован:
15 апр 2011, 22:26
Последнее посещение:
20 май 2018, 00:43
Сообщения: 164
Откуда: Астрахань
Так как убрать урон при прямом наведении на игрока, если он за стеной?

_________________
Изображение


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: No Wallgauss
СообщениеДобавлено: 19 янв 2017, 00:31 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
18 апр 2024, 17:14
Сообщения: 6867
Не то чтобы это было совсем невозможно...
Основная проблема: тебе надо отделить дамаг до пробивания стены от дамага после пробивания, и заблокировать второй.
А для того чтобы это отделить надо делать хук на TraceLine, чтобы иметь данные по которым игровая дллка решает будет пробивание или отражение.
Все эти расчеты происходят в Player_PostThink.
Т.е. все вызовы довольно частые. Если тебя это не пугает, хукай TraceLine и TraceAttack.
Соответственно, дальше надо будет определить начало выстрела (какой-нибудь ItemPostFrame хукнуть или прямо в Player_PostThink), и отслеживать данные TraceLine, как только будет не отражение, а пробитие, блочить все дамаги.


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: No Wallgauss
СообщениеДобавлено: 19 янв 2017, 00:41 
Не в сети
Аватара пользователя
Зарегистрирован:
15 апр 2011, 22:26
Последнее посещение:
20 май 2018, 00:43
Сообщения: 164
Откуда: Астрахань
Спасибо, буду думать :) Пока выложу на форум альфа-версию.

_________________
Изображение


Вернуться к началу
 Профиль 
  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB