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

[SoC] Ковыряемся в файлах


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

В примерах встречаются 2 вида записи функции спавна, во втором случае перед алайф:креэйт задаются координаты, типа

local x, y, z = 0, 0, 0
local LVid, GVid = 0, 0

Зачем?

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

@dPlayer, для удобства, чтобы каждый раз не копипастить координаты, если, например, спавнишь в инвентарь ГГ. И запись выходит меньше, и размер файла тоже.

local pos = db.actor:position()
local gvid = db.actor:game_vertex_id()
local lvid = db.actor:level_vertex_id()
local id = db.actor:id()
local sim = alife()
sim:create("section_0",pos,gvid,lvid,id)
...
sim:create("section_155",pos,gvid,lvid,id)

Ранее был известен под ником BoBaH_671.

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

local x, y, z = 0, 0, 0

local LVid, GVid = 0, 0

 

Чтобы было. Люди работают, понимаете-ли, в поте лица.

 

А писать for k, v in pairs( { "item_1", ... "item_n" } ) do alife():create( v, vector(), 0, 0, 0 ) end - это - бездуховно.

 

P.S. И вообще, разработчик мода должен все делать с выключенным монитором, стоя в гамаке, одетый в дубленку и ласты. Ибо нефиг.

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

BoBaH_671, а ещё, думаю лучше db.actor вызвать один раз.

local actor = db.actor
local sim = alife()
local pos = actor:position()
local gvid = actor:game_vertex_id()
local lvid = actor:level_vertex_id()
local id = actor:id()

sim:create("section_0",pos,gvid,lvid,id)
...
sim:create("section_155",pos,gvid,lvid,id)
Изменено пользователем Kondr48
Ссылка на комментарий

@Kondr48, есть тут смайлик фейспалма? Зачем actor = db.actor? У тебя что, этот код выполняется миллиард раз на апдейте актора? Что тебе эти микро-нано-секунды дадут в этом коде? Ну сможешь ты этот кусок выполнить миллиард раз за секунду с этим изменением. А без него только 999999999 раз в секунду. Есть какая-нибудь разница, для этого кода? Уверен, что оно и одного-то раза за секунду не предназначено выполняться. Уффф... Насмотрелся я такого бреда в соляночных скриптах. Выговорился вот. И что бы два раза не вставать. Кто такой braad? За бредятину braad_test нужно руки переставить туда, откуда они растут, судя по скриптам.

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

actor = db.actor

 

Так затем же, зачем и все остальное: чтоб побольше мегабайтов получилось. Как в бредтесте.

 

Впрочем, набить 100500 раз db.actor - тоже полезно. Глядишь, на какой-нибудь 84261й раз получится не db.actor, а bd.actor - то-то всякие "правщики" нелицензированные утомятся это место искать... А обычным пользователем можно сказать, что это у них компьютер нелицензированный.

 

А вот зато те, у кого он в _G сидит, пусть помучаются, и свои дебильные скриптики прежде чем подключать, пусть зарегистрируют в 30 местах, а всех своих actorов найдут, и заменят обратно на db.actor - ибо нефиг выеживаться.

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

dsh, слишком много на форуме споров было, лучше так или нет. Привычка, в конце концов ничего не усложняет, хуже никому не становится.

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

Функция выдаёт инфопоршень, после этого надо выполнить другую функцию, из этого же скрипта, как правильно записать-то?
...
if db.actor:object("ivan_case_esc") then
db.actor:give_info_portion("ivan_find_case_esc")
esc_function                                                                             
<-эту ф-ию над овыполнить
return true
...

рекомендую таки начать с чтения вот этого:
http://www.amk-team.ru/forum/topic/11584-iazyk-lua-obschie-voprosy-programmirovaniia/
dc

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

dPlayer, если просто выполнить, не передавая в неё никаких аргументов, тогда вот так:

...
if db.actor:object("ivan_case_esc") then
 db.actor:give_info_portion("ivan_find_case_esc")
 esc_function()                                                 <-эту ф-ию над овыполнить
 return true
...
  • Спасибо 1
  • Нравится 1
Ссылка на комментарий

Если не ошибаюсь, то тут недавно обсуждали CUIWpnParams. На днях я его разобрал, местами несколько странно все работает, и я так и не решился перенести скриптовый код в движок. Сразу скажу, что скрипт нужно исправлять, так как если опираться на функции движка, то он работает не совсем правильно. Еще добавлю, что у меня в ui_wpn_params падает гейм-объект ствола, так что для каждого объекта можно настроить свои параметры прогресс-баров.

 

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

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

 

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

bool CUIWpnParams::Check(const shared_str& wpn_section){
if (pSettings->line_exist(wpn_section, "fire_dispersion_base"))
{
// Karlan: запретим показывать инфо для аддонов вроде подствольников и прицелов
xr_string ws = wpn_section.c_str();
size_t addon = ws.find("wpn_addon");
if (addon != std::string::npos)
return false;
if (0==xr_strcmp(wpn_section, "wpn_knife"))
            return false;
        if (0==xr_strcmp(wpn_section, "wpn_binoc"))
            return false;
        if (0==xr_strcmp(wpn_section, "mp_wpn_binoc"))
            return false;
        return true; 
}
else
return false;
}

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

Если кому интересно, то я проверял поведение на подобных функциях:

float CUIWpnParams::GetRPM(CWeapon *weapon)
{
float rpm = weapon->fTimeToFire;
rpm=rpm*60;
float mag_size = (float)weapon->iMagazineSize;
if (rpm>200) rpm = powf((rpm - 200)/720,2)*100 + 15;
else if (mag_size<5) rpm = 30;
else rpm = rpm/14;
clamp(rpm, 1.f, 100.f);
return rpm;
}

 

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

Дополняю свой пост. Сейчас закончил работы над этим окном. В движке у меня присутствуют два объекта (смотрите видео), поэтому просто так по одному гейм-объекту сделать прямой дамп у меня не вышло, пришлось писать скрипт с учетом второго объекта (его я тоже помещаю на стек). Исправил получение hit_power. Добавил функцию получения текущего типа патронов в стволе и исправил получение дисперсии для обоих объектов. Повторю, в движке переписал только оформление, можно конечно и функциональную часть переписать, у меня вообще есть мысль уже давно написать для всего этого барахла один класс, а то дюже не удобно по куче файлов ходить. В скрипте переписал многое, и одну функцию все-таки засунул в движок, посмотрю на поведение, если будет неплохо, то возможно перенесу и остальное. В общем все достаточно легко оказалось.

Результат в целом конечно не отличается, но зато сейчас действительно правильно работает:

 

 

  • Нравится 1
Ссылка на комментарий
start_dialog может быть только один?

С чего ты взял? Просто его нужно грамотно вставить в профиль непися. Вот, допустим, твой диалог идет после <actor_dialog>123_dlg</actor_dialog> и этот 123_dlg цикличен - после последней фразы происходит dialogs.break_dialog(). И так до бесконечности. Так что ставь свой start_dialog выше actor_dialog'a.

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

Ранее был известен под ником BoBaH_671.

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

 

 

... может быть только один?

Да, только один. Об этом подробнее написано на stalkerin где-то, на скорую руку не смог найти. Это обычно какое-то приветствие от НПС, а ГГ всегда начинает диалог первым (!), по этому - 1 старт диалог, остальное только актор диалог.

 

 

 

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

А при чем тут start_dialog? В actor_dialog это не реализуемо?:)

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

@HellRatz, это почему же? Не знаю, что тут в ТЧ, но сомневаюсь, что есть разница в диалогах с ЗП. У меня у непися 3 старт диалога и всё прекрасно работает. Проговорил один, потом второй и т. д.. Да, вызываю из логики в секции meet с помощью meet_dialog по условию, и все прекрасно работает. 

Ранее был известен под ником BoBaH_671.

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

Просто менять схемы meet:

 

 

[walker@8]
combat_ignore_cond = true
invulnerable = true
path_walk = esc_provodnik_walk_2
path_look = esc_provodnik_look_2
on_info = {=npc_in_zone(esc_stop_start_scene) -first_cutscene_complete} %+first_cutscene_complete%
meet = meet@start ;-- первая схема meet
on_info2 = {+esc_provodnik_dialog_start_done} walker@camp

[walker@camp]
combat_ignore_cond = true
invulnerable = true
path_walk = esc_provodnik_camp_walk
path_look = esc_provodnik_camp_look
meet = meet@camp ;-- вторая схема meet
on_info = {+esc_provodnik_camp_dialog_first_done} walker@camp2

;-- вот эти 2 схемы

[meet@start]
use = {=actor_enemy} false, {=dist_to_actor_le(15) -esc_provodnik_dialog_start_done} self, true
use_wpn = false
meet_dialog = {-esc_provodnik_dialog_start_done} esc_provodnik_dialog_start
meet_on_talking = true
trade_enable = false
allow_break = false

[meet@camp]
use = {=actor_enemy} false, {=dist_to_actor_le(15) -esc_provodnik_camp_dialog_first_done +esc_stop_first_cutscene} self, true
use_wpn = false
meet_dialog = {-esc_provodnik_camp_dialog_first_done} esc_provodnik_camp_dialog_first
meet_on_talking = true
trade_enable = false
allow_break = false

 

 

Я даже не знаю, может, можно было сделать все диалоги по условию в одной секции meet, но меня и такой вариант устраивает. ЗЫ: код ЗП-шный, trade_enable и allow_break не работают в ТЧ вроде, но нас интересует meet_dialog - пожалуйста.
  • Спасибо 1

Ранее был известен под ником BoBaH_671.

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

 

 

можно было сделать все диалоги по условию в одной секции meet

И походу можно. См. ситуация 3 в самом конце

http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1

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

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

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

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

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

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

Войти

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

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

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