SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian > Релизы/Releases

Reply
 
Thread Tools Display Modes
Old 27/01/2017, 10:49 AM   #1
DANGER1979
Gangsta
 
DANGER1979's Avatar
 
Join Date: Sep 2009
Location: Belarus
Posts: 793
Reputation: 21
Default OnPlayerInfoChange

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 буду очень признателен, чтобы можно было использовать данный колбэк как в моде так и в скриптах.
Attached Images
File Type: jpg sa-mp-015.JPG (293.3 KB, 105 views)
__________________
Virtual World Developer

Last edited by DANGER1979; 27/01/2017 at 05:16 PM.
DANGER1979 is offline   Reply With Quote
Old 27/01/2017, 12:54 PM   #2
OstGot
Gangsta
 
OstGot's Avatar
 
Join Date: Mar 2013
Location: Gomel, Belarus
Posts: 817
Reputation: 322
Default Re: OnPlayerInfoChange

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

Возвращать 0 по умолчанию нужно только в OnPlayerCommandText и OnDialogResponse (и то для второго, кажется, опционально)
__________________
aka Nexius
Don't want to always check for updates of my scripts?
Include it the last, after all others
Nexius's Update Checker
OstGot is offline   Reply With Quote
Old 27/01/2017, 04:32 PM   #3
DANGER1979
Gangsta
 
DANGER1979's Avatar
 
Join Date: Sep 2009
Location: Belarus
Posts: 793
Reputation: 21
Default Re: OnPlayerInfoChange

Если поставить return 1; то перестанет выполнятся код в других загруженных скриптах в этих пабликах.
__________________
Virtual World Developer
DANGER1979 is offline   Reply With Quote
Old 27/01/2017, 04:46 PM   #4
OstGot
Gangsta
 
OstGot's Avatar
 
Join Date: Mar 2013
Location: Gomel, Belarus
Posts: 817
Reputation: 322
Default Re: OnPlayerInfoChange

Quote:
Originally Posted by DANGER1979 View Post
Если поставить return 1; то перестанет выполнятся код в других загруженных скриптах в этих пабликах.
А ты это проверил? В скольких include не стоит только 1, а никто не жаловался. Если это и действительно так, то только для каких-то отдельных пабликов, например OnPlayerCommandText
__________________
aka Nexius
Don't want to always check for updates of my scripts?
Include it the last, after all others
Nexius's Update Checker
OstGot is offline   Reply With Quote
Old 27/01/2017, 05:11 PM   #5
DANGER1979
Gangsta
 
DANGER1979's Avatar
 
Join Date: Sep 2009
Location: Belarus
Posts: 793
Reputation: 21
Default Re: OnPlayerInfoChange

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

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off



All times are GMT. The time now is 07:32 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.