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

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

losiara, если нет явных ляпов (например в ЗП номера слотов смещены на единицу), то скрипт должен работать.

Но его неоптимальность не выдерживает критики ...

Попробуй вот это:

local idOutfit = nil --/ ID надетого костюма

function prov_npc()
  local oActor = db.actor --/ кешируем объект актора
  local oOutfit = oActor and oActor:get_current_outfit() --/ объект костюма на акторе
  local sCommunity = "actor" --/ для 'голого' актора
  if oOutfit then --/ костюм надет
    if oOutfit:id() == idOutfit then --/ костюм не сменился?
      return --/> костюм прежний
    else --/ сменялся - определяем группировку
      idOutfit = oOutfit:id() --/ запоминаем ID надетого костюма
      --/ таблица соответствий группировок костюмам (секциям)
      local tCommunityByOutfit = {
        ["bandit_outfit"]  = "bandit",
        ["specops_outfit"] = "military",
        ["dolg_outfit"]    = "dolg"
      }
      --/ определяем группировку соответвующую текущему костюму
      sCommunity = tCommunityByOutfit[oOutfit:section()] or sCommunity
    end
  elseif idOutfit then --/ а был ли костюм?
    idOutfit = nil --/ костюм снят - чистим
  else --/ уже 'голенький'
    return --/>
  end
  if sCommunity ~= oActor:character_community() then --/ если еще не в группировке
    oActor:set_character_community(sCommunity, 0, 0)
  end
end

Если и это не будет работать - ищи сторонние причины.

 

P.S. Еще чуток подправил, дабы и 'голенького' обрабатывать ... Табличку можно из функции вытащить, если нет иных причин ее внутри держать.

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

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

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

Artos

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

Ну пока учимся.

Да, использоваться будет на ТЧ, поэтому номер слота правильный. Попробую ваш вариант!

 

 

Ваш вариант работает. Но я перепроверю и первый, наверняка где то что то упустил, хотя синтаксис и правильный.

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

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

Artos

Если бы я знал что это должно быть критично, то может быть написал бы так (как вариант) :

function repair_precond_s2()
    local item_in_slot_2 = db.actor:item_in_slot(2)
    local item = item_in_slot_2 and item_in_slot_2:section()
    return t[item] and 1 > item_in_slot_2:condition() + 0.01 or false
end

 

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

Gun12 (пояснение не только для тебя)

Из названия функции 'repair_precond_s2' (и исходного кода iDreD) можно предположить что она может быть использована в диалогах, экшенах квестов или подобных местах, т.е. вызываться не из скриптов, а непосредственно движком.

Условие использования для подобых precondition довольно жестки и часто требуют только два варианта ответа: true или false. Любые другие возвраты от функций могут привоить к фатальным ошибкам, в том числе и безлоговым вылетам (файл лога пуст).

 

Хотя ... само предназначение данной функции не располагает использовать в прекондишенах, а вероятно где-то в апдейте актора или коллбэке взятия, но в любом случае такая организация возврата не помешает (ИМХО).

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

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

Artos

 

Просто возникла идея сделать "Сталкер браузер"..... За помошь с записью в переменную спасибо)))) Окно редактирование текста для ссылки ясделал, но окно для открытия интернет страниц так и не нашёл......

Сталкер в душе - сталкер по жизни!

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

Нет, такое не получится.

У тебя есть только два варианта реализации твоей задумки

1. Написать на ассемблере функцию позволяющую скачивать интернет страницы. На практике это практически невозможно

2. Написать dll, которая при помощи перехватчика от alpet/отредактированных длл будет выходить в интернет и скачивать страницу.

 

Оба варианта сложны и мало кто это может сделать

Freedom

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

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

 

Почти весь код реализован в одной функции. Формат таблицы self.anomaly:

self.anomaly[anom_id] = name

anom_id - id аномалии, name - её имя.

function motivation_binder:hear_callback(npc, who, sound_type, sound_position, sound_power)
    if npc == nil or obj == nil then
        return
    end
    local who_id = who:id()
    if who_id == npc:id() or sound_position == nil then
        return
    end
    local cls = who:clsid()
    if cls == clsid.zone_mbald_s or cls == clsid.zone_mincer_s or cls == clsid.zone_galant_s then
        local who_name = who:name()
        local dist = sound_position:distance_to(npc:position())
        if dist <= 45 and self.anomaly[who_id] == nil then
--' Аномалия уже близко, но ещё не добавлена в рестрикторы - добавляем.
            self.anomaly[who_id] = who_name
            self.object:add_restrictions("", who_name)
        elseif dist > 55 and self.anomaly[who_id] ~= nil then
--' Аномалия была добавлена в рестрикторы, но уже далеко - удаляем
            self.object:remove_restrictions("", who_name)
            self.anomaly[who_id] = nil
        end
    end
end

 

 

При вызове net_destroy или death_callback все аномалии удаляются из рестрикторов и таблица очищается. Коллбек hear_callback ставится где надо и вызывается (проверено). Никак не пойму, что здесь неправильно.

Изменено пользователем ColR_iT
Ссылка на комментарий
Полтергейст, все банально просто: в первой же проверке по необъявленной obj ты прерываешь функцию. Вероятно ошибся и должно использоваться who из входных аргументов.

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

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

Помоги изменить скрипт "Ограбление ГГ во время сна".Надо сделать так, когда ГГ спит на базе то его не грабят.И ище,как сделать чтоб и на других локах происходило ограбление

function robbery()
local chance = 0.4
if math.random() < chance and db.actor:money() >= 1000 and level.name()=="zaton" then 
robbery_scheme.rob_enemies() 
end
end

function rob_enemies() 
if (not has_alife_info("kingpin_gained") and not has_alife_info("sim_stalker_help_harder")) then 
robbery_scheme.stealing_money() 
end
if (has_alife_info("kingpin_gained") and not has_alife_info("sim_stalker_help_harder")) then 
return  
end
if (not has_alife_info("kingpin_gained") and has_alife_info("sim_stalker_help_harder")) then 
return  
end
end

function stealing_money()
local money = db.actor:money()
local money_robbed = money*(math.random(1,4)/10)
db.actor:give_money(-money_robbed)
robbery_scheme.message_robbery()
end

function message_robbery()
local texture = "ui_iconsTotal_lost_money"
local text = "st_you_robbed"
db.actor:give_game_news(game.translate_string("st_tip"), text, texture, 1000, 5000)
local snd=sound_object([[device\pda\pda_tip]])
snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0)
end

 

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

Добрый день! Подскажите камрады. Как мне повесить на железную дверь с конкретной логикой хит, чтобы после стрельбы по ней, вызвать поршн либо функцию.

 

Из оригинального ТЧ скрипта ph_door.script есть значение hit_on_bone, но не пойму чет, как работает? Если в самом скрипте ph_door.script правку сделать?

st.hit_on_bone = utils.parse_data_1v(npc, utils.cfg_get_string(ini, section, "hit_on_bone", npc, false, ""))

end

 

 

 

 

Изменено пользователем alkogolik
Ссылка на комментарий
Вероятно ошибся и должно использоваться who из входных аргументов.

Исправил - всё равно не работает. Судя по тому, что выводилось в лог, коллбек "воспринимает" только сталкеров, монстров и (почему-то) детектор игрока. Поэтому такой способ определения аномалий, к сожалению, не годится. :(

 

 

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

alkogolik, выдать инфопоршен или выполнить функцию можно, но только при стрельбе не по любой точке двери.

hit_on_bone, работает с костями (в названии это видно), в скрипте написано следующее:

if self.st.hit_on_bone[bone_index] ~= nil then

таким образом, нужно попасть в кость с индексом, который указан в схеме. Сама схема выглядит примерно так:

hit_on_bone = 1|{+infoportion =function}

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

Для bone_index лично я нашел всего два значения, которые использовали ПЫС - это 1 и 2.

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

ColR_iT, спс! А если

hit_on_bone = 2

, то получается 2 части, т.е. 2 индекса? Не помню точно, но видел.

Я решил таким способом: Переделал двери из physic_object в physic_destroyable_object

Хит работает по всей двери. Делал по принципу мегафонов. По индексу даже интересней для сюжета, только не понял сразу, о каких костях идёт речь. Ещё раз спасибо!

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

Всем привет, у меня к вам несколько вопросов:

 

1. Что нужно писать в логике, чтобы несколько анимации проигрывались одна за другой.

1-я, 2-я, и опять 1-я, 2-я, короче по кругу

 

2. Можно ли заставить НПС смотреть в ту сторону, в которую я захочу (direction в all.spawn), если спавниш его через скрипт, или это возможно только через all.spawn.

 

3. Может это вопрос не по теме, хотя он может, связан с логикой НПС, суть вот в чем

можно ли сделать костюм с параметром скрытность или маскировка, чтобы ГГ в таком костюмчике был менее заметен для НПС.

 

 

Ссылка на комментарий
Можно ли заставить НПС смотреть в ту сторону, в которую я захочу (direction в all.spawn), если спавниш его через скрипт

Это только начальное направление взгляда при спавне. Как-то можно это сделать через net_packet'ы, но проще воспользоваться функцией set_desited_direction(вектор_направления_взгляда). Вот только не знаю, относительно чего этот вектор задаётся - посмотри в логических схемах (скриптах) или в том же state_mgr примеры использования.

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

С 1-м вопросом я разобрался, прошу помощи с остальными.

Заранее блогодарен.

 

Добавлено через 3 мин.:

Полтергейст спасибо за ответ.

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

Wik

По второму вопросу смотря что тебя интересует, можно через логику в ремарковской схеме:

target = Куда смотрит сталкер. Есть следующие варианты

 

 

story_id – числовое значение

actor – без комментариев

nil – позиция вычисленная АИ автоматически

<имя работы>,<имя гулага> смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг сталкера, для которого задана данная секция ремарка).

Пример:

target = logic@cit_killers_base_guard, cit_killers

<path_name>, <point_number> - можно указывать смотреть в вершину патрульного пути (<имя пути>, <имя точки>).

Например:

[smart_terrains]
none = true

[logic]
active = remark1
danger = danger_ignore

[danger_ignore]
ignore_distance = 5

[remark1]
no_move = true
target = actor; или что тебе необходимо по примеру выше!

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

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

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

К стати полный список анимаций находиться в файле state_lib.script.(тч, зп, чн-не знаю)

 

Добавлено через 15 мин.:

Может кому-то это известно, но я не знал (может, поможет, кому не будь такому как я)

В топике "Ковыряемся в файлах" подобное может и уместно, но для темы данного - 'мусор'. --/Artos

 

losiaraспаибо, а story_id вбивать story_id нпс, например

target = 1000

Да. --/Artos

 

Добавлено через 3 мин.:

Спасибо еще раз всем, кто мне помог!!!!!!!!

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

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

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

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

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

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

Войти

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

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

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