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

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


Svoboда

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

Всем доброй ночи :)

Имеется функция. В ней проверяется наличие 2 разных предметов в слотах. Если предметы присутствуют, то идет вызов следующей функции. Если какого то одного предмета нет - то выводится сообщение на худ. И вот с последним загвоздка - сообщение выводится постоянно. Можно ли его сделать одноразовым?

Вот сам код функции:

function nano_speed()
local nano_speed = db.actor:item_in_slot(1)
local nano_suit = db.actor:item_in_slot(6)
local gg = db.actor
    if nano_speed and nano_speed:section() == "nano_speed" and nano_suit and nano_suit:section() == "nano_suit" then
       news_manager.send_tip(gg, "%c[10,241,129,129]".."Сообщение центрального процессора:".."\\n".."%c[10,241,129,129]Инициализирован модуль "Скорость". Модуль готов к использованию.".."\n")
       this.nano_speed_1() -- Какой молодец. И модуль нацепил и костюм не забыл одеть.
    else
       news_manager.send_tip(gg, "%c[10,241,129,129]".."ERROR:".."\\n".."%c[10,241,129,129]Ошибка инициализации. Отсутствует подключение к центральному процессору!".."\n", nil, nil, 30000) -- А костюм где? Дубина!
    end
end

 

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

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


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

Artos, Дык это и не нужно :) Если одет просто костюм - сообщение не нужно выводить. Однако если костюма нету, но nano_speed вставляется в слот, тогда вывод сообщения об ошибке.

 

ЗЫ: Функция Zander_driver у меня вылетает с ошибкой по синтаксису. Ф-ия Gun12 работает, однако не вызывается this.nano_speed_1() (если поставить ее вызов после сообщения, что все ок). Ф-ию Artos пока еще не пробовал.

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

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


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

Еще 1 вопрос :wacko:

Взял ф-ию Gun12. Ее немножко изменил, получилось так:

local old_suit_name

local msg_vse_ok = тут текст сообщения

local msg_vse_ne_ok = тут текст сообщения

function nano_speed()

local gg = db.actor

local nano_speed = gg:item_in_slot(1)

local suit = gg:item_in_slot(6)

 

if nano_speed and nano_speed:section() == "nano_speed" then

local current_suit_name = suit and suit:section()

 

if current_suit_name == old_suit_name then return end

 

if current_suit_name == "nano_suit" then

news_manager.send_tip(gg, msg_vse_ok)

this.nano_speed_1()

else

news_manager.send_tip(gg, msg_vse_ne_ok)

end

 

old_suit_name = current_suit_name

end

end

 

 

Как уже писал выше, сообщения работают, однако нет вызова this.nano_speed_1()

Если брать мой старый вариант (проверка на то, что nano_speed находится в слоте) то все работает.

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

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


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

Да вроде все уже воплотил. Есть функция, которая висит в апдейте. Функция проверяет наличие предмета и костюма в слотах.

Если предмет находится в слоте, а костюм по каким то причинам не одет на ГГ, то выводится сообщение с ошибкой. Если же и предмет и костюм находятся в слотах, то выводится сообщение, что все ок и вызывается следующая функция (которая при условии, что в инвентаре есть нужный предмет и соблюдено условие (if gg.power > 0.4 then), юзает этот самый предмет, что приводит к восстановлению сил ГГ).

Вот эта вторая вызываемая ф-ия:

local fl = false
local fl_1 = false
local msg_sp_1 = тут текст
local msg_sp_2 = тут текст

function nano_speed_1()
  local gg = db.actor
  if gg.power > 0.4 then 
    fl = false
    fl_1 = false
    return 
  end
  if not fl then
    news_manager.send_tip(gg, msg_sp_1)
  end
  fl = true
  local speed = gg:object("nanobot_pow") 
  if speed then
    gg:eat(speed)
    fl = false
    fl_1 = false
    return
  elseif not fl_1 then
    news_manager.send_tip(gg, msg_sp_2)
    fl_1 = true
  end
end

 

Вчера, я использовал ф-ию, просто проверяющую, что предмет в слоте и вызывающую след.

function nano_speed()
  local nano_speed = db.actor:item_in_slot(1)
  if nano_speed and nano_speed:section() == "nano_speed" then
    this.nano_speed_1()
  end
end

 

Все работает, все прекрасно. Однако решил убрать это, дабы без костюма, ГГ не мог юзать предмет nano_speed.

Затем был вчера мой пост тут, получил ответы (за что большое спасибо всем), сегодня попробовал предложенные ф-ии, остановился на ф-ии Gun12 и встретился с проблемой, которую описал выше (не работает вызов this.nano_speed_1())

Вроде бы все обьяснил... Извиняюсь за тавтологию.

 

Используй, плз, для кодов тэг <code>, дабы сохранялось форматирование/отступы. --/Artos

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

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


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

Всем привет.

Возникла нужда по сокращению кол-ва if-ов в функции. А именно:

Спавню телепорты, пример ф-ии:

function spawn_nano_tel_lim_24()
    local se_obj = alife():create("nano_tel_119",vector():set(-23.000,20.283,-121.000),13608,2996)
      xr_logic.pstor_store(db.actor, "nano_tel_119", se_obj.id)    
end

 

И спавнов происходит иногда до 2-3 х десятков. Удаляю все созданные телепорты в конце, пример ф-ии:

function del_nano_tel_lim(story_id)
local aa = alife()
local bb = xr_logic.pstor_retrieve
local gg = db.actor
    local obj_1 = bb(gg, "nano_tel_84", -1) -- тут куча переменных для каждого ТП
    local tel_1 = aa : object(obj_1)

    if tel_1 then -- а тут иногда огромные лесенки из if-ов
      aa:release(tel_1, true)
    end 
end

 

Решил упросить себе, да и игре жизнь. Появилась идея создать табличку, сделал ее, пример:

local tbl_nano_tel = { -- Пишем глобальную табличку телепортов

["nano_tel_war"] = { -- подтабличка для 1 локации
"nano_tel_1", 
"nano_tel_2",
........,
........
},
["nano_tel_x16"] = { -- подтабличка для 2 локации
"nano_tel_1", 
"nano_tel_2",
........,
........
},
..........
}

 

Однако встала проблема, теперь телепорты не удаляются.

Раньше я писал секцию телепорта, сейчас делаю так:

function del_nano_tel_war(story_id) -- удаляем ТП с Варлаба
local war = tbl_nano_tel["nano_tel_war"] -- объявим подтаблицу с нужными ТП
local obj = xr_logic.pstor_retrieve(db.actor, war, -1)
local tel = alife():object(obj)
    if tel then
          alife():release(tel, true)
        end
end

 

Что я сделал не так? Заранее спасибо.

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

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


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

Zander_driver, Да я уже разобрался, Charsi подсказал. Только вот пост уже не смог отредактировать(

Все оказалось просто, надо было добавить строку:

for _, teleport_name in pairs (war) do

Где war это объявленная ранее нужная подтаблица.

И добавить end в конце. Проверил - все отлично удаляется.

function del_nano_tel_war(story_id) 
local war = tbl_nano_tel["tel_war"]()
for _, teleport_name in pairs (war) do
   local obj = xr_logic.pstor_retrieve(db.actor, teleport_name , -1)
   local tel = alife():object(obj)
    if tel then
      alife():release(tel, true)
    end
end
end

 

ЗЫ: Я тут немного переделал (local war = tbl_nano_tel["tel_war"]()) - таблица хранится в отдельном файле, а не вместе с ф-ями удаления.

А ф-ию спавна мне и надо по строковому. Так как телепорты спавнятся не все сразу, а друг за другом и из логики рестриктора.

А вот с удалением и встал вопрос, чтобы упростить ф-ию.

В общем всем спасибо. Пост на усмотрение модератора.

Собственно вопрос не имеет никакой информативной ценности, т.к. допущена банальная ошибка/путаница с аргументом для вызываемой функции.

Однако есть другой нюанс, о котором см. ниже. --/Artos

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

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


Ссылка на сообщение
Artos, Извиняюсь за глупый вопрос, а как можно очистить pstor? Так как действительно, телепортов уже 112 штук.

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


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

Все доброго дня!

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

Т.е по такому типу:

 

local check_list = {
[1] = { i = {"item1", "item2"}},
[2] = { i = {"item3", "item4"}},
.......
}

function check(p)
 local list = check_list[p]
    for _, v in pairs (list.i) do
      local item = db.actor:object(v)
          if item then
          ...
          end
     end
end

Однако проверяется только 1 предмет - item1. Чувствую, что нужно "грызть" for _, v in pairs (list.i) do, однако мозгов не хватает.

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

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


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

Shredder, не совсем то получилось. Попробую объяснить подробнее:

Если у актора есть 2 итема в рюкзаке (по первому полю таблицы), то совершаем какое то действие.

Для проверки, поставил вызов на постоянный апдейт и добавил выдачу СМС при условии, что все ок.

Что имеем: спавним 1 итем - сразу приходит СМС. Убираем его и спавним 2 итем - СМС приходит.

Спавним 1 и 2 итем, СМС есть. Выкидываем 1 или 2 итем - СМС есть. Выкидываем все итемы - СМС нету. Подбираем 1 любой итем - СМС

есть.

Т.е если в рюкзаке есть какой то любой из этих 2 итемов - тогда действие.

////////////////////////////

А нужно так: если мы имеем в рюкзаке именно 2 итема (а не 1 какой то из них), то только тогда действие.

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

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


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

*Shoker*​, хм, действительно. Как всегда невнимательность...

Спасибо!

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


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

следовательно - надо поставить его в sr_psy_antenna.script,

Зачем его туда подставлять? У пси антенны уже прописан свой урон. Точно такое же влияние на пси здоровье, как и у контролера. Разве что оно постоянное, а не во время атаки. Вспоминайте Янтарь и Радар. Вам остается только заюзать схему sr_psy_antenna! Ну и по нужде прописать вывод всяких постэффектов как описал выше malandrinus. И получится не хуже атаки контролера, если не лучше.

ЗЫ: Это хит wound. Подробнее описано в том же самом sr_psy_antenna.script.

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

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


Ссылка на сообщение
×
×
  • Создать...