![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Dir |
![]()
Сообщение
#1
|
Собиратель якорей. ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: модераторы Сообщений: 5,879 Регистрация: 22-March 05 Пользователь №: 590 ![]() |
Имеющим проблемы с установкой аддона(от глючности версии ПКМ,кривости установки и прочих вещей) рекомендую решить свои проблемы загрузкой и установкой
Комментарии исключительно в л/с. ===================================================================== Тем у кого не получается скачать дистрибутив аддона с сайта. Аддон Возвращение Морской Легенды версия 1.06.0124 + Дополнительные ресурсы: |
![]() ![]() |
ALexusB |
![]()
Сообщение
#581
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Исходники ставить по инструкции
Далее редактить код без ограничений Папка программ целиком, частями нет. В исходниках версия новее, там какие-то моды, но совместимость может быть (а может и не быть - с гарантий новая игра нужна). |
BUKA_E}l{EBUKA |
![]()
Сообщение
#582
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
Да, я как раз по этой ссылке брала!
Новая игра нужна, вы правы. Закончу тесты и переставлю все с нуля. Эти исходники вообще предназначены для игры? Может они для энтузиастов и модостроителей, а я тут их накатила, правлю и играть на них планирую ![]() По поводу 3., вещей на трупах: Есть мыслишки, но я так и не разобралась полностью. Вот кусок кода из LAi_events.c (строки 370-381): Код void LAi_Character_Dead_Process(aref chr) { DialogExit(); LAi_CharacterLogoff(chr); if(sti(chr.index) != GetMainCharacterIndex()) { //Подождём, а затем удалим персонажа // boal трупы не убирать if (MOD_DEAD_CLEAR == "On" && !CheckAttribute(chr, "DontClearDead")) { PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 1000, "i", chr); } Если выставить 30 вместо 1000, трупы исчезают сразу. Но как оставить только те что со шмотом? Вижу два варианта: проверка на "у трупа нет вещей" или на "у трупа есть вещи". //*не уверена как обыск реализован, возможно надо проверять не "наличие вещей в принципе" а "наличие вещей, которые видно в инвентаре при обыске"*// Как считаете, это сработает? Выглядеть будет так: Код if (MOD_DEAD_CLEAR == "On" && !CheckAttribute(chr, "DontClearDead")) if инвентарь пустой { PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 30, "i", chr); }else{ PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 1000, "i", chr); } //Реинкарнируем либо Код if (MOD_DEAD_CLEAR == "On" && !CheckAttribute(chr, "DontClearDead")) if есть вещи { PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 1000, "i", chr); }else{ PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 30, "i", chr); } //Реинкарнируем Однако, я так и не разобралась в механизме раздачи вещей и не нашла примеров где подобная проверка реализована. Есть идеи? P.S. В процессе чтения ченджлогов обнаружилось, что в детстве у меня были Корсары с Флэшбек: Смотрела как у папы (который был тем еще казуалом, хе-хе) офицеры бегут суицидиться о толпу бандитов ![]() ![]() ![]() Возможно, именно благодаря вам я сейчас вернулась в Корсары, а не какие-нибудь Герои 3. Спасибо! |
ALexusB |
![]()
Сообщение
#583
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Спасибо! и Пожалуйста!
Скрипты играбельные. Код нужно делать if (!CheckAttribute(chr, "DontClearDead")) { PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 1000, "i", chr); } Цель же не убирать трупы с вещами? Или убирать их уже после обыска, а не просто дать им время полежать и растаять чуть дольше. Нужно найти место,где в трупы вещи пихаются и дать им флаг DontClearDead Потом в интерфейсе обыска трупа на выходе удалить атрибут DontClearDead и вызвать PostEvent("LAi_event_Character_Dead", 1000, "i", chr); Тогда он начнет таять через секунду прям на глазах. За обыск отвечает процедура Dead_OpenBoxProcedure, она вызывает INTERFACE_ITEMSBOX там по тегу "666" определяется, что это был труп Но вызвать для простоты стиралку можно сразу в Dead_LaunchCharacterItemChange Просто время дать не 1с, а 10сек, пока идет обыск уже начнет таять Заполнение вещами идет в Dead_AddLoginedCharacter там цикл for (j= ItemDeadStartCount; j<ITEMS_QUANTITY; j++) вот после него нужно ставить chref.DontClearDead = true; Описание скриптов Нужно освоить поиск текста по папке Программ. Я использовал ТоталКомандер, Alt-F7 И плугин текстового редактора. Можно Нотпад++ Вообще все это находится по русс слову труп, далее уже кусками кода под комментариями. |
BUKA_E}l{EBUKA |
![]()
Сообщение
#584
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
Не справилась еще на первой стадии
![]() Засунула после блока с циклом. Трупы продолжают исчезать Код for (j= ItemDeadStartCount; j<ITEMS_QUANTITY; j++) // нужно оптимизировать!!! 137 - это много начало с опред места { if (howI >= (11 - MOD_SKILL_ENEMY_RATE)) { break; } makeref(itm,Items[j]); if (CheckAttribute(itm, name)) { makearef(typeRef, itm.(name)); //attrName = name+".rare"; if (!CheckAttribute(typeRef, "rare") && MOD_BETTATESTMODE == "On") Log_Info("Error: Не найдет RARE для предмета = "+itm.id + " тип = " + name); if ( rand(1000) < (((stf(typeRef.rare) + stf(typeRef.rare)*nLuck / 20.0) / makefloat(MOD_SKILL_ENEMY_RATE))*930.0)) { value = sti(typeRef.min); value = value+rand(sti(typeRef.max) - value); itemID = itm.id; chref.items.(itemID) = value; howI++; } } } chref.DontClearDead = true; //+++++НОВЫЙ КОД ЗДЕСЬ+++++ } // заполнили по списку } Dead_Characters[Dead_Char_num].px = x; Dead_Characters[Dead_Char_num].pz = z; Dead_Char_num++; } } Но если изменить chref на chr то все работает, я правда не знаю что такое "chr". UPD: Уточню, что тестила в т.ч. и на новой игре. Не сработало. А вот chr работал и на сейве. >>Потом в интерфейсе обыска трупа на выходе удалить атрибут DontClearDead и вызвать Так? Код void Dead_OpenBoxProcedure() { ref chr = GetMainCharacter(); int dchr_index; ref deadCh; dchr_index = Dead_FindCloseBody(); if (dchr_index == -1) return; deadCh = &Dead_Characters[dchr_index]; Dead_LaunchCharacterItemChange(deadCh); //+++++НОВЫЙ КОД ЗДЕСЬ+++++ DeleteAttribute(deadCh, "DontClearDead"); PostEvent("LAi_event_Character_Dead", 1000, "i", chr); //+++++НОВЫЙ КОД ЗДЕСЬ+++++ } P.S. Я пыталась разобраться, но постоянно спотыкаюсь о непонимание самих основ. Без знания Плюсов (или схожих полноценных языков) это как пытаться оперировать формулами квантовой теории поля, имея в багаже знаний лишь учебник физики за 6й класс. На эти трупы уже суммарно потратила около 30 часов. Так и некрофилкой стать недолго ![]() P.S.S. Поиском по папке пользуюсь конечно, даже RegEx щущуть применяю. Освоить N++ и TC пришлось давным давно, стандартные средства винды слишком убоги. Гуглом тоже, в основном в виде "запрос site:seaward.ru OR site:piratesahoy.net OR site:corsairs-harbour.ru" А страницы википедии и прочие мануалы про С и С++ скоро на сетчатке отпечатаются. |
ALexusB |
![]()
Сообщение
#585
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Если эксперимент с
chr.DontClearDead = true; //+++++НОВЫЙ КОД ЗДЕСЬ+++++ и chref.DontClearDead = true; //+++++НОВЫЙ КОД ЗДЕСЬ+++++ позитивный, то и с //+++++НОВЫЙ КОД ЗДЕСЬ+++++ DeleteAttribute(deadCh, "DontClearDead"); PostEvent("LAi_event_Character_Dead", 1000, "i", chr); //+++++НОВЫЙ КОД ЗДЕСЬ+++++ chr и deadCh нужно Но одинаково в двух строках Это сами НПС, но там один фэйковый, в котором вещи, а другой моделька, который валяется. Как правильно надо опытно подобрать. Ну и в исходном убивании if (!CheckAttribute(chr, "DontClearDead")) { PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 1000, "i", chr); } А не код, после проб, когда они сразу пропадали. |
BUKA_E}l{EBUKA |
![]()
Сообщение
#586
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
Проблема в том, что в этой конкретной функции:
Код void Dead_OpenBoxProcedure() { ref chr = GetMainCharacter(); int dchr_index; ref deadCh; dchr_index = Dead_FindCloseBody(); if (dchr_index == -1) return; deadCh = &Dead_Characters[dchr_index]; Dead_LaunchCharacterItemChange(deadCh); } chr это ГГ: "ref chr = GetMainCharacter();" И "PostEvent("LAi_event_Character_Dead", 1000, "i", chr);" удаляет ГГ. А "PostEvent("LAi_event_Character_Dead", 1000, "i", deadCh);" не имеет эффекта вообще UPD: ах да, зачем нам Код DeleteAttribute(deadCh, "DontClearDead"); PostEvent("LAi_event_Character_Dead", 1000, "i", chr); Если ивент "LAi_event_Character_Dead" все равно не проверяет наличие "DontClearDead" аттрибута? Мы же напрямую соообщаем что нам надо убрать этого товарища. Минуя "LAi_Character_Dead_Process" |
ALexusB |
![]()
Сообщение
#587
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Тогда надо получить нужного НПС
Там где chref.DontClearDead = true; //+++++НОВЫЙ КОД ЗДЕСЬ+++++ Нужно chr.DontClearDead = true; //это реальная модель chref.ToClearDeadIdx = chr.index; Далее уже в обыске deadCh = &Dead_Characters[dchr_index]; if (!CheckAttribute(deadCh , "ToClearDeadIdx")) { chr = &Characters[sti(deadCh.ToClearDeadIdx)]; PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 1000, "i", chr); } Dead_LaunchCharacterItemChange(deadCh); Возможно нужно не Characters[] брать, а другой массив, т.к. в бою могут быть фантомные НПС, но я уже не помню, они в этом же массиве были (с другого номера) или в каком-то своем |
BUKA_E}l{EBUKA |
![]()
Сообщение
#588
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
Не робит
![]() Давайте бросим это дело. Я уже и так потратила много вашего времени, и в 50 раз больше - своего. Оно того не стоит. Честно говоря, я ожидала что все будет гораздо проще, вроде проверки на наличие вещей у трупов. А тут актор при смерти разделяется на коробку и фантомное тело. Массивы, индексы, ссылки. Чтоб понять че происходит надо изучить хотя бы базовый курс плюсов. UPD (2 hours later): Еще немного поковырялась и половину задачи таки сделала! Возвращаемся к ванильному состоянию кода. Добавляем одну единственную строку: Код { ref chr = GetMainCharacter(); int dchr_index; ref deadCh; dchr_index = Dead_FindCloseBody(); if (dchr_index == -1) return; deadCh = &Dead_Characters[dchr_index]; Dead_LaunchCharacterItemChange(deadCh); Dead_DelLoginedCharacter(deadCh); //вот эту } Теперь после выхода из инвентаря трупа возможность повторного обыска исчезает. Значит, deadCh - это коробка. Как найти и убрать соответствующий ей труп, я не представляю. Ну и по идее функция едет танком по все обысканным трупам, даже не предназначенным к удалению, что не очень приятно. |
BUKA_E}l{EBUKA |
![]()
Сообщение
#589
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
Чем отличается ref от aref?
Нет, пояснения "ref - ссылка на объект, aref - ссылка на атрибут объекта (или ссылки на объект)" я видела. Но все же Например DumpAttributes(ref(object)). То есть, дампает атрибуты ссылки на объект. И тем не менее, второе же упоминание (при поиске по папке) использования DumpAttributes (boal_debug2.c , строка 285), выглядит как: DumpAttributes(rootItems); хотя rootItems это aref Или вышеупомянутая Dead_DelLoginedCharacter у меня в коде. У самой функции "void Dead_DelLoginedCharacter" (LAi_utils.c , страница 856) параметры "(aref chr)". Но она вполне себе имеет эффект при скармливании ей deadCh, который ref |
ALexusB |
![]()
Сообщение
#590
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Не помню
![]() Но из описания - ref - только для большого (элемент массива целиком). aref - для всего остального - для ветки внутри дерева структуры персонажа. Может быть как корнем, так и куском поддерева. |
BUKA_E}l{EBUKA |
![]()
Сообщение
#591
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
Многие функции имеют вид "SomeFunction(aref chr)". То есть, они ждут ссылку на атрибут этого "chr".
Но почти всегда они вызываются в виде "SomeFunction(chr)". И я до сих пор не могу в этом разобраться. chr является ссылкой на атрибут самого себя? Что есть chr? Откуда он берется? В большинстве случаев он не декларирован там, где вызывается "SomeFunction(chr)". Фигня какая-то. Будто я попала в рекурсию где я попала в рекурсию. Так и становятся алкоголиками |
ALexusB |
![]()
Сообщение
#592
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
SomeFunction(chr) нужно смотреть вызов, там выше есть получение чара из массива чаров, или метод поиска, либо это какое-то прерывание ядра и там переменная возвращается обратно.
В своих методах правильно делать по аналогии, смотреть примеры и копипастить себе. Разница в Нужно понять, что такое вообще структура чара - это дерево, там в ветках на ГГ все квесты живут, сложные структуры, в которых и таблицы хранятся (те же цены). Вот эти ветки - это атрибуты. |
BUKA_E}l{EBUKA |
![]()
Сообщение
#593
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
Буду бороздить синие просторы, постоянно ощущая в своих зарослях посторонние предметы, сомнительных личностей и всякую живность. Не об этом я мечтала, становясь пиратом. Зато реалистично
Про прерывание ядра поподробнее, записываю! Что за штука, как выглядит? |
ALexusB |
![]()
Сообщение
#594
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 1000, "i", chr);
Это прерывание из скриптов в ядро. А есть получатели обратные, когда их ядро порождает само. Типа SetEventHandler("Control Activation","proc_break_video",0); Это слушатель, а сработает оно, когда реально произойдет. За счет этого реализуется многопоточность, т.к. в игре крутится вечный цикл событий, и они срабатывают по запросу. Например, моделька корабля вошла в коллизию с берегом - будет урон. Понять (и думать) этим - это цела философия. В игре в скриптах это сделано "как везде". Например, в Юнити это тоже так, но там задаются прерывания через интерфейс (свойства). |
BUKA_E}l{EBUKA |
![]()
Сообщение
#595
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
PostEvent("LAi_event_Character_Dead", MOD_DEAD_CLEAR_TIME * 1000, "i", chr);
передает параметр "chr" ивенту LAi_Character_Dead_Event() Который, в свою очередь, получает значение параметра "chr" с помощью "aref chr = GetEventData();" А как я могу увидеть это значение? Наверняка есть команда которая позволить записать его в какой-нибудь лог. Что-нибудь вроде: Код void LAi_Character_Dead_Event() { aref chr = GetEventData(); Log_Info("chr = " +chr+); //только это не работает |
ALexusB |
![]()
Сообщение
#596
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Структуру в лог не вывести, это не строка - это ближе к XML структуре или дереву.
Смотреть можно по конкретным атрибутам, так квесты и тестятся с выводом в лог или функции F11 дебуга Я где-то там что-то такое выводил в текстовое окно см файл boal_debug2.c и там string descF2 = "Показать инфу о параметре"; вот там дерево и выводится Но pchar структура она глубже 3х уровней, там по 10 слоев в квестах может быть. |
BUKA_E}l{EBUKA |
![]()
Сообщение
#597
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
Каким макаром можно сохранить значение "chr" чтобы передать его позже?
Пока происходит так: ...[chr появился где-то в движке]... || ...[передается дальше по цепочке]... || void LAi_CheckKillCharacter(aref chr) Dead_AddLoginedCharacter(chr) // это тело, которое мы видим LAi_Character_Dead_Process(chr) // это коробка, которую мы сможем шмонать || --------------------------- \\ void Dead_AddLoginedCharacter(aref chr) void LAi_Character_Dead_Process(aref chr) Dead_Char_num //этот номер идет дальше тут запускается LAi_event_Character_Dead, на этом цепочка прерывается, который с помощью "#event_handler" "chr" дальше не передается запускает. . . || ----------------------------- || int Dead_FindCloseBody() void LAi_Character_Dead_Event() Dead_Char_num преобразуется в dchr_index, Dead_DelLoginedCharacter(chr) - стираем коробку который передастся в Dead_OpenBoxProcedure CharacterExitFromLocation(chr) - стираем тело || ----------------------------- || void Dead_OpenBoxProcedure() void Dead_DelLoginedCharacter(aref chr) открываем коробку "chr" дальше не передается || void Dead_LaunchCharacterItemChange(ref chref) интерфейс коробки То есть, на момент взаимодействия с коробкой мы не можем воспользоваться "chr" для стирания тела - он пал смертью храбрых задолго до этого. Единственный способ, которым я придумала получить тот самый "chr": захватить через "PostEvent" получить через "aref chr = GetEventData()" |
ALexusB |
![]()
Сообщение
#598
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
chr - это переменная, ссылка на массив.
Запомнить можно индекс этого массива и получить обратно уже цельное значение Это написано в Но я допускаю, что оно уже не сработает, т.к. этот чар с моделькой связан не будет и событие удалить труп на нем не заработает. Я не помню какой массив за НПС в локации отвечает, там какие-то фантомы были - может в нем нужно смотреть. |
BUKA_E}l{EBUKA |
![]()
Сообщение
#599
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 ![]() |
Цитата chr - это переменная, ссылка на массив. Нельзя ли получить из этой переменной другие данные? Название массива, номер объекта на который ссылается переменная? Может, я запуталась в терминологии, но любой массив (array) в PotC это ведь object? В С++ массивы имеют вид things[n], здесь в виде "object things[n]" |
ALexusB |
![]()
Сообщение
#600
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,554 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
массив может и инт быть и стринг. Объект - это структура такая прикольная, древовидная, см методы и файлы иниты всего.
|
![]() ![]() |
Текстовая версия | Сейчас: 29th April 2025 - 15:10 |