|
Урок № 3. Пишем диалоги персонажам
| |
korsary4 | Дата: Вторник, 11.07.2017, 13:41 | Сообщение # 281 |
Адмирал
Группа: Администратор
Сообщений: 5204
Награды: 496
Репутация: 1935
Статус: В открытом море
| Цитата Alister18 ( ) Не подскажешь за что отвечает эта строчка? Задание текущей ветки диалога нпс.
Цитата Nathaniel ( ) Хм... Я обычно пишу эти строки после "exit", уже перед закрытием кейса. Да разницы никакой, там же не к текущему нпс обращаемся. А если и к текущему то что ниже exit, все равно обработается сразу же, и надо вот как выше сообщение, через новый кейс с завершением диалога DialogExit();.
Цитата Alister18 ( ) но разговаривать с ним по-прежнему нельзя! Вероятно, тип нпс с "актера" не сменили.
Alister18, приводите свой код, в котором непосредственно проблема. Пример с пиратской линейки рабочий же, раз он из игры)
Единственное, что можно сказать об удаче с уверенностью — она изменит. --------
|
|
| |
Alister18 | Дата: Вторник, 11.07.2017, 17:13 | Сообщение # 282 |
Матрос
Группа: Корсар
Сообщений: 24
Награды: 0
Репутация: 0
Статус: В открытом море
| korsary4, подскажите как 'посадить' полноценного (с оружием, предметами и т.д) нпц на какую либо локацию через диалог? Пробую : то диалог не открывается, то не появляется. посадить хочу на пляж Капстер (Гваделупа). shore29 goto_goto2
Пусть час не пробил, жди, не уставая, Пусть лгут лжецы, не снисходи до них; Умей прощать и не кажись, прощая, Великодушней и мудрей других.
Киплинг
|
|
| |
korsary4 | Дата: Вторник, 11.07.2017, 17:39 | Сообщение # 283 |
Адмирал
Группа: Администратор
Сообщений: 5204
Награды: 496
Репутация: 1935
Статус: В открытом море
| Цитата Alister18 ( ) как 'посадить'
Код sld = CharacterFromID("QuestFortFrance_BB4"); ChangeCharacterAddressGroup(sld,"shore29", "goto", "goto2");
А оружие это уже смотря как нпс у вас задан. Если в Program\characters\init прописан, то там, например вот так:
Код GiveItem2Character(ch, BLADE_SABER); ch.equip.blade = BLADE_SABER;
Единственное, что можно сказать об удаче с уверенностью — она изменит. --------
|
|
| |
Alister18 | Дата: Вторник, 11.07.2017, 17:42 | Сообщение # 284 |
Матрос
Группа: Корсар
Сообщений: 24
Награды: 0
Репутация: 0
Статус: В открытом море
| korsary4, а без прописки в Program\characters\init нельзя оружие дать нпц? Можно ли прописать персонажа через init, но чтобы появился только после диалога какого-либо?
Пусть час не пробил, жди, не уставая, Пусть лгут лжецы, не снисходи до них; Умей прощать и не кажись, прощая, Великодушней и мудрей других.
Киплинг
Сообщение отредактировал Alister18 - Вторник, 11.07.2017, 17:54 |
|
| |
Nathaniel | Дата: Вторник, 11.07.2017, 18:21 | Сообщение # 285 |
Контр-адмирал
Группа: Капитан
Сообщений: 8036
Награды: 347
Репутация: 1845
Статус: В открытом море
| Цитата Alister18 ( ) а без прописки в Program\characters\init нельзя оружие дать нпц? Стандартной функцией GiveItem2Character(ref character, string itemID).
В качестве character можно указывать ГГ (pchar) или любого персонажа, ссылаясь на него:
Например:
Код GiveItem2Character(pchar, "potion15");
Код ref sld = CharacterFromID("Jessica"); TakeItemFromCharacter(sld, "pistol7"); Можно выдать или забрать абсолютно любой предмет, записанный в InitItems, любому персонажу, у которого есть свой ID. И неважно, где он прописан.
Alister18, я бы посоветовал обратить внимание на небольшой архивчик, который находится у многих в папке со скриптами и называется _doc_script. Если такого архива у Вас нет - очень рекомендую найти. Там собрано много полезных функций с подробными описаниями.
Цитата Alister18 ( ) Можно ли прописать персонажа через init, но чтобы появился только после диалога какого-либо? Можно. Я, например, вписываю всех новых персонажей игры в LSC_Q2Utilite, а в нужный момент просто выгружаю NPC по заданному адресу.
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
Сообщение отредактировал Nathaniel - Вторник, 11.07.2017, 18:29 |
|
| |
Alister18 | Дата: Вторник, 11.07.2017, 18:29 | Сообщение # 286 |
Матрос
Группа: Корсар
Сообщений: 24
Награды: 0
Репутация: 0
Статус: В открытом море
| Цитата Nathaniel ( ) я бы настоятельно порекомендовал Вам для начала хоть немного изучить базовые функции. Большинство из них перечислено в небольшом архивчике, который находится у многих в папке со скриптами и называется _doc_script.
Если же такого архива у Вас нет - очень рекомендую найти...
Было бы очень интересно изучить. Но у меня такого архива нет. Можете ссылочкой поделиться на архив этот, буду очень благодарен)
Пусть час не пробил, жди, не уставая, Пусть лгут лжецы, не снисходи до них; Умей прощать и не кажись, прощая, Великодушней и мудрей других.
Киплинг
|
|
| |
Nathaniel | Дата: Вторник, 11.07.2017, 18:30 | Сообщение # 287 |
Контр-адмирал
Группа: Капитан
Сообщений: 8036
Награды: 347
Репутация: 1845
Статус: В открытом море
| Цитата Alister18 ( ) Можете ссылочкой поделиться на архив этот, буду очень благодарен... Поделюсь, когда сяду за свой домашний ПК. Сейчас под рукой архива и ссылок на него нет.
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
|
|
| |
Alister18 | Дата: Вторник, 11.07.2017, 19:00 | Сообщение # 288 |
Матрос
Группа: Корсар
Сообщений: 24
Награды: 0
Репутация: 0
Статус: В открытом море
| Цитата Nathaniel ( ) Можно. Я, например, вписываю всех новых персонажей игры в LSC_Q2Utilite, а в нужный момент просто выгружаю NPC по заданному адресу. а где этот файл находится, не подскажите?Добавлено (11.07.2017, 19:00) ---------------------------------------------
Цитата korsary4 ( ) Вероятно, тип нпс с "актера" не сменили.
Alister18, приводите свой код
Код case "goFrancisk": dialog.text = "Давай пройдем к дом моего друга, там спокойно поговорим. Не против?"; link.l1 = "Нет, не против. Пошли."; link.l1.go = "goFrancisk1"; break; case "goFrancisk1": DialogExit(); NextDiag.CurrentNode = "dialog2"; chrDisableReloadToLocation = false; bDisableFastReload = true; FreeSitLocator("PortRoyal_PortOffice", "goto2"); LAi_SetActorType(ref character); LAi_ActorRunToLocation(ref character, "reload", "reload10_back", "PortRoyal_PortOffice", "goto", "goto2", "PortRoyal_PortOffice", -1); break;
case "dialog2": dialog.text = "Понимаешь, тут такое дело\nЯ весь в работе. Кручусь как только могу, из острова на остров, туда-суда, понимаешь, не помню когда последний раз в таверне был. Времени нет катастрофически! И знаешь, самое печальное то, что я даже не могу навестить сестру."; link.l1 = "Ближе к делу, сударь."; link.l1.go = "dialog3"; break;
Не работает. Где ошибка? Прописал так, чтобы бежал в Портовое управление Порт-Рояля. А как сделать так, чтобы когда уже диалог продолжится в порт. управлении, нпц первый начал диалог? (как горожане, которые квесты дают)?????
Пусть час не пробил, жди, не уставая, Пусть лгут лжецы, не снисходи до них; Умей прощать и не кажись, прощая, Великодушней и мудрей других.
Киплинг
|
|
| |
Nathaniel | Дата: Вторник, 11.07.2017, 19:25 | Сообщение # 289 |
Контр-адмирал
Группа: Капитан
Сообщений: 8036
Награды: 347
Репутация: 1845
Статус: В открытом море
| Цитата Alister18 ( ) а где этот файл находится? В \program\characters\
Цитата LAi_SetActorType(ref character); LAi_ActorRunToLocation(ref character...); Там не нужно писать ref character! Там нужно писать ID конкретного NPC.
Например:
Код sld = CharacterFromID("New_NPC"); LAi_SetActorType(sld); LAi_ActorRunToLocation(sld, "reload", "reload10_back", "PortRoyal_PortOffice", "goto", "goto2", "PortRoyal_PortOffice", -1);
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
|
|
| |
Alister18 | Дата: Вторник, 11.07.2017, 19:39 | Сообщение # 290 |
Матрос
Группа: Корсар
Сообщений: 24
Награды: 0
Репутация: 0
Статус: В открытом море
| Прописал так.
Код break; case "goFrancisk1": DialogExit(); NextDiag.CurrentNode = "dialog2"; chrDisableReloadToLocation = false; bDisableFastReload = true; sld = CharacterFromID("Francisk_Fushe"); LAi_SetActorType(sld); LAi_ActorRunToLocation(sld, "reload", "reload10_back", "PortRoyal_PortOffice", "goto", "goto2", "PortRoyal_PortOffice", -1); break;
case "dialog2": Побежал он в портовое управление, я зашёл за ним. Он стоит на локаторе. Я подхожу, хочу начать диалог - ноль реакции, как-будто с текстурой пытаюсь говорить ))
Пусть час не пробил, жди, не уставая, Пусть лгут лжецы, не снисходи до них; Умей прощать и не кажись, прощая, Великодушней и мудрей других.
Киплинг
|
|
| |
Nathaniel | Дата: Вторник, 11.07.2017, 20:16 | Сообщение # 291 |
Контр-адмирал
Группа: Капитан
Сообщений: 8036
Награды: 347
Репутация: 1845
Статус: В открытом море
| Цитата Alister18 ( ) Я подхожу, хочу начать диалог - ноль реакции... Так реакцию нужно описать, например, в quests_reaction.c в указанном в функции выше кейсе. У Вас это "PortRoyal_PortOffice". Он у Вас описан?
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
|
|
| |
Alister18 | Дата: Вторник, 11.07.2017, 20:26 | Сообщение # 292 |
Матрос
Группа: Корсар
Сообщений: 24
Награды: 0
Репутация: 0
Статус: В открытом море
| Цитата Nathaniel ( ) Он у Вас описан? Нет. Подскажите что и как описать, пожалуйста.
Пусть час не пробил, жди, не уставая, Пусть лгут лжецы, не снисходи до них; Умей прощать и не кажись, прощая, Великодушней и мудрей других.
Киплинг
|
|
| |
Nathaniel | Дата: Вторник, 11.07.2017, 20:40 | Сообщение # 293 |
Контр-адмирал
Группа: Капитан
Сообщений: 8036
Награды: 347
Репутация: 1845
Статус: В открытом море
| Цитата Alister18 ( ) Подскажите что и как описать... Для чего и зачем?
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
|
|
| |
Alister18 | Дата: Вторник, 11.07.2017, 20:43 | Сообщение # 294 |
Матрос
Группа: Корсар
Сообщений: 24
Награды: 0
Репутация: 0
Статус: В открытом море
| Цитата Nathaniel ( ) Для чего и зачем? Я бы хотел, чтобы при входе меня в Портовое управление нпц подошёл ко мне сам и начал диалог. Как это мне лучше сделать?)))
Пусть час не пробил, жди, не уставая, Пусть лгут лжецы, не снисходи до них; Умей прощать и не кажись, прощая, Великодушней и мудрей других.
Киплинг
|
|
| |
Nathaniel | Дата: Вторник, 11.07.2017, 20:56 | Сообщение # 295 |
Контр-адмирал
Группа: Капитан
Сообщений: 8036
Награды: 347
Репутация: 1845
Статус: В открытом море
| Цитата Alister18 ( ) Как это мне лучше сделать? Поищите в квестах К:ГПК фрагменты кода типа вот таких... Они как раз инициируют встречу NPC с ГГ и начало диалога...
Код ChangeCharacterAddressGroup(sld, pchar.location, "goto", "goto1"); LAi_SetActorType(sld); LAi_ActorDialog(sld, pchar, "", -1, 0);
Например, вот фрагмент встречи на жемчужных промыслах...
Код chrDisableReloadToLocation = true; sld.dialog.Filename = "Pearl_dialog.c"; sld.dialog.currentnode = "GuardMan"; LAi_ActorDialog(sld, pchar, "", -1, 0);
или
Код //==> Посыльный chrDisableReloadToLocation = true; sld = GetCharacter(NPC_GenerateCharacter("PortMansBoy", "shipowner_10", "man", "man", 10, FRANCE, 0, false)); sld.Dialog.Filename = "Quest\SpaLineNpc_2.c"; ChangeCharacterAddressGroup(sld, "Tortuga_tavern", "goto", "goto2"); LAi_SetActorType(sld); LAi_ActorDialog(sld, pchar, "", -1, 0);
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
|
|
| |
korsary4 | Дата: Вторник, 11.07.2017, 23:19 | Сообщение # 296 |
Адмирал
Группа: Администратор
Сообщений: 5204
Награды: 496
Репутация: 1935
Статус: В открытом море
| Ну и условие на вход ГГ в локацию, дополнение к выше сказанному Nathaniel.
Код //////Условие location pchar.quest.MoralValues_2.win_condition.l1 = "location"; pchar.quest.MoralValues_2.win_condition.l1.location = "Dama_houseS2_House"; pchar.quest.MoralValues_2.win_condition = "MoralValues_2";
Единственное, что можно сказать об удаче с уверенностью — она изменит. --------
|
|
| |
Alister18 | Дата: Воскресенье, 16.07.2017, 16:32 | Сообщение # 297 |
Матрос
Группа: Корсар
Сообщений: 24
Награды: 0
Репутация: 0
Статус: В открытом море
| Цитата Nathaniel ( ) Можно. Я, например, вписываю всех новых персонажей игры в LSC_Q2Utilite, а в нужный момент просто выгружаю NPC по заданному адресу.
А как именно прописывать персов в этот файл? Не просто же прописать в файле:
Код makeref(ch,Characters[n]); // Фергус Болтер ch.name = "Фергус"; ch.lastname = "Болтер"; ch.id = "Fergus_Bolter"; ch.model = "Resc_9"; ch.model.animation = "man"; ch.sex = "man"; ch.location = "none"; ch.location.group = "none"; ch.location.locator = "none"; ch.Dialog.Filename = "Quest\MainLine\Fergus_Bolter.c"; GiveItem2Character(ch, GUN_COMMON); ch.equip.gun = GUN_COMMON; GiveItem2Character(ch, "blade2"); ch.equip.blade = "blade2"; ch.nation = ENGLAND; ch.rank = 45; ch.reputation = "15"; SetSelfSkill(ch, 10, 10, 10, 20, 20); SetShipSkill(ch, 20, 90, 10, 10, 10, 20, 10, 10, 50); LAi_NoRebirthDisable(ch); // воскресть при убиении LAi_SetCitizenType(ch); LAi_SetLoginTime(ch, 0.0, 24.0); LAi_SetHP(ch, 200.0, 200.0); LAi_SetImmortal(ch, true); ch.greeting = "GrFisherman"; LAi_group_MoveCharacter(ch, "ENGLAND_CITIZENS"); n = n+1; Попробовал так написать - игра даже не запустилась.
Добавлено (16.07.2017, 16:32) ---------------------------------------------
Цитата korsary4 ( ) sld = CharacterFromID("QuestFortFrance_BB4"); ChangeCharacterAddressGroup(sld,"shore29", "goto", "goto2"); Не получается. При диалоге и вкл. Beta Test Mod'oм сверху пишет мол "НПЦ не найден".
Пусть час не пробил, жди, не уставая, Пусть лгут лжецы, не снисходи до них; Умей прощать и не кажись, прощая, Великодушней и мудрей других.
Киплинг
Сообщение отредактировал Alister18 - Воскресенье, 16.07.2017, 20:38 |
|
| |
Nathaniel | Дата: Понедельник, 17.07.2017, 15:02 | Сообщение # 298 |
Контр-адмирал
Группа: Капитан
Сообщений: 8036
Награды: 347
Репутация: 1845
Статус: В открытом море
| Цитата Alister18 ( ) НПЦ не найден... А должен был быть найден?! Вы же инициализировали выше совсем другого NPC. Или я что-то не понял? Что ж Вы тупо копируете код примеров-то?
Код ch.id = "Fergus_Bolter"; Вот и обращайтесь к нему...
Код sld = CharacterFromID("Fergus_Bolter"); ChangeCharacterAddressGroup(sld,"shore29", "goto", "goto2");
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
|
|
| |
Alister18 | Дата: Понедельник, 17.07.2017, 18:42 | Сообщение # 299 |
Матрос
Группа: Корсар
Сообщений: 24
Награды: 0
Репутация: 0
Статус: В открытом море
| Цитата Nathaniel ( ) Что ж Вы тупо копируете код примеров-то?
Нет, я просто привел пример, мой нпц имеет другой ID. Но не суть.
Пусть час не пробил, жди, не уставая, Пусть лгут лжецы, не снисходи до них; Умей прощать и не кажись, прощая, Великодушней и мудрей других.
Киплинг
|
|
| |
korsary4 | Дата: Понедельник, 17.07.2017, 22:15 | Сообщение # 300 |
Адмирал
Группа: Администратор
Сообщений: 5204
Награды: 496
Репутация: 1935
Статус: В открытом море
| Цитата Alister18 ( ) Но не суть. Суть в том, что значит у нас не объявлен такой нпс с этим id, вот и все.
Цитата Alister18 ( ) А как именно прописывать персов в этот файл? Не просто же прописать в файле:
приведенный вами код, это для файлов из папки Program\characters\init.
Единственное, что можно сказать об удаче с уверенностью — она изменит. --------
|
|
| |
|