[Решено] Проблема с плагином на возрождение

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
Приветствую всех читателей данной темы. Недавно столкнулся с проблемой, а именно, когда я пытаюсь возродить человека через функцию:
PHP:
CS_RespawnPlayer(iClient)
То он возрождается, но так, что не может ходить, стрелять, прыгать и отображается в ТАБе как мёртвый.
Прошу помочь решить данную проблему, заранее спасибо.
Игра: CS:GO

01 "Admin File Reader" (1.9.0.6273) by AlliedModders LLC
02 "Admin Help" (1.9.0.6273) by AlliedModders LLC
03 "Admin Menu" (1.9.0.6273) by AlliedModders LLC
04 "Anti-Flood" (1.9.0.6273) by AlliedModders LLC
05 "Basic Ban Commands" (1.9.0.6273) by AlliedModders LLC
06 "Basic Chat" (1.9.0.6273) by AlliedModders LLC
07 "Basic Comm Control" (1.9.0.6273) by AlliedModders LLC
08 "Basic Commands" (1.9.0.6273) by AlliedModders LLC
09 "Basic Info Triggers" (1.9.0.6273) by AlliedModders LLC
10 "Basic Votes" (1.9.0.6273) by AlliedModders LLC
11 "Client Preferences" (1.9.0.6273) by AlliedModders LLC
12 "Fun Commands" (1.9.0.6273) by AlliedModders LLC
13 "Fun Votes" (1.9.0.6273) by AlliedModders LLC
14 "Nextmap" (1.9.0.6273) by AlliedModders LLC
15 "Player Commands" (1.9.0.6273) by AlliedModders LLC
16 "Reserved Slots" (1.9.0.6273) by AlliedModders LLC
17 "respawn_players.smx"
18 "Sound Commands" (1.9.0.6273) by AlliedModders LLC

SourceMod Version: 1.9.0.6273
SourcePawn Engine: 1.9.0.6273, jit-x86 (build 1.9.0.6273)
SourcePawn API: v1 = 4, v2 = 12
Compiled on: Jan 1 2019 12:57:25
Built from: Fix BfRead.BytesLeft not being able to be optional. (fixes #945). · alliedmodders/sourcemod@95027e0
Build ID: 6273:95027e0a
SourceMod: Half-Life 2 Scripting

PHP:
#include <cstrike>
#include <sourcemod>

bool g_bRespawn;
Handle g_hTimer;

public void OnPluginStart()
{   
   HookEvent("player_death", Event_PlayerDeath);
   HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
   
   RegConsoleCmd("sm_stopspawn", StopSpawn);
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
   for(int i = 1; i <= MaxClients; ++i)
   {   
       if(IsClientInGame(i) && !IsFakeClient(i))
           PrintToChat(i, "Если вы умрете, вы будете возрождены в течении 30 секунд после начала раунда");       
   }   
   g_bRespawn = true;
   g_hTimer = CreateTimer(30.0, Timer_Spawn, 0, TIMER_FLAG_NO_MAPCHANGE);
}

public Action StopSpawn(iClient, int args)
{
   g_bRespawn = false;
   for(int i = 1; i <= MaxClients; ++i)
   {
      if(IsClientInGame(i) && !IsFakeClient(i))
           PrintToChat(i, "Возрождение окончено, человеком по индексом %i", iClient);
       KillTimer(g_hTimer);
   }
   PrintToChat(iClient, "Молодец");
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
   int iUserId = hEvent.GetInt("userid");
   int iClient = GetClientOfUserId(iUserId);
   
   if(g_bRespawn == true && IsClientInGame(iClient))
   {
       CS_RespawnPlayer(iClient);
   }
}

public Action Timer_Spawn(Handle hTimer)
{
   g_bRespawn = false;
   for(int i = 1; i <= MaxClients; ++i)
   {   
       if(IsClientInGame(i) && !IsFakeClient(i))
           PrintToChat(i, "Возрождение окончено по истечению времени");
       KillTimer(g_hTimer);
   }   
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
м/б дело в 1.9, может в КСГО

Вообще немного почистил код
PHP:
#include <cstrike>

Handle g_hTimer;

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);

    RegConsoleCmd("sm_stopspawn", StopSpawn);
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(!g_hTimer) return;

    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(iClient && GetClientTeam(iClient) > 1) CS_RespawnPlayer(iClient);
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    PrintToChatAll("Если Вы умрете в течении 30 секунд после начала раунда, то будете возрождены");
    if(g_hTimer) KillTimer(g_hTimer);
    g_hTimer = CreateTimer(30.0, Timer_Spawn, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action StopSpawn(iClient, int args)
{
    if(!g_hTimer) return Plugin_Handled;

    KillTimer(g_hTimer);
    g_hTimer = null;

    PrintToChatAll("Возрождение остановил: %N", iClient);
    PrintToChat(iClient, "Молодец");
    return Plugin_Handled;
}

public Action Timer_Spawn(Handle hTimer)
{
    PrintToChatAll("Возрождение окончено по истечению времени");
    g_hTimer = null;
}
 

Вложения

  • 0000.sp
    1.3 КБ · Просмотры: 4
  • 0000.smx
    4.8 КБ · Просмотры: 1

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
м/б дело в 1.9, может в КСГО

Вообще немного почистил код
PHP:
#include <cstrike>

Handle g_hTimer;

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);

    RegConsoleCmd("sm_stopspawn", StopSpawn);
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(!g_hTimer) return;

    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(iClient && GetClientTeam(iClient) > 1) CS_RespawnPlayer(iClient);
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    PrintToChatAll("Если Вы умрете в течении 30 секунд после начала раунда, то будете возрождены");
    if(g_hTimer) KillTimer(g_hTimer);
    g_hTimer = CreateTimer(30.0, Timer_Spawn, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action StopSpawn(iClient, int args)
{
    if(!g_hTimer) return Plugin_Handled;

    KillTimer(g_hTimer);
    g_hTimer = null;

    PrintToChatAll("Возрождение остановил: %N", iClient);
    PrintToChat(iClient, "Молодец");
    return Plugin_Handled;
}

public Action Timer_Spawn(Handle hTimer)
{
    PrintToChatAll("Возрождение окончено по истечению времени");
    g_hTimer = null;
}
Спасибо за код, но все равно возрождение не работает.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Игрока нельзя сразу возрождать как только он умер, используй еще один таймер (0.0) или же RequestFrame

И я бы сделал немного иначе:

PHP:
#include <cstrike>

int g_iTime;
//bool g_bIsOff;

public void OnPluginStart()
{
    HookEvent("round_start", view_as<EventHook>(RoundStart), EventHookMode_PostNoCopy);
    RegConsoleCmd("sm_stopspawn", StopSpawnCommand);
}

#define TIME 30
void RoundStart()
{
    PrintToChatAll("Если Вы умрете в течении %i секунд после начала раунда, то будете возрождены", TIME);

    int iTime = GetTime();
    if(g_iTime < iTime) HookEvent("player_death", view_as<EventHook>(PlayerDeath));
    g_iTime = iTime + TIME;
    //g_bIsOff = false;
}

public Action StopSpawnCommand(int iClient, int iArgs)
{
    if(iClient && iArgs == 0)
    {
        PrintToChatAll("Возрождение остановил: %N", iClient);
        PrintToChat(iClient, "Молодец");
        g_iTime = GetTime() -1;
        //g_bIsOff = true;
    }

    return Plugin_Handled;
}

void PlayerDeath(Event hEvent)
{
    if(g_iTime < GetTime())
    {
        UnhookEvent("player_death", view_as<EventHook>(PlayerDeath));
        //if(!g_bIsOff) PrintToChatAll("Возрождение окончено по истечению времени");
    }
    else RequestFrame(PlayerDeathFrame, hEvent.GetInt("userid"));
}

void PlayerDeathFrame(int iClient)
{
    if((iClient = GetClientOfUserId(iClient)) && GetClientTeam(iClient) > 1
    && !IsPlayerAlive(iClient)) CS_RespawnPlayer(iClient);
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@Drumanid, @MrChester, тогда вот так:
PHP:
#include <cstrike>

Handle g_hTimer;

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);

    RegConsoleCmd("sm_stopspawn", StopSpawn);
}

public void Event_PlayerDeath(Event event, const char[] sEvName, bool bDontBroadcast)
{
    if(g_hTimer) RequestFrame(RequestFrame_Callback, event.GetInt("userid"));
}

public void RequestFrame_Callback(any client)
{
    if((GetClientOfUserId(client)) && GetClientTeam(client) > 1) CS_RespawnPlayer(client);
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    PrintToChatAll("Если Вы умрете в течении 30 секунд после начала раунда, то будете возрождены");
    if(g_hTimer) KillTimer(g_hTimer);
    g_hTimer = CreateTimer(30.0, Timer_Spawn, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action StopSpawn(iClient, int args)
{
    if(!g_hTimer) return Plugin_Handled;

    KillTimer(g_hTimer);
    g_hTimer = null;

    PrintToChatAll("Возрождение остановил: %N", iClient);
    PrintToChat(iClient, "Молодец");
    return Plugin_Handled;
}

public Action Timer_Spawn(Handle hTimer)
{
    PrintToChatAll("Возрождение окончено по истечению времени");
    g_hTimer = null;
}
 

Вложения

  • 0000.sp
    1.3 КБ · Просмотры: 3
  • 0000.smx
    4.9 КБ · Просмотры: 3

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
@Grey83, @Drumanid, спасибо за помощь! Как начинающий программист в сфере SourcePawn и языков C, хотел бы спросить где официально про все это можно узнать, т. е. к примеру, где узнать название всех функций (strlen, PrintToChatAll и т. д.), их параметры, для чего они нужны?
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
Спасибо) Но вот только Ваш код не хочет возрождать вообще человека

L 01/05/2019 - 17:48:57: [SM] Exception reported: Client 12 is not in game
L 01/05/2019 - 17:48:57: [SM] Blaming: respawn_players.smx
L 01/05/2019 - 17:48:57: [SM] Call stack trace:
L 01/05/2019 - 17:48:57: [SM] [0] GetClientTeam
L 01/05/2019 - 17:48:57: [SM] [1] Line 20, D:\NeedEd\CSGO Servers\server_csgo\csgo\addons\sourcemod\scripting\respawn_players.sp::RequestFrame_Callback

P.S. - Немного переделал, кому интересно, вот код:
PHP:
#include <cstrike>

Handle g_hTimer;

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);

    RegConsoleCmd("sm_stopspawn", StopSpawn);
}

public void Event_PlayerDeath(Event event, const char[] sEvName, bool bDontBroadcast)
{
    if(g_hTimer)
    {       
        int iUserId = event.GetInt("userid");
        int iClient = GetClientOfUserId(iUserId);
        PrintToChatAll("Умер: %N c индексом: %i", iClient, iClient);
        RequestFrame(RequestFrame_Callback, iClient);
    }
}

public void RequestFrame_Callback(int iClient)
{
    if(iClient && GetClientTeam(iClient) > 1)
    {
        CS_RespawnPlayer(iClient);
        PrintToChat(iClient, "Ты возродился");
    }
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    PrintToChatAll("Если Вы умрете в течении 30 секунд после начала раунда, то будете возрождены");
    if(g_hTimer) KillTimer(g_hTimer);
    g_hTimer = CreateTimer(30.0, Timer_Spawn, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action StopSpawn(iClient, int args)
{
    if(!g_hTimer) return Plugin_Handled;

    KillTimer(g_hTimer);
    g_hTimer = null;

    PrintToChatAll("Возрождение остановил: %N", iClient);
    PrintToChat(iClient, "Молодец");
    return Plugin_Handled;
}

public Action Timer_Spawn(Handle hTimer)
{
    PrintToChatAll("Возрождение окончено по истечению времени");
    g_hTimer = null;
}
 
Последнее редактирование:
Сверху Снизу