Changeset 141

Show
Ignore:
Timestamp:
11/19/08 13:39:50 (17 years ago)
Author:
yumileroy
Message:

[svn] Improve TargetedMovement? (TODO: let mob find "near angle" rather than "random angle").
Delete a repeated check in instance canenter().
Fix some spell targets.
Add some sunwell spell sql.
Fix Magtheridons earthquake. (TODO: need to find out why soul transfer has no effect when casted by mobs)
Let Brutallus dual wield. Enable burn (still no script effect).
Quick fix for shadowmoon valley illidan quest crash (wait for author's fix).

Original author: megamage
Date: 2008-10-31 21:42:00-05:00

Location:
trunk
Files:
1 added
13 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp

    r116 r141  
    20802080    m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT); 
    20812081 
    2082     DoCast(m_creature, SPELL_DUAL_WIELD, true); 
     2082    m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true); 
    20832083} 
    20842084 
  • trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp

    r117 r141  
    3232#define SPELL_BLASTNOVA             30616   
    3333#define SPELL_CLEAVE                30619 
    34 #define SPELL_QUAKE_TRIGGER         30576 // must be cast with 30561 as the proc spell 
     34#define SPELL_QUAKE_TRIGGER         30657 // must be cast with 30561 as the proc spell 
    3535#define SPELL_QUAKE_KNOCKBACK       30571 
    3636#define SPELL_BLAZE_TARGET          30541 // core bug, does not support target 7 
     
    169169        m_creature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10); 
    170170        m_creature->SetFloatValue(UNIT_FIELD_COMBATREACH, 10); 
     171 
     172        // target 7, random target with certain entry spell, need core fix 
     173        SpellEntry *TempSpell; 
     174        TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_BLAZE_TARGET); 
     175        if(TempSpell && TempSpell->EffectImplicitTargetA[0] != 6) 
     176        { 
     177            TempSpell->EffectImplicitTargetA[0] = 6; 
     178            TempSpell->EffectImplicitTargetB[0] = 0; 
     179        } 
     180        TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_QUAKE_TRIGGER); 
     181        if(TempSpell && TempSpell->EffectTriggerSpell[0] != SPELL_QUAKE_KNOCKBACK) 
     182        { 
     183            TempSpell->EffectTriggerSpell[0] = SPELL_QUAKE_KNOCKBACK; 
     184        } 
     185 
    171186        Reset(); 
    172187    } 
     
    329344            if(!m_creature->IsNonMeleeSpellCasted(false)) 
    330345            { 
    331                 int32 i = SPELL_QUAKE_KNOCKBACK; 
    332                 m_creature->CastCustomSpell(m_creature, SPELL_QUAKE_TRIGGER, &i, 0, 0, false); 
     346                m_creature->CastSpell(m_creature, SPELL_QUAKE_TRIGGER, true); 
    333347                Quake_Timer = 50000; 
    334348            } 
  • trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp

    r117 r141  
    2727#define SPELL_SOUL_TRANSFER         30531 // core bug, does not support target 7 
    2828#define SPELL_BLAZE_TARGET          30541 // core bug, does not support target 7 
    29 #define SPELL_DEBRIS_DAMAGE                     30631 // core bug, does not support target 8 
    30 #define SPELL_DEBRIS_KNOCKDOWN      36449 // core bug, does not support target 8 
    3129 
    3230#define CHAMBER_CENTER_X                        -15.14 
     
    4139    { 
    4240        Initialize(); 
    43         // target 7, random target with certain entry spell, need core fix 
    44         SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_BLAZE_TARGET); 
    45         if(TempSpell && TempSpell->EffectImplicitTargetA[0] != 6) 
    46         { 
    47             TempSpell->EffectImplicitTargetA[0] = 6; 
    48             TempSpell->EffectImplicitTargetB[0] = 0; 
    49         } 
    5041    } 
    5142 
  • trunk/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp

    r117 r141  
    814814struct TRINITY_DLL_DECL Overlord_MorghorAI : public ScriptedAI 
    815815{ 
    816 Overlord_MorghorAI(Creature *c) : ScriptedAI(c) {Reset();} 
    817  
    818         Unit* m_player; 
    819         Unit* PlayerCheck; 
    820          
    821         uint32 SpeachTimer; 
    822         uint32 SpeachNum; 
    823          
    824         uint64 PlayerGUID; 
    825         uint64 YazillGUID; 
    826          
    827         bool DoingSpeach; 
    828         bool Failed; 
    829  
    830         Creature* Lord; 
    831         Creature* Yarzill; 
    832  
    833 void Reset() 
    834 { 
    835         if (Lord) 
    836         { 
    837                 Lord->SetUInt64Value(UNIT_FIELD_TARGET, 0); 
    838                 Lord->SetVisibility(VISIBILITY_OFF); 
    839                 Lord->setDeathState(JUST_DIED); 
    840         } 
    841  
    842         if (Yarzill) 
    843         { 
    844         Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, 0); 
    845         } 
    846          
    847         m_creature->Relocate(-5085.77, 577.231, 86.6719, 2.32608); 
    848         m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 2); 
    849         m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); 
    850         m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); 
    851         m_player = NULL; 
    852         PlayerCheck = NULL; 
    853         PlayerGUID = 0; 
    854         YazillGUID = 0; 
    855         Lord = NULL; 
    856         Yarzill = NULL; 
    857         DoingSpeach = false; 
    858         Failed = false; 
    859         SpeachNum = 0; 
    860         SpeachTimer = 0; 
    861 } 
    862  
    863 void BeginSpeach(Unit* target) 
    864 { 
    865         m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 0); 
    866         m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); 
    867         DoSay(OVERLORD_SAY_1,LANG_UNIVERSAL,target); 
    868         m_player = target; 
    869         PlayerCheck = NULL; 
    870         PlayerGUID = target->GetGUID(); 
    871         SpeachTimer = 4200; 
    872         SpeachNum = 0; 
    873         DoingSpeach = true; 
    874 } 
    875          
    876 void Aggro(Unit *who){} 
    877  
    878 void MoveInLineOfSight(Unit *who) 
    879 { 
    880         if (!who) 
    881         return; 
    882  
    883         if (DoingSpeach) 
    884         { 
    885                 if (who->GetEntry() == 23141 && m_creature->IsWithinDistInMap(who, 15)) 
    886                 { 
    887                         if (!YazillGUID) 
    888                         { 
    889                                 YazillGUID = who->GetGUID(); 
    890                         } 
    891                 } 
    892         } 
    893 } 
    894  
    895 void UpdateAI(const uint32 diff) 
    896 { 
    897         //Speach 
    898         if (DoingSpeach) 
    899         { 
    900                 if (SpeachTimer < diff) 
    901                 { 
    902                         if (YazillGUID && !Yarzill) 
    903                         Yarzill = ((Creature*)Unit::GetUnit((*m_creature), YazillGUID)); 
    904  
    905                                 if (!m_creature->IsWithinDistInMap(m_player, 50) && ((Player*)m_player)->GetQuestStatus(QUEST_LORD_ILLIDAN_STORMRAGE) == QUEST_STATUS_INCOMPLETE) 
    906                                 { 
    907                                 ((Player*)m_player)->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); 
    908                                 SpeachNum = 30; 
    909                                 } 
    910  
    911         switch (SpeachNum) 
    912         { 
    913         // Overlord Movement 
    914         case 0: 
    915                 m_creature->GetMotionMaster()->MovePoint(0, -5104.41, 595.297, 85.6838); 
    916                 SpeachTimer = 9000; SpeachNum++; break; 
    917         // Overlord Yell 1 
    918         case 1: 
    919                 m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_SHOUT); 
    920                 DoYell(OVERLORD_YELL_1,LANG_UNIVERSAL,m_player); 
    921                 SpeachTimer = 4500; SpeachNum++; break; 
    922         // Overlord Angle 
    923         case 2: 
    924                 m_creature->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); 
    925                 SpeachTimer = 3200; SpeachNum++; break; 
    926                 // Overlord Say 2 
    927         case 3: 
    928                 DoSay(OVERLORD_SAY_2,LANG_UNIVERSAL,NULL); 
    929                 SpeachTimer = 2000; SpeachNum++; break; 
    930         // Summon Illidan 
    931         case 4: 
    932                 Lord = m_creature->SummonCreature(LORD_ILLIDAN_STORMRAGE, -5107.83, 602.584, 85.2393, 4.92598, TEMPSUMMON_CORPSE_DESPAWN, 0); 
    933                 Lord->LoadCreaturesAddon(); 
    934                 SpeachTimer = 350; SpeachNum++; break; 
    935         // Illidan Cast Red Bolt 
    936         case 5: 
    937                 Lord->CastSpell(Lord, SPELL_ONE, true); 
    938                 Lord->SetUInt64Value(UNIT_FIELD_TARGET, m_creature->GetGUID()); 
    939                 m_creature->SetUInt64Value(UNIT_FIELD_TARGET, Lord->GetGUID()); 
    940                 SpeachTimer = 2000; SpeachNum++; break; 
    941         // Overlord Yell 2 
    942         case 6: 
    943                 DoYell(OVERLORD_YELL_2,LANG_UNIVERSAL,NULL); 
    944                 SpeachTimer = 4500; SpeachNum++; break; 
    945         // Overlord Kneel 
    946         case 7: 
    947                 m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,8); 
    948                 SpeachTimer = 2500; SpeachNum++; break; 
    949         // Overlord Say 3 
    950         case 8: 
    951                 DoSay(OVERLORD_SAY_3,LANG_UNIVERSAL,NULL); 
    952                 SpeachTimer = 6500; SpeachNum++; break; 
    953         // Illidan Say 1 
    954         case 9: 
    955                 ((Lord_IllidanAI*)Lord->AI())->DoSpeach(1); 
    956                 SpeachTimer = 5000; SpeachNum++; break; 
    957         // Overlord Say 4 
    958         case 10: 
    959                 DoSay(OVERLORD_SAY_4,LANG_UNIVERSAL,m_player); 
    960                 SpeachTimer = 6000; SpeachNum++; break; 
    961         // Illidan Say 2 
    962         case 11: 
    963                 ((Lord_IllidanAI*)Lord->AI())->DoSpeach(2); 
    964                 SpeachTimer = 5500; SpeachNum++; break; 
    965         // Illidan Say 3 
    966         case 12: 
    967                 ((Lord_IllidanAI*)Lord->AI())->DoSpeach(3); 
    968                 SpeachTimer = 4000; SpeachNum++; break; 
    969         // Illidan Angle 
    970         case 13: 
    971                 Lord->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); 
    972                 SpeachTimer = 1500; SpeachNum++; break; 
    973         // Illidan Say 4 
    974         case 14: 
    975                 ((Lord_IllidanAI*)Lord->AI())->DoSpeach(4); 
    976                 SpeachTimer = 1500; SpeachNum++; break; 
    977         // Illidan Cast 
    978         case 15: 
    979                 PlayerCheck = Unit::GetUnit(*Lord, PlayerGUID); 
    980                 if (PlayerCheck) 
    981                 { 
    982                         Lord->CastSpell(m_player, SPELL_TWO, true); 
    983                         m_player->RemoveAurasDueToSpell(SPELL_THREE); 
    984                         m_player->RemoveAurasDueToSpell(SPELL_FOUR); 
    985                         SpeachTimer = 5000; SpeachNum++; 
    986                 } 
    987                         else 
    988                         { 
    989                         ((Player*)m_player)->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); 
    990                         SpeachTimer = 100; SpeachNum = 30; 
    991                 } 
    992                 break; 
    993                 // Illidan Say 5 
    994         case 16: 
    995                 ((Lord_IllidanAI*)Lord->AI())->DoSpeach(5); 
    996                 SpeachTimer = 5000; SpeachNum++; break; 
    997         // Illidan Say 6 
    998         case 17: 
    999                 ((Lord_IllidanAI*)Lord->AI())->DoSpeach(6); 
    1000                 SpeachTimer = 5000; SpeachNum++; break; 
    1001         // Illidan Say 7 
    1002         case 18: 
    1003                 ((Lord_IllidanAI*)Lord->AI())->DoSpeach(7); 
    1004                 SpeachTimer = 5000; SpeachNum++; break; 
    1005         // Illidan Fly 
    1006         case 19: 
    1007                 Lord->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); 
    1008                 Lord->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); 
    1009                 SpeachTimer = 500; SpeachNum++; break; 
    1010         // Overlord Say 5 
    1011         case 20: 
    1012                 DoSay(OVERLORD_SAY_5,LANG_UNIVERSAL,NULL); 
    1013                 SpeachTimer = 500; SpeachNum++; break; 
    1014         // Illidan Despawn 
    1015         case 21: 
    1016                 Lord->SetVisibility(VISIBILITY_OFF); 
    1017                 Lord->setDeathState(JUST_DIED); 
    1018                 Lord = NULL; 
    1019                 SpeachTimer = 1000; SpeachNum++; break; 
    1020         // Overlord Stand Up 
    1021         case 22: 
    1022                 m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); 
    1023                 SpeachTimer = 2000; SpeachNum++; break; 
    1024         // Overlord Angle 
    1025         case 23: 
    1026                 m_creature->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); 
    1027                 SpeachTimer = 5000; SpeachNum++; break; 
    1028         // Overlord Say 6 
    1029         case 24: 
    1030                 DoSay(OVERLORD_SAY_6,LANG_UNIVERSAL,NULL); 
    1031                 SpeachTimer = 2000; SpeachNum++; break; 
    1032         // Complete Quest 
    1033         case 25: 
    1034                 ((Player*)m_player)->CompleteQuest(QUEST_LORD_ILLIDAN_STORMRAGE); 
    1035                 SpeachTimer = 6000; SpeachNum++; break; 
    1036         // Goblin Angle 
    1037         case 26: 
    1038                 if (Yarzill) 
    1039                 Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); 
    1040                 SpeachTimer = 500; SpeachNum++; break; 
    1041         // Cast Again Dragonaw Illusion 
    1042         case 27: 
    1043                 m_player->RemoveAurasDueToSpell(SPELL_TWO); 
    1044                 m_player->RemoveAurasDueToSpell(41519); 
    1045                 m_player->CastSpell(m_player, SPELL_THREE, true); 
    1046                 m_player->CastSpell(m_player, SPELL_FOUR, true); 
    1047                 SpeachTimer = 1000; SpeachNum++; break; 
    1048         // Goblin 
    1049         case 28: 
    1050         if (Yarzill) 
    1051                 ((Yarzill_The_MercAI*)Yarzill->AI())->DoSpeach(m_player); 
    1052                 SpeachTimer = 5000; SpeachNum++; break; 
    1053         // Goblin Off 
    1054         case 29: 
    1055                 if (Yarzill) 
    1056                 Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, 0); 
    1057                 SpeachTimer = 5000; SpeachNum++; break; 
    1058         // Overlord Go Back 
    1059         case 30: 
    1060                 m_creature->GetMotionMaster()->MovePoint(0, -5085.77, 577.231, 86.6719); 
    1061                 SpeachTimer = 5000; SpeachNum++; break; 
    1062         // Reset 
    1063         case 31: 
    1064                 Reset(); 
    1065                 break; 
    1066                 default: break; 
    1067         } 
    1068         }else SpeachTimer -= diff; 
    1069 } 
    1070 } 
     816    Overlord_MorghorAI(Creature *c) : ScriptedAI(c) 
     817    { 
     818        Lord = NULL; 
     819        Yarzill = NULL; 
     820        Reset(); 
     821    } 
     822 
     823    Unit* m_player; 
     824    Unit* PlayerCheck; 
     825 
     826    uint32 SpeachTimer; 
     827    uint32 SpeachNum; 
     828 
     829    uint64 PlayerGUID; 
     830    uint64 YazillGUID; 
     831 
     832    bool DoingSpeach; 
     833    bool Failed; 
     834 
     835    Creature* Lord; 
     836    Creature* Yarzill; 
     837 
     838    void Reset() 
     839    { 
     840        if (Lord) 
     841        { 
     842            Lord->SetUInt64Value(UNIT_FIELD_TARGET, 0); 
     843            Lord->SetVisibility(VISIBILITY_OFF); 
     844            Lord->setDeathState(JUST_DIED); 
     845        } 
     846 
     847        if (Yarzill) 
     848        { 
     849            Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, 0); 
     850        } 
     851 
     852        m_creature->Relocate(-5085.77, 577.231, 86.6719, 2.32608); 
     853        m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 2); 
     854        m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); 
     855        m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); 
     856        m_player = NULL; 
     857        PlayerCheck = NULL; 
     858        PlayerGUID = 0; 
     859        YazillGUID = 0; 
     860        Lord = NULL; 
     861        Yarzill = NULL; 
     862        DoingSpeach = false; 
     863        Failed = false; 
     864        SpeachNum = 0; 
     865        SpeachTimer = 0; 
     866    } 
     867 
     868    void BeginSpeach(Unit* target) 
     869    { 
     870        m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 0); 
     871        m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); 
     872        DoSay(OVERLORD_SAY_1,LANG_UNIVERSAL,target); 
     873        m_player = target; 
     874        PlayerCheck = NULL; 
     875        PlayerGUID = target->GetGUID(); 
     876        SpeachTimer = 4200; 
     877        SpeachNum = 0; 
     878        DoingSpeach = true; 
     879    } 
     880 
     881    void Aggro(Unit *who){} 
     882 
     883    void MoveInLineOfSight(Unit *who) 
     884    { 
     885        if (!who) 
     886            return; 
     887 
     888        if (DoingSpeach) 
     889        { 
     890            if (who->GetEntry() == 23141 && m_creature->IsWithinDistInMap(who, 15)) 
     891            { 
     892                if (!YazillGUID) 
     893                { 
     894                    YazillGUID = who->GetGUID(); 
     895                } 
     896            } 
     897        } 
     898    } 
     899 
     900    void UpdateAI(const uint32 diff) 
     901    { 
     902        //Speach 
     903        if (DoingSpeach) 
     904        { 
     905            if (SpeachTimer < diff) 
     906            { 
     907                if (YazillGUID && !Yarzill) 
     908                    Yarzill = ((Creature*)Unit::GetUnit((*m_creature), YazillGUID)); 
     909 
     910                if (!m_creature->IsWithinDistInMap(m_player, 50) && ((Player*)m_player)->GetQuestStatus(QUEST_LORD_ILLIDAN_STORMRAGE) == QUEST_STATUS_INCOMPLETE) 
     911                { 
     912                    ((Player*)m_player)->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); 
     913                    SpeachNum = 30; 
     914                } 
     915 
     916                switch (SpeachNum) 
     917                { 
     918                    // Overlord Movement 
     919                case 0: 
     920                    m_creature->GetMotionMaster()->MovePoint(0, -5104.41, 595.297, 85.6838); 
     921                    SpeachTimer = 9000; SpeachNum++; break; 
     922                    // Overlord Yell 1 
     923                case 1: 
     924                    m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_SHOUT); 
     925                    DoYell(OVERLORD_YELL_1,LANG_UNIVERSAL,m_player); 
     926                    SpeachTimer = 4500; SpeachNum++; break; 
     927                    // Overlord Angle 
     928                case 2: 
     929                    m_creature->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); 
     930                    SpeachTimer = 3200; SpeachNum++; break; 
     931                    // Overlord Say 2 
     932                case 3: 
     933                    DoSay(OVERLORD_SAY_2,LANG_UNIVERSAL,NULL); 
     934                    SpeachTimer = 2000; SpeachNum++; break; 
     935                    // Summon Illidan 
     936                case 4: 
     937                    Lord = m_creature->SummonCreature(LORD_ILLIDAN_STORMRAGE, -5107.83, 602.584, 85.2393, 4.92598, TEMPSUMMON_CORPSE_DESPAWN, 0); 
     938                    Lord->LoadCreaturesAddon(); 
     939                    SpeachTimer = 350; SpeachNum++; break; 
     940                    // Illidan Cast Red Bolt 
     941                case 5: 
     942                    Lord->CastSpell(Lord, SPELL_ONE, true); 
     943                    Lord->SetUInt64Value(UNIT_FIELD_TARGET, m_creature->GetGUID()); 
     944                    m_creature->SetUInt64Value(UNIT_FIELD_TARGET, Lord->GetGUID()); 
     945                    SpeachTimer = 2000; SpeachNum++; break; 
     946                    // Overlord Yell 2 
     947                case 6: 
     948                    DoYell(OVERLORD_YELL_2,LANG_UNIVERSAL,NULL); 
     949                    SpeachTimer = 4500; SpeachNum++; break; 
     950                    // Overlord Kneel 
     951                case 7: 
     952                    m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,8); 
     953                    SpeachTimer = 2500; SpeachNum++; break; 
     954                    // Overlord Say 3 
     955                case 8: 
     956                    DoSay(OVERLORD_SAY_3,LANG_UNIVERSAL,NULL); 
     957                    SpeachTimer = 6500; SpeachNum++; break; 
     958                    // Illidan Say 1 
     959                case 9: 
     960                    ((Lord_IllidanAI*)Lord->AI())->DoSpeach(1); 
     961                    SpeachTimer = 5000; SpeachNum++; break; 
     962                    // Overlord Say 4 
     963                case 10: 
     964                    DoSay(OVERLORD_SAY_4,LANG_UNIVERSAL,m_player); 
     965                    SpeachTimer = 6000; SpeachNum++; break; 
     966                    // Illidan Say 2 
     967                case 11: 
     968                    ((Lord_IllidanAI*)Lord->AI())->DoSpeach(2); 
     969                    SpeachTimer = 5500; SpeachNum++; break; 
     970                    // Illidan Say 3 
     971                case 12: 
     972                    ((Lord_IllidanAI*)Lord->AI())->DoSpeach(3); 
     973                    SpeachTimer = 4000; SpeachNum++; break; 
     974                    // Illidan Angle 
     975                case 13: 
     976                    Lord->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); 
     977                    SpeachTimer = 1500; SpeachNum++; break; 
     978                    // Illidan Say 4 
     979                case 14: 
     980                    ((Lord_IllidanAI*)Lord->AI())->DoSpeach(4); 
     981                    SpeachTimer = 1500; SpeachNum++; break; 
     982                    // Illidan Cast 
     983                case 15: 
     984                    PlayerCheck = Unit::GetUnit(*Lord, PlayerGUID); 
     985                    if (PlayerCheck) 
     986                    { 
     987                        Lord->CastSpell(m_player, SPELL_TWO, true); 
     988                        m_player->RemoveAurasDueToSpell(SPELL_THREE); 
     989                        m_player->RemoveAurasDueToSpell(SPELL_FOUR); 
     990                        SpeachTimer = 5000; SpeachNum++; 
     991                    } 
     992                    else 
     993                    { 
     994                        ((Player*)m_player)->FailQuest(QUEST_LORD_ILLIDAN_STORMRAGE); 
     995                        SpeachTimer = 100; SpeachNum = 30; 
     996                    } 
     997                    break; 
     998                    // Illidan Say 5 
     999                case 16: 
     1000                    ((Lord_IllidanAI*)Lord->AI())->DoSpeach(5); 
     1001                    SpeachTimer = 5000; SpeachNum++; break; 
     1002                    // Illidan Say 6 
     1003                case 17: 
     1004                    ((Lord_IllidanAI*)Lord->AI())->DoSpeach(6); 
     1005                    SpeachTimer = 5000; SpeachNum++; break; 
     1006                    // Illidan Say 7 
     1007                case 18: 
     1008                    ((Lord_IllidanAI*)Lord->AI())->DoSpeach(7); 
     1009                    SpeachTimer = 5000; SpeachNum++; break; 
     1010                    // Illidan Fly 
     1011                case 19: 
     1012                    Lord->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); 
     1013                    Lord->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); 
     1014                    SpeachTimer = 500; SpeachNum++; break; 
     1015                    // Overlord Say 5 
     1016                case 20: 
     1017                    DoSay(OVERLORD_SAY_5,LANG_UNIVERSAL,NULL); 
     1018                    SpeachTimer = 500; SpeachNum++; break; 
     1019                    // Illidan Despawn 
     1020                case 21: 
     1021                    Lord->SetVisibility(VISIBILITY_OFF); 
     1022                    Lord->setDeathState(JUST_DIED); 
     1023                    Lord = NULL; 
     1024                    SpeachTimer = 1000; SpeachNum++; break; 
     1025                    // Overlord Stand Up 
     1026                case 22: 
     1027                    m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); 
     1028                    SpeachTimer = 2000; SpeachNum++; break; 
     1029                    // Overlord Angle 
     1030                case 23: 
     1031                    m_creature->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); 
     1032                    SpeachTimer = 5000; SpeachNum++; break; 
     1033                    // Overlord Say 6 
     1034                case 24: 
     1035                    DoSay(OVERLORD_SAY_6,LANG_UNIVERSAL,NULL); 
     1036                    SpeachTimer = 2000; SpeachNum++; break; 
     1037                    // Complete Quest 
     1038                case 25: 
     1039                    ((Player*)m_player)->CompleteQuest(QUEST_LORD_ILLIDAN_STORMRAGE); 
     1040                    SpeachTimer = 6000; SpeachNum++; break; 
     1041                    // Goblin Angle 
     1042                case 26: 
     1043                    if (Yarzill) 
     1044                        Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, PlayerGUID); 
     1045                    SpeachTimer = 500; SpeachNum++; break; 
     1046                    // Cast Again Dragonaw Illusion 
     1047                case 27: 
     1048                    m_player->RemoveAurasDueToSpell(SPELL_TWO); 
     1049                    m_player->RemoveAurasDueToSpell(41519); 
     1050                    m_player->CastSpell(m_player, SPELL_THREE, true); 
     1051                    m_player->CastSpell(m_player, SPELL_FOUR, true); 
     1052                    SpeachTimer = 1000; SpeachNum++; break; 
     1053                    // Goblin 
     1054                case 28: 
     1055                    if (Yarzill) 
     1056                        ((Yarzill_The_MercAI*)Yarzill->AI())->DoSpeach(m_player); 
     1057                    SpeachTimer = 5000; SpeachNum++; break; 
     1058                    // Goblin Off 
     1059                case 29: 
     1060                    if (Yarzill) 
     1061                        Yarzill->SetUInt64Value(UNIT_FIELD_TARGET, 0); 
     1062                    SpeachTimer = 5000; SpeachNum++; break; 
     1063                    // Overlord Go Back 
     1064                case 30: 
     1065                    m_creature->GetMotionMaster()->MovePoint(0, -5085.77, 577.231, 86.6719); 
     1066                    SpeachTimer = 5000; SpeachNum++; break; 
     1067                    // Reset 
     1068                case 31: 
     1069                    Reset(); 
     1070                    break; 
     1071                default: break; 
     1072                } 
     1073            }else SpeachTimer -= diff; 
     1074        } 
     1075    } 
    10711076}; 
    10721077 
  • trunk/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp

    r90 r141  
    6060#define SPELL_STOMP                     45185 
    6161#define SPELL_BERSERK                   26662 
     62#define SPELL_DUAL_WIELD                42459 
    6263 
    6364struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI 
     
    7677        BurnTimer = 60000; 
    7778        BerserkTimer = 360000; 
     79        m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true); 
    7880    } 
    7981 
     
    146148        if(BurnTimer < diff) 
    147149        { 
    148             Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0); 
    149             //DoCast(target,SPELL_BURN); 
     150            if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0)) 
     151                target->CastSpell(target,SPELL_BURN,true); 
    150152                        BurnTimer = 60000; 
    151153        } 
  • trunk/src/game/Map.cpp

    r120 r141  
    14201420bool InstanceMap::CanEnter(Player *player) 
    14211421{ 
    1422     if(!player->isGameMaster() && i_data && i_data->IsEncounterInProgress()) 
     1422    if(std::find(i_Players.begin(),i_Players.end(),player)!=i_Players.end()) 
     1423    { 
     1424        sLog.outError("InstanceMap::CanEnter - player %s(%u) already in map %d,%d,%d!", player->GetName(), player->GetGUIDLow(), GetId(), GetInstanceId(), GetSpawnMode()); 
     1425        assert(false); 
     1426        return false; 
     1427    } 
     1428 
     1429    // cannot enter if the instance is full (player cap), GMs don't count 
     1430    InstanceTemplate const* iTemplate = objmgr.GetInstanceTemplate(GetId()); 
     1431    if (!player->isGameMaster() && GetPlayersCountExceptGMs() >= iTemplate->maxPlayers) 
     1432    { 
     1433        sLog.outDetail("MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), iTemplate->maxPlayers, player->GetName()); 
     1434        player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS); 
     1435        return false; 
     1436    } 
     1437 
     1438    // cannot enter while players in the instance are in combat 
     1439    Group *pGroup = player->GetGroup(); 
     1440    if(!player->isGameMaster() && pGroup && pGroup->InCombatToInstance(GetInstanceId()) && player->isAlive() && player->GetMapId() != GetId()) 
     1441    { 
     1442        player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT); 
     1443        return false; 
     1444    } 
     1445 
     1446    /*if(!player->isGameMaster() && i_data && i_data->IsEncounterInProgress()) 
    14231447    { 
    14241448        sLog.outDebug("InstanceMap::CanEnter - Player '%s' can't enter instance '%s' while an encounter is in progress.", player->GetName(), GetMapName()); 
    14251449        player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT); 
    14261450        return false; 
    1427     } 
    1428  
    1429     if(std::find(i_Players.begin(),i_Players.end(),player)!=i_Players.end()) 
    1430     { 
    1431         sLog.outError("InstanceMap::CanEnter - player %s(%u) already in map %d,%d,%d!", player->GetName(), player->GetGUIDLow(), GetId(), GetInstanceId(), GetSpawnMode()); 
    1432         assert(false); 
    1433         return false; 
    1434     } 
    1435  
    1436     // cannot enter if the instance is full (player cap), GMs don't count 
    1437     InstanceTemplate const* iTemplate = objmgr.GetInstanceTemplate(GetId()); 
    1438     if (!player->isGameMaster() && GetPlayersCountExceptGMs() >= iTemplate->maxPlayers) 
    1439     { 
    1440         sLog.outDetail("MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), iTemplate->maxPlayers, player->GetName()); 
    1441         player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS); 
    1442         return false; 
    1443     } 
    1444  
    1445     // cannot enter while players in the instance are in combat 
    1446     Group *pGroup = player->GetGroup(); 
    1447     if(pGroup && pGroup->InCombatToInstance(GetInstanceId()) && player->isAlive() && player->GetMapId() != GetId()) 
    1448     { 
    1449         player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT); 
    1450         return false; 
    1451     } 
     1451    }*/ 
    14521452 
    14531453    return Map::CanEnter(player); 
  • trunk/src/game/Object.cpp

    r138 r141  
    15331533        UpdateGroundPositionZ(x,y,z); 
    15341534} 
    1535  
    1536 void WorldObject::GetRandomContactPoint( const WorldObject* obj, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const 
    1537 { 
    1538         float object_size = obj->GetObjectSize();//here we use object_size to determine the angle offset, the bigger object the smaller angle offset, then this makes mob move naturally in visual. 
    1539         //let assume 12.0f is the max size for object to have 0 angle offset. 
    1540         float angle_offset_ratio = 1 - object_size/12.0f; 
    1541         if (angle_offset_ratio < 0.05) angle_offset_ratio = 0.05; 
    1542         // 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` 
    1543         GetNearPoint(obj,x,y,z,object_size,distance2dMin+(distance2dMax-distance2dMin)*rand_norm(), GetAngle( obj ) + (M_PI/2 - M_PI * rand_norm()) * angle_offset_ratio); 
    1544 } 
  • trunk/src/game/Object.h

    r120 r141  
    378378            GetNearPoint(obj,x,y,z,obj->GetObjectSize(),distance2d,GetAngle( obj )); 
    379379        } 
    380         void GetRandomContactPoint( const WorldObject* obj, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const; 
    381380 
    382381        float GetObjectSize() const 
  • trunk/src/game/Spell.cpp

    r140 r141  
    14441444 
    14451445        // area targets 
    1446                 case TARGET_AREAEFFECT_CUSTOM: 
    14471446        case TARGET_ALL_ENEMY_IN_AREA_INSTANT: 
    14481447            if(m_spellInfo->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA) 
     
    14571456            SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_FRIENDLY); 
    14581457            break; 
    1459         //case TARGET_AREAEFFECT_CUSTOM: 
    1460         //    m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION; 
     1458        case TARGET_AREAEFFECT_CUSTOM: 
     1459            m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION; 
    14611460        case TARGET_UNIT_AREA_ENTRY: 
    14621461        { 
     
    14651464            if(lower==upper) 
    14661465            { 
    1467                 sLog.outErrorDb("Spell (ID: %u) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT, but does not have record in `spell_script_target`",m_spellInfo->Id); 
     1466                SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_AOE_DAMAGE); 
     1467                //sLog.outErrorDb("Spell (ID: %u) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT, but does not have record in `spell_script_target`",m_spellInfo->Id); 
    14681468                break; 
    14691469            } 
  • trunk/src/game/SpellEffects.cpp

    r136 r141  
    19831983            return; 
    19841984        } 
    1985         case TARGET_TABLE_X_Y_Z_COORDINATES: 
    1986         { 
    1987             // TODO: Only players can teleport? 
    1988             if (unitTarget->GetTypeId() != TYPEID_PLAYER) 
    1989                 return; 
    1990             SpellTargetPosition const* st = spellmgr.GetSpellTargetPosition(m_spellInfo->Id); 
    1991             if(!st) 
    1992             { 
    1993                 sLog.outError( "Spell::EffectTeleportUnits - unknown Teleport coordinates for spell ID %u\n", m_spellInfo->Id ); 
    1994                 return; 
    1995             } 
    1996             ((Player*)unitTarget)->TeleportTo(st->target_mapId,st->target_X,st->target_Y,st->target_Z,st->target_Orientation,unitTarget==m_caster ? TELE_TO_SPELL : 0); 
    1997             break; 
    1998         } 
    19991985        default: 
    20001986        { 
    20011987            // If not exist data for dest location - return 
    2002             if(!(m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION)) 
     1988            if(!m_targets.HasDest()) 
    20031989            { 
    20041990                sLog.outError( "Spell::EffectTeleportUnits - unknown EffectImplicitTargetB[%u] = %u for spell ID %u\n", i, m_spellInfo->EffectImplicitTargetB[i], m_spellInfo->Id ); 
  • trunk/src/game/TargetedMovementGenerator.cpp

    r118 r141  
    6161    { 
    6262        // to nearest random contact position  
    63         i_target->GetRandomContactPoint( &owner, x, y, z,0.5f,4.5f ); 
     63        i_target->GetRandomContactPoint( &owner, x, y, z, 0.5f, ATTACK_DISTANCE - 0.5f ); 
    6464    } 
    6565    else 
     
    165165            i_destinationHolder.ResetUpdate(50); 
    166166 
    167         float dist = i_target->GetObjectSize() + owner.GetObjectSize() + sWorld.getRate(RATE_TARGET_POS_RECALCULATION_RANGE); 
     167        float dist = owner.GetFloatValue(UNIT_FIELD_COMBATREACH) + i_target.getTarget()->GetFloatValue(UNIT_FIELD_COMBATREACH) + sWorld.getRate(RATE_TARGET_POS_RECALCULATION_RANGE); 
    168168 
    169169        //More distance let have better performance, less distance let have more sensitive reaction at target move. 
     
    186186 
    187187            owner.StopMoving(); 
    188             if(owner.canReachWithAttack(i_target.getTarget()) && !owner.hasUnitState(UNIT_STAT_FOLLOW)) 
     188            if(owner.IsWithinCombatDist(i_target.getTarget(), ATTACK_DISTANCE) && !owner.hasUnitState(UNIT_STAT_FOLLOW)) 
    189189                owner.Attack(i_target.getTarget(),true); 
    190190        } 
  • trunk/src/game/Unit.cpp

    r140 r141  
    421421    float distsq = dx*dx + dy*dy + dz*dz; 
    422422    //not sure here, or combatreach + combatreach? 
    423     float sizefactor = GetObjectSize() + obj->GetFloatValue(UNIT_FIELD_COMBATREACH); 
     423    float sizefactor = GetFloatValue(UNIT_FIELD_COMBATREACH) + obj->GetFloatValue(UNIT_FIELD_COMBATREACH); 
    424424    float maxdist = dist2compare + sizefactor; 
    425425 
    426426    return distsq < maxdist * maxdist; 
     427} 
     428 
     429void Unit::GetRandomContactPoint( const Unit* obj, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const 
     430{ 
     431        uint32 attacker_number = getAttackers().size(); 
     432    if(attacker_number > 0) --attacker_number; 
     433        GetNearPoint(obj,x,y,z,obj->GetFloatValue(UNIT_FIELD_COMBATREACH),distance2dMin+(distance2dMax-distance2dMin)*rand_norm() 
     434        , GetAngle(obj) + (attacker_number ? (M_PI/2 - M_PI * rand_norm()) * (float)attacker_number / GetFloatValue(UNIT_FIELD_COMBATREACH) / 3 : 0)); 
    427435} 
    428436 
  • trunk/src/game/Unit.h

    r136 r141  
    722722        bool canReachWithAttack(Unit *pVictim) const; 
    723723        bool IsWithinCombatDist(Unit *obj, float dist2compare) const; 
     724        void GetRandomContactPoint( const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const; 
    724725        uint32 m_extraAttacks; 
    725726        bool m_canDualWield;