Задержка на установку скина в шоп скинс

Tonki_Ton

Script kiddie
Сообщения
614
Реакции
375
Доброго времени суток.

В общем дело такое, стоит модуль к шопу [Shop] CS:GO Skins v2.1.3(на самом деле 2.1.4) и еще использую [Любая игра] - Personal Skins 1.6 так вот, пс перебивает скины шс даже если в пс установлена задержка 0.0, как я думаю шс выдает скины раньше пс а затем пс перебивает их своими, возможно если установить задержку на выдачу скина в шс, то пс будет выдавать скин первым а затем уже шс будет выдавать скин тем у кого они куплены.

Возможно кто-то бы смог прикрутить задержку к шс, я был бы вам очень благодарен.

Сразу липану исход что бы далеко не бегать

PHP:
#pragma semicolon 1

#include <sourcemod>
#include <sdktools>
#include <cstrike>
#include <shop>

#define PLUGIN_VERSION "2.1.4"

#define CATEGORY    "skins"

new Float:g_fPreviewDuration;

new Handle:kv;
new ItemId:selected_id[MAXPLAYERS+1] = {INVALID_ITEM, ...};

new Handle:hArrayModels;
new Handle:mp_forcecamera;

public Plugin:myinfo =
{
    name = "[Shop] Skins",
    author = "FrozDark (arms by R1KO)",
    description = "Adds ability to buy skins",
    version = SHOP_VERSION,
    url = "www.hlmod.ru"
}

public OnPluginStart()
{
    mp_forcecamera = FindConVar("mp_forcecamera");

    HookEvent("player_spawn", Event_PlayerSpawn);
    HookEvent("player_team", Event_PlayerSpawn);
  
    hArrayModels = CreateArray(ByteCountToCells(PLATFORM_MAX_PATH));
  
    if (Shop_IsStarted()) Shop_Started();
}

public OnPluginEnd()
{
    Shop_UnregisterMe();
}

public OnMapStart()
{
    decl String:buffer[PLATFORM_MAX_PATH];
    for (new i = 0; i < GetArraySize(hArrayModels); i++)
    {
        GetArrayString(hArrayModels, i, buffer, sizeof(buffer));
        PrecacheModel(buffer, true);
    }
  
    Shop_GetCfgFile(buffer, sizeof(buffer), "skins_downloads.txt");
  
    if (!File_ReadDownloadList(buffer))
    {
        PrintToServer("File not exists %s", buffer);
    }
}

public OnClientDisconnect_Post(client)
{
    selected_id[client] = INVALID_ITEM;
}

public Shop_Started()
{
    new CategoryId:category_id = Shop_RegisterCategory(CATEGORY, "Скины", "");
  
    decl String:_buffer[PLATFORM_MAX_PATH];
    Shop_GetCfgFile(_buffer, sizeof(_buffer), "skins.txt");
  
    if (kv != INVALID_HANDLE) CloseHandle(kv);
  
    kv = CreateKeyValues("Skins");
  
    if (!FileToKeyValues(kv, _buffer))
    {
        ThrowError("\"%s\" not parsed", _buffer);
    }
  
    ClearArray(hArrayModels);
  
    KvRewind(kv);
    g_fPreviewDuration = KvGetFloat(kv, "preview_duration", 3.0);

    decl String:item[64], String:item_name[64], String:desc[64];
    if (KvGotoFirstSubKey(kv))
    {
        do
        {
            if (!KvGetSectionName(kv, item, sizeof(item))) continue;
          
            KvGetString(kv, "ModelT", _buffer, sizeof(_buffer));
            new bool:result = false;
            if (_buffer[0])
            {
                PrecacheModel(_buffer);
                if (FindStringInArray(hArrayModels, _buffer) == -1)
                {
                    PushArrayString(hArrayModels, _buffer);
                }
              
                KvGetString(kv, "ModelT_Arms", _buffer, sizeof(_buffer));
                if (_buffer[0])
                {
                    PrecacheModel(_buffer);
                    if (FindStringInArray(hArrayModels, _buffer) == -1)
                    {
                        PushArrayString(hArrayModels, _buffer);
                    }
                }
      
                result = true;
            }
          
          
            KvGetString(kv, "ModelCT", _buffer, sizeof(_buffer));
            if (_buffer[0])
            {
                PrecacheModel(_buffer, true);
                if (FindStringInArray(hArrayModels, _buffer) == -1)
                {
                    PushArrayString(hArrayModels, _buffer);
                }
              
                KvGetString(kv, "ModelCT_Arms", _buffer, sizeof(_buffer));
                if (_buffer[0])
                {
                    PrecacheModel(_buffer);
                    if (FindStringInArray(hArrayModels, _buffer) == -1)
                    {
                        PushArrayString(hArrayModels, _buffer);
                    }
                }
            }
            else if (!result) continue;
          
            if (Shop_StartItem(category_id, item))
            {
                KvGetString(kv, "name", item_name, sizeof(item_name), item);
                KvGetString(kv, "description", desc, sizeof(desc));
                Shop_SetInfo(item_name, desc, KvGetNum(kv, "price", 5000), KvGetNum(kv, "sell_price", 2500), Item_Togglable, KvGetNum(kv, "duration", 86400));
                Shop_SetCallbacks(_, OnEquipItem, _, _, _, OnPreviewItem);
              
                if (KvJumpToKey(kv, "Attributes", false))
                {
                    Shop_KvCopySubKeysCustomInfo(kv);
                    KvGoBack(kv);
                }
              
                Shop_EndItem();
            }
        }
        while (KvGotoNextKey(kv));
    }
  
    KvRewind(kv);
}

public ShopAction:OnEquipItem(client, CategoryId:category_id, const String:category[], ItemId:item_id, const String:item[], bool:isOn, bool:elapsed)
{
    if (isOn || elapsed)
    {
        CS_UpdateClientModel(client);
      
        selected_id[client] = INVALID_ITEM;
      
        return Shop_UseOff;
    }
  
    Shop_ToggleClientCategoryOff(client, category_id);
  
    selected_id[client] = item_id;
  
    ProcessPlayer(client);
  
    return Shop_UseOn;
}

public OnPreviewItem(client, CategoryId:category_id, const String:category[], ItemId:item_id, const String:item[])
{
    decl String:buffer[PLATFORM_MAX_PATH];
  
    KvRewind(kv);
    if (!KvJumpToKey(kv, item, false))
    {
        LogError("It seems that registered item \"%s\" not exists in the settings", buffer);
        return;
    }

    switch (GetClientTeam(client))
    {
        case 2 :
        {
            KvGetString(kv, "ModelT", buffer, sizeof(buffer));
        }
        case 3 :
        {
            KvGetString(kv, "ModelCT", buffer, sizeof(buffer));
        }
        default :
        {
            buffer[0] = 0;
        }
    }

    KvRewind(kv);

    if (buffer[0] && IsModelFile(buffer))
    {
        Mirror(client, buffer);
        CreateTimer(g_fPreviewDuration, SetBackMode, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action:SetBackMode(Handle:timer, any:userid)
{
    new client = GetClientOfUserId(userid);
    if(client)
    {
        Mirror(client);
    }
}

Mirror(client, const String:sModel[]="")
{
    if (sModel[0])
    {
        SetEntPropEnt(client, Prop_Send, "m_hObserverTarget", 0);
        SetEntProp(client, Prop_Send, "m_iObserverMode", 1);
        SetEntProp(client, Prop_Send, "m_bDrawViewmodel", 0);
        SetEntProp(client, Prop_Send, "m_iFOV", 120);
        SendConVarValue(client, mp_forcecamera, "1");
        SetEntityModel(client, sModel);
    }
    else
    {
        SetEntPropEnt(client, Prop_Send, "m_hObserverTarget", -1);
        SetEntProp(client, Prop_Send, "m_iObserverMode", 0);
        SetEntProp(client, Prop_Send, "m_bDrawViewmodel", 1);
        SetEntProp(client, Prop_Send, "m_iFOV", 90);
        decl String:valor[6];
        GetConVarString(mp_forcecamera, valor, 6);
        SendConVarValue(client, mp_forcecamera, valor);
        CS_UpdateClientModel(client);
    }
}

public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if (!client || selected_id[client] == INVALID_ITEM || IsFakeClient(client) || !IsPlayerAlive(client))
    {
        return;
    }
  
    ProcessPlayer(client);
}

ProcessPlayer(client)
{
    decl String:buffer[PLATFORM_MAX_PATH];
  
    if(selected_id[client] != INVALID_ITEM)
    {
        Shop_GetItemById(selected_id[client], buffer, sizeof(buffer));

        KvRewind(kv);
        if (!KvJumpToKey(kv, buffer, false))
        {
            LogError("It seems that registered item \"%s\" not exists in the settings", buffer);
            return;
        }
      
        decl String:sArms[PLATFORM_MAX_PATH];
      
        switch (GetClientTeam(client))
        {
            case 2 :
            {
                KvGetString(kv, "ModelT", buffer, sizeof(buffer));
                KvGetString(kv, "ModelT_Arms", sArms, sizeof(sArms));
            }
            case 3 :
            {
                KvGetString(kv, "ModelCT", buffer, sizeof(buffer));
                KvGetString(kv, "ModelCT_Arms", sArms, sizeof(sArms));
            }
            default :
            {
                buffer[0] =
                sArms[0] = '\0';
            }
        }
        if (buffer[0] && IsModelFile(buffer))
        {
            SetEntityModel(client, buffer);
          
            if (sArms[0] && IsModelFile(sArms))
            {
                SetEntPropString(client, Prop_Send, "m_szArmsModel", sArms);
            }
          
            KvGetString(kv, "color", buffer, sizeof(buffer));
            if (strlen(buffer) > 7)
            {
                decl color[4];
                KvGetColor(kv, "color", color[0], color[1], color[2], color[3]);
                SetEntityRenderMode(client, RENDER_TRANSCOLOR);
                SetEntityRenderColor(client, color[0], color[1], color[2], color[3]);
            }
        }
      
        KvRewind(kv);
    }
}

bool:IsModelFile(const String:model[])
{
    decl String:buf[4];
    File_GetExtension(model, buf, sizeof(buf));
  
    return !strcmp(buf, "mdl", false);
}

new String:_smlib_empty_twodimstring_array[][] = { { '\0' } };
stock File_AddToDownloadsTable(String:path[], bool:recursive=true, const String:ignoreExts[][]=_smlib_empty_twodimstring_array, size=0)
{
    if (path[0] == '\0') {
        return;
    }
  
    new len = strlen(path)-1;
  
    if (path[len] == '\\' || path[len] == '/')
    {
        path[len] = '\0';
    }

    if (FileExists(path)) {
      
        decl String:fileExtension[4];
        File_GetExtension(path, fileExtension, sizeof(fileExtension));
      
        if (StrEqual(fileExtension, "bz2", false) || StrEqual(fileExtension, "ztmp", false)) {
            return;
        }
      
        if (Array_FindString(ignoreExts, size, fileExtension) != -1) {
            return;
        }

        AddFileToDownloadsTable(path);
      
        if (StrEqual(fileExtension, "mdl", false))
        {
            PrecacheModel(path, true);
        }
    }
  
    else if (recursive && DirExists(path)) {

        decl String:dirEntry[PLATFORM_MAX_PATH];
        new Handle:__dir = OpenDirectory(path);

        while (ReadDirEntry(__dir, dirEntry, sizeof(dirEntry))) {

            if (StrEqual(dirEntry, ".") || StrEqual(dirEntry, "..")) {
                continue;
            }
          
            Format(dirEntry, sizeof(dirEntry), "%s/%s", path, dirEntry);
            File_AddToDownloadsTable(dirEntry, recursive, ignoreExts, size);
        }
      
        CloseHandle(__dir);
    }
    else if (FindCharInString(path, '*', true)) {
      
        new String:fileExtension[4];
        File_GetExtension(path, fileExtension, sizeof(fileExtension));

        if (StrEqual(fileExtension, "*")) {

            decl
                String:dirName[PLATFORM_MAX_PATH],
                String:fileName[PLATFORM_MAX_PATH],
                String:dirEntry[PLATFORM_MAX_PATH];

            File_GetDirName(path, dirName, sizeof(dirName));
            File_GetFileName(path, fileName, sizeof(fileName));
            StrCat(fileName, sizeof(fileName), ".");

            new Handle:__dir = OpenDirectory(dirName);
            while (ReadDirEntry(__dir, dirEntry, sizeof(dirEntry))) {

                if (StrEqual(dirEntry, ".") || StrEqual(dirEntry, "..")) {
                    continue;
                }

                if (strncmp(dirEntry, fileName, strlen(fileName)) == 0) {
                    Format(dirEntry, sizeof(dirEntry), "%s/%s", dirName, dirEntry);
                    File_AddToDownloadsTable(dirEntry, recursive, ignoreExts, size);
                }
            }

            CloseHandle(__dir);
        }
    }

    return;
}

stock bool:File_ReadDownloadList(const String:path[])
{
    new Handle:file = OpenFile(path, "r");
  
    if (file  == INVALID_HANDLE) {
        return false;
    }

    new String:buffer[PLATFORM_MAX_PATH];
    while (!IsEndOfFile(file)) {
        ReadFileLine(file, buffer, sizeof(buffer));
      
        new pos;
        pos = StrContains(buffer, "//");
        if (pos != -1) {
            buffer[pos] = '\0';
        }
      
        pos = StrContains(buffer, "#");
        if (pos != -1) {
            buffer[pos] = '\0';
        }

        pos = StrContains(buffer, ";");
        if (pos != -1) {
            buffer[pos] = '\0';
        }
      
        TrimString(buffer);
      
        if (buffer[0] == '\0') {
            continue;
        }

        File_AddToDownloadsTable(buffer);
    }

    CloseHandle(file);
  
    return true;
}

stock File_GetExtension(const String:path[], String:buffer[], size)
{
    new extpos = FindCharInString(path, '.', true);
  
    if (extpos == -1)
    {
        buffer[0] = '\0';
        return;
    }

    strcopy(buffer, size, path[++extpos]);
}

stock Math_GetRandomInt(min, max)
{
    new random = GetURandomInt();
  
    if (random == 0)
        random++;

    return RoundToCeil(float(random) / (float(2147483647) / float(max - min + 1))) + min - 1;
}

stock Array_FindString(const String:array[][], size, const String:str[], bool:caseSensitive=true, start=0)
{
    if (start < 0) {
        start = 0;
    }

    for (new i=start; i < size; i++) {

        if (StrEqual(array[i], str, caseSensitive)) {
            return i;
        }
    }
  
    return -1;
}

stock bool:File_GetFileName(const String:path[], String:buffer[], size)
{  
    if (path[0] == '\0') {
        buffer[0] = '\0';
        return;
    }
  
    File_GetBaseName(path, buffer, size);
  
    new pos_ext = FindCharInString(buffer, '.', true);

    if (pos_ext != -1) {
        buffer[pos_ext] = '\0';
    }
}

stock bool:File_GetDirName(const String:path[], String:buffer[], size)
{  
    if (path[0] == '\0') {
        buffer[0] = '\0';
        return;
    }
  
    new pos_start = FindCharInString(path, '/', true);
  
    if (pos_start == -1) {
        pos_start = FindCharInString(path, '\\', true);
      
        if (pos_start == -1) {
            buffer[0] = '\0';
            return;
        }
    }
  
    strcopy(buffer, size, path);
    buffer[pos_start] = '\0';
}

stock bool:File_GetBaseName(const String:path[], String:buffer[], size)
{  
    if (path[0] == '\0') {
        buffer[0] = '\0';
        return;
    }
  
    new pos_start = FindCharInString(path, '/', true);
  
    if (pos_start == -1) {
        pos_start = FindCharInString(path, '\\', true);
    }
  
    pos_start++;
  
    strcopy(buffer, size, path[pos_start]);
}

А возможно я ошибаюсь и дело совсем не в этом ?
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
На 178 строки замени на:
PHP:
ProcessPlayer(INVALID_HANDLE, client);
И это же на 260 заменой:
PHP:
CreateTimer(0.1, ProcessPlayer, client, TIMER_FLAG_NO_MAPCHANGE);
Где и выставляешь нужное время задержки (0.1 на своё). На 263 строке меняешь:
PHP:
public Action:ProcessPlayer(Handle:timer, any:client)
{
    if(!IsClientInGame(client)) return Plugin_Stop;
Получившийся:
На 277 строке заменить на:
PHP:
return Plugin_Stop;
Эту же новую, строчку добавить в самом конце, после 320 строки.
Оффтоп
 
Последнее редактирование:

Tonki_Ton

Script kiddie
Сообщения
614
Реакции
375
На 178 строки замени на:
PHP:
ProcessPlayer(INVALID_HANDLE, client);
И это же на 260 заменой:
PHP:
CreateTimer(0.1, ProcessPlayer, client, _, TIMER_FLAG_NO_MAPCHANGE);
Где и выставляешь нужное время задержки (0.1 на своё). На 263 строке меняешь:
PHP:
public Action:ProcessPlayer(Handle:timer, any:client)
{
    if(!IsClientInGame(client)) return Plugin_Stop;
Получившийся:На 277 строке заменить на:
PHP:
return Plugin_Stop;
Эту же новую, строчку добавить в самом конце, после 320 строки.
Оффтоп


Получаю ошибку при компиляции, если я конечно сам где-то не обасрался. Но если это я ошибся то не говори где. ;)

dNkSyGSLJrE.jpg

Кусок этого кода

PHP:
//162-180

public ShopAction:OnEquipItem(client, CategoryId:category_id, const String:category[], ItemId:item_id, const String:item[], bool:isOn, bool:elapsed)
{
    if (isOn || elapsed)
    {
        CS_UpdateClientModel(client);

        selected_id[client] = INVALID_ITEM;

        return Shop_UseOff;
    }

    Shop_ToggleClientCategoryOff(client, category_id);

    selected_id[client] = item_id;

    ProcessPlayer(INVALID_HANDLE, client);

    return Shop_UseOn;
}

//c 251
public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if (!client || selected_id[client] == INVALID_ITEM || IsFakeClient(client) || !IsPlayerAlive(client))
    {
        return;
    }

    CreateTimer(0.1, ProcessPlayer, client, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action:ProcessPlayer(Handle:timer, any:client)
{
    if(!IsClientInGame(client)) return Plugin_Stop;

    decl String:buffer[PLATFORM_MAX_PATH];

    if(selected_id[client] != INVALID_ITEM)
    {
        Shop_GetItemById(selected_id[client], buffer, sizeof(buffer));

        KvRewind(kv);
        if (!KvJumpToKey(kv, buffer, false))
        {
            LogError("It seems that registered item \"%s\" not exists in the settings", buffer);
            return Plugin_Stop;
        }

        decl String:sArms[PLATFORM_MAX_PATH];

        switch (GetClientTeam(client))
        {
            case 2 :
            {
                KvGetString(kv, "ModelT", buffer, sizeof(buffer));
                KvGetString(kv, "ModelT_Arms", sArms, sizeof(sArms));
            }
            case 3 :
            {
                KvGetString(kv, "ModelCT", buffer, sizeof(buffer));
                KvGetString(kv, "ModelCT_Arms", sArms, sizeof(sArms));
            }
            default :
            {
                buffer[0] =
                sArms[0] = '\0';
            }
        }
        if (buffer[0] && IsModelFile(buffer))
        {
            SetEntityModel(client, buffer);
    
            if (sArms[0] && IsModelFile(sArms))
            {
                SetEntPropString(client, Prop_Send, "m_szArmsModel", sArms);
            }
    
            KvGetString(kv, "color", buffer, sizeof(buffer));
            if (strlen(buffer) > 7)
            {
                decl color[4];
                KvGetColor(kv, "color", color[0], color[1], color[2], color[3]);
                SetEntityRenderMode(client, RENDER_TRANSCOLOR);
                SetEntityRenderColor(client, color[0], color[1], color[2], color[3]);
            }
        }

        KvRewind(kv);
    }
    return Plugin_Stop;
}


Оффтоп
Оффтоп
 
Последнее редактирование:

Tonki_Ton

Script kiddie
Сообщения
614
Реакции
375
Подчёркивание с запятой убери. А вторая ошибка - просто забей или выровняй отступы.

Теперь все работает, все как я и предполагал :dirol:

В очередной раз выручаешь, благодарю :ab: Отблагодарил бы материально но увы сам на мели :dntknw:
 

Steammer

Участник
Сообщения
443
Реакции
187
Может кто-то сам не справится, вот, задержка 0.25.
 

Вложения

  • shop_skins.smx
    11 КБ · Просмотры: 31

Tonki_Ton

Script kiddie
Сообщения
614
Реакции
375
Кстати, с задержкой модели рук не устанавливаются или устанавливаются но через раз
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
с задержкой модели рук не устанавливаются или устанавливаются но через раз
В CS:GO руки вообще устанавливаются лишь при новом спавне. Что там ещё влияет - скажет лишь тот, кто в неё играет.
 
Сверху Снизу