Дома HELP
#1

Код HTML:
LoadHouses(h)
{
        if(!fexist("houses/m_h.ini"))return print("[Ошибка] Файл houses/m_h.ini не найден"); // Проверяем наличие файла в scriptfiles/houses (если не найден, в лог сервера выдаст ошибку)
        new f=ini_openFile("houses/m_h.ini"); // открываем файл
        ini_getInteger(f,"Amount",m_h); // получаем точное значение созданных домов
        ini_closeFile(f); // закрываем этот файл
        if(!fexist("houses/houses.ini"))return print("[Ошибка] Файл houses/houses.ini не найден"); // проверяем наличие файла houses.ini в той же директории.
        f=ini_openFile("houses/houses.ini"); // открываем его
        new str[128];
		new string[256]; // создаем небольшой массив для дальнейшего форматирования строки (ключа в файле)
        for(new h=1;h<=m_h;h++) // запускаем цикл
        {
              format(str,sizeof(str),"ID %d",h); // форматируем строку для ключа в файле
              ini_getString(f,str,string); // получаем данные в виде строки
			  sscanf(string,"p<|>s[128]s[128]fffiiii",
			  HouseInfo[h][hDesc],
			  HouseInfo[h][hOwned],
			  HouseInfo[h][hEntrancex],
			  HouseInfo[h][hEntrancey],
			  HouseInfo[h][hEntrancez],
			  HouseInfo[h][hInt],
			  HouseInfo[h][hVirt],
			  HouseInfo[h][hValue],
			  HouseInfo[h][hLock],
              HouseInfo[h][hHealthx],
			  HouseInfo[h][hHealthy],
			  HouseInfo[h][hHealthz],
			  HouseInfo[h][hArmourx],
			  HouseInfo[h][hArmoury],
			  HouseInfo[h][hArmourz],
			  HouseInfo[h][hHel],
              HouseInfo[h][hArm],
			  HouseInfo[h][hRooms],
			  HouseInfo[h][hRent],
			  HouseInfo[h][hRentabil],
			  HouseInfo[h][hTakings],
			  HouseInfo[h][hDate],
			  HouseInfo[h][hLevel]); // распределяем данные по переменным (данные идут через символ "|", пример: Dom 1|2.612|213.132|2.321")
              if(!strcmp(HouseInfo[h][hOwned],"None",true)) // Сравниваем строки если владелец дома == None значит дом не куплен (в дальнейшем при создании владелец дома будет равен None)
              {
                 HouseInfo[h][hPick]=CreatePickup(1273,23,HouseInfo[h][hEntrancex],HouseInfo[h][hEntrancey],HouseInfo[h][hEntrancez],0); // Создаем пикап дома
                 format(string,sizeof(string),"{FBF8EF}[Дом {00FF00}продается{FBF8EF}]\nОписание: %s\nУровень: %d\nЦена: $%d",HouseInfo[h][hDesc],HouseInfo[h][hLevel],HouseInfo[h][hValue]); // Форматируем строку для 3D текста
                 HouseInfo[h][hText]=Create3DTextLabel(string,0xFFFFFFFF,HouseInfo[h][hEntrancex],HouseInfo[h][hEntrancey],HouseInfo[h][hEntrancez]+0.5,10.0,0,0); // Создаем 3D текст
              }
              else // Иначе, если владелец дома не равен None, значит дом куплен
              {
                 HouseInfo[h][hPick]=CreatePickup(1272,23,HouseInfo[h][hEntrancex],HouseInfo[h][hEntrancey],HouseInfo[h][hEntrancez],0); // Создаем пикап дома (модель пикапа уже другая)
                 format(string,sizeof(string),"{FBF8EF}[Дом {00FF00}занят{FBF8EF}]\nОписание: %s\nВладелец: %s",HouseInfo[h][hDesc],HouseInfo[h][hOwned]); // форматируем строку
                 HouseInfo[h][hText]=Create3DTextLabel(string,0xFFFFFFFF,HouseInfo[h][hEntrancex],HouseInfo[h][hEntrancey],HouseInfo[h][hEntrancez]+0.5,10.0,0,0); // И создаем 3D текст с информацией
              }
        }
        ini_closeFile(f); // Закрываем фай
        return printf("Loaded %d houses",m_h); // В лог чата возвращаем кол-во загруженных домов
}

SaveHouse(h) // Функция для сохранения данных дома в файл
{
        new f=ini_openFile("houses/houses.ini"); // открываем файл
        new str[128];
		new string[256]; // создаем массив для форматирования строки (для ключа, как в предыдущем случае)
        format(str,128,"ID %d",h); // форматируем строку
        format(string,sizeof(string),"%s|%s|%f|%f|%f|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|",
     	HouseInfo[h][hDesc],//1
		HouseInfo[h][hOwned],//2
		HouseInfo[h][hEntrancex],//3
		HouseInfo[h][hEntrancey],//4
		HouseInfo[h][hEntrancez],//5
		HouseInfo[h][hInt],//6
		HouseInfo[h][hVirt],//7
		HouseInfo[h][hValue],//8
		HouseInfo[h][hLock],//9
        HouseInfo[h][hHealthx],//10
		HouseInfo[h][hHealthy],//11
		HouseInfo[h][hHealthz],//12
		HouseInfo[h][hArmourx],//13
		HouseInfo[h][hArmoury],//14
		HouseInfo[h][hArmourz],//15
		HouseInfo[h][hHel],//16
        HouseInfo[h][hArm],//17
		HouseInfo[h][hRooms],//18
		HouseInfo[h][hRent],//19
		HouseInfo[h][hRentabil],//20
		HouseInfo[h][hTakings],//21
		HouseInfo[h][hDate],//22
		HouseInfo[h][hLevel]);//23 // снова форматируем строку (уже с информацией о доме); вот тут кстати, вы я думаю заметили, информация через "|"
        ini_setString(f,str,string); // записываем данные
        ini_closeFile(f); // закрываем файл
        return true;
}
Не сохраняет HouseInfo[h][hLevel]


Вот диалоги создания дома


Код HTML:
    case DIALOG_CREATE_DESC://ОПИСАНИЕ ДОМА
      {
        if(response) // Если игрок нажал "Далее"
        {
          if(!strlen(inputtext))return ShowPlayerDialog(playerid,DIALOG_CREATE_DESC,DIALOG_STYLE_INPUT,"{EFFBFB}Создание дома[1/5]","Введите описание для дома.","Далее","Закрыть"); // Если игрок ничего не ввел то показываем ему диалог снова
          SetPVarString(playerid,"h_desc",inputtext); // Записываем в PVar описание чтобы в дальнейшем его использовать
          ShowPlayerDialog(playerid,DIALOG_CREATE_PRICE,DIALOG_STYLE_INPUT,"{EFFBFB}Создание дома[2/5]","Введите цену для дома.","Далее","Назад"); // Показываем следующий диалог - цена дома.
        }
      }
      case DIALOG_CREATE_PRICE://ЦЕНА ДОМА
      {
        if(response) // Если нажал "Да"
        {
           if(!strlen(inputtext))return ShowPlayerDialog(playerid,DIALOG_CREATE_PRICE,DIALOG_STYLE_INPUT,"{EFFBFB}Создание дома[2/5]","Введите цену для дома.","Далее","Назад");
           SetPVarInt(playerid,"h_price",strval(inputtext)); // Сохраняем цену в PVar
           ShowPlayerDialog(playerid,DIALOG_CREATE_LVL,DIALOG_STYLE_INPUT,"{EFFBFB}Создание дома[3/5]","Введите уровень для дома.","Далее","Назад");
        }
        else DeletePVar(playerid,"h_desc"),ShowPlayerDialog(playerid,DIALOG_CREATE_DESC,DIALOG_STYLE_INPUT,"{EFFBFB}Создание дома[1/5]","Введите описание для  дома.","Далее","Закрыть");
      }
      case DIALOG_CREATE_LVL://УРОВЕНЬ ДОМА
      {
        if(response) // Если нажал "Да"
        {
           if(!strlen(inputtext))return ShowPlayerDialog(playerid,DIALOG_CREATE_LVL,DIALOG_STYLE_INPUT,"{EFFBFB}Создание дома[3/5]","Введите уровень для дома.","Далее","Назад");
           SetPVarInt(playerid,"h_lvl",strval(inputtext)); // Сохраняем lvl в PVar
		  // string=""; // Очищаем массив (чтобы не было лишней информации
		   for(new i;i<sizeof(HInts);i++) // запускаем цикл для формирования следующего диалога в котором будет список с доступными интерьерами
           {
               strcat(string,HInts[i][hiName]); // записываем в массив STR значение из HInts[i][hiName]
               strcat(string,"\n"); // Делаем переход на следующую строку т.к. стиль диалога = DIALOG_STYLE_LIST
           }
   		   ShowPlayerDialog(playerid,DIALOG_CREATE_INT,DIALOG_STYLE_LIST,"{EFFBFB}Создание дома[4/5]",string,"Далее","Назад"); // Показываем диалог с готовым списком интерьеров
        }
        else DeletePVar(playerid,"h_price"),ShowPlayerDialog(playerid,DIALOG_CREATE_PRICE,DIALOG_STYLE_INPUT,"{EFFBFB}Создание дома[2/5]","Введите цену для дома.","Далее","Назад");
      }
      case DIALOG_CREATE_INT://ВЫБОР ИНТЕРЬЕРА
      {
        if(response) // если нажал "Далее"
        {
           SetPVarInt(playerid,"h_int",listitem); // Записываем в PVar номер списка (подсчет номера идет с 0 как в и массивах подсчет ячеек.
		   ShowPlayerDialog(playerid,DIALOG_CREATE_CONF,DIALOG_STYLE_MSGBOX,"{EFFBFB}Создание дома[5/5]","Вы действительно хотите создать дом в этом месте?","Создать","Отмена"); // Показываем диалог подтверждения
        }
        else DeletePVar(playerid,"h_lvl"),ShowPlayerDialog(playerid,DIALOG_CREATE_LVL,DIALOG_STYLE_INPUT,"{EFFBFB}Создание дома[3/5]","Введите уровень для дома.","Далее","Назад");
      }
      case DIALOG_CREATE_CONF://ПОДТВЕРДИТЬ
      {
        if(response) // если игрок нажал "Создать"
        {
            m_h++,SaveHouseAmount(); // Увеличиваем общее кол-во домов
            new Float:x[3],str[32]; // Создаем необходимые массивы (для определения координат и получения данных из PVar'a - описание дома, то, что вводили ранее)
            GetPlayerPos(playerid,x[0],x[1],x[2]),GetPVarString(playerid,"h_desc",str,32); // Определяем позиции игрока, заносим описание в str
            HouseInfo[m_h][hEntrancex]=x[0],HouseInfo[m_h][hEntrancey]=x[1],HouseInfo[m_h][hEntrancez]=x[2],HouseInfo[m_h][hValue]=GetPVarInt(playerid,"h_price"),HouseInfo[m_h][hLevel]=GetPVarInt(playerid,"h_lvl"),
            // Присваиваем переменным дома необходимые значения
            HouseInfo[m_h][hInt]=GetPVarInt(playerid,"h_int"),HouseInfo[m_h][hVirt]=m_h,strmid(HouseInfo[m_h][hDesc],str,0,32,32),
            strmid(HouseInfo[m_h][hOwned],"None",0,5,5);  // Записываем владельца дома как None
            HouseInfo[m_h][hLock] = 1;//закрое дом
            HouseInfo[m_h][hPick]=CreatePickup(1273,23,x[0],x[1],x[2],0); // Создаем пикап
            format(string,sizeof(string),"{FBF8EF}[Дом {00FF00}продается{FBF8EF}]\nОписание: %s\nУровень: %d\nЦена: $%d",HouseInfo[m_h][hDesc],HouseInfo[m_h][hLevel],HouseInfo[m_h][hValue]);
            HouseInfo[m_h][hText]=Create3DTextLabel(string,0xFFFFFFFF,x[0],x[1],x[2]+0.5,10.0,0,0); // Создаем 3D текст с ин-цией
            player_SendTD(playerid,"~r~СООБЩЕНИЕ:~n~~n~~G~ДОМ УСПЕШНО СОЗДАН",5000);//5 секунд
		    SaveHouse(m_h); // Сохраняем дом
            DeletePVar(playerid,"h_price"),DeletePVar(playerid,"h_desc"),DeletePVar(playerid,"h_int"),DeletePVar(playerid,"h_lvl"); // Удаляем уже не нужные нам PVar's
        }
        else DeletePVar(playerid,"h_price"),DeletePVar(playerid,"h_desc"),DeletePVar(playerid,"h_int"),DeletePVar(playerid,"h_lvl"); // Иначе если игрок нажал "Отмена" удаляем PVar's.
      }
Дома создаются нормально всё,но когда делаю рестарт то Лвл дома становиться на 0
Reply
#2

В SaveHouse подсчитай в формате количество спецификаторов и исправь.
Reply
#3

ну 23) я раз 100 пересчитывал
Reply
#4

У тебя в sscanf неверное число аргументов.
Reply
#5

А как правильно записать?
Reply
#6

Досчитать до 23, вместо 9.
Reply
#7

OKStyle спасибо большое!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)