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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #21
Теперь, зачем же нам были нужны переменные? Дело в том, что мы точно не знаем, как настроена смена карты у каждого человека. Поэтому сделать универсальный вариант было бы более рациональным решением

А если знаем ? Нужно именно по времени. Щас проверю 1-й вариант.

При компиляции:
(85 -- 89) : warning 209: function "CheckMapEnd" should return a value

PHP:
                lastround = true; 
            } 
        } 
    } 
}
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
А если знаем ? Нужно именно по времени. Щас проверю 1-й вариант.

При компиляции:

PHP:
bool:CheckMapEnd() 
{ 
    new timelimit = 0; 

    if (GetMapTimeLimit(timelimit) && timelimit < 1) 
    { 
        return false;
    } 
    else 
    { 
        new timeleft = 0;  

        if (GetMapTimeLeft(timeleft))  
        { 
            if (timeleft > 0) 
            { 
                return false; 
            }
            else 
            { 
                return true;
            } 
        } 

		return false;
    }

	return false;
}
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #23
The End Is Near...,
PHP:
#pragma semicolon 1
#include <sourcemod>

public OnPluginStart()
{
	HookEvent("round_end", OnRoundEnd);
}

public Action:OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
	if (CheckMapEnd()) PrintToChatAll("\x03Конец рануда. \x04Последний");
		// последний раунд
	else PrintToChatAll("\x03Конец рануда. \x04Не последний");
		// не последний раунд
}

// Если по времени, то 
bool:CheckMapEnd() 
{ 
    // Начнем с того,  

    // Создаем логические переменные 

    // True - Последний раунд 
    // False - Не последний раунд 
    new bool:lastround = false; 

    // True - Нет конца карта по времени (0) 
    // False - Есть конец карты по времени (Идет отсчет) 
    new bool:notimelimit = false; 

    // Создаем переменную, которая будет хранить в себе время карты 
    new timelimit = 0; 

    // Получаем время карты и если оно меньше единицы (0 вообщем-то) 
    if (GetMapTimeLimit(timelimit) && timelimit < 1) 
    { 
        // Ставим значение переменной в значении True 
        // То есть теперь мы знаем, что конца карты по времени нет 
        // Или тут можно использовать return false 
        notimelimit = true; 
    } 
     
    // Иначе, если отсчет все-таки идет 
    else 
    { 
        // Создаем переменную, которя будет содержать в себе оставшееся время до конца карты 
        new timeleft = 0;  

        // Получаем количество секунд 
        if (GetMapTimeLeft(timeleft))  
        { 
            // Если время до конца карты больше нуля 
            if (timeleft > 0) 
            { 
                // Возвращаем False 
                return false; 
            } 

            // Иначе, если отсчет есть, и время оставшееся время равно нулю 
            else 
            { 
                // Ставим значение переменной в значении True 
                // Или тут можно использовать return true 
                lastround = true; 
            } 
        } 
    } 
}

Так всё время выводит, что раунд не последний. Timeleft - 5 roundtime - 1

А второй код ошибка (64) : warning 225: unreachable code на предпоследней строке (return false; )
Ко второму коду:
Всё норм. Вот только вот что, как только timeleft становится 0, и раунд заканчивается пишет, что он последний, но начинается новый раунд который и есть действительно последним и в конце него тоже пишет что он последний.
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
R1KO
PHP:
bool:CheckMapEnd() 
{ 
	new timelimit = 0, timeleft = 0; 

	return (GetMapTimeLimit(timelimit) && timelimit < 1) ? false : GetMapTimeLeft(timeleft) ? (timeleft > 0 ? true : false) : false;
}
Попробуй) Если не работает или работает неправильно, напиши
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #25
R1KO
PHP:
bool:CheckMapEnd() 
{ 
	new timelimit = 0, timeleft = 0; 

	return (GetMapTimeLimit(timelimit) && timelimit < 1) ? false : GetMapTimeLeft(timeleft) ? (timeleft > 0 ? true : false) : false;
}
Попробуй) Если не работает или работает неправильно, напиши

Этот вообще всё время пишет, что последний. Может у меня начало код вывода не верный ?

Самый работоспособный код:
PHP:
bool:CheckMapEnd() 
{ 
    new timelimit = 0; 

    if (GetMapTimeLimit(timelimit) && timelimit < 1) 
    { 
        return false;
    } 
    else 
    { 
        new timeleft = 0;  

        if (GetMapTimeLeft(timeleft))  
        { 
            if (timeleft > 0) 
            { 
                return false; 
            }
            else 
            { 
                return true;
            } 
        } 

		return false;
    }

	return false;
}

Но в нем проблема:
как только timeleft становится 0, и раунд заканчивается пишет, что он последний, но начинается новый раунд который и есть действительно последним и в конце него тоже пишет что он последний.
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
R1KO
И постоянно так? Если так всегда, то создай глобальную переменную (на первый раз false, на второй раз true возвращай)
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #27
The End Is Near..., думаю может быть из-за маленького значения переменных. Надо будет нормально проверить при timeleft 20, и roundtime >3.

Вышло так:
PHP:
public Action:OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
	if (CheckMapEnd()) PrintToChatAll("\x03Конец рануда. \x04Последний");
		// последний раунд
	else PrintToChatAll("\x03Конец рануда. \x04Не последний");
		// не последний раунд
}

bool:CheckMapEnd() 
{
	new bool:lastround = false;
	
	new timeleft;
	if (GetMapTimeLeft(timeleft))
	{
		if (timeleft > 0)
		{
			PrintToChatAll("\x03timeleft > 0");// если убрать эту строку - то лучше было бы написать if ( timeleft =< 0) lastround=true; да ?
		}
		else
		{
			PrintToChatAll("\x03timeleft =< 0");
			lastround=true;
		}
	}
	
	if (!lastround)
	{
		PrintToChatAll("\x03Конец рануда. \x04Не последний+");
		return false;
	}
	
	if (lastround)
	{
		PrintToChatAll("\x03Конец рануда. \x04Последний+");
		return true;
	}
	return true;
//	return Plugin_Continue;
}

The End Is Near..., Еще вопросик, если не сложно. Есть твой код)))
PHP:
#include <sourcemod>
#include <sdktools>

new Handle:g_hPath = INVALID_HANDLE;

new Handle:Array = INVALID_HANDLE;

new ArraySize;

public OnPluginStart()
{
	g_hPath = CreateConVar("join_sound_path", "addons/sourcemod/configs/join_sound_list.cfg", "Укажите путь к файлу");
	
	Array = CreateArray(255, 0);
}

public OnMapStart()
{
	decl String:path[255];
	GetConVarString(g_hPath, path, sizeof(path));

	new Handle:file = OpenFile(path, "r");

	if (file == INVALID_HANDLE) 
	{ 
		LogError("Не удалось открыть файл '%s'", path);
	}
	else
	{
		new CountLine = 0;

		decl String:line[150], String:buffer[255];
		while (!IsEndOfFile(file) && CountLine <= 50 && ReadFileLine(file, line, sizeof(line)))
		{
			CountLine++;
			TrimString(line);
			PushArrayString(Array, line);

			PrecacheSound(line);

			Format(buffer, sizeof(buffer), "sound/%s", line);
			AddFileToDownloadsTable(buffer);
		}
		ArraySize = GetArraySize(Array);
		CloseHandle(file);
	}
}

public OnClientPutInServer(client)
{
	if (client > 0 && !IsFakeClient(client))
	{
		decl String:ArrayName[50];
		GetArrayString(Array, GetRandomInt(0, ArraySize-1), ArrayName, sizeof(ArrayName));
		ClientCommand(client, "playgamesound %s", ArrayName);
	}
}
Как его разделить на 3 списка ? Например, звуки прописаны так:
sound_serv/1.mp3=r
sound_serv/1.mp3=m
sound_serv/1.mp3=j

Чтобы все звуки с тегом r были в одном списке, с m в другом, с j в третьем.

P.S.Надеюсь понятно объяснил :)
 
Последнее редактирование:

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
R1KO
1.
PHP:
bool:CheckMapEnd()
{ 
	new timeleft = 0;

    if (GetMapTimeLeft(timeleft))
    {
		return (timeleft <= 0) ? true : false;
	}

	return false;
}

2. Пример у FrozDark в плагине Round End Sound
 
  • Мне нравится
Реакции: R1KO

HooLIGUN

MatchMaking CS:S / RGMIX.ru
Сообщения
1,062
Реакции
267
Можешь написать палгин, чтобы админы видели кто бомбу дропнул независимо в какой команде играет админ?
Например вывод в чат:
(ADMINS) Игрок unnamed скинул бомбу
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Можешь написать палгин, чтобы админы видели кто бомбу дропнул независимо в какой команде играет админ?
Например вывод в чат:
(ADMINS) Игрок unnamed скинул бомбу

Пробуй
Если ты админ, и выбросишь бомбу, то сообщение не увидишь
 

Вложения

  • bomb_dropped.sp
    613 байт · Просмотры: 45

HooLIGUN

MatchMaking CS:S / RGMIX.ru
Сообщения
1,062
Реакции
267
Пробуй
Если ты админ, и выбросишь бомбу, то сообщение не увидишь
Спасибо!
А можешь сделать , чтобы в чат писало только когда игрок САМ скинул бомбу?:)
А то я убиваю тера с бомбой,и в чат пишет что он ее скинул
 

Ваня Олейник

Участник
Сообщения
74
Реакции
12
Можешь попробовать.
Смотри что в чат пишет:
Большинство убийств: FF4040ADMIN - FF40402 (Урон: FF4040281, Попаданий: FF40405)
Наибольший урон: FF4040ADMIN - FF4040281 (Убийств: FF40402, Попаданий: FF40405)
P.S. Сервер у меня 34-ой версии
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691

Вложения

  • bomb_dropped.sp
    671 байт · Просмотры: 49

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691

Вложения

  • mdest_v34.sp
    2 КБ · Просмотры: 52

Ваня Олейник

Участник
Сообщения
74
Реакции
12
А не подскажешь как в код добавить {TEAM} {GREEN} цвета?Или можешь сделать если не сложно)А то {DEFAULT} скучный.
 

Tiger

Участник
Сообщения
16
Реакции
1
Привет, можешь добавить в этот плагин покупку распрыжки? И чтобы кредиты сохранялись на текущей карте, а после смены обнулялись, и больше не чего.
 

Вложения

  • jail_awards.sp
    26.6 КБ · Просмотры: 16
Сверху Снизу