Как да добавя необходим флаг за действие на плъгин.

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

Как да добавя необходим флаг за действие на плъгин.

Мнение от iv69 » 02 Май 2020, 19:15

Не знам дали е точно написано заглавието, но искам да знам как да си променя някои от плъгините ми така, че да се ползват само от играчи с определен флаг?
Например: какво точно трябва да добавя или променя и къде точно(в кода по-долу) така, че ако един играч няма примерно Access flag "b", да не получава и посочените по-нататък флагове от самия плъгин?

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

#include <amxmodx>
#include <cromchat>
#include <csstats>

const IGNORE_FLAG = ADMIN_LEVEL_A
const Float:DELAY_ON_CONNECT = 0.3
const Float:DELAY_ON_MESSAGE = 5.0

enum _:Flags
{
	Rank,
	Flag[2]
}

new const g_eFlags[][Flags] =
{
	{ 100, "r" },
	{ 30,  "s" },
	{ 10,  "t" }
}

new g_iFlag[33]

public plugin_init()
{
	register_plugin("Top Awards", "1.0", "OciXCrom")
	register_dictionary("topawards.txt")
	CC_SetPrefix("&x04[Top Awards]")
}

public client_putinserver(id)
{
	g_iFlag[id] = 0
	set_task(DELAY_ON_CONNECT, "check_flags", id)
}

public check_flags(id)
{
	if(!is_user_connected(id) || get_user_flags(id) & IGNORE_FLAG)
		return

	new iStats[8], iHits[8]
	get_user_stats(id, iStats, iHits)

	new iRank = iStats[7]

	for(new i; i < sizeof(g_eFlags); i++)
	{
		if(iRank <= g_eFlags[i][Rank])
		{
			g_iFlag[id] = i
			set_user_flags(id, read_flags(g_eFlags[i][Flag]))
			set_task(DELAY_ON_MESSAGE, "send_message", id)
			break
		}
	}
}

public send_message(id)
{
	if(!is_user_connected(id))
		return

	CC_SendMessage(id, "%L", id, "TOPAWARD_GET", g_eFlags[g_iFlag[id]][Flag], g_eFlags[g_iFlag[id]][Rank])
}

Аватар
thurinven
Извън линия
Потребител
Потребител
Мнения: 31
Регистриран на: 16 Окт 2019, 10:46
Се отблагодари: 4 пъти
Получена благодарност: 5 пъти

Как да добавя необходим флаг за действие на плъгин.

Мнение от thurinven » 02 Май 2020, 19:27

Проверката дали потребител има даден флаг по негово id се прави като... провериш дали във флаговете му се съдържа избрания флаг (с "побитово И" - &):

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

// пример с флаг "b"
#define TARGET_FLAG ADMIN_RESERVATION

if (get_user_flags(id) & TARGET_FLAG)
{

}
Този плъгин в момента проверява дали играчът има ADMIN_LEVEL_A, което е флаг "m"
Проверката е написана първа в check_flags:

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

if(!is_user_connected(id) || get_user_flags(id) & IGNORE_FLAG)
	return
А IGNORE_FLAG е дефиниран в началото

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

const IGNORE_FLAG = ADMIN_LEVEL_A
Флаг "b" е ADMIN_RESERVATION
Ако искаш да промениш флагът от ADMIN_LEVEL_A на флаг "b" го променяш така:

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

const IGNORE_FLAG = ADMIN_RESERVATION

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

Как да добавя необходим флаг за действие на плъгин.

Мнение от iv69 » 02 Май 2020, 19:35

Ясно , но да попитам пак: това, не е ли нещо което действа в "обратна посока" т.е. плъгина прави проверката, както ми обясни, след това, ако играча има посочения флаг, т.е. е с ADMIN_LEVEL_A - плъгина "не му действа" ? Не разбирам и затова просто питам? На мен ми трябва : ако играча няма определения флаг: в моя случай ADMIN_RESERVATION - да не може да получава и останалите, а ако има - да ги ползва и останалите?

т.е. - притежанието на ADMIN_RESERVATION - да е необходимо условие за получаване на останалото... ? Досега всички получваха посочените флагове, при влизане в "топа" . А моята цел е : да получват само ония - кото преди това са били с ADMIN_RESERVATION?
Съжалявам ако се изказвам объркано, но никога не съм се занимавал с "правене" на плъгини!
Последно промяна от iv69 на 02 Май 2020, 19:40, променено общо 1 път.

Аватар
thurinven
Извън линия
Потребител
Потребител
Мнения: 31
Регистриран на: 16 Окт 2019, 10:46
Се отблагодари: 4 пъти
Получена благодарност: 5 пъти

Как да добавя необходим флаг за действие на плъгин.

Мнение от thurinven » 02 Май 2020, 19:39

За всеки играч се изпълнява функцията check_flags. Тя дава флагове при някакви условия.

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

if(!is_user_connected(id) || get_user_flags(id) & IGNORE_FLAG)
	return
Тази проверка означава:
ако играчът не е свързан ИЛИ във флаговете му има IGNORE_FLAG - прекъсни изпълнението на функцията.

Тоест, ако едно от двете неща е вярно, се извиква return, което прекратява изпълнението и следователно кодът надолу не се изпълнява. По този начин той не получава флагове.

Ако искаш задължително потребителят да има флаг "b" трябва да имаш допълнителна проверка:

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

new user_flags = get_user_flags(id)
if(!is_user_connected(id) || user_flags & IGNORE_FLAG  || ~user_flags & ADMIN_RESERVATION)
	return
~get_user_flags(id) & ADMIN_RESERVATION означава ако няма флаг "b"
Последно промяна от thurinven на 02 Май 2020, 19:47, променено общо 2 пъти.

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

Как да добавя необходим флаг за действие на плъгин.

Мнение от iv69 » 02 Май 2020, 19:41

Мда, това го разбрах ясно. А сега на моя голям проблем: ...

А това ли е единственото нещо което е необходимо да се добави към плъгина? Това е единия въпрос, а втория -има ли значение къде точно?

И последно: как би изглеждал плъгина накрая - с проверка за необходимия флаг ADMIN_RESERVATION, и без проверка за игнорирането на ADMIN_IMMUNITY? т.е - с ЕДНА чиста проверка само за ADMIN_RESERVATION ? Имам още 4 плъгина - които сам после ще се опитам да "поправя".
Благодаря?
Последно промяна от iv69 на 02 Май 2020, 19:53, променено общо 2 пъти.

Аватар
thurinven
Извън линия
Потребител
Потребител
Мнения: 31
Регистриран на: 16 Окт 2019, 10:46
Се отблагодари: 4 пъти
Получена благодарност: 5 пъти

Как да добавя необходим флаг за действие на плъгин.

Мнение от thurinven » 02 Май 2020, 19:50

Не съм го тествал, но мисля, че това е достатъчно.
Има значение да го сложиш преди да се изпълни логиката в check_flags. Дали в същия if, който е в началото, или в отделен точно след него - е въпрос на предпочитание.

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

Как да добавя необходим флаг за действие на плъгин.

Мнение от iv69 » 02 Май 2020, 20:22

Ето така ли ще изглежда:

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

#include <amxmodx>
#include <cromchat>
#include <csstats>

const Float:DELAY_ON_CONNECT = 0.3
const Float:DELAY_ON_MESSAGE = 5.0

enum _:Flags
{
	Rank,
	Flag[2]
}

new const g_eFlags[][Flags] =
{
	{ 100, "r" },
	{ 30,  "s" },
	{ 10,  "t" }
}

new g_iFlag[33]

public plugin_init()
{
	register_plugin("Top Awards", "1.0", "OciXCrom")
	register_dictionary("topawards.txt")
	CC_SetPrefix("&x04[Top Awards]")
}

public client_putinserver(id)
{
	g_iFlag[id] = 0
	set_task(DELAY_ON_CONNECT, "check_flags", id)
}

public check_flags(id)
{
    new user_flags = get_user_flags(id)
    if(!is_user_connected(id) || ~user_flags & ADMIN_RESERVATION)
	        return

	new iStats[8], iHits[8]
	get_user_stats(id, iStats, iHits)

	new iRank = iStats[7]

	for(new i; i < sizeof(g_eFlags); i++)
	{
		if(iRank <= g_eFlags[i][Rank])
		{
			g_iFlag[id] = i
			set_user_flags(id, read_flags(g_eFlags[i][Flag]))
			set_task(DELAY_ON_MESSAGE, "send_message", id)
			break
		}
	}
}

public send_message(id)
{
	if(!is_user_connected(id))
		return

	CC_SendMessage(id, "%L", id, "TOPAWARD_GET", g_eFlags[g_iFlag[id]][Flag], g_eFlags[g_iFlag[id]][Rank])
}
Добавено преди 21 минути 35 секунди:
Плъгина така променен ми се компилира с един warning:
// C:\Users\pc\Desktop\ALL\AMXX\AMXX\scripting\rank_top.sma(42) : warning 217: loose indentation,
но иначе работи и прави онова за което писах в началото.

Аватар
thurinven
Извън линия
Потребител
Потребител
Мнения: 31
Регистриран на: 16 Окт 2019, 10:46
Се отблагодари: 4 пъти
Получена благодарност: 5 пъти

Как да добавя необходим флаг за действие на плъгин.

Мнение от thurinven » 02 Май 2020, 20:23

За флаг "b" e OK, само че си премахнал проверката за флаг "m". Досега им беше забранено да получават флагове - сега ще е позволено на всеки, който има "b".

Warning-ът значи, че не си индентирал реда правилно. ОК е.

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

Как да добавя необходим флаг за действие на плъгин.

Мнение от iv69 » 02 Май 2020, 21:14

Благодаря. Можем да заключваме?

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

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

Кой е на линия

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