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

Тема в разделе "Программирование / Скриптинг", создана пользователем Алексей Кашура, 6 ноя 2014.

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

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

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

    Сделал плагин для смены персонажа по steam id
    Код:
    #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);
        }
    }
    Но плагин пишет ошибки в лог сервера
    Код:
    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 ?
     
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.517
    Симпатии:
    1.969
    Оффтоп
    Тут
    Если пойти по простому пути, добавь общую проверку: if (IsClientInGame(client))
     
    Алексей Кашура нравится это.
  3. Алексей Кашура

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

    Сообщения:
    15
    Симпатии:
    1
    Да спасибо забыл) Но лучше использовать IsClientConnected(client)
     
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.977
    Симпатии:
    2.983
    Алексей Кашура, чем?

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

    AlmazON деревянный © yand3xmail

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

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

    public 
    PlayerSpawnModel(Handle:event,const String:name[],bool:dontBroadcastCreateTimer(0.3UpdateClientModelGetEventInt(event"userid"), TIMER_FLAG_NO_MAPCHANGE);

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

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

    Сообщения:
    15
    Симпатии:
    1
    Спасибо за разнесения. Учту.
     
  7. Webman

    Webman Developer

    Сообщения:
    702
    Симпатии:
    182
    AlmazON, про карту не понял, что за дыра?
     
  8. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.517
    Симпатии:
    1.969
    Карту узнали, записали в буфер
    и всё - в никуда, нигде это не используется.