Как да направя плъгин да взима информация от .ini файл

Ако имате затруднения при изработката/преработката на даден плъгин - пишете тук, ще се опитаме да ви помогнем!
Аватар
User12
Извън линия
Потребител
Потребител
Мнения: 321
Регистриран на: 25 Яну 2018, 22:39
Местоположение: Сливен
Се отблагодари: 40 пъти
Получена благодарност: 17 пъти
Обратна връзка:

Как да направя плъгин да взима информация от .ini файл

Мнение от User12 » 28 Юли 2018, 04:02

Добър вечер от мен , интересувам се от това как да направя плъгина да чете информация от конфигурационен файл ? Мога да го направя със Cvars и от там да се настройват данните , но искам да пробвам и с конфг. файл , може ли да ме насочите към някой урок (ако има такъв) или да ми кажете коя функция да ползвам и разбира се с малко разяснение :worthy:
Каналът ми в YouTube : Георги Пламенов

Изображение

Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Как да направя плъгин да взима информация от .ini файл

Мнение от TheRedShoko » 28 Юли 2018, 08:43

Трябва да прочетеш всеки ред от файла, да го разбиеш, за да извлечеш ключ - стойност и после да си запазиш стойността. Пример може да видиш в плъгините на Крома, той обикновенно така си пази конфигурациите.

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Как да направя плъгин да взима информация от .ini файл

Мнение от OciXCrom » 28 Юли 2018, 15:13

Както каза колегата, най-добре е да погледнеш някой от моите плъгини и да се опиташ да разбереш частта за четенето на файла.

За прост .ini файл който съдържа само настройки и нищо повече, предлагам ти да погледнеш плъгина JailBreak Simon Counter.

Нещата които трябва да гледаш в кода са enum _:Settings, g_eSettings и ReadFile().

За .ini файл с различни раздели за настройки и за добавяне на неща в масив, погледни ранк системата.

Препоръчвам ти да опиташ сам и ако някъде не можеш да се оправиш, качи кода който си написал до момента за да ти обясним къде са ти грешките.

Аватар
User12
Извън линия
Потребител
Потребител
Мнения: 321
Регистриран на: 25 Яну 2018, 22:39
Местоположение: Сливен
Се отблагодари: 40 пъти
Получена благодарност: 17 пъти
Обратна връзка:

Как да направя плъгин да взима информация от .ini файл

Мнение от User12 » 11 Авг 2018, 03:41

OciXCrom™ написа: 28 Юли 2018, 15:13 Както каза колегата, най-добре е да погледнеш някой от моите плъгини и да се опиташ да разбереш частта за четенето на файла.

За прост .ini файл който съдържа само настройки и нищо повече, предлагам ти да погледнеш плъгина JailBreak Simon Counter.

Нещата които трябва да гледаш в кода са enum _:Settings, g_eSettings и ReadFile().

За .ini файл с различни раздели за настройки и за добавяне на неща в масив, погледни ранк системата.

Препоръчвам ти да опиташ сам и ако някъде не можеш да се оправиш, качи кода който си написал до момента за да ти обясним къде са ти грешките.
Като начало създавам няколко , реда с различни настройки за конфигурационния файл.
[16] - Тук 16 ще рече , че създавам настройката да държи 15 символа ? Или греша .

Код за потвърждение: Избери целия код

enum _:Extras
{
	AdminHP[16]
	AdminArmor[16]
	AdminBanHP[16]
	AdminBanArmor[16]
	UserHP[16]
	UserArmor[16]
}
После създавам гл. променлива , която да използвам при четенето на конфг. файла с настройките от него :

Код за потвърждение: Избери целия код

new g_eExtras[Extras]
Това трябва да е основата на частта от кода която чете конфг. файла (или не) .

Код за потвърждение: Избери целия код

ReadFile(bReload = false)
{
	new iFilePointer = fopen(g_szFileName, "rt")
	
	if(iFilePointer)
	{
		new szData[128], szValue[96], szKey[32], szNum[5], szLeft[5], szRight[5]
		
		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)
			
			switch(szData[0])
			{
				case EOS, ';', '[': continue
				default:
Обаче тук не мога да разбера , какво се случва да го земат мътните . Ако може малко да ми се разясни .

Код за потвърждение: Избери целия код

				strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
					trim(szKey); trim(szValue)
					
					if(!szValue[0])
						continue

					if(equal(szKey, "TIMER_COMMAND"))
					{
						copy(g_eSettings[TIMER_COMMAND], charsmax(g_eSettings[TIMER_COMMAND]), szValue)
						g_iCmdLen[CMD_TIMER] = strlen(szValue)
					}
					else if(equal(szKey, "STOP_COMMAND"))
					{
						copy(g_eSettings[STOP_COMMAND], charsmax(g_eSettings[STOP_COMMAND]), szValue)
						g_iCmdLen[CMD_STOP] = strlen(szValue)
					}
Каналът ми в YouTube : Георги Пламенов

Изображение

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Как да направя плъгин да взима информация от .ini файл

Мнение от OciXCrom » 16 Авг 2018, 20:50

User12 написа: 11 Авг 2018, 03:41[16] - Тук 16 ще рече , че създавам настройката да държи 15 символа ? Или греша .
Да.
User12 написа: 11 Авг 2018, 03:41Обаче тук не мога да разбера , какво се случва да го земат мътните . Ако може малко да ми се разясни .
Редовете във файла се четат 1 по 1. Тъй като в кода се ползва цикъл, всички редове ще бъдат прочетени 1 по 1 благодарение на fgets(iFilePointer, szData, charsmax(szData)) - този код взима текущия ред от файла и го запазва в променливата szData.

Код за потвърждение: Избери целия код

strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
С тази функция текстът който се намира в променливата szData (демек целият ред), го разделяме на две части определени със символа "=".
Лявата част от съобщението се запазва в променливата szKey, а дясната в szValue.
Съответно, ако редът във файла е написан така: NASTROIKA = STOINOST, променливата szKey ще получи текста NASTROIKA, а szValue ще получи текста STOINOST.

Винаги когато не си сигурен за какво служи дадена функция и/или как се ползва, консултирай се с API-то: strtok

Код за потвърждение: Избери целия код

trim(szKey)
trim(szValue)
Тази функция премахва излишните интервали/спейсове в началото и края на текста. Ползваме това тъй като "NASTROIKA = STOINOST" - между настройката и символа "=", както и между символа "=" и стойността, има интервали, които ще направят проблем по-долу в кода ако не ги премахнем с функцията trim. Същото се отнася и ако в конфигурационния файл бъдат сложени повече интервали отколкото е нужно в края на реда (понякога текстовите редактори правят това автоматично).

Код за потвърждение: Избери целия код

if(!szValue[0])
	continue
Тази част от кода прави така, че ако стойността (текстът запазен в променливата szValue) е празна, ще игнорира реда (continue се ползва за кодът да продължи в следния цикъл).

Код за потвърждение: Избери целия код

if(equal(szKey, "NQKAKVA_NASTROIKA")
	copy(g_eSettings[NQKAKVA_NASTROIKA], charsmax(g_eSettings[NQKAKVA_NASTROIKA]), szValue)
Тук вече проверяваме стойностите 1 по 1. Ако szKey е равно на дадена настройка, запазваме стойността на тази настройка в глобалната променлива g_eSettings[IMETO_NA_NASTROIKATA].

В случая ползваме copy тъй като искаме да сложим същата стойност като текст. Ако настройката държи число вместо текст, можеш да превърнеш текста в число по този начин:

Код за потвърждение: Избери целия код

if(equal(szKey, "NQKAKVA_NASTROIKA"))
	g_eSettings[NQKAKVA_NASTROIKA] = str_to_num(szValue)
Името на променливата няма нужда да е същото като това което ще се ползва във файла, обаче по-лесно е когато се ползват същите имена.

Аватар
User12
Извън линия
Потребител
Потребител
Мнения: 321
Регистриран на: 25 Яну 2018, 22:39
Местоположение: Сливен
Се отблагодари: 40 пъти
Получена благодарност: 17 пъти
Обратна връзка:

Как да направя плъгин да взима информация от .ini файл

Мнение от User12 » 12 Ное 2018, 00:38

До тук го направих така ама мисля ,че пропускам редове в кода , искам да разбера кое ще ми трябва и кое не целта ми е от ини файла да чете цифри .

Код за потвърждение: Избери целия код

ReadFile(bReload = false)
{
	new iFilePointer = fopen(g_szFileName, "rt")
	
	if(iFilePointer)
	{
		new szData[128], szValue[96], szKey[32], szNum[5], szLeft[5], szRight[5]
		
		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)
			
			switch(szData[0])
			{
				case EOS, ';', '[': continue
				default:
				{
					strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
					trim(szKey); trim(szValue)
					
					if(!szValue[0])
						continue

					if(equal(szKey, "AdminWeapon"))
					{
						copy(g_eExtras[AdminWeapon], charsmax(g_eExtras[AdminWeapon]), szValue)
					}
					else if(equal(szKey, "AdminWeapon1"))
					{
						copy(g_eExtras[AdminWeapon1], charsmax(g_eExtras[AdminWeapon1]), szValue)
					}
					else if(equal(szKey, "AdminWeapon2"))
					{
						copy(g_eExtras[AdminWeapon2], charsmax(g_eExtras[AdminWeapon2]), szValue)
					}
				}
			}
		}
		
		fclose(iFilePointer)
	}
}
Каналът ми в YouTube : Георги Пламенов

Изображение

Аватар
JackEyedJones
Извън линия
Потребител
Потребител
Мнения: 399
Регистриран на: 10 Сеп 2018, 17:26
Местоположение: Plovdiv, Bulgaria, Europe, Entire World
Се отблагодари: 4 пъти
Получена благодарност: 69 пъти
Обратна връзка:

Как да направя плъгин да взима информация от .ini файл

Мнение от JackEyedJones » 12 Ное 2018, 08:48

Преди време си бях направил един шаблонен файл за четене от .ini вслучай, че забравя последователностите.
OpenFile.sma
(1.68 KiB) Свалено 164 пъти
OpenFile.sma
(1.68 KiB) Свалено 164 пъти
Вътре е даден пример когато се чете числова стойност, текстова стойност и пример за регистрация на команди от файл.

Ако закръгляш стойността с десетична точка . се използва str_to_float(szValue), съответно ако е цяло число/цифра str_to_num(szValue)
Накратко, szKey ти е отляво на равенството (=) в strtok, а szValue ти е отдясно. Не е нужно създаване на допълнителни string-ове за лява и дясна част. szData[160] ти съхранява цялата информация във файла - от първия до последния ред.

Нататък е както е написал Ocixa.

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Помощ в скриптирането”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 7 госта