Вопрос:Ответ Кто такой Фиксер? Фиксер - Сотрудник который исправляет ошибки в Базе данных и Исходниках Ядра. С чего Начинать? Начинать лучше всего с MySQL базы данных языка запросов SQL. Где взять MySQL? Тут В какой программе лучше всего писать запросы? Я предпочитаю SQLyog Enterprise программа платная. Но в интернете куча Crack'ов Как научиться фиксить БД Man-gos? Мануал что за что отвечает в бд ТУТ Есть ли учебник по запросам Mysql? Да есть Скачать Где взять Бд Mangоs? Тут PS чтобы скачать БД и пропатчить до нужной ревизии вам надо зарегистрироваться на форуме YTDB Где взять исходники ядра и как установить сервер(скомпилировать ядро)? В этом форуме все написанно Внимание Ревизия Ядра и ревизия Бд должны быть одинаковыми. Где взять редактор С++? Скачать торрент редактора Borland C++ Builder 6.0 тут
Скачать торрент Visual Studio 2008 тут или тут (любая версия VS) скачать SQLyog
Удачного обучения.
Огромная благодарность за мое обучение и потраченное время людям Navy, Ruzik, Inquisitor, Sergey, Bassabiar.
Сообщение отредактировал Nimlot: 05 September 2012 - 18:11
Я вообще молчу о том, что для компиляции надо использовать MS Visual Studio.
На крайний случай - CMake под каким-нить Cygwin (это на случай если у вас реально заморочка с лицензией)
у меня Microsoft VS 2008
На форуме действет автозамена - нужно чтоб в форуме убрали автозамену слова man-gos - это может сделать любой имеющий доступ в админ центр. Как уберут замену пусть скажут - ссылку отредактирую а пока пишем слово man-gos (без дефиса) в ссылку вместо хачапурей)
PS инкви объедини мой 1 и второй пост про видеоуроки плиз
Сообщение отредактировал Nimlot: 17 June 2011 - 14:39
дак а зачем ссылку на билдер даёшь? у людей между прочим может и не безлимит быть. Чтобы собрать сервер под билдером надо приличненько повозиться, и то я не гарантирую, что всё получится, потому что билдер не очень сильно уважает чистый С++ без их фирменной борландовской VCL + в коде сервера есть очень много всяких специфичных именно для MSVC++ вставок типа зависимостей от COMPILER_MICROSOFT.
С моей точки зрения, если человеку лень зайти на форум разработчиков мастер-ветки, поискать глазами на главной странице ссылку на форум "Установка", а в этом форуме найти в числе трёх верхних прикреплённых тем "Установка под Windows", а затем прочитать тему и начать что-то делать, то какой вообще смысл о чём-то говорить? Я всем желающим "стать фиксером" прямо это и рекомендую. Отличный тест на IQ, адекватность и соответствие запросам. Нормальный человек не будет в ответ на ссылку говорить "да чё ты мне ссылки кидаешь, ты мне исходники давай". Если человеку не хватает заинтересованности/усидчивости/настойчивости/мозгов проделать все описанные выше действия, то, как по мне, ему даже и заводить разговор на эту тему не стоит. И нарочитая занятость наряду с нежеланием элементарно почитать о том, как и что надо сделать - это не признак крутости вовсе. Напомню, на вовжопе сборки в основном делает полуграмотная шпана, которая и по-русски-то писать не может без ошибок, не то что на C++.
Я Интересуюсь программированием с 5 класса где то, именно тогда я решил твердо что буду учиться на программиста. Сейчас я выбираю Так сказать "линию" по которой пойду то есть web или win программирование. Вэб разработка или разработки приложения. Так вот. Для того чтобы Понять что мне нужно - я решил все это попробывать самостоятельно: то есть попраграммировать, по "Web'ить". То есть я начинал с АЗОВ с самого начала и простого переходя к сложному. И на сервере kwinta я заинтересовался фиксерством конкретно с мыслью научиться. И если вы думаете что Мне вот все на блюдечке подали то ошибаетесь. Меня Прежде чем взять в стафф Заставили САМОМУ собрать скомпилировать чистый сервер и дали ссылку на форум разработчиков где я САМ искал где что да как. Скомпилировав первый раз такой сложный проект (раньше компилировал ток калькуляторы да часики да простенькие консольные приложения) моей радости небыло предела - я похвастался Сергею - бывший ядерщик квинты. Он сказал вот теперь пытайся разобраться в коде. Вы не поверите но я уже год как пытаюсь разобраться в коде Ман госа и до сих пор не разобрался. На вопрос почему отвечу просто: я не знаю С++ точнее знаю всего 1% от всего языка пару функций и операторов да конструкцию условий. Классов ваще не знаю. Естественный вывод: НЕ ПЫТАЙТЕСЬ РАЗОБРАТЬСЯ В КОДЕ НЕ ЗНАЯ ЯЗЫКА С++ сначала попробуйте данный язык выучить. PS не путайте С++ с С#. С базой мне оказалось проще: Первый урок мне дал Bassabiar он мне дал ссылку на форум БД и сказал как залить базу в в мою БД. Затем рассказал 4 запроса и что каждый делает. И дал ссылку на утдб описание таблиц. Я начал писать фиксы сначала естественно с ошибками ( да и сейчас ошибки допускаю меня ругал руз за них постоянно).
Все это к чему? Чтобы вы поняли что вам САМИМ надо почитать и научиться если вы хотите научиться фиксить. и начинать лучше с базы: не зная за что отвечает БД нельзя фиксить ядро так как вы в ядре будете искать то что должно быть в БД.
Сообщение отредактировал Nimlot: 19 June 2012 - 22:16
Файт, ты зря насчет Гита негодуешь)
Без него пытаться чтото фиксить Не одному ---> крах.
+ у Гита очень много преимуществ, например:
1)"Есть на Гите довольно таки много всяких неплохих сборок, где есть "вкусные" патчи...и именно через Гит можно полностью отследить весь патч...где что и как добавлялось, без лишней информации..и поставить себе (ну и соотв проверить)"
2)"Именно через Гит удалось быстро перенести все "плюшки" со старого ядра на новое (я повытасткивал все со старого...залил все на серв который скачал у Инкви (с его репозитория на ГИте!) и после от с меня уже стащил ети патчи на уже новое ядро)...тоже самое с Берегом, аренами и ачивками которые я делал"
3)"Аналогично 2 пунку я в свою очередь таскаю на свой репозиторий патчи которые себе ставит Инкви...то есть получается что мы работаем совершенно паралельно...но получаем результат в сумме почти без затруднений (есть "конфликты" то об етом Инкви сам думаю позже расскажет)"
4)"Так же через Гит можно общаться с другими разработчиками...сверятся по каким то вопросам...и тп и тд (ну ет тоже к Инкви в основном...я пока там особо не болтаю)"
5)"с Гита ты можешь скачать ЛЮБОй публичный репозиторий (например сервер хачапуриа) со ВСЕЙ историей изменения и патчей (я например таким образом нашел неплохой Берег, который потом доработал и залил себе)"
Тяк...насчет С++...Ним ты тож сильно преувеличиваешь...если человек более менее знает основы Си, и более менее логически умеет думать, то вполне не сложно там разобратся...все сразу ясен фиг не будет даватся..но понемногу капаясь начинаешь все лучше и лучше вникать...мне вон пару месяцев хватило чтобы начать более менее там ориентироваться (на самом деле Студия тащит сильно))
Все вполне поддается изучению...было бы желание =)
думал куда написать и решил суда вообщем возник вопрос, надеюсь на помощь фиксеров и просто знающих людей
Решил поковыряться в ядре и попробовать починить один спел друида, а конкретно Шипы ( http://ru.wowhead.com/spell=53307 ) и в принципе мне это удалось вот таким образом:
в Unit.cpp в функцию
добавил условие(между красными надписями то что добавил):
Скрытый текст
void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
{
if (damageInfo==0) return;
Unit *pVictim = damageInfo->target;
if(!this || !pVictim)
return;
if (!pVictim->isAlive() || pVictim->IsTaxiFlying() || (pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode()))
return;
//You don't lose health from damage taken from another player while in a sanctuary
//You still see it in the combat log though
if (!IsAllowedDamageInArea(pVictim))
return;
// Hmmmm dont like this emotes client must by self do all animations
if (damageInfo->HitInfo&HITINFO_CRITICALHIT)
pVictim->HandleEmoteCommand(EMOTE_ONESHOT_WOUNDCRITICAL);
if (damageInfo->blocked_amount && damageInfo->TargetState!=VICTIMSTATE_BLOCKS)
pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYSHIELD);
if(damageInfo->TargetState == VICTIMSTATE_PARRY)
{
// Get attack timers
float offtime = float(pVictim->getAttackTimer(OFF_ATTACK));
float basetime = float(pVictim->getAttackTimer(BASE_ATTACK));
// Reduce attack time
if (pVictim->haveOffhandWeapon() && offtime < basetime)
{
float percent20 = pVictim->GetAttackTime(OFF_ATTACK) * 0.20f;
float percent60 = 3.0f * percent20;
if(offtime > percent20 && offtime <= percent60)
{
pVictim->setAttackTimer(OFF_ATTACK, uint32(percent20));
}
else if(offtime > percent60)
{
offtime -= 2.0f * percent20;
pVictim->setAttackTimer(OFF_ATTACK, uint32(offtime));
}
}
else
{
float percent20 = pVictim->GetAttackTime(BASE_ATTACK) * 0.20f;
float percent60 = 3.0f * percent20;
if(basetime > percent20 && basetime <= percent60)
{
pVictim->setAttackTimer(BASE_ATTACK, uint32(percent20));
}
else if(basetime > percent60)
{
basetime -= 2.0f * percent20;
pVictim->setAttackTimer(BASE_ATTACK, uint32(basetime));
}
}
}
// Call default DealDamage
CleanDamage cleanDamage(damageInfo->cleanDamage,damageInfo->attackType,damageInfo->hitOutCome);
DealDamage(pVictim, damageInfo->damage, &cleanDamage, DIRECT_DAMAGE, damageInfo->damageSchoolMask, NULL, durabilityLoss);
// If this is a creature and it attacks from behind it has a probability to daze it's victim
if( (damageInfo->hitOutCome==MELEE_HIT_CRIT || damageInfo->hitOutCome==MELEE_HIT_CRUSHING || damageInfo->hitOutCome==MELEE_HIT_NORMAL || damageInfo->hitOutCome==MELEE_HIT_GLANCING) &&
GetTypeId() != TYPEID_PLAYER && !((Creature*)this)->GetCharmerOrOwnerGuid() && !pVictim->HasInArc(M_PI_F, this) )
{
// -probability is between 0% and 40%
// 20% base chance
float Probability = 20.0f;
//there is a newbie protection, at level 10 just 7% base chance; assuming linear function
if( pVictim->getLevel() < 30 )
Probability = 0.65f*pVictim->getLevel()+0.5f;
uint32 VictimDefense=pVictim->GetDefenseSkillValue();
uint32 AttackerMeleeSkill=GetUnitMeleeSkill();
Probability *= AttackerMeleeSkill/(float)VictimDefense;
if(Probability > 40.0f)
Probability = 40.0f;
if(roll_chance_f(Probability))
CastSpell(pVictim, 1604, true);
}
// If not miss
if (!(damageInfo->HitInfo & HITINFO_MISS))
{
// on weapon hit casts
if(GetTypeId() == TYPEID_PLAYER && pVictim->isAlive())
((Player*)this)->CastItemCombatSpell(pVictim, damageInfo->attackType);
// victim's damage shield
std::set<Aura*> alreadyDone;
AuraList const& vDamageShields = pVictim->GetAurasByType(SPELL_AURA_DAMAGE_SHIELD);
for(AuraList::const_iterator i = vDamageShields.begin(); i != vDamageShields.end();)
{
if (alreadyDone.find(*i) == alreadyDone.end())
{
alreadyDone.insert(*i);
uint32 damage=(*i)->GetModifier()->m_amount;
SpellEntry const *i_spellProto = (*i)->GetSpellProto();
Добавленное условие{
if (i_spellProto && i_spellProto->SpellFamilyName == SPELLFAMILY_DRUID && i_spellProto->SpellFamilyFlags & UI64LIT(0x00000100)) //если шипы
{
uint32 koef_earthandmoon = 0;
damage = (pVictim->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE) * 0.033f) < 0 ? damage : damage +
uint32(pVictim->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE) * 0.033f);//добавляем к базовому значению шипов спд*3,3%(спел бонус)
AuraList const& Brambles = pVictim->GetAurasByType(SPELL_AURA_DUMMY);
for(AuraList::const_iterator itr = Brambles.begin(); itr != Brambles.end(); ++itr)//ищем ауру, увеличивающую урон шипов, от талата "Колючки"
{
if((*itr)->GetSpellProto()->SpellIconID==53)
{
koef_earthandmoon = (*itr)->GetModifier()->m_amount;//если найдена, помещаем в переменную значение бонуса от таланта
break;
}
}
if(koef_earthandmoon !=0 ) //если тал был вкачан и бонус не равен 0
damage +=((damage*koef_earthandmoon)/100.0f); //прибавляем к текущему урону шипов % бонуса от тала "колючки"
//помещаем в переменную значение общего модификатора от аур увеличивающих урон от сил природы
koef_earthandmoon = pVictim->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_SCHOOL_MASK_NATURE);
if(koef_earthandmoon!=0)//если модификатор не равен 0
{
damage+=((damage*koef_earthandmoon)/100.0f);//увеличиваем текущий урон на % модификатора
}
}
}Условие заканчивается
pVictim->DealDamageMods(this,damage,NULL);
uint32 targetHealth = GetHealth();
uint32 overkill = damage > targetHealth ? damage - targetHealth : 0;
WorldPacket data(SMSG_SPELLDAMAGESHIELD,(8+8+4+4+4+4));
data << pVictim->GetObjectGuid();
data << GetObjectGuid();
data << uint32(i_spellProto->Id);
data << uint32(damage); // Damage
data << uint32(overkill); // Overkill
data << uint32(i_spellProto->SchoolMask);
pVictim->SendMessageToSet(&data, true );
pVictim->DealDamage(this, damage, 0, SPELL_DIRECT_DAMAGE, GetSpellSchoolMask(i_spellProto), i_spellProto, true);
i = vDamageShields.begin();
}
else
++i;
}
}
}
И вроде бы все работает, идет прибавка от спд, от аур увеличивающих урон от заклинаний (школы природы) и даже от таланта колючки, увеличивающий урон от шипов на 75% (этот талант никогда неработал), но возникает огромный вопрос, если Шипы висят на другом игроке, скажем на локе, получается прибавка в 3.3% от спд идет от спд лока и модификаторы аур увеличивающих магический урон берутся от того же лока, правильно ли это, или же все это должно браться от друида повесившего шипы, или есть иной вариант?
Если скажем записывать все модификаторы в ауру в момент наложения, тогда получится что урон будет статическим, а для шипов это неуместно(это же не хот, его не поспамишь) Если ли еще какой-то вариант, или хотя бы подскажите где копать? Очень надеюсь на вашу помощь
P.S. я не нашел больше функций где бы обрабалывались ауры типа SPELL_AURA_DAMAGE_SHIELD, получается приписать спд бонус и модификаторы аур нигде больше не получится? Оо