Что я делаю не так?

N

NiGaByte

Мне нужно каждый респавн выдавать игроку хилшот, при этом:
если выжил и есть не использованный то не выдавать.
Вот что я сделал поковыряв другие плагины, работает но криво:
PHP:
#include <sourcemod>
#include <sdktools>

public OnPluginStart()
{
    HookEvent("player_spawn", Event_PlayerSpawn);
}

public Action:Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    new iClient = GetClientOfUserId(GetEventInt(event, "userid"));
    CreateTimer(0.25, GiveHealShot, iClient);
}

public Action:GiveHealShot(Handle:timer, any:iClient)
{
    if(GetEntProp(iClient, Prop_Data, "m_iAmmo", _, 21) == 0)
    {
        GivePlayerItem(iClient, "weapon_healthshot");
    }
}

public void OnMapStart()
{
    int iFlags;

    ConVar hCvar = FindConVar("ammo_item_limit_healthshot");
    if (hCvar != null)
    {
        iFlags = hCvar.Flags;
        iFlags &= ~FCVAR_CHEAT;
        hCvar.Flags = iFlags;
    }

    hCvar = FindConVar("healthshot_health");
    if (hCvar != null)
    {
        iFlags = hCvar.Flags;
        iFlags &= ~FCVAR_CHEAT;
        hCvar.Flags = iFlags;
    }
}

Не знаю зачем я присобачил таймер, просто не знаю как по другому выдать шмотку, вот лог:
C-подобный:
L 08/30/2017 - 01:38:29: SourceMod error session started
L 08/30/2017 - 01:38:29: Info (map "de_dust2") (file "errors_20170830.log")
L 08/30/2017 - 01:38:29: [SM] Exception reported: Entity 3 (3) is invalid
L 08/30/2017 - 01:38:29: [SM] Blaming: my.smx
L 08/30/2017 - 01:38:29: [SM] Call stack trace:
L 08/30/2017 - 01:38:29: [SM]   [0] GetEntProp
L 08/30/2017 - 01:38:29: [SM]   [1] Line 17, C:\Users\NB\Desktop\server\csgo\addons\sourcemod\scripting\my.sp::GiveHealShot
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #2
@NiGaByte, возможно бред, но разве в функции на старом синтаксисе клиент так указывается? По-моему, так должно:
PHP:
public Action:GiveHealShot(Handle:timer, iClient)
{
    if(GetEntProp(iClient, Prop_Data, "m_iAmmo", _, 21) == 0)
    {
        GivePlayerItem(iClient, "weapon_healthshot");
    }
}
 
N

NiGaByte

@NiGaByte, возможно бред, но разве в функции на старом синтаксисе клиент так указывается? По-моему, так должно:
PHP:
public Action:GiveHealShot(Handle:timer, iClient)
{
    if(GetEntProp(iClient, Prop_Data, "m_iAmmo", _, 21) == 0)
    {
        GivePlayerItem(iClient, "weapon_healthshot");
    }
}
Не знаю, наверное ты прав, ну я чёт так подумал и убрал вообще таймер, зачем лишние телодвижения, только не уверен что будет работать правильно потому что в UI интерфейсе клиента пишет так:
СначалаИдётИконкаШприца
А ниже написано: МедШприц(какие-то цыфры)

А бывает нормально выдаётся, и ещё бывает(очень часто при первом спавне), выдаёт, и показывает в UI что у тебя их 4 или 5, сколько там максимум я хз.
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #4
@NiGaByte, честно говоря, я тоже не понял зачем нужен там таймер.
Проблема в количестве думаю в этом:
PHP:
if (hCvar != null)
    {
        iFlags = hCvar.Flags;
        iFlags &= ~FCVAR_CHEAT;
        hCvar.Flags = iFlags;
    }
Для чего это здесь? Если хочешь ограничить количество, то не так стоит делать.
 
N

NiGaByte

@NiGaByte, честно говоря, я тоже не понял зачем нужен там таймер.
Проблема в количестве думаю в этом:
PHP:
if (hCvar != null)
    {
        iFlags = hCvar.Flags;
        iFlags &= ~FCVAR_CHEAT;
        hCvar.Flags = iFlags;
    }
Для чего это здесь? Если хочешь ограничить количество, то не так стоит делать.
ну я так думаю проверка на отсутствие значения, я хз, чисто стырил у @R1KO, по братский, в научных целях, значит переделаю, но вот ещё в чём загвостка:
bezymjannyj-jpg.25487

Файл перевода не прогрузился, т.е по дефолту клиент его не прочитал, чё ему надо то?
 

Вложения

  • Безымянный.jpg
    Безымянный.jpg
    14.2 КБ · Просмотры: 114

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #6
PHP:
#include <sourcemod>
#include <sdktools>

#pragma newdecls required
#pragma semicolon 1

/**
 * @section Generic SourceMod Events.
 */
public void OnPluginStart() {
    HookEvent("player_spawn", OnPlayerSpawn, EventHookMode_Post);

    Handle hCvar = FindConVar("ammo_item_limit_healthshot");
    if (hCvar) {
        SetConVarInt(hCvar, 1);
    }
}

/**
 * @section Event Hooks.
 */
public Action OnPlayerSpawn(Handle hEvent, const char[] szName, bool bDontBroadcast) {
    RequestFrame(OnNewFrame, GetEventInt(hEvent, "userid"));
}

/**
 * @section New Frame for player_spawn event.
 */
public void OnNewFrame(any iPlayer) {
    if ((iPlayer = GetClientOfUserId(iPlayer)) == 0 || GetEntProp(iPlayer, Prop_Data, "m_iAmmo", _, 21) != 0) {
        return;
    }

    GivePlayerItem(iPlayer, "weapon_healthshot");
}
 
N

NiGaByte

PHP:
#include <sourcemod>
#include <sdktools>

#pragma newdecls required
#pragma semicolon 1

/**
 * @section Generic SourceMod Events.
 */
public void OnPluginStart() {
    HookEvent("player_spawn", OnPlayerSpawn, EventHookMode_Post);

    Handle hCvar = FindConVar("ammo_item_limit_healthshot");
    if (hCvar) {
        SetConVarInt(hCvar, 1);
    }
}

/**
 * @section Event Hooks.
 */
public Action OnPlayerSpawn(Handle hEvent, const char[] szName, bool bDontBroadcast) {
    RequestFrame(OnNewFrame, GetEventInt(hEvent, "userid"));
}

/**
 * @section New Frame for player_spawn event.
 */
public void OnNewFrame(any iPlayer) {
    if ((iPlayer = GetClientOfUserId(iPlayer)) == 0 || GetEntProp(iPlayer, Prop_Data, "m_iAmmo", _, 21) != 0) {
        return;
    }

    GivePlayerItem(iPlayer, "weapon_healthshot");
}
Работает так-же, в том смысле что иногда рисует много шприцов в запасе, и не берёт перевод, по факту-же шприц один, не знаю с чем это связано.
Ещё вопрос, как хукнуть квар healthshot_health я попробовал создать второй локальный Handle, но на выходе в компиляторе получил 217 ошибку
 
Последнее редактирование модератором:
Сверху Снизу