Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Редактирование и создание скриптов
denis2000Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Редактирование и создание скриптов

Редактирование и создание скриптов на языке LUA

Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[ Если у вас не открывается файл CHM(Этот текст скрыт от гостей) ]


[ Где найти лог игры после вылета ]
[ Получение более подробной информации о вылете (ХОВАН) ]



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


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Пн, 30.03.2015, 13:27 | Сообщение # 601
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый день.

Имеются две функции в xr_condition. Измеряют расстояния от актора до точек в way_***
[ Функции ]


[ Рестриктор ]


При удалении от смарта Скадовска приходит СМС и спавнятся квестовые объекты. Но на вторую секцию рестриктор принципиально не переходит. Если после прихода СМС сделать сейв и загрузиться с него, то придет 2-я СМС и отреспится 2-й комплект квестовых предметов.

Вопрос: рабочие ли функции?
 
makdmДата: Пн, 30.03.2015, 16:21 | Сообщение # 602
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
рабочие ли функции?

Функции не рабочие.
Измеряться должен квадрат расстояния между точками на карте.
А в вашем случае это не происходит.

Вместо

actor():distance_to_sqr(patrol_way:point(point_id)) >= p[1]*p[1]

пишем

actor:position():distance_to_sqr(patrol_way:point(point_id)) >= p[1]*p[1]

Аналогично во второй функции.

Кроме того у вас перепутаны аргументы.

Там где указано p[2] нужно указать p[1], и наоборот, там где p[1] указать p[2]


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


Сообщение отредактировал makdm - Пн, 30.03.2015, 16:24
 
sergej5500Дата: Пн, 30.03.2015, 23:25 | Сообщение # 603
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Возникли такие вопросы.

Имеется смарт-террайн. Рядом со смартом имеется спальное место для игрока.

При помощи какой функции можно проверить такие вещи.

1. Свободен ли смарт или занят сквадами?
2. Есть ли среди сквадов, занимающих смарт, сквады, враждебные игроку?

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

Есть идея переделать логику спальных мест. Если рядом никого, или неподалеку враги, то спать нельзя.
 
denis2000Дата: Вт, 31.03.2015, 13:01 | Сообщение # 604
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
Свободен ли смарт или занят сквадами?

Функция без "защиты от дурака":
Код
function is_smart_empty(actor, npc, p)
return sim_board.get_sim_board():get_smart_population(sim_board.get_sim_board().smarts_by_names[p[1]]) > 0
end


Цитата sergej5500 ()
Есть ли среди сквадов, занимающих смарт, сквады, враждебные игроку?

Что-то типа такой функции:
Код
function is_smart_enemy_to_actor(actor, npc, p)   
local sim = sim_board.get_sim_board()
for k,v in pairs(sim.smarts[sim:get_smart_by_name(p[1]).id].squads) do
      if k~=nil then
          if game_relations.check_all_squad_members(v, "enemy") then
     return true
    end
   end
end   
return false
end


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Вс, 12.04.2015, 21:41 | Сообщение # 605
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер.

В своей сборке я переделал квест на 400 зомби из СГМ. Эти зомби теперь спавнятся как сквады.

[ Сквады ]


Их спавном управляет рестриктор.

[ Рабочая секция логики ]


Если дистанция до смарта больше 250 метров, то с определенной вероятностью спавним там сквад зомби.

Схема работает. Квест выполняется. Но есть одно но. Для достаточно быстрого выполнения задания нужно спавнить зомби с запасом. Неубитые остаются на локациях и создают проблемы. Тормозят игру. Нападают на дружественных НПС.

Нужно после окончания квеста убрать со всех локаций сквады с именами: freeplay_zombied_1_squad, freeplay_zombied_2_squad, freeplay_zombied_3_squad и freeplay_zombied_4_squad.

Какой функцией можно воспользоваться? Или как её составить?
 
makdmДата: Пн, 13.04.2015, 10:19 | Сообщение # 606
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Какой функцией можно воспользоваться?

Самая простая

Код
function clear_squads( actor, npc )
  local board = sim_board.get_sim_board()
  for i = 1,65534 do
   local squad = alife():object( i )
   if squad and squad:clsid() == 94 and string.find( squad:section_name(), "freeplay_zombied" ) ~= nil then
    board:remove_squad( squad )
           end
  end
end


Терпение......
И все получится!
 
sergej5500Дата: Пн, 13.04.2015, 11:15 | Сообщение # 607
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,

Спасибо за помощь. Возник вопрос по функции.

Что дает запись squad and squad:clsid() == 94 и почему число равно 94 а не 95?

Почему функцию нельзя написать в таком виде:
if squad and squad:clsid() == 94 and string.find( squad:section_name(), "freeplay_zombied" ) ~= nil then
 
makdmДата: Пн, 13.04.2015, 12:11 | Сообщение # 608
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Что дает запись squad and squad:clsid() == 94 и почему число равно 94 а не 95?

Запись проверяет имеется ли серверный объект с данным ID и какой класс присвоил объекту движок.
Если класс 94, значит это объект сквад.


Терпение......
И все получится!
 
sergej5500Дата: Сб, 18.04.2015, 21:39 | Сообщение # 609
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Решил переделать систему заказов у Шустрого. Чтобы он мог приносить одну и ту же вещь много раз.

[ Контроль денег для задатка. ]


[ Передача задатка ]


[ Генерация заказа ]


[ Контроль денег для выкупа заказа ]


[ Передача денег ]

[ Выдача заказа ]


Сбой на последнем этапе. Всякий раз получаю экзу наемников. Почему функция дает сбой?
 
makdmДата: Вс, 19.04.2015, 00:22 | Сообщение # 610
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Всякий раз получаю экзу наемников. Почему функция дает сбой?

Потому что ни один из проверяемых инфопоршней на момент выполнения функции не был выдан.
Раз вы утверждаете, что предыдущие функции работают правильно, значит инфопорции выдавались, а вы их забрали раньше времени. Забирать инфопорции нужно в последний момент.
Вот так:

if has_alife_info("zat_b51_processing_category_1") then
if has_alife_info("zat_b51_ordered_item_1_1") then
give_reward("wpn_desert_eagle_nimble")
disable_info("zat_b51_processing_category_1")
disable_info("zat_b51_ordered_item_1_1")

elseif has_alife_info("zat_b51_ordered_item_1_2") then

и т.д.


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


Сообщение отредактировал makdm - Вс, 19.04.2015, 00:30
 
СахарДата: Пн, 04.05.2015, 13:13 | Сообщение # 611
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Всем доброго здравия. Имеется такая функция.
Код
function mine_boom(actor, npc, p)
   local mesh_explode = get_story_object (p[1])
   local anomal = get_story_object(p[2])
     
   if mesh_explode == nil then
    abort("Переменная mesh_explode равна nil")
   end
     
   if anomal == nil then
    abort("Переменная anomal равна nil")
   end
  --  if mesh_explode ~= nil and anomal ~= nil then
     mesh_explode:explode(0)   
     anomal:disable_anomaly()
       
end
end

Вызываю её через рескриптор.
Код
on_info = {=npc_in_zone(esc_a2_zdravstui_zona_sms_control_restrictor)} %=mine_boom(mesh_test:mine_test)% nil

Но нечего не происходит.




Сообщение отредактировал Сахар - Пн, 04.05.2015, 13:44
 
denis2000Дата: Пн, 04.05.2015, 13:57 | Сообщение # 612
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

mesh_explode не того класса?

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СахарДата: Пн, 04.05.2015, 15:08 | Сообщение # 613
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Цитата denis2000 ()
mesh_explode не того класса?

В смысле объект у которого проверяется story id? То я использую physic_destroyable_object


 
denis2000Дата: Пн, 04.05.2015, 15:15 | Сообщение # 614
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Сахар, Не тот класс, нужен: class = S_EXPLO

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СахарДата: Пн, 04.05.2015, 15:15 | Сообщение # 615
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Попробовал запустить функцию без проверке на рескриптор получил вылет с аргументом.
Код
Переменная anomal равна nil

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


 
Поиск: