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

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


Svoboда

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

Disord а зачем тебе инфопоршень? AKKK1 правильно написал, но если у тебя своя функция, то просто вставь ее примерно так:

function budu_v_bunkere_spat()
        amk.start_timer("sleep_matras",0.1,matras)
end

Строгое предупреждение от модератора Куфзук
2.3. Красным цветом имеют право писать только модераторы и авторы в шапке темы.
Изменено пользователем Куфзук

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


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

NaslednikTutti, эхх хотел написать, но товарищ Artos меня опередил... Так что, только повторю его слова:

а ты не заметил, что четырежды вызывая по сути одну и ту же функцию (меняются только координаты спавна), ты спавнишь одну и ту же секцию непися "military_camp_npc_1"?!

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

 

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

Изменено пользователем Viнt@rь

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


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

Igor88.89

сорри, не помню точно, но помойму при спавне через скрипт, что бы заспавнить на определенный локе - обязательно надо указывать lvlid и gvid
position_table = {
      [ 1] = {246.804992675781, 15.5329999923706, 494.454986572266,lvlid-твой,gvid-твой},
      [ 2] = {247.100006103516, 13.7950000762939, 439.272003173828,lvlid-твой,gvid-твой},
      [ 3] = {339.779998779297, -6.9539999961853, 368.662994384766,lvlid-твой,gvid-твой}
-- и так далее
     }
local aNums = {}

function spawn_anoms()
local rCount  = math.random(1,#position_table)
     for i = 1,rCount do
          local rNum  = math.random(1,#position_table)
          if aNums[rNum] then
              rNum = rNum+1 --что бы не спавнить в одно и тоже место
          end
          local tT = position_table[rNum]
          alife():create("секция твоей аномалии", vector():set(tT[1],tT[2],tT[3]), tT[4], tT[5] )
          aNums[rNum] = {} --примено так, сорри если что, точно не помню
     end
end

 

 

в прочем как-то так)), но стоит доработать, так как всеравно может заспавниться аномалия по одним и тем же координатам

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


Ссылка на сообщение
Igor88.89 #position_table - Операция получения длины массива/таблицы, а math.random(1,#position_table) берет рандомное число из промежутка от 1, до числа, которое вернет #position_table Изменено пользователем Viнt@rь

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


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

да...

 

только обязательно учти

стоит доработать, так как всеравно может заспавниться аномалия по одним и тем же координатам
Изменено пользователем Viнt@rь

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


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

Igor88.89, тогда примерно так

local lTbl = {"marsh","escape"}
local position_table= { 
["marsh"]  = {
      [ 1] = {246.804992675781, 15.5329999923706, 494.454986572266,lvlid-твой,gvid-твой},
      [ 2] = {247.100006103516, 13.7950000762939, 439.272003173828,lvlid-твой,gvid-твой},
      [ 3] = {339.779998779297, -6.9539999961853, 368.662994384766,lvlid-твой,gvid-твой}
-- и так далее
},
["escape"] = {
      [ 1] = {246.804992675781, 15.5329999923706, 494.454986572266,lvlid-твой,gvid-твой},
      [ 2] = {247.100006103516, 13.7950000762939, 439.272003173828,lvlid-твой,gvid-твой},
      [ 3] = {339.779998779297, -6.9539999961853, 368.662994384766,lvlid-твой,gvid-твой}
-- и так далее
}
-- и так далее
}

function spawn_anoms()
for k,v in pairs(lTbl) do
local aNums = {}
local rCount  = math.random(1,#position_table[v])
     for i = 1,rCount do
          local rNum  = math.random(1,#position_table[v])
          if aNums[rNum] then
              rNum = rNum+1 --что бы не спавнить в одно и тоже место
          end
          local tT = position_table[rNum]
          alife():create("секция твоей аномалии", vector():set(tT[1],tT[2],tT[3]), tT[4], tT[5] )
          aNums[rNum] = {} --примено так, сорри если что, точно не помню
     end
end
end

 

 

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


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

Igor88.89

вот сдесь я допустил ошибку

 

надо не

local tT = position_table[rNum]

 

а

local tT = position_table[v][rNum]

 

вот только не помню передастся ли v из первого цикла во второй, если нет то после первого цикла добавь такое

 

local level_name = v

и тогда это будет так

local tT = position_table[level_name][rNum]

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


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

strelok200,

1. если ты пользуешься логовыми функциями, то первое, что они делают - это выводят твой текст-лог в консоль, а двиг читает любую введенную консольную строку как команду... Посему и пишет Unknown command, а nil - это ты видимо пытаешься выдать в консоль команду nil

2. на платформах ЗП/ЧН: в отличии от ТЧ, на этих двух платформах(как я заметил) если просто выводить текст-лог в консоль, то в консоли тоже пишется Unknown command: твоя строка, но такое возможно от силы 2 раза, в последствии чего происходит фатальная ошибка, после чего лог не выводиться в консоль вообще, да и сама игра/скрипты начинают дико тупить, потому обычно перед своей строкой для вывода в лог приписывают такое: "load ~~~ " -- Заметка на будущее если что)

Изменено пользователем Viнt@rь

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


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

Так как раньше тема называлась "скриптирование, спавн и логика" и более подходящей темы для моего вопроса нет, то я задам его сдесь.

 

Мб кто знает почему на движке ЗП вертолет, после пролета по паре точек, начинает лететь криво, тоесть: вот он спавнится, летит нормально мордой вниз хвост вверх, но при пролете через пару точек он начинает менять свое положение противоположно - морда вверх и хвост вниз, и потом летит так постоянно?

Что пробывал:

1) делал точки как в ТЧ

2) все скрипты/конфиги были взяты из ТЧ и переделаны/адаптированы под ЗП

 

Результат:

все тоже самое :(

Изменено пользователем Viнt@rь

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


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

*Shoker*, т. point_look у вертолета используется только тогда, когда он стоит на месте.

Ну или ещё вариант, перемудрил со скоростью вертолёта.

проверил, не в скорости дело(

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


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

Tris, ты даже не удосужился полезть в скрипты, почти, любого мода, так как во многих из них используются функции сохранения/загрузки переменных, например: скрипты Artos`a, амк мода, и тп, включая оригинальный, пысовский, скрипт xr_logic в котором есть функции эти функции:

1.pstor_store(obj, varname, val) - сохранение переменной varname с значением val в пстор obj

2.pstor_retrieve(obj, varname, defval) - -загрузка переменной varname из пстора obj, если такой переменной нет, то вернет defval

 

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

Изменено пользователем Viнt@rь

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


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

Vano_Santuri, а зачем вообще такой геморой? Свободно можно отсекать всех нпс и выбирать самого ближнего к трупу, не заполняя таблицу всеми нпс, которые вокруг.

О таблице всех нпс на локе, зачем? радиус алайфа ну совсем мизерный...

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

мой пример:
function GetSender(sType, oPos, oKiller)
    local oSender = nil
    if sType == "murder" then
        local iMinDist = 30
        local iMaxDist = 100
        for k,v in pairs(db.storage) do                
            local oTrav = level.object_by_id(k)    
            if oTrav and IsStalker(oTrav) and oTrav:character_community() ~= "actor" and not ExcludedNpcs(oTrav) then
                if xr_wounded.is_wounded(oTrav) == false and oTrav:alive() then
                    if oKiller then
                        if oTrav:id() ~= oKiller:id() then fGetSender = true end
                    else
                        fGetSender = true
                    end
                    if fGetSender then
                        local DiffDist = oPos:distance_to(oTrav:position())
                        if DiffDist < iMaxDist and DiffDist > iMinDist then
                            iMaxDist = DiffDist -- я об этом
                            oSender = oTrav
                        end    
                    end
                end    
            end
        end            
    end
    return oSender
end

 

 

ЗЫ это так же логичней/реалистичней, в плане нахождения реального сендера, в добавок - намного оптимальней

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

Изменено пользователем Viнt@rь

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


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

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

Твою точку зрения я понял и я с ней согласен, но все же... Если бы, все обьекты (хотя бы одной)локации были онлайн, то, то, что ты предлагаешь, надо делать в первую очередь, так как события происходили бы по всей локе постоянно, а не только там, где находится ГГ, и в таком случае проверка действительно выполнялась бы через чур часто...

 

Ну и ... как ранее заметил Vano_Santuri, все же не стОит алгоритм загонять в жесткие рамки. Если у костра сидит с десяток сталкеров - то ближайший к некоей точке вне костра будет как правило только один - что на "реализЬм" новостей плохо сказывается, превращая этого "ближнего" в штатного корреспондента.

 

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

 

Сорри, чет понесло в оффтоп...

Изменено пользователем Viнt@rь

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


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

Vano_Santuri, небольшое предложение по function give_spamm(objId)

 

local spammers = {} -- Таблица спамеров.
function GiveStalker()
    for k, v in pairs(db.storage) do
    local obj = level.object_by_id(k)
        if (obj) and (IsStalker(obj)) and (obj:alive()) and (obj:id() ~= db.actor:id()) then
        local ComObj = obj:character_community()
        if VS_send_news.CommunityChenalStatus(ComObj,1) then    --Проверка на открытость канала
            if ValNpc(obj)~=true then --Отсекаем квестовых нпс
            local objId = obj:id()
            if not CheckSpamm(objId) then
            spammers[objId] = true -- Добавляем спамера.
            return obj -- нашли не спамера - отлично.
            end
            end
        end
    end
    end
end
function CheckSpamm(objId)
if #spammers > 7 then
    spammers = {} -- чистим таблицу спамеров.
elseif spammers[objId] then
    return true
end
return nil
end

 

 

ЗЫ так по идее и чиститься должна...

Изменено пользователем Viнt@rь

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


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

*Shoker*,

2) #spammers и table.getn корректно сработает только для таблицы где в качестве ключа идут порядковые номера, то есть

ты ошибаешься) даже в таблице со строковым содержимым есть порядковые номера этих строк))) потому эти функции работают корректно

Изменено пользователем Viнt@rь

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


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

*Shoker*, вот тебе пример

... 
local sTime = Time[math.random(#Time)]
...

Таблица:
Time = {"недавно","несколько минут назад","минут десять назад",...}

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


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

*Shoker*, вродь с table.insert(spammers, objId) -- Добавляем спамера. должно быть норм... хотя не уверен

Vano_Santuri, и всетаки table.insert советую пренебречь(в последнее время начал опасаться этой дьявольской функции :))

по поводу заполнения спамеров в таблицу:

можно попробывать вариан с щетчиком
local spammers = {} -- Таблица спамеров.
local sCount = 0
function GiveStalker()
    for k, v in pairs(db.storage) do
    local obj = level.object_by_id(k)
        if (obj) and (IsStalker(obj)) and (obj:alive()) and (obj:id() ~= db.actor:id()) then
        local ComObj = obj:character_community()
        if VS_send_news.CommunityChenalStatus(ComObj,1) then    --Проверка на открытость канала
            if ValNpc(obj)~=true then --Отсекаем квестовых нпс
            local objId = obj:id()
            if  (give_spamm(objId) ~= "spammer") then
             sCount = sCount + 1
             spammers[objId] = true -- Добавляем спамера.
            return obj -- нашли не спамера - отлично.
            end
            end
        end
    end
    end
end
function give_spamm(objId)
if sCount > 7 then
spammers = {} -- Чиcтим таблицу спамеров.
sCount = 0
end
    for k, v in pairs(spammers) do
    local spammer = spammers[k]
    if objId == spammer then
        return "spammer"
    end
    end
end

а это зачем?
    for k, v in pairs(spammers) do
    local spammer = spammers[k]
    if objId == spammer then
        return "spammer"
    end
    end

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

ЗЫ саму таблицу и счетчик можно сохранять методом записи переменных, это не проблематично...

 

Изменено пользователем Viнt@rь

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


Ссылка на сообщение
*Shoker*, я имел ввиду как я показывал ранее, а с table.insert да и вообще со всеми table.***** 1. они очень медленные 2. у меня изза инсерта походу переполнение происходит и потом начинаются баги, что апдейт актора глохнит и сейвы бьются... да и вообще при начале разработки новостей везде использовались функции table.**** в итоге были повисания, баги(как изза инсерта, что я описал выше), и вылеты...

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


Ссылка на сообщение
*Shoker*, у нас тоже был баг изза restrictor_type = 0, но повисал, судя по всему, апдейт актора, так как все остальное работает исправно, советую тебе попробывать restrictor_type = 3 - самый обычный(стандартный), пыс только его и используют(почти), а у нас, после исправления всех типов на 3 с 0, перестал повисать апдей актора.

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


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

В сендбоксе от xStream, в скрипте xs_sandbox и в системе таймеров(слотов/сигналов) от Malandrinus в скрипте ogse_signals заприметил очень интересную строчку(заприметил то давно, но сильный интерес она вызвала сейчас) - level.add_call(hanged_calls_check, function()end), как и когда срабатывает это(как я понял, это вызов функции при повисании логики/биндера актора), и как его можно использовать в своих целях, при этом не используя системы этих авторов, но что бы результат был такой же(ЗЫ, у меня используется своя система таймеров, но никаких модульных систем типа слотов/сигналов и тп, не используется)

Изменено пользователем Viнt@rь

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


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

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