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


Фотография

Критичность ошибки "ERROR: new_obj_id() !"


  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 04 Январь 2016 - 00:25

В общем, решил реализовать вставку скриптов в предметы типа "drug", как всем известно, после того, как у такого предмета появляется привязанный скрипт, движок перестает складывать их в стопки.

Решил эту проблему с помощью алгоритма(через глобальный скрипт sfall), который постоянно сканит инвентарь на предмет нужных предметов, запоминает их количество, удаляет все эти предметы и добавляет их обратно. Таким образом предметы помещаются в стопки. Конечно, прием достаточно грязный и КПД у него мизерное, тем не менее, он работает отлично, но после нескольких тысяч прогонов этого алгоритма в отладочном окне появляется ошибка "ERROR: new_obj_id() !!! PICKED PLAYER ID !!!!" (Количество восклицательных знаков сохранено.)

Не смотря на такую ошибку, игра не крашится, и вообще работает как обычно (сохраняется — загружается тоже нормально), вот только пропадает эта ошибка только после полной перезагрузки Фолла.

Ну и, собственно, вопрос: на сколько ужасна подобная ошибка и не отразится ли она на сейвах и общей стабильности работы Фолла?

UPD: Устранил проблему путем использования массива, который хранит количество всех обновляемых предметов. Теперь перед "переливанием" предметов происходит сравнение между количеством предметов в данный момент времени и значением предыдущего обновления. Тем самым КПД увеличилось многократно и данная ошибка (которая, видимо, происходит, когда заканчиваются адреса для предметов(ну или чего то подобного, не знаю, я не программист :) ) ) оттянута на весьма значительный промежуток времени. Выкладываю полный исходный код сфалловского скрипта, вдруг кому понадобится.

Исходный код алгоритма:
CODE
#include ".\HEADERS\define.h"
#include ".\HEADERS\command.h"

#define EDS_SECTION_START (100)
#define EDS_SECTION_STEP (10)
#define MAX_EDS_POINTS (10000)

#define EDS_ITEM_PID (0)
#define EDS_ITEM_HUNGER (3)
#define EDS_ITEM_THIRST (4)
#define EDS_ITEM_SLEEP (5)

#define EDS_MSG SCRIPT_TEST0

#define EDSstr(x)                 message_str(EDS_MSG, x)
#define EDSfield(x,y)             EDSstr(cur_section + (x * EDS_SECTION_STEP) + y)


procedure start;
variable food;

procedure start begin
variable begin
//food;
cur_section:=100;
item_num:=0;
item_pid:=0;
item_pointer:=0;
item_count:=0;
item_junk:=0;
end

if (food == 0) then begin
debug_msg("Serching food array:");
  while (EDSfield(item_num,EDS_ITEM_PID) != "Error") do begin //пытаемся вывести значение из msg файла, метод подсмотрен у mr. fixit
  item_num++;
  end

food:= load_array("food");

  if food == 0 then begin
  debug_msg("Food array not found! Creating food array!");
  food:= create_array(item_num,0);
  end else
  if (len_array(food) != item_num) then begin
  debug_msg("Aviable new food! Food array resize!");
  resize_array(food,item_num);
  end
debug_msg("OK. Food array aviable!");
item_num:= 0;
end

while (len_array(food) != item_num) do begin

item_pid:= atoi(EDSfield(item_num,EDS_ITEM_PID));
item_pointer:= obj_carrying_pid_obj(dude_obj,item_pid);
item_count:= obj_is_carrying_obj_pid(dude_obj,item_pid);

if item_count != food[item_num] then begin

while obj_is_carrying_obj_pid(dude_obj,item_pid) != 0 do begin
item_pointer:= obj_carrying_pid_obj(dude_obj,item_pid);
//item_junk:=rm_mult_objs_from_inven(dude_obj,item_pointer,item_count);
remove_script(item_pointer);
destroy_object(item_pointer);
end
item_pointer:= create_object_sid(item_pid,0,0,1304);
add_mult_objs_to_inven(dude_obj,item_pointer,item_count);
debug_msg("Progon! Item count: "+item_count);
food[item_num]:= item_count;
end

item_num++;

end
save_array("food",food);
  set_global_script_repeat(250);
  //set_global_script_repeat(-1);

end

Структура msg файла:
# Nuka Cola
{100}{}{106}  # ID прототипа предмета
{101}{}{}   # Путь к изображению
{102}{}{}   # Размер изображения
{103}{}{0}  # Очки голода (для снижения должно быть отрцательное значение)
{104}{}{-10}  # Очки жажды
{105}{}{-15}  # Очки сна
{106}{}{0}  # Можно ли отравиться предметом
{107}{}{0} # Является ли предмет радиоактивным
{108}{}{}
{109}{}{}

# Iguana on a stick
{110}{}{81}
{111}{}{}
{112}{}{}
{113}{}{-15}
{114}{}{5}
{115}{}{5}
{116}{}{0}
{117}{}{}
{118}{}{}
{119}{}{}



Это сообщение отредактировано Nordan - 5 января 2016 | 07:04




Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Рейтинг@Mail.ru