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

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


Svoboда

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

Charsi

Спасибо, работает.

-------------------------------------------------

У меня вопрос:

Тут давали функцию для определения визуала НПС:

function egegege()
local se_obj = alife():object(id) -- , где id айдишник непися
local t = amk.read_stalker_params(se_obj)
if t ~= nil then
    local vis = t.visual
    vis = amk.str_explode("\\",vis)
    vis = vis[3] -- теперь vis есть визуал объекта
get_console():execute(vis)
end
end

Я вызываю эту функцию через диалог, но ни чего не происходит и в логе ни чего не появляется, хотя должно.Что я делаю не так?

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


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

ФеНиКс

game.start_tutorial("x18_dream") - срабатывает когда ГГ жив.А если он мертв, то почему-то эта строка игнорируется.

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


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

DimOriN

Я так попробовал, ввел ид Волка(006 и 6 - все пробовал), но при вызове опять ни чего не происходит.

-------------------------

У меня еще вопроc:

Я вот поверяю ранг НПС:

rank_npc = ranks.get_obj_rank_name(npc_stalker)
if rank_npc == "regular" then

Проверки ранга Новичок, Ветеран, Мастер работают, а проверка Опытного не работает.regular - вроде правильно.В чем дело-то?

 

---------------------------------------------------------------------------------------------

SkyLoader

Точняк, спасибо.

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

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


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

stalker.odinochka

Во скрипт для спавна аномалий:

singapur22 вроде скрипт написал:

function create_anom(name_anom, posit_anom, lvid_anom, gvid_anom, radius_anom, power_anom)
local obj = alife():create(name_anom, posit_anom, lvid_anom, gvid_anom)

-----------------------write----------------------
local packet = net_packet()
obj:STATE_Write(packet)

-------------------------load---------------------
-- cse_alife_object
local game_vertex_id = packet:r_u16()
local distance = packet:r_float()
local direct_control = packet:r_u32()
local level_vertex_id = packet:r_u32()
local object_flags = packet:r_u32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_u32()
local spawn_story_id = packet:r_u32()

-- cse_shape
local shape_count = packet:r_u8()
for i=1,shape_count do
local shape_type = packet:r_u8()
if shape_type == 0 then
-- sphere
local center = packet:r_vec3()
local radius = packet:r_float()
else
-- box
local box = packet:r_matrix()
end
end

-- cse_alife_space_restrictor
local restrictor_type = packet:r_u8()

-- cse_alife_custom_zone
local max_power = packet:r_float()
local owner_id = packet:r_u32()
local enabled_time = packet:r_u32()
local disabled_time = packet:r_u32()
local start_time_shift = packet:r_u32()

-- cse_alife_anomalous_zone
local offline_interactive_radius = packet:r_float()
local artefact_spawn_count = packet:r_u16()
local artefact_position_offset = packet:r_u32()

-- se_zone_anom
local last_spawn_time_present = packet:r_u8()

if (string.find (name_anom, 'zone_zharka_static') ~= nil
or string.find (name_anom, 'zone_witches_galantine') ~= nil
or string.find (name_anom, 'zone_mosquito_bald') ~= nil
or string.find (name_anom, 'zone_mincer') ~= nil
or string.find (name_anom, 'zone_gravi_zone') ~= nil
or string.find (name_anom, 'zone_buzz') ~= nil )
and packet:r_elapsed() ~= 0 then
abort("left=%d", left)
end

---------------------------save--------------------
-- cse_alife_object
packet:w_begin(game_vertex_id)
packet:w_float(distance)
packet:w_u32(direct_control)
packet:w_u32(level_vertex_id)
object_flags = bit_not(193)
packet:w_u32(object_flags)
packet:w_stringZ(custom_data)
packet:w_u32(story_id)
packet:w_u32(spawn_story_id)

-- cse_shape
packet:w_u8(1) -- количество фигур
packet:w_u8(0) -- тип фигуры: сфера
packet:w_vec3(vector():set(0, 0, 0))
if radius_anom ~= nil then
packet:w_float(radius_anom)
else
packet:w_float(1.0)
end

-- cse_alife_space_restrictor
packet:w_u8(restrictor_type)

-- cse_alife_custom_zone
if power_anom ~= nil then
packet:w_float(power_anom)
else
packet:w_float(max_power)
end
packet:w_u32(owner_id)
packet:w_u32(enabled_time)
packet:w_u32(disabled_time)
packet:w_u32(start_time_shift)

-- cse_alife_anomalous_zone
packet:w_float(offline_interactive_radius)
packet:w_u16(artefact_spawn_count)
packet:w_u32(artefact_position_offset)

-- se_zone_anom
packet:w_u8(last_spawn_time_present)

------------------------read---------------------------
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())

end

 

Спавн аномалии производится из любой функции, таким образом:

 

_new_create.create_anom('name', pos, lv, gv, radius, power)

 

Где:

 

'name' --имя(тип) аномалии (в кавычках)

pos --позиция спавна аномалии vector():set(x,y,z)

lv --левел вертекс позиции спавна

gv --гейм вертекс позиции спавна

radius --радиус аномальной зоны (в метрах)

power --сила действия аномалии (1.0 равняется силе, прописаной в конфиге типа аномалии)

 

-----------------------------------------------------------------

Кстати. Имя аномалии ОБЯЗЯТЕЛЬНО должно быть из базовой секции конфига аномалии. Типа для электры -"zone_witches_galantine", для грави -"zone_gravi_zone", и т.д.

Так как другие секции приводят к вылету, во время спавна артефакта.

 

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


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

ALEX BOY

Например, можно так:

local active_item = db.actor:item_in_slot(слот_сигареты) 
  if (active_item:section() == "секция_сигареты") then
    db.actor.power = -0.0009 --/Постепенное именьшение выносливости
       db.actor.psy_health = 0.0007 --/Постепенное прибавление пси-защиты
  end

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


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

НПС'у прописал точку, где он должен остановиться, проиграть анимку, и что-то прборматать:

p2:name = name03|a=stoya_boltaet|s=bar_arena_public|t=18000
p2:flags = 0x4
p2:position = -443.18,-5.74,-141.41
p2:game_vertex_id = 3906
p2:level_vertex_id = 264079

Все работает, но звука от НПС не слышно, нету его.Подскажите, что я не правильно сделал?

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


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

Scarabay

как сделать чтобы гг не двигался, но мог крутить камерой и стрелять?

Так можно же просто отключить на время воод с клавиатуры и мыши.

 

----------------------------------------------------

malandrinus

А ну да.Не внимательно вопрос проячел.

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

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


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

Jurok

if db.actor:satiety <= 0.5 then

В данном случае проверяется, что ГГ голоден на половину.

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


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

Как можно определить НПС по его секции из spawn_sections?Или так нельзя определять?

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


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

Valerich

if db.actor:object("zapisk_1") and not has_alife_info("take_zapisk_1_complete") then --  если мы взяли записку 1 тоько первый раз
--/Спавним тайник 2
   db.actor:give_info_portion("take_zapisk_1_complete")  --/выдаем инфопоршень, чтоб при следующем взятии этой записки тайник еще раз не спавнился
end
if has_alife_info("take_zapisk_1_complete") and db.actor:object("zapisk_2") and not has_alife_info("take_zapisk_2_complete") then --  если мы находили записку 1 и взяли записку 2 тоько первый раз
--/Спавним тайник 3
   db.actor:give_info_portion("take_zapisk_2_complete")  --/выдаем инфопоршень, чтоб при следующем взятии этой записки тайник еще раз не спавнился
end

И так же по аналогии с остальными тайниками.Не забудь создать инфопоршены take_zapisk_[номер записки]_complete.Функцию ставить на апдейт.

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

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


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

Disord

Я бы сделал рестриктор, потом на него повесил мап-спот, как у левел_чанджера. А в логике рестриктора сделал бы, чтоб при входе в него вызывалась функция проигрывания титров - получится, как конец игры.

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


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

Disord

На вики и читай про рестрикторы.

Окно вызвать можно.

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


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

Clips

Ты покажи, как ты прописал way точки своему НПС. Может там что-то не правильно.

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


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

TRAMP14

У тебя синтаксические ошибки в коде. Попробуй так:

class "cheat" (CUIScriptWnd)
function nachali() -- пошла жара
level.start_stop_menu(cheat(get_hud()),true)
end
function cheat:__init(owner) super()
self.owner = owner
self:InitCtrls()
self:InitCall()
end
function cheat:__finalize()
end
function cheat:InitControls()
self:Init(50,50,550,450)

    -- отсюда будут братся текстурки
    local xml = CScriptXmlInit()
    xml:ParseFile("ui_menuv.xml")

     -- рамка менюшки
    xml:InitStatic("background", self)

    -- кнопки меню
self:Register(xml:Init3tButton("btn_1", self),"btn_1")
self:Register(xml:Init3tButton("btn_2", self),"btn_2")
self:Register(xml:Init3tButton("btn_3", self),"btn_3")
    -- незабываем про выход
    self:Register (xml:Init3tButton("btn_quit", self),"btn_quit")

end

function cheat:InitCallBacks()
    -- обьяснения что делать кнопкам
    self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.apte, self)
    self:AddCallback("btn_2", ui_events.BUTTON_CLICKED, self.bint, self)
    self:AddCallback("btn_3", ui_events.BUTTON_CLICKED, self.konserva, self)
    self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.on_quit, self)
end
-- нажатие первой кнопки - спавним аптечку    
function cheat:apte() 
alife():create("medkit", db.actor():position(), 1, db.actor:game_vertex_id(), db.actor:id())
end
-- вторая кнопка - бинт
function cheat:bint()
alife():create("bandage", db.actor():position(), 1, db.actor:game_vertex_id(), db.actor:id())
end
-- третья кнопка - консерва
function cheat:konserva()
alife():create("conserva", db.actor():position(), 1, db.actor:game_vertex_id(), db.actor:id())
end
-- ввыход
function cheat:on_quit()
-- убираем наше окно, показываем предыдущее (или возвращаемся в игру)
    local console = get_console()
    GetHolder():start_stop_menu (self.owner, true)
    GetHolder():start_stop_menu (self,true)
    owner:Show    (true)
end

 

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

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


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

TRAMP14

Заюзай-ка ты програмку lua_cheker. Она ищит синтаксические ошибки. Сам пользуюсь регулярно.

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


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

TRAMP14

Чоё ты спрашиваешь, будет работать функция или нет. Сам проверить не можешь? Функция у тебя кривая, что ты ей сделать хочешь?

------------------------------------------------

Сталкер ломать нехочется

Чоё? Как ты можешь скриптом игру сломать. Хоть понял, что сказал?

Если ты эту свою функцию вызовешь - вылетит. Потому что ты применяешь метод section() к какому-то obj, который у тебя == nil.

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

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


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

TRAMP14

А я вё время думаю завчем в етих скобках пишт локальные так ето что луа не взбеслся.

В этих скобках пишут не локальные, а аргументы функции.

Вот например в свою функцию:

function item(obj)
local obj = obj:section()
if obj == "medkit" then 
alife():create("medkit", db.actor():position(), db.actor:level_vertex_id, db.actor:game_vertex_id(), db.actor:id())
end
end

 

ты можешь передать аргумент:

item("medkit")

 

Можно ли каким нибудь способом запретить использовать определённый тип аптечек?

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

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

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


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

ФеНиКс

Отслеживай использование одного из 6 твоих предметов и подсчитывай кол-во использований.

Я вот тут говорил, как сделать типа запрет на юз итема.

Если не знаешь, как отследить юз одного из 6 итемов, читани это:

 

Erlik:

добавляем bind_stalker в метод actor_binder:reinit() еще один каллбек

Код

self.object:set_callback(callback.use_object, OnUseObject, self)

 

OnUseObject это имя функции которая будет вызываться, когда эктор будет использовать предметы типа хлеба\водки\антирада\аптечки\бинта\дринка и т.д. - то есть

те которые имеют менюшку "использовать".

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

И далее радуемся жизни с этой функцией:

 

Код

function OnUseObject(obj, who)

if obj then

if obj:section() =="предмет" then -- здесь делаем проверку на секцию нужного предмета

действие

end

end

end

 

можно добавить данную функцию в виде метода в bind_stalker сделав так:

function actor_binder:OnUseObject(obj, who)

сюда ставим проверки

end

тогда каллбек нужно прописать так

self.object:set_callback(callback.use_object, self.OnUseObject, self)

 

PS: дроп предмета - то есть его выкидывание - данный коллбек не отслеживает.

 

Кстати каллбек можно и не вписывать в bind_stalker, а установить его на эктора в теле своей функции в своем файле(биндере) - что я и сделал.

 

 

 

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

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


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

ФеНиКс

Еще не понятно, зачем ты функцию actor_binder:stepen_prozorlivosti(obj, who) пишешь в отдельном файле. Нужно в бинд_сталкере писать.

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


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

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