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

Ковыряем ОП-2


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

Ivan_USER,

function check_armor()
	local armor = db.actor:item_in_slot(6)
	local weapon = db.actor:item_in_slot(2)
	
	if db.actor:active_slot()==2 and weapon then
		local tmp
		if armor then tmp = armor:section()
		else tmp = "none"
		end

		if (not string_find(tmp, "exo")) and weapon:section()=="wpn_m_134" then 
			db.actor:drop_item(weapon)
			local tmpw = amk.spawn_item_in_inv("wpn_m_134")
			db.actor:transfer_item(weapon,db.actor)
			alife():release(tmpw)
              amk.send_tip(game.translate_string("wpn-m_134-no_exo_message"),"Minigun",0,8,"gen_info")
		end
	end

 

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


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

1. В каком файлике надо покопаться чтобы увеличить выпадение тайников с трупов?

2. В каком файлике надо покопаться чтобы увеличить выпадение брони с трупов?

treasure_manager.script:

function CTreasure:use(npc) и далее по тексту. Все откомментировано.

 

А по поводу "дайте мне", не удосужившись прочитать хотя-бы первый пост в теме - дальше пойдут модераториалы с занесением в историю.

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

Броники непосредственно в файле gamedata\scripts\death_manager.script

local data_by_community = { и т.д., смотри комментарии перед этой строкой.

 

При знаниях на уровне "у меня нет этих файлов" трогать крайне осторожно. Там и так чудес наверчено.

Изменено пользователем Eugen81
процитировал
  • Полезно 1

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


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

 

 

Может вопрос в другом: почему эта вероятность не работает..?

 

Это вероятность НЕ выпадения.

 

Ну и там еще дальше есть "античитовая строчка" - это чтобы совсем не наглели. ;)

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


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

Еще раз внезапно про фотоохоту (bind_fot.script):

 

if IAmAMonster[clsid] and db.actor:see(obj) then -- сначала смотрим тихую охоту

Вот так достаточно. Все остальное в ней - лишнее.

 

if (has_alife_info("silent_hunt_start") and not has_alife_info("silent_hunt_done")) and

(silent_hunt_monsters[clsid] and not has_alife_info("monster_stealth_"..silent_hunt_monsters[clsid])) and

self:obj_in_shot(obj:bone_position("bip01_head"), 0, 20, 3.0, true, nil, true )

 

первый параметр - что фотографировать. Можно заменить на obj:position(), кстати. Будет не голова, а центр (если не ошибаюсь).

Второй - минимальное расстояние.

Третий - максимальное расстояние.

Четвертый - угол в странном и загадочном представлении. Не градусы, и не радианы, а попугаи.

Пятый - прицел (правая мышекнопка). То есть, если вы его меняете, то и способ фотографирования меняется. Да еще, кстати, и угол предыдущий, возможно, требуется пересчитать. Это и есть ответ на вопрос "почему не работает".

Шестой - nil - любая локация. Иначе - только конкретная.

Последний - проверять, видит ли кто-то актора в это время, и не фотографировать.

 

Все остальные фотографирования ниже - по такому же принципу.

 

 

 

К вопросу об убивании ГГ за что попало и "чтобы было" - kostya_dialog.script:

 

function zonedocs_gg_kill()

db.actor:kill(db.actor)

end

Ну, вы поняли.

 

Про алкоголь - amk_alcohol.script:

 

function drink_vodka(obj) end

function drink_vodka_chunk() end

function update() end

Больше в нем вообще ничего не нужно. По по-хорошему еще и эти вызовы везде поотрывать.

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


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

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

Запрет бега - w_kuvalda.ltx: sprint_allowed = false.

Про усталость - kostya_dialog.script:

 

function kuv_hit(who)

if who and who:id() == db.actor:id() and db.actor:active_slot() == 0 and db.actor:item_in_slot(0) and db.actor:item_in_slot(0):section() == "wpn_kuvalda" then

db.actor.power = -level.get_game_difficulty()/10

end

end

 

Мда, Самый Гениальный Скриптер Всех Времен и Народов - все так же гениален.

Изменено пользователем Eugen81
процитировал
  • Нравится 1

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


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

romale, по алкоголю - если уж радикально, то точно так же грохнуть все вызовы, как и с кувалдой.

Если в предвидении очередных "патчей" - оставить в скрипте 3 ПУСТЫЕ функции.

 

про переходы - если уже создан - только удалить. Ну или, хе-хе, через нетпакет. Идем читать "справочник по функциям и классам".

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


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

частота респавна -

-- Обновление респавнера. В зависимости от настроек обновляется либо только в офлайне, либо и там и там.
function se_respawn:execute()
	if self.already_once_spawned==true then return end
	if self.idle_spawn_min == -1 then return end
	if self.respawn_time < game.get_game_time() then
		local idle_time = game.CTime()
		local now = game.get_game_time()
		if fast_respawn then idle_time:setHMSms( math.random( 10, 12 ), 0, 0, 0 ) -- частый респаун 
		else idle_time:setHMSms( math.random( 20, 24 ), 0, 0, 0 )	-- стандартный респаун
		end
		self.respawn_time = now + idle_time
		self:spawn()
	end
end

 

Мда... В общем, ( 10, 12 ) и ( 20, 24 ) - это часы.

Но срабатывает изменение ПОСЛЕ того, как отработало прошлое значение. То есть, если изменили настройки, и кого-то убили - появится этот кто-то через 10 часов от его первого появления (то есть, если начали игру с настройками частыми, и играли всего 9 часов - то вот почти сразу же, как убили), а только потом уже заработает так, как поставлено.

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

Впрочем, оно так и раньше было, но просто сами интервалы были больше.

  • Спасибо 1
  • Нравится 2
  • Полезно 1

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


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

Люди, вы офигели ! Все ж было уже. Часть даже в первом посте собрал.

Или просто издеваетесь ?

 

Вылет по lightning в swtc - описан в этом самом первом посте, для тех, кому совсем уж лень искать;

фонарь - в config\objects\light_night.ltx - с самого создания форума регулярно везде обсуждают-крутят туда-сюда;

неубиваемые неписи - тоже с какой-то там соли (ну найдите вы их в конфигах, и поправьте иммунитеты/регенерацию.

 

Убирание оружия тоже где-то код приводился -

function use_snd(obj)
    if obj and not has_alife_info("biznes_remove_special_item") and tSound[obj:section()] then
        amk.remove_timer("zvuki")
        db.eat = true
        if db.eat_snd and db.eat_snd:playing() then
            db.eat_snd:stop()
        end
        db.eat_snd = xr_sound.get_safe_sound_object(tSound[obj:section()])
        db.eat_snd:play_at_pos(db.actor, vector(), 0, sound_object.s2d)

        -- третья рука, прятание оружия при съедании. на новичке не убирается, далее по нарастающей
        local difficulty = level.get_game_difficulty()
        if difficulty > 0 then
            bind_stalker.hide_weapon()
            amk.start_timer("zvuki", difficulty*3, 0)
        else
            db.eat = nil
        end
    end
end

 

- оторвите там в нем кому что надо.

 

Действительно, что-ли, треть форума в r/o отправить ?

  • Нравится 1

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


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

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

 

Про вес еще раз, медленно и печально: если у актора в инвентаре один предмет весом хоть в 10 тонн - не будет ни каких проблем, кроме усталости при каждом шаге (задается в свойствах костюмов, используем поиск по форуму, ковырялки в ШМ). Если у него 10тысяч предметов, пусть бы даже весом в 0 - будет тормозить, глючить, и вылетать.

 

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

  • Согласен 1

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


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

Поиском по тексту на получение/сдачу квестов в (устало) gamedata\config\text\rus\

Потом собственно по фразам находим эти идиотские проверочные функции, и отрываем.

 

В принципе, еще можно по текстам смс попробовать, где аффторы обошлись без из{censored}ов вида "п" .. "е" .. "рва".. "я" .. "б" .. "укв" .. "а" .. " " .. "в эт" .. "ом сл" .. "ове", и сразу все оттуда и оторвать.

 

Да, результаты изысканий стоит сюда выкладывать.

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


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

bind_stalker.script:

function actor_binder:death_callback(victim, who)
-- все 4 строки ниже - нафиг.
    if victim:id() == db.actor:id() then
        difficulty_manager.deathStatCollect()
        archievements.on_actor_death(who)
    end
из netpacket_pda_binder.script, кстати, строку

difficulty_manager.deathStatChangeDifficulty() - тоже нафиг.

 

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

 

P.S. Да, этот менеджер в соли был. Вот только там "реализьмы" не было.

Изменено пользователем Eugen81
сделал красиво.

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


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

сибирякe,

одну вижу: elseif not drrr.weight_ok() then ..., и она счастливо получает свое true.

 

А где еще одна ?

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


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

 

 

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

Радикально - на найти в конфигах секцию этих бешеных газовых плит, и оторвать оттуда все добавки.

Оставить только [кровосос_извращенный]:кровосос_нормальный

 

Тормозить на чтении конфигов, конечно, все равно будет (оптимизаторы - такие оптимизаторы), но хоть бреда поубавится.

Изменено пользователем Eugen81
Добавил цитату.

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


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

Как бы для чего надо - понятно. Но идея с детектором - не очень хороша. Лучше банально менюшкой. Чит - он есть - чит. Кроме того, менюшкой, с однократным сканом - и нагрузки меньше.

 

Да, к вопросу о батарейках: либо через set_condition, либо биндер, и сохранять свой параметр. Ну или нетпакет.

Так, как в костюме - это кривизна неземная.

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


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

Про погоду, кратко:

Она скриптом меняется принудительно. Для осветления глобального надо либо править все конфиги, либо user.ltx

Поиск в помощь.

 

Потом может быть подробнее распишу.

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


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

Чтобы закрыть вопрос про радиацию на болоте раз и навсегда:

bind_stalker.script, убрать строчку marsh_radiation.update()

 

либо (менее выгодно, но проще в борьбе со следующими "патчами", "фиксами" и прочим): в самом marsh_radiation.script убрать все, и оставить строку:

function update() end

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


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

Если мы убираем тело функции, оставляя, как я предложил, само описание - достаточно только этого изменения, остальные файлы изменять не надо. Соответственно, всякие патчи/фиксы/другие правки, которые не затрагивают этот файл - можно использовать, что называется, не глядя.

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

 

Если мы убираем функцию полностью - нужно убрать все ее вызовы отовсюду. Если оставить хоть один - будет вылет.

 

Если убираем вызовы - функцию можно не трогать. Это просто мусор в файле, который ни на что не влияет.

Плюс такого решения: чуть меньше тормозит, но чтобы заметить эффект - нужна массовая чистка, не только этой конкретной хрени, но и всего остального в том же духе. Кроме того, тогда стоит еще убирать сразу и обрамление типа всяких if чего-то там ... вызов() end.

Недостаток - польза заметно меньше, чем затраченное время.

 

Пример: смотрите посты 2, 3, 4. Вот в этом примере достаточно убрать только сам вызов, но проверки, которые перед ним - достаточно сильно тормозят, и ошибка была (и есть) именно в них.

Поэтому лучше убрать несколько строк.

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

 

 

Про телепорты всем отвечу, как время будет.

 

config\misc\zone_teleport.ltx смотрите, строчки

idle_particles = что-попало

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


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

Разбор очередного скрипта, на этот раз meceniy_work.script в части, что касается костюма нудиста и убирания оружия:

 

-- Невидимость В Костюме
local idle_time, game_time, outfit_act, prev_outfit_act, time_to_set_range

-- local invisible = nil
-- local warning90 = nil
-- local gravisak = nil
-- три довольно бессмысленные строки. Записывается так:
local invisible, warning90, gravisak


function set_invisible()    -- включение невидимости
    outfit_act = db.actor:item_in_slot( 6 )
    -- проверяется наличие надетого костюма
    if outfit_act and outfit_act:section() == "meceniy_outfit_new" then
        if not invisible then    -- включается невидимость, если еще не включена
            invisible_on()
            invisible = true
            gravisak = nil
            time_to_set_range = time_global()

            -- похоже, 2 очередных "античита"
            fly_island.chaes_fail()
            kostya_dialog.stealth_fail_task()

        -- вывод предупреждения, если кончается время невидимости
        -- elseif game.get_game_time():diffSec( game_time ) >= idle_time*0.9 and not warning90 then
        --    give_warning90()
        --    warning90 = true

        -- отключение невидимости
        -- elseif game.get_game_time():diffSec( game_time ) >= idle_time then
        --    invisible_off()
        --    make_meceniy_outfit_used( outfit_act )
        --    invisible = nil

        -- Нормальные люди делают это так:
        elseif warning90 then
            -- проверка для вывода предупреждения
            if game.get_game_time():diffSec( game_time ) >= idle_time * 0.9 then
                give_warning90()
            end
        -- проверка для выключения
        elseif game.get_game_time():diffSec( game_time ) >= idle_time then
            invisible_off()    -- отключение невидимости
            -- make_meceniy_outfit_used( outfit_act )    -- порча костюма
            invisible = nil
        end    -- ну или убрать все это, чтобы работал бесконечно
        
        -- ослепление неписей (поправлю сразу)
        if time_to_set_range <= time_global() then
            set_range( 2 )
            time_to_set_range = time_global() + 1000
        end
            
    elseif invisible then    -- костюм снят
        invisible_off()    -- отключение невидимости
        -- внимание, если кто-то уйдет в офлайн раньше - останется слепым !
        -- make_meceniy_outfit_used( prev_outfit_act )    -- порча чего попало, или просто вылет
        invisible, idle_time, time_to_set_range = false, false, false    -- поправил графоманию
    end

    -- if outfit_act and string.find( outfit_act:section(), "soldier_outfit" ) then
    --    if not gravisak then
    --        bind_stalker.hide_weapon()
    --        gravisak = true
    --    end
    -- elseif gravisak then
    --    bind_stalker.restore_weapon()
    --    gravisak = nil
    -- end    -- здесь был бред про убирание оружия

    -- prev_outfit_act = outfit_act    -- а это бред с порчей костюма
end


function invisible_on()    -- включение невидимости

    -- даже исправлять не буду, по тому что проще проверки выше отключить, и навсегда о них забыть
    idle_time = 27 * 60            -- время невидимости
    game_time = game.get_game_time()    -- текущее время
    warning90 = false    -- убрать информацию о том, что было выведено предупреждение

    bind_stalker.hide_weapon()    -- убрать оружие
    level.add_pp_effector ("teleport.ppe", 1111, false)    -- спецэффекты
    level.set_pp_effector_factor(1111, 1.0)
end


function invisible_off()    -- выключение невидимости
    if get_hud():GetCustomStatic( "cs_inviz" ) then    -- убирает сообщение о невидимости
        get_hud():RemoveCustomStatic( "cs_inviz" )
    end
    warning90 = false    -- убирает информацию о выводе предупреждения

    bind_stalker.restore_weapon()    -- включает оружие
    set_range( 80 )    -- выставляет неписям "видеть актора и врагов на расстоянии 80 метров"
        -- к воопросу о бешеных неписях. В солянке ставилось 60, и из этого рассчета
        -- расставлялись собственно неписи.
end


function give_warning90()
    get_hud():AddCustomStatic( "cs_inviz", true ):wnd():SetText( "Вас могут увидеть!" )
end


function set_range( range )    -- принудительное выставление всему живому расстояния,
    -- на котором они всех видят
    -- переписал это медленнное и печальное глюкало сразу

    local cls_id
    local lobj_by_id = level.object_by_id    -- чтобы тормозило хоть чуток меньше
    for k, v in pairs( db.creatures ) do    -- в creatures живое добавляется
        v = lobj_by_id( k )    -- есть ли еще такой ?
        if v and v.alive then    -- и имеет ли смысл для него что-либо проверять ?
            cls_id = v:clsid()    -- класс объекта
            -- проверка, что непись или монстр, и он живой
            if ( IAmAStalker[cls_id] or IAmAMonster[cls_id] ) and v:alive() then
                v:set_range( range )
    end    end    end
end


function make_meceniy_outfit_used( outfit )    -- замена одного костюма на другой
    local parent = outfit:parent()
    local obj = alife():object( outfit:id() )    -- отсюда и далее переписал глюкало
    if obj then
        alife():release( obj, true )
        if parent then
            alife():create( "meceniy_outfit_used", vector(), 0, 0, parent:id() )
        else alife():create( "meceniy_outfit_used", vector(), 0, 0, 0 )
    end    end
end


function have_meceniy_outfit()    -- для диалогов: возвращается экза, если есть
    return db.actor:object( "meceniy_outfit_used" ) or db.actor:object( "meceniy_outfit_new" )
end


function give_meceniy_outfit()    -- для диалогов: удаляется экза
    if db.actor:object( "meceniy_outfit_used" ) then
        amk.remove_item_from_inventory_by_name( "meceniy_outfit_used", db.actor )
    elseif db.actor:object( "meceniy_outfit_new" ) then
        amk.remove_item_from_inventory_by_name( "meceniy_outfit_new", db.actor )
    else return
    end
    news_manager.relocate_item( db.actor, "out", "meceniy_outfit_new" )    -- новости: "потерян предмет"
end

 


Адаптации ни каких других вариантов невидимости делать не буду, потому что иначе полезет куча глюков из других мест, и пока их все выловишь - авторы еще 3 новых "патча" выпустят, а далее см. п1.
 
Но вообще нормальные люди делают это через xr_combat и mob_combat, как и всяческие "переодевания" и прочие "амулеты наемников/монолитов/чего попало".

 

Готовый вариант для 2.09-2 - https://yadi.sk/d/mU-QorGAmAiGK

shahvkit

Изменено пользователем shahvkit
Перевел код в луа, для читабельности комментов.
  • Спасибо 1
  • Нравится 2
  • Полезно 1

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


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

Это часть файла, касающаяся невидимости.

Там еще есть глючное зомбирование и какие-то телепорты (кстати, о птичках).

 

Античит, полагаю, следует оторвать.

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


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

По идее защита от пуль должна стать 25%, а становится 0%

Интересно, а еще у кого-нибудь такое есть ?

 

Ну, то есть, удаление артов в inventory.script - оно их с пояса убирает (кстати отрываем

в function update()убираем строчку check_immunities() ). А вот чтобы 0 было...

 

 

Кстати, к вопросу о том, как перевесить что-то с пояса и обратно: смотрим этот же скрипт, и делаем по аналогии с, да хоть "идолом монолита" и т.д.

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

Что-то меняете - меняйте в файле из той игры, для которой меняете.

 

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

А так - завтра другая сторона выпускает 10 "патчей" вообще ничего не меняя, потом один с одной измененной буковкой, потом еще 10 одинаковых. И вы будете каждый раз все это просматривать, и в каждом делать совершенно не нужную работу. Вам оно надо ? Так что оторвали в одном файле - работает - так и оставьте.

 

P.S. По поводу самого последнего патча и правкосборок - нет, xml'ы я тщательно просматривать тоже не буду. Проще протестировать, и поправить, ежели что не так. А на беглый взгляд - вроде, правильно все.

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

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


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

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