[FilterScript] OnPlayerInfoChange
#1

vw_inspection v1.1


Не претендую ни на что. Возможно многим покажется - это баян.

OnPlayerInfoChange

Описание:
Этот колбэк вызывается, когда игрок вызывает какой либо колбэк. Вызывается каждый раз когда вызывается любой из пабликов в параметрах которого есть playerid.
Параметры:
(playerid, callback)
playerid ID игрока, который вызывает колбэк.
callback ID колбэка, который вызвал или использует данный игрок.
Для получения названия колбэка используйте ф-ию GetNameCallback(callback)
Пример использования:
Code:
#define	MAX_CALLBACK	57
new counter[MAX_CALLBACK];//счётчик входов в данную ф-ию
Code:
stock GetNameCallback(callback)
{
	new Message[32];
	switch(callback)
	{
		case	5: Message = 	"PlayerConnect";
		case	6: Message = 	"PlayerDisconnect";
		case	7: Message = 	"PlayerSpawn";
		case	8: Message = 	"PlayerDeath";
		case	9: Message = 	"VehicleSpawn";
		case	10: Message = 	"VehicleDeath";
		case	11: Message = 	"PlayerTxt";
		case	12: Message = 	"PlayerCommandText";
		case	13: Message = 	"PlayerRequestClass";
		case	14: Message = 	"PlayerEnterVehicle";
		case	15: Message = 	"PlayerExitVehicle";
		case	16: Message = 	"PlayerStateChange";
		case	17: Message = 	"PlayerEnterCheckpoint";
		case	18: Message = 	"PlayerLeaveCheckpoint";
		case	19: Message = 	"PlayerEnterRaceCheckpoint";
		case	20: Message = 	"PlayerLeaveRaceCheckpoint";
		case	21: Message = 	"RconCommand";
		case	22: Message = 	"PlayerRequestSpawn";
		case	23: Message = 	"ObjectMoved";
		case	24: Message = 	"PlayerObjectMoved";
		case	25: Message = 	"PlayerPickUpPickup";
		case	26: Message = 	"VehicleMod";
		case	27: Message = 	"EnterExitModShop";
		case	28: Message = 	"VehiclePaintjob";
		case	29: Message = 	"VehicleRespray";
		case	30: Message = 	"VehicleDamageStatusUpdate";
		case	31: Message = 	"UnoccupiedVehicleUpdate";
		case	32: Message = 	"PlayerSelectedMenuRow";
		case	33: Message = 	"PlayerExitedMenu";
		case	34: Message = 	"PlayerInteriorChange";
		case	35: Message = 	"PlayerKeyStateChange";
		case	36: Message = 	"RconLoginAttempt";
		case	37: Message = 	"PlayerUpdate";
		case	38: Message = 	"PlayerStreamIn";
		case	39: Message = 	"PlayerStreamOut";
		case	40: Message = 	"VehicleStreamIn";
		case	41: Message = 	"VehicleStreamOut";
		case	42: Message = 	"ActorStreamIn";
		case	43: Message = 	"ActorStreamOut";
		case	44: Message = 	"DialogResponse";
		case	45: Message = 	"PlayerTakeDamage";
		case	46: Message = 	"PlayerGiveDamage";
		case	47: Message = 	"PlayerGiveDamageActor";
		case	48: Message = 	"PlayerClickMap";
		case	49: Message = 	"PlayerClickTextDraw";
		case	50: Message = 	"PlayerClickPlayerTextDraw";
		case	51: Message = 	"IncomingConnection";
		case	52: Message = 	"TrailerUpdate";
		case	53: Message = 	"VehicleSirenStateChange";
		case	54: Message = 	"PlayerClickPlayer";
		case	55: Message = 	"PlayerEditObject";
		case	56: Message = 	"PlayerEditAttachedObject";
		case	57: Message = 	"PlayerWeaponShot";
		case	58: Message = 	"PlayerSelectObject";
		default: 	Message = 	"Unknown";
	}
	return Message;
}
Code:
//Вызывается каждый раз когда вызывается любой из пабликов, который меняет массив PlayerInfo
forward OnPlayerInfoChange(playerid, callback);
public OnPlayerInfoChange(playerid, callback)
//Данная процедура обрабатывается при изменении информации о игроке.
{
	counter[callback]++;

	if(	callback == UnoccupiedVehicleUpdate || //callback == PlayerKeyStateChange || callback == TrailerUpdate ||
		callback == PlayerStreamIn || callback == PlayerStreamOut ||
		callback == VehicleStreamIn || callback == VehicleStreamOut)
	{
		return 1;
	}

	//ИНФОРМИРОВАНИЕ
	new str[137+32+3+32+2+6];
	format(str, sizeof(str),
		"Information about player {0080FF}%s{FFFFFF}[%d] has changed. Callback: {0080FF}%s{FFFFFF}[%d] call: {00FF00}%d",
		PlayerName(playerid), playerid, GetNameCallback(callback), callback, counter[callback]);
	SendClientMessage(playerid, -1, str);
	//print(str);
	return 1;
}
Примечания

Quote:
Основное назначение: для вывода данных по игроку тогда, когда они меняются. Для сохранения данных игрока тогда когда они меняются, а не постоянно каждую милисекунду или интервал заданный таймером.
Данные на экране по переменным игрока будут меняться не каждую секунду, а только тогда когда игрок что то сделает.

Дополнительное назначение: Скрипт для замены таймеров и OnPlayerUpdate, т.к. они постоянно с заданным интервалом запускаются. Данный же колбэк запускается только тогда, когда игрок меняет своё состояние, меняет интерьер, садиться или выходит из тачки, т.е. если просто перемещается - данный колбэк вызываться не будет. За счёт этого нагрузка на сервер будет минимальна.

Также можно видеть каким игроком, когда, в какой последовательности и сколько раз вызывается какой либо колбэк.

Скачать:
Исходный код: vw_inspect.pwn

Если подскажите как его сделать ввиде инклюда и при этом не использовать CallRemoteFunction буду очень признателен, чтобы можно было использовать данный колбэк как в моде так и в скриптах.
Reply
#2

Почему почти во всех пабликах стоит "return 0;" на конце? Такие паблики, как OnPlayerWeaponShot, OnVehicleMod, OnPlayerText, OnTrailerUpdate, OnUnoccupiedVehicleUpdate, OnPlayerRequestClass просто не применят действие игрока при возврате в них нуля, и привет рассинхронизация. Я думаю, проблема с хуками у тебя скорее всего тоже именно из-за этого.

Возвращать 0 по умолчанию нужно только в OnPlayerCommandText и OnDialogResponse (и то для второго, кажется, опционально)
Reply
#3

Если поставить return 1; то перестанет выполнятся код в других загруженных скриптах в этих пабликах.
Reply
#4

Quote:
Originally Posted by DANGER1979
View Post
Если поставить return 1; то перестанет выполнятся код в других загруженных скриптах в этих пабликах.
А ты это проверил? В скольких include не стоит только 1, а никто не жаловался. Если это и действительно так, то только для каких-то отдельных пабликов, например OnPlayerCommandText
Reply
#5

Quote:
Originally Posted by OstGot
View Post
А ты это проверил?
да я это проверял, юзаю его постоянно сейчас. СНачало я сделал всем пабликам return 1; В итоге даже заспаунится я не мог.
Кучу пабликов не выполнялось в другом ФС.
Затем я поставил всем пабликам 0; (за исключением пару пабликов, где надо 1 оставить.) и всё стало работать как надо.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)