Написание плагинов

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
@Mensi1337, Пробуй.
PHP:
#include <sourcemod>
#include <sdktools_functions>

#pragma newdecls required
#pragma semicolon 1

bool bMap;

public void OnPluginStart()
{
    HookEvent("player_spawn", OnPlayerSpawn);
}

public void OnMapStart()
{
    char szMapName[32];
    GetCurrentMap(szMapName, sizeof(szMapName));
        bMap = (strncmp(szMapName, "awp_lego_2", 10, false) == 0);
}

public Action OnPlayerSpawn(Event hEvent, const char[] name, bool dontBroadcast)
{
    if(bMap) {
        int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
        RemovePlayerItem(iClient, GetPlayerWeaponSlot(iClient, 1));
        int iEntity = GivePlayerItem(iClient, "weapon_deagle");
        SetEntProp(iEntity, Prop_Send, "m_iAmmo", 0);
        SetEntProp(iEntity, Prop_Send, "m_iClip", 1);
    }
}
 
Последнее редактирование:

Hustle29

Участник
Сообщения
109
Реакции
4
@Hustle29
PHP:
#include <sourcemod>
#include <sdktools>

#include <influx/core>

#undef REQUIRE_PLUGIN
#include <influx/hud>


//#define DEBUG


#define SOUNDS_FILE                 "influx_sounds.cfg"




#define PLATFORM_MAX_PATH_CELL      PLATFORM_MAX_PATH / 4


ArrayList g_hOtherSounds;
ArrayList g_hBestSounds;
ArrayList g_hPBSounds;

bool g_bLib_Hud;


public Plugin myinfo =
{
    author = INF_AUTHOR,
    url = INF_URL,
    name = INF_NAME..." - Record Sounds",
    description = "Plays sound when finishing",
    version = INF_VERSION
};

public void OnPluginStart()
{
    g_hOtherSounds = new ArrayList( PLATFORM_MAX_PATH_CELL );
    g_hBestSounds = new ArrayList( PLATFORM_MAX_PATH_CELL );
    g_hPBSounds = new ArrayList( PLATFORM_MAX_PATH_CELL );
  
  
    g_bLib_Hud = LibraryExists( INFLUX_LIB_HUD );
}

public void OnLibraryAdded( const char[] lib )
{
    if ( StrEqual( lib, INFLUX_LIB_HUD ) ) g_bLib_Hud = true;
}

public void OnLibraryRemoved( const char[] lib )
{
    if ( StrEqual( lib, INFLUX_LIB_HUD ) ) g_bLib_Hud = false;
}

public void Influx_OnRequestResultFlags()
{
    Influx_AddResultFlag( "Don't play record sound", RES_SND_DONTPLAY );
}

public void OnMapStart()
{
    ReadSounds();
}

stock bool ReadSounds()
{
    g_hOtherSounds.Clear();
    g_hBestSounds.Clear();
    g_hPBSounds.Clear();
  
    char szFile[PLATFORM_MAX_PATH];
    BuildPath( Path_SM, szFile, sizeof( szFile ), "configs/"...SOUNDS_FILE );
  
  
    KeyValues kv = new KeyValues( "Sounds" );
    kv.ImportFromFile( szFile );
  
    if ( !kv.GotoFirstSubKey() )
    {
        delete kv;
        return false;
    }
  
  
    char szPath[PLATFORM_MAX_PATH], szDownload[PLATFORM_MAX_PATH];
  
    do
    {
        if ( !kv.GetSectionName( szPath, sizeof( szPath ) ) )
        {
            continue;
        }
      
      
        bool bAdded = false;
      
        int sounds_offset = 0;
      
        if (StrContains( szPath, "sound/", false ) == 0
        ||  StrContains( szPath, "sound\\", false ) == 0)
        {
            sounds_offset = 6;
          
            strcopy( szDownload, sizeof( szDownload ), szPath );
        }
        else
        {
            FormatEx( szDownload, sizeof( szDownload ), "sound/%s", szPath );
        }
      
      
#if defined DEBUG
            PrintToServer( INF_DEBUG_PRE..."Found sound: '%s' | Download path: '%s'",
                szPath[sounds_offset],
                szDownload );
#endif
      
        if ( !FileExists( szDownload, true ) )
        {
            LogError( INF_CON_PRE..."Sound file '%s' does not exist! Ignoring it.", szDownload );
            continue;
        }
      
        if ( PrecacheSound( szPath[sounds_offset] ) )
        {
            PrefetchSound( szPath[sounds_offset] );
          
            AddFileToDownloadsTable( szDownload );
        }
        else
        {
            LogError( INF_CON_PRE..."Couldn't precache record sound! Ignoring it. Sound: '%s'", szPath[sounds_offset] );
          
            continue;
        }
      
      
        if ( kv.GetNum( "pb", 0 ) )
        {
            g_hPBSounds.PushString( szPath[sounds_offset] );
            bAdded = true;
        }
      
        if ( kv.GetNum( "best", 0 ) )
        {
            g_hBestSounds.PushString( szPath[sounds_offset] );
            bAdded = true;
        }
      
        // If we have none just add to this.
        if ( kv.GetNum( "other", 0 ) || !bAdded )
        {
            g_hOtherSounds.PushString( szPath[sounds_offset] );
        }
      
        /*if ( kv.JumpToKey( "users", false ) )
        {
            kv.GoBack();
        }*/
    }
    while( kv.GotoNextKey() );
  
    delete kv;
  
    return true;
}

public void Influx_OnTimerFinishPost( int client, int runid, int mode, int style, float time, float prev_pb, float prev_best, int flags )
{
    // We don't want to play any sounds for this run!
    if ( flags & RES_SND_DONTPLAY ) return;
  
  
    decl String:szPath[PLATFORM_MAX_PATH];
    szPath[0] = '\0';
  
    if ( flags & (RES_TIME_FIRSTREC | RES_TIME_ISBEST) )
    {
        int len = g_hBestSounds.Length;
      
        if ( len )
        {
            g_hBestSounds.GetString( GetRandomInt( 0, len - 1 ), szPath, sizeof( szPath ) );
        }
    }
    else if ( flags & RES_TIME_PB )
    {
        int len = g_hPBSounds.Length;
      
        if ( len )
        {
            g_hPBSounds.GetString( GetRandomInt( 0, len - 1 ), szPath, sizeof( szPath ) );
        }
    }
  
    // Fallback to these sounds if others don't exist.
    if ( szPath[0] == '\0' )
    {
        int len = g_hOtherSounds.Length;
      
        if ( len )
        {
            g_hOtherSounds.GetString( GetRandomInt( 0, len - 1 ), szPath, sizeof( szPath ) );
        }
    }
  
    if ( szPath[0] != '\0' )
    {
        PlayRecordSound( szPath, client, flags );
    }
}

stock bool CanPlaySoundToClient( int client, int finisher, int flags )
{
    int hideflags = Influx_GetClientHideFlags( client );
  
    // Allow my own sounds.
    if ( finisher == client )
    {
        return ( hideflags & HIDEFLAG_SND_PERSONAL ) ? false : true;
    }
  
    // Allow new record sounds.
    if ( flags & (RES_TIME_FIRSTREC | RES_TIME_ISBEST) )
    {
        return ( hideflags & HIDEFLAG_SND_BEST ) ? false : true;
    }
  
    return ( hideflags & HIDEFLAG_SND_NORMAL ) ? false : true;
}

stock void PlayRecordSound( const char[] szSound, int finisher, int resflags )
{
    int[] clients = new int[MaxClients];
    int nClients = 0;

    if (resflags & RES_TIME_ISBEST)
    {
        for ( int i = 1; i <= MaxClients; i++ )
        {
            if ( IsClientInGame( i ) && !IsFakeClient( i ) )
            {
                if ( g_bLib_Hud )
                {
                    if ( !CanPlaySoundToClient( i, finisher, resflags ) )
                        continue;
                }
              
                clients[nClients++] = i;
            }
        }
    }
    else
    {
        if ( g_bLib_Hud )
            CanPlaySoundToClient( finisher, finisher, resflags );

        clients[nClients++] = finisher;
    }
  
    if ( nClients )
    {
        EmitSoundCompatible( clients, nClients, szSound );
    }
}

stock void EmitSoundCompatible( const int[] clients, int nClients, const char[] szSound )
{
    if ( GetEngineVersion() == Engine_CSGO )
    {
        decl String:szCommand[PLATFORM_MAX_PATH];
        FormatEx( szCommand, sizeof( szCommand ), "play */%s", szSound );
      
        for ( int i = 0; i < nClients; i++ )
        {
            ClientCommand( clients[i], szCommand );
        }
    }
    else
    {
        EmitSound( clients, nClients, szSound );
    }
}
Спасибо тебе большое, все работает!
 

Mensi1337

Участник
Сообщения
242
Реакции
16
@Mensi1337, Пробуй.
PHP:
#include <sourcemod>
#include <sdktools_functions>

#pragma newdecls required
#pragma semicolon 1

bool bMap;

public void OnPluginStart()
{
    HookEvent("player_spawn", OnPlayerSpawn);
}

public void OnMapStart()
{
    char szMapName[32];
    GetCurrentMap(szMapName, sizeof(szMapName));
    if (strncmp(szMapName, "awp_lego_2", 10, false) == 0)
        bMap = true;
    else
        bMap = false;
}

public Action OnPlayerSpawn(Event hEvent, const char[] name, bool dontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(bMap) {
        RemovePlayerItem(iClient, GetPlayerWeaponSlot(iClient, 1));
        int iEntity = GivePlayerItem(iClient, "weapon_awp");
        SetEntProp(iEntity, Prop_Send, "m_iPrimaryReserveAmmoCount", 0);
        SetEntProp(iEntity, Prop_Send, "m_iClip1", 1);
    }
}
@Rabb1t, Пишет ошибки:
Оффтоп
 

skaeN

Участник
Сообщения
204
Реакции
108
Приоритет в очереди мода retakes by splewis
Вот сам мод: splewis/csgo-retakes
Одно из решений данного действия (но неработоспособное): AlliedModders - View Single Post - Modify Retakes by Splewis

Хотелось бы, чтобы приоритет очереди на игру был что-то вроде:
1. Админ
2. Вип (R1ko)
3. Обычный игрок
 

Mensi1337

Участник
Сообщения
242
Реакции
16
Добрый вечер, хочу узнать можно ли убрать урон при спавне, который происходит через не которое время на карте mg_saw_rfix_64v ?
Хочу сделать авто респавн, но при респавне игроки умирают.
 

Faya™

Жуестер
Сообщения
867
Реакции
457
Привет. Пользуюсь без нареканий и появилась идея. Можно ли сделать так, чтобы урон отображался в чате сразу после смерти и если ты не умер - в начале раунда?
Если правильно все понял то пробуй
 

Вложения

  • csgo_damageprint.smx
    8.4 КБ · Просмотры: 5
  • Мне нравится
Реакции: s777

s777

Участник
Сообщения
449
Реакции
74
Если правильно все понял то пробуй
Если я не умираю, то в конце раунда отображается урон, а в начале следующего нет. Тут все отлично. Но, если я умираю - урон отображается при моей смерти, затем в конце раунда и в начале раунда. То есть 3 раза, а нужно только при смерти.
 

Faya™

Жуестер
Сообщения
867
Реакции
457
Если я не умираю, то в конце раунда отображается урон, а в начале следующего нет. Тут все отлично. Но, если я умираю - урон отображается при моей смерти, затем в конце раунда и в начале раунда. То есть 3 раза, а нужно только при смерти.
Хм, хорошо позже поправлю скину
 
  • Мне нравится
Реакции: s777

Faya™

Жуестер
Сообщения
867
Реакции
457
Когда я сейвлю живым и проигрываю раунд, показывается сообщение сначала при окончании раунда, а потом и в начале
Крч я чет вообще запутался :D вот сделал так:
Умер показало, в конце не показало (получается всего 1 раз)
Не умер в конце раунда показало (получается всего 1 раз)
в начале раунда не показывает больше
 

Вложения

  • csgo_damageprint.smx
    8.4 КБ · Просмотры: 4
  • Мне нравится
Реакции: s777

s777

Участник
Сообщения
449
Реакции
74
Крч я чет вообще запутался :D вот сделал так:
Умер показало, в конце не показало (получается всего 1 раз)
Не умер в конце раунда показало (получается всего 1 раз)
в начале раунда не показывает больше
Вот щас все сделал как надо, но осталась последняя проблемка :lol:Если раунд завершается и ты после таймера умер - сообщение покажется снова (то есть 2 раза за раунд)
 

Faya™

Жуестер
Сообщения
867
Реакции
457
Вот щас все сделал как надо, но осталась последняя проблемка :lol:Если раунд завершается и ты после таймера умер - сообщение покажется снова (то есть 2 раза за раунд)
Та ты бл, издеваешься? ЗАЧЕМ УМЕРАТЬ ПОСЛЕ ТАЙМЕРА ВООБЩЕ КУКУХАПОЕХАЛА?:fool3: :lol:
На пробуй
 

Вложения

  • csgo_damageprint.smx
    8.5 КБ · Просмотры: 3
  • Мне нравится
Реакции: s777

s777

Участник
Сообщения
449
Реакции
74
Та ты бл, издеваешься? ЗАЧЕМ УМЕРАТЬ ПОСЛЕ ТАЙМЕРА ВООБЩЕ КУКУХАПОЕХАЛА?:fool3: :lol:
На пробуй
Ну в этот раз все вроде точно нормально :lol: Извини что мучал. Кстати, исходник сможешь дать? Надо подправить кое что
 

Faya™

Жуестер
Сообщения
867
Реакции
457

Вложения

  • csgo_damageprint.smx
    8.5 КБ · Просмотры: 4
  • csgo_damageprint.sp
    5.4 КБ · Просмотры: 15
  • Мне нравится
Реакции: s777

phll

Участник
Сообщения
16
Реакции
1
Может у кого есть наработки, нужен простой и легкий для сервера меню оружия для DM. Желательно без кваров, и настроек:) перечень оружии и т.д. чтобы были прописаны в плагине.

p.s. Родной меню DM не подходит, слишком много лишнего и все вынесено из плагина.
 
Сверху Снизу