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

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

Недавно такой вопрос уже задавался на форуме, но все-таки хотелось бы внести ясность в некоторые моменты:

 

В общем, проблема заключается в том, что при спавне нпс в деревне новичков (в моем случае 4 новых торговца), они сбегают со своих точек спавна и уходят в своем направлении или же сидят в лагере. Я прописывал и ремарк и волкер в их логике, но не помогало.

 

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

Ссылка на комментарий
Поделиться на других сайтах

@Rod_K Если нужно чтобы нпс заспавнились и стояли исключительно на своих точках, прописанных в Path_walk, то смотри в сторону Акима. 

Если я не ошибаюсь, то, чтобы он никуда не уходил, у него в логике прописан параметр smart_terrain = false или none, что-то такое, не вспомню точно. В общем параметр, не пускающий искомого НПС на другие работы. 

Если кто вспомнит точнее - пусть поправят меня

Ссылка на комментарий
Поделиться на других сайтах

33 минуты назад, _Sk8_AsTeR_ сказал(а):

у него в логике прописан параметр smart_terrain = false

Если непись спавнится с заранее заданным  в кастомдате смартом - то он и так никуда из этого смарта _сам_ не уйдет. В этом случае его логика определится логикой смарта.

Если непись спавнится как "свободный", с персональной логикой  - то чтобы его сразу при спавне не забрал какой-нибудь смарт, у него _ в кастомдате ( NB!  а не в логике ) должна быть секция:
[smart_terrains]
none = true

Это, конечно, для немодифицированных скриптов. В модифицированных схемах все может работать совсем иначе )
 

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

След от кругов на воде - это тоже след (с)

Ссылка на комментарий
Поделиться на других сайтах

Подскажите, пожалуйста, как можно с помощью скрипта переместить актора с одной локации на другую из диалога?

Ссылка на комментарий
Поделиться на других сайтах

@Rod_K Это можно подсмотреть в скриптах Guiders Mod (тами всего два скриптовых файла). Либо установи этот мод и, следуя инструкциям, сделай "проводником" кого-либо из НПС. Это актуально для ТЧ.

На двигле ОГСР всё проще, достаточно использовать консольную команду "jump_to_level".

 

Изменено пользователем mole venomous
Ссылка на комментарий
Поделиться на других сайтах

@AndreySol Движок X-Ray. Платформа ТЧ. Вообще хотелось бы полностью перенести механику из Солянки, где в самом начале нас перекидывают в пещеру и забирают все оружие. В силу своей неопытности, еще не разобрался как все устроено.

Ссылка на комментарий
Поделиться на других сайтах

@Rod_K если оригинальный движок, то заспаунь на позицию актор level_changer с нужными параметрами.

Ссылка на комментарий
Поделиться на других сайтах

@Rod_K 

Как уже посоветовал dsh, для оригинального движка - спавн на позиции актера LC, с требуемыми настройками.

Ссылка на комментарий
Поделиться на других сайтах

В дополнение к теме телепорта на другую локацию.

 

Значит я через acdc скомпилировал спавн, в который добавил новую локацию (пещера из солянки). Нужно сделать так, чтобы после диалога спавн происходил именно на этой локации (пещера). Сейчас имею ровно обратную картину: актор телепортируется на другую точку кордона, а все обьекты из локации "пещера" спавнятся на кордоне.

 

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

Ссылка на комментарий
Поделиться на других сайтах

@Rod_K Что бы не потрошить спаун, воспользуйся скриптовым ЛЧ. Если новая локация добавлена без косяков, всё отработает хорошо.

Под спойлером ф-ии спавна и удаления ЛЧ. Для примера - телепорт в комнату Бармена. Вызываешь спавн/удаление в удобных тебе местах.

Скрытый текст

-- Аргумент info для фикса телепортации Кордон-ТД
function start_level_changer(p_dest_pos, p_dest_lv, p_dest_gv, p_dest_level, info)

    -- Перед созданием ЛЧ выдём инфо, если необходимо
    if info ~= nil then
        if not has_alife_info(info) then 
            db.actor:give_info_portion(info) 
        end
    end

    local obj = alife():create("level_changer", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
    local packet = net_packet()
    obj:STATE_Write(packet)
    -- свойства cse_alife_object
    local game_vertex_id     = packet:r_u16()
    local distance           = packet:r_float()
    local direct_control     = packet:r_u32()
    local level_vertex_id    = packet:r_u32()
    local object_flags       = packet:r_u32()
    local custom_data        = packet:r_stringZ()
    local story_id           = packet:r_u32()
    local spawn_story_id     = packet:r_u32()
    -- свойства cse_shape
    local shape_count = packet:r_u8()
    for i = 1, shape_count do
        local shape_type = packet:r_u8()
        if shape_type == 0 then
            -- sphere
            local center = packet:r_vec3()
            local radius = packet:r_float()
        else
            -- box
            local axis_x                = packet:r_vec3()
            local axis_y                = packet:r_vec3()
            local axis_z                = packet:r_vec3()
            local offset                = packet:r_vec3()
        end
    end
    -- свойства cse_alife_space_restrictor
    local restrictor_type             = packet:r_u8()
    -- свойства cse_alife_level_changer
    local dest_game_vertex_id        = packet:r_u16()  
    local dest_level_vertex_id         = packet:r_u32()  
    local dest_position             = packet:r_vec3()
    local dest_direction             = packet:r_vec3()
    local dest_level_name             = packet:r_stringZ()
    local dest_graph_point             = packet:r_stringZ()
    local silent_mode                 = packet:r_u8()
 
    packet:w_begin(game_vertex_id)
    packet:w_float(distance)
    packet:w_u32(direct_control) 
    packet:w_u32(level_vertex_id)
    packet:w_u32( bit_not(193) )
    packet:w_stringZ(custom_data)
    packet:w_u32(46489)
    packet:w_u32(46489)
    packet:w_u8(1)
    packet:w_u8(0)
    packet:w_vec3(vector():set(0, 0, 0))
    packet:w_float(2)
    packet:w_u8(3)
    packet:w_u16(p_dest_gv)
    packet:w_u32(p_dest_lv)    
    packet:w_vec3(p_dest_pos)
    packet:w_vec3(vector():set(0, 0, 0))
    packet:w_stringZ(p_dest_level)
    packet:w_stringZ("start_actor_99")
    packet:w_u8(1)
    packet:r_seek(0)
    
    obj:STATE_Read(packet, packet:w_tell())
end

local disposition

function teleport_bar_vip_room() 
    disposition = vector():set(114.89195251465,-5.3071584701538,14.840103149414)
    if level.name()~="l05_bar" then
        start_level_changer(disposition, 33615, 1239, "l05_bar")
    else
        db.actor:set_actor_position(disposition)
    end    
end

function Del_LevelChanger()
  local LV = alife():story_object(46489)
    if LV then                                           
        alife():release(LV, true)                                     
    end
end

 

Изменено пользователем mole venomous
Ссылка на комментарий
Поделиться на других сайтах

Я в очередной раз напомню, что вот так, как в выше приведённом примере, делать не нужно. Не нужно закатывать солнце в ручную, нужно использовать m_netpk.

Ссылка на комментарий
Поделиться на других сайтах

Столкнулся со странной загадкой в плане кондишена оружия.

Пример: имеем у себя любое оружие - my_wpn.

Загружаем игру. СТРЕЛЯЕМ из него несколько раз, чтобы подпортить его кондишн.

Берём клиентский объект этого оружия (у примеру у нас автомат в слоте):

cl_wpn = db.actor:item_in_slot(inventory_slots.RIFLE)

Читаем кондишн:

cl_cond=cl_wpn:condition() -- получаем 0.80 (к примеру)

берём серверный объект:

s_wpn = server_object(cl_wpn:id())

вычисляем его кондишн:

local pk = m_netpk.get(s_wpn, 1)
local data = pk:get()
local s_cond=data.condition

получаем 0.81 (!)

ИМЕЕМ РАЗНИЦУ (доходит до ~ 0,15%).

То есть серверный объект имеет кондицию, как будто из него не стреляли.

Правим вручную серверную кондицию, приводя её к величине клиентской:

data.condition=cl_cond

pk:set(data)

Если теперь снова прочитать клиентскую и серверную кондиции, то они будут равны!

НО! Сохраняем игру и тут же загружаем. Читаем кондиции. И снова имеем эту разницу (уже не стреляя), 

КАК БУДТО МЫ НЕ МЕНЯЛИ СЕРВЕРНУЮ КОНДИЦИЮ!

 

Извините за многобукв, постарался попонятнее.

Кто-то может оъяснить, почему так происходит, и как это укротить (чтобы если я менял серверную кондицию, она реально менялась)?

Ссылка на комментарий
Поделиться на других сайтах

@phalcor если я не ошибаюсь, у тебя ОП-2.1, в котором собственный движок и исходников его нет. Кто знает, что они там наворотили.

Ссылка на комментарий
Поделиться на других сайтах

@dsh Да, именно ОП 2.1. Значит, как я понял, это именно её, опы, частная проблема, и на прочих платформах такого нет?

Ссылка на комментарий
Поделиться на других сайтах

@phalcor Дело в том, что движок передает (от клиентского объекта к серверному), и сохраняет в сейве состояние через апдейт пакет в сжатом виде (u8, то есть всего 256 позиций). Отсюда и погрешность.

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

Ссылка на комментарий
Поделиться на других сайтах

4 минуты назад, Bak сказал(а):

В качестве решения можно завести собственный скриптовый метод сохранения состояния.

Ну да, сделал я скриптовые костылики: при сохранении формирую табличку кондиций оружия актора, а при load - применяю её. Или есть способ элегантней?

Ссылка на комментарий
Поделиться на других сайтах

19 минут назад, phalcor сказал(а):

есть способ элегантней?

Более элегантные способы как правило требуют исходников движка. Но они конечно есть..

Мод, где не бывает одинаковых путей - Судьба Зоны.

Что вы говорите, этого никто никогда не делал!? Что вы говорите, это невозможно!? ... Я берусь.

29.07.2021 в 22:28, GYN ZAN сказал:

не стоит помогать людям, которые в ответ на помощь только желчью плюются

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...