Важно 9 мая - День Победы - 80-летия Великой Победы!
  • 738
  • 5
Поздравляю всех, кому искренне небезразличен этот день! С днём Великой Победы!
Новости Анонс The Elder Scrolls VI уже этим летом?
  • 537
  • 1
По данным инсайдера eXtas1s, Bethesda может впервые показать The Elder Scrolls VI летом 2025 года Обсуждается возможность анонса игры на одной из крупных презентаций Xbox - в июне или августе...
Новости Of Ash and Steel: разработка в цифрах
  • 507
  • 0
На днях авторы игры Of Ash and Steel поблагодарили игроков за поддержку и положительные отклики, а также поделились цифрами во время разработки. В игре будут: 300+ квестов; 30 000+ строк...
Новости Clair Obscur: Expedition 33 – новая ролевая игра, ломающая стереотипы
  • 739
  • 3
Clair Obscur: Expedition 33 – уникальная ролевая игра, которая могла появиться только у инди-разработчика Раз в год Художница просыпается и рисует на Монолите. Выводит свое проклятое число. И...

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

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, посему здесь не рассматривается.
 

Вложения

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