Скриптование - Страница 16 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

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

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

Greh921

во время игры - невозможно.

хотя..дизассемблер в руки и погнал движок ковырять ^_^

Подскажите, пожалуйста, как можно сделать так ,что при каждом заходе на локацию, на ней автоматически спавнилось человек 15 бандюков.

 

Понадобится bind_stalker.script

 

1) В функции actor_binder:save(packet) допиши в самое начало примерно следующее:

 

function actor_binder:save(packet)
    if utils.level_changing() then
        xr_logic.pstor_store(db.actor, "changing_level", 1)
    end
... и т.д.

 

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

 

2) В функции actor_binder:net_spawn(data) допиши в конец перед return true вот такое:

 

    if xr_logic.pstor_retrieve(db.actor, "changing_level", 0) == 1 then
        -- Здесь производим нужные действия
        xr_logic.pstor_store(db.actor, "changing_level", 0)
    end

 

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

 

Ну, как заспавнить нужное количество нужных персонажей, ты, я думаю, знаешь :)

 

P.S. Писалось для ТЧ и проверялось на ТЧ, в других версиях не знаю, но что-то наподобие.

Изменено пользователем Kirag
Kirag, Я делал по-другому.Я в net_spawn() сохранял имя текущего левела.До того сравнивая с предыдущим сохраненным и по необходимости вызывая новопрописанный коллбэк level_change(old,new).

а я делал вообще вот так...

 

if level:name() == "l05_bar" then

-- спавнил

end

 

по памяти так, может метод как ни так написал, но смысл такой :)

 

Добавлено через 1 мин.:

Влад, можно дфиг раскомпилить и перегнать на делфи, там удобней править

[b]Struck[/b]

можно дфиг раскомпилить и перегнать на делфи, там удобней править

и зачем ты мне "это" говоришь?

 

if level[b][u].[/u][/b]name() == "l05_bar" then

ошибка была.

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

Каким методом, скриптом добавить диалог нпс?

Что бы, вроде:

local push = true

local item = db.actor:object("wpn_pm")

function test()

if item and push then

добавить диалог...

Выдать мессагу...

push = false

end

end

 

Мессагу знаю как сделать. Но как про диалог?

И не подскажете чтение ini файла и запись, посредством Lua?

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

TREWKO

с диалогом:

сделай выдачу поршня "my_info" в твоей функции,а в диалоге сделай <has_info>my_info</has_info>

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

Описание "class ini_file" от меченый(стрелок):

C++ class ini_file {

ini_file (string); --создать объект класса ini_file/за место string прописываем путь до файла

 

function line_count(string); --возвращает количество ключей в секции string/ return ini:line_count("my_section")

function r_bool(string, string); --возвращает логическое(булево) значение/(секция,ключ)

function section_exist(string); --"проверка" существует ли секция string/if ini:section_exist("my_section")

function r_float(string, string); --возвращает значение с плавающей точкой

function r_clsid(string, string);*********************

function r_s32(string, string); --возвращает целое число

function r_line(ini_file*, string, number, string&, string&); --возвращает полностью "линию" т.е. key1 = value1

function r_token(string, string, const token_list&); **********

function r_vector(string, string);********

function r_u32(string, string);--возвращает целое число(чуть-чуть медленне чем s32)

function r_string_wq(string, string);--возвращает строку

function r_string(string, string);--возвращает строку

function line_exist(string, string);--"проверка" существует ли ключ /if ini:line_exist("my_section","key1")

};

 

Примеры работы с ним:

...

local ini = ini_file("my_folder\my.ltx")

if ini:section_exist("my_section") then

...

end

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

local ini = ini_file("my_folder\my.ltx")

ini:r_float("my_section", "my_line") --возвращает значение с плавающей точкой

...

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

local ini = ini_file("my_folder\my.ltx")

ini:r_s32("my_section", "my_line") --возвращает целое число

...

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

local ini = ini_file("my_folder\my.ltx")

ini:r_u32("my_section", "my_line") --возвращает целое число

...

 

function wpn_class()

local active_item=db.actor:active_item()

if active_item ~= nil then

active_item:section() == "wpn_vintorez" or

active_item:section() == "wpn_svu" or

active_item:section() == "wpn_svd" and

if math.ceil(db.actor:accuracy()*1000) == 1 then

get_hud():AddCustomStatic("din_pric", true)

end

end

end

end

он верный? И ещё, в какой апдейтер его присоединить? Пробывал в дельту - вылет без лога.

кровоSTALKER

юзай так:

function wpn_class()
local hud = get_hud()
local custom_static = hud:GetCustomStatic("din_pric")
local active_item=db.actor:active_item()
if active_item then
    if (active_item:section() == "wpn_vintorez" or active_item:section() == "wpn_svu" or active_item:section() == "wpn_svd") and math.ceil(db.actor:accuracy()*1000) == 1 then
        if custom_static == nil then
                      hud:AddCustomStatic("din_pric", true)
        end
    end
end
end

 

апдейт в bind_stalker.script - function actor_binder:update(delta)

Изменено пользователем Влад
Kirag, Я делал по-другому.Я в net_spawn() сохранял имя текущего левела.До того сравнивая с предыдущим сохраненным и по необходимости вызывая новопрописанный коллбэк level_change(old,new).

 

Кстати, да, этот метод даже толковее. Он и проще, и позволяет выполнять действия с учетом того, откуда перешли. Век живи, век учись :)

 

а я делал вообще вот так...

 

if level:name() == "l05_bar" then

-- спавнил

end

 

по памяти так, может метод как ни так написал, но смысл такой :)

 

Если это (и только это) в net_spawn актора, то у метода есть большой недостаток - он будет срабатывать не только при переходе на бар, но и при каждом Сейв/Лоаде, причем эффект будет накапливаться каждый С/Л. Вся возня с сохранением имени левелов или факта перехода как раз и нужна, чтобы от этого момента избавиться.

Хотя, смотря когда и что нужно.

 

Влад, заюзал, вылет такой:

Expression : !m_error_code

Function : raii_guard::~raii_guard

File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

Line : 748

Description : .... - Çîâ Ïðèïÿòè\gamedata\scripts\bind_stalker.script:322: attempt to index global 'chimera_mod' (a nil value)

 

 

В bind_stalker апдейтер был таков:

chimera_mod.din_scope()

 

кровоSTALKER, синтаксическая ошибка в chimera_mod.script, если конечно этот файл вообще существует...

Обижаешь. Поправил ошибку синтаксиса, получил вылет:

Expression : !m_error_code

Function : raii_guard::~raii_guard

File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

Line : 748

Description : .... - Çîâ Ïðèïÿòè\gamedata\scripts\bind_stalker.script:322: attempt to call field 'din_scope' (a nil value)

 

 

Кастом статик тоже сделал.

кровоSTALKER, покажи код, в слепую ничего не понятно.

 

============================

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

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

Содержание chimera_mod:

snd_obj = {} --это нужно для воспроизведеня звука, должен быть в каждом скрипте где будет использоватся команда "s_play"

snd_obj = xr_sound.get_safe_sound_object([[$no_sound]])

 

function s_stop()

if snd_obj:playing()==true then snd_obj:stop() end

end

 

function s_play(path) --сюда передается путь файла, и он ево играет

s_stop()

snd_obj = xr_sound.get_safe_sound_object(path)

snd_obj:play_at_pos(db.actor, vector ():set (0, 0, 0), 0, sound_object.s2d)

end

 

------Copyright DEXXX-------

 

-- device\pda\pda_tip --это путь до файла без расширения .ogg

local sound_types = {"([[device\pda\pda_tip]])", "([[device\pda\pda_tip]])", "[device\pda\pda_news]", "[[device\pda\pda_objective]]"} --со скобками нада поэксперементировать,

 

function name_script() --твой скрипт

s_play(sound_types[math.random(4)]) --четыре это максимальное значение, от 1 до 4. скока файлов стока и максимальное значение

end

 

function add_new_lc(levch,levchn,levchm,info) --спауним левел ченджер

local objt = alife():story_object(levch)

if not objt then

alife():create(levchn)

end

local obj = alife():story_object(levch)

if obj then

level.map_add_object_spot(obj.id, "level_changer",levchm)

db.actor:give_info_portion(info)

info_received()

end

end

 

-- Апдейтер динамических прицелов

function din_scope()

local hud = get_hud()

local custom_static = hud:GetCustomStatic("din_pric")

local active_item=db.actor:active_item()

if active_item then

if (active_item:section() == "wpn_vintorez" or active_item:section() == "wpn_svu" or active_item:section() == "wpn_svd") and math.ceil(db.actor:accuracy()*1000) == 1 then

if custom_static == nil then

hud:AddCustomStatic("din_pric", true)

end

end

end

end

 

Строка апдейтера в bind_stalker:

function actor_binder:update(delta)

object_binder.update(self, delta)

if string.find(command_line(), "-designer") then

return

end

if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then

-- jump_level.try_to_jump()

self.already_jumped = true

return

end

-- Вызов апдейта переноса игрока проводником

if travel_func ~= nil then

travel_func()

end

-- DEBUG slowdown

local time = time_global()

game_stats.update (delta, self.object)

-- апдейт погоды

self.weather_manager:update()

--' Апдейт саундменеджера

xr_sound.update(self.object:id())

-- Обновление отключения ввода с клавиатуры.

if self.st.disable_input_time ~= nil and game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle then

level.enable_input()

self.st.disable_input_time = nil

end

-- Апдейт прятание оружия игрока во время диалога

if self.object:is_talking() then

if self.weapon_hide_in_dialog == false then

self.object:hide_weapon()

printf("hiding weapon!!!")

self.weapon_hide_in_dialog = true

end

else

if self.weapon_hide_in_dialog == true then

printf("restoring weapon!!!")

self.object:restore_weapon()

self.weapon_hide_in_dialog = false

end

end

-- Апдейт прятание оружия игрока в зоне sr_no_weapon

if check_for_weapon_hide_by_zones()==true then

if self.weapon_hide == false then

printf("hiding weapon!!!")

self.object:hide_weapon()

self.weapon_hide = true

end

else

if self.weapon_hide == true then

printf("restoring weapon!!!")

self.object:restore_weapon()

self.weapon_hide = false

end

end

-- обновление пси-антенны

if sr_psy_antenna.psy_antenna then

sr_psy_antenna.psy_antenna:update(delta)

end

if self.bCheckStart then

printf("SET DEFAULT INFOS")

if not has_alife_info("global_dialogs") then

self.object:give_info_portion("global_dialogs")

end

if not has_alife_info("level_changer_icons") then

self.object:give_info_portion("level_changer_icons")

end

self.bCheckStart = false

end

if not self.loaded_slot_applied then

self.object:activate_slot(self.loaded_active_slot)

self.loaded_slot_applied = true

end

xr_s.on_actor_update(delta)

 

-- ARS MOD --------------------------

ars.on_actor_update(self)

-- обработчик всяческих менеджеров четыре раза в секунду.

if TimeTrigger1<time then

TimeTrigger1=time+250

self:check_detective_achievement()

self:check_mutant_hunter_achievement()

if(level_anomaly)then

self.anomaly_manager:update()

end

end

-- ARS MOD --------------------------

-- Chimera addon. Dinamic scopes update

chimera_mod.din_scope()

 

if(self.surge_manager) then

if(self.f_surge_manager_loaded ~= true) then

self.surge_manager:initialize()

self.f_surge_manager_loaded = true

end

if(self.surge_manager.levels_respawn[level.name()]) then

self.surge_manager:respawn_artefacts_and_replace_anomaly_zone()

end

self.surge_manager:update()

end

-- Апдейт доступности для симуляции.

simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())

if not self.loaded then

get_console():execute("dump_infos")

self.loaded = true

end

treasure_manager.get_treasure_manager():update()

if not(primary_objects_filled) then

pda.fill_primary_objects()

primary_objects_filled = true

end

pda.fill_sleep_zones()

end

 

Содержание ui_custom_msgs:

<!--Chimera addon to ARS CoP-->

<din_pric x="640" y="512" stretch="1">

<texture>chimera\anim_cube</texture>

</din_pric>

anim_cube тестовая, файл .seq.

Изменено пользователем кровоSTALKER
function din_scope()
local hud = get_hud()
local custom_static = hud:GetCustomStatic("din_pric")
local active_item=db.actor:active_item()
if active_item then
    if active_item:section() == "wpn_vintorez" or active_item:section() == "wpn_svu" or active_item:section() == "wpn_svd" then
    if math.ceil(db.actor:accuracy()*1000) == 1 then
        if custom_static == nil then
                      hud:AddCustomStatic("din_pric", true)
        end
      end
    end
end
end

Влад, тоже

Expression : !m_error_code

Function : raii_guard::~raii_guard

File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

Line : 748

Description : .... - Çîâ Ïðèïÿòè\gamedata\scripts\bind_stalker.script:322: attempt to call field 'din_scope' (a nil value)

 

 

 

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

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

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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