Нужна помощь с плагином. Пишет ошибки в логи сервера

Алексей Кашура

Участник
Сообщения
15
Реакции
1
Заранее извиняюсь, если не правильно назвал тему

Сделал плагин для смены персонажа по steam id
C-подобный:
#include <sourcemod>
#include <sdktools>

#define TEAM_SURVIVORS 2
new Handle:Timer[MAXPLAYERS+1]; 
new String:current_map[64];

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

public OnMapStart()
{
    GetCurrentMap(current_map, sizeof(current_map));
    CheckPrecacheModels("models/survivors/survivor_mechanic.mdl");
}

public Action:PlayerSpawnModel(Handle:event,const String:name[],bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if (GetClientTeam(client) != TEAM_SURVIVORS) return Plugin_Continue;
    {
        Timer[client] = CreateTimer(1.0, UpdateClientModel, client);
    }
    return Plugin_Continue;
}

public Action:UpdateClientModel(Handle:timer, any:client)
{
    decl String:auth[32];
    GetClientAuthString(client, auth, sizeof(auth));
    if (StrEqual(auth, "STEAM_1:0:1384355"))
    {
        SetEntProp(client, Prop_Send, "m_survivorCharacter", 3);
        SetEntityModel(client, "models/survivors/survivor_mechanic.mdl");
    }
    Timer[client] = INVALID_HANDLE; 
    return Plugin_Continue;
}

public CheckPrecacheModels(String:Model[])
{
    if (!IsModelPrecached(Model)) 
    {
        PrecacheModel(Model);
    }
}
Но плагин пишет ошибки в лог сервера
C-подобный:
L 11/06/2014 - 00:00:30: [SM] Native "GetClientAuthString" reported: Client 2 is not connected
L 11/06/2014 - 00:00:30: [SM] Displaying call stack trace for plugin "ec17/model_save.smx":
L 11/06/2014 - 00:00:30: [SM]   [0]  Line 52, model_save.sp::UpdateClientModel()
L 11/06/2014 - 00:00:30: [SM] Native "GetClientAuthString" reported: Client 2 is not connected
L 11/06/2014 - 00:00:30: [SM] Displaying call stack trace for plugin "ec17/model_save.smx":
L 11/06/2014 - 00:00:30: [SM]   [0]  Line 52, model_save.sp::UpdateClientModel()
Вопрос: где мой косяк в UpdateClientModel ?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Оффтоп
где мой косяк в UpdateClientModel
Тут
Если пойти по простому пути, добавь общую проверку: if (IsClientInGame(client))
 

Алексей Кашура

Участник
Сообщения
15
Реакции
1
Оффтоп

Тут

Если пойти по простому пути, добавь общую проверку: if (IsClientInGame(client))
Да спасибо забыл) Но лучше использовать IsClientConnected(client)
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
Алексей Кашура, чем?

/**
* Returns if a certain player is connected.
*
* @param client Player index.
* @return True if player is connected to the server, false otherwise.
*/
native bool:IsClientConnected(client);

/**
* Returns if a certain player has entered the game.
*
* @param client Player index (index does not have to be connected).
* @return True if player has entered the game, false otherwise.
* @error Invalid client index.
*/
native bool:IsClientInGame(client);

Тоесть по идее для IsClientConnected индекс должен быть валиден. Хотя надо проверить.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
лучше использовать IsClientConnected(client)
Нет. Для события
игрок либо в игре, либо вовсе нет (разъединенён с сервером). И, если ты считаешь считаешь мой ответ недостаточно верным, то почему куча ненужного в столь простом коде?
Лучше проверять валидность индекса лишь в самом таймере:
PHP:
public OnPluginStart() HookEvent("player_spawn", PlayerSpawnModel);

public OnConfigsExecuted() PrecacheModel("models/survivors/survivor_mechanic.mdl");

public PlayerSpawnModel(Handle:event,const String:name[],bool:dontBroadcast) CreateTimer(0.3, UpdateClientModel, GetEventInt(event, "userid"), TIMER_FLAG_NO_MAPCHANGE);

public Action:UpdateClientModel(Handle:timer, any:userid)
{
	new client = GetClientOfUserId(userid);
	if (client && GetClientTeam(client) == 3)
	{
		decl String:auth[19];
		if (GetClientAuthString(client, auth, 19) && !strcmp(auth, "STEAM_1:0:1384355"))
		{
			SetEntProp(client, Prop_Send, "m_survivorCharacter", 3);
			SetEntityModel(client, "models/survivors/survivor_mechanic.mdl");
		}
	}return Plugin_Stop;
}
Сам таймер, думаю, можно поставить на 0.1 - 0.3, что также почти уберёт вероятность запуска нескольких таймеров убийством сразу после спавна (на DM, например).
 
Последнее редактирование:

Алексей Кашура

Участник
Сообщения
15
Реакции
1
Нет. Для события

игрок либо в игре, либо вовсе нет (разъединенён с сервером). И, если ты считаешь считаешь мой ответ недостаточно верным, то почему куча ненужного в столь простом коде?
Лучше проверять валидность индекса лишь в самом таймере:
PHP:
public OnPluginStart() HookEvent("player_spawn", PlayerSpawnModel);

public OnConfigsExecuted() PrecacheModel("models/survivors/survivor_mechanic.mdl");

public PlayerSpawnModel(Handle:event,const String:name[],bool:dontBroadcast) CreateTimer(0.3, UpdateClientModel, GetEventInt(event, "userid"), TIMER_FLAG_NO_MAPCHANGE);

public Action:UpdateClientModel(Handle:timer, any:userid)
{
    new client = GetClientOfUserId(userid);
    if (client && GetClientTeam(client) == 3)
    {
        decl String:auth[19];
        if (GetClientAuthString(client, auth, 19) && !strcmp(auth, "STEAM_1:0:1384355"))
        {
            SetEntProp(client, Prop_Send, "m_survivorCharacter", 3);
            SetEntityModel(client, "models/survivors/survivor_mechanic.mdl");
        }
    }return Plugin_Stop;
}
Сам таймер, думаю, можно поставить на 0.1 - 0.3, что также почти уберёт вероятность запуска нескольких таймеров убийством сразу после спавна (на DM, например).

Спасибо за разнесения. Учту.
 

Webman

Nevermind
Сообщения
803
Реакции
330
AlmazON, про карту не понял, что за дыра?
 
Сверху Снизу