Новости Дата релиза Baldur's Gate III
  • 19.298
  • 1
Наконец-то дождались - "Baldur's Gate III" покидает ранний доступ, и в августе 2023 выходит в полноценный релиз, о чём стало известно на церемонии "The Game Awards 2022". С момента выхода игры в...
Новости Итоги года от The Game Awards 2022
  • 13.138
  • 0
Вчера прошла ежегодная церемония награждения проектов в индустрии компьютерных игр и киберспорта. Самую главную награда - "Игра года" забрала игра "Elden Ring" от японских разработчиков...
Новости Анонс Assassin's Creed Mirage
  • 18.728
  • 6
На сегодняшнем мероприятии «Ubisoft Forward» была анонсированна новая часть вселенной «Assassin's Creed» под названием «Mirage». В роли протагониста будет Басим ибн Исхак, играющие в «Assassin’s...
Новости Gwent: Rogue Mage | Новая игра по вселенной «Ведьмака»
  • 18.667
  • 4
Ещё в конце января этого года компания анонсировала проект под кодовым названием «Золотой Накер». Некоторые карты этой тематики были добавлены в сам «Гвинт», для подогревания интереса. И вот...

Урок по добавлению новой руны телепортации

Leonion

Наемник
Модостроитель
Участник форума
Регистрация
28 Май 2013
Сообщения
726
Реакции
472
Баллы
164
Лучшие ответы
0
#1
На досуге довелось расписывать процесс добавления руны телепортации, потом вспомнил про здешние уроки, пусть будет и здесь, если модераторы не против.
Думаю, пригодится для тех игроков, кому (как и мне) мало существующих телепортов и хочется более быстрого перемещения по мирами Готики (особенно в Возвращении). Отныне мододелы смогут просто отсылать их сюда (чтобы в дальнейшем избежать форумных баттлов сторонников обилия телепортационных рун с противниками такового). jk

Итак, как добавить еще одну руну телепорта:
Этап 0. Прежде всего, необходимо разобраться как с помощью GothicVDFS распаковать мод, а с помощью GothicSourcer 3.14 декомпилировать скрипты. В этом вам помогут уже существующие руководства. В данном же уроке мы допустим, что вы уже в этом разобрались и перейдем непосредственно к добавлению руны.

Этап 1. Итак, вы декомпилировали скрипты и хотите добавить руну. К сожалению, в добавлении руны задействованы несколько файлов, в связи с чем рассмотрим их по очереди. В данном примере названия файлов взяты из мода "Гильдии", в др. модах они могут отличаться.
В любом случае, проще всего найти нужные файлы во всей куче скриптов следующим образом (см. скрин 1):
Берем название существующей руны и вбиваем его в поиск наверху программы (к примеру, TeleportFarm - телепорт на ферму Онара), после этого внизу окна программы выдается список мест, где встречается данное слово. Двойным щелчком открываем каждый из нужных нам файлов, смотрим как он устроен и встраиваем новые фрагаменты кода в соответствии с нижеследующей инструкцией.

Этап 3. Файл с константами (Constants.d).
1) В файле Constants.d находим следующую строку:
const int MAX_SPELL = XXX
На месте XXX в скриптах стоит число. Это число необходимо увеличить на 1.
Саму же строку вы сдвигаете вниз, а на ее месте прописываете вашу руну в следующем формате (см. скрин 2):
const int SPL_[уникальное название вашей руны на анг.] = номер_вашей_руны_равный_старому_значению_XXX;
2) Чуть ниже вы видите следующую строку:
const string spellFxInstanceNames[XXX] =
На месте XXX в скриптах стоит число. Это число необходимо увеличить на 1.
3) После этой строки вы увидите открывающиеся фигурные скобки и длинный список названий. Проматываете до конца этого списка.
Далее ставите указатель мыши после последнего пункта в списке. Ставите после этого пункта запятую. Жмете enter. В появившейся строчке вводите "Teleport".
4) Ниже видите строку:
const string spellFxAniLetters[XXX] =
На месте XXX в скриптах стоит число. Это число необходимо увеличить на 1.
После строки снова видите список, снова проматываете до конца списка и вставляете, также как и в пункте 3, в самом его конце строку, но на этот раз со словом "HEA"
5) Мотаете файл еще ниже, пока не находите следующую строку:
var int player_talent_runes[YYY]
На месте YYY стоит число. Это число необходимо увеличить на 1.
Все. С этим файлом закончили.

Этап 4. Файл с названиями (Text.d).
1) В файле Text.d находим следующую строку:
const string TXT_SPELLS[XXX] =
На месте XXX в скриптах стоит число. Это число необходимо увеличить на 1.
2) После этой строки вы увидите открывающиеся фигурные скобки и длинный список названий. Проматываете до конца этого списка.
Далее ставите указатель мыши после последнего пункта в списке. Ставите после этого пункта запятую. Жмете enter. В появившейся строчке в кавычках вводите название вашей руны. По этому пункту и пункту 3 см. скрин 3.
3) Далее ниже вы видите длинный список однотипнных строк. В любом месте списка вставляете новую строку (enter-ом), в которой вписываете вашу руну в формате:
const string NAME_SPL_[уникальное название вашей руны на анг.] = "Название вашей руны";
Пример вы видите на все том же скрине 2.
С этим файлом закончили.

Этап 5. Файл с обработкой маны (Spell_ProcessMana.d).
1) Вы видите длинный список однотипных операторов if (чего-то там) return (чего-то там).
В любом месте списка (к примеру, в конце - см. скрин 4) вставляете вашу руну (мое название BBTrollTP меняете на свое уникальное название):
Код:
if(activeSpell == SPL_BBTrollTP)
	{
		return spell_logic_BBTrollTP(manaInvested);
	};
Все. С этим файлом покончили.

Этап 6. Файл, объясняющий работу рун (equipweapn.d).
1) Почти в самом низу файла ищете следующую строчку:
func void Spell_Cast_Teleport()
ПЕРЕД этой строчкой вставляете следующий код (мое название BBTrollTP во всех местах меняете на свое уникальное название):
Код:
func int Spell_Logic_BBTrollTP(var int manaInvested)
{
	if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
	{
		return SPL_SENDCAST;
	}
	else if(self.attribute[ATR_MANA] >= SPL_Cost_Teleport)
	{
		return SPL_SENDCAST;
	};
	return SPL_NEXTLEVEL;
};

func void Spell_Cast_BBTrollTP()
{
	B_PrintTeleportTooFarAway(NEWWORLD_ZEN);
	if((self.id == 0) && (PLAYERISTRANSFER == TRUE) && (PLAYERISTRANSFERDONE == FALSE))
	{
		b_transferback(self);
	};
	if(Npc_GetActiveSpellIsScroll(self))
	{
		self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
	}
	else
	{
		self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Teleport;
	};
	AI_Teleport(self,"NW_TROLLAREA_PATH_78");
	AI_PlayAni(self,"T_HEASHOOT_2_STAND");
};
Из всего этого кода вам интересны лишь 2 строки:
Во-первых, B_PrintTeleportTooFarAway(NEWWORLD_ZEN);
Эта строчка отвечает за фразу ГГ о том, что "Это не сработает" (или что-то в этом роде), если ГГ находится в любом мире, отличном от Хориниса (NEWWORLD_ZEN). Если вы будете делать руну для Миненталя, то вместо NEWWORLD_ZEN вам нужно будет прописать OLDWORLD_ZEN, для Яркендара - ADDONWLORD_ZEN. Названия миров можно посмотреть в уже знакомом вам файле Constants.d.
Во-вторых, AI_Teleport(self,"NW_TROLLAREA_PATH_78");
Эта строчка отвечает за то, куда именно вы телепортируетесь. Вэйпоинт (точка назначения) указан в кавычках.
Допустим, вы хотите руну к ледяному дракону. Что для этого надо сделать? Во-первых, вы идете к желаемому месту в самой игре. Во-вторых, придя, вы активируете Марвин-режим и вбиваете в F2-консоли фразу "toggle waynet" (часть этой фразы консоль заполнит за вас, т.ч. будьте внимательны). Далее вы увидите на земле адъ и Израиль паутину из линий и кучу надписей на стыках линий. Выбираете любую надпись по вкусу поблизости от желаемого места назначения (это и есть названия вэйпоинтов), записываете ее на бумажку, закрываете игру, возвращайтесь к Соурсеру и впечатываете ее в кавычках вместо NW_TROLLAREA_PATH_78 из моего примера (КАПСЛОК ВАЖЕН!!!111).
2) Возвращайтесь к строке func void Spell_Cast_Teleport(), упомянутой ранее.
Ниже вы видите кучу однотипных операторов, немного похожих на предыдущий файл (с этапа 5).
Также как и в предыдущем файле, в конце всего этого чуда перед последней закрывающей скобкой вы вставляете следующее (мое название BBTrollTP меняете на свое уникальное название):
Код:
if(Npc_GetActiveSpell(self) == SPL_BBTrollTP)
	{
		Spell_Cast_BBTrollTP();
	};
На этом с данным файлом мы закончили. Остался последний.

Этап 7. Файл со списком рун (Itru_palteleportsecret.d).
1) Где-нибудь посередине файла, между другими рунами, вставляете свою руну (мое название BBTrollTP во всех местах меняете на свое уникальное название):
Код:
instance ItRu_BBTrollTP(C_Item)
{
	name = NAME_Rune;
	mainflag = ITEM_KAT_RUNE;
	flags = 0;
	value = 500;
	visual = "ItRu_MasterOfDesaster.3DS";
	material = MAT_STONE;
	spell = SPL_BBTrollTP;
	wear = WEAR_EFFECT;
	effect = "SPELLFX_WEAKGLIMMER";
	description = NAME_SPL_BBTrollTP;
	text[1] = NAME_Manakosten;
	count[1] = SPL_Cost_Teleport;
	text[5] = NAME_Value;
	count[5] = value;
};
Здесь особо ничего важного нет. value - это стоимость, visual - как руна выглядит в инвентаре (можете полистать список рун, посмотреть их визуалы рун и выбрать себе по вкусу). NAME_SPL_BBTrollTP - прописанное ранее название вашей руны. Остальное не важно...
Все. Руна создана.

Этап 8. Добавление руны в игру.
Теперь у меня есть новая руна ItRu_BBTrollTP, а у вас - ваша руна. Самый простой способ добавить эту руну в игру - воспользоваться читом insert ItRu_BBTrollTP , вбиваемым в F2-консоли.
Если же хотите добавить ее "цивилизованно", то придется еще немного поразбираться в скриптах. В данный урок это все уже не уместится, посему скажу лишь кратко 2 основных варианта:
1) Прописать в каком-нибудь диалоге B_GiveInvItems(self,other,ItRu_BBTrollTP,1); - как это сделать, см. сами.
2) Вставить руну в сам игровой мир в точку NW_TROLLAREA_PATH_78 (или другую) при помощи Wld_InsertItem(ItRu_BBTrollTP,"NW_TROLLAREA_PATH_78"); Сделать это можно как в диалоге, так и во время смены миров (файлы B_Enter_ТакойтоWorld). Детали см. сами.

Этап 9. Сохраняем скрипты, компилируем скрипты, запаковываем мод. Подразумевается то же, что и в п. 0, посему здесь не рассматривается.
 

Вложения

Последнее редактирование модератором:
Сверху Снизу