Все посты %s в %S - AMK Team
Перейти к контенту

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


Halford

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

Министр

Можно прописать аптечку в таймеры АМК по аналогии с ремкомплектом, спальником и т.д. Нужны файлы amk.script и amk_mod.script.

 

================================

Вопрос по работе со строками: известно, что определить порядковый номер символа в строке можно командой

pos = string.find(string,",")

Метод работает практически для всех символов, но на открывающейся скобке ( попытка определить номер символа вызывает вылет с жалобой на строку с командой pos = string.find(str,"(")

[error]Arguments : LUA error: d:\games\s.t.a.l.k.e.r\gamedata\scripts\111.script:63: unfinished capture

 

Проблема, похоже, в незакрытой скобке. Перепробовал уже такие варианты: "(" и [[(]] - вылет с указаным логом, "/(", "//(" и [[/(]] - результат nil, хотя скобка в строке есть.

Как ни странно, для закрывающей скобки такой проблемы не возникает.

 

Можно ли каким-то образом все-таки вычислить эту чертову скобку?

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


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

Monnoroch, Garrett

 

Спавн ВСЕМ неписям в инвентарь (затрагивает и тех, кто присутствует изначально!)

 

Нужен файл se_stalker.script. Ищем функцию se_stalker:on_spawn()

 

Самый простой вариант - безусловный спавн. У меня это выглядит так - добавляется перед end одна строка (для каждого предмета, само собой):

 

spawn.inv("wpn_pkm", tonumber(self.id) or tonumber(self:id()))

 

И сама функция спавна в инвентарь из моего файла spawn.script:

 

function inv(item,npc_id)

if npc_id == nil then

npc_id = db.actor:id()

end

local obj = alife():create(item,vector():set(0,0,0),1,1,npc_id)

return obj

end

 

Почему такие значения координат: Проверял, в случае спавна в инвентарь координаты не имеют значения. Во всяком случае, при значении геймвертекса 1000 (не выяснял, какая это локация, но точно не кордон) весь народ на кордоне (дальше не ходил) все равно получает ПКМ-ы.

 

Далее, условия спавна.

 

- спавнить не постоянно, а с некоторой вероятностью

 

условие будет таким:

 

if math.random() < N then -- N вероятность спавна от 0 до 1. 1 и выше - 100% спавн, 0 и меньше - никогда не заспавнится.

сам спавн

end

 

- отлично было бы, если спавнить эти предметы зависимо от ранга неписи (например, новичку в рюкзак - "медузу", ветерану - "бабкины бусы")

 

local npc_rank = ranks.get_obj_rank_name(npc) -- ранг НПС

if npc_rank == "novice" then

спавн для новичка

elseif npc_rank == "veteran" then

спавн для ветерана

elseif... аналогично с остальными рангами.

end

 

Теперь разберемся с параметром npc. Если написать так в se_stalker.script, то скорее всего пошлет. В se_stalker.script НПС обозначен как self, т.е. тот объект, для которого вызвана функция, т.е. self и надо писать. Если же выносить спавн в функцию из отдельного файла, то вызов в se_stalker:on_spawn() будет

 

myscript.myfunction(self),

 

а в файлe myscript будет уже

 

function myfunction(npc)

...

end

 

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

 

Это самое простое. Стрелять, заряжать (если патроны есть) и т.п. НПС будет в любом случае. Единственный неоднозначный момент - торговля. Надо ее настроить в файле config\misc\trade_generic.ltx. Разреши сталкерам торговать всем подряд - и все.

 

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

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


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

Garrett,

 

Можно, конечно. Делается это примерно так:

Сумма вероятностей: 30 + 25 + 20 + 15 + 10 = 100. В данном случае получилось 100, но в принципе это не так важно. Получившееся число пойдет в скобки у math.random

 

Пишем примерно следующее:

 

-- Выбор оружия

local wpn

if math.random(100) < 30 then -- 30 - вероятность ПМ-а

wpn = "wpn_pm"

elseif math.random(100) < 55 then -- 55 = 30 (ПМ, но его уже проверяли раньше, его не заспавнит) + 25 - вероятность ПБ

wpn = "wpn_pb"

elseif math.random(100) < 75 then -- 75 = 50 (ПМ или ПБ) + 20 - вероятность МР-5

wpn = "wpn_mp5"

elseif math.random(100) < 90 then -- 90 = 75 + 15 - АКС74У

wpn = "wpn_ak74u"

else -- остается от 90 до 100 на АК74

wpn = "wpn_ak74"

end

-- Спавн выбранного оружия

spawn.inv(wpn, tonumber(self.id) or tonumber(self:id()))

-- Не забываем про патроны

local ammo_string = system_ini():r_string(weap_sect, "ammo_class") -- Читаем патроны из конфига

local ammo = "grenade_f1" -- если патроны почему-то не определятся, выбираем гранату

if string.find(ammo_string, ",") == nil then -- если запятая не найдена - единственный тип боеприпаса

ammo = ammo_string -- его и выбираем

else

ammo = string.sub(ammo_string,1,l-1) -- иначе выбираем первый боеприпас в списке

end

-- Спавним выбранный боеприпас

spawn.inv(ammo, tonumber(self.id) or tonumber(self:id()))

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


Ссылка на сообщение
Когда я спавнил стволы, они уже были с патронами. И вроде в сингле так всегда. Насчёт гранат не знаю.

 

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

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


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

Существует ли способ определить, в какое место пришлось попадание по вертолету? У него хит колбек совершенно не такой, как у всего остального.

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


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

wolkolak

 

...

как поправить что бы небыло респавна бандосов на кордоне на Атп и на переходе свалка - агропром

тоесть один раз завалил и все больше не появляются именно там ...

 

На АТП после выноса бандитов по квесту Шустрого выдается инфопоршень, кажется, "esc_kill_bandits_quest_kill". В алл.спавне надо в настройках самрт террейна esc_fabrika_bandit прописать условие существования: cond = {-esc_kill_bandits_quest_kill -esc_kill_bandits_quest_done}

Та-ак, оно и так прописано, ЭТОТ гулаг по завершении квеста отключается, зато включается другой гулаг esc2_st_fabric на логике general lager. Удаляем его совсем или ставим заведомо невыполнимое условие типа "еще не говорили с Сидоровичем в самом начале игры".

 

Аналогично разбираемся и с бандитами на свалке.

 

===============================

 

Всем

 

Народ, так есть какие-либо идеи насчет уязвимости вертолетов? Меня хватило только на то, чтобы обнулить им повреждения от пистолетных и небронебойных промежуточных патронов (даже из ПМ или обреза можно было забить, если долго метелить :) ). А как настроить зональные повреждения, желательно с зонами абсолютной неуязвимости даже винтовочными патронами (гранаты - разговор особый)?

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

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

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


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

RvP,

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

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


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

Monnoroch

 

По идее, должны быть, модель-то анимированая. Да и файл config\models\vehicles\veh_mi24_u_01.ltx наводит на те же мысли:

 

[helicopter_definition]

default_hit_factor = 0.0 ; default hit factor (0..1)

hit_section = hit_bones ; hit section name

wpn_rotate_x_bone = front_gun ; rotate X-axis(pitch) bone name

wpn_rotate_y_bone = front_gun_tower ; rotate Y-axis(head) bone name

wpn_fire_bone = front_gun_fire ; weapon axis (fire) bone name

left_rocket_bone = left_gun ;

left_rocket2_bone = left_gun2 ;

right_rocket_bone = right_gun ;

right_rocket2_bone = right_gun2 ;

smoke_bone = front_propeller

light_bone = front_propeller

 

[hit_bones] ; per bones hit factor

pilot1 = 0.0

pilot2 = 0.0

back_propeller = 0.0

 

 

Вот только это, похоже, далеко не полный перечень. И как с ним обходиться - непонятно...

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


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

Monnoroch

 

function 111(table, id)
    for k,v in pairs (table) do
        if v == id then return true end
    end
    return false
end

Если в таблице table есть число, равное id, возвращает true, иначе false

 

Jesh

 

А можешь список костей вертолета выложить? И для БТР, если не сложно?

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


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

Monnoroch

 

Все правильно, math.max выбирает наибольшее число. Но она стоит в цикле, поэтому каждый раз сравниваются предыдущее наибольшее и вновь полученное числа, и из них выбирается максимальное. Которое на следующей итерации снова сравниается с очередным полученным числом.

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


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

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

Известно только ID сталкера (из скрипта вертолета), и то, что он в онлайне.

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

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


Ссылка на сообщение
По моему, это разные задачи. Хотя бы потому, что при панике непись бежит не в конкретную точку, а куда подальше. Вроде как это схемами делается и надо просто схемы переключать. Но мне ещё самому разбираться и разбираться.

 

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

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


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

Nekt

 

Присоединяюсь к просьбе Monnoroch. Как эти схемы вызывать, желательно из совершенно левого файла? И как потом вернуть обратно, как было?

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


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

Monnoroch

В таком виде может и не понять, а вот math.random(-2,-1) точно можно.

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


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

Потребуется использовать эвалуатор такого вида (простейший вариант):

class "my_evaluator" (property_evaluator)
function my_evaluator:__init(npc,name,storage) super (nil,name)
    self.st = storage
    self.st.active = false
end
function my_evaluator:evaluate()    
    return self.st.active == true
end

...

 

Правильно ли я понял, что в функции my_evaluator:evaluate() может быть что угодно, главное, чтобы она в результате возвращала true или false?

 

И такой вопрос: откуда берутся параметры в самом определении класса my_evaluator:__init(npc,name,storage) super (nil,name)? Что они означают? Или они всегда одинаковые и их можно в любом случае писать такими?

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

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


Ссылка на сообщение
у меня при попытке получить что-нибудь из рюкзака через object_by_id идёт nil.

 

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

На следующем апдейте уже находит без проблем. А недавно пробил через object_by_id все возможные id, находясь на кордоне, с выводом секций всего найденного в лог. Весь ассортимент Сидоровича, все барахло сталкеров (в этой куче из 20000+ наименований было не разобрать, только ли онлайновых), барахло ГГ и куча всего остального.

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


Ссылка на сообщение
Dumpstone, Проверь weapons.ltx, секция [ammo_base] должна быть в начале, сразу после инклудов, но ее почему-то не находит.

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


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

Подскажите, что означают записи вида action(набор параметров)

 

Например, в mob_walker.script встречается такое:

action(self.object, move(move.run_fwd, patrol(self.st.path_walk, patrol.next, patrol.continue)),cond(cond.move_end))

 

Примерно понятно, что это приказ объекту self.object идти в состоянии move.run_fwd по пути self.st.path_walk (а причем здесь patrol.next и patrol.continue, что они дают???), пока не будет состояние cond.move_end.

 

И такие action встречается сплошь и рядом. А где посмотреть детали всего этого безобразия и как в нем покопаться? Или как сделать что-то свое, наподобие этого action-a?

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


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

Monnoroch

 

Нет, к сожалению, так оно было бы понятней. Единственное, что нашел по этому поводу - функцию в _g.script:

 

function action(obj,...)
    local arg = {...}
    local act = entity_action()
    local i = 1
    while true do
        if (arg[i] ~= nil) then
            act:set_action(arg[i])
        else
            break
        end
        i = i + 1
    end
    if (obj ~= nil) then
        obj:command(act,false)
    end
    return  entity_action(act)
end

 

Насколько я понимаю, для каждого агрумента из ... устанавливается какой-то entity_action. А потом, если есть объект, ему командуется какой-то из них (а который?). В общем, в результате понимание - ноль.

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


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

Народ, как понимать такие записи в lua_help:

 

например, строка 5439

move (enum MonsterSpace::EScriptMonsterMoveAction, vector&, number);

 

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

А что такое этот загадочный enum - enum MonsterSpace::EScriptMonsterMoveAction? Как здесь сложить концы с концами и понять, что же нужно передавать в функцию(или что оно там на самом деле, не метод точно)

 

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

move (enum MonsterSpace::EScriptMonsterMoveAction, game_object*, number);

сами собой подразумеваются и в явном виде их указывать не нужно?

 

 

Rafa,

escape_dialog.script, функция wolf_additional_reward(first_speaker, second_speaker), 255 строка в оригинале 1.0004

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

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


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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