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

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

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

 

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

Pihan13, по разному. Через скрипт легче, да и меньше шанс ошибки, а через ол.спавн тежялее, вероятность ошибки, да и лишнии "мегабайты" в МОДе

 

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

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

:offtopic:

и ещё: к примеру у меня есть координаты:

position = -139.449829101563,-29.6908683776855,-351.492797851563

обязательно писать их такими длинными? можно к примеру написать?

position = -139.4,-29.6,-351.4

Математик блин, округление десятичных дробей не проходил в 5ом классе?

А ты сказал себе "Ы?"
Ссылка на комментарий
АНДРЮ}{@, Я вот про это и спрашивал. Ато я округлял, а ничего не выходило :( (но округлял правильно :)) - значит дело в скрипте Изменено пользователем Pihan13
Ссылка на комментарий

меченый(стрелок), ccорь, но можешь еще объяснить тупому.

решил сделать респаун монстров через каждые 6 минут(для теста)

вот скрипт

local actor = db.actor

function main()
spawn_all()
end

--Спавним все аномалии
function spawn_all(respawn)
if load("spawn_anom",false)==false or respawn==true then
--test
spawn("sim_default_monolith_3",vector():set(-170.53266906738,0.67925143241882,-312.03155517578),1,135)



-- РЕСПАВН МОНСТРОВ
--== БОЛОТА
--БЮРЕРЫ   
spawn("burer_weak",vector():set(347.982788085938,1.15263211727142,362.435119628906),1,135)
spawn("burer_normal",vector():set(-181.321166992188,2.20583915710449,536.22412109375),1,135)   
spawn("burer_strong",vector():set(106.57487487793,1.11209356784821,331.199737548828),1,135)
-- ХИМЕрЫ

spawn("chimera_normal",vector():set(12.362359046936,1.20762395858765,465.655242919922),1,135)
spawn("chimera_normal",vector():set(-103.976005554199,0.348260492086411,334.711975097656),1,135)



   save("spawn_anom",true)
end
end

function create_anom(section,rad_anom,x,y,z,lv,gv,mode)
        --   con(section)
      if gv==nil then gv=db.actor:game_vertex_id() end
      if lv==nil then lv=db.actor:level_vertex_id() end
      if pos==nil then pos=db.actor:position() end

      local p_obj = alife():create(section,vector():set(x,y,z),lv,gv)

      local packet = net_packet()
      packet:w_begin(0)
      p_obj:STATE_Write(packet)
      packet:r_seek(2)

    local game_vertex_id = packet:r_u16()
    local cse_alife_object__unk1_f32 = packet:r_float()
    local cse_alife_object__unk2_u32 = packet:r_s32()
    local level_vertex_id = packet:r_s32()
    local object_flags = packet:r_s32()
    local custom_data = packet:r_stringZ()
    local story_id = packet:r_s32()
    local cse_alife_object__unk3_u32 = packet:r_s32()

    local shape_count = packet:r_u8()
    for i=1,shape_count do
        local shape_type = packet:r_u8()
        if shape_type == 0 then
            local center = packet:r_vec3()
            local radius = packet:r_float()
        else
            local box = packet:r_matrix()
        end
    end

    local restrictor_type = packet:r_u8()

    local cse_alife_custom_zone__unk1_f32 = packet:r_float()
    local cse_alife_custom_zone__unk2_u32 = packet:r_s32()
    local on_off_mode_enabled_time = packet:r_s32()
    local on_off_mode_disabled_time = packet:r_s32()
    local on_off_mode_shift_time = packet:r_s32()

    local offline_interactive_radius = packet:r_float()
    local artefact_spawn_places_count = packet:r_u16()
    local cse_alife_anomalous_zone__unk1_u32 = packet:r_s32()

    local last_spawn_time_present = packet:r_u8()

--    if packet:r_elapsed() ~= 0 then abort("left=%d", packet:r_elapsed()) end

    packet:w_u16(game_vertex_id)
    packet:w_float(cse_alife_object__unk1_f32)
    packet:w_s32(cse_alife_object__unk2_u32)
    packet:w_s32(level_vertex_id)
    packet:w_s32(object_flags)
    if mode~=nil then custom_data = mode end
    packet:w_stringZ(custom_data)
    packet:w_s32(story_id)
    packet:w_s32(cse_alife_object__unk3_u32)

    packet:w_u8(1)
    packet:w_u8(0)
    local sphere_center = vector()
    sphere_center:set(0, 0, 0)
    packet:w_vec3(sphere_center)
    radius = rad_anom
    packet:w_float(radius)

    packet:w_u8(restrictor_type)

    packet:w_float(cse_alife_custom_zone__unk1_f32)
    cse_alife_custom_zone__unk2_u32 = bit_not(0)
    packet:w_s32(cse_alife_custom_zone__unk2_u32)
    packet:w_s32(on_off_mode_enabled_time)
    packet:w_s32(on_off_mode_disabled_time)
    packet:w_s32(on_off_mode_shift_time)

    packet:w_float(offline_interactive_radius)
    packet:w_u16(artefact_spawn_places_count)
    packet:w_s32(cse_alife_anomalous_zone__unk1_u32)

if mode == nil then

    packet:w_u8(last_spawn_time_present)
end
    p_obj:STATE_Read(packet, packet:w_tell()-packet:r_tell())
  --    add_spot_on_map(p_obj.id,"red_location","Аномалия")


    return p_obj
end


-- Вывод инфы в консоль
function con(msg)
get_console():execute(msg)
end


-- Записываем переменную
function save(variable_name, value)
    xr_logic.pstor_store(db.actor, variable_name, value)
end

-- Загружаем переменную
function load(variable_name, value_if_not_found)
    return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

-- Удаляем переменную
function del(variable_name)
    if db.storage[db.actor:id()].pstor[variable_name] then
        db.storage[db.actor:id()].pstor[variable_name] = nil
    end
end

-- Функция спауна объекта
function spawn(section,pos,lv,gv)

--    vector():set(x,y,z) 

      if gv==nil then gv=db.actor:game_vertex_id() end
      if lv==nil then lv=db.actor:level_vertex_id() end
      if pos==nil then pos=db.actor:position() end

      if section==nil then
      con("Не_указанная_секция")
      else
      return alife():create(section,pos,lv,gv)
      end

end

 

далее в amk_mod.script добавил строку таймера и вот что получилось:

local nrg,med,cnt,gv,lv,w


-- Эта функция вызывается первой. Онлайновые объекты недоступны! db.actor недоступен!
function on_game_start()
    math.randomseed (device ():time_global ())
end

function first_run() 
    if amk.load_variable("x_first_run",true) then
        amk.g_start_timer("main",0,0,6) -- вызов респауна!!!!!!!!!!!!
        amk.g_start_timer("gg_need_sleep",0,0,6)
        --amk.g_start_timer("show_news",0,0,10)
        amk.spawn_item_in_inv("matras")
        amk.save_variable("x_first_run",false)
    end
end 
......... а там далее спальник пошел...

 

 

потом как ты и сказал в amk.script там где надо вписал ето

--- функция респавна монстров

if select_string=="main" then
new_monsters.main()
amk.g_start_timer("main",0,0,6)    
end

 

 

Проблема в том, что тестовый монолитовец после старта и6 минут спаунится, валит там пару ребят,НО больше он не спаунится, один раз только, и все, хотя он же должен каждые 6 минут вариться,

Вопрос, я неправильно сбросил таймер, как его надо было сбрасывать???

 

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

И можно это как нибудь поправить???

Что-то кончается, что-то начинается...

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

Vano_Santuri,из своего скрипта удали

if load("spawn_anom",false)==false or respawn==true then

...

...

save("spawn_anom",true)

end

end

 

Удали ,то что выделено...

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

меченый(стрелок),

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

Что-то кончается, что-то начинается...

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

Уважаемые корифеи рассуждая о системе A-Live и AI НПС игры S.T.A.L.K.E.R

я пришел к следуюшим выводам поправте если неправ.

Моды разблокирующие A-Live не решают проблему хотя и вносят разнообразие в игровой

процес.Первой мыслью было было то что не гулаги должны выбирать подходяшего

НПС а нпс гулаг примерно вот так лагерь новичков новички сидят у костра часов в 6

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

дефолтную либо свою логику а нагулявшись возврашаются назад к костру

если место в гулаге свободно либо в любой другой гулаг kamp

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

ответившим на мои дилетанские вопросы

Wawka еше раз спасибо подсказал решение а именно использовать вот эту функцию из

фаила xr_conditions

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

-- amk function

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

function time_hours()

if level.get_time_hours() >= 5 and level.get_time_hours() <= 22 then

return true -- день

else

return false -- ночь

end

end

 

переделав ее в

 

function time_testow()

if level.get_time_hours() >= 6 and level.get_time_hours() < 8 then

return true -- отдых

else

return false --

end

end

 

создав НПС в ал спавне

 

[1]

; cse_abstract properties

section_name = stalker

name = testow

position = -209.755249,-20.444433,-153.096436

direction = 0.062321275472641,0.00316426996141672,0.0140644172206521

 

; cse_alife_trader_abstract properties

money = 5000

character_profile = amk_test_testow

 

; cse_alife_object properties

game_vertex_id = 8

distance = 2.79999995231628

level_vertex_id = 8190

object_flags = 0xffffffbf

custom_data = <<END

[logic]

cfg = scripts\testow.ltx

[smart_terrains]

none = true

[spawn]

wpn_toz34

ammo_12x76_zhekan = 4

medkit = 3

kolbasa

END

 

; cse_visual properties

visual_name = actors\soldier\soldier_bandana_3

 

; cse_alife_creature_abstract properties

g_team = 0

g_squad = 1

g_group = 5

health = 1

dynamic_out_restrictions =

dynamic_in_restrictions =

 

upd:health = 1

upd:timestamp = 0x660a0d30

upd:creature_flags = 0x69

upd:position = -209.25016784668,-20.0724010467529,-141.015487670898

upd:o_model = 0

upd:o_torso = 0.00316426996141672,0.062321275472641,0

upd:g_team = 0

upd:g_squad = 1

upd:g_group = 5

 

; cse_alife_monster_abstract properties

 

upd:next_game_vertex_id = 65535

upd:prev_game_vertex_id = 65535

upd:distance_from_point = 0

upd:distance_to_point = 0

 

; cse_alife_human_abstract properties

predicate5 = 0,0,0,0,1

predicate4 = 1,1,2,1

 

; cse_ph_skeleton properties

 

upd:start_dialog =

 

; se_stalker properties

 

прописав точки пути

 

[testow_walk]

points = p0,p1,p2,p3

p0:name = wp00

p0:flags = 0x4

p0:position = -209.755249,-20.444433,-153.096436

p0:game_vertex_id = 61

p0:level_vertex_id = 43262

p0:links = p1(1)

 

p1:name = wp01

p1:flags = 0x2

p1:position = -206.181992,-20.517683,-148.460022

p1:game_vertex_id = 61

p1:level_vertex_id = 46562

p1:links = p2(1)

 

p2:name = wp02

p2:flags = 0x1

p2:position = -191.232422,-20.038328,-148.739609

p2:game_vertex_id = 46

p2:level_vertex_id = 60449

p2:links = p3(1)

 

p3:name = wp03

p3:flags = 0x1

p3:position = -182.478073,-20.137499,-143.810410

p3:game_vertex_id = 46

p3:level_vertex_id = 68212

p3:links = p0(1)

 

прописав в scripts\testow.ltx

 

[logic]

active = kamp

[kamp]

on_info = {=time_testow} walker

center_point = esc_lager_camp_center

path_walk = esc_lager_camp_center_task

soundgroup = esc_lager

meet = meet@lager

active = walker

[walker]

on_info = {!time_testow} kamp

path_walk = testow_walk

 

точки esc_lager_camp_center и esc_lager_camp_center_task тупо взяты из путей гулага esc_lager

 

в итоге наш НПС test_testow с начала игры сидит у костра с новичками а в 6 часов отправляется патрулировать (проверенно) теперь хочу заставить его свинюшек вынести ( на которых волк квест дает ) нечего меченому ерундой заниматся ну и

ночью пускай спит в подвале

к чему я все это понаписал ? просто как мне кажется на базе всего этого можно много чего сделать для улучшения S.T.A.L.K.E.R

Так как я не разбираюсь в скриптах может стоит создать отдельную тему в которой создав с нуля общего НПС тамогочи эдакого при помощи знающих товарищей и

их и наших идей попытатся написать ему достаточно сложную логику-расписание

хотябы для кордона ?

 

спасибо за внимание с уважением АККК1

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

AKKK1,

 

Это конечно интересно, и очень нужно , но тут стоит вопрос в другом, сделаем мы хотя бы 20 таких НПС с путями и логиками, а будем делать долго, ну так дня 2, а потом раз и убили их вояки или химера съест, потом пойдет респаун и все наш труд напрасен, если и делать такое, то только через скрипт, чтоб если непись, допустим: 1.5_patrul убили, то вместо нее заспаунить другую (худ,диалоги и т.д) но чтоб привязать эту же логику и пути(автоматически скриптом).

Может такое есть, но я не видел.Если провернуть такую штуку хотя бы с 30 процентами населения, это будет что-то новое в жизни сталкеров.Все реализуемо, кроме респавна неписи и привязкиой ему логики умершего скриптом.

Но может кто и сделает.

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

Что-то кончается, что-то начинается...

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

Vano_Santuri

Если я правильно понимаю то создав некую универсальную логику допустим

с 23 до 5 сплю потом у костра завтракую потом делами занимаюсь наверно можно например

 

здесь

 

[logic]

active = kamp

[kamp]

on_info = {=time_testow} walker вместо walker была какая нибудь переменная или функция заставляюшая нпс рандомно выбрать какуюто схему из нескольких ?

center_point = esc_lager_camp_center

path_walk = esc_lager_camp_center_task

soundgroup = esc_lager

meet = meet@lager

active = walker

[walker]

on_info = {!time_testow} kamp

path_walk = testow_walk

 

и прикрутив ее к уже имеюшимся НПС допустим новичкам в лагере

они и респаунится будут с ней ?

 

И еше наличее в игре таких персонажей как отец диодор

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

но почемуто это не сделали

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

AKKK1,

Да нет, у меня так не получалось, тех что ты прописал в алл.спауне, ты тут же убил, они больше не возобновятся респауном, а респаунится будут другие и без логики, их просто камп под себя подбирает и все, а там у же у кого какие функции.

 

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

 

ЗЫ если где-то не прав исправьте.

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

Что-то кончается, что-то начинается...

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

добрый день, есть задача: свой обработчик взрыва гранаты (скриптовая граната по сути)

сам момент броска гранаты отлавливаю через on_item_drop, там запоминаю gren_id=obj:id()

и потом в actor_update проверяю alife:object(gren_id), таким образом отлавливаю момент когда граната перестаёт существовать (что отличает брошеную от просто дропнутой)

но как оказывается граната перестаёт существовать как alife-обьект ещё задолго до того, как взорвётся, поэтому узнать координаты КУДА она упала - не получается.

 

Т.е. задача - узнать координаты гранаты во время взрыва. Не обязательно, чтоб она вообще взрывалась штатным образом. Пробовал болт - на него on_drop не срабатывает.

 

В идеале хотелось бы узнать не только координаты взрыва гранаты, но и точки попадения при выстреле из автомата, гранатомёта.

 

PS: делаю для ЧН

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

Мне подсказали что ответ на мой вопрос в allspaun, если повторяюсь сильно не пинайте! Что нужно менять для того чтобы прописать вещь в постоянные нычки? Точнее мне нужно прописать пару вещей в ящик в казарме на блокпосту на кордоне! Если можно в личку и подробно!) Поясню про тайники я знаю, мне надо чтобы вещ лежала там постоянно! Ну я имею ввиду без наводки!

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

Харки - Mobile DualCore Intel Core 2 Duo T6400, 2000 MHz, NVIDIA GeForce G 105M (512 Мб), 4Gb DDR3, Windows 7 Ultimate(64-bit)

Игровой набор - Соль от 19.04.2010 + допа 14.08.2010, кум-патч 03.09.2010

P.S., Ибо так возлюбил Бог мир, что отдал Сына своего единородного, дабы всякий верующий в Него, не погиб, но имел жизнь вечную. Иоанна 3:16

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

Tonny,

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


Подарки

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

    Bak

    похоже на то. Может, есть способ отловить момент выстрела из любого оружия?

    фактически ищу способ убить неубиенного кровососа в ЧН, так что подойдёт любой способ сделать кровососа в режиме невидимости убиенным, или каким-то чудом отключить ему невидимость вообще.

     

    MIXATOR

    в АМК моде есть оффлайновое заполнение тайников скриптами, для ЧН есть отдельный мод для этого же самого (на этом же форуме)

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

    Мне нужном для ТЧ, и если не трудно покажите пальцем!)

    Харки - Mobile DualCore Intel Core 2 Duo T6400, 2000 MHz, NVIDIA GeForce G 105M (512 Мб), 4Gb DDR3, Windows 7 Ultimate(64-bit)

    Игровой набор - Соль от 19.04.2010 + допа 14.08.2010, кум-патч 03.09.2010

    P.S., Ибо так возлюбил Бог мир, что отдал Сына своего единородного, дабы всякий верующий в Него, не погиб, но имел жизнь вечную. Иоанна 3:16

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

    MIXATOR

    для ЧН тут:

    http://www.amk-team.ru/forum/index.php?showtopic=1772

    автор сделал вырезку из АМК для ТЧ, соответственно, есть на что ориентироваться и что искать в скриптах АМК. Совсем пальцем в конкретные строчки не покажу.

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

    меченый(стрелок), а вот такой к вам вопрос: как всем хорошо известно, lua - язык, в котором функция является обычной переменной и может быть передана в аргументы другой функции. Тогда почему же в амк не используется универсальный таймер (т.е. такой таймер, в котором вызыванные функции могут быть произвольными), вызов которого будет с параметрами функций, например:

    new_timer (1, myscript.myfunc, 20)

     

    Добавлено:

    Vano_Santuri,

    на acdc_cs.pl или какой там у тебя, нажимаешь правой кнопкой -> изменить, или открыть с помощью, блокнота.

    Маньяк... D:

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

    IQDDD, Собственно вопрос не ко мне,а к xStream'у....

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

    я представляю эту функцию примерно так

     

    function new_timer(cr,func_name,min)

    local begin = false

    timer[cr]=game.time+min

    ...тут считаем

    if begin then

    func_name()

    begin=false

    end

    end

    собственно загвоздка в том,что нету возможности сохранить имя функции...следовательно...если будет скажем два вызова этой функции(таймера) с разными функциями(переменными),то,когда первый раз begin будет истинным ,произойдёт вызов всех функций....ИМХО...Если покажите свой способ,то попытаюсь объяснить,чем он хуже(хотя возможно и лучше)....

    ЗЫ:Насчёт АМК скажу, по моим "данным" в АМК 2.0 не будет функций от xStream'a - следовательно и таймер будет другим...

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

    попробую вопрос по-другому поставить, авось кто знает :)

    может, кто подскажет как выполнить один из вариантов:

    1. определить момент выстрела из оружия

    2. определить точку попадения пули

    3. определить координаты брошенной гранаты (перед взрывом) или болта

    (дополнительно)

    4. заставить кровососа в ЧН стать видимым и/или уязвимым.

    5. (Кстати, невидимый кровосос является game_object?)

     

    спасибо за внимание

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

    меченый(стрелок), давайте разберёся в аргументах моей функции: new_timer (1, myscript.myfunc, 20)

    Здесь первый - это номер таймера.

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

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

     

    Задача состоит в том, что создать псевдообъект таймера. Можно при вызове new_timer(...):

    Создать объект класса "timer" (его тоже надо создать заранее. Он будет представлять собой класс всего из четёрых свойств: number, procedure, active, interval) Свойства соответственно будут равны: number = 1. procedure = myscript.myfunc. active = true. interval = 20. Запоминаем объект этого класс в глобальную таблицу timerZ. С каждый апдейтом актора будет вызываться функция, проверяющая всю таблицу на наличие объектов класса таймер и, если надо, исполняющая функции, сохранённые в свойстве procedure объектов.

     

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

    Tonny, всё это можно (кроме 2. И то можно, только приблизительно и ОЧЕНЬ сложно. Без математики нельзя). Вот только вы изучили, что такое:

    1. bind_object

    2. callback

    3. класс

    4. методы update, net_destroy, __init(...) super(...) и пр. класса "bind_object"

    ?

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

    IQDDD

    да, имею представление и использовал.

     

    О коллбеках имею представление только о тех, которые встречались в каких-либо из модов, что мне попадались.

    Но отловить момент выстрела кроме как в update актёра проверять количество патронов в магазине оружия в слотах - фантазии пока не хватило.

    п.2. для меня не критичен, 1 и/или 3 - актуальнее (граната берестаёт быть алайф-обьектом задолго до взрыва, а на болт не реагирует on_item_drop)

    а всё это нужно восновном для п.4 (раз кровосос неуязвим - сделать против него спец.оружие)

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

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

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

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

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

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

    Войти

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

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

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

    AMK-Team.ru

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