Хемуль36рус 1 789 Опубликовано 22 Ноября 2014 Поделиться Опубликовано 22 Ноября 2014 Что-то не пойму, мне нужно что бы спальник не появлялся в инвентаре .Сделал вот так --'amk.spawn_item_in_inv("matras") end end function test_for_need_sleep_tr_item(oid) if alife():object(oid)==nil then if news_main then news_main.create_treasurebox() end end end Он появляется. просто при использовании исчезает, что не так, подскажите нубу, в скриптах я он и есть. Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g. Ссылка на комментарий
Хемуль36рус 1 789 Опубликовано 22 Ноября 2014 Поделиться Опубликовано 22 Ноября 2014 @Dennis_Chikin, ты меня не понял, мне просто нужно что бы спальник не появлялся в инвентаре при новой игре. Он будет квестовым предметом. Вот кусок из амк_мод.скрипт. В нем можно оключить спавн спальника в инвентарь? --'******************************************************************************* --' ** ** ** ** ** ** ** ** SLEEP_AMK ** ** ** ** ** ** ** ** ** --'******************************************************************************* function reduce_need_sleep(time) local tmp=amk.load_variable("gg_need_sleep",0) tmp=tmp-time*120 if tmp<0 then tmp=0 end amk.save_variable("gg_need_sleep_nrg",0) amk.save_variable("block_sleep_menu",0) amk.save_variable("gg_need_sleep",tmp) test_sleep_pp() end function test_for_need_sleep() if sleep_manager.is_sleep_active() == false then amk.save_variable("gg_need_sleep",amk.load_variable("gg_need_sleep",0)+1) test_sleep_pp() end amk.g_start_timer("gg_need_sleep",0,0,6) end function test_sleep_pp() local tmp=amk.load_variable("gg_need_sleep",0) if tmp>360 then sleep_manager.main(5+amk.load_variable("gg_need_sleep_nrg",0)) end if tmp>300 then level.add_pp_effector("yantar_underground_psi.ppe", 999, true) level.set_pp_effector_factor(999, 5.0) end if tmp<=300 then level.remove_pp_effector(999) end end function check_sleep_item(obj) local flagg = amk.load_variable("flagg") local section = obj:section() local stype=nil if section=="energy_drink" then stype="nrg" --'elseif (section=="medkit" or section=="medkit_army" or section=="medkit_scientic") then --' stype="med" elseif section=="matras" then stype="matras" elseif section=="repbox_s1" and flagg ~= 1 then amk.start_timer("sleep_repbox",0.1,amk.pack_array_to_string( {obj:id(), obj:condition(), 1} )) elseif section=="repbox_s2" and flagg ~= 1 then amk.start_timer("sleep_repbox",0.1,amk.pack_array_to_string( {obj:id(), obj:condition(), 2} )) elseif section=="repbox_s6" and flagg ~= 1 then amk.start_timer("sleep_repbox",0.1,amk.pack_array_to_string( {obj:id(), obj:condition(), 6} )) elseif section=="treasure_item" then stype="tr_item" end if stype~=nil then amk.start_timer("sleep_"..stype,0.1,obj:id()) end end function test_for_need_sleep_nrg(oid) if alife():object(oid)==nil then local n=amk.load_variable("gg_need_sleep_nrg",0) if n<3 then amk.save_variable("gg_need_sleep_nrg",n+1) amk.save_variable("gg_need_sleep",amk.load_variable("gg_need_sleep",0)-30+n*10) test_sleep_pp() end amk.g_start_timer("block_sleep_menu",0,1,0) amk.save_variable("block_sleep_menu",1) end end --[[ function test_for_need_sleep_med(oid) if alife():object(oid)==nil then amk.save_variable("gg_need_sleep",amk.load_variable("gg_need_sleep",0)+5) test_sleep_pp() end end ]]-- function test_for_need_sleep_matras(oid) if alife():object(oid)==nil then local enemy=false local obj local level_object_by_id = level.object_by_id local actor = db.actor local actorPos = actor:position() for npcId, npc in pairs(db.storage) do obj = level_object_by_id(npcId) if obj then if (( IsStalker(obj) and amk.get_npc_relation(obj,db.actor)=="enemy" ) or IsMonster(obj)) and obj:position():distance_to(db.actor:position())<40 and obj:see(db.actor) then enemy=true break end end end if enemy==true then amk.send_tip(game.translate_string("not_need_sleep_enemy"),nil,nil,5) else if amk.load_variable("blowout",-1)>-1 and amk.load_variable("blowout",-1)<5 then amk.send_tip(game.translate_string("blowout_not_sleep"),nil,nil,5) else if amk.load_variable("block_sleep_menu",0)==0 then --if amk.load_variable("gg_need_sleep",0)>10 then if amk.load_variable("gg_need_sleep",0)>0 then local spwn=ui_cheat.cheat(get_hud()) level.start_stop_menu(spwn,true) else amk.send_tip(game.translate_string("not_need_sleep"),nil,nil,5) end else amk.send_tip(game.translate_string("not_need_sleep_nrg"),nil,nil,5) end end end amk.spawn_item_in_inv("matras") end end function test_for_need_sleep_tr_item(oid) if alife():object(oid)==nil then if news_main then news_main.create_treasurebox() end end end Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 22 Ноября 2014 Поделиться Опубликовано 22 Ноября 2014 (изменено) amk.spawn_item_in_inv("matras") -- это создание спальника. Но это, вроде, не новая игра, а именно переспавн. При использовании. Вообще я не знаю, в какой игре он при старте создается - вроде бы везде по диалогу. Но в любом случае надо найти аналогичные строчки, с созданием этого матраса, тупо поиском по файлам, и убрать. В этих кусках кода "стартового" создания нет. Изменено 22 Ноября 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Outfater 288 Опубликовано 23 Ноября 2014 Поделиться Опубликовано 23 Ноября 2014 (изменено) Хочу сделать чтобы при взятии записки из тайника появлялся другой тайник (как в ОП-2 Коллекционер). В файле bind_stalker.script в самый низ этой функции добавил: function actor_binder:on_item_take (obj) level_tasks.proceed(self.object) if xrs_ai then xrs_ai.actor_item_take(obj) end --game_stats.update_take_item (obj, self.object) inventory.on_item_take(obj) -- added by xStream for AMK miniSDK amk.on_item_take(obj) -- end of addition repack_ammo.on_take(obj) if rx_ai then rx_ai.actor_item_take(obj)end art_hit.hit_by_art(obj) --verg_art_hit.on_item_take(obj) --visual_fix if obj:clsid() == clsid.equ_stalker_s or obj:clsid() == clsid.equ_exo then local outfit = db.actor:get_current_outfit() if outfit and outfit:id() ~= obj:id() then db.actor:transfer_item(outfit, db.actor) if db.actor then name = obj:section() if db.actor:object("bread") ~= nil then db.actor:give_info_portion("boxkvest2_dal") end end end end end При этом инфопоршень выглядит так: <info_portion id="boxkvest2_dal"><action>kvestovik.spawn_boxkvest2</action></info_portion> Но при наличии хлеба тайник boxkvest2 не появляется. Что не так? @Хемуль36рус, По моему в акторе это настраивается, там где аттачмент. Изменено 23 Ноября 2014 пользователем Outfater Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 23 Ноября 2014 Поделиться Опубликовано 23 Ноября 2014 (изменено) Вот прямо так добавил то, что зеленым, и оно даже не вылетает ? Хотя и не работает ? Во-первых, взятие из тайника, это function actor_binder:take_item_from_box() Во-вторых, if obj:section() == "bread" then db.actor:give_info_portion( "boxkvest2_dal" ) end Где obj - второй аргумент take_item_from_box() - вот что там в скобках после запятой, то и должно быть. В-третьих, даже если имеется kvestovik.spawn_boxkvest2(), и оно написано правильно, а не так, как извращен bind_stalker, то где именно оно есть, чтобы вообще срабатывало ? Ну и это дурной тон, пихать в xml кучу всякого. здесь же, в take_item_from_box() пишется if obj:section() == "bread" then kvestovik.spawn_boxkvest2() end, а уже там выдается инфо, и вообще все, что душе угодно. Кстати, сам себя не похвалишь - ни кто не похвалит. http://www.amk-team.ru/forum/index.php?showtopic=8830&p=893852- про похождения Петрухи и прочих Кротов с долговцами в оффлайне. Изменено 23 Ноября 2014 пользователем Dennis_Chikin 1 2 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Outfater 288 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) @Dennis_Chikin, Спасибо, работает и с одной if obj:section() == "bread" then db.actor:give_info_portion( "boxkvest2_dal" ) end. А второе условие if obj:section() == "bread" then kvestovik.spawn_boxkvest2() end я так понял, для вызова функции напрямую без поршня? Да. dc Изменено 24 Ноября 2014 пользователем Dennis_Chikin Ссылка на комментарий
groks 439 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 Может кто поможет с атакой кровососа? Есть понятное: -- Поцелуй кровососа (Авторы: Artos, Charsi, Shadows)if self.object:clsid()==clsid.bloodsucker_s and self.object:section()~="bloodsucker_effector" thenlocal oTarget = self.object:get_enemy()if oTarget and IsStalker(oTarget) and self.object:see(oTarget) thenlocal iDist = self.object:position():distance_to(oTarget:position())if iDist <= 3 thenlocal iTime = time_global()if (self.timer_anim or 0) < iTime thenself.timer_anim = iTime + 2000if oTarget:id()~=0 and self.object:position():distance_to(db.actor:position()) < 5 thensound_object("monsters\\bloodsucker\\vampire_sucking"):play_at_pos(db.actor,vector():set(0,0,1),0,sound_object.s2d)endif oTarget:id()==0 thenif NextAttack < iTime and self.object.health < 0.5 thenNextAttack = iTime + 18000RestoreActor = iTime + 4500DirActor = truedb.actor:hide_weapon()level.disable_input()level.hide_indicators()level.add_call(bloodsucker_vampire_timer,bloodsucker_actor_release)level.add_pp_effector("escape.ppe",1975,true)level.add_cam_effector("camera_effects\\drunk.anm",1978,false,"")local oSnd = sound_object("monsters\\bloodsucker\\vampire_sucking")if not (oSnd and oSnd:playing()) then oSnd:play_no_feedback(oTarget,sound_object.s2d,0,vector(),5.0) endendif DirActor thenlocal pos = self.object:position()local vDir = pos:sub(oTarget:position())db.actor:set_actor_direction(-vDir:getH())vDir:normalize()local pos = self.object:position():sub(vDir)db.actor:set_actor_position(pos)endendendif self.timer_anim and self.timer_anim >= iTime and DirActor thendb.actor.health = -0.002self.object.health = 0.008endendendend И есть смутное: --/#+# 'засос кровососа боксёра' --------------------------------------------------if self.object:clsid() == clsid.bloodsucker_s and self.object.health > 0.25 thenlocal oTarget = self.object:get_enemy()if oTarget and IsStalker(oTarget) and self.object:see(oTarget) then--/ если у кровососа есть враг/цель и кровосос его видит то ...local iDist = self.object:position():distance_to(oTarget:position())if iDist <= 2 then --/ дистанция для анимации 'засоса'local iTime = time_global()--/ таймер для анимации и хита ...if (self.timer_anim or 0) < iTime thenself.timer_anim = iTime + 500 --/ таймер анимации ~ 0.5 секif self.object:animation_count() > 0 thenself.object:clear_animations()endself.object:add_animation("wounded_2_out") --/ варианты: "vampire_0" | "idle"--/ озвучка 'засоса'local oSnd = sound_object("material\\dead-body\\collide\\hithard06hl")oSnd:play_no_feedback(oTarget, sound_object.s2d, 0, vector(), 5.0)end--/ хит жертве (притягиваем)if (self.timer_hit or 0) < iTime and (self.timer_anim and self.timer_anim + 200 >= iTime) thenself.timer_hit = iTime + 10 --/ таймер хита ~ 0.1 секlocal vDir = self.object:direction() --/ вектор кровососаlocal vDirHit = vector_rotate_y(vDir,179.0)local h = hit()h.draftsman = self.objecth.direction = vDirHit --/ направление хитаh:bone("bip01_spine") --/ для учета 'брони'h.power = 0.02level.add_cam_effector("camera_effects\\fusker.anm",959,false,"")h.impulse = 50/iDist --/ чем ближе - тем сильнее 'засос'h.type = hit.wound --hit.strikeoTarget:hit(h) --/ наносим хит жертве--/ разворот жертвы на кровососа. TODO: требует доработки/замены!if oTarget:id() == db.actor:id() then --/ жертва == актор? (а нужно?)oTarget:set_actor_direction(vDirHit:getH())endendendendend--/<----------------------------------------------------------------------- Второе выдернуто из http://www.amk-team.ru/forum/index.php?showtopic=12793 Ну хит я подрезал, ну время атаки можно. Но атака идёт бесконечно и без пауз. Практически нереально выжить. Врезать первый вариант не получается - анимация другая. Можно сделать паузу между атаками во втором варианте? Ссылка на комментарий
AndreySol 215 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) Спасибо, работает и с одной if obj:section() == "bread" then db.actor:give_info_portion( "boxkvest2_dal" ) end Похоже, что любое взятие хлебушка из любого инвентарного ящика будет проходить проверку, и соответственно выполнять назначенное действие... Условия проверки надо доработать, в соответствии с одноразовостью(или нет ?) действия. Изменено 24 Ноября 2014 пользователем AndreySol Ссылка на комментарий
Max_Raf 35 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 Привет всем, возник вопрос: как можно моментально узнать мёртв ли объект или нет? Нужно узнать почти сразу же - мёртв ли сталкер после метода obj:kill(obj). Метод obj:alive() не предлагать, пробовал - метод говорит что сталкер всё ещё жив. ... А наше дело маленькое - с ружьём да по болотам. (с) Ссылка на комментарий
RayTwitty 492 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) Нужно узнать почти сразу же - мёртв ли сталкер после метода obj:kill(obj). Метод obj:alive() не предлагать, пробовал - метод говорит что сталкер всё ещё жив. local bAlive = true function MobKill(obj) obj:kill(obj) bAlive = false end function aaa() if not bAlive then ... end end Изменено 24 Ноября 2014 пользователем Shadows Ссылка на комментарий
Max_Raf 35 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) , с переменными как то не оч. Всё думаю как бы моментально изменить значения у серверного объекта и по нему ориентироваться в другой функции, ток не знаю какое значение менять, чтобы оно осталось даже если игра будет перезагружена. (коммьюнити не предлагать - этот "ориентир" уже используется)Я бы попробовал расписать: что надо, что есть, и в чем это выражается в каких случаях. Где именно проблема, как ее увидеть. Соответствующая тема как раз открыта. dc Изменено 24 Ноября 2014 пользователем Dennis_Chikin ... А наше дело маленькое - с ружьём да по болотам. (с) Ссылка на комментарий
RayTwitty 492 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) @Max_Raf, вроде кроме метода alive в скрипты ничего не экспортировано по этой теме. Так что остается либо такой костыль, либо если смогешь, то меняй в памяти какой-нибудь байт у этого объекта, а потом его читай где надо. З.Ы. health == 0 кстати пробовал? чтобы оно осталось даже если игра будет перезагружена. Так ведь после перезагрузки, если объект будет мертв, то и alive вернет фальс. Изменено 24 Ноября 2014 пользователем Shadows Ссылка на комментарий
Max_Raf 35 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) , пробовал, вроде не сработало. Ща ещё раз гляну. Да проблемы по сути нету никакой. Просто есть 3 функции. В первой сталкер самовыпиливается и функция завершается. Затем после неё идёт вторая функция в которой нужно проверить жив ли сталкер (идёт вторая) или нет (идёт третья). Вот и вопрос: как узнать почти что сразу, самовыпилился ли он для второй функции, иначе сработает третья функция. По сути можно и переменными в таблице, но интересно, есть ли другой способ без лишних заборов? К примеру коммьюнити ему сменить и потом проверять по ней (но это уже используется) , а если надо почти моментально? Получается надо и переменные и метод alive() вместе... но забор ведь) иными словами: нужен определённый "флаг" трупа который выставляется моментально. Изменено 24 Ноября 2014 пользователем Max_Raf ... А наше дело маленькое - с ружьём да по болотам. (с) Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) 1. obj.just_killed = true 2. if obj.just_killed or not obj:alive() then ... else ... end Переменная может быть любая из свободных. Изменено 24 Ноября 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Max_Raf 35 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 @Dennis_Chikin, мм способ по сути такой же как и у . Ладно, попробую чо нить придумать сам. Всем спс. ... А наше дело маленькое - с ружьём да по болотам. (с) Ссылка на комментарий
_Val_ 2 225 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 3 функции. В первой сталкер самовыпиливается А можно подробней про самовыпиливание? Что-это такое, раз после этого нужно проверять, жив ли он? С учетом того, что функция **суицида** к примеру убивает сталкера достаточно надежно. А из его логики всегда можно выдать посмертный поршень или вызвать любую функцию. Или это - "забор"? Ссылка на комментарий
Struck 61 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) , а функция kill точно жизни в 0 уводит? Я помню, что вроде она может и в отрицательную степь увести, но тебе с движком оно виднее. local bAlive = true function MobKill(obj) obj:kill(obj) bAlive = false end function aaa() if not bAlive then ... end end @Max_Raf, тут ты походу bAlive не сохранил, эта функция не может не работать. А так способ предложенный Денисом хороший (подобные вещи в юзердату писать), меньше мусора будет в дальнейшем. Изменено 24 Ноября 2014 пользователем Struck Ссылка на комментарий
Max_Raf 35 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) @Struck про kill: в первой функции ставил health в ноль вот так obj.health = - obj.health , затем во второй проверял obj.health <= 0. Итог - не прокатило. Но проверю ещё раз, мало ли напортачил. про bAlive и юзердату: (я не говорил что они не пашут) методы считай не особо отличаются, просто разные места для сохранений флага. Я видимо слабо уточнил - надо бы такой флаг, который бы остался даже при перезагрузке и был привязан к объекту, как пример - смена коммьюнити. P.S. Я много чего не знаю. Да забейте ребят, проблемы нет. Просто любопытно. Изменено 24 Ноября 2014 пользователем Max_Raf ... А наше дело маленькое - с ружьём да по болотам. (с) Ссылка на комментарий
RayTwitty 492 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) obj.just_killed = true Разве новые свойства таким образом можно задавать? Why not ? Ни чем не отличается от self.what_you_know = something из себя. dc Изменено 24 Ноября 2014 пользователем Dennis_Chikin Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 24 Ноября 2014 Поделиться Опубликовано 24 Ноября 2014 (изменено) "надо бы такой флаг, который бы остался даже при перезагрузке" - Но зачем ??? Можно еще db.storage[npc_id].pstor.your_var = true. Но а смысл ? Если :alive() замечательно работает ? Еще есть серверный объект, которому пишут в пакет, но зачем же ??? Короче, правильный ответ в этой телевикторине не угадал ни кто. 8( Изменено 24 Ноября 2014 пользователем Dennis_Chikin 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти