Форум Pawn.Wiki - Воплоти мечту в реальность!: Помогите... - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Pawn ]
Помогите... help

#1
Пользователь офлайн   DigitalOneThe 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Короче, у меня интерес ко одному не понятному багу появился, откуда число 263?

Введу в курс дела. Значит так, в базе есть запись с ID 51.

Вот я получаю нажатый listitem из диалога:

new idx = page * MAX_FURNITURE_ON_PAGE + listitem;
SetPVarInt(playerid, "pVar__FurnitureListItem", idx);


Далее, я получаю index из массива, он = 0.

new idx = GetPVarInt(playerid, "pVar__FurnitureListItem");
new find_idx = g_player_furniture_list[playerid][page][PBL_INDEX][idx];


Я проитерировался по итератору, посмотрел все ID`ы в массиве. При получение ID из базы, он равен 51.



foreach(new i: iFurniture) {
printf("%d", eFurniture[i][eID]);
}

printf("idx: %d", idx);
printf("find_idx: %d", eFurniture[find_idx][eID]);


Вот сток списка:

stock ShowFurnitureListDialog(playerid) {
	if (!Iter_Count(iFurniture))
		return SCM(playerid, -1, "На сервере нету мебели.");
	
	new count = 0;
	new dialog_string[47+(29+(11)+(20)+(MAX_PLAYER_NAME))*MAX_FURNITURE_ON_PAGE+1] = "{bcbcbc}ID Object:\t{bcbcbc}Количество:\n";
	new page = GetPVarInt(playerid, "pVar__FurniturePage");
	new start = page * MAX_FURNITURE_ON_PAGE;
	
	if (start > Iter_Count(iFurniture)) {
		page = -1;
		if (page < 0) return 0;
		
		SetPVarInt(playerid, "pVar__FurniturePage", page);
		start = page * MAX_FURNITURE_ON_PAGE;
	}
	
	new end = start+MAX_FURNITURE_ON_PAGE;
	
	if (end > Iter_Count(iFurniture)) {
		end = Iter_Count(iFurniture);
	}
	
	new idx = -1;
	new lastIdx = g_player_furniture_list[playerid][page][PBL_INDEX] - 1;
	foreach(new i: iFurniture) {
		if (strcmp(eFurniture[i][eFurniture_Owner], pName(playerid))) 
			continue;
		
		SetPlayerFurnitureListIndex(playerid, page, ++ lastIdx, i);
		printf("page: %d, index: %d, value: %d", page, lastIdx, i);
		if (++idx < start) continue;
		if (idx >= end) break;
		
		count ++;
		format(dialog_string, sizeof(dialog_string), "%s{ffd966}%d\t{3d85c6}%d\n", dialog_string, eFurniture[i][eFurniture_OBJ], eFurniture[i][eFurniture_Count]);
	}
	
	if (!count)
		return SCM(playerid, -1, "Вы не имеете мебель в доме.");
	
	if (Iter_Count(iFurniture) > MAX_FURNITURE_ON_PAGE) {
        if(end < Iter_Count(iFurniture))
        {
            strcat(dialog_string, "\n{93c47d}>>>\t\t");
        }
        if(page)
        {
            strcat(dialog_string, "\n{f44336}<<<\t\t\n");
        }
	}
	
	return SPD(playerid, dFurniture_ListMain, DIALOG_STYLE_TABLIST_HEADERS, "Список вашей мебели", dialog_string, "Выбрать", "Закрыть");
}


Загрузка мебели:

forward LoadFurniture();
public LoadFurniture() {
	new rows, count;
	cache_get_row_count(rows);
	if (rows) {
		for (new i; i < rows; i++) {
			count ++;
			cache_get_value_name_int(i, "id", eFurniture[i][eID]);
			cache_get_value_name_int(i, "house_id", eFurniture[i][eHouseID]);
			cache_get_value_name_int(i, "obj_id", eFurniture[i][eFurniture_OBJ]);
			cache_get_value_name_int(i, "obj_count", eFurniture[i][eFurniture_Count]);
			cache_get_value_name_int(i, "obj_virtual_world", eFurniture[i][eFurniture_vWorld]);
			cache_get_value_name_int(i, "obj_int_id", eFurniture[i][eFurniture_Interior]);
			cache_get_value_name(i, "owner", eFurniture[i][eFurniture_Owner]);
			cache_get_value_name_float(i, "x", eFurniture[i][eFurniture_X]);
			cache_get_value_name_float(i, "y", eFurniture[i][eFurniture_Y]);
			cache_get_value_name_float(i, "z", eFurniture[i][eFurniture_Z]);
			cache_get_value_name_float(i, "rx", eFurniture[i][eFurniture_RX]);
			cache_get_value_name_float(i, "ry", eFurniture[i][eFurniture_RY]);
			cache_get_value_name_float(i, "rz", eFurniture[i][eFurniture_RZ]);
			cache_get_value_name_bool(i, "place_object", eFurniture[i][eFurniture_PlaceObject]);
			Iter_Add(iFurniture, Iter_Free(iFurniture));
			
			printf("id: %d", eFurniture[i][eID]);
			
			if (eFurniture[i][eFurniture_PlaceObject] == true) {
				eFurniture[i][eID] = CreateDynamicObject(
					eFurniture[i][eFurniture_OBJ], 
					eFurniture[i][eFurniture_X], 
					eFurniture[i][eFurniture_Y], 
					eFurniture[i][eFurniture_Z], 
					eFurniture[i][eFurniture_RX], 
					eFurniture[i][eFurniture_RY], 
					eFurniture[i][eFurniture_RZ], 
					eFurniture[i][eHouseID], 
					-1
				);
			}
		}
	}
	
	return printf("<МЕБЕЛИ ЗАГРУЖЕНО>: [%d]", count);
}

Сообщение отредактировал DigitalOneThe: 24 мая 2023 - 21:21

0

#2
Пользователь офлайн   DigitalOneThe 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Решено, был баг с базой данных.
0

#3
Пользователь офлайн   Perdolinka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDigitalOneThe (24 мая 2023 - 21:15) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

В idx присваивается далеко не listitem, а результат выражения, в котором, кроме того же таки listitem'a, берут участие ещё два компонента: текущая страница, на которой находится игрок и, соответственно, директива, хранящая максимальное количество имеющейся мебели на странице. Потом, когда ты пытаешься присвоить значение переменной find_idx у тебя, кроме того, что будет выход за пределы(это если судить по тому, что в пваре хранится значение 263, которое, в свою очередь, значительно выше нормы). ID'ы то соответствующие, ибо загрузка идентификаторов поступает в элемент ID перечисления, отвечающего за хранение метаданных о мебели в доме, но, прикол в другом: при итерировании списка элементов ты присваиваешь первому доступному индексу в g_player_furniture_list результат итерации, то бишь, то, что хранится в контейнере на i позиции. Особо код я даже смотреть не стал, но уже понял в чём может заключаться конкретно беда: ты изначально записываешь идентификатор из базы в элемент ID из вышеописанного перечисления, а потом, после получения всех данных, присваиваешь ему же идентификатор созданного объекта, на основе имеющихся данных. К тому же, в итератор попадает не идентификатор, который у мебели в базе(хотя, будем честны, можно было оставить столбец id исключительно как ID записи, а под идентификатор мебели выделить другой столбец, с соответствующим именем: slot или, как вариант, furniture_id), а первая из свободных позиций контейнера, учитывая то, что ты передаёшь при добавлении элемента результат функции Iter_Free. Особо код я смотреть даже не хочу, ибо я тебе давал темами ранее не только архитектуру SQL для системы(в том числе распределённую), но и готовый код, на основе которого, если хорошенько проанализировать, можно запилить что-то своё. Судя по всему, ты либо плохо понял суть, предоставленного мною кода и, на этой почве, добавил неработающую отсебятину, либо я хз. Вообщем, советую тебе прислушаться к тому, что я написал сейчас и к тому, что писалось тебе в предыдущих темах
1

#4
Пользователь офлайн   DigitalOneThe 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPerdolinka (24 мая 2023 - 21:52) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


У меня именно при изменение какого то параметра в ENUM, начинаются такие баги

UPD: А, то-есть устанавливать идентификатор объекта, на ID записи, было моей ошибкой

Я помню, в какой то теме кто то ответил мне, "идентификатор записи в базе, или массиве, это твой идентификатор машины", я точно не помню кто так писал, вот и поступил таким образом.

Сообщение отредактировал DigitalOneThe: 24 мая 2023 - 22:51

0

#5
Пользователь офлайн   Perdolinka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDigitalOneThe (24 мая 2023 - 22:39) писал:

У меня именно при изменение какого то параметра в ENUM, начинаются такие баги

я, если честно, не понимаю о каком перечислении речь(судя по всему, о хранящем некие метаданные о списке мебели на странице, с элементами: PBL_INDEX и PBL_COUNT). Не суть важна, твою проблему я описал, как минимум это должна быть она. Если нет, то советую внимательно изучить предоставленную мною интерпретацию идентичного кода и, в свою очередь, попытаться понять, каким боком это вообще работает. По традиции, если есть вопросы по коду, задавай. Хотя, я хз как можно ещё шире объяснить, я не моя бывшая учительница по укр.м
0

#6
Пользователь офлайн   DigitalOneThe 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPerdolinka (24 мая 2023 - 22:51) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Да, я исправил эту проблему.
0

#7
Пользователь офлайн   Perdolinka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDigitalOneThe (24 мая 2023 - 22:53) писал:

Да, я исправил эту проблему.

Молодец. Если уж и хочется для чего-то сохранить ид объекта мебели, то можно создать отдельный элемент в перечислении. Ну, либо, как вариант, заместо отдельного элемента, привязать к созданному на основе имеющихся данных объекту мебели некие метаданные, среди которых: тип объекта(дабы, в случае чего, можно было определить, соответствует ли объект нашим требованиям); идентификатор дома(тут имеется ввиду именно не ID индекса для оперирования основным массивом, хранящим метаданные о мебели дома, а, непосредственно, идентификатор в базе данных); слот(позиция мебели среди остальных). Ну и остальные метаданные, которые тебе нужны, я уж не шарю в этом моменте. Засчёт того, что Streamer из коробки предоставляет возможность оперироваться датой предметов, засчёт гетеров и сетеров, мы можем творить крутые вещи, ограничивая все данные непосредственно предметом. Недавно опубликовал библиотеку, которая, хоть и не рекомендуется к использованию, но демонстрирует работоспособность потенциала Streamer'a в деталях.
1

#8
Пользователь офлайн   DigitalOneThe 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPerdolinka (24 мая 2023 - 23:07) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Да, об этом то я в курсе, просто сижу поздно, туплю немного, на свежую голову конечно надо делать это всё мне.
0

#9
Пользователь офлайн   DigitalOneThe 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
И кстати, если я изменю позицию объекта через EditDynamicObject, то мне нужно будет ещё эти координаты сохранить к самому объекту?

И вообще, есть ли такая возможность, отследить, на какую графическую кнопку нажал игрок, в режиме EditDynamicObject.

UPD: Я нашёл функцию, вроде она ->
OnPlayerEditDynamicObject

Сообщение отредактировал DigitalOneThe: 24 мая 2023 - 23:21

0

#10
Пользователь офлайн   Perdolinka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDigitalOneThe (24 мая 2023 - 23:18) писал:

И кстати, если я изменю позицию объекта через EditDynamicObject, то мне нужно будет ещё эти координаты сохранить к самому объекту?

Вопросом на вопрос: а для чего тогда, собственно говоря, придумали синхронизацию? Естественно, что нет. Когда игрок завершит редактировать объект то бишь, будет нажата клавиша сохранения в GUI интерфейсе для редактирования, которая, в свою очередь, вызовет OnPlayerEditDynamicObject, передав в аргумент response состояние EDIT_RESPONSE_FINAL, свидетельствующее о том, что игрок прекратил редактировать объект и, тем самым, нужно изменить имеющиеся координаты объекта на изменённые.

Просмотр сообщенияDigitalOneThe (24 мая 2023 - 23:20) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Параметр response, советую внимательно изучить имеющуюся документацию о автовызываемых функциях.

Сообщение отредактировал Perdolinka: 24 мая 2023 - 23:23

0

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика