Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Скрипты
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2, 3, 4, 5, 6
Tron
скажу сразу,что в lua,я почти профан(синтаксиса не знаю) и сейчас его прикручиваю к движку
Возможен ли precache?-т.е инклуд скрипта,но его выполнение будет происходить только после вызова именно этого скрипта.. Читал про "require",но у автора почти такая же байда как и у меня


если я первый скрипт вызваю как(С++)
Код
RunLuaScript("..\\EngineMedia\\Scripts\\startup.lua");



то я бы второй хотел бы вызвать так:
Код
RunLuaScript("keyboard-esc.lua");

А не как сейчас:
Код
RunLuaScript("..\\EngineMedia\\Scripts\\keyboard-esc.lua");


Вводить собственный precache всех ресурсов не хотелось бы-нужны именно скрипты
[=sinedsc=]
Параметр в кастом дате смарт террейна
Код
stay = min[, max]                  ;время, на которое сталкер останется, умолчание=навсегда

как задаются параметры
min и мах?
пытался задавать так
Код
stay = 9, 11

пишет что инвалидный параметр.
Подскажите как задать этот параметр
Tron
Забыл отписать-разобрался в своей проблеме.
Линковал статически луабинд,ко многим длл.кам из проекта,и передавал туда lua_state.
Вообще странно было,что статические функции работали
Alwen
Вопрос по работе диалогов. В чем может быть ошибка?
dialogs_escape.script
function money_check_1()
return db.actor:money() >= 10
end

function fuel_to_actor_1(oSpeaker1, oSpeaker2)
dialogs.give_items("explosive_mobiltank", 1)
dialogs.relocate_money(oNPC, 10, "out")
end


function money_check_2()
return db.actor:money() >= 20
end


function fuel_to_actor_2(oSpeaker1, oSpeaker2)
dialogs.give_items("explosive_mobiltank", 2)
dialogs.relocate_money(oNPC, 20, "out")
end


function money_check_4()
return db.actor:money() >= 40
end


function fuel_to_actor_4(oSpeaker1, oSpeaker2)
dialogs.give_items("explosive_mobiltank", 4)
dialogs.relocate_money(oNPC, 40, "out")
end


function no_money_for_fuel()
return db.actor:money() >= 0
end


dialogs_escape
<dialog id="esc_need_fuel">
<phrase_list>
<phrase id="0">
<text>Нужен бензин.</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>Хорошо. Сколько канистр?</text>
<next>3</next>
<next>4</next>
<next>5</next>
<next>6</next>
</phrase>

<phrase id="3">
<text>Одной хватит.</text>
<next>31</next>
<next>7</next>
</phrase>
<phrase id="31">
<precondition>dialog_escape.money_check_1</precondition>
<action>dialog_escape.fuel_to_actor_1</action>
<text>Ни гвоздя, ни жезла тебе, Меченый.</text>
</phrase>

<phrase id="4">
<text>Две.</text>
<next>41</next>
<next>7</next>
</phrase>

<phrase id="41">
<precondition>dialog_escape.money_check_2</precondition>
<action>dialog_escape.fuel_to_actor_2</action>
<text>Ни гвоздя, ни жезла тебе, Меченый.</text>
</phrase>

<phrase id="5">
<text>Сразу четыре.</text>
<next>51</next>
<next>7</next>

</phrase>

<phrase id="51">
<precondition>dialog_escape.money_check_4</precondition>
<action>dialog_escape.fuel_to_actor_4</action>
<text>Ни гвоздя, ни жезла тебе, Меченый.</text>
</phrase>


<phrase id="6">
<text>Я передумал...</text>
<action>dialogs.break_dialog</action>
</phrase>

<phrase id="7">
<precondition>dialog_escape.no_money_for_fuel</precondition>
<text>Походу, пока тебе с твоими деньгами только пешеходом быть.</text>
</phrase>

</phrase_list>

</dialog>

При кликах на пункты с выбором(3, 4, 5) иногда выкидывает фразу из диалога "не хватает денег", как будто врет функция money_check_X. При повторном клике все идет как надо и это сообщение выскакивает когда положено.

За основу взял диалог с покупкой авто у Бармена из LA, и там не понятно назначение функции в конце:
Цитата
function not_has_car_money()
return not has_car_money()
end
-- has_car_money - денег >= цене самого дешевого автомобиля
, которая является предусловием для пункта диалога "у тебя нет денег" в dialogs.xml

Что эта функция выполняет, если и так по умолчанию при недостатке денег диалог на "нет денег" и ссылается?
K.D.
Цитата(Alwen @ 11.06.2014, 18:41) *
function no_money_for_fuel()
return db.actor:money() >= 0
end

Уверен? biggrin.gif
Alwen
Цитата(K.D. @ 11.06.2014, 19:11) *
Цитата(Alwen @ 11.06.2014, 18:41) *
function no_money_for_fuel()
return db.actor:money() >= 0
end

Уверен? biggrin.gif

Нет. Но если делать как у торговли авто ЛА, с предусловием актор_мани() <= мин_цена_айтема, то при выборе самого дорого товара и недостатке денег на него стабильно получаю вылет No available phrase to say, dialog[esc_need_fuel]
K.D.
Цитата(Alwen @ 11.06.2014, 19:46) *
Нет. Но если делать как у торговли авто ЛА

Причем тут ЛА? Очевидно же, что функция возвращает true всегда, когда у актора есть деньги. Т.о. прекондишн твоей фразы про нехватку денег всегда пропускает эту фразу. Делай конкретно в этом месте < 10.
Upd: лучше сделать так, наверное. Сделай для каждой фразы свою фразу отказа и там отдельную функцию no_money с разными количествами проверямых денег.
Alwen
Второй вариант сделал, но мучает этот вылет "No available phrase to say, dialog[esc_need_fuel]", если нажимать вариант на 40 при 30 денег в инентаре.

dialog_escape.script

function money_check_1()
return db.actor:money() >= 10
end

function fuel_to_actor_1(oSpeaker1, oSpeaker2)
dialogs.give_items("explosive_mobiltank", 1)
dialogs.relocate_money(oNPC, 10, "out")
end


function money_check_2()
return db.actor:money() >= 20
end


function fuel_to_actor_2(oSpeaker1, oSpeaker2)
dialogs.give_items("explosive_mobiltank", 2)
dialogs.relocate_money(oNPC, 20, "out")
end


function money_check_4()
return db.actor:money() >= 40
end


function fuel_to_actor_4(oSpeaker1, oSpeaker2)
dialogs.give_items("explosive_mobiltank", 4)
dialogs.relocate_money(oNPC, 40, "out")
end

--function no_money_check()
-- return db.actor:money() < 0
--end


function no_money_for_fuel()
return not money_check_1
end

function no_money_for_fuel_two()
return not money_check_2
end

function no_money_for_fuel_four()
return not money_check_4
end



dialogs_escape.xml
<dialog id="esc_need_fuel">
<phrase_list>
<phrase id="0">
<text>Нужен бензин.</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>Хорошо. Сколько канистр?</text>
<next>3</next>
<next>4</next>
<next>5</next>
<next>6</next>
</phrase>

<phrase id="3">
<text>Одной хватит.</text>
<next>31</next>
<next>7</next>
</phrase>
<phrase id="31">
<precondition>dialog_escape.money_check_1</precondition>
<action>dialog_escape.fuel_to_actor_1</action>
<text>Ни гвоздя, ни жезла тебе, Меченый.</text>
</phrase>

<phrase id="4">
<text>Две.</text>
<next>41</next>
<next>72</next>
</phrase>

<phrase id="41">
<precondition>dialog_escape.money_check_2</precondition>
<action>dialog_escape.fuel_to_actor_2</action>
<text>Ни гвоздя, ни жезла тебе, Меченый.</text>
</phrase>

<phrase id="5">
<text>Сразу четыре.</text>
<next>51</next>
<next>71</next>

</phrase>

<phrase id="51">
<precondition>dialog_escape.money_check_4</precondition>
<action>dialog_escape.fuel_to_actor_4</action>
<text>Ни гвоздя, ни жезла тебе, Меченый.</text>
</phrase>


<phrase id="6">
<text>Я передумал...</text>
<action>dialogs.break_dialog</action>
</phrase>

<phrase id="7">
<precondition>dialog_escape.no_money_for_fuel</precondition>

<text>Походу, пока тебе с твоими деньгами только пешеходом быть.</text>
</phrase>

<phrase id="71">
<precondition>dialog_escape.no_money_for_fuel_four</precondition>

<text>Тебе на столько не хватит.</text>
</phrase>

<phrase id="72">
<precondition>dialog_escape.no_money_for_fuel_two</precondition>

<text>Тебе на столько не хватит.</text>
</phrase>

</phrase_list>

</dialog>
hi_flyer
Alwen,

Перенеси весь текст (<text></text>) в любой файл из config\text\rus.
abramcumner
Цитата(Alwen @ 11.06.2014, 21:01) *
Код
function no_money_for_fuel()
      return not money_check_1
end

А в ЛА-то скобочки были:
Код
function not_has_car_money()
return not has_car_money()
end


Может проще добавить эти канистры в продажу по десяточке? smile.gif
Alwen
Про скобочки забыл smile.gif Теперь все заработало. Спасибо всем отписавшимся.
hi_flyer
Ни у кого случайно не остался xs_sandbox от xStream ? Скиньте у кого есть плиз.
Pavel_Blend
Хочу изучить луа. Скачал интерпретатор, пишу код. Но когда запускаю скрипт двойным щелчком мыши, он выполняется и окно сразу закрывается. Как заставить консольное окно не закрываться? Чтобы можно было посмотреть на результат работы.
Modera
Pavel_Blend, pause
Pavel_Blend
Modera, это в батнике писать ведь? А стандартными средствами луа это никак не сделать? Чтобы в самом коде это было прописано. Я ведь скрипты не через батники хотел запускать, а двойным щелчком.
HikeR
выкиньте мышь и осваивайте консоль. cmd -> lua.exe script.lua -> результат работы.

ForserX
Цитата(hi_flyer @ 07.07.2014, 19:31) *
Ни у кого случайно не остался xs_sandbox от xStream ? Скиньте у кого есть плиз.

https://yadi.sk/d/GV1pRum8ibXrK
evg
как создать новый ammo_class для оружия
aka_sektor
А вот такой вопрос: возможно ли вынести текст о версии мода из скрипта ui_main_menu.script, в какой-нибудь конфиг?
в скрипте он прописан как:
Код
_ver:TextControl():SetText  ("ver. " .. mm:GetGSVer().." + Кастомный текст")

Просто в чем суть, при обновлении мода, нужно менять скрипт, а если этот мод ещё куда-то адаптирован, то нужно будет повторно скрипт менять. Не проще ли в одном конфиг файле версию менять и все?
RayTwitty
Цитата(aka_sektor @ 26.04.2017, 14:01) *
Не проще ли в одном конфиг файле версию менять и все?

АМК в 2008 году это сделали.
ForserX
Цитата(RayTwitty @ 26.04.2017, 20:31) *
Цитата(aka_sektor @ 26.04.2017, 14:01) *
Не проще ли в одном конфиг файле версию менять и все?

АМК в 2008 году это сделали.

Ты сейчас про xml?
aka_sektor
Цитата(RayTwitty @ 26.04.2017, 20:31) *
АМК в 2008 году это сделали.

Угу, похоже на то:
ТЧ финалка

Код
function main_menu:InitControls()
    self:Init(0,0,1024,768)              
    local xml = CScriptXmlInit()
    xml:ParseFile("ui_mm_main.xml")
    
    xml:InitStatic("back_movie", self)
    xml:InitStatic("background", self)
    xml:InitStatic("fire_movie", self)
    self.shniaga = xml:InitMMShniaga("shniaga_wnd",self);
    
    self.message_box = CUIMessageBoxEx()
    self:Register(self.message_box, "msg_box")    
    
    local _ver = xml:InitStatic        ("static_version",self)
    local mm                        = _G.main_menu.get_main_menu()
    _ver:SetText                    ("ver. " .. mm:GetGSVer())
    
end
AMK 1.4.1 patch 2

Код
function main_menu:InitControls()
    self:Init(0,0,1024,768)              
    local xml = CScriptXmlInit()
    xml:ParseFile("ui_mm_main.xml")
    
    xml:InitStatic("back_movie", self)
    xml:InitStatic("background", self)
   -- xml:InitStatic("fire_movie", self)
    self.shniaga = xml:InitMMShniaga("shniaga_wnd",self);
    
    self.message_box = CUIMessageBoxEx()
    self:Register(self.message_box, "msg_box")    
    
    local _ver = xml:InitStatic        ("static_version",self)
    local mm                        = _G.main_menu.get_main_menu()
    --_ver:SetText                    ("ver. " .. mm:GetGSVer())
    local amk_title         = amk_ver.amk_title
    local amk_version        = amk_ver.amk_version
    local amk_revision    = amk_ver.amk_revision
    local debug_mode = ""
    _ver:SetText("Версия игры - " .. mm:GetGSVer() .. "  " .. amk_title .. " " .. amk_version .. " " .. amk_revision)
end

У них просто читается функция из скрипта amk_ver. Это даже лучше и проще.
Спасибо.
aka_sektor
Кто шарит в логике, подскажите, как тут дописать правильно, чтобы в сообщении указывалось имя NPC, а не писалось "Сообщение".
Код
[sr_idle@20]
on_game_timer = 10000 | sr_idle@30 %+sad_artefuck_ready =send_tip(sad_artefact_upgr_ready:sad_atr_trader) -sad_atr_trader_go_kitchen%

send_tip - понятно, что это функция в xr_effects.script

Есть даже такой комментарий:
Код
--[[
send_tip(news_id:sender:sender_id)
        1. news_id
        2. sender*
        3. sender_id*
        * - not necessary
--]]

news_id - это текст сообщения, т.е. string id. В моей логике имя sad_artefact_upgr_ready
sender - это иконка в секции tips_icons news_manager.script. В моей логике имя sad_atr_trader
sender_id - а это заголовок сообщения, story_id NPC.

story_id моего персонажа прописан в файле по пути: gamedata\configs\creatures\spawn_sections_sad.ltx

И выглядит так:
Код
[sad_atr_trader]:stalker
$spawn                     = "respawn\sad_atr_trader"
character_profile     = sad_atr_trader
story_id = sad_atr_trader

Т.е. в логике я указал как:
Код
[sr_idle@20]
on_game_timer = 10000 | sr_idle@30 %+sad_artefuck_ready =send_tip(sad_artefact_upgr_ready:sad_atr_trader:sad_atr_trader) -sad_atr_trader_go_kitchen%

Дело в том, что хоть story_id и указан, заголовок все также остается как "Сообщение".
aka_sektor
UPD:
Я все-таки думаю, что story_id читается, но не отображается. Потому что, если указать другое имя, не являющееся story_id - игра вылетит.
Думаю, дело в функции send_tip в news_manager.script. Там не прописано отображение имени.
Возможно, что-то со времен прошлых игр удалили из скриптов, т.к. я действительно не помню чтобы в ЗП игрок получал сообщения с подписанным именем NPC.
AndreySol
Цитата(aka_sektor @ 11.06.2017, 22:45) *
...чтобы в сообщении указывалось имя NPC, а не писалось "Сообщение".

Цитата
Думаю, дело в функции send_tip в news_manager.script. Там не прописано отображение имени.

Зачем гадать ? Открыть скрипт и посмотреть код !
Код
    local news_text = "%c[255,160,160,160[b]]"..game.translate_string("st_tip").."[/b]\\n".."%c[default]"..game.translate_string(news_id)
    actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(x,y,83,47), timeout*1000, showtime)

st_tip(в gamedata\config\text\rus\ui_st_pda.xml):
<string id="st_tip">
<text>Сообщение</text>
</string>
Если очень хочется - доработать ф-цию, в ее начале по StoryID получаем объект, соответственно получить от объекта его игровое имя и подставить вместо game.translate_string("st_tip").
aka_sektor
AndreySol, сорян, тут не отписался, уже давно разобрался. Подсказали правильную функцию: http://ap-pro.ru/forum/114-90122-1046243-16-1497252988
ForserX
Цитата(aka_sektor @ 24.06.2017, 10:59) *

Мне кажется или тут "end" не хвататет?


P.S. Уж не злитесь, очень давно скрипты не писал.

RayTwitty
Код
if ... then
end
elseif ... then
end
не тоже самое, что
Код
if (...) {
}
else if (...) {
}

Логику закрывающих ключевых слов проверьте. Выход из выражения не в том месте.
Anarchy
Подскажите. Всеми известный скрипт xrs_armor.script будет работать на платформе зп, если заменить все переменные, или всё же требуется изменение скрипта?
NanoBot-AMK
Сейчас работаю над новым гравиприводом, обнаружил такой баг, когда НПС выхватывает оружия у врага, и притягивает его с себе, то срабатывает команда self.target:transfer_item(self.target, self.parent), и захваченное оружие отправляется к НПС в инвентарь, в логе выскакивает:
~ ERROR: can't detach independant object. entity[wpn_bm160159:159], parent[wpn_bm160159:159], section[wpn_bm16]
И меняется у НПС clsid с script_stalker=33 на 83.
Мод AI additions версия 2.0 fix3
Может именно в нём дело.
Кстати, да, у меня НПС могут использовать гравипривод, выхватывая оружие у врагов, и ещё в планах научить доставать разные вещи из аномалий.
NanoBot-AMK
У кого есть дока по методам для управления сталкеров типа set_item и другим методам? Что у меня плохо получается непысей программировать.
Gaz24
Всем привет. Мне нужно удалить вещи из инвентаря НПС при старте игры (например удалить ПДА), причем отдельным скриптом. Проблема заключается в подключении. Пробовал через bind_stalker и xr_motivator подключать, не получается. Хотя в Ai Addtitions спавн вещей через скрипт работает (в сехеме rx_knife функция spawn_knife(npc)).
aka_sektor
Цитата(Gaz24 @ 21.09.2017, 23:24) *
удалить вещи из инвентаря НПС при старте игры

А изначально его инвентарь отредактировать что мешает?
Gaz24
Цитата(aka_sektor @ 22.09.2017, 00:37) *
Цитата(Gaz24 @ 21.09.2017, 23:24) *
удалить вещи из инвентаря НПС при старте игры

А изначально его инвентарь отредактировать что мешает?


Проблема в том, что ПДА для сталкеров не прописывается ни в конфигах, ни в скриптах. Так что мне надо его удалить через скрипт.
aka_sektor
Цитата(Gaz24 @ 22.09.2017, 06:29) *
ПДА для сталкеров

А каким образом он вообще попадает NPC в инвентарь? Какой-то мод? В оригинале не выпадали им КПК.
Глянул бы как там устроено в моде то, может банальный death_manager.
RayTwitty
Цитата(Gaz24 @ 22.09.2017, 06:29) *
что ПДА для сталкеров не прописывается ни в конфигах, ни в скриптах

config\gameplay\character_*.xml файлы персонажей смотрел? ПДА там должен прописываться.

device_pda, вроде так называется.
Gaz24
Цитата(RayTwitty @ 22.09.2017, 14:42) *
config\gameplay\character_*.xml файлы персонажей смотрел? ПДА там должен прописываться.

device_pda, вроде так называется.


Искал Notepad'ом++. Выдало только 1 результат, да и то в энциклопедии. Я уверен что спавн ПДА очень хитро завязан профили персонажей.

aka_sektor
Цитата(Gaz24 @ 22.09.2017, 17:40) *
энциклопедии

Это просто статья в "энциклопедии". В оригинале, описание предметов выпилили из КПК в ТЧ. Восстановлено в "Истории Прибоя".

Ты хоть заскринь, что имеешь ввиду. Ты так и не ответил, что там у тебя? Мод или что?

В ТЧ есть секция device_pda в gamedata\config\misc\items.ltx
Gaz24
Цитата(aka_sektor @ 22.09.2017, 18:45) *
Ты хоть заскринь, что имеешь ввиду. Ты так и не ответил, что там у тебя? Мод или что?


Прошу прощения. Я пока в чистом ТЧ делаю эту фичу, но потом добавлю ее свой мод. Хочу удалить из инвентаря неписей пда. Я заметил, что если удалить пда у живых неписей, то в контактах они не будут отображаться. Причем сделать так, что у них в место пда был предмет "выключенный пда или т.п." на классе антирадина или гитары. И хотел бы сделать в отдельном скрипте через подключение в bind_stalker и xr_motivator.

Такая идея у меня появилась после Lost Alpha, где враги в контактах не отображались.

Секцию пда в items.ltx смотрел. Ничего интересного в ней не нашел. Разве что проверить класс в ресурсах или исходниках.
aka_sektor
Цитата(Gaz24 @ 22.09.2017, 18:10) *
Я пока в чистом ТЧ делаю эту фичу

laugh.gif
Прикалываешься? Сам добавил, а потом спрашиваешь как удалить.
Все я сваливаю...
Gaz24
Цитата(aka_sektor @ 22.09.2017, 19:12) *
Сам добавил, а потом спрашиваешь как удалить.

В том то и дело, что я ничего не добавлял. Потому и спрашиваю где у сталкеров пда спавнится, если нет никаких секций спавна ни в конфигах, ни в скриптах.
Trollz0r
Боюсь, что пда — это часть сущности сталкиров в системе алайф scratch_one-s_head.gif нехай программисты скажут точно
hi_flyer
Если не ошибаюсь, ПДА ровно как и болт спавнит движок в НПС. Без сторонних .ltx или .xml
RayTwitty
Цитата(Gaz24 @ 22.09.2017, 18:10) *
Я заметил, что если удалить пда у живых неписей, то в контактах они не будут отображаться

Ясен пень, ПЫС на этапе тру разработки сделало все по уму - отображаются не НПС на карте, а именно ПДА)

Кстати, а ведь в оригинале ПДА скрыты при обыске, ибо находятся в слоте. Так зачем удалять их?
SkyLoader
Если в игре ломаются скрипты(биндеры), то после смерти неписей можно увидеть у них в инвентаре пда, гармошки, гитары, которые из за поломки скриптов не удаляются. Причем пда имеет название, завязанное на имени непися, например, "Пда Васян Маслинный". Очевидно предположить, что это делается в движке, так как пда и непись связываются.
Удалить пда у живого непися скорее всего можно, но это может повлечь за собой последствия. Лучше не стоит этого делать.
Gaz24
Цитата(RayTwitty @ 22.09.2017, 20:26) *
Кстати, а ведь в оригинале ПДА скрыты при обыске, ибо находятся в слоте. Так зачем удалять их?


Они не скрыты. После смерти удаляются detath_manager'ом. А удалить ПДА я хочу чтобы вместо него добавить в инвнтарь неписю предмет "выключенный пда" или вообще не ничего не добавлять, чтобы придать некого реализма.
AndreySol
Цитата(Gaz24 @ 22.09.2017, 20:38) *
... чтобы вместо него добавить в инвнтарь неписю предмет "выключенный пда" или вообще не ничего не добавлять, чтобы придать некого реализма.

В чем реализм - сталкер, которому прилетело насмерть в голову, все-же успел выключить ПДА... "из последних сил"?
Gaz24
Цитата(AndreySol @ 23.09.2017, 09:01) *
В чем реализм - сталкер, которому прилетело насмерть в голову, все-же успел выключить ПДА... "из последних сил"?


Реализм заключается в том, что ПДА удаляется и спавнится вместо него "выключенный" еще у живых нпс . Например чтобы не палится в контактах других у сталкеров, или вообще ПДА сломан у него, ну и т.д.
aka_sektor
Словил тут вылет, когда помер в ЗП:
Код
xr_conditions.script:2196: attempt to index field 'actor' (a nil value)

Точнее при загрузке последнего сохранения.

В кондишнс у меня добавлен код:
Код
function sad_predateli_pda()
if (db.actor:object("sad_mudak_pda") ~= nil) and not (db.actor:has_info("sad_predateli_info")) then
db.actor:give_info_portion("sad_predateli_info")
end
end


2196 это вторая строка, которая if
В чем тут дело?

Изначальная функция взята отсюда: http://www.amk-team.ru/forum/topic/8806-co...#comment-349951
RayTwitty
Цитата(aka_sektor @ 05.12.2017, 20:04) *
при загрузке

Ты хочешь получить клиентский объект актора до того как он появился. Это надо делать на net_spawn или ставить колбек на выход в онлайн (тема избитая).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.