Скриптование - Страница 27 - Скрипты / конфиги / движок - 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/
malandrinus, ясно. А не подскажешь, почему SetWidth(number) в ЗП, тоже выдает ошибку на метод? Может его можно чем заменить?

Что-то кончается, что-то начинается...

Vano_Santuri,

SetWndSize(vector2)

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

malandrinus, точно, спасибо, помогло.

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

Т.е допустим выполняются 5 разных действий(функций) через 20 секунд каждая. Может есть готовый образец где?

Что-то кончается, что-то начинается...

Vano_Santuri,

Готового примера нет, но это достаточно просто сделать. Заносишь функции в массив. Ставишь один счётчик на циклический перебор. Ставишь второй циклический счётчик на время 20 секунд. Каждый апдейт обновляешь второй счётчик и по достижении 20-и секунд заворачиваешь его в ноль. При этом обновляешь первый счётчик, выполняешь очередную функцию из массива, при достижении конца массива заворачиваешь его в ноль.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Здравствуйте!

Имеется система вида:

[ini_section]
ff_bul=1000, 2000, 5000

 

Нужно сделать чтение этих переменных:

function read()
local pr = system_ini():r_float("ini_section","ff_bul")
end

Надо разбить эту pr на три параметра, но не знаю как...

Может так?:

function read_ini_three()
local pr = system_ini():r_float("ini_section","ff_bul")
local min, max, tiss = pr
local min = mins
local max = maxs
local tiss = ss
get_console():execute("Значение №1: "..mins.." Значение №2: "..maxs.." Значение №3: "..tiss)
end

TREWKO

 

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

 

Попробуй читать это, как строку, и перевести строку в таблицу. Например так:

 

local pr = system_ini():r_string("ini_section","ff_bul")

local pr_table = parse_data(pr)

local mins = tonumber(pr_table[1])

local maxs = tonumber(pr_table[2])

local tiss = tonumber(pr_table[3])

get_console():execute("Значение №1: "..mins.." Значение №2: "..maxs.." Значение №3: "..tiss)

 

Функция parse data у меня прописана в _g.script-е для удобства вызова, разбивает строку в таблицу по запятым, если запятая внутри скобок, она игнорируется, т.е например конструкция area(-117,170,100,alive) будет воспринята как одно целое.

 

function parse_data(str)
    local string_parts = {}
    if str == nil then
        string_parts[1] = nil
        return string_parts
    end
    local str_beg,str_end
    str_end = str
    local split_pos = find_split_pos(str_end)
    while split_pos ~= nil do
        str_beg, str_end = split_string(str_end,split_pos)
        table.insert(string_parts,str_beg)
        split_pos = find_split_pos(str_end)
    end
    table.insert(string_parts,str_end)
    return string_parts
end

function find_split_pos(str)
    local split_pos = string.find(str,",")
    if split_pos == nil then
        return nil
    end
    local br1_pos = string.find(str,"(",1,true)
    local br2_pos = string.find(str,")",1,true)
    if br1_pos ~= nil and br2_pos ~= nil and br1_pos < br2_pos and split_pos > br1_pos then
        local str_end1 = string.sub(str,(br2_pos +1),string.len(str))
        if string.find(str_end1,",") ~= nil then
            split_pos = br2_pos + string.find(str_end1,",")
        else
            split_pos = nil
        end
    end
    return split_pos
end

function split_string(str,split_pos)
    local str_beg = (string.sub(str,1,split_pos-1))
    local str_end = string.sub(str,(split_pos+1),string.len(str))
    return str_beg,str_end
end

 

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

Мне интересно, что не так с этим скриптом, что при его подключении игра вылетает при начале новой игры?

 

function start_add_spawn() --список скриптовых функций, срабатывающих при начале новой игры
spawn_esc_guide()
spawn_bar_trader()
spawn_yan_ghost()
spawn_esc_engineer()
end

-- привет, сталкер!

-- проводник на Кордоне
function spawn_esc_guide()
local x= -186.924500
local y= -20.201139
local z= -151.780029
local level_vertex= 64274
local game_vertex_id= 46
alife():create("esc_guide_spawn",vector():set(x,y,z),level_vertex,game_vertex_id)
end

-- торговец подсобки Бара
function spawn_bar_trader()
local x= 116.236366
local y= -5.306613
local z= 20.705244
local level_vertex= 33910
local game_vertex_id= 1239
alife():create("bar_trader_spawn",vector():set(x,y,z),level_vertex,game_vertex_id)
end

-- Призрак в бункер экологов
function spawn_yan_ghost()
local x= 32.335987
local y= -11.726542
local z= -278.578430
local level_vertex= 54978
local game_vertex_id= 1480
alife():create("yan_ghost_spawn",vector():set(x,y,z),level_vertex,game_vertex_id)
end

-- ремонтник в подвальчик Кордона
function spawn_esc_engineer()
local x= -214.010605
local y= -23.182829
local z= -122.567764
local level_vertex= 39269
local game_vertex_id= 59
alife():create("esc_engineer_spawn",vector():set(x,y,z),level_vertex,game_vertex_id)
end

-- случайно удалили Волка из all.spawn
-- мне проще так вернуть
function spawn_esc_wolf()
local x= -199.693237
local y= -19.873648
local z= -136.582733
local level_vertex= 52973
local game_vertex_id= 57
alife():create("esc_wolf_spawn",vector():set(x,y,z),level_vertex,game_vertex_id)
end

 

 

Log:

FATAL ERROR

[error]Expression    : g_uiSpotXml->NavigateToNode(path_base,0)
[error]Function      : CMapLocation::LoadSpot
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\map_location.cpp
[error]Line          : 78
[error]Description   : XML node not found in file map_spots.xml
[error]Arguments     : alife_presentation_stranger


stack trace:

 

Мне кажется все из за волка

1 в алл спавне задается его стори ид

2 в алл спавне условия нахождения его в лагере

 

впрочем легко проверить попробуй подключать свои скрипты по одному :big_boss:

Я уже понял, что возвращение Волка через скрипт чревато. Так что в function start_add_spawn() спавн Волка не значится.

подскажите что писать в логике, спавню скриптом НПС в ЗП, а он разговаривать не хочет,

спавн через смарт-терраин для меня не выход

Строгое предупреждение от модератора n6260
Юзаем заглавные буквы.
Изменено пользователем n6260
Сюжетное продолжение чистого неба
Зона обр.2010г.
S.T.A.L.K.E.R.-Расширение территорий

 

raf100, не туда попал, тут не логика а функция set_actor_position(ну и всякая лабуда типа координат) и диалоги(активация) :)

Expression : assertion failed

Function : CActorCondition::UpdateTutorialThresholds

File : E:\stalker\sources\trunk\xr_3da\xrGame\ActorCondition.cpp

Line : 404

Description : ai().script_engine().functor<LPCSTR>(cb_name,fl)

Помогите пожалуйста понять суть вылета и его причину

Замедляю полураспад души стержнями музыки

Ирбис, почему все думают что на этом форуме одни экстрасенсы? Не знаешь?

Где:

1 условия вылета.

2 какие изменения вносились перед вылетом.

3 в какой из игр происходит вылет.

4 версия игры.

Научитесь в конце концов задавать вопросы нормально, а не лишь бы спросить.

Возможно всё, ну или почти всё.

Вылет на ТЧ 6 патч лицензия +Аи пак+напарники.Вылет абсолютно в разных местах,но проявляется приблизительно при скоплении более 9 живых существ рядом с главным героем.Я не могу понять суть лога ошибки,что он обозначает и где копать.

Изменено пользователем Ирбис

Замедляю полураспад души стержнями музыки

Function : CActorCondition::UpdateTutorialThresholds

File : E:\stalker\sources\trunk\xr_3da\xrGame\ActorCondition.cpp

Description : ai().script_engine().functor<LPCSTR>(cb_name,fl)

Проверь, на месте ли колбеки на обучающие сообщения в файле _g.script. Их имена:

on_actor_critical_power

on_actor_critical_max_power

on_actor_bleeding

on_actor_satiety

on_actor_radiation

on_actor_psy

on_actor_cant_walk_weight

on_actor_weapon_jammed

Может какого-то нет или там что-то не в порядке.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Всем привет,

Спавнил аномалии в рандомных точках на трех локациях (ЧАЭС,Припять(из ТЧ) и Затон ) таким скриптом(для каждой локи свой файл)

local anoms = {

"zone_mine_thermal",

"zone_mine_electric_weak",

"zone_mine_electric_strong",

"zone_mine_acidic",

"zone_mine_acidic",

"zone_mine_gravitational_weak",

"zone_mine_gravitational_strong",

"zone_mine_gravitational_strong",

"zone_mine_gravitational_strong"

}

 

 

 

function random_spawn1()

for i=1,500 do

local section = anoms[math.random(table.getn(anoms))]

local var = spawn_anom(section,

math.random(1,6),

level.vertex_position(math.random(1,1851251)),

math.random(1,1851251),

math.random(0,317),

math.random(1,3))

end

end

function spawn_anom(anom_name,plosh,position,level_vertex_id,game_vertex_id,powers_a,time

_dangeros)

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

 

 

 

 

 

 

Вызывал черес db.script

function add_actor( obj )

actor = obj

actor_proxy:net_spawn( obj )

add_obj( obj )

if not db.actor:has_info("anom_spawned")

then

pripyat1.random_spawn()

aes1.random_spawn_aes1()

opx.random_spawn1()

this.actor:give_info_portion("anom_spawned")

end

end

 

 

 

В итоге на ЧАЭС аномалии спавнятся нормально, в Припяти ни одной, а при переходе на затон вылет

FATAL ERROR

 

[error]Expression : it!=WeatherFXs.end()

[error]Function : CEnvironment::SetWeatherFX

[error]File : D:\prog_repository\sources\trunk\xrEngine\Environment.cpp

[error]Line : 311

[error]Description : Invalid weather effect name.

[error]Arguments : ©

 

 

stack trace:

 

 

чем это лечить?

 

ЗЫ: спавн происходил в ЗП

Изменено пользователем Горчаков Антон

Горчаков Антон

 

Что касается вылета на Затоне - проверь погоду, возмущается по поводу неверного погодного эффекта. Очень не уверен, что аномалии к этому вообще причастны.

 

По поводу отсутствия аномалий на Припяти, и почти на 100% уверен, на Затоне та же картина - тут дело, похоже, в вызове функций спавна. Ты же на ЧАЭС первый раз вызвал, я не ошибаюсь?

Проблема в том, что для определения позиций спавна ты используешь level.vertex_position(n). Метод нужный, но есть одно НО: он работает только для вертексов, расположенных на данной локации. На этой локации все и будет в порядке - аномалии будут в случайных местах, но привязаны к АИ-сетке, читай - к террейну.

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

Так что перед спавном надо делать проверку, какой именно текущий уровень, и спавнить аномалии только для него.

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

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

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

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

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

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

Войти

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

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

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