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

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

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

 

Добавлено через 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 пользователей

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