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

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

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

function anarhist_pkm_done(first_speaker, second_speaker)

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

end

 

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

 

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

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

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

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

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

 

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

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

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

 

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

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

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

 

  • Нравится 3
Ссылка на комментарий

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

 

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

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

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

end

 

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Изменено пользователем proper70
  • Нравится 2
Ссылка на комментарий

В соседней теме "Ковыряемся в файлах (ЗП)" я спрашивал о тормозах при выходе НПС в онлайн. Одним из таких "тормозных" мест является вызов 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, но прежде, чем приступить, хотелось бы услышать мнение других мододелов, может я что-то не учёл и "шкурка не стоит выделки"

Изменено пользователем Shredder
  • Полезно 1
Ссылка на комментарий

ИМХО

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

 

"+"

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

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

всё легко

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

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

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

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

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

 

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

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

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

 

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

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

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

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

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

всё легко

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

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

Это первое на что я грешил, 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?

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

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

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

 

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

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

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

 

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

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

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

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

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

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

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

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

Войти

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

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

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