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

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


Svoboда

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

20 минут назад, Kirgudu сказал(а):

Ничего не смущает?

Ох уж этот чужой код... Да, там лучше or поставить, думаю.

  • Согласен 1

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


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

Я тут снова по поводу боевой схемы БТРов... Немного, КМК, разобрался в её работе, в итоге в db.script:

Скрытый текст

 

creature = {} 
monster_stock  = {}

 

function add_obj( obj ) - корректно ли тут производится проверка и добавление сталкеров и монстров?
    if IsStalker(obj) then
        creature[obj:id()] = true
        monster_stock[obj:id()] = false
    elseif IsMonster(obj) then
        creature[obj:id()] = false
        monster_stock[obj:id()] = true
    end
end

 

function del_obj( obj )
    storage   [obj:id()] = nil
    if IsStalker(obj) or IsMonster(obj) then
        creature[obj:id()] = nil
    end
end

 

 

Собственно не очень красивая функция апдейта друзей и врагов в ph_car.script:

Скрытый текст

 

function action_car:update_friends_and_target()
        if self.st.fire_target == "monsters" then
                for k in pairs(db.monster_stock) do
            local obj = level.object_by_id(k)
                if obj and IsMonster(obj) and obj:alive() and self.car:IsObjectVisible(obj) then
                    self.target_obj = obj
                    self.state_firetarget = state_firetarget_enemy
                        end
                    end
                end

 

        if self.st.fire_target == "stalker_group" then

        --for a=1,65534,1 do
        --local obj = level.object_by_id(a)
                for k in pairs(db.creature) do
            local obj = level.object_by_id(k)

        if obj and IsStalker(obj) and obj:alive() and obj:character_community()=="stalker" and self.car:IsObjectVisible(obj) then
                    self.target_obj = obj
                    self.state_firetarget = state_firetarget_enemy
                        end
                    end
                end
end

 

 

По ней такой вопрос...

 if obj and IsMonster(obj) and obj:alive() and self.car:IsObjectVisible(obj) then

 if obj and IsStalker(obj) and obj:alive() and obj:character_community()=="stalker" and self.car:IsObjectVisible(obj) then

- тут вроде выделенные жирным проверки лишние? Ведь если объекты берутся из  for k in pairs(db.monster_stock) и  for k in pairs(db.creature) do, там же уже была соотв. проверка:

function add_obj( obj )
    if IsStalker(obj) then
        creature[obj:id()] = true
        monster_stock[obj:id()] = false
    elseif IsMonster(obj) then
        creature[obj:id()] = false
        monster_stock[obj:id()] = true
    end
end

 

Просьба не пинать :), хочу разобраться и сделать идеальный ph_car.script с рабочей боевой схемой и правками от переворачивания машин.

 

 

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


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

Помогите разобраться, а то я забуксовал на ровном месте. Дано: скрипт использования предметов со звуками. Мне нужно следующее: при использовании определённого предмета и наличии двух инфопоршней проигрывать звук и выполнять функцию из другого скрипта, если поршней нет - не играть звук и спавнить предмет обратно в инвентарь (он съедобный, на классе антирада). Вот скрипт в упрощённом виде:

Скрытый текст

 

local tSound ={
cocacola            = "scripts\\inv_drinking",
item              = "scripts\\inv_item" - предмет и звук для него
}

function using_items(obj)
   local sect = obj:section()
   local actor = db.actor
   if obj and tSound[obj:section()] then
      local snd = xr_sound.get_safe_sound_object(tSound[obj:section()])
      if snd then
      snd:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 2.0)
      end
   end
        if obj then if sect == "item" then
         if has_alife_info("info_1") and - поршень 1
            has_alife_info("info_2") then - поршень 2
            script.final_action() - выполнить функцию из другого скрипта
            end
         else
           amk.spawn_item_in_inv("item") - спавн обратно в инвентарь
         end
     end
end

Сейчас без наличия инфопоршней предмет просто "съедается" и звук всё равно проигрывается....

 

 

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


Ссылка на сообщение
1 час назад, Купер сказал(а):

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

Пока вполне подходит при употреблении многих предметов за раз.

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


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

Не нахожу поиском или туплю. В ТЧ есть скриптовый метод проверки ГГ на кровотечение? Задумал тут перетащить медиков из ЗП...

    if  db.actor.bleeding > 0 then -такая проверка вообще возможна в ТЧ?

Ну и сам скрипт лечения:

function medic_magic_potion(first_speaker, second_speaker)
    db.actor.health = 1
    db.actor.power = 1
    db.actor.radiation = -1
    db.actor.bleeding = 1
end

Будет ли работать в ТЧ? Где подсмотреть?

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


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

@AndreySol @Zander_driver , я тут поразмыслил, и понял, что лучше всего использовать банальную проверку на состояние здоровья ГГ <1.0 (ну и радиации). Ведь если у ГГ есть кровотечение, то здоровье всё равно будет ниже единицы?

А насчёт записи состояния кровотечения - в x-ray extension вроде добавлен метод:

// CEntityAlive
heal_wounds(float)

Кстати, в R.M.A. по идее он должен работать, только как правильно вызвать функцию остановки кровотечения?

Изменено пользователем Капрал Хикс

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


Ссылка на сообщение
12 минут назад, AndreySol сказал(а):

Например от голода - разве это признак ранения?

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

 

15 минут назад, AndreySol сказал(а):

что там в x-ray extension накрутили - надо в описании и читать.

// CEntityAlive
heal_wounds(float)

- там вот так и описано, что-де добавлен метод такой.

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


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

Дано: скрипт ругани ГГ при заклинивании ствола (ТЧ). Отслеживается наличие статика о клине.

Скрытый текст

function jammed_weapon()
        local hud = get_hud()
    local custom_static = hud:GetCustomStatic("gun_jammed")

        if rma_options.jam_sound and custom_static ~= nil then
    local rnd = math.random(1,6)
    local snd
        if rnd == 1 then
        snd = xr_sound.get_safe_sound_object([[actor\jam_1]])
        elseif rnd == 2 then
        snd = xr_sound.get_safe_sound_object([[actor\jam_2]])
        elseif rnd == 3 then
        snd = xr_sound.get_safe_sound_object([[actor\jam_3]])
        elseif rnd == 4 then
        snd = xr_sound.get_safe_sound_object([[actor\jam_4]])
        elseif rnd == 5 then
        snd = xr_sound.get_safe_sound_object([[actor\jam_5]])
        elseif rnd == 6 then
        snd = xr_sound.get_safe_sound_object([[actor\jam_6]])
        end
            snd:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
        end
end

Знаю, что код корявый. Но проблема в том, что в таком виде рандомные звуки, перекрывая друг друга, играют, пока статик не исчезнет. И вот как бы так хитро отследить факт появления статика, что ли, а не его наличия. Чтобы проверка не запускала звуки все те несколько секунд, пока он есть...

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


Ссылка на сообщение
12 минут назад, AndreySol сказал:

из многострадального апдейта?

Да, но опять-таки если подскажете более удобный способ...

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


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

Всем привет. Решил тут прикрутить-таки звуки приветствия и прощания Сахарову для ТЧ, на манер ЧН...

Скрытый текст

--дописано

 yan_professor_hello                        = {min_snd = 1, max_snd = 1, rnd = 100, prior = 5, rnd_id = id(), into_id = id(), max_ids = {}},
 yan_professor_goodbye                          = {min_snd = 1, max_snd = 1, rnd = 100, prior = 5, rnd_id = id(), into_id = id(), max_ids = {}},

Скрытый текст

--дописано

[yan_professor_hello_rnd]
yan_general_ecolog = 0,scenario\yantar\yan_sakharov_meet_

[yan_professor_goodbye_rnd]
yan_general_ecolog = 0,scenario\yantar\yan_sakharov_meet_bye_

Соотв. звуки добавлены в нужную папку.

А вот с файлом логики Сахарова у меня непонятки.

Скрытый текст

[logic]
active = walker@yan_start
actor_dialogs = actor_dialogs
combat_ignore = combat_ignore
trade = misc\trade_ecolog.ltx
inv_max_weight = 10000

[walker@yan_start]
path_walk = yan_ucheniy_walk_talk
path_look = yan_ucheniy_look_talk
combat_ignore_cond = always
on_info = {-yantar_kruglov_phrase_2 +yantar_scientists_talk} remark@yan_professor_talk_1
on_info2 = {+yantar_kruglov_phrase_2} walker@yan_1
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk
meet = no_meet

[remark@yan_professor_talk_1]
snd = yantar_professor_to_kruglov_1
anim = yan_professor_wait
target = logic@scientist_out_rest, yan_scientist
on_timer = 5000 | %+yantar_kruglov_phrase_1%
on_info = {+yantar_professor_phrase_2} remark@yan_professor_talk_2
combat_ignore_cond = always
danger = danger_condition@yan_ecolog
meet = no_meet

[remark@yan_professor_talk_2]
snd = yantar_professor_to_kruglov_2
anim = yan_professor_wait
target = logic@scientist_out_rest, yan_scientist
on_timer = 5000 | walker@yan_1 %+yantar_kruglov_phrase_2%
combat_ignore_cond = always
danger = danger_condition@yan_ecolog
meet = no_meet

[walker@yan_1]
path_walk = yan_ucheniy_walk
path_look = yan_ucheniy_look
combat_ignore_cond = always
on_info = {+yan_actor_talk_ucheniy} walker@yan_2
on_info2 = {+yan_find_scientist_done} walker@scientist_quest_good    
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk
meet = meet@yan_general_scientist_1

;Дописано
on_actor_dist_le = 2 | remark@yan_professor_hello
on_actor_dist_ge = 4 | remark@yan_professor_goodbye

[walker@scientist_quest_good]
path_walk = yan_ucheniy_walk_talk
path_look = yan_ucheniy_look_talk
combat_ignore_cond = always
on_info = {+yantar_scientist_talk_helmet} remark@talk_about_helmet
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk
meet = meet@yan_general_scientist_1

;Дописано
on_actor_dist_le = 2 | remark3@yan_professor_hello
on_actor_dist_ge = 4 | remark3@yan_professor_goodbye

[remark@talk_about_helmet]
snd = yantar_professor_radiation_quest_2
anim = yan_professor_wait
target = logic@scientist_out_rest, yan_scientist
meet = no_meet
combat_ignore_cond = always
on_signal = sound_end | walker@go_to_room %-yantar_scientist_talk_helmet%
danger = danger_condition@yan_ecolog

[walker@go_to_room]
path_walk = yan_general_scientist_room_walk
path_look = yan_general_scientist_room_look
on_signal = make_helmet | remark@make_helmet
combat_ignore_cond = always
danger = danger_condition@yan_ecolog
meet = no_meet
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk

[remark@make_helmet]
anim = mode_shlem
target = 920
combat_ignore_cond = always
on_signal = action_end | walker@go_to_actor
danger = danger_condition@yan_ecolog
meet = no_meet

[walker@go_to_actor]
path_walk = yan_ucheniy_walk_talk
path_look = yan_ucheniy_look_talk
combat_ignore_cond = always
on_info = {+yan_kill_brain_task_start} walker@yan_2
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk
meet = meet@yan_general_scientist_1

;Дописано
on_actor_dist_le = 2 | remark3@yan_professor_hello
on_actor_dist_ge = 4 | remark3@yan_professor_goodbye

[walker@yan_2]
path_walk = yan_ucheniy_walk_talk
path_look = yan_ucheniy_look_talk
combat_ignore_cond = always
on_info = {-yan_actor_talk_ucheniy} walker@yan_1
on_info2 = {+yantar_scientist_talk_helmet} remark@talk_about_helmet
meet = meet@yan_general_scientist_1
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk

[meet@yan_general_scientist]
meet_state     = 2 | yan_professor_wait@yantar_professor_talk_1
meet_state_wpn     = 2 | yan_professor_wait@yantar_professor_talk_1
victim         = 2 | actor
victim_wpn     = nil
use             = true
use_wpn         = false

[meet@yan_general_scientist_1]
meet_state     = 1 | yan_professor_wait@yantar_professor_talk_1
meet_state_wpn     = 1 | yan_professor_wait@yantar_professor_talk_1
victim         = 1 | actor
victim_wpn     = nil
use             = true
use_wpn         = false
abuse = false
precond = usability

[meet@no_talk]
meet_state     = 1 | yan_professor_wait@yantar_professor_talk_1
meet_state_wpn     = 1 | yan_professor_wait@yantar_professor_talk_1
victim         = 1 | actor
victim_wpn     = nil
use             = false
use_wpn         = false
abuse = false

[danger_condition@yan_ecolog]
ignore_distance = 0

[actor_dialogs]
id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end

[combat_ignore]
combat_ignore_cond = always

;Дописано

[remark@yan_professor_hello]
anim = yan_professor_wait
snd = yan_professor_hello
on_signal = sound_end | walker@yan_1

[remark@yan_professor_goodbye]
anim = yan_professor_wait
snd = yan_professor_goodbye
on_signal = sound_end | walker@yan_1

[remark2@yan_professor_hello]
anim = yan_professor_wait
snd = yan_professor_hello
on_signal = sound_end | walker@yan_2

[remark2@yan_professor_goodbye]
anim = yan_professor_wait
snd = yan_professor_goodbye
on_signal = sound_end | walker@yan_2

[remark3@yan_professor_hello]
anim = yan_professor_wait
snd = yan_professor_hello
on_signal = sound_end | walker@scientist_quest_good

[remark3@yan_professor_goodbye]
anim = yan_professor_wait
snd = yan_professor_goodbye
on_signal = sound_end | walker@scientist_quest_good

В общем, при приближении ближе 2 метров по идее должен здороваться, при удалении более чем на 4 метра прощаться. Но работает только прощание изредка и то при этом, Сахарова можно поймать при подходе к столу так, что будет звучать только рандомное прощание. Где я с логикой накосячил?

  • Полезно 1

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


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

И всё-таки что за ерунда с вылетом вида:

stack trace:

0023:05175AF0 xrGame.dll
[error][      87]    : Параметр задан неверно.

Делаем квиксейв клавишей F6, при попытке загрузиться с него клавишей F7 (или другой назначенной) - вылет выше, при попытке загрузиться с него из меню - всё грузится нормально...

 

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


Ссылка на сообщение
7 часов назад, mole venomous сказал:

Ну вот очень знакомые слова.

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

Клавиша быстрой загрузки роли не играет, пробовал назначить F9 - та же петрушка с вылетом. Из меню грузится нормально. Ерунда какая-то...

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


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

Может такое быть, что вылет вида: 

stack trace:

0023:05175AF0 xrGame.dll
[error][      87]    : Параметр задан неверно.

вызван тем, что какой-то из скриптов сохранён в формате UTF-8, а не ANSI? Я просто не знаю, на что подумать ещё.

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


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

А подскажите вот по вылету вида:

 [error]Expression    : e_entity->ID_Parent == id_parent
[error]Function      : xrServer::Process_event_reject
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\xrServer_process_event_reject.cpp
[error]Line          : 23
[error]Description   : wpn_walther12350
[error]Arguments     : rad_tramplin_walker4

Вылет происходит именно при обыске трупов. Справочник гласит, что: "такое порой случается, когда или объект удаляется из игры без требуемой отрегистрации. А бороться можно только выверяя все коды, в которых удаляются предметы/объекты на предмет необходимых отрегистраций."

Но я что-то туплю, какие объекты могут удаляться при обыске трупа, а не во время смерти NPC например? Сдаётся, что причина какая-то банальная...

 

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


Ссылка на сообщение
57 минут назад, AndrewMor сказал:

Попробуй загрузить последний сейв и перепройти.

Так-то оно работает, но вылет частенько случается с рандомными предметами в строке [error]Description   : wpn_walther12350, бесит этим.

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


Ссылка на сообщение
4 минуты назад, DenVer сказал:

Если я правильно понимаю ситуацию, то в вылете виноват ствол Вальтер.

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

5 минут назад, DenVer сказал:

посоветовать покопаться в этом направлении.

Да вот пытаюсь.

5 минут назад, DenVer сказал:

И да, меня смущает его номер, какой-то супер-уникальный Вальтер получается.

Насколько я знаю, так движок маркирует отдельные предметы для себя, такой секции нет.

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


Ссылка на сообщение
8 минут назад, DenVer сказал:

Значит, разрабы накосячили с движком.

Да не в этом дело. Это типа служебное обозначение предмета... Ладно, будем ещё посмотреть.

  • Согласен 1

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


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

Увы, человек мою сборку уже удалил, пройдя (тема Hicks Compilation 1.0 на ap-pro для ясности). Пишет, что "если по памяти, то был замешан вальтер и в  90 случаях из 100 обыск монолитовцев." Всё же только этот злосчастный пистоль, простите за дезу. Я не особо много скриптовых изменений по оружию вносил, вот сижу думаю теперь, где этот пистолет мог накосячить. Грешу либо на фишку с выпадением оружия из рук NPC при попадании им в руку (но тогда бы не один вальтер глючил) либо думаю дальше. Кстати, знающие движок люди, проясните пожалуйста окончательно момент с указанием кол-ва патронов (или гранат) в character_desc_, там есть разница, ставить:
            ammo_9x19_fmj = 1 \n

или же:
            ammo_9x19_fmj \n
?

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


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

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

AMK-Team.ru

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