Введение в SourcePawn программирование

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #41
AlmazON,
PHP:
AddMenuItem(hMenu,  sUserId,  sName,  (CanUserTarget(client, target)) ? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED);
Где client - игрок, которому будет отправлено меню,
target - игрок, которого мы добавляем в меню.

Это и есть наше условие.

PHP:
(CanUserTarget(client, target)) ? ITEMDRAW_DEFAULT:ITEMDRAW_DISABLED
Если игрок не может ничего делать с целью, например, из-за более высокого уровня иммунитета, то пункт будет не активным и его нельзя будет выбрать.

То есть условие выглядит так:
PHP:
 (условие) ? значение, если правда : значение, если ложь
Еще 1 пример со строками:
PHP:
PrintToChat(client, "Плагин %s",  (g_bEnabled) ? "Включен":"Выключен");
Где g_bEnabled - глобальная переменная типа bool, которая хранит в себе статус плагина.

По поводу первого вопроса - открываешь файл и делаешь по каждой строке http://docs.sourcemod.net/api/index.php?fastload=show&id=615&
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
(условие) ? значение, если правда : значение, если ложь
Так "?" - это условие? Я ранее себе "указал", обозвав это "условие или/или" - это верно?
По поводу первого вопроса
Спасибо. Я искал в API для файлов и нечего толкового не нашёл. А таким ещё не пользовался, попробую разобраться и применить. :)
А по INVALID_HANDLE можешь что дополнить? Зачем она? У самого schmidt это описывалось "для создания глобальной переменной" или вроде того, отчего я опять запутался. Что же она даёт? И равна в Павне 0, не -1, как в программировании?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #43
AlmazON, ну смотри, в интовых чисел дефолтное значение 0, а у handle дефолтное INVALID_HANDLE. Грубо говоря это просто присваивает ей пустое значение.

Up

Переменные типа Handle инициализируются со значением INVALID_HANDLE.
Это тот же 0 только для класса Handle

PHP:
enum Handle
{
	INVALID_HANDLE = 0,
};
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #44
Может наоборот, как "обезопасить строку" - "хотим работать с переменной, но не уверены, есть ли в ней значение"?

Тоесть?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #45
AlmazON, не знаю, никогда не пишу.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
R1KO, что-то бредит моё знание Павна:
PHP:
new String:FileCFG[256];
	Format(FileCFG, sizeof(FileCFG), "cfg/bot.cfg");
	new Handle:CfgFile = OpenFile(FileCFG, "at");
	
	new String:FiCFG[250];
	Format(FiCFG, sizeof(FiCFG), "cfg/bot.cfg");
	new Handle:CfgFile2 = OpenFile(FiCFG, "at")
	decl String:buffer[32];
	ReadFileLine(CfgFile2, buffer, sizeof(buffer));
	TrimString(buffer);
	if (buffer[0] == '/' || buffer[0] == '\0')
	{

	if (StrContains(buffer, "12345_version", false) == -1)
		WriteFileLine(CfgFile, "\n// Версия плагина '12345'.\n//---\n12345_version %s\n", PLUGIN_VERSION);
CloseHandle(CfgFile);
	}
Продолжает просто строчки вписывать, не находя нужных строк. Как правильно "открыть" файл для StrContains?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #47
Думаю так:
PHP:
new Handle:hFile = OpenFile("cfg/bot.cfg", "at");
if (hFile != INVALID_HANDLE)
{
	decl String:sBuffer[PLATFORM_MAX_PATH], bool:Has;
	Has = false;
	while (IsEndOfFile(hFile) && ReadFileLine(hFile, sBuffer, sizeof(sBuffer)))
	{
		if (StrContains(buffer, "12345_version", false) != -1)
		{
			Has = true;
			break;
		}
	}
	if(!Has) WriteFileLine(CfgFile, "\n// Версия плагина '12345'.\n//---\n12345_version %s\n", PLUGIN_VERSION); 
}
CloseHandle(hFile);
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #48
AlmazON, с твоим кодом после каждой строки будет записывать.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #49
Оффтоп
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #51
AlmazON, ты о чем? Всмотрись в код.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
R1KO, хорошо, смотри:
PHP:
new Handle:hFile = OpenFile("cfg/bot.cfg", "at");
if (hFile != INVALID_HANDLE)
{
    decl String:sBuffer[PLATFORM_MAX_PATH], bool:Has, bool:Has1;
    Has = false, Has1 = false;
    while (IsEndOfFile(hFile) && ReadFileLine(hFile, sBuffer, sizeof(sBuffer)))
    {
        if (StrContains(buffer, "12345_version", false) != -1)
        {
            Has = true;
            break;
        }
		if (StrContains(buffer, "12345_enable", false) != -1)
        {
            Has1 = true;
            break;
        }
    }
    if(!Has) WriteFileLine(CfgFile, "\n// Версия плагина '12345'.\n//---\n12345_version %s\n", PLUGIN_VERSION);
	if(!Has1) WriteFileLine(CfgFile, "\n// Включение плагина '12345'.\n//---\n12345_enable %i\n", b_enable);
}
CloseHandle(hFile);
Это мне каждой строчке записи ещё один Has создавать? У меня 10 строчек, а далее и больше быть может... Код слишком разрастается.
Извини конечно, что надоедаю, я тут тоже плохо соображаю на ночь) Но, если код похож на лесенки, как выше, то это "жирно".
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
AlmazON, неправильно проверяешь. Результат -1 для StrContains будет, если строчка не найдена. т.е нужно != -1
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #54
AlmazON, я бы искал другие варианты.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
Результат -1 для StrContains будет, если строчка не найдена. т.е нужно != -1
Так мне и нужно сделать запись, лишь когда она как раз не найдена (== -1). Строчка сама себя проверять должна: если её нет - вписать, а если есть - ничего не делать.

R1KO, понял. Жаль... Оффтоп
А твой код не работает. Запись делается опять после каждой перезагрузки.
Вот полный код использования:
PHP:
public OnConfigsExecuted()
{
	new size = FileSize("cfg/bot.cfg"), String:FileCFG[256];
	Format(FileCFG, sizeof(FileCFG), "cfg/bot.cfg");
	if (!FileExists(FileCFG))
	{
		CAB_Config();
		PrintToServer("[CAB] The configuration file is automatically created in (%s).", FileCFG);
	}
	else if (FileExists(FileCFG) && !(1085 < size < 1100))
	{
		EXE();
		PrintToServer("[CAB] Read custom file size %d Bytes in (%s) completed successfully.", size, FileCFG);
		new Handle:File = OpenFile("cfg/bot.cfg", "at");
		if (File != INVALID_HANDLE)
		{
			decl String:buffer[PLATFORM_MAX_PATH], bool:Yes;
			Yes = false;
			while (IsEndOfFile(File) && ReadFileLine(File, buffer, sizeof(buffer)))
			{
				if (StrContains(buffer, "CAB_version", false) != -1)
				{
					Yes = true;
					break;
				}
			}
			if (!Yes)
			{
				CAB_Config_Mini();
				PrintToServer("[CAB] Write new data... recorded!");
				EXE();
			}
		}
	}
	else EXE();
}
Сам поиск не работает! Если вписать:
PHP:
if (StrContains(buffer, "CAB_version", false) != -1)
				{
					Yes = true;
					PrintToServer("[CAB] Yes = %d, StrContains = %d!", Yes, StrContains(buffer, "CAB_version", false));
					break;
				}
То уведомления о сработке поиска в консоль сервера не выводится, хотя запись уже есть (остальные уведомление в консоли видны).
Компилятор не выдал ошибок, но может я где ошибся?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
Не нашёл ничего путного про #define.
Кто может грамотным (профессиональным) языком объяснить, что это такое, как называется? Для чего и зачем?
Например,
PHP:
#include <>
Подключаемая библиотека SourceMod API (или файлы включения).
Включение списков файлов всех структур, функций, вызовов и тегов, которые имеются в наличии.
Так же и про #define пожалуйста.
 

SenatoR

Участник
Сообщения
773
Реакции
344
#define VALUE 12
Это статичное значение.
его можно использовать в коде, но нельзя изменить
new val;
val = VALUE + 10;
Т.е если val можно изменить, то VALUE нет.

P.S. Постарался объяснить, как мог :-D
 

SenatoR

Участник
Сообщения
773
Реакции
344
SenatoR, сам знаешь, C/C++ всё же отличен от Павна. Директива, макрос - разве такое вообще в Павне есть? Если я назову #define - директивой Павна, смеятся можно или нет? Это всё же не то.

Основой SourcePawn что является?)
 
Сверху Снизу