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

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

Только что, Space.Marine сказал:

Как-то так )

Ну, по порядку:

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

 

1)Если я правильно понял, то первый выброс, исходя из файла surge_manager.script, это:

local START_MIN_SURGE_TIME     = 2*60*60
local START_MAX_SURGE_TIME     = 4*60*60

т.е. это от двух до четырёх часов игрового времени? Судя по личному опыту - так и есть, первый выброс относительно быстро после старта случается. А вот уже в дальнейшем:

local MIN_SURGE_TIME         = 12*60*60
local MAX_SURGE_TIME         = 24*60*60

Что тоже верно, исходя из игры.
2)По поводу влияния взятого квеста на шанс появления того или иного арта, скорее всего, я ошибался. Чуть погуглив, по пути:
...\gamedata\configs\scripts\zaton\anomaly
можно обнаружить файлы аномалий, а в них:

[anomal_zone]
layers_count = 3
respawn_tries = 1
max_artefacts = 2
;applying_force_xz = 200
;applying_force_y = 400 
artefacts = af_medusa, af_cristall_flower, af_night_star, af_vyvert, af_gravi, af_gold_fish
start_artefact = af_night_star
coeff = 3, 3, 2, 2, 1, 1
artefact_ways = zat_b14_af_way, zat_b14_af_way_2, zat_b14_af_way_3
field_name = zat_b14_zone_field_radioactive_weak

Ну это как одна из аномалий, zaton_b14. 
Самое интересующее, это конечно же:

 

coeff = 3, 3, 2, 2, 1, 1

То есть это коэффициенты, которые соответствуют артефактам (6 коэф. = 6 артов), и чем выше число, тем выше шанс выпадения арта. 
Но хотелось бы большего понимания - что это цифры значат? Т.е. конкретика - сколько 3 в процентах (думал, что 30, но в каждом файле по-разному есть соотношение этих коэффициентов.)

3)Пока не нашёл файла влияния выбросов на появление артов. Перерою весь сталкер по ключевым словам, надеюсь, найду...и буду признателен вам, если вспомните/поищете этот скрипт.

4)про обмен у групп сталкеров оружия на арты, если честно, слышу впервые, но, судя по скрипту, имеет место быть. Хотя, ИМХО, это совершенно бесполезная штука
Отнюдь. Борода даёт максимальную цену за артефакты на заказ - от 18000 до 24000 рублей. Поэтому имеет смысл выловить вовремя группу соперников и толкнуть им хороший ствол (особенно на Затоне если такое провернуть). 
Также, с начала игры на Скадовске, мы ограничены детектором Медведь, который поможет нам найти малое кол-во артов из запрашиваемых Бородой
Всё несколько иначе. Медведь не позволяет найти ни одного артефакта, что заказывает Борода - нужен Велес. 
Велес можно получить, как минимум, тремя способами:
1)От Бороды в качестве награды за уничтожение логова кровососов - и это ближайший и быстрейший путь получения Велеса.
2)Если убивать группы сталкеров, что идут к Бороде с найденным артефактом (если убить две группы, Борода прекратит выдавать задания на поиск артов, так что надо быть поаккуратнее. Да и такое это дело...мочить сталкеров.)
3)Когда есть квест "Артефакт на заказ" от Бороды, группы соперников можно будет обнаружить в различных аномалиях (чаще в тех, где теоретически может появиться искомый арт). Как минимум у главаря будет Велес. И, если я правильно понял, за убийство таких сталкеров Борода ничего не скажет (не проверял). Да и такое это дело...мочить сталкеров.
(4)(возможно) Будет продавать Сыч после получения достижения "Состоятельный клиент". Точно не уверен, не понял влияния этой ачивки на шансы в торговле (там что-то связано с припиской scientific, и то ли это ачивка "Научный сотрудник" влияет, то ли выполнение квеста Сыча по доставке трёх Велесов учёным).

Поясню, зачем вообще весь этот сыр-бор учинил. Т.к. шанс найти редкий артефакт - низок, а очень хочется уже сразу иметь Золотую Рыбку, ведь я любитель мародёрить всё что плохо лежит, то я предположил, что это можно будет сделать через соперников. Взял у Бороды квест на арт, и стал ждать. Предварительно я сбегал на Сгоревший хутор (вроде так локация называется), где забрал ВСС Винторез, что является тайником (он же как раз "good_gun"). В этот раз как нельзя быстро артефакт был ими найден. В таком случае, задание обновляется, и можно успеть перехватить эту группу - будет на карте указано их местоположение, и даже будет видно их передвижение. И тут уже что хочешь делай - обменяйся, убей, можно даже выкупить (ну за Светляк они просили что-то около 39000 р, офигеть).
Артефакт я у них благополучно выменял, но не стал отдавать Бороде - самому нужнее, хороший реген. Вот только забавный баг произошёл - тот самый командир соперников зачем-то пришёл на баржу и постоянно там отсиживается в разных местах на корточках. Вроде бы, если отоспаться, то задание будет провалено и сталкер исчезнет, ну да и бог с ним. 

Таким образом можно на самом старте, если бы мне повезло, получить вожделенную рыбку. Но ничто не мешает вновь и вновь брать задания и просто ждать сталкеров. Хороших пушек, правда, раз-два и обчёлся, но! Их продажа принесёт куда меньше денег/пользы, чем деньги/польза от полученного арта. 

 

 

  • Полезно 1
Ссылка на комментарий

@Colder

Spoiler
[scripts\xr_motivator.script]		-- биндер NPC

function motivator_binder:hit_callback(…)
	if amount > 0
		проверить активный слот: 0 = нож

 

 

  • Спасибо 1
  • Согласен 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
22 часа назад, Colder сказал:

Возможно ли скриптово отследить удар ножом (ТЧ)

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

local wpn = db.actor:active_item()
if wpn and wpn:section()=="wpn_knife" then
*твои действия*
end


 

Вопрос касательно ТЧ. 
Есть у меня переменная, по умолчанию объявлена как 

local energia = 10

Есть предмет, использующий энергию - при каждом использовании тратится одна, то есть, без подзарядки у меня всего 10 использований. Но как только я делаю сейв-лоад, переменная снова становится равной 10, что даёт ещё 10 использований. Как "сохранить" текущее значение переменной? 
Спасибо

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

God save Hatsune Miku!

Ссылка на комментарий
10 часов назад, Firestarter сказал:

влияния выбросов на появление артов

Тыц. Там для Misery, но какая разница.
bind_anomaly_zone.script:
if math.random(1,100) > 17 then

Изменено пользователем Space.Marine
  • Нравится 1
Ссылка на комментарий
8 часов назад, Labadal сказал:

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

Очень не правильно - что-то подобное пробовал очень давно - поясню: 

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

и переключиться на нож - то твой скрипт покажет что урон нанесён ножом,

Увы даже на костыль не тянет

Ссылка на комментарий
10 минут назад, ted.80 сказал:

Очень не правильно - что-то подобное пробовал очень давно - поясню: 

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

и переключиться на нож - то твой скрипт покажет что урон нанесён ножом,

Увы даже на костыль не тянет

 

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

  • Смешно 1
  • Сомнительно 1

God save Hatsune Miku!

Ссылка на комментарий
14 минут назад, Labadal сказал:

Я так упавшую звезду проходил

"Молодец" - что ещё сказать, только задавали вопрос ни как налюбить игру - а как отловить именно удар ножом

так что твой совет весьма сомнителен

Ссылка на комментарий
1 час назад, ted.80 сказал:

"Молодец" - что ещё сказать, только задавали вопрос ни как налюбить игру - а как отловить именно удар ножом

так что твой совет весьма сомнителен

 

Окей, вот тебе подробный "туториал" как это сделать. 
1. подключить X-ray Extensions

2. подключить OGSE.dll

3. подключить каллбек before_hit

4. 

function motivator_binder:before_hit_callback(p_s_hit, p_ignore_flags)
 self.last_hit_data = read_hit_data(p_s_hit)
 local who = level.object_by_id(self.last_hit_data.who_id)
 
  if who:id() == db.actor:id() then
    local wpn = level.object_by_id(self.last_hit_data.weapon_id)
    weapon_kill = wpn:section()
	end
end

5.  Теперь переменная weapon_kill хранит себе название оружия, которым был убит нпс. То есть в ней всё равно будет храниться, допустим, grenade_f1, даже если ты кинул гранату и быстро достал нож. 
6. а дальше все просто
 

if weapon_kill=="wpn_knife" then
*что-то делается*
end

7. В принципе, всё довольно просто.  
А используя оригинальные возможности, лучше тех вариантов, которые предложил я и товарищ Norman Eisenherz  не придумаешь. 

Изменено пользователем Labadal
  • Полезно 1

God save Hatsune Miku!

Ссылка на комментарий
12 часов назад, Space.Marine сказал:

Тыц. Там для Misery, но какая разница.
bind_anomaly_zone.script:
if math.random(1,100) > 17 then

Спасибо большое что помогли, я проверил это на своём сталкере. Но тут уже начинается моя проблема, языка Lua я не знаю, и поэтому сам бы я не допёр, что это означает процент шанса. Да и щас не понимаю, я не понимаю всех этих строчек.
Обидно, конечно, что если хочешь что-то более-менее даже просто узнать, нужно изучать язык. 

Ссылка на комментарий
13 часов назад, Labadal сказал:

Есть у меня переменная, по умолчанию объявлена как 

local energia = 10

local energia = 10

Как я понял в каком-то скрипте у тебя объявляется переменная, и она равна = 10

при использовании чего-либо она уменьшается, (тут все понятно)

но при сейв/лоад - скрипт грузится поновой, и переменная опять объявляется и она = 10 (вот тут и трабла?)

 

для сохранности надо делать по другому

Скрытый текст
	local energia = xr_logic.pstor_retrieve(db.actor, "nrg", nil)
	if not energia then -- | тут энергии нет впринципе
		xr_logic.pstor_store(db.actor, "nrg", 10)  -- | тут выдаём 10
	end

 

 

для использования вот так 

Скрытый текст
	local energia = xr_logic.pstor_retrieve(db.actor, "nrg", nil)
	if energia then -- | тут энергия есть
		if energia > 0 then
			-- | тут её больше нуля
		else
			-- | тут её меньше или равно нулю
		end
	end

 

 

  • Спасибо 1
Ссылка на комментарий

 

Здравствуйте. Столкнулся с такой проблемой. Как известно Call of Chernobyl хотя и масштабный мод, имеет несколько неприятных багов. Один из них: НПС у костра после того как их потревожит противник, возвращались к костру и молчали, застревая на одной анимации, до перезагрузки. Я решил исправить этот баг, и методом тыка вычислил файл который отвечает за поведение НПС у костра, xr_animpoint_predicates.script. Я взял файл из ЗП и заменил им COCовский, проблема исчезла, но появился побочный эффект, теперь НПС у костра всегда с одной анимацией, и разговаривают только "о жизни", не едят, не играют на гитаре, вообщем ведут себя как будто не в зоне кампа. Все попытки отредактировать файл не к чему не привели, отчасти потому что я плохо разбираюсь в скриптах. Может кто разбирается и увидит что не так? Вроде бы в этом замешаны эти фрагменты.
 

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

 

--------------------------------------------------------------------------------
-- Predicate functions for xr_animpoint actions --------------------------------
--------------------------------------------------------------------------------
function const_predicate_true(id)
    local npc = db.storage[id] and db.storage[id].object
    if (npc and db.storage[id].need_sleep) then
        return false
    end

    return true
end

function animpoint_predicate_bread(id)
    local npc = db.storage[id] and db.storage[id].object
    if (npc and not db.storage[id].need_sleep) then
        return true
    end
    return false
end

function animpoint_predicate_kolbasa(id)
    local npc = db.storage[id] and db.storage[id].object
    if (npc and not db.storage[id].need_sleep) then
        return true
    end
    return false
end

function animpoint_predicate_vodka(id)
    local npc = db.storage[id] and db.storage[id].object
    if (npc and not db.storage[id].need_sleep) then
        return true
    end
    return false
end

function animpoint_predicate_energy(id)
    local npc = db.storage[id] and db.storage[id].object
    if (npc and not db.storage[id].need_sleep) then
        return true
    end
    return false
end

function animpoint_predicate_guitar(id, camp)
    if not (camp) then
        return false 
    end 
    local npc = db.storage[id] and db.storage[id].object
    if (npc and not db.storage[id].need_sleep) then
        return true
    end
    return false
end

function animpoint_predicate_harmonica(id, camp)
    if not (camp) then
        return false 
    end 
    local npc = db.storage[id] and db.storage[id].object
    if (npc and not db.storage[id].need_sleep) then
        return true
    end
    return false
end

function animpoint_predicate_weapon(id)
    return true
end

 

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

 

function const_predicate_true(npc_id)
    return true
end

function animpoint_predicate_bread(npc_id)
    if(db.storage[npc_id] and db.storage[npc_id].object and eatable_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("bread")) == true then
        return true
    end
    return false
end

function animpoint_predicate_kolbasa(npc_id)
    if(db.storage[npc_id] and db.storage[npc_id].object and eatable_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("kolbasa")) then
        return true
    end
    return false
end

function animpoint_predicate_vodka(npc_id)
    if(db.storage[npc_id] and db.storage[npc_id].object and eatable_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("vodka")) then
        return true
    end
    return false
end

function animpoint_predicate_energy(npc_id)
    if(db.storage[npc_id] and db.storage[npc_id].object and eatable_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("energy_drink")) then
        return true
    end
    return false
end

function animpoint_predicate_guitar(npc_id, is_in_camp)
    --printf("  predicate_guitar %s", npc_id)
    --printf("        registred_camp %s", tostring(is_in_camp))
    if is_in_camp == true and db.storage[npc_id] and db.storage[npc_id].object and db.storage[npc_id].object:object("guitar_a") then
        --printf("  return true")
        return true
    end
    --printf("  return false")
    return false
end

function animpoint_predicate_harmonica(npc_id, is_in_camp)
    --printf("  predicate_harmonica %s", npc_id)
    --printf("        registred_camp %s", tostring(is_in_camp))
    if is_in_camp == true and db.storage[npc_id] and db.storage[npc_id].object and harmonica_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("harmonica_a") then
        --printf("  return true")
        return true
    end
    --printf("  return false")
    return false
end


function animpoint_predicate_weapon(npc_id)
    if(db.storage[npc_id] and db.storage[npc_id].object) then
            local smart = xr_gulag.get_npc_smart(db.storage[npc_id].object)
            if(smart) then
                    for k,v in pairs(smart_table) do
                            if smart:name() == v then
                                    return false
                            end
                    end
            end
    end
        return true
end

 

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

@ted.80 чет туплю жестко, сплошные вылеты ловлю. 
где вставить этот кусок? 
Можно ли переменную сделать глобальной? (Для использования в других скриптах небоходимо)

God save Hatsune Miku!

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

@Labadal Можно привязать условную энергию к состоянию предмета: при каждом использовании менять через obj:set_condition( старое значение - 0.1 ) и отключать использование при obj:condition() < 0.1. Состояние при этом будет храниться в штатном нетпакете без дополнительных действий в скриптах. В OGSE так хранится состояние расходуемых ремкомплектов, а в NLC-7 – состояние постепенно теряющих силу артефактов.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

@Norman Eisenherz 
Проблема в том, что используемый предмет расходует "энергию" бронекостюма, который надет на гг. Тут уж кондишн не отнимешь. (не в том смысле, что нельзя, а в том, что задумка)

God save Hatsune Miku!

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

@Labadal Можно спавнить "аккумулятор" с невидимой иконкой и без собственного веса, считая, что предмет вставлен в броню.

  • Полезно 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

@Labadal 

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

Ссылка на комментарий
1 час назад, Labadal сказал:

как сохранять

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

-- Записываем переменную
function save(variable_name, value)
    xr_logic.pstor_store(db.actor, variable_name, value)
end

-- Загружаем переменную
function load(variable_name, value_if_not_found)
    return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

-- Удаляем переменную
function del(variable_name)
    if db.storage[db.actor:id()].pstor[variable_name] then
        db.storage[db.actor:id()].pstor[variable_name] = nil
    end
end

 

Здесь могла быть ваша реклама.

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

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

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

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

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

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

Войти

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

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

AMK-Team.ru

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