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

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

TREWKO, не знаю правильно,или нет,но пробуй так:

local tbls = {"wpn_pm_1","wpn_fn2000","wpn_ksvk","wpn_ak74"}
local sec = "wpn_fn2000"

function test()
    for i=1,#tbls do
      if tbls[i] == sec then
    --'действия
      end
    end
end

Изменено пользователем Влад
Не бойтесь совершенства. Вам его не достичь.
C. Дали
Ссылка на комментарий

С чем может быть связан следующий вылет, при использовании LootMoneyMod?:

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description : <no expression>

[error]Arguments : LUA error: d:\stalker_sx\gamedata\scripts\lootmoney.script:28: bad argument #1 to 'random' (number expected, got nil)

 

 

stack trace:

 

 

 

В lootmoney.script, 24-28 строки, это:

local DeafMoneyExperienced = ini_file("DiXarConfiguration\\SLDiXarConfiguration.dxfi"):r_string("SFDeathLootMoney", "SFDeafMoneyStalker")
local parse_table2 = parse_data(DeafMoneyExperienced)
local DeafMoneyExperiencedMin = tonumber(parse_table2[1])
local DeafMoneyExperiencedMax = tonumber(parse_table2[2])        
            elseif npc_rank == "experienced" and deadmoney >=500 then deadmoney=math.random(DeafMoneyExperiencedMin,DeafMoneyExperiencedMax)

--------------------------------------------------------------------------------------------------------

Влад, функция работает, но как то странно выдаёт значения, сделал так:

function test()
    for i=1,#tbls do
      if tbls[i] == sec then
         ODS("Тестовая функция сработала сразу и без помех")
      else
         ODS("Тестовая функция не сработала! ERROR!!! 404")
      end
    end
end

 

А в консоли ответ:

Тестовая функция не сработала! ERROR!!! 404

Тестовая функция сработала сразу и без помех

Тестовая функция не сработала! ERROR!!! 404

Тестовая функция не сработала! ERROR!!! 404

 

Аааа... всё понял!

Просто не по назначению использую)))

 

---------------------------------------------------------------------------------

И как правильно записать скрипт, что-бы заспавнить каждый из предметов в таблице?

 

Установил причину вылета лутмани мода... читаю число денег из ini файла и надеюсь получить 4000, а получаю "4000".

То есть скрипт получает nil и пытается сделать из него рандом... вылет...

Дак всё таки, как эти скобки убрать?

НО! Скрипт читает секцию для ранга новичок, без проблем!

Как так может быть? Что за жесть?

 

---------------------------------------------------------------------------------

И в чём отличие: Скобок: "wp", от скобок: 'wp'?

Изменено пользователем TREWKO
Ссылка на комментарий
И в чём отличие: Скобок: "wp", от скобок: 'wp'?

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

print(" строка с 'цитатой' ")

или так:

print(' строка с "цитатой" ')

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

TREWKO

когда читаю r_s32 значение(цифру: 32) из ini файла, то оно преобразовывается в скрипте в "32",

вообще то метод возвращает целое число ( тип Int32 если я не ошибаюсь ) так же как и метод r_u32(string, string), а никак не строку, которую возвращает r_string(string, string)

с чего ты взял что у тебя возвращается число в кавычках?

 

а в лутмани добавь в скрипт перед считыванием секции из ini файла проверку на существование секции и ключа в данной секции - и если nil то верни рандому какое -нибудь дефолтное значение.

 

И насчет преобразования "4000" (строка ) в число 4000 - для этого существует lua метод tonumber() -- конвертирует строковое представление числа в number. И он в моде как я вижу задействован.

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

Верна ли эта функция?

    if obj:section() == "digger_pda" and not has_alife_info("find_instr") then
     db.actor:give_info_portion("find_instr")
      news_manager.send_tip(db.actor, "digger_tip", 0, "stalker", 10000)
        local snd_obj = xr_sound.get_safe_sound_object([[characters_voice\scenario\military\digger_msg]])
          snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
          alife():create("agr_krot_fake",vector():set(1.480,7.499,16.865),241837,488)
        end        
    end

Вставлял в бинд_сталкер на апдейт взятия итема. Если использовать её целиком, то получаю принудительный вылет из функции аборта в _g скрипте, НО. Если использую её без этих строк:

news_manager.send_tip(db.actor, "digger_tip", 0, "stalker", 10000)
        local snd_obj = xr_sound.get_safe_sound_object([[characters_voice\scenario\military\digger_msg]])
          snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)

то вылета нет. Подскажите в чём проблема?

 

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

И как поставить отметку на карту на созданный мною тайник? Отметку как на кордоне, ну там где сгинул браток.

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

кровоSTALKER,

про отметку

"пространство имён" - level

ищи по слову spot.

Также советую почитать lua_help.script и тему про Функциям сталкера на этом форуме - многие вопросы уйдут сами собой.

Первый вопрос решается курением "порядка" вызыва методов апдейтов актёра.

В общем : вставь перед теми строками из-за которых вылет(которые ты удалил) проверку что уровень загружен.опять таки методы "пространства имён" level, если вылет исчезнет,то думаю поймешь почему(хотя бы примерно).

 

PS:Epic Fail.Не читайте это сообщение!

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

Товарищи!

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

То появилась идея:

Где хранятся дынные о содержимом тайниках?

Если отключить хранение данных о содержимом тайников в памяти и при открытии тайника читать содержимое тайника из ini файла, то фризы теоретически могут пропасть? Ini файл будет тупо лежать на жестаке и не функционировать, пока его не потревожат.

А уже при ползаньи в тайнике и выходе из него - сохранять содержимое тайника в ini снова... и тут обнуляем информацию о содержимом тайников из памяти.

Сделать ini файл по типу:

[Treasures]

esc_treasure_012=wpn_pn, wpn_toz34

bar_treasure_014=wpn_fn2000

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

кровоSTALKER, функция верна, только что затестил подобную (без спавна непися и выдачи инфопоршна). Единственное что в твоей ф-ии меня заинтересовал вот этот вот end:

if obj:section() == "digger_pda" and not has_alife_info("find_instr") then

db.actor:give_info_portion("find_instr")

news_manager.send_tip(db.actor, "digger_tip", 0, "stalker", 10000)

local snd_obj = xr_sound.get_safe_sound_object([[characters_voice\scenario\military\digger_msg]])

snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)

alife():create("agr_krot_fake",vector():set(1.480,7.499,16.865),241837,488)

end

end

Что он делает и какого его предназначение мне не известно. :) Видимо он и создает ошибку.

 

По отметкам:

Добавляются они такой ф-ей - level.map_add_object_spot(number, string, string)

Где number - id того на кого/чего хочешь ставить метку

Где 1-ый string - икона метки (список иконок дам ниже)

Где 2-ой string - всплывающая подсказка о метки в ПДА (текст берется из XMLок)

Пример использования - level.map_add_object_spot(obj.id, "level_changer", "to_agroprom"), это стандартная ф-ия из level_tasks.script, она добавляет иконку перехода в Агропром.

crlc_small

green_location

level_changer

treasure

 

Это не весь список, а те которые я помню

 

 

 

TREWKO, в ТЧ такой способ точно не получится из-за невозможности писать в файлы.

P.S. И если не ошибаюсь, то фризы бывают из-за чего-то другого...

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

Кто сказал, что нельзя писать ini? :D

Вы только скажите, где лежит юзанье тайника и я попробую сделать.

 

Что то я не понял... а как заюзать каллбэк смерти?

Пробовал вывести в скрипт, но получаю вылет:

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: d:\stalker_sx\gamedata\scripts\dixarsestalker.script:7: attempt to index local 'npc' (a nil value)

 

Скрипт такой:

function DeathCallback(npc, killer)
    local sactor = alife():actor() 
    local cactor = level.object_by_id(sactor.id) 
    cactor:give_game_news(
        "%c[255,255,1,1]DiXarDeathCallback\\n%c[255,1,255,1]"..killer.." убил "..npc:section(),   
        "ui\\ui_iconstotal",        
        Frect():set(1245,517,83,47),  
        math.random(1, 1),     
        50000                         
        )
end

Вызываю из se_stalker.script(функция: se_stalker:on_death(killer))

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

TREWKO, наверное это мне сказал мой мозг который не увидел в ТЧ пространства имен io.

И опять трабла о том, что юзеры перестали юзать поиск. Вот пост от Колмогора с решением твоей проблемы.

 

P.S. И всего-лишь требовалось поискать по слову death_callback.

Ссылка на комментарий
По отметкам:...
Спасибо, но я хотел узнать ещё кое что:

Как определить ид? Правильно ли я его определил в заданной мною функции?

level.map_add_object_spot(unusual_treasure.id, "crlc_small", "unusual_spot")

Как удалить отметку с карты?

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

Министр, а я скажу, что писать в ТЧ можно!

WriteIni(ini, section, key, param)

Всё это делается через перехват движка dll.

 

Попробовал:

    local sactor = alife():actor() 
    local cactor = level.object_by_id(sactor.id) 
    cactor:give_game_news(
        "%c[255,255,1,1]DiVares\\n%c[255,1,255,1]"..obj:section(),   
        "ui\\ui_iconstotal",        
        Frect():set(1245,517,83,47),  
        math.random(1, 1),     
        5000                         
        )

Вставил это в xr_motivator.script(каллбэк смерти).

В игре 0 реакции...

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

кровоSTALKER, ну если у тебя unusual_treasure это тайник, то по идее верно. А вообще лучше самим в игре проверить. :)

 

Удаляются метки такой ф-ей - level.map_remove_object_spot(number, string).

Где number - id того с чего хочешь удалить метку

Где string - тип метки (т.е. ее иконка)

И как всегда пример. :)level.map_remove_object_spot(box:id(), "treasure") - это стандартная ф-ия из treasure_manager.script, она удаляет метку treasure с ящика-тайника по id.

Изменено пользователем Министр
Ссылка на комментарий
кровоSTALKER, ну если у тебя unusual_treasure это тайник, то по идее верно. А вообще лучше самим в игре проверить. smile.gif
Попробовал, но, к сожалению, результата не поимел(.
Ссылка на комментарий

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

news_manager.send_tip(db.actor, victim:id(), 0, "stalker", 10000)

При убийстве приходит id жертвы.

 

А насчет WriteIni(ini, section, key, param) подробнее расскажи. В lua_help.script ничего подобного не нашел.

 

----------------------

 

кровоSTALKER, хоть покажи откуда и как ты эту ф-ию вызываешь, а то так не понятно что к чему и в частности, что именно такое unusual_treasure.

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

Вызываю из апдейта на взятие итема:

if obj:section() == "unusual_pda" and not has_alife_info("treasure_1") then 
     db.actor:give_info_portion("treasure_1") --затычка
      alife():create("unusual_treasure",vector():set(61.661,4.864,101.872),251059,904)
       news_manager.send_tip(db.actor, "unusual_tip", 0, "stalker", 10000)
    end

unusual_treasure это рюкзак со шмотом:

[treasure_1]
GroupControlSection    = spawn_group
discovery_dependency =
$spawn                 = "devices\inventory box"
class                = O_INVBOX
cform                = skeleton
visual                = physics\box\expl_dinamit.ogf
script_binding      = bind_physic_object.init

[unusual_treasure]:treasure_1
visual = equipments\item_rukzak
radius = 1
custom_data = scripts\m_taynik.ltx

[spawn];Список шмота
af_night_star
wpn_bm16_full
antigaz

Собсна вот. :)

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

кровоSTALKER, вот как-то так:

if obj:section() == "unusual_pda" and not has_alife_info("treasure_1") then 
    db.actor:give_info_portion("treasure_1") --затычка
    local sobj = alife():create("unusual_treasure",vector():set(61.661,4.864,101.872),251059,904)
    local id = sobj.id
    news_manager.send_tip(db.actor, "unusual_tip", 0, "stalker", 10000)
    level.map_add_object_spot(id, "crlc_small", "unusual_spot")
end

 

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

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

О, даже так?! Круть. Спасибо, попробую.

============================

Министр, по твоему совету попробовал так как ты указал, но заметил странную особенность: если написать описание в текстовых файлах, то отметка не ставится, а если написать в самом файле, то ставится. Чудеса в решете :wacko: .

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

кровоSTALKER, смотри как отметки делали ПЫСы и сделай по аналогии.

Например, если в том же level_tasks.script название комментария выглядет таким образом:

level.map_add_object_spot(obj.id, "level_changer", "to_rostok")

То в XMLке string_table_level_tips.xml все должно выглядеть также (даже ковычки должны быть):

<string id="to_rostok">

<text>На дикую территорию</text>

</string>

 

P.S. А вообще если работает, то уже хорошо. :)

P.S.S. Объедини свои посты (удали новый, отредактируй старый). А то модерация предупреждениями закидает. :)

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

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

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

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

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

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

Войти

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

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

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