Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

TREWKO

когда читаю r_s32 значение(цифру: 32) из ini файла, то оно преобразовывается в скрипте в "32",

вообще то метод возвращает целое число ( тип Int32 если я не ошибаюсь ) так же как и метод r_u32(string, string), а никак не строку, которую возвращает r_string(string, string)

с чего ты взял что у тебя возвращается число в кавычках?

 

а в лутмани добавь в скрипт перед считыванием секции из ini файла проверку на существование секции и ключа в данной секции - и если nil то верни рандому какое -нибудь дефолтное значение.

 

И насчет преобразования "4000" (строка ) в число 4000 - для этого существует lua метод tonumber() -- конвертирует строковое представление числа в number. И он в моде как я вижу задействован.

Поделиться этим сообщением


Ссылка на сообщение

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

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Byurrer

Аргумент who (в данном контексте) всегда равен юзердате ГГ, иначе и быть не может - каллбек ведь на него установлен.

А вот это не проверка

db.actor:set_callback(callback.use_object,         this.OnUseActorObject)

а установка каллбека.

PS: там у меня в примере названия функций на юзанье отличаются(исправил) - надеюсь понял, что это просто по недосмотру и должны быть одинаковые.

(а у меня просто перевызов идет -первая вызывает вторую, поэтому так).

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Хантер,

Если у тебя 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.

Хотя причина вылета может быть и не здесь зарыта :-)

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Хантер,

А ты в консоль заглядывал? Или в сам лог?

Загляни ради интереса - что именно там пишется из тех строк, что есть в новой printf.

Вылета нет потому, что в данном варианте printf стоит ловушка на nil, но сама ошибка может идти как с оригинала, так и из мода либо твоя.

И тебе было бы желательно разобраться в этом - чтобы не поиметь ошибок в будущем.

---------------------------------------------------------------------------

Насчет второго лога - e_parent && e_entity - похоже на баг оригинала.

Но более конкретно не скажу.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

djslavikoz

Не думаю что в xr_effects.script надо что то дописывать. Этот файл в твоем случае вообще не причем(если ты его не трогал или не пытался вызывать из логики функцию, которой в нем нет - но тогда и лог был бы другой). Лог с указанием на _g.script:20 как правило говорит о том, что в твоих скриптах есть либо синтаксическая ошибка(где именно - тебе лучше знать, а в лог в данном случае это не передается), либо вызвана дефолтная функция abort для креша игры(вследствие серьезной ошибки в скриптах - об этом может быть как раз и говорит строчка ERROR:object), либо в функцию printf передается (из оригинальных скриптов) некорректный аргумент или некорректное число аргументов (так вот недальновидно разрабы написали эту функцию.)

Пользуйся луа чекером для проверки скриптов на синтаксис. И хотя он не гарантирует нахождение всех ошибок - но мелкие банальные опечатки, которые нарушают правила lua, находит весьма неплохо. Разумеется ошибки связанные с неправильным использованием функций и методов игры он отследить не может - от таких ошибок спасет только грамотность и хорошее знание скриптов.

ЗЫ:И прочитай мой пост на прошлых страницах: можешь заменить дефолтную функцию printf из файла _g.script на

ту, что в моем посте. От твоих ошибок она не спасет. Но от ошибочных вызовов оригинала лечит.

ЗЫЫ: Советую пользоваться дебаговым функционалом из модов - тестовый вывод в лог(и консоль) результатов работы своего скрипта еще никому не мешал.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

serega-gamer

Скачай DreamMod ver.0.2b или abc_sleep_mod(что почти одно и то же) -а уж настраивать под себя сам будешь.

 

hakim,

Элементарно - создашь конфиг как обычному предмету в файле items и указываешь в качестве визуала любой объект мебели из папки meshes - там есть и столы, и стулья, и полки и т.д. Сам предмет спавнишь обычной функцией create().

Поделиться этим сообщением


Ссылка на сообщение

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

 

--// инфопоршни для каждого тайника должны быть одноименными с именами записок- так проще будет ими оперировать

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

speczadanie

Как вариант: в utils.script есть готовая функция - проверяет достиг ли NPC нужной точки. Ставишь на апдейт(разумеется с передачей аргументов) и проверяешь. Если достиг - выдаешь поршень.

Поделиться этим сообщением


Ссылка на сообщение

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() можно ставить на нужный объект.

Поделиться этим сообщением


Ссылка на сообщение

speczadanie

Мод - детекторы артефактов(автор singapur22) - все на скриптах сделано. Изучайте.

1. -- Арты видно только на расстоянии ближе двух метров.

2. -- В отличии от ЧН и ЗП, арты можно найти и подобрать, и без детекторов

-- но, не зная их местонахождения найти онных почти невозможно.

3. -- Невидимость артов сопровождается лёгким колебанием воздуха.

-- Благодаря которому можно заметить артефакт, если хорошо приглядеться.

-- Правда в траве это сделать невероятно сложно, даже с детектором INDY.

 

http://ifolder.ru/19063671

Кстати единственный мод такого плана - при том с достойной скриптовой реализацией - юзайте.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

TRAMP14

Неправильная - метод object() (класса game_object) принимает как аргумент либо строку (секцию) либо число(порядковый номер в инвентаре).

А ты ему пытаешься юзердату скормить.

Поделиться этим сообщением


Ссылка на сообщение
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

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение
если у игрока в руках что-то есть (сейчас худ видно), и это оружие XXX - тогда вернём true

function IsWeaponActive()
local item = db.actor:active_item() 
return  item and isWeapon(item )
end

-------------------------------------------------------------------------------------------------------------

Кому нужно: аптечки на худе (универсальный скрипт под любую версию игры ТЧ или мод на ТЧ (состоит всего из одного файла), причем скрипт легко можно дополнить своими предметами)

e65d0e835b1dt.jpg

 

 

ссылка

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

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, последующие по указанным - друг под другом.

В итоге получается так:

3f8abf644597t.jpg

 

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

antreg

В общем сделал обновленный вариант - там можно самому настроить вывод статиков как по горизонтали, так и по вертикали просто поменяв логические значения двух параметров. Также заменил шрифт на более подходящий. И добавил вывод водки и бинтов ;)

скрин

741a771f769dt.jpg

 

 

ссылка

Поделиться этим сообщением


Ссылка на сообщение

SkyLoader

tostring() при выводе в консоль примени(кто ж в консоль значение переменной выводит без всякого форматирования и конвертации). Булевы значения нужно конвертировать в строку.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение
Всё. Теперь сохраняй и заходи в игру

И будет его ждать армия клонов merc_zasada_01 - (каждую секунду по сотне) - как только он возьмет нужный ПДА:rofl2:

Уж не апдейт, а на 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 будут спавниться каждый раз когда данный пда будет в инвентарь браться.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Jurok

Разумеется можно - но зачем апдейтить то? Можно ведь обойтись и более подходящим для данного случая методом эктор биндера.

 

ФеНиКс

Это одно из перечислений класса callback - полный список можешь найти в lua help.

callback.inventory_info срабатывает на открытие инвентарных окон.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

ФеНиКс

Со всем кодом не разбирался - но сразу в глаза бросается ошибка:

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.

А нужно чтобы ключами были строки соответствующие названиям предметов по секции.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   1 пользователь

×
×
  • Создать...