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

[SoC] Ковыряемся в файлах


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

По моему сия фича спавна артов вообще в ТЧ не работает и была по недосмотру оставлена с более ранних вариантов сталкера,где и выброс был....

Но это мои наблюдения,они не обоснованны с точки зрения кода.

 

Просто в оригинальном ТЧ НЕ было ни 1 арта,которые бы изменили свое положение за 3 прохождения игры...

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

В конфигах аномалий половина параметров не работает, что есть, то есть. Но при увеличении параметров "min_artefact_count" и "max_artefact_count" скажем, на 1 и 3 соответственно (может, еще что-то надо править, я тогда хорошенько в конфигах поковырялся, все не упомню), Кордон уже при старте новой игры завален "медузами", иногда попадаются и "каменные цветки". Насчет возобновляемости артов точно не знаю, либо уходил с Кордона, не собирая все подчистую (а иначе в глаза не бросится, уж слишком много артов), либо терпения не хватало дождаться смены суток. Настроить спавн на разумное количество не вышло, так что я особо и не заморачивался.

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

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

Я эти параметры из АМК брал, там 0 и 0. В оригинале не могу сейчас проверить.

Спасибо за внимание, я уже кое-что понял. Осталось лишь уразуметь, как правильно можно в строке "artefact_spawn_idle = 24 ;насколько часто спонить артефакты в офлайне, в часах" прописать не фиксированный интервал (то есть, чтоб спавн случался более рендомно по времени), какое выражение будет там корректо считываться для этой цели.

И, насколько я понял, в аномалии можно и части монстрюков прописать, это ведь не слишком важно, что именно там будет?

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

Честно не понимаю проблемы. Вот только что проверил: убрал дрожание и дисперсию при выстреле, прицелился, выстрелил. Расстояние точно знаю, режим ведь есть с показом расстояния. На стене, в которую стреляю, пули ложатся точно в одном и том же месте. Сделал из режима прицеливания скриншот. На скриншоте отлично видно место попадания и на сколько оно смещено от центра. Теперь в этом же месте надо поставить линию на худе прицела. И так для нескольких расстояний. Всё, никаких перезагрузок, никаких неточностей.

Или я что-то принципиальное не понимаю?

 

Стрелять дальше 150 метров - теоретически можно, но непись в офлайне и там другая схема умирания

Если непись видно, значит он в онлайне. Если объект дальше дистанции алайфа, значит просто что-то помешало ему перейти в оффлайн.

 

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

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

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

 

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

процедура чтения параметров сталкера через нет_пакет результат возвращается в виде таблицы

function readvu32u8(packet)
  local v={}
  local len=packet:r_s32()
  for i=1,len,1 do
    table.insert(v,packet:r_u8())
  end
  return v
end

function readvu8u8(packet)
  local v={}
  local len=8
  for i=1,len,1 do
    table.insert(v,packet:r_u8())
  end
  return v
end

function readvu32u16(packet)
  local v={}
  local len=packet:r_s32()
  for i=1,len,1 do
    table.insert(v,packet:r_u16())
  end
  return v
end

function parse_stalker_packet(ret,stpk,updpk,size)
  ret.money=stpk:r_s32()
  ret.profile=stpk:r_stringZ()
  ret.infammo=stpk:r_s32()
  ret.class=stpk:r_stringZ()
  ret.communityid=stpk:r_s32()
  ret.rank=stpk:r_s32()
  ret.reputation=stpk:r_s32()
  ret.charname=stpk:r_stringZ()  
  ret.gvid=stpk:r_u16()
  ret.obf32u1=stpk:r_float()
  ret.obs32u2=stpk:r_s32()
  ret.lvid=stpk:r_s32()
  ret.oflags=stpk:r_s32()
  ret.custom=stpk:r_stringZ()
  ret.sid=stpk:r_s32()
  ret.obs32u3=stpk:r_s32()
  ret.visual=stpk:r_stringZ()
  ret.vsu8u1=stpk:r_u8()
  ret.team=stpk:r_u8()
  ret.squad=stpk:r_u8()
  ret.group=stpk:r_u8()
  ret.health=stpk:r_float()
  ret.crvu32u16u1=readvu32u16(stpk)
  ret.crvu32u16u2=readvu32u16(stpk)  
  ret.killerid=stpk:r_u16()
  ret.game_death_time=readvu8u8(stpk)
  ret.updhealth=updpk:r_float()
  ret.upds32u1=updpk:r_s32()
  ret.updu8u2=updpk:r_u8()
  ret.updpos={} -- или поставить вектор? ладно потом
  ret.updpos.x=updpk:r_float()
  ret.updpos.y=updpk:r_float()
  ret.updpos.z=updpk:r_float()
  ret.updmodel=updpk:r_float()
  ret.upddir={}
  ret.upddir.x=updpk:r_float()
  ret.upddir.y=updpk:r_float()
  ret.upddir.z=updpk:r_float()
  ret.updteam=updpk:r_u8()
  ret.updsquad=updpk:r_u8()
  ret.updgroup=updpk:r_u8()  
  ret.baseoutr=stpk:r_stringZ()
  ret.baseinr=stpk:r_stringZ()
  ret.smtrid=stpk:r_u16()
  ret.smtrtaskactive=stpk:r_u8() 
  ret.updu16u1=updpk:r_u16()
  ret.updu16u2=updpk:r_u16()
  ret.upds32u3=updpk:r_s32()
  ret.upds32u4=updpk:r_s32()
  ret.skeleton=stpk:r_stringZ()
  ret.skeleton_flags=stpk:r_u8()
  ret.source_id=stpk:r_u16()
  ret.huvu32u8u1=readvu32u8(stpk)
  ret.huvu32u8u2=readvu32u8(stpk)  
  ret.hellodlg=updpk:r_stringZ()
  ret.stunk1={}
  for i=stpk:r_tell(),size-1,1 do
    table.insert(ret.stunk1,stpk:r_u8())
  end
  return ret
end

function read_stalker_params(sobj)
  local stpk=net_packet()
  local uppk=net_packet()
  sobj:STATE_Write(stpk)
  sobj:UPDATE_Write(uppk)
  local size=stpk:w_tell()
  local size1=uppk:w_tell()
  stpk:r_seek(0)
  uppk:r_seek(0)
  local tbl=parse_stalker_packet({},stpk,uppk,size)
  return tbl
end

 

 

то что тебе надо:

1. параметры health и updhealth

2. visual

3. не знаю

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий
Какой параметр в net_packet'е (сталкер) отвечает за:

...

3. Чемодан (инвентарь)

Инвентарь по-любому в нетпакет не запихнёшь =) У каждого объекта есть параметр parent_id. Когда он равен id актора - это значит он в инвентаре.

 

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

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

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

 

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

кто в курсе из-за чего могет быть такой вылет

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CIni_IdToIndex<1,struct COMMUNITY_DATA,class shared_str,int,class CHARACTER_COMMUNITY>::GetByIndex

[error]File : e:\stalker\patch_1_0004\xr_3da\xrgame\ini_id_loader.h

[error]Line : 147

[error]Description : <no expression>

[error]Arguments : item by index not found in section game_relations, line communities

118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

Gonarh, Новый монстр\группировка с непрописанными отношениями может...

 

Тут как-то дискуссия была по поводу как надеть подствольник\другой апгрейд на автомат НПС,я вроде пробовал несколько раз,не получается...у меня просто совсем нет опыта работы с нетпакетами...

 

Может кто поможет более подробно как именно это сделать...

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

снова пытался сделать нпс маклаудами - и опять неудачно :(

по советам Kirag и Kostya V в алл.спавне сделал так:

 

[137]

; cse_abstract properties

section_name = stalker_sakharov

name = esc_wolf

 

и хрен! что ему опять нехватает?

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

Народ, кто-нибудь разбирался с работой с векторами? В lua_help в классе vector куча функций. Часть еще можно догадаться, как, например, set_length(number) или distance_to(const vector&). Но основная масса совершенно непонятны, как загадочный dotproduct(const vector&). Может кто-нибудь подсказать, какие действия они выполняют?

 

function set_length(number);

function sub(number);

function sub(const vector&);

function sub(const vector&, const vector&);

function sub(const vector&, number);

function reflect(const vector&, const vector&);

function slide(const vector&, const vector&);

function average(const vector&);

function average(const vector&, const vector&);

function normalize_safe();

function normalize_safe(const vector&);

function normalize();

function normalize(const vector&);

function align();

function magnitude() const;

function getP() const;

function max(const vector&);

function max(const vector&, const vector&);

function distance_to_xz(const vector&) const;

function invert();

function invert(const vector&);

function mad(const vector&, number);

function mad(const vector&, const vector&, number);

function mad(const vector&, const vector&);

function mad(const vector&, const vector&, const vector&);

function clamp(const vector&);

function clamp(const vector&, vector);

function inertion(const vector&, number);

function crossproduct(const vector&, const vector&);

function set(number, number, number);

function set(const vector&);

function abs(const vector&);

function div(number);

function div(const vector&);

function div(const vector&, const vector&);

function div(const vector&, number);

function dotproduct(const vector&) const;

function getH() const;

function min(const vector&);

function min(const vector&, const vector&);

function similar(const vector&, number) const;

function distance_to(const vector&) const;

function lerp(const vector&, const vector&, number);

function distance_to_sqr(const vector&) const;

function mul(number);

function mul(const vector&);

function mul(const vector&, const vector&);

function mul(const vector&, number);

function setHP(number, number);

function add(number);

function add(const vector&);

function add(const vector&, const vector&);

function add(const vector&, number);

 

 

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

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

 

ответ перенёс в это сообщение в другом топике.

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

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

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

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

 

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

Два вопроса по скриптам:

1. Как поймать непися, который попал по ГГ?

2. Как поймать непися, по которому попал ГГ?

3. Как узнать хит, который получил ГГ в результате попадания по нему непися?

4. Как узнать хит, который был нанесён неписю ГГ?

5. При стрельбе из РПГ вылетает ракета? Это game_object? Если да, то как поймать? Если нет, то как получить место взрыва этой ракеты?

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

1. Никак

2. смотри функцию motivator_binder:hit_callback в файле xr_motivator.script

3. Никак

4. смотри функцию motivator_binder:hit_callback в файле xr_motivator.script

5. незнаю

118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

cc31,

Проверь так ли у тебя выглядит секция stalker_sakharov в файле m_stalker.ltx

 

[stalker_sakharov]:stalker_trader

$spawn = "stalkers\stalker_sakharov"

immunities_sect = stalker_immunities_sakharov

condition_sect = my_stalker_condition

 

[my_stalker_condition]

satiety_v = 0.0 ;скорость уменьшения сытости со временем

radiation_v = 1.0 ;скорость уменьшения радиации

satiety_power_v = 1.0 ;увеличение силы при уменьшении сытости

satiety_health_v = 1.0 ;увеличение здоровья при уменьшении сытости

satiety_critical = 0.0 ;критическое значения сытости (в процентах от 0..1) когда здоровье начианает уменьшаться

radiation_health_v = 0.0 ;уменьшение здоровья при воздействии радиации

morale_v = 0.0 ;скорость восстановления морали

health_hit_part = 0.0 ;процент хита, уходящий на отнимание здоровья

power_hit_part = 0.1 ;процент хита, уходящий на отнимание силы

psy_health_v = 0.1 ;скорость восстановления psy-здоровья

 

;открытые раны

bleeding_v = 0.0 ;потеря крови при номинальной ране в секунду

wound_incarnation_v = 1.0 ;крутизна кривой заживления (какой процент раны заживет в игровую секунду)

min_wound_size = 1.0 ;минимальный размер раны, после которого она считается зажившей

 

sleep_health = 1.0 ;1.5 ;коэффициенты скоростей изменения параметров во время сна

sleep_power = 1.0 ;1.5

sleep_satiety = 1.0 ;0.8

sleep_radiation = 1.0 ;1.1

sleep_psy_health = 1.0

 

 

[stalker_immunities_sakharov]

burn_immunity = 0.0 ;коэффициенты иммунитета

strike_immunity = 0.0

shock_immunity = 0.0

wound_immunity = 0.0

radiation_immunity = 0.0

telepatic_immunity = 0.0

chemical_burn_immunity = 0.0

explosion_immunity = 0.0

fire_wound_immunity = 0.0

wound_2_immunity = 0.0

 

Кто весел - тот смеется, кто хочет - тот добьется, кто ищет - тот всегда найдет!

Ссылка на комментарий
3. Как узнать хит, который получил ГГ в результате попадания по нему непися?
3. Никак

По идее ничто не мешает навесить на ГГ такой же коллбек, как и на обычного сталкера. Добавить в bind_stalker.script в функцию actor_binder:reinit() строчку типа:

self.object:set_callback(callback.hit, self.hit_callback, self)

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

 

5. При стрельбе из РПГ вылетает ракета? Это game_object? Если да, то как поймать? Если нет, то как получить место взрыва этой ракеты?
Если это объект, то его можно будет поймать перебором. Стреляешь, пока ракета летит переключаешься в меню и вызываешь свой скрипт, который перебирает онлайновые объекты и ищет что там есть интересного.

 

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

Цитирую своё давнее сообщение с ПЫСовского форума:

 

Тестирование скриптов без обрушения и перезапуска игры

 

Не знаю, как у вас, а до сих пор у меня процесс отладки скрипта выглядел так:

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

2. Выношу скрипт в отдельный файл и получаю вылет игры с до ужаса информативным сообщением в лог-файле "attempt to index global 'my_cool_script' (a nil value)".

Это значит, что тупую синтаксическую ошибку я сделал в файле my_cool_script.script

Можно до хрипоты говорить о пользе предварительной синтаксической проверки, но как часто мы её не делаем, не так ли?

3. Наконец-то умнею и проверяю скрипт на вшивость заранее. Запускаю игру, загружаю уровень.

загружаю уровень...

загружаю уровень......

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

4. Меняю скрипт, повторяю всё заново, скрипт отрабатывает, но делает не то, что мне надо. Чтобы изменения в скрипте вступили в силу, надо перегрузить уровень.

так что повторяю пп.3 и 4, пока не получу то, что мне было нужно.

 

Знакомая картина?

 

Так вот, господа, имеется некоторая пилюля для всего этого геморроя!

Ключевыми элементами являются две функции из стандартной библиотеки Lua:

dofile - позволяет загрузить и выполнить как chunk внешний файл.

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

 

Ну и собственно рецепт пилюли

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

 

    local res, err = pcall(my_proxy.start_chunk_from_file)
    get_console():execute(res and "Succesfull!" or string.gsub(err, " ", "_")) --имитация тернарного оператора

pcall возвращает два значения. Первое - результат запуска. Если все прошло пучком, то true. Второе - добавочное значение с сообщением об ошибке, если ошибка была. Иначе nil.

 

файл my_proxy.script содержит всего одну функцию

 

function start_chunk_from_file()
    local chunk, err = dofile("..\\gamedata\\scripts\\test.lua")
    if err then
        get_console():execute("err="..tostring(string.gsub(err, " ", "_")))
    end
end

dofile принимает имя файла со скриптом, загружает его и выполняет как функцию. Путём экспериментов я выяснил, что текущим каталогом Lua считает папку bin. Так что если хотим держать скрипт там, где и все остальные, то пишем путь относительно этой папки "..\\gamedata\\scripts\\test.lua".

test.lua - это отлаживаемый скрипт.

Обработка ошибок осуществляется аналогично pcall.

 

Собственно и всё. Теперь можно не выходя из игры и даже не перегружая уровень копаться в скрипте test.lua и запускать его по много раз существенно менее рискуя обрушить игру.

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

 

Особенно удобно, если есть два компа и сетка. В этом случае даже Alt-Tab не нужен. Редактируешь файл по сети на одном компе, а запускаешь в загруженной игре на другом.

 

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

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

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

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

 

Ссылка на комментарий
По идее ничто не мешает навесить на ГГ такой же коллбек, как и на обычного сталкера. Добавить в bind_stalker.script в функцию actor_binder:reinit() строчку типа:

self.object:set_callback(callback.hit, self.hit_callback, self)

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

Тото и оно уважаемый, если бы не пробовал сам вешать коллбеки - не говорил ба, неловиться сволочь, а мне позарез нуно было момент хита ГГ, шоб не грузить апдейтер проверкой хэлса, но.... :unsure:

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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