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

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

Друзья, подскажите что написать на проверку визуала НПС, именно визуала, а не надетого костюма. Пример: если визуал green_stalker1(модель, а не текстура), то нпс не выполняет определённые действия. Я не соображу как сделать проверку по визуалу.

Изменено пользователем Snork 163
Ссылка на комментарий

local pk = net_packet()

obj:STATE_Write( pk )

pk:r_seek( 0 )

pk:r_s32() -- money

pk:r_stringZ() -- profile

pk:r_s32() -- infammo

pk:r_stringZ() -- class

pk:r_s32() -- communityid

pk:r_s32() -- rank

pk:r_s32() -- reputation

pk:r_stringZ() -- charname

pk:r_u16() -- gvid

pk:r_float() -- obf32u1

pk:r_s32() -- obs32u2

pk:r_s32() -- lvid

pk:r_s32() -- oflags

pk:r_stringZ() -- custom

pk:r_s32() -- sid

pk:r_s32() -- obs32u3

local vis = pk:r_stringZ()

Ссылка на комментарий

@Старлей, кэп намекает на сталкера, если конкретно, то в данном примере три класса, cse_alife_trader_abstract, cse_alife_object, и, собственно нужный нам - cse_visual.

Ссылка на комментарий

Я предполагал, что это сталкер... Тогда вопрос в другом: откуда именно такой выбор типов переменных, под значения?(например pk:r_s32() -- money, почему s32?)

 

Разве не такая структура?

--========== cse_alife_trader_abstract ==========

local money              = packet:r_u32()
local specific_character = packet:r_stringZ()
local trader_flags       = packet:r_h32()
local character_profile  = packet:r_stringZ()
local community_index    = packet:r_h32()
local rank               = packet:r_h32()
local reputation         = packet:r_h32()
local character_name     = packet:r_stringZ()

--========== 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_h32()
local custom_data     = packet:r_stringZ()
local story_id        = packet:r_s32()
local spawn_story_id  = packet:r_s32()

--========== cse_visual ==========

local visual_name  = packet:r_stringZ()

А главный вопрос, вот в чем: в самом начале у Dennis_Chikin signed int, а у меня в этой штуковине(из acdc) unsigned int. По идее байты из пакета считаются одинаково и ошибки никакой не будет. А что если при считывании у money будет значение выходящее из диапазона s32, но входящее в u32?

 

К чему я это - получается можно читать пакеты, зная только кол-во байт под какую переменную определенно, а уж signed/unsigned нужно только, если работать с этими значениями?

 

P.S. Код выше, из NetPacketCreator, и я сам то еще не пойму, что такое r_h32()?!

 

 

Ссылка на комментарий

Со знаком/без знака - в данном случае, скорее всего, без разницы.

 

Читать, кстати, можно вообще сразу нужную переменную, если знать позицию.

Ссылка на комментарий

r_h32()

Опечатка, такого нету. По крайней мере судя по документации, сам не проверял.

а у меня в этой штуковине(из acdc) 

unsigned int

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

К чему я это - получается можно читать пакеты, зная только кол-во байт под какую переменную определенно, а уж signed/unsigned нужно только, если работать с этими значениями?

Если я правильно понял вопрос, то да.

Читать, кстати, можно вообще сразу нужную переменную, если знать позицию.

В случае с визуалом сталкера, получение конкретно этого параметра будет весьма кривым кодом. Не уверен что работает, вот набросал:

 

 

function GetVisual(obj)
local packet = net_packet()
local se_obj = alife():object(obj:id())
se_obj.STATE_Write(se_obj, packet)
packet:r_advance(4)
packet:r_stringZ()
packet:r_advance(4)
packet:r_stringZ()
packet:r_advance(12)
packet:r_stringZ()
packet:r_advance(18)
packet:r_stringZ()
packet:r_advance(8)
return packet:r_stringZ()
end

 

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

Изменено пользователем Карлан
Ссылка на комментарий

@Wlad777, не уверен, но можно попробовать заспавнить объект на основе physic_object или, если угодно, O_PHYS_S, и указать ему кость фиксации в стейт части (fixed_bones называется, тип - строка). 

Ссылка на комментарий

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


Разобрался, вдруг кому будет нужно. Сделал я это так:

 

1.Регистрируем новую инфопорцию:

 

        <info_portion id="Имя инфопорции">
        <action>Скрипт.Название_функции</action>
        </info_portion>

При получении этой инфопорции срабатывает функция через скрипт.

2.В рестрикторе указываем такую логику:

 

[logic]
active = sr_idle
 
[sr_idle]
on_actor_inside = %+Имя инфопорции%
END
 

3.Создаем скрипт с фунцией:

 

function Название_фунции(actor, npc)
news_manager.send_tip(actor, "%c[255,255,128,128] Текст сообщения %c[default]", nil, "stalker", nil, 30000)
end

 


Единственный вопрос,  

    xr_sound.set_sound_play(npc, "rostok_kruglov_help_6")  -- выдает вылет, если используется функция через рестриктор, через диалог все работает, как быть? Я так понял, что здесь указано npc ( как отправитель сообщения со звуком, как указать для регистра?

Ссылка на комментарий

@Карлан,спасибо) 


Вылет
 

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...games\s.t.a.l.k.e.r\gamedata\scripts\xr_sound.script:17: attempt to index field '?' (a nil value)
Ссылка на комментарий

Для этого непися что-то должно быть в звуковом конфиге. ;) Имеющее отношение к звуковым файлам по соответствующему пути.

Ссылка на комментарий

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

Ссылка на комментарий

@demon96http://www.amk-team.ru/forum/index.php?showtopic=7450&p=258470 здесь и http://www.amk-team.ru/forum/index.php?showtopic=7450&p=472142 здесь конкретно получишь ответ на "при загрузке игры", а уж "определенные действия" извини, не угадаем.

 

@Wlad777, еще тебе подкину один метод, в классе physics_element есть метод fix(), намертво фиксирует гейм объект по указанной кости. Получать кость можно например методом get_element_by_bone_id, но для того, чтобы не путатся, лучше использовать get_element_by_bone_name. Замечу, что при перезагрузке фиксация так скажем теряется, так что нужно "перефиксировать" объект каждый раз при перезагрузке... В целом лучше конечно нет-пакет юзать, но я так, может кому надо будет.

 

Вот можешь попробовать:

 

function FixObj(Obj)
    local oObj
    if type(Obj) == 'userdata' then oObj = Obj end
    if type(Obj) == 'number' then oObj = level.object_by_id(Obj) end
    if oObj then
	local GetPhysShell = oObj:get_physics_shell()
        if  GetPhysShell then 
	    local sElement = GetPhysShell:get_element_by_bone_name("link")
            if sElement and (not sElement:is_fixed()) then 
		sElement:fix()
             end
         end
    end
end
Изменено пользователем Карлан
Ссылка на комментарий

 В целом лучше конечно нет-пакет юзать, но я так, может кому надо будет.

 

Я через нетпакет сделал. Для моих целей (подспавн небольшого кол-ва предметов по ходу сюжета, для более реалистичной "жизни Зоны") хватает абсолютно.

---------------------------------

www.amk-zone.de

Ссылка на комментарий

Люди, всем привет, такая проблема: я создал сталкера снайпера, всё в норме, но когда я с ним поговорю, отхожу далеко, то он не хочет становится в прежнюю анимацию, просто стоит, потирает ладони. Вопрос: как это исправить? Делал через all.spawn

;SNIPER ADDON


;Меченый(Стрелок)
[logic]
active = remark@search

[remark@fire]
combat_ignore_cond = {!is_enemy_actor}
radius = 0
anim = hide
on_info = {=health_le(0.5)} remark@search
wounded = wounded@work
sniper = true
[smart_terrains]
none = true
[remark@search]
combat_ignore_cond = true
combat_ignore_keep_when_attacked = false
anim = hide
target = actor
on_info = {=see_actor} remark@fire
wounded = wounded@work

[wounded@work]
hp_state = 0|wounded_heavy@help_heavy
hp_state_see = 0|wounded_heavy@help_heavy
hp_victim = 0|nil
hp_fight = 0|false
hp_cover = 0|false

 

@nikita_nz1986, Вопрос исчерпан.

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

nikita_nz1986.gif
9JX0t72.jpg
XqgE6.png

Ссылка на комментарий

Ребята, подскажите, как вызвать удар в морду через диалог? А то я прописываю: <action>dialogs.punch</action> и ловлю вылет (система ругается на скрипт).


@nikita_nz1986, cделай так:

[logic]

active = camper@search

[remark@fire]

anim = hide_fire

target = actor

combat_ignore_cond = true
wounded = wounded@work

 

[camper@search]

path_walk =1_walk

path_look = 1_look

combat_ignore_cond = true
on_actor_dist_le = 5| remark@fire
wounded = wounded@work

def_state_standing = hide

 

[wounded@work]
hp_state = 0|wounded_heavy@help_heavy
hp_state_see = 0|wounded_heavy@help_heavy
hp_victim = 0|nil
hp_fight = 0|false
hp_cover = 0|false

 

[smart_terrains]

none = true

 

 

Не забудь прописать точки "1_walk" и "1_look". Тогда по умолчанию твой НПС будет стоять и целиться в заданную точку, при приближении ГГ на 5 метров, он начнёт целиться в него, а если ГГ - враг, то начнёт стрелять. А с юзанием всё будет в порядке.

Пишу мод с неповторимым сюжетом.

Нужны "модельеры"

Заинтересованным писать в ЛС

J.A.A..gif

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

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

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