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

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

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

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

 

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

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

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

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

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

За возможность перехода в онлайн/оффлайн.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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

Ссылка на комментарий
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") -- задание "Предложить помощь Бесу"

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

 

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

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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. А у этой подзадачи есть условие окончания? Может в этом причина? Думается мне, новое задание лучше сделать отдельное чистое. Для него то есть дефолтовый конструктор.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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

    <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 не делает вообще ничего.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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
Ссылка на комментарий

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

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

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

 

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

Garry_Galler,

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

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

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

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Где у меня ошибка со скриптовым постэффектом? Метод 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 можно посмотреть.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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