Сегодня Четверг | Дата: 28.03.2024 | Время: 14:37
                        
Последние новости
Оф. C-HUD GTA-ONE (v. beta 1.0) by Darius Stone для GTA - SA
Добавил: Kronos
Всего комментариев: 0
Новая волна GTA-ONE
Добавил: Ice_Code
Всего комментариев: 3
Трейлер Grand Theft Auto - V
Добавил: Kronos
Всего комментариев: 0
Новые темы форума
Last Empire War Z
Ответил: Kronos
Всего ответов:
Adobe Photoshop Touch
Ответил: Kronos
Всего ответов:
ePSXe for Android
Ответил: Kronos
Всего ответов:
Лучшие пользователи
Kronos
Логин: Kronos
Репутация: 10
Группа: Администраторы
Ice_Code
Логин: Ice_Code
Репутация: 2
Группа: Администраторы
ExT
Логин: ExT
Репутация: 1
Группа: Пользователи
Здравствуй, Гость! Авторизуйся или зарегистрируйся
Цвет фона
Случайные материалы



Последние материалы

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Pawn - скриптинг » Мануалы/уроки » MySQL » [Мануал] Система домов для new.pwn [MySQL ~R7~]
[Мануал] Система домов для new.pwn [MySQL ~R7~]
KronosДата: Воскресенье, 13.07.2014, 20:02 | Сообщение # 1
Местный мазафака
Сообщений: 117
Награды: 0
Репутация: 10
Что бы не объявлять каждый раз строковый массив, ко всем переменным добавить
Код
new ministring[128];


Так же используется макрос ProetectorNew
Код
#define ProxDetectorNew(%0,%1,%2,%3) ProxDetector(%0,%1,%2,%3,%3,%3,%3,%3)


Всем привет, дорогие пользователи форума Pawno-Info.Ru
Сегодня я бы хотел поделиться своей системой домов на MySQL ~R7~
Ну что же, начнем.

Для начала ко всем форвардам добавляем это:
Код
forward OnHousesLoad();
forward OnHouseSave(houseid);


Далее идем к переменным и прописываем следующее:
Код
enum hInfo
{
     hID,
     hOwned,
     hOwner[MAX_PLAYER_NAME],
     Float:hEnterX,
     Float:hEnterY,
     Float:hEnterZ,
     Float:hExitX,
     Float:hExitY,
     Float:hExitZ,
     hLevel,
     hPrice,
     hLock,
     hTakings,
     hInt,
     hHel,
     hClass,
     hIconID,
     hPickupID,
     Text3D:hTextID
}
new HouseInfo[MAX_HOUSES][hInfo]; /* Вместо MAX_HOUSES прописать максимальное кол-во домов на сервере */
new TOTALHOUSES;


В `public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)` прописываем следующее:
Код
if(newkeys & KEY_WALK)
{
     for(new idx = 1; idx <= TOTALHOUSES; idx++)
     {
         if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[idx][hEnterX],HouseInfo[idx][hEnterY],HouseInfo[idx][hEnterZ]))
         {
             if(HouseInfo[idx] [hLock]== 0 || !strcmp(PlayerInfo[playerid][pNick],HouseInfo[idx][hOwner],true))
             {
                 SetPlayerPosAC(playerid,HouseInfo[idx][hExitX],HouseInfo[idx][hExitY],HouseInfo[idx][hExitZ]);
                 SetPlayerInterior(playerid,HouseInfo[idx][hInt]);
                 SetPlayerVirtualWorld(playerid,idx+50);
                 break;
             }
             else { GameTextForPlayer(playerid,"~r~CLOSED",5000,1); break; }
         }
         else if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[idx][hExitX],HouseInfo[idx][hExitY],HouseInfo[idx][hExitZ]) && GetPlayerVirtualWorld(playerid) == idx+50)
         {
             SetPlayerPosAC(playerid,HouseInfo[idx][hEnterX],HouseInfo[idx][hEnterY],HouseInfo[idx][hEnterZ]);
             SetPlayerInterior(playerid,0);
             SetPlayerVirtualWorld(playerid,0);
             break;
         }
     }
}


Идем дальше.
Теперь мы создадим 2 коллбэка, отвечающих за загрузку и сохранение домов
Код
public OnHousesLoad() // Коллбэк загрузки
{
     new time = GetTickCount();
     new string[128],klass[2];
     new temp[32],rows,fields;
     cache_get_data(rows,fields,connectionHandle);
     if(rows)
     {
         for(new idx = 1; idx <= rows; idx++)
         {
             cache_get_field_content(idx-1,"hID",temp,connectionHandle), HouseInfo[idx] [hID]= strval(temp);
             cache_get_field_content(idx-1,"hOwned",temp,connectionHandle), HouseInfo[idx] [hOwned]= strval(temp);
             cache_get_field_content(idx-1,"hOwner",HouseInfo[idx][hOwner],connectionHandle,24);
             cache_get_field_content(idx-1,"hEnterX",temp,connectionHandle), HouseInfo[idx] [hEnterX]= floatstr(temp);
             cache_get_field_content(idx-1,"hEnterY",temp,connectionHandle), HouseInfo[idx] [hEnterY]= floatstr(temp);
             cache_get_field_content(idx-1,"hEnterZ",temp,connectionHandle), HouseInfo[idx] [hEnterZ]= floatstr(temp);
             cache_get_field_content(idx-1,"hExitX",temp,connectionHandle), HouseInfo[idx] [hExitX]= floatstr(temp);
             cache_get_field_content(idx-1,"hExitY",temp,connectionHandle), HouseInfo[idx] [hExitY]= floatstr(temp);
             cache_get_field_content(idx-1,"hExitZ",temp,connectionHandle), HouseInfo[idx] [hExitZ]= floatstr(temp);
             cache_get_field_content(idx-1,"hLevel",temp,connectionHandle), HouseInfo[idx] [hLevel]= strval(temp);
             cache_get_field_content(idx-1,"hPrice",temp,connectionHandle), HouseInfo[idx] [hPrice]= strval(temp);
             cache_get_field_content(idx-1,"hLock",temp,connectionHandle), HouseInfo[idx] [hLock]= strval(temp);
             cache_get_field_content(idx-1,"hTakings",temp,connectionHandle), HouseInfo[idx] [hTakings]= strval(temp);
             cache_get_field_content(idx-1,"hInt",temp,connectionHandle), HouseInfo[idx] [hInt]= strval(temp);
             cache_get_field_content(idx-1,"hHel",temp,connectionHandle), HouseInfo[idx] [hHel]= strval(temp);
             cache_get_field_content(idx-1,"hClass",temp,connectionHandle), HouseInfo[idx] [hClass]= strval(temp);
             TOTALHOUSES++;
             if(HouseInfo[idx] [hOwned]== 0)
             {
                 HouseInfo[idx] [hPickupID]= CreatePickupAC(1273, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
                 HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 31, COLOR_WHITE, 0, -1, -1, 200.0);
                 switch(HouseInfo[idx][hClass])
                 {
                 case 0: klass = "E";
                 case 1: klass = "D";
                 case 2: klass = "C";
                 case 3: klass = "B";
                 case 4: klass = "A";
                 case 5: klass = "S";
                 }
                 format(string,256,"Номер дома: %i\nЦена: %i долларов\nКласс: %s",idx,HouseInfo[idx][hPrice],klass);
                 HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_YELLOW,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
             }
             else
             {
                 HouseInfo[idx] [hPickupID]= CreatePickupAC(1272, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
                 HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 32, COLOR_WHITE, 0, -1, -1, 200.0);
                 switch(HouseInfo[idx][hClass])
                 {
                 case 0: klass = "E";
                 case 1: klass = "D";
                 case 2: klass = "C";
                 case 3: klass = "B";
                 case 4: klass = "A";
                 case 5: klass = "S";
                 }
                 format(string,256,"Номер дома: %i\nВладелец: %s\nКласс: %s",idx,HouseInfo[idx][hOwner],klass);
                 HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_LIGHTRED,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
             }
         }
     }
     printf("[Загружено домов]: <%i>. Времени затрачено: <%i мс>",TOTALHOUSES,GetTickCount()-time);
     return true;
}

public OnHouseSave(houseid)
{
     new string[32],query[256];
     format(string,sizeof(string),"UPDATE `"TABLE_HOUSES"` SET "),strcat(query,string);
     format(string,sizeof(string),"`hOwned` = '%i', ",HouseInfo[houseid][hOwned]),strcat(query,string);
     format(string,sizeof(string),"`hOwner` = '%s', ",HouseInfo[houseid][hOwner]),strcat(query,string);
     format(string,sizeof(string),"`hEnterX` = '%f', ",HouseInfo[houseid][hEnterX]),strcat(query,string);
     format(string,sizeof(string),"`hEnterY` = '%f', ",HouseInfo[houseid][hEnterY]),strcat(query,string);
     format(string,sizeof(string),"`hEnterZ` = '%f', ",HouseInfo[houseid][hEnterZ]),strcat(query,string);
     format(string,sizeof(string),"`hExitX` = '%f', ",HouseInfo[houseid][hExitX]),strcat(query,string);
     format(string,sizeof(string),"`hExitY` = '%f', ",HouseInfo[houseid][hExitY]),strcat(query,string);
     format(string,sizeof(string),"`hExitZ` = '%f', ",HouseInfo[houseid][hExitZ]),strcat(query,string);
     format(string,sizeof(string),"`hLevel` = '%i', ",HouseInfo[houseid][hLevel]),strcat(query,string);
     format(string,sizeof(string),"`hPrice` = '%i', ",HouseInfo[houseid][hPrice]),strcat(query,string);
     format(string,sizeof(string),"`hLock` = '%i', ",HouseInfo[houseid][hLock]),strcat(query,string);
     format(string,sizeof(string),"`hTakings` = '%i', ",HouseInfo[houseid][hTakings]),strcat(query,string);
     format(string,sizeof(string),"`hInt` = '%i', ",HouseInfo[houseid][hInt]),strcat(query,string);
     format(string,sizeof(string),"`hHel` = '%i', ",HouseInfo[houseid][hHel]),strcat(query,string);
     format(string,sizeof(string),"`hClass` = '%i' ",HouseInfo[houseid][hClass]),strcat(query,string);
     format(string,sizeof(string),"WHERE `hID` = '%i'",HouseInfo[houseid][hID]),strcat(query,string);
     mysql_function_query(connectionHandle,query,false,"","");
     return true;
}


Наши коллбэки созданы. Кстати, чуть не забыл, ID купленного дома сохранятся в аккаунте игрока, поэтому, где `enum pInfo` или что-либо подобное прописываем `pHouseKey`. Эта переменная отвечает за ID купленного дома. По умолчанию эта переменная должны быть равна `-1`. Ладно, двигаемся дальше

В функцию, отвечающую за спавн игрока, или в `public OnPlayerSpawn(playerid)` прописываем следующее:
Код
if(PlayerInfo[playerid] [pHouseKey]!= -1)
{
     new h = PlayerInfo[playerid][pHouseKey];
     SetPlayerPosAC(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
     SetPlayerFacingAngle(playerid,270.0000);
     SetPlayerInterior(playerid,HouseInfo[h][hInt]);
     SetPlayerVirtualWorld(playerid,h+50);
}


Дальше мы создадим функцию, отвечающую за обновление 3D Текстов
Код
stock Update3DTexts()
{
     new string[128];
     for(new i = 1; i <= TOTALHOUSES; i++)
     {
         new klass[2];
         DestroyDynamicMapIcon(HouseInfo[idx][hIconID]);
         DestroyPickup(HouseInfo[idx][hPickupID]);
         Delete3DTextLabel(HouseInfo[idx][hTextID]);
         if(HouseInfo[idx] [hOwned]== 0)
         {
             HouseInfo[idx] [hPickupID]= CreatePickupAC(1273, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
             HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 31, COLOR_WHITE, 0, -1, -1, 100.0);
             switch(HouseInfo[idx][hClass])
             {
             case 0: klass = "E";
             case 1: klass = "D";
             case 2: klass = "C";
             case 3: klass = "B";
             case 4: klass = "A";
             case 5: klass = "S";
             }
             format(string,sizeof(string),"Номер дома: %i\nЦена: %i долларов\nКласс: %s",idx,HouseInfo[idx][hPrice],klass);
             HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_YELLOW,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
         }
         else
         {
             HouseInfo[idx] [hPickupID]= CreatePickupAC(1272, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
             HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 32, COLOR_WHITE, 0, -1, -1, 100.0);
             switch(HouseInfo[idx][hClass])
             {
             case 0: klass = "E";
             case 1: klass = "D";
             case 2: klass = "C";
             case 3: klass = "B";
             case 4: klass = "A";
             case 5: klass = "S";
             }
             format(string,sizeof(string),"Номер дома: %i\nВладелец: %s\nКласс: %s",idx,HouseInfo[idx][hOwner],klass);
             HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_LIGHTRED,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
         }
     }
}


Ну, мы практически подошли к концу, осталось только создать команды.
Я использовал командный процессор от Kazon'a "LIFE-CMD".


СообщениеЧто бы не объявлять каждый раз строковый массив, ко всем переменным добавить
Код
new ministring[128];


Так же используется макрос ProetectorNew
Код
#define ProxDetectorNew(%0,%1,%2,%3) ProxDetector(%0,%1,%2,%3,%3,%3,%3,%3)


Всем привет, дорогие пользователи форума Pawno-Info.Ru
Сегодня я бы хотел поделиться своей системой домов на MySQL ~R7~
Ну что же, начнем.

Для начала ко всем форвардам добавляем это:
Код
forward OnHousesLoad();
forward OnHouseSave(houseid);


Далее идем к переменным и прописываем следующее:
Код
enum hInfo
{
     hID,
     hOwned,
     hOwner[MAX_PLAYER_NAME],
     Float:hEnterX,
     Float:hEnterY,
     Float:hEnterZ,
     Float:hExitX,
     Float:hExitY,
     Float:hExitZ,
     hLevel,
     hPrice,
     hLock,
     hTakings,
     hInt,
     hHel,
     hClass,
     hIconID,
     hPickupID,
     Text3D:hTextID
}
new HouseInfo[MAX_HOUSES][hInfo]; /* Вместо MAX_HOUSES прописать максимальное кол-во домов на сервере */
new TOTALHOUSES;


В `public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)` прописываем следующее:
Код
if(newkeys & KEY_WALK)
{
     for(new idx = 1; idx <= TOTALHOUSES; idx++)
     {
         if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[idx][hEnterX],HouseInfo[idx][hEnterY],HouseInfo[idx][hEnterZ]))
         {
             if(HouseInfo[idx] [hLock]== 0 || !strcmp(PlayerInfo[playerid][pNick],HouseInfo[idx][hOwner],true))
             {
                 SetPlayerPosAC(playerid,HouseInfo[idx][hExitX],HouseInfo[idx][hExitY],HouseInfo[idx][hExitZ]);
                 SetPlayerInterior(playerid,HouseInfo[idx][hInt]);
                 SetPlayerVirtualWorld(playerid,idx+50);
                 break;
             }
             else { GameTextForPlayer(playerid,"~r~CLOSED",5000,1); break; }
         }
         else if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[idx][hExitX],HouseInfo[idx][hExitY],HouseInfo[idx][hExitZ]) && GetPlayerVirtualWorld(playerid) == idx+50)
         {
             SetPlayerPosAC(playerid,HouseInfo[idx][hEnterX],HouseInfo[idx][hEnterY],HouseInfo[idx][hEnterZ]);
             SetPlayerInterior(playerid,0);
             SetPlayerVirtualWorld(playerid,0);
             break;
         }
     }
}


Идем дальше.
Теперь мы создадим 2 коллбэка, отвечающих за загрузку и сохранение домов
Код
public OnHousesLoad() // Коллбэк загрузки
{
     new time = GetTickCount();
     new string[128],klass[2];
     new temp[32],rows,fields;
     cache_get_data(rows,fields,connectionHandle);
     if(rows)
     {
         for(new idx = 1; idx <= rows; idx++)
         {
             cache_get_field_content(idx-1,"hID",temp,connectionHandle), HouseInfo[idx] [hID]= strval(temp);
             cache_get_field_content(idx-1,"hOwned",temp,connectionHandle), HouseInfo[idx] [hOwned]= strval(temp);
             cache_get_field_content(idx-1,"hOwner",HouseInfo[idx][hOwner],connectionHandle,24);
             cache_get_field_content(idx-1,"hEnterX",temp,connectionHandle), HouseInfo[idx] [hEnterX]= floatstr(temp);
             cache_get_field_content(idx-1,"hEnterY",temp,connectionHandle), HouseInfo[idx] [hEnterY]= floatstr(temp);
             cache_get_field_content(idx-1,"hEnterZ",temp,connectionHandle), HouseInfo[idx] [hEnterZ]= floatstr(temp);
             cache_get_field_content(idx-1,"hExitX",temp,connectionHandle), HouseInfo[idx] [hExitX]= floatstr(temp);
             cache_get_field_content(idx-1,"hExitY",temp,connectionHandle), HouseInfo[idx] [hExitY]= floatstr(temp);
             cache_get_field_content(idx-1,"hExitZ",temp,connectionHandle), HouseInfo[idx] [hExitZ]= floatstr(temp);
             cache_get_field_content(idx-1,"hLevel",temp,connectionHandle), HouseInfo[idx] [hLevel]= strval(temp);
             cache_get_field_content(idx-1,"hPrice",temp,connectionHandle), HouseInfo[idx] [hPrice]= strval(temp);
             cache_get_field_content(idx-1,"hLock",temp,connectionHandle), HouseInfo[idx] [hLock]= strval(temp);
             cache_get_field_content(idx-1,"hTakings",temp,connectionHandle), HouseInfo[idx] [hTakings]= strval(temp);
             cache_get_field_content(idx-1,"hInt",temp,connectionHandle), HouseInfo[idx] [hInt]= strval(temp);
             cache_get_field_content(idx-1,"hHel",temp,connectionHandle), HouseInfo[idx] [hHel]= strval(temp);
             cache_get_field_content(idx-1,"hClass",temp,connectionHandle), HouseInfo[idx] [hClass]= strval(temp);
             TOTALHOUSES++;
             if(HouseInfo[idx] [hOwned]== 0)
             {
                 HouseInfo[idx] [hPickupID]= CreatePickupAC(1273, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
                 HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 31, COLOR_WHITE, 0, -1, -1, 200.0);
                 switch(HouseInfo[idx][hClass])
                 {
                 case 0: klass = "E";
                 case 1: klass = "D";
                 case 2: klass = "C";
                 case 3: klass = "B";
                 case 4: klass = "A";
                 case 5: klass = "S";
                 }
                 format(string,256,"Номер дома: %i\nЦена: %i долларов\nКласс: %s",idx,HouseInfo[idx][hPrice],klass);
                 HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_YELLOW,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
             }
             else
             {
                 HouseInfo[idx] [hPickupID]= CreatePickupAC(1272, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
                 HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 32, COLOR_WHITE, 0, -1, -1, 200.0);
                 switch(HouseInfo[idx][hClass])
                 {
                 case 0: klass = "E";
                 case 1: klass = "D";
                 case 2: klass = "C";
                 case 3: klass = "B";
                 case 4: klass = "A";
                 case 5: klass = "S";
                 }
                 format(string,256,"Номер дома: %i\nВладелец: %s\nКласс: %s",idx,HouseInfo[idx][hOwner],klass);
                 HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_LIGHTRED,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
             }
         }
     }
     printf("[Загружено домов]: <%i>. Времени затрачено: <%i мс>",TOTALHOUSES,GetTickCount()-time);
     return true;
}

public OnHouseSave(houseid)
{
     new string[32],query[256];
     format(string,sizeof(string),"UPDATE `"TABLE_HOUSES"` SET "),strcat(query,string);
     format(string,sizeof(string),"`hOwned` = '%i', ",HouseInfo[houseid][hOwned]),strcat(query,string);
     format(string,sizeof(string),"`hOwner` = '%s', ",HouseInfo[houseid][hOwner]),strcat(query,string);
     format(string,sizeof(string),"`hEnterX` = '%f', ",HouseInfo[houseid][hEnterX]),strcat(query,string);
     format(string,sizeof(string),"`hEnterY` = '%f', ",HouseInfo[houseid][hEnterY]),strcat(query,string);
     format(string,sizeof(string),"`hEnterZ` = '%f', ",HouseInfo[houseid][hEnterZ]),strcat(query,string);
     format(string,sizeof(string),"`hExitX` = '%f', ",HouseInfo[houseid][hExitX]),strcat(query,string);
     format(string,sizeof(string),"`hExitY` = '%f', ",HouseInfo[houseid][hExitY]),strcat(query,string);
     format(string,sizeof(string),"`hExitZ` = '%f', ",HouseInfo[houseid][hExitZ]),strcat(query,string);
     format(string,sizeof(string),"`hLevel` = '%i', ",HouseInfo[houseid][hLevel]),strcat(query,string);
     format(string,sizeof(string),"`hPrice` = '%i', ",HouseInfo[houseid][hPrice]),strcat(query,string);
     format(string,sizeof(string),"`hLock` = '%i', ",HouseInfo[houseid][hLock]),strcat(query,string);
     format(string,sizeof(string),"`hTakings` = '%i', ",HouseInfo[houseid][hTakings]),strcat(query,string);
     format(string,sizeof(string),"`hInt` = '%i', ",HouseInfo[houseid][hInt]),strcat(query,string);
     format(string,sizeof(string),"`hHel` = '%i', ",HouseInfo[houseid][hHel]),strcat(query,string);
     format(string,sizeof(string),"`hClass` = '%i' ",HouseInfo[houseid][hClass]),strcat(query,string);
     format(string,sizeof(string),"WHERE `hID` = '%i'",HouseInfo[houseid][hID]),strcat(query,string);
     mysql_function_query(connectionHandle,query,false,"","");
     return true;
}


Наши коллбэки созданы. Кстати, чуть не забыл, ID купленного дома сохранятся в аккаунте игрока, поэтому, где `enum pInfo` или что-либо подобное прописываем `pHouseKey`. Эта переменная отвечает за ID купленного дома. По умолчанию эта переменная должны быть равна `-1`. Ладно, двигаемся дальше

В функцию, отвечающую за спавн игрока, или в `public OnPlayerSpawn(playerid)` прописываем следующее:
Код
if(PlayerInfo[playerid] [pHouseKey]!= -1)
{
     new h = PlayerInfo[playerid][pHouseKey];
     SetPlayerPosAC(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
     SetPlayerFacingAngle(playerid,270.0000);
     SetPlayerInterior(playerid,HouseInfo[h][hInt]);
     SetPlayerVirtualWorld(playerid,h+50);
}


Дальше мы создадим функцию, отвечающую за обновление 3D Текстов
Код
stock Update3DTexts()
{
     new string[128];
     for(new i = 1; i <= TOTALHOUSES; i++)
     {
         new klass[2];
         DestroyDynamicMapIcon(HouseInfo[idx][hIconID]);
         DestroyPickup(HouseInfo[idx][hPickupID]);
         Delete3DTextLabel(HouseInfo[idx][hTextID]);
         if(HouseInfo[idx] [hOwned]== 0)
         {
             HouseInfo[idx] [hPickupID]= CreatePickupAC(1273, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
             HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 31, COLOR_WHITE, 0, -1, -1, 100.0);
             switch(HouseInfo[idx][hClass])
             {
             case 0: klass = "E";
             case 1: klass = "D";
             case 2: klass = "C";
             case 3: klass = "B";
             case 4: klass = "A";
             case 5: klass = "S";
             }
             format(string,sizeof(string),"Номер дома: %i\nЦена: %i долларов\nКласс: %s",idx,HouseInfo[idx][hPrice],klass);
             HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_YELLOW,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
         }
         else
         {
             HouseInfo[idx] [hPickupID]= CreatePickupAC(1272, 23, HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],-1);
             HouseInfo[idx] [hIconID]= CreateDynamicMapIcon(HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ], 32, COLOR_WHITE, 0, -1, -1, 100.0);
             switch(HouseInfo[idx][hClass])
             {
             case 0: klass = "E";
             case 1: klass = "D";
             case 2: klass = "C";
             case 3: klass = "B";
             case 4: klass = "A";
             case 5: klass = "S";
             }
             format(string,sizeof(string),"Номер дома: %i\nВладелец: %s\nКласс: %s",idx,HouseInfo[idx][hOwner],klass);
             HouseInfo[idx] [hTextID]= Create3DTextLabel(string,COLOR_LIGHTRED,HouseInfo[idx][hEnterX], HouseInfo[idx][hEnterY], HouseInfo[idx][hEnterZ],20.0,0,1);
         }
     }
}


Ну, мы практически подошли к концу, осталось только создать команды.
Я использовал командный процессор от Kazon'a "LIFE-CMD".

Автор - Kronos
Дата добавления - 13.07.2014 в 20:02
KronosДата: Воскресенье, 13.07.2014, 20:02 | Сообщение # 2
Местный мазафака
Сообщений: 117
Награды: 0
Репутация: 10
В конец мода вставляем (!LIFE-CMD)
Код
CMD:buyhouse(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     if(PlayerInfo[playerid] [pHouseKey]!= -1) return SendMes(playerid,COLOR_GRAD1," У вас уже есть дом. Введите /sellhouse, чтобы его продать");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
         {
             if(HouseInfo[h] [hOwned]== 1) SendMes(playerid,COLOR_GRAD2,"В этом доме уже кто-то проживает");
             if(PlayerInfo[playerid] [pBank]< HouseInfo[h][hPrice]) return SendMes(playerid,COLOR_GRAD1," У вас недостаточно денег на покупку дома");
             PlayerInfo[playerid] [pHouseKey]= h;
             HouseInfo[h] [hOwned]= 1;
             HouseInfo[h] [hHel]= 0;
             HouseInfo[h] [hTakings]= 50*(HouseInfo[h][hClass]+1)*2;
             strmid(HouseInfo[h][hOwner], PlayerInfo[playerid][pNick], 0, strlen(PlayerInfo[playerid][pNick]), 255);
             PlayerInfo[playerid] [pBank]-= HouseInfo[h][hPrice];
             SetPlayerPosAC(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
             SetPlayerInterior(playerid,HouseInfo[h][hInt]);
             SetPlayerVirtualWorld(playerid,h+50);
             SendMes(playerid,COLOR_WHITE," Поздравляем с покупкой!");
             SendMes(playerid,COLOR_YELLOW," Внимание! Теперь каждый час со счёта вашего дома будут снимать комунальные платежи в размере %i долларов",50*(HouseInfo[h][hClass]+1));
             SendMes(playerid,COLOR_YELLOW," Если на счету недостаточно денег, вас выселят");
             SendMes(playerid,COLOR_YELLOW," Пополнить домашний счёт или узнать баланс можно через банк/банкомат (помощь: /help -> команды)");
             Update3DTexts();
             OnHouseSave(h);
             break;
         }
     }
     return true;
}
CMD:sellhouse(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     if(PlayerInfo[playerid] [pHouseKey]== -1)    return SendMes(playerid,COLOR_GRAD1," В не владеете недвижимостью");
     new h = PlayerInfo[playerid][pHouseKey];
     PlayerInfo[playerid] [pHouseKey]= -1;
     strmid(HouseInfo[h][hOwner], "The State", 0, strlen("The State"), 255);
     PlayerInfo[playerid] [pBank]+= HouseInfo[h][hPrice]+HouseInfo[h][hTakings];
     HouseInfo[h] [hOwned]= 0;
     HouseInfo[h] [hHel]= 0;
     HouseInfo[h] [hTakings]= 0;
     HouseInfo[h] [hLock]= 1;
     SendMes(playerid,COLOR_LIGHTGREEN," Поздравляем вас с продажей дома!");
     SendMes(playerid,COLOR_WHITE," Выручка с продажи дома составила %i долларов",HouseInfo[h][hPrice]);
     SendMes(playerid,COLOR_WHITE," Деньги были переведены на ваш банковский счет");
     Update3DTexts();
     OnHouseSave(h);
     return true;
}
CMD:open(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     if(PlayerInfo[playerid] [pHouseKey]== -1)    return SendMes(playerid,COLOR_GRAD1," В не владеете недвижимостью");
     new h = PlayerInfo[playerid][pHouseKey];
     if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
     {
         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); }
         }
     }
     else
     {
         SendMes(playerid,COLOR_GRAD1," Необходимо находиться возле своего дома");
         return true;
     }
     return true;
}
CMD:enter(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
         {
             if(HouseInfo[h] [hLock]== 0) {
                 SetPlayerPosAC(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
                 SetPlayerInterior(playerid,HouseInfo[h][hInt]);
                 SetPlayerVirtualWorld(playerid,h+50);
                 return true;
             }
             else return GameTextForPlayer(playerid,"~r~CLOSED",5000,1);
         }
     }
     return true;
}
CMD:exit(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]) && GetPlayerVirtualWorld(playerid) == h+50)
         {
             SetPlayerPosAC(playerid,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]);
             SetPlayerInterior(playerid,0);
             SetPlayerVirtualWorld(playerid,0);
             return true;
         }
     }
     return true;
}
CMD:healme(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]) && GetPlayerVirtualWorld(playerid) == h+50)
         {
             new Float:health;
             GetPlayerHealth(playerid,health);
             if(health >= 100) return SendMes(playerid,COLOR_WHITE," Вы не нуждаетесь в лечении");
             if(HouseInfo[h] [hHel]< 1) return SendMes(playerid,COLOR_WHITE," В этом доме нет аптечек");
             SetPlayerHealthAC(playerid,100.0);
             HouseInfo[h][hHel]--;
             if(!strcmp(HouseInfo[h][hOwner],PlayerInfo[playerid][pNick],false)) SendMes(playerid,COLOR_BLUE," Вы использовали одну аптечку. Осталось аптечек: %i",HouseInfo[h][hHel]);
             else SendMes(playerid,COLOR_BLUE," Вы использовали одну аптечку");
             format(ministring,sizeof(ministring)," %s использовал аптечку",PlayerInfo[playerid][pNick]);
             ProxDetectorNew(30.0,playerid,ministring,COLOR_PURPLE);
             return true;
         }
     }
     SendMes(playerid,COLOR_GRAD1," Вы должны находиться в каком-либо доме");
     return true;
}
CMD:hinfo(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]) && GetPlayerVirtualWorld(playerid) == h+50)
         {
             if(strcmp(HouseInfo[h][hOwner],PlayerInfo[playerid][pNick],false) != 0) return SendMes(playerid,COLOR_GRAD1," Вы не можете посмотреть информацию о этом доме");
             format(bigstring,sizeof(bigstring),"{ffffff}Информация о доме\n\n\tСостояние: %s\n\tАптечек: {33aaff}%i{ffffff} штук\n\tДомашний счет: {33aaff}%i{ffffff} долларов",!HouseInfo[h] [hLock]? ("{33aa33}Открыт{ffffff}") : ("{ff6347}Закрыт{ffffff}"),HouseInfo[h][hHel],HouseInfo[h][hTakings]);
             ShowPlayerDialog(playerid,D_NULL,DIALOG_STYLE_MSGBOX," ",bigstring,"Закрыть","");
             return true;
         }
     }
     SendMes(playerid,COLOR_GRAD1," Вы должны находиться в каком-либо доме");
     return true;
}


На этом все, возникнут проблемы/ошибки - обращайтесь!
ЗЫ: Тут не сделана система платежей за квартиру и система снятия денег с домашнего счета, так как я не знаю, как у вас реализован банкомат банк и пэйдэй.


СообщениеВ конец мода вставляем (!LIFE-CMD)
Код
CMD:buyhouse(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     if(PlayerInfo[playerid] [pHouseKey]!= -1) return SendMes(playerid,COLOR_GRAD1," У вас уже есть дом. Введите /sellhouse, чтобы его продать");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
         {
             if(HouseInfo[h] [hOwned]== 1) SendMes(playerid,COLOR_GRAD2,"В этом доме уже кто-то проживает");
             if(PlayerInfo[playerid] [pBank]< HouseInfo[h][hPrice]) return SendMes(playerid,COLOR_GRAD1," У вас недостаточно денег на покупку дома");
             PlayerInfo[playerid] [pHouseKey]= h;
             HouseInfo[h] [hOwned]= 1;
             HouseInfo[h] [hHel]= 0;
             HouseInfo[h] [hTakings]= 50*(HouseInfo[h][hClass]+1)*2;
             strmid(HouseInfo[h][hOwner], PlayerInfo[playerid][pNick], 0, strlen(PlayerInfo[playerid][pNick]), 255);
             PlayerInfo[playerid] [pBank]-= HouseInfo[h][hPrice];
             SetPlayerPosAC(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
             SetPlayerInterior(playerid,HouseInfo[h][hInt]);
             SetPlayerVirtualWorld(playerid,h+50);
             SendMes(playerid,COLOR_WHITE," Поздравляем с покупкой!");
             SendMes(playerid,COLOR_YELLOW," Внимание! Теперь каждый час со счёта вашего дома будут снимать комунальные платежи в размере %i долларов",50*(HouseInfo[h][hClass]+1));
             SendMes(playerid,COLOR_YELLOW," Если на счету недостаточно денег, вас выселят");
             SendMes(playerid,COLOR_YELLOW," Пополнить домашний счёт или узнать баланс можно через банк/банкомат (помощь: /help -> команды)");
             Update3DTexts();
             OnHouseSave(h);
             break;
         }
     }
     return true;
}
CMD:sellhouse(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     if(PlayerInfo[playerid] [pHouseKey]== -1)    return SendMes(playerid,COLOR_GRAD1," В не владеете недвижимостью");
     new h = PlayerInfo[playerid][pHouseKey];
     PlayerInfo[playerid] [pHouseKey]= -1;
     strmid(HouseInfo[h][hOwner], "The State", 0, strlen("The State"), 255);
     PlayerInfo[playerid] [pBank]+= HouseInfo[h][hPrice]+HouseInfo[h][hTakings];
     HouseInfo[h] [hOwned]= 0;
     HouseInfo[h] [hHel]= 0;
     HouseInfo[h] [hTakings]= 0;
     HouseInfo[h] [hLock]= 1;
     SendMes(playerid,COLOR_LIGHTGREEN," Поздравляем вас с продажей дома!");
     SendMes(playerid,COLOR_WHITE," Выручка с продажи дома составила %i долларов",HouseInfo[h][hPrice]);
     SendMes(playerid,COLOR_WHITE," Деньги были переведены на ваш банковский счет");
     Update3DTexts();
     OnHouseSave(h);
     return true;
}
CMD:open(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     if(PlayerInfo[playerid] [pHouseKey]== -1)    return SendMes(playerid,COLOR_GRAD1," В не владеете недвижимостью");
     new h = PlayerInfo[playerid][pHouseKey];
     if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
     {
         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); }
         }
     }
     else
     {
         SendMes(playerid,COLOR_GRAD1," Необходимо находиться возле своего дома");
         return true;
     }
     return true;
}
CMD:enter(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
         {
             if(HouseInfo[h] [hLock]== 0) {
                 SetPlayerPosAC(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
                 SetPlayerInterior(playerid,HouseInfo[h][hInt]);
                 SetPlayerVirtualWorld(playerid,h+50);
                 return true;
             }
             else return GameTextForPlayer(playerid,"~r~CLOSED",5000,1);
         }
     }
     return true;
}
CMD:exit(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]) && GetPlayerVirtualWorld(playerid) == h+50)
         {
             SetPlayerPosAC(playerid,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]);
             SetPlayerInterior(playerid,0);
             SetPlayerVirtualWorld(playerid,0);
             return true;
         }
     }
     return true;
}
CMD:healme(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]) && GetPlayerVirtualWorld(playerid) == h+50)
         {
             new Float:health;
             GetPlayerHealth(playerid,health);
             if(health >= 100) return SendMes(playerid,COLOR_WHITE," Вы не нуждаетесь в лечении");
             if(HouseInfo[h] [hHel]< 1) return SendMes(playerid,COLOR_WHITE," В этом доме нет аптечек");
             SetPlayerHealthAC(playerid,100.0);
             HouseInfo[h][hHel]--;
             if(!strcmp(HouseInfo[h][hOwner],PlayerInfo[playerid][pNick],false)) SendMes(playerid,COLOR_BLUE," Вы использовали одну аптечку. Осталось аптечек: %i",HouseInfo[h][hHel]);
             else SendMes(playerid,COLOR_BLUE," Вы использовали одну аптечку");
             format(ministring,sizeof(ministring)," %s использовал аптечку",PlayerInfo[playerid][pNick]);
             ProxDetectorNew(30.0,playerid,ministring,COLOR_PURPLE);
             return true;
         }
     }
     SendMes(playerid,COLOR_GRAD1," Вы должны находиться в каком-либо доме");
     return true;
}
CMD:hinfo(playerid,params[])
{
     if(!IsPlayerLogged(playerid)) return SendMes(playerid,COLOR_WHITE," Необходимо авторизоваться");
     for(new h = 1; h <= TOTALHOUSES; h++)
     {
         if(IsPlayerInRangeOfPoint(playerid,5.0,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]) && GetPlayerVirtualWorld(playerid) == h+50)
         {
             if(strcmp(HouseInfo[h][hOwner],PlayerInfo[playerid][pNick],false) != 0) return SendMes(playerid,COLOR_GRAD1," Вы не можете посмотреть информацию о этом доме");
             format(bigstring,sizeof(bigstring),"{ffffff}Информация о доме\n\n\tСостояние: %s\n\tАптечек: {33aaff}%i{ffffff} штук\n\tДомашний счет: {33aaff}%i{ffffff} долларов",!HouseInfo[h] [hLock]? ("{33aa33}Открыт{ffffff}") : ("{ff6347}Закрыт{ffffff}"),HouseInfo[h][hHel],HouseInfo[h][hTakings]);
             ShowPlayerDialog(playerid,D_NULL,DIALOG_STYLE_MSGBOX," ",bigstring,"Закрыть","");
             return true;
         }
     }
     SendMes(playerid,COLOR_GRAD1," Вы должны находиться в каком-либо доме");
     return true;
}


На этом все, возникнут проблемы/ошибки - обращайтесь!
ЗЫ: Тут не сделана система платежей за квартиру и система снятия денег с домашнего счета, так как я не знаю, как у вас реализован банкомат банк и пэйдэй.

Автор - Kronos
Дата добавления - 13.07.2014 в 20:02
Форум » Pawn - скриптинг » Мануалы/уроки » MySQL » [Мануал] Система домов для new.pwn [MySQL ~R7~]
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Revision by www.GTA-ONE.ru
Copyright © 2024 |