Ковыряемся в исходниках SoC. На данный момент тема ориентирована в большей степени на новичков. Здесь будут собираться готовые решения по мелкому ковырянию исходников движка SoC. Собственно приглашаю всех желающих присоединиться. P.S. обсуждение также приветствуется. --- Создание колбеков для Актора на примере колбека на удар ножом
Колбек - это функция, которая вызывается при определенном событии, например нажатие клавиши, выстрел из оружия, смерть актора и т.д. Создать такой колбек не сложно. Рассмотрим на примере создания колбеков на удары ножом на ЛКМ и ПКМ. Никаких аргументов здесь передаваться не будет, просто вызов функции при ударе. Итак. 1. В файле WeaponKnife.cpp добавим в начало файла после всех инклудов ещё четыре, необходимые для колбеков актора.
Тут стоит немного пояснить: в кавычках тот идентефикатор, который мы зарегистрируем в bind_stalker.script регистрация колбека в bind_stalker.script В функцию:
И добавить функции, которые и будут вызываться при срабатывании колбека:
Код
function actor_binder:knife_attack_one() news_manager.send_tip(db.actor, "Удар ЛКМ") --сообщение для теста end
Код
function actor_binder:knife_attack_two() news_manager.send_tip(db.actor, "Удар ПКМ") --сообщение для теста end
Создание функции, перебирающей предметы на поясе
Я думаю, многие сталкивались с функцией iterate_inventory, которая перебирает весь инвентарь и для каждого вызывает функцию. Если нам нужно перебрать все предметы на поясе, чтобы проверить, есть там какой-либо предмет или нет, можно, конечно, перебрать весь инвентарь и проверять для каждого предмета на поясе ли он или нет. Но можно создать отдельную функцию, которая будет перебирать предметы только на поясе. 1. В файле: script_game_object_script3.cpp ищем iterate_inventory и по аналогии делаем вариант для пояса:
TIItemContainer::iterator I = inventory_owner->inventory().m_belt.begin(); TIItemContainer::iterator E = inventory_owner->inventory().m_belt.end(); for ( ; I != E; ++I) functor (object,(*I)->object().lua_game_object()); }
Как видите, разница тут лишь в том, что предметы перебираются не все, а только те, которые на поясе: так как вместо m_all мы используем m_belt. Как использовать в скриптах: Используется как и функция iterate_inventory
Код
db.actor:iterate_belt(clear_belt, db.actor) --вызываем в нужном месте. clear_belt - функция, которая вызовется для каждого предмета на поясе. function clear_belt(npc, item) db.actor:move_to_ruck(item) --действие с предметом. Например перемещение в рюкзак. end
Добавлено (03.02.2017, 15:50) --------------------------------------------- Исправление отображения зеленым цветом прочитанных записей в разделе КПК "Дневник" by lvg_brest
[b]Добавлено[/b] (03.02.2017, 15:52) --------------------------------------------- Создание нового слота. [spoiler] Я использую ревизию с XP DEV, там уже проведена работа над слотами. Если кто-то использует другую версию исходников, могут быть различия. Создадим слот для второго детектора: В UIInventoryWnd.cpp: после: [code]m_pUISlotQuickAccessList_3 = xr_new<CUIDragDropListEx>(); AttachChild(m_pUISlotQuickAccessList_3); m_pUISlotQuickAccessList_3->SetAutoDelete(true); xml_init.InitDragDropListEx (uiXml, "dragdrop_slot_quick_access_3", 0, m_pUISlotQuickAccessList_3); BindDragDropListEnents (m_pUISlotQuickAccessList_3);
Добавлено (03.02.2017, 15:55) --------------------------------------------- Новые параметры для бронежилетов.
В CoP некоторые модификации броников увеличивают скорость восстановления здоровья, энергии и т.д. В оригинале ТЧ есть пара уникальных костюмов, в которых даже прописан параметр health_restore_speed, но конечно же, он не работает. Добавить эти параметры очень просто: В CustomOutfit.cpp после:
Сразу хочу заметить, что если в конфиге будет отсутствовать один из новых параметров, его значение будет равным 0.0. Идем дальше. В файле CustomOutfit.h после:
Добавлено (03.02.2017, 15:57) --------------------------------------------- Назначение скриптам горячих клавиш, изменяемых в главном меню.
Думаю из названия всё понятно. Создадим кнопку, которую можно будет легко изменять в опциях, а при нажатии будет вызываться функция из скрипта. В файле: ActorInput.cpp после:
На самом деле я точно не уверен, что нужны все четыре инклуда, возможно в этом файле я прописывал инклуд для чего-то ещё. Но на всякий случай добавьте все четыре. Также, например после:
Код
case kCROUCH_TOGGLE: { g_bAutoClearCrouch = !g_bAutoClearCrouch; if (!g_bAutoClearCrouch) mstate_wishful |= mcCrouch;
}break;
Добавим:
Код
case kCLOCK: { luabind::functor<void> clock_key; if (ai().script_engine().functor("gz_items_hud.clock_key",clock_key)) clock_key(); }break;
Как видите у меня здесь кнопка показа часов. "gz_items_hud.clock_key" это как раз скрипт и функция, которые будут вызваны при нажатии кнопки. Теперь в файле key_binding_registrator_script.cpp в:
Если будете добавлять в самый конец, не забудьте убрать запятую после двойной скобки. Потом в файле: xr_level_controller.cpp добавим по аналогии с остальными:
Код
{ "clock", kCLOCK ,_sp},
Как я понял, _sp - работает в одиночной игре, _both в одиночной и мультиплеере, _mp - только в мультиплеере. Но это нужно проверять. Я мультиплеер не использую, стоит _sp и пускай себе стоит . Теперь в xr_level_controller.h добавим:
Код
kCLOCK,
к другим кнопкам. Кстати таким образом, если это необходимо, можно заменить какое-то движковое действие на скриптовое. Просто ищем case kНУЖНАЯ КНОПКА: и меняем "начинку" на свою.
Всё, в движке кнопка имеется, переходим к конфигам:
Файл u\ui_keybinding.xml добавим в нужную группу кнопок:
Если вы хотите чтобы по умолчанию кнопка была уже установлена, ищем файл default_controls.ltx в папке config оттуда берутся данные о том, какую кнопку на какое действие назначить при создании игрой файла user.ltx Просто пишем:
Код
bind clock kC
Функция в скрипте самая обычная:
Код
--//*** ЧАСЫ НА РУКЕ function clock_key() -- вызывается из движка при нажатии кнопки часов --действия при нажатии кнопки end
На этом всё. Правда я не проверял, что будет, если скрипта или функции не существует.
Добавлено (03.02.2017, 16:00) --------------------------------------------- Восстановление функции рождения артефактов при срабатывании аномалии. Автор: Bak
spawn_blowout_artefacts = on ; главный переключатель возможности рождения artefact_spawn_probability = 0.05 ;вероятность, что во время срабатывания аномалии будет рожден артефакт
; добавленные мной birth_on_death_probability = 0.2 ; вероятность рождения артефакта после смерти существа в аномалии birth_on_torn_probability = 0.5 ; вероятность рождения артефакта при разрыве тела в мясорубке
birth_on_nonalive = true ; возможность рождения при срабатывании на предмет birth_on_alive = true ; возможность рождения при срабатывании на живое существо birth_on_dead = true ; возможность рождения при срабатывании на труп
Вполне полезное руководство для тех, кто работает на платформе ТЧ. Сделал на этой основе итератор пояса для ЗП. Спасибо! з.ы.: по-хорошему, перебирающий предметы на поясе метод ещё надо бы прописать в lua_help.script
Сообщение отредактировал Suhar_ - Воскресенье, 26.02.2017, 14:53