Bonjour,J'avais commencé une nouvelle classe il y a un moment mais au vu du travail qu'il y a et le peu d'aide que j'ai eu, le projet a été mis en pause (pour ne pas dire abandonner...).Voilà quelques screens et infos sur ce que j'avais fait.Ecran de création de personnage modifié :[center:egq1qfme][/center:egq1qfme]Séléction des personnages (pet affiché) :[center:egq1qfme][/center:egq1qfme]En jeu : [center:egq1qfme][/center:egq1qfme]Les différentes spé du Spiritualiste :[center:egq1qfme][/center:egq1qfme]Et les arbres de talents, prêts à être remplis :[center:egq1qfme][/center:egq1qfme]La map de départ, petite ville enneigée :[center:egq1qfme][/center:egq1qfme]Une vue de dessus avec juste le terrain et les bâtiments :http://www.model-changing.com/images/pr ... map1.0.pngQuote from: "Khira"Le spiritualiste est une classe pouvant invoquer un esprit qui prendra la forme que le Spiritualiste veut. Avant de pouvoir prendre une certain forme le spiritualiste devra réaliser une ou plusieurs quêtes, et celà pour toutes les invocations.Il y aura 3 niveaux d'invocation pour chaque forme :- Esprit mineur- Esprit- Esprit majeurLa force n'est pas déterminé par la puissance de l'esprit mais par la forme qu'il prend (et donc la puissance/volonté du Spiritualiste).Il y aura plusieurs formes, la plupart (toutes ?) sont des formes élémentaires :- Vent- Terre- Eau- Feu- Ombre (?)Un seul esprit pourra être invoqué en même temps. Chaque élément devrais avoir des capacités spécifiques.Quote from: "Khira"Le SPiritualiste possède 3 domaines de spécialisation :- Arcanes- [Plan] spirituel- [Plan] astralLes Sorts des Arcanes :Source principale des sorts à dégâts. Contrairement au Mage, les sorts offensifs directs seront majoritairement de type Arcanes. On peut garder quelques sorts d'invocations (Gemmes de mana ?).Les Sorts Spirituels :Principalement les invocations d'esprits.Les Sorts Astrals :Les Sort de soins, d'amélioration et de debuff. Principalement pour le soutien en groupe.Voici, en gros, à quoi sont destinées les différentes spécialisations. Ce sujet sera surement mis à jour au fil du temps.Quote from: "Khira"Fichiers modifiés :Core :- src/game/CharacterHandler.cpp- src/game/Level3.cpp- src/game/ObjectMgr.cpp- src/game/Player.cpp- src/game/SharedDefines.h- src/game/SpellEffects.cpp- src/game/StatSystem.cpp- src/game/Unit.cppVoici le patch MPQ contenant les quelques sorts, maps, modifs pour la classe, etc... : patch-NewClassSpirit.MPQVoici les fichiers qui ont été modifiés/ajoutés :Code: [Select]DBFilesClientAreaTable.dbcDBFilesClientCharBaseInfo.dbcDBFilesClientCharStartOutfit.dbcDBFilesClientChrClasses.dbcDBFilesClientCreatureDisplayInfo.dbcDBFilesClientCreatureDisplayInfoExtra.dbcDBFilesClientGameObjectDisplayInfo.dbcDBFilesClientgtChanceToMeleeCrit.dbcDBFilesClientgtChanceToMeleeCritBase.dbcDBFilesClientgtChanceToSpellCrit.dbcDBFilesClientgtChanceToSpellCritBase.dbcDBFilesClientgtOCTRegenHP.dbcDBFilesClientgtRegenHPPerSpt.dbcDBFilesClientgtRegenMPPerSpt.dbcDBFilesClientItem.dbcDBFilesClientItemDisplayInfo.dbcDBFilesClientSkillLine.dbcDBFilesClientSkillLineAbility.dbcDBFilesClientSkillRaceClassInfo.dbcDBFilesClientSpell.dbcDBFilesClientTalentTab.dbcDBFilesClientWorldSafeLocs.dbcInterfaceFrameXMLConstants.luaInterfaceGluesCharacterCreateUI-CharacterCreate-Classes.blpInterfaceGlueXMLCharacterCreate.luaInterfaceGlueXMLCharacterCreate.xmlInterfaceGlueXMLGlueStrings.luaInterfaceTalentFrameSpiritArcane-BottomLeft.blpInterfaceTalentFrameSpiritArcane-BottomRight.blpInterfaceTalentFrameSpiritArcane-TopLeft.blpInterfaceTalentFrameSpiritArcane-TopRight.blpInterfaceTalentFrameSpiritAstral-BottomLeft.blpInterfaceTalentFrameSpiritAstral-BottomRight.blpInterfaceTalentFrameSpiritAstral-TopLeft.blpInterfaceTalentFrameSpiritAstral-TopRight.blpInterfaceTalentFrameSpiritSpiritual-BottomLeft.blpInterfaceTalentFrameSpiritSpiritual-BottomRight.blpInterfaceTalentFrameSpiritSpiritual-TopLeft.blpInterfaceTalentFrameSpiritSpiritual-TopRight.blpInterfaceTargetingFrameUI-Classes-Circles.blpItemObjectComponentsShoulderShoulder_Robe_B_03Black.blpItemTextureComponentsTorsoLowerTextureTabard_A_Esperita_chest_TL_F.blpItemTextureComponentsTorsoLowerTextureTabard_A_Esperita_chest_TL_M.blpItemTextureComponentsTorsoUpperTextureTabard_A_Esperita_chest_TU_F.blpItemTextureComponentsTorsoUpperTextureTabard_A_Esperita_chest_TU_M.blpTexturesBakedNpcTexturesCreatureDisplayExtra-25000.blpWorldMapsKalimdorKalimdor_38_17.adtWorldMapsKalimdorKalimdor_38_18.adtWorldMapsKalimdorKalimdor_39_17.adtWorldMapsKalimdorKalimdor_39_18.adtVoici la modification du core (MaNGOS), c'est le - presque - minimum. La classe est accessible avec les mêmes conditions qu'un chevalier de la mort (départ lvl 55, etc..) :Code: [Select]diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cppindex ae7e3f1..722cc3c 100644--- a/src/game/CharacterHandler.cpp+++ b/src/game/CharacterHandler.cpp@@ -319,7 +319,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) // speedup check for heroic class disabled case uint32 heroic_free_slots = sWorld.getConfig(CONFIG_UINT32_HEROIC_CHARACTERS_PER_REALM);- if(heroic_free_slots == 0 && GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)+ if(heroic_free_slots == 0 && GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT)) { data << (uint8)CHAR_CREATE_UNIQUE_CLASS_LIMIT; SendPacket( &data );@@ -328,7 +328,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) // speedup check for heroic class disabled case uint32 req_level_for_heroic = sWorld.getConfig(CONFIG_UINT32_MIN_LEVEL_FOR_HEROIC_CHARACTER_CREATING);- if(GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT && req_level_for_heroic > sWorld.getConfig(CONFIG_UINT32_MAX_PLAYER_LEVEL))+ if(GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) && req_level_for_heroic > sWorld.getConfig(CONFIG_UINT32_MAX_PLAYER_LEVEL)) { data << (uint8)CHAR_CREATE_LEVEL_REQUIREMENT; SendPacket( &data );@@ -343,10 +343,10 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) // if 0 then allowed creating without any characters bool have_req_level_for_heroic = (req_level_for_heroic==0); - if(!AllowTwoSideAccounts || skipCinematics == CINEMATICS_SKIP_SAME_RACE || class_ == CLASS_DEATH_KNIGHT)+ if(!AllowTwoSideAccounts || skipCinematics == CINEMATICS_SKIP_SAME_RACE || class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) { QueryResult *result2 = CharacterDatabase.PQuery("SELECT level,race,class FROM characters WHERE account = '%u' %s",- GetAccountId(), (skipCinematics == CINEMATICS_SKIP_SAME_RACE || class_ == CLASS_DEATH_KNIGHT) ? "" : "LIMIT 1");+ GetAccountId(), (skipCinematics == CINEMATICS_SKIP_SAME_RACE || class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) ? "" : "LIMIT 1"); if(result2) { uint32 team_= Player::TeamForRace(race_);@@ -354,10 +354,10 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) Field* field = result2->Fetch(); uint8 acc_race = field[1].GetUInt32(); - if(GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)+ if(GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT)) { uint8 acc_class = field[2].GetUInt32();- if(acc_class == CLASS_DEATH_KNIGHT)+ if(acc_class == CLASS_DEATH_KNIGHT || acc_class == CLASS_SPIRIT) { if(heroic_free_slots > 0) --heroic_free_slots;@@ -398,7 +398,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) // search same race for cinematic or same class if need // TODO: check if cinematic already shown? (already logged in?; cinematic field)- while ((skipCinematics == CINEMATICS_SKIP_SAME_RACE && !have_same_race) || class_ == CLASS_DEATH_KNIGHT)+ while ((skipCinematics == CINEMATICS_SKIP_SAME_RACE && !have_same_race) || class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) { if(!result2->NextRow()) break;@@ -409,10 +409,10 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) if(!have_same_race) have_same_race = race_ == acc_race; - if(GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)+ if(GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT)) { uint8 acc_class = field[2].GetUInt32();- if(acc_class == CLASS_DEATH_KNIGHT)+ if(acc_class == CLASS_DEATH_KNIGHT || acc_class == CLASS_SPIRIT) { if(heroic_free_slots > 0) --heroic_free_slots;@@ -438,7 +438,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) } } - if(GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT && !have_req_level_for_heroic)+ if(GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) && !have_req_level_for_heroic) { data << (uint8)CHAR_CREATE_LEVEL_REQUIREMENT; SendPacket( &data );diff --git a/src/game/Level3.cpp b/src/game/Level3.cppindex 927348e..cf7d562 100644--- a/src/game/Level3.cpp+++ b/src/game/Level3.cpp@@ -4468,7 +4468,7 @@ bool ChatHandler::HandleResetLevelCommand(const char * args) return false; // set starting level- uint32 start_level = target->getClass() != CLASS_DEATH_KNIGHT+ uint32 start_level = (target->getClass() != CLASS_DEATH_KNIGHT && target->getClass() != CLASS_SPIRIT) ? sWorld.getConfig(CONFIG_UINT32_START_PLAYER_LEVEL) : sWorld.getConfig(CONFIG_UINT32_START_HEROIC_PLAYER_LEVEL); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cppindex 50394de..f07d8be 100644--- a/src/game/ObjectMgr.cpp+++ b/src/game/ObjectMgr.cpp@@ -3006,6 +3006,13 @@ void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, Play info->stats[STAT_INTELLECT] += (lvl > 33 ? 2: (lvl > 2 ? 1: 0)); info->stats[STAT_SPIRIT] += (lvl > 38 ? 2: (lvl > 3 ? 1: 0)); break;+ case CLASS_SPIRIT:+ info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl%2) ? 1: 0);+ info->stats[STAT_STAMINA] += (lvl > 5 ? 1: 0);+ info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl%2) ? 1: 0);+ info->stats[STAT_INTELLECT] += (lvl > 24 ? 2: (lvl > 1 ? 1: 0));+ info->stats[STAT_SPIRIT] += (lvl > 33 ? 2: (lvl > 2 ? 1: 0));+ break; case CLASS_DRUID: info->stats[STAT_STRENGTH] += (lvl > 38 ? 2: (lvl > 6 && (lvl%2) ? 1: 0)); info->stats[STAT_STAMINA] += (lvl > 32 ? 2: (lvl > 4 ? 1: 0));diff --git a/src/game/Player.cpp b/src/game/Player.cppindex dfa19ac..cf624b2 100644--- a/src/game/Player.cpp+++ b/src/game/Player.cpp@@ -619,7 +619,7 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8 SetUInt32Value( PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0 ); // set starting level- uint32 start_level = getClass() != CLASS_DEATH_KNIGHT+ uint32 start_level = (getClass() != CLASS_DEATH_KNIGHT && getClass() != CLASS_SPIRIT) ? sWorld.getConfig(CONFIG_UINT32_START_PLAYER_LEVEL) : sWorld.getConfig(CONFIG_UINT32_START_HEROIC_PLAYER_LEVEL); @@ -1517,7 +1517,7 @@ bool Player::BuildEnumData( QueryResult * result, WorldPacket * p_data ) uint32 petFamily = 0; // show pet at selection character in character list only for non-ghost character- if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (pClass == CLASS_WARLOCK || pClass == CLASS_HUNTER || pClass == CLASS_DEATH_KNIGHT))+ if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (pClass == CLASS_WARLOCK || pClass == CLASS_HUNTER || pClass == CLASS_DEATH_KNIGHT || pClass == CLASS_SPIRIT)) { uint32 entry = fields[16].GetUInt32(); CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(entry);@@ -4984,7 +4984,7 @@ float Player::GetDodgeFromAgility() 0.0167f, // Shaman 0.034575f, // Mage 0.02011f, // Warlock- 0.0f, // ??+ 0.034575f, // Spiritualist -0.0187f // Druid }; // Crit/agility to dodge/agility coefficient multipliers@@ -4998,7 +4998,7 @@ float Player::GetDodgeFromAgility() 1.0f, // Shaman 1.0f, // Mage 1.0f, // Warlock- 0.0f, // ??+ 1.0f, // Spiritualist 1.7f // Druid }; @@ -20909,7 +20909,7 @@ uint32 Player::CalculateTalentsPoints() const { uint32 base_talent = getLevel() < 10 ? 0 : getLevel()-9; - if(getClass() != CLASS_DEATH_KNIGHT)+ if(getClass() != CLASS_DEATH_KNIGHT && getClass() != CLASS_SPIRIT) return uint32(base_talent * sWorld.getConfig(CONFIG_FLOAT_RATE_TALENT)); uint32 talentPointsForLevel = getLevel() < 56 ? 0 : getLevel() - 55;@@ -21013,6 +21013,29 @@ void Player::_LoadSkills(QueryResult *result) } // special settings+ if(getClass()==CLASS_SPIRIT)+ {+ uint32 base_level = std::min(getLevel(),sWorld.getConfig (CONFIG_UINT32_START_HEROIC_PLAYER_LEVEL));+ if(base_level < 1)+ base_level = 1;+ uint32 base_skill = (base_level-1)*5;+ if(base_skill < 1)+ base_skill = 1;++ if(GetPureSkillValue (SKILL_FIRST_AID) < base_skill)+ SetSkill(SKILL_FIRST_AID, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_DEFENSE) < base_skill)+ SetSkill(SKILL_DEFENSE, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_WANDS) < base_skill)+ SetSkill(SKILL_WANDS, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_DAGGERS) < base_skill)+ SetSkill(SKILL_DAGGERS, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_2H_MACES) < base_skill)+ SetSkill(SKILL_2H_MACES, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_UNARMED) < base_skill)+ SetSkill(SKILL_UNARMED, base_skill, base_skill);+ }+ if(getClass()==CLASS_DEATH_KNIGHT) { uint32 base_level = std::min(getLevel(),sWorld.getConfig (CONFIG_UINT32_START_HEROIC_PLAYER_LEVEL));diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.hindex d1d792f..91a2bd5 100644--- a/src/game/SharedDefines.h+++ b/src/game/SharedDefines.h@@ -78,7 +78,7 @@ enum Classes CLASS_SHAMAN = 7, CLASS_MAGE = 8, CLASS_WARLOCK = 9,- // CLASS_UNK2 = 10,unused+ CLASS_SPIRIT = 10, CLASS_DRUID = 11, }; @@ -89,11 +89,11 @@ enum Classes ((1<<(CLASS_WARRIOR-1))|(1<<(CLASS_PALADIN-1))|(1<<(CLASS_HUNTER-1))| (1<<(CLASS_ROGUE-1)) |(1<<(CLASS_PRIEST-1)) |(1<<(CLASS_SHAMAN-1))| (1<<(CLASS_MAGE-1)) |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) | - (1<<(CLASS_DEATH_KNIGHT-1)) )+ (1<<(CLASS_SPIRIT-1)) |(1<<(CLASS_DEATH_KNIGHT-1)) ) #define CLASSMASK_ALL_CREATURES ((1<<(CLASS_WARRIOR-1)) | (1<<(CLASS_PALADIN-1)) | (1<<(CLASS_ROGUE-1)) | (1<<(CLASS_MAGE-1)) ) -#define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1)))+#define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_SPIRIT-1))) #define PLAYER_MAX_BATTLEGROUND_QUEUES 2 diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cppindex 9c8a1a8..36362d0 100644--- a/src/game/SpellEffects.cpp+++ b/src/game/SpellEffects.cpp@@ -1615,8 +1615,9 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx) break; case CLASS_PRIEST: case CLASS_MAGE:+ case CLASS_SPIRIT: case CLASS_WARLOCK:- spell_id = 67016; // SPD for Priests, Mages, Warlocks+ spell_id = 67016; // SPD for Priests, Mages, Warlocks, Spiritualists break; case CLASS_SHAMAN: // random (SPD, AP)diff --git a/src/game/StatSystem.cpp b/src/game/StatSystem.cppindex 9440217..cfa420c 100644--- a/src/game/StatSystem.cpp+++ b/src/game/StatSystem.cpp@@ -340,6 +340,7 @@ void Player::UpdateAttackPowerAndDamage(bool ranged ) case CLASS_MAGE: val2 = GetStat(STAT_STRENGTH) - 10.0f; break; case CLASS_PRIEST: val2 = GetStat(STAT_STRENGTH) - 10.0f; break; case CLASS_WARLOCK: val2 = GetStat(STAT_STRENGTH) - 10.0f; break;+ case CLASS_SPIRIT: val2 = GetStat(STAT_STRENGTH) - 10.0f; break; } } @@ -881,7 +882,7 @@ bool Pet::UpdateStats(Stats stat) //warlock's and mage's pets gain 30% of owner's intellect else if ( stat == STAT_INTELLECT && getPetType() == SUMMON_PET ) {- if(owner && (owner->getClass() == CLASS_WARLOCK || owner->getClass() == CLASS_MAGE) )+ if(owner && (owner->getClass() == CLASS_WARLOCK || owner->getClass() == CLASS_MAGE || owner->getClass() == CLASS_SPIRIT) ) value += float(owner->GetStat(stat)) * 0.3f; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cppindex 680567f..36d2951 100644--- a/src/game/Unit.cpp+++ b/src/game/Unit.cpp@@ -1512,6 +1512,7 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da case CLASS_SHAMAN: case CLASS_PRIEST: case CLASS_MAGE:+ case CLASS_SPIRIT: case CLASS_WARLOCK: case CLASS_DRUID: baseLowEnd -= 0.7f;@@ -5311,6 +5312,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu case CLASS_PRIEST: // 40999,41002,41005,41009,41011,41406,41409 case CLASS_SHAMAN: // 40999,41002,41005,41009,41011,41406,41409 case CLASS_MAGE: // 40999,41002,41005,41009,41011,41406,41409+ case CLASS_SPIRIT: // 40999,41002,41005,41009,41011,41406,41409 case CLASS_WARLOCK: // 40999,41002,41005,41009,41011,41406,41409 { uint32 RandomSpell[]={40999,41002,41005,41009,41011,41406,41409};@@ -6365,6 +6367,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d. break; case CLASS_MAGE:+ case CLASS_SPIRIT: case CLASS_WARLOCK: triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d. break;@@ -6585,6 +6588,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d. break; case CLASS_MAGE:+ case CLASS_SPIRIT: case CLASS_WARLOCK: triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d. break;Voici également un tableau open office avec ce qui était prévu pour les sorts :Liste des sortsEt enfin quelques requêtes en vrac :Code: [Select]-- CimetièreDELETE FROM `game_graveyard_zone` WHERE id = 18000;INSERT INTO `game_graveyard_zone` (`id`, `ghost_zone`, `faction`) VALUES (1800, 6000, 0);-- TextINSERT INTO npc_text (ID, text0_0) VALUES (40000, 'Je ne peux vous entraîner, retounez à Esperita, quelqu''un pourra s''occuper de vous.');-- Start PositionDELETE FROM `playercreateinfo` WHERE `class` = 10;INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`) VALUES (1, 10, 1, 6000, 7245.368164, -3390.419922, 1006.4);INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`) VALUES (6, 10, 1, 6000, 7245.368164, -3390.419922, 1006.4);INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`) VALUES (10, 10, 1, 6000, 7245.368164, -3390.419922, 1006.4);INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`) VALUES (11, 10, 1, 6000, 7245.368164, -3390.419922, 1006.4);-- SpellChain/* Connaissances astrales */DELETE FROM `spell_chain` WHERE `spell_id` IN (85000, 85001, 85002, 85003, 85004, 85005);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85000, 0, 85000, 1, 0),(85001, 85000, 85000, 2, 0),(85002, 85001, 85000, 3, 0),(85003, 85002, 85000, 4, 0),(85004, 85003, 85000, 5, 0),(85005, 85004, 85000, 6, 0);/* Invocations (mineure -> normale -> majeure) *//* Vent */DELETE FROM `spell_chain` WHERE `spell_id` IN (85006, 85007, 85008);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85006, 0, 85006, 1, 0),(85007, 85006, 85006, 2, 0),(85008, 85007, 85006, 3, 0);/* Terre */DELETE FROM `spell_chain` WHERE `spell_id` IN (85009, 85010, 85011);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85009, 0, 85009, 1, 0),(85010, 85009, 85009, 2, 0),(85011, 85010, 85009, 3, 0);/* Eau */DELETE FROM `spell_chain` WHERE `spell_id` IN (85012, 85013, 85014);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85012, 0, 85012, 1, 0),(85013, 85012, 85012, 2, 0),(85014, 85013, 85012, 3, 0);/* Feu */DELETE FROM `spell_chain` WHERE `spell_id` IN (85015, 85016, 85017);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85015, 0, 85015, 1, 0),(85016, 85015, 85015, 2, 0),(85017, 85016, 85015, 3, 0);/* Ombre */DELETE FROM `spell_chain` WHERE `spell_id` IN (85018, 85019, 85020);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85018, 0, 85018, 1, 0),(85019, 85018, 85018, 2, 0),(85020, 85019, 85018, 3, 0);/* Fin invocations *//* Projections arcaniques */DELETE FROM `spell_chain` WHERE `spell_id` IN (85028, 85030, 85032, 85034, 85036, 85038);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85028, 0, 85028, 1, 0),(85030, 85028, 85028, 2, 0),(85032, 85030, 85028, 3, 0),(85034, 85032, 85028, 4, 0),(85036, 85034, 85028, 5, 0),(85038, 85036, 85028, 6, 0);/* Fouet arcanique */DELETE FROM `spell_chain` WHERE `spell_id` IN (85040, 85041, 85042, 85043);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85040, 0, 85040, 1, 0),(85041, 85040, 85040, 2, 0),(85042, 85041, 85040, 3, 0),(85043, 85042, 85040, 4, 0);-- SpellTargetPositionDELETE FROM `spell_target_position` WHERE `id` = 85006;INSERT INTO `spell_target_position` (`id`, `target_map`, `target_position_x`, `target_position_y`, `target_position_z`, `target_orientation`) VALUES (85006, 1, 7231.335938, -3366.374512, 1006.4, 4.46);Code: [Select]-- Portail EsperitaDELETE FROM `gameobject_template` WHERE `entry` = 500000;DELETE FROM `locales_gameobject` WHERE `entry` = 500000;INSERT INTO `locales_gameobject` (`entry`, `name_loc2`) VALUES (500000, 'Portail vers Esperita');INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `data0`, `data2`, `data3`) VALUES (500000, 22, 4394, 'Portal to Esperita', 85027, 1, 1);/** Spell : Invocation d'un esprit du feu majeur*//* SQL */DELETE FROM `creature_template` WHERE `entry` = 60002;INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid_A`, `modelid_A2`, `modelid_H`, `modelid_H2`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `minhealth`, `maxhealth`, `minmana`, `maxmana`, `armor`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `PetSpellDataId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `unk16`, `unk17`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`) VALUES (60002, 0, 0, 0, 0, 0, 25680, 0, 25680, 0, 'Esprit du feu majeur', '', '', 0, 1, 1, 1, 1, 0, 0, 3396, 35, 35, 0, 1.1, 1.14286, 1, 0, 300, 400, 0, 1000, 3.5, 2000, 0, 1, 0, 0, 0, 0, 0, 0, 0, 69, 101, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 1, 3, 0.25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8388624, 0, '');/** Spell : Appel des esprits mineurs*//* SQL */DELETE FROM `creature_template` WHERE `entry` = 60001; INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid_A`, `modelid_A2`, `modelid_H`, `modelid_H2`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `minhealth`, `maxhealth`, `minmana`, `maxmana`, `armor`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `PetSpellDataId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `unk16`, `unk17`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`) VALUES (60001, 0, 0, 0, 0, 0, 20594, 1824, 20594, 1824, 'Esprit mineur ', '', '', 0, 1, 1, 1, 1, 0, 0, 7, 35, 35, 0, 1, 1.14286, 1, 0, 2, 2, 0, 24, 1, 2000, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 3, 0.301265, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8388624, 0, '');/** Spell : Invocation d'un esprit du vent mineur*//* SQL */DELETE FROM `creature_template` WHERE `entry` = 60000;INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid_A`, `modelid_A2`, `modelid_H`, `modelid_H2`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `minhealth`, `maxhealth`, `minmana`, `maxmana`, `armor`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `PetSpellDataId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `unk16`, `unk17`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`) VALUES (60000, 0, 0, 0, 0, 0, 18245, 0, 18245, 0, 'Esprit du vent mineur', '', '', 0, 1, 1, 1, 1, 0, 0, 3396, 35, 35, 0, 1.1, 1.14286, 1, 0, 300, 400, 0, 1000, 3.5, 2000, 0, 1, 0, 0, 0, 0, 0, 0, 0, 69, 101, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 1, 3, 0.25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8388624, 0, '');Il en manque pas mal mais ça va être à vous de compléter ^^".Au niveau des sorts, il y a ceci (tiré des dbcs donc pas top le format) :85000, Connaissances astrales, Rang 1, Augmente l'Intelligence de la cible de $s1 pendant $d.,85001, Connaissances astrales, Rang 2, Augmente l'Intelligence de la cible de $s1 pendant $d.,85002, Connaissances astrales, Rang 3, Augmente l'Intelligence de la cible de $s1 pendant $d.,85003, Connaissances astrales, Rang 4, Augmente l'Intelligence de la cible de $s1 pendant $d.,85004, Connaissances astrales, Rang 5, Augmente l'Intelligence de la cible de $s1 pendant $d.,85005, Connaissances astrales, Rang 6, Augmente l'Intelligence de la cible de $s1 pendant $d.,85055, Invocation d'un esprit du vent mineur, Rang 1, Invoque $s1 $lEsprit du vent mineur:Esprits du vent mineurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85068, Invocation d'un esprit du vent, Rang 2, Invoque $s1 $lEsprit du vent:Esprits du vent; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85078, Invocation d'un esprit du vent majeur, Rang 3, Invoque $s1 $lEsprit du vent majeur:Esprits du vent majeurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85058, Invocation d'un esprit de le terre mineur, Rang 1, Invoque $s1 $lEsprit de le terre mineur:Esprits de le terre mineurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85010, Invocation d'un esprit de le terre, Rang 2, Invoque $s1 $lEsprit de le terre:Esprits de le terre; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85011, Invocation d'un esprit de le terre majeur, Rang 3, Invoque $s1 $lEsprit de le terre majeur:Esprits de le terre majeurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85012, Invocation d'un esprit de l'eau mineur, Rang 1, Invoque $s1 $lEsprit de l'eau mineur:Esprits de l'eau mineurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85013, Invocation d'un esprit de l'eau, Rang 2, Invoque $s1 $lEsprit de l'eau:Esprits de l'eau; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85014, Invocation d'un esprit de l'eau majeur, Rang 3, Invoque $s1 $lEsprit de l'eau majeur:Esprits de l'eau majeurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85015, Invocation d'un esprit du feu mineur, Rang 1, Invoque $s1 $lEsprit du feu mineur:Esprits du feu mineurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85016, Invocation d'un esprit du feu, Rang 2, Invoque $s1 $lEsprit du feu:Esprits du feu; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85017, Invocation d'un esprit du feu majeur, Rang 3, Invoque $s1 $lEsprit du feu majeur:Esprits du feu majeurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85018, Invocation d'un esprit de l'ombre mineur, Rang 1, Invoque $s1 $lEsprit de l'ombre mineur:Esprits de l'ombre mineurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85019, Invocation d'un esprit de l'ombre, Rang 2, Invoque $s1 $lEsprit de l'ombre:Esprits de l'ombre; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85020, Invocation d'un esprit de l'ombre majeur, Rang 3, Invoque $s1 $lEsprit de l'ombre majeur:Esprits de l'ombre majeurs; pour accompagner le lanceur de sorts. Dure jusqu'au renvoi.,85021, Appel des esprits mineurs, Rang 1, Fait appel à de nombreux esprits mineurs vous aidant à combattre., Invocation d'esprits.,85022, Appel des esprits mineurs, Fait appel à de nombreux esprits mineurs vous aidant à combattre.,85023, Appel des esprits, Rang 2, Fait appel à de nombreux esprits vous aidant à combattre., Invocation d'esprits.,85024, Appel des esprits, Fait appel à de nombreux esprits vous aidant à combattre.,85025, Monde des esprits, Vous transporte dans le monde des esprits pendant 3 minutes., Vous êtes dans le monde des esprits.,85026, Portail : Esperita, Crée un portail qui téléporte les membres du groupe qui l'empruntent à Esperita.,85027, Effet portail : Esperita,85028, Projections arcaniques, Rang 1, Lance des projectiles des arcanes sur l'ennemi et lui inflige $10274s1 points de dégâts des Arcanes toutes les $10212t2 sec. pendant $10212d.,85029, Projections arcaniques, Rang 1, Lance des projectiles des arcanes sur l'ennemi et lui inflige $10274s1 points de dégâts des Arcanes toutes les $10212t2 sec. pendant $10212d.,85030, Projections arcaniques, Rang 2, Lance des projectiles des arcanes sur l'ennemi et lui inflige $25346s1 points de dégâts des Arcanes toutes les $25345t2 sec. pendant $25345d.,85031, Projections arcaniques, Rang 2, Lance des projectiles des arcanes sur l'ennemi et lui inflige $25346s1 points de dégâts des Arcanes toutes les $25345t2 sec. pendant $25345d.,85032, Projections arcaniques, Rang 3, Lance des projectiles des arcanes sur l'ennemi et lui inflige $27076s1 points de dégâts des Arcanes toutes les $t2 sec. pendant $d.,85033, Projections arcaniques, Rang 3, Lance des projectiles des arcanes sur l'ennemi et lui inflige $27076s1 points de dégâts des Arcanes toutes les $27075t2 sec. pendant $27075d.,85034, Projections arcaniques, Rang 4, Lance des projectiles des arcanes sur l'ennemi et lui inflige $38703s1 points de dégâts des Arcanes toutes les $t2 sec. pendant $d.,85035, Projections arcaniques, Rang 4, Lance des projectiles des arcanes sur l'ennemi et lui inflige $38703s1 points de dégâts des Arcanes toutes les $38704t2 sec. pendant $38704d.,85036, Projections arcaniques, Rang 5, Lance des projectiles des arcanes sur l'ennemi et lui inflige $42844s1 points de dégâts des Arcanes toutes les $t2 sec. pendant $d.,85037, Projections arcaniques, Rang 5, Lance des projectiles des arcanes sur l'ennemi et lui inflige $42844s1 points de dégâts des Arcanes toutes les $42843t2 sec. pendant $42843d.,85038, Projections arcaniques, Rang 6, Lance des projectiles des arcanes sur l'ennemi et lui inflige $42845s1 points de dégâts des Arcanes toutes les $t2 sec. pendant $d.,85039, Projections arcaniques, Rang 6, Lance des projectiles des arcanes sur l'ennemi et lui inflige $42845s1 points de dégâts des Arcanes toutes les $42846t2 sec. pendant $42846d.,85040, Fouet arcanique, Rang 1, Attaque l'esprit de la cible avec l'énergie des Arcanes. Inflige ${$m3*3} points de dégâts des Arcanes en $d. et réduit la vitesse de la cible de $s2%., Vitesse de déplacement réduite.,85041, Fouet arcanique, Rang 2, Attaque l'esprit de la cible avec l'énergie des Arcanes. Inflige ${$m3*3} points de dégâts des Arcanes en $d. et réduit la vitesse de la cible de $s2%., Vitesse de déplacement réduite.,85042, Fouet arcanique, Rang 3, Attaque l'esprit de la cible avec l'énergie des Arcanes. Inflige ${$m3*3} points de dégâts des Arcanes en $d. et réduit la vitesse de la cible de $s2%., Vitesse de déplacement réduite.,85043, Fouet arcanique, Rang 4, Attaque l'esprit de la cible avec l'énergie des Arcanes. Inflige ${$m3*3} points de dégâts des Arcanes en $d. et réduit la vitesse de la cible de $s2%., Vitesse de déplacement réduite.,85044, Invocation d'un esprit du vent mineur, Rang 1,85045, Invocation d'un esprit du vent, Rang 2,85046, Invocation d'un esprit du vent majeur, Rang 3,85047, Invocation d'un esprit de le terre mineur, Rang 1,85048, Invocation d'un esprit de le terre, Rang 2,85049, Invocation d'un esprit de le terre majeur, Rang 3,85050, Invocation d'un esprit de l'eau mineur, Rang 1,85051, Invocation d'un esprit de l'eau, Rang 2,85052, Invocation d'un esprit de l'eau majeur, Rang 3,85053, Invocation d'un esprit du feu mineur, Rang 1,85054, Invocation d'un esprit du feu, Rang 2,85055, Invocation d'un esprit du feu majeur, Rang 3,85056, Invocation d'un esprit de l'ombre mineur, Rang 1,85057, Invocation d'un esprit de l'ombre, Rang 2,85058, Invocation d'un esprit de l'ombre majeur, Rang 3,85059, Appel des esprits mineurs, Rang 1,85060, Appel des esprits, Rang 2,85061, Monde des esprits, Changement de monde,85062, Portail : Esperita, Portail de téléportation,
Le spiritualiste est une classe pouvant invoquer un esprit qui prendra la forme que le Spiritualiste veut. Avant de pouvoir prendre une certain forme le spiritualiste devra réaliser une ou plusieurs quêtes, et celà pour toutes les invocations.Il y aura 3 niveaux d'invocation pour chaque forme :- Esprit mineur- Esprit- Esprit majeurLa force n'est pas déterminé par la puissance de l'esprit mais par la forme qu'il prend (et donc la puissance/volonté du Spiritualiste).Il y aura plusieurs formes, la plupart (toutes ?) sont des formes élémentaires :- Vent- Terre- Eau- Feu- Ombre (?)Un seul esprit pourra être invoqué en même temps. Chaque élément devrais avoir des capacités spécifiques.
Le SPiritualiste possède 3 domaines de spécialisation :- Arcanes- [Plan] spirituel- [Plan] astralLes Sorts des Arcanes :Source principale des sorts à dégâts. Contrairement au Mage, les sorts offensifs directs seront majoritairement de type Arcanes. On peut garder quelques sorts d'invocations (Gemmes de mana ?).Les Sorts Spirituels :Principalement les invocations d'esprits.Les Sorts Astrals :Les Sort de soins, d'amélioration et de debuff. Principalement pour le soutien en groupe.Voici, en gros, à quoi sont destinées les différentes spécialisations. Ce sujet sera surement mis à jour au fil du temps.
Fichiers modifiés :Core :- src/game/CharacterHandler.cpp- src/game/Level3.cpp- src/game/ObjectMgr.cpp- src/game/Player.cpp- src/game/SharedDefines.h- src/game/SpellEffects.cpp- src/game/StatSystem.cpp- src/game/Unit.cpp
DBFilesClientAreaTable.dbcDBFilesClientCharBaseInfo.dbcDBFilesClientCharStartOutfit.dbcDBFilesClientChrClasses.dbcDBFilesClientCreatureDisplayInfo.dbcDBFilesClientCreatureDisplayInfoExtra.dbcDBFilesClientGameObjectDisplayInfo.dbcDBFilesClientgtChanceToMeleeCrit.dbcDBFilesClientgtChanceToMeleeCritBase.dbcDBFilesClientgtChanceToSpellCrit.dbcDBFilesClientgtChanceToSpellCritBase.dbcDBFilesClientgtOCTRegenHP.dbcDBFilesClientgtRegenHPPerSpt.dbcDBFilesClientgtRegenMPPerSpt.dbcDBFilesClientItem.dbcDBFilesClientItemDisplayInfo.dbcDBFilesClientSkillLine.dbcDBFilesClientSkillLineAbility.dbcDBFilesClientSkillRaceClassInfo.dbcDBFilesClientSpell.dbcDBFilesClientTalentTab.dbcDBFilesClientWorldSafeLocs.dbcInterfaceFrameXMLConstants.luaInterfaceGluesCharacterCreateUI-CharacterCreate-Classes.blpInterfaceGlueXMLCharacterCreate.luaInterfaceGlueXMLCharacterCreate.xmlInterfaceGlueXMLGlueStrings.luaInterfaceTalentFrameSpiritArcane-BottomLeft.blpInterfaceTalentFrameSpiritArcane-BottomRight.blpInterfaceTalentFrameSpiritArcane-TopLeft.blpInterfaceTalentFrameSpiritArcane-TopRight.blpInterfaceTalentFrameSpiritAstral-BottomLeft.blpInterfaceTalentFrameSpiritAstral-BottomRight.blpInterfaceTalentFrameSpiritAstral-TopLeft.blpInterfaceTalentFrameSpiritAstral-TopRight.blpInterfaceTalentFrameSpiritSpiritual-BottomLeft.blpInterfaceTalentFrameSpiritSpiritual-BottomRight.blpInterfaceTalentFrameSpiritSpiritual-TopLeft.blpInterfaceTalentFrameSpiritSpiritual-TopRight.blpInterfaceTargetingFrameUI-Classes-Circles.blpItemObjectComponentsShoulderShoulder_Robe_B_03Black.blpItemTextureComponentsTorsoLowerTextureTabard_A_Esperita_chest_TL_F.blpItemTextureComponentsTorsoLowerTextureTabard_A_Esperita_chest_TL_M.blpItemTextureComponentsTorsoUpperTextureTabard_A_Esperita_chest_TU_F.blpItemTextureComponentsTorsoUpperTextureTabard_A_Esperita_chest_TU_M.blpTexturesBakedNpcTexturesCreatureDisplayExtra-25000.blpWorldMapsKalimdorKalimdor_38_17.adtWorldMapsKalimdorKalimdor_38_18.adtWorldMapsKalimdorKalimdor_39_17.adtWorldMapsKalimdorKalimdor_39_18.adt
diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cppindex ae7e3f1..722cc3c 100644--- a/src/game/CharacterHandler.cpp+++ b/src/game/CharacterHandler.cpp@@ -319,7 +319,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) // speedup check for heroic class disabled case uint32 heroic_free_slots = sWorld.getConfig(CONFIG_UINT32_HEROIC_CHARACTERS_PER_REALM);- if(heroic_free_slots == 0 && GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)+ if(heroic_free_slots == 0 && GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT)) { data << (uint8)CHAR_CREATE_UNIQUE_CLASS_LIMIT; SendPacket( &data );@@ -328,7 +328,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) // speedup check for heroic class disabled case uint32 req_level_for_heroic = sWorld.getConfig(CONFIG_UINT32_MIN_LEVEL_FOR_HEROIC_CHARACTER_CREATING);- if(GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT && req_level_for_heroic > sWorld.getConfig(CONFIG_UINT32_MAX_PLAYER_LEVEL))+ if(GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) && req_level_for_heroic > sWorld.getConfig(CONFIG_UINT32_MAX_PLAYER_LEVEL)) { data << (uint8)CHAR_CREATE_LEVEL_REQUIREMENT; SendPacket( &data );@@ -343,10 +343,10 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) // if 0 then allowed creating without any characters bool have_req_level_for_heroic = (req_level_for_heroic==0); - if(!AllowTwoSideAccounts || skipCinematics == CINEMATICS_SKIP_SAME_RACE || class_ == CLASS_DEATH_KNIGHT)+ if(!AllowTwoSideAccounts || skipCinematics == CINEMATICS_SKIP_SAME_RACE || class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) { QueryResult *result2 = CharacterDatabase.PQuery("SELECT level,race,class FROM characters WHERE account = '%u' %s",- GetAccountId(), (skipCinematics == CINEMATICS_SKIP_SAME_RACE || class_ == CLASS_DEATH_KNIGHT) ? "" : "LIMIT 1");+ GetAccountId(), (skipCinematics == CINEMATICS_SKIP_SAME_RACE || class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) ? "" : "LIMIT 1"); if(result2) { uint32 team_= Player::TeamForRace(race_);@@ -354,10 +354,10 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) Field* field = result2->Fetch(); uint8 acc_race = field[1].GetUInt32(); - if(GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)+ if(GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT)) { uint8 acc_class = field[2].GetUInt32();- if(acc_class == CLASS_DEATH_KNIGHT)+ if(acc_class == CLASS_DEATH_KNIGHT || acc_class == CLASS_SPIRIT) { if(heroic_free_slots > 0) --heroic_free_slots;@@ -398,7 +398,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) // search same race for cinematic or same class if need // TODO: check if cinematic already shown? (already logged in?; cinematic field)- while ((skipCinematics == CINEMATICS_SKIP_SAME_RACE && !have_same_race) || class_ == CLASS_DEATH_KNIGHT)+ while ((skipCinematics == CINEMATICS_SKIP_SAME_RACE && !have_same_race) || class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) { if(!result2->NextRow()) break;@@ -409,10 +409,10 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) if(!have_same_race) have_same_race = race_ == acc_race; - if(GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)+ if(GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT)) { uint8 acc_class = field[2].GetUInt32();- if(acc_class == CLASS_DEATH_KNIGHT)+ if(acc_class == CLASS_DEATH_KNIGHT || acc_class == CLASS_SPIRIT) { if(heroic_free_slots > 0) --heroic_free_slots;@@ -438,7 +438,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) } } - if(GetSecurity() == SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT && !have_req_level_for_heroic)+ if(GetSecurity() == SEC_PLAYER && (class_ == CLASS_DEATH_KNIGHT || class_ == CLASS_SPIRIT) && !have_req_level_for_heroic) { data << (uint8)CHAR_CREATE_LEVEL_REQUIREMENT; SendPacket( &data );diff --git a/src/game/Level3.cpp b/src/game/Level3.cppindex 927348e..cf7d562 100644--- a/src/game/Level3.cpp+++ b/src/game/Level3.cpp@@ -4468,7 +4468,7 @@ bool ChatHandler::HandleResetLevelCommand(const char * args) return false; // set starting level- uint32 start_level = target->getClass() != CLASS_DEATH_KNIGHT+ uint32 start_level = (target->getClass() != CLASS_DEATH_KNIGHT && target->getClass() != CLASS_SPIRIT) ? sWorld.getConfig(CONFIG_UINT32_START_PLAYER_LEVEL) : sWorld.getConfig(CONFIG_UINT32_START_HEROIC_PLAYER_LEVEL); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cppindex 50394de..f07d8be 100644--- a/src/game/ObjectMgr.cpp+++ b/src/game/ObjectMgr.cpp@@ -3006,6 +3006,13 @@ void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, Play info->stats[STAT_INTELLECT] += (lvl > 33 ? 2: (lvl > 2 ? 1: 0)); info->stats[STAT_SPIRIT] += (lvl > 38 ? 2: (lvl > 3 ? 1: 0)); break;+ case CLASS_SPIRIT:+ info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl%2) ? 1: 0);+ info->stats[STAT_STAMINA] += (lvl > 5 ? 1: 0);+ info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl%2) ? 1: 0);+ info->stats[STAT_INTELLECT] += (lvl > 24 ? 2: (lvl > 1 ? 1: 0));+ info->stats[STAT_SPIRIT] += (lvl > 33 ? 2: (lvl > 2 ? 1: 0));+ break; case CLASS_DRUID: info->stats[STAT_STRENGTH] += (lvl > 38 ? 2: (lvl > 6 && (lvl%2) ? 1: 0)); info->stats[STAT_STAMINA] += (lvl > 32 ? 2: (lvl > 4 ? 1: 0));diff --git a/src/game/Player.cpp b/src/game/Player.cppindex dfa19ac..cf624b2 100644--- a/src/game/Player.cpp+++ b/src/game/Player.cpp@@ -619,7 +619,7 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8 SetUInt32Value( PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0 ); // set starting level- uint32 start_level = getClass() != CLASS_DEATH_KNIGHT+ uint32 start_level = (getClass() != CLASS_DEATH_KNIGHT && getClass() != CLASS_SPIRIT) ? sWorld.getConfig(CONFIG_UINT32_START_PLAYER_LEVEL) : sWorld.getConfig(CONFIG_UINT32_START_HEROIC_PLAYER_LEVEL); @@ -1517,7 +1517,7 @@ bool Player::BuildEnumData( QueryResult * result, WorldPacket * p_data ) uint32 petFamily = 0; // show pet at selection character in character list only for non-ghost character- if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (pClass == CLASS_WARLOCK || pClass == CLASS_HUNTER || pClass == CLASS_DEATH_KNIGHT))+ if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (pClass == CLASS_WARLOCK || pClass == CLASS_HUNTER || pClass == CLASS_DEATH_KNIGHT || pClass == CLASS_SPIRIT)) { uint32 entry = fields[16].GetUInt32(); CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(entry);@@ -4984,7 +4984,7 @@ float Player::GetDodgeFromAgility() 0.0167f, // Shaman 0.034575f, // Mage 0.02011f, // Warlock- 0.0f, // ??+ 0.034575f, // Spiritualist -0.0187f // Druid }; // Crit/agility to dodge/agility coefficient multipliers@@ -4998,7 +4998,7 @@ float Player::GetDodgeFromAgility() 1.0f, // Shaman 1.0f, // Mage 1.0f, // Warlock- 0.0f, // ??+ 1.0f, // Spiritualist 1.7f // Druid }; @@ -20909,7 +20909,7 @@ uint32 Player::CalculateTalentsPoints() const { uint32 base_talent = getLevel() < 10 ? 0 : getLevel()-9; - if(getClass() != CLASS_DEATH_KNIGHT)+ if(getClass() != CLASS_DEATH_KNIGHT && getClass() != CLASS_SPIRIT) return uint32(base_talent * sWorld.getConfig(CONFIG_FLOAT_RATE_TALENT)); uint32 talentPointsForLevel = getLevel() < 56 ? 0 : getLevel() - 55;@@ -21013,6 +21013,29 @@ void Player::_LoadSkills(QueryResult *result) } // special settings+ if(getClass()==CLASS_SPIRIT)+ {+ uint32 base_level = std::min(getLevel(),sWorld.getConfig (CONFIG_UINT32_START_HEROIC_PLAYER_LEVEL));+ if(base_level < 1)+ base_level = 1;+ uint32 base_skill = (base_level-1)*5;+ if(base_skill < 1)+ base_skill = 1;++ if(GetPureSkillValue (SKILL_FIRST_AID) < base_skill)+ SetSkill(SKILL_FIRST_AID, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_DEFENSE) < base_skill)+ SetSkill(SKILL_DEFENSE, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_WANDS) < base_skill)+ SetSkill(SKILL_WANDS, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_DAGGERS) < base_skill)+ SetSkill(SKILL_DAGGERS, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_2H_MACES) < base_skill)+ SetSkill(SKILL_2H_MACES, base_skill, base_skill);+ if(GetPureSkillValue (SKILL_UNARMED) < base_skill)+ SetSkill(SKILL_UNARMED, base_skill, base_skill);+ }+ if(getClass()==CLASS_DEATH_KNIGHT) { uint32 base_level = std::min(getLevel(),sWorld.getConfig (CONFIG_UINT32_START_HEROIC_PLAYER_LEVEL));diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.hindex d1d792f..91a2bd5 100644--- a/src/game/SharedDefines.h+++ b/src/game/SharedDefines.h@@ -78,7 +78,7 @@ enum Classes CLASS_SHAMAN = 7, CLASS_MAGE = 8, CLASS_WARLOCK = 9,- // CLASS_UNK2 = 10,unused+ CLASS_SPIRIT = 10, CLASS_DRUID = 11, }; @@ -89,11 +89,11 @@ enum Classes ((1<<(CLASS_WARRIOR-1))|(1<<(CLASS_PALADIN-1))|(1<<(CLASS_HUNTER-1))| (1<<(CLASS_ROGUE-1)) |(1<<(CLASS_PRIEST-1)) |(1<<(CLASS_SHAMAN-1))| (1<<(CLASS_MAGE-1)) |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) | - (1<<(CLASS_DEATH_KNIGHT-1)) )+ (1<<(CLASS_SPIRIT-1)) |(1<<(CLASS_DEATH_KNIGHT-1)) ) #define CLASSMASK_ALL_CREATURES ((1<<(CLASS_WARRIOR-1)) | (1<<(CLASS_PALADIN-1)) | (1<<(CLASS_ROGUE-1)) | (1<<(CLASS_MAGE-1)) ) -#define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1)))+#define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_SPIRIT-1))) #define PLAYER_MAX_BATTLEGROUND_QUEUES 2 diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cppindex 9c8a1a8..36362d0 100644--- a/src/game/SpellEffects.cpp+++ b/src/game/SpellEffects.cpp@@ -1615,8 +1615,9 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx) break; case CLASS_PRIEST: case CLASS_MAGE:+ case CLASS_SPIRIT: case CLASS_WARLOCK:- spell_id = 67016; // SPD for Priests, Mages, Warlocks+ spell_id = 67016; // SPD for Priests, Mages, Warlocks, Spiritualists break; case CLASS_SHAMAN: // random (SPD, AP)diff --git a/src/game/StatSystem.cpp b/src/game/StatSystem.cppindex 9440217..cfa420c 100644--- a/src/game/StatSystem.cpp+++ b/src/game/StatSystem.cpp@@ -340,6 +340,7 @@ void Player::UpdateAttackPowerAndDamage(bool ranged ) case CLASS_MAGE: val2 = GetStat(STAT_STRENGTH) - 10.0f; break; case CLASS_PRIEST: val2 = GetStat(STAT_STRENGTH) - 10.0f; break; case CLASS_WARLOCK: val2 = GetStat(STAT_STRENGTH) - 10.0f; break;+ case CLASS_SPIRIT: val2 = GetStat(STAT_STRENGTH) - 10.0f; break; } } @@ -881,7 +882,7 @@ bool Pet::UpdateStats(Stats stat) //warlock's and mage's pets gain 30% of owner's intellect else if ( stat == STAT_INTELLECT && getPetType() == SUMMON_PET ) {- if(owner && (owner->getClass() == CLASS_WARLOCK || owner->getClass() == CLASS_MAGE) )+ if(owner && (owner->getClass() == CLASS_WARLOCK || owner->getClass() == CLASS_MAGE || owner->getClass() == CLASS_SPIRIT) ) value += float(owner->GetStat(stat)) * 0.3f; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cppindex 680567f..36d2951 100644--- a/src/game/Unit.cpp+++ b/src/game/Unit.cpp@@ -1512,6 +1512,7 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da case CLASS_SHAMAN: case CLASS_PRIEST: case CLASS_MAGE:+ case CLASS_SPIRIT: case CLASS_WARLOCK: case CLASS_DRUID: baseLowEnd -= 0.7f;@@ -5311,6 +5312,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu case CLASS_PRIEST: // 40999,41002,41005,41009,41011,41406,41409 case CLASS_SHAMAN: // 40999,41002,41005,41009,41011,41406,41409 case CLASS_MAGE: // 40999,41002,41005,41009,41011,41406,41409+ case CLASS_SPIRIT: // 40999,41002,41005,41009,41011,41406,41409 case CLASS_WARLOCK: // 40999,41002,41005,41009,41011,41406,41409 { uint32 RandomSpell[]={40999,41002,41005,41009,41011,41406,41409};@@ -6365,6 +6367,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d. break; case CLASS_MAGE:+ case CLASS_SPIRIT: case CLASS_WARLOCK: triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d. break;@@ -6585,6 +6588,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d. break; case CLASS_MAGE:+ case CLASS_SPIRIT: case CLASS_WARLOCK: triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d. break;
-- CimetièreDELETE FROM `game_graveyard_zone` WHERE id = 18000;INSERT INTO `game_graveyard_zone` (`id`, `ghost_zone`, `faction`) VALUES (1800, 6000, 0);-- TextINSERT INTO npc_text (ID, text0_0) VALUES (40000, 'Je ne peux vous entraîner, retounez à Esperita, quelqu''un pourra s''occuper de vous.');-- Start PositionDELETE FROM `playercreateinfo` WHERE `class` = 10;INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`) VALUES (1, 10, 1, 6000, 7245.368164, -3390.419922, 1006.4);INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`) VALUES (6, 10, 1, 6000, 7245.368164, -3390.419922, 1006.4);INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`) VALUES (10, 10, 1, 6000, 7245.368164, -3390.419922, 1006.4);INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`) VALUES (11, 10, 1, 6000, 7245.368164, -3390.419922, 1006.4);-- SpellChain/* Connaissances astrales */DELETE FROM `spell_chain` WHERE `spell_id` IN (85000, 85001, 85002, 85003, 85004, 85005);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85000, 0, 85000, 1, 0),(85001, 85000, 85000, 2, 0),(85002, 85001, 85000, 3, 0),(85003, 85002, 85000, 4, 0),(85004, 85003, 85000, 5, 0),(85005, 85004, 85000, 6, 0);/* Invocations (mineure -> normale -> majeure) *//* Vent */DELETE FROM `spell_chain` WHERE `spell_id` IN (85006, 85007, 85008);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85006, 0, 85006, 1, 0),(85007, 85006, 85006, 2, 0),(85008, 85007, 85006, 3, 0);/* Terre */DELETE FROM `spell_chain` WHERE `spell_id` IN (85009, 85010, 85011);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85009, 0, 85009, 1, 0),(85010, 85009, 85009, 2, 0),(85011, 85010, 85009, 3, 0);/* Eau */DELETE FROM `spell_chain` WHERE `spell_id` IN (85012, 85013, 85014);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85012, 0, 85012, 1, 0),(85013, 85012, 85012, 2, 0),(85014, 85013, 85012, 3, 0);/* Feu */DELETE FROM `spell_chain` WHERE `spell_id` IN (85015, 85016, 85017);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85015, 0, 85015, 1, 0),(85016, 85015, 85015, 2, 0),(85017, 85016, 85015, 3, 0);/* Ombre */DELETE FROM `spell_chain` WHERE `spell_id` IN (85018, 85019, 85020);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85018, 0, 85018, 1, 0),(85019, 85018, 85018, 2, 0),(85020, 85019, 85018, 3, 0);/* Fin invocations *//* Projections arcaniques */DELETE FROM `spell_chain` WHERE `spell_id` IN (85028, 85030, 85032, 85034, 85036, 85038);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85028, 0, 85028, 1, 0),(85030, 85028, 85028, 2, 0),(85032, 85030, 85028, 3, 0),(85034, 85032, 85028, 4, 0),(85036, 85034, 85028, 5, 0),(85038, 85036, 85028, 6, 0);/* Fouet arcanique */DELETE FROM `spell_chain` WHERE `spell_id` IN (85040, 85041, 85042, 85043);INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES(85040, 0, 85040, 1, 0),(85041, 85040, 85040, 2, 0),(85042, 85041, 85040, 3, 0),(85043, 85042, 85040, 4, 0);-- SpellTargetPositionDELETE FROM `spell_target_position` WHERE `id` = 85006;INSERT INTO `spell_target_position` (`id`, `target_map`, `target_position_x`, `target_position_y`, `target_position_z`, `target_orientation`) VALUES (85006, 1, 7231.335938, -3366.374512, 1006.4, 4.46);
-- Portail EsperitaDELETE FROM `gameobject_template` WHERE `entry` = 500000;DELETE FROM `locales_gameobject` WHERE `entry` = 500000;INSERT INTO `locales_gameobject` (`entry`, `name_loc2`) VALUES (500000, 'Portail vers Esperita');INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `data0`, `data2`, `data3`) VALUES (500000, 22, 4394, 'Portal to Esperita', 85027, 1, 1);/** Spell : Invocation d'un esprit du feu majeur*//* SQL */DELETE FROM `creature_template` WHERE `entry` = 60002;INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid_A`, `modelid_A2`, `modelid_H`, `modelid_H2`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `minhealth`, `maxhealth`, `minmana`, `maxmana`, `armor`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `PetSpellDataId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `unk16`, `unk17`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`) VALUES (60002, 0, 0, 0, 0, 0, 25680, 0, 25680, 0, 'Esprit du feu majeur', '', '', 0, 1, 1, 1, 1, 0, 0, 3396, 35, 35, 0, 1.1, 1.14286, 1, 0, 300, 400, 0, 1000, 3.5, 2000, 0, 1, 0, 0, 0, 0, 0, 0, 0, 69, 101, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 1, 3, 0.25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8388624, 0, '');/** Spell : Appel des esprits mineurs*//* SQL */DELETE FROM `creature_template` WHERE `entry` = 60001; INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid_A`, `modelid_A2`, `modelid_H`, `modelid_H2`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `minhealth`, `maxhealth`, `minmana`, `maxmana`, `armor`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `PetSpellDataId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `unk16`, `unk17`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`) VALUES (60001, 0, 0, 0, 0, 0, 20594, 1824, 20594, 1824, 'Esprit mineur ', '', '', 0, 1, 1, 1, 1, 0, 0, 7, 35, 35, 0, 1, 1.14286, 1, 0, 2, 2, 0, 24, 1, 2000, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 3, 0.301265, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8388624, 0, '');/** Spell : Invocation d'un esprit du vent mineur*//* SQL */DELETE FROM `creature_template` WHERE `entry` = 60000;INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid_A`, `modelid_A2`, `modelid_H`, `modelid_H2`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `minhealth`, `maxhealth`, `minmana`, `maxmana`, `armor`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `PetSpellDataId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `unk16`, `unk17`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`) VALUES (60000, 0, 0, 0, 0, 0, 18245, 0, 18245, 0, 'Esprit du vent mineur', '', '', 0, 1, 1, 1, 1, 0, 0, 3396, 35, 35, 0, 1.1, 1.14286, 1, 0, 300, 400, 0, 1000, 3.5, 2000, 0, 1, 0, 0, 0, 0, 0, 0, 0, 69, 101, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 1, 3, 0.25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8388624, 0, '');
/console PlayerStatLeftDropDown none/console PlayerStatRightDropDown none/reload
Have you edited all gt*.dbc ?
Hi,It's coeff for each class for 100 levels.Line 1 -> 100 : Class id 1 (lvl 1 to 100)Line 101 -> 200 : Class id 2 (lvl 1 to 100)etc...I just copy/paste numbers from another - similar - class at the right place.Greetings