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

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


Svoboда

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

Если вызов через апдейт - то наверно вернее так:

 

if not db.actor:has_info("aes_monolit_osoznanie_have") and (db.actor:has_info("aes2_osoznanie_death") or db.actor:has_info("aes2_osoznanie_death2") or db.actor:has_info("aes2_osoznanie_death3")) then

db.actor:give_info_portion("aes_monolit_osoznanie_have")

end

  • Согласен 1

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


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

 

 

То есть, тогда конструкция if npc:accessible( lvid ) получается полностью бессмысленной ?

 

Возможно ошибаюсь, но мне кажется эта конструкция должна выглядеть чуть иначе:

 

 local lvid = npc:level_vertex_id()

 if npc:accessible( lvid ) then

        lvid = npc:vertex_in_direction( lvid, npc:direction(), 10 )

        npc:set_dest_level_vertex_id( lvid )

        log( "info", "action_anomaly(%s):execute, accessible: %s, current: %s", npc:name(), lvid, self.object:level_vertex_id() )

 else ...


 

 

В принципе функция задумана, что она возвращает или доступную ноду в заданном направлении или ноду, на которой объект стоит.

 

Полностью согласен.

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


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

 

 

Вызов так: "combat_ignore_cond = {=check_fighting_by_community(freedom:dolg)}", ну или какие то другие группировки по желанию...

 

Попробуйте таким образом:

 

combat_ignore_cond = {=check_fighting_by_community}


 losiara

Если не сработает, попробуйте в xr_conditions.script вписать собственную функцию как-то:

 

function my_check_fighting(actor, npc, p)
if p[1] == nil then
abort("Wrong string of params in check_fighting_by_community")
end
local npc = db.storage[npc:id()].enemy
local community
if npc and npc:alive() then
community = npc:character_community()
for i, v in pairs(p) do
if type(v) == 'string' and community == "ваша" then

return true
end
end
end
return false
end

 

и уже потом смело использовать ее в своих *.ltx.

 

combat_ignore_cond = {=my_check_fighting}

  • Спасибо 1

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


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

 

 

Что-то я переутомился, что-ли...

 

 

что за проверка

 

if lvid1 ~= npc_lvid then

 

параметр npc_lvid это npc:level_vertex_id()?

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


Ссылка на сообщение
(изменено)

не совсем понял использование lvid1 = level.vertex_in_direction( npc_pos, dir, i )

 

npc_pos - должен быть npc:level_vertex_id()

 

dir - заменяет вектор

 

i - это радиус в пределах которого будет двигаться нпс.


т.е npc_pos и дожен стать точкой куда двинется нпс.

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

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


Ссылка на сообщение
(изменено)
То есть достаточно закоментировать вызовы   self.se_respawn:update_online() self.se_respawn:update()   и респавна не будет?

 

Попробуй отключить только self.se_respawn:update().

 

self.se_respawn:update_online() похоже работает только для некоторых сторилайновых квестов. Т.е можешь нарушить баланс прхождения игры.

Изменено пользователем gam
  • Спасибо 1

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


Ссылка на сообщение
(изменено)

losiara. Возможно попробовать так...

 

[smart_terrains]
none = true

[logic]
active = walker@stalker_propusk
combat_ignore = combat_ignore@stalker_propusk
on_hit = hit@stalker_propusk
on_death = death@stalker_propusk

[walker@stalker_propusk]
path_walk = stalker_propusk_esc_walk
path_look = stalker_propusk_esc_look
on_actor_dist_le_nvis = 10 | {-esc_propusk_done} remark@stalker_propusk
on_info = {+esc_propusk_done} walker@stalker_propusk1
meet = meet@stalker_propusk1
danger = danger_condition

[remark@stalker_propusk]
anim = ward
target = actor
snd = esc_guard_camp
on_signal = sound_end | walker@stalker_propusk1
meet = no_meet

[walker@stalker_propusk1]
path_walk = stalker_propusk_esc_walk1
path_look = stalker_propusk_esc_look1
combat_ignore = combat_ignore@stalker_propusk
danger = danger_condition

[danger_condition]
ignore_distance = 0
ignore_distance_hit = 30
ignore_distance_sound = 10


[meet@stalker_propusk]
meet_state = 10 | guard@wait
meet_state_wpn = 10 | backoff@threat_weap
victim = 10 | actor
victim_wpn = 10 | actor
use = true
use_wpn = true

[combat_ignore@stalker_propusk]
combat_ignore_cond = true

[hit@stalker_propusk]
on_info = {=hit_by_actor} %=actor_enemy%

[death@stalker_propusk]
on_info = {+boar1_dead +boar2_dead +boar3_dead +boar4_dead +boar5_dead} %+esc_propusk_done%

 

думаю должно работать.


 

[smart_terrains]
none = true

[logic]
active = walker@stalker_propusk
combat_ignore = combat_ignore@stalker_propusk
on_hit = hit@stalker_propusk
on_death = death@stalker_propusk

[walker@stalker_propusk]
path_walk = stalker_propusk_esc_walk
path_look = stalker_propusk_esc_look
on_actor_dist_le_nvis = 10 | {-esc_propusk_done} remark@stalker_propusk
on_info = {+esc_propusk_done} walker@stalker_propusk1
meet = meet@stalker_propusk
danger = danger_condition

[remark@stalker_propusk]
anim = ward
target = actor
snd = esc_guard_camp
on_signal = sound_end | remark@stalker_propusk2
meet = no_meet

[remark@stalker_propusk2]
anim = ward
target = actor
on_info = {+esc_propusk_done} walker@stalker_propusk1
meet = meet@stalker_propusk

[walker@stalker_propusk1]
path_walk = stalker_propusk_esc_walk1
path_look = stalker_propusk_esc_look1
combat_ignore = combat_ignore@stalker_propusk
danger = danger_condition

[danger_condition]
ignore_distance = 0
ignore_distance_hit = 30
ignore_distance_sound = 10


[meet@stalker_propusk]
meet_state = 10 | guard@wait
meet_state_wpn = 10 | backoff@threat_weap
victim = 10 | actor
victim_wpn = 10 | actor
use = true
use_wpn = true

[combat_ignore@stalker_propusk]
combat_ignore_cond = true

[hit@stalker_propusk]
on_info = {=hit_by_actor} %=actor_enemy%

[death@stalker_propusk]
on_info = {+boar1_dead +boar2_dead +boar3_dead +boar4_dead +boar5_dead} %+esc_propusk_done%

 

Изменено пользователем gam
  • Спасибо 1

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


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

=VENOM=. advisor890 делая спавн через или как-както, используют функцию create_npc(888). Первый аргумент предполагает секцию\кастом дату, но не иды и прочее.

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


Ссылка на сообщение
Только что, Del0v сказал:

Где найти скрипт, отвечающий за механику стрельбы

 

Есть подобная реализация, сделанная Bak в http://www.amk-team.ru/forum/topic/4653-ai-additions/, попробуй спросить у Автора.

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


Ссылка на сообщение
(изменено)
14 часов назад, Jekyll сказал:

Мне не понятно, как в этом случае применить определенную секцию монстра. Не пропишешь же так: pos:distance_to("секция":position())

Jekyll. На мой взгляд, ничто не мешает использовать готовые варианты разрабов, те реализовать как-то:

например - в файле bind_monster.script для function generic_object_binder:death_callback(victim, who)

внутри прописать условие:

if IsMonster(who) then
    -- нужное значение дистанции больше\менньше
    if self.object:position():distance_to(who:position()) < 5 then
        -- код вставки
    end
end

 

Или как-то аналогично в файлах mob_death.script, или mob_alife_mgr.script, либо в подходящем для целей соответствующим mob_такой_то.script. Имхо.:)

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

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


Ссылка на сообщение
18 часов назад, CRAZY_STALKER666 сказал:

Но, если прислать Г

news_manager.send_tip(db.actor, "\\n%c[default]Входящее сообщение от: %c[255,0,255,0]\"Макс\"\\n%c[default]Ваня, проверь эти подвалы, я прикрою.", nil, nil, 10000)

Попробуйте так.

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


Ссылка на сообщение
4 часа назад, AndrewMor сказал:

Полагаю, что файл из ЗП нужно сначала было переделать для ТЧ (в ЗП весь звук - стерео)

Это файл из чистой ТЧ. Все работает хотя бы на на этом примере:

https://yadi.sk/d/ljJqpCw13ZSgwF

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


Ссылка на сообщение
3 часа назад, Den “Angry Wolf” Koslov сказал:

удалять все объекты из инвентаря ГГ определенного класса, сразу одним махом?

Можно все что невозможно, Зона жеж...
Как одна из кучи возможностей:

db.actor:inventory_for_each(function(item)
if item:section() == "секция_обжекта" then
alife():release(item, true)
end
end)

Ну или так:

if db.actor:object("секция_обжекта") ~= nil then
local obj = alife():object(db.actor:object("секция_обжекта"):id())
if obj then
alife():release(obj)
end
end

Вариации самих Разрабов можно отыскать в файле xr_effects.script для Арены хотя бы.
Ну а если правильно описать зачем это Вам и для каких условий, то точно подскажут верное решение.
А удалять по классу немного нелепо имхо - ибо один класс может содержать множество построенных на его настройках обжектов.

  • Спасибо 1
  • Согласен 1

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


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

@Norman Eisenherz, Можно полагаю, но немного не ясно, для чего такое выражение (какова вообще его цель)?

Мне видится что-то подобное для рандома:

local array = {"a", "b", "c", "d"}
if string.find(array[math.random(table.getn(array))], "a") then
    printf("target: YES")
else
    printf("target: NO")
    return
end

 

Тут имхо конечно.:)

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


Ссылка на сообщение
2 часа назад, Cagorich сказал:

я не нашел в оригинале функцию на передачу\взятие

dialogs.script\function relocate_item_section(victim, section, type)

 

Можно пользоваться и таким методом, допустим определяем ценность общего барахла в инвентори актора:

function get_value()
	local value = 0
	for i=0, db.actor:object_count()-1 do
		local item = db.actor:object(i)
		if item then
			local sec = item:section()
			local cost = system_ini():r_float(sec,"cost")
			value = value + cost*item:condition()
		end
	end
	return value
end

 

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


Ссылка на сообщение
(изменено)
6 часов назад, Капрал Хикс сказал:

при подборе в инвентарь метка вешается и на ГГ

Наверно есть необходимость дополнить код условием:

if not self.object:parent() then

level.map_add_object_spot(self.object:id(), self.spot, hint)

else

level.map_remove_object_spot(self.object:id(), self.spot)

end

 

Изменено пользователем gam
  • Спасибо 1

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


Ссылка на сообщение
(изменено)

@AndreySol

Если я верно понял Вашу реализацию, то как мне представляется - это выглядит таким образом:
gamedata\scripts:
создаем собственный файл скрипта и внутри пишем код функций.
Как пример, af_detect.script:

Скрытый текст


lv_arts = {}
table_art = {}

-- Артефакты
table_art["af_medusa"] = true
table_art["af_cristall_flower"] = true
table_art["af_night_star"] = true
table_art["af_vyvert"] = true
table_art["af_gravi"] = true
table_art["af_gold_fish"] = true
table_art["af_blood"] = true
table_art["af_mincer_meat"] = true
table_art["af_soul"] = true
table_art["af_electra_sparkler"] = true
table_art["af_electra_flash"] = true
table_art["af_electra_moonlight"] = true
table_art["af_rusty_thorn"] = true
table_art["af_rusty_kristall"] = true
table_art["af_rusty_sea-urchin"] = true
table_art["af_ameba_slime"] = true
table_art["af_ameba_slug"] = true
table_art["af_ameba_mica"] = true
table_art["af_drops"] = true
table_art["af_fireball"] = true
table_art["af_cristall"] = true
table_art["af_dummy_glassbeads"] = true
table_art["af_dummy_pellicle"] = true
table_art["af_dummy_battery"] = true
table_art["af_dummy_dummy"] = true
table_art["af_dummy_spring"] = true
table_art["af_fuzz_kolobok"] = true

function checklvl_art()
    for id=1, 65534 do
        local sobj = alife():object(id)
        if sobj then
            if table_art[sobj:section_name()] then
                lv_arts[id] = {}
                lv_arts[id].metka = nil
            end
        end
    end
end

function update()
    local detector
    local activated = db.actor:object("detector_simple")
    if activated then
        local section = activated:section()
        if section then
            detector = section
        else
            detector = nil
        end
    else
        detector = nil
    end
    this.iteratetable_art(detector)
end

-- итерация артов
function iteratetable_art(det_type)
    for k,v in pairs(lv_arts) do
        local sobj = alife():object(k)
        if sobj then
            if det_type == "detector_simple" then
                if not v.metka then
                    if game_graph():vertex(sobj.m_game_vertex_id):level_id() == alife():level_id() then
                        if sobj.parent_id == 65535 then
                            local ini, section = system_ini(), sobj:section_name()
                            if ini and section and ini:section_exist(section) then
                                if not sobj.is_day_night then
                                    level.map_add_object_spot(k, "artefact_location", "артефакт: " .. game.translate_string(ini:r_string(section, "inv_name")))
                                    lv_arts[k].metka = true
                                else
                                    if sobj.online or utils.electro_art_enabled() then
                                        level.map_add_object_spot(k, "artefact_location", "артефакт: " .. game.translate_string(ini:r_string(section, "inv_name")))
                                        lv_arts[k].metka = true
                                    end
                                end
                            end
                        else
                            if v.metka then
                                level.map_remove_object_spot(k, v.metka)
                                lv_arts[k].metka = nil
                            end
                        end
                    end
                end
            end
        else
            lv_arts[k] = nil
        end
    end
end


 


Заполнение таблицы (af_detect.lv_arts = {}) на загрузке в bind_stalker.script: function actor_binder:net_spawn(data). Код: if af_detect then af_detect.checklvl_art()

Но вот далее рассматривать function actor_binder:on_item_take(obj) возможно не совсем корректно, а как-то использовать:

function actor_binder:update(delta) просто стандартным вызовом af_detect.update(). Имхо конечно.

Изменено пользователем W.A.S.P.
спойлер
  • Полезно 1

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


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

@Graff46, Совсем не лишне бы было указать версию/патч, и допустим с Кругловым могут возникнуть неполадки (правится), да и зомбарям как нить отрезать (бреду себе).:)

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


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

@_Sk8_AsTeR_, Таким образом? Нет и нетю.

local snd_obj = xr_sound.get_safe_sound_object([[anomaly\dezodor]])

snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)

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


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

Подскажите плиз с какой частотой апдейтится функция function set_fastcall(const function<boolean>&, object) в милисекундах.

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


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

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

AMK-Team.ru

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