Kirag 40 Опубликовано 26 Июня 2009 Министр Можно прописать аптечку в таймеры АМК по аналогии с ремкомплектом, спальником и т.д. Нужны файлы 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, хотя скобка в строке есть. Как ни странно, для закрывающей скобки такой проблемы не возникает. Можно ли каким-то образом все-таки вычислить эту чертову скобку? Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 28 Июня 2009 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. Разреши сталкерам торговать всем подряд - и все. Само собой, условия спавна можно вкладывать друг в друга и вообще комбинировать, как считаешь нужным. Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 28 Июня 2009 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())) Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 28 Июня 2009 Когда я спавнил стволы, они уже были с патронами. И вроде в сингле так всегда. Насчёт гранат не знаю. Само собой, стволы при спавне заряжены. Я имел ввиду патроны для перезарядки. Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 1 Июля 2009 Существует ли способ определить, в какое место пришлось попадание по вертолету? У него хит колбек совершенно не такой, как у всего остального. Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 2 Июля 2009 (изменено) 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. Удаляем его совсем или ставим заведомо невыполнимое условие типа "еще не говорили с Сидоровичем в самом начале игры". Аналогично разбираемся и с бандитами на свалке. =============================== Всем Народ, так есть какие-либо идеи насчет уязвимости вертолетов? Меня хватило только на то, чтобы обнулить им повреждения от пистолетных и небронебойных промежуточных патронов (даже из ПМ или обреза можно было забить, если долго метелить ). А как настроить зональные повреждения, желательно с зонами абсолютной неуязвимости даже винтовочными патронами (гранаты - разговор особый)? Ну ведь бред же, если вертолет рухнет, получив десяток-другой даже сквозных попаданий в хвостовую балку. Вот движок - другое дело. Не ставить же тупой рандом! Изменено 2 Июля 2009 пользователем Kirag Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 2 Июля 2009 RvP, Смертельный выстрел из ПМ против экзы в голову как раз лечится, посмотри в теме "рассчет повреждений при стрельбе по неписям ТЧ" Блокируются (в моих конфигах оружия, в оригинале с ними каша, не знаю, что получится) все пистолетные и обычные промежуточные патроны. Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 2 Июля 2009 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 Вот только это, похоже, далеко не полный перечень. И как с ним обходиться - непонятно... Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 2 Июля 2009 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 А можешь список костей вертолета выложить? И для БТР, если не сложно? Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 11 Июля 2009 Monnoroch Все правильно, math.max выбирает наибольшее число. Но она стоит в цикле, поэтому каждый раз сравниваются предыдущее наибольшее и вновь полученное числа, и из них выбирается максимальное. Которое на следующей итерации снова сравниается с очередным полученным числом. Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 12 Июля 2009 (изменено) Подскажите, как скриптом заставить сталекра бежать в панике, как если бы он был безоружным против вооруженного врага? А то на него, балбеса, вертолет заходит с недобрыми намерениями, а он стоит, ноль эмоций. Известно только ID сталкера (из скрипта вертолета), и то, что он в онлайне. Изменено 12 Июля 2009 пользователем Kirag Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 12 Июля 2009 По моему, это разные задачи. Хотя бы потому, что при панике непись бежит не в конкретную точку, а куда подальше. Вроде как это схемами делается и надо просто схемы переключать. Но мне ещё самому разбираться и разбираться. Действительно задачи разные, но в конкретную точку тоже подойдет, ее задать несложно. Но главное, чтобы непись хотя бы дернулся. Есть ли какие-то предположения, где эта переключалка схем лежит? Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 12 Июля 2009 Nekt Присоединяюсь к просьбе Monnoroch. Как эти схемы вызывать, желательно из совершенно левого файла? И как потом вернуть обратно, как было? Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 12 Июля 2009 Monnoroch В таком виде может и не понять, а вот math.random(-2,-1) точно можно. Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 14 Июля 2009 (изменено) ... Потребуется использовать эвалуатор такого вида (простейший вариант): 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)? Что они означают? Или они всегда одинаковые и их можно в любом случае писать такими? Изменено 14 Июля 2009 пользователем Kirag Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 15 Июля 2009 у меня при попытке получить что-нибудь из рюкзака через object_by_id идёт nil. У меня такое было сразу же после спавна, когда пытаешься поймать объект в той же функции, которой спавнил (или из нее вызванной) - выдает nil, что в рюкзаке, что в слоте. Так спавнил автомат, в руках он есть, а объект показывает nil. На следующем апдейте уже находит без проблем. А недавно пробил через object_by_id все возможные id, находясь на кордоне, с выводом секций всего найденного в лог. Весь ассортимент Сидоровича, все барахло сталкеров (в этой куче из 20000+ наименований было не разобрать, только ли онлайновых), барахло ГГ и куча всего остального. Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 20 Июля 2009 Dumpstone, Проверь weapons.ltx, секция [ammo_base] должна быть в начале, сразу после инклудов, но ее почему-то не находит. Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 26 Июля 2009 Подскажите, что означают записи вида 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? Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 26 Июля 2009 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. А потом, если есть объект, ему командуется какой-то из них (а который?). В общем, в результате понимание - ноль. Поделиться этим сообщением Ссылка на сообщение
Kirag 40 Опубликовано 28 Июля 2009 (изменено) Народ, как понимать такие записи в 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 Изменено 28 Июля 2009 пользователем Kirag Поделиться этим сообщением Ссылка на сообщение