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

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


Svoboда

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

(изменено)

bill_gates, по поводу таймера уже когда-то говорилось в теме Ковыряемся в файлах Stalker SoC, так что поиск рулит. :)

 

А если по делу, то АМКшный таймер делаеться так:

amk.start_timer(name,delay,action) - стартует таймер в реальном времени.

amk.g_start_timer(name,delay_d,delay_h,delay_m,action) - стартует таймер в игровом времени.

 

-------

name - это название таймера

delay - это время (в секундах) через которое сработает таймер (для таймера реального времени).

delay_d - это кол-во дней после которых сработает таймер (для таймера игрового времени).

delay_h - это кол-во часов после которых сработает таймер (для таймера игрового времени).

delay_m - это кол-во минут после которых сработает таймер (для таймера игрового времени)

------

 

Также тебе нужно зарегистировать имя таймера в функции __do_timer_action (файл amk.script).

Делаеться это так (дописываешь эти строки в саму функцию):

 

if select_string=="название_таймера" then
    Здесь пишешь выдачу инфопоршна или чего-нибудь другое, что должно происходить после выполнения таймера
end

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

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


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

кровоSTALKER,

db.actor.radiation = x

Где x - кол-во прибавляемой (!) радиации.

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

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


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

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

local weapon = db.actor:item_in_slot(2)    
if db.actor:active_slot()==2 and weapon and weapon:section()=="wpn_vintorez_m2" then db.actor.radiation = 0.0001

Эту штуку суешь в апдейт актора (ф-ия actor_binder:update(delta) в файле bind_stalker.script) и после взятия твоего оружия в руки, радиация должна начать прибавляться (если оружие в слоте, но в руках его нет, то радиации не будет).

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

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


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

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


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

крово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. И если не ошибаюсь, то фризы бывают из-за чего-то другого...

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

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


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

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

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

 

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

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


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

крово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.

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

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


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

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

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

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

 

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

 

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

 

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

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

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


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

крово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 и используется в создании метки.

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


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

крово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. Объедини свои посты (удали новый, отредактируй старый). А то модерация предупреждениями закидает. :)

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


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

ФеНиКс, у тебя переменная flobals после 1-го удара принимает значение true и больше никогда не меняется. И следовательно усл-ие if npc and not flobals никогда больше не выполняется и о следующем усл-ии с проверкой расстояния и последующем ударе и думать не стоит. :) Тебе нужно присвоить flobals false и тогда все будет гуд.

 

Вот как-то так это выглядет:

local flobals = false

function static()
    local pos_mes = ""
    local npc = level_object_by_sid(006) 
    if npc and not flobals then
        if npc:position():distance_to(db.actor:position()) < 10 then
            local h = hit ()
            h.power = 1
            h.direction = vector():set (0, 0, 0)
            h.impulse = 0
            h.draftsman = npc--/ или db.actor  -- от кого дать хит
            h.type = hit.explosion
            db.actor:hit(h)--кому дать хит
            flobals = true
            level.add_pp_effector("fire_hit.ppe", 1974, false)
            news_manager.send_tip(db.actor, "%c[255,255,1,1]Т\\n%c[255,1,255,1]Дальше подойти нельзя! О%c[default]", 0, "tips_tatar", 8000)
        end
    end
    if npc and flobals then
        if npc:position():distance_to(db.actor:position()) => 10 then
            flobals = false
        end
    end
end

 

В этом коде flobals заново становится false когда ГГ от НПС будет на расстоянии равном или большем чем 10 (естественно если этот НПС жив).

 

P.S. А если просто удалишь строчку flobals = true, то тебя будет беспрерывно хренячить и так же беспрерывно будут присылаться сообщения.

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

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


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

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

 

P.S. Юзай таймеры или флаги.

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

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


Ссылка на сообщение
(изменено)
Stalk15, вот я вижу строчку local npc = level.object_by_id(id). Хорошо. А вот откуда берется сам id мне не ясно. Вот это плохо. Изменено пользователем Министр

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


Ссылка на сообщение
(изменено)
Stalk15, т.е. "упростить"? Если честно то, что ты написал и так самый легкий способ. Конечно можно сделать таблицу и цикл, чтобы он все значения перебирал, но оно тебе надо? Это не только для сис-мы тяжелее, но и в написании. Изменено пользователем Министр

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


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

Stalk15, у НПС костюмов и слотов как таковых нету...

 

P.S. Можно узнать визуал непися (название модели, которую сейчас использует НПС) и через него определить, что на него одето.

 

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

 

Stalk15, через нет-пакет.

 

По-моему get_current_outfit() вообще не работает и как я говорил у неписей вообще костюмов как таковых нет...

 

P.S. А по нет-пакетам достаточно инф-ии на форуме, также можно посмотреть скрипты того же АМК или IMM (интелликтуал марадер мод или как там его, он в Мастерской есть).

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

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


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

Oxygenium, в логе сказано, что ошибка произошла из-за сравнения какого-то числа с nil. Так что по идее, передача вещей не причем.

 

lexer125, название аргументов (или как там их) ничего не меняет. Тем более в оригинале (trader, actor).

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


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

Stalk15,

local coms_text = {
stalker = "со Сталкером",
freedom = "со Свободовцем",
dolg = "с Долговцем",
ecolog = "с Экологом"
}

function ololo()
    if db.actor:is_talking() then --проверяем разговариет ли актор
        for k, v in pairs (db.storage) do --если разговариет, то перебираем неписей в поисках собеседника
            local npc = level.object_by_id(k)
            if IsStalker(npc) and npc:is_talking() and coms_text[npc:character_community()] ~= nil then
                news_manager.send_tip(db.actor, "Говорим "..coms_text[npc_stalker:character_community()], 0, "freedom", 5000)
            end
        end
    end
end

 

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

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

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


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

Stalk15,

Во-первых: ты делаешь проверку на то, что актор не разговаривает в данный момент и если она проходит, то присваиваешь переменной stope false, все бы нормально, если не опять одно "но" - ты вставляешь свою проверку в усл-ие которые выполняется только когда актор разговаривает. И поэтому ничего удивительного, что вся конструкция у тебя выполняется только один раз.

 

Во-вторых: не надо делать без особой надобности усл-ия в усл-ях, например, тот же код:

if IsStalker(npc) and npc:is_talking() and coms_text[npc:character_community()] ~= nil then
  if not stope then...

Можно представить в виде одной строки:

if IsStalker(npc) and npc:is_talking() and not stope and coms_text[npc:character_community()] ~= nil  then...

 

По-моему так более читабельно, хотя решать тебе, это всего-лишь совет. :)

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

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


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

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

AMK-Team.ru

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