|  | 
 
	
		
		
			| Урок № 3. Пишем диалоги персонажам |  |  |  | 
| korsary4 | Дата: Вторник, 11.07.2017, 13:41 | Сообщение # 281 |  |  Адмирал Группа: Администратор Сообщений: 5204 Награды: 496 Репутация: 1941 Статус: В открытом море | Цитата 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 Репутация: 1941 Статус: В открытом море | Цитата 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 |  |  Контр-адмирал Группа: Капитан Сообщений: 8077 Награды: 347 Репутация: 1849 Статус: В открытом море | Цитата 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 |  |  Контр-адмирал Группа: Капитан Сообщений: 8077 Награды: 347 Репутация: 1849 Статус: В открытом море | Цитата 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 |  |  Контр-адмирал Группа: Капитан Сообщений: 8077 Награды: 347 Репутация: 1849 Статус: В открытом море | Цитата 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 |  |  Контр-адмирал Группа: Капитан Сообщений: 8077 Награды: 347 Репутация: 1849 Статус: В открытом море | Цитата Alister18 (  )  Я подхожу, хочу начать диалог - ноль реакции...Так реакцию нужно описать, например, в quests_reaction.c в указанном в функции выше кейсе. У Вас это "PortRoyal_PortOffice". Он у Вас описан?
 
 Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
 Но я не нашёл там никого, кто не был бы моим другом!
 |  |  |  |  |  | 
| Alister18 | Дата: Вторник, 11.07.2017, 20:26 | Сообщение # 292 |  |  Матрос Группа: Корсар Сообщений: 24 Награды: 0 Репутация: 0 Статус: В открытом море | Цитата Nathaniel (  )  Он у Вас описан?Нет. Подскажите что и как описать, пожалуйста.
 
 Пусть час не пробил, жди, не уставая,
 Пусть лгут лжецы, не снисходи до них;
 Умей прощать и не кажись, прощая,
 Великодушней и мудрей других.
 
 Киплинг
 |  |  |  |  |  | 
| Nathaniel | Дата: Вторник, 11.07.2017, 20:40 | Сообщение # 293 |  |  Контр-адмирал Группа: Капитан Сообщений: 8077 Награды: 347 Репутация: 1849 Статус: В открытом море | Цитата Alister18 (  )  Подскажите что и как описать...Для чего и зачем?
 
 Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
 Но я не нашёл там никого, кто не был бы моим другом!
 |  |  |  |  |  | 
| Alister18 | Дата: Вторник, 11.07.2017, 20:43 | Сообщение # 294 |  |  Матрос Группа: Корсар Сообщений: 24 Награды: 0 Репутация: 0 Статус: В открытом море | Цитата Nathaniel (  )  Для чего и зачем?Я бы хотел, чтобы при входе меня в Портовое управление нпц подошёл ко мне сам и начал диалог.
 Как это мне лучше сделать?)))
 
 Пусть час не пробил, жди, не уставая,
 Пусть лгут лжецы, не снисходи до них;
 Умей прощать и не кажись, прощая,
 Великодушней и мудрей других.
 
 Киплинг
 |  |  |  |  |  | 
| Nathaniel | Дата: Вторник, 11.07.2017, 20:56 | Сообщение # 295 |  |  Контр-адмирал Группа: Капитан Сообщений: 8077 Награды: 347 Репутация: 1849 Статус: В открытом море | Цитата 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 Репутация: 1941 Статус: В открытом море | Ну и условие на вход ГГ в локацию, дополнение к выше сказанному Nathaniel. 
 
 Код //////Условие locationpchar.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 |  |  Контр-адмирал Группа: Капитан Сообщений: 8077 Награды: 347 Репутация: 1849 Статус: В открытом море | Цитата 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 Статус: В открытом море | Нет, я просто привел пример, мой нпц имеет другой ID. Но не суть.Цитата Nathaniel (  )  Что ж Вы тупо копируете код примеров-то?
 Пусть час не пробил, жди, не уставая,
 Пусть лгут лжецы, не снисходи до них;
 Умей прощать и не кажись, прощая,
 Великодушней и мудрей других.
 
 Киплинг
 |  |  |  |  |  | 
| korsary4 | Дата: Понедельник, 17.07.2017, 22:15 | Сообщение # 300 |  |  Адмирал Группа: Администратор Сообщений: 5204 Награды: 496 Репутация: 1941 Статус: В открытом море | Цитата Alister18 (  )  Но не суть.Суть в том, что значит у нас не объявлен такой нпс с этим id, вот и все.
 
 
 Цитата Alister18 (  )  А как именно прописывать персов в этот файл? Не просто же прописать в файле:
приведенный вами код, это для файлов из папки Program\characters\init.
 
 
   Единственное, что можно сказать об удаче с уверенностью — она изменит.
 --------
 
   |  |  |  |  |  |