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

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


Svoboда

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

(изменено)

Так и не получилось что-то получить левел жертвы. Следующая проверка возвращает последний вариант (чаэс), даже если жертва на кордоне:

	if get_clsid(victim) == clsid.script_stalker then
-- Получаем уровень жертвы.
	if level.name("l01_escape") then 
		lv = "Кордон, "
	end
	if level.name("l02_garbage") then
		lv = "Свалка, "
	end
	if level.name("l03_agroprom") then
		lv = "НИИ Агропром, "
	end
	if level.name("l04_darkvalley") then
		lv = "Тёмная Долина, "
	end
	if level.name("l05_bar") then
		lv = "Бар, "
	end
	if level.name("l06_rostok") then
		lv = "Дикая Территория, "
	end
	if level.name("l07_military") then
		lv = "Милитари,"
	end
	if level.name("l08_yantar") then
		lv = "Янтарь, "
	end
	if level.name("l10_radar") then
		lv = "Радар, "
	end
	if level.name("l11_pripyat") then
		lv = "Припять, "
	end
	if level.name("l12_stancia") then
		lv = "ЧАЭС, "
	end
	if level.name("l12_stancia_2") then
		lv = "ЧАЭС, "
	end

 

Пробовал и elseif, но он возвращает всегда первый вариант.

 

8push5

Спасибо большое, действительно не догадался. Был уверен что правильно написал :)

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

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


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

Редко, но бывает вылет, похожий на этот :

FATAL ERROR

[error]Expression    : e_entity
[error]Function      : xrServer::Process_event_reject
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\xrServer_process_event_reject.cpp
[error]Line          : 12
[error]Description   : entity not found. id_parent=155 id_entity=161 frame=11654


stack trace:

Например, если использовать скрипт взрыва тел из BB мода, то 1 раз из 5 вылет при взрыве с таким логом.

Если кто сталкивался, то как боролся?

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


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

TREWKO

local massiv_objects = {}
function check()
 npc:iterate_inventory(function (tmp, item)
   if item then
     table.insert(massiv_objects, item:section())
   end
 end, npc)
end

Где npc - онлайн НПС. Функция заполнит таблицу названиями итемов из рюкзака.

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


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

sk0rpi0n

function spawn()
  local var = spawn_anom(anom_mine, radius, pos, get_lv, get_gv, power) -- название аномалии, радиус её действия, позиция, лв, гв, мощность
end
function spawn_anom(anom_name,plosh,position,level_vertex_id,game_vertex_id,powers_a,time_danger
os) -- последний параметр не передаём
    local obj = alife():create(anom_name,position,level_vertex_id,game_vertex_id)
    local pac = net_packet()
    obj:STATE_Write(pac)
    local game_vertex_id = pac:r_u16()
    local distance = pac:r_float()
    local direction = pac:r_u32()
    local level_vertex_id = pac:r_u32()
    local object_flags = pac:r_s32()
    local custom_data = pac:r_stringZ()
    local story_id = pac:r_s32()
    local spawn_story_id = pac:r_s32()
    local shape_count = pac:r_u8()
    for i=1,shape_count do
        local shape_type = pac:r_u8()
        if shape_type == 0 then
            local center = pac:r_vec3()
            local plosh = pac:r_float()
        else
            local box = pac:r_matrix()
        end
    end
    local restrikror_type = pac:r_u8()
    local powers = pac:r_float()
    local owner_id = pac:r_s32()
    local on_off_mode_enabled_time = pac:r_u32()
    local on_off_mode_disabled_time = pac:r_u32()
    local on_off_mode_shift_time = pac:r_u32()
    local offline_interactive_radius = pac:r_float()
    local artefact_spawn_places_count = pac:r_u16()
    local artefact_position_offset = pac:r_s32()
    local last_spawn_time_present = pac:r_u8()
    if pac:r_elapsed()~= 0 then 
        abort("left=%d",pac:r_elapsed())
    end
    pac:w_begin(game_vertex_id)
    pac:w_float(distance)
    pac:w_u32(direction)
    pac:w_u32(level_vertex_id)
    pac:w_u32(object_flags)
    pac:w_stringZ(custom_data)
    pac:w_s32(story_id)
    pac:w_s32(spawn_story_id)
    pac:w_u8(1)
    pac:w_u8(0)
    local sphere_center = vector()
    sphere_center:set(0,0,0)
    pac:w_vec3(sphere_center)
    pac:w_float(plosh)
    pac:w_u8(restrikror_type)
    if powers_a ~= nil then 
        powers = powers_a 
    end
    pac:w_float(powers)
    if time_dangeros == nil then 
        owner_id = bit_not(0) 
    else 
        owner_id = time_dangeros 
    end
    pac:w_u32(owner_id)
    pac:w_u32(on_off_mode_enabled_time)
    pac:w_u32(on_off_mode_disabled_time)
    pac:w_u32(on_off_mode_shift_time)
    pac:w_float(offline_interactive_radius)
    pac:w_u16(artefact_spawn_places_count)
    pac:w_u32(artefact_position_offset)
    pac:w_u8(last_spawn_time_present)
    pac:r_seek(0)
    obj:STATE_Read(pac,pac:w_tell())
return obj
end

 

Вызывать функцию spawn().

 

А да, при приближении к ней экран не будет приобретать цвет например пси-воздействия(электра) или жарки. За такие эффекты на экране отвечает ещё один тип аномалий со словом '_field_', который не наносит хита.

Я делал так - проверял, какая эта аномалия через string.find(поиск знаков/букв в строке), и спавнил в эту же точку аномалию 'field' с соотв. эффектом.

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

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


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

sk0rpi0n

Да, ты один раз занесёшь в скриптовый файл функцию, а потом в любое время можешь вызывать её вот так - имя_файла.имя_функции(). Или, если вызов находится в этом же файле, то можно и так - this.имя_функции().

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

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


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

sk0rpi0n

Для начала нужно знать, что проводя различные операци над аномалиями, нужно быть осторожным. От одной аномалии проблем возникнуть не должно, а вот при спавне штук ста - проблемы будут наверняка. А теперь как спавнить.

Создаёшь файл anoms.script в scripts, копируешь туда весь код. Бежишь в нужное место снимать координаты. Подставляешь сюда название аномалии, радиус, нужные координаты и мощность соответственно:

local var = spawn_anom(anom_mine, radius, pos, get_lv, get_gv, power)

Например(координаты взяты от балды):

local var = spawn_anom("zone_mine_electric", 4, vector():set(193.31, -21.36, 316.53), 11459, 109, 1)

 

Ну и осталось только вызвать. Самый простой способ - через диалог. Думаю знаешь как. А если незнаешь, то ищешь нужную фразу в dialogs_***.xml (*** - имя уровня) и после тегов <text>...</text> пишешь <action>anoms.spawn</action>.

Надеюсь понятно объяснил.

 

sk0rpi0n

Способов вызвать при старте игры - масса. Можно и в бинд_сталкере. Но подобными вещами захламлять его не стоит.

 

Нафига тебе 2 последние функции? Лишние вызовы. Всё что надо - уже есть. Вызывать надо spawn(), и всё.

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

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


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

sk0rpi0n

Убери всё, что ты добавил после второй функции. Всё, что нужно я тебе уже дал, тебе остаётся только вызвать в нужный момент (как вызывать тоже писал). Теперь понятно?

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


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

stalker19965

Убери функцию в нет_спавне, оставь только вызов (т.к. сама она вызываться не будет).

 

function actor_binder:net_spawn(data)
...
  spawn.btr(-86.21,-9.43,-152.87,179600,107,"test" )
...

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


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

stalker19965

В самый конец функции, перед return true делай вызов. Конфиг можно в любом глоб. моде найти.

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


Ссылка на сообщение
(изменено)
И в чём отличие: Скобок: "wp", от скобок: 'wp'?

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

print(" строка с 'цитатой' ")

или так:

print(' строка с "цитатой" ')

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

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


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

TREWKO

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

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


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

Kolmogor

В Симбионе есть 2 функции - одна читает параметры без 'upd' значений, и там нигде не используется UPDATE, а есть функция, в которой так же идёт считывание 'upd'. Но мне эти 'upd' нафиг ненужны, но обойти их считывание не получается.

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


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

ФеНиКс

Это означает, что существует ли ГГ. И не "и он не в онлайне", а "мёртв ли ГГ".

Kolmogor

Вопрос отпал. :)

 

Ну суть-то та же...

О да.. не смеши и не путай людей.

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

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


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

Stalk15

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

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


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

1) posmes = mes_sucko[math.random(#mes_sucko)]

Ошибка в названии, у тебя как бы pos_mes.

2) local news_text = "%c[255,255,1,1]Татар\\n+%c[255,1,255,1]"..pos_mes.."%c[default]"

Не соеденил.

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


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

кровоSTALKER

if not npc:alive() then

Кучу раз писали ведь.

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


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

кровоSTALKER

Нет, npc - объект, полученный, допустим, через level.object_by_id или level_object_by_sid. Пример:

local npc = level_object_by_sid(6)
if not npc:alive() then
--
end

Да любым способом можно получить твоего НПС.

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

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

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


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

кровоSTALKER

Если НПС уникален:

local sobj = alife():object("esc_wolf")
if sobj then
  local obj = level.object_by_id(sobj.id)
  if obj and not obj:alive() then
    -- действия
  end
end

И не if i=1, 66539 dо, а for i = 1, 65534 do.

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

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


Ссылка на сообщение
(изменено)
И ещё вопросец, есть ли скрипт, для воспроизведения анимации нпс?

Например бежит сталкер, жмём заветную и сталкер падает и т.д...

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

function anims()
  local npc = level_object_by_sid(6)
  if npc then
    npc:clear_animations()
    npc:add_animation("poisk_0_idle_1", true, false)
  end
end

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

А вот как ему переключить состояние, например, с идлового на хавающего батон, я пока незнаю. Но судя по некоторым скриптам, вызывать нужно функцию state_mgr.set_state. Где-то что-то держит этого НПС, не давая ему переключиться. Пусть лучше знающие люди скажут.

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

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


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

ZeeK

Ищешь, где у тебя вызов сна и пишешь что-то вроде того:

...
game.start_tutorial("название сна") -- это у тебя уже есть
get_console():execute("save 1") -- '1' - название сейва
get_console():execute("load 1")
...

 

Scarabay

Только через нет пакет.

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

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


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

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

AMK-Team.ru

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