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

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

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

Galil

Если статьи выдаются инфопоршнями, попробуй просто эти инфопоршни "забрать" (db.actor:disable_info_portion(" ") - но не уверен что именно так, проверь в lua_help)

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Скажите плз, как получить забинденную команду? Т.е. по экшену получить забинденную кнопку.

SkyLoader, вот пример для кнопки активации ПДА. Я дописал в файл со строковыми индентификаторами

    <string id="action_activate_pda">
        <text>$$ACTION_ACTIVE_JOBS$$</text>
    </string>

Теперь функция game.translate_string("action_activate_pda") будет выдавать кнопку, забинденную на открытие ПДА. В отличие от парсинга user.ltx такой способ работает и после перезабиндивания кнопки в игре. Аналогично можно сделать и для остальных экшенов.

Charsi, спасибо. Жаль, что по другому нельзя. (а то парсинг user не очень подходит) Изменено пользователем SkyLoader

Хотел вот спросить по поводу некоторых странностей в работе STATE_Read и State_write колбеков в скриптах типа se_xxx.script

В скрипте sim_faction.script (ЧН, 10 патч) в функциях

 

 

-- Сейв

function se_sim_faction:STATE_Write(packet)

-- ЛОАД

function se_sim_faction:STATE_Read(packet, size)

 

Поставил вывод сообщения такого типа:

sm.ilog_c("load faction %s sid %s", self:name(), self.sid)

 

В итоге вот лог, записан сразу после save\load

 

* Saving objects...
! [LUA][ERROR] [07:15] save faction mar_sim_faction_csky sid 91495
! [LUA][ERROR] [07:15] save faction mar_sim_faction_renegade sid 10069
! [LUA][ERROR] [07:15] save faction mar_sim_faction_monster sid 18016
! [LUA][ERROR] [07:15] save faction gar_sim_faction_bandit sid 82950
! [LUA][ERROR] [07:15] save faction esc_sim_faction_stalker sid 34651
! [LUA][ERROR] [07:15] save faction esc_sim_faction_military sid 89133
! [LUA][ERROR] [07:15] save faction val_sim_faction_freedom sid 64428
! [LUA][ERROR] [07:15] save faction val_sim_faction_killer sid 12956
! [LUA][ERROR] [07:15] save faction agr_sim_faction_dolg sid 26588
! [LUA][ERROR] [07:15] save faction yan_sim_faction_zombied sid 17237
! [LUA][ERROR] [07:15] save faction lim_sim_faction_monolith sid 62255
* 21852 objects are successfully saved
* Game WinSeven_quicksave.sav is successfully saved to file 'f:\games\stalker - clear sky\save\winseven\stalker-stcs\savedgames\winseven_quicksave.sav'
  ...
Загрузка игры "winseven_quicksave.sav"...
* Loading spawn registry...
! [LUA][ERROR] [07:15] load faction mar_sim_faction_csky sid 47402
! [LUA][ERROR] [07:15] load faction mar_sim_faction_renegade sid 99711
! [LUA][ERROR] [07:15] load faction mar_sim_faction_monster sid 17753
! [LUA][ERROR] [07:15] load faction gar_sim_faction_bandit sid 48238
! [LUA][ERROR] [07:15] load faction esc_sim_faction_stalker sid 24366
! [LUA][ERROR] [07:15] load faction esc_sim_faction_military sid 78940
! [LUA][ERROR] [07:15] load faction val_sim_faction_freedom sid 59261
! [LUA][ERROR] [07:15] load faction val_sim_faction_killer sid 57427
! [LUA][ERROR] [07:15] load faction agr_sim_faction_dolg sid 81796
! [LUA][ERROR] [07:15] load faction yan_sim_faction_zombied sid 93268
! [LUA][ERROR] [07:15] load faction lim_sim_faction_monolith sid 31654
* 11568 spawn points are successfully loaded
* Loading objects...
! [LUA][ERROR] [07:15] load faction mar_sim_faction_csky sid 68530
! [LUA][ERROR] [07:15] load faction mar_sim_faction_renegade sid 95163
! [LUA][ERROR] [07:15] load faction mar_sim_faction_monster sid 1499
! [LUA][ERROR] [07:15] load faction gar_sim_faction_bandit sid 71579
! [LUA][ERROR] [07:15] load faction esc_sim_faction_stalker sid 26426
! [LUA][ERROR] [07:15] load faction esc_sim_faction_military sid 86856
! [LUA][ERROR] [07:15] load faction val_sim_faction_freedom sid 19908
! [LUA][ERROR] [07:15] load faction val_sim_faction_killer sid 25487
! [LUA][ERROR] [07:15] load faction agr_sim_faction_dolg sid 25358
! [LUA][ERROR] [07:15] load faction yan_sim_faction_zombied sid 11439
! [LUA][ERROR] [07:15] load faction lim_sim_faction_monolith sid 32970
* 21852 objects are successfully loaded
* Game winseven_quicksave is successfully loaded from file 'f:\games\stalker - clear sky\save\winseven\stalker-stcs\savedgames\winseven_quicksave.sav' 
...
Клиент: Синхронизация...
...
! [LUA][ERROR] [07:18] save faction mar_sim_faction_csky sid 68530
! [LUA][ERROR] [07:18] save faction mar_sim_faction_csky sid 68530
! [LUA][ERROR] [07:18] save faction mar_sim_faction_renegade sid 95163
! [LUA][ERROR] [07:18] save faction mar_sim_faction_renegade sid 95163
! [LUA][ERROR] [07:18] save faction mar_sim_faction_monster sid 1499
! [LUA][ERROR] [07:18] save faction mar_sim_faction_monster sid 1499
! [LUA][ERROR] [07:18] load faction mar_sim_faction_csky sid 65484
! [LUA][ERROR] [07:18] load faction mar_sim_faction_renegade sid 17958
! [LUA][ERROR] [07:18] load faction mar_sim_faction_monster sid 57149

 

 

 

 

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

Собстно я не совсем понял механизм работы этих функций.

Зачем при загрузке два раза вызывается функция STATE_Read() + ещё раз в конце), и зачем в конце загрузки игра занаво вызывает STATE_Write() для всех объектов, если мы загружаем а не сохраняем?

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

*Shoker*

И чего тебе непонятно в логах?

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

 

Зачем вообще вызываются методы STATE_Read()/STATE_Write() ?

Ответ вроде как очевиден. В игре имеются серверные объекты и клиентские. Клиентские - порождение серверных. В игре (для многих объектов постоянно) идет обмен между серверными и клиентскими объетами. В конце игры - в серверные объекты сохраняется то, что необходимо от клиентских ...

 

То, что в зарузке используется метод STATE_Write() как раз и не должно вызывать вопроса, если учесть 'зеркальность' названий. Методы STATE(UPDATE)_Write(Read) применяются к объектам, точнее они и есть методы объектов(!), и учитывая что записть типа: se_object:STATE_Write(packet) - можно прочитать как "запись в нет-пакет параметров серверного объекта" и далее этот пакет с данными можно читать и использовать в игре, то ясно - это по сути операция ЧТЕНИЯ данныех объекта, для чего и получается пакет данным методом.

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

Так что запоминай и привыкай к 'зеркальной' трактовке:

Чтобы прочитать параметры - требуется вначале их из объекта записать в нет-паекет.

Чтобы внести изменения (и записать) - требуется, чтоб (ис)правленый нет-пакет был прочитан объектом.

 

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

P.S. Кстати, можешь опробовать обновленный вариант модуля работы с нет-пакетами:[spoiler="читалка/писалка" (дозаполнил)]m_net_utils_111022

 

Основное отличие: выбор метода чтение/записи нет-пакета производится автоматически по переданному в качестве аргумента серверному объекту. Определяется его класс и по таблице из конфиг-файла выбирается соответствующий метод (если имеется).

Установка - скопировать скрипт в папку скриптов, конфиг - в папку конфигов.

Вызовы: чтение - Get_NetPacket(se_obj [,flag_upd]) , запись - Set_NetPacket(se_obj, table)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Итак, мужики, по новой работа с табличками...

 

Имеем заполнение таблицы:

 

table.insert(TblMsges_stalker,t)

 

Таким макаром все работает, при попытке же выделить TblMsges_stalker посредством склейки строки

 

local ComTbl = Sender:character_community()
local Tbl="TblMsges_"..ComTbl -- Так у нас получаются таблички... 
table.insert(Tbl,t)

 

Получаю вылет :

 

FATAL ERROR

[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line          : 748
[error]Description   : .... - Зов Припяти\gamedata\scripts\vs_send_news.script:211: bad argument #1 to 'insert' (table expected, got string)


stack trace:

 

Как я понял не формируется TblMsges_stalker посредством моей склейки, решил проверить,

 

 

local Tbl="TblMsges_"..ComTbl -- Так у нас получаются таблички... 
send_tip(Tbl,nil, nil, nil,nil,nil)

 

В результате получил сообщение TblMsges_stalker

 

Не подскажите в чем проблема? Я тут думал, что передается в таблицу не TblMsges_stalker, а "TblMsges_"..ComTbl ,т.е не идет склейка....

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

 

Так же пытался возвращать TblMsges_stalker таким методом....

 

local TblSend = GetComName((Sender:character_community()),7)
table.insert(TblSend,t)

 

--Табличка на группировку. + иконки для каждой группировки.
local Community = {
    ["actor"]      = {"Дегтярев","ГГ","Дегтярева","СБУшника","default","Общий канал:","TblMsges"}, -- надо все группировки шмалять
    ["stalker"]      = {"сталкер","одиночка","сталкера","одиночку","stalker","Общий канал:","TblMsges_stalker"},
    ["monolith"]     = {"монолитовец", "фанатик", "монолитовца","фанатика","default","Монолит:","TblMsges_monolith"},
    ["army"]         = {"военный","солдат","военного","солдата","army","Военные:","TblMsges_army"},
    ["killer"]       = {"наёмник","мерк","наёмника","мерка","killer","Намники:","TblMsges_killer"},
    ["ecolog"]       = {"учёный","яйцеголовый","учёного","яйцеголового","default","Ученые:","TblMsges_ecolog"},
    ["dolg"]        = {"долговец","долгарь","долговца","долгоря","dolg","Долг:","TblMsges_dolg"},
    ["freedom"]      = {"свободовец","анарист","свободовца","анархиста","freedom","Свобода:","TblMsges_freedom"},
    ["bandit"]       = {"бандит","гопник","бандита","гопника","bandit","Бандиты:","TblMsges_bandit"},
    ["zombied"]        = {"зомбированный","зомби","зомбированного","зомби","default","Зомбированные:","TblMsges_zombied"} --Пасхалка для прикола...
}

--Берем имя из таблички.
function GetComName(ObjCom,index)
if (Community[ObjCom][index]) then 
local ComName =Community[ObjCom][index] 
return ComName
end
end

 

Такой же влет, если же давать типс, то все пучком,дело в очередности?

ЗЫ,Sender - дает сталкера (obj) полностью проверен на все. Код не выкладываю, ибо там очень много....

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

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

KD87, Ясно, пока сделал самым примитивным способом...

function WriteTbl(Sender,t)
ComTbl = Sender:character_community()
if ComTbl == "actor" then
table.insert(TblMsges,t)
end
if ComTbl == "stalker" then
table.insert(TblMsges_stalker,t)
end
if ComTbl == "monolith" then
table.insert(TblMsges_monolith,t)
end
if ComTbl == "army" then
table.insert(TblMsges_army,t)
end
if ComTbl == "killer"  then
table.insert(TblMsges_killer,t)
end
if ComTbl ==  "ecolog" then
table.insert(TblMsges_ecolog,t)
end
if ComTbl == "dolg" then
table.insert(TblMsges_dolg,t)
end
if ComTbl == "freedom" then
table.insert(TblMsges_freedom,t)
end
if ComTbl == "bandit" then
table.insert(TblMsges_bandit,t)
end
if  ComTbl == "zombied" then
table.insert(TblMsges_zombied,t)
end
end

 

А никак нельзя строку перевести в таблицу??? Или что-то в этом роде? но чтоб покороче и покрасивше?

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

Кто-нибудь разбирался со "злопамятностью" неписей ?

 

Картина следующая:

Например, на кордоне сидят сталкеры у костерка между АТП и насыпью. (Или даже вообе на АТП).

С насыпи в районе креста/гулага кабанов вываливается в онлайн вояка с насыпи, и резво бежит на место. Сталкеры, мельком увидев вояку, поднимаются, и идут на разборки - да хоть под мост.

 

Еще банальнее - ГГ устраивает перестрелку под мостом, сбегает, прячется. Вояки доходят до мета, где видели ГГ последний раз, и минут пять стоят там, уткнувшись в землю стволами. Пока состояние гулага по времени не сменится.

 

Причем эвалюатор в xr_ganger.script давным-давно возвращает false.

 

Еще:

Непись сидит под смартом, где ему запрещено воевать.

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

А самое мерзкое, что в этом состоянии его и под смарт обратно взять нельзя.

То есть, пример:

Сцена в ТД, с бандитом и долговцем. У бандита

[smart_terrains]

val_escort = {-val_escort_scene_end -val_bandit_talk}

val_lager_bandits = {+val_escort_scene_end}, {+val_bandit_talk}

 

Даем val_bandit_talk - и бандюк побежал охотиться на долговца.

Делаем их нейтралами друг к другу - и бандит нормально берется под val_lager_bandits

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

Dennis_Chikin Очень хороший вопрос. По крайней мере первая его часть :)

Если бы нашлось подобное решение как у косых сталкеров было бы круто.

В конфиге сталкера есть такая строчка:

selector_attack =

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

Там, под такими параметрами как, они ниже, есть значения в цифрах:

fOptMemberDistance, ==== тут метры.

fOptMemberDistanceWeight, = тут фиг знает что.

fMinMemberDistance,==== тут метры.

fMinMemberDistanceWeight, = тут фиг знает что.

fMaxMemberDistance,==== тут метры.

fMaxMemberDistanceWeight, = тут фиг знает что.

fMemberViewDeviationWeight, = тут фиг знает что.

Я так и не понял за что отвечает приставка Weight.

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

Мой архив

Сталкером не занимаюсь.

Вес - он и есть вес. В смысле, в общей куче.

типа, 10+90 = 100%.

Когда все по нулям, а у одного параметра много - только он и будет учитываться. Два с одинаковым, остальные по нулям - эти 2 - пополам.

 

 

Vano_Santuri

Таблицу из строки сделать не сложно. Желательно знать из строки какого вида?

Например :

local t = {}
local s = "word_1 word_2 word_3 word_4 word_5"
for w in s:gmatch("[%w%_]+") do
    t[#t+1] = w
end

Только вот до сих пор не пойму что же именно тебе нужно? В теме "Lua..." у тебя были одни условия, тут несколько другие.

Объясни подробнее.

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

Gun12, Просто я уже слишком много нового кода написал, вобщем так....\

 

У меня есть таблички...

 

 

local TblMsges = {} -- Общий канал, Смерть, погода, и прочая хрень....
local TblMsges_stalker = {} --Сюда идут новости для общего канала (сталкеры)
local TblMsges_monolith = {} --Табличка - канал Монолита.
local TblMsges_army = {} -- Табличка - канал Военных.
local TblMsges_killer = {} -- Табличка - канал наемников.
local TblMsges_ecolog = {} -- Табличка - канал экологов.
local TblMsges_dolg = {} -- Табличка -канал Долга.
local TblMsges_freedom = {} -- Табличка канал Свободы.
local TblMsges_bandit = {} -- Табличка - канал бандитов
local TblMsges_zombied = {} -- Табличка - канал зомбированных - Прикол от меня.

\

 

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

 

где имя таблички состоит из TblMsges_ и секции группировки, т.е чтоб не писать кучу if я хочу сделать табличку из переменной группировки и постоянной TblMsges_

 ...
local Com = Sender:character_community()
local Tbl = "TblMsges_ "..Com
table.insert(Tbl,t)

...

 

Товарищ, Charsi , посоветовал сделать так:

 

table.insert(this["TblMsges_"..Sender:character_community()],t)

 

Сейчас попробую и отпишусь...

 

 

Не не получилось, как-то вылет на первый аргумент... Ладно бог с ним, как допишу все, посмотрите, может что и поможете исправить, а пока буду делать дальше, дело идет....)

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

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

Vano_Santuri

А что тебе мешает сделать одну глобальную таблицу с подтаблицами? :)

Типа:

 

local NewsTbl = {
["all"] = {  --\\ Общий канал 
          "Текст новости",
          "Текст новости",
          ...
             },
["freedom"] = {  --\\ Свобода
          "Текст новости",
          "Текст новости",
          ...
             },
...
}

 

А дальше можно получать рэндомный текст таким образом.

local ntbl = NewsTbl["freedom"] --\\ получаем подтаблицу с текстами свободы

local random_text = ntbl[math.random(#ntbl)]

 

В итоге random_text будет равен случайному сообщению из таблицы freedom

И тебе достаточно будет лишь менять имя таблицы в local ntbl, передавая её нужное строкове имя.

 

C if-ами лучше не заигрывайся, а то на твоей предыдущей версии новостей из за них Lua Cheker виснул :D

 

Ну и заполнять их аналогично можно, ты только учти что в table.insert первый аргумент это таблица как раз, куда ты будешь свой текст добавлять, тоесть если хочешь туда добавить текст, то пишешь так:

table.insert(ntb, "текст") и всё :)

 

Artos

Спасибо за новую версию нет-пакетов :)

И как тебе хватает терпения каждый раз их перелапатывать чуть ли не полностью, я б повесился давно :D

Я их постараюсь проверить, отпишусь, спасибо :)

 

По поводу STATE_Read\Write, я просто не понял зачем при загрузке сохранения, во первых функция STATE_Read вызывается 3 (!) раза за загрузку для всех объектов. А во вторых в конце загрузки при синхронизации происходить вызов STATE_Write (тоесть по сути во время загрузки сохранять все наши переменные) для всех объектов а потом опять STATE_Read (но уже для тех что на 1 локации с ГГ)

И того 3 Read и 1 Write во время загрузки... зачем?

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

*Shoker*, Была такая идея, но , тогда я не смогу регулировать каналы:

Для канала - исходящий (сендеры) 2.- это о ком новости ...

Я хочу сделать регулируемыми. Для чего? Есть идея привязать носвости к Каналам, в общий идут типсы только о всякой фигне, а вот сообщения о выстрелах, мутантах, Сос, нападение - уже по каналам группировок ...

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

Так же я не думаю, что наличие новостей от зомбарей и монолитовцев в канале кого-то обрадует? Их можно исключить, либо моим методом (несколько таблиц) Либо добавлять условия на проверку группировки - опять очень много if then . Т.е этими табличками я избавился от n-ного количества if и сделал удобным для выбора и регулирования сообщений ...

Вот прикол, зацените:

 

Так же, вариант с табличкой под группировку упрощает адаптацию под моды с кучей группировок и пр. фигней...

 

 

Пока тестовый режим ....

thumb.png

thumb.png

 

 

 

По поводу функциональности - Берутся только реальные сендеры, настраивается их радиус,т.е левых сендеров не будет...

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

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

local MsgTbl = {}

function addToTbl(name,ti)
if MsgTbl[name] == nil then
    MsgTbl[name] = {}
end

table.insert(MsgTbl[name], ti)
end

 

С помощью функции addToTbl() ты можешь добавить в MsgTbl нужный тебе текст к нужной группировке. Тоесть если тебе надо допустим добавить текст (или не тока текст, ti может быть и таблицой и чем угодно) к свободе, то ты просто пишешь addToTbl("freedom", <...>)

 

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

 

function getFromTbl(name)
if MsgTbl[name] == nil then
    return nil --\\ вернёт nil если ничего нету
end
  
return MsgTbl[name]
end

 

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

local MsgTbl = {
     freedom = { -- эту таблицу вернёт функция getFromTbl, name = freedom
                1 = ...,
                2 = ...,
                      },
                     }

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

*Shoker*

Странноватые вопросы возникают у тебя ... (по STATE_Read/Write). Вроде как даже пояснил ...

Как вообще возникают объекты в игре? Как они получают свои параметры? Как меняют свои параметры?

Это обшие вопросы и не имеют к теме отношения. Но все же поясню.

При старте игры из сэйва читаеся информация о всех динамических объектах, которые были в игре при сохранении. Для новой игры (НИ) информация о таких объектах берется из all.spawn'а.

Сервер создает объекты-заготовки соответствующего класса для всех объектов. На этом этапе это просто шаблоны с дефолтными параметрами и с единыи ID-65535 (т.е. игровой идентификатор пока не задан!).

Далее, в объекты-заготовки считываются (STATE_Read) их конкретные параметры и объекты расставляются по локациям, координатам и пр ...

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

Для объектов, которые биндятся и могут иметь сохраненные в сэйве параметры в pstor'ах - вновь запускается читалка (STATE_Read) и считываются эти параметры.

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

Ну и т.д. ... Например для объекта 'оружие в рукаг ГГ' будет вызываться STATE_Read/Write периодически, что можно даже с некоторой погрешностью испорльзовать для счтывания текущего кол-ва патронов для этого объекта ... не задействуя сторонние апдейтеры.

 

Ну а модуль нет-пакетов не переопачивается каждый раз. Суть (на 95%) остается прежней.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Какую логику надо дать НПСу, чтобы он лежал и просил о помощи

Сообщение от модератора ColR_iT
Ему нужно дать литр молока и банку солёных огурцов...

В шапку темы заглядывайте иногда!

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

Создаю глобальный мод с новыми локациямЭ

Вопрос, почему НПС не идет на костер, и не берется под смарт? Он просто уходит бродить по точкам..

[smart_terrains]
ds_lager = true

[logic]
active = kamp

[kamp]
center_point = ds_lager_kamp_1
radius = 3

Жить – значит делать вещи, а не приобретать их.

 

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

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

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

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

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

Войти

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

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

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