> > > >

Simple Duel | Простая дуэль 1.0.3b

Нет прав для скачивания
Сообщения
40
Рейтинг
58
#1
Drumanid добавил(а) новый ресурс:

Simple Duel | Простая дуэль - У игроков есть возможность сыграть дуэль когда они остались 1 на 1.

Нажмите на эту ссылку, чтобы узнать больше
17 Ноя 2018
Модуль для этого плагина... (Simple duel)

Simple duel sound - воспроизводит музыку/звуки во время и после завершения дуэли.
Писал для примера, для кодеров.


Код:
// Путь к звуку, который будет воспроизведен проигравшему в дуэли. Путь прописываем без 'sound/'
// -
// Default: ""
simple_duel_losing_sound ""

// Путь к звуку, который будет воспроизведен во время подготовки к дуэли. Путь прописываем без 'sound/'
// -
// Default: ""
simple_duel_preparation_sound ""

// Музыка во время дуэли, пути прописываем без 'sound/' и через ','
// Пример: 'duel/001.mp3,duel/002.mp3' и т.д. Максимальное кол-во: 10
// -
// Default: ""
simple_duel_sound ""

// Как воспроизводить музыку? 0 - по очереди / 1 - рандом
// -
// Default: "0"
// Minimum: "0.000000"
// Maximum: "1.000000"
simple_duel_type_sound "0"

// Путь к звуку, который будет воспроизведен победителю в дуэли. Путь прописываем без 'sound/'
// -
// Default: ""
simple_duel_victory_sound ""

// Громкость звуков/музыки | 0.1 - Минимально /  1.0 - Максимально
// -
// Default: "0.5"
// Minimum: "0.000000"
// Maximum: "1.000000"
simple_duel_volume_sound "0.5"

Код:
#include <simple_duel>
#include <sdktools_stringtables>
#include <sdktools_sound>

public Plugin myinfo =
{
    name = "[Simple Duel] Sound",
    author = "Drumanid",
    version = "1.0.0",
    url = "Discord: Drumanid#9108 | Site: dev-cs.ru"
};

#define LC(%0) for(int %0 = 1; %0 <= MaxClients; ++%0) if(IsClientInGame(%0) && !IsFakeClient(%0))
#define SZF(%0) %0, sizeof(%0)
#define Hook(%0,%1) %0.AddChangeHook(view_as<ConVarChanged>(%1))

int        g_iSound,
        g_iCount;

float    g_fVolume;

char    g_sPreparation[128],
        g_sVictory[128],
        g_sLosing[128],
        g_sSound[10][128],
        g_sStopSound[128];

bool    g_bType;

public void OnPluginStart()
{
    ConVar hCvar = CreateConVar("simple_duel_preparation_sound", "", "Путь к звуку, который будет воспроизведен во время подготовки к дуэли. Путь прописываем без 'sound/'"); Hook(hCvar, CvarHookPreparation); hCvar.GetString(SZF(g_sPreparation));
    hCvar = CreateConVar("simple_duel_victory_sound", "", "Путь к звуку, который будет воспроизведен победителю в дуэли. Путь прописываем без 'sound/'"); Hook(hCvar, CvarHookVictory); hCvar.GetString(SZF(g_sVictory));
    hCvar = CreateConVar("simple_duel_losing_sound", "", "Путь к звуку, который будет воспроизведен проигравшему в дуэли. Путь прописываем без 'sound/'"); Hook(hCvar, CvarHookLosing); hCvar.GetString(SZF(g_sLosing));
    hCvar = CreateConVar("simple_duel_sound", "", "Музыка во время дуэли, пути прописываем без 'sound/' и через ','\nПример: 'duel/001.mp3,duel/002.mp3' и т.д. Максимальное кол-во: 10"); Hook(hCvar, CvarHookSound); ConvertSound(hCvar);
    hCvar = CreateConVar("simple_duel_volume_sound", "0.5", "Громкость звуков/музыки | 0.1 - Минимально /  1.0 - Максимально", _, true, 0.0, true, 1.0); Hook(hCvar, CvarHookVolume); g_fVolume = hCvar.FloatValue;
    hCvar = CreateConVar("simple_duel_type_sound", "0", "Как воспроизводить музыку? 0 - по очереди / 1 - рандом", _, true, 0.0, true, 1.0); Hook(hCvar, CvarHookType); g_bType = hCvar.BoolValue;
    AutoExecConfig(true, "simple_duel_sound");
}

void CvarHookPreparation(ConVar hCvar) { hCvar.GetString(SZF(g_sPreparation)); }
void CvarHookVictory(ConVar hCvar) { hCvar.GetString(SZF(g_sVictory)); }
void CvarHookLosing(ConVar hCvar) { hCvar.GetString(SZF(g_sLosing)); }
void CvarHookSound(ConVar hCvar) { ConvertSound(hCvar); }
void CvarHookVolume(ConVar hCvar) { g_fVolume = hCvar.FloatValue; }
void CvarHookType(ConVar hCvar) { g_bType = hCvar.BoolValue; }

public void OnConfigsExecuted()
{
    g_iCount = 0;
    DownloadAndPrecacheFile(g_sPreparation);
    DownloadAndPrecacheFile(g_sVictory);
    DownloadAndPrecacheFile(g_sLosing);

    if(g_sSound[0][0] == 0) return;
    for(int i; i < g_iSound; i++) DownloadAndPrecacheFile(g_sSound[i]);
}

public void SD_Events(int iEvent)
{
    switch(iEvent)
    {
        case 0: PlaySoundAll(g_sPreparation);
        case 1:
        {
            SoundStop();
            if(g_sSound[0][0] == 0) return;
            if(g_bType) PlaySoundAll(g_iSound > 1 ? g_sSound[GetRandomInt(0, g_iSound -1)]:g_sSound[0]);
            else
            {
                if(g_iCount > g_iSound) g_iCount = 0;
                PlaySoundAll(g_sSound[g_iCount]); g_iCount++;
            }
        }
        case 2:
        {
            SoundStop();
            PlaySound(SD_GetWinner(), g_sVictory);
            PlaySound(SD_GetLoser(), g_sLosing);
        }
    }
}

void ConvertSound(ConVar hCvar)
{
    char sBuffer[1024]; hCvar.GetString(SZF(sBuffer));
    g_iSound = ExplodeString(sBuffer, ",", g_sSound, sizeof(g_sSound), sizeof(g_sSound[]));
}

void DownloadAndPrecacheFile(const char[] sSound)
{
    if(sSound[0] == 0) return;
    char sBuffer[134];
    FormatEx(SZF(sBuffer), "sound/%s", sSound);
    AddFileToDownloadsTable(sBuffer);
    FormatEx(SZF(sBuffer), "*%s", sSound);
    AddToStringTable(FindStringTable("soundprecache"), sBuffer);
}

void PlaySoundAll(const char[] sSound)
{
    if(sSound[0] == 0) return;
    FormatEx(SZF(g_sStopSound), "*%s", sSound);
    LC(i) EmitSoundToClient(i, g_sStopSound, SOUND_FROM_PLAYER, SNDCHAN_STATIC, SNDLEVEL_NONE, SND_NOFLAGS, g_fVolume);
}

void PlaySound(int iClient, const char[] sSound)
{
    if(iClient < 1 || sSound[0] == 0) return;
    char sBuffer[130]; FormatEx(SZF(sBuffer), "*%s", sSound)
    EmitSoundToClient(iClient, sBuffer, _, _, _, _, g_fVolume);
}

void SoundStop()
{
    if(g_sStopSound[0] == 0) return;
    LC(i) StopSound(i, SNDCHAN_STATIC, g_sStopSound);
    g_sStopSound[0] = 0;
}
 

Вложения

Последнее редактирование:
5  
Сообщения
56
Рейтинг
24
#3
А чекнуть что чиркает по стене реально?
 
 
Сообщения
160
Рейтинг
152
#6
Drumanid,
Код с зп для чиркашей.
Код:
    // Hooks server sounds
    AddNormalSoundHook(view_as<NormalSHook>(PlayerSoundsNormalHook));
Код:
/**
 * Called when a sound is going to be emitted to one or more clients. NOTICE: all params can be overwritten to modify the default behaviour.
 * 
 * @param clients           Array of client indexes.
 * @param numClients        Number of clients in the array (modify this value ifyou add/remove elements from the client array).
 * @param sSample           Sound file name relative to the "sounds" folder.
 * @param entityIndex       Entity emitting the sound.
 * @param iChannel          Channel emitting the sound.
 * @param flVolume          The sound volume.
 * @param iLevel            The sound level.
 * @param iPitch            The sound pitch.
 * @param iFrags            The sound flags.
 **/
public Action PlayerSoundsNormalHook(int clients[MAXPLAYERS-1], int &numClients, char[] sSample, int &entityIndex, int &iChannel, float &flVolume, int &iLevel, int &iPitch, int &iFrags)
{
    // Gets real player index from event key
    int clientIndex = (IsValidEdict(entityIndex) && WeaponsValidateKnife(entityIndex)) ? GetEntDataEnt2(entityIndex, g_iOffset_WeaponOwner) : entityIndex;

    // Validate client
    if(IsPlayerExist(clientIndex))
    {
        // Verify that the client is zombie
        if(gClientData[clientIndex][Client_Zombie])
        {
            // If a footstep sound, then proceed
            if(StrContains(sSample, "footsteps") != -1)
            {
                // If footstep sounds disabled, then stop
                if(gCvarList[CVAR_SEFFECTS_FOOTSTEPS].BoolValue)
                {
                    // Emit zombie footstep sound
                    SoundsInputEmitToAll(gClientData[clientIndex][Client_Nemesis] ? gServerKey[Nemesis_Footstep] : ZombieGetSoundFootID(gClientData[clientIndex][Client_ZombieClass]), 0, clientIndex, SNDCHAN_STREAM, gCvarList[CVAR_GAME_CUSTOM_SOUND_LEVEL].IntValue);
                }
                
                // Block sounds
                return Plugin_Stop;
            }
            // If a knife sound, then proceed
            else if(StrContains(sSample, "knife") != -1)
            {
                // If attack sounds disabled, then stop
                if(gCvarList[CVAR_SEFFECTS_CLAWS].BoolValue)
                {
                    // Emit zombie slash sound
                    SoundsInputEmitToAll(gClientData[clientIndex][Client_Nemesis] ? gServerKey[Nemesis_Attack] : ZombieGetSoundAttackID(gClientData[clientIndex][Client_ZombieClass]), 0, entityIndex, SNDCHAN_WEAPON, gCvarList[CVAR_GAME_CUSTOM_SOUND_LEVEL].IntValue);
                }
                
                // Block sounds
                return Plugin_Stop;
            }
        }
    }

    // Allow sounds
    return Plugin_Continue;
}
 
2  
Сообщения
56
Рейтинг
24
#9
А в место
C++:
CreateTimer(0.0, view_as<Timer>(RemoveSoundHookTimer)); // crash server
пробовал ли ставить RequestFrame?
 
 
Сообщения
56
Рейтинг
24
#14
Если будет время и желание, добавь опцию вывода меню, ну тип я чиркнул 3 раза и врагу выскочило предложение дуэли в виде меню.
 
Последнее редактирование:
1  
Сообщения
56
Рейтинг
24
#15
Что так, что эдак - большой разницы нет, но я изменю код в следующем обновлении, в этом есть смысл.
+

C++:
L 11/23/2018 - 22:34:44: [SM] Blaming: mmcs/SimpleDuel.smx
L 11/23/2018 - 22:34:44: [SM] Call stack trace:
L 11/23/2018 - 22:34:44: [SM]   [0] SetEntProp
L 11/23/2018 - 22:34:44: [SM]   [1] Line 375, SimpleDuel.sp::EndDuel
L 11/23/2018 - 22:34:44: [SM]   [2] Line 90, SimpleDuel.sp::RoundEndStart
L 11/23/2018 - 23:04:04: Error log file session closed.
 
 
Сообщения
69
Рейтинг
160
#16
SAZONISCHE, ошибки сейчас начинаются с Exception reported. Эта строчка обычно идёт строкой выше Blaming.
Хотя лично я уже догадываюсь, в чём там проблема...
 
1  
Сообщения
40
Рейтинг
58
#17
+

C++:
L 11/23/2018 - 22:34:44: [SM] Blaming: mmcs/SimpleDuel.smx
L 11/23/2018 - 22:34:44: [SM] Call stack trace:
L 11/23/2018 - 22:34:44: [SM]   [0] SetEntProp
L 11/23/2018 - 22:34:44: [SM]   [1] Line 375, SimpleDuel.sp::EndDuel
L 11/23/2018 - 22:34:44: [SM]   [2] Line 90, SimpleDuel.sp::RoundEndStart
L 11/23/2018 - 23:04:04: Error log file session closed.
Ага, тоже появилась, вечером/завтра исправлю, надо добавить проверку на валидность игрока, да и думаю лучше сделать везде в циклах.

Код:
L 11/28/2018 - 15:32:22: [SM] Exception reported: Entity 4 (4) is invalid
L 11/28/2018 - 15:32:22: [SM] Blaming: SimpleDuel.smx
L 11/28/2018 - 15:32:22: [SM] Call stack trace:
L 11/28/2018 - 15:32:22: [SM]   [0] SetEntProp
L 11/28/2018 - 15:32:22: [SM]   [1] Line 375, D:\Download\SourcePawn\Компилятор\SimpleDuel.sp::EndDuel
L 11/28/2018 - 15:32:22: [SM]   [2] Line 90, D:\Download\SourcePawn\Компилятор\SimpleDuel.sp::RoundEndStart
L 11/28/2018 - 15:44:16: Error log file session closed.

SAZONISCHE, лишнее же нет? Так хотел избавиться от этих менюшек...
 
 
Сообщения
56
Рейтинг
24
#20
@SAZONISCHE, ошибки сейчас начинаются с Exception reported. Эта строчка обычно идёт строкой выше Blaming.
Хотя лично я уже догадываюсь, в чём там проблема...
Яж не буду чужой код править, просто скинул что есть
 
 
> > > >