Malandrinus 615 Опубликовано 25 Апреля 2012 Поделиться Опубликовано 25 Апреля 2012 AndreySol, у Вас руки надеюсь не отсохнут, просто чуток кода для примера выложить ? Пример чего, как сохранять переменную в биндере? Этого навалом в коде. Бери почти любой биндер: сталкеров, актора, монстров - там имеются примеры сохранения переменных. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
*Shoker* 322 Опубликовано 25 Апреля 2012 Поделиться Опубликовано 25 Апреля 2012 (изменено) AndreySol Пример смотри в bind_-скриптах. Такой скрипт может уже быть для предметов твоего класса. если его нету, можно добавить самому, в конфиге нужного предмета написать script_binding = ... (глянь в ориг. игре если нужно) А в самом скрипте бинда добавить функции save()\load() Пример можно глянуть в биндере актёра bind_stalker, функции function actor_binder:save(packet) и function actor_binder:load(reader) Они вроде как сами вызываются при загрузке\сохранении. Вот тут соответственно и надо сохранять через нет-пакеты свою информацию. Только работать с ними нужно аккуратно, иначе если будет неправильное чтение\запись может сломаться сейв. Да и по моему новую игру надо начинать, чтобы корректно писалось. Есть и более простые примеры bind_-скриптов. У актёра самый навороченный. В ЧН\ЗП (если есть) можно глянуть bind_anomaly_zone.script Изменено 25 Апреля 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 26 Апреля 2012 Поделиться Опубликовано 26 Апреля 2012 (изменено) Раз у нас тут топик все же из раздела "Школа", позволю себе немного кратко напомнить о некоторых способах сохранения 'своих' данных для об'ектов: 1. Самый простой способ конечно же - сохранение в pstor'е об'екта с использованием 'штатных' функций записи/чтения: xr_logic.pstor_store(obj, var_name, value) и xr_logic.pstor_retrieve(obj, var_name, default) Достоинства: - простота, т.е. использование проверенных штатных методов/функций; Недостатки: - сохраняются только числовые/строковые/булевы типы данных; - требуется задавать и использовать эксклюзивное имя (var_name) для ключа хранимых данных; Ограничения: - только для гейм-об'ектов (клиентских); - только для об'ектов имеющих биндеры (требуются методы save/load); - некоторые об'екты, например инвентарные ящики, порой 'теряют' записанные данные при переходах на др. локации ... - запомненные данные доступны только после загрузки гейм-об'екта в игру, т.е. могут быть недоступны для синхронизации с серверным об'ектом; - размер всех сохраняемых данных ограничен размером свободного места в нет-пакете об'екта (<8кБ для SoC, <1кБ для CS&CoP); 2. Использование 'прямой' записи данных в нет-пакет об'екта с использованием методов чтения/записи класса net_packet (коих предостаточно). Для серверных об'ектов коды чтения/записи используются в методах se_obj:STATE_Write(packet) и se_obj:STATE_Read(packet, size) и примеров предостаточно в чистой игре и тем более в модах. При отсутствии методов (STATE_Write/STATE_Read) - они могут быть добавлены в конструктор класса об'екта. Для гейм-об'ектов запись и чтение своих данных в нет-пакет производится в методах save/load биндеров обектов. Примеров кодов также предостаточно. Достоинства: - доступность, т.е. использование проверенных штатных методов; - минимальный занимаемый об'ем (кол-во байт) в сэйвах; Недостатки: - необходимость знать и правильно применять соответствующие методы класса net_packet; - отсутствие совместимости(!) сэйвов при изменениях в структуре запоминаемых данных; Ограничения: - только для об'ектов имеющих биндеры (требуются методы save/load) или соответствующие конструкторы для серверных обектов; - размер всех сохраняемых данных ограничен размером свободного места в нет-пакете об'екта (<8кБ для SoC, <16кБ для CS&CoP); 3. Использование параметра custom_data, который имеют все серверные об'екты. Чтение и запись могут осуществляться в любое время (при доступности об'екта) методами чтения/записи нет-пакетов. Дополнительно для гейм-об'ектов, чтение данных может осуществляться с использованием метода obj:spawn_ini() ... Данный метод применен, например, в моде AMK для сохранения и восстановления состояний (вкл/выкл/...) для аномалий (см. amk_anoms.script и se_zones.script). Достоинства: - доступность для всех типов/классов игровых об'ектов; Недостатки: - необходимость знать и правильно применять формат записи в строковое значение данного параметра, дабы не нарушить возможно уже имеющиеся там данные по логие об'екта и пр. данные; - необходимость приводить к строковому типу все сохраняемые данные (сериализовать); Ограничения: - размер всех сохраняемых данных ограничен размером свободного места в нет-пакете об'екта (<8кБ для SoC, <16кБ для CS&CoP); 4. При наличии доступа к методам io (Input-Output) (CS&CoP или расширители движка) - никто не запрещает использовать свои собственные файлы для хранения/восстановления требуемых данных любого об'ема. О достоинствах и недостатков говорить не буду ... не сторонник такого варианта. ;-) 5. Недавно (относительно) в топике "Язык Lua. Общие вопросы программирования." обсуждались и давались коды еще одного варианта хранения, т.е. возможность записывать/хранить/читать данные 'аля-pstor', но без ограничений как по об'ему данных, так и по сохранению таблиц. Учитывая, что ссылки на архивы устарели, привожу тут актуальную версию: se_stor (~11.6 кБ). Краткий readme: Универсальное хранилище 'se_stor' для STALKER SHoC/CS/SCoP (по материалам Malandrinus & xStream) Библиотека универсального хранилища данных произвольного размера основана на использовани нет-пакетов объектов. Используется новый тип объектов специального класса: CUST_ST <-> clsid.custom_storage и секция для этих обектов: 'custom_storage' (добавляется в конфиги игры). Хранилище автоматически подстраивается под размер хранимых данных в таблице 'storehouse'. Использовать 'storehouse' можно сразу после загрузки в игру всех серверных об'ектов хранилища, т.е. по факту загрузки игрового сервера и до момента подключения к серверу (см. в логе "Сервер: Соединяемся...", т.е. до загрузки клиентского об'екта актора!). Сохранение данных из хранилища в сэйв игры производится по вызову из биндера актора, что является единственной зависимостью модуля от сторонних событий. Вызов может быть прямым или из 'сигнальной системы событий' (event). Запись (установка) переменной в хранилище производится функцией set, 3-тий параметр - флаг необходимости проверки размера строки (опциональный параметр) se_stor.set(var_name, value, f_check) Чтение (получение) переменной в хранилище производится функцией get, 2-ой параметр - значение по-умолчанию (опциональный параметр): se_stor.get(var_name, default) Если переменной не существует и не указано значение по-умолчанию, будет возвращен nil Удаление переменных производится так же, как и установка - передачей значения nil в функцию set. Для удобства работы с таблицей хранилища в игре сама таблица размещена в модуле 'db' - db.storehouse, и работа с ней может ничем не отличаеться по сравнению с db.storage, т.е. чтение/запись: db.storehouse(кеу, value) Разрешено хранить переменные следующих типов Lua-данных: булевое - хранится как 1 байт (u8); число - хранится как 4 байта (float) или 2 (u16/s16), если требуется хранение очень больших чисел, то рекомендуется использовать хук приведения к строке: ""..1234567890 - передавать на вход set; строка - хранится как последовательность байт + нулевой символ (NULL - конец строки), ограничение на длину строки - 8000 байт (или 16200 для CS|CoP); таблицы - ПРОСТЫЕ! То есть: без метатаблиц, без нулевых символов и прочих бинарных данных, без рекурсий и только с простыми типами в ключах и значениях. Кроме того, объем таблицы ограничен - при сериализации строка должна умещаться в пакете, а значит ограничение примерно в 8000 байт текста (или 16200 для CS|CoP). Имеются два режима сериализации: с и без сжатия (компрессии) данных. Depends on: m_helpers.script --/--------------------------------------------------------------------- Использование: 1. Добавить в конфиги (например в system.ltx) секцию [custom_storage]; 2. Добавить новый класс CUST_ST <-> clsid.custom_storage в файл class_registrator.script; 3. Добавить в биндер актора коды вызова события "сохранение игры" или функцию сохранения хранилища; 4. Скопировать se_stor.script и m_helpers.script (опционален) в папку скриптов игры. --/--------------------------------------------------------------------- Artos (26/05/2012) AndreySol, замечу, что пока тобою самим не приведено ни строчки кода, чтобы можно было бы не абстрактно рассуждать и приводить всевозможные вариации осуществления ... а именно указать на ошибку/некорректность и/или дать приемлемый вариант кодов. Упомянутые тобою "ящик динамита" и тем более "артефакт" - могут иметь самые различные классы (не говоря о возможных 'твоих' изменениях в штатных конфигах) и соответственно ограничения/решения. Хочешь говорить и получать конкрентые ответы - потрудись задавать конкретные и информативные вопросы(!), иначе твоя "природная" тяга к "попроще" и будет адекватно "удовлетворяться" - т.е. проще не отвечать, а игнорировать ... Изменено 26 Апреля 2012 пользователем Artos 1 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
7.9 174 Опубликовано 26 Апреля 2012 Поделиться Опубликовано 26 Апреля 2012 (изменено) Краткий readme: "readme se_stor" Универсальное хранилище 'se_stor' для STALKER SHoC/CS/SCoP (по материалам Malandrinus & xStream) Библиотека универсального хранилища данных произвольного размера основана на использовани нет-пакетов объектов. Используется новый тип объектов специального класса: CUST_ST <-> clsid.custom_storage и секция для этих обектов: 'custom_storage' (добавляется в конфиги игры). Особенность этого хранилища: потребление Id - один id на 8(16) КB. Это так? Изменено 26 Апреля 2012 пользователем 7.9 всё легко Ссылка на комментарий
Artos 99 Опубликовано 26 Апреля 2012 Поделиться Опубликовано 26 Апреля 2012 (изменено) 7.9, да, именно так, с одним небольшим примечанием: Учитывая, что в игре при разумном спавне об'ектов всегда(!) имеется достаточное кол-во неиспользуемых игровых ID - подобным потреблением ID можно пренебречь. Для любителей хранить в хранилищах томики "Войны и мира" - существует возможность чистки при продолжении игры после создания сэйва (в кодах заремлен вызов таймера очистки). Т.е. по окончании процесса сохранения и при продолжении игры - элементы хранения удаляются. Собственно сами об'екты (элементы) хранения создаются в момент вызова при сохранении игры и их 'время существования' может быть равно 'от сохранения актора до сохранения последнего элемента хранения в сэйв'. После чего все элементы могут быть удалены из игры, освободив все занятые ID. Из практики: пока в ТЧ при всем функционале мода мне более чем достаточно одного элемента хранения (8000 байт). ;-) Добавлено через 27 мин.: P.S. И вообще даже не могу себе представить ситуацию, когда в игре может накопиться пользовательских данных, требующих сохранения, а не заранее заготовленных текстовых файлов-конфигов (иль подобного), что потребует более десятка элементов хранения. Все же игра не предполагает многочасовых писалок многотомных трактатов игроком ... Ну и ... это ж каков должен быть комп (с каким об'емом ОЗУ и как минимум с 64-битной ОС), чтобы ворочать в игре такими об'емами пользовательских данных?! Ведь 1 МБ > всего 125 элементов хранения (125 ID из 65535) ... Изменено 26 Апреля 2012 пользователем Artos 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
panzyuza 41 Опубликовано 26 Апреля 2012 Поделиться Опубликовано 26 Апреля 2012 Прошу подсказать по вопросу.В случае, если ГГ выбросил предмет, то запускаем таймер и по истечении времени удаляем.Правильно ли написана функция? function drop_detector(obj) local section = obj:section() local timer_drop = 0 local detid if timer_drop < time_global() then if section=="otklik" or section=="veles" or section=="medved" then --\ проверка на наш обьект detid = obj:id() --\ запоминаем ID выброшенного обьекта timer_drop = time + 6000 --\ взводим таймер на удаление else alife():release(detid,true) end end end AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 26 Апреля 2012 Поделиться Опубликовано 26 Апреля 2012 (изменено) panzyuza 1. Написана не правильно. Почитай мануалы по Lua на тему "область видимости". Задавая локальную переменную внутри вызываемой функции, ты теряешь ее значение по выходу из функции(!), если не смохранил еще куда-то "вне" ... Т.о. твои timer_drop и detid будут потеряны. 2. Вообще непонятно назначение твоей функции. При чем тут некий дроп? Вначале зачем-то взводишь таймер и запоминаешь ID (причем затирая прежнее), а через некое-то время (6 сек) по наличию об'екта из некоего списка - удаляешь нечто по его ID. Какофония! Разберись сам чего же ты хочешь, задавая вопрос говори именно о цели, а не о своих потугах ... которые и понять сложно и тем более указать на ошибки и дать подсказку. И вообще, чем обусловлена такая заморочка с таймером, и какой-то дроп с удалением спустя 6 сек, если всего лишь требуется удалить предмет? Изменено 26 Апреля 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
panzyuza 41 Опубликовано 26 Апреля 2012 Поделиться Опубликовано 26 Апреля 2012 Artos, просто при спользовании детекторов из ЧН выбрасываеться не болт, а данный детектор с визуалом болта.Вот и хотел что бы в случае нахождения ГГ рядом с аномалией псевдоболт выполнил свое дело и по истечении 6 секунд был удален из игры.Что бы не засорять игру кучей псевдоболтов-детекторов. AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 26 Апреля 2012 Поделиться Опубликовано 26 Апреля 2012 (изменено) panzyuza, ну и неужели не можешь найти готовых примеров? Десятки раз в разных форумах приводились примеры, да и моды - под рукою должгы быть! Или лень? ... Думаем головою: 1. Необходимо по некоему событию взвести таймер на нужное время. Пишем функцию: local iMyTimer = nil --/ тут будет задано время тикания таймера (тайм-аут) function Set_MyTimer(arg) if arg ~= nil then --/ некое условие по своему аргументу --/ ... какие-то свои действия iMyTimer = 6*1000 --/ ставим тайм-аут на 6 сек end end - вызов функции по некоему событию (например дропу) с передачей (при необходимости) нужного аргумента (arg). 2. Пишем функцию, которая будет 'тикать', отсчитывая тайм-аут: function On_MyTimer() if iMyTimer and iMyTimer < time_global() then --/ если тайм-аут закончился: --/ ... какие-то свои действия iMyTimer = nil --/ удаляем тайм-аут (чтобы не тикал понапрасну) end end -ну и чтобы тикал таймер (сам то он ничего делать не будет) - функцию On_MyTimer требуется постоянно "дергать", т.е. вызывать например из апдейта актора ... В дальнейше постарайся сам такие заготовки находить, т.к. повторять десятки раз - засорять топики. Изменено 26 Апреля 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
panzyuza 41 Опубликовано 26 Апреля 2012 Поделиться Опубликовано 26 Апреля 2012 Artos, по таймерам ладно, опустим.Как лучше запомнить id обьекта в момент дропа? AVS_LOCATION_MOD Ссылка на комментарий
Artos 99 Опубликовано 26 Апреля 2012 Поделиться Опубликовано 26 Апреля 2012 (изменено) panzyuza, просьба не задавать достаточно бессмысленных вопросов, которые и в мануалах расписаны и опять же в огромной массе примеров! "Лучше" - понятие относительное и зависит как от контекста (кодов/алгоритма), так и от пристрастий самого кодера. Выше приведено целых пять способов сохранения, и это помимо обычных сохранений в локальную или глаобальную переменную. (и не задавай адресный вопросов ... без нужды) Изменено 26 Апреля 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
AlexLUMEN 0 Опубликовано 27 Апреля 2012 Поделиться Опубликовано 27 Апреля 2012 (изменено) Помогите со скриптом. local ver = math.random(0,10) local money = math.random(100,1050) if obj:section() == "vodka" and ver>7 then local money_01={"500","600"} money01 = math.random(table.getn(money_01)) if money <=100 then db.actor:give_money(money01) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money01)).."руб", nil, nil, 6000) local money_02={"200","300"} money02 = math.random(table.getn(money_02)) elseif money > 100 and money<=200 then db.actor:give_money(money02) news_manager.send_tip(db.actor,"]Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money02)).."руб", nil, nil, 6000) local money_03={"100","150"} money03 = math.random(table.getn(money_03)) elseif money > 200 and money<=500 then db.actor:give_money(money03) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money03)).."руб", nil, nil, 6000) local money_04={"50","75"} money04 = math.random(table.getn(money_04)) elseif money > 500 and money<=1000 then db.actor:give_money(money04) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money04)).."руб", nil, nil, 6000) elseif money > 1000 and money<=1050 then db.actor:give_money(1000) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки %c[green](Супер выигрышь)%c [default] 1000 руб", nil,"trader", 6000) end end end Передаёт нулевую переменную, почему он не берёт её из таблицы. Или подскажите какой нибуть другой способ. Изменено 27 Апреля 2012 пользователем ColR_iT Ссылка на комментарий
Artos 99 Опубликовано 27 Апреля 2012 Поделиться Опубликовано 27 Апреля 2012 (изменено) AlexLUMEN, тебе только изучение основ Lua может помочь ... Назвать скриптом твое "творение" - как то даже язык не поворачивается. Ошибка на ошибке и ошибкой погоняет. - первая (основная) строка где собственно и об'яляется функция отсутствует напрочь; - про область видимости локальных переменных ты видно и не слыхал ...; - задавать таблицы со строковыми значениями и пытаться взять из них рандомные числа - это ж в каком бреду придумано? - ну и собственно чего же ты конкретно хотешь иметь, чтобы "какой нибуть другой способ" тебе подсказали - ты так же не удосужился раз'яснить ... В общем, посмотри вот это: function give_money(obj) --/ название свое поставь! if obj and obj:section() == "vodka" and math.random() > 0.7 then local money = math.random(100,1050) if money > 1000 then db.actor:give_money(1000) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки %c[green](Супер выигрышь)%c [default] 1000 руб", nil,"trader", 6000) else local prob = math.random() local money0 = (prob > 0.5 and 50) or 75 --/ if money > 500 if money <= 100 then money0 = (prob > 0.5 and 500) or 600 elseif money > 100 and money <= 200 then money0 = (prob > 0.5 and 200) or 300 elseif money > 200 and money <= 500 then money0 = (prob > 0.5 and 100) or 150 end db.actor:give_money(money0) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money0)).."руб", nil, nil, 6000) end end - это тебе как аванс (хотя не уверен что понял задумку твоего творения), но более с подоьными вопросами лучше не показывайся, т.к. прямиком к мануалам Lua будешь отправляться. Если уж взялся писАть - выучи азбуку(!), чтобы и ты понимал написанное, другие и собственно игра ... Изменено 27 Апреля 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
AlexLUMEN 0 Опубликовано 27 Апреля 2012 Поделиться Опубликовано 27 Апреля 2012 (изменено) Artos Благодарю, но я уже решил свою проблемму. local money_ram = math.random(100,1050) local ver = math.random(0,10) if obj then if obj:section() == "vodka" and ver>2 then if money_ram <=100 then money=math.random(5,6)*100 db.actor:give_money(money) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money)).."руб", nil, nil, 6000) elseif money_ram > 100 and money_ram<=200 then money=math.random(2,3)*100 db.actor:give_money(money) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money)).."руб", nil, nil, 6000) elseif money_ram > 200 and money_ram<=500 then money=math.random(1,1.5)*100 db.actor:give_money(money) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money)).."руб", nil, nil, 6000) elseif money_ram > 500 and money_ram<=1000 then money=math.random(5,7.5)*10 db.actor:give_money(money) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money)).."руб", nil, nil, 6000) elseif money_ram > 1000 and money_ram<=1050 then money=1000 db.actor:give_money(money) news_manager.send_tip(db.actor,"Получено из под пробки акцийной бутылки"..game.translate_string(tostring(money)).."руб", nil, nil, 6000) end end end end Сообщение от модератора ColR_iT Используй, пожалуйста, соответствующий тег для отделения кода от текста. Иначе в следующий раз - удалю пост. Изменено 27 Апреля 2012 пользователем ColR_iT Ссылка на комментарий
Хек 20 Опубликовано 27 Апреля 2012 Поделиться Опубликовано 27 Апреля 2012 (изменено) В общем, вот что: snd_spasibo_replics={ stalker = { [[stalker\spasibo_1]], [[stalker\spasibo_2]], [[stalker\spasibo_3]], [[stalker\spasibo_4]] }, military = { [[military\spasibo_1]], [[military\spasibo_2]], [[military\spasibo_3]] }, bandit = { [[bandit\spasibo_1]], [[bandit\spasibo_2]], [[bandit\spasibo_3]] }, ecolog = { [[ecolog\spasibo_1]], [[ecolog\spasibo_2]], [[ecolog\spasibo_3]], [[ecolog\spasibo_4]] }, killer = { [[killer\spasibo_1]], [[killer\spasibo_2]], [[killer\spasibo_3]] }, dolg = { [[dolg\spasibo_1]], [[dolg\spasibo_2]], [[dolg\spasibo_3]], [[dolg\spasibo_4]] }, freedom = { [[freedom\spasibo_1]], [[freedom\spasibo_2]], [[freedom\spasibo_3]], [[freedom\spasibo_4]] } } -- -- -- -- -- Помощь раненому со спасибками. function help_wounded(npc) if npc:name()=="esc_vagon_wounded" or npc:name()=="val_escort_bandit_halfdead" then return end local snd_sect = snd_spasibo_replics[npc:character_community()] or snd_spasibo_replics.stalker local snd = [[vs_spasibo\]]..snd_sect[math.random(table.getn(snd_sect))] snd = xr_sound.get_safe_sound_object(snd) snd:play_no_feedback(npc, sound_object.s3d, 0, npc:position(), 1.0) npc:set_character_community("stalker", 0, 0) npc:set_relation(game_object.friend, db.actor) endsnd_spasibo_replics={ stalker = { [[stalker\spasibo_1]], [[stalker\spasibo_2]], [[stalker\spasibo_3]], [[stalker\spasibo_4]] }, military = { [[military\spasibo_1]], [[military\spasibo_2]], [[military\spasibo_3]] }, bandit = { [[bandit\spasibo_1]], [[bandit\spasibo_2]], [[bandit\spasibo_3]] }, ecolog = { [[ecolog\spasibo_1]], [[ecolog\spasibo_2]], [[ecolog\spasibo_3]], [[ecolog\spasibo_4]] }, killer = { [[killer\spasibo_1]], [[killer\spasibo_2]], [[killer\spasibo_3]] }, dolg = { [[dolg\spasibo_1]], [[dolg\spasibo_2]], [[dolg\spasibo_3]], [[dolg\spasibo_4]] }, freedom = { [[freedom\spasibo_1]], [[freedom\spasibo_2]], [[freedom\spasibo_3]], [[freedom\spasibo_4]] } } -- -- -- -- -- Помощь раненому со спасибками. function help_wounded(npc) if npc:name()=="esc_vagon_wounded" or npc:name()=="val_escort_bandit_halfdead" then return end local snd_sect = snd_spasibo_replics[npc:character_community()] or snd_spasibo_replics.stalker local snd = [[vs_spasibo\]]..snd_sect[math.random(table.getn(snd_sect))] snd = xr_sound.get_safe_sound_object(snd) snd:play_no_feedback(npc, sound_object.s3d, 0, npc:position(), 1.0) npc:set_character_community("stalker", 0, 0) npc:set_relation(game_object.friend, db.actor) end Вот. Вылечиваю врага (вояки, наёмники), на секунду становятся другом, и сразу энеми.( без этой строки: npc:set_character_community("stalker", 0, 0) конечно) Возможно ли зделать так, что враг останется в своей группировке (bandit например), но будет со мной в "друзьях"? А то бандитским голосом говорит спасибо, поднимается на ноги, и уже со сталкерским голосом, идёт шмонать трупы Сообщение от модератора ColR_iT Тоже самое - используй теги для кода. Изменено 27 Апреля 2012 пользователем ColR_iT Мы типа сталкеры, мы крутые Ссылка на комментарий
Artos 99 Опубликовано 27 Апреля 2012 Поделиться Опубликовано 27 Апреля 2012 ColR_iT, стОит (ИМХО) очищать топик от подобных кодов как у AlexLUMEN, дабы не давать примеров как НЕ нужно делать. Подправив часть ошибок: - так и не удосужился привести первую строку об'явления функции ... - про неоптимальность можно не дискутировать; - недопонимание работы функций в методах math.random(1,1.5)*100 с последующим game.translate_string(tostring(money)) ... Добавлено через 6 мин.: Хек, отношение конкретного НПС к ГГ или иным полностью зависит от общего отношения его группировки. Различаться может на одну ступень: враг -> нейтрал или нейтрал -> друг. Но, если группровка к ГГ отностится враждебно - другом НПС можно сделать на мгновения ... Так что или группировку делай как минимум нейтральной или ... вообще делай отдельную, у которой голосовые файлы аналогичны исходной группировке (хотя, думаю, такие заморочки врядли тобою будут реализованы). "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 27 Апреля 2012 Поделиться Опубликовано 27 Апреля 2012 (изменено) Хех Если проблема и впрям в отношении всей группировки к ГГ, как сказал Artos, то может поможет установка "симпатии" сталкера к своей группировке в ноль. -- Помощь раненому со спасибками. function help_wounded(npc) -- npc:set_character_community("stalker", 0, 0) npc:set_sympathy(0) npc:set_relation(game_object.friend, db.actor) end Функция точно есть в ЧН, думаю и в ТЧ\ЗП тоже будет. Может быть поможет. В ТЧ этой функции нет. ColR_iT Изменено 27 Апреля 2012 пользователем ColR_iT Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Хек 20 Опубликовано 27 Апреля 2012 Поделиться Опубликовано 27 Апреля 2012 Artos, ну я так считаю, за одного вылеченного бандюка, респект Меченому в лице всей "братвы" - это не разумно\правдаподобно =) А создавать отдельную группировку, я недопонял.. (ведь у каждой группировки, голосовые файлы свои) Просто у меня были моменты в игре, когда бандиты враги, а неподалёку ходит бандит нейтрал, или друг ( со сталкерами было, точно так же ) *Shoker*, хех я не Хех Мы типа сталкеры, мы крутые Ссылка на комментарий
Artos 99 Опубликовано 28 Апреля 2012 Поделиться Опубликовано 28 Апреля 2012 Хек, ну так это *Shoker* предлагает то, о чем речи нет и что не разумно . Но и простенького решения тоже нет. То, что у тебя в игре быва-а-а-ли моменты, никто и не говорит, что так не бывает. И репутация у ГГ плавает и отношения с группировками ... Гадать отчего и как и что нужно и достаточно в той иль иной ситуации - также неразумно. Если захотелось, чтобы и группировка сохранялась и отношение дружественное - насилуй биндер. Ничего, кроме некоторого растранжиривания ресурсов, не мешает дать обекту какой-нить флаг типа oNPC.is_my_friend и мониторить в биндере, восстанавливая каждый раз упавшие отношения ... Ну и сохранять/восстанавливать (если захочется) этот флажек в сэйвах. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 28 Апреля 2012 Поделиться Опубликовано 28 Апреля 2012 (изменено) Вообще, я вопрос про отношения некотоое время назад поднимал. Установление отошений непись-непись скорее не работает совсем, чем работает хоть как-нибудь. По крайней мере кодом мне не удавалось поймать момент, когда враги оказывались не врагами. И если даже меняется, то "отработать" где-либо (скажем, при вычислении опасности или наличия/отсутствия врагов) - не успевает. Можно задать goodwill неписю, или группировке. Причем, к актору - работает в любое время, а вот с прочими неписями опять таки проблемы ( вообще - логично, поскольку хранить неграниченного размера список неписей - это ой). Artos, вообще, в нескольких местах имеет место быть код, подозрительный на переполнение репутации. Все собираюсь посмотреть, но все не до этого. Upd: да, это вопрос. В смысле, ни у кого аналогичного ощущения не возникало ? Хек, правку по известному сюжету ТД для известного мода выложу на днях - как только разберусь с кривым отображением видимости актора для врагов. Там будут нейтральные после лечения отдельные враги, и отдельно изменение отношений группировок за "заслуги". А группировка неписям меняется только неименным, или на короткое время, чтобы избежать разборок между вылеченным и участниками сцены из враждебной ему группировки. То есть, работает так: отношение непися к актору дается таким, чтобы в сумме с отношением группировки получилось чуть больше 0, непись загоняется в группировку, нейтральную всем (чтобы не убили эти самые все, и чтобы непись успел уйти под нужный смарт, а не срывался в бой), потом по таймеру возвращается обратно. Отношение группировок меняется независимо (вычисляем разницу между текущим и нужным, сохраняем, прибавляем. Потом при надобности, вычитаем). В общем, все красиво, за исключением, что индикатор видимости актора врагами после такого лечения застревает в максимуме, до следующей перезагрузки. Ну, как при исчезновении собакофантомов. Изменено 29 Апреля 2012 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти