Фикс плагина

Amaralle

Участник
Сообщения
2
Реакции
0
Плагин очень сильно забивает логи, хоть и работает стабильно.
В общем кому не сложно фиксаните, Зарание Спасибо :)

Лог
[SM] Native "AcceptEntityInput" reported: Entity -1 (-1) is not a CBaseEntity
[SM] Displaying call stack trace for plugin "shop_pets.smx":
[SM] [0] Line 144, C:\Users\TonkiTon\Desktop\комли 2\addons\sourcemod\scripting\shop_pets.sp::OnPlayerRunCmd()

Исход
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <shop>

public Plugin:myinfo =
{
    name = "[Shop] Pets",
    author = "Pheonix (????Феникс????) & Zephyrus",
    version = "1.0",
    url = "http://www.hlmod.ru/ http://zizt.ru/"
};

enum Pet
{
    String:model[PLATFORM_MAX_PATH],
    String:run[64],
    String:idle[64],
    Float:fPosition[3],
    Float:fAngles[3]
}

new bool:g_iPets[MAXPLAYERS+1];
new g_unClientPet[MAXPLAYERS+1] = {INVALID_ENT_REFERENCE, ...};
new g_unSelectedPet[MAXPLAYERS+1][Pet];
new g_unLastAnimation[MAXPLAYERS+1]={-1,...};

new Handle:g_hKv;


public OnPluginStart()
{
    HookEvent("player_spawn", Pets_PlayerSpawn);
    HookEvent("player_death", Pets_PlayerDeath);
    decl String:buffer[PLATFORM_MAX_PATH];
    if (g_hKv != INVALID_HANDLE) CloseHandle(g_hKv);
   
    g_hKv = CreateKeyValues("Pets");
   
    Shop_GetCfgFile(buffer, sizeof(buffer), "pets.ini");
   
    if (!FileToKeyValues(g_hKv, buffer)) SetFailState("Файл конфигураций не найден %s", buffer);
    if (Shop_IsStarted()) Shop_Started();
}

public Shop_Started()
{
    new CategoryId:category_id = Shop_RegisterCategory("pets", "Питомцы", "");
   
    decl String:sName[64], String:sDescription[64];
    KvRewind(g_hKv);

    if (KvGotoFirstSubKey(g_hKv))
    {
        decl iPrice;
        do
        {
            if (KvGetSectionName(g_hKv, sName, sizeof(sName)) && Shop_StartItem(category_id, sName))
            {
                iPrice = KvGetNum(g_hKv, "price", 1000);
                KvGetString(g_hKv, "name", sDescription, sizeof(sDescription), sName);
                Shop_SetInfo(sDescription, "", iPrice, iPrice/2, Item_Togglable, KvGetNum(g_hKv, "duration", 0));
                Shop_SetCallbacks(_, OnEquipItem);
                Shop_EndItem();
            }
        }
        while (KvGotoNextKey(g_hKv));
    }
}

public ShopAction:OnEquipItem(iClient, CategoryId:category_id, const String:category[], ItemId:item_id, const String:sItem[], bool:isOn, bool:elapsed)
{
    if (isOn || elapsed)
    {
        ResetPet(iClient);
        g_iPets[iClient]=false;
        return Shop_UseOff;
    }
   
    Shop_ToggleClientCategoryOff(iClient, category_id);
    decl Float:m_fTemp[3];
    KvRewind(g_hKv);
    if (KvJumpToKey(g_hKv, sItem, false))
    {
        KvGetString(g_hKv, "model", g_unSelectedPet[iClient][model], PLATFORM_MAX_PATH);
        PrecacheModel(g_unSelectedPet[iClient][model], true);
        KvGetString(g_hKv, "idle", g_unSelectedPet[iClient][idle], 64);
        KvGetString(g_hKv, "run", g_unSelectedPet[iClient][run], 64);
        KvGetVector(g_hKv, "position", m_fTemp);
        g_unSelectedPet[iClient][fPosition]=m_fTemp;
        KvGetVector(g_hKv, "angles", m_fTemp);
        g_unSelectedPet[iClient][fAngles]=m_fTemp;
        ResetPet(iClient);
        CreatePet(iClient);
        g_iPets[iClient]=true;
        return Shop_UseOn;
    }
   
    PrintToChat(iClient, "Failed to use \"%s\"!.", sItem);
   
    return Shop_Raw;
}

public OnClientConnected(client)
{
    g_iPets[client]=false;
}

public OnClientDisconnect(client)
{
    g_iPets[client]=false;
}

public Action:Pets_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(!(2<=GetClientTeam(client)<=3) || !g_iPets[client])
        return Plugin_Continue;

    ResetPet(client);
    CreatePet(client);

    return Plugin_Continue;
}

public Action:Pets_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    ResetPet(GetClientOfUserId(GetEventInt(event, "userid")));
}

public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon, &subtype, &cmdnum, &tickcount, &seed, mouse[2])
{
    if(!g_iPets[client] || g_unClientPet[client]==INVALID_ENT_REFERENCE || !IsPlayerAlive(client)) return;

    if(tickcount % 5 == 0)
    {
        new Float:vec[3];
        decl Float:dist;
        GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", vec);
        dist = GetVectorLength(vec);
        if(g_unLastAnimation[client] != 1 && dist > 0.0)
        {
            SetVariantString(g_unSelectedPet[client][run]);
            AcceptEntityInput(EntRefToEntIndex(g_unClientPet[client]), "SetAnimation"); //144 СТРОЧКА

            g_unLastAnimation[client]=1;
        }
        else if(g_unLastAnimation[client] != 2 && dist == 0.0)
        {
            SetVariantString(g_unSelectedPet[client][idle]);
            AcceptEntityInput(EntRefToEntIndex(g_unClientPet[client]), "SetAnimation");
            g_unLastAnimation[client]=2;
        }
    }
}

public CreatePet(client)
{
    if(g_unClientPet[client] != INVALID_ENT_REFERENCE || !IsPlayerAlive(client)) return;


    new m_unEnt = CreateEntityByName("prop_dynamic_override");
    if (IsValidEntity(m_unEnt))
    {
        new Float:m_flPosition[3];
        new Float:m_flAngles[3];
        new Float:m_flClientOrigin[3];
        new Float:m_flClientAngles[3];
        GetClientAbsOrigin(client, m_flClientOrigin);
        GetClientAbsAngles(client, m_flClientAngles);
   
        m_flPosition[0]=g_unSelectedPet[client][fPosition][0];
        m_flPosition[1]=g_unSelectedPet[client][fPosition][1];
        m_flPosition[2]=g_unSelectedPet[client][fPosition][2];
        m_flAngles[0]=g_unSelectedPet[client][fAngles][0];
        m_flAngles[1]=g_unSelectedPet[client][fAngles][1];
        m_flAngles[2]=g_unSelectedPet[client][fAngles][2];

        decl Float:m_fForward[3];
        decl Float:m_fRight[3];
        decl Float:m_fUp[3];
        GetAngleVectors(m_flClientAngles, m_fForward, m_fRight, m_fUp);

        m_flClientOrigin[0] += m_fRight[0]*m_flPosition[0]+m_fForward[0]*m_flPosition[1]+m_fUp[0]*m_flPosition[2];
        m_flClientOrigin[1] += m_fRight[1]*m_flPosition[0]+m_fForward[1]*m_flPosition[1]+m_fUp[1]*m_flPosition[2];
        m_flClientOrigin[2] += m_fRight[2]*m_flPosition[0]+m_fForward[2]*m_flPosition[1]+m_fUp[2]*m_flPosition[2];
        m_flAngles[1] += m_flClientAngles[1];

        DispatchKeyValue(m_unEnt, "model", g_unSelectedPet[client][model]);
        DispatchKeyValue(m_unEnt, "spawnflags", "256");
        DispatchKeyValue(m_unEnt, "solid", "0");
        SetEntPropEnt(m_unEnt, Prop_Send, "m_hOwnerEntity", client);
       
        DispatchSpawn(m_unEnt);  
        AcceptEntityInput(m_unEnt, "TurnOn", m_unEnt, m_unEnt, 0);
       
        // Teleport the pet to the right fPosition and attach it
        TeleportEntity(m_unEnt, m_flClientOrigin, m_flAngles, NULL_VECTOR);
       
        SetVariantString("!activator");
        AcceptEntityInput(m_unEnt, "SetParent", client, m_unEnt, 0);
       
        SetVariantString("letthehungergamesbegin");
        AcceptEntityInput(m_unEnt, "SetParentAttachmentMaintainOffset", m_unEnt, m_unEnt, 0);
     
        g_unClientPet[client] = EntIndexToEntRef(m_unEnt);
        g_unLastAnimation[client] = -1;
    }
}

public ResetPet(client)
{
    if(g_unClientPet[client] == INVALID_ENT_REFERENCE)
        return;

    new m_unEnt = EntRefToEntIndex(g_unClientPet[client]);
    g_unClientPet[client] = INVALID_ENT_REFERENCE;
    if(m_unEnt == INVALID_ENT_REFERENCE)
        return;

    AcceptEntityInput(m_unEnt, "Kill");
}

public OnPluginEnd()
{
    Shop_UnregisterMe();
}
 

Tonki_Ton

Script kiddie
Сообщения
614
Реакции
375
Добавь в начале плагина, с новой строчки:
PHP:
#define INVALID_ENT_REFERENCE -1
1XzxRhp3cZ4.jpg
 

Tonki_Ton

Script kiddie
Сообщения
614
Реакции
375
@Tonki_Ton, ну, это не совсем верное начало для подобного. Тогда просто замените все INVALID_ENT_REFERENCE на -1 (то же самое, когда SM "не слушается").
Ну, вроде сработало. Благодарочка.
--- Добавлено позже ---
А не, не сработало, тот же лог
 
Последнее редактирование:

Reg1oxeN

Участник
Сообщения
399
Реакции
314
C-подобный:
new pet = EntRefToEntIndex(g_unClientPet[client]);
if (!pet || !IsValidEntity(pet)) return;
SetVariantString(g_unSelectedPet[client][run]);
AcceptEntityInput(pet, "SetAnimation"); //144 СТРОЧКА
 

Tonki_Ton

Script kiddie
Сообщения
614
Реакции
375
Заменить на:
PHP:
if(g_unClientPet[client]==INVALID_ENT_REFERENCE || !g_iPets[client] || !IsPlayerAlive(client)) return;
И ошибка пропадёт. Оффтоп
А то что -1, делал вернуть в INVALID_ENT_REFERENCE ?
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Алмазик, что ты им такое вообще советуешь?
g_unClientPet[client] - это рефа ентити. Тут надо сперва преобразовать реф в ентити и проверить, не равен ли результат INVALID_ENT_REFERENCE. А автор без этой проверки AcceptEntityInput вызывает, отсюда и ошибки.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Тут надо сперва преобразовать реф в ентити и проверить
Тогда распиши, как надо. У меня интернет сейчас на модемной скорости и код порой в кашу превращается. Оффтоп
@Reg1oxeN, похоже, верно расписал. Оффтоп
 
Последнее редактирование:

Tonki_Ton

Script kiddie
Сообщения
614
Реакции
375
Тогда распиши, как надо. У меня интернет сейчас на модемной скорости и код порой в кашу превращается. Оффтоп
@Reg1oxeN, похоже, верно расписал. Оффтоп
Ну пока лога нет, если что попробую его версию
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

MaZa

Участник
Сообщения
1,732
Реакции
980
Последнее редактирование:
Сверху Снизу