Перейти к содержанию
Авторизация  
Smolin

Система динамических входов/выходов

Рекомендуемые сообщения

Smolin
Ко всем forward 
forward SaveEnters();
forward LoadEnters();
 
Ко всем define
#define MAX_ENTERS 200
 
Если нету, то добавить
#define COLOR_LIGHTBLUE 0x33CCFFAA
#define COLOR_GREY 0xAFAFAFAA
 
Ко всем enum или после глобальных переменных
enum eInfo
{
eEnPickup,
eExPickup,
Float:eEnter_x,
Float:eEnter_y,
Float:eEnter_z,
Float:eExit_x,
Float:eExit_y,
Float:eExit_z,
eEnInterior,
eExInterior,
};
new EnterInfo[MAX_ENTERS][eInfo];
new editenter[MAX_PLAYERS];
new enterpickup[sizeof(EnterInfo)];
new exitpickup[sizeof(EnterInfo)];
 
В public OnGameModeInit
LoadEnters();
    for(new i = 0; i < sizeof(EnterInfo); i++)
    {
        if(EnterInfo[i][eEnter_x] != 0 && EnterInfo[i][eEnter_x] != 0 && EnterInfo[i][eExit_x] != 0 && EnterInfo[i][eExit_y] != 0)
        {
          enterpickup[i] = AddStaticPickup(EnterInfo[i][eEnPickup], 2, EnterInfo[i][eEnter_x], EnterInfo[i][eEnter_y], EnterInfo[i][eEnter_z], 0);
          exitpickup[i] = AddStaticPickup(EnterInfo[i][eExPickup], 2, EnterInfo[i][eExit_x], EnterInfo[i][eExit_y], EnterInfo[i][eExit_z], 0);
        }
    }
 
В public OnGameModeExit
for(new i = 0; i < sizeof(EnterInfo); i++)
    {
        if(EnterInfo[i][eEnter_x] != 0 && EnterInfo[i][eEnter_x] != 0 && EnterInfo[i][eExit_x] != 0 && EnterInfo[i][eExit_y] != 0)
        {
          DestroyPickup(enterpickup[i]);
          DestroyPickup(exitpickup[i]);
        }
    }
    SaveEnters();
 
В public OnPlayerCommandText
if(strcmp(cmd,"/newenter",true)==0)
{
   if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "Вы не администратор.");
   for(new i = 0; i < sizeof(EnterInfo); i++)
   {
       if(EnterInfo[i][eEnter_x] == 0 || EnterInfo[i][eEnter_y] == 0)
       {
           new Float:x, Float:y, Float:z;
           GetPlayerPos(playerid, x, y, z);
           EnterInfo[i][eEnter_x] = x;
                EnterInfo[i][eEnter_y] = y;
                EnterInfo[i][eEnter_z] = z;
                enterpickup[i] = CreatePickup(1318, 2, x, y, z);
SendClientMessage(playerid, 0x33AA33FF, "* Новый вход создан. Для дальнейшего редактирования входа используйте: /editenter.");
format(string, sizeof(string), "* Ид входа: %d", i);
SendClientMessage(playerid, 0x33AA33FF, string);
break;
       }
   }
   return 1;
}
if(strcmp(cmd,"/editenter",true)==0)
{
   if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFFFFFFFF, "Вы не администратор.");
ShowPlayerDialog(playerid, 800, 1, "Управление входом/выходом", "Введите ид входа:", "Дальше", "Отмена");
return 1;
}
 
В public OnDialogResponse
if(dialogid == 800)
{
   if(response)
   {
       new id = strval(inputtext);
if(id > -1 && id < sizeof(EnterInfo))
{
   editenter[playerid] = id;
   ShowPlayerDialog(playerid, 801, 2, "Управление входом/выходом", "Установить вход дома\nУстановить выход дома\nУстановить пикап входа\nУстановить пикап выхода\nУстановить интерьер при входе\nУстновить интерьер при выходе\nУдалить вход и выход", "Выбор", "Отмена");
}
else
{
   ShowPlayerDialog(playerid, 799, 0, "Управление входом/выходом", "Неверный ид входа", "Ок", "");
}
   }
   return 1;
}
if(dialogid == 801)
{
   if(response)
   {
       switch(listitem)
       {
           case 0:
           {
           new Float:x, Float:y, Float:z;
           GetPlayerPos(playerid, x, y, z);
               EnterInfo[editenter[playerid]][eEnter_x] = x;
               EnterInfo[editenter[playerid]][eEnter_y] = y;
               EnterInfo[editenter[playerid]][eEnter_z] = z;
               EnterInfo[editenter[playerid]][eEnInterior] = GetPlayerInterior(playerid);
               if(EnterInfo[editenter[playerid]][eEnPickup] == 0)
               {
                   EnterInfo[editenter[playerid]][eEnPickup] = 1318;
               }
if(enterpickup[editenter[playerid]] != 0)
{
   DestroyPickup(enterpickup[editenter[playerid]]);
}
enterpickup[editenter[playerid]] = CreatePickup(EnterInfo[editenter[playerid]][eEnPickup], 2, x, y, z);
               format(string, sizeof(string), "* Вход %d установлен.", editenter[playerid]);
               SendClientMessage(playerid, 0x33AA33FF, string);
               SaveEnters();
           }
           case 1:
           {
           new Float:x, Float:y, Float:z;
           GetPlayerPos(playerid, x, y, z);
               EnterInfo[editenter[playerid]][eExit_x] = x;
               EnterInfo[editenter[playerid]][eExit_y] = y;
               EnterInfo[editenter[playerid]][eExit_z] = z;
               EnterInfo[editenter[playerid]][eExInterior] = GetPlayerInterior(playerid);
               if(EnterInfo[editenter[playerid]][eExPickup] == 0)
               {
                   EnterInfo[editenter[playerid]][eExPickup] = 1318;
               }
if(exitpickup[editenter[playerid]] != 0)
{
   DestroyPickup(exitpickup[editenter[playerid]]);
}
exitpickup[editenter[playerid]] = CreatePickup(EnterInfo[editenter[playerid]][eExPickup], 2, x, y, z);
               format(string, sizeof(string), "* Выход %d установлен.", editenter[playerid]);
               SendClientMessage(playerid, 0x33AA33FF, string);
               SaveEnters();
           }
           case 2:
           {
ShowPlayerDialog(playerid, 802, 1, "Управление входом/выходом", "Введите ид пикапа входа", "Ок", "Отмена");
           }
           case 3:
           {
               ShowPlayerDialog(playerid, 803, 1, "Управление входом/выходом", "Введите ид пикапа выхода", "Ок", "Отмена");
           }
           case 4:
           {
               ShowPlayerDialog(playerid, 805, 1, "Управление входом/выходом", "Введите интерьер при входе", "Ок", "Отмена");
           }
           case 5:
           {
               ShowPlayerDialog(playerid, 806, 1, "Управление входом/выходом", "Введите интерьер при выходе", "Ок", "Отмена");
           }
case 6:
{
   format(string, sizeof(string), "Вы действительно хотите удалить вход и выход под идом %d?", editenter[playerid]);
   ShowPlayerDialog(playerid, 804, 0, "Управление входом/выходом", string, "Да", "Нет");
}
       }
   }
return 1;
}
if(dialogid == 802)
{
   if(response)
   {
       new newid = strval(inputtext);
       if(newid > 0)
       {
EnterInfo[editenter[playerid]][eEnPickup] = newid;
if(enterpickup[editenter[playerid]] != 0)
{
   DestroyPickup(enterpickup[editenter[playerid]]);
}
enterpickup[editenter[playerid]] = CreatePickup(newid, 2, EnterInfo[editenter[playerid]][eEnter_x], EnterInfo[editenter[playerid]][eEnter_y], EnterInfo[editenter[playerid]][eEnter_z]);
format(string, sizeof(string), "* Пикап входа %d установлен: %d.", editenter[playerid], newid);
SendClientMessage(playerid, 0x33AA33FF, string);
SaveEnters();
       }
       else
       {
           ShowPlayerDialog(playerid, 799, 0, "Управление входом/выходом", "Неверный ид пикапа", "Ок", "");
       }
   }
   return 1;
}
if(dialogid == 803)
{
   if(response)
   {
       new newid = strval(inputtext);
       if(newid > 0)
       {
EnterInfo[editenter[playerid]][eExPickup] = newid;
if(exitpickup[editenter[playerid]] != 0)
{
   DestroyPickup(exitpickup[editenter[playerid]]);
}
exitpickup[editenter[playerid]] = CreatePickup(newid, 2, EnterInfo[editenter[playerid]][eExit_x], EnterInfo[editenter[playerid]][eExit_y], EnterInfo[editenter[playerid]][eExit_z]);
format(string, sizeof(string), "* Пикап выхода %d установлен: %d.", editenter[playerid], newid);
SendClientMessage(playerid, 0x33AA33FF, string);
SaveEnters();
       }
       else
       {
           ShowPlayerDialog(playerid, 799, 0, "Управление входом/выходом", "Неверный ид пикапа", "Ок", "");
       }
   }
   return 1;
}
if(dialogid == 805)
{
   if(response)
   {
       new inter = strval(inputtext);
EnterInfo[editenter[playerid]][eEnInterior] = inter;
format(string, sizeof(string), "* Интерьер входа %d установлен: %d.", editenter[playerid], inter);
SendClientMessage(playerid, 0x33AA33FF, string);
SaveEnters();
   }
   return 1;
}
if(dialogid == 806)
{
   if(response)
   {
       new inter = strval(inputtext);
EnterInfo[editenter[playerid]][eExInterior] = inter;
format(string, sizeof(string), "* Интерьер выхода %d установлен: %d.", editenter[playerid], inter);
SendClientMessage(playerid, 0x33AA33FF, string);
SaveEnters();
   }
   return 1;
}
if(dialogid == 804)
{
   if(response)
   {
       EnterInfo[editenter[playerid]][eEnter_x] = 0;
       EnterInfo[editenter[playerid]][eEnter_y] = 0;
       EnterInfo[editenter[playerid]][eEnter_z] = 0;
       EnterInfo[editenter[playerid]][eExit_x] = 0;
       EnterInfo[editenter[playerid]][eExit_y] = 0;
       EnterInfo[editenter[playerid]][eExit_z] = 0;
       EnterInfo[editenter[playerid]][eEnPickup] = 0;
       EnterInfo[editenter[playerid]][eEnPickup] = 0;
       if(enterpickup[editenter[playerid]] != 0)
       {
           DestroyPickup(enterpickup[editenter[playerid]]);
       }
       if(exitpickup[editenter[playerid]] != 0)
       {
           DestroyPickup(exitpickup[editenter[playerid]]);
       }
format(string, sizeof(string), "Вход и выход под идом %d удален", editenter[playerid]);
ShowPlayerDialog(playerid, 799, 0, "Управление входом/выходом", string, "Ок", "");
SaveEnters();
       return 1;
   }
}
 
В public OnPlayerKeyStateChange
if(newkeys == 1024)
{
for(new i = 0; i < sizeof(EnterInfo); i++)
{
   if(IsPlayerInRangeOfPoint(playerid, 1.0, EnterInfo[i][eEnter_x], EnterInfo[i][eEnter_y], EnterInfo[i][eEnter_z]))
   {
       SetPlayerInterior(playerid, EnterInfo[i][eEnInterior]);
       SetPlayerPos(playerid, EnterInfo[i][eExit_x], EnterInfo[i][eExit_y], EnterInfo[i][eExit_z]);
       break;
   }
   else if(IsPlayerInRangeOfPoint(playerid, 1.0, EnterInfo[i][eExit_x], EnterInfo[i][eExit_y], EnterInfo[i][eExit_z]))
   {
       SetPlayerInterior(playerid, EnterInfo[i][eExInterior]);
       SetPlayerPos(playerid, EnterInfo[i][eEnter_x], EnterInfo[i][eEnter_y], EnterInfo[i][eEnter_z]);
       break;
   }
}
}
 
В конец мода
public LoadEnters()
{
    new arrCoords[10][64];
    new strFromFile2[256];
    new File: file = fopen("enters.cfg", io_read);
if (file)
{
   new idx;
while (idx < sizeof(EnterInfo))
{
fread(file, strFromFile2);
split(strFromFile2, arrCoords, '|');
    EnterInfo[idx][eEnPickup] = strval(arrCoords[0]);
    EnterInfo[idx][eExPickup] = strval(arrCoords[1]);
    EnterInfo[idx][eEnter_x] = floatstr(arrCoords[2]);
    EnterInfo[idx][eEnter_y] = floatstr(arrCoords[3]);
    EnterInfo[idx][eEnter_z] = floatstr(arrCoords[4]);
    EnterInfo[idx][eExit_x] = floatstr(arrCoords[5]);
    EnterInfo[idx][eExit_y] = floatstr(arrCoords[6]);
    EnterInfo[idx][eExit_z] = floatstr(arrCoords[7]);
    EnterInfo[idx][eEnInterior] = strval(arrCoords[8]);
    EnterInfo[idx][eExInterior] = strval(arrCoords[9]);
idx++;
}
fclose(file);
}
return 1;
}
public SaveEnters()
{
new idx;
new File: file2;
while (idx < sizeof(EnterInfo))
{
new coordsstring[256];
format(coordsstring, sizeof(coordsstring), "%d|%d|%f|%f|%f|%f|%f|%f|%d|%d\n",
EnterInfo[idx][eEnPickup],
  EnterInfo[idx][eExPickup],
   EnterInfo[idx][eEnter_x],
     EnterInfo[idx][eEnter_y],
     EnterInfo[idx][eEnter_z],
     EnterInfo[idx][eExit_x],
     EnterInfo[idx][eExit_y],
     EnterInfo[idx][eExit_z],
EnterInfo[idx][eEnInterior],
EnterInfo[idx][eExInterior]);
if(idx == 0)
{
file2 = fopen("enters.cfg", io_write);
}
else
{
file2 = fopen("enters.cfg", io_append);
}
fwrite(file2, coordsstring);
idx++;
fclose(file2);
}
return 1;
}

uZEudkf8Hj4.jpgI1SBqtZbO2g.jpgboQk7opQDn4.jpg

 

P.S: ServerUnknown вывелось из-за неверной команды)

 

Автор: Calipso

  • Like 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
#AMG

Красавчик,для новичков как раз :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.