Dennis_Chikin 3 663 Опубликовано 25 Мая 2014 (изменено) Вылеты "по памяти" - результат ошибок, а не собственно нехватки памяти. Но если ставить - то ogse (см. шапку основной темы) или макронопатч. Про слайдшоу - попробуйте, для начала, закомментировать в amk.script строчки 2717-2721, вот так: -- if (obj) then-- if (news_main and news_main.on_spawn) then-- news_main.on_spawn(obj)-- end-- end поскольку "официальные патчи" пекутся как пирожки - может быть на пару строк выше/ниже. Ищите по содержанию строк, а номера - для ориентировки. Изменено 25 Мая 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 25 Мая 2014 обещанный разбор скрипта тайников коллекционера. Пока делал - плакал. -- тайники Коллекционера -- табличка с координатами тайников local treasures = { -- 1. Кордон в районе туннеля { { position = { x = 351.42105102539, y = 25.915525436401, z = -25.715570449829 }, gv=140, lv=589567 } }, -- А в табличке - еще таблички. Как говорится, "чудны дела твои" -- Начинаем рабор с внутренних скобок: -- position = { x = 351.42105102539, y = 25.915525436401, z = -25.715570449829 } -- нормальные люди делают это так: -- vector( 351.42105102539, 25.915525436401, -25.715570449829 ) -- позиция относительно центра локации, -- А то, как здесь сделано - потом получается лишний код. Ну да ладно -- { position = { ... }, gv=140, lv=589567 } -- последние две цифры - номера специальных точек -- по которым задается рельеф, движутся неписи, спавнятся арты с аномалиями, и т.д -- все это можно получить, например, камерой -- нормальные люди делают так: -- { vector( 351.42105102539, 25.915525436401, -25.715570449829 ), 589567, 140 } -- и все это завернуто еще в одну табличку, по тому что кому-то было нечем заняться, -- да еще и неправильно. -- итого, для кордона имеем: -- 1. Кордон в районе туннеля { { position = {x=351.42105102539,y=25.915525436401,z=-25.715570449829},gv=140,lv=589567 } }, -- 2. Кордон старые места { { position = {x=-86.377746582031,y=-20.526966094971,z=-454.19583129883},gv=12,lv=179174 }, { position = {x=-6.803,y=20.882,z=158.032},gv=178,lv=291633 }, { position = {x=201.683,y=4.038,z=311.107},gv=238,lv=500329 }, }, -- 3. Кордон под мостом { { position = {x=75.152351379395,y=18.72999382019,z=157.18818664551},gv=97,lv=385576 } }, -- 4. Кордон новые места { { position ={x=105.57409667969,y=0.39715605974197,z=-4.5521864891052},gv=117,lv=412179 }, { position ={x=97.615481567383,y=-2.4717562198639,z=-14.601226806641},gv=114,lv=399528 }, { position ={x=124.39332000732,y=-1.2003121376038,z=-16.679014968872},gv=133,lv=428248 }, { position ={x=117.9259185791,y=5.960319519043,z=26.719091415405},gv=136,lv=421242 }, { position ={x=-235.02212646484,y=1.8344835758209,z=13.847160148621},gv=67,lv=20235 }, { position ={x=-215.4833190918,y=-19.035177078247,z=-129.12698364258},gv=62,lv=37929 } }, -- дальше одной кучей идет свалка и т.д. } -- и наконец это закончилось -- при получении записки в инвентарь спавним тайник -- вызывается из function actor_binder:on_item_take(obj) на взятие каждого предмета. -- ну, да, все в том же самом стиле: на каждый чих вызовем 150000 скриптов, и потом скажем, что кто -- не покупает каждый месяц новый компьютер - тот лох, а то, что оно будет глючить и тормозить на чем -- угодно - тем больше возможностей назвать пользователей лохами. Прятно же... -- Ладно, Архара - не скриптер ни разу, а конфигурист. Как умел - так и делал. -- Но здесь типа "все глюки вычищены и все оптимизировано". function on_item_take( obj ) if obj:section() == "val_zapis_1" -- проверяем, что получена ПЕРВАЯ записка. -- да, при каждом взятии любого предмета and not has_alife_info( "coll_tele1_on" ) then -- и еще какая-то неведомая фигня, -- похожая на очередной "античит" spawn_next( 1 ) -- создается первый тайник end end -- (вызывается кроме из функции выше еще и из actor_binder:take_item_from_box(box, item) -- то бишь при попытке взятия предметов из рюкзаков, ящиков и прочего function spawn_next( n ) -- создается тайник n -- удаляем старую записку amk.remove_item( db.actor:object( "val_zapis_" .. tostring( n - 1 ) ) ) -- очередная "оптимизация": 100500 записок типа val_zapis_1, ... val_zapis_100500 -- особенно доставило удаление val_zapis_ .. 1 - 1, ага. А такая есть вообще ? if n <= #treasures then -- сравниваем с количеством строк в treasures, зачем - неизвестно. -- видимо, для вящей "оптимизации" -- выбираем где спавнить local a = treasures[n] -- выбор из treasures таблицы n -- помним, там были таблицы, в них таблицы, а в них еще таблицы ? -- то есть, если, например, n == 2, выберется вот это: -- 2. Кордон старые места -- { -- { position = {x=-86.377746582031,y=-20.526966094971,z=-454.19583129883},gv=12,lv=179174 }, -- { position = {x=-6.803,y=20.882,z=158.032},gv=178,lv=291633 }, -- { position = {x=201.683,y=4.038,z=311.107},gv=238,lv=500329 }, -- } local b = a[math.random(#a)] -- теперь случайно выбирается одна из, типа -- { position = {x=-6.803,y=20.882,z=158.032},gv=178,lv=291633 }, -- с координатами тайника -- и создается собственно тайник. Скажем, val_taynik_ .. 2 -- один из тех 100500, прописанных где-то в gamedata\config\creatures\spawn_sections.ltx -- а содержимое в gamedata\config\scripts\что-то_там, см. в spawn_sections.ltx -- мда, кто-то все еще удивляется лагам при спавне (включая неписей и монстров ? -- alife():create("val_taynik_"..n, vector():set(b.position.x,b.position.y,b.position.z), b.lv, b.gv) -- строку закомментировал, поскольку здесь имеет сразу добавить отображение меток тайников: local s = "val_taynik_"..n local obj = alife():create( s, vector():set( b.position.x, b.position.y, b.position.z ), b.lv, b.gv ) level.map_add_object_spot_ser( obj.id, "treasure", s ) -- вот так -- Телепорт вместо увеличенного прыжка для тайника на Кордоне и другие дополнения -- Я уже говорил, что это гениально ? Ну так повторюсь: Гениально. Сначала уменьшаем -- прыжок, чтобы мерзкие читеры не могли ни куда запрыгнуть и ни от куда выпрыгнуть, -- пихаем куда попало тормозные и глючные античиты, а потом, чтобы добраться до рюкзака -- городится феерическая хрень с созданием телепорта. if n == 1 then -- если создан 1-й тайник if not has_alife_info( "coll_tele1_on" ) then -- и нет инфы об это -- создается телепорт (ПРЕВЕД "ОПТИМИЗАЦИИ" КОНФИГОВ !!!) local se_obj = alife():create("val_teleport_1",vector():set(346.98187255859,18.106950759888,-15.256704330444),587878,2) -- забиваем нетпакеи актора id очередного бредового телепорта xr_logic.pstor_store(db.actor, "val_teleport_1", se_obj.id) -- даем инфо, чтобы при получении каждого ! предмета не создавался еще -- еще один тайник и еще один телепорт. Плакаль. db.actor:give_info_portion("coll_tele1_on") end elseif n == 2 then -- при создании 2-го тайника все еще страньше if has_alife_info("coll_tele1_on") then -- если есть инфо, выданное при создании 1-го local obj_id = xr_logic.pstor_retrieve(db.actor, "val_teleport_1", -1, true) -- достали id телепорта, а если id не досталось - будет -1 local se_obj = alife():object( obj_id ) -- получаем телепорт, если это был он -- а если не он, то будет смешно if se_obj then -- удаляем какой-то объект, если был получен -- и надеемся, что это таки телепорт alife():release(se_obj, true) end db.actor:disable_info_portion("coll_tele1_on") -- а здесь удалили info, чтобы если опять будет получена записка 1 -- начать все сначала. -- при этом, что показательно, id удаленного телепорта в нетпакете так -- и осталось end elseif n == 16 and b == 2 then -- создается какая-то канистра в 16-ом задании -- если выпал второй вариант расположения тайника. Опять плакаль. alife():create("amk_kanistra",vector():set(39.229396820068,-0.0083452463150024,150.32916259766),67621,1308) elseif n==54 then -- и еще какая-то неведомая хрень происходит, если тайник - 54-й valerich_dialog.spawn_tel() end else -- а это - если в treasures искомой строки нет valerich_dialog.release_tel() -- последняя записка с холмов Радара - удаляем телепорты meceniy_in_hell.effects() -- и запускаются какие-то загадочные спецэффекты meceniy_in_hell.horror_sound() spawn_coll() db.actor:give_info_portion("coll_end") end end function spawn_coll() -- собственно, аццкий спецэффект local zombi_skeletons={ "physics\\dead_body\\skelet_combine_pose_03", "physics\\dead_body\\skelet_combine_pose_04", "physics\\dead_body\\skelet_combine_pose_05" } amk_particle.amk_particle({ particle="amk\\zomb_explode", pos=db.actor:position() }) local skel = amk.spawn_item("breakable_object",db.actor:position(),db.actor:game_vertex_id(),db.actor:level_vertex_id()) local t = amk.get_breakable_data(skel) t.visual = zombi_skeletons[math.random(#zombi_skeletons)] t.mass = 1.0 t.physic_type = 3 t.skeleton_flags = 1 amk.set_breakable_data(t,skel) end 2 6 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 26 Мая 2014 С взрывающимся рюкзаком Калмыка давайте попробуем для начала самое простое: Некрасиво, зато универсально. braad_test.script: function mina_band(obj) строка 614: sim:release(sim:object(obj:id())) делаем вот так: --sim:release(sim:object(obj:id())) -- закомментиовано, чтоб не вылетало level.hide_indicators() -- тоже чтоб не вылетало level.add_pp_effector( "agr_u_fade.ppe", 8120802, false ) -- чтоб красивее было function kalmyak_tele( actor, npc) строка 714: db.actor:give_info_portion("kalmyak_vstreca_start") после нее вставляем: level.show_indicators() -- возврат на место ПДА и прочего худа. Надо тестить, по тому как полная нормальная правка - три функции собственно сценария, переделанный таймерный скрипит + правки в _g и bind_stalker. Переносить ВСЕ это в оп2, чтоб через неделю переделывать под очередной "патч" - гм... 2 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 26 Мая 2014 Со звуками печально все. За подробностями см. http://www.amk-team.ru/forum/index.php?showtopic=8830&p=794407 и плюс-минус 2 страницы вокруг. Да, предупреждаю сразу: кроме как в чистую соль это адаптировать не получится. Ну и последние исправления будут еще нужны. Если коротко - звуки загружаются в неписей. В каждого. При входе в онлайн. В соответствии с конфигом. Отсюда на некоторых - изрядные лаги. Если убрать ненужные (тупо снеся по подкаталогам), и начальная загрузка резко ускорится, и лаги уйдут. Кроме того, поскольку при загрузке идет кэширование - хорошей идеей будет убрать дубликаты, используя исправленный скрипт, и переписав конфиги. Но работа - адова. Долгая, нудная, и неблагодарная. Плюс еще есть куча просто откровенного мусора, которая грузится всем подряд, при том, что нужна одному единственному персонажу на одной единственной локации. Опять же лечится тотальным переписыванием конфигов по результату прослушивания ушами. Такая вот фигня. 8( P.S. gamedata\sounds\taler - скорее всего, можно оставить один. И тот заткнуть заглушкой. P.P.S: вот это конкретно для чистой соли, где звук уже более-менее отлажен. http://www.amk-team.ru/forum/index.php?showtopic=8830&p=795433 Да, но трупов у костров не должно быть, иначе неписи повиснут. В принципе, эту схему вообще там нужно отключить, поскольку в wather_act ей место, куда она уже со всеми исправленными опечатками и переезжает последние пару-тройку месяцев. Пойдет ли на оп2 (с отключенным тасканием трупов) - зависит от того, что там со звуками делали. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 27 Мая 2014 Параметр типа "Здоровье = +100 %" движком не воспринимается ни как. Только если скриптово. Ну а что там могли скриптово намутить - вспоминаем недоброй памяти "рюкзачную радиацию" из чистой соли. Ну, или, хе-хе, "античиты" из собственно оп2. Работает как угодно, кроме как можно было бы ожидать. В основном - в зависимости от погоды на Юпитере и взаимного расположения Луны и Марса относительно созвездия Козерога. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 27 Мая 2014 Re: Параметр типа "Здоровье = +100 %" движком не воспринимается ни как. Воспринимается, хотя, как и голод, отвратно и странно, Не помню у движка двуязычности. Хотя издатель по России и 1C, но это не 1С-бухгалтерия. База - в попугаях. Проценты чего-то от процентов чего попало. По огнестрелу - там надо кучу всего умножать на кучу другого несколькими разными способами, а потом брать лучшее. Есть подозрение, что оригинальные цифры тупо подбирались. (но мы его отметем как неорганизованное © ). Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 27 Мая 2014 Хе-хе, ну, конкурс среди нуждающихся в услугах переводчика с их родного индийского диалекта парсельтонга на человеческий - мы устраивать не будем. А то много кто внезапно для себя проиграет, и расстроится. Чарли Чаплин в свое время по этой причине отказался участвовать в конкурсе на лучшего Чарли Чаплина. По убивствам - я бы на самом деле сначала в конфигах регенерацию неписей копнул. Это в свое время как раз Архара придумал: терминаторов, восстанавливающих здоровье от околонуля до полного меньше чем за секунду. голова-торс-конечности - это 2 файла. 1 - config\creatures\* - там откомментировано, только называется bones второй - иммунитеты брони, тоже по костям - для актора. А сами рассчеты - не, подбирать под предпочитаемую погоду. Аффторы оригинала делали курсовые, ага. По всяким конечным автоматам, графическим алгоритмам и прочему. Что может наворотить в курсовой голодный студент - ну, все представляют. ("главный вал из картона, по тому что до этого места все равно ни кто читать не будет" - это еще цветочки). Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 27 Мая 2014 подскажите пожалуйста как убавить процент попадания врага из оружия по мне?поскольку здесь все-таки не совсем стол заказов, а сделай сам, придется делать самому. А как - сейчас поясню: Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 27 Мая 2014 Ваши правки и разнообразное "народное творчество." Хотелось бы видеть преимущественно куски кода/конфигов/и прочего с подробным разбором: что это, зачем, что здесь не так, почему, и как исправить. Перед тем, как задавать вопрос, читаем ПЕРВЫЙ ПОСТ в теме, и вообще саму тему. Также настоятельно рекомендуется: Как, Где, и Что - Шпаргалка АМК 1. https://yadi.sk/d/GcZ4wqkugYgtx 2. https://www.sendspace.com/file/jd4r4f 3. http://rusfolder.com/13002611 Ссылка на пост Ссылка на файл Ковыряем ОП-2.rtf Как называется и где найти - поиск в файлах игры или мода Не работает оружие с автозахватом (установлен репак от Lus'a) - заменить папку bin на эту: ссылка Упорный постинг в тему "дайте мне" и "сделайте мне", не удосужившись прочитать хотя-бы первый пост, и напрочь игнорируя поиск - явлется флудом, и оценивается соответственно (2.1.1 правил). 12 9 2 8 22 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 28 Мая 2014 стесняюсь спросить Стесняюсь ответить. В общем, авторы не осилили сделать что-то типа такого: local string_match = string.match function log( ... ) _util.log( "ui_amk_options", ... ) end local t_opt = { ["p"] = { "game_pause", "radio_amk_pause", 1 }, ["r"] = { "show_rad", "radio_amk_rad", 1, bind_stalker.rdet_enable }, ["h"] = { "suit_hud", "radio_amk_hud", 0 }, ["m"] = { "din_music", "radio_amk_mus", 0 }, ["a"] = { "keep_anoms", "radio_amk_anoms", 0 }, ["d"] = { "ch_difficulty", nil, 0 }, ["t"] = { "treasure_type", "radio_amk_treasure", 2 } } function save_options() local fs = getFS() local flist = fs:file_list_open_ex("$game_saves$", bit_or(FS.FS_ListFiles, FS.FS_RootOnly), "game_options_*.sta" ) local s = flist:GetAt( 0 ):NameFull() local opt = "" local n, fn for k, v in pairs( t_opt ) do n = v[3] if n == 0 then game_options[ v[1] ] = false fn = v[4] if fn then fn( false ) end else game_options[ v[1] ] = n fn = v[4] if fn then fn( n ) end end opt = opt .. k .. tostring( n ) end n = "game_options_" .. opt .. ".sta" if s ~= n then fs:file_rename( fs:update_path("$game_saves$", s ), fs:update_path("$game_saves$", n ), true) end end class "amk_options" ( CUIScriptWnd ) function amk_options:__init( owner ) super() log( "info", "amk_options, owner: %s", ( owner and "true" ) or "nil" ) self.owner = owner self:InitControls() self:InitCallBacks() end function amk_options:__finalize() end function amk_options:InitControls() self:Init( 0, 0, 1024, 768 ) local xml = CScriptXmlInit() xml:ParseFile( "ui_amk_options_wnd.xml" ) xml:InitStatic( "background", self ) self.form = xml:InitStatic( "form", self ) xml:InitStatic( "form:caption", self.form ) xml:InitStatic( "form:picture", self.form ) xml:InitStatic( "form:info_pic", self.form ) ctrl = xml:Init3tButton( "form:btn_quit", self.form ) self:Register( ctrl, "btn_quit" ) for k, v in pairs( t_opt ) do if v[2] then local b = xml:InitTab( ( "form:" .. v[2] ), self.form ) self:Register( b, v[2] ) self[ v[2] ] = b b:SetNewActiveTab( v[3] ) end end self:Register( xml:Init3tButton( "form:btn_okay", self.form ), "btn_okay" ) end function amk_options:InitCallBacks() self:AddCallback( "btn_quit", ui_events.BUTTON_CLICKED, self.on_quit, self ) self:AddCallback( "btn_okay", ui_events.BUTTON_CLICKED, self.on_okay, self ) end function amk_options:on_quit() if self.owner then self:GetHolder():start_stop_menu( self.owner, true ) end self:GetHolder():start_stop_menu( self, true ) if level.present() and actor and actor:alive() then get_console():execute( "main_menu off" ) end end function amk_options:on_okay() for k, v in pairs( t_opt ) do log( "info", "on_okay, %s: %s", k, tostring( v[2] ) ) if v[2] then v[3] = self:GetTabControl( v[2] ):GetActiveIndex() end end save_options() self:on_quit() end function amk_options:OnKeyboard( dik, key_action ) CUIScriptWnd.OnKeyboard( self, dik, key_action ) if key_action == ui_events.WINDOW_KEY_PRESSED then -- на выход повесим Esc if dik == DIK_keys.DIK_ESCAPE then self:on_quit() end if dik == DIK_keys.DIK_RETURN then self:on_okay() end end return true end function init() local fs = getFS() local flist = fs:file_list_open_ex("$game_saves$", bit_or(FS.FS_ListFiles, FS.FS_RootOnly), "game_options_*.sta" ) local f_cnt = flist:Size() local s, n local opt = "" if f_cnt ~= 0 then s = flist:GetAt( 0 ):NameFull() log( "info", "init, file exist" ) for k, v in pairs( t_opt ) do n = string_match( s, ( k .. "([%d]+)" ) ) log( "info", "init, %s: %s", k, tostring( n ) ) if n then n = n + 0 if n ~= 0 then game_options[ v[1] ] = n log( "info", "init, set %s: %s", v[1], n ) else game_options[ v[1] ], v[3] = false, 0 log( "info", "init, set %s: false", v[1] ) end v[3] = n + 0 else game_options[ v[1] ], v[3] = false, 0 log( "info", "init, set %s: false", v[1] ) end end return true end log( "info", "init, new file" ) for k, v in pairs( t_opt ) do n = game_options[ v[1] ] if n then if n == true then n = 1 end v[3] = n log( "info", "init, %s: %s", v[1], n ) elseif n == false then n, v[3] = 0, 0 log( "info", "init, keep %s: false", v[1] ) else n = v[3] if n ~= 0 then game_options[ v[1] ] = n log( "info", "init, set %s: %s", v[1], n ) else game_options[ v[1] ] = false log( "info", "init, set %s: false", v[1] ) end end opt = opt .. k .. tostring( n ) end local f1 = fs:update_path("$game_config$", "narod_opt.ltx" ) local f2 = fs:update_path("$game_saves$", "game_options_" .. opt .. ".sta" ) fs:file_copy( f1, f2 ) return true end и решили размножить первое, что под руку попало. Впрочем, поскольку содержимое все равно не влияет, спасибо что какой-нибудь gamedata.db0 не расплодили. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 29 Мая 2014 Параметры: trg_pos - вектор, позиция цели, объект или точка пространстваmin_dist - минимальная дистанция до объекта, чтобы фото считалось удачнымmax_dist - максимальная дистанция до объекта, чтобы фото считалось удачнымmax_angle - максимальный угол отклонения позиции цели от направления взгляда на max_dist, в градусах, чтобы фото считалось удачнымuse_scope - использовать ли прицел при съемкеtrg_loc - если задано - только на данной локации. Обязано быть одним из значений, возвращаемых функцией level.name()actor_danger - проверять ли данжер ГГ. Если true, то фото засчитывается только если ГГ не видят врагиЕсли не задано - объект может быть на любой локации]]function foto_binder:obj_in_shot(trg_pos, min_dist, max_dist, max_angle, use_scope, trg_loc, actor_danger)-- эффективный угол в пересчете на дистанцию в радианахlocal disp = math.sin(math.rad(max_angle))*max_dist -- дисперсияВ общем, "как обычно". Попытка посмотреть, как можно довести до самоубийства kostya_dialog.script:"-- Вниманию оптимизаторов: в разделе docs ничего не оптимизировать! Даже не трогать порядок выполнения команд! Из-за использования disable в поршнях и некоторых глюков из-за параллельного выполнения процессов в движке не все работает так, как кажется на первый взгляд. Поэтому ничего здесь не трогайте."Мда. После этого, + кучи this. + совершенно фееричногоfunc_by_string["fli_teleport_actor"] = function (params_string)kostya_dialog.create_teleport(params_string, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertexу_id()) endв amk - желание пропало. Так что зря отдельные несознательные личности выражались про "фигня этот античит". Не фигня, а круто: достаточно мельком глянуть, и все желание "читерить" сразу отбивает. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 30 Мая 2014 (изменено) Увеличил выпадение денег с нпс, теперь от 1000 до 10000.Конкретно за эту правку какой файл отвечает? lootmoney.script, он там один. if npc_rank ~= nil then if npc_rank == "novice" and deadmoney >=150 then deadmoney=math.random(100,1050) elseif npc_rank == "experienced" and deadmoney >=300 then deadmoney=math.random(1510,3079) elseif npc_rank == "veteran" and deadmoney >=450 then deadmoney=math.random(3800,6530) elseif npc_rank == "master" and deadmoney >=600 then deadmoney=math.random(6540,10000) end end Первая и последняя строчки - как обычно: "чтобы было". Посмотрел lootmoney.script внимательнее. Не, так не пойдет. Вот как-то так: (lua под рукой нет, будете делать - проверяйте) function lootmoney( npc ) local m if npc and npc:character_community() ~= "arena_enemy" then -- убрал лишние проверки m = npc:money() or 0 if m ~= 0 then npc:give_money( -m ) end -- чистим деньги у непися else return -- откуда-то прилетел глючный вызов. Интересно, откуда ? Ничего не делаем. end if monnoroch_options.money_real == 1 then -- зачем-то перевернули смысл опции -- должно быть 0 - тогда тогда деньги берутся отсюда, 1 - отдается сколько -- было у непися. Ну да ладно... local npc_rank = ranks.get_obj_rank_name( npc ) -- уровень непися -- здесь был полный глюкодром. Переделал все. if npc_rank == "experienced" then m = math.random( 1510, 3079 ) elseif npc_rank == "veteran" then m = math.random( 3800, 6530 ) elseif npc_rank == "master" then m = math.random( 6540, 10000 ) else m = math.random( 100, 1050 ) -- для непися-новичка end end -- формируем и выводим сообщение local s = "%c[255,255,0,0]Мёртвый сталкер:%c[default]" .. npc:character_name() .. "\\n%c[255,255,0,0]Обнаружено денег на счёте:%c[default]" .. m .. "руб." db.actor:give_game_news( s, "ui\\ui_iconsTotal", Frect():set( 0, 0, 83, 47 ), 1, 4000 ) db.actor:give_money( m ) -- даем денег актору game_stats.money_quest_update( m ) -- останки "рангового" мода if ui_mm_opt_main.GetOption( "autograb_body" ) then -- автообыск трупа start_transfer_all_desired( npc ) end end Изменено 17 Февраля 2016 пользователем Dennis_Chikin 1 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 1 Июня 2014 Погодное: туман действительно весьма сильно жрет.Кроме того, что, да, ничего не видно, а сами неписи настроены так, чтобы туман полностью игнорировать.в config\weathers\* во всех фалах, где есть строчкиfog_density =- меняем значения на 0.01Особенно актуально для отключения слайд-шоу в X16.Картинка, правда, будет не очень, поскольку вылезут глюки с настройками цвета и т.д.far_plane = - дальность отрисовки - вообще не трогаем, либо не уменьшаем ниже 280, иначе полезут глюки с отрисовкой рельефа (глючные карты: болото, АТП, бар, ЧАЭС) 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 1 Июня 2014 (изменено) Вот скрипт откомментированный. Опять плакал. local weight_normal = 90 local weight_max = 0 local items_dropped_max = 10 local kolco = {from = 0.5, to = 1.5} local visota = {from = 0.5, to = 1.5} local sim local actor local weight_rukzak local weight_item local ini local items = {} local items_dropped = {} local slot0_id, slot1_id, slot2_id -- предмет в слотах игнорируется, но вес его учитывается local slot6_id -- одетый бронежилет игнорируется, но вес его учитывается function do_vbr() -- выбрасывание предметов, удалить все нафиг, оставив саму функцию -- и последний end sim = alife() actor = db.actor weight_max = weight_normal+add_weight() -- 90 кг. (см. выше + погода на марсе) if weight_max > 350 then weight_max = 350 end -- максимальное значение веса if sim and actor then -- проверка ни о чем вообще, по тому как в любом случае вылетит раньше calc_inventory_weight() -- делается странное -- get_console():execute("load ~~~ вес всего, что на и у ГГ: "..weight_rukzak.." от "..weight_max) -- сравнивается громкость чихания тушкана на ЧАЭС с погодой на марсе if weight_rukzak > weight_max then -- выбрасываем предметы рандомно local items_count = #items local iterations = 0 local items_dropped_count = 0 local i db.actor:give_info_portion("biznes_remove_special_item") while weight_rukzak > weight_max and iterations < items_count and items_dropped_count < items_dropped_max do i = math.random(items_count) -- случайный предмет if not items_dropped[i] then -- если он еще не был выброшен items_dropped[i] = true items_dropped_count = items_dropped_count + 1 actor:drop_item_and_teleport(items[i][1], actor:position():add(calc_vector_add())) weight_rukzak = weight_rukzak - items[i][2] iterations = iterations + 1 end end db.actor:disable_info_portion("biznes_remove_special_item") news_manager.send_tip(db.actor, "Из-за перегруза порвался рюкзак.", nil, "nano", 30000) end end end function calc_inventory_weight() -- делается странное, удалить до последнего end items = {} items_dropped = {} weight_rukzak = 0 ini = system_ini() -- сохраняются id предметов в слотах slot0_id = (db.actor:item_in_slot(0) and db.actor:item_in_slot(0):id()) or -1 slot1_id = (db.actor:item_in_slot(1) and db.actor:item_in_slot(1):id()) or -1 slot2_id = (db.actor:item_in_slot(2) and db.actor:item_in_slot(2):id()) or -1 slot6_id = (db.actor:item_in_slot(6) and db.actor:item_in_slot(6):id()) or -1 db.actor:inventory_for_each(process_calc) -- перебираются предметы в инвентаре, -- медленно и печально. Кстати, функция работает на самом деле странно, и ни кто не знает -- что она делает на самом деле. end function process_calc( item, npc ) -- перебор предметов в инвентаре, можно удалять. if item then local section = item:section() if section ~= "arc_ballast" -- очередная дурная проверка. все, что могло -- повиснуть и вылететь - уже повисло и вылетело. and ini:section_exist(section) and ini:line_exist(section, "inv_weight") then weight_item = ini:r_float(section, "inv_weight") --get_console():execute("load ~~~ в рюкзаке: "..section.." весом: "..weight_item) if weight_item > 0 then local item_id = item:id() -- игнорируем предмет в слотах, на поясе, одетый бронежилет или "защищённый" предмет if slot0_id ~= item_id and slot1_id ~= item_id and slot2_id ~= item_id and slot6_id ~= item_id and not inventory.on_belt(section) and protected_items.actor_items_keep(section) == false then table.insert(items, {item, weight_item}) table.insert(items_dropped, false) end -- но вес его учитываем weight_rukzak = weight_rukzak + weight_item end end end end function calc_vector_add() -- как бы, случайный вектор. Не трогаем. local a = math.random() * 2 * math.pi local r = kolco.from + math.random() * math.abs(kolco.to - kolco.from) local x = math.cos(a) * r local z = math.sin(a) * r local y = visota.from + math.random() * math.abs(visota.to - visota.from) return vector():set(x, y, z) end function add_weight() -- вычисление погоды на марсе, якобы связанное с надетым на ГГ костюмом -- не трогаем, по тому как мало ли где еще это случайное число требуется. local item = db.actor:item_in_slot(6) if not item then return 0 end local ini = system_ini() local section = item:section() if not (ini:section_exist(section) and ini:line_exist(section, "additional_inventory_weight")) then return 0 end local diff = level.get_game_difficulty() local cond = item:condition() return ini:r_float(section, "additional_inventory_weight")*(cond+(1-cond)*(3-diff)/3) end function vbr() -- выбрасывание предметов в случайные промежуки времени if db.vbr > time_global() or -- классическая ошибка: люто, бешено, производим странные -- проверки в КАЖДОМ апдейте ! db.actor:is_talking() or -- а это - чтобы не вылетало, если копаемся has_alife_info("ui_car_body") or -- в тайнике, разговариваем или has_alife_info("actor_fly") or -- сработал телепорт has_alife_info("teleport_started") or db.no_cheat or not db.actor:alive() or (db.actor:active_slot() == 4 and device().fov < 60) then return end db.vbr = next_vbr() -- вычисляется как бы время следующего срабатывания, но -- см. комментарий первой строки do_vbr() -- выбросить случайный предмет -- итого, все сносим и вставляем строку db.vbr = time_global() + 120000 -- или db.vbr = time_global() + 300000 -- или еще больше. Без разницы. end function weight_ok() -- танцы с бубном. weight_max = weight_normal+add_weight() if weight_max > 350 then weight_max = 350 end calc_inventory_weight() return weight_rukzak <= weight_max -- снести все, и вставить return true end function next_vbr() -- как бы вычисление случайного времени. Можно оставить. return time_global()+300000+math.random(-60000,60000) end function vibros() end Не рвущийся рюкзак. Инструкция. Изменено 14 Июня 2015 пользователем Eugen81 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 1 Июня 2014 В оригинальном скрипте была ошибка. Я ее в свое время правил. Попала ли правка в оп2 - не смотрел. Если спавнится - слава слонопотаму. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 3 Июня 2014 В общем так: чтобы неписи не говорили одновременно, и не устраивали адские групповые коцерты типа "окуджава под аккомпанимент балалайки в сопровождениии милого августина на губной гармошке" - этим делом рулит xr_kamp.script. Если неписи приписаны к одной звуковой группе, или одному костру - соблюдается очередность. Если рядом две разных группы, или 2 лагеря - происходящее в одном не учитывается в другом. Группы задаются в логике, типа: [logic@esc_lager_kamp1] ; сидящие днём у костра active = kamp1@esc_lager [kamp1@esc_lager] center_point = camp_center path_walk = camp_center_task soundgroup = esc_lager meet = meet@lagerДа, а кривые комментарии в звуках приводят к тому, что либо неписи возбуждаются, и начинают воевать, либо к тому, что сам звук проигрывается странно. P.S. И по ходу еще ни кто так и не проверил, как формат звука влияет на тормоза с лагами. Вполне может быть такая же фигня, как с кривыми текстурами. 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 3 Июня 2014 Нет, это не шмон, а оттаскивание. Шмон - в wather_act. НИ не нужна, но менять там (в обоих) что-либо надо крайне аккуратно. Все на соплях и при помощи "какой-то матери" . 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 4 Июня 2014 Bricklayer, менять нужно файлы диалогов, откуда это вызывается. В akill.script максимум убрать строки 3482-3486, чтобы не мешало фиксам по "тихой/дикой/еще какой попало фотоохоте". поиск в config\gameplay по "ohota_wolf_have" и т.д. Ну вот конкретно по "foto_ohota_white_wolf". Только не в tasks_akill.xml, а где-то еще должно быть. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 4 Июня 2014 К пулестойкости - это именно проценты. Из рассчета, что 100% - полная имунность к повреждениям от пуль как ГГ, так и костюма. 0% - Костюм огребает от пули полностью, ГГ - в зависимости от защитных свойств костюма. Как бы, да, хит оружия * хит патрона ну и черт его знает, как оно зависит от, скажем, той же дальности. Про здоровье/выносливость - см. выше. Радиаций, на самом деле, 3 разных (2 оригинальные, имунность в процентах и выведение в +процентах к процентам + рюкзачная скриптовая). dc Heretic, нет, защита не плюсуется. 50% от артов + 50% от костюма - это не 100% защиты. Кроме того, защита костюмов именно от пулевых - это отдельный конфиг, с раскладкой по костям. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 663 Опубликовано 18 Июня 2014 romale, да там этих проверок столько "наоптимизировали"...Micha_Pulemiot, да, и так будет с каждым "патчем". Почему я сразу с самого начала и написал, что предпочтительно выкладывать описание, как и что изменяли, а не измененные файлы.Ну или наоборот, нужно смотреть, что там наменяли в "патчах", и переносить только реально нужное.Alfa2012, нарушаем ? Тема не для погадалок.Есть предположение - показываем код/конфиг/success story. А что касается "по памяти" - вообще идем в "справочник вылетов", и читаем. P.S. Всем: таки просьба не путать темы, и "где найти", "как пройти", "а мне не нравится" - постить в более соответствующую. Здесь и так уже ориентироваться сложно становится. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение