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

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

  • Страница 1 из 1
  • 1
Отбросить игрока при попадании
Shouldercannon Дата: Воскресенье, 17.03.2024, 18:01:35 | Сообщение # 1
Сообщений: 21
Репутация: 0 [ +/- ]
Так я отбрасываю игроков при попадании в тело или рядом, например под ноги.
Код
#include <sdktools>

new Handle:cvarRadius;
new Handle:cvarMagnitude;

int g_sprite = 0;

...

public OnPluginStart()
{
    cvarRadius = CreateConVar("sm_rocketguns_radius", "150", "Radius of the explosions.", 0, true, 150.0, false, _);
    cvarMagnitude = CreateConVar("sm_rocketguns_magnitude", "300", "Magnitude of the explosions.", 0, true, 300.0, false, _);
    AutoExecConfig(true, "rocket_guns");

    HookEvent("bullet_impact", Event_BulletImpact, EventHookMode_Pre);    
}

public OnMapStart()
{
    g_sprite = PrecacheGeneric("sprites/zerogxplode.spr", true);
}

public Action Event_BulletImpact(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if (!IsClientInGame(client))
  return;

    new Float:origin[3];
    origin[0] = GetEventFloat(event, "x");
    origin[1] = GetEventFloat(event, "y");
    origin[2] = GetEventFloat(event, "z");

    new Float:ClientOrigin[3];
    GetClientAbsOrigin(client, ClientOrigin);

    char weapon[32];
    GetClientWeapon(client, weapon, sizeof(weapon));

    if (StrContains("weapon_deagle", weapon) != -1)
    {
  new radius = GetConVarInt(cvarRadius);
  new magnitude = GetConVarInt(cvarMagnitude);

  char s_radius[32];
  char s_magnitude[32];
  IntToString(radius, s_radius, sizeof(s_radius));
  IntToString(magnitude, s_magnitude, sizeof(s_magnitude));

  new entity = CreateEntityByName("env_explosion");
  DispatchKeyValueVector(entity, "origin", origin);
  DispatchKeyValue(entity, "imagnitude", s_magnitude);
  DispatchKeyValue(entity, "iradiusoverride", s_radius);
  DispatchKeyValue(entity, "spawnflags", "0");
  SetEntPropEnt(entity, Prop_Send, "m_hOwnerEntity", client);

  DispatchSpawn(entity);
  AcceptEntityInput(entity, "Explode");

  TE_SetupExplosion(origin, g_sprite, 1.0, 10, TE_EXPLFLAG_NONE, radius, magnitude);
  TE_SendToAll();
    }
}

Вот с такими параметрами

  • sm_rocketguns_magnitude "300"
  • sm_rocketguns_radius "150"

или

  • sm_rocketguns_magnitude "1300"
  • sm_rocketguns_radius "1150"


Игроки очень слабо отталкиваются, зато их тела после смерти улетают с бешеной скорость.

Есть ли ещё метода как отталкивать игроков при попадании?


Сообщение отредактировал Shouldercannon - Понедельник, 18.03.2024, 05:22:16
 
_wS_ Дата: Четверг, 21.03.2024, 20:12:25 | Сообщение # 2
Толкнуть можно и так:
TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, velocity);

Только нужно вычислить velocity.
Для примера, в черновике нашел "толкнуть туда, куда смотришь":

Код
float angles[3];
GetClientEyeAngles(client, angles);

float end_pos[3];
// end_pos = например, позиция врага.

float velocity[3];
MakeVectorFromPoints(start_pos, end_pos, velocity);
ScaleVector(velocity, 10.0);

TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, velocity);
 
Shouldercannon Дата: Суббота, 23.03.2024, 19:43:42 | Сообщение # 3
Сообщений: 21
Репутация: 0 [ +/- ]
На себе работает, но это не то. Допустим я выстрелил в толпу и эту толпу должно раскидать в разные стороны.


Сообщение отредактировал Shouldercannon - Суббота, 23.03.2024, 21:09:14
 
_wS_ Дата: Суббота, 23.03.2024, 21:55:27 | Сообщение # 4
Цитата Shouldercannon ()
На себе работает, но это не то. Допустим я выстрелил в толпу и эту толпу должно раскидать в разные стороны.

Почему не то, дело же лишь в вычислении velocity для каждого игрока. Координаты взрыва есть (A), ой тут не взрыв, но значит нужно получить координаты попадания пули, затем ближайших игроков, и вычислить как-то координаты центра, мб средним арифметическим (сложить координаты игроков и разделить на их кол-во). Координаты игроков есть (B) и остаётся сделать MakeVectorFromPoints(A, B, velocity);

Ещё может помочь функция в этой теме для сдвига координат в нужную сторону.
 
Shouldercannon Дата: Понедельник, 25.03.2024, 10:16:56 | Сообщение # 5
Сообщений: 21
Репутация: 0 [ +/- ]
От гранаты получается нужный эффект. Только нужно поймать точку куда попала пуля и сделать там взрыв гранаты.
 
  • Страница 1 из 1
  • 1
Поиск: