В чём разница? [KeyHintText]

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Здравствуйте.

C-подобный:
void UpdateKeyHint(int client)
{
    if((gI_Cycle % 10) == 0 && ((gI_HUDSettings[client] & HUD_SYNC) > 0 || (gI_HUDSettings[client] & HUD_TIMELEFT) > 0))
    {
        char sMessage[256];
        int iTimeLeft = -1;

        if((gI_HUDSettings[client] & HUD_TIMELEFT) > 0 && GetMapTimeLeft(iTimeLeft) && iTimeLeft > 0)
        {
            FormatEx(sMessage, 256, (iTimeLeft > 60)? "%T: %d minutes":"%T: <1 minute", "HudTimeLeft", client, (iTimeLeft / 60), "HudTimeLeft", client);
        }

        int target = GetHUDTarget(client);

        if(IsValidClient(target) && (target == client || (gI_HUDSettings[client] & HUD_OBSERVE) > 0))
        {
            int style = Shavit_GetBhopStyle(target);

            if((gI_HUDSettings[client] & HUD_SYNC) > 0 && Shavit_GetTimerStatus(target) == Timer_Running && gA_StyleSettings[style].bSync && !IsFakeClient(target) && (!gB_Zones || !Shavit_InsideZone(target, Zone_Start, -1)))
            {
                Format(sMessage, 256, "%s%s%T: %.01f", sMessage, (strlen(sMessage) > 0)? "\n\n":"", "HudSync", client, Shavit_GetSync(target));

                if(!gA_StyleSettings[style].bAutobhop)
                {
                    Format(sMessage, 256, "%s\n%T: %.1f", sMessage, "HudPerfs", client, Shavit_GetPerfectJumps(target));
                }
            }

            if((gI_HUDSettings[client] & HUD_SPECTATORS) > 0)
            {
                int[] iSpectatorClients = new int[MaxClients];
                int iSpectators = 0;
                bool bIsAdmin = CheckCommandAccess(client, "admin_speclisthide", ADMFLAG_KICK);

                for(int i = 1; i <= MaxClients; i++)
                {
                    if(i == client || !IsValidClient(i) || IsFakeClient(i) || !IsClientObserver(i) || GetClientTeam(i) < 1 || GetHUDTarget(i) != target)
                    {
                        continue;
                    }

                    if((gCV_SpectatorList.IntValue == 1 && !bIsAdmin && CheckCommandAccess(i, "admin_speclisthide", ADMFLAG_KICK)) ||
                        (gCV_SpectatorList.IntValue == 2 && !CanUserTarget(client, i)))
                    {
                        continue;
                    }

                    iSpectatorClients[iSpectators++] = i;
                }

                if(iSpectators > 0)
                {
                    Format(sMessage, 256, "%s%s%spectators (%d):", sMessage, (strlen(sMessage) > 0)? "\n\n":"", (client == target)? "S":"Other S", iSpectators);

                    for(int i = 0; i < iSpectators; i++)
                    {
                        if(i == 7)
                        {
                            Format(sMessage, 256, "%s\n...", sMessage);

                            break;
                        }

                        char[] sName = new char[gI_NameLength];
                        GetClientName(iSpectatorClients[i], sName, gI_NameLength);
                        ReplaceString(sName, gI_NameLength, "#", "?");
                        Format(sMessage, 256, "%s\n%s", sMessage, sName);
                    }
                }
            }
        }

        if(strlen(sMessage) > 0)
        {
            Handle hKeyHintText = StartMessageOne("KeyHintText", client);
            BfWriteByte(hKeyHintText, 1);
            BfWriteString(hKeyHintText, sMessage);
            EndMessage();
        }
    }
}
C-подобный:
public Action:Timer_UpdateHudHint(Handle:timer, any:client)
{
    new iSpecModeUser = GetEntProp(client, Prop_Send, "m_iObserverMode");
    new iSpecMode, iTarget, iTargetUser;
    new bool:bDisplayHint = false;
 
    decl String:szText[254];
    szText[0] = '\0';
 
    // Dealing with a client who is in the game and playing.
    if (IsPlayerAlive(client))
    {
        for(new i = 1; i <= MaxClients; i++)
        {
            if (!IsClientInGame(i) || !IsClientObserver(i))
                continue;
             
            iSpecMode = GetEntProp(i, Prop_Send, "m_iObserverMode");
         
            // The client isn't spectating any one person, so ignore them.
            if (iSpecMode != SPECMODE_FIRSTPERSON && iSpecMode != SPECMODE_3RDPERSON)
                continue;
         
            // Find out who the client is spectating.
            iTarget = GetEntPropEnt(i, Prop_Send, "m_hObserverTarget");
         
            // Are they spectating our player?
            if (iTarget == client)
            {
                Format(szText, sizeof(szText), "%s%N\n", szText, i);
                bDisplayHint = true;
            }
        }
    }
    else if (iSpecModeUser == SPECMODE_FIRSTPERSON || iSpecModeUser == SPECMODE_3RDPERSON)
    {
        // Find out who the User is spectating.
        iTargetUser = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
     
        if (iTargetUser > 0)
            Format(szText, sizeof(szText), "Spectating %N:\n", iTargetUser);
     
        for(new i = 1; i <= MaxClients; i++)
        {
            if (!IsClientInGame(i) || !IsClientObserver(i))
                continue;
             
            iSpecMode = GetEntProp(i, Prop_Send, "m_iObserverMode");
         
            // The client isn't spectating any one person, so ignore them.
            if (iSpecMode != SPECMODE_FIRSTPERSON && iSpecMode != SPECMODE_3RDPERSON)
                continue;
         
            // Find out who the client is spectating.
            iTarget = GetEntPropEnt(i, Prop_Send, "m_hObserverTarget");
         
            // Are they spectating the same player as User?
            if (iTarget == iTargetUser)
                Format(szText, sizeof(szText), "%s%N\n", szText, i);
        }
    }
 
    /* We do this to prevent displaying a message
        to a player if no one is spectating them anyway. */
    if (bDisplayHint)
    {
        Format(szText, sizeof(szText), "Spectating %N:\n%s", client, szText);
        bDisplayHint = false;
    }
         
    // Send our message
   
    new Handle:hBuffer = StartMessageOne("KeyHintText", client);
    BfWriteByte(hBuffer, 1);
    BfWriteString(hBuffer, szText);
    EndMessage();
 
    return Plugin_Continue;
}

shavit-hud запускается и без ошибок работает, а speclist - нет.
C-подобный:
[SM] Exception reported: Invalid message name: "KeyHintText"
[SM] Blaming: cspeclist.smx
[SM] Call stack trace:
[SM]   [0] StartMessage
[SM]   [1] Line 256, C:\Paranoiiik\Hi)\Server\SM\v34\1.9.0.6190\scripting\include\usermessages.inc::StartMessageOne
[SM]   [2] Line 194, C:\Paranoiiik\Hi)\Server\SM\v34\1.9.0.6190\scripting\cspeclist.sp::Timer_UpdateHudHint

Игра - CS:S v34. Версии SM, установленные на серверах, и компиляторов для тестирования использовались 1.6.3, 1.9 и 1.10 в разных комбинациях.
Я понимаю, что в 34-й, вроде как, нету поддержки "KeyHintText", НО shavit-hud ведь как-то работает, хотя наблюдателей показывает по левой стороне, а не по правой, как это делает speclist.
+ на одном из серверов в CS:S v34 я видел, как shavit-hud показывает наблюдателей по правой стороне.
Знакомый программист пишет, что код, по сути, один и тот же, за исключением, как я понял, синтаксиса.

Какая-то лютая мистика.

Сам я не программист, д и ничего толком не понимаю. Вопрос в том, что это за мистика, и как заставить работать. Что редактировать, - мне плевать: хоть из shavit-hud вырезать лишнее и сделать из него самостоятельный плагин, хоть speclist "привести в порядок".
Я бы заказал, может, показ наблюдателей через HUD, но в 34-й (ClientMod поддерживает) с ним у меня будет обидное ограничение по количеству символов.
 

Вложения

  • shavit-hud.sp
    47.2 КБ · Просмотры: 24
  • speclist.sp
    5.8 КБ · Просмотры: 21
Последнее редактирование:

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
Знакомый программист пишет, что код, по сути, один и тот же, за исключением, как я понял, синтаксиса.
Сразу видно, что твой "погромист" туфтовый.
Shavit:
1594557684088.png

P.S. Разница в том, что используется Menu/Panel
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Сразу видно, что твой "погромист" туфтовый.
Shavit:
Посмотреть вложение 61594
Но ведь в условии Source2013, а CS:S v34 - Source2006. Поправь, если я написал фигню
Сообщения автоматически склеены:

P.S. Разница в том, что используется Menu/Panel
Но ведь:
+ на одном из серверов в CS:S v34 я видел, как shavit-hud показывает наблюдателей по правой стороне.
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
Но ведь в условии Source2013, а CS:S v34 - Source2006. Поправь, если я написал фигню
Верно, но немного не туда. Если SDK2013 => KeyHintText. В противном случае другое

P.S. На v34 играл только тогда, когда в Стиме доступна эта версия была. Так что к сожалению тут много не подскажу, кроме как возможно плагин переписан и писал через HudText
 
Последнее редактирование:
Сверху Снизу