• Страница 1 из 1
  • 1
Мануал по созданию фракции "Пожарники"
Дмитрий Дата: Четверг, 29.03.2012, 22:24 | Сообщение # 1 | Сообщить о нерабочей теме


Аватар для Дмитрий

Вообщем, делал, по скрип, сдесь не надо тупо стоять у огня и вводить команду, а сдесь просто тушите  Вообщем сообщается в чат Пожарникам если есть гдето пожар,
потом ктото принимает его, ну и появляется чекпоинт, приезжаете тушите.
Начнем!

Ко всем forward'ам добавляем:

Код
forward ActivateFire(); // сама функция создания пожара


Ко всем stock'ам добавляем:

Код
stock CreateFire(Float:X1, Float:Y1, Float:Z1, Float:R1, Float:X2, Float:Y2, Float:Z2, Float:R2, Float:X3, Float:Y3, Float:Z3, Float:R3, Float:X4, Float:Y4, Float:Z4, Float:R4, Float:X5, Float:Y5, Float:Z5, Float:R5)
{
      fob[0] = CreateObject(18691, X1, Y1, Z1 - 1, 0, 0, R1, 1000.00);
      fob[1] = CreateObject(18691, X2, Y2, Z2 - 1, 0, 0, R2, 1000.00);
      fob[2] = CreateObject(18691, X3, Y3, Z3 - 1, 0, 0, R3, 1000.00);
      fob[3] = CreateObject(18691, X4, Y4, Z4 - 1, 0, 0, R4, 1000.00);
      fob[4] = CreateObject(18691, X5, Y5, Z5 - 1, 0, 0, R5, 1000.00);
      FireInProgress = true;
      FireStatus = 100;
      return 1;
}

stock KillFire()
{
      DestroyObject(fob[0]), DestroyObject(fob[1]), DestroyObject(fob[2]), DestroyObject(fob[3]), DestroyObject(fob[4]);
      FireInProgress = false;
      FireStatus = 0;
}

stock Name(playerid) { new pl[24]; GetPlayerName(playerid,pl,24); return pl; }   


Ко всем define'ам:

Код
#define CHECKPOINT_FIRE 10


Потом ко всем new добавляем:

Код
new fob[5]; // обьекты огня
new timerfire; // таймер создания пожара
new bool:FireInProgress = false; // переменная показывающая есть ли сейчас пожар
new bool:bypahan[MAX_PLAYERS] = false; // переменная показывающая принял ли игрок пожар
new Float:cf[3]; // координаты куда будет ставиться чекпоинт
new FireStatus = 0; // статус пожара (из 100)   


Переменные мы все создали теперь приступаем к основной части.

В publicGameModeExitFunc() добавляем:

Код
KillTimer(timerfire); //при отключении сервера убираем таймер


Потом в public OnGameModeInit():

Код
timerfire = SetTimer("ActivateFire", 1200000, true); //1200000 - это в милисекундах, через сколько начинается следующий пожар, в данном случае через 20 минут   


Теперь Паблики, суем где нибудь biggrin  , лучше где все паблики:

Код
public ActivateFire()
{
      if(FireInProgress == true)
      {
          KillFire();
          return 1;
      }
   new fic[2] = {0,1}; // кол-во мест где случаются пожары, у меня их 2
   if(fic[random(sizeof(fic))] == 0) {cf[0] = 1328.3392; cf[1] = 374.2310; cf[2] = 22.2083; CreateFire(cf[0],cf[1],cf[2],17.0832, 1330.2943,373.6726,22.2083,342.6162, 1331.2371,373.4001,22.3450,342.6162, 1327.7349,374.5031,23.3252,357.3430, 1333.7506,373.8772,21.8448,35.8833);} // если пожар случился в 1 месте, то делаем там огонь
   else if(fic[random(sizeof(fic))] == 1) {cf[0] = 850.0212; cf[1] = -598.5781; cf[2] = 18.4219; CreateFire(cf[0],cf[1],cf[2],49.5991, 859.7880,-597.9085,18.4219,229.5991, 864.7535,-597.1085,18.3860,245.5447, 868.1580,-597.1082,18.3860,220.5228, 867.7120,-590.1864,17.9536,14.6138);}  // если пожар случился во 2 месте, то делаем там огонь   
      new string[90];
      format(string, sizeof(string), "Диспетчер: Случился пожар, вызываю на помощь (наберите /nofire чтобы принять вызов)");
SendFamilyMessage(23, TEAM_AZTECAS_COLOR, string); // ид моей фракции 23
      return 1;
}   


Сама команда:

Код

if(strcmp(cmd, "/nofire", true) == 0)
       {
      if(PlayerInfo[playerid][pMember] != 23 && PlayerInfo[playerid][pLeader] != 23) return SendClientMessage(playerid, COLOR_LIGHTRED, "Вы не пожарник!"); // 23 ид моей фракции
       if(FireInProgress == false) return SendClientMessage(playerid, COLOR_LIGHTRED, "Сейчас нету пожаров!");
        SetPlayerCheckpoint(playerid,cf[0],cf[1],cf[2],10.0);
      gPlayerCheckpointStatus[playerid] = CHECKPOINT_FIRE; // присваиваем чекпоинт пожара
      bypahan[playerid] = true;
       format(string, sizeof(string), "Пожарник %s принял вызов, он едет на помощь.",Name(playerid));
   SendFamilyMessage(23, COLOR_LIGHTBLUE, string); // 23 ид моей фракции
       }   


Код
if(newkeys == KEY_FIRE && bypahan[playerid] == true)
{
new Float:X1, Float:Y1, Float:Z1, Float:X2, Float:Y2, Float:Z2, Float:X3, Float:Y3, Float:Z3, Float:X4, Float:Y4, Float:Z4, Float:X5, Float:Y5, Float:Z5;

      GetObjectPos(fob[0], X1, Y1, Z1);
GetObjectPos(fob[1], X2, Y2, Z2);
GetObjectPos(fob[2], X3, Y3, Z3);
GetObjectPos(fob[3], X4, Y4, Z4);
GetObjectPos(fob[4], X5, Y5, Z5);
        
if(!IsPlayerInRangeOfPoint(playerid, 20.0, X1, Y1, Z1) || !IsPlayerInRangeOfPoint(playerid, 20.0, X2, Y2, Z2) || !IsPlayerInRangeOfPoint(playerid, 20.0, X3, Y3, Z3) || !IsPlayerInRangeOfPoint(playerid, 20.0, X4, Y4, Z4) || !IsPlayerInRangeOfPoint(playerid, 20.0, X5, Y5, Z5)) return SendClientMessage(playerid, 0xFFFFFFFF, "Чтобы потушить пожар вы должны находиться рядом с ним!");
if(PlayerInfo[playerid][pMember] == 23 || PlayerInfo[playerid][pLeader] == 23) // 23 ид моей фракции
      {
          if(FireStatus <= 0)
          {
              KillFire();
              new string[40+MAX_PLAYER_NAME];
              format(string, sizeof(string), "%s потушил пожар, едет обратно на базу",Name(playerid));
              SendFamilyMessage(23, TEAM_AZTECAS_COLOR, string);
              SendClientMessage(playerid,COLOR_WHITE,"Поздравляем! Вы потушили пожар!");
              bypahan[playerid] = false;
              return 1;
          }
          if(FireStatus < 80)
          {
              DestroyObject(fob[0]);
              return 1;
          }
          if(FireStatus < 60)
          {
              DestroyObject(fob[1]);
              return 1;
          }
          if(FireStatus < 40)
          {
              DestroyObject(fob[2]);
              return 1;
          }
          if(FireStatus < 20)
          {
              DestroyObject(fob[3]);
              return 1;
          }
          if(IsPlayerInAnyVehicle(playerid) == 1)
          {
              if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 407)
              {
                  FireStatus = FireStatus - 15;
              }
          }
          else if(GetPlayerWeapon(playerid) == 42)
          {
              FireStatus = FireStatus - 5;
          }
          else return 1;
      }
}    


Потом ищите строку switch (gPlayerCheckpointStatus[playerid]) и найдите примерно такой код чуть ниже:
Код


case CHECKPOINT_HOME:
              {
                  PlayerPlaySound(playerid, 1058, 0.0, 0.0, 0.0);
                  DisablePlayerCheckpoint(playerid);
                  gPlayerCheckpointStatus[playerid] = CHECKPOINT_NONE;
                  GameTextForPlayer(playerid, "~w~You are~n~~y~Home", 5000, 1);
              }   


И вставьте после скобки это:

Код
case CHECKPOINT_FIRE:
              {
                  PlayerPlaySound(playerid, 1058, 0.0, 0.0, 0.0);
                  DisablePlayerCheckpoint(playerid);
                  gPlayerCheckpointStatus[playerid] = CHECKPOINT_NONE;
                  SendClientMessage(playerid, COLOR_WHITE, "Теперь вы можете тушить пожар (( Огнетушителем или на Пожарной машине ))");
              }   


На этом данный урок завершен!

[admin]ps: если увидите примечание (// 23 ид фракции) то на этой строке измените 23 на ид своей фракции[/admin]


From Russia With Love!
  • Страница 1 из 1
  • 1
Поиск: