Написание плагинов

m-v-

Участник
Сообщения
7
Реакции
0
Всем привет.

Кто может помочь с выводом логов? Конкретно нужно вывести какой у игрока ID Скина на оружии. Пример лога:
Name: Vasya. WeaponID: 1 (Дигл). SkinID: 174 (ВООМ).

То, что в скобочках - можн не выводить.
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
а зачем столько заморочек, если цель не давать игрокам бхопить ? можно просто урезать скорость при приземлении, и получится, что бегать гораздо выгоднее. ну или на крайняк кулдавн на прыжок поставить в 1.1 секунд, и прыгать без остановки не смогут. этого времени достаточно, чтобы весь накопленный скорость дропнулся ниже 250.
 
Последнее редактирование:

Doker0909

Участник
Сообщения
105
Реакции
3
WarMode (myarena)
CSS v34 (SM 1.9)
квар tv_delay не делается меньше 10, как я понял... потому что ставлю tv_delay "0" , tv_delay "1" , tv_delay "2", а всё равно работает как 10. Возможно ли сделать так, чтоб SourceTV было в реальном времени, то есть tv_delay "0"
буду благодарен за помощь

Оффтоп

---------------------------------------------------------------------------------------------
ответ тех.поддержки:
Видимо изменить нельзя, минимально 10 секунд
"tv_delay" = "10.000000" ( def. "30" ) min. 10.000000 max. 120.000000
game notify
- SourceTV broadcast delay in seconds
 
Последнее редактирование:

SIRIUS

♿___DejaVu
Сообщения
509
Реакции
253
Привет, кто поможет с плагином для VIP.
Готов заплатить, обсуждение в лс.
Суть плагина в том, чтобы при спавне VIP игрока в начале раунда ему вводилась случайная команда из списка.
Пример:
"sm_команда 1"
"sm_команда 2"
"sm_команда 3"
... и т.д.
 
Последнее редактирование:

babka68

Участник
Сообщения
2,124
Реакции
956
Всем привет,подскажите пожалуйста,стоит на сервер свой режим ДМ,есть к нему модуль позволяющий воскрешать игроков после смерти,но есть 1 нюанс,к примеру я перезапускаю сервер и сразу захожу за команду,все работает все замечательно,если я перезапущу сервер и буду зависать в пеках хотя бы минут,то при заходе за команду за любую я постоянно мертвый и не возрождаюсь,кто подскажет как решить?

C-подобный:
#pragma semicolon 1

#include <cstrike>
#include <death_match>

#pragma newdecls required

float g_fTRespawn = 1.5;

public void OnPluginStart()
{  
    HookEvent("player_death", OnClientDeath);
}

public int DeathMatch_OnAddConVar()
{
    DeathMatch_AddConVar("dm_respawn_player", "1.0", "Через сколько секунд после смерти воскресить игрока, 0 - выкл");
}

public int DeathMatch_OnGetConVar()
{
    DeathMatch_GetConVarFloat("dm_respawn_player", g_fTRespawn);
    g_fTRespawn = (g_fTRespawn < 0.0 ? 0.0 : g_fTRespawn);
}


public void OnClientDeath(Handle event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(GetEventInt(event, "userid"));
    if (!IsClientInGame(client))return;
    if (IsPlayerAlive(client))return;
    if (g_fTRespawn > 0)CreateTimer(g_fTRespawn, OnClientRespawn, client);
}

public Action OnClientRespawn(Handle timer, any client)
{
    if (!IsClientInGame(client))return;
    if (IsPlayerAlive(client))return;
   
    CS_RespawnPlayer(client);
}
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
@babka68, создавать таймер нужно тогда когда игрок сменил команду, точнее зашел за террористов или же контр-террористов.
Обязательно сделать проверку на таймер, чтобы он не задвоился. Связать его так же и со смертью игрока.
Сообщения автоматически склеены:

@SIRIUS, давно плагины не писал.

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sourcemod>
#include <vip_core>

ArrayList g_hArray;
int g_iCount;
bool g_bHook;
char g_sPath[256];

public Plugin myinfo =
{
    name = "[VIP] Spawn Command",
    author = "Drumanid",
    version = "1.0.0",
    url = "Discord: Drumanid#9108 | Telegram: t.me/drumanid"
}

#define SZF(%0) %0, sizeof(%0)
public void OnPluginStart()
{
    g_hArray = new ArrayList(ByteCountToCells(256));
    BuildPath(Path_SM, SZF(g_sPath), "data/vip/modules/vip_spawn_command.ini");
}

#define PLAYERSPAWN "player_spawn", view_as<EventHook>(Event_PlayerSpawn)
public void OnMapStart()
{
    File hFile = OpenFile(g_sPath, "r");

    if(hFile == null)
        SetFailState("No found file: %s", g_sPath);

    g_iCount = 0;
    if(g_hArray != null)
        g_hArray.Clear();
 
    char sBuffer[256];
    while(hFile.ReadLine(SZF(sBuffer)))
    {
        TrimString(sBuffer);
        if(sBuffer[0] && StrContains(sBuffer, "//") == -1)
        {
            ++g_iCount;
            g_hArray.PushString(sBuffer);
        }
    }

    delete hFile;

    if(g_hArray != null && !g_bHook)
    {
        HookEvent(PLAYERSPAWN);
        g_bHook = true;
    }
    else if(g_hArray == null && g_bHook)
    {
        UnhookEvent(PLAYERSPAWN);
        g_bHook = false;
    }
}

//public void VIP_OnPlayerSpawn(int iClient, int iTeam, bool bIsVIP)
void Event_PlayerSpawn(Event hEvent)
{
    /*if(!bIsVIP)
        return;*/

    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(iClient == 0 || !VIP_IsClientVIP(iClient))
        return;

    char sBuffer[256];
    g_hArray.GetString(GetRandomInt(0, g_iCount), SZF(sBuffer));
    FakeClientCommand(iClient, sBuffer);
}

Код не проверял, по логике должно работать.
Создай файл с командами, путь: addons/sourcemod/data/vip/modules/vip_spawn_command.ini

Пример:
sm_vip
sm_admin
sm_snovimgodom


И еще один вид реализации:

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sourcemod>
#include <vip_core>
#include <sdkhooks>

ArrayList g_hArray;
int g_iCount;
char g_sPath[256];

public Plugin myinfo =
{
    name = "[VIP] Spawn Command",
    author = "Drumanid",
    version = "1.0.1",
    url = "Discord: Drumanid#9108 | Telegram: t.me/drumanid"
}

#define SZF(%0) %0, sizeof(%0)
#define PLAYERSPAWN(%0)\
for(int i = 1; i <= MaxClients; ++i) \
if(IsClientInGame(i) && VIP_IsClientVIP(i)) \
%0(i, SDKHook_SpawnPost, SpawnPost)
public void OnPluginStart()
{
    g_hArray = new ArrayList(ByteCountToCells(256));
    BuildPath(Path_SM, SZF(g_sPath), "data/vip/modules/vip_spawn_command.ini");

    HookEvent("player_activate", view_as<EventHook>(Event_PlayerActivate));

    PLAYERSPAWN(SDKHook);
}

public void OnMapStart()
{
    File hFile = OpenFile(g_sPath, "r");

    if(hFile == null)
        SetFailState("No found file: %s", g_sPath);

    g_iCount = 0;
    if(g_hArray != null)
        g_hArray.Clear();
   
    char sBuffer[256];
    while(hFile.ReadLine(SZF(sBuffer)))
    {
        TrimString(sBuffer);
        if(sBuffer[0] && StrContains(sBuffer, "//") == -1)
        {
            ++g_iCount;
            g_hArray.PushString(sBuffer);
        }
    }

    delete hFile;

    /*if(g_hArray == null)
    {
        PLAYERSPAWN(SDKUnhook);
    }*/
}

void Event_PlayerActivate(Event hEvent)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));

    if(VIP_IsClientVIP(iClient))
        SDKHook(iClient, SDKHook_SpawnPost, SpawnPost);
}

void SpawnPost(int iClient)
{
    if(!IsClientInGame(iClient))
        return;

    char sBuffer[256];
    g_hArray.GetString(GetRandomInt(0, g_iCount), SZF(sBuffer));
    FakeClientCommand(iClient, sBuffer);
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@babka68, что-то поиском по форуму не находится.
Возрождение каждую секунду в течении х секунд с начала раунда (при 0 не заканчивается до конца раунда).
Можно выбрать какую из команд возрождать.
Можно выставить сколько раз игрок может возродиться в течении раунда (игроку в чат пишется сколько ещё возрождений у него осталось).
Можно вывести в хинт о том, сколько времени ещё продлится автоматическое возрождение.
 

Вложения

  • AutoRespawn 1.1.2.sp
    3.1 КБ · Просмотры: 4

Alega63rus

Участник
Сообщения
3
Реакции
0
Всем привет
Просьба переделать плагин Grenade Trajectory Prediction,
Сделать так что бы траекторию видел не только кидающий игрок но и остальные
Оригинал
C-подобный:
#pragma semicolon 1

#define DEBUG

#define PLUGIN_AUTHOR "Psycheat"
#define PLUGIN_VERSION "2.0.2"

#include <sourcemod>
#include <sdktools>

EngineVersion g_Game;
ConVar gravity;
new Float:factor, Float:disp;
new trail;
new trailcolor[4];
new Float:dtime;
new String:nadelist[128] = "weapon_hegrenade weapon_smokegrenade weapon_flashbang weapon_incgrenade weapon_tagrenade weapon_molotov weapon_decoy";
new Handle:sm_gtrajectory;
new Handle:sm_gtrajectory_admin;
new Handle:sm_gtrajectory_size;
new Handle:sm_gtrajectory_timestep;
new Handle:sm_gtrajectory_delay;
new Handle:sm_gtrajectory_throw;
new Handle:sm_gtrajectory_lob;
new Handle:sm_gtrajectory_roll;

public Plugin:myinfo =
{
    name = "Grenade Trajectory Prediction",
    author = PLUGIN_AUTHOR,
    description = "Predict the trajectory of a grenade before throwing.",
    version = PLUGIN_VERSION,
    url = ""
};

public OnPluginStart()
{
    g_Game = GetEngineVersion();
    if(g_Game != Engine_CSGO && g_Game != Engine_CSS)
    {
        SetFailState("This plugin is for CSGO/CSS only.");
    }
    
    gravity = FindConVar("sv_gravity");
    sm_gtrajectory = CreateConVar("sm_gtrajectory", "1.0", "Enable/Disable", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
    sm_gtrajectory_admin = CreateConVar("sm_gtrajectory", "0.0", "Enable/disable grenade prediction for admin only", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
    sm_gtrajectory_size = CreateConVar("sm_gtrajectory_size", "0.5", "Thickness of predicted trail", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.1, true, 10.0);
    sm_gtrajectory_timestep = CreateConVar("sm_gtrajectory_timestep", "0.05", "Time step for the loop, smaller = better accuracy", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.001, true, 0.5);
    sm_gtrajectory_delay= CreateConVar("sm_gtrajectory_delay", "0.0", "Delay set with other plugins", FCVAR_NOTIFY | FCVAR_DONTRECORD);
    sm_gtrajectory_throw= CreateConVar("sm_gtrajectory_throw", "0.9", "Grenade throwing speed adjustment: IN_ATTACK", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
    sm_gtrajectory_lob= CreateConVar("sm_gtrajectory_lob", "0.6", "Grenade throwing speed adjustment: IN_ATTACK + IN_ATTACK2", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
    sm_gtrajectory_roll= CreateConVar("sm_gtrajectory_roll", "0.27", "Grenade throwing speed adjustment: IN_ATTACK2", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
}

public OnMapStart()
{
    trail = PrecacheModel("sprites/laserbeam.spr");
}

public Action:OnPlayerRunCmd(int client, int &buttons)
{
    if (!GetConVarBool(sm_gtrajectory))
        return Plugin_Continue;
    
    if (GetConVarBool(sm_gtrajectory_admin))
        if(!CheckCommandAccess(client, "gtrajectory_admin_flags", ADMFLAG_GENERIC))
            return Plugin_Continue;
    
    if (!(buttons & IN_ATTACK) && !(buttons & IN_ATTACK2))
        return Plugin_Continue;
    
    decl String:cWeapon[32];
    GetClientWeapon(client, cWeapon, sizeof(cWeapon));
    if (StrContains(nadelist, cWeapon, false) != -1)
    {
        if (buttons & IN_ATTACK && buttons & IN_ATTACK2)
        {
            factor = GetConVarFloat(sm_gtrajectory_lob);
            disp = -6.0;
        }
        else if (buttons & IN_ATTACK)
        {
            factor = GetConVarFloat(sm_gtrajectory_throw);
            disp = 0.0;
        }
        else if (buttons & IN_ATTACK2)
        {
            factor = GetConVarFloat(sm_gtrajectory_roll);
            disp = -12.0;
        }
        
        ShowTrajectory(client, cWeapon);
    }
    
    return Plugin_Continue;
}

ShowTrajectory(int client, const String:cWeapon[])
{
    GetTrailColor(cWeapon);
    GetDetonationTime(cWeapon);
            
    new Float:GrenadeVelocity[3], Float:PlayerVelocity[3], Float:ThrowAngle[3], Float:ThrowVector[3], Float:ThrowVelocity;
    new Float:gStart[3], Float:gEnd[3], Float:fwd[3], Float:right[3], Float:up[3];
    
    GetClientEyeAngles(client, ThrowAngle);
    ThrowAngle[0] = -10.0 + ThrowAngle[0] + FloatAbs(ThrowAngle[0]) * 10.0 / 90.0;
    
    GetAngleVectors(ThrowAngle, fwd, right, up);
    NormalizeVector(fwd, ThrowVector);
    
    GetClientEyePosition(client, gStart);
    for (new i = 0; i < 3; i++)
        gStart[i] += ThrowVector[i] * 16.0;
    
    gStart[2] += disp;
    
    GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", PlayerVelocity);
    
    switch (g_Game)
    {
        case Engine_CSS:
        {
            ThrowVelocity = (90.0 - ThrowAngle[0]) * 6.0;
            if (ThrowVelocity > 750.0)
                ThrowVelocity = 750.0;
        }
        
        case Engine_CSGO:
        {
            ThrowVelocity = 750.0 * factor;
            ScaleVector(PlayerVelocity, 1.25);
        }
    }
    
    for (new i = 0; i < 3; i++)
        GrenadeVelocity[i] = ThrowVector[i] * ThrowVelocity + PlayerVelocity[i];
    
    new Float:dt = GetConVarFloat(sm_gtrajectory_timestep);
    for (new Float:t = 0.0; t <= dtime; t += dt)
    {
        gEnd[0] = gStart[0] + GrenadeVelocity[0] * dt;
        gEnd[1] = gStart[1] + GrenadeVelocity[1] * dt;
        
        new Float:gForce = 0.4 * float(gravity.IntValue);
        new Float:NewVelocity = GrenadeVelocity[2] - gForce * dt;
        new Float:AvgVelocity = (GrenadeVelocity[2] + NewVelocity) / 2.0;
        
        gEnd[2] = gStart[2] + AvgVelocity * dt;
        GrenadeVelocity[2] = NewVelocity;
        
        new Float:mins[3] = {-2.0, -2.0, -2.0}, Float:maxs[3] = {2.0, 2.0, 2.0};
        new Handle:gRayTrace = TR_TraceHullEx(gStart, gEnd, mins, maxs, MASK_SHOT_HULL);
        if (TR_GetFraction(gRayTrace) != 1.0)
        {
            if (TR_GetEntityIndex(gRayTrace) == client && t == 0.0)
            {
                CloseHandle(gRayTrace);
                gStart = gEnd;
                continue;
            }
            
            TR_GetEndPosition(gEnd, gRayTrace);
            
            new Float:NVector[3];
            TR_GetPlaneNormal(gRayTrace, NVector);
            new Float:Impulse = 2.0 * GetVectorDotProduct(NVector, GrenadeVelocity);
            for (new i = 0; i < 3; i++)
            {
                GrenadeVelocity[i] -= Impulse * NVector[i];
                
                if (FloatAbs(GrenadeVelocity[i]) < 0.1)
                    GrenadeVelocity[i] = 0.0;
            }
            
            new Float:SurfaceElasticity = GetEntPropFloat(TR_GetEntityIndex(gRayTrace), Prop_Send, "m_flElasticity");
            new Float:elasticity = 0.45 * SurfaceElasticity;
            ScaleVector(GrenadeVelocity, elasticity);
            
            new Float:ZVector[3] = { 0.0, 0.0, 1.0 };
            if(GetVectorDotProduct(NVector, ZVector) > 0.7)
            {
                if (StrEqual(cWeapon, "weapon_incgrenade", false) || StrEqual(cWeapon, "weapon_molotov", false))
                    dtime = 0.0;
            }
        }
        CloseHandle(gRayTrace);
        
        new Float:width = GetConVarFloat(sm_gtrajectory_size);
        TE_SetupBeamPoints(gStart, gEnd, trail, 0, 0, 0, 0.2, width, width, 0, 0.0, trailcolor, 0);
        TE_SendToClient(client, 0.0);
        
        gStart = gEnd;
    }
}

GetTrailColor(const String:weapon[])
{
    if (StrEqual(weapon, "weapon_hegrenade", false))
        trailcolor = { 255, 0, 0, 255 };
    else if (StrEqual(weapon, "weapon_smokegrenade", false))
        trailcolor = { 0, 255, 0, 255 };
    else if (StrEqual(weapon, "weapon_flashbang", false))
        trailcolor = { 0, 255, 255, 255 };
    else if (StrEqual(weapon, "weapon_incgrenade", false))
        trailcolor = { 255, 0, 255, 255 };
    else if (StrEqual(weapon, "weapon_tagrenade", false))
        trailcolor = { 0, 255, 255, 255 };
    else if (StrEqual(weapon, "weapon_molotov", false))
        trailcolor = { 255, 255, 0, 255 };
    else if (StrEqual(weapon, "weapon_decoy", false))
        trailcolor = { 255, 255, 255, 255 };
}

GetDetonationTime(const String:weapon[])
{
    if (StrContains("weapon_hegrenade weapon_flashbang", weapon,  false) != -1)
        dtime = 1.5 + GetConVarFloat(sm_gtrajectory_delay);
    else if (StrEqual("weapon_tagrenade", weapon, false))
        dtime = 5.0 + GetConVarFloat(sm_gtrajectory_delay);
    else
        dtime = 3.0 + GetConVarFloat(sm_gtrajectory_delay);
}
 

alexmy

Участник
Сообщения
284
Реакции
13
Всем привет. Я пытаюсь записать убитого игрока steam id по событию player_death, для проверки другого событие. Есть у кого какие идеи как можно записать и проверить?
 

DarkerZ

Участник
Сообщения
395
Реакции
175
Всем привет
Просьба переделать плагин Grenade Trajectory Prediction,
Сделать так что бы траекторию видел не только кидающий игрок но и остальные
Оригинал
C-подобный:
#pragma semicolon 1

#define DEBUG

#define PLUGIN_AUTHOR "Psycheat"
#define PLUGIN_VERSION "2.0.2"

#include <sourcemod>
#include <sdktools>

EngineVersion g_Game;
ConVar gravity;
new Float:factor, Float:disp;
new trail;
new trailcolor[4];
new Float:dtime;
new String:nadelist[128] = "weapon_hegrenade weapon_smokegrenade weapon_flashbang weapon_incgrenade weapon_tagrenade weapon_molotov weapon_decoy";
new Handle:sm_gtrajectory;
new Handle:sm_gtrajectory_admin;
new Handle:sm_gtrajectory_size;
new Handle:sm_gtrajectory_timestep;
new Handle:sm_gtrajectory_delay;
new Handle:sm_gtrajectory_throw;
new Handle:sm_gtrajectory_lob;
new Handle:sm_gtrajectory_roll;

public Plugin:myinfo =
{
    name = "Grenade Trajectory Prediction",
    author = PLUGIN_AUTHOR,
    description = "Predict the trajectory of a grenade before throwing.",
    version = PLUGIN_VERSION,
    url = ""
};

public OnPluginStart()
{
    g_Game = GetEngineVersion();
    if(g_Game != Engine_CSGO && g_Game != Engine_CSS)
    {
        SetFailState("This plugin is for CSGO/CSS only.");
    }
   
    gravity = FindConVar("sv_gravity");
    sm_gtrajectory = CreateConVar("sm_gtrajectory", "1.0", "Enable/Disable", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
    sm_gtrajectory_admin = CreateConVar("sm_gtrajectory", "0.0", "Enable/disable grenade prediction for admin only", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
    sm_gtrajectory_size = CreateConVar("sm_gtrajectory_size", "0.5", "Thickness of predicted trail", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.1, true, 10.0);
    sm_gtrajectory_timestep = CreateConVar("sm_gtrajectory_timestep", "0.05", "Time step for the loop, smaller = better accuracy", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.001, true, 0.5);
    sm_gtrajectory_delay= CreateConVar("sm_gtrajectory_delay", "0.0", "Delay set with other plugins", FCVAR_NOTIFY | FCVAR_DONTRECORD);
    sm_gtrajectory_throw= CreateConVar("sm_gtrajectory_throw", "0.9", "Grenade throwing speed adjustment: IN_ATTACK", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
    sm_gtrajectory_lob= CreateConVar("sm_gtrajectory_lob", "0.6", "Grenade throwing speed adjustment: IN_ATTACK + IN_ATTACK2", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
    sm_gtrajectory_roll= CreateConVar("sm_gtrajectory_roll", "0.27", "Grenade throwing speed adjustment: IN_ATTACK2", FCVAR_NOTIFY | FCVAR_DONTRECORD, true, 0.0, true, 1.0);
}

public OnMapStart()
{
    trail = PrecacheModel("sprites/laserbeam.spr");
}

public Action:OnPlayerRunCmd(int client, int &buttons)
{
    if (!GetConVarBool(sm_gtrajectory))
        return Plugin_Continue;
   
    if (GetConVarBool(sm_gtrajectory_admin))
        if(!CheckCommandAccess(client, "gtrajectory_admin_flags", ADMFLAG_GENERIC))
            return Plugin_Continue;
   
    if (!(buttons & IN_ATTACK) && !(buttons & IN_ATTACK2))
        return Plugin_Continue;
   
    decl String:cWeapon[32];
    GetClientWeapon(client, cWeapon, sizeof(cWeapon));
    if (StrContains(nadelist, cWeapon, false) != -1)
    {
        if (buttons & IN_ATTACK && buttons & IN_ATTACK2)
        {
            factor = GetConVarFloat(sm_gtrajectory_lob);
            disp = -6.0;
        }
        else if (buttons & IN_ATTACK)
        {
            factor = GetConVarFloat(sm_gtrajectory_throw);
            disp = 0.0;
        }
        else if (buttons & IN_ATTACK2)
        {
            factor = GetConVarFloat(sm_gtrajectory_roll);
            disp = -12.0;
        }
       
        ShowTrajectory(client, cWeapon);
    }
   
    return Plugin_Continue;
}

ShowTrajectory(int client, const String:cWeapon[])
{
    GetTrailColor(cWeapon);
    GetDetonationTime(cWeapon);
           
    new Float:GrenadeVelocity[3], Float:PlayerVelocity[3], Float:ThrowAngle[3], Float:ThrowVector[3], Float:ThrowVelocity;
    new Float:gStart[3], Float:gEnd[3], Float:fwd[3], Float:right[3], Float:up[3];
   
    GetClientEyeAngles(client, ThrowAngle);
    ThrowAngle[0] = -10.0 + ThrowAngle[0] + FloatAbs(ThrowAngle[0]) * 10.0 / 90.0;
   
    GetAngleVectors(ThrowAngle, fwd, right, up);
    NormalizeVector(fwd, ThrowVector);
   
    GetClientEyePosition(client, gStart);
    for (new i = 0; i < 3; i++)
        gStart[i] += ThrowVector[i] * 16.0;
   
    gStart[2] += disp;
   
    GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", PlayerVelocity);
   
    switch (g_Game)
    {
        case Engine_CSS:
        {
            ThrowVelocity = (90.0 - ThrowAngle[0]) * 6.0;
            if (ThrowVelocity > 750.0)
                ThrowVelocity = 750.0;
        }
       
        case Engine_CSGO:
        {
            ThrowVelocity = 750.0 * factor;
            ScaleVector(PlayerVelocity, 1.25);
        }
    }
   
    for (new i = 0; i < 3; i++)
        GrenadeVelocity[i] = ThrowVector[i] * ThrowVelocity + PlayerVelocity[i];
   
    new Float:dt = GetConVarFloat(sm_gtrajectory_timestep);
    for (new Float:t = 0.0; t <= dtime; t += dt)
    {
        gEnd[0] = gStart[0] + GrenadeVelocity[0] * dt;
        gEnd[1] = gStart[1] + GrenadeVelocity[1] * dt;
       
        new Float:gForce = 0.4 * float(gravity.IntValue);
        new Float:NewVelocity = GrenadeVelocity[2] - gForce * dt;
        new Float:AvgVelocity = (GrenadeVelocity[2] + NewVelocity) / 2.0;
       
        gEnd[2] = gStart[2] + AvgVelocity * dt;
        GrenadeVelocity[2] = NewVelocity;
       
        new Float:mins[3] = {-2.0, -2.0, -2.0}, Float:maxs[3] = {2.0, 2.0, 2.0};
        new Handle:gRayTrace = TR_TraceHullEx(gStart, gEnd, mins, maxs, MASK_SHOT_HULL);
        if (TR_GetFraction(gRayTrace) != 1.0)
        {
            if (TR_GetEntityIndex(gRayTrace) == client && t == 0.0)
            {
                CloseHandle(gRayTrace);
                gStart = gEnd;
                continue;
            }
           
            TR_GetEndPosition(gEnd, gRayTrace);
           
            new Float:NVector[3];
            TR_GetPlaneNormal(gRayTrace, NVector);
            new Float:Impulse = 2.0 * GetVectorDotProduct(NVector, GrenadeVelocity);
            for (new i = 0; i < 3; i++)
            {
                GrenadeVelocity[i] -= Impulse * NVector[i];
               
                if (FloatAbs(GrenadeVelocity[i]) < 0.1)
                    GrenadeVelocity[i] = 0.0;
            }
           
            new Float:SurfaceElasticity = GetEntPropFloat(TR_GetEntityIndex(gRayTrace), Prop_Send, "m_flElasticity");
            new Float:elasticity = 0.45 * SurfaceElasticity;
            ScaleVector(GrenadeVelocity, elasticity);
           
            new Float:ZVector[3] = { 0.0, 0.0, 1.0 };
            if(GetVectorDotProduct(NVector, ZVector) > 0.7)
            {
                if (StrEqual(cWeapon, "weapon_incgrenade", false) || StrEqual(cWeapon, "weapon_molotov", false))
                    dtime = 0.0;
            }
        }
        CloseHandle(gRayTrace);
       
        new Float:width = GetConVarFloat(sm_gtrajectory_size);
        TE_SetupBeamPoints(gStart, gEnd, trail, 0, 0, 0, 0.2, width, width, 0, 0.0, trailcolor, 0);
        TE_SendToClient(client, 0.0);
       
        gStart = gEnd;
    }
}

GetTrailColor(const String:weapon[])
{
    if (StrEqual(weapon, "weapon_hegrenade", false))
        trailcolor = { 255, 0, 0, 255 };
    else if (StrEqual(weapon, "weapon_smokegrenade", false))
        trailcolor = { 0, 255, 0, 255 };
    else if (StrEqual(weapon, "weapon_flashbang", false))
        trailcolor = { 0, 255, 255, 255 };
    else if (StrEqual(weapon, "weapon_incgrenade", false))
        trailcolor = { 255, 0, 255, 255 };
    else if (StrEqual(weapon, "weapon_tagrenade", false))
        trailcolor = { 0, 255, 255, 255 };
    else if (StrEqual(weapon, "weapon_molotov", false))
        trailcolor = { 255, 255, 0, 255 };
    else if (StrEqual(weapon, "weapon_decoy", false))
        trailcolor = { 255, 255, 255, 255 };
}

GetDetonationTime(const String:weapon[])
{
    if (StrContains("weapon_hegrenade weapon_flashbang", weapon,  false) != -1)
        dtime = 1.5 + GetConVarFloat(sm_gtrajectory_delay);
    else if (StrEqual("weapon_tagrenade", weapon, false))
        dtime = 5.0 + GetConVarFloat(sm_gtrajectory_delay);
    else
        dtime = 3.0 + GetConVarFloat(sm_gtrajectory_delay);
}
попробуй в 191 строке заменить TE_SendToClient(client, 0.0); на TE_SendToAll(0.0);
Сообщения автоматически склеены:

Всем привет. Я пытаюсь записать убитого игрока steam id по событию player_death, для проверки другого событие. Есть у кого какие идеи как можно записать и проверить?
C-подобный:
public Action Event_PlayerDeath(Handle hEvent, const char[] sName, bool dontBroadcast)
{
    int iClient = GetClientOfUserId(GetEventInt(hEvent, "userid"));
    if(iClient > 0 && iClient <= MaxClients && IsValidEdict(iClient) && IsClientInGame(iClient))
    {
        char sSteamID[32];
        GetClientAuthId(iClient, AuthId_Steam2, sSteamID, sizeof(sSteamID));
        ...
    }
}
 
Последнее редактирование:

alexmy

Участник
Сообщения
284
Реакции
13
Вот так вот у меня получилось. Что думаете?
PHP:
char SteamIDs[MAXPLAYERS + 1][25];

public void player_death(Event event, const char [] name, bool dontBroadcast)
{
    int player = GetClientOfUserId(event.GetInt("userid"));
    {
        if(player && IsClientInGame(player) && !IsFakeClient(player))
        {
            GetClientAuthId(player, AuthId_Steam2, SteamIDs[player], sizeof(SteamIDs[]));   
            PrintToChatAll("%N: %s",player, SteamIDs[player]);
        }
    }
}

stock bool ClientSteamID(int client)
{
    char Steamid[25];
    GetClientAuthId(client, AuthId_Steam2, Steamid, sizeof(Steamid));   
    if(StrEqual(SteamIDs[client], Steamid))   
    {
        return false;
    }
    return true;
}
 

DarkerZ

Участник
Сообщения
395
Реакции
175
Вот так вот у меня получилось. Что думаете?
PHP:
char SteamIDs[MAXPLAYERS + 1][25];

public void player_death(Event event, const char [] name, bool dontBroadcast)
{
    int player = GetClientOfUserId(event.GetInt("userid"));
    {
        if(player && IsClientInGame(player) && !IsFakeClient(player))
        {
            GetClientAuthId(player, AuthId_Steam2, SteamIDs[player], sizeof(SteamIDs[]));  
            PrintToChatAll("%N: %s",player, SteamIDs[player]);
        }
    }
}

stock bool ClientSteamID(int client)
{
    char Steamid[25];
    GetClientAuthId(client, AuthId_Steam2, Steamid, sizeof(Steamid));  
    if(StrEqual(SteamIDs[client], Steamid))  
    {
        return false;
    }
    return true;
}
по моему лучше Steamid определять при входе на сервер и уже потом делать с ним, что хочешь
 

alexmy

Участник
Сообщения
284
Реакции
13
по моему лучше Steamid определять при входе на сервер и уже потом делать с ним, что хочешь
Зачем записывать его заранее, если возможно игрок не умрёт и просто выйдет сервера? Лишний раз будет занимать память по мне так и всё.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@alexmy, ты и так массив для стимайди используешь, какая тебе разница в таком случае?
И без выхода с сервера стимайди не меняется, так что запрашивать чаще смысла нет.
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, ты и так массив для стимайди используешь, какая тебе разница в таком случае?
И без выхода с сервера стимайди не меняется, так что запрашивать чаще смысла нет.
Ну так записываю id мертвого игрока и делаю проверку ClientSteamID в другом событие, когда он пытается перезайти и опять начать играть ,не хотят ждать пока спасут. Тем более после смены карты я очищаю массив:
PHP:
public void round_end(Event event, const char [] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++)
        SteamIDs[i][0] = '\0';
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@alexmy, тогда ты неправильно сохраняешь: массив должен быть не статичный (65 ячеек для этого крайне мало, кстати).
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
@alexmy, в мое понимании лучше цифры сравнить, а не текст, для этого используем GetSteamAccountID · clients · SourceMod Scripting API Reference

Тебе правильно говорят, запиши один раз в глобальный массив, чтобы не запрашивать данные, делаешь больше операций, которые мог бы не совершать. (много памяти израсходуешь?)
(alliedmodders/sourcemod)

Бессмысленные проверки в событии player_death >>
C-подобный:
if(player && IsClientInGame(player))

И размер массива по моему неправильно нечетно использовать, можно, но опять же от этого нет никакого толку.
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, в мое понимании лучше цифры сравнить, а не текст, для этого используем GetSteamAccountID · clients · SourceMod Scripting API Reference

Тебе правильно говорят, запиши один раз в глобальный массив, чтобы не запрашивать данные, делаешь больше операций, которые мог бы не совершать. (много памяти израсходуешь?)
(alliedmodders/sourcemod)

Бессмысленные проверки в событии player_death >>
C-подобный:
if(player && IsClientInGame(player))

И размер массива по моему неправильно нечетно использовать, можно, но опять же от этого нет никакого толку.
Игра L4D. Это недостаточная проверка. Зачем я буду записывать туда всех зараженных ещё?
Сообщения автоматически склеены:

@Grey83, Я не думаю так, чтоб за одну карту умерло 65 человек и все пытались перезайти. =)) Это не контра где большая масса народа может быть. Я проверил свой вариант вроде работает. Но я не делал отладка после удаление steam idов. Так будет очищаться?
 

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Ну так проверь при событии player_team - в какую команду переходит player
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@alexmy, а что, ботов проверить с помощью IsFakeClient() нельзя в L4D стало?
 
Сверху Снизу