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

Справочник по функциям и классам


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

Подскажите насчёт серверных объектов...

 

Что вызывается чаще - cse_alife_*:update() или cse_alife_*:can_switch_*() ?

Полтергейст,

update у серверных классов по-моему вообще не работает. По крайней мере нет ни одного примера их использования. can_switch_* вызывается вроде раз в секунду.

 

По крайней мере нет ни одного примера их использования.

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

load(string) -- загрузить конфигурацию задачи из файла config\gameplay\game_tasks.xml

....

string get_id() -- даёт строку-идентификатор задачи. Это атрибут id из тега game_task в XML

-- если не был выполнен метод load или не была добавлена хоть одна подзадача, то вернёт nil

...

 

Как выполнить метод load, если квест скриптовый? Из-за не выполнения метода load при выдаче квеста игра велетает, потому что get_id(), использующийся при выводе сообщения о новом квесте, дает nil.

 

Удалите вот этот мой пост.

 

 

Полтергейст,

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

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

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

2. Это может быть информационный метод, который на самом деле возвращает какое-то значение. Какое и зачем - неясно. В пользу этого может говорить отсутствие аргумента. Опять же есть два варианта - надо или не надо его перегружать. Т.е. это чисто внутренняя информация или предоставление скриптёру возможность что-то сказать, наподобие тех же can_switch ?

 

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

 

Stalk15,

Как выполнить метод load, если квест скриптовый?

Там же есть в статье пример. Вот он:

local new_task = CGameTask()

new_task:load("gar_car_graveyard_quest") -- задание "Предложить помощь Бесу"

Чего же более?

 

И по поводу примеров вообще. Я с самого начала ещё в первом посте обозначил, что тема для коллективного творчества. Будут постить сюда примеры - будут примеры. Не будут - "извиняйте хлопцы, бананов нема".

malandrinus

new_task:load("gar_car_graveyard_quest")

Так это же загрузка уже существующего квеста. А ведь в скриптах делается новый квест, всеравно загружать существующий нужно?

Как я понял, загружается квест из конфигов, а далее в скриптами можно его менять, так?

 

Пример уже могу привести, работает в плоть до выполнения всего квеста, но одна проблема:После выполнения квеста(всех подзадач) он не изчезает из ПДА, хотя все подзадачи уже подмечены, как выполненые:

function _on_task_()
local task = CGameTask()
  task:load("teee")    --teee - это "пустой" квест из конфигов
  task:set_title("Title")
     objective = SGameTaskObjective(task,1)
        objective:set_description("Description_1")
        objective:add_complete_func("sript.funct")
        task:add_objective(objective)

        objective = SGameTaskObjective(task,1)
        objective:set_description("Description_2")
        objective:add_complete_func("sript.funct")        
        task:add_objective(objective)    
    db.actor:give_task(task, 3600*22000, false)    
end

 

Почему квест не изчезает после выполнения - непонятно, но зато ратотает=)

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

Stalk15,

local task = CGameTask()

task:load("teee") --teee - это "пустой" квест из конфигов

...

objective = SGameTaskObjective(task,1)

...

Почему квест не изчезает после выполнения - непонятно, но зато ратотает=)

Ты берёшь из задания-заготовки подзадачу 1. Потом меняешь его и добавляешь в тоже задание. Но выходит, что там остаётся холостая подзадача с номером 1. А у этой подзадачи есть условие окончания? Может в этом причина? Думается мне, новое задание лучше сделать отдельное чистое. Для него то есть дефолтовый конструктор.

Я скриптаи меняю этот квест:

    <game_task id="teee">
    <objective>
    <icon>ui_iconsTotal_find_item</icon>
    </objective>
</game_task>

 

Условий нет, но они ведь добавляются в скрипте.

А что за дефлотовый конструктор?

Квест удалось выполнить, чтоб он изчез из ПДА, только тогда, когда я после выпонения последней подзадачи сменил статус квеста на completed. Если этот квест взять еще раз, то он уже не изчезнет из ПДА ни при каких условиях.

Stalk15,

ну вот смотри:

local task = CGameTask() -- создал пустую задачу

task:load("teee") --teee - это "пустой" квест из конфигов -- не пустой!!! там есть одна подзадача

objective = SGameTaskObjective(task,1) -- и вот её ты получаешь в этой строке

-- меняешь свойства

task:add_objective(objective) -- и добавляешь обратно, но уже второй, третьей и т.д.

 

Я думаю, что это может объяснять происходящее. Возможно, стоит сделать так:

 

local task = CGameTask()

task:load("teee")

objective = SGameTaskObjective(task,1)

local new_task = CGameTask()

new_task:add_objective(objective)

 

это просто в качестве предположения. Мне сейчас не проверить.

 

 

Добавлено через 22 мин.:

Насчёт метода update серверных классов. Вот что выяснил. Это метод, который надо вызывать скриптами и это вызывает обновление разных вещей внутри объекта. Т.е. неправильными были оба моих ранее высказанных предположения. Если конкретнее. Для монстров и сталкеров вызов этого метода приводит к обновлению оффлайнового планировщика, что вообще-то можно сделать и непосредственно. Планировщик это который brain, есть там такие классы. Открытым остаётся вопрос о его (оффлайнового планировшика) работоспособности вообще. Тут ничего не могу сказать. Для всех остальных классов (смарты и online_offline_group кажется) метод update не делает вообще ничего.

malandrinus

Не. неполучается. После этого при выдче квеста - вылет - не может вывести сообщение с названием квеста(титл).Set_title не срабатывает. Вообщем, есть небольшой прогресс в скриптовом квесте. Теперь при выполнении последнего подзадания стало появлятся сообщение, что квест выполнен, но квест назойливый, и из ПДА все же не хочет изчезать:

function _on_task_()
local task = CGameTask()
  task:load("teee")
  
    local oo = task:get_objective(0)
    oo:set_article_id("descr_bar_resque_information_2")
  
  task:set_title(Title)
     local objective = SGameTaskObjective(task,1)
     
     
        objective:set_description("Description_1")
        objective:add_complete_func("CompleteFuncObjectiv1")
        task:add_objective(objective)

        objective = SGameTaskObjective(task,0)
        objective:set_description(""Description_2"")
        objective:add_complete_func("CompleteFuncObjectiv2")        
        task:add_objective(objective)
        
    db.actor:give_task(task, 3600*22000, false)
    
end

 

Вот теперь и в правду непонятки, сообщение "Задание выполнено" есть, а квест в ПДА сидит.

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

Хотел уточнить: класс CUIStatic действительно не поддерживает вывод анимированных текстур (в формате ogm) ?

Попробовал создать экземпляр статика с ogm и вывести на худ (через AddDialogToRender()) свою видеоанимацию - вылетел(ругалась какая то движковая функция связанная с кодеком theora ).

Решил попробовать тоже самое сделать с дефолтным ogm - ui\ui_mm_fire (вдруг мое видео нечитабельным было для сталка) - тоже вылетел, правда лог другой был (малоинформативный поэтому не привожу).

 

Насчет CUIStatic я был неправ- он то как раз позволяет использовать анимированные текстуры\видео. Но если вывести их в скриптовое окно проблем нет, то вот на худ - непонятно как - использование AddDialogToRender() приводит к вылету.

 

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

Garry_Galler,

использование AddDialogToRender() приводит к вылету.

А ссылку на окно сохраняешь? Там есть залипон, что если не сохранить ссылку на добавленное таким образом окно, то его приберёт сборщик мусора, и сразу за этим будет вылет.

 

Добавлено через 31 мин.:

Stalk15,

Не. неполучается. После этого при выдче квеста - вылет - не может вывести сообщение с названием квеста(титл).Set_title не срабатывает.

Да вообще-то работает. Заголовок устанавливается, задание выдаётся.

Для справки, нарыл тут, что в CGameTask есть ещё несколько методов, не показанных в lua_help. Это:

set_id

set_priority

get_priority

у SGameTaskObjective также имеется кроме недокументированный метод set_icon_name.

 

Кроме того, при выдаче задания надо наверное обращать внимание на третий логический аргумент функции give_task. Он отвечает за проверку наличия задачи с таким же идентификатором. Поскольку дефолтовый идентификатор всегда одинаковый, то если этот аргумент false - задача будет выдана повторно. Но всё ли при этом исправно сработает - не знаю. Возможно имеет смысл менять идентификатор задачи с помощью set_id.

malandrinus

В точку. Спасибо за подсказку.

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

Вынес ссылку во внешку - все появилось(использовал для теста видео из игры). Теперь еще осталось разобраться с моим видео, которое сталкер воспроизводить не хочет - конвертил из avi в ogv прогой ffmpeg2theora, расширение сменил на ogm - но вылетает зараза - видимо что то с форматом не то. <_<

[spoiler=вот лог -думаю мало кому знакомый ;) ]stack trace:

 

001B:004AF4B9 XR_3DA.exe, CPerlinNoise3D::Get()

001B:0047BE38 XR_3DA.exe, CTheoraSurface::Update()

001B:0048CB15 XR_3DA.exe, CTexture::apply_theora()

 

 

 

PS: Да, вот еще - для расширения так как сказать кругозора - почему игра(компилятор) не видит уже скомпилированный скриптовый файл?

Ради теста решил скомпилировать свой игровой скрипт в SCITE - положил потом в в папку script, расширение .script - так не видит в упор, как будто его там и нет вовсе.

Изменено пользователем Garry_Galler
  • Полезно 1
online_offline_group

Разве этот класс вообще используется в ТЧ?

Полтергейст,

Разве этот класс вообще используется в ТЧ?

скажем так, он там есть. Хотя похоже какой-то недоделанный. В ЗП кстати его update уже что-то делает. Это вроде класс для управления отрядами, но подробностей я не знаю.

 

Добавлено через 8 мин.:

Garry_Galler,

насчёт видео - это лучше в тему про SDK или в ковырялку. Я этим вообще не занимался никогда.

почему игра(компилятор) не видит уже скомпилированный скриптовый файл?

Помнится, когда я первый раз узнал про Lua и почитал мануал, то проделал точно такой же эксперимент =) Дело было кажется года так два или три назад. Признаться, до сих точного ответа не знаю. Вероятно, это так из-за компилятора JIT. Это же фактически альтернативная реализация Lua. Там не обязательно должно быть всё как в "настоящем".

Где у меня ошибка со скриптовым постэффектом? Метод process не вызывается почему-то.

Вот вызов:

local ppe=recovery_effect(max_restored_health-db.actor.health)
ppe:start()

Вот сам класс:

-- Постэффект
class "recovery_effect" (effector)
function recovery_effect:__init(add_health) super()
    self.params = effector_params()
    self.params.blur=0
    self.params.gray=0
    self.params.dual=duality(0,0)
    self.params.noise=noise(0,0,0)
    self.params.color_add=color(0,0,0)
    self.params.color_base=color(0,0,0)
    self.params.color_gray=color(0,0,0)
    
    self.max_add=add_health                                    -- Максимальная яркость
    self.time_start=time_global()                            -- Время начала
    self.time_in=self.time_start+add_health*1.5*1000        -- Время максимального осветления
    self.time_white_scr=self.time_in+add_health*2.5*1000    -- Время начала сброса осветления
    self.time_out=self.time_white_scr+add_health*0.75*1000    -- Время конца
    
    self.time_start_in=self.time_in-self.time_start
    self.time_white_scr_out=self.time_out-self.time_white_scr
    self.pi2=math.pi/2
end

function recovery_effect:process(pp)
    local time=time_global()
    msg("!")
    if time<self.time_in then
        local color_add_cur=self.max_add*math.cos(self.pi2*(self.time_in-time)/self.time_start_in)
        self.params.color_base=color(color_add_cur,color_add_cur,color_add_cur)
    elseif time<self.time_white_scr then
        self.params.color_base=colol(self.max_add,self.max_add,self.max_add)
    elseif time<self.time_out then
        local color_add_cur=self.max_add*math.sin(self.pi2*(self.time_out-time)/(self.time_white_scr_out))
        self.params.color_base=color(color_add_cur,color_add_cur,color_add_cur)
    end
    effector.process(self,pp)
    pp:assign(self.params)
    return true
end

function recovery_effect:finished()
    return self.time_out<time_global()
end

 

 

Где найти соответствие имен костей и номеров костей?

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

IQDDD,

а при чём здесь справочник?

 

Я смотрел кости с помощью OGF Master. Там модель конвертилась в текстовый формат, и в начале файла шёл список костей. Ещё наверное в SDK можно посмотреть.

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

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

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

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

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

Войти

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

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

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

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