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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

@lordmuzer@Змея, нет, не это. Диалог аля "расскажи что интересного" со случайными нпс.

Самый некомпетентный на форуме.

Ааа...Так это и не диалог как-бы. 

Глубоковато ковырять вроде нужно. По непроверенным слухам - скриптер нашей команды это дело еще не порешал. Так что пока всё это дело решается за счет увеличения количества текстов, чтобы не часто повторялись.

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

-- Проверка на наличие нескольких и разных предметов в рюкзаке ГГ.
-- 1.
local items_count=0 
local itemin=nil 
function item_much(itm,need_namber) 
local actor=db.actor 
items_count=0 
itemin=itm 
actor:iterate_inventory(cheking_item,actor) 
     if items_count>=need_namber then 
      return true 
     else 
      return false 
     end 
end     
function cheking_item(actor,item) 
local items=item:section() 
     if items==itemin then 
      items_count=items_count+1 
     end 
end 
function create_items(npc,section,number) 
            for i=1,number do 
       alife():create(section,     
                npc:position(), 
                npc:level_vertex_id(),      
                npc:game_vertex_id(), 
                npc:id()) 
            end     
end
-- Отдача в нужном количестве нужные предметы.
-- 2.
local reloc_params={} 
local stalk 
function out_item_much(itm_section,need_number) 
     reloc_params.itm_section=itm_section 
     reloc_params.itm_cnt=need_number 
     reloc_params.itm_cnt_found=0 
     db.actor:iterate_inventory(checkout_items_count,db.actor) 
     reloc_params.itm_cnt_found=0 
     if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then 
      db.actor:iterate_inventory(out_items_count,db.actor) 
     end 
     news_manager.relocate_item(db.actor, "out", itm_section) 
     reloc_params={} 
end 
function checkout_items_count(actor,item) 
     if item.section and item:section()==reloc_params.itm_section then 
      reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 
     end 
end 
function out_items_count(actor,item) 
     if item.section and item:section()==reloc_params.itm_section and reloc_params.itm_cnt_found<reloc_params.itm_cnt then 
      soc_script_help.remove_item_from_inventory(item, actor) 
      reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 
     end 
end 

-- Удаляем предмет из инвентаря по имени.
function remove_item_from_inventory_by_name(remove_item_name,npc)
  return remove_item_from_inventory(npc:object(remove_item_name),npc)
end

-- Удаляем предмет из инвентаря.
function remove_item_from_inventory(remove_item,npc)
  if npc==nil then npc=db.actor end
  if remove_item~=nil then
--      npc:mark_item_dropped(remove_item)
    alife():release(alife():object(remove_item:id()), true)
    return true
  end
  return false
end

 

Вызов:

-- Отдача.
function out_desyat_hvostov_to_wolf(second_speaker, first_speaker) 
soc_script_help.out_item_much("mutant_dog_tail",10) 
end

Не работают функции на передачу нескольких предметов, вместо 10 передает лишь 1 предмет. Платформа: ТЧ.

В чем может быть ошибка?

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

Дополнение к посту выше.

Ради теста взял скрипты из Тайных Троп 2.

amk.scriptflamethrower.scriptnew_dialog.script предметы передаются, НО! До бесконечности, даже если закрыть диалог и начать  снова то передача несмотря неначто продолжается.

Вызвал так:

function out_desyat_hvostov_to_wolf()
    new_dialog.out_item_much("mutant_dog_tail",10)
end

Много способов испытал, либо вылет, либо не работает, либо работает но передает лишь 1 предмет, либо передает вовсе до бесконечности. Тоже самое в обратном порядке.

Изменено пользователем Cagorich
25 минут назад, Cagorich сказал:

 


function out_desyat_hvostov_to_wolf()
    new_dialog.out_item_much("mutant_dog_tail",10)
end

Много способов испытал, либо вылет, либо не работает, либо работает но передает лишь 1 предмет, либо передает вовсе до бесконечности. Тоже самое в обратном порядке.

В оригинале возможна передача только одного предмета. В АМК можно передавать несколько, "new_dialog" это как раз АМК функция, там это организовано.

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

День добрый!!!

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

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

--task_manager.script

local random_task = nil

local parent_by_story = {
    [003] = "trader",
    [500] = "barman",
    [902] = "ecolog",
    [507] = "dolg",
    [707] = "freedom",
    [006] = "wolf",
    [004] = "shustriy",
    [510] = "drunk_dolg",
    [504] = "hunter",
    [518] = "zastava_commander",
    [506] = "petrenko",
    [607] = "lisiy",
    [515] = "mercenary",
    [7008] = "pri_bandit",
    [7049] = "gar_stalker_trader" -- новый непись
}

local story_by_parent = {
    trader                        = 003,
    barman                        = 500,
    ecolog                        = 902,
    dolg                        = 507,
    freedom                        = 707,
    wolf                        = 006,
    shustriy                    = 004,
    drunk_dolg                    = 510,
    hunter                        = 504,
    zastava_commander            = 518,
    petrenko                    = 506,
    lisiy                        = 607,
    mercenary                    = 515,
    pri_bandit                                      = 7008,
    gar_stalker_trader                              = 7049
}
function init_gar_stalker_trader_task_dialog(dlg)
        get_random_task():init_task_dialog(dlg, "gar_stalker_trader")
end

function init_gar_stalker_trader_reward_dialog(dlg)
        get_random_task():init_reward_dialog(dlg, "gar_stalker_trader")
end

кстати до этого добавлял уже торговца, также с  однотипными квестами, работает без проблем, вылетов не было. Что с этим не так??? SID - прописал, логика обычная валкер с одной точкой. 

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

;----------gar_stalker_trader--------------------------------------------------
;-----------Artefact------------
gar_stalker_trader_find_artefact_1
gar_stalker_trader_find_artefact_2
gar_stalker_trader_find_artefact_3
;---------Monster Part-----------
gar_stalker_trader_monster_part_1
gar_stalker_trader_monster_part_2
gar_stalker_trader_monster_part_3
;----------Eliminate Camp----
gar_stalker_trader_eliminate_lager_1
gar_stalker_trader_eliminate_lager_2
 

[gar_stalker_trader_find_artefact_1]
type = artefact
community = actor
text = gar_stalker_trader_find_artefact_1_text
description = gar_stalker_trader_find_artefact_1_descr
parent = gar_stalker_trader
target = af_blood
reward_money = 2000
reward_reputation = +5
reward_rank = 3
;reward_item = mutant_flesh_eye
time = 86400
;idle_time = 84000
prior = 3

 

[gar_stalker_trader_find_artefact_2]
type = artefact
community = actor
text = gar_stalker_trader_find_artefact_2_text
description = gar_stalker_trader_find_artefact_2_descr
parent = gar_stalker_trader
target = af_gravi
reward_money = 1500
reward_reputation = +5
reward_rank = 2
;reward_item = mutant_boar_leg
time = 86400
;idle_time = 84000
prior = 2

 

[gar_stalker_trader_find_artefact_3]
type = artefact
community = actor
text = gar_stalker_trader_find_artefact_3_text
description = gar_stalker_trader_find_artefact_3_descr
parent = gar_stalker_trader
target = af_cristall_flower
reward_money = 2000
reward_reputation = +10
reward_rank = 2
;reward_item = mutant_dog_tail
time = 86400
;idle_time = 84000
prior = 1

 

[gar_stalker_trader_monster_part_1]
type = monster_part
community = actor
text = gar_stalker_trader_monster_part_1_text
description = gar_stalker_trader_monster_part_1_descr
parent = gar_stalker_trader
target = mutant_boar_leg
reward_money = 2000
reward_reputation = +10
reward_rank = 5
time = 86400
reward_item = ammo_9x19_fmj, ammo_9x19_fmj, ammo_9x19_fmj, grenade_rgd5
prior = 2

 

[gar_stalker_trader_monster_part_2]
type = monster_part
community = actor
text = gar_stalker_trader_monster_part_2_text
description = gar_stalker_trader_monster_part_2_descr
parent = gar_stalker_trader
target = mutant_psevdodog_tail
reward_money = 3500
reward_reputation = +20
reward_rank = 5
time = 86400
reward_item = medkit, medkit, medkit, wpn_addon_silencer
prior = 3

 

[gar_stalker_trader_monster_part_3]
type = monster_part
community = actor
text = gar_stalker_trader_monster_part_3_text
description = gar_stalker_trader_monster_part_3_descr
parent = gar_stalker_trader
target = mutant_zombie_hand
reward_money = 500
reward_reputation = +10
reward_rank = 5
time = 86400
reward_item =  vodka, medkit, bandage, bandage, bandage
prior = 1

 

[gar_stalker_trader_eliminate_lager_1]
type = eliminate_lager
community = actor
text = gar_stalker_trader_eliminate_lager_1_text
description = gar_stalker_trader_eliminate_lager_1_descr
parent = gar_stalker_trader
target = gar_killer_lager
reward_money = 5500
reward_reputation = +30
reward_relation = 15
reward_rank = 5
reward_item = ammo_5.45x39_ap, ammo_5.45x39_ap, ammo_5.45x39_ap, ammo_5.45x39_ap, ammo_5.45x39_ap, grenade_f1
time = 604800

 

[gar_stalker_trader_eliminate_lager_2]
type = eliminate_lager
community = actor
text = gar_stalker_trader_eliminate_lager_2_text
description = gar_stalker_trader_eliminate_lager_2_descr
parent = gar_stalker_trader
target = gar_zomb
reward_money = 3500
reward_reputation = +20
reward_relation = 10
reward_rank = 10
reward_item = wpn_addon_scope_susat
time = 604800

 

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

1 час назад, losiara сказал:

В оригинале возможна передача только одного предмета. В АМК можно передавать несколько, "new_dialog" это как раз АМК функция, там это организовано.

Пробовал но все сводиться к: 

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

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...r. Тень Чернобыля\gamedata\scripts\new_dialog.script:323: attempt to call method 'id' (a nil value)
 

stack trace:

 

Бесполезно.

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

2 часа назад, Змея сказал:

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

Попробовал чистый AMK.

function out_desyat_hvostov_to_wolf(first_speaker, second_speaker)
	local actor, trader
	if db.actor and db.actor:id() == first_speaker:id() then
		actor = first_speaker
		trader = second_speaker
	else
		actor = second_speaker
		trader = first_speaker
	end
	flamethrower.relocate_n_items_section(trader, "mutant_dog_tail", "out", 10)
end

В итоге вылет:

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

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ... Тень Чернобыля\gamedata\scripts\flamethrower.script:7: attempt to call method 'id' (a nil value)
 

stack trace:

 

 

14 часов назад, losiara сказал:

вылет безлоговый

Посмотреть последнее, что будет в логе, если принудительно его писать. Надо в файле _g.script поправить так:

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

rlog = 1
function printf(fmt,...)
    -- принудительная запись в лог, для выявления причин безлоговых вылетов 
    -- v.0.77 : добавлено условие rlog 
    if rlog == 1 then local con=get_console()con:execute(string_gsub(string_format(fmt,...)," ","_"))con:execute("flush") end
    local arg = {...}
    if (arg and arg[1] ~= nil) then    
        log(string_format(fmt,...))
    end
end 

Потом вернуть как было или выставить rlog = 0

Здесь могла быть ваша реклама.

Всем предновогоднего настроя! Ребят, подскажите функцию выдачи инфопоршня при взятии предмета? В гугле вроде всё перешарил, так и не нашёл ни чего толкового..

  • Сочувствую 3

Всем привет. Может ли кто-то подсказать теорию работы схемы mob_jump? 
На практике я вообще не могу разобраться с принципами её работы, а гайд по настройке логики содержит 3,5 слова касательно mob_jump.
Ниже кидаю пример логики своего снорка.
 

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

[spawner]
cond = {+actor_in_rest_exit}

[logic]
active = mob_walker@first

[mob_walker@first]
path_walk = lv_snork_walk_00
path_look = lv_snork_look_01
braindead = true
on_signal = jump| mob_jump

[mob_jump]
path_jump = lv_snork_walk_01
ph_jump_factor = 4
offset = 0,0,0
on_signal = jumped| mob_walker@sec

[mob_walker@sec]
path_walk = lv_snork_walk_01
path_look = lv_snork_look_01
braindead = true
END

 

Т.е., по сути, он должен двигаться walker'ом, по сигналу в последней точке переходить в jump'ера, прыгать, а затем продолжать двигаться следующим walker'ом. Но он вообще не прыгает, то есть, тупо прётся на точку обычным walker'ом. Пробовал и с разных позиций заставлять его прыгать (изначальная идея - прыжок с крыши дома прямо перед мордой эктора; сейчас он даже на ровной земле не прыгает), и jump_factor разный ставить - ничего вообще не происходит. Разве что, при экспериментах со спавном он может появляться в рандомных местах возле эктора. Буду благодарен за советы. 

Всем привет, как убрать античит из оп 2.1? Хочу изменить урон нпс по мне. Слишком они сильно бьют даже в экзоскелете с артами...

@Дмитрий Зверев (Книги, Вселенная и вообще),  всё отлично работает. Только для схемы бери снорка-попрыгунчика.

Ну иногда приходится помучаться с выбором  ph_jump_factor = 4  - как оно работает, я лично так и не поняла))

Ага. И offset настрой. У тебя высота прыжка - НОЛЬ.

 

Добрый день!!! С наступающим!

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

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

function set_gulag_friend_actor( actor, npc, p )
	if p[1] then
		xr_gulag.setGulagGoodwill(p[1], actor)
	end
end

function gulag_friend_actor( actor, npc, p )
	if p[1] then
		xr_gulag.setGulagfriend(p[1], actor)
	end
end

В оригинале есть функция делающая актора врагом гулагу, а мне надобно обратное, вылетов нет, но и не работает, а вроде как должна...

xr_gulag.script

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

-- установить расположенине всех членов смарта к указанному объекту
function setGulagGoodwill( name_or_sid, goodwill, target_obj )
	local gulag = get_gulag( name_or_sid )

	if gulag then
		gulag:set_goodwill( goodwill, target_obj )
	end
end

-- сделать указанного персонажа другом всех персонажей смарта
function setGulagfriend( name_or_sid, target_obj )
        setGulagRelation( name_or_sid, game_object.friend, target_obj )
end

Попробовал и сам наваять:

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

function friend_gar_parazit (actor, npc)     
    local gulag = xr_gulag.get_gulag_by_name ("bar_zastava_2") -- название гулага
    if (gulag) then
       gulag:set_relation (game_object.friend, actor)
    end   
end

Гулаг взят из оригинальной игры.

 

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

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

@Змея, спасибо. Попытался по твоему совету взять snork_normal (именно они, судя по логике, скакали на ЧАЭС-2) и покрутить offset Y. Началось вообще невообразимое - снорк стал аки воздушный шар летать по всей карте, проваливаться под текстуры, спавниться где угодно и прочее. Причём, если делать jump_factor и offset в пределах нормы для прыжка с дома (3 и 4 соответственно, имхо), то схема опять не работает. Даже не знаю, что и делать. Не знаешь, часом, какой offset Y можно поставить для прыжка с Y 14 на Y 9? Спасибо.

Изменено пользователем Дмитрий Зверев (Книги, Вселенная и вообще)
9 часов назад, DoberBull сказал:

Помогите пж с распаковкой ресурсов ОП-2.1

Ты сталкер или где? Кто ищет выход за счёт других?

  • Нравится 2
  • Сомнительно 1

Здесь могла быть ваша реклама.

@mole venomous так интересно, вдруг вышло у кого. Распаковщики разные не берут, я уже все перепробовал. Да и вопрос вроде безобидный

  • Согласен 1

jpwsa5byp73nyaufrbis15dcci1y.png
 

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

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

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

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

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

Войти

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

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

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