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

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

Приветствую. Пару вопросов:

1)В игре есть метод начать неразрываемый диалог с НПС, однако существует хитрость: если нажать паузу, а затем Esc, то такой диалог всё-таки закроется. Как это поправить?

2) Есть такая функция:

Скрытый текст

if math.random(100) <= 50 then
    действие_1
elseif math.random(100) > 50 then
    действие_2
end

но срабатывает не всегда. Где ошибка?

Спасибо.

Изменено пользователем Jek@n
Ссылка на комментарий
43 минуты назад, Jek@n сказал(а):

Есть такая функция: ... Где ошибка?

Ошибка, как мне кажется, в elseif. В данном варианте вероятность срабатывания будет такой:

0% <-- действие_1 --> 50% <-- ничего_не_делать --> 75% <-- действие_2 --> 100%.

Нужно написать так:

Скрытый текст

if math.random(100) <= 50 then
    действие_1
else
    действие_2
end

 

 

  • Нравится 1
  • Согласен 2
  • Полезно 3

S.T.A.L.K.E.R. CoP Objects (upd 11.03.24)

Ссылка на комментарий
4 часа назад, Jek@n сказал(а):

нажать паузу, а затем Esc, то такой диалог всё-таки закроется. Как это поправить?

Ну, самый простой способ: не нажимать на esc вовремя паузы.

Способ по сложнее: отследить начало диалога и на это время через скрипт разбиндить клавишу паузы, что бы не работала, пример - как это сделать, предостановить не могу, так как сам далеко от компа.

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

  • Согласен 2
  • Полезно 1

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

Здрасьте.

 

[ЗП 1.6.02] Проблема: при каждом повторе сейва и загрузки добавляется примерно 10 секунд реального времени к значению game.time().

Дельта постоянная – время в главном меню при создании сейва и время ожидания на экране загрузки не влияют.

Пример: вывод внутреннего таймера в сообщение, сразу же сейв и загрузка – начальное время 35 653 секунд, время после загрузки – 35 665 секунд.

Как с этим бороться?

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

Снимаю вопрос. Через pstor-запись в момент сейва и сравнение на первом апдейте разница ловится достаточно точно.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

@Norman Eisenherz если хочешь прям конкретно узнать,  что грузит время сейва,  то надо юзать утилитку filemon.  Щас она не юзается на 7ке. Есть другая. Поиском найдешь.

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

Именно так я искал время загрузки текстур и звуков,  для НС,  по заданию Сапсана. В результате была сделана оптимизация и время загрузки сократилось с полутора минут, до 10-18 секунд.  Но там после,  уже скритово было сделано.  Но утиль полезный,  правда настраивать его тяжко. Но если ты уж так заморочился,  оно того стоит. 

  • Нравится 1
  • Полезно 3

"Кругом зомби.....у меня кончаются патроны...."

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

@BFG game.time() – счетчик времени в активном сейве, и этот счетчик должен обновляться только при апдейте актера, который начинается после загрузки сейва и отключения меню. Или не совсем так?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

Написал меню:

class "menu" (CUIScriptWnd)

function menu:__init() super()
	self:InitControls()
end
function menu:__finalize() end

-- и т.д.

открываю прямо в игре из инвентаря, всё работает.

Вопрос: как его отловить из другого скрипта (когда это меню открыто)?

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Ссылка на комментарий
16 минут назад, AndreySol сказал(а):

@Баба ЯГА 

Код покажи, которым ты открываешь свое окно.

 

открываю так

level.start_stop_menu( ui_my_menu.menu(), true ) -- открываю меню

 

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

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

Наткнулся на один очень странный и неприятный вылет. Платформа RMA mod v1.1.5 + Shadows Addon v0.8.5 + Патч lvg_brest v3.5... При быстром сохранении и загрузке с него вылет вида:

Скрытый текст

FATAL ERROR
 [error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ... of chernobyl\gamedata\scripts\dialog_manager.script:880: attempt to compare number with nil
stack trace:

Собственно строка:

if ver >= 7 then

Идёт проверка патча, верно? В system.ltx указан шестой патч, т.е. current_server_entity_version = 7

 

А вот при попытке поставить затычку перед строкой if ver >= 7 then -> if not ver then ver = 8 end...

(вся функция ниже под спойлером)

Скрытый текст

function load(npc, reader, ver)
    if selected_phrase_by_id == nil then
        selected_phrase_by_id = {
            intro = {},
            cool_info = {},
            action_info = {}
        }
    end

    local flag = nil
        if not ver then ver = 8 end
    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end

    if flag ~= "-1" then
        selected_phrase_by_id.intro[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.intro[npc:id()] = nil
    end

       
    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end
    if flag ~= "-1" then
        selected_phrase_by_id.cool_info[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.cool_info[npc:id()] = nil
    end


    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end
    if flag ~= "-1" then
        selected_phrase_by_id.action_info[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.action_info[npc:id()] = nil
    end
end

...начинаются вылеты вида:

Скрытый текст

Синхронизация...
* phase time: 4 ms
* phase cmem: 225135 K
* [win32]: free[2698856 K], reserved[466984 K], committed[1028400 K]
* [ D3D ]: textures[298939 K]
* [x-ray]: crt heap[225135 K], process heap[464336 K], game lua[27948 K], engine lua[217 K], render[4108 K]
* [x-ray]: economy: strings[6773 K], smem[8222 K]
stack trace:

0023:05185AF0 xrGame.dll
 [error][      87]    : Параметр задан неверно.

Но! С ручных сейвов всё грузится. Мало того. Стоит переименовать квиксейв в папке сейвов вручную, игра послушно грузится с него тоже.

Какая-то хаффовщина, честное слово.

То ли это проблема движка с правками x-ray extensions, то ли я не знаю.

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

@Капрал Хикс 

Ну так у тебя же четко написано: попытка сравнить число с nil. Т.е. в переменной ver у тебя nil. Вот и раскапывай всю цепочку инициализации этой переменной и ищи место где она не инициализируется правильным значением.

 

@Баба ЯГА 

Сделай так:

    wnd = nil -- объявили глобальную переменную

далее

    wnd = ui_my_menu.menu()
    level.start_stop_menu(wnd, true)

В переменной wnd будет объект класса твоего окна. Глобальная переменная будет доступна из любого иного места.

  • Полезно 1
Ссылка на комментарий
1 час назад, AndreySol сказал(а):

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

В том-то и дело, что эта переменная встречается только в этом скрипте и только в этой функции, с оригинала так. Где она инициализируется - непонятно.

Ссылка на комментарий
10 часов назад, Капрал Хикс сказал(а):

[error]Arguments     : LUA error: ... of chernobyl\gamedata\scripts\dialog_manager.script:880: attempt to compare number with nil

У вас LUA ругается на:

3 часа назад, AndreySol сказал(а):

четко написано: попытка сравнить число с nil. Т.е. в переменной ver у тебя nil.

 

И вместо того чтоб попытаться проверить чему-же равна ver, вы пытаетесь подменить её

10 часов назад, Капрал Хикс сказал(а):

А вот при попытке поставить затычку перед строкой if ver >= 7 then -> if not ver then ver = 8 end...

причём на ver = 8, хотя 

 

10 часов назад, Капрал Хикс сказал(а):

В system.ltx указан шестой патч, т.е. current_server_entity_version = 7

На что уже движок начинает ругаться

10 часов назад, Капрал Хикс сказал(а):

0023:05185AF0 xrGame.dll
 [error][      87]    : Параметр задан неверно.

 

Думаю логичнее было бы затычку сделать так 

If ver == nil or ver == "nil" then ver = 7 end

 

Хотя чукча е програмист и может ошибаться

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

Приветствую !

Платформа ЗП. Попробовал перенести из мода на ТЧ скрипт на лечение раненых врагов. Собственно, вот что получилось:
 

Скрытый текст

local iTimer
local npc_save

function start_timer()
     iTimer = time_global() + 1*1000
end

function timer_update()
     if iTimer and iTimer < time_global() then
	iTimer = nil
	npc_out_gulag(npc_save)
     end
end

function enemies_dialog_rep(first_speaker, second_speaker)
local com = second_speaker:character_community()
     if com == "stalker" then
	db.actor:set_character_rank(db.actor:character_rank() + 40)
     elseif com == "killer" or com == "bandit" then
	second_speaker:set_character_community("stalker", 0, 0)
	db.actor:set_character_rank(db.actor:character_rank() + 30)
	npc_save = second_speaker
	start_timer()
     elseif second_speaker:character_community() == "dolg" then
	db.actor:set_character_rank(db.actor:character_rank() + 40)
     elseif second_speaker:character_community() == "freedom" then
	db.actor:set_character_rank(db.actor:character_rank() + 40)
     else
	second_speaker:set_character_community("stalker", 0, 0)
	db.actor:set_character_rank(db.actor:character_rank() + 30)
end
     if second_speaker ~= nil then
	if com == "stalker" or com == "bandit" or com == "dolg" or com == "freedom" or com == "killer" then
	second_speaker:set_relation(game_object.friend, first_speaker)
	end
     end
end

function npc_out_gulag(second_speaker)
local obj = alife():object(second_speaker:id())
local unreg_id = obj:smart_terrain_id()    
	if unreg_id ~= 65535 and second_speaker:alive() then      
		local unreg = alife():object(unreg_id)
		if unreg then
			unreg:unregister_npc(obj) 
		end  
	end
	npc_save = nil
end

 

meh.timer_update() - висит на апдейте в bind_stalker. 
enemies_dialog_rep(first_speaker, second_speaker) - вызывается из dialogs.script:
 

Скрытый текст

function transfer_medkit(first_speaker, second_speaker)
	if first_speaker:object("medkit") ~= nil then

		dialogs.relocate_item_section(second_speaker, "medkit", "out")
		--alife():release(alife():object(second_speaker:object("medkit"):id()), true)

	elseif first_speaker:object("medkit_army") ~= nil then

		dialogs.relocate_item_section(second_speaker, "medkit_army", "out")
		--alife():release(alife():object(second_speaker:object("medkit_army"):id()), true)

	else

		dialogs.relocate_item_section(second_speaker, "medkit_scientic", "out")
		--alife():release(alife():object(second_speaker:object("medkit_scientic"):id()), true)

	end

	alife():create("medkit_script", second_speaker:position(), second_speaker:level_vertex_id(), second_speaker:game_vertex_id(), second_speaker:id())

	-- Тут надо анлочить аптечку для использования.
	xr_wounded.unlock_medkit(second_speaker)

	-- Лечение врагов
	if second_speaker:relation(first_speaker) == game_object.enemy then
		meh.enemies_dialog_rep(first_speaker, second_speaker)
	end
	        first_speaker:change_character_reputation(10);
        end

 

Всё, вроде, работает. Прошу проверить "грамотность" meh.script. Вопрос возник потому, что узнал, что неписей после принудительной смены community необходимо выводить из гулага. Раньше просто прям в dialogs.script было следующее:
 

Скрытый текст

	if second_speaker:relation(first_speaker) == game_object.enemy then
		second_speaker:set_relation(game_object.friend, first_speaker)
		second_speaker:set_character_community("stalker", 0, 0)
		first_speaker:set_relation(game_object.friend, second_speaker)
	end
	        first_speaker:change_character_reputation(10);
        end

 

И также всё работало нормально. Просветите, пожалуйста, стоило вообще заморачиваться с meh.script или можно оставить всё как было без unregister_npc. 
P.S. Сам ни в коей мере не программист...

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

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

local MyMenu = ui_my_menu.menu() -- > type = userdata
local menuIsShown = MyMenu:IsShown() -- > type = userdata
local w = MyMenu:GetWidth() -- > type = number -> 1024
local mm_btn = MyMenu:GetButton("knopka"):GetWidth() -- > type = number -> 127
-- т.е. любой GET - работает отлично, и для самого меню, и для
-- его елементов; если параметр был задан изначально -
-- то вернёт значение, если небыло параметра изначально - то вернёт = nil
-- а вот любой SET - не работает, увы...
-- SET - всегда возвращает NIL и никакие параметры не меняются, а жаль...
MyMenu:GetButton("knopka"):SetText( "меняю на другой" ) -- NIL

жаль, думал можно получить меню, и в реальном времени менять координаты кнопок, цвет текста и т.д., но оказалось - нельзя... Хотя, возможно, я всё-же что-то делаю не так?...  :russian_ru:

  • Полезно 1

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Ссылка на комментарий
11 часов назад, Капрал Хикс сказал(а):

встречается только в этом скрипте и только в этой функции

Не правда. В аргументе ф-ции эта переменная - смотрите дальше, где вызывается эта ф-ция, и как передается соответствующий аргумент ф-ции.

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

@Капрал Хикс Вот так твоя проблема решается:

 

Скрытый текст

function motivator_binder:load(reader)
  self.loaded = true

  printf("motivator_binder:load(): self.object:name()='%s'", self.object:name())
  object_binder.load(self, reader)
  printf("motivator_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

  if reader:r_eof() then
    abort("[xr_motivator.script]SAVE FILE IS CORRUPT")
  end


  self.treasure_processed = reader:r_bool()

  xr_logic.load_obj(self.object, reader)
    if system_ini():r_u32("script","current_server_entity_version") > 6 then    -- патч 6
        self.npc_script_version = alife():object(self.object:id()).script_version
        dialog_manager.load(self.object, reader, self.npc_script_version)
    else    -- патч 4
        dialog_manager.load(self.object, reader)
    end
  trade_manager.load(self.object, reader)
end

А свои затычки из dialog_manager убери оставив лишь такой код:

 

Скрытый текст

function load(npc, reader, ver)
    if selected_phrase_by_id == nil then
        selected_phrase_by_id = {
            intro = {},
            cool_info = {},
            action_info = {}
        }
    end
    
    
    local flag = nil
    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end
    
    if flag ~= "-1" then
        selected_phrase_by_id.intro[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.intro[npc:id()] = nil
    end

    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end
    if flag ~= "-1" then
        selected_phrase_by_id.cool_info[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.cool_info[npc:id()] = nil
    end
    
end

 

  • Спасибо 1
  • Полезно 1
Ссылка на комментарий
1 час назад, AndreySol сказал(а):

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

Вот он, единственный вызов в xr_motivator:

    dialog_manager.load(self.object, reader)

Так в оригинале.

    dialog_manager.load(self.object, reader, self.npc_script_version)

Так в RMA.

Простите, для меня неочевидно, что 

self.npc_script_version = alife():object(self.object:id()).script_version

Это ver тот самый (если это и имелось в виду).

@I am Dead от души! Не думал, что аж так оно тянется.

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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