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

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


Svoboда

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

Доброго времени суток. Недавно заинтересовался созданием сюжета на платформе Теней Чернобыля и обнаружил для себя одну проблему, проблема в том что я не нашел в оригинале функцию на передачу\взятие одинаковых предметов в разном количестве. После долгого поиска на форумах нашел такую функцию:

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

-- Проверка наличия нескольких и разных предметов у ГГ.
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

-- Отдача определенных предметов в нужном количестве.
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 
      ваш_скрипт.remove_item_from_inventory(item, actor) 
      reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 
     end 
end 

 

И оформляется это к примеру так:

-- Есть ли два "ammo_gauss" - проверка.
function have_ammo_gauss() 
return     
ваше_название_скрипта.item_much("ammo_gauss",2) ~= false 
end

-- Проверка на количество разных предметов.
return 
ваше_название_скрипта.item_much("conserva",5) ~= false and 
ваше_название_скрипта.item_much("kolbasa",5) ~= false and 
ваше_название_скрипта.item_much("bread",5) ~= false 
end

-- Отдача "этих" предметов без появления их в торговле НПС - тупо отбирание предметов у ГГ.
function ваша_функция(second_speaker, first_speaker) 
ваше_название_скрипта.out_item_much("conserva",5) 
ваше_название_скрипта.out_item_much("kolbasa",5) 
ваше_название_скрипта.out_item_much("bread",5) 
end

Вроде бы все хорошо и понятно, но я не понял строчку в функции под спойлером:

ваш_скрипт.remove_item_from_inventory(item, actor) 

Что имелось ввиду? С какого скрипта должно вызываться remove_item_from_inventory? Там откуда я взял "это" нет никаких объяснений, а форум мертв.

И как сделать так что бы отдача определенных предметов в разном количестве была "наоборот" от НПС к ГГ? Или можно сделать все проще?

В скриптах я не силен, я только недавно начал ковыряться в файлах игры. Мне посоветовали обратиться с данным вопросом на этот форум.

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


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

-- Проверка на наличие нескольких и разных предметов в рюкзаке ГГ.
-- 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

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


Ссылка на сообщение
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:

 

Бесполезно.

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


Ссылка на сообщение
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:

 

 

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


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

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

AMK-Team.ru

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