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

Скриптование


Svoboда

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

Не подойдет. Что бы подошло, нужно после создания, ручками, назначить объекту story_id. А так, перебирать все объекты в цикле и встретив подходящую секцию, удалять и прерывать цикл. Самый простой вариант.

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


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

 

 

local sObj = alife():object("esc_wolf")

 

И чего? esc_wolf сидит в all.spawn, поэтому его можно достать по имени. А вот если ты его скриптово заспаунишь по секции, то имя у него будет не "esc_wolf", а какое-нибудь "esc_wolf12345".

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


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

Я бы посоветовал, всем, никогда не удалять из таблицы изнутри цикла по ipairs. Во избежание граблей. Очень, очень плохая практика. Да, я знаю, что я Капитан Очевидность.

  • Полезно 1

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


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

@Zander_driver, то, что там 6 строчек - это ничего не значит. Вот тот же trade_manager прекрасно может битый сейв сделать. Из свежих воспоминаний. Соляночный Седой на АТП. Из-за наличия легкого бреда в конфиге торговли, сейв с ним в онлайне получался битый.

Но уже полученный убитый сейв получается никак не оживить

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

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


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

гы, позиции нпс... Позиции нпс там используются, что бы не генерировать на их месте аномалии.

 

@CRAZY_STALKER666, выбираешь случайный левел вертекс. У него, соотв. методом, можно получить позицию, т.е. те самые координаты. Потом методом подбора находишь ближайший гейм вертекс. В процессе всего этого производишь проверки на неподходящие позиции/вертексы и игнорируешь их. И так до тех пор, пока не получится то, что можно использовать.

Изменено пользователем dsh
  • Спасибо 1
  • Полезно 1

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


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

@AndrewMor, вот тут вот https://github.com/dsh2dsh/op2ogse/blob/master/gamedata/scripts/dsh.script

см. функции GetLevelVertexes( level ) и GetGameVertexes( level ). Взято отсюда же. Выше есть примеры использования.

  • Полезно 1

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


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

@Romann, насколько я вижу, вот так это делается в ОП-2:

amk_mod.spawn_military_tech_pack(alife():create("vehicle_btr",vector():set(-163.66780090332,-0.20163251459599,-213.43978881836),73278,554),"vehicle_btr", "scripts\\ohota\\btr.ltx")

Вот сама spawn_military_tech_pack()

 

 

function spawn_military_tech_pack(obj, spawn_item, spawn_item_logic)    
        local packet = net_packet()
        obj:STATE_Write(packet)

        -- свойства cse_alife_object
        local game_vertex_id = packet:r_u16()
        local cse_alife_object__unk1_f32 = packet:r_float()
        local cse_alife_object__unk2_s32 = packet:r_s32()
        local level_vertex_id = packet:r_s32()
        local object_flags = packet:r_s32()
        local custom_data = packet:r_stringZ()
        local story_id = packet:r_s32()
        local cse_alife_object__unk3_s32 = packet:r_s32()

        -- свойства cse_visual
        local model_visual = packet:r_stringZ()
        local cse_visual__unk1_u8 = packet:r_u8()
        local motion_name
        if spawn_item == "helicopter" then
                -- свойства cse_motion
                motion_name = packet:r_stringZ()
        end

        -- свойства cse_ph_skeleton
        local skeleton_name = packet:r_stringZ()
        local cse_ph_skeleton__unk1_u8 = packet:r_u8()
        local cse_ph_skeleton__unk2_u16 = packet:r_u16()
        local health 
        local cse_alife_helicopter__unk1_sz 
        local engine_sound 
                
        if spawn_item == "helicopter" then
                -- свойства cse_alife_helicopter
                cse_alife_helicopter__unk1_sz = packet:r_stringZ()
                engine_sound = packet:r_stringZ()
        elseif  spawn_item == "vehicle_btr" then
                health = packet:r_float()
        end
        
        -- теперь заполняем нужнvе параметрv
        -- свойства cse_alife_object
        packet:w_begin(game_vertex_id)
        packet:w_float(cse_alife_object__unk1_f32)
        packet:w_s32(cse_alife_object__unk2_s32)
        packet:w_s32(level_vertex_id)
        object_flags = bit_not(5)       -- ~5 = 0xfffffffa
        packet:w_s32(object_flags)
        
        packet:w_stringZ("[logic]\ncfg = "..spawn_item_logic)
--[=[   if spawn_item == "helicopter" then
                packet:w_stringZ("[logic]\ncfg = "..spawn_item_logic)
        elseif  spawn_item == "vehicle_btr" then
                packet:w_stringZ("[logic]\ncfg = "..spawn_item_logic)
        end
]=]
        packet:w_s32(-1)
        packet:w_s32(cse_alife_object__unk3_s32)

        -- свойства cse_visual
        packet:w_stringZ(model_visual)
        packet:w_u8(cse_visual__unk1_u8)
        
        if spawn_item == "helicopter" then
                packet:w_stringZ(motion_name)           
        end 
        
        -- свойства cse_ph_skeleton
        skeleton_name = "idle"
        packet:w_stringZ(skeleton_name)
        packet:w_u8(cse_ph_skeleton__unk1_u8)
        packet:w_u16(cse_ph_skeleton__unk2_u16)

        if spawn_item == "helicopter" then
                -- свойства cse_alife_helicopter
                cse_alife_helicopter__unk1_sz = "idle"
                engine_sound = "alexmx\\helicopter"
                packet:w_stringZ(cse_alife_helicopter__unk1_sz)
                packet:w_stringZ(engine_sound)
        elseif  spawn_item == "vehicle_btr" then
                health = 1
                packet:w_float(health)
        end     
        -- считvваем скорректированнvе параметрv
        packet:r_seek(0)
        obj:STATE_Read(packet, packet:w_tell())
        
        return obj
end
 

 

 

  • Согласен 1

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


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

Честно говоря, я бы не советовал использовать вот ту spawn_military_tech_pack() в том виде, в каком оно есть. Потому, как <далее вырезано нецензурное>. Я бы посоветовал переписать ее с использованием существующих библиотек для работы с нетпакетами, от Артоса или Экстрим.

 

Хотя, положа руку на сердце, если мне самому вдруг понадобится заспаунить БТР, я воспользуюсь этой хренью. Но пообещаю себе, что позже точно-точно ее перепишу, честное пионерское. :)

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

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


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

UnLoaded, у меня доспаун патронов сделан в amk_offline_alife в process_trade, при net_spawn актора, пока все еще в оффлайне. Что бы не ходить по граблям онлайновых объектов. Там как раз каждый непись продал все лишнее оружие и у него осталось то, которое он будет использовать. Вот его можно и проверить, сколько патронов имеется, чем заряжено и т.п. и доспаунить нужное, подремонтировать поломанное.

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


Ссылка на сообщение
@TIGER_VLAD,мне в голову приходит только одна мысль. Я знаю, что звук шагов привязан к костюму. Полагаю, если сделать два одинаковых костюма и один из них сделать без звука шагов, то в нужный момент можно актора переодевать.
  • Спасибо 1

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


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

можно взять дальше

Можно, только жутко не удобная это штука. Если нужен вертекс на расстоянии, скажем, двух метров в определенном направлении, а в том направлении стена на расстоянии один метр, то получить вертекс за стеной не получится.

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


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

@losiara, вылет явно не из-за этой функции. Точнее, может и из-за нее, но только косвенно. Проблема явно в game_relations.ltx. Возможно, какая-то группировка там не указана.

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


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

@losiara, у меня нет исходников 1.0004, но думаю, этот код не менялся. Судя по вылету, что-то запросило информацию о группировке из строки communities, которой там нет. Т.е. в communities указано меньше группировок.

Изменено пользователем dsh
  • Спасибо 1

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


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

 

 

level.vertex_in_direction( npc_pos, dir, i )

 

Т.е. получается, что

level.vertex_in_direction( npc_pos, dir, 17 )

возвращает вертекс на расстоянии 229 метров? Чудеса.


 

 

lvid1 = level.vertex_in_direction( npc_pos, dir, i )

 

Только сейчас обратил внимание. Почему npc_pos? Тут нет ошибки? Разве первый параметр не должен быть вертекс, а не позиция?

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


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

 

 

Какой смысл задавать ему расстояния ?

 

Не понятно, что именно тебя удивляет? Насколько я понимаю, vertex_in_direction() возвращает самый ближний, валидный, вертекс к той точке, которая находится на запрашиваемом расстоянии от переданного вертекса и в указанном направлении. Если с разных исходных позиций - это значит передача первым параметром разных вертексов, то закономерно, что и результат возвращается разный. Или ты что-то другое имел ввиду?

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


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

 

 

Вот так и не понял: ближний к той, или ближний к этой.

 

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

 

 

 

получить который не ближе 10, но не дальше 20 метров оттуда, откуда смотрим

 

По идее, если запросить тот, который не дальше 20, то это будет именно то, что тебе нужно. А будет он, при этом, ближе 10 или дальше 10, уже зависит от наличия валидных вертексов на этом расстоянии.

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


Ссылка на сообщение
@Dennis_Chikin, а ты попробуй, пройдись циклом по всем вертексам, проверь какие из них accessible() для этого непися и сравни с тем, что тебе vertex_in_direction() возвращает.

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


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

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