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

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

*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ь
Ссылка на комментарий

Vano_Santuri

Ну с таймерами или таблицами тебе решать. Это дело вкуса.

 

А ретушировка - просто у тебя два раза в коде берётся id объекта, хотя этот id у тебя уже есть, и смысла брать занаво его нету.

Ну и в функции give_spamm()

return "spamer" просто заменил на return true, это уже только привычка. Можешь вернуть по старому.

 

 

Viнt@rь

А что у тебя такого с функцией table.insert случилось? :D

Я знаю там единственное что если идёт цикл перебора элементов в таблице (например через pairs()), то их нельзя удалять в этот момент через table.remove, а так всё оке работает.

 

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

Теперь там ключ это цифра, а ID это значение.

1 = id

2 = id

3 = id

...

 

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

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

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

Vano_Santuri

Учитывая, что мы все же в топике по скриптам, а конкретные коды (кривые иль гениальные) всего лишь частность, все же напомню про основы:

1. Первичны не конкретные коды, а алгоритм(!), который реализован на кодах. К сожалению, нередко моддмейкер, забывает собственно про алгоритм, и начинает усложнять/упрощать/шлифовать сами коды, забывая про цель/алгоритм.

2. Стремление писать попроще и покороче конечно имеет свои положительные стороны, но, в конечном счете важно не кол-во символов/строк в коде, а результат его работы.

 

К чему это? Да, например, к тем же кодам по спаммерам.

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

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

1. Не желательно, чтобы новости транслировал один и тот же объект, когда имеются альтернативы.

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

2. Занесение в спаммеры не должно быть периодическим и "навечно". Т.е. вот до 7-ми считаем, и если меньше - все молчат даже если неделя прошла ... а потом всех сразу и даже последнего, кто глаголил новость секунду назад - перестали считать спаммером.

Не нужно ставить жесткие рамки, а всего-то нужно оговорить и в кодах реализовать достаточно мягкие условия:

- если дал новость - то до следующего раза становишься в конец возможных кандидатов в сендеры.

- по некоторому истечению времени (например пара часов) спаммер перестает считаться спаммером.

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

- ... ну и далее по фантазии и по задумкам.

 

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

Всегда это: if give_spamm(objId) ~= "spammer" then будет проигрывать этому: if give_spamm(objId) == false then ... тем более в циклах.

 

И не нужно бояться применять те или иные методы/операторы! Важно понимать их работу, особенности их применения и применять ПРАВИЛЬНО, а не "копипастом" ... Ну а если что-то не так - то по-возможности найти причину, чтобы в других подобных ситуациях не наступать на грабли. Субъективный отказ от заведомо рабочих вариантов только зашоривает программиста и обедняет варианты его решений.

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

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

Ссылка на комментарий

Возможно ли без скриптовой эмуляции слотов заменить болт на другой предмет на его слоте?Пыталься адаптировать детекторы из последнего худа предметов на 5 слот.Сначала через апдейт отслеживал наличие стандартного детектора на поясе ГГ.Далее в случае перенесения предмета сначала вызывал удаление болта через дроп и удаление,затем удаление стандарного и далее спавн детектора из худов.Подумал,что если 5 слот пустой,то детектор туда автоматически будет перенесен.Но его нет.Там все тот же болт.Значит, или на этом слоте детекторы не работают, либо нужна будет скриптовая эмуляция слота.Прошу помочь в вопросе.И есть ли функция автоматической замены предмета в слоте на другой в случае его наличия в инвентаре.

Ссылка на комментарий

panzyuza

Во-первыз, предмет "болт" (объект CBolt) контролируется движком как у актора, так и у остальных неписей. Пытаться его "заменить" бессмысленно. Ты можешь обозвать хоть аптечку болтом и напялить на нее модель болта, но болтом она от этого не станет.

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

И в-третьих, родной слот для детекторов - 8 (в ЗП -9) и с какого такого перепуга твой актор "карманы" начинает путать? Как то непонятно, мучаться с болтовым слотом, когда в наличии имеется именно детекторный.

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

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

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

Ссылка на комментарий
Artos, все понятно.Будем работать с 8 слотом.Просто недавно смотрел скрипты SGM на ЗП, увидел там функции снятия активного предмета с слота и перемещения обьекта в слот.Возможно, такое только в ЗП возможно.Что ж, благодарю за четкий ответ.
Ссылка на комментарий

Кстати, а зачем в оригинале у GSC объект bolt не удаляется у трупа НПС никто не знает? По крайнем мере в ЧН.

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

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

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

Ссылка на комментарий

*Shoker*, что-то ты начал задавать вопросы "аля-новичок" ...

В игре НЕТ серверного объекта для болтов и отсюда же вытекает то, что удалить его невозможно хотя бы по той причине, что метод удаления объектов из игры один единственный: alife():release(server_object, boolean) - который применим ТОЛЬКО к серверным объектам.

Ну а "зачем так" - адресуй разработчикам SGC, или к любителям пофантазировать за других.

 

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

panzyuza, выражай мысли как-то более поятно ...

увидел там функции снятия активного предмета с слота и перемещения обьекта в слот
Предмет может быть в слоте или нет.

Если предмет в слоте - то он может быть активным или нет.

Т.о. функции (де)активизации предметов никаким образом не связаны с перекладыванием предметов из слота или в слот, если не считать того, что без наличия предмета в слоте не имеет смысли и говорить о (де)активизации этого предмета.

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

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

Ссылка на комментарий

Artos

А причём здесь новичок? Я никогда не задавался этим вопросом, потому что мне побоку был этот болт. Достаточно сказать, что у него нет серверного объекта.

 

И вот ещё вопрос "аля новичок"

Пытаюсь переместить предмет с земли в инвентарь объекта.

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

! ERROR: SV: can't find children [46858] of parent [497463152]

Что в принципе логично, т.к предмет на земле валяется.

 

Пробовал так:

item:transfer_item(item, mob)

И так:

mob:transfer_item(item, mob)

Работают оба метода но эти красные сообщения в консоли настораживают..

item это соотв. предмет для переноса, а mob это НПС в которого переносится предмет.

 

ЧН, 10 патч.

 

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

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

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

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

Ссылка на комментарий

*Shoker*, да потому "аля-новичок", что до сих пор и не научился задавать вопрос правильно, и только "новички" не утруждают себя поиском ответа по уже не раз обсуждавшимся вопросам. (оффтопить прекращаем, тем более сам вопрос именно НЕ в тему).

 

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

 

Предполагалка:

1. В играх ТЧ/ЧН/ЗП разработчиками НЕ предусмотрено собственно скриптовое действие "взять предмет". Взять может только актор, после нажатия соответствующей клавиши (<F>). Для всего остального предусмотрен или прямой спавн предмета в инвентарь иль в "руку" (в позицию) или передача от одного родительского объекта другому (obj1:transfer_item(item, obj2).

2. Т.к. предметы в игре предусматривают наличие владельца (родителя/parent) и от этого немалое зависит, то движек как-то контролирует это свойство (parent).

3. Само действие передачи предмета (transfer_item) предусматривает передачу от одного владельца другому.

В случаях: mob:transfer_item(item, mob) иль item:transfer_item(item, mob) возникает нелогичность (неполнота действия),

т.к. предмет передается или "самому себе" или "сам себя", что исключает наличие второго владельца. Вот вероятно о такой нелогичности (не "полноте" действия) и говорит строка в логе.

И "настораживаться" по этому поводу НЕ стОит, т.к. более ни на что эта строка и "неполнота" не влияет. Вот только не стОит пытаться "передавать предмет", если его нет у владельца.

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

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

Ссылка на комментарий

Спасибо :)

Я бы и не "настораживался" но мне уже два-три раза прислали такие логи.

Expression : child

Function : xrServer::Perform_destroy

File : E:\priquel\sources\engine\xrGame\xrServer_sls_clear.cpp

Line : 22

Description : child registered but not found [30467]

[error]Expression : assertion failed

[error]Function : CSE_InventoryBox::add_offline

[error]File : E:\priquel\sources\engine\xrGame\alife_dynamic_object.cpp

[error]Line : 233

[error]Description : child

 

 

Так что решил перестраховаться.

 

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

Потрудись оформлять свои посты самостоятельно! --/Artos

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

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

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

Ссылка на комментарий

*Shoker*, зачем же мешать два разных вопроса в одно? Опять напрашивается обидное для тебя сравнение ...

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

Во-втором - совершенно иное и речь уже идет о дочерних объектах. Зачем же смешивать два разных понятия?

 

Ну а поиск причины по второму (там, кстати, также вероятно две разные причины) - без конкретной информации не имеет смысла.

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

Ссылка на комментарий

Я могу хранить данные, предназначенные или функции?

 

было бы очень приятно для меня jemadn помогает, потому что у меня есть сценарий все NPC, когда я приглашаю spwant новый, но я просто хочу, даже если они мертвы

 

потому, что кто-то может сказать, как я могу сделать это

 

local respwan_table = {}
local timer = nil
local spwan = false
local levels = {marsh=            {x=-61.996055603027,y=0.92057931423187,z=293.67742919922}, 
                l01_escape=        {x=-61.996055603027,y=0.92057931423187,z=293.67742919922},
                l02_garbage=    {x=-61.996055603027,y=0.92057931423187,z=293.67742919922},
                l03_agroprom=    {x=-61.996055603027,y=0.92057931423187,z=293.67742919922},
                l04_darkvalley=    {x=-61.996055603027,y=0.92057931423187,z=293.67742919922},
                l05_bar=        {x=-61.996055603027,y=0.92057931423187,z=293.67742919922},
                l06_rostok=        {x=-61.996055603027,y=0.92057931423187,z=293.67742919922},
                l07_military=    {x=-61.996055603027,y=0.92057931423187,z=293.67742919922},
                l08_yantar=        {x=-61.996055603027,y=0.92057931423187,z=293.67742919922}}

function spwawn()
    if db.actor:alive() == false then return end
    local level_name = level.name()
    if spwan == false then
        if timer == nil then 
            timer = level.get_time_hours() + math.random(3, 6) 
            if timer > 23 then timer = timer - 24 end
        end
        if time_global() > timer then
            timer = nil
            for lvl, pos in pairs(levels) do
                if level_name == lvl then
                    spwan = true
                    local pos = vector():set(pos.x, pos.y, pos.z)
                    local lvi = db.actor:level_vertex_id()
                    local gvi = db.actor:game_vertex_id()
                    respwan_table[alife():create("mar_clear_sky_respawn_1", pos, lvi, gvi).id] = true
                    respwan_table[alife():create("mar_clear_sky_respawn_2", pos, lvi, gvi).id] = true
                    respwan_table[alife():create("mar_clear_sky_respawn_3", pos, lvi, gvi).id] = true
                end
            end
        end
    elseif spwan == true then
        local tbl_count,obj = 0,nil
        for k,v in pairs(respwan_table) do
            obj = db.storage[k] and db.storage[k].object
            if obj and obj:alive() == false and v == true then
                v = false
            else
                tbl_count = tbl_count + 1
            end
        end
        if tbl_count == 0 then 
            respwan_table = {}
            spwan = false 
        end
    end
end

 

спасибо

 

Hide your code under the spoiler. Cyclone

Ссылка на комментарий

Вопрос (для ЗП):

В xr_effects есть функция проверки существования сквада squad_exist(SID сквада).

А можно ли написать функцию проверки существования симуляционных сквадов (которые без sid) на определенной локации? Подскажите, кто разбирается.

 

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

Сорри, очепятался, в xr_conditions....

Ссылка на комментарий

Clayman, конечно можно написать любую функцию, если заданы конкретные условия.

В отличии от squad_exist(SID сквада), для которой задан однозначный аргумент и можно однозначно дать ответ (true/false) отряд с искомым сидом существует иль нет, для твоей размытой формклировки "существование сквадов без сидов" дать "булев" ответ в общем-то можно, но именно что вообще на локации есть отряды ...

Формулируй условие более конкретно и пиши себе функцию.

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

Ссылка на комментарий
Artos, я вроде все точно сформулировал, ок, давай сформулирую точнее - можно ли проверить, есть ли на локации хоть один из сквадов с определенным именем, а не сид-ом. Допустим у меня респавнится сквад с именем sim_squad_1, у него нету ни target_smart, ни story_id, он симуляционный, т.е. шляется по локации и ищет приключения на свою задницу. Более того, в респавне может быть не один сквад с таким именем в одно и то-же время, т.е. если их 2 или более отреспавнились. Вот и нужна проверка, есть ли на локации хоть один сквад с именем sim_squad_1. Конкретней некуда уже;) Изменено пользователем Clayman
Ссылка на комментарий

Clayman, ну если ты, как говоришь "все точно сформулировал":

Clayman: А можно ли написать функцию ...
- то лови адекватный "соответствующий сформулировке вопроса" ответ:
Artos: ... конечно можно написать любую функцию ... и пиши себе функцию
:crazy:

Ну а по сути, а не по форме, то именно после уточнения стало несколько понятнее о чем же речь, т.к. первоначально, например мною, воспринималось как: необходима поверка по имени иль еще чему, а не по сиду, существование некоего сквада на локации. Но(!):

1. Почему-то многие употребляя термин считают что все другие воспринимают его именно так, как и они?

Видишь ли, термин "имя" может относиться достаточно к многим понятиям, но скрипты/алгоритмы НЕ допускают вольных трактовок.

Имя секции - дейсвительно может быть применено к нескольким объектам, в данном случае отрядам, но

Имя (имена) все они получают разные! Т.о. в игре НЕТ отрядов с одинаковыми именами, но могут существовать с одинаковыми именами секций.

2. Если у тебя игра состоит из одной локации, то все понятно, если трактовать именно 'имя секции', а если локаций несколько? Как скрипт должен понять твое "есть ли на локации"? Как на текущей или на какой-то конкретной? Как видишь это непременное уточнение тобою тоже упущено.

Ну и ... совсем к сути: Ты задал вопрос "

Можно ли ..." - ответ очевиден "Можно - делай!". Но что то мне подсказывает, что твоя "точная" формулировка подразумевает нечто иное, т.е. типа: "Дайте мне готовую функцию", т.к. никаких своих попыток в этом направлении тобою не приведено. Или я ошибаюсь и твоя "точная" формулирока не подразумевает, что за тебя кто-то должен все сделать? :crazy:

 

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

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

Ссылка на комментарий

Artos, спасибо за помощь, я уже понял, какое я ничтожество :D

Кто-то еще на форуме может по существу помочь...написать за меня эту функцию, так я на это не способен. Можно в личку.

Ссылка на комментарий

Clayman, самокритика и самобичевание не всегда являются верным решением ... и уж тем более не являются средством достижения цели.

Учитывая, что мы все же в топике "Школа моддинга", где учатСЯ что-то делать самостоятельно, может быть сам попробуешь (с нашей помошью) написать тобою желаемое? Ведь способности не даются с рождения, а нарабатываются и временем и трудом (самостоятельным). Тем более и сам привел косвенный пример функции того, чего хотелось бы и с условиями почти разобрались.

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

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

Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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