Правила сайта FAQ Мини-чат
Для добавления необходима авторизация!
29.03.2024, Пятница, 18:19


  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Форум » S.T.A.L.K.E.R. - Моддинг » Разбираем S.T.A.L.K.E.R. » Уроки моддинга » Полезные функции (ТЧ)
Полезные функции
Сообщение #21
Graff46,
Код
function switch_online(actor, npc)           
local npc = alife():story_object(111)    
       if npc then    
          alife():set_switch_online (npc:id (), true)        
          alife():set_switch_offline (npc:id (), false)        
       end    
end

Где 111 это sid объекта.

Уважение: 650
Награды: 97
Облучение: 0%
Сообщение #22
Подскажите, есть ли функция для проверки находится ли ГГ в определённом смарттерейне или нет (например в лагере новичков (esc_lager))?
Сообщение отредактировал Graff46 - Понедельник, 20.05.2013, 21:41


Уважение: 4
Награды: 0
Облучение: 0%
Сообщение #23
Graff46, Нельзя. Поставьте в нужном месте рестриктор по размеру смарта и проверяйте в нем наличие актора.

Уважение: 650
Награды: 97
Облучение: 0%
Сообщение #24
Спасибо, я за это уже думал, это надо аллСпаун ковырять, не хотелось бы. А вообще в игре сообщения приходят когда, от Сидоровича например, по условию выходу из рестрикторов?

Уважение: 4
Награды: 0
Облучение: 0%
Сообщение #25
Graff46, Вот в "загашнике" нашел функцию:
Код
-- Проверка нахождения актора в особой зоне
function actor_in_zone(pos_psy_x,pos_psy_y,size_psy_x,size_psy_y,z1,z2)
local pos = db.actor:position()
local x1 = pos_psy_x
local x2 = pos_psy_y
local y1 = size_psy_x
local y2 = size_psy_y
if (pos.x >= x1 and pos.x <= x2) and (pos.z >= y1 and pos.z <= y2) and (pos.y >= z1) and (pos.y <= z2) then
  return 1
end
return 0
end

Правда я ее ни разу не пробовал, посмотри, может пригодиться?
Цитата (Graff46)

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

Существует скриптовый спавн спейсрестриктора, довольно простой, нужен только скрипт с нетпактом.
Веселый Роджер
Уважение: 936
Награды: 112
Сообщение #26
Frankenshtayn, Но опять же таки. Функцию придется ставить на апдейт. В то время, как рестриктор можно спавнить в самый последний момент, да и после отработки которого (если прописан nil) - ресурсы на проверку тратится не будут.
Более упрощенный способ:

Код
function bla_bla()
local pos = db.actor:position()
       if pos.x>65 and pos.y>30 and pos.z<40 then
          ........
       end
end


Со знаками можно поэкспериментировать :)

Цитата (Graff46)
А вообще в игре сообщения приходят когда, от Сидоровича например, по условию выходу из рестрикторов?

Выдать сообщения можно по разному. Рестриктор, таймер из диалога/рестриктора, наличие поршня/предмета и т.д

Уважение: 650
Награды: 97
Облучение: 0%
Сообщение #27
Так маленький примерчик: Когда юзаем дверь у Сидора, дверь открывается и отзывается инфопоршн

Код

esc_close_door, в коде это %-esc_close_door%


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

Код
[1616]
; cse_abstract properties
section_name = space_restrictor
name = esc_close_door_restrictor
position = -255.506713867188,-20.2865753173828,-127.440452575684
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 0
distance = 0
level_vertex_id = 594270
object_flags = 0xffffff3e
custom_data = <<END
[logic]
active = sr_idle

[sr_idle]
on_actor_inside = %+esc_close_door%
END

; cse_shape properties
shapes = shape0
shape0:type = box
shape0:axis_x = 2.64159965515137,0,0
shape0:axis_y = 0,2.22759985923767,0
shape0:axis_z = 0,0,2.64159965515137
shape0:offset = 0,0,0

; cse_alife_space_restrictor properties
restrictor_type = 3


nil, нет, значит рестриктор многоразового использования.

Собственно, логика двери:

Код
[logic]
active = ph_door@locked

[ph_door@locked]
locked = true
snd_open_start = trader_door_unlock
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%

[ph_door@closed]
closed = true
locked = false
on_use = ph_door@open %-esc_close_door%
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop

[ph_door@open]
closed = false
locked = false
on_use = ph_door@closed
on_info = {+esc_close_door} ph_door@closed
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop


Самое первое условие - это

Код
esc_trader_can_leave


выдается, когда мы поговорили с Сидором, т.е. если не поговорим, то дверь бесполезно юзать, не откроется.
Скриптовые рестрикторы - это считаю одним из лучших фишек в написании кода, благодаря которым можно писать любые сюжеты, не возвращаясь в начало игры, т.к. все мы знаем, что обычные рестрикторы пишутся в all.spawn, и любое изменение вступает в силу только с НИ. Если не ошибся, то автор создания спейсрестрикторов скриптовым методом - singapur22.

Ещё, про удаление любого объекта не по секции и по сиду, а по использованию его имя в all.spawn
В народной соли применялось часто и работает на ура. В ВШ, я удалил одной такой функцией двери у Сидора, самого Сидора, ноутбук, физ.об-кт броник найма, рацию.

Код
function del_esc_trader()
local se_obj = alife():object("escape_trader")
       if se_obj then
         alife():release(se_obj, true)
       end      
local se_obj = alife():object("trader_door")
       if se_obj then
         alife():release(se_obj, true)
       end
local se_obj = alife():object("trader_physic_object0014")
       if se_obj then
         alife():release(se_obj, true)
       end
local se_obj = alife():object("trader_physic_object0013")
       if se_obj then
         alife():release(se_obj, true)
       end
local se_obj = alife():object("physic_object0025")
       if se_obj then
         alife():release(se_obj, true)
       end
end


Также после взрыва 2 двери в бункере у Сахарова

Код
function del_yan_sahar_door()    
local se_obj = alife():object("door_trader_0000")
     if se_obj then
       alife():release(se_obj, true)
     end
local se_obj = alife():object("door_trader")
     if se_obj then
       alife():release(se_obj, true)
     end
end


Как здорово быть тёртым сталкером! Не бояться каждого шороха, оружия не носить с собой много!

Сообщение отредактировал dimak - Суббота, 25.05.2013, 01:58


Уважение: 389
Награды: 45
Облучение: 0%
Сообщение #28
Использую для смерти ГГ, функцию смерти ГГ на ЧАЭС.

Код
%=aes_kill_actor%


Как здорово быть тёртым сталкером! Не бояться каждого шороха, оружия не носить с собой много!

Уважение: 389
Награды: 45
Облучение: 0%
Сообщение #29
Всем привет! Вот нашел на просторах инета функцию, которая отрабатывает удар по морде ГГ. Рабочая проверено. Вызывал из диалога, но есть и другие способы.

На счет - AI additions, не плохая вещь у меня стоит. Советую.

Сообщение отредактировал butrikA - Пятница, 30.08.2013, 22:46


Уважение: 31
Награды: 3
Облучение: 0%
Сообщение #30
butrikA, А лог какой?
ЗЫ: Функция просто отыгрывает нужную анимку. Урона от нее не будет.

Тот же самый удар в лицо при надоедании НПС юзает анимку punch из state_lib.script. Более подробно можно глянуть в xr_abuse.script.

Если АМК, тогда rx_facer.script. Там уже расчитывается наносимый удар, кости, анимация, звуки и т.д

Уважение: 650
Награды: 97
Облучение: 0%
Сообщение #31
Цитата
Если АМК, тогда rx_facer.script. Там уже расчитывается наносимый удар, кости, анимация, звуки и т.д


Поправлю малость. Это не АМК, а AI additions от автора Bak



Как здорово быть тёртым сталкером! Не бояться каждого шороха, оружия не носить с собой много!

Уважение: 389
Награды: 45
Облучение: 0%
Сообщение #32
butrikA, данный файл идет из оригинала игры. Он есть, просто в скрипте ошибка в указании пути. У тебя camera_effects\fusker.anm, а надо camera_effects\\fusker.anm. Т.е не хватает одного слеша.
dimak, Действительно, в файлах черт ногу сломит :) АМК стоит с этим АИ паком.

Уважение: 650
Награды: 97
Облучение: 0%
Сообщение #33
Вот, может кому пригодится. Возможно возникнет необходимость проверить "народонаселение" какого-либо гулага:
Код
function имя_функции()                 
      if (xr_gulag.getGulagPopulation("имя_гулага") <= 1)  --здесь проверяем "больше", "меньше" или "равно"--
          then
--делаем что надо--  
      end  
end

вызываем в нужный момент, или если "очень надо" - ставим на апдейт
Веселый Роджер
Уважение: 936
Награды: 112
Сообщение #34
Такой вопрос если объявить переменную вне функции, то её могут использовать несколько ф-ций в скрипте?
пример:
Код
local t
function babki1 ()
      local wpn, b, hp, k, d, e, x   
      wpn = db.actor:item_in_slot(1)  --пулучаем оружие как объект
      b = wpn:cost() --получаем цену пушки
      hp = wpn.health  --получаем состояние пушки
      k = b/100 --получаем коофициент (сколько стоит 1% здоровья пушки)
      e = 1 - hp -- получаем величину: количество здоровья пушки которого не хватает до полного здоровья
      x = k*e    
      t = math.ceil (x) -- получаем стоимость ремонта
      if db.actor:money() >= t and hp < 0.9 then   
          return true
          else
          return false
      end
end

function otd ()
      local npc = level_object_by_sid(515)
      dialogs.relocate_money(npc, t, "out")
end
   
Здесь 1я функция даёт значение переменной t, а 2-я ф-ция испоьзует, так возможно?

Сообщение отредактировал Graff46 - Суббота, 16.11.2013, 14:42


Уважение: 4
Награды: 0
Облучение: 0%
Сообщение #35
Цитата Graff46 ()
то её могут использовать несколько ф-ций в скрипте?

Могут. А что мешает это проверить самому?


Терпение......
И все получится!

Уважение: 999
Награды: 31
Облучение: 0%
Сообщение #36
makdm, проверил уже, всё работает

Уважение: 4
Награды: 0
Облучение: 0%
Сообщение #37
Спавню метку: level.map_add_object_spot_ser(obj.id, "crlc_material", "Припятская пленница")
Как ее потом удалить?

Уважение: 152
Награды: 24
Облучение: 0%
Сообщение #38
Zizon975,
Код
level.map_remove_object_spot(obj.id,"crlc_material", "Припятская пленница")


Как здорово быть тёртым сталкером! Не бояться каждого шороха, оружия не носить с собой много!

Уважение: 389
Награды: 45
Облучение: 0%
Сообщение #39
Всем привет. Я тут посмотрел последние два поста, и хотел спросить более развернуто. К примеру, я хочу отыскать на локации предмет (водку) и установить на ее метку, так по колхозному накидал скрипт, но при активации фунции метка отображается на ГГ, посмотрите сам скрипт:

Вольный сталкер
Уважение: 245
Награды: 32
Облучение: 20%
Сообщение #40
Цитата filoret ()
но при активации фунции метка отображается на ГГ, посмотрите сам скрипт:

Угу))) А в рюкзаке случаем водка не завалялась)))
Вариант при непосредственном спавне обьекта
Код
local ObjId=0
function pda_killer_spawn()
local obj= alife():create("vodka",vector():set(-223.700,-7.678,-129.688),17000,281)
local text = "Водка"
level.map_add_object_spot_ser(obj.id, "blue_location", text) --/blue_location - тип метки
ObjId=obj.id
end

При взятии предмета метку удаляем:
Код
function delete_spot()
for a=1,65534 do --Перебор айди
local obj = alife():object(a)
if obj and obj:section_name() == "vodka" then
level.map_remove_object_spot(obj.id,"blue_location")
break
end
end
end


hat
Веселый Роджер
Уважение: 936
Награды: 112
Форум » S.T.A.L.K.E.R. - Моддинг » Разбираем S.T.A.L.K.E.R. » Уроки моддинга » Полезные функции (ТЧ)
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: