Viнt@rь 50 Опубликовано 16 Марта 2012 Поделиться Опубликовано 16 Марта 2012 (изменено) *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 выборку ведь можно делать не через цикл, а смотреть есть ли данный ид в таблице... ЗЫ саму таблицу и счетчик можно сохранять методом записи переменных, это не проблематично... Изменено 16 Марта 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
*Shoker* 322 Опубликовано 16 Марта 2012 Поделиться Опубликовано 16 Марта 2012 Vano_Santuri Ну с таймерами или таблицами тебе решать. Это дело вкуса. А ретушировка - просто у тебя два раза в коде берётся id объекта, хотя этот id у тебя уже есть, и смысла брать занаво его нету. Ну и в функции give_spamm() return "spamer" просто заменил на return true, это уже только привычка. Можешь вернуть по старому. Viнt@rь А что у тебя такого с функцией table.insert случилось? Я знаю там единственное что если идёт цикл перебора элементов в таблице (например через pairs()), то их нельзя удалять в этот момент через table.remove, а так всё оке работает. > выборку ведь можно делать не через цикл, а смотреть есть ли данный ид в таблице... Теперь там ключ это цифра, а ID это значение. 1 = id 2 = id 3 = id ... Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Viнt@rь 50 Опубликовано 16 Марта 2012 Поделиться Опубликовано 16 Марта 2012 *Shoker*, я имел ввиду как я показывал ранее, а с table.insert да и вообще со всеми table.***** 1. они очень медленные 2. у меня изза инсерта походу переполнение происходит и потом начинаются баги, что апдейт актора глохнит и сейвы бьются... да и вообще при начале разработки новостей везде использовались функции table.**** в итоге были повисания, баги(как изза инсерта, что я описал выше), и вылеты... GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Artos 99 Опубликовано 16 Марта 2012 Поделиться Опубликовано 16 Марта 2012 (изменено) Vano_Santuri Учитывая, что мы все же в топике по скриптам, а конкретные коды (кривые иль гениальные) всего лишь частность, все же напомню про основы: 1. Первичны не конкретные коды, а алгоритм(!), который реализован на кодах. К сожалению, нередко моддмейкер, забывает собственно про алгоритм, и начинает усложнять/упрощать/шлифовать сами коды, забывая про цель/алгоритм. 2. Стремление писать попроще и покороче конечно имеет свои положительные стороны, но, в конечном счете важно не кол-во символов/строк в коде, а результат его работы. К чему это? Да, например, к тем же кодам по спаммерам. Взяв идею, и даже возможно в голове набросав некий черновик алгоритма для реализации учета спаммеров, ты просто и себя и нас зацикливаешь на некорой частной реализации ... Может быть она и проста и код короткий, но ... а оптимальный ли он для решения поставленной задачи? Не буду тут давать какой-то законченный алгоритм,его написание тоже увлекательное заятие ... Просто напомню иль дам подсказки: 1. Не желательно, чтобы новости транслировал один и тот же объект, когда имеются альтернативы. У тебя сейчас реализовано так, что попав в спамеры - ему по сути затыкают рот ... А если поблизости больше никого подходящего нет? 2. Занесение в спаммеры не должно быть периодическим и "навечно". Т.е. вот до 7-ми считаем, и если меньше - все молчат даже если неделя прошла ... а потом всех сразу и даже последнего, кто глаголил новость секунду назад - перестали считать спаммером. Не нужно ставить жесткие рамки, а всего-то нужно оговорить и в кодах реализовать достаточно мягкие условия: - если дал новость - то до следующего раза становишься в конец возможных кандидатов в сендеры. - по некоторому истечению времени (например пара часов) спаммер перестает считаться спаммером. - по возможности ввести критерии "болтливости". Например ветераны/мастера - не очень-то болтливы. Новички также могут "стесняться" глаголить на всю Зону, а вот опытным - вполне по натуре оповещать таких же ... - ... ну и далее по фантазии и по задумкам. Ну и технический момент: если нет причин, то стОит заменять проверки совпадения строк на их булевы или численные эквиваленты. Всегда это: if give_spamm(objId) ~= "spammer" then будет проигрывать этому: if give_spamm(objId) == false then ... тем более в циклах. И не нужно бояться применять те или иные методы/операторы! Важно понимать их работу, особенности их применения и применять ПРАВИЛЬНО, а не "копипастом" ... Ну а если что-то не так - то по-возможности найти причину, чтобы в других подобных ситуациях не наступать на грабли. Субъективный отказ от заведомо рабочих вариантов только зашоривает программиста и обедняет варианты его решений. Изменено 16 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
panzyuza 41 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 Возможно ли без скриптовой эмуляции слотов заменить болт на другой предмет на его слоте?Пыталься адаптировать детекторы из последнего худа предметов на 5 слот.Сначала через апдейт отслеживал наличие стандартного детектора на поясе ГГ.Далее в случае перенесения предмета сначала вызывал удаление болта через дроп и удаление,затем удаление стандарного и далее спавн детектора из худов.Подумал,что если 5 слот пустой,то детектор туда автоматически будет перенесен.Но его нет.Там все тот же болт.Значит, или на этом слоте детекторы не работают, либо нужна будет скриптовая эмуляция слота.Прошу помочь в вопросе.И есть ли функция автоматической замены предмета в слоте на другой в случае его наличия в инвентаре. AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 (изменено) panzyuza Во-первыз, предмет "болт" (объект CBolt) контролируется движком как у актора, так и у остальных неписей. Пытаться его "заменить" бессмысленно. Ты можешь обозвать хоть аптечку болтом и напялить на нее модель болта, но болтом она от этого не станет. Во-вторых, даже если ты как-то выкинешь из слота болт, то не надейся что слот станет пустым! Движек в тот же момент заполнит этот слот новым болтом. Уже в момент броска у актора один болт в руке и он его кидает, а другой уже в слоте. И в-третьих, родной слот для детекторов - 8 (в ЗП -9) и с какого такого перепуга твой актор "карманы" начинает путать? Как то непонятно, мучаться с болтовым слотом, когда в наличии имеется именно детекторный. И, на-последок, само по себе ничего в игре не происходит. автомато в слоты предметы не "переносятся" - это все прописывается в строках конфигов предметов. И, конечно же, нет штатных "функций автозамены" предметов в слотах. Изменено 17 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
panzyuza 41 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 Artos, все понятно.Будем работать с 8 слотом.Просто недавно смотрел скрипты SGM на ЗП, увидел там функции снятия активного предмета с слота и перемещения обьекта в слот.Возможно, такое только в ЗП возможно.Что ж, благодарю за четкий ответ. AVS_LOCATION_MOD Ссылка на комментарий
*Shoker* 322 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 (изменено) Кстати, а зачем в оригинале у GSC объект bolt не удаляется у трупа НПС никто не знает? По крайнем мере в ЧН. Изменено 17 Марта 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 (изменено) *Shoker*, что-то ты начал задавать вопросы "аля-новичок" ... В игре НЕТ серверного объекта для болтов и отсюда же вытекает то, что удалить его невозможно хотя бы по той причине, что метод удаления объектов из игры один единственный: alife():release(server_object, boolean) - который применим ТОЛЬКО к серверным объектам. Ну а "зачем так" - адресуй разработчикам SGC, или к любителям пофантазировать за других. Добавлено через 6 мин.: panzyuza, выражай мысли как-то более поятно ... увидел там функции снятия активного предмета с слота и перемещения обьекта в слотПредмет может быть в слоте или нет. Если предмет в слоте - то он может быть активным или нет. Т.о. функции (де)активизации предметов никаким образом не связаны с перекладыванием предметов из слота или в слот, если не считать того, что без наличия предмета в слоте не имеет смысли и говорить о (де)активизации этого предмета. Изменено 17 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 (изменено) Artos А причём здесь новичок? Я никогда не задавался этим вопросом, потому что мне побоку был этот болт. Достаточно сказать, что у него нет серверного объекта. И вот ещё вопрос "аля новичок" Пытаюсь переместить предмет с земли в инвентарь объекта. Перенос работает но в консоли постоянно появляются сообщения вида: ! ERROR: SV: can't find children [46858] of parent [497463152] Что в принципе логично, т.к предмет на земле валяется. Пробовал так: item:transfer_item(item, mob) И так: mob:transfer_item(item, mob) Работают оба метода но эти красные сообщения в консоли настораживают.. item это соотв. предмет для переноса, а mob это НПС в которого переносится предмет. ЧН, 10 патч. К сожалению глянуть примеры в других модах не могу, т.к диск с ними у меня сейчас не подключён. Изменено 17 Марта 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 (изменено) *Shoker*, да потому "аля-новичок", что до сих пор и не научился задавать вопрос правильно, и только "новички" не утруждают себя поиском ответа по уже не раз обсуждавшимся вопросам. (оффтопить прекращаем, тем более сам вопрос именно НЕ в тему). Можно сколько угодно гадать для чего и почему в логе появляются различные строки от разработчиков, но только они знают правильный ответ. Предполагалка: 1. В играх ТЧ/ЧН/ЗП разработчиками НЕ предусмотрено собственно скриптовое действие "взять предмет". Взять может только актор, после нажатия соответствующей клавиши (<F>). Для всего остального предусмотрен или прямой спавн предмета в инвентарь иль в "руку" (в позицию) или передача от одного родительского объекта другому (obj1:transfer_item(item, obj2). 2. Т.к. предметы в игре предусматривают наличие владельца (родителя/parent) и от этого немалое зависит, то движек как-то контролирует это свойство (parent). 3. Само действие передачи предмета (transfer_item) предусматривает передачу от одного владельца другому. В случаях: mob:transfer_item(item, mob) иль item:transfer_item(item, mob) возникает нелогичность (неполнота действия), т.к. предмет передается или "самому себе" или "сам себя", что исключает наличие второго владельца. Вот вероятно о такой нелогичности (не "полноте" действия) и говорит строка в логе. И "настораживаться" по этому поводу НЕ стОит, т.к. более ни на что эта строка и "неполнота" не влияет. Вот только не стОит пытаться "передавать предмет", если его нет у владельца. Изменено 17 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 (изменено) Спасибо Я бы и не "настораживался" но мне уже два-три раза прислали такие логи. 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 Изменено 17 Марта 2012 пользователем Artos Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 *Shoker*, зачем же мешать два разных вопроса в одно? Опять напрашивается обидное для тебя сравнение ... В первом вопросе речь о родительских объектах (владельцах) и возможные ошибки обусловлены одними услвиями. Во-втором - совершенно иное и речь уже идет о дочерних объектах. Зачем же смешивать два разных понятия? Ну а поиск причины по второму (там, кстати, также вероятно две разные причины) - без конкретной информации не имеет смысла. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
olaf1 0 Опубликовано 17 Марта 2012 Поделиться Опубликовано 17 Марта 2012 Я могу хранить данные, предназначенные или функции? было бы очень приятно для меня 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 Ссылка на комментарий
Clayman 104 Опубликовано 18 Марта 2012 Поделиться Опубликовано 18 Марта 2012 Вопрос (для ЗП): В xr_effects есть функция проверки существования сквада squad_exist(SID сквада). А можно ли написать функцию проверки существования симуляционных сквадов (которые без sid) на определенной локации? Подскажите, кто разбирается. Добавлено через 118 мин.: Сорри, очепятался, в xr_conditions.... Ссылка на комментарий
Artos 99 Опубликовано 18 Марта 2012 Поделиться Опубликовано 18 Марта 2012 Clayman, конечно можно написать любую функцию, если заданы конкретные условия. В отличии от squad_exist(SID сквада), для которой задан однозначный аргумент и можно однозначно дать ответ (true/false) отряд с искомым сидом существует иль нет, для твоей размытой формклировки "существование сквадов без сидов" дать "булев" ответ в общем-то можно, но именно что вообще на локации есть отряды ... Формулируй условие более конкретно и пиши себе функцию. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Clayman 104 Опубликовано 18 Марта 2012 Поделиться Опубликовано 18 Марта 2012 (изменено) Artos, я вроде все точно сформулировал, ок, давай сформулирую точнее - можно ли проверить, есть ли на локации хоть один из сквадов с определенным именем, а не сид-ом. Допустим у меня респавнится сквад с именем sim_squad_1, у него нету ни target_smart, ни story_id, он симуляционный, т.е. шляется по локации и ищет приключения на свою задницу. Более того, в респавне может быть не один сквад с таким именем в одно и то-же время, т.е. если их 2 или более отреспавнились. Вот и нужна проверка, есть ли на локации хоть один сквад с именем sim_squad_1. Конкретней некуда уже Изменено 18 Марта 2012 пользователем Clayman Ссылка на комментарий
Artos 99 Опубликовано 18 Марта 2012 Поделиться Опубликовано 18 Марта 2012 (изменено) Clayman, ну если ты, как говоришь "все точно сформулировал": Clayman: А можно ли написать функцию ... - то лови адекватный "соответствующий сформулировке вопроса" ответ: Artos: ... конечно можно написать любую функцию ... и пиши себе функцию Ну а по сути, а не по форме, то именно после уточнения стало несколько понятнее о чем же речь, т.к. первоначально, например мною, воспринималось как: необходима поверка по имени иль еще чему, а не по сиду, существование некоего сквада на локации. Но(!): 1. Почему-то многие употребляя термин считают что все другие воспринимают его именно так, как и они? Видишь ли, термин "имя" может относиться достаточно к многим понятиям, но скрипты/алгоритмы НЕ допускают вольных трактовок. Имя секции - дейсвительно может быть применено к нескольким объектам, в данном случае отрядам, но Имя (имена) все они получают разные! Т.о. в игре НЕТ отрядов с одинаковыми именами, но могут существовать с одинаковыми именами секций. 2. Если у тебя игра состоит из одной локации, то все понятно, если трактовать именно 'имя секции', а если локаций несколько? Как скрипт должен понять твое "есть ли на локации"? Как на текущей или на какой-то конкретной? Как видишь это непременное уточнение тобою тоже упущено. Ну и ... совсем к сути: Ты задал вопрос " Можно ли ..." - ответ очевиден "Можно - делай!". Но что то мне подсказывает, что твоя "точная" формулировка подразумевает нечто иное, т.е. типа: "Дайте мне готовую функцию", т.к. никаких своих попыток в этом направлении тобою не приведено. Или я ошибаюсь и твоя "точная" формулирока не подразумевает, что за тебя кто-то должен все сделать? Изменено 18 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Clayman 104 Опубликовано 18 Марта 2012 Поделиться Опубликовано 18 Марта 2012 Artos, спасибо за помощь, я уже понял, какое я ничтожество Кто-то еще на форуме может по существу помочь...написать за меня эту функцию, так я на это не способен. Можно в личку. Ссылка на комментарий
Artos 99 Опубликовано 18 Марта 2012 Поделиться Опубликовано 18 Марта 2012 (изменено) Clayman, самокритика и самобичевание не всегда являются верным решением ... и уж тем более не являются средством достижения цели. Учитывая, что мы все же в топике "Школа моддинга", где учатСЯ что-то делать самостоятельно, может быть сам попробуешь (с нашей помошью) написать тобою желаемое? Ведь способности не даются с рождения, а нарабатываются и временем и трудом (самостоятельным). Тем более и сам привел косвенный пример функции того, чего хотелось бы и с условиями почти разобрались. Изменено 18 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти