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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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

Тема для обсуждения скриптов всего и всех в серии игр 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/

Вот теперь интересно, а что у него в 135 строке.

И нынешний код в net_spawn покажи)

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Нынешний код:

function actor_binder:net_spawn(data)
    printf("actor net spawn")        

    level.show_indicators()

    self.bCheckStart = true
    self.weapon_hide = false -- спрятано или нет оружие при разговоре.
    weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

    if object_binder.net_spawn(self,data) == false then
        return false
    end

    db.add_actor(self.object)
    
    if self.st.disable_input_time == nil then
        level.enable_input()
    end

    self.weather_manager:reset()
--    game_stats.initialize ()

    if(actor_stats.add_to_ranking~=nil)then
        actor_stats.add_to_ranking(self.object:id())
    end

    if (level.name() == "simeiz") and 
        not has_alife_info("keep_base_defend_started") then
        self.object:give_info_portion("keep_base_defend_started")
    end

    --' Загружаем настройки дропа
    death_manager.init_drop_settings()
    
    

    return true
end

 

 

 

death_manager - стандартный. Я только в конце одной строки дописал новую группировку. На количество строк это не повлияло 

135 строка - это  for k,v in pairs(spawn_items) do

 

  --' Доспавниваем необходимое количество итемов:
    --' Необходимо составить список объектов которые могут быть заспавнены для персонажа

    local spawn_items = item_by_community[self.npc:character_community()]    
    for k,v in pairs(spawn_items) do
        --' По каждому объекту необходимо получить зависимости    
        if check_item_dependence(self.npc, k) == true then
            --' По каждому объекту необходимо получить количество
            local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max))
            --' Необходимо заспавнить нужное количество.
            create_items(self.npc, k, number, v)
        end
    end
end

Изменено пользователем Muzafir
для наглядности
7 минут назад, Zander_driver сказал:

а что у него в 135 строке

Подозреваю, что у него в конфигах что-то не так по итемам на этой локации

Здесь могла быть ваша реклама.

Только что, Muzafir сказал:

дописал новую группировку.

 

Только что, Muzafir сказал:

local spawn_items = item_by_community[self.npc:character_community()]

А в настройки дропа эту группировку занес?

Или заноси, или перед for добавляй проверку if spawn_items and type(spawn_items) == 'table' then

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

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Вносил, точно помню. Сейчас перепроверю, может накосячил там где-то

На всякий, настройки дропа - это death_items_by_communities.ltx?

Проверил, как ты сказал - и название локации и инфопорция точно правильны

Только что, Zander_driver сказал:

if spawn_items and type(spawn_items) == 'table' then

Проверку добавь тогда.

  • Спасибо 1

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

 В death_items_by_communities.ltx косяка нет. Я просто скопировал секцию и переименовал. 

Добавлю твою проверку. Еще раз спасибо.

Здрасьте.

 

Проблема при определении ячейки карты для спавна предмета. Читаю текущие координаты и позицию ячейки вот таким скриптом:

Spoiler

function sms(text)
	news_manager.send_tip(db.actor, text)
end

function coords(cell)
	local act = db.actor

	local pos = act:position()
	pos.x = math.modf(pos.x)
	pos.y = math.modf(pos.y)
	pos.z = math.modf(pos.z)

	sms("xyz = " .. pos.x .. ", " .. pos.y .. ", " .. pos.z)

	if cell then
		local lvid = act:level_vertex_id()
		local gvid = act:game_vertex_id()
		sms("lvid, gvid = " .. lvid .. ", " .. gvid)
	end
end

 

 

ТЧ, Кордон, крыша вагона над Кузнецовым: lvid = 359827, gvid = 97. Объект с такими параметрами ячейки спавнится в указанном месте.

ЧН, Кордон, крыша элеватора: lvid = 310050, gvid = 571. Объект с такими параметрами ячейки обнаруживается на сервере, но остается невидимым. Если задать lvid = 25 и gvid = 472, как в секции [all.spawn] для Кордона, объект отспавнится правильно.

Что изменилось в расчете позиций ячеек в ЧН и как получить действующие значения lvid и gvid?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Здравствуйте.
Я опять насчёт меток на ящиках.
Способ по визуалу работает, но частично. В Кордоне например, метки не ставятся, в лог пишет "alife():object(id) ! invalid id specified". Но в Баре всё работает, в лог выводится:

box object [physic_destroyable_object:1063] detected. visual=dynamics\box\box_metall_01

С способом по логике drop_box получше. Отображаются везде, но есть две мини-проблемы:
1) Если нажать ЛКМ или подвигаться, то метки пропадают.
2) После уничтожения ящика, метка всё еще остается. Исчезают после перезагрузки сейва.

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

Что-то не едут у меня лыжи... Есть у меня скрипт на проверку статика заклинивания оружия:

function jamupdate()
    local snd = sound_object([[actor\wpn_jammed\stalker_1]])
        if get_hud():GetCustomStatic("weapon_jammed_static") and not snd:playing() then
        snd:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
    end
end

Который должен воспроизводить звук ГГ при заклинивании ствола... Куда его вешать на апдейт, чтобы статик отлавливался, в биндер актора? P.S. функция в _g.script:

function on_actor_weapon_jammed()
  if has_alife_info("esc_trader_newbie") then
    game.start_tutorial("part_9_weapon")
  end
  if not has_alife_info("encyclopedy_tutorial_weapon") then
    db.actor:give_info_portion("encyclopedy_tutorial_weapon")
  end
end

Вообще рабочая в оригинале, там вроде туториал выводиться должен? Пробовал повесить туда функцию проигрывания звука - не работает.

  • Нравится 1

@Капрал Хикс, а на каком движке эти движенья делаются?

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Только что, Капрал Хикс сказал:

X-ray extentions

На нем, если надобно отловить заклинивание ствола, делается это примерно так:

-- вешать на апдейт
local act_item = db.actor:active_item()
if act_item then
	local wpn_state = act_item:get_wpn_int(nil, 652)
	if wpn_state == 7 then
		-- тут воспроизводить звуки. Состояние 7 - это заклинившее оружие.
	end
end

 

  • Спасибо 1
  • Полезно 3

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

@Zander_driver, отлично всё работает, благодарствую, сейчас буду модифицировать под звуки в костюме с противогазом. А вот вопрос посложнее - как сию фишку с руганью реализовать для ЧН? OGSM CE 1.8, если что.

19 минут назад, Капрал Хикс сказал:

буду модифицировать под звуки в костюме с противогазом

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

Изменено пользователем aromatizer
  • Согласен 1

Отношения между людьми- главная ценность в человеческом обществе.
Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

Столкнулся с такой проблемой: в COC (мод на ЗП) решил отредактировать рупоры, чтобы было как в ТЧ (выключались на ночь, а при нападении противника на базу играли сигналы тревоги), и вообщем-то прописал логику и т.д. Но натолкнулся на такую проблему: необходимо в логике прописать info_portion, ну чтобы менялись звуковые дорожки, но для этого его нужно выдать, насколько я понял через функцию. И вот какую функцию необходимо использовать, чтобы при нападении на отряд/базу выдавался info_portion?

Здрасьте.

 

Можно ли прочитать параметры из секции конфига в том порядке, в котором они указаны, или результат перебора for i = 0, ini:line_count(section) -1 всегда выдается в случайном порядке?

Задача в том, чтобы вывести полную специализацию механика в заданном порядке (оружие общее, оружие частное, броня): https://drive.google.com/file/d/15OmIOK-H2J2ryp60PAOSUT77FR9fxBmd/view?usp=sharing

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

@Norman Eisenherz

На каком движке работаете? Пример конфига покажите, чтоб понять как там вообще эта специализация прописана.

Доброго времени суток.
Задался для чистого Сталкера:ЗП сделать так, чтобы у НПС после смерти в инвентаре можно было скоммуниздить броник, и он бы имел прочность, отличную от 100%, ну то есть был бы разброс.

 

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

Вначале, в файле character_desc_general.xml я добавил некоторым неписям эти самые броники(как пример):

 

<!--  bandit novice  -->

  <specific_character id="sim_default_bandit_0_default_0" team_default = "1">
    <name>GENERATE_NAME_bandit</name>
    <icon>ui_inGame2_bandit_1</icon>
    <map_icon x="1" y="0"></map_icon>
    <bio>Опытный сталкер. Детальная информация отсутствует.</bio>

    <class>sim_default_bandit_0</class>
    <community>bandit</community> <terrain_sect>stalker_terrain</terrain_sect>
    <snd_config>characters_voice\human_01\bandit\</snd_config>

    <rank>20</rank>
    <reputation>0</reputation>
    <money min="250" max="1750" infinitive="0"/>
    <visual>actors\stalker_bandit\stalker_bandit_1</visual>
    <supplies>
      [spawn] \n
     novice_outfit \n
      wpn_bm16 \n
      ammo_12x70_buck = 1 \n
      wpn_pm  \n
      ammo_9x18_fmj = 1 \n

#include "gameplay\character_items_nd.xml"
#include "gameplay\character_food.xml"
#include "gameplay\character_drugs.xml"
    </supplies>

После старта новой игры - сработало - бандиты стали делиться чёткими плащами.

Вот что делать с их прочностью? Я хотел сделать как у оружия, для этого полез в death_manager.script:
 

--printf("item name [%s]", item:name())
    if isWeapon(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then
        set_weapon_drop_condition(item)
        return
    end
    --printf("item name [%s]", item:name())
    if isOutfit(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then
        set_outfit_drop_condition(item)
        return
    end

    if xr_corpse_detection.lootable_table[section] == true and ammo_sections[section] == nil then
        return
    end
    alife():release(alife():object(item:id()), true)

--[[
    local item_id = item:id()
    local item_in_slot = npc:item_in_slot(2)
    if item_in_slot ~= nil and item_in_slot:id() == item_id then
        --' Тут надо уменьшить кондишн оружия
        item:set_condition((math.random(40)+40)/100)
        return
    end
    item_in_slot = npc:item_in_slot(3)
    if item_in_slot ~= nil and item_in_slot:id() == item_id then
        --' Тут надо уменьшить кондишн оружия
        item:set_condition((math.random(40)+40)/100)
        return
    end
    item_in_slot = npc:item_in_slot(7)
    if item_in_slot ~= nil and item_in_slot:id() == item_id then
        --' Тут надо уменьшить кондишн оружия
        item:set_condition((math.random(40)+40)/100)
        return
    end


--  npc:mark_item_dropped(item)
    local item_in_slot = npc:item_in_slot(4)
    if item_in_slot ~= nil and item_in_slot:id() == item_id    then
        return
    end
    if not npc:marked_dropped(item) then
--        printf("releasing object ["..item:name().."]")
        alife():release(alife():object(item:id()), true)
    end
    ]]
end

function set_weapon_drop_condition(item)
    local condition  = (math.random(40)+40)/100
    --printf("condition [%s]", tostring(condition))
    item:set_condition(condition)    
end

function set_outfit_drop_condition(item)
    local condition  = (math.random(40)+40)/100
    --printf("condition [%s]", tostring(condition))
    item:set_condition(condition)    
end



Часть когда, который я дополнил. По порядку.

Вначале я подумал, что хватит добавить для вычисления окончательной (посмертной) прочности брони добавлением её слота (в system.lts броня числится за 7 слотом):

 

 item_in_slot = npc:item_in_slot(7)
    if item_in_slot ~= nil and item_in_slot:id() == item_id then
        --' Тут надо уменьшить кондишн оружия
        item:set_condition((math.random(40)+40)/100)
        return
    end

 

Ни рыба, ни мясо, ничего не изменилось. После, добавил следующее:

function set_outfit_drop_condition(item)
    local condition  = (math.random(40)+40)/100
    --printf("condition [%s]", tostring(condition))
    item:set_condition(condition)    
end

 

Аналогично. 

Далее:

 --printf("item name [%s]", item:name())
    if isOutfit(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then
        set_outfit_drop_condition(item)
        return
    end

 

Вылет Line 748, движок не понимал, что такое isOutfit. Поисковиком нашёл некий файл _g.script:

 

-------------------------------------------------------------------------------------------
local monster_classes = {}
local stalker_classes = {}
local weapon_classes = {}
local artefact_classes = {}
local outfit_classes = {}

function IsMonster (object, class_id)
        local id = class_id or get_clsid(object)
        return monster_classes[id] == true
end
function IsStalker (object, class_id)
        local id = class_id or get_clsid(object)
        return stalker_classes[id] == true
end

function isWeapon(object, class_id)
    local id = class_id or get_clsid(object)
    return weapon_classes[id] == true
end

function isArtefact(object, class_id)
        local id = class_id or get_clsid(object)
    return artefact_classes[id] == true
end

function isOutfit(object, class_id)
        local id = class_id or get_clsid(object)
    return outfit_classes[id] == true
end

 

Добавление данных кусочков убрал вылет. То есть, я видимо, добавил эту функцию. Однако кондишн остался непреклонен.
И тут я уже не знаю, что делать дальше, хотя есть чувство (мб ложное) что близок.
Не подскажете, как завершить? И вообще, правильно я хоть начал?

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



 

 

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

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

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

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

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

Войти

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

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

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