DukeKAn, всячески поддерживаю касательно стрима. Пожалуй, понять основы для новичков - крайне важно. Даже если они не станут скриптерами, "для общего развития" было бы полезно.
ЦитатаScriptMaker ()
в таком случае не вижу смысла вообще человеку лезть в скрипты.
я в таком случае не вижу смысла вообще человеку лезть в скрипты. Метод тыка - плохой метод.
Не совсем понял, где я говорил про метод тыка. Я говорил о том, что С и С++ - вовсе не обязательны для скриптера под сталкер.
ЦитатаBozKurt ()
Метод create возвращает серверный объект, а клиентский становится доступен только на следующем апдейте. Колбек client_spawn_manager срабатывает как раз тогда, когда клиентский объект становится доступен.
Вот, это ответ по делу. Я это упустил, и был не прав. Собственно, для того и нужен стрим, а не просто видео - чтобы было обсуждение, и найден правильный подход. А 52 пост - не мой, я пока стараюсь не писать статьи в таком стиле. 6poHR777, Если нужно конкретно под сталкер проверить скрипты - Яндекс Диск
FantomICW, Буду рад видеть. Хотя народ пока собирается посильнее меня :-)
DukeKAn, поправочка про "конкретно под сталкер проверить скрипты" - там проверяется только синтаксис, как дебаг-программа она не подходит. Если так дело пошло, то я рекомендую вот этот плагин для Notepad++: https://yadi.sk/d/Y9QrLgdLayqPD (в архиве есть небольшая документация по плагину).
BozKurt, а так же все остальные. Тут возник вопрос. А скрипты на ТЧ-06 могут не срабатывать, именно из-за бинов или их правки? Просто столкнулся со своей старой проблематикой, то, что на 04 работало, на 06 никак не работает. Прошу тапками не закидывать, если я что-то пропустил. Суть проблемы такая: Есть предмет, при его использовании должен сработать скрипт, коллбэки и функция в бинд_сталкер.скрипт есть, но, но при использовании предмета он просто съедается, при этом ничего не происходит. Сама та функция, которую вызываю, она работает, через диалог проверил. В чем может быть загвоздка?
Сообщение отредактировал 6poHR777 - Понедельник, 05.01.2015, 14:01
6poHR777, к сожалению, я не обладаю экстрасенсорными способностями, подозреваю, что и остальные форумчане тоже. Поэтому без кода, что и где прописывал, решить проблему будет маловероятным.
6poHR777, тогда две возможные причины: 1. Имя секции используемого предмета не "shompol"; 2. Функция wp_items.action_shompol() всё же работает не так как нужно. С колбеком всё в порядке, т.к. я его же использовал в моде Medicine на шестом патче и проблем не было.
local apos = db.actor:position() for obj_id,_ in pairs (db.storage)do local obj = level.object_by_id(obj_id) if obj and (IsStalker(obj) or IsMonster(obj)) and obj:alive() and obj:relation(db.actor) == game_object.enemy and obj:position():distance_to(apos)<30 then send_tip("Нельзя использовать шомпол, когда опасность слишком близко.") return end end
repair_item_in_slot(1) repair_item_in_slot(2) end
function repair_item_in_slot(num) local item = db.actor:item_in_slot(num) if item then local cond = item:condition() if cond < 0.4 then send_tip("%c[255,255,0,0]Чистка невозможна: оружие "..num.. " сильно повреждено.") elseif cond > 0.90 then send_tip("%c[255,255,0,0]Чистка невозможна: %c[255,0,255,0]оружие в слоте "..num.. " в отличном состоянии.") else item:set_condition(1) send_tip("%c[255,0,255,0]Чистка оружия в слоте "..num.. " завершена.") end else send_tip("%c[255,255,0,0]В слоте "..num.." нет предмета для чистки.") end end
function send_tip(news_text) db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(0,517,83,47), 1000, 5000) end
6poHR777, извини, но здесь для меня тупик. Либо я чего-то не замечаю, либо проблема глобальнее, например завис биндер. Если "папка бинов" - это скомпилированные библиотеки из исходников, то проблем быть не должно, если сам чего не напортачил.
Сегодня разберём вертолёт. Отличие от предыдущих уроков - этот писался под ЗП.
Скачать прокомментированные скрипты вертолёта от ЗП можно здесь: Яндекс Диск
Общее представление:
Прежде всего стоит отметить, что вертолёты в аддонах S.T.A.L.K.E.R несут чисто сюжетную роль. Это отразилось в подходах к его проектированию, и влечёт несколько проблем при попытке использования его как геймплейного элемента. Так, во всех аддонах за его полёт отвечают пути в all.spawn'е (т.е. при распаковке all.spawn это файлы, начинающиеся с way_).
Сразу можно увидеть, что логика пишется по тем же правилам, что и для НПС. Отличия - задаваемые аргументы, вроде engine_sound = false/true.
Здесь можно увидеть список аргументов и их возможных значений:
max_velocity = 10; максимальная скорость enemy = "all" ; противники - всё что движется = "74" ; sid противника = "actor" ; игрок = "nil" ; никто
max_mgun_attack_dist = 10 ; максимальная дистанция использования пулемёта max_rocket_attack_dist = 10 ; максимальная дистанция использования ракет min_mgun_attack_dist = 10 ; минимальная дистанция использования пулемёта min_rocket_attack_dist = 10 ; минимальная дистанция использования пулемёта use_rocket = true ; использовать ракеты или нет use_mgun = false ; использовать пулемёты или нет engine_sound = true ; шуметь двигателем или нет upd_vis` = 10 ; время промежутка апдейта противников 10*1000 мил.сек stop_fire = true ; остановить огонь show_health = false ; показывать ли полоску здоровья fire_trail = true ; хвост ракеты? invulnerable = true ; неуязвимость immortal = false ; бессмертие mute = false ; бесшумность
Для спавна вертолёта обычно используется следующая тактика: вертолёт спавнится где-то за пределами локации, а в логике - бесшумность. По некоему условию вертолёту возвращается звук, полоска здоровья и пр. и посылается по путям в необходимое место.
Спавнится вертолёт в SDK, или можно распаковкой all.spawn и вписывая следующее:
Код
[20175]
; cse_abstract properties section_name = helicopter name = zat_heli_1 position = -67.3565368652344, 20.4709529876709, 763.51025390625 direction = 0, 0, 0 id = 65535 version = 128 script_version = 12 spawn_id = 1866
где models\zat_helicopter.ltx - путь к файлу с логикой в папке configs.
В большей части случаев этого достаточно, и править скрипты не приходится. Для тех, кому интересны сами скрипты - добро пожаловать под кат:
Сначала о самом вертолёте. Под вертолёт выделен отдельный класс, что явление довольно редкое в сталкере, называется он CHelicopter и наследуется от CGameObject. Для получения объекта этого класса нужно у game_object вертолёта вызвать метод get_helicopter(). В lua_help можно увидеть список методов и полей этого класса, но я продублирую его здесь:
function SetEnemy(game_object*); function SetEnemy(vector*);
function getEnabled() const;
function GetfHealth() const;
function Explode();
function SetOnPointRangeDist(number);
function SetFireTrailLength(number);
function GetOnPointRangeDist();
function GetMaxVelocity();
function TurnLighting(boolean);
function SetBarrelDirTolerance(number);
function GetBodyState();
function GetCurrVelocityVec();
function net_Export(net_packet&);
function SetDestPosition(vector*);
function UseFireTrail(); function UseFireTrail(boolean);
function GoPatrolByRoundPath(vector, number, boolean);
function net_Spawn(cse_abstract*);
function GetState();
function Die();
function StartFlame();
function Visual() const;
function GetDistanceToDestPosition();
function GetHuntState();
function TurnEngineSound(boolean);
function GetSafeAltitude();
function ClearEnemy();
function use(CGameObject*);
Можно видеть, что есть методы получения здоровья, скорости, высоты и пр., что весьма удобно, поэтому для скриптового управления хеликоптером используется именно этот класс.
Так как вертолёт - машина сложная, винтокрылая, под его управление было выделено целых 7 скриптов. bind_heli.script heli_combat.script heli_fire.script heli_fly.script heli_look.script heli_move.script heli_snd.script
В первую очередь, поговорим о самом биндере - bind_heli.script. Если не знаете, что это такое - вот здесь шпорка ap-pro.ru Комментарии к коду есть в первой ссылке в начале поста.
Биндер выполняет свою прямую функцию - занесение/затирание в таблицах онлайн объектов, регистрация функций для вызова по хиту и пр. + служебные функции получения здоровья, умирания и пр. Код довольно простой, да и нагрузки не несёт.
heli_move.script. Вот этот скрипт я бы назвал управляющим вертолётом. Во первых, в самом конце есть метод set_scheme(). В нём и происходит считывание данных из логики - т.е. использовать ли звук двигателя, кто враг и пр. Он же и служит подсказкой, какие параметры используются в логике, и какого они типа.
Следующий метод - heli_move:reset_scheme( loading ) Срабатывает он при переключении схемы. Как я понимаю, loading == true, если произошла перезагрузка, и loading == false если просто переключилась схема. Довольно много кода, но из интересного - именно здесь происходит установка "логического" врага в скрипт heli_fire.script:
Код
self.heli_fire.enemy_ = self.a.enemy_
Здесь, кстати говоря, скрывается ошибка, из-за которой может пропасть полоска здоровья после перезагрузки. Блок кода, ответственный за это - должен выполняться в любом случае, а не только при переключении схемы. Поэтому
Код
if self.a.show_health then self.heli_fire:cs_remove() self.heli_fire.show_health = true self.heli_fire:cs_heli() else self.heli_fire.show_health = false self.heli_fire:cs_remove() end
лучше перенести в самый конец этого метода, перед закрывающим end.
В методе heli_move:update( delta ) происходит обновление своих целей полёта, точек куда смотреть. Здесь же вызываются специальные методы из heli_look и heli_fly.
Следующий интересный скрипт - heli_fire.script. Ответственен он за установку врага объекту вертолёта. Метод heli_fire:update_enemy_state() - вызывается из heli_move.script. Служит он для того, чтобы в зависимости от выставленного врага в логике, наличия в данный момент врага или необходимости обновиться - "сканирует" врагов и вызывает метод установки врага.
В методе heli_fire:set_enemy() происходит уже наконец финальная запись врага вертолёту heli:SetEnemy( self.enemy), где heli - объект CHelicopter.
Именно с этого момента вертолёт будет атаковать врага.
Метод heli_fire:update_enemy_arr() вызывается, если в логике выставлено: enemy = all. Так как вертолёту можно установить только одного врага, то именно здесь из всего множество возможных противников выбирается ближайший.
Скрипты heli_look, heli_fly, heli_snd - узкоспециализированные и выполняют функцию, прямо заложенную в названии. Кроме расчётов особо интересного в них ничего нет.
Скрипт heli_combat - загадка (хотя по названию должен управлять боёвкой). Единственный вызов его из других скриптов - для сохранения/чтения данных. Даже установка врага закомментирована. Жду дополнений по его роли:)
В заключении, несколько слов о сложностях скриптового управления вертолётом. В первых, он легко проходит сквозь землю. Метод получения высоты - не особо помогает, т.к. часто не хватает скорости для подъёма, да и под мостами тоже тяжело. Во вторых - сюжетная направленность. Скорее декорация, чем реально проработанный объект. В общем, как с транспортом. Хотя, для катсцен и небольшой сложности сюжета - вполне подходит.
Сообщение отредактировал DukeKAn - Пятница, 06.02.2015, 12:27