Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
ЧИТЕР - КЛУБ
VaiteriaДата: Сб, 01.10.2011, 23:22 | Сообщение # 1
Отмеченная Зоной
Пользователи
Сообщений: 1641
Награды: 20
Репутация: [ 3044 ]

Эта тема для тех, кто хочет своими силами внести в игру свой собственный интерес.
Играя в модификации к Сталкеру многие из Вас привыкали к определённому типу оружия, и каково было удивление, когда установив дополнение Вы обнаруживаете что Ваш любимый автомат наносит урона меньше чем обычная двухстволка))
Или критически не хватает денег в начале игры, или Альфовцы не дают выйти со Скадовска, а у Вас в руках всего лишь АК-74.


Спрашивайте, задавайте вопросы, предлагайте свои варианты!

Не забывайте указывать платформу игры и версию установленного мода (если установлен). Если написали пост, но не указали версию - Отредактируйте свой пост (кнопочка "редактировать" под Вашим постом)


Настройки ГГ:
[cut=Рюкзак и деньги ГГ при старте новой игры]Способ работает для ЧН\ЗП
Рюкзак ГГ хранится в файле gamedata\configs\gameplay\character_desc_general.xml
Первыми строчками идёт описание ГГ:
Код
<specific_character id="actor" no_random = "1">
                  <name>st_actor_name</name>
                  <icon>ui_inGame2_Hero</icon>
                  <map_icon x="2" y="5"></map_icon>
                  <team>Actor</team>
                  <supplies>
                   [spawn] \n
                   device_torch \n
                   wpn_binoc \n
                   wpn_knife \n
                   helm_respirator \n
                   stalker_outfit \n
                   grenade_rgd5 = 2 \n
                   wpn_fort_actor \n
                   ammo_9x18_fmj = 3 \n
                   wpn_ak74u \n
                   ammo_5.45x39_fmj = 3 \n
                   bandage = 2 \n
                   antirad = 1 \n
                   medkit = 2 \n
                   bread = 1 \n
                   kolbasa = 1 \n
                   conserva = 2 \n
                   detector_simple \n
                   detector_battery_1 \n
                  </supplies>
                  <money min="2500" max="2500" infinitive="0"/>
                  <class>actor</class>
                  <community>actor</community>
                  <rank>0</rank>
                  <reputation>0</reputation>
                  <visual>actors\stalker_hero\stalker_hero_1</visual>
</specific_character>

В списке supplies, после строчки [spawn] \n перечислены все предметы, которые будут у ГГ в начале игры. И в этот список можно добавить любой предмет, например добавим ГГ 12 GPS-Проводников и один ремкомплект (добавляем после последней строчки - detector_battery_1 \n):
Код
guidebook_mono = 12 \n
repair_arms_box \n

В SGM поставлена чистка инструментов при начале новой игры и если вы добавите их в список - в рюкзаке они не появятся, т.к. их почистит скрипт. Чтобы отключить чистку инструментов (Внимание: Если вы удалите эту строчку, то инструменты заспавнятся в двойном экземпляре!) необходимо удалить (или заккоментировать знаками --) строчку release_items_by_section("toolkit") в файле scripts\sgm_utils.script (для SGM < v2.2: scripts\sgm_info.script).
Cписок предметов на добавление можно взять из файла gamedata\configs\(Список обьектов).txt
Также здесь можно поправить кол-во денег у ГГ на начало игры. За это отвечает строчка:
Код
<money min="2500" max="2500" infinitive="0"/>

min, max - Минимальное и максимальное кол-во денег соответсвенно (деньги выдаются случайно, в промежутке от min до max)
infinitive - Сделать деньги бесконечными, 1\0 - Да\Нет соответсвенно.[/cut]
[cut=Изменение имени ГГ]Найдем аттрибут st_actor_name в файле configs\text\rus\st_characters.xml:
Код
<string id="st_actor_name">
              <text>Александр Дегтярев</text>
</string>

И меняем имя на необходимое.
В диалогах к ГГ будут обращаться по старому имени (Александр Дегтярев), поэтому лучше пройтись поиском по файлам и поискать еще упоминания старого имени.
Нужна Новая Игра![/cut]
[cut=Терминатор в Зоне (бессмертие)]Открываем файл configs\creatures\actor.ltx и правим в нем следующие интересные строчки:
Код
[actor_condition]
satiety_v = 0.0    ; Скорость уменьшения сытости со временем
radiation_v = 100   ; Скорость уменьшения радиации
satiety_power_v = 100  ; Увеличение силы при уменьшении сытости
satiety_health_v = 0.0001    ; Увеличение здоровья при уменьшении сытости
satiety_critical = 0.0  ; Критическое значения сытости (в процентах от 0-1) когда здоровье начианает уменьшаться
radiation_health_v = 0.0    ; Уменьшение здоровья при воздействии радиации
morale_v = 100    ; Скорость восстановления морали
psy_health_v = 100   ; Скорость восстановления psy-здоровья
alcohol_v = -100   ; Скорость вывода алкоголя из организма
health_hit_part = 0.0  ; Процент хита, уходящий на отнимание здоровья
power_hit_part = 0.0  ; Процент хита, уходящий на отнимание силы
max_power_leak_speed = 0.0    ; Накопление усталости (макс граница, до которой восстанавливается сила) в секунду игрового времени
bleeding_v = 0.0   ; Потеря крови при номинальной ране в секунду
wound_incarnation_v = 100    ; Скорость заживления раны
min_wound_size = 0.0002  ; Минимальный размер раны, после которого она считается зажившей
[/cut]
[cut=Спавн предмета в рюкзак ГГ]Открываем файл scripts\ui_main_menu.script
Для SGM:
Ищем:
Код
elseif db.actor~=nil and dik==DIK_keys.DIK_F5 then
              self:mod_options()

Добавляем ниже:
Код
elseif db.actor~=nil and dik==DIK_keys.DIK_F6 then
              give_object_to_actor("Предмет")


Для чистой игры (ТЧ\ЧН\ЗП) и модов на них (Универсальный способ):
Ищем:
Код
if dik == DIK_keys.DIK_Q then
              self:OnMessageQuitWin()

Добавляем ниже:
Код
elseif db.actor~=nil and dik==DIK_keys.DIK_F6 then
              alife():create("Предмет",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())


Все. В игре жмем ESC=>F6=>ESC и у нас в рюкзаке будет лежать предмет.
PS: "Предмет" - секция предмета, берем из файла configs\(список объектов).txt[/cut]

Надстройки и заплатки на SGM:
[cut=Изменение численности Альфы]Отряды Альфы:
Отряды Альфы хранятся в файле configs\misc\squad_descr_extended.ltx
Почти весь файл посвящен Альфовцам. К Альфе относятся все секции содержащие в себе слова alfa (например: pri_alfa_squad_2_master, zat_alfa_squad_1_novice). В секциях нас интересует только одна строчка параметра npc:
Код
npc = alfa_novice_commander,alfa_novice_specnaz1,alfa_novice_specnaz2,alfa_novice_sniper1,alfa_novice_sniper2,alfa_novice_shotgunner

Как видно из значений, в этом (zat_alfa_squad_1_novice) отряде 6 NPC: Командир, 2 Штурмовика, 2 Снайпера и 1 Шотганнер. Вы можете удалить ненужных NPC и добавить новых, но запомните, главное чтобы остался хотя бы 1 NPC в отряде, иначе будет вылет.
Настройки спавна Альфы:
Отряды Альфы спавнятся и перемещаются посредством smart_terrain. Параметры smart_terrain хранятся в файлах configs\scripts\\smart\_sim_.ltx
За кол-во отрядов на smart_terrain отвечает параметр max_population. Чтобы понизить (или повысить) кол-во отрядов Альфы на локации, необходимо уменьшить (или увеличить) значение параметра max_population (max_population должен быть больше 0). Но в этих файлах могут храниться настройки не только Альфы, поэтому вначале поищите в файле строчки содержащие alfa, а потом уже правьте.
Также в этих файлах есть строчки вида:
Код
spawn_num = {+opt_activate_alfa_force =check_actor_rank(200:350)} 1, 0

Которая непосредственно и производит спавн бойцов. В фигурных скобках хранятся условия для произведения спавна: +opt_activate_alfa_force проверка на то, что у нас разршен спавн Альфы в настройках, а =check_actor_rank(200:350) проверяет наш ранг ГГ (200 < Наш Ранг < 350); При выполнении условий, будет произведен спавн 1 отряда, а при не выполнении - не будет (0 отрядов).[/cut]
[cut=Перевооружаем Альфу]Бойцы Альфы описаны в файле configs\gameplay\character_desc_extended.xml
Файл с комментариями, Все Альфовцы в самом конце, после большого комментария, который сложно не заметить:
Код
<!------------------------------------------=============------------------------------------------------->
<!------------------------------------------'Отряд Альфа'------------------------------------------------->
<!------------------------------------------=============------------------------------------------------->

Их вооружение описывается в теге supplies, подобно рюкзаку ГГ. Так что, как править его смотрите в первом спойлере темы smile
Для примера снабдим штурмовика alfa_novice_specnaz1 автоматом LR-300 с напяленными прицелом и глушителем:
Первоначальная секция:
Код
<supplies>
              [spawn] \n
              device_torch \n
              wpn_lr300_m1 \n
              ammo_5.56x45_ss190 = 1 \n
              wpn_hpsa \n
              ammo_9x19_fmj = 1 \n
              grenade_rgd5 = 1 \n
              wpn_binoc = 1 \n
              #include "gameplay\character_items_4.xml"
              #include "gameplay\character_food.xml"
              #include "gameplay\character_drugs_3.xml"
</supplies>

Измененная:
Код
<supplies>
              [spawn] \n
              device_torch \n
              wpn_lr300 = 1, scope, silencer \n
              ammo_5.56x45_ss190 = 1 \n
              wpn_hpsa \n
              ammo_9x19_fmj = 1 \n
              grenade_rgd5 = 1 \n
              wpn_binoc = 1 \n
              #include "gameplay\character_items_4.xml"
              #include "gameplay\character_food.xml"
              #include "gameplay\character_drugs_3.xml"
</supplies>
[/cut]
[cut=Где изменить порог починки стволов и брони]У техников:
Параметр bad_cond (введен в мод дополнением от Енота) в файле configs\misc\engineer\stalkers_upgrade_info.ltx
В ремкомплектах:
В файле scripts\ui_mod_elements.script нужно поправить строчки вида:
Код
pistol_in_slot:condition()<0.7
rifle_in_slot:condition()<0.7
outfit_in_slot:condition()<0.7
helm_in_slot:condition()<0.7
[/cut]
[cut=Достижение на показ SGM тайников]В SGM есть достижение, которое отмечает новые SGM-тайники на миникарте, но 60 тайников "слишком много" для нашего счастья. Давайте исправим это недоразумение на 15.
Откроем файл scripts/ui_mod_pda.script и находим функцию achievements_pathfinder_update:
Код
function achievements_pathfinder_update()
                 local pre=read_mod_param("stat_taynikov")
                 if pre~=nil and pre>=60 and dont_has_alife_info("sgm_achievements_pathfinder") then
                  give_info("sgm_achievements_pathfinder")
                  inc_mod_param("stat_dostigeniy",1)
                  news_manager.send_tip(db.actor,"st_achievement_pathfinder_text",0,"sgm_achievement_pathfinder",10000,nil,"st_achievement_ti p _ t it l e " )           
                 end
end

В этой функции нам нужна только 1 строчка:
if pre~=nil and pre>=60 and dont_has_alife_info("sgm_achievements_pathfinder") then
Меняем 60 на 15 и сохраняем файл.
Для полноты картины следует поправить и описание, открываем файл configs\text\rus\SGM_personal_pda.xml и ищем в нем аттрибут st_achievements_need_pathfinder:
Код
<string id="st_achievements_need_pathfinder">
                 <text>Найденых SGM тайников - 60.</text>
</string>

Тут также правим 60 на 15 и сохраняемся.
Все, достижение отредактировано.
PS: Остальные SGM-достижения редактируются в этих-же файлах.[/cut]
[cut=Как прописать предметы в личный хабар?]Поднимаем флешку (например Назара), но не активируем ее, а сохраняемся и выходим из игры.
Находим секцию флешки в файле configs\misc\items\sgm_deserves.ltx
Код
[dv_rasvet_nazar_case]:deserve_flash,identity_immunities
$spawn    = "devices\rasvet_nazar_case"
inv_name   = st_rasvet_nazar_case_title
inv_name_short  = st_rasvet_nazar_case_title
description   = st_rasvet_nazar_case_descr
create_deserve_x    = 406.352
create_deserve_y    = 5.948
create_deserve_z    = -118.637
create_deserve_lv    = 1357309
create_deserve_gv    = 531
deserve_title  = st_rasvet_nazar_unpack_title
deserve_descr  = st_rasvet_nazar_unpack_descr
deserve_items  = wpn_sig550,ammo_dumdum,20,af_night_star,drug_engine,money_meshochek_1000_5000

И в последнюю строчку (deserve_items) добавляем то, что хотим. Писать в одну строчку, через запятую (в конце запятая не ставится).
Сохраняемся, заходим в игру и используем флешку.[/cut]
[cut=Бесконечные патроны]Открываем файл scripts\sgm_modules.script и дописываем в самый конец, после копирайта:
Код
function get_ammo_for_reload() -- Обработчик для xr_motivator.script
              if not db.actor then return nil end
              if db.actor <img src="/.s/sm/2/surprised.gif" border="0" align="absmiddle" alt="surprised" /> bject("ammo_5.45x39_fmj") == nil then
               create_ammo("ammo_5.45x39_fmj",db.actor <img src="/.s/sm/2/tongue.gif" border="0" align="absmiddle" alt="tongue" /> osition(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id(),30)
              end
end

Открываем файл scripts\xr_motivator.script и ищем в нем функцию motivator_binder:update, а уже в ней правим блок:
Код
if time_global() - self.last_update > 1000 then
sr_light.check_light(object)
sgm_modules.get_ammo_for_reload() -- Бесконечные патроны 5.45*39
self.last_update = time_global()
end

Мы добавили в этот блок строчку sgm_modules.get_ammo_for_reload(), которая и будет проверять наличие (точнее отсутствие) патронов 5.35*39 в нашем рюкзаке, и если она их не найдет - она их нам даст smile [/cut]
[cut=Если пропал НПС с квестовой взрывчаткой в Припяти]В файле scripts\ui_main_menu.script ищем:
Код
elseif db.actor~=nil and dik==DIK_keys.DIK_F5 then
              self:mod_options()

Добавляем ниже:
Код
elseif db.actor~=nil and dik==DIK_keys.DIK_F6 then
              give_info("pri_a19_lab_x8_investigated")
              give_info("pri_a22_scene_done")
              give_object_to_actor("pri_a25_explosive_charge_item")

В игре жмем Esc-F6-Esc и в рюкзаке взрывчатка и метка квеста на двери.[/cut]
[cut=Если Нужно выдать одну или несколько инфопорций]В файле scripts\ui_main_menu.script ищем:
Код
elseif db.actor~=nil and dik==DIK_keys.DIK_F5 then
              self:mod_options()

Добавляем ниже:
Код
elseif db.actor~=nil and dik==DIK_keys.DIK_F6 then
              give_info("Имя первой инфопорции")
        give_info("Имя второй инфопорции")...

В игре жмем Esc-F6-Esc.[/cut]
[cut=Настройки Мода (через файл mod_params.ltx)]Мод можно дополнительно настроить в файле configs\mod_parameters\mod_params.ltx
Хотя многих описанных ниже параметров в v2.2 не осталось, они все же используются модом, так что, вникаем

Цена за утилизованные предметы:
utilizator_cash_multiplier = 5 ; Множитель на стоимость переработанных утилизатором предметов. Чем больше значение, тем больше денег за переработку получит ГГ

Состояние брони снятой с трупа:
marauder_outfit_cond_from = 99 ; Минимальное состояние брони (99 wacko
marauder_outfit_cond_before = 100 ; Максимальное состояние брони (100 wacko . marauder_outfit_cond_before > marauder_outfit_cond_from

Грабёж ГГ во фриплее:
freeplay_robbery_actor = false ; (true (да) или false (нет)) - Грабить ли ГГ по наступлению фриплея

Респаун баз:
respawn_bases_permition = true ; (true (да) или false (нет)) - Производить ли респаун баз(вносимых модом),после их частичного разгрома

Детали для работы с механиками:
need_mechanic_details = true ; (true (да) или false (нет)) - Нужны ли детали для работы с механиками.

Отключаем принудиловку сна:
max_no_dream_time = 0 ; (Используется если параметр need_actor_dream равен true) - Через каждые max_no_dream_time часов, ГГ будет принудительно засыпать
need_actor_dream = false ; (true (да) или false (нет)) - Нужно ли ГГ спать как минимум раз в max_no_dream_time часов

Ранг ГГ:
headshot_rank_on_display = true ; (true (да) или false (нет)) - Отображать ли рядом со счетчиком ранга ГГ, счетчик хедшотов. Работает со включенной опцией мода "Вывести на HUD инф. о ранге"

Аномалии:
create_anomaly_permition = false ; (true (да) или false (нет)) - Спаунить ли новые аномалии, после начала новой игры. (Если изменить на false, аномалии мода исчезнут, даже если вы уже прошли половину игры). очень жрёт ресурсы, лучше отключить для слабых машин.

Мины:
create_mines_permition = true ; (true (да) или false (нет)) - Спаунить ли новые мины, после начала новой игры. (Изменять только до начала новой игры) очень жрёт ресурсы, лучше отключить для слабых машин.
mine_traps_radius = 2 ; - Дистанция между ГГ и миной, сокращая которую мина детонирует, можно уменьшить расстояние детонации мины до 2 метров.

Это на ваше усмотрение:
can_release_base_members = false ; (true (да) или false (нет)) - Убирать ли торговцев и телохранителей с базы, после её разгрома.

100% Выпадение частей мутантов:
Код
[booty_params]
boar_prob   = 1.0 ; Шанс выпадения части тела кабана.
bloodsucker_prob    = 1.0 ; Шанс выпадения части тела кровососа.
dog_prob   = 1.0 ; Шанс выпадения части тела слепого пса.
pseudodog_prob  = 1.0 ; Шанс выпадения части тела псевдо-собаки.
flesh_prob   = 1.0 ; Шанс выпадения части тела плоти.
chimera_prob  = 1.0 ; Шанс выпадения части тела химеры.
pseudo_gigant_prob    = 1.0 ; Шанс выпадения части тела псевдо-гиганта.
burer_prob   = 1.0 ; Шанс выпадения части тела бюрера.
controller_prob  = 1.0 ; Шанс выпадения части тела контроллера.
snork_prob   = 1.0 ; Шанс выпадения части тела снорка.
[/cut]

Мелочи:
[cut=Правки по оружию]Характеристики оружия хранятся в ltx-файлах папки \configs\weapons\
Наиболее интересные параметры:
visual - Внешний вид
cost - Цена (торговцы умножают её на некоторый коэффициент)
inv_weight - Вес
sprint_allowed - Возможность бега с этим оружием
ammo_mag_size - Размер магазина
ammo_class - Типы используемых патронов, перечисляем через запятую
grenade_launcher_status - Подствольный гранатомет (0 - нет; 1 - есть, несъемный; 2 - есть возможность установить)
grenade_class - Тип используемых подствольных гранат, перечисляем через запятую
silencer_status - Съемный глушитель (0 - нет; 1 - есть, несъемный; 2 - есть возможность установить)
scope_status - Съемный прицел (0 - нет; 1 - есть, несъемный; 2 - есть возможность установить)
zoom_enabled - Зум (приближение)
scope_zoom_factor - Величина зума
scope_texture - Текстура прицельной сетки
hit_power - Сила выстрела (менять все четыре значения, чем больше значение - тем больше убойность. Максимальная убойность у гаусса 4.0, можно и больше, но оно вам нужно biggrin )
silencer_hit_power - Убойность с глушителем
fire_distance - Максимальная дистанция для выстрела в метрах
cam_relax_speed - Скорость возврата в исходное положение после выстрела (чем меньше, тем быстрее можно прицелится после выстрела)
misfire_condition_k - Порог, после которого оружие может заклинивать (от 0 до 1, чем меньше, тем надежнее ствол)
condition_shot_dec - Увеличение износа при каждом выстреле (от 0 до 1, чем меньше, тем меньше изнашивается ствол)
fire_modes - Режимы стрельбы (-1 - очередью, 1 - одиночный, 2 - с отсечкой по 2 патрона)[/cut]
[cut=Установка детектора целей на интегрированный прицел на примере "Монгола"]Если вписать scope_alive_detector = scope_detector в конфиг оружия то этот параметр будет успешно проигнорирован. Выход в добавлении этой строки в любую секцию апгрейда (например [up_sect_firsta_l85]) и добавление этого апгрейда в ствол по умолчанию (installed_upgrades = up_firsta_l85)[/cut]

[cut=История обновления шапки][table][tr][td]
Дата
[/td][td]
Описание изменений
[/td][td]
Автор
[/td][/tr][tr][td]31.05.12[/td][td]Спойлеры отсортированы по категориям. Статьи подредактированы и приведены к стандарту по оформлению[/td][td]ХОВАН[/td][/tr][tr][td]19.11.12[/td][td]Добавлено описание выдачи инфопорции.[/td][td]denis2000[/td][/tr][/table][/cut]



Здесь обсуждаются вопросы, которые напрямую связаны с читерством в игре. Посты, не связанные напрямую с читерством, будут считаться оффтопом и будут предприняты действия согласно Правилам сайта (п. 4.12). Ответы на "плохие вопросы" также являются оффтопом; под каждым постом есть кнопочка "Доложить" - лучше нажимайте на нее.
 
Earth2SpaceДата: Вс, 14.07.2013, 18:11 | Сообщение # 811
Механик-водитель 6-го моторизованного квада
Долг
Сообщений: 344
Награды: 5
Репутация: [ 103 ]

FantomICW, у меня функции с пробелами не всегда находит. Например, если в сткрипте в функции между словами стоит 2 пробела.


Стол заказов | Правки движка | O.G.S.E. 0.6.9.3


Сообщение отредактировал Earth2Space - Вс, 14.07.2013, 18:11
 
htmДата: Вс, 14.07.2013, 19:14 | Сообщение # 812
Гражданский
Пользователи
Сообщений: 11
Награды: 0
Репутация: [ 0 ]

Earth2Space, Игра выключена. Уже понял, файл на системном диске находится(он у меня не битый на части)
Цитата (Миротворец)
Значит не там или не так правил. Сделай скрины правок и приведи их.

Дело в том, что я поставил снова старый файл без изменений. После вылетает жук.


Сообщение отредактировал htm - Вс, 14.07.2013, 19:14
 
totenchemДата: Вс, 14.07.2013, 19:45 | Сообщение # 813
Генералиссимус
Вольные сталкеры
Сообщений: 3375
Награды: 10
Репутация: [ 206 ]

Цитата (denis2000)
Отвечаете за свои слова?

Цитата (Vaiteria)
Способ работает для ЧН\ЗП

Добавлено (14.07.2013, 19:45)
---------------------------------------------
FantomICW, Глеб никак не найду,я играю на этом моде S.T.A.L.K.E.R_Народная Солянка-Поиски Чернобыльского Шахматиста_[Mod],может там что-то по другому сделано,но я никак не найду. cry

 
FantomICWДата: Вс, 14.07.2013, 19:54 | Сообщение # 814
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

totenchem, предоставь, пожалуйста, файл scripts/bind_stalker.script
И еще. Вы с denis2000, похоже, говорите о разных подсказках в шапке. Денис, наверное, имеет ввиду
Цитата (Vaiteria)
[ Спавн предмета в рюкзак ГГ ]

Этот способ может вполне заменить приведенный Дмитрием. Способ с правкой bind_stalker.script правильней с точки зрения модостроителя (у ГГ при НИ сразу есть нужные вещи). Но нам ведь сейчас главное - зачитерить предметы...





Сообщение отредактировал FantomICW - Вс, 14.07.2013, 19:55
 
totenchemДата: Вс, 14.07.2013, 22:10 | Сообщение # 815
Генералиссимус
Вольные сталкеры
Сообщений: 3375
Награды: 10
Репутация: [ 206 ]

FantomICW, [cut=вот что просил]-- файл из мода "Народной солянки 2009" от 14.06.
-- Адаптирован для Менеджера оружия. Rulix aka Bak от 2.07.09
-- Адатировал: Idler.

local upd_time
local upd_time1
local upd_time2
local upd_time3
local upd_time4

local table_sort = table.sort
local math_ceil = math.ceil

function init(obj)
xr_motivator.AddToMotivator(obj)
end

function actor_init(npc)
npc:bind_object(actor_binder(npc))
-- level_tasks.add_location(707,"blue_location","Лукаш")
-- level_tasks.add_location(702,"blue_location","Макс")
-- level_tasks.add_location(728,"blue_location","Повар")
end

local det_suit_id = nil
local game_difficulty_by_num = {
[0] = "gd_novice",
[1] = "gd_stalker",
[2] = "gd_veteran",
[3] = "gd_master"
}

lasthealth = 0
lasttime = 0
post_process = 0
local weapon_hide = false
-- local arts = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
self.bCheckStart = false
self.weather_manager = level_weathers.WeatherManager()
self.actor_detector = xr_detector.actor_detector()
self.is_saved = false
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
--amk.updateGameTime()
spawn_level_changer.remove_old_teleport()
printf("actor net spawn")
-- skunk.dbglog("actor net spawn")
zamok.restore()
babah.collectBombs()
level.show_indicators()

self.bCheckStart = true
self.weapon_hide = false -- спрятано или нет оружие при разговоре.
weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

if object_binder.net_spawn(self,data) == false then
-- skunk.dbglog("actor net spawn 1")
return false
end

-- skunk.dbglog("actor net spawn 2")
db.add_actor(self.object)
if self.st.disable_input_time == nil then
level.enable_input()
end

self.weather_manager:reset()
-- game_stats.initialize ()

if(actor_stats.add_to_ranking~=nil)then
actor_stats.add_to_ranking(self.object:id())
end

--' Загружаем настройки дропа
death_manager.init_drop_settings()

-- added by xStream for AMK miniSDK
if xrs_ai then
xrs_ai.actor_net_spawn(self)
end

if rx_ai then
rx_ai.actor_net_spawn()
end

amk.on_game_load(obj)
art_hit.net_spawn()
--===============================

--[[local bad_object_names = {"wpn_lr30053522", "wpn_lr30058409" } --"wpn_lr30025601", "wpn_lr30028817","wpn_lr30033589"
local i, se_name, se_obj

for i, se_name in ipairs(bad_object_names) do
se_obj = alife():object(se_name)
if se_obj then
news_manager.send_tip(db.actor,"Удалили глючный ствол:"..se_name,nil,nil,1000)
alife():release(se_obj, true)
end
end]]

--===============================
sak.add_tail()
braad_test.false_info()
-- end of addition
meceniy_work.main()
meceniy_utils.net_spawn_callback()
-- kostya_level --
spawn_teleport.spawn_teleport_exit()
spawn_teleport.spawn_teleport_hospital()
bind_det_arts.start_update()
netpacket_pda_id = netpacket_pda_create.create_pda()
return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()

-- added by xStream for AMK miniSDK
amk.on_game_save(obj)
-- end of addition

if(actor_stats.remove_from_ranking~=nil)then
actor_stats.remove_from_ranking(self.object:id())
end
-- game_stats.shutdown ()
db.del_actor(self.object)

sr_light.clean_up ()

self.object:set_callback(callback.inventory_info, nil)
self.object:set_callback(callback.article_info, nil)
self.object:set_callback(callback.on_item_take, nil)
self.object:set_callback(callback.on_item_drop, nil)
--self.object:set_callback(callback.actor_sleep, nil)
self.object:set_callback(callback.task_state, nil)
self.object:set_callback(callback.level_border_enter, nil)
self.object:set_callback(callback.level_border_exit, nil)
self.object:set_callback(callback.take_item_from_box, nil)

if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:destroy()
sr_psy_antenna.psy_antenna = false
end

valerich_treasures.net_destroy()
xr_sound.stop_all_sound_object()
if iniStatistic then
get_console():execute("load ~~~ amk.dump_table(iniLines):")
amk.dump_table(iniLines)
get_console():execute("load ~~~ amk.dump_table(iniOtherLines):")
amk.dump_table(iniOtherLines)
get_console():execute("load ~~~ amk.dump_table(iniStat):")
local t = {}
for sect, count in pairs(iniStat) do
table.insert(t, {sect, count})
end
table_sort(t, sortStat)
amk.dump_table(t)
end
object_binder.net_destroy(self)
end

function sortStat(t1, t2)
return t1[2] > t2[2]
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
object_binder.reinit(self)

local npc_id = self.object:id()

db.storage[npc_id] = { }

self.st = db.storage[npc_id]
self.st.pstor = nil

self.next_restrictors_update_time = -10000

self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.article_info, self.article_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
--self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
self.object:set_callback(callback.task_state, self.task_callback, self)
--self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)

self.object:set_callback(callback.use_object, self.on_use_object, self)

self.object:set_callback(callback.death, self.death_callback, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:death_callback(victim, who)
if victim:id() == db.actor:id() then
difficulty_manager.deathStatCollect()
end
end

function actor_binder:take_item_from_box(box, item)

------------
if string.sub(item:section(),1,10)=="val_zapis_" then
valerich_treasures.spawn_next( tonumber(string.sub(item:section(),11,-1)) )
end

--Proper72 удаление рюкзаков
if box:is_inv_box_empty() then
if (string.sub(box:section(),2,15)=="_inventory_box" and string.find(rx_utils.read_from_ini(nil, box:section(), "visual", "", 1),"item_rukzak")) or string.sub(box:section(),1,11)=="val_taynik_" then
level.start_stop_menu(level.main_input_receiver(), true)
alife():create("treasure_item",box:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),0)
alife():release(alife():object(box:id()))
end
end
------------
-- Proper72 end

local story_id = box:story_id()
if story_id == nil then
return
end

treasure_manager.take_item_from_box(box, story_id)
zamok.remove(box, item)

--AMK UTILS--
amk.on_item_take_from_box(box,item)
amk_utils.actor_item_from_box(box, item)
--AMK UTILS--

end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_enter(npc, info_id)
self.actor_detector:actor_enter()

--AMK UTILS--
amk_utils.actor_level_border_enter(npc, info_id)
--AMK UTILS--

end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_exit(npc, info_id)
self.actor_detector:actor_exit()

--AMK UTILS--
amk_utils.actor_level_border_exit(npc, info_id)
--AMK UTILS--

end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--' Сюжет
level_tasks.proceed(self.object)
-- Отметки на карте
hidden_slots.on_info(info_id)
level_tasks.process_info_portion(info_id)
--AMK UTILS--
amk.on_info(npc,info_id)
amk_utils.actor_info(npc, info_id)
inventory.on_inventory_info(info_id)
--AMK UTILS--
if npc:id() == db.actor:id() then
meceniy_spawn.respawn(info_id)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
if sell_bye == true then
game_stats.money_trade_update (money)
else
game_stats.money_trade_update (-money)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name)
--printf("article_callback [%s][%s]", group, name)
if device().precache_frame >1 then return end

if group == "Diary" then
news_manager.send_encyclopedy("diary", group)
else
news_manager.send_encyclopedy("encyclopedy", group)
end

--AMK UTILS--
amk.on_info(npc,info_id)
amk_utils.actor_article(npc, group, name)
--AMK UTILS--

end
--------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
level_tasks.proceed(self.object)
--game_stats.update_take_item (obj, self.object)
local item = obj
--AMK UTILS--
amk.on_item_take(obj)
amk_utils.actor_item_take(obj)

if obj:clsid() == clsid.wpn_ammo then
dunin_ammo.on_take(obj)
end
sak.check_used_item(obj)
braad_test.checking_use_item(obj)
if xrs_ai then xrs_ai.actor_item_take(obj)
end

art_hit.hit_by_art(obj)
--AMK UTILS--
babah.on_item_take(obj)
inventory.on_item_take(item)
spawn_zombi.checking_taken_item(obj)
spawn_zombi.checking_taken_item2(obj)
spawn_zombi.checking_taken_item3(obj)
spawn_zombi.checking_taken_item4(obj)
spawn_zombi.checking_taken_item5(obj)
spawn_zombi.checking_taken_item6(obj)
spawn_zombi.checking_taken_item7(obj)
spawn_zombi.checking_taken_item8(obj)
spawn_zombi.checking_taken_item9(obj)
spawn_zombi.checking_taken_item10(obj)
spawn_zombi.checking_taken_item11(obj)
spawn_zombi.checking_taken_item12(obj)
spawn_zombi.checking_taken_item13(obj)
spawn_zombi.checking_taken_item14(obj)
spawn_zombi.checking_taken_item15(obj)
spawn_zombi.checking_taken_item16(obj)
spawn_zombi.checking_taken_item17(obj)
spawn_zombi.checking_taken_item18(obj)
spawn_teleport.checking_taken_item19(obj)
spawn_teleport.checking_taken_item20(obj)
spawn_teleport.checking_taken_item21(obj)
spawn_teleport.checking_taken_item22(obj)
new_spawn.checking_taken_item23(obj)
spawn_teleport.checking_taken_item24(obj)
spawn_teleport.checking_taken_item25(obj)
spawn_teleport.checking_taken_item26(obj)
spawn_teleport.checking_taken_item27(obj)
spawn_teleport.checking_taken_item28(obj)
spawn_restrictor.checking_taken_item29(obj)
spawn_restrictor.checking_taken_item30(obj)
spawn_teleport.checking_taken_item31(obj)
spawn_restrictor.checking_taken_item32(obj)
spawn_teleport.checking_taken_item33(obj)
spawn_teleport.checking_taken_item34(obj)
spawn_teleport.checking_taken_item35(obj)
spawn_teleport.checking_taken_item36(obj)
new_spawn.checking_taken_item37(obj)
arhara_dialog.checking_taken_item38(obj)
spawn_zombi.checking_taken_item39(obj)
spawn_zombi.checking_taken_item40(obj)
meceniy_utils.on_item_take_callback(obj)
spawn_zombi.checking_taken_item41(obj)
spawn_zombi.checking_taken_item42(obj)
spawn_zombi.checking_taken_item43(obj)
arhara_dialog.checking_taken_item44(obj)
arhara_dialog.checking_taken_item45(obj)
arhara_dialog.checking_taken_item46(obj)
arhara_dialog.checking_taken_item47(obj)
arhara_dialog.checking_taken_item48(obj)
arhara_dialog.checking_taken_item49(obj)
arhara_dialog.checking_taken_item50(obj)
arhara_dialog.checking_taken_item51(obj)
arhara_dialog.checking_taken_item52(obj)
arhara_dialog.checking_taken_item53(obj)
arhara_dialog.checking_taken_item54(obj)
arhara_dialog.checking_taken_item55(obj)
arhara_dialog.checking_taken_item56(obj)
arhara_dialog.checking_taken_item57(obj)
arhara_dialog.checking_taken_item58(obj)

valerich_treasures.on_item_take(obj) -- Тайники Valerich'a
-- Proper70 kostya
kostya_dialog.checking_taken_item59(obj)
-- Proper70 Bitva KL
braad_test.checking_taken_item60(obj)
-- Proper71 docs
kostya_dialog.checking_taken_item61(obj)
-- Proper70 strelok
kostya_dialog.checking_taken_item62(obj)
-- Proper70 end
chess.item_take(obj)

if rx_ai then
rx_ai.actor_item_take(obj)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
babah.li(obj)

-- Vergas ogg-player
player_ogg.lose_item(obj)

level_tasks.proceed(self.object)
--game_stats.update_drop_item (obj, self.object)
-- if level.vertex_position(db.actor:level_vertex_id()):distance_to(db.actor:position())>1 then
-- amk.mylog("Здесь нет вертексов")
-- else
-- amk.mylog("Вертекс "..db.actor:level_vertex_id().." "..db.actor:game_vertex_id())
-- end

--AMK UTILS--
amk.on_item_drop(obj)
amk_utils.actor_item_drop(obj)
--AMK UTILS--
inventory.on_item_drop(obj)
sak.check_droped_item(obj)
braad_test.drop_actor(obj)
braad_test.drop_lim(obj)
--Избавляемся от Зомбирования--
meceniy_work.on_item_use(obj)
meceniy_utils.on_item_drop_callback(obj)
-------------------------------
spawn_level_changer.checking_droped_obj(obj)
--[[spawn_level_changer.checking_droped_item(obj)
spawn_level_changer.checking_droped_item2(obj)
spawn_level_changer.checking_droped_item3(obj)
spawn_level_changer.checking_droped_item4(obj)
spawn_level_changer.checking_droped_item5(obj)
spawn_level_changer.checking_droped_item6(obj)
spawn_level_changer.checking_droped_item7(obj)
spawn_level_changer.checking_droped_item8(obj)
spawn_level_changer.checking_droped_item11(obj)
spawn_level_changer.checking_droped_item12(obj)
spawn_level_changer.checking_droped_item13(obj)
spawn_level_changer.checking_droped_item14(obj)]]
--spawn_level_changer.checking_droped_item10(obj)
zamok.add(obj)
end
----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _objective, _state)
task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)
if _objective:get_idx() == 0 then
if _state == task.fail then
news_manager.send_task(db.actor, "fail", _task, _objective)
elseif _state == task.completed then
task_manager.reward_by_task(_task)
news_manager.send_task(db.actor, "complete", _task, _objective)
else
news_manager.send_task(db.actor, "new", _task, _objective)
end
else
if _task:get_objective(0):get_state() == task.in_progress then
news_manager.send_task(db.actor, "update", _task, _objective)
end
end

--AMK UTILS--
amk_utils.actor_task(_task, _objective, _state)
--AMK UTILS--

end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:map_location_added_callback(spot_type_str, object_id)
if (false==app_ready()) or (device().precache_frame>1) then return end
--'news_manager.send_task(db.actor, "new")
end
----------------------------------------------------------------------------------------------------------------------
-- malandrinus
--watch_value = 0
-- malandrinus
scopeUsed = false
function actor_binder:update(delta)
-- malandrinus
-- watch_value = game.time()
-- /malandrinus
chess.update()
amk.oau_watchdog=200
amk.oau_reason="actor_binder:update"
--amk.updateGameTime()
amk.oau_watchdog=2001
object_binder.update(self, delta)
amk.oau_watchdog=199

local time = time_global()

game_stats.update (delta, self.object)
if db.actor:item_in_slot(6) and db.actor:item_in_slot(6):section() == "exo_doktor_outfit" then
if not det_suit_id then
if db.actor:object("detector_suit") then
det_suit_id = db.actor:object("detector_suit"):id()
else
det_suit_id = (alife():create("detector_suit",db.actor:position(),
db.actor:level_vertex_id(),db.actor:game_vertex_id(),
db.actor:id())).id
end
end
else
if det_suit_id and alife():object(det_suit_id) then
alife():release(alife():object(det_suit_id),true)
det_suit_id = nil
end
end

local fov = device().fov
local wpn
if fov < 35 and xr_logic.pstor_retrieve(db.actor, "use_scope", 0) == 0 then
wpn = db.actor:item_in_slot(db.actor:active_slot())
if wpn and wpn:section() == "wpn_crossbow" then
level.add_pp_effector("bast.ppe", 1034, true)
get_console():execute ("r2_sun_lumscale_amb 3")
get_console():execute ("r2_mblur 0.6")
xr_logic.pstor_store(db.actor, "use_scope", 1)
end
elseif fov > 35 and xr_logic.pstor_retrieve(db.actor, "use_scope", 0) == 1 then
xr_logic.pstor_store(db.actor, "use_scope", 0)
level.remove_pp_effector(1034)
get_console():execute ("r2_sun_lumscale_amb 1")
get_console():execute ("r2_mblur 0.")
end
if upd_time3 == nil then
upd_time3 = time + 500
elseif upd_time3 < time then
upd_time3 = time + 500
local accuracy = math_ceil(db.actor:accuracy()*1000)
if accuracy == 1 then
if not scopeUsed then
local item = db.actor:active_item()
if item then
--get_console():execute("load ~#I#: db.actor:active_item():section()="..tostring(item:section()))
if item:section() == "wpn_binoc" then
scopeUsed = true
elseif IAmAWeapon[item:clsid()] then
local t = amk.get_weapon_data(alife():object(item:id()))
scopeUsed = (bit_and(t.addon_flags, 1) == 1 or rx_utils.get_addon_status(item, "sc") == 1)
--amk.dump_table(t)
end
end
end
else
scopeUsed = false
end
end
-- $DreamMod апдейт схемы сна
if sleep_manager.is_sleep_active() and xr_conditions.actor_dead() then
xr_logic.issue_event(db.actor, db.storage[db.actor:id()]["ar_sleep"], "update")
end
amk.oau_watchdog=198
-- апдейт погоды
self.weather_manager:update()
amk.oau_watchdog=197
-- апдейт схемы детектора
self.actor_detector:update()
amk.oau_watchdog=196
--ms_ai.sleep_manager()
amk.oau_watchdog=195
-- апдейт звуковой схемы актера
xr_sound.update_actor()
amk.oau_watchdog=194
meceniy_work.set_invisible()
amk.oau_watchdog=193
-- meceniy_utils.on_actor_update_callback()
-- by Monnoroch

if upd_time == nil then
upd_time = time + 10000
elseif upd_time < time then
upd_time = time + 10000
monnoroch.upd_time(time)
end
amk.oau_watchdog=1931

if upd_time1 == nil then
upd_time1 = time + 1000
elseif upd_time1 < time then
upd_time1 = time + 1000
-- meceniy_work.set_invisible()
meceniy_utils.on_actor_update_callback()
amk.oau_watchdog=1932
sak.show_time()
amk.oau_watchdog=1933
arc_main.actor_update()
amk.oau_watchdog=1934
meceniy_work.mainw()
end
amk.oau_watchdog=1935
-- sak.out_teleport() --в net_spawn() этому место!
if upd_time2 == nil then
upd_time2 = time + 5000
elseif upd_time2 < time then
upd_time2 = time + 5000
if not self.object:is_talking() then
dunin_ammo.on_update()
end
amk.oau_watchdog=1936
sak.nepis_umer()
amk.oau_watchdog=1937
braad_test.dead_npc()
amk.oau_watchdog=1938
braad_test.check_info()
amk.oau_watchdog=1939
braad_test.new_info()
amk.oau_watchdog=19391
braad_test.kot_info()
amk.oau_watchdog=19392
braad_test.forest_info()
amk.oau_watchdog=19393
braad_test.grib_respawn()
amk.oau_watchdog=19394
braad_test.update_new()
amk.oau_watchdog=19395
braad_test.kot_update()
end
amk.oau_watchdog=192
valerich_treasures.update()
art_hit.update()
-- ----------------------------------------------------- ARENA_EXTENSION_MOD--------------------------------------------------------
aem_manager.get_aem():update()
-- ----------------------------------------------------- ARENA_EXTENSION_MOD--------------------------------------------------------
amk.oau_watchdog=191
--' Проверка потери жизни
--[[
if self.object.health - lasthealth > 0.001 or
self.object.health - lasthealth < -0.001 then
printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)
lasthealth = self.object.health
lasttime = game.time()
end
]]
-- Обновление отключения ввода с клавиатуры.
if self.st.disable_input_time ~= nil and
game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
then
level.enable_input()
self.st.disable_input_time = nil
end
-- Обновление сна с переносом чувака в указанную позицию
if self.st.sleep_relocate_time ~= nil and
game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle
then
self.object:set_actor_position(self.st.sleep_relocate_point)
local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
self.object:set_actor_direction(dir:getH())
self.st.sleep_relocate_time = nil
end

-- Апдейт прятание оружия игрока во время диалога
if weapon_hide == true or self.object:is_talking() then
if self.weapon_hide == false then
self.object:hide_weapon()
self.weapon_hide = true
end
else
if self.weapon_hide == true then
self.object:restore_weapon()
self.weapon_hide = false
end
end
amk.oau_watchdog=191
-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
if self.next_restrictors_update_time < time then
bind_restrictor.actor_update(delta)

-- Апдейтим наш телепорт (Kostya_level)
bind_mteleport.actor_update(delta)
self.next_restrictors_update_time = time + 200

task_manager.actor_update()
end
amk.oau_watchdog=190
-- обновление постпроцессов
if post_process ~= 0 then
if post_process:update () == true then
post_process = 0
end
end

-- обновление пси-антенны
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:update(delta)
end

--[[ local hud_demo = get_hud()
local custom_static_demo = hud_demo:GetCustomStatic("cs_demo_play")

if custom_static_demo == nil then
hud_demo:AddCustomStatic("cs_demo_play", true)
hud_demo:GetCustomStatic("cs_demo_play"):wnd():SetTextST("st_demo_play")
end
]]

inventory.update()

--' Вывод сообщения о большой радиации
if self.object.radiation >= 0.7 then
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_radiation_danger")
if custom_static == nil then
hud:AddCustomStatic("cs_radiation_danger", true)
hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
end
else
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_radiation_danger")
if custom_static ~= nil then
hud:RemoveCustomStatic("cs_radiation_danger")
end
end
amk.oau_watchdog=189
-- if not self.object:is_talking() then
-- dunin_ammo.on_update()
-- end
amk.oau_watchdog=188
if self.bCheckStart then
printf("SET DEFAULT INFOS")

if not has_alife_info("storyline_actor_start") and
(level.name() == "l01_escape")
then
self.object:give_info_portion("storyline_actor_start")
_G.g_start_avi = true
printf("*AVI* RUN START AVI")
end

-- if not has_alife_info("encyclopedy") then
-- self.object:give_info_portion("encyclopedy")
-- end

if not has_alife_info("global_dialogs") then
self.object:give_info_portion("global_dialogs")
end

if not has_alife_info("level_changer_icons") then
self.object:give_info_portion("level_changer_icons")
end

level_tasks.add_lchanger_location()

self.bCheckStart = false
end


amk.oau_watchdog=187
--AMK UTILS--
amk.on_actor_upade(delta)
-- amk_utils.actor_update(delta)
--AMK UTILS--
amk.oau_watchdog=186
-- amk.oau_reason="actor_binder:update"
-- sak.out_teleport()
-- amk.oau_watchdog=185
-- sak.nepis_umer()
-- amk.oau_watchdog=184
-- braad_test.dead_npc()
-- braad_test.check_info()
-- braad_test.new_info()
-- braad_test.kot_info()
-- braad_test.forest_info()
-- braad_test.grib_respawn()
-- braad_test.update_new()
-- braad_test.kot_update()
-- amk.oau_watchdog=183

-- added by Red75. Контроль за переполнением
if self.warning then
self.warning=nil
get_hud():AddCustomStatic("hud_save_warning")
local wnd=get_hud():GetCustomStatic("hud_save_warning"):wnd()
if self.critical==1 then
wnd:SetTextST(game.translate_string("amk_warn_trans"))
self.critical=nil
elseif self.critical==2 then
wnd:SetTextST(game.translate_string("amk_warn_trans_critical"))
self.critical=nil
else
wnd:SetTextST(game.translate_string("amk_warn_attention"))
end
elseif self.wt and self.wt<time_global() then
self.wt=nil
if get_hud():GetCustomStatic("hud_save_warning") then
get_hud():RemoveCustomStatic("hud_save_warning")
end
end

amk.oau_watchdog=182
if xrs_ai then xrs_ai.actor_update(delta) end
if rx_ai then rx_ai.actor_update() end
amk.oau_watchdog=181
-- end of addition
if biodetector then biodetector.update() end
amk.oau_watchdog=180
-------

-- meceniy_work.mains() --/обьекты
-- amk.oau_watchdog=179
-- meceniy_work.mainw() --/Зомбирование
-- amk.oau_watchdog=179
-- by Monnoroch
-- if upd_time == nil then
-- upd_time = time + 10000
-- elseif upd_time < time then
-- upd_time = time + 10000
-- monnoroch.upd_time(time)
-- end
-- by Monnoroch
--проверка зависания биндеров НПЦ и мобов раз в 0,5сек
--закомментировано на случай разбора полётов
--[[ if upd_time3 == nil then
upd_time3 = time + 500
elseif upd_time3 < time then
upd_time3 = time + 500
if db and db.storage then
for k,v in pairs(db.storage) do
if v.us ~= nil and v.us ~= 0 then
abort("binder(%s) zavis(%s)", db.creatures[k]:name(), v.us)
v.us = nil
break
end
end
self.is_saved = false
end
end]]
-- drrr.dropgg()
--[[----------- Proper70 keylogger
if upd_time5 == nil then
upd_time5 = time + 500
elseif upd_time5 < time then
keylogger.update()
end
--------------- Proper70 end]]
if upd_time4 == nil then
upd_time4 = time + 500
elseif upd_time4 < time then
upd_time4 = time + 500
doc_viewer.update()
amk.oau_watchdog=181
babah.update(delta)
amk.oau_watchdog=182
stco.update()
-- if upd_time5 == nil then
-- upd_time5 = time + 1500
-- elseif upd_time5 < time then
-- upd_time5 = time + 1500

--он и так вешается на быстрый вызов с помощью db.actor:set_fastcall(update, db.actor)
--bind_det_arts.update()
amk.oau_watchdog=183
end
--[[тестовый спавн детекторов в инвентаре актора
alife():create('det_artefact_indy', db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
alife():create('detektor_amorf', db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
alife():create('det_artefact_super', db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end]]
amk.oau_watchdog=0
amk.oau_reason=""

--[[-----------Proper70------------------------ Вывод инвормации level_vertex_id, game_vertex_id, pos
if true then
local hud = get_hud()
local cs = hud:GetCustomStatic("cs_debug" )
if cs == nil then
hud:AddCustomStatic("cs_debug", true)
cs = hud:GetCustomStatic("cs_debug" )
end
local lvid, gvid = db.actor:level_vertex_id(), db.actor:game_vertex_id()
local pos, dir = db.actor: position(), db.actor:direction()
local pos2 = level.vertex_position(lvid)
local valid = pos2:distance_to(pos) <= 0.7
local msg = string.format("lvid: %d\\n", lvid) ..
string.format("gvid: %d\\n", gvid) ..
string.format("pos: %f,%f,%f\\n", pos.x, pos.y, pos.z) ..
string.format("dir: %f,%f,%f\\n", dir.x, dir.y, dir.z) ..
string.format("valid: %s", tostring(valid))
if cs ~= nil then
cs:wnd():SetText(msg)
end
end]]
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)

if rx_ai then rx_ai.actor_save(packet) end

art_hit.save()
local pk1=fake_net_packet.fake_net_packet()
self:save_old(pk1)
amk.mylog("Packet size is "..pk1:w_tell())
if pk1:w_tell()>7500 then
self.warning=true
self.critical=1
self.wt=time_global()+60000
amk.emergency_cleanup()
self:save_old(packet)
amk.mylog("Actor packet size is "..packet:w_tell().."!")
-- amk.send_tip("Actor packet size critical=2 >7500 ","Размер нетпакета ГГ критический:"..pk1:w_tell(),0,15,"gen_info") -- это добавляем
amk.emergency_restore()
elseif pk1:w_tell()>6000 then
self.warning=true
self.wt=time_global()+60000
self:save_old(packet)
-- amk.send_tip("Actor packet size critical=1 >6000 ","Размер нетпакета ГГ допустимый:"..pk1:w_tell(),0,15,"gen_info") -- это добавляем
else
self:save_old(packet)
self.wt=time_global()
-- amk.send_tip("Actor packet size <6000 ","Размер нетпакета ГГ мал. Всё ОК:"..pk1:w_tell(),0,15,"gen_info") -- это добавляем
end
self.is_saved = true
end

function actor_binder:save_old(packet)

local save_treasure_manager = true

printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
object_binder.save(self, packet)

--' Сохраняем уровень сложности
if save_treasure_manager == true then
packet:w_u8(level.get_game_difficulty() + 128)
else
packet:w_u8(level.get_game_difficulty())
end

--' Сохраняем данные об отключенном вводе
if self.st.disable_input_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.st.disable_input_time)
end
amk.oAmkLauncher:SaveData(self.object)

xr_logic.pstor_save_all(self.object, packet)
self.weather_manager:save(packet)

sr_psy_antenna.save( packet )

if save_treasure_manager == true then
treasure_manager.save(packet)
end

task_manager.save(packet)
self.actor_detector:save(packet)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
printf("actor_binder:load(): self.object:name()='%s'", self.object:name())
object_binder.load(self, reader)
printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

--' Загружаем уровень сложности
local game_difficulty = reader:r_u8()

local load_treasure_manager = false
if game_difficulty >= 128 then
game_difficulty = game_difficulty - 128
load_treasure_manager = true
end


get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

if reader:r_eof() then
abort("SAVE FILE IS CORRUPT actor_binder:load "..self.object:name().." завис актор - сушите весла!")
end

local stored_input_time = reader:r_u8()
if stored_input_time == true then
self.st.disable_input_time = utils.r_CTime(reader)
end

xr_logic.pstor_load_all(self.object, reader)
amk.oAmkLauncher:LoadData(self.object)

self.weather_manager:load(reader)

sr_psy_antenna.load(reader)

if load_treasure_manager == true then
treasure_manager.load(reader)
end


task_manager.load(reader)
self.actor_detector:load(reader)

if xr_logic.pstor_retrieve(self.object,"emerg",false) then -- нельзя использовать amk.load_varible(), так как db.actor ещё не определён
self.warning=true
self.critical=2
self.wt=time_global()+60000
end
end
----------------------------------------------------------------------------------------------------------------------

--старт префетча звуков
--if string.find(command_line(), "-noprefetch") == nil then
-- sound_prefetch.prefetch_sounds()
--end

-- Weapon functions
function hide_weapon()
weapon_hide = true
end
function restore_weapon()
weapon_hide = false
end

--// this is test for section iteration
--/**
local function test_section_iteration(file_name, section_name)
printf ("file : %s",file_name)
printf ("section : %s",section_name)

local file = ini_file(file_name)
local n = file:line_count(section_name)
printf ("lines : %d",n)

local id, value = "", "", result
for i=0,n-1 do
result, id, value = file:r_line(section_name,i,"","")
printf ("line %d : %s = %s",i,id,value)
end
end

test_section_iteration("system.ltx","space_restrictor")
--/**/
function actor_binder:on_use_object(obj)
--medkit_use.lose_item(obj)
meceniy_outfit.on_item_drop(obj)
zvuki.use_snd(obj)
end

[/cut]
 
makdmДата: Вс, 14.07.2013, 22:46 | Сообщение # 816
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

totenchem, Ну так сразу же видно, вот этот кусок.
function actor_binder:update(delta)
-- malandrinus
-- watch_value = game.time()
-- /malandrinus
chess.update()
amk.oau_watchdog=200
amk.oau_reason="actor_binder:update"
--amk.updateGameTime()
amk.oau_watchdog=2001
object_binder.update(self, delta)

Вот после этого и вставляете скрипт.


Терпение......
И все получится!
 
totenchemДата: Пн, 15.07.2013, 09:48 | Сообщение # 817
Генералиссимус
Вольные сталкеры
Сообщений: 3375
Награды: 10
Репутация: [ 206 ]

makdm, спасибо сейчас попробую.

Добавлено (15.07.2013, 09:27)
---------------------------------------------
makdm, все сделал вот
[cut=лог]
FATAL ERROR

[error]Expression : no_assert
[error]Function : CXML_IdToIndex<class CInfoPortion>::GetById
[error]File : e:\stalker\patch_1_0004\xr_3da\xrgame\xml_str_id_loader.h
[error]Line : 112
[error]Description : item not found, id
[error]Arguments : start_actor_spawn


stack trace:

[/cut]

Добавлено (15.07.2013, 09:48)
---------------------------------------------
makdm, Дим что-то я неправильно делаю,а вот что сам не пойму,я скопировал тот скрипт,что ты выложил,может надо руками набирать,не знаю,наверно не мое это.

 
denis2000Дата: Пн, 15.07.2013, 10:25 | Сообщение # 818
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

totenchem, В ТЧ нужно ОБЯЗАТЕЛЬНО регистрировать инфопорцию. Внеси:
Код
<info_portion id="start_actor_spawn">
</info_portion>

в файл типа config\gameplay\info_***.xml


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
totenchemДата: Пн, 15.07.2013, 12:23 | Сообщение # 819
Генералиссимус
Вольные сталкеры
Сообщений: 3375
Награды: 10
Репутация: [ 206 ]

denis2000, ГГ у меня стал качаться как пьяный,земля крутиться а итди вроде и идет а вроде бы и стоит,вобщем какая-то ерунда,еще вчера вечером началось,удалил игру полностью,реестр почистил,поставил и игру и мод,сегодня запустил и тут на те вам,все плывет и пляшет,что опять удалять или может что ты посоветуешь.
 
SkipperДата: Пн, 15.07.2013, 13:26 | Сообщение # 820
Гражданский
Пользователи
Сообщений: 12
Награды: 0
Репутация: [ 0 ]

Помогите народ, квест с наёмниками, противостояние, наёмник не берет выполненное задание. Подходишь к наёмнику на мосту,а он смотрит в низ и никакого диалога

skipper
 
ВалерийДата: Пн, 15.07.2013, 13:40 | Сообщение # 821
Хранитель спокойствия
Администраторы
Сообщений: 61385
Награды: 47
Репутация: [ 32767 ]

Цитата (Skipper)
Помогите народ, квест с наёмниками, противостояние, наёмник не берет выполненное задание. Подходишь к наёмнику на мосту,а он смотрит в низ и никакого диалога

Ставим фиксы
Цитата

[ Последний фикс (19.03.12) ]

[ Что исправлено ]

http://mod.sigerous-server.ru/sgm_2.2.....03.rar
http://narod.ru/disk....ar.html
http://file.karelia.ru/98vk4q/
http://depositfiles.com/files/6hmrwcrp3

[ Фикс-Аддон от makdm (ставить после фикса от 19.03.) ]

[ Что исправлено ]

1...
5. Исправлен квест «Тайное противостояние». (Можно проходить за любую «сторону». Сёма на мосту больше не молчит).
...
После установки Новая Игра обязательна. (Старые сохранения работать не будут)

http://mod.sigerous-server.ru/sgm_2.2/fix_addons/Add_Fix_SGM_2_2.rar
http://narod.ru/disk....7z.html
 
SkipperДата: Пн, 15.07.2013, 13:55 | Сообщение # 822
Гражданский
Пользователи
Сообщений: 12
Награды: 0
Репутация: [ 0 ]

Спасибо Валерий. Ещё с Енотом работать будет?

skipper
 
EнoтДата: Пн, 15.07.2013, 14:27 | Сообщение # 823
Вольный бродяга
Вольные сталкеры
Сообщений: 2410
Награды: 11
Репутация: [ 839 ]

Skipper, в сборку от Енота уже входят все фиксы.
Или Вы не об этом?


Биография моего персонажа - немного поэзии.
Прочитанные книги серии S.T.A.L.K.E.R. - всё больше знаний о Зоне.
AMD Ryzen 7 5700x3d, nVidia GeForce RTX 3060 12GB, 32GB DDR4 3600 MHz, Windows 11 pro х64
 
htmДата: Пн, 15.07.2013, 14:32 | Сообщение # 824
Гражданский
Пользователи
Сообщений: 11
Награды: 0
Репутация: [ 0 ]

Попробовал. Пока правил файл(он не давал его просто пересохранить: "отказано в доступе", пришлось переносить и вставлять) видимо накосячил. теперь вылетает жук.
[cut noguest=лог][DETAILS] VertexConsts(256), Batch(61)
* [DETAILS] 10126 v(20), 5368 p
* [DETAILS] Batch(61), VB(197K), IB(31K)
* phase time: 57 ms
* phase cmem: 472077 K
* Loading HOM: c:\program files (x86)\gsc world publishing\s.t.a.l.k.e.r. - Зов Припяти\gamedata\levels\zaton\level.hom
* phase time: 59 ms
* phase cmem: 472757 K
* phase time: 36 ms
* phase cmem: 472757 K
* phase time: 17 ms
* phase cmem: 472757 K
* t-report - base: 1657, 782807 K
* t-report - lmap: 16, 16386 K
* WARNING: player not logged in
! default LevelMap used for level[digger_stash]
! default LevelMap used for level[l04u_labx18]
* phase time: 17708 ms
* phase cmem: 529749 K
* phase time: 84 ms
* phase cmem: 529749 K
* [win32]: free[2094460 K], reserved[172552 K], committed[1927228 K]
* [ D3D ]: textures[853147 K]
* [x-ray]: crt heap[529700 K], process heap[12918 K], game lua[64107 K], render[262 K]
* [x-ray]: economy: strings[62177 K], smem[91984 K]
! Unknown command: dump_infos

FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ....r. - Зов Припяти\gamedata\scripts\sgm_update.script:11: attempt to index global 'ui_mod_elements' (a nil value)

stack trace:[/cut]
Может кто помочь


Сообщение отредактировал htm - Пн, 15.07.2013, 17:14
 
SkipperДата: Пн, 15.07.2013, 14:38 | Сообщение # 825
Гражданский
Пользователи
Сообщений: 12
Награды: 0
Репутация: [ 0 ]

Уважаемый Енот, наёмник был на стороне завода с наёмниками всё было хорошо, не сохранил и загрузил с ранней загрузки и наёмник уже на стороне бандитов и молчит.

skipper
 
Поиск: