В общем, решил реализовать вставку скриптов в предметы типа "drug", как всем известно, после того, как у такого предмета появляется привязанный скрипт, движок перестает складывать их в стопки.
Решил эту проблему с помощью алгоритма(через глобальный скрипт sfall), который постоянно сканит инвентарь на предмет нужных предметов, запоминает их количество, удаляет все эти предметы и добавляет их обратно. Таким образом предметы помещаются в стопки. Конечно, прием достаточно грязный и КПД у него мизерное, тем не менее, он работает отлично, но после нескольких тысяч прогонов этого алгоритма в отладочном окне появляется ошибка "ERROR: new_obj_id() !!! PICKED PLAYER ID !!!!" (Количество восклицательных знаков сохранено.)
Не смотря на такую ошибку, игра не крашится, и вообще работает как обычно (сохраняется загружается тоже нормально), вот только пропадает эта ошибка только после полной перезагрузки Фолла.
Ну и, собственно, вопрос: на сколько ужасна подобная ошибка и не отразится ли она на сейвах и общей стабильности работы Фолла?
UPD: Устранил проблему путем использования массива, который хранит количество всех обновляемых предметов. Теперь перед "переливанием" предметов происходит сравнение между количеством предметов в данный момент времени и значением предыдущего обновления. Тем самым КПД увеличилось многократно и данная ошибка (которая, видимо, происходит, когда заканчиваются адреса для предметов(ну или чего то подобного, не знаю, я не программист
) ) оттянута на весьма значительный промежуток времени. Выкладываю полный исходный код сфалловского скрипта, вдруг кому понадобится.
Исходный код алгоритма:
Решил эту проблему с помощью алгоритма(через глобальный скрипт 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