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

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

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

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

Мануал Динамическая система домов [MySQL r8]

Mentos

Компетентный
Здравствуйте. Вроде бы такого мануальчика я тута не видел. Это только основа для системы домов, все остальное ребята сами, ручками-ручками)
Для работы потребуется:
ZCMD или DC_CMD.
sscanf
mysql
Ну там ко всем new короч:
PHP:
enum hInfo
{
	hID,
    Float:hPosV[3],
    Float:hPosE[3],
    hOwner[24],
    hOwned,
    hCena,
    hInt,
    hLock,
    hClass,
    hIconID,
    hPickupID,
    Text3D:hTextID,
};
new HouseInfo[101][hInfo];
new TOTALHOUSES;
Теперь ко всем forward:
PHP:
forward HouseLoad();
Теперь создаем паблик загрузки домов:
PHP:
public HouseLoad()
{
 	new time = GetTickCount();
 	new r, f;
 	cache_get_data(r, f);
 	new string[128];
 	for(new idx; idx < r; idx++)
  		{
    	HouseInfo[idx][hID] = cache_get_field_content_int(idx, "id", MYSQL_ARG);
     	HouseInfo[idx][hPosV][0] = cache_get_field_content_float(idx, "pos1", MYSQL_ARG);
      	HouseInfo[idx][hPosV][1] = cache_get_field_content_float(idx, "pos2", MYSQL_ARG);
       	HouseInfo[idx][hPosV][2] = cache_get_field_content_float(idx, "pos3", MYSQL_ARG);
        HouseInfo[idx][hPosE][0] = cache_get_field_content_float(idx, "pose1", MYSQL_ARG);
        HouseInfo[idx][hPosE][1] = cache_get_field_content_float(idx, "pose2", MYSQL_ARG);
        HouseInfo[idx][hPosE][2] = cache_get_field_content_float(idx, "pose3", MYSQL_ARG);
        cache_get_field_content(idx, "owner", HouseInfo[idx][hOwner], MYSQL_ARG, 24);
        HouseInfo[idx][hCena] = cache_get_field_content_int(idx, "cena", MYSQL_ARG);
        HouseInfo[idx][hInt] = cache_get_field_content_int(idx, "int", MYSQL_ARG);
        HouseInfo[idx][hLock] = cache_get_field_content_int(idx, "lock", MYSQL_ARG);
        HouseInfo[idx][hOwned] = cache_get_field_content_int(idx, "owned", MYSQL_ARG);
        HouseInfo[idx][hClass] = cache_get_field_content_int(idx, "class", MYSQL_ARG);

		new klass[13];
		if(HouseInfo[idx][hOwned] == 0)
  		{  
    		HouseInfo[idx][hPickupID] = CreatePickup(1273, 23, HouseInfo[idx][hPosV][0], HouseInfo[idx][hPosV][1], HouseInfo[idx][hPosV][2],-1);
   			HouseInfo[idx][hIconID] = CreateDynamicMapIcon(HouseInfo[idx][hPosV][0], HouseInfo[idx][hPosV][1], HouseInfo[idx][hPosV][2], 31, 0xFFFFFF, 0, -1, -1, 200.0);
            switch(HouseInfo[idx][hClass])
                {
                case 0: klass = "Эконом класс";
                case 1: klass = "Бизнес класс";
                case 2: klass = "Элитный";
                }
			format(string,256,"Номер дома: %i\nЦена: %i долларов\nКласс: %s",idx,HouseInfo[idx][hCena],klass);
      		HouseInfo[idx][hTextID] = Create3DTextLabel(string,0xFFFFFF,HouseInfo[idx][hPosV][0], HouseInfo[idx][hPosV][1], HouseInfo[idx][hPosV][2],20.0,0,1);
      	}
		else
		{
		    HouseInfo[idx][hPickupID] = CreatePickup(1272, 23, HouseInfo[idx][hPosV][0], HouseInfo[idx][hPosV][1], HouseInfo[idx][hPosV][2],-1);
      		HouseInfo[idx][hIconID] = CreateDynamicMapIcon(HouseInfo[idx][hPosV][0], HouseInfo[idx][hPosV][1], HouseInfo[idx][hPosV][2], 32, 0xFFFFFF, 0, -1, -1, 200.0);
      		switch(HouseInfo[idx][hClass])
                {
                case 0: klass = "Эконом класс";
                case 1: klass = "Бизнес класс";
                case 2: klass = "Элитный";
                }
            format(string,256,"Номер дома: %i\nВладелец: %s\nКласс: %s",idx,HouseInfo[idx][hOwner], klass);
            HouseInfo[idx][hTextID] = Create3DTextLabel(string,0xFFFFFF,HouseInfo[idx][hPosV][0], HouseInfo[idx][hPosV][1], HouseInfo[idx][hPosV][2],20.0,0,1);
		}
       	TOTALHOUSES++;
       	}
    printf("Загружено домов [%i] пострачено времени [%i мс]",TOTALHOUSES,GetTickCount()-time);
    return true;
}
Теперь stock сохранения, под пабликом загрузки, будет удобнее)
PHP:
stock HouseSave(houseid)
{
    mysql_format(MYSQL_ARG, asd, sizeof(asd),"UPDATE `house` SET `posvx` = '%f', `posvy` = '%f', `posvz` = '%f', `posex` = '%f', `posey` = '%f', `posez` = '%f', `owner` = '%e', `cena` = '%i', `int` = '%i', `lock` = '%i', `owned` = '%i', `class` = '%i'  WHERE `id` = '%i'",
    HouseInfo[houseid][hPosV][0],
    HouseInfo[houseid][hPosV][1],
    HouseInfo[houseid][hPosV][2],
    HouseInfo[houseid][hPosE][0],
    HouseInfo[houseid][hPosE][1],
    HouseInfo[houseid][hPosE][2],
    HouseInfo[houseid][hOwner],
    HouseInfo[houseid][hCena],
    HouseInfo[houseid][hInt],
    HouseInfo[houseid][hLock],
    HouseInfo[houseid][hOwned],
    HouseInfo[houseid][hClass],
    HouseInfo[houseid][hID]
    );
    mysql_tquery(MYSQL_ARG, asd, "", "");
}
Загрузку и сохранение сделали, теперь давайте наверное к самому созданию.
Ну туда где у вас команды суем:
PHP:
CMD:addhouse(playerid, params[])
{
new Float:xh, Float:yh, Float:zh;
SetPVarInt(playerid, "addhouse", TOTALHOUSES++);
GetPlayerPos(playerid, xh, yh, zh);
if(sscanf(params, "dd", params[0], params[1]))return SendClientMessage(playerid, -1, "/addhouse [Цена][Класс]");
HouseInfo[GetPVarInt(playerid, "addhouse")][hPosV][0] = xh;
HouseInfo[GetPVarInt(playerid, "addhouse")][hPosV][1] = yh;
HouseInfo[GetPVarInt(playerid, "addhouse")][hPosV][2] = zh;
HouseInfo[GetPVarInt(playerid, "addhouse")][hCena] = params[0];
HouseInfo[GetPVarInt(playerid, "addhouse")][hClass] = params[1];
if(params[1] > 5) return SendClientMessage(playerid, -1, "Вы указали слишком высокий класс");
ShowPlayerDialog(playerid, 22, DIALOG_STYLE_LIST,"Выбор интерьера","Шершавые стены[N]\n2 комнатки[N]\n2 комнатки[Страшнее][N]\nХолостяк[N]\nСредний класс 1\nСредний класс 2\nСредний класс 3\n\nСредний класс 4 [1 к.]","Создать","Отмена");
return 1;
}
Теперь суем в OnDialogResponse:
PHP:
case 22:
	{
	    if(response)
			{
				switch(listitem)
				{
				case 0:
				{
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][0] = 328.493988;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][1] = 1480.589966;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][2] = 1084.449951;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hInt] = 15;
				}
				case 1:
				{
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][0] = 2251.85;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][1] = -1138.16;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][2] = 1050.63;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hInt] = 9;
				}
				case 2:
				{
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][0] = 2262.83;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][1] = -1137.71;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][2] = 1050.63;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hInt] = 10;
				}
				case 3:
				{
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][0] = 244.6048;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][1] = 304.8997;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][2] = 999.1484;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hInt] = 1;
				}
				case 4:
				{
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][0] = 225.756989;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][1] = 1240.000000;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][2] = 1082.149902;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hInt] = 2;
				}
				case 5:
				{
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][0] = 223.043991;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][1] = 1289.259888;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][2] = 1082.199951;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hInt] = 1;
				}
				case 6:
				{
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][0] = 385.803986;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][1] = 1471.769897;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][2] = 1080.209961;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hInt] = 15;
				}
				case 7:
				{
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][0] = 2451.77;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][1] = -1699.80;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][2] = 1013.51;
				HouseInfo[GetPVarInt(playerid,"addhouse")][hInt] = 2;
				}
				}
				mysql_format(MYSQL_ARG, asd, sizeof(asd), "INSERT INTO `house` (`owner`,`owned`, `pos1`,`pos2`,`pos3`, `pose1`,`pose2`,`pose3`,`cena`,`int`,`class`) VALUES ('The State','%e', '%f', '%f', '%f', '%f', '%f', '%f','%d','%d','%d')",
				HouseInfo[GetPVarInt(playerid,"addhouse")][hOwner],
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosV][0],
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosV][1],
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosV][2],
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][0],
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][1],
				HouseInfo[GetPVarInt(playerid,"addhouse")][hPosE][2],
				HouseInfo[GetPVarInt(playerid,"addhouse")][hCena],
				HouseInfo[GetPVarInt(playerid,"addhouse")][hInt],
				HouseInfo[GetPVarInt(playerid,"addhouse")][hClass]
				);
				mysql_function_query(MYSQL_ARG, asd, false, "", "");
	}
		DeletePVar(playerid,"addhouse");
	}
Ну и теперь обратно к командам :D
PHP:
CMD:buyhouse(playerid,params[])
{
    if(PlayerInfo[playerid][pHouseKey] != 0) return SendClientMessage(playerid,0xFFFFFF," У вас уже есть дом. Введите /sellhouse, чтобы его продать");
    for(new h = 1; h <= TOTALHOUSES; h++)
    {
        if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[h][hPosV][0],HouseInfo[h][hPosV][1],HouseInfo[h][hPosV][2]))
        {
            if(HouseInfo[h][hOwned] == 1) SendClientMessage(playerid, 0xff7900, "В этом доме уже кто то проживает!");
            if(PlayerInfo[playerid][pMoney] < HouseInfo[h][hCena]) return SendClientMessage(playerid,0xFFFFFF," У вас недостаточно денег на покупку дома");
            PlayerInfo[playerid][pHouseKey] = h;
            HouseInfo[h][hOwned] = 1;
            strmid(HouseInfo[h][hOwner], PlayerInfo[playerid][pName], 0, 24, 24);
            PlayerInfo[playerid][pMoney] -= HouseInfo[h][hCena];
            SetPlayerPos(playerid,HouseInfo[h][hPosE][0],HouseInfo[h][hPosE][1],HouseInfo[h][hPosE][2]);
            SetPlayerInterior(playerid,HouseInfo[h][hInt]);
            SetPlayerVirtualWorld(playerid,h+50);
           	SendClientMessage(playerid,0xFFFFFF," Поздравляем с покупкой!");
            HouseSave(h);
            Update3DTexts();
            SetMoeny(playerid);
            break;
        }
    }
    return true;
}
CMD:sellhouse(playerid,params[])
{
    if(PlayerInfo[playerid][pHouseKey] == 0)return SendClientMessage(playerid,0xFFFFFF," В не владеете недвижимостью");
    new h = PlayerInfo[playerid][pHouseKey];
    PlayerInfo[playerid][pHouseKey] = 0;
    strmid(HouseInfo[h][hOwner], "The State", 0, strlen("The State"), 255);
    PlayerInfo[playerid][pMoney] += HouseInfo[h][hCena];
    HouseInfo[h][hOwned] = 0;
    HouseInfo[h][hLock] = 1;
    SendClientMessage(playerid,0xFFFFFF,"Вы продали свой дом.");
    HouseSave(h);
    Update3DTexts();
    SetMoeny(playerid);
    return true;
}
CMD:open(playerid,params[])
{
    if(PlayerInfo[playerid][pHouseKey] == 0)return SendClientMessage(playerid,0xFFFFFF," В не владеете недвижимостью");
    new h = PlayerInfo[playerid][pHouseKey];
    if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hPosV][0],HouseInfo[h][hPosV][1],HouseInfo[h][hPosV][2]))
    {
        switch(HouseInfo[h][hLock])
        {
        case 0: { HouseInfo[h][hLock] = 1; GameTextForPlayer(playerid,"~w~HOUSE ~r~CLOSE",5000,1); }
        case 1: { HouseInfo[h][hLock] = 0; GameTextForPlayer(playerid,"~w~HOUSE ~g~OPEN",5000,1); }
        }
    }
    return true;
}
Создание сделали, покупку\продажу\открытие\закрытие сделали. Значит теперь сделаем что бы они загружались при включении сервера, в OnGameModeInit:
PHP:
mysql_function_query(MYSQL_ARG,"SELECT * FROM `house`", true, "HouseLoad", "");
Тааааак-с вроде бы нечего не забыл.
Ну у многих могут быть ошибки о неизвестных символах, так что добавим ко всем new еще:
PHP:
new MYSQL_ARG;
new asd[200];
Я поделился с вами своей основой. До ума я ее не доводил, не запаривался на счет оптимизации и т.д.
Баги возможно будут, а может и не будут)
Всем удачиков.
Автор системы: Mentos(I)
 
Сверху Снизу