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

Скриптование


Svoboда

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

 

 

итерация захватывает удаленный предмет, как решить?

для ЗП я использовал метод drop_item_and_teleport. Из инвентаря он при этом точно удаляется движком. Есть ли такое в ТЧ не знаю.

Поделиться этим сообщением


Ссылка на сообщение

 

 

я использовал метод drop_item_and_teleport

забыт уточнить. Предмет всё равно надо удалить, т.к. иначе потом метод level.object_by_id может его найти. Главное то, что он в инвентаре болтаться не будет и не надо ждать отработки уборщика.


 

 

Кстати не помогло.

дайте кусочек кода (хотя сюда, хоть в личку) мне просто интересно посмотреть.

Поделиться этим сообщением


Ссылка на сообщение

 

 

Помогите с кодом.

попробуйте так

get_console():execute("save" .. ' '..self.edit1:GetText())

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
Можно вообще любые элементы худа, окна статики и их наполнение любого вида и размера рисовать как вздумается и без xml.

У меня при создании скриптом (без xml) у списка полоска прокрутки всегда стоит слева и направо её загнать не получается. Всё остальное легко, но не всегда такой путь лучший.

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
как можно исправить?

Я бы переписал так:

 

 

 



function give_money(victim,who)
    local mon5_40,mon20_70,mon60_110,mon120_500 = math.random(5,40),math.random(20,70),math.random(60,110),math.random(120,500)
    local tbl_zom = {
        "zombie_trup2" = mon5_40,
        "zombie_trup" = mon5_40,
        "zombie_weak" = mon5_40,
        "zombie_hell13" = mon5_40,
        "zombie_babka_weak" = mon5_40,
        "electro_zombie" = mon5_40,
        "elekt_zomb1" = mon5_40,
        "zombie_normal" = mon20_70,
        "zombie_hell14" = mon20_70,
        "zombie_hell12" = mon20_70,
        "zombie_hell10" = mon20_70,
        "zombie_hell1" = mon20_70,
        "zombie_babka_normal" = mon20_70,
        "zombie" = mon20_70,
        "elekt_zomb2" = mon20_70,
        "elekt_zomb3" = mon20_70,
        "elekt_zomb4" = mon20_70,
        "zombie_ghost" = mon60_110,
        "zombie_blow" = mon60_110,
        "zombie_beee" = mon60_110,
        "zombie_hell15" = mon60_110,
--		"zombie_babka_normal" = mon60_110,
        "zombie_immortal" = mon60_110,
        "zombie_hell9" = mon60_110,
        "zombie_hell8" = mon60_110,
        "zombie_hell7" = mon60_110,
        "zombie_hell6" = mon60_110,
	"zombie_hell5" = mon60_110,
	"zombie_hell4" = mon60_110,
        "elekt_zomb5" = mon60_110,
        "elekt_zomb6" = mon60_110,
        "controller_babka" = mon60_110,
        "zombie_plague_komar" = mon120_500,
        "zombie_plague" = mon120_500,
        "zombie_babka_strong" = mon120_500,
        "zombie_strong" = mon120_500,
        "ghoul" = mon120_500,
        "vodjanoj" = mon120_500,
        "controller_flame" = mon120_500,
        "elekt_zomb8" = mon120_500,
        "electro_zombie_0" = mon120_500,
        "electro_zombie_1" = mon120_500,
        "electro_zombie_2" = mon120_500,
        "electro_zombie_3" = mon120_500,
        }
    local zom_sec = victim:section()
    if victim and tbl_zom[zom_sec] then
        if who:id() == db.actor:id() then
            dialogs.relocate_money(db.actor,tbl_zom[zom_sec],"in")
        elseif not IsMonster(who) then
            who:give_money(tbl_zom[zom_sec])
            game_stats.money_quest_update(tbl_zom[zom_sec])
            news_manager.send_tip(db.actor,who:character_name().." получил "..tostrng(tbl_zom[zom_sec]).." рублей", nil, nil, 2000)
        end
    end
end 

 

 

Изменено пользователем Serge!
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
Вылетает

Возможно надо попробовать переписать фрагмент кода 

local zom_sec = victim:section()
    if victim and tbl_zom[zom_sec] then
        if who:id() == db.actor:id() then
            dialogs.relocate_money(db.actor,tbl_zom[zom_sec],"in")
        elseif not IsMonster(who) then
            who:give_money(tbl_zom[zom_sec])
            game_stats.money_quest_update(tbl_zom[zom_sec])
            news_manager.send_tip(db.actor,who:character_name().." получил "..tostrng(tbl_zom[zom_sec]).." рублей", nil, nil, 2000)
        end
    end

вот так

if victim then
        local zom_sec = victim:section()
        if tbl_zom[zom_sec] then
            if who:id() == db.actor:id() then
                dialogs.relocate_money(db.actor,tbl_zom[zom_sec],"in")
            elseif not IsMonster(who) then
                who:give_money(tbl_zom[zom_sec])
                game_stats.money_quest_update(tbl_zom[zom_sec])
                news_manager.send_tip(db.actor,who:character_name().." получил "..tostrng(tbl_zom[zom_sec]).." рублей", nil, nil, 2000)
	    end
        end
    end

а вообще лучше бы знать куда Вы это хотите вставить. Я ориентируюсь на оригинал ТЧ. В нём bind_monster.script содержит всего 187 строк, а у Вас ошибка в 611 строке. Очень большая модификация!

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

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

В общем максимум, до работоспособности, получилось сделать так:

Нет комментариев.

 

 

Подскажите как поменять цвет текста, выводимых сообщений?

Не знаю, но думаю что никак, т.к. это функция движка.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@TIGER_VLAD, Спасибо! (модераторам, про кнопочку спасибо я знаю), век живи - век учись.

Изменено пользователем Serge!
  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
Оставить надежду навсегда?

Надежда умирает последней и очень мучительно.

А пока можно попробовать переписать таблицу weapon_classes_w_ammo вот в таком виде:

weapon_classes_w_ammo = {
    [clsid.wpn_ak74] = {adc = true, ex = {}},
...
    [clsid.wpn_lr300] = {adc = true, ex = {"wpn_flame",}},
...
    [clsid.wpn_svd] = {adc = true, ex = {"wpn_gravigun",}},
...
    [clsid.wpn_binocular] = {adc = false, ex = {}}, 
...
}

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

Как это сделать? это уже другой вопрос и не очень сложный.

Можно и ещё упростить исходную таблицу выкинув, избыточное в общем то, логическое значение adc и оставив в ней только классы требующие разрядки  со значением в виде таблицы исключений,т.е.

weapon_classes_w_ammo = { 
[clsid.wpn_ak74] = {},
 ... 
[clsid.wpn_lr300] = {"wpn_flame",},
 ...
}
Изменено пользователем Serge!
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
А dsh на предыдущей странице писал что таблицы надо заполнять вот так:

Это тоже самое, только вид сбоку. В последнем случае мы имеем массив,  а в первом - таблицу значений. Таблица в данном случае избыточна, т.е. просто зря тратится память.

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

зависит от реализации, сужу по тому как это сделано в других языках/системах
В общем случае это так и есть. Однако в Lua, изначально ориентированном на обработку массивов, внутренняя организация очень быстрая и при таких мизерных размерах этих структур в Сталкере разницы практически не будет. К тому же алгоритм реализации цикла for в Lua один из самых быстрых и оптимальных. Так что кодовая оптимизация становится определяющей. ИМХО.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
Помогите исправить...

Может так?

function spw_rad_high_food()

    if interval < time_global() then
        local st = true
        db.actor:iterate_inventory(function (dummy,item)
            if items_rad_high[item:section()] then
                this.del_item(item)
                this.spawn_item(tostring(item:section().."_high"))
                if st then
                    news_manager.send_tip(db.actor, game.translate_string("tag_bad_food_tip")) (!!!вот кусок который добавил)
                    st = false
                end
            end
        end, nil)
        interval = time_global() + 2000
    end
 end

 

 

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

ocal s_obj = {"[[ep\military\ml1]]","[[ep\military\ml2]]","[[ep\military\ml3]]"}
Длинные строки в Lua, на сколько мне помнится, имеют несколько другой синтаксис. Может стоит попробовать написать так:
ocal s_obj = {[[ep\military\ml1]],[[ep\military\ml2]],[[ep\military\ml3]]}
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
Romann, Serge!, Dennis_Chikin, никто из вас не прав, в данной проблеме...

Да уж нет "уважаемый". В данной проблеме не правы Вы и только Вы. Указанный вам факт не являлся единственным ляпом представленного кода. Вот, пожалуйста, второй.



local s_obj=s_obj[ math.random(#s_obj) ]

Если Вы немного освежите в памяти описание Lua (или изучите его), то узнаете, что после описания local s_obj = ... доступ к разделу памяти таблицы звуков s_obj полностью будет потерян и все потуги в последующими буковками - просто ничто. А получилось в конечном примере потому, что там было изменено само имя таблицы звуков, но если даже и в ней написать длинные строки, как было написано раньше - гарантировано будет вылет.

 

Таки кто не прав?

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Nazgool, Т.к. речь начиналась с необходимости создания именно "дубликата", то @Kirgudu более прав (или "правее"?) чем Вы.

ipairs "продублирует" массив только до первого появления nil в качестве значения элемента массива. Ведь именно поэтому второй вариант  вашего примера ничего на печать и не выводит (хотя массив и не пустой),  а массивы со значением nil -  не такая уж и редкая вещь. Естественно я рассматриваю только массивы c числовыми индексами (ключами), которые и приведены в Вашем примере. Использование pairs "дубль" не создаст, хоть вы и получите новый массив без элементов со значениями nil.  ИМХО.

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
Если работать с массивами правильно, то такой необходимости не возникнет в принципе.

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

 

 

 

оба варианта (for i=1,#t и ipairs) в  luajit, то заметной разницы в скорости выполнения ты не увидишь.

Говорить о скорости при обработке таблиц в цикле for для Lua (в разрезе Сталкера с его относительно небольшими таблицами) это просто разговор ради чтоб поговорить. Lua разрабатывался для обработки именно таблиц с миллионами элементов. А цикл for там (по заверению разработчиков) один из самых оптимальных и быстрых.

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
в соответствии со стандартом языка невозможно сделать такие параметры со значениями nil.

Позвольте с Вами не согласиться. А как-же целое понятие о "слабых таблицах" введённых и подробно рассмотренных разработчиками языка? Я не проверял работает ли это в Lua Сталкера, но и пока нигде не читал, что это не применимо.

К тому же вспомните про параметры функции. Это что? Таблица - передается через стек, но стек в Lua это тоже таблица. А помните, что пареметры позиционно зависимы и могут отсутствовать, но их позиция должна быть определена? А это что такое? Дырки - т.е. nil. Вам никогда не встречались дистрибутивные функции, в которых прописана проверка параметров на nil? Мне встречались. Далее: "Последние отсутствующие параметры могут просто не указываться". Вам такое ничего не напоминает? Но ведь это стандарт языка в части определения таблиц. Так возможны и применимы или нет - nil в таблицах? А Вы говорите... см. цитату.

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

Работать можно заставить почти всё... даже стандартные методы, но не совсем стандартными способами и подходами. Практика говорит именно о таком.

 

P.S. Дискуссия по этому вопросу (не слишком существенному) и впрям затянулать. Боюсь получить очередное взыскание, а по сему это было последнее, что я говорю по этому поводу. Все остальные непонятки только в ЛС, если у кого такое желание возникнет (прошу заранее снисхождения, т.к. я их читаю очень не регулярно).

P.P.S. Что касается LuaJIT 2х, то про это в разрезе Сталкера говорить вообще не стоит, т.к. если это и будет кем-то реализовано???, то это уже будет не этот Сталкер и не этот форум.

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Не хотел продолжать, но Вам отказать не могу. Уважаю.

 

Стек - это стек, таблица - это таблица. Это разные вещи.

А как быть с этим? Только цитаты из "Программирование на языке Lua. Третье издание."

1. "Таблицы являются главным (на самом деле единственным) механизмом структурирования данных в Lua."

2. "Поскольку таблицы являются динамическими сущностями, то реализовать связанные списки в Lua довольно легко."

3. "... Например, мы можем представить стек как (неограниченный) массив.".

А теперь спросим: Что такое же это такое стек? Я (и не только я) отвечу - это связанный список.

А что такое связанный список (т.е. стек) в понятиях и реализации Lua? Ваш ответ.

 

Это вообще не о том.

Не скажите. Весь этот механизм и был для этого разработан, т.к. таблицы МОГУТ иметь и ключи и значения nil, т.е. для нас здесь существенно что могут! и имеют (они им не свойственны и, в некоторых случая, противопоказаны, но могут же!). Вот ведь даже Разработчики так предполагали и разработали механизм для купирования таких моментов. Для чего? Это другой вопрос и мы сейчас не об этом. Правильно это или не правильно... сейчас тоже не об этом. А об этом сейчас что? - то, что такое возможно.

 

просто он не должен быть неправильно сформирован.

А вот это чистый популизм. Массив должен быть сформирован так, как это требуется для решения поставленной задачи. Всё остальное зависит от квалификации исполнителя в определённой области знаний. Посмотрите вокруг. Сколько ваших коллег для решения своих (не самых трудных) задач правят движок сталкера, хотя они подчас могут быть решены и без такого грубого вмешательства? Я противник этого и поэтому для решения своих проблем ищу лазейки в рамках определённых мне разработчиками. А кто ищет, тот почти всегда находит.

 

Вот бы этот пуризм да в мирное русло, например применительно к вычищению всякой грязной нестандартщины из вашего любимого "того Сталкира". Но нет, вся энергия направляется на защиту заведомо ошибочного подхода.

Что значит "нестандарщины" из вашего любимого "того Сталкира"? У Вас есть другой Сталкер? Где я могу посмотреть стандарт, от которого так отличается "тот Сталкер"? Фи, это не солидно. Сколько лет уже живёт этот "ошибочный подход"? А сколько лет живут или жили те творения, которые сделаны на его основе? Статистики пока нет, это точно. Да, "тот Сталкер" (ЧН практически не знаю) мне симпатичен. Это плохо? Новые? Симпатичны далеко не все. Это хорошо?

А зашищать?... это очень далеко от меня. Я просто иногда занимаюсь тем, что мне интересно на данный момент.

 

Теперь точно всё.

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

Что означет db.actor в коде функции?

Ссылку на глобальную переменную "actor", находящуюся а файле db.script.

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

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