Переделка плагина Knife Owned

cangncan

Участник
Сообщения
69
Реакции
4
Knife Ownen(hlmod.ru)
Оригинал

- изначально плагин проигрывает один и тот же звук.
- Нужно чтобы проигрывалось несколько звуков (у меня их 6)

На сервере стоит QuakeSounds 1.8
В настройках QuakeSounds звук ножа отключил. ("config" "0")

Ребят помогите допилить плагин.
"ГореКодер" (Я), сделал вот так:

PHP:
/// Based upon Kinfe Mug by FlyingMongoose & sslice
// When a player is stabbed they get publicly humilated in chat and HAHA or other sound in game

#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdktools_sound>

#define KO_VERSION "1.2"
#define MAX_FILE_LEN 80
new Handle:g_CvarSoundName = INVALID_HANDLE;
new Handle:g_CvarSoundName2 = INVALID_HANDLE;
new Handle:g_CvarSoundName3 = INVALID_HANDLE;
new Handle:g_CvarSoundName4 = INVALID_HANDLE;
new Handle:g_CvarSoundName5 = INVALID_HANDLE;
new Handle:g_CvarSoundName6 = INVALID_HANDLE;
new String:g_soundName[MAX_FILE_LEN];
new String:g_soundName2[MAX_FILE_LEN];
new String:g_soundName3[MAX_FILE_LEN];
new String:g_soundName4[MAX_FILE_LEN];
new String:g_soundName5[MAX_FILE_LEN];
new String:g_soundName6[MAX_FILE_LEN];

// Define author information
public Plugin:myinfo = 
{
    name = "Knife Owned",
    author = "MoggieX",
    description = "Ownd by Knife",
    version = KO_VERSION,
    url = "http://www.UKManDown.co.uk"
};

new Handle:cvarEnable;
new bool:g_isHooked;

public OnPluginStart()
{
    CreateConVar("sm_knife_Owned_version", KO_VERSION, _, FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_REPLICATED|FCVAR_SPONLY);
    cvarEnable = CreateConVar("sm_knife_enable","1","Plays sound and gives chat ntoification when a player is knifed",FCVAR_PLUGIN,true,0.0,true,1.0);
    g_CvarSoundName = CreateConVar("sm_knife_sound", "misc/humiliation.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName2 = CreateConVar("sm_knife_sound2", "misc/humiliation2.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName3 = CreateConVar("sm_knife_sound3", "misc/humiliation3.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName4 = CreateConVar("sm_knife_sound4", "misc/humiliation4.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName5 = CreateConVar("sm_knife_sound5", "misc/humiliation5.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName6 = CreateConVar("sm_knife_sound6", "misc/humiliation6.mp3", "The random sound to play when a player is knifed");
    CreateTimer(3.0, OnPluginStart_Delayed);
}

// For sounds and its caching
public OnConfigsExecuted()
{
    GetConVarString(g_CvarSoundName, g_soundName, MAX_FILE_LEN);
    decl String:buffer[MAX_FILE_LEN];
    PrecacheSound(g_soundName, true);
    Format(buffer, sizeof(buffer), "sound/%s", g_soundName);
    AddFileToDownloadsTable(buffer);
    GetConVarString(g_CvarSoundName2, g_soundName2, MAX_FILE_LEN);
    decl String:buffer2[MAX_FILE_LEN];
    PrecacheSound(g_soundName2, true);
    Format(buffer, sizeof(buffer2), "sound/%s", g_soundName2);
    AddFileToDownloadsTable(buffer2);
    GetConVarString(g_CvarSoundName3, g_soundName3, MAX_FILE_LEN);
    decl String:buffer3[MAX_FILE_LEN];
    PrecacheSound(g_soundName3, true);
    Format(buffer, sizeof(buffer3), "sound/%s", g_soundName3);
    AddFileToDownloadsTable(buffer3);
    GetConVarString(g_CvarSoundName4, g_soundName4, MAX_FILE_LEN);
    decl String:buffer4[MAX_FILE_LEN];
    PrecacheSound(g_soundName4, true);
    Format(buffer, sizeof(buffer4), "sound/%s", g_soundName4);
    AddFileToDownloadsTable(buffer4);
    GetConVarString(g_CvarSoundName5, g_soundName5, MAX_FILE_LEN);
    decl String:buffer5[MAX_FILE_LEN];
    PrecacheSound(g_soundName5, true);
    Format(buffer, sizeof(buffer5), "sound/%s", g_soundName5);
    AddFileToDownloadsTable(buffer5);
    GetConVarString(g_CvarSoundName6, g_soundName6, MAX_FILE_LEN);
    decl String:buffer6[MAX_FILE_LEN];
    PrecacheSound(g_soundName6, true);
    Format(buffer, sizeof(buffer6), "sound/%s", g_soundName6);
    AddFileToDownloadsTable(buffer6);
}


public Action:OnPluginStart_Delayed(Handle:timer){
    if(GetConVarInt(cvarEnable) > 0)
    {
        g_isHooked = true;
        HookEvent("player_death",ev_PlayerDeath);
        
        HookConVarChange(cvarEnable,KnifeOwnedCvarChange);
        
        LogMessage("[Knife Notification] - Loaded");
    }
}

public KnifeOwnedCvarChange(Handle:convar, const String:oldValue[], const String:newValue[]){
    if(GetConVarInt(cvarEnable) <= 0){
        if(g_isHooked){
        g_isHooked = false;
        UnhookEvent("player_death",ev_PlayerDeath);
        }
    }else if(!g_isHooked){
        g_isHooked = true;
        HookEvent("player_death",ev_PlayerDeath);
    }
}

public ev_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    // Check if enabled, if not bail out

    if (GetConVarInt(cvarEnable) == 0)
    {
        return;
    }

    decl String:weaponName[100];
    decl String:victimName[100];
    decl String:killerName[100];

    GetEventString(event,"weapon",weaponName,100);

    // if the weapon used in death was a knife it continues

    if(StrEqual(weaponName, "knife"))
    {
        new userid = GetEventInt(event, "userid");
        new userid2 = GetEventInt(event, "attacker");

        new victim = GetClientOfUserId(userid);
        new killer = GetClientOfUserId(userid2);

        if(victim != 0 && killer != 0)
        {
            new victimTeam = GetClientTeam(victim);
            new killerTeam = GetClientTeam(killer);

            if(killerTeam!=victimTeam)
            {
                GetClientName(victim,victimName,100);
                GetClientName(killer,killerName,100);
                new knife_sound = GetRandomInt(1, 6);
                if (knife_sound != 1)
                {
                                EmitSoundToAll(g_soundName);
                }
                if (knife_sound != 2)
                {
                                EmitSoundToAll(g_soundName2);
                }
                if (knife_sound != 3)
                {
                                EmitSoundToAll(g_soundName3);
                }
                if (knife_sound != 4)
                {
                                EmitSoundToAll(g_soundName4);
                }
                if (knife_sound != 5)
                {
                                EmitSoundToAll(g_soundName5);
                }
                if (knife_sound != 6)
                {
                                EmitSoundToAll(g_soundName6);
                }
            }
        }
    }
}

Итог - проигрывает только один звук ("misc/humiliation.mp3") остальные не хочет, и пишет в лог ошибки:
[SM] Native "GetConVarString" reported: Invalid convar handle 0 (error 4)
[SM] Displaying call stack trace for plugin "KnifeOwned.smx":
[SM] [0] Line 78, KnifeOwned.sp::OnConfigsExecuted()

Добавлено через 3 часа 49 минут
Сделал так:
PHP:
// Based upon Kinfe Mug by FlyingMongoose & sslice
// When a player is stabbed they get publicly humilated in chat and HAHA or other sound in game

#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdktools_sound>

#define KO_VERSION "1.2"
#define MAX_FILE_LEN 80
new Handle:g_CvarSoundName = INVALID_HANDLE;
new Handle:g_CvarSoundName2 = INVALID_HANDLE;
new Handle:g_CvarSoundName3 = INVALID_HANDLE;
new Handle:g_CvarSoundName4 = INVALID_HANDLE;
new Handle:g_CvarSoundName5 = INVALID_HANDLE;
new Handle:g_CvarSoundName6 = INVALID_HANDLE;
new String:g_soundName[MAX_FILE_LEN];
new String:g_soundName2[MAX_FILE_LEN];
new String:g_soundName3[MAX_FILE_LEN];
new String:g_soundName4[MAX_FILE_LEN];
new String:g_soundName5[MAX_FILE_LEN];
new String:g_soundName6[MAX_FILE_LEN];

// Define author information
public Plugin:myinfo = 
{
    name = "Knife Owned",
    author = "MoggieX",
    description = "Ownd by Knife",
    version = KO_VERSION,
    url = "http://www.UKManDown.co.uk"
};

new Handle:cvarEnable;
new bool:g_isHooked;

public OnPluginStart()
{
    CreateConVar("sm_knife_Owned_version", KO_VERSION, _, FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_REPLICATED|FCVAR_SPONLY);
    cvarEnable = CreateConVar("sm_knife_enable","1","Plays sound and gives chat ntoification when a player is knifed",FCVAR_PLUGIN,true,0.0,true,1.0);
    g_CvarSoundName = CreateConVar("sm_knife_sound", "misc/humiliation.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName2 = CreateConVar("sm_knife_sound2", "misc/humiliation2.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName3 = CreateConVar("sm_knife_sound3", "misc/humiliation3.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName4 = CreateConVar("sm_knife_sound4", "misc/humiliation4.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName5 = CreateConVar("sm_knife_sound5", "misc/humiliation5.mp3", "The random sound to play when a player is knifed");
    g_CvarSoundName6 = CreateConVar("sm_knife_sound6", "misc/humiliation6.mp3", "The random sound to play when a player is knifed");
    CreateTimer(3.0, OnPluginStart_Delayed);
}

// For sounds and its caching
public OnConfigsExecuted()
{
    GetConVarString(g_CvarSoundName, g_soundName, MAX_FILE_LEN);
    decl String:buffer[MAX_FILE_LEN];
    PrecacheSound(g_soundName, true);
    Format(buffer, sizeof(buffer), "sound/%s", g_soundName);
    AddFileToDownloadsTable(buffer);
    GetConVarString(g_CvarSoundName2, g_soundName2, MAX_FILE_LEN);
    decl String:buffer2[MAX_FILE_LEN];
    PrecacheSound(g_soundName2, true);
    Format(buffer, sizeof(buffer2), "sound/%s", g_soundName2);
    AddFileToDownloadsTable(buffer2);
    GetConVarString(g_CvarSoundName3, g_soundName3, MAX_FILE_LEN);
    decl String:buffer3[MAX_FILE_LEN];
    PrecacheSound(g_soundName3, true);
    Format(buffer, sizeof(buffer3), "sound/%s", g_soundName3);
    AddFileToDownloadsTable(buffer3);
    GetConVarString(g_CvarSoundName4, g_soundName4, MAX_FILE_LEN);
    decl String:buffer4[MAX_FILE_LEN];
    PrecacheSound(g_soundName4, true);
    Format(buffer, sizeof(buffer4), "sound/%s", g_soundName4);
    AddFileToDownloadsTable(buffer4);
    GetConVarString(g_CvarSoundName5, g_soundName5, MAX_FILE_LEN);
    decl String:buffer5[MAX_FILE_LEN];
    PrecacheSound(g_soundName5, true);
    Format(buffer, sizeof(buffer5), "sound/%s", g_soundName5);
    AddFileToDownloadsTable(buffer5);
    GetConVarString(g_CvarSoundName6, g_soundName6, MAX_FILE_LEN);
    decl String:buffer6[MAX_FILE_LEN];
    PrecacheSound(g_soundName6, true);
    Format(buffer, sizeof(buffer6), "sound/%s", g_soundName6);
    AddFileToDownloadsTable(buffer6);
}


public Action:OnPluginStart_Delayed(Handle:timer)
{
    if(GetConVarInt(cvarEnable) > 0)
    {
        g_isHooked = true;
        HookEvent("player_death",ev_PlayerDeath);
        
        HookConVarChange(cvarEnable,KnifeOwnedCvarChange);
        
        LogMessage("[Knife Notification] - Loaded");
    }
}

public KnifeOwnedCvarChange(Handle:convar, const String:oldValue[], const String:newValue[])
{
    if(GetConVarInt(cvarEnable) <= 0)
    {
        if(g_isHooked)
        {
            g_isHooked = false;
            UnhookEvent("player_death",ev_PlayerDeath);
        }
    }
    else if(!g_isHooked)
    {
        g_isHooked = true;
        HookEvent("player_death",ev_PlayerDeath);
    }
}

public ev_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    // Check if enabled, if not bail out

    if (GetConVarInt(cvarEnable) == 0)
    {
        return;
    }

    decl String:weaponName[100];
    decl String:victimName[100];
    decl String:killerName[100];

    GetEventString(event,"weapon",weaponName,100);
    
    // if the weapon used in death was a knife it continues

    if (StrEqual(weaponName, "knife"))
    {
        new userid = GetEventInt(event, "userid");
        new userid2 = GetEventInt(event, "attacker");

        new victim = GetClientOfUserId(userid);
        new killer = GetClientOfUserId(userid2);

        if(victim != 0 && killer != 0)
        {
            new victimTeam = GetClientTeam(victim);
            new killerTeam = GetClientTeam(killer);

            if(killerTeam!=victimTeam)
            {
                GetClientName(victim,victimName,100);
                GetClientName(killer,killerName,100);

                new knife_sound = GetRandomInt(1, 6);
                if (knife_sound != 1)
                {
                                EmitSoundToAll(g_soundName);
                }
                else
                {
                    if (knife_sound != 2)
                    {
                                    EmitSoundToAll(g_soundName2);
                    }
                    if (knife_sound != 3)
                    {
                                    EmitSoundToAll(g_soundName3);
                    }
                    if (knife_sound != 4)
                    {
                                    EmitSoundToAll(g_soundName4);
                    }
                    if (knife_sound != 5)
                    {
                                    EmitSoundToAll(g_soundName5);
                    }
                    if (knife_sound != 6)
                    {
                                    EmitSoundToAll(g_soundName6);
                    }
                }
            }
        }
    }
}

Теперь в логах ошибок нет, но качает и проигрывает только один звук ("misc/humiliation.mp3"). Все звуки и пути к ним в порядке, в cs воспроизводятся.
Подскажите куда копать????
 
Последнее редактирование:

semjef

semjef.ru
Сообщения
993
Реакции
444
зачем эти 3 секунды после которых хукается эвент? - глупость же.


new knife_sound = GetRandomInt(1, 6);
                if (knife_sound != 1)
                {
                                EmitSoundToAll(g_soundName);
                }
                else
                {
                    if (knife_sound != 2)
                    {
                                    EmitSoundToAll(g_soundName2);
                    }
                    if (knife_sound != 3)
                    {
                                    EmitSoundToAll(g_soundName3);
                    }
                    if (knife_sound != 4)
                    {
                                    EmitSoundToAll(g_soundName4);
                    }
                    if (knife_sound != 5)
                    {
                                    EmitSoundToAll(g_soundName5);
                    }
                    if (knife_sound != 6)
                    {
                                    EmitSoundToAll(g_soundName6);
                    }
                }

полнейший бред, делай через switch
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Re: Написание плагинов

cangncan
PHP:
#include <sourcemod>
#include <sdktools>

new String:STRING_SoundFiles[][] = {"music/1.mp3", "music/2.mp3", "music/3.mp3"};

#define INT_SizeOfSoundFiles (sizeof(STRING_SoundFiles) - 1)

public OnPluginStart()
{
	HookEvent("player_death", Event_OnPlayerDeath);
}

public OnMapStart()
{
	decl String:buffer[128];
	for (new i = 0; i < INT_SizeOfSoundFiles; i++)
	{
		PrecacheSound(STRING_SoundFiles[i]);

		Format(buffer, sizeof(buffer), "sound/%s", STRING_SoundFiles[i]);
		AddFileToDownloadsTable(buffer);
	}
}

public Event_OnPlayerDeath(Handle:event, const String:name[], bool:silent)
{
	decl String:weapon[32];
	GetEventString(event, "weapon", weapon, sizeof(weapon));

	if (strcmp(weapon, "knife", false) == 0)
	{
		new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));

		if (attacker > 0)
		{
			if (GetClientTeam(attacker) != GetClientTeam(GetClientOfUserId(GetEventInt(event, "userid"))))
			{
				EmitSoundToAll(STRING_SoundFiles[GetRandomInt(0, INT_SizeOfSoundFiles)]);
			}
		}
	}
}
 
Последнее редактирование:

cangncan

Участник
Сообщения
69
Реакции
4
The End Is Near..., Спасибо !!!
НО в конселе ошибки:
[SM] Plugin encountered error 15: Array index is out of bounds
[SM] Displaying call stack trace for plugin "KnifeSound.smx":
[SM] [0] Line 38, KnifeSound.sp::Event_OnPlayerDeath()
 
Последнее редактирование:

cangncan

Участник
Сообщения
69
Реакции
4
Спасибо большое за помощь.
Ошибок пока вроде нету - Будут отпишусь.

P.S. Кто ставит этот плагин вместе с quakesounds(у меня v 1.8) = не забыть в конфиге quakesoundslist поставить на "knife" config "0" и почистить quakeusersettings.txt в папке data.
 
Сообщения
1
Реакции
0
Не работает на Sm 1.7 - build 5290, звуки качает но не воспроизводит. Ошибок в логах нет.

Добавлено через 48 секунд
Что сделать, что-бы работал ?
 
Последнее редактирование:
Сверху Снизу