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

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

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

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

Динамические пикапы (MySQL)

iGuarDD

Начинающий
Пользователь
Регистрация
26 Ноя 2015
Сообщения
56
Лучшие ответы
0
Репутация
12
В приступе альтруизма решил в общий доступ выложить
Делал для своего сервера
Можно обойтись и без mysql,без zcmd и прочих сторонних библиотек — но мне с таким набором удобнее.
И да,если где-то есть "быдлокод",и Вы знаете,как можно написать лучше — пожалуйста,я буду только рад,если Вы меня поправите.
Описывать процесс вшивания в мод не буду,кому надо разберутся,вроде всё что нужно закоментил
Если есть идеи,как можно расширить функционал — пишите
Точно такая же система есть у меня на сервере,тестировал где-то час,багов не нашёл.

Требования (для запуска без мороки):
MySQL (юзал версию R39-3,но может работать и на более ранних),стример,zcmd (можно перепилить без проблем на другой)

ПЫСЫ я нуб,не нашёл добавления файла,так что лью сразу код

PHP:
// by iGuarDD

#include 							<a_samp>
#include 							<a_mysql>
#include                    		<streamer>
#include                            <zcmd>
//  Можно обойтись и без последних 3 инклудов.Но с ними мне было удобнее.

#define MySQL_HOST          		""
#define MySQL_USER          		""
#define MySQL_DB            		""
#define MySQL_PASS          		""

#define MAX_CONSOLE_PICKUPS         50  // Максимальное количество пикапов.

new dbHandle;

new Name[MAX_PLAYERS][24];              // При наличии аналогичной переменной заменить на свою.

new dialog[MAX_CONSOLE_PICKUPS * 56];
new buff[56];
// Вывел как локальную дабы хомячки не пищали о занятом стеке.

enum cPickups
{
	pickid,
	Float:TeleX,
	Float:TeleY,
	Float:TeleZ,
	Float:TeleAngle,
	Float:StartX,
	Float:StartY,
	Float:StartZ,
	StartWorld,
	StartInterior,
	TeleWorld,
	TeleInterior,
	bool:created,
	Creator[24],
	PickName[30]
}

new TelePickInfo[MAX_CONSOLE_PICKUPS][cPickups];

new createdpickups[MAX_CONSOLE_PICKUPS];    // Используется для показа диалога с созданными пикапами.


public OnGameModeInit()
{
    dbHandle = mysql_connect(MySQL_HOST,MySQL_USER,MySQL_DB,MySQL_PASS);
    mysql_tquery(dbHandle,"SELECT * FROM ConsolePickups","","");
	return 1;
}

public OnGameModeExit()
{
	mysql_close(dbHandle);
	return 1;
}

public OnPlayerConnect(playerid)
{
	GetPlayerName(playerid,Name[playerid],24);
}

public OnPlayerRequestClass(playerid, classid)
{
	SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
	return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
	if newkeys & KEY_NO && GetPVarInt(playerid,"CreateTelePickMode")*then
	{
		new Float:start[3];
		new query[290]; // Такой размер обусловлен непостоянностью длины Float- значений.На запас))
		new Float:p[4];
		start[0] = GetPVarFloat(playerid,"CreateTelePickX");
		start[1] = GetPVarFloat(playerid,"CreateTelePickY");
		start[2] = GetPVarFloat(playerid,"CreateTelePickZ");
		GetPlayerPos(playerid,p[0],p[1],p[2]);
		GetPlayerFacingAngle(playerid,p[3]);
		for(new i;i != MAX_CONSOLE_PICKUPS;i++)
		{
		    if TelePickInfo[i][created]*then continue;
		    TelePickInfo[i][created] = true;
			TelePickInfo[i][TeleX] = p[0];
			TelePickInfo[i][TeleY] = p[1];
			TelePickInfo[i][TeleZ] = p[2];
			TelePickInfo[i][TeleWorld] = GetPlayerVirtualWorld(playerid);
			TelePickInfo[i][TeleInterior] = GetPlayerInterior(playerid);
		    TelePickInfo[i][StartX] = start[0];
		    TelePickInfo[i][StartY] = start[1];
		    TelePickInfo[i][StartZ] = start[2];
		    TelePickInfo[i][StartWorld] = GetPVarInt(playerid,"CreateTelePickWorld");
		    TelePickInfo[i][StartInterior] = GetPVarInt(playerid,"CreateTelePickInterior");
			TelePickInfo[i][pickid] = CreateDynamicPickup(1318,1,start[0],start[1],start[2],GetPVarInt(playerid,"CreateTelePickWorld"),GetPVarInt(playerid,"CreateTelePickInterior"));
			strmid(TelePickInfo[i][Creator],Name[playerid],0,strlen(Name[playerid]));
			GetPVarString(playerid,"CreateTelePickName",TelePickInfo[i][PickName],30);
			format(query,sizeof query,"INSERT INTO ConsolePickups (ID,StartX,StartY,StartZ,StartWorld,StartInterior,EndX,EndY,EndZ,EndA,EndWorld,EndInterior,Creator,Name) VALUES (%d,%f,%f,%f,%d,%d,%f,%f,%f,%f,%d,%d,'%s','%s')",
			i,start[0],start[1],start[2],GetPVarInt(playerid,"CreateTelePickWorld"),GetPVarInt(playerid,"CreateTelePickInterior"),p[0],p[1],p[2],p[3],GetPlayerVirtualWorld(playerid),GetPlayerInterior(playerid),Name[playerid],TelePickInfo[i][PickName]);
			mysql_tquery(dbHandle,query,"","");
			format(query,45,"Пикап с %d ID успешно создан",i);
		 	SendClientMessage(playerid,-1,query);
		 	DeletePVar(playerid,"CreateTelePickX");
		 	DeletePVar(playerid,"CreateTelePickY");
		 	DeletePVar(playerid,"CreateTelePickZ");
		 	DeletePVar(playerid,"CreateTelePickWorld");
	 	 	DeletePVar(playerid,"CreateTelePickInterior");
	 	 	DeletePVar(playerid,"CreateTelePickName");
	 	 	return DeletePVar(playerid,"CreateTelePickMode");
		}
		return SendClientMessage(playerid,0xFF0000FF,"Достигнут лимит создания."); // Если цикл не нашёл свободную переменную — выдаём ошибку.
	}
	return 1;
}


public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	for(new i = strlen(inputtext) - 1;i != -1;i--) if inputtext[i] == '%'*then inputtext[i] = '#';
	switch(dialogid)
	{
		case 11221:
		{
		    if !response*then return ShowPlayerDialog(playerid,11220,DIALOG_STYLE_LIST,"Пикапы","{FFEE00}Пикапы телепорта","Выбор","Назад");
		    switch(listitem)
		    {
		        case 0: ShowPlayerConsolePickups(playerid);
		        case 1: ShowPlayerDialog(playerid,11223,DIALOG_STYLE_INPUT,"Пикапы","Введите название пикапа","Выбор","Назад");
		        case 2: ShowPlayerDialog(playerid,11222,DIALOG_STYLE_INPUT,"Пикапы","Введите ID пикапа для удаления","Выбор","Назад");
		    }
		}
		case 11222:
		{
		    if !response*then return ShowPlayerDialog(playerid,11220,DIALOG_STYLE_LIST,"Пикапы","{FFEE00}Пикапы телепорта","Выбор","Назад");
			new pickupid = strval(inputtext);
			if pickupid < 0 || pickupid >= MAX_CONSOLE_PICKUPS || TelePickInfo[pickupid][pickid] == INVALID_PLAYER_ID*then return ShowPlayerDialog(playerid,11202,DIALOG_STYLE_INPUT,"Пикапы","Введите ID пикапа для удаления","Выбор","Назад"),SendClientMessage(playerid,0xFF0000FF,"Пикап не найден");
			DestroyDynamicPickup(TelePickInfo[pickupid][pickid]);
			TelePickInfo[pickupid][created] = false;
			new query[45];
			format(query,sizeof query,"DELETE FROM ConsolePickups WHERE ID = %d",pickupid);
			mysql_tquery(dbHandle,query,"","");
		}
		case 11223:
		{
		    if !response*then return ShowPlayerDialog(playerid,11221,DIALOG_STYLE_LIST,"Пикапы","{FFEE00}Список\n{FFDD00}Создать\n{FFCC00}Удалить","Выбор","Назад");
			new len = strlen(inputtext);
			if !len || len > 30*then return ShowPlayerDialog(playerid,11223,DIALOG_STYLE_INPUT,"Пикапы","Введите название пикапа","Выбор","Назад"),SendClientMessage(playerid,0xFF0000FF,"Диапазон длины названия: 1..30");
			SetPVarString(playerid,"CreateTelePickName",inputtext);
            new Float:p[3];
			GetPlayerPos(playerid,p[0],p[1],p[2]);
			SetPVarFloat(playerid,"CreateTelePickX",p[0]);
			SetPVarFloat(playerid,"CreateTelePickY",p[1]);
			SetPVarFloat(playerid,"CreateTelePickZ",p[2]);
			SetPVarInt(playerid,"CreateTelePickWorld",GetPlayerVirtualWorld(playerid));
			SetPVarInt(playerid,"CreateTelePickInterior",GetPlayerInterior(playerid));
			SetPVarInt(playerid,"CreateTelePickMode",1);
			SendClientMessage(playerid,-1,"Встаньте на точку телепорта и нажмите клавишу \"N\"");
		}
		case 11224:
		{
		    if !response*then return ShowPlayerDialog(playerid,11221,DIALOG_STYLE_LIST,"Пикапы","{FFEE00}Список\n{FFDD00}Создать\n{FFCC00}Удалить","Выбор","Назад");
		    new pickupid = createdpickups[listitem];
			SetPVarInt(playerid,"ControlConsolePick",pickupid);
			ShowPlayerDialog(playerid,11225,DIALOG_STYLE_LIST,"Пикапы","{FFEE00}Телепортироваться\n{FFDD00}Переименовать\n{FFCC00}Удалить","Выбор","Назад");
		}
		case 11225:
		{
		    if !response*then return ShowPlayerConsolePickups(playerid),DeletePVar(playerid,"ControlConsolePick");
		    new pickupid = GetPVarInt(playerid,"ControlConsolePick");
		    switch(listitem)
		    {
		        case 0:
		        {
					SetPVarInt(playerid,"PickUpTimer",gettime() + 5);
					SetPlayerPos(playerid,TelePickInfo[pickupid][StartX],TelePickInfo[pickupid][StartY],TelePickInfo[pickupid][StartZ]);
					SetPlayerInterior(playerid,TelePickInfo[pickupid][StartInterior]);
					SetPlayerVirtualWorld(playerid,TelePickInfo[pickupid][StartWorld]);
		        }
		        case 1: return ShowPlayerDialog(playerid,11226,DIALOG_STYLE_INPUT,"Пикапы","Введите новое название для пикапа:","Ввод","Назад");
		        case 2:
		        {
					DestroyDynamicPickup(TelePickInfo[pickupid][pickid]);
					TelePickInfo[pickupid][created] = false;
					new query[45];
					format(query,sizeof query,"DELETE FROM ConsolePickups WHERE ID = %d",pickupid);
					mysql_tquery(dbHandle,query,"","");
					ShowPlayerConsolePickups(playerid);
		        }
		    }
		    DeletePVar(playerid,"ControlConsolePick");
		}
		case 11226:
		{
		    if !response*then return ShowPlayerConsolePickups(playerid),DeletePVar(playerid,"ControlConsolePick");
		    new len = strlen(inputtext);
		    if !len || len > 30*then return ShowPlayerDialog(playerid,11226,DIALOG_STYLE_INPUT,"Пикапы","Введите новое название для пикапа:","Ввод","Назад"),SendClientMessage(playerid,0xFF0000FF,"Диапазон длины названия: 1..30");
			new pickupid = GetPVarInt(playerid,"ControlConsolePick");
			strmid(TelePickInfo[pickupid][PickName],inputtext,0,len);
			DeletePVar(playerid,"ControlConsolePick");
			ShowPlayerConsolePickups(playerid);
		}
	}
	return 1;
}

forward ForLoadConsolePickups(tick);
public ForLoadConsolePickups(tick)
{
	new rows,fields;
	cache_get_data(rows,fields);
	if !rows*then return print("Пикапы для телепорта не найдены в базе данных");
	else if rows > MAX_CONSOLE_PICKUPS*then return printf("WARNING: количество пикапов для телепорта в базе превышает лимит (%d)",rows - MAX_CONSOLE_PICKUPS);
	new id;
	new Float:pos[3];
	new world;
	new interior;
	for(new i;i != rows;i++)
	{
	    id = cache_get_field_content_int(i,"ID");
	    pos[0] = cache_get_field_content_int(i,"StartX");
	    pos[1] = cache_get_field_content_int(i,"StartY");
	    pos[2] = cache_get_field_content_int(i,"StartZ");
	    world = cache_get_field_content_int(i,"StartWorld");
	    interior = cache_get_field_content_int(i,"Startinterior");
	    TelePickInfo[id][StartX] = pos[0];
	    TelePickInfo[id][StartY] = pos[1];
	    TelePickInfo[id][StartZ] = pos[2];
	    TelePickInfo[id][TeleX] = cache_get_field_content_int(i,"EndX");
	    TelePickInfo[id][TeleY] = cache_get_field_content_int(i,"EndY");
	    TelePickInfo[id][TeleZ] = cache_get_field_content_int(i,"EndZ");
	    TelePickInfo[id][StartWorld] = world;
	    TelePickInfo[id][StartInterior] = interior;
	    TelePickInfo[id][TeleAngle] = cache_get_field_content_int(i,"EndAngle");
	    TelePickInfo[id][TeleWorld] = cache_get_field_content_int(i,"EndWorld");
	    TelePickInfo[id][TeleInterior] = cache_get_field_content_int(i,"EndInterior");
	    TelePickInfo[id][pickid] = CreateDynamicPickup(1318,1,pos[0],pos[1],pos[2],world,interior);
	    cache_get_field_content(i,"Creator",TelePickInfo[id][Creator]);
	    cache_get_field_content(i,"Name",TelePickInfo[id][PickName]);
	    TelePickInfo[id][created] = true;
	}
	printf("Загружено пикапов: %d. %d мс.",rows,GetTickCount() - tick);
	return 1;
}

public OnPlayerPickUpDynamicPickup(playerid,pickupid)
{
	if GetPVarInt(playerid,"PickUpTimer") > gettime()*then return 1;    // Для телепорта к пикапам
	for(new i;i != MAX_CONSOLE_PICKUPS;i++) // Можно и без цикла,с
	{
	    if !TelePickInfo[i][created] || pickupid != TelePickInfo[i][pickid]*then continue;
	    SetPlayerVirtualWorld(playerid,TelePickInfo[i][TeleWorld]);
	    SetPlayerInterior(playerid,TelePickInfo[i][TeleInterior]);
	    SetPlayerFacingAngle(playerid,TelePickInfo[i][TeleAngle]);
	    SetPlayerPos(playerid,TelePickInfo[i][TeleX],TelePickInfo[i][TeleY],TelePickInfo[i][TeleZ]);
	}
	return 1;
}

ShowPlayerConsolePickups(playerid)
{
	dialog[0] = EOS;
	buff[0] = EOS;
	// Чистим массив.
	new countfind;
	for(new i;i != MAX_CONSOLE_PICKUPS;i++)
	{
	    createdpickups[i] = 0;
	    if !TelePickInfo[i][created]*then continue;
	    format(buff,sizeof buff,"%s\t%s\n",TelePickInfo[i][PickName],TelePickInfo[i][Creator]);
	    strcat(dialog,buff);
	    createdpickups[i] = countfind;
	    countfind++;
	}
	if !countfind*then return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Пикапы","Пикапы не найдены","Ясно","");
	ShowPlayerDialog(playerid,11224,DIALOG_STYLE_TABLIST,"Пикапы",dialog,"Выбор","Назад");
	dialog[0] = EOS;
	buff[0] = EOS;
	// Чистим массив.
	return 1;
}

CMD:pickmenu(playerid)
{
	if IsPlayerAdmin(playerid)*then ShowPlayerDialog(playerid,11221,DIALOG_STYLE_LIST,"Пикапы","{FFEE00}Список\n{FFDD00}Создать\n{FFCC00}Удалить","Выбор","Назад");
	return 1;
}
 
Сверху Снизу