Преработване на събплъгин към OciXCrom's Rank System [XP|Levels..]

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
iv69
Извън линия
Потребител
Потребител
Мнения: 744
Регистриран на: 17 Мар 2018, 15:34
Се отблагодари: 214 пъти
Получена благодарност: 39 пъти

Преработване на събплъгин към OciXCrom's Rank System [XP|Levels..]

Мнение от iv69 » 16 Ное 2019, 20:16

Забелязах един дребен но неприятен "бъг" или може би пропуск, в един събплъгин към ранк-системата! Ползвам OciXCrom's Rank System [XP|Levels..] заедно с " CRXRanks: Flags Per Level ", и най-вече един набързо правен от OciXCrom' плъгин за "reset"- ване на цялата ранксистема (LVL и XP) , което евентуално заедно с LVL и XP би трябвало да "reset"- ва и Flags ?
Та, проблема е явно в кода за "reset"- ване на LVL и XP (който посочвам тук накрая). Плъгина наистина "reset"- ва LVL и XP, но последния придобит Flag си остава(проверено) за играча, въпреки че играча започва отначало цялата ранксистема . Може ли да се допълни и тази функция, т.е. да нулира, или да маха всички придобивани флагове от ранксистемата при започване отначалото ?
Благодаря.

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

#include <amxmodx>
#include <crxranks>

#define RESET_DELAY 1.0

new g_iMaxLevels

public plugin_init()
{
	register_plugin("CRXRanks: Reset on Last Level", "1.0", "OciXCrom")
	g_iMaxLevels = crxranks_get_max_levels()
}
	
public crxranks_user_level_updated(id, iLevel)
{
	if(iLevel == g_iMaxLevels)
		set_task(RESET_DELAY, "reset_user_xp", id)
}

public reset_user_xp(id)
	crxranks_give_user_xp(id, crxranks_get_user_xp(id) * -1)
p.s. За събплъгина CRXRanks: Flags Per Level ползвам този квар crxranks_fpl_strict "1" (което ще рече, че всеки нов следващ придобит флаг се добавя към стария) ако е от значение.
.... и след това допълнение, се замислих дали пък преработката не би трябвало да се отнася пряко към събплъгина CRXRanks: Flags Per Level - и ако е "да" ето и неговия код( съжалявам ако така пуснатата заявка я усложнявам, но пък аз не разбирам чак толкова много от тия неща... - за което се извинявам)

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

#include <amxmodx>
#include <amxmisc>
#include <crxranks>

#define PLUGIN_VERSION "1.1"

new Trie:g_tFlags, g_pStrict

public plugin_init()
{
	register_plugin("CRXRanks: Flags Per Level", PLUGIN_VERSION, "OciXCrom")
	register_cvar("CRXRanksFPL", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
	g_pStrict = register_cvar("crxransk_fpl_strict", "0")
	g_tFlags = TrieCreate()
	ReadFile()
}

public plugin_end()
	TrieDestroy(g_tFlags)
	
ReadFile()
{
	new szConfigsName[256], szFilename[256]
	get_configsdir(szConfigsName, charsmax(szConfigsName))
	formatex(szFilename, charsmax(szFilename), "%s/RankSystemFlags.ini", szConfigsName)
	
	new iFilePointer = fopen(szFilename, "rt")
	
	if(iFilePointer)
	{
		new szData[64], szValue[32], szMap[32], szKey[32], bool:bRead = true, iSize
		get_mapname(szMap, charsmax(szMap))
		
		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)
			
			switch(szData[0])
			{
				case EOS, '#', ';': continue
				case '-':
				{
					iSize = strlen(szData)
					
					if(szData[iSize - 1] == '-')
					{
						szData[0] = ' '
						szData[iSize - 1] = ' '
						trim(szData)
						
						if(contain(szData, "*") != -1)
						{
							strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '*')
							copy(szValue, strlen(szKey), szMap)
							bRead = equal(szValue, szKey) ? true : false
						}
						else
						{
							static const szAll[] = "#all"
							bRead = equal(szData, szAll) || equali(szData, szMap)
						}
					}
					else continue
				}
				default:
				{
					if(!bRead)
						continue
						
					strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
					trim(szKey); trim(szValue)
							
					if(!szValue[0])
						continue
						
					TrieSetCell(g_tFlags, szKey, read_flags(szValue))
				}
			}
		}
		
		fclose(iFilePointer)
	}
}

public client_putinserver(id)
	crxranks_user_level_updated(id, crxranks_get_user_level(id), true)

public crxranks_user_level_updated(id, iLevel, bool:bLevelUp)
{
	if(!bLevelUp)
		return

	new szLevel[8], iLevelFlags, iUserFlags = get_user_flags(id)

	if(get_pcvar_num(g_pStrict))
	{
		num_to_str(iLevel, szLevel, charsmax(szLevel))

		if(TrieGetCell(g_tFlags, szLevel, iLevelFlags))
		{
			if((iUserFlags & iLevelFlags) != iLevelFlags)
				set_user_flags(id, iLevelFlags)
		}

		return
	}

	for(new i; i <= iLevel; i++)
	{
		num_to_str(i, szLevel, charsmax(szLevel))
		
		if(TrieGetCell(g_tFlags, szLevel, iLevelFlags))
		{
			if((iUserFlags & iLevelFlags) != iLevelFlags)
				set_user_flags(id, iLevelFlags)
		}
	}
}

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

Преработване на събплъгин към OciXCrom's Rank System [XP|Levels..]

Мнение от OciXCrom » 16 Ное 2019, 23:31

За премахване на флаговете при рестарт, най-лесно е да използваш командата amx_reloadadmins.

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

public reset_user_xp(id)
{
	crxranks_give_user_xp(id, crxranks_get_user_xp(id) * -1)
	server_cmd("amx_reloadadmins")
}
Относно настройката "strict" - грешно си разбрал начина ѝ на работа.

Ако е сложена на "0", плъгинът ще провери всички предишни нива и ще добави всички флагове в случай, че липсват. Демек ако си ниво 15, ще провери всички нива от 0 до 15 и ще добави флаговете от тях които нямаш.

Ако е сложена на "1", плъгинът ще добави само флаговете за нивото което си достигнал. Демек ако си ниво 15, ще провери флаговете само за ниво 15, а не за всички нива преди него.

Аватар
iv69
Извън линия
Потребител
Потребител
Мнения: 744
Регистриран на: 17 Мар 2018, 15:34
Се отблагодари: 214 пъти
Получена благодарност: 39 пъти

Преработване на събплъгин към OciXCrom's Rank System [XP|Levels..]

Мнение от iv69 » 17 Ное 2019, 10:36

Кроме, много благодаря за обяснението. Добавих server_cmd("amx_reloadadmins") и стана.
Но за второто, не искам да споря с теб защото не съм на твоите знания и опит, но: И аз си мислех, че е точно както ти ми го обясни сега и тук, но е обратното(проверено), може би си разменил някъде нещо неволно? Не знам, но точно по този въпрос вече един път писах в самата тема за събплъгина , но там не получих отговор ( помислих, че съм написал нещо по-неправилен начин или излишно, или пък обидно)... между другото сега и сам забелязах, че съм бил доста въодушевен и бая глупости съм надраскал в нея :( , но там накрая, все пак съм забелязал това несъответсвие, но явно не си видял или обърнал сериозно внимание. По-късно установих, че просто нещо или е обърнато обратно, или е пропуснато, не знам, но оттогава си ползвам командата "наопаки" и работи ?
Ето тук: https://www.amxx-bg.info/forum/viewtopic.php? ... 3&start=10 .

p.s. Фактически в началото ми бе необходимо, всеки следващ даден флаг на играч при достигане на опредлено ниво - да остава единствен, за да не си преплитат или да си пречат екстрите(ако имат общи неща) с тези в придобития нов флаг, но просто промених нещата: всеки флаг си прави нещо ново и различно от предишния и сега просто си ги "наслагвам" докато накрая не се рестартират всички - с рестартиране на самата ранксистема!

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

Преработване на събплъгин към OciXCrom's Rank System [XP|Levels..]

Мнение от OciXCrom » 17 Ное 2019, 14:57

Явно съм го прочел от телефона и съм го подминал.

Сега проверих проверката. Няма грешка, както съм описал си работи. Ако имаш предвид да се премахват предишните спечелени флагове, няма такава опция в плъгина, независимо дали настройката е 0 или 1. За тази цел отново можеш да ползваш amx_reloadadmins.

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

public crxranks_user_level_updated(id, iLevel, bool:bLevelUp)
{
	if(!bLevelUp)
		return

	server_cmd("amx_reloadadmins")
И настройката трябва да ти е сложена на "1" в този случай. Ако е на "0", отново ще получиш предишните флагове въпреки reload-а.

Аватар
iv69
Извън линия
Потребител
Потребител
Мнения: 744
Регистриран на: 17 Мар 2018, 15:34
Се отблагодари: 214 пъти
Получена благодарност: 39 пъти

Преработване на събплъгин към OciXCrom's Rank System [XP|Levels..]

Мнение от iv69 » 17 Ное 2019, 16:39

Ъхъ ясно, благодаря, веднага ще опитам точно както ми обясни! Благодаря !!!

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

Преработване на събплъгин към OciXCrom's Rank System [XP|Levels..]

Мнение от OciXCrom » 18 Ное 2019, 14:51

Всъщност това което написах в последното мнение е пълна глупост, понеже ще рестартира флаговете на всички когато един играч достигне ново ниво.

Опитай така:

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

#include <amxmodx>
#include <amxmisc>
#include <crxranks>

#define PLUGIN_VERSION "1.2-beta1"

new Trie:g_tFlags, g_pStrict, g_pAppend
new g_iAddedFlags[33]

public plugin_init()
{
	register_plugin("CRXRanks: Flags Per Level", PLUGIN_VERSION, "OciXCrom")
	register_cvar("CRXRanksFPL", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
	g_pStrict = register_cvar("crxransk_fpl_strict", "0")
	g_pAppend = register_cvar("crxranks_fps_append", "0")
	g_tFlags = TrieCreate()
	ReadFile()
}

public plugin_end()
{
	TrieDestroy(g_tFlags)
}

ReadFile()
{
	new szConfigsName[256], szFilename[256]
	get_configsdir(szConfigsName, charsmax(szConfigsName))
	formatex(szFilename, charsmax(szFilename), "%s/RankSystemFlags.ini", szConfigsName)

	new iFilePointer = fopen(szFilename, "rt")

	if(iFilePointer)
	{
		new szData[64], szValue[32], szMap[32], szKey[32], bool:bRead = true, iSize
		get_mapname(szMap, charsmax(szMap))

		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)

			switch(szData[0])
			{
				case EOS, '#', ';': continue
				case '-':
				{
					iSize = strlen(szData)

					if(szData[iSize - 1] == '-')
					{
						szData[0] = ' '
						szData[iSize - 1] = ' '
						trim(szData)

						if(contain(szData, "*") != -1)
						{
							strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '*')
							copy(szValue, strlen(szKey), szMap)
							bRead = equal(szValue, szKey) ? true : false
						}
						else
						{
							static const szAll[] = "#all"
							bRead = equal(szData, szAll) || equali(szData, szMap)
						}
					}
					else continue
				}
				default:
				{
					if(!bRead)
					{
						continue
					}

					strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
					trim(szKey); trim(szValue)

					if(!szValue[0])
					{
						continue
					}

					TrieSetCell(g_tFlags, szKey, read_flags(szValue))
				}
			}
		}

		fclose(iFilePointer)
	}
}

public client_putinserver(id)
{
	g_iAddedFlags[id] = ADMIN_ALL
	crxranks_user_level_updated(id, crxranks_get_user_level(id), true)
}

public crxranks_user_level_updated(id, iLevel, bool:bLevelUp)
{
	if(!bLevelUp)
	{
		return
	}

	if(!get_pcvar_num(g_pAppend) && g_iAddedFlags[id] != ADMIN_ALL)
	{
		remove_user_flags(id, g_iAddedFlags[id])
		g_iAddedFlags[id] = ADMIN_ALL
	}

	new szLevel[8], iLevelFlags, iUserFlags = get_user_flags(id)

	if(get_pcvar_num(g_pStrict))
	{
		num_to_str(iLevel, szLevel, charsmax(szLevel))

		if(TrieGetCell(g_tFlags, szLevel, iLevelFlags))
		{
			if((iUserFlags & iLevelFlags) != iLevelFlags)
			{
				add_user_flags(id, iLevelFlags)
			}
		}

		return
	}

	for(new i; i <= iLevel; i++)
	{
		num_to_str(i, szLevel, charsmax(szLevel))

		if(TrieGetCell(g_tFlags, szLevel, iLevelFlags))
		{
			if((iUserFlags & iLevelFlags) != iLevelFlags)
			{
				add_user_flags(id, iLevelFlags)
			}
		}
	}
}

add_user_flags(id, iFlags)
{
	set_user_flags(id, iFlags)
	g_iAddedFlags[id] |= iFlags
}
Добавил съм квар crxranks_fpl_append - ако е на "0", ще премахва предишните флагове.
Ако работи, ще обновя и плъгина в главната тема.

Аватар
iv69
Извън линия
Потребител
Потребител
Мнения: 744
Регистриран на: 17 Мар 2018, 15:34
Се отблагодари: 214 пъти
Получена благодарност: 39 пъти

Преработване на събплъгин към OciXCrom's Rank System [XP|Levels..]

Мнение от iv69 » 18 Ное 2019, 17:16

Благодаря. Ще тествам :)

Аватар
iv69
Извън линия
Потребител
Потребител
Мнения: 744
Регистриран на: 17 Мар 2018, 15:34
Се отблагодари: 214 пъти
Получена благодарност: 39 пъти

Преработване на събплъгин към OciXCrom's Rank System [XP|Levels..]

Мнение от iv69 » 19 Ное 2019, 13:18

Значи , последно до къде стигнах:
1. По първия плъгин (с който си "reset"- вах LVL и XP) - след като добавих кода за "amx_reloadadmins" , нещата тръгнаха: Сега всеки играч , който мине през последното ниво - не само, че се връща на първото, но и започва само с (или без ако не са посочени никакви) флаговете отредени за първото ниво. Това стана супер, и точно за това бях и пуснал темата !
2. По втория плъгин: Кроме, на мен лично въпреки, че вече не ми трябва функцията за отмяна на дадения от предишното ниво "флаг" - при достигане на ниво което дава нов следващ флаг - се опитах да тествам допълнението, но при мене дори при всички възможни комбинации на двата квара към плъгина - винаги си се натрупваха флаговете, а не оставаше само флага от последното ниво което дава такъв?! Пак казвам , сега плъгините ми с вип-екстри си правя така, че всеки следващ флаг да има нова и различна функция- и да не пречи с нищо( или да се преплитат като екстри) на предишния... Съжалявам за многословието, но искам да знаеш , че всичко което направи в темата за мен е напълно и предостатъчно. Но за самия втори плъгин: не знам защо, но работи точно както го описах .
Отново благодаря, и се извинявам за безпокойствието.

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

Обратно към “Заявки за плъгини”

Кой е на линия

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