diff options
author | megamage <none@none> | 2008-10-27 10:57:53 -0500 |
---|---|---|
committer | megamage <none@none> | 2008-10-27 10:57:53 -0500 |
commit | 4cbc6f830a833719b7586b333aa8151dab563b60 (patch) | |
tree | 52f783f0c0e4007ec7effdcba91da36dd9ee8a6f /src | |
parent | 1bb16035923b0675b0c239379cd5d64c8310f28b (diff) |
[svn] Fix a compile error about M_PI_2.
Update Felmyst script to test new setActive function.
Fix the bug that priest's fear is unbreakable (dirty hack before find the correct way).
(some unfinished unused content included, just ignore them, will finish them later)
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp | 26 | ||||
-rw-r--r-- | src/game/Object.cpp | 2 | ||||
-rw-r--r-- | src/game/Spell.cpp | 6 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 2 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 142 | ||||
-rw-r--r-- | src/game/SpellMgr.h | 39 | ||||
-rw-r--r-- | src/game/World.cpp | 4 |
7 files changed, 158 insertions, 63 deletions
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp index 018507dc41d..e703b4b6c26 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp @@ -157,15 +157,17 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI Timer[EVENT_BERSERK] = 600000; FlightCount = 0; - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT); m_creature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10); m_creature->SetFloatValue(UNIT_FIELD_COMBATREACH, 10); DespawnSummons(MOB_VAPOR_TRAIL); + m_creature->setActive(false); } void Aggro(Unit *who) { + m_creature->setActive(true); DoZoneInCombat(); m_creature->CastSpell(m_creature, AURA_SUNWELL_RADIANCE, true); m_creature->CastSpell(m_creature, AURA_NOXIOUS_FUMES, true); @@ -282,20 +284,18 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI m_creature->AttackStop(); m_creature->GetMotionMaster()->Clear(false); m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); - m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); + m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT); m_creature->StopMoving(); DoYell(YELL_TAKEOFF, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_TAKEOFF); Timer[EVENT_FLIGHT_SEQUENCE] = 2000; break; case 1: - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX()+1, m_creature->GetPositionY(), m_creature->GetPositionZ()+10); - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); Timer[EVENT_FLIGHT_SEQUENCE] = 0; break; case 2: - if(Player* target = SelectRandomPlayer(50)) + if(Player* target = SelectRandomPlayer(150)) { Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000); if(Vapor) @@ -311,7 +311,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI case 3: DespawnSummons(MOB_VAPOR_TRAIL); //m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support - if(Player* target = SelectRandomPlayer(50)) + if(Player* target = SelectRandomPlayer(150)) { //target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000); @@ -330,15 +330,13 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI Timer[EVENT_FLIGHT_SEQUENCE] = 1; break; case 5: - if(Player* target = SelectRandomPlayer(80)) + if(Player* target = SelectRandomPlayer(150)) { BreathX = target->GetPositionX(); BreathY = target->GetPositionY(); float x, y, z; - target->GetContactPoint(m_creature, x, y, z, 40); - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); + target->GetContactPoint(m_creature, x, y, z, 70); m_creature->GetMotionMaster()->MovePoint(0, x, y, z+10); - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); }else EnterEvadeMode(); Timer[EVENT_FLIGHT_SEQUENCE] = 0; break; @@ -355,9 +353,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI m_creature->GetPosition(x, y, z); x = 2 * BreathX - x; y = 2 * BreathY - y; - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); m_creature->GetMotionMaster()->MovePoint(0, x, y, z); - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); } Timer[EVENT_SUMMON_FOG] = 1; Timer[EVENT_FLIGHT_SEQUENCE] = 0; @@ -374,14 +370,12 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI { float x, y, z; target->GetContactPoint(m_creature, x, y, z); - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); m_creature->GetMotionMaster()->MovePoint(0, x, y, z); - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); }else EnterEvadeMode(); Timer[EVENT_FLIGHT_SEQUENCE] = 0; break; case 10: - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT); m_creature->StopMoving(); m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND); EnterPhase(PHASE_GROUND); @@ -439,7 +433,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI Timer[EVENT_GAS_NOVA] = 20000 + rand()%5 * 1000; break; case EVENT_ENCAPSULATE: - if(Unit* target = SelectRandomPlayer(50)) + if(Unit* target = SelectRandomPlayer(150)) { m_creature->CastSpell(target, SPELL_ENCAPSULATE_CHANNEL, false); target->CastSpell(target, SPELL_ENCAPSULATE_EFFECT, true);// linked aura, need core patch to remove this hack diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 4486b03d80f..2d6a5786471 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1537,5 +1537,5 @@ void WorldObject::GetRandomContactPoint( const WorldObject* obj, float &x, float float angle_offset_ratio = 1 - object_size/12.0f; if (angle_offset_ratio < 0.05) angle_offset_ratio = 0.05; // angle to face `obj` to `this`plus a random angle offset(from -90 degree to 90 degree)*angle_offset_ratio using distance from distance2dMin to distance2dMax includes size of `obj` - GetNearPoint(obj,x,y,z,object_size,distance2dMin+(distance2dMax-distance2dMin)*rand_norm(), GetAngle( obj ) + (M_PI_2 - M_PI * rand_norm()) * angle_offset_ratio); + GetNearPoint(obj,x,y,z,object_size,distance2dMin+(distance2dMax-distance2dMin)*rand_norm(), GetAngle( obj ) + (M_PI/2 - M_PI * rand_norm()) * angle_offset_ratio); } diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 7387a63fadc..a3fb99fe405 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1228,7 +1228,7 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, WorldTypeMapContainer > world_object_notifier(notifier); cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster)); } - if(!spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_MAX_TARGETS)) + if(!spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS)) { TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer > grid_object_notifier(notifier); cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster)); @@ -1357,7 +1357,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap) case TARGET_ALL_AROUND_CASTER: { if(!unMaxTargets) - unMaxTargets = spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_MAX_TARGETS); + unMaxTargets = spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS); m_caster->GetPosition(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ); }break; case TARGET_CURRENT_ENEMY_COORDINATES: @@ -1423,7 +1423,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap) case TARGET_IN_FRONT_OF_CASTER: case TARGET_UNIT_CONE_ENEMY_UNKNOWN: { - switch(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_CONE_TYPE)) + switch(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_CONE_TYPE)) { default: case 0: diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 7af5316c693..25454f41462 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -312,7 +312,7 @@ void Spell::EffectSchoolDMG(uint32 effect_idx) } // Meteor like spells (divided damage to targets) - if(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_SHARE_DAMAGE)) + if(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_SHARE_DAMAGE)) { uint32 count = 0; for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit) diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index b0db27a0b16..cd934534c2f 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -1969,29 +1969,31 @@ void SpellMgr::LoadSpellPetAuras() } // set data in core for now -void SpellMgr::LoadSpellExtraInfo() +void SpellMgr::LoadSpellExtraAttr() { - SpellExtraInfo info; - info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 0; - info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 0; - info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 0; - - info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 1; - SpellEntry const* tempSpell; - for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i) + SpellExtraAttribute tempAttr; + tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0; + tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0; + tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0; + + tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 1; { - tempSpell = GetSpellStore()->LookupEntry(i); - if(tempSpell && tempSpell->SpellVisual == 3879) - mSpellExtraInfoMap[tempSpell->Id] = info; + SpellEntry const* tempSpell; + for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i) + { + tempSpell = GetSpellStore()->LookupEntry(i); + if(tempSpell && tempSpell->SpellVisual == 3879) + mSpellExtraAttrMap[tempSpell->Id] = tempAttr; + } } - info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 2; - mSpellExtraInfoMap[26029] = info; // dark glare - mSpellExtraInfoMap[37433] = info; // spout - mSpellExtraInfoMap[43140] = info; // flame breath - mSpellExtraInfoMap[43215] = info; // flame breath - info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 0; - - info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 1; + tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 2; + mSpellExtraAttrMap[26029] = tempAttr; // dark glare + mSpellExtraAttrMap[37433] = tempAttr; // spout + mSpellExtraAttrMap[43140] = tempAttr; // flame breath + mSpellExtraAttrMap[43215] = tempAttr; // flame breath + tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0; + + tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 1; for(uint32 i = 0; i < 46000; ++i) { switch(i) @@ -2004,15 +2006,15 @@ void SpellMgr::LoadSpellExtraInfo() case 40810: case 43267: case 43268: // Saber Lash case 42384: // Brutal Swipe case 45150: // Meteor Slash - mSpellExtraInfoMap[i] = info; + mSpellExtraAttrMap[i] = tempAttr; break; default: break; } } - info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 0; + tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0; - info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 1; + tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 1; for(uint32 i = 0; i < 46000; ++i) { switch(i) @@ -2021,15 +2023,101 @@ void SpellMgr::LoadSpellExtraInfo() case 45004: case 45006: case 45010: // Wild Magic case 31347: // Doom case 41635: // Prayer of Mending - mSpellExtraInfoMap[i] = info; + mSpellExtraAttrMap[i] = tempAttr; break; default: break; } } - info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 3; - mSpellExtraInfoMap[41376] = info; //Spite - info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 0; + tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 3; + mSpellExtraAttrMap[41376] = tempAttr; //Spite + tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0; + + //hack here, only for those strange exceptions! + // Psychic Scream + SpellEntry *tempSpell; + if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8122)) + tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; + if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8124)) + tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; + if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10888)) + tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; + if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10890)) + tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; +} + +void SpellMgr::LoadSpellLinked() +{ + mSpellLinkedMap.clear(); // need for reload case + uint32 count = 0; + + // 0 1 + QueryResult *result = WorldDatabase.Query("SELECT spell0, spell1 FROM spell_linked_spell"); + if( !result ) + { + barGoLink bar( 1 ); + bar.step(); + sLog.outString(); + sLog.outString( ">> Loaded %u spell pet auras", count ); + return; + } + + barGoLink bar( result->GetRowCount() ); + + do + { + Field *fields = result->Fetch(); + + bar.step(); + + uint16 spell = fields[0].GetUInt16(); + uint16 pet = fields[1].GetUInt16(); + uint16 aura = fields[2].GetUInt16(); + + SpellPetAuraMap::iterator itr = mSpellPetAuraMap.find(spell); + if(itr != mSpellPetAuraMap.end()) + { + itr->second.AddAura(pet, aura); + } + else + { + SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell); + if (!spellInfo) + { + sLog.outErrorDb("Spell %u listed in `spell_pet_auras` does not exist", spell); + continue; + } + int i = 0; + for(; i < 3; ++i) + if((spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA && + spellInfo->EffectApplyAuraName[i] == SPELL_AURA_DUMMY) || + spellInfo->Effect[i] == SPELL_EFFECT_DUMMY) + break; + + if(i == 3) + { + sLog.outError("Spell %u listed in `spell_pet_auras` does not have dummy aura or dummy effect", spell); + continue; + } + + SpellEntry const* spellInfo2 = sSpellStore.LookupEntry(aura); + if (!spellInfo2) + { + sLog.outErrorDb("Aura %u listed in `spell_pet_auras` does not exist", aura); + continue; + } + + PetAura pa(pet, aura, spellInfo->EffectImplicitTargetA[i] == TARGET_PET, spellInfo->EffectBasePoints[i] + spellInfo->EffectBaseDice[i]); + mSpellPetAuraMap[spell] = pa; + } + + ++count; + } while( result->NextRow() ); + + delete result; + + sLog.outString(); + sLog.outString( ">> Loaded %u spell pet auras", count ); } /// Some checks for spells, to prevent adding depricated/broken spells for trainers, spell book, etc diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index e727e446072..b374b65857d 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -634,19 +634,21 @@ inline bool IsProfessionSkill(uint32 skill) return IsPrimaryProfessionSkill(skill) || skill == SKILL_FISHING || skill == SKILL_COOKING || skill == SKILL_FIRST_AID; } -enum SpellExtraInfoType +enum SpellExtraAttributeType { - SPELL_EXTRA_INFO_MAX_TARGETS, - SPELL_EXTRA_INFO_CONE_TYPE, - SPELL_EXTRA_INFO_SHARE_DAMAGE + SPELL_EXTRA_ATTR_MAX_TARGETS, + SPELL_EXTRA_ATTR_CONE_TYPE, + SPELL_EXTRA_ATTR_SHARE_DAMAGE }; -struct SpellExtraInfo +struct SpellExtraAttribute { - uint32 info[3]; + uint32 attr[3]; }; -typedef std::map<uint32, SpellExtraInfo> SpellExtraInfoMap; +typedef std::map<uint32, SpellExtraAttribute> SpellExtraAttrMap; + +typedef std::map<int32, int32> SpellLinkedMap; class SpellMgr { @@ -846,11 +848,20 @@ class SpellMgr return NULL; } - uint32 GetSpellExtraInfo(uint32 spell_id, uint32 type) const + uint32 GetSpellExtraAttr(uint32 spell_id, uint32 type) const { - SpellExtraInfoMap::const_iterator itr = mSpellExtraInfoMap.find(spell_id); - if(itr != mSpellExtraInfoMap.end()) - return itr->second.info[type]; + SpellExtraAttrMap::const_iterator itr = mSpellExtraAttrMap.find(spell_id); + if(itr != mSpellExtraAttrMap.end()) + return itr->second.attr[type]; + else + return 0; + } + + int32 GetSpellLinked(int32 spell_id) const + { + SpellLinkedMap::const_iterator itr = mSpellLinkedMap.find(spell_id); + if(itr != mSpellLinkedMap.end()) + return itr->second; else return 0; } @@ -871,7 +882,8 @@ class SpellMgr void LoadSpellThreats(); void LoadSkillLineAbilityMap(); void LoadSpellPetAuras(); - void LoadSpellExtraInfo(); + void LoadSpellExtraAttr(); + void LoadSpellLinked(); private: SpellScriptTarget mSpellScriptTarget; @@ -885,7 +897,8 @@ class SpellMgr SpellProcEventMap mSpellProcEventMap; SkillLineAbilityMap mSkillLineAbilityMap; SpellPetAuraMap mSpellPetAuraMap; - SpellExtraInfoMap mSpellExtraInfoMap; + SpellExtraAttrMap mSpellExtraAttrMap; + SpellLinkedMap mSpellLinkedMap; }; #define spellmgr SpellMgr::Instance() diff --git a/src/game/World.cpp b/src/game/World.cpp index de89643257f..45070615f4d 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -1093,8 +1093,8 @@ void World::SetInitialWorldSettings() sLog.outString( "Loading spell pet auras..." ); spellmgr.LoadSpellPetAuras(); - sLog.outString( "Loading spell extra infos...(TODO)" ); - spellmgr.LoadSpellExtraInfo(); + sLog.outString( "Loading spell extra attributes...(TODO)" ); + spellmgr.LoadSpellExtraAttr(); sLog.outString( "Loading player Create Info & Level Stats..." ); objmgr.LoadPlayerInfo(); |