Garry_Galler 7 Опубликовано 28 Июня 2010 TREWKO когда читаю r_s32 значение(цифру: 32) из ini файла, то оно преобразовывается в скрипте в "32", вообще то метод возвращает целое число ( тип Int32 если я не ошибаюсь ) так же как и метод r_u32(string, string), а никак не строку, которую возвращает r_string(string, string) с чего ты взял что у тебя возвращается число в кавычках? а в лутмани добавь в скрипт перед считыванием секции из ini файла проверку на существование секции и ключа в данной секции - и если nil то верни рандому какое -нибудь дефолтное значение. И насчет преобразования "4000" (строка ) в число 4000 - для этого существует lua метод tonumber() -- конвертирует строковое представление числа в number. И он в моде как я вижу задействован. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 13 Сентября 2010 (изменено) Byurrer, как назначить на использование предмета свой скрипт Вот это поставь в любой скрипт - так что бы он один раз или периодически вызывался при загрузке игры. db.actor:set_callback(callback.use_object, this.OnUseActorObject) а это будет та самая функция которая будет вызываться на юзание ГГ любого предмета function OnUseActorObject(obj, who) if obj then -- делаем проверку на использование нужного предмета if obj:section() =="communicator" then alife():create("communicator", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавним его обратно level.start_stop_menu(this.my_message(), true) --запускаем меню end end end Изменено 19 Сентября 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 19 Сентября 2010 (изменено) Byurrer Аргумент who (в данном контексте) всегда равен юзердате ГГ, иначе и быть не может - каллбек ведь на него установлен. А вот это не проверка db.actor:set_callback(callback.use_object, this.OnUseActorObject) а установка каллбека. PS: там у меня в примере названия функций на юзанье отличаются(исправил) - надеюсь понял, что это просто по недосмотру и должны быть одинаковые. (а у меня просто перевызов идет -первая вызывает вторую, поэтому так). Изменено 19 Сентября 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 1 Октября 2010 (изменено) Хантер, Если у тебя 20 строчка именно вот это log(string.format(fmt,...)) , то попробуй заменить функцию printf на ее аналог из Зенобиан мода: function printf(fmt,...) local arg = {...} if arg == nil then get_console():execute("Error_printf:_Arg_=_nil_value") else for a=1, table.getn(arg), 1 do if arg[a] == nil then get_console():execute(string.format("Error_printf:_Arg_#%d_=_nil_value",a)) end end end end Возможно ошибка исчезнет. Из-за дефолтной printf бывают ошибки по той причине, что метод string.format() не понимает nil, и когда в printf передается аргумент со значением nil или вообще ничего - то и получаем string expected, got no value. Хотя причина вылета может быть и не здесь зарыта :-) Изменено 1 Октября 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 2 Октября 2010 (изменено) Хантер, А ты в консоль заглядывал? Или в сам лог? Загляни ради интереса - что именно там пишется из тех строк, что есть в новой printf. Вылета нет потому, что в данном варианте printf стоит ловушка на nil, но сама ошибка может идти как с оригинала, так и из мода либо твоя. И тебе было бы желательно разобраться в этом - чтобы не поиметь ошибок в будущем. --------------------------------------------------------------------------- Насчет второго лога - e_parent && e_entity - похоже на баг оригинала. Но более конкретно не скажу. Изменено 2 Октября 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 5 Октября 2010 (изменено) djslavikoz Не думаю что в xr_effects.script надо что то дописывать. Этот файл в твоем случае вообще не причем(если ты его не трогал или не пытался вызывать из логики функцию, которой в нем нет - но тогда и лог был бы другой). Лог с указанием на _g.script:20 как правило говорит о том, что в твоих скриптах есть либо синтаксическая ошибка(где именно - тебе лучше знать, а в лог в данном случае это не передается), либо вызвана дефолтная функция abort для креша игры(вследствие серьезной ошибки в скриптах - об этом может быть как раз и говорит строчка ERROR:object), либо в функцию printf передается (из оригинальных скриптов) некорректный аргумент или некорректное число аргументов (так вот недальновидно разрабы написали эту функцию.) Пользуйся луа чекером для проверки скриптов на синтаксис. И хотя он не гарантирует нахождение всех ошибок - но мелкие банальные опечатки, которые нарушают правила lua, находит весьма неплохо. Разумеется ошибки связанные с неправильным использованием функций и методов игры он отследить не может - от таких ошибок спасет только грамотность и хорошее знание скриптов. ЗЫ:И прочитай мой пост на прошлых страницах: можешь заменить дефолтную функцию printf из файла _g.script на ту, что в моем посте. От твоих ошибок она не спасет. Но от ошибочных вызовов оригинала лечит. ЗЫЫ: Советую пользоваться дебаговым функционалом из модов - тестовый вывод в лог(и консоль) результатов работы своего скрипта еще никому не мешал. Изменено 5 Октября 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 17 Ноября 2010 serega-gamer Скачай DreamMod ver.0.2b или abc_sleep_mod(что почти одно и то же) -а уж настраивать под себя сам будешь. hakim, Элементарно - создашь конфиг как обычному предмету в файле items и указываешь в качестве визуала любой объект мебели из папки meshes - там есть и столы, и стулья, и полки и т.д. Сам предмет спавнишь обычной функцией create(). Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 23 Ноября 2010 (изменено) Valerich Я не знаю как ты там спавнишь свои тайники - но я бы так сделал: Создаем такую вот табличку с данными: local tTreasure={ -- //в качестве ключа пишем имя тайников по секции - число тайников неограничено treasure_1 ={1,2,3,4,5}, -- //вместо пяти данных цифр в каждой субтаблице пишем последовательно координаты по x,y,z и два вертекса treasure_2 ={1,2,3,4,5}, treasure_3 ={1,2,3,4,5}, treasure_4 ={1,2,3,4,5}, } --// вызов данной функции ставим на каллбек on_take - то есть в тело метода function actor_binder:on_item_take (obj) в bind_stalker.script --// вызов должен быть в таком виде имя_файла.TreasureSpawn(obj) function TreasureSpawn(obj) --// получаем взятый объект по секции local section = obj:section() --// если наш объект и не был включен одноименный инфопоршень, то спавним тайник используя данные из таблицы if section and string.find(section, "zapisk_") and not has_alife_info(section) then local key = "treasure_"..string.sub(section, -1)+1 --// добавим +1 чтобы спавнился тайник номером на 1 больше alife():create(tTreasure[key], tTreasure[key][1], tTreasure[key][2], tTreasure[key][3], tTreasure[key][4], tTreasure[key][5]) --// включаем поршень чтобы тайник не спавнился повторно db.actor:give_info_portion(section) end end --// инфопоршни для каждого тайника должны быть одноименными с именами записок- так проще будет ими оперировать Изменено 23 Ноября 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 3 Декабря 2010 speczadanie Как вариант: в utils.script есть готовая функция - проверяет достиг ли NPC нужной точки. Ставишь на апдейт(разумеется с передачей аргументов) и проверяешь. Если достиг - выдаешь поршень. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 19 Декабря 2010 DiXares Не совсем на юзание - в оригинале используется каллбек на полное опустошение тайника: сначала вызывается take_item_from_box(box, box_story_id) - из экторского каллбека на тейк из ящика -actor_binder:take_item_from_box(box, item). Затем проверяется опустошение ящика: (if box:is_inv_box_empty() == true) и если true вызывается метод CTreasure:treasure_empty(box, box_story_id) который и снимает метку. А если нужен именно каллбек на юз - то через set_callbek() можно ставить на нужный объект. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 3 Января 2011 (изменено) speczadanie Мод - детекторы артефактов(автор singapur22) - все на скриптах сделано. Изучайте. 1. -- Арты видно только на расстоянии ближе двух метров. 2. -- В отличии от ЧН и ЗП, арты можно найти и подобрать, и без детекторов -- но, не зная их местонахождения найти онных почти невозможно. 3. -- Невидимость артов сопровождается лёгким колебанием воздуха. -- Благодаря которому можно заметить артефакт, если хорошо приглядеться. -- Правда в траве это сделать невероятно сложно, даже с детектором INDY. http://ifolder.ru/19063671 Кстати единственный мод такого плана - при том с достойной скриптовой реализацией - юзайте. Изменено 3 Января 2011 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 5 Января 2011 TRAMP14 Неправильная - метод object() (класса game_object) принимает как аргумент либо строку (секцию) либо число(порядковый номер в инвентаре). А ты ему пытаешься юзердату скормить. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 6 Января 2011 (изменено) function delslot(slot) local item = db.actor:item_in_slot(slot) if item then db.actor:drop_item(item) -- дропить по моему не обязательно - я без этого обхожусь alife():release(alife():object(item:id()), true) end end Изменено 6 Января 2011 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 10 Января 2011 (изменено) если у игрока в руках что-то есть (сейчас худ видно), и это оружие XXX - тогда вернём true function IsWeaponActive() local item = db.actor:active_item() return item and isWeapon(item ) end ------------------------------------------------------------------------------------------------------------- Кому нужно: аптечки на худе (универсальный скрипт под любую версию игры ТЧ или мод на ТЧ (состоит всего из одного файла), причем скрипт легко можно дополнить своими предметами) ссылка Изменено 10 Января 2011 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 10 Января 2011 (изменено) antreg Тут все просто: добавляешь в мой файл эту таблицу local tPosYItems ={ medkit =25, medkit_scientic =50, medkit_army =75, antirad =100 } затем в строчке for k, v in pairs(tPosXItems) do заменяешь имя таблицы на tPosYItems затем строчку st:Init(v, 725, 30, 25) комментируешь или удаляешь и вместо нее пишешь st:Init(990, v, 30, 25) (кстати размеры - ширина\высота - иконок определяют параметры 30, 25 - их можно увеличить\уменьшить - только пропорции стоит соблюдать, что иконка не сильно искажалась) теперь статики будут строиться по вертикали в правом верхнем углу - точка отсчета по x- 990 - можешь ее подкорректировать под себя. Шаг между статиками 25 пикселей - как и был - но это тоже можешь подправить в таблице tPosYItems - верхний статик будет рисоваться по координате Y равной 25, последующие по указанным - друг под другом. В итоге получается так: Изменено 10 Января 2011 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 10 Января 2011 antreg В общем сделал обновленный вариант - там можно самому настроить вывод статиков как по горизонтали, так и по вертикали просто поменяв логические значения двух параметров. Также заменил шрифт на более подходящий. И добавил вывод водки и бинтов скрин ссылка Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 11 Января 2011 (изменено) SkyLoader tostring() при выводе в консоль примени(кто ж в консоль значение переменной выводит без всякого форматирования и конвертации). Булевы значения нужно конвертировать в строку. Изменено 11 Января 2011 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 15 Января 2011 (изменено) Всё. Теперь сохраняй и заходи в игру И будет его ждать армия клонов merc_zasada_01 - (каждую секунду по сотне) - как только он возьмет нужный ПДА Уж не апдейт, а на take нужно ставить: найти в bind_stalker этот код function actor_binder:on_item_take (obj) level_tasks.proceed(self.object) --game_stats.update_take_item (obj, self.object) --******************************************* и сюда вписать вызов test_proverka.proverka_pda_tryp() --******************************************* end или даже так лучше - вписать вот это: if obj and obj:section()=="pda_tryp" then имя_файла.spawn_zasada_merc() end А еще не помешает добавить проверку на инфопоршень перед спавном NPC - а после спавна инфопоршень выдать. А то NPC будут спавниться каждый раз когда данный пда будет в инвентарь браться. Изменено 15 Января 2011 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 15 Января 2011 (изменено) Jurok Разумеется можно - но зачем апдейтить то? Можно ведь обойтись и более подходящим для данного случая методом эктор биндера. ФеНиКс Это одно из перечислений класса callback - полный список можешь найти в lua help. callback.inventory_info срабатывает на открытие инвентарных окон. Изменено 15 Января 2011 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 15 Января 2011 (изменено) ФеНиКс Со всем кодом не разбирался - но сразу в глаза бросается ошибка: local Item= {baton_b,conserva,vodka} правильно так local Item= {baton_b = true,conserva=true,vodka=true} иначе у тебя в таблице вместо предметов - одни nil. Ты делаешь проверку по ключу - но в твоем же варианте - ключи не строки, а цифры(таблицы lua по умолчанию индексируются цифрам - 1,2,3 и т.д). То есть у тебя получается: {[1]=baton_b,[2]=conserva, [3]=vodka} - при этом значения ключей равны nil. А нужно чтобы ключами были строки соответствующие названиям предметов по секции. Изменено 15 Января 2011 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение