Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Динамическая система пикапов входа/выхода

KoTT

Начинающий
Пользователь
Регистрация
23 Сен 2016
Сообщения
16
Лучшие ответы
0
Репутация
9
Здравствуйте, уважаемые пользователи.
Представляю вашему вниманию динамическую систему пикапов.

Итак, начнём.

В начало мода:
PHP:
#define MAX_ENTERS 100

enum EInfo
{
	pID,
	Float:pX,
	Float:pY,
	Float:pZ,
	Float:pEX,
	Float:pEY,
	Float:pEZ,
	pInt,
	pWorld,
	pEInt,
	pEWorld,
	pText[60],
	pFraction
};
new EnterInfo[MAX_ENTERS][EInfo];
new TOTALPICKUP;
В OnGameModeInit:
PHP:
mysql_function_query(connects,"SELECT * FROM `enters`",true,"LoadEnters","");
В конец мода:
PHP:
forward LoadEnters();
public LoadEnters()
{
	new rows,fields;
	cache_get_data(rows,fields);
	if(rows)
	{
	    for(new i = 1; i <= rows; i++)
	    {
	        EnterInfo[i][pID] = cache_get_field_content_int(i-1,"ID",connects);
	        EnterInfo[i][pX] = cache_get_field_content_float(i-1,"X",connects);
	        EnterInfo[i][pY] = cache_get_field_content_float(i-1,"Y",connects);
	        EnterInfo[i][pZ] = cache_get_field_content_float(i-1,"Z",connects);
	        EnterInfo[i][pEX] = cache_get_field_content_float(i-1,"EX",connects);
	        EnterInfo[i][pEY] = cache_get_field_content_float(i-1,"EY",connects);
	        EnterInfo[i][pEZ] = cache_get_field_content_float(i-1,"EZ",connects);
	        EnterInfo[i][pWorld] = cache_get_field_content_int(i-1,"World",connects);
	        EnterInfo[i][pInt] = cache_get_field_content_int(i-1,"Int",connects);
	        EnterInfo[i][pEWorld] = cache_get_field_content_int(i-1,"EWorld",connects);
	        EnterInfo[i][pEInt] = cache_get_field_content_int(i-1,"EInt",connects);
	        EnterInfo[i][pFraction] = cache_get_field_content_int(i-1,"Fraction",connects);
	        cache_get_field_content(i-1,"Text",EnterInfo[i][pText],connects,60);
	        CreateDynamicPickup(19132,23,EnterInfo[i][pX],EnterInfo[i][pY],EnterInfo[i][pZ],EnterInfo[i][pWorld],EnterInfo[i][pInt]);
	        CreateDynamicPickup(19132,23,EnterInfo[i][pEX],EnterInfo[i][pEY],EnterInfo[i][pEZ],EnterInfo[i][pEWorld],EnterInfo[i][pEInt]);

	        static const format_text[] = "{E7AF20}[{ffffff}%s{E7AF20}]\n{ffffff}Используйте: {E7AF20}ALT";
	        new text[sizeof(format_text)-2+60];
	        format(text,sizeof(text),format_text,EnterInfo[i][pText]);
	        CreateDynamic3DTextLabel(text,-1,EnterInfo[i][pX],EnterInfo[i][pY],EnterInfo[i][pZ],20.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1,EnterInfo[i][pWorld],EnterInfo[i][pInt],-1,100.0);

	        CreateDynamic3DTextLabel("{E7AF20}[{ffffff}Выход{E7AF20}]\n{ffffff}Используйте: {E7AF20}ALT",-1,EnterInfo[i][pEX],EnterInfo[i][pEY],EnterInfo[i][pEZ],20.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1,EnterInfo[i][pEWorld],EnterInfo[i][pEInt],-1,100.0);
	        TOTALPICKUP++;
	    }
	}
	return printf("[MySQL] Загружено пикапов: %d.",TOTALPICKUP);
}
forward UnFreeze(playerid);
public UnFreeze(playerid) return TogglePlayerControllable(playerid, 1);
В OnPlayerKeyStateChange:
PHP:
if(newkeys == KEY_WALK)
{
	for(new i = 1; i <= TOTALPICKUP; i++)
	{
		if(IsPlayerInRangeOfPoint(playerid,0.5,EnterInfo[i][pX],EnterInfo[i][pY],EnterInfo[i][pZ]) && GetPlayerVirtualWorld(playerid) == EnterInfo[i][pWorld])
		{
			if(EnterInfo[i][pFraction] != 0 && pData[playerid][pMember] != EnterInfo[i][pFraction]) return SendClientMessage(playerid,-1,"Вам недоступен данный пикап!");
			SetPlayerPos(playerid,EnterInfo[i][pEX],EnterInfo[i][pEY],EnterInfo[i][pEZ]);
			SetPlayerVirtualWorld(playerid,EnterInfo[i][pEWorld]);
			SetPlayerInterior(playerid,EnterInfo[i][pEInt]);
			TogglePlayerControllable(playerid, 0);
			SetTimerEx("UnFreeze",2000,false,"d",playerid);
		}
		else if(IsPlayerInRangeOfPoint(playerid,0.5,EnterInfo[i][pEX],EnterInfo[i][pEY],EnterInfo[i][pEZ])  && GetPlayerVirtualWorld(playerid) == EnterInfo[i][pEWorld])
		{
			if(EnterInfo[i][pFraction] != 0 && pData[playerid][pMember] != EnterInfo[i][pFraction]) return SendClientMessage(playerid,-1,"Вам недоступен данный пикап!");
			SetPlayerPos(playerid,EnterInfo[i][pX],EnterInfo[i][pY],EnterInfo[i][pZ]);
			SetPlayerVirtualWorld(playerid,EnterInfo[i][pWorld]);
			SetPlayerInterior(playerid,EnterInfo[i][pInt]);
			TogglePlayerControllable(playerid, 0);
			SetTimerEx("UnFreeze",2000,false,"d",playerid);
		}
	}
}
Команда создания пикапа:
PHP:
CMD:addpickup(playerid,params[])
{
    if(pData[playerid][pAdmin] < 8) return 1;
    new Float:x,Float:y,Float:z;
    GetPlayerPos(playerid,x,y,z);
    if(!GetPVarInt(playerid,"AddedPickup"))
    {
        SetPVarInt(playerid,"AddedPickup",1);
        SetPVarFloat(playerid,"PickupX",x);
        SetPVarFloat(playerid,"PickupY",y);
        SetPVarFloat(playerid,"PickupZ",z);
        SetPVarInt(playerid,"PickupInt",GetPlayerInterior(playerid));
        SetPVarInt(playerid,"PickupWorld",GetPlayerVirtualWorld(playerid));
        SendClientMessage(playerid,-1,"Координаты входа установлены. Встаньте на место выхода и введите: /addpickup");
    }
    else if(GetPVarInt(playerid,"AddedPickup"))
    {
        new frac,text[60];
        if(sscanf(params,"ds[60]",frac,text)) return SendClientMessage(playerid,-1,"Используйте: /addpickup [ID фракции | Доступен всем - 0] [Текст]");
        
        if(strlen(text) > 60) return SendClientMessage(playerid,-1,"Длина текста должна быть не более 60 символов!");
        if(frac < 0 || frac > TOTALFRAC) return SendClientMessage(playerid,-1,"ID фракции введён неверно!");
        TOTALPICKUP++;
		EnterInfo[TOTALPICKUP][pID] = TOTALPICKUP;
		EnterInfo[TOTALPICKUP][pX] = GetPVarFloat(playerid,"PickupX");
		EnterInfo[TOTALPICKUP][pY] = GetPVarFloat(playerid,"PickupY");
		EnterInfo[TOTALPICKUP][pZ] = GetPVarFloat(playerid,"PickupZ");
		EnterInfo[TOTALPICKUP][pEX] = x;
		EnterInfo[TOTALPICKUP][pEY] = y;
		EnterInfo[TOTALPICKUP][pEZ] = z;
		EnterInfo[TOTALPICKUP][pInt] = GetPVarInt(playerid,"PickupInt");
		EnterInfo[TOTALPICKUP][pWorld] = GetPVarInt(playerid,"PickupWorld");
		EnterInfo[TOTALPICKUP][pEInt] = GetPlayerInterior(playerid);
		EnterInfo[TOTALPICKUP][pEWorld] = GetPlayerVirtualWorld(playerid);
		EnterInfo[TOTALPICKUP][pFraction] = frac;
		format(EnterInfo[TOTALPICKUP][pText],60,"%s",text);

		static const format_string[] = "INSERT INTO `enters`(`ID`,`X`,`Y`,`Z`,`EX`,`EY`,`EZ`,`Int`,`World`,`EInt`,`EWorld`,`Text`,`Fraction`)VALUES ('%d', '%f', '%f', '%f', '%f','%f', '%f', '%d', '%d', '%d', '%d', '%s', '%d')";
		new string[sizeof(format_string)-26+7+7+7+7+7+7+7+7+7+7+7+60+5];
		format(string,sizeof(string),format_string,TOTALPICKUP,EnterInfo[TOTALPICKUP][pX],EnterInfo[TOTALPICKUP][pY],EnterInfo[TOTALPICKUP][pZ],x,y,z,GetPVarInt(playerid,"PickupInt"),GetPVarInt(playerid,"PickupWorld"),GetPlayerInterior(playerid),GetPlayerVirtualWorld(playerid),EnterInfo[TOTALPICKUP][pText],EnterInfo[TOTALPICKUP][pFraction]);
	    mysql_query(connects,string);

        TOTALPICKUP = 0;
	    mysql_function_query(connects,"SELECT * FROM `enters`",true,"LoadEnters","");

		SendClientMessage(playerid,-1,"Пикап успешно создан!");
        DeletePVar(playerid,"AddedPickup");
        DeletePVar(playerid,"PickupInt");
        DeletePVar(playerid,"PickupWorld");
        DeletePVar(playerid,"PickupX");
        DeletePVar(playerid,"PickupY");
        DeletePVar(playerid,"PickupZ");
	}
	return 1;
}
Дополнительно:
PHP:
pData[playerid][pAdmin] - переменная с админкой.
connects - переменная подключения бд.
pData[playerid][pMember] - переменная с фракцией игрока.
База данных:
PHP:
CREATE TABLE `enters` (
  `ID` int(11) NOT NULL,
  `X` float NOT NULL,
  `Y` float NOT NULL,
  `Z` float NOT NULL,
  `EX` float NOT NULL,
  `EY` float NOT NULL,
  `EZ` float NOT NULL,
  `World` int(11) NOT NULL DEFAULT 0,
  `Int` int(11) NOT NULL DEFAULT 0,
  `EWorld` int(11) NOT NULL DEFAULT 0,
  `EInt` int(11) NOT NULL DEFAULT 0,
  `Text` varchar(65) NOT NULL,
  `Fraction` int(5) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
 
Последнее редактирование:
Сверху Снизу