Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Tools (http://mangos.ytdb.ru/forumdisplay.php?f=22)
-   -   SpellWork C# (http://mangos.ytdb.ru/showthread.php?t=765)

TOM_RUS 21.10.2010 19:16

Цитата:

Сообщение от Lordronn (Сообщение 15245)
Будет ли поддержка 4.0.1 или нет? На данный момент есть 4.0.3, но структуру ДБС не соответствует 4.0.1.

Там разница минимальная.

Warlord123 30.10.2010 13:55

Вложений: 1
Иногда бывает необходимо получить таблицу заклинаний в виде SQL.
Есть конвертеры dbc в CSV , dbc в SQL. К сожалению, на выходе получается только заготовка, использовать которую достаточно затруднительно. В выходных файлах нет заголовков полей, их типов.
Кроме того, dbc2sql.exe путает типы полей, в итоге выходной файл не полностью соответствует действительности.

Предлагаю патч для добавления функционала по выгрузке заклинаний в SQL скрипт.

Данные для скрипта строятся динамически на основе структуры SpellEntry.
При добавлении новых типов данных (не полей) в SpellEntry , код потребует некоторой доработки.
Часть сформированного скрипта:

CREATE TABLE spells (
ID INT(10) UNSIGNED NOT NULL DEFAULT 0,
Category INT(10) UNSIGNED NOT NULL DEFAULT 0,
Dispel INT(10) UNSIGNED NOT NULL DEFAULT 0,
Mechanic INT(10) UNSIGNED NOT NULL DEFAULT 0,
Attributes INT(10) UNSIGNED NOT NULL DEFAULT 0,
AttributesEx INT(10) UNSIGNED NOT NULL DEFAULT 0,
AttributesEx2 INT(10) UNSIGNED NOT NULL DEFAULT 0,
AttributesEx3 INT(10) UNSIGNED NOT NULL DEFAULT 0,
AttributesEx4 INT(10) UNSIGNED NOT NULL DEFAULT 0,
AttributesEx5 INT(10) UNSIGNED NOT NULL DEFAULT 0,
AttributesEx6 INT(10) UNSIGNED NOT NULL DEFAULT 0,
AttributesExG INT(10) UNSIGNED NOT NULL DEFAULT 0,
Stances INT(20) UNSIGNED NOT NULL DEFAULT 0,
StancesNot INT(20) UNSIGNED NOT NULL DEFAULT 0,
Targets INT(10) UNSIGNED NOT NULL DEFAULT 0,
TargetCreatureType INT(10) UNSIGNED NOT NULL DEFAULT 0,
RequiresSpellFocus INT(10) UNSIGNED NOT NULL DEFAULT 0, .....

Konctantin 30.10.2010 15:11

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

Warlord123 30.10.2010 17:06

Сделаю. Тогда займу следующую страничку в tabControl. :) И сделаю настройки экспорта.

LordJZ 30.10.2010 17:10

Зачем изобретать велосипед? И SpellWork это программа для работы со спеллами (внезапно!), а не комплекс для работы с DBC

TOM_RUS 30.10.2010 20:25

Цитата:

Сообщение от LordJZ (Сообщение 15556)
Зачем изобретать велосипед? И SpellWork это программа для работы со спеллами (внезапно!), а не комплекс для работы с DBC

Тем более что уже есть тулзы для экспорта dbc в sql.

KiriX 31.10.2010 15:32

Но с другой стороны, к чему иметь 43 программы, когда можно совместить в одной, наиболее удобной и часто используемой ;)

virusav 31.10.2010 15:57

Не надо распыляться на все подряд, программа для работы со спеллами, надо в этой области добить по-максимуму.
Если не ошибаюсь, то новая прок-система до сих пор не реализована.

Когда программа будет полнофункциональной, тогда уже желающие от нечего делать могут заняться ее модернизацией.:)

LordJZ 31.10.2010 16:03

Цитата:

Сообщение от TOM_RUS (Сообщение 15563)
Я сижу на XP, и все работает нормально, так что траблы на вашей стороне.

У меня на WinXP программа выполняла один цикл отрисовки за 3-4 минуты, каждый раз читая файл.
Цитата:

Сообщение от KiriX (Сообщение 15591)
Но с другой стороны, к чему иметь 43 программы, когда можно совместить в одной, наиболее удобной и часто используемой ;)

И получите вы Nero, или ACDSee, или Opera.

Insider42 06.11.2010 23:10

Что-то с масками школ напутано во вкладке Spell proc event, допустим HOLY считается как 0x04, а в мангосе она вообще другая :/ по-моему инфа устарела, так ещё и заменяет новым значением вместо сложения в случае когда у нас уже отмечен, допустим Holy и Nature, мы тыкаем пару раз на HOLY и выдает неверный подсчет.

Также нехватает ещё одного procEx, который не так давно добавили

LordJZ 06.11.2010 23:22

По поводу проков пилите шура^W Konctantin-а.

Lordronn 08.12.2010 21:16

Не могли бы Вы починить поиск по BasePointEffect(67) Ищет спеллы не совсем верно. Ввожу в поиск БП 10, а находит он

Цитата:

=================================================
Effect 0: Id 58 (SPELL_EFFECT_WEAPON_DAMAGE)
BasePoints = 11 + Level * 2,00
Targets (6, 0) (TARGET_CHAIN_DAMAGE, NO_TARGET)

Effect 1: NO EFFECT

Effect 2: NO EFFECT


virusav 08.12.2010 21:17

Попробуй искать значение на 1 меньше, не раз помогало.
10 + 1 => BasePoints = 11 ...

Lordronn 08.12.2010 21:24

Спасибо! Проблема возникает наверно из-за того,что есть БП 0, и в представлении программы БП0 - 1, БП1 - 2 и т.д

LordJZ 08.12.2010 21:39

Нет, в клиенте данные так хранятся, см. DBCStructure.h, struct SpellEntry

virusav 08.12.2010 22:01

int32 CalculateSimpleValue(SpellEffectIndex eff) const { return EffectBasePoints[eff] + int32(1); }

Lordronn 10.12.2010 12:16

Добавьте пожалуйста поиск по pereodic. Очень бы помогло искать аура с определенным временем тика

Konctantin 10.12.2010 13:22

Зачем? он и так там есть,
Выбираете колонку EffectAmplitude в дополнительном фильтре, задаете ей значение и будет вам счастье.

LordJZ 20.03.2011 23:37

Пришел мне на почту патчик, добавляющий тип сравнения для Advanced Filter. Спасибо автору!

https://github.com/LordJZ/spellwork_...b2949b5afac91a

Скомпиленный бинарник где и всегда.

Lordronn 28.03.2011 22:23

Изменение функции проверки подключения на булевую. Замена некоторых foreach на LINQ
И замена некоторых простых условий на выражение ? :
Код:

--- /SpellWork/DataBase/MySQLConnect.cs        Sun Mar 20 14:33:12 2011
+++ /SpellWork/DataBase/MySQLConnect.cs        Mon Mar 28 20:42:46 2011
@@ -11,7 +11,6 @@
        private static MySqlConnection _conn;
        private static MySqlCommand _command;
 
-        public static bool Connected { get; private set; }
        public static List<string> Dropped = new List<string>();
        public static List<SpellProcEventEntry> SpellProcEvent = new List<SpellProcEventEntry>();
 
@@ -31,9 +30,7 @@
        private static String GetSpellName(uint id)
        {
            if (DBC.Spell.ContainsKey(id))
-            {
                return DBC.Spell[id].SpellNameRank;
-            }
            else
            {
                Dropped.Add(String.Format("DELETE FROM `spell_proc_event` WHERE `entry` IN ({0});\r\n", id.ToUInt32()));
@@ -158,24 +155,21 @@
            return items;
        }
 
-        public static void TestConnect()
+        public static bool Connected()
        {
            if (!Settings.Default.UseDbConnect)
-            {
-                Connected = false;
-                return;
-            }
+                return false;
 
            try
            {
                _conn = new MySqlConnection(ConnectionString);
                _conn.Open();
-                _conn.Close();
-                Connected = true;
+                _conn.Close();
+                return true;
            }
-            catch
-            {
-                Connected = false;
+            catch
+            {
+                return false;
            }
        }
    }

Код:

--- /SpellWork/Extensions/LinqExtensions.cs        Sun Mar 20 14:33:12 2011
+++ /SpellWork/Extensions/LinqExtensions.cs        Mon Mar 28 20:50:57 2011
@@ -1,4 +1,5 @@
-using System;
+using System;
+using System.Linq;
 using System.Reflection;
 
 namespace SpellWork
@@ -40,52 +41,17 @@
                    return Compare(basicValue.ToUlong(), val.ToUlong(), compareType);
                case "String":
                    return Compare(basicValue.ToString(), val.ToString(), compareType);
-                case @"UInt32[]":
-                    {
-                        foreach (uint el in (uint[])basicValue)
-                        {
-                            if (Compare(el.ToUInt32(), val.ToUInt32(), compareType))
-                                return true;
-                        }
-                        return false;
-                    }
-                case @"Int32[]":
-                    {
-                        foreach (int el in (int[])basicValue)
-                        {
-                            if (Compare(el.ToInt32(), val.ToInt32(), compareType))
-                                return true;
-                        }
-                        return false;
-                    }
-                case @"Single[]":
-                    {
-                        foreach (float el in (float[])basicValue)
-                        {
-                            if (Compare(el.ToFloat(), val.ToFloat(), compareType))
-                                return true;
-                        }
-                        return false;
-                    }
-                case @"UInt64[]":
-                    {
-                        foreach (ulong el in (ulong[])basicValue)
-                        {
-                            if (Compare(el.ToUlong(), val.ToUlong(), compareType))
-                                return true;
-                        }
-                        return false;
-                    }
-                case @"String[]":
-                    {
-                        foreach (uint el in (uint[])basicValue)
-                        {
-                            if (Compare(el.ToString(), val.ToString(), compareType))
-                                return true;
-                        }
-                        return false;
-                    }
-                // todo: more
+                case @"UInt32[]":
+                        return ((uint[]) basicValue).Any(el => Compare(el.ToUInt32(), val.ToUInt32(), compareType));
+                case @"Int32[]":
+                        return ((int[]) basicValue).Any(el => Compare(el.ToInt32(), val.ToInt32(), compareType));
+                case @"Single[]":
+                        return ((float[]) basicValue).Any(el => Compare(el.ToFloat(), val.ToFloat(), compareType));
+                case @"UInt64[]":
+                        return ((ulong[]) basicValue).Any(el => Compare(el.ToUlong(), val.ToUlong(), compareType));
+                case @"String[]":
+                        return ((uint[]) basicValue).Any(el => Compare(el.ToString(), val.ToString(), compareType));
+                    // todo: more
                default: return false;
            }
        }

Код:

--- /SpellWork/Spell/SpellCompare.cs        Sun Mar 20 14:33:12 2011
+++ /SpellWork/Spell/SpellCompare.cs        Mon Mar 28 20:54:03 2011
@@ -35,20 +35,9 @@
                rtb1.Select(pos - str.Length - 1, pos - 1);
 
                if (rtb2.Find(str, RichTextBoxFinds.WholeWord) != -1)
-                {
-                    if (str.ContainsText(words))
-                    {
-                        rtb1.SelectionBackColor = rtb1.BackColor;
-                    }
-                    else
-                    {
-                        rtb1.SelectionBackColor = Color.Cyan;
-                    }
-                }
+                    rtb1.SelectionBackColor = str.ContainsText(words) ? rtb1.BackColor : Color.Cyan;
                else
-                {
                    rtb1.SelectionBackColor = Color.Salmon;
-                }
            }
 
            pos = 0;
@@ -58,20 +47,9 @@
                rtb2.Select(pos - str.Length - 1, pos - 1);
 
                if (rtb1.Find(str, RichTextBoxFinds.WholeWord) != -1)
-                {
-                    if (str.ContainsText(words))
-                    {
-                        rtb2.SelectionBackColor = rtb2.BackColor;
-                    }
-                    else
-                    {
-                        rtb2.SelectionBackColor = Color.Cyan;
-                    }
-                }
+                    rtb2.SelectionBackColor = str.ContainsText(words) ? rtb2.BackColor : Color.Cyan;
                else
-                {
                    rtb2.SelectionBackColor = Color.Salmon;
-                }
            }
        }
    }

Код:

--- /SpellWork/Spell/SpellInfo.cs        Sun Mar 20 14:33:12 2011
+++ /SpellWork/Spell/SpellInfo.cs        Mon Mar 28 20:44:21 2011
@@ -445,7 +445,7 @@
 
        private void AppendItemInfo()
        {
-            if (!MySQLConnect.Connected)
+            if (!MySQLConnect.Connected())
                return;
           
            var items = from  item in DBC.ItemTemplate

--- /SpellWork/Forms/FormMain.cs        Sun Mar 20 14:33:12 2011
+++ /SpellWork/Forms/FormMain.cs        Mon Mar 28 20:44:30 2011
@@ -90,9 +90,7 @@
 
        private void ConnStatus()
        {
-            MySQLConnect.TestConnect();
-
-            if (MySQLConnect.Connected)
+            if (MySQLConnect.Connected())
            {
                _dbConnect.Text = "Connection is successfully";
                _dbConnect.ForeColor = Color.Green;
@@ -108,9 +106,7 @@
 
        private void _Connected_Click(object sender, EventArgs e)
        {
-            MySQLConnect.TestConnect();
-
-            if (MySQLConnect.Connected)
+            if (MySQLConnect.Connected())
                MessageBox.Show("Connection is successfully!", "MySQL Connections!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                MessageBox.Show("Connection is failed!", "ERROR!", MessageBoxButtons.OK, MessageBoxIcon.Error);
@@ -477,7 +473,7 @@
 
        private void SqlToBase_Click(object sender, EventArgs e)
        {
-            if (MySQLConnect.Connected)
+            if (MySQLConnect.Connected())
                MySQLConnect.Insert(_rtbSqlLog.Text);
            else
                MessageBox.Show("Can't connect to database!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
@@ -531,7 +527,7 @@
 
        private void Select_Click(object sender, EventArgs e)
        {
-            if (!MySQLConnect.Connected)
+            if (!MySQLConnect.Connected())
            {
                MessageBox.Show("Can't connect to database!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
@@ -586,7 +582,7 @@
 
            _rtbSqlLog.AppendText(comment + "\r\n" + drop + "\r\n" + insert + "\r\n\r\n");
            _rtbSqlLog.ColorizeCode();
-            if (MySQLConnect.Connected)
+            if (MySQLConnect.Connected())
                MySQLConnect.Insert(drop + insert);
 
            ((Button)sender).Enabled = false;

--- /SpellWork/Forms/FormSettings.cs        Sun Mar 20 14:33:12 2011
+++ /SpellWork/Forms/FormSettings.cs        Mon Mar 28 20:44:28 2011
@@ -31,11 +31,9 @@
            Settings.Default.Db_mangos = _tbBase.Text;
            Settings.Default.UseDbConnect = _cbUseDBConnect.Checked;
 
-            MySQLConnect.TestConnect();
-           
            if (((Button)sender).Text != "Save")
            {
-                if (MySQLConnect.Connected)
+                if (MySQLConnect.Connected())
                {
                    MessageBox.Show("Connection is successfully!", "MySQL Connections!",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);


TOM_RUS 28.03.2011 22:35

Ну тогда уж надо было делать Connected() свойством, а не методом
Код:

public static bool Connected
{
    get
    {
        // insert code here
    }
}


Konctantin 29.03.2011 01:53

По поводу LINQ, их вообще надо прибить, а использовать обычные циклы for, так как LINQ работают в 3-4 раза медленней чем обычные циклы.
foreach - работает в 1,5 раза медленней чем for

Йоха 29.03.2011 12:02

Цитата:

Сообщение от Konctantin (Сообщение 20480)
По поводу LINQ, их вообще надо прибить, а использовать обычные циклы for, так как LINQ работают в 3-4 раза медленней чем обычные циклы.
foreach - работает в 1,5 раза медленней чем for

На rsdn.ru был эпичный флейм на эту тему, по тестам в некоторых частных случаях LINQ медленнее нэйтивного кода раз в 100 или что-то вроде этого (могу наврать давно читал).
Но! как всегда у каждой медали есть обратная сторона. Инструменты подобные LINQ сокращают время написания программ и если быстродействие не критично то почему бы и не использовать.

Konctantin 29.03.2011 12:16

Ну в нашем случае, это скорость работы фильтров, и скорость тут имеет значение.

LordJZ 05.04.2011 18:02

Добавил поддержку SpellDifficulty.dbc, немного переработал типы сравнения Advanced Filter. Теперь AndStrict — это строгая проверка установленности указаных битов на 1, а And проверяет на хотя бы один установленный бит.

Последние бинарники для версии 3.3.5а как всегда в том же месте:
https://github.com/LordJZ/spellwork_.../SpellWork.exe
https://github.com/LordJZ/spellwork_...MySql.Data.dll

LordJZ 05.04.2011 18:19

Также обновлена века 400 (работает с 4.0.3—4.0.6 билдами). Есть какие-либо предложения по ней?

https://github.com/LordJZ/spellwork_.../SpellWork.exe
https://github.com/LordJZ/spellwork_...MySql.Data.dll

TOM_RUS 07.04.2011 11:52

Цитата:

Сообщение от Konctantin (Сообщение 20480)
По поводу LINQ, их вообще надо прибить, а использовать обычные циклы for, так как LINQ работают в 3-4 раза медленней чем обычные циклы.
foreach - работает в 1,5 раза медленней чем for

Цитата:

Сообщение от Eric Lippert
It's not that "LINQ is slow" per se, rather, it is that most LINQ scenarios create some kind of collection pressure, either by allocating an iterator, or because Join is building a table behind the scenes, or whatever. We have large, long-lived, complex data structures and we're concerned about triggering too many collections.

http://channel9.msdn.com/Shows/Check...77386510000000

Chameleon 10.04.2011 11:49

Я пофиксил несколько мелких багов в Spell Proc Event странице. Коммит. Там в форке еще несколько мелких фиксов, не знаю приглянется что или нет.

Lordronn 30.04.2011 11:07

Версия 4.0.6
С некоторой вероятности при выборе спелла из списка(прок закладка) ловим краш

К примеру: спелл 16492

Код:

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
  at SpellWork.Extensions.ContainsElement(UInt32[] array, UInt32[] value)
  at SpellWork.ProcInfo..ctor(TreeView familyTree, SpellFamilyNames spellfamily)
  at SpellWork.FormMain._tvFamilyTree_SelectedIndexChanged(Object sender, EventArgs e)
  at System.Windows.Forms.ComboBox.OnSelectedIndexChanged(EventArgs e)
  at System.Windows.Forms.ComboBox.set_SelectedIndex(Int32 value)
  at System.Windows.Forms.ListControl.set_SelectedValue(Object value)
  at SpellWork.FormMain.SetProcAtribute(SpellEntry spell)
  at SpellWork.FormMain._lvProcSpellList_SelectedIndexChanged(Object sender, EventArgs e)
  at System.Windows.Forms.ListView.OnSelectedIndexChanged(EventArgs e)
  at System.Windows.Forms.ListView.WmReflectNotify(Message& m)
  at System.Windows.Forms.ListView.WndProc(Message& m)
  at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
  at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


AlexBolotsin 10.05.2011 03:28

Вложений: 2
Я немного поковырял SpellWork и добавил кнопочку загрузки dbc из любой папки. Несколько криво вышло, да и много лишнего, но лично я доволен тем, что я достиг задачи.

Буду рад заняться Spell Work'ом. И наконец-то таки сделать его всеядным по отношению к DBC разных версий.
Знаю, что такое делегаты и ивенты. Начал изучать LINQ, но пока лишь => - освоен. Слаб в работе с WinForms, но учусь быстро :)

ЗЫ В планах сделать порт под Mono.

Аддед: вышел чуточку некропостинг, но вдруг автору всё ещё интересен этот проект.

Added: можно поглазеть что вышло на релизе.

AlexBolotsin 10.05.2011 12:51

Таки удалось не только запустить готовый exe под моно, но и скомпилить, однако появилась проблема с System.Deployment. Думаю для повышения навыка переписать GUI под wxWidget или gtk

Konctantin 10.05.2011 13:00

учите WPF здался вам этот МОНО...

AlexBolotsin 10.05.2011 19:00

К великому сожалению он не сильно кроссплатформенный. Да, запустить можно, но это не его заслуга, а скорее 3rd party разрабов.

Можете сравнивать это с полит. убеждениями :)

Да и что там этот WPF, написать более менее годный интерфейс я смогу, а в GUI-dev я не стремлюсь.

Sid 10.05.2011 22:34

:) Qt в плане кроссплатформенности лучше)
http://ru-mangos.ru/showthread.php?t=3501 конечно не фонтан функционал как у Константина, но основное есть и собирается под разными платформами :)

Burned 18.06.2011 09:30

Есть интересный спел Running Wild (рассовая способность у воргенов бегать).
http://www.wowhead.com/spell=87840
На вовхеде показывает 3 эффекта, а в спелворке всего лишь 2. Где здесь загвоздка? :)

Использовал этот бинарник http://ru-mangos.ru/showpost.php?p=20665&postcount=146

Warlord123 27.09.2011 19:21

Вложений: 1
Добработал SpellWork до загрузки спелов из таблицы spell_dbc.
Исходники и двоичный файл лежат по ссылке https://github.com/Warlord123/spellwork_cs .

Кроме того, обновлены атрибуты заклинаний, названия аур.
Увеличил объем информации в аурах и спелл-эффектах.
Добавлена информация о стоимости заклинания в рунах ДК.
Добавлена загрузка о зоне, в которой можно использовать заклинание (Взято из репозитория Shauren).

В планах сделать формирование sql-запросов изменных заклинаний в таблицу spell_dbc . Пока программа формирует
данные для функционала DBC_Patcher http://ru-mangos.ru/showthread.php?t=1544 .
Редактор \ эксплорер спелов находиться на последней закладке программы.

Во вложенном файле скомпилированная программа.

Warlord123 28.09.2011 18:47

Вложений: 1
Добавил формирование SQL запроса в таблицу .
Исходники программы находятся в репозитории из моего последнего сообщения, скомпилированный исполняемы файл в архиве.

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

Сопоставление идет по именам столбцов при загрузке из таблицы spell_dbc и при формировании SQL. Изменение структуры таблицы изменяет число загружаемых\сохраняемых столбцов.

Об ошибках прошу сообщать сюда :).

Warlord123 02.10.2011 21:40

Вложений: 1
Поправил enum CombatRating и отображение механик для ауры SPELL_AURA_MECHANIC_IMMUNITY_MASK.
В первом приближении починил загрузку данных о проках спелов во вкладку Spell Prc Event.
Формируемый этой вкладкой sql запрос теперь тоже правильно формирует данные spell proc event для первого эффекта заклинания.

Обновленный исполняемый файл содержиться во вложении.

Warlord123 05.10.2011 18:50

Вложений: 1
Обновил немного атрибутов спелов.
Поправил загрузку имен спелов из spell_dbc.
Часть повторяющегося кода вынес в методы.

Warlord123 11.10.2011 22:18

Вложений: 1
Добавил расшифровку SpellInterruptFlags флагов и возможность вводить в поля шестнадцатеричные числа в формате 0x....


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

ru-mangos.ru - Русское сообщество MaNGOS