Jump to content

Recommended Posts

Shredder    47

proger_Dencheek, рискну предположить что в конфигах монстров пропала такая строчка:

script_binding = bind_monster.bind

И версию игры укажи

Share this post


Link to post
Share on other sites
riddik121    161

Подскажите пожалуйста в чём причина. Использую обычный скрипт на передачу предмета

function anarhist_pkm_done(first_speaker, second_speaker)

dialogs.relocate_item_section(second_speaker, "wpn_pkm", "out")

end

 

скрипт проходит действие продолжается, но предмет остаётся у меня в инвентаре. Как это исправить?


 

Надо дело довести до конца!

Share this post


Link to post
Share on other sites

riddik121, стандартная диалоговая функция немного капризная, лучше заменить ее на мою функцию:

function relocate_item_section(victim, section, type, col)
  if col == nil then
   col = 1
  end
  if db.actor ~= nil and section ~= nil then
   if type == "in" then
      for i=1,col do
       alife():create(section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
       if victim ~= nil then
          local inv = victim:object(section)
           if inv ~= nil then
              alife():release(alife():object(inv:id()), true)
           end
       end
      end
   elseif type == "out" then
      local inv = db.actor:object(section)
      if inv ~= nil then
       for i=1,col do
          if victim ~= nil then
           alife():create(section, victim:position(), victim:level_vertex_id(), victim:game_vertex_id(),victin:id())
          end
          alife():release(alife():object(inv:id(),true)
       end
      end
   end
   news_manager.relocate_item(db.actor, type, section)
  end
end

Edited by ColR_iT

Share this post


Link to post
Share on other sites
riddik121    161

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


 

Надо дело довести до конца!

Share this post


Link to post
Share on other sites

riddik121 Стандартный скрипт "dialogs.script". В нем ищешь эту функцию и заменяешь на мою.

 

Shredder, конфиги монстров не редактировались. Причина в другом.

Share this post


Link to post
Share on other sites
ColR_iT    162

proger_Dencheek, интересно, чем же твоя функция лучше? Парой дополнительных проверок и возможностью указывать количество предметов для передачи? Боюсь, что в данном случае "твоя" функция так же не поможет...

 

 

riddik121, вероятнее всего ты не правильно передаешь в функцию "кто-есть-кто". Вызывая на реплике НПС, ты передаёшь предмет от актора к актору. Попробуй вызвать функцию так:

function anarhist_pkm_done(first_speaker, second_speaker)
  dialogs.relocate_item_section(first_speaker, "wpn_pkm", "out")
end

 

Что касается функции по универсальнее, то позволь тебе предложить следующее:

--# Функция трансфера предметов в указанном количестве.
--# Избавился от необходимости вставлять квестовый предмет в таблицу quest_section.
--# Теперь "квестовость" предмета определяется по наличию поля quest_item, со значением true, в секции предмета.
--# victim - ['userdata'] от кого (type == "in") либо кому (type == "out") передавать предмет;
--# section - ['string']  секция передаваемого предмета;
--# type - ['string']  тип передачи ("in" - актору, "out" - от актора);
--# count - ['number']  количество предметов для передачи (по умолчанию - 1);
--# hide - ['boolean']  показывать ли факт передачи в виде сообщения в окне диалога (true - скрыть).
function relocate_item_section (victim, section, type, count, hide)
  local actor = db.actor
  local ini = system_ini()
  --# Определим является ли передаваемый предмет квестовым.
  local item_is_quest = ini:section_exist(section) and ini:line_exist(section, "quest_item") and ini:r_bool(section, "quest_item")
  if actor and victim then
   --# Передвать нужно от НПС актору.
   if type == "in" then
   --# Если предмет квестовый, то ...
   if item_is_quest then
    --# Передадим предмет(ы).
    transfer_item_between_npc (victim, actor, section, count)
   --# Иначе просто заспавним в нужном количестве.
   else
    spawn_to_inventory (section, actor, count)
   end
   --# Передавать нужно от актора НПСу.
   elseif type == "out" then
   --# Передадим их НПС.
   transfer_item_between_npc (actor, victim, section, count)
   end
   --# Нужно ли явно сообщать о передачи в окне диалога?
   if not hide then
   news_manager.relocate_item(actor, type, section)
   end
  end
end
--# Функция спавна предметов в инвентарь.
--# section - ['string']  секция предмета, который будем спавнить;
--# whom - ['userdata'] кому будем спавнить (по умолчанию актору);
--# count - ['number']  сколько будем спавнить (по умолчанию 1).
--# Если каким-то образом section равен nil/false, либо предмет не является инвентарным, спавн происходить не будет.
function spawn_to_inventory (section, whom, count)
  --# Проверим передана ли секция, и предмет инвентарный.
  if not section or not system_ini():line_exist(section, "inv_name") then
   return
  end
  --# Определим кому спавнить, если whom не равен 'userdata', то спавнить будем в инвентарь актора.
  local actor = type(whom) == "userdata" and whom or db.actor
  --# Спавним в указанном количестве, либо в одном экземпляре, если count не передан.
  for i=1, count or 1 do
   alife():create(section, actor:position(), actor:level_vertex_id(), actor:game_vertex_id(), actor:id())
  end
end
--# Функция передачи предметов от одного НПС к другому в указанном количестве.
--# who - ['userdata'] кто передаёт;
--# whom - ['userdata'] кому передавать;
--# section - ['string']  секция предмета;
--# count - ['number']  количество предметов (если не указано, то 1).
function transfer_item_between_npc (who, whom, section, count)
  --# Если нет от кого и кому передавать, то выйдем.
  if not who and not whom then
   return
  end
  --# Передадим указанное количество предметов, если не передан count, то передадим один предмет.
  for i = 1, count or 1 do
   who:transfer_item(who:object(section), whom)
  end
end

 

  • Like 3

Share this post


Link to post
Share on other sites
riddik121    161

я так понимаю first_speaker - первый говорящий (ГГ), second_speaker - второй говорящий (НПС). Т.е., к примеру

 

function название функции(first_speaker, second_speaker)

dialogs.relocate_item_section(first_speaker, "предмет на отдачу", "out") - передача предмета от ГГ к НПС

dialogs.relocate_item_section(second_speaker, "получение предмета","in") - получение предмета от НПС к ГГ

end


 

Надо дело довести до конца!

Share this post


Link to post
Share on other sites
ColR_iT    162

riddik121, это зависит от того, кто говорит фразу, в которой вызвана функция. Вообще первым аргументом передаётся говорящий, вторым - оппонент.

Share this post


Link to post
Share on other sites
Artos    97

Похоже тема превращается из "Школы ...", в обменник: "это не знаю, но это плохо, а вот это мое вроде как лучше"... :-(

Если задан вопрос, то нужно давать ответ по существу, а не тупо предлагать нечто, что может и позволит обойти ошибку, но не отвечает на вопрос и не учит в подобных ситуациях не наступать на грабли!

 

riddik121, при вызовах функций из диалогов важна фаза диалога, а точнее кто же ее произносит.

Ту или иную фразу может произносить как актор, так и его собеседние (НПС), и таким образом аргументы на входе функции (first_speaker, second_speaker) могут иметь порялок: актор,НПС или наоборот НПС,актор.

В твоем случае, если фразу произносит актор (first_speaker), то и не будет ничего у него "забираться", т.к. у тебя забирается у second_speaker'а.

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

Edited by Artos

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

Share this post


Link to post
Share on other sites

ColR_iT, моя функция не требует объявления first_speaker, second_speaker. По этому она точно пригодится тому, кто задал вопрос, ведь у него с этими аргументами проблемы.

Share this post


Link to post
Share on other sites
ColR_iT    162

proger_Dencheek, а когда это родная функция требовала "объявления first_speaker, second_speaker"? И у просившего проблемы как раз не с аргументами, а с определением того, на кокой реплике вызывать функцию, либо кого именно передавать в неё.

P.S. Постарайся в следующий раз давать конкретный ответ на вопрос, а не распространять копи-паст. На этом оффтоп окончен.

Share this post


Link to post
Share on other sites
proper70    67

Господа! Может не в тему, но вот я иногда заглядываю в эту тему и просто восторгаюсь терпению Артоса и иже с ним. Можно я скажу тем кто не может разобраться со спикерами, передачей предметов и прочими я бы сказал, очевидными вещами: вы просто скачайте последнюю солянку а лучше оп1, перенесите в отдельную папку папку config и scripts, поставьте себе notepad++ и используйте поиск фразы по файлам. И смотрите, как ваши пожелания сделаны у пысов или в солянке.

Проблемы со спикерами? Поиск по файлам фразы first_speaker ответит на все ваши вопросы. Просто скопируйте уже рабочий код и поправьте на свои значения. Не перекладывается предмет из гг к неписю или в нычку - поиск по фразе transfer_item решит ее.

А если не знаете с чего начать поиск - вспомните, где в игре есть подобное, найдите этот код по любой фразе, по диалогу например, или по описанию и дальше по цепочке поиском по ключевым словам.

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

Чтобы научиться читать - нужно как минимум выучить алфавит. Чтобы научиться считать - нужно как минимум выучить цифры. Чтобы научиться программировать в сталкере - нужно как минимум понять что такое объект, класс, наследование и чем конфиги отличаются от скриптов, а также чем серверный объект отличается от клиентского. Иначе у вас ничего не выйдет и для вас только один вариант - тупое копирование уже рабочих скриптов.

Я не хочу хвастаться, но я 99% всех своих проблем решил простым поиском по скриптам и конфигам. Конечно, я знаком с основами ООП и это очень сильно мне помогало в пониманиии скриптов. Это поможет и вам)

Edited by proper70
  • Like 2

Share this post


Link to post
Share on other sites
Shredder    47

В соседней теме "Ковыряемся в файлах (ЗП)" я спрашивал о тормозах при выходе НПС в онлайн. Одним из таких "тормозных" мест является вызов sound_theme.init_npc_sound(self.object) в net_spawn NPC. Стал разбираться, в чём дело. Оказывается в sound_theme при инициализации создаётся очень много объектов от классов npc_sound, actor_sound и т.д., при выполнении init_npc_sound НПС регестрируется в каждом объекте класса npc_sound. Как-то в одной из тем была информация о том, что методы объекта выполняются гораздо дольше, чем просто функции. Вспомнив об этом, решил ещё раз проверить этот факт:

class "TestClass"
function TestClass:__init()
self.num = 100
end

function TestClass:set(n)
self.num = n
end

function TestClass:get()
return self.num
end

function s_set(_self, n)
_self.num = n
end

function s_get(_self)
return _self.num
end

local npc_table = {}

function on_inventory_open()
local a = TestClass()
local timer1 = profile_timer()
timer1:start()
for i = 1, 1000000 do
a:set(i)
end
timer1:stop()
_m.logf('##TestClass set is ' .. timer1:time());

local b = {num = 100}
local timer2 = profile_timer()
timer2:start()
for i = 1, 1000000 do
s_set(b, i)
end
timer2:stop()
_m.logf('##not class set is ' .. timer2:time());

local timer3 = profile_timer()
timer3:start()
for i = 1, 1000000 do
local n = a:get()
end
timer3:stop()
_m.logf('##TestClass get is ' .. timer3:time());

local timer4 = profile_timer()
timer4:start()
for i = 1, 1000000 do
local n = s_get(
end
timer4:stop()
_m.logf('##not class get is ' .. timer4:time());
end

 

##TestClass set is 350336.25

##not class set is 29087.216796875

##TestClass get is 413329.09375

##not class get is 21887.28515625

 

Т.е. в случае НЕ классов выигрыш в скорости составляет более чем в 10 раз. В связи с чем хочу переписать весь sound_theme, но прежде, чем приступить, хотелось бы услышать мнение других мододелов, может я что-то не учёл и "шкурка не стоит выделки"

Edited by Shredder
  • Полезно 1

Share this post


Link to post
Share on other sites
7.9    129

ИМХО

Если есть возможность и желание, конечно надо переписать. И по возможности, не только усовершенствовать, но и расширить.

 

"+"

И не только "sound_theme" - другие менеджеры и схемы то-же, есть куда и для чего совершенствовать и расширять.

Edited by 7.9

всё легко

Share this post


Link to post
Share on other sites
Shredder    47

Другие тоже можно, но далеко не все. Скажем, все классы, унаследованные от object_binder нет возможности переписать.

И что ты имеешь ввиду под "расширить"?

Edited by Shredder

Share this post


Link to post
Share on other sites
Malandrinus    596

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


 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Share this post


Link to post
Share on other sites
7.9    129

Много писать не буду... :)

Если про "sound_theme" - то тут (с ходу) требуется расширение общего скриптового управления звуками...

Ну там: "Менеджер торговли" - точно, явно нуждается в расширении и модернизации функционала...

Ну и ещё там.... расширение каждого менеджера (схемы) лучше обсуждать одельно и подробно, так-сказать: "анализировать, фильтровать... и прочая"...


всё легко

Share this post


Link to post
Share on other sites
Shredder    47

... скорее всего это звуки так долго грузятся.

Это первое на что я грешил, getFS():exist(), т.е. проверка на существование. Тогда я добавил кэширование в таблицу, т.е. проверка осуществлялась один раз, затем результат заносился в таблицу и для следующего НПС, выходящего в онлайн проверка не осуществлялась. Но такой подход увеличил быстродействие только в 2 раза, что тоже не плохо, но не достаточно. Да и если посмотреть на функцию:

function init_npc_sound(npc)
for k,v in pairs(theme) do
if v.init_npc then
--printf("checking %s for %s (%s)", v.section, npc:name(), character_community(npc))
if v.avail_communities[character_community(npc)] ~= nil then
v:init_npc(npc)
end
end
end
end

 

и учесть что в таблице theme более 600 объектов, я думаю уход от классов даст ещё больший прирост.

 

7.9, я так понимаю "расширение", это добавление нового функционала, но ведь его нужно добавлять по потребности. Допустим я в своём моде со звуками вообще никак не работаю, зачем мне расширять sound_theme?

Edited by Shredder

Share this post


Link to post
Share on other sites
abramcumner    879

Но такой подход увеличил быстродействие только в 2 раза, что тоже не плохо, но не достаточно.

Фризы то хоть уменьшились?

 

при отказе от классов протестируй еще такой вариант:

for i = 1, 1000000 do
local n = b.num
end

Без функций вообще все летать будет. :ny_megalol:

 

Ты кстати, проверил, что фризы из-за скриптов, если из-за скриптов, то именно из-за net_spawn? А то я недавно читал, что у кого-то фризы из-за моделей были. И при выходе в онлайн не только net_spawn вызывается.

Время выполнения инициализации звуков я так понимаю ты замерил? Напиши цифирки, сколько функция выполняется и сколько весь net_spawn.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

AMK-Team.ru

×
×
  • Create New...