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

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


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

Не совсем. "Опорная" ось:

angle = clamp(wind_velocity * wind_strength * 0.05, 0, 1)
axis.x = -sin(wind_direction) * cos(drop_max_angle * angle - 1.57)
axis.y = sin(drop_max_angle * angle - 1.57)
axis.z = cos(wind_direction) * cos(drop_max_angle * angle - 1.57)
drop_max_angle ~ 10 градусов

Плюс для отдельных капель направления рандомизируются в диапазоне +-3 градуса от опорной оси, если я правильно помню.

Изменено пользователем KD87
  • Нравится 2
Ссылка на комментарий

Ещё раз спасибо, этого должно хватить.

Кстати если кто-то продолжает ковырять ТЧ 1.0006, предлагаю использовать map файл от xrGame.dll для скорейшего нахождения интересных функций и улучшения логов вылетов. Сейчас он очень помогает мне понять где вылет, если хоть какой-то стек вызовов доступен. Файл получен через обработку соответствующего для отладочной версии, фактически поправлены смещения. К сожалению пока руки не дошли до переноса vftable, которые тоже при раскопках важны. У меня накопилось много информации по движку, которую буду систематизировать и публиковать ближе к выходу NLC6, сейчас катастрофически времени не хватает.

  • Нравится 4

Плавайте поездами аэрофлота!

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

Нашел в lua_help.script такое вот

C++ class IKinematicsAnimated {
function PlayCycle(IKinematicsAnimated*, string);

};

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

Изменено пользователем Viнt@rь
Ссылка на комментарий

Viнt@rь,
Этот класс является базовым для всех объектов с визуалом и костями. Однако в скриптах он никак прямо не используется, поскольку нет функции приведения к этому классу. Остался скорее всего по недосмотру. Вероятно, на каком-то этапе была функция приведения, наподобие get_holder_class(), но потом убрали. Сейчас для вызова метода проигрывания анимации есть метод play_cycle класса game_object, который внутри как раз и вызывает метод PlayCycle класса IKinematicsAnimated.
 



lsclon,

 

Подскажите пожалуйста предназначение функции keep_saved_data_anyway()?

Это функция серверного класса, которая отвечает за сохранение клиентских данных. Как и другие методы серверного класса, метод keep_saved_data_anyway можно перегрузить в скриптах. Он должен возвращать логическое значение. Если возвращает false, то клиентские данные не сохраняются. Если не ошибаюсь, то эти данные - это то, что сохраняет/читает клиентский объект в методах биндера save/load. Наверное, надо бы что-то добавить о стратегии применения этой функции, но тут не много скажу. Обычно возвращает true, т.е. всё храним. Вероятно, когда-то имеет смысл эти самые данные обнулять. Изменено пользователем malandrinus
  • Нравится 1
 

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

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

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

 

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

malandrinus, а можно по подробней по поводу play_cycle пытался проиграть анимацию пма с ее помощью

local aa = db.actor:item_in_slot(db.actor:active_slot())
aa:play_cycle("pm_reload")

но нифига не проигрывается...

Изменено пользователем Viнt@rь
Ссылка на комментарий

@Viнt@rь, почему играем анимку для актора

 

db.actor:play_cycle("pm_reload")

? :)

 

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

 

не то написал, исправил.

Включи вид от 3 лица и посмотри будет ли играть анимка. Изменено пользователем Shadows
Ссылка на комментарий

Shadows, не то написал, исправил.
 


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

смотрел и при виде от третьего лица(при нем же ГГ держит мировую модель), и при виде от второго лица, ничего не происходит...

Изменено пользователем Viнt@rь
Ссылка на комментарий

@Andrey07071977, первый раз о таком слышу. В каком это контексте?

 

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

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

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

 

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

@Viнt@rь, возможно, не туда смотришь :) . В игре у оружия существуют "мировые" (от 3-го лица) и худовые модели. Вышеупомянутая функция работает именно с "мировыми" визуалами. Что характерно, в оригинальной игре мировые модели оружия не имеют анимации вообще (а при попытке их простого добавления к модели в СДК модель в игре превращается непонятно во что), но с использованием данных функций скриптово мы можем заставить их играться. Данный факт был обнаружен при разработке GWRa, и теперь активно используется в оружиестроении, ибо открывает достаточно важные возможности (взять ту же затворную задержку для пистолетов). Если интересно - примерный код для оружия с подствольной рукоятью с возможностью установки подствола:

function init_handled_wpn(obj)


   local new_binder = gwr_wpn_w_handle_binder(obj)
   obj:bind_object(new_binder)
end

class "gwr_wpn_w_handle_binder" (object_binder)
function gwr_wpn_w_handle_binder:__init(obj) super(obj)
end

function gwr_wpn_w_handle_binder:update()
    if self.object:weapon_is_grenadelauncher() then
        self.object:play_cycle("idle_w_gl")
    else
        self.object:play_cycle("idle")
    end
end

 

 

 

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

@Malandrinus, в контексте работы с нет пакетами

 

кусок кода из xs_store

--write variable to tail
tail_pk:w_u8(allowed_types_rev[lua_type])
tail_pk:w_stringZ(key)
if lua_type=='string' then
tail_pk:w_stringZ(val)
elseif lua_type=='number' then
tail_pk:w_float(val)
elseif lua_type=='boolean' then
tail_pk:w_u8(val)
elseif lua_type=='table' then
tail_pk:w_stringZ(serialized_tables[key])
end

 

 

 

Пытаюсь настроить твой ogse_unist в ЗП но ловлю вылеты типа:

 

... not enough storage to process the command...

... not enough memory ...

 

Вылет происходит гдето в pk:get(), но пока не знаю точно где. Решил помотреть как xStream сделала и наткнулся на tail packets. Artos также их использует

 

П.С> вылетает не всегда, примерно через раз



Вот функция из модуля для работы с пакетами

 

function net_base:get()
if not (self.obj and self._mode ~= 0) then return {} end --/> zero
dlog("(%s) in net_base:get()", self_name)
--/ preparation
local stpk,uppk = nil,nil
local stsz,upsz = 0,0
if bit_and(self._mode, 1) ~= 0 then
stpk = net_packet()
dlog("(%s) in net_base:get() got empty packet stpk = net_packet()", self_name)
-- stpk:w_begin(0) --/ installation in the package beginning (+2)
stpk:w_begin()
self.obj:STATE_Write(stpk)
stpk:r_seek(2) --/ installation of the beginning (+2) of reading
stsz = stpk:r_tell()
end
dlog("net_base:get:(%s)%s):m(%s)/st(%s)/up(%s):[%s]", self.obj:name(), self.name, self._mode, self._can_st, self._can_up, ">")
if bit_and(self._mode, 2) ~= 0 then
uppk = net_packet()
uppk:w_begin(0) --/ installation in the package beginning (+2)
self.obj:UPDATE_Write(uppk)
uppk:r_seek(2) --/ installation of the beginning (+2) of reading
upsz = uppk:r_tell()
end
local t = {}
if uppk ~= nil then
t.upd = {} --/ sub-table for update-propeties
end
--/ read
if self.dbg then log("net_base:get:(%s)%s):m(%s)/st(%s)/up(%s):[%s]", self.obj:name(), self.name, self._mode, self._can_st, self._can_up, ">") end --/#~#
self:_read(t, stpk, uppk)
if self.dbg then log("net_base:get:(%s)%s):m(%s)/st(%s)/up(%s):[%s]", self.obj:name(), self.name, self._mode, self._can_st, self._can_up, "<") end --/#~#
--/ check state size and tail
if stpk ~= nil then
self.size = stpk:r_tell() - stsz
if not stpk:r_eof() then --/ exist left?
t.__tail = tail_data():peekFrom(stpk)
t.__tail_size = t.__tail.pk:w_tell() - t.__tail.pk:r_tell()
if true or self.dbg then log("net_base:get:obj=[%s]%s):mode=[%s]:tail(st)=[%s]:<%s>", self.obj:name(), self.name, self._mode, t.__tail_size, "Info!") end --/#~#
end
end
--/ check update size and tail
if uppk ~= nil then
self.size_upd = uppk:r_tell() - upsz
if not uppk:r_eof() then --/ exist left?
t.upd.__tail = tail_data():peekFrom(uppk)
t.upd.__tail_size = t.upd.__tail.pk:w_tell() - t.upd.__tail.pk:r_tell()
if true or self.dbg then log("net_base:get:obj=[%s]%s):mode=[%s]:tail(up)=[%s]:<%s>", self.obj:name(), self.name, self._mode, t.upd.__tail_size, "Info!") end --/#~#
end
end
dlog("(%s) net_base:get() succes, return size = %s", self_name, table.size(t))
return t --/>
end

 

После того как изменил

-- stpk:w_begin(0) --/ installation in the package beginning (+2)
на
stpk:w_begin()
вроде бы перестало вылетать... thoughts?
Изменено пользователем Andrey07071977
Ссылка на комментарий
Фактически не подходит для проигрывания зацикленных звуков.

То-есть, ни stop(), ни stop_deffered(), точно не срабатывают?

А если, например, переменную заnilить - ничего не сброситься?

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

всё легко

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

То-есть, ни stop(), ни stop_deffered(), точно не срабатывают?

Да, не срабатывают, как и заниление.

 

Да и сам метод называется ведь play no feedback (играть без обратной связи), следовательно все верно.

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

Изменено пользователем Shadows
  • Нравится 1
Ссылка на комментарий

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

 

Небольшой разбор параметров ef_main_weapon_type и ef_weapon_type в конфиге оружия, и + по мелочам о том, как НПС выбирает и использует ствол. (на англ. языке)

 

Below are the settings of how the vanilla weapons are grouped together:
ef_main_weapon_type:		ef_weapon_type:		group:
0				1			stabbing
0				5			pistol
1				7			shotguns
2				6			automatic
3				8			sniper
4				8			grenade launcher
0				10			hand grenade

you will want to look in m_stalker.ltx and take note of the settings in your fire queues. note that there is nothing wrong with the vanilla settings here, but you can make them more aggressive as you see fit. below i've noted the ranges that are hard coded for each of the fire queues:
;---FIRE QUEUE PARAMETERS
;far range 	= 30 - 1000m.
;med range 	= 15 - 30m. 
;close range 	= 0  - 15m. 

i've listed below what i've found from my testing. how ef_weapon_type relate to how an NPC will utilise a weapon:
ef_weapon_type:		NPC use of weapon:
1 - 4			as per fire queue
5			3 round burst at close and med range. as per fire queue at far range
6			as per fire queue
7			single shot at approx 1sec intervals
8			single shot at 3sec intervals
9			if range is farther than 20m, then as per the medium fire queue. if range is closer than 20m, then change weapon.
10			if range is between 3 - 20m, then as per fire queue. else change weapon
11			if range is farther than 3m, then as per fire queue. if range is closer than 3m, then change weapon
12 - 99			as per fire queue.

Notes:
- the weapon hierarchy is numerological. ie they will equip a weapon with a higher value in ef_weapon_type over a lower one.
- except that, all pistols must be ef_weapon_type = 5 & ef_main_weapon_type = 0 or you're going to have a bad time. (or the NPCs will choose their pistol instead of their rifle, i dont know why this is).
- once they have a new weapon, they might not equip it until next combat.
- as we all know, NPCs must have the correct ammo type in their inventory’s or they wont be able to reload their new weapons once the mag runs out.
- i really dont have any idea what ef_main_weapon_type does at all.
- the upper limit is not known, i just put 99 as a place holder. 
- you will want to set use_single_item_rule = off in m_stalker.ltx
- min_radius, max_radius & fire_distance settings in each weapons .ltx file have no effect at all. these functions are instead determined by the fire queue
- as far as i can tell; mp_ranks.ltx has nothing to do with the hierarchy of NPC wpn evaluation, this is done solely by the ef_weapon_type value.

In my mod i've set every weapon in the game in a logical hierarchies and given each group its own unique ef_weapon_type.

using this method i have been able to successfully answer the age old questions of how to get an NPC to take an AKSU-74 off you when he already has a BM-16!

if someone would want to add this to the mod wiki as an article, that would be great.
 
 

 

 

 

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

  • Полезно 1

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

@*Shoker*,

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

Оружие выбирается в соотвествии с common\weaponeffectiveness.efd

Что касается ЗП: параметры очередей и диапазоны растояний настраиваются в конфигах.

min_radius, max_radius читаются из конфига, но не используются. Они и не нужны, так как расстояние учитывается в weaponeffectiveness.efd

fire_distance - вообще используется только при расчете полета пули, на выбор никак не влияет.

  • Нравится 1
Ссылка на комментарий

 

function physics_world() -- в ТЧ - вылет

function environment() -- в ТЧ - вылет

 

 

 

Для тех кто вдруг не знал, в ЗП level.physics_world() работает, и его свойства можно в классе  C++ class physics_world посмотреть.

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

 

Никто кстати не знает можно ли как нибудь использовать  function add_call(class CPHCondition*, class CPHAction*);, а то эти классы похоже не экспортированы. 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

@*Shoker*,

function WaitOneUpd(tData)
local x = 1
local _precondition = function()
  x = x - 1
  return x == 0
end
local _action = function()
  event("OneUpdPassed"):once():trigger(tData)
end
level.add_call(_precondition, _action)
end

на сколько я помню, говорили эта функция запускает _precondition в новом потоке и ждет его завершения после чего вызывает _action в евент-драйвен модели xStrem, это используется для отлова зависших коллбэков

ЗЫ сразу не понял, что вопрос косается класса physics_world, но что-то мне подсказывает, что она работает так же

Изменено пользователем Viнt@rь
  • Нравится 1
Ссылка на комментарий

... эта функция запускает _precondition в новом потоке и ждет его завершения после чего ...

Неверно! Запущенный коллбэк постоянно (аналогично апдейтам актора) вызывает функцию _precondition и, если она возвращает true, коллбэк отключается и вызывается функция _action

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

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

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

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

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

Войти

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

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

  • Куратор(ы) темы:

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