Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Модификации ядра > Моды

Важная информация

Моды Неофициальная модификация ядра MaNGOS, собственные наработки, расширение функционала

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.06.2010, 12:11   #1
Warlord123
Пользователь
 
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
Warlord123 Скоро придёт к известности
По умолчанию [mod] DBC_Patcher

При работе с DBC часто выясняется, что данные в них не всегда правильные.
Так как на клиенте во многих случаях достаточно правильно отобразить урон, вероятность и т.д. , то другие параметры
заклинаний разработчикам были не важны, их корректности никто не добивался.
Т.к. Mangos использует данные DBC как основные, получается что некорректные данные не могут быть "стандартно" реализованы
через обработчики эффектов заклинаний , либо требуют отдельного кода для реализации.

Некоторые заклинания легко могут быть починены заменой эффектов, значений, масок и т.д. Патч изменяет значения
в памяти после загрузки DBC. Размер всех в структуре SpellEntry (DBCStructure.h) кратен 4 байтам, поэтому проще всего
патчить типом данных uint32.

Патч реализован на уровне идеи, не реализована проверка ошибок.
Код:
diff --git a/src/shared/Database/DBCFileLoader.cpp b/src/shared/Database/DBCFileLoader.cpp
index 613a87e..616d1f7 100644
--- a/src/shared/Database/DBCFileLoader.cpp
+++ b/src/shared/Database/DBCFileLoader.cpp
@@ -21,6 +21,8 @@
 #include <string.h>
 
 #include "DBCFileLoader.h"
+#include "Database/SQLStorage.h"
+#include "Util.h"
 
 DBCFileLoader::DBCFileLoader()
 {
@@ -84,6 +86,50 @@ bool DBCFileLoader::Load(const char *filename, const char *fmt)
 
     if(fread(data,recordSize*recordCount+stringSize,1,f)!=1)
         return false;
+	//DBC Patch 
+	const char* dbc_name=strrchr(filename,'/')+1;
+	QueryResult *result = WorldDatabase.PQuery("SELECT entry, data FROM spell_patch WHERE DBC='%s' ORDER BY entry",dbc_name);
+	if(result)
+	{   uint32 *patched_record=(uint32*)data;
+		do
+		{
+			Field *fields = result->Fetch();
+
+			uint32 entry = fields[0].GetUInt32();
+			std::string patch_data = fields[1].GetString();
+
+			Tokens tokens = StrSplit(patch_data, " ");
+			int32 m_valuesCount=tokens.size();
+			if(m_valuesCount & 1)
+				continue; //нечетное число - ошибка
+
+			
+			//Пропускаем ненужные записи
+			while( *patched_record < entry)
+			{
+				patched_record+=recordSize / sizeof(uint32);
+			}
+			//Ошибка, больше не найдеться записей для патчей
+			if (*patched_record > entry) 
+				break;
+
+			sLog.outError ("patch entry=%u ,%s",entry,patch_data.c_str());
+			Tokens::iterator iter;
+			int index;
+			for (iter = tokens.begin(), index = 0; index < m_valuesCount; ++iter, index+=2)
+			{  
+				uint32 addr = atol((*iter).c_str());
+				++iter;
+				uint32 val = atol((*iter).c_str());
+				*(patched_record+addr)=val;
+			}
+
+
+		}
+		while (result->NextRow());
+		delete result;
+
+	}
 
     fclose(f);
     return true;
SQL для патча.
Код:
CREATE TABLE spell_patch(
  entry INT(11) NOT NULL,
  dbc VARCHAR(255) DEFAULT NULL,
  `data` VARCHAR(255) DEFAULT NULL,
  `comment` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (entry)
)
;

-- 
--
INSERT INTO spell_patch VALUES 
  (50508, 'Spell.dbc', '101 255', 'Crypt Fever'),
  (50509, 'Spell.dbc', '101 255', 'Crypt Fever'),
  (50510, 'Spell.dbc', '101 255', 'Crypt Fever'),
  (51726, 'Spell.dbc', '101 255 102 87', 'Ebon Plague'),
  (51734, 'Spell.dbc', '101 255 102 87', 'Ebon Plague'),
  (51735, 'Spell.dbc', '101 255 102 87', 'Ebon Plague'),
  (69412, 'Spell.dbc', '113 49640', 'Abyssal Shatter(69412)');
Несколько примеров использования.

В патче 3.3.2 перестало работать заклинание 69412 (Abyssal Shatter).
По данным spell_works в данных пропал предмет, который создается при использовании Abyssal Shatter.
Код:
ID - 69412 Abyssal Shatter ()
--------------------------
Disenchants an Abyss Crystal into Greater Cosmic Essence or Infinite Dust.
--------------------------
Category = 0, SpellIconID = 4061, activeIconID = 0, SpellVisual_0 = 563, SpellVisual_1 = 0
Family SPELLFAMILY_GENERIC, flag 0x00000000 00000000 00000000
School = SPELL_SCHOOL_NORMAL, DamageClass = SPELL_DAMAGE_CLASS_NONE, PreventionType = NONE
Skill (333) Enchanting, Min Value 445, Max Value 450
Attributes 0x00010020, Ex 0x00000400, Ex2 0x00000000, Ex3 0x00000000, Ex4 0x00000000, Ex5 0x00000000, Ex6 0x00000000
CastingTime = 3.00
Interrupt Flags: 0x0000000F, AuraIF 0x00000000, ChannelIF 0x00000000
Chance = 101, charges - 0

Effect: (157) SPELL_EFFECT_157
Base point = 0
Target A (TARGET_SELF), Target B (No target)
EffectMiscValue = 27716

Effect: NO EFFECT

Effect: NO EFFECT
В данных 3.2.2 этот предмет содержиться:
Код:
ID - 69412 Abyssal Shatter ()
--------------------------
Disenchants an Abyss Crystal into Greater Cosmic Essence or Infinite Dust.
--------------------------
Category = 0, SpellIconID = 4061, activeIconID = 0, SpellVisual_0 = 563, SpellVisual_1 = 0
Family SPELLFAMILY_GENERIC, flag 0x00000000 00000000 00000000
School = SPELL_SCHOOL_NORMAL, DamageClass = SPELL_DAMAGE_CLASS_NONE, PreventionType = NONE
Skill (333) Enchanting, Min Value 445, Max Value 450
Attributes 0x00010020, Ex 0x00000400, Ex2 0x00000000, Ex3 0x00000000, Ex4 0x00000000, Ex5 0x00000000, Ex6 0x00000000
CastingTime = 3.00
Interrupt Flags: 0x0000000F, AuraIF 0x00000000, ChannelIF 0x00000000
Chance = 101, charges - 0

Effect: (157) SPELL_EFFECT_157
Base point = 1
Target A (TARGET_SELF), Target B (No target)
EffectMiscValue = 27716
EffectItemType = 49640
Данные о предмете находяться в uint32 EffectItemType[MAX_EFFECT_INDEX]; // 113-115 m_effectItemType (DBCStructure.h версия ядра 9675).
Меняем значение 0 на 49640 по смещению 113. Заклинание начинает работать.

Талант Ebon Plaguebringer(51161) вешает дебафф Ebon Plague (51735) который должен увеличивать урон от болезней и от всего магического урона.
В заклинании используется спелл 65142, о котором ничего не известно.
Код:
ID - 51735 Ebon Plague ()
--------------------------
Your Crypt Fever morphs into Ebon Plague, which increases magic damage taken by $s2% in addition to increasing disease damage taken by $s1%.
ToolTip: Increases disease damage taken by $s1%.
Increases magic damage taken by $s2%.
--------------------------
Category = 0, SpellIconID = 1933, activeIconID = 0, SpellVisual_0 = 0, SpellVisual_1 = 0
Family SPELLFAMILY_DEATHKNIGHT, flag 0x00000040 00000800 00000000
School = SPELL_SCHOOL_SHADOW, DamageClass = SPELL_DAMAGE_CLASS_NONE, PreventionType = NONE
Spell level = 1
Dispel - 3
Mechanic - 22 - MECHANIC_PERSUADED
Range 50000.00 - 50000.00 yards
Attributes 0x00040000, Ex 0x00000088, Ex2 0x00000000, Ex3 0x00000000, Ex4 0x00000000, Ex5 0x00000000, Ex6 0x00000000
Duration = 15000, 0, 15000
Interrupt Flags: 0x00000000, AuraIF 0x00000000, ChannelIF 0x00000000
Chance = 101, charges - 0

Effect: (006) SPELL_EFFECT_APPLY_AURA
Base point = 30
Target A (TARGET_CHAIN_DAMAGE), Target B (No target)
Aura 284, value = 30, misc = 22, miscB = 0, periodic = 0
Trigger spell (65142) Not found, Chance = 101

Effect: (006) SPELL_EFFECT_APPLY_AURA
Base point = 13
Target A (TARGET_CHAIN_DAMAGE), Target B (No target)
Aura (004) SPELL_AURA_DUMMY, value = 13, misc = 126, miscB = 0, periodic = 0
Эффекты которые требуются для реализации Ebon Plague есть в

Код:
ID - 47865 Curse of the Elements (Rank 5)
--------------------------
Curses the target for $d, reducing Arcane, Fire, Frost, Nature, and Shadow resistances by $s1 and increasing magic damage taken by $s2%.  Only one Curse per Warlock can be active on any one target.
ToolTip: Reduces Arcane, Fire, Frost, Nature and Shadow resistances by $s1.  Increases magic damage taken by $s2%.
--------------------------
Effect: (006) SPELL_EFFECT_APPLY_AURA
Base point = 13
Target A (TARGET_CHAIN_DAMAGE), Target B (No target)
Aura (087) SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, value = 13, misc = 126, miscB = 0, periodic = 0
и в
Код:
ID - 46857 Trauma (Rank 2)
--------------------------
Your normal melee critical strikes increase the effectiveness of Bleed effects on the target by $46857s1% for $46857d.
ToolTip: Bleed effects cause an additional $s1% damage.
-------------------------
Effect: (006) SPELL_EFFECT_APPLY_AURA
Base point = 30
Target A (TARGET_CHAIN_DAMAGE), Target B (No target)
Aura (255) SPELL_AURA_255, value = 30, misc = 15, miscB = 0, periodic = 0
SpellClassMask = 00000000 00000008 00002010
Меняем Aura 284 на SPELL_AURA_255 (увеличение урона заданной механики) и Aura (004) SPELL_AURA_DUMMY на Aura (087) SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN.
Warlord123 вне форума   Ответить с цитированием
Старый 21.06.2010, 13:01   #2
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Мне кажется проще уж тогда просто править DBC.
alien вне форума   Ответить с цитированием
Старый 21.06.2010, 13:05   #3
Astellar
Гость
 
Сообщений: n/a
По умолчанию

Цитата:
Сообщение от alien Посмотреть сообщение
Мне кажется проще уж тогда просто править DBC.
Сразу видно, что человек вырос в стране криминальной романтики. А Вы знаете, в некоторых странах _ЛИЦЕНЗИЮ_ соблюдают (внезапно, да?). И за нарушение оной могут нагнуть ой как хорошо. Так вот, лицензия запрещает проводить модификацию файлов игры.
  Ответить с цитированием
Старый 21.06.2010, 13:13   #4
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Нуу как-бы начнем с того что мы правим их у себя а не в клиенте.
А если уж на то пошло то и извлечение DBC файлов можно подогнать под нарушение лицензии.
alien вне форума   Ответить с цитированием
Старый 21.06.2010, 13:14   #5
Warlord123
Пользователь
 
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
Warlord123 Скоро придёт к известности
По умолчанию

Кроме уже указанных правовых проблем, есть еще и другие сложности. Править DBC не так просто, по крайней мере мне так показалось. При правках нужно будет вести список изменение, чтобы не забыть что и где правилось. Откатить одно изменение будет невозможно. Необходимо будет доставать "чистый" файл и править его заново. Задача мода - свести спелы к уже написанному и работающему коду, чтобы не писать исключения и "хаки" в коде. Хаки тут будут через базу.
Warlord123 вне форума   Ответить с цитированием
Старый 21.06.2010, 13:20   #6
Astellar
Гость
 
Сообщений: n/a
По умолчанию

Код:
В заклинании используется спелл 65142, о котором ничего не известно.
Не самый лучший пример. О нем прекрасно известно, что он должен повысить урон от DoT'ов определенных. А это спокойно реализуется с помощью SpellMod.
  Ответить с цитированием
Старый 21.06.2010, 13:50   #7
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

У Insider42 есть патч. Там вообще таблица имеет полный вид дбц спеллов - ну функциональнее ли он в таком случае?
KiriX вне форума   Ответить с цитированием
Старый 21.06.2010, 13:58   #8
Warlord123
Пользователь
 
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
Warlord123 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Astellar Посмотреть сообщение
Не самый лучший пример. О нем прекрасно известно, что он должен повысить урон от DoT'ов определенных. А это спокойно реализуется с помощью SpellMod.
Возможно, что не лучший пример. Использование SpellMod - другой метод решения проблемы. Вы предлагаете "правильно" обрабатывать "неправильные" данные. В примере я подгоняю данные под существующий код. В обоих случаях результат одинаковый.
Warlord123 вне форума   Ответить с цитированием
Старый 21.06.2010, 14:04   #9
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от Warlord123 Посмотреть сообщение
Возможно, что не лучший пример. Использование SpellMod - другой метод решения проблемы. Вы предлагаете "правильно" обрабатывать "неправильные" данные. В примере я подгоняю данные под существующий код. В обоих случаях результат одинаковый.
А кто судит о правильности или неправильности данных и на каком основании?
KiriX вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Laise (21.06.2010)
Старый 21.06.2010, 14:34   #10
Warlord123
Пользователь
 
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
Warlord123 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от KiriX Посмотреть сообщение
А кто судит о правильности или неправильности данных и на каком основании?
Это сложный вопрос, формальные критерии нужно еще придумать.
Заклинание стоит пробовать патчить если:
1. использует\должно использовать уже имеющиеся в ядре эффекты, но некорректно работает из-за того, что в SpellEntry данные не позволяют это делать;
2. не требуются дополнительные проверки, которые необходимо реализовывать в ядре;
3. существуют и нормально работают заклинания(или другие ранги заклинаний) с теми же эффектами, а конкретное не работает.

Как я понимаю, основная цель - сделать чтобы заклинание работало как на "оффе". Участники\разработчики проекта mangos
решают эту задачу. Разработчики mangosa принимают решение , вписывается ли предложенный вариант реализации в проект. Если реализация понятна, очевидна, то она принимается. Получается, что на этот вопрос каждый раз дают ответ разработчики (MaNGOS Dev).

Последний раз редактировалось Warlord123; 21.06.2010 в 14:55.
Warlord123 вне форума   Ответить с цитированием
Старый 21.06.2010, 15:03   #11
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от Warlord123 Посмотреть сообщение
Это сложный вопрос, формальные критерии нужно еще придумать.
Заклинание стоит пробовать патчить если:
1. использует\должно использовать уже имеющиеся в ядре эффекты, но некорректно работает из-за того, что в SpellEntry данные не позволяют это делать;
2. не требуются дополнительные проверки, которые необходимо реализовывать в ядре;
3. существуют и нормально работают заклинания(или другие ранги заклинаний) с теми же эффектами, а конкретное не работает.

Как я понимаю, основная цель - сделать чтобы заклинание работало как на "оффе". Участники\разработчики проекта mangos
решают эту задачу. Разработчики mangosa принимают решение , вписывается ли предложенный вариант реализации в проект. Если реализация понятна, очевидна, то она принимается. Получается, что на этот вопрос каждый раз дают ответ разработчики (MaNGOS Dev).
Я понял ваши мысли, но на фоне существующего патча с таблицей spell_dbc - он бессмысленен, т.к. мнее функционален, как я понял.
added
Неправильно понял ваш патч - функциональность таже, но несколько иная реализация - более компактная. Но не учитывает наличие не существующих спеллов, которые можно сделать в патче, что у Инсайдера42.

Основная цель вовсе не сделать как на оффе, а обучится коду и коду правильному. Делать правильно.
Если бы разработчики просто хотели бы сделать "всё как на оффе" - всё давно было бы сделано хаковыми методами, однако, основная цель проекта - обучающая. Обучающая реализовывать правильно.

Ну а вообще - такой мод имеет право на жизнь - расположен там где следует.
KiriX вне форума   Ответить с цитированием
Старый 21.06.2010, 15:10   #12
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Идея с созданием таблицы для спеллов в базе возникает не первый раз, но в ядро не принимается, что можно расценивать как хаковое решение.
В сниффах приходят спеллы, которых нет в дбц.
Возможно, еще больше спеллов не приходят вообще ни в каком виде.

Если делать реализацию через базу, то можно установить приоритет на ее стороне, т.е. в первую очередь берутся данные из базы, а потом уже из Spell.dbc.
В таком случае можно не плодить однотипный код, когда у спелла есть, например, эффект думми (каст спелла) без каких-либо дополнительных условий или требуется изменить тип цели.
Вместо описания думми в ядре можно просто добавить запись в базу с указанием нужного спелла, целей и прочих необходимых параметров.

В этом случае можно будет реализовывать не только отсутствующие в дбц спеллы, но и править существующие, если не требуется дополнительная обработка.
В свою очередь это принесет не только дополнительные возможности, но и определенные неудобства, т.к. надо будет учитывать приоритетность данных.

В любом случае конечное слово за разработчиками ядра.
Если они не приняли подобные патчи, значит, не все так просто, как нам кажется.
virusav вне форума   Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
KiriX (21.06.2010), Lightunit (21.06.2010), Lordronn (21.06.2010), Ranger (15.07.2010)
Старый 21.06.2010, 22:43   #13
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Получается , можно изменить и дисплей Ид , и тип силы и все?
Lordronn вне форума   Ответить с цитированием
Старый 21.06.2010, 23:14   #14
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Можно все, но не все нужно.
virusav вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 12:54. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot