Нашел на одном из форумов, не помню где. Решил выложить ибо не встретил здесь такой темы. Думаю многим пригодится B):
======================================================================= ВЫДАЁМ ПРЕДМЕТ АКТОРУ ======================================================================= function название функции (first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "название предмета", "in") end Размещается в файлах скрипт.
Выдача поршня вставляется под строку действия. название скрипта.название функции
Примечание, что бы выдать два одинаковых предмета пишем
function название функции (first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "название предмета", "in",2) end
Если надо больше меняем цифру 2 на нужную нам. ========================================================================= ОТБИРАЕМ ПРЕДМЕТ У АКТОРА. ========================================================================= function название функции(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета") end
размещается в файлах скрипт
выдача поршня вставляется под строку действия название скрипта.название функции
Примечание, что бы отобрать два одинаковых предмета пишем
function название функции(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета",2) end
Если надо больше меняем цифру 2 на нужную нам. ======================================================================= СПАВНИМ ВЕЩЬ В РЮКЗАК гг ======================================================================= function название функции() local obj = alife():create("ВЕЩЬ", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end
В диалог название скрипта.название функции
=========================================================================== ПРОВЕРКА НАЛИЧИЯ У АКТОРА ПРЕДМЕТА =========================================================================== Вариант первый function Название функции() if db.actor:object("название предмета") then return true end return false end
function название функции(first_speaker, second_speaker) return first_speaker:object("название предмета") ~= nil end
в диалог
имя скрипта.название функции =========================================================================== ПРОВЕРКА ВЕЩЕЙ У ГГ =========================================================================== function Название функции(first_speaker, second_speaker) return first_speaker:object("название предмета") ~= nil or first_speaker:object("название предмета") ~= nil or first_speaker:object("название предмета") ~= nil end
в диалог
имя скрипта.название функции
описание... если есть хотя бы одна вещь, то мы получим фразу, если нет всех нет разговора ============================================================================ ПРОВЕРКА ДЕНЕГ У ГГ ============================================================================ Вариант первый(используют ПЫС)
function название функции(first_speaker, second_speaker) return first_speaker:money() >= 2000 end
в диалог
имя скрипта.название функции
<-----------Вариант два--------------> Использовал на ТЧ, но и в ЗП работает
function название функции() return db.actor:money()>=10000 end в диалог
имя скрипта.название функции
========================================================================= СПАВН ПРЕДМЕТА ========================================================================= function spawn_vintar() alife():create("Название предмета",vector():set(24.725412368774,-3.6072344779968,173.83030700684),993926,210) end
В диалог
название скрипта.название функции
========================================================================== МГНОВЕННАЯ СМЕРТЬ ГГ ==========================================================================
function название функции(npc, actor) npc:kill(actor) end
В диалог
название скрипта.название функции =========================================================================== ПРОВЕРКА КОЛ_ВА ОДИНАКОВЫХ ПРЕДМЕТОВ =========================================================================== function название функции(first_speaker, second_speaker) local item_sections = {"Предмет"} local needed = количество одинаковых предметов, ставится цифра без знаков local count = 0 local item_section local function calc(temp, item) if item:section() == item_section then count = count + 1 end end for k,v in pairs(item_sections) do item_section = v get_story_object("actor"):iterate_inventory(calc, actor) end return count >= needed end
в диалог имя скрипта.название функции ========================================================================== ЛЕЧЕНИЕ ГГ ========================================================================== Вставим этот актион в диалог
dialogs.medic_magic_potion ========================================================================== ВЫДАЧА ДЕНЕГ от НПС ГГ ==========================================================================
function название функции(first_speaker, second_speaker) dialogs.relocate_money_to_actor(first_speaker, second_speaker, 2000) end
В диалог
название скрипта.название функции ==========================================================================
"У ГГ хорошее здоровье"
function actor_good(first_speaker, second_speaker) if db.actor.health > 0.75 or --уровень здоровья, при котором диалог уже будет появляться(от 0 до 1) db.actor.radiation < 0.1 or -- уровень радиации,при котором диалог уже будет появляться(от 0 до 1) db.actor.bleeding < 0.1 then --уровень кровотечения, при котором диалог уже будет появляться(от 0 до 1) return true end return false end
"определённая группировка враждебна к ГГ"
Код function if_enemy_to_actor(first_speaker, second_speaker) local npc = dialogs.who_is_npc(first_speaker, second_speaker) local actor = dialogs.who_is_actor(first_speaker, second_speaker) return xr_conditions.is_faction_enemy_to_actor(actor, npc, {"Название группировки"}) end
если надо когда группировка не враждебна к актору, то return not если надо когда группировка друзья,то return xr_conditions.is_faction_friend_to_actor(actor, npc, {"Название группировки"}) когда нейтралы, return xr_conditions.is_faction_neutral_to_actor(actor, npc, {"Название группировки"})
========================================================================== ПОРШЕНЬ НА ОДНОРАЗОВОЕ ПРОЧТЕНИЕ ДИАЛОГА. ========================================================================== прописываем в файле info_какойто.xml
в конце ветки диалога запишем Название поршня в начале диалога под id квеста запишем название поршня =========================================================================== ПОРШЕНЬ НА СКРЫТИЕ ДИАЛОГА ДО ПРОЧТЕНИЯ ОПРЕДЕЛЁНОГО ДИАЛОГА. ===========================================================================
прописываем в файле info_какойто.xml
В конце диалога после которого должна появиться новая ветка название поршня
в начале новой ветки под id прописываем название поршня теперь новый диалог недоступен пока мы не прочтём первый ================================================================================ ========== ПОРШЕНЬ НА ЗАПРЕТ ДИАЛОГА ЕСЛИ В ПРЕДИДУЩЕМ МЫ ПОСТАВИЛИ УСЛОВИЕ ПО КОТОРОМУ ЕГО НЕ БУДЕТ ================================================================================ ==========
прописываем в файле info_какойто.xml
В конце определяющего диалога ставим название поршня
под id квеста(диалога) который не должен появиться прописываем название поршня Теперь диалог не появится. ===============================================================================
function dead_body_spawn() npc=alife():create("чувак 1",vector():set(-243.6, -0.67, 309.62), 366014, 20) npc:kill(npc) end ---------------------------------------------------------------------------------- ------------------------------------ ------------------------------------------------- Забираем всё бабло у ГГ
function gop_stop_actor(actor, npc) local actor = db.actor all_money_actor = actor:money() if actor and npc then dialogs.relocate_money(npc, all_money_actor, "out") end end ------------------------------------------------------------------------------------------ ============================= ==========Телепортация актора=============================== Чтобы ГГ после диалога телепортировался в нужную точку, то можно воспользоваться функцией[code] function teleport_actor(actor, npc, p) local point = patrol(p[1]) local look = patrol(p[2])
db.actor:set_actor_position(point:point(0)) local dir = look:point(0):sub(point:point(0)) db.actor:set_actor_direction(-dir:getH()) end Это функция есть в файле xr_effects.script. Как она работает? Как-то так (кусочек файла sr_cutscene.script):
По всей видимости можно вместо фигурных скобочек указывать нужные координаты класса вектор.
А можно просто воспользоваться функцие set_actor_position и set_actor_direction по отдельности. Первую- для установки позиции, вторая - для установки взгляда. Здесь вызов идет вот-так:
, а если проще, то можно писать просто координаты. Эти функции работают ТОЛЬКО в пределах уровня на котором находиться ГГ!!! ---------------------------------------------------------------------------------------------------------
Автор: Неизвестен --------------------------------------------------------------------------------------------------------- Вот еще:
"Функции" "Спавн НПС(или предмета)" Код function spawn_x14 () alife():create("Секция",vector():set(-7.32,-34.48,13.18),1542,2799) end --------------------------------------------- "Проверка на взятие предмета и выдача инфопоршня" Функции типа "Проверка на взятие предмета..." я лично использую в квестах тегами Код <function_complete>файл.функция</function_complete> Код function search_weapon_complete1(actor, npc) if db.actor ~= nil then if db.actor:object("ПРЕДМЕТ") then db.actor:give_info_portion("ПОРШЕНЬ") return true end end return false end --------------------------------------------- "Проверка на взятие нескольких разных предметов и выдача инфопоршня" Код local t_wpn = {"ПРЕДМЕТ1", "ПРЕДМЕТ1", "ПРЕДМЕТ1"} function search_ALL_weapons_complete() local gg = db.actor if gg then for i=1,#t_wpn do if not gg:object(t_wpn[i]) then return false end end gg:give_info_portion("ПОРШЕНЬ") return true end return false end --------------------------------------------- "Проверка на взятие N-колличества одного и того же предмета(например 10 аптечек)" Основная функция: Код function Actor_Has_ListItems(sSection,iNum) if not iNum then iNum = 1 end local oActor = db.actor local iCnt = 0 if oActor and sSection then oActor:iterate_inventory( function (dummy, oItem) if oItem:section() == sSection then iCnt = iCnt + 1 if iCnt >= iNum then return true --/> актор имеет N предметов end end end ,nil) end return iCnt >= iNum --/> имеет ли актор N предметов endВызов: Код function search_2_bumazhki_sidr_complete() return this.Actor_Has_ListItems("medkit", 10) end --------------------------------------------- "Проверка на взятие предмета(обычная)" Код function search_weapon_complete(actor, npc) if db.actor ~= nil then return db.actor:object("wpn_vintorez")~=nil end return false end --------------------------------------------- "Вызов .РРЕ эфекта через диалог(Типа Удар в морду)" Код function punch() -- set_inactivate_input_time(30) local snd_obj = xr_sound.get_safe_sound_object([[affects\hit_fist]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) level.add_cam_effector("camera_effects\fusker.anm", 999, false, "") end --------------------------------------------- "Уменьшение(Увеличение)репутации ГГ" Отнимаем: Код function reputation_down_10(stalker, player) db.actor:change_character_reputation(db.actor:character_reputation() - 10) end Плюсуем: Код function reputation_up_10(stalker, player) db.actor:change_character_reputation(db.actor:character_reputation() + 10) end --------------------------------------------- "Уменьшение здоровья" Код function malo_hp() db.actor.health = -0.3 --Минус 30% дезек end --------------------------------------------- "Удаление нескольких одинаковых предметов(например удалим 7 аптечек)" Код function Delete_2_bumazhki_sidora_from_Actor() local cnt = db.actor:object_count() local ch=0 for i=0, cnt-1 do local item = db.actor:object(i) if item:section() == "medkit" then local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) ch = ch+1 if ch == 7 then --7 - кол-во удаляемых аптечек break end end end end end ----------------------------------------------------------------------- "Функция рамдомного удаления предметов из инвентаря ГГ" Код function ReleaseRandomItem(num) local actor = db.actor local cnt = actor:object_count() if cnt<num then return end for i=1,num do local item = actor:object(math.random(0, cnt-1)) local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) cnt = actor:object_count() end end end вызывать так: Код ReleaseRandomItem(5) -- 5 - число удаляемых предметов Вызов через диалог: Код function RRI() имя_файла.ReleaseRandomItem(5) end Пример: Код <action>имя_файла.RRI</action> --------------------------------------------- "Заходим на локацию и меняем группировку" Код function join_monolith (actor, npc) -- ставить на дельта апдейт printf ("ACTOR NOW IN имя группировки COMMUNITY") if db.actor and level_id.имя уровня then -- пример l01_escape и т.п db.actor:set_character_community ("имя группировки", 0, 0) end end --------------------------------------------- "Удаление всего и вся из инвентаря - и пда, и болт, и фонарик, и бинокль, и детектор" Код function test_index() local cnt = db.actor:object_count() for i=0, cnt-1 do local item = db.actor:object(i) local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) end end end --------------------------------------------- "Таймер" "Вариант без вывода на худ" Код local iTimer function Start_Timer_5_minutes() --/ (пере)запуск таймера (из диалога) iTimer = time_global() + 5*1000 --/ взводим таймер на 5cek end
function Timer_N_minutes() --/ вызывается из ':update' сталкер-биндера if iTimer and iTimer < time_global() then --/ проверка текущего значения iTimer = nil --/ выключаем таймер скрипт.функция() --/ выполняем действие end end "Вариант с выводом на худ" Код local iTimer local last function start_timer_minutes_test(seconds) if last~= nil then iTimer = time_global()+last --/ взводим таймер на остаток времени last else iTimer = time_global() + 7*1000 --/ взводим таймер например 7 сек. end end
function timer_n_minutes_test() --/ вызывается из ':update' сталкер-биндера if iTimer then last=iTimer-time_global() -- присваиваем переменной остаток времени до конца работы таймера if iTimer < time_global() then iTimer = nil --/ выключаем таймер last=nil СКРИПТ.ФУНКЦИЯ--/ выполняем действие end end end
-- выводим значение таймера в обратном отсчете на худ function hud_static() --/ вызывается из ':update' сталкер-биндера local hud = get_hud() local st if iTimer then st = hud:GetCustomStatic("hud_timer") if st==nil then hud:AddCustomStatic("hud_timer", true) st = hud:GetCustomStatic("hud_timer") end if last~=nil then local hours = math.floor(last/3600000) local minutes = math.floor(last/60000 - hours*60) local seconds = math.floor(last/1000 - hours*3600 - minutes*60) local text = string.format("%02d:%02d:%02d",hours,minutes,seconds) -- выводим время в формате 00:00:00 --local text=string.format("%.f",last/1000) st:wnd():SetTextST(text) end else if hud:GetCustomStatic("hud_timer")~=nil then hud:RemoveCustomStatic("hud_timer") end end end --------------------------------------------- "Расчет попадания в НПС(Выводится информации - в какую часть тела попал)" Автор:Николай ФеНиКс(ФеНиКс) Код if bone_index > 0 and who then if who:id() == db.actor:id() then --/ для актора local oActiveItem = db.actor:object("wpn_svd") if oActiveItem then --/ у актера проверяемое оружие local kuda = "" if bone_index == 14 or bone_index == 15 then kuda = "Ранен в глаз" elseif bone_index == 13 then kuda = "Ранен в голову" elseif bone_index == 16 then kuda = "Ранен в челюсть" elseif bone_index == 17 then kuda = "Ранен в шею" elseif bone_index == 9 or bone_index == 10 or bone_index == 11 or bone_index == 18 then kuda = "Ранен в грудь" elseif bone_index >= 1 and bone_index <= 8 then kuda = "Ранен в ногу" elseif bone_index >= 19 and bone_index <= 42 then kuda = "Ранен в руку" end news_manager.send_tip(db.actor, kuda, nil, nil, 2000) end end end Вставлять функцию в мотиватор в функцию hit_callbak. Например, после этого: Код if self.st.hit then xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index) end --------------------------------------------- "Функция для квестов(типа убить группу сталкеров, например, пятерых)" Код function mochim_five_nps() if has_alife_info("первый_грохнут") and has_alife_info("второй_грохнут") and has_alife_info("третий_грохнут") and has_alife_info("четвертый_грохнут") and has_alife_info("и_пятый_наконец") then return true else return false end end Использование: В теле квеста пишем complete'ы: Код <infoportion_complete>esc_kvest_secret_merc_kill_poslannick</infoportion_complete> <function_complete>имя_файла.mochim_five_nps</function_complete> После выполнения условий функции mochim_five_nps выдается поршень esc_kvest_secret_merc_kill_poslannick и задание обновляется. --------------------------------------------- "Спавн предмета или НПС с меткой в ПДА" Код local ObjId=0 function pda_killer_spawn() local obj= alife():create("pda_merc_killer_glav",vector():set(-223.700,-7.678,-129.688),17000,281) local text = "Текст метки" level.map_add_object_spot_ser(obj.id, "blue_location", text) --/blue_location - тип метки ObjId=obj.id end Эту метку можно удалить так: Код function delete_spot() for a=1,65534 do --Перебор айди local obj = alife():object(a) if obj and obj:section_name() == "pda_merc_killer_glav" then --/pda_merc_killer_glav -- Секция предмета или НПС level.map_remove_object_spot(obj.id,"blue_location") break end end end --------------------------------------------- "Вешаем метку в ПДА по Sid'у(Например на Волка)" Код local obj = alife():story_object( 6 ) -- 6 - сид Волка local obj_id = obj.id function add_spot_on_map(obj_id,type,text) if obj_id then if not text then text = "no_text" end level.map_add_object_spot_ser(obj_id, type, text) end end Вызываем: Код function add_spot_on_map2(obj_id,type,text) имя_файла.add_spot_on_map(obj.id,"green_location","Текст") end Метку можно убрать вот так: Код local obj = alife():story_object( 6 ) local obj_id = obj.id function remove_spot_from_map(obj_id,type) if obj_id and level.map_has_object_spot(obj_id, type) ~= 0 then level.map_remove_object_spot(obj_id, type) end end эту вызывать: Код function remove_spot() this.remove_spot_from_map(obj.id,"green_location") end --------------------------------------------- "Вывод сообщения на экран" Код function kvest_search_2_bumazhki_sidr_complete() news_manager.send_tip(db.actor, "%c[255,255,128,128]Автор сообщения\n%c[default]Текст сообщения", 0, "wolf", 17000) end --------------------------------------------- "Еще способ вывода сообщения" Код local text = "Здесь текст" function test() news_manager.send_tip(db.actor, text, 0, "trader", 20000) end --------------------------------------------- "Заставляем диалог появиться самому на примере Волка(подходим к Волку и диалог появляется сам)" Спавним рестриктор на координатах Волка с радиусом метра 2.Делаем логику рестриктору: Код [logic] active = sr_idle
[sr_idle] on_actor_inside = %+esc_on_talk% ;Выдача поршня ;Или так(Выбрать одно): on_actor_inside = %=on_talk%" ;Функция Если выбрали поршень, то создаем его: Код <info_portion id="esc_on_talk"> <action>СКРИПТ.on_talk</action> </info_portion> Вызываем функцию и видим диалог: Код function on_talk() local npc = level_object_by_sid(006) db.actor:run_talk_dialog(npc) end --------------------------------------------- "Делаем некоторых НПС бессмертными" Код function immotral() local npc1 = level_object_by_sid(006) --волк local npc2 = level_object_by_sid(092) --проводник local npc3 = level_object_by_sid(032)-- кузнецов local npc4= level_object_by_sid(100) --Серый if npc1 then npc1.health = 1 end if npc2 then npc2.health = 1 end if npc3 then npc3.health = 1 end if npc4 then npc4.health = 1 end endВ голову дохнут. --------------------------------------------- "Отправляем НПС в другую группировку(например Волка)" Код function name() local npc = level_object_by_sid(006) npc:set_character_community("имя группировки", 0, 0) end Если разговариваем с самим Волком, то вызываем эту функцию: Код function name(actor, npc) npc:set_character_community("имя группировки", 0, 0) end --------------------------------------------- "Удалим предмет из игры (или сталкера из игры(Удалим Волка))" Код function dell_kluk_final() local se_obj = alife():object("esc_wolf") if se_obj then alife():release(se_obj, true) end end --------------------------------------------- "При вызове происходит использование антирада" Код function do_something() local item = db.actor:object("antirad") if antirad then db.actor:eat(item) end end Должно быть так: Код function do_something() local item = db.actor:object("antirad") if item then db.actor:eat(item) end end --------------------------------------------- "Проверка:Какой костюм одет(не одет)(например, Экзоскелет)" Надет ли костюм Код function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" одет else return false --/"exo_outfit" не одет end end Не надет ли костюм Код function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" не одет else return false --/"exo_outfit" одет end end --------------------------------------------- "Наносим хит предмету" Код function hit_nanesti() for a=1,65635,1 do local obj=level.object_by_id(a) if obj and string.find(obj:name(),"ПРЕДМЕТ") then local h = hit (); h.power = 10000; h.direction = vector():set (0, 0, 0); h.impulse = 0; h.draftsman = obj; h.type = hit.explosion; obj:hit (h); end end end --------------------------------------------- "Проверяет, находится ли, например, Волк на локации Кордон" Код function rest() local npc = level_object_by_sid(006) --волк if npc and level.name() == "l01_escape" then return true else return false end end --------------------------------------------- "Проверка:Например на Кордоне находится ГГ или нет" Код function go_to_marsh_complete() if level_name == "l01escape" then return true else return false end end --------------------------------------------- Еще функции (Для ТЧ).
"Функции"
"Убить НПС"
Код function kill_stalker(actor, npc) npc:kill(npc) end
"Как, через скрипт, сделать НПС врагом?"
Код function enemy(actor, npc) npc:set_relation (game_object.enemy, db.actor) end
"Как создать функцию вызова звукового сигнала и проиграть ее в голове ГГ?"
Код function any_sound() local snd = sound_object([[characters_voice\human_03\stalker\talk\leaves\leaves_42]]) snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0) end
"Еще один способ спавна НПС (или предмета)."
Код function НАЗВАНИЕ_create() local x= local y= local z= local level_vertex= local game_vertex_id= alife():create("НАЗВАНИЕ",vector():set(x,y,z),level_vertex,game_vertex_id) end
"Как запустить много функций одной связкой?"
Например: Код function all_spawn() НАЗВАНИЕ_create() any_sound() end
function НАЗВАНИЕ_create() local x= local y= local z= local level_vertex= local game_vertex_id= alife():create("НАЗВАНИЕ",vector():set(x,y,z),level_vertex,game_vertex_id) end
function any_sound() local snd = sound_object([[characters_voice\human_03\stalker\talk\leaves\leaves_42]]) snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0) end --------------------------------------------- "Различные скриптовые проверки (для совсем «зелёных»):" (Для SCoP)
1. Проверка на то, что ГГ находится в укрытии от выброса: Код function название_функции() if surge_manager.actor_in_cover() then --действие end end
2. Проверка на то, что ГГ НЕ находится в укрытии от выброса: Код function название_функции() if not surge_manager.actor_in_cover() then --действие end end
3. Проверка на то, что ГГ жив: Код function название_функции() if db.actor:alive() then --действие end end
4. Проверка на то, что ГГ мёртв: Код function название_функции() if not db.actor:alive() then --действие end end
5. Проверка на то, что в данный момент идёт выброс: Код function название_функции() if surge_manager.is_started() then --действие end end
6. Проверка на то, что в данный момент нет выброса: Код function название_функции() if surge_manager.is_finished() then --действие end end
7. Проверка на наличие заданного кол-а денег у ГГ: Код function название_функции() local money = 1000 - заданное кол-во денег if db.actor:money() >= money then --действие end end
8. Проверка на отсутствие заданного кол-а денег у ГГ: Код function название_функции() local money = 1000 - заданное кол-во денег if db.actor:money() < money then --действие end end
9. Проверка на то, что у ГГ совсем нет денег: Код function название_функции() if db.actor:money() == 0 then --действие end end
10. Проверка на то, что ГГ имеет при себе какой-либо предмет: Код function название_функции() if db.actor:object("предмет") ~= nil then --действие end end
11. Проверка на то, что ГГ НЕ имеет при себе какой-либо предмет: Код function название_функции() if db.actor:object("предмет") == nil then --действие end end Может и пригодиться кому...
О, полезно, автору респект! Только вот про проверку инфопоршня в диалоге надо было по подробнее расписать. Например : проверку поршня в диалоге нужно под id вписать <has_info>ваш_поршень</has_info>, а то я думаю новичкам будет не понятно.
XOBAH, лично я бы не рекомендовал это делать, во всяком случае так, как предлагаешь ты, по правде сказать, методом KazakHD5770, я бы то же не воспользовался. Начну по порядку. Функция KazakHD5770:
Code
function Название_функции() if db.actor:object("название_предмета") ~= true then return true end return false end
несколько не корректна. Дело в том, что функция object возвращает объект класса game_object из инвентаря актора, по имени её секции в system.ltx. Для булевых значений ноль эквивалентен false, любое же другое отличное от нуля значение, позиционируется как true. Поэтому в случае когда у актора не окажется указанного предмета функция object вернёт nil, а это в свою очередь отсутствие вообще какого-либо значения, это не ноль, не какое-то другое число, одним словом - ничего. Вот тут и возникнет ошибка сравнения nil ~= true. Поэтому я бы переписал эту функцию несколько иначе:
Code
function Название_функции() if db.actor:object("название_предмета") == nil then return true end return false end
Предложенный вариант от XOBAH, несколько короче, но всё же приводит к тому же результату, если и укорачивать функцию, то возвращать результат следует явно, а не возвращать объект по секции:
Code
function Название_функции() return db.actor:object("название_предмета") == nil end
Функция вернёт true в случает отсутствия предмета у актора.
ColR_iT, Но работать будут и те, и другие функции. Lua сильно похож на JS, а в нем, в логических операциях с объектами, любое определенное, не пустое, значение будет возвращать true, в остальных случаях будет возвращать false
XOBAH, нет не будет. Проверь! Ещё раз повторюсь. Функция object возвращает объект, не число, не булево значение, не строку, а объект целого класса, т.е. у него есть куча свойств и методов и сравнивать его с не true - это не правильно. Нужно сравнивать с наличием предмета либо его отсутствием, а это проверка:
Code
if db.actor:object("название_предмета") == nil then
P.S. Я тоже похож на своего брата, но мы такие разные.
Сообщение отредактировал ColR_iT - Понедельник, 04.06.2012, 17:35
ColR_iT, Вот функция на проверку наличия артефакта "Медуза" из SGM (у меня, и у кучи других пользователей такая проверка в диалоге к вылету не приводит):
Code
function breeder_has_1(actor,npc) return db.actor:object("af_medusa") end
Также, в SGM моде полно подобных проверокЯ не думаю, что Вы будете сильно отличаться от своего брата :)
Quote (Wikipedia)
По возможностям, идеологии и реализации язык ближе всего к JavaScript, однако Lua отличается более мощными и гораздо более гибкими конструкциями. Хотя Lua не содержит понятия класса и объекта в явном виде, механизмы объектно-ориентированного программирования с поддержкой прототипов (включая множественное наследование) легко реализуются с использованием метатаблиц, которые также делают возможной перегрузку операций и т. п. Реализуемая модель ООП (как и в JavaScript) — прототипная.
Вот описание boolean-типа в JavaScript:
Если аргумент не указан или равен:
0,
-0,
null,
false,
NaN,
undefined,
или пустая строка (""),
то объект инициализуется как false. Все остальные значения, включая объекты и строку "false" создают объект с начальным значением true.
Ну а в Lua, если метод вернет nil - получим false, вернет объект - получим true
Сообщение отредактировал XOBAH - Понедельник, 04.06.2012, 18:53