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

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

_Призрак_, а стОит ли называть более элегантным, если это вообще решение ли(?) того, чего хочет получить AndreySol (но нам пока не известно)?

Что дает в данном случае x-Ray Extensions? Всего лишь доступ к некоей цифирьке, которая говорит о некоем весе инфентаря, который каким-то только ему ведомым способом подсчитал движек. Попробуй сам проверить достоверность этой цифры ... Так что кроме простоты получения некоей близкой к истинной цифре - этот вариант более ничего не дает.

И, если бы посмотрел коды, то видно, что именно на попытке подсчитать с точностью веса одного патрона(!) в неполной пачке и имеет проблемы AndreySol. Если еще сюда отнести вес патронов в стволах, вес надетых аддонов на оружие, вес подствольных зарядов в подствольниках и т.п. - то задачка то не решается твоим "элегантным" вариантом ... ;-)

 

Добавлено через 6 мин.:

*Shoker*, зачем задавать вопрос, на который опять только погадалки можно дать и общие рекомендации по поиску кривого кода? Уж если не в терпеж 'помусорить' - делай это в топике по CS.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Ну забыл указать, что работаю с ТЧ v1.0005.

в подобном чтении, которое применяешь именно ты ...

это самое чтение я взял из примера "Перепаковщик патронов для SoC" с STALKER Inside Wiki. И в точно таком-же виде оно присутствует в скрипте vergas_lib.script в NLC 6.

Ссылка на комментарий

AndreySol

Опять повторю: а своя голова для чего?

Перепаковщик патронов - срабатывает именно по тэйк, т.е. на взятие предмета или на открытие ящика ... и НЕ нагружает игру.

По vergas_lib.script в NLC 6 - лучше бы не поминал, более "кривого и грязного" исполнения кодов (IMHO) редко в серьезных модах можно встретить, и также, никак не предназначен для работы в каждом апдейте актора!

И, видно ты не читаешь тексты ответов, ведь ясно сказал, что на ТЧ твой код работает, ну а то, что у тебя рушится - ищи в своей реализации.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

AndreySol

Перефразируя вышесказанное, я бы дал такой совет: СтОит почаще задумываться над тем, как вашему компьютеру приходится ПАХАТЬ порой, для выполнения вами написанного кода. И озадачиваться вопросом - а нужно ли так нагружать машину для достижения того, что вам надобно?

И утверждения вида "вот там и вон там сделали вот так! значит это истина!" приводят в ужас. На заборе тоже всегда только истину пишут?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Так как раньше тема называлась "скриптирование, спавн и логика" и более подходящей темы для моего вопроса нет, то я задам его сдесь.

 

Мб кто знает почему на движке ЗП вертолет, после пролета по паре точек, начинает лететь криво, тоесть: вот он спавнится, летит нормально мордой вниз хвост вверх, но при пролете через пару точек он начинает менять свое положение противоположно - морда вверх и хвост вниз, и потом летит так постоянно?

Что пробывал:

1) делал точки как в ТЧ

2) все скрипты/конфиги были взяты из ТЧ и переделаны/адаптированы под ЗП

 

Результат:

все тоже самое :(

Изменено пользователем Viнt@rь
Ссылка на комментарий

Возможно проблема с точкой point_look.

Тоесть с точкой, куда смотрит вертолёт.

Как вариант она у тебя где то в небесах заспавнена или типа того.

Ну или ещё вариант, перемудрил со скоростью вертолёта. Не знаю где это регулируется в логике, но я когда управлял вертолётом напрямую через скрипт, при очень большой скорости он у меня чуть ли не вертикально летел (правда носом к низу, а не к верх)

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Уважаемый модератор, следуя вашему совету (но не помня предыдущее сообщение), пытаюсь повторить свой номер с вопросом. Понимая всю свою тупость, но не имея времени на быстрое её преодоление, полагаюсь на вашу волю и терпение.

Вопрос: возможно ли применить способ действия аптечки из мода Л.У.Р.К. (ТЧ) в моде Народная солянка (ТЧ).

Изменения скриптов я делал на основе вот этого:

Для начала создадим скрипт. Например health_effect.scripts:

 

---Система еды и постепенного лечения из Лурк мода---

objectinuse=0
objectused=0

--If/then statements for finding the item.
function start(obj)
snd = xr_sound.get_safe_sound_object([[$no_sound]])
    if (db.actor~=nil) and (obj~=nil) then
    slotinuse=db.actor:active_slot()
    slot_div=1
        if obj:section() == "medkit" or obj:section() == "medkit_army" or obj:section() == "medkit_scientic" then
        snd= xr_sound.get_safe_sound_object([[interface\inv_medkit]])
        holster_time=time_global()+7000
            if (objectinuse==1) then
            holster_time=holster_time+7000
            end
        soundhub()

        elseif obj:section() == "antirad" then
        snd= xr_sound.get_safe_sound_object([[interface\inv_pills]])
        holster_time=time_global()+6000
            if (objectinuse==1) then
            holster_time=holster_time+6000
            end
        soundhub()

        elseif obj:section() == "bandage" then
        snd= xr_sound.get_safe_sound_object([[interface\inv_bandage]])
        holster_time=time_global()+6000
            if (objectinuse==1) then
            holster_time=holster_time+6000
            end
        soundhub()

        elseif obj:section() == "vodka" then
        snd= xr_sound.get_safe_sound_object([[interface\inv_vodka]])
        holster_time=time_global()+4000
            if (objectinuse==1) then
            holster_time=holster_time+4000
            end
        soundhub()

        elseif obj:section() == "energy_drink" then
        snd= xr_sound.get_safe_sound_object([[interface\inv_softdrink]])
        holster_time=time_global()+4000
            if (objectinuse==1) then
            holster_time=holster_time+4000
            end
        soundhub()

        elseif obj:section() == "bread" or obj:section() == "conserva" or obj:section() == "kolbasa" then
        snd= xr_sound.get_safe_sound_object([[interface\inv_food]]) 
        holster_time=time_global()+7000
            if (objectinuse==1) then
            holster_time=holster_time+7000
            end
        soundhub()
        end

    end
end

--Other stuff executes from here.
function soundhub()
    if db.actor:alive() then
    snd:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
    snd = xr_sound.get_safe_sound_object([[$no_sound]])
        if (objectinuse==0) then
        db.actor:hide_weapon()
        objectinuse=1
            if slotinuse == 1 then
            slot_div = ((holster_time-time_global())/1.5)
            else
            slot_div = 0
            end
        end
    objectused=objectused+1
    weapontimer()
    end
end

--Holster time. Its set up as additive: A food and a drink taken together will apply instantly, but your gun is holstered for 9 seconds.
function weapontimer()
    if (holster_time~=nil) and (time_global()>(holster_time-slot_div)) and level.present() then
    objectused=objectused-1
        if (objectused==0) then
        db.actor:restore_weapon()
        objectinuse=0
        holster_time=nil
        end
    end
end

--Message for time remaining and math.Round function. Not used.
--[[
function message()
news_manager.send_tip(db.actor, tostring(math.Round((holster_time - time_global())/1000)).."s", nil, nil, 1000)
end

--Math.round
function math.Round(num)
local floored = math.floor(num)
    if (num - floored) >= 0.5 then
    return math.ceil(num)
    else
    return floored
    end
end
]]--

Стоит, кстати, учесть параметр 

snd = xr_sound.get_safe_sound_object([[interface\inv_food]])

Отвечает за воспроизводимый звук. Так что если его нет, поймаете вылет. Теперь создаёте скрипт abc_medkit.script: 

-- Shortened Creds: ABC Mod made this, LURK team just cleaned up the indentions.

-- Should the use of the same medkit accumulate over the previous one?
multiple_medkit = "yes" --Не пробовал ставить no. Но почти уверен что будет вылет

-- How many minutes should take to complete the healing process.
hp_fullhealth_time = 0.125 --Кол-во в течении которого будет юзаться аптечка

--0.25

-- Health update time in MS. 1000 = 1 Second.
hupd_time = 50 --Апдейт времени.Лучше не трогать

-- Time modulation
time_mod=0

-- HP Healed. No higher than 1.
hp_med_kit = 0.65 --Параметр отвечающий за восстановление жизней одной аптечкой.Точнее за скорость восстановления
hp_med_army = 0.75
hp_med_sci = 0.80

-- Is Army faster than Normal?
army_fast = "yes"

-- Is Science faster than Normal?
sci_fast = "yes"

-- Is Science faster than Army?
sci_fast_than_army = "yes"

-- Should medkit_scientic anti-radiation process be progressive?
sci_antirad = "yes"

-- EOF


local med_kit, med_band, med_army, med_sci, medused, medid, medname
local objdtc = 0
function chk_medlot_object(obj)
    if db.actor ~= nil then  
    local objdt = time_global() 
        if obj ~= nil and obj ~= "load" then
        medname = obj:section()
            if medname == "medkit" or medname == "medkit_army" or medname == "medkit_scientic" then
                if objdtc == 0 then objdtc = time_global() + 350 end
            med_used = "yes"
            med_id = obj:id()     
            end    
        end
    if med_used == "yes" and objdt > objdtc then
    objdtc = 0
    med_used = "no" 
        if level.object_by_id(med_id) == nil then
            if medname == "medkit" then  med_kit = "yes" end
            if medname == "medkit_army" then  med_army = "yes" end
            if medname == "medkit_scientic" then  med_sci = "yes" end
            time_mod=0
        end    
    end
    new_medkit()
    end
end

local time_mkit, time_army, time_sci, count_mkit, count_army, count_sci
function new_medkit()
    if db.actor ~= nil and level.present() then
    local cgametimemed = time_global()
    local hft = (hp_fullhealth_time * 60000) / hupd_time
        --normal
        if med_kit == "yes" then
            if time_mkit == nil then time_mkit = time_global() + hupd_time end
            if cgametimemed > time_mkit then
            time_mkit = time_global() + hupd_time
            local player_hp = db.actor.health
                if player_hp < 1 then
                    if count_mkit == nil then count_mkit = 0 end
                    if count_mkit < (hft + 1) then
                    db.actor.health = (hp_med_kit/(hft + time_mod))
                    count_mkit = count_mkit + 1
                    --abort("TimeMod: "..time_mod)
                    --abort("Health: "..hp_med_kit/(hft + time_mod))
                    time_mod = math.clamp(time_mod+0.23,0,35)
                    else
                    med_kit = nil
                    time_mkit = nil
                    count_mkit = nil
                    end
                else
                med_kit = nil
                time_mkit = nil
                count_mkit = nil
                end
            end
        end
        --army
        if med_army == "yes" then
            if time_army == nil then time_army = time_global() + hupd_time end
            if cgametimemed > time_army then
            time_army = time_global() + hupd_time
            local player_hp = db.actor.health
                if player_hp < 1 then
                    if count_army == nil then count_army = 0 end
                    if count_army < (hft + 1) then
                    local mamf = 0
                        if army_fast == "yes" then mamf = (hp_med_army/hft) / 4 end
                    db.actor.health = (hp_med_army/hft) + mamf
                    count_army = count_army + 1
                    time_mod = math.clamp(time_mod+0.23,0,35)
                    else
                    med_kit = nil
                    time_mkit = nil
                    count_mkit = nil
                    end
                else
                med_kit = nil
                time_mkit = nil
                count_mkit = nil
                end
            end
        end
        --science
        if med_sci == "yes" then
            if time_sci == nil then time_sci = time_global() + hupd_time end
            if cgametimemed > time_sci then
            time_sci = time_global() + hupd_time
            local player_hp = db.actor.health
                if player_hp < 1 then
                    if count_sci == nil then count_sci = 0 end
                    if count_sci < (hft + 1) then
                    local mamf = 0
                    local sfta = 4
                    if sci_fast_than_army == "yes" then sfta = 2 end
                    if sci_fast == "yes" then mamf = (hp_med_army/hft) / sfta end
                db.actor.health = (hp_med_sci/hft) + mamf
                    if sci_antirad == "yes" then db.actor.radiation = -(hp_med_sci/hft) end
                count_sci = count_sci + 1
                time_mod = math.clamp(time_mod+0.23,0,35)
                else
                    med_kit = nil
                    time_mkit = nil
                    count_mkit = nil
                    end
                else
                med_kit = nil
                time_mkit = nil
                count_mkit = nil
            end
        end
    end
end
end

function math.clamp (value,mini,maxi)
local clamped = value
    if clamped < mini then clamped = mini end
    if clamped > maxi then clamped = maxi end
return clamped
end

 

Теперь самое сложное. Лезем в bind_stalker.scripts. После

self.object:set_callback(callback.on_item_drop, nil)

Пишем

self.object:set_callback(callback.use_object, nil)

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

 

    self.object:set_callback(callback.inventory_info, nil)
    self.object:set_callback(callback.article_info, nil)
    self.object:set_callback(callback.on_item_take, nil)
    self.object:set_callback(callback.on_item_drop, nil)
    self.object:set_callback(callback.use_object, nil)
    --self.object:set_callback(callback.actor_sleep, nil)
    self.object:set_callback(callback.task_state, nil)
    self.object:set_callback(callback.level_border_enter, nil)
    self.object:set_callback(callback.level_border_exit, nil)
    self.object:set_callback(callback.take_item_from_box, nil)

После

self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)

Пишем

self.object:set_callback(callback.use_object, self.use_object, self)

В итоге:

 

    self.object:set_callback(callback.inventory_info, self.info_callback, self)
    self.object:set_callback(callback.article_info, self.article_callback, self)
    self.object:set_callback(callback.on_item_take, self.on_item_take, self)
    self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
    self.object:set_callback(callback.use_object, self.use_object, self)
    self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
    --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
    self.object:set_callback(callback.task_state, self.task_callback, self)
    --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
    self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
    self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
    self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)

Ищем функцию:

function actor_binder:on_item_drop (obj)

и после ее завершения пишем:

----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object(obj)
heal_regen.start(obj)
end
----------------------------------------------------------------------------------------------------------------------

В итоге:

----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_drop_item (obj, self.object)
    abc_medkit.chk_medlot_object(obj)
    abc_sleep.uptabc(obj)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object(obj)
heal_regen.start(obj)
end
----------------------------------------------------------------------------------------------------------------------

После

--game_stats.update_drop_item (obj, self.object)

Пишем

abc_medkit.chk_medlot_object(obj

)

После

function actor_binder:update(delta)

Пишем

abc_medkit.chk_medlot_object()
heal_regen.weapontimer()

Затем надо найти звуки и прописать их в директории \sounds\interface\

Далее идем в файл config\misc\items.ltx, ищем секции аптечек ([medkit],[medkit_army],[medkit_scientic]) и меняем в них параметр eat_health на 0.0, иначе актер будет лечится дважды (сначала сразу, по стандартному, а потом уже постепенно)

Автор статьи: Fireman3000, дополнил Darkscape, а так же спасибо Lurk моду и ABC.

 

Получил вылет:

Expression : fatal error

Function : CScriptEngine::lua_error

File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

Line : 73

Description : <no expression>

Arguments : LUA error: ...shing\s.t.a.l.k.e.r\gamedata\scripts\xr_logic.script:1485: attempt to index field 'actor' (a nil value)

 

Я сделал где-то ошибку или такое исправление скрипта требует дополнительной адаптации?

Заранее спасибо.

 

1. Для кодов ы своих сообщениях используем тэги [cоde], чтобы и отделять от текста и форматирование сохранять.

2. Вопрос или для топика "[soC] Ковыряемся в файлах" или для конкретно раздела по "Народной солянке".

3. Если в логе упомянута строка скрипта, вызвавшая ошибку - стОит и ее указывать, тем более коды не оригинальной игры.

--/Artos

Изменено пользователем Artos
Ссылка на комментарий

*Shoker*, т. point_look у вертолета используется только тогда, когда он стоит на месте.

Ну или ещё вариант, перемудрил со скоростью вертолёта.

проверил, не в скорости дело(

Ссылка на комментарий

Viнt@rь, твои слова о point_look противоречат ранее тобою сказанному: "делал точки как в ТЧ".

Вертолет или летит по точкам подчиняясь схеме, а значит и point_look(!), т.к. это и есть "задание" положения в пространстве, или дергается скриптом - тогда можно хоть хвостом вперед заставить лететь ... Т.о. или твои точки перенесенные из ТЧ в ЗП некорректны (смотри вертексы) или у тебя летает не по точкам, а управление скриптом где-то сбоИт.

И без конкретных кодов (скрипты, точки и вертексы на локациях) - бесполезно гадать почему у тебя в какие-то моменты вертушка нос задирает иль иное.

Что мешает тебе в восстановленные скрипты вставить в нужные места вывод в лог и посмотреть когда и почему разворачивается твоя вертушка?

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Viнt@rь

point_look как раз таки и во время полёта используется, другое дело что будет с вертолётом, если его не указать. Скорее всего будет на точку пути смотреть, но сам не проверял.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Маленький вопрос касательно метода :character_name()

В каких случаях можно получить вылет вида attempt to concatenate local 'SndName' ?

 

 

Имеется код, ищется нпс, который рядом и подходит по условиям:

 

function GetStalkers(ThisObj,RadMin,RadMax,who)
    for k, v in pairs(db.storage) do
    local obj = level.object_by_id(k)
        if (obj) and (IsStalker(obj)) and (obj:alive()) and (obj:id() ~= who:id()) then
        local ComThisObj = ThisObj:character_community()
        local ComSender = obj:character_community()
        if CommunityChenalStatus(ComSender,1) then
            if (ComThisObj ~= ComSender)  then --Данным методом ищем  сталкера.
            if ValNpc(obj)~=true then --Отсекаем квестовых нпс
            local Pos = ThisObj:position()
            local Dist = Pos:distance_to(obj:position())
            if (Dist < RadMax) and (Dist > RadMin) then
                table.insert(StkLevelTbl, obj)
                end
                end
                end
                end
        end
end
end
function GiveStalker(ThisObj,RadMin,RadMax,who)
GetStalkers(ThisObj,RadMin,RadMax,who)
if next(StkLevelTbl)  then
local obj = StkLevelTbl[math.random(#StkLevelTbl)]
return obj
else 
return nil
end
end

 

 

Затем идет проверка

    local Sender = GiveStalker(obj,SenderRadMin,SenderRadMax,obj) -- есть ли очевидец, кроме ГГ на этом расстоянии . Нужен нейтральный сталкер...
        if Sender then

Приеняется метод

local SndName = Sender:character_name()

 

Но по непонятным причинам, иногда (отследить когда именно мне не удалось) появляется вылет вида:

attempt to concatenate local 'SndName' (a nil value)

 

Могу сказать что заглушка на nil -срабатывает, ноооо!!!!

 

Почему проходит проверку

    local Sender = GiveStalker(obj,SenderRadMin,SenderRadMax,obj) -- есть ли очевидец, кроме ГГ на этом расстоянии . Нужен нейтральный сталкер...
        if Sender then

 

И Sender==nil ????

 

--Для справки - потом все заносится в табличку ( в частности имя в виде Sender:character_name()) и через некоторое время выводится...

Вопрос, в табличке значение в виде "Вася Жлоб" или в виде ссылки "Sender:character_name()" ????

Если второй вариант, то получается вылет может быть, потому что НПС каким то чудом исчез, ушел в оффлан или?

Вобщем я запутался и не знаю что делать, кто поможет? Только без пафоса пожалуйста.

Что-то кончается, что-то начинается...

Ссылка на комментарий

Видимо проблема в том что почему то Sender - не сталкер. Поэтому я бы тебе посоветовал вставить эту строку перед получением character_name:

get_console():execute("news:name="..Sender:name())

И я готов поспорить что имя будет принадлежать не сталкеру ;)

Freedom

Ссылка на комментарий

_Призрак_, Ясно,спасибо. Тогда в чем подвох?

 

if (obj) and (IsStalker(obj)) and (obj:alive()) and (obj:id() ~= who:id()) then

 

Я же сделал проверку? Как она может игнорироваться?

 

Наверное забыл указать самое важное, такое встречается ТОЛЬКО на SGM. В оригинальной игре такого не было... (никто не жаловался или все играли с SGM)

 

 

Artos

1. Ну если в коде строка: table.insert(StkLevelTbl, obj) - то чего гадать "что в таблице"? Никакое там не имя и не ссылка на "Sender:character_name()", а собственно полученный при итерации клиентский объект.

 

Спасибо!!! Это реально многое ставит на место, пошел переписывать код полностью.

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

Что-то кончается, что-то начинается...

Ссылка на комментарий

Vano_Santuri, не очень въехал в суть сумбурно заданного вопроса, но попробую дать пояснение:

1. Ну если в коде строка: table.insert(StkLevelTbl, obj) - то чего гадать "что в таблице"? Никакое там не имя и не ссылка на "Sender:character_name()", а собственно полученный при итерации клиентский объект.

2. Небезопасно пользоваться значениями из таблички не проверяя их серверные копии на валидность, т.е. на то, что объект в данный момент в игре! Как будто в игре сталкеры и не бессмерны и не исчезают в аномалиях и не уходят на др.локации и пр ...

Строка local obj = StkLevelTbl[math.random(#StkLevelTbl)] - выбирает рандомный клиентский объект, но НЕ проверяет его на "устарелость", т.е. на валидность.

Ну и конечно же уже строка: local SndName = Sender:character_name() - вполне может быть и не валидна и, если движек и не валится, то вполне может возвратить и nil.

 

Т.о. чтобы не было ошибки вида attempt to concatenate local 'SndName' - всего то нужно или перед конкатенацией проверять составляющие строки или заведомо исключать для них nil-значения. Например так: local SndName = Sender:character_name() or ""

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Всем привет. Надеюсь, я по адресу. Такое дело:

 

Когда создаёшь секцию спавна сталкера через алл.спавн, в ней есть вот такое интересное место:

 

[smart_terrains]

esc_lager = {-agroprom_military_case_have -esc_fanat_spawn}

mil_lager = {+agroprom_military_case_have}, {+esc_fanat_spawn}

END

 

Вот это я нашёл у Волка. Насколько я понял, здесь прописано, что пока Меченый не заберёт у военных документы на агропроме, Волк принадлежит лагерю новичков. Как только кейс взят, Волк меняет прописку на ложбинку на армейских складах, что мы наглядно видим в игре.

 

Частично я разобрался с понятием "инфопоршень" самостоятельно. Для теста мне удалось сделать так, чтобы Волк шёл на Склады, если у ГГ есть пистолет Макарова. Если нету - возвращается, довольно забавно))

Вот как это выглядит:

 

-----------------------alife_mod--------------------

if not has_alife_info("morning") and

actor:object("wpn_pm") ~= nil

then

actor:give_info_portion("morning")

end

 

if actor:object("wpn_pm")== nil then

actor:disable_info_portion("morning")

end

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

 

 

 

Но мне нужно не совсем это. Никто не может подсказать, как сделать так, чтобы скрипт срабатывал не на наличие предмета в инвентаре, а в течение определённого промежутка времени (скажем, с 6 до 12 часов)?

 

Идея использования инфопоршней такая: создаём четыре таких условия - на утро, день, вечер, ночь. Каждому сталкеру прописано, что делать и где быть в это время. Только представьте себе, какая чудная и разообразная симуляция жизни могла бы появиться на основе этого! Простые сталкеры к примеру, утром выходят из смартов гулять, вечером возвращаются и торчат в лагерях. Бандиты день сидят на своей базе, а к вечеру подтягиваются к проходным, узким местам - в засаду. Мутанты выходят на охоту ночью)

А ведь есть ещё группировки, ранги, группы сталкеров, уникальные персонажи. Всем им можно было бы сделать уникальный распорядок дня. Это породило бы огромное количество нештатных, случайных ситуаций и стычек, оживило бы игру, создало полноценный а-лайв моей мечты... Помогите мне пожалуйста)

 

Ссылка на комментарий

Dostoevsky92, не гоже конечно давать "по рукам" тому, кто увлечен чем-то, но ... разочарую тебя.

Если воспользуешься ссылками из шапки (по той же логике и гулагам), то сможешь открыть для себя еще много америк и наизобретать велосипедов. И скорее всего не понадобятся никакие подсказки о которой ты просишь, т.к. и способов управления работами и гулагами достаточно много (в том числе и по времени суток) и они гораздо разнообразнее и эффективнее.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Я частый гость и на инсайде, и здесь. Дело в том, что если в спавне и конфигах я ещё что-то понимаю, то в скриптинге я полный ноль... Да и неохота мне его изучать из-за такой ерунды, как создание четырёх однородных условий. Насчёт других способов управления - да, есть, но они позволяют сделать различные состояния внутри гулага, создать скриптовые сценки, назначать анимации и работы. Они достаточно сложны для меня, могут породить многочисленные вылеты и баги. Я же хочу сделать вменяемую песочницу, симуляцию жизни вне их. Способ, предложенный мной видится мне рациональным, простым, достаточно гибким а главное - надёжным.

Ссылка на комментарий
Dostoevsky92: в скриптинге я полный ноль... Да и неохота мне его изучать из-за такой ерунды
Странно такое читать в топике именно по скриптам да еще и в купе с обоснованием "предложенного тобою способа" ... Извини, но этот спососб "предложили" нам всем разработчики игры и мы все давно им (и не только им) пользуемся и в игре и в модах.

Ну а то, что ты считаешь, что кирпичом удобнее заколачивать гвоздь, чем молотком - возможно ты прав, не буду спорить/отговаривать. ;-)

Dostoevsky92: Способ, предложенный мной видится мне рациональным, простым, достаточно гибким а главное - надёжным.
- когда первокласник решает задачку на пальцах иль палочками - это и удобно ему и надежно.

- второклассник начинает применять арифметику и даже таблицу умножения знает - сложнее, но быстрее и надежнее.

- далее школьники уже и математику начинают применять - и скорость и гибкость решений нарастает.

- студенты вообще замахиваются на интегральное исчисление и считают это и рациональным и надежным ...

Кто из них прав?! :crazy:

Нет смысла далее вести разговор на эту тему. Каждому свое, как говорится. Но ... не стОит в топике задавать простейшие вопросы на которые давным давно даны не раз ответы и предлагать различные фантазии, которые давным давно реализованы.

На этом: взгляни в xr_conditions.script на функцию is_day и используй ее в своем "новом" способе управления гулагами. :-)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Dostoevsky92

 

К примеру инфо-порция будет называться Is_morning.

В function actor_binder:update(delta) из скрипта bind_stalker.script добавь вызов такого, к примеру, кода:

local timer_trigger = nil -- объяви там, где будешь вызывать этот код.
if not timer_trigger then
    timer_trigger = game.time()
end
if timer_trigger <= game.time() then
    timer_trigger = game.time() + 5000
    local t = game.get_game_time()
    local y, m, d, h, min, sec, ms = t:get()
    if h >= 6 and < 12 then
        if not db.actor:has_info("Is_morning") then
            db.actor:give_info_portion("Is_morning")
        end
    end
end

смысл кода - вызывается по апдейтам актера, с дискретностью в 5 игровых секунд (определяется значением 5000). При вызове проверяет игровое время, при необходимом значении (h, часы == 6 утра) выдаем инфо-порцию. Ну а дальше Вы вроде в курсе.

- выше, пример как НЕ стОит делать. --/ Artos

Я бы даже сказал НЕ нужно делать. ColR_iT

 

Добавлено через 8 мин.:

И собственно мой вопрос - можно-ли, при загрузке сохранения, отловить момент когда актер уже существует и движок уже "вбросил" ему в инвентарь\слоты все необходимое барахло ? Т.е. после спавна этого барахла. Как вариант думаю на момент появления игрового худа, к этому моменту барахло уже должно быть на месте. Но как это отследить ?

Изменено пользователем ColR_iT
Ссылка на комментарий

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

 

По вопросу: Отследить окончание "вброса" в инвентарь актору всего и вся "корявым" методом конечно можно, но как говорится овчинка выделки не стОит. Не удивлюсь, что тобою бы и метод итерации по рюкзаку на каждом апдейте актрора был бы воспринят, если бы было что проверять ... ;-)

Если же не критичны милисекунды, то обычно пользуются этим:

if device().precache_frame <= 1 then ... - чтобы с достаточной приближенностью предположить окончание загрузки объектов в игру/в онлайн.

Аналог этой проверки имеется в xr_conditions.script - см. фукцию black_screen, так что и из штатной логики можно проверять.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...