void AMech_RPGCharacter::OutOfCombat() { TArray<AMech_RPGCharacter*> charactersFound = UMiscLibrary::GetCharactersInRange(1500, this->GetActorLocation()); for (AMech_RPGCharacter* character : charactersFound) { if (!character->IsDead() && character->IsEnemy(this) && character->inCombat) { SetInCombat(); return; } } inCombat = false; OnStopFiring.Broadcast(); if (OnOutOfCombat.IsBound()) OnOutOfCombat.Broadcast(); //if (!isPlayer && !isAlly) { stats->SetVisibility(false, true); //} if (IsDead() && GetGroup()->GetPlayer() != nullptr) { Resurrect(); } else if (IsDead()) { Reset(); GetWorld()->GetTimerManager().SetTimer(TimerHandle_Invunrelbility, this, &AMech_RPGCharacter::RemoveFromPlay, 6.0F); } }
void UpdateAI(uint32 diff) override { if (_phase == PHASE_INTRO) { if (_waitTimer <= diff) { DoAction(START_FIGHT); } else _waitTimer -= diff; } else // PHASE_NORMAL { if (!UpdateVictim()) return; if (_throwTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, urand(0, 1) ? SPELL_THROW_PERFUME : SPELL_THROW_COLOGNE); _throwTimer = urand(5000, 7500); } else _throwTimer -= diff; if (_targetSwitchTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true)) { me->getThreatManager().modifyThreatPercent(me->GetVictim(), -100); me->AddThreat(target, 9999999.9f); } _targetSwitchTimer = urand(5000, 10000); } else _targetSwitchTimer -= diff; if (_aggroTimer <= diff) { SetInCombat(me); _aggroTimer = 5000; } else _aggroTimer -= diff; DoMeleeAttackIfReady(); } }
void UpdateAI(uint32 diff) override { if (_phase == PHASE_INTRO) { if (_waitTimer <= diff) { DoAction(START_FIGHT); } else _waitTimer -= diff; } else // PHASE_NORMAL { if (!UpdateVictim()) return; if (_aggroTimer <= diff) { SetInCombat(me); _aggroTimer = 5000; } else _aggroTimer -= diff; if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (_chainReactionTimer <= diff) { DoCast(me, SPELL_TABLE_APPEAR, true); DoCast(me, SPELL_SUMMON_TABLE, true); DoCast(SPELL_CHAIN_REACTION); _chainReactionTimer = urand(15000, 25000); } else _chainReactionTimer -= diff; if (_sprayTimer <= diff) { DoCastVictim(SPELL_IRRESISTIBLE_COLOGNE_SPRAY); _sprayTimer = urand(8000, 15000); } else _sprayTimer -= diff; DoMeleeAttackIfReady(); } }
void DoAction(int32 const action) { switch (action) { case START_INTRO: { _phase = PHASE_INTRO; break; } case START_FIGHT: { if (Creature* hummel = ObjectAccessor::GetCreature(*me, _instance ? _instance->GetData64(DATA_HUMMEL) : 0)) DoScriptText(SAY_CALL_FRYE, hummel); _phase = PHASE_NORMAL; me->setFaction(FACTION_HOSTIL); SetInCombat(me); break; } } }
void DoAction(int32 action) override { switch (action) { case START_INTRO: { me->GetMotionMaster()->MovePoint(0, -196.16f, 2199.833f, 79.7640f); _phase = PHASE_INTRO; break; } case START_FIGHT: { if (Creature* hummel = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HUMMEL))) hummel->AI()->Talk(SAY_CALL_FRYE); _phase = PHASE_NORMAL; me->setFaction(FACTION_HOSTILE); SetInCombat(me); break; } } }
void DoAction(int32 action) override { switch (action) { case START_INTRO: { me->GetMotionMaster()->MovePoint(0, -223.92f, 2208.784f, 79.7640f); _phase = PHASE_INTRO; break; } case START_FIGHT: { if (Creature* hummel = ObjectAccessor::GetCreature(*me, _instance ? _instance->GetData64(DATA_HUMMEL) : 0)) hummel->AI()->Talk(SAY_CALL_BAXTER); _phase = PHASE_NORMAL; me->setFaction(FACTION_HOSTILE); SetInCombat(me); break; } } }
void UpdateAI(uint32 diff) override { if (_phase == PHASE_INTRO) { if (_stepTimer <= diff) { ++_step; switch (_step) { case 1: { Talk(SAY_AGGRO_1); _stepTimer = 4000; break; } case 2: { Talk(SAY_AGGRO_2); _stepTimer = 5500; break; } case 3: { Talk(SAY_AGGRO_3); _stepTimer = 1000; break; } case 4: { DoAction(START_FIGHT); break; } } } else _stepTimer -= diff; } else // PHASE_NORMAL { if (!UpdateVictim()) return; if (_aggroTimer <= diff) { SetInCombat(me); _aggroTimer = 5000; } else _aggroTimer -= diff; if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (_chainReactionTimer <= diff) { DoCast(me, SPELL_TABLE_APPEAR, true); DoCast(me, SPELL_SUMMON_TABLE, true); DoCast(SPELL_CHAIN_REACTION); _chainReactionTimer = urand(15000, 25000); } else _chainReactionTimer -= diff; if (_sprayTimer <= diff) { DoCastVictim(SPELL_ALLURING_PERFUME_SPRAY); _sprayTimer = urand(8000, 15000); } else _sprayTimer -= diff; DoMeleeAttackIfReady(); } }
void DoAction(int32 action) override { switch (action) { case START_INTRO: { if (Creature* baxter = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_BAXTER))) baxter->AI()->DoAction(START_INTRO); if (Creature* frye = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FRYE))) frye->AI()->DoAction(START_INTRO); _phase = PHASE_INTRO; me->SetReactState(REACT_PASSIVE); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); SetInCombat(me); break; } case START_FIGHT: { _phase = PHASE_NORMAL; me->setFaction(FACTION_HOSTILE); me->SetReactState(REACT_AGGRESSIVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); SetInCombat(me); _instance->SetData(TYPE_CROWN, IN_PROGRESS); break; } case APOTHECARY_DIED: { ++_deadCount; if (_deadCount > 2) // all 3 apothecarys dead, set lootable { _summons.DespawnAll(); me->SetCorpseDelay(90); // set delay me->setDeathState(JUST_DIED); // update delay _instance->SetData(TYPE_CROWN, DONE); me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); } else { if (me->HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE)) me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); } break; } case SPAWN_CRAZED: { uint8 i = urand(0, 3); if (Creature* crazed = me->SummonCreature(NPC_CRAZED_APOTHECARY, Loc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3*IN_MILLISECONDS)) { crazed->setFaction(FACTION_HOSTILE); crazed->SetReactState(REACT_PASSIVE); crazed->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); crazed->GetMotionMaster()->MovePoint(1, Loc[i + 4]); } if (!_firstCrazed) { Talk(SAY_SUMMON_ADDS); _firstCrazed = true; } break; } } }
void DoAction(int32 const action) { switch (action) { case START_INTRO: { if (Creature* baxter = ObjectAccessor::GetCreature(*me, _instance? _instance->GetData64(DATA_BAXTER) : 0)) baxter->AI()->DoAction(START_INTRO); if (Creature* frye = ObjectAccessor::GetCreature(*me, _instance ? _instance->GetData64(DATA_FRYE) : 0)) frye->AI()->DoAction(START_INTRO); _phase = PHASE_INTRO; me->SetReactState(REACT_PASSIVE); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); SetInCombat(me); break; } case START_FIGHT: { _phase = PHASE_NORMAL; me->setFaction(FACTION_HOSTIL); me->SetReactState(REACT_AGGRESSIVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); SetInCombat(me); _instance->SetData(TYPE_CROWN, IN_PROGRESS); break; } case APOTHECARY_DIED: { ++_deadCount; if (_deadCount > 2) // all 3 apothecarys dead, set lootable { _summons.DespawnAll(); me->SetCorpseDelay(90); // set delay me->setDeathState(JUST_DIED); // update delay _instance->SetData(TYPE_CROWN, DONE); me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); Map* map = me->GetMap(); if (map && map->IsDungeon()) { Map::PlayerList const& players = map->GetPlayers(); if (!players.isEmpty()) for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) if (Player* player = i->getSource()) if (player->GetDistance(me) < 120.0f) sLFGMgr->RewardDungeonDoneFor(288, player); } } else { if (me->HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE)) me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); } break; } case SPAWN_CRAZED: { uint8 i = urand(0, 3); if (Creature* crazed = me->SummonCreature(NPC_CRAZED_APOTHECARY, Loc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3*IN_MILLISECONDS)) { crazed->setFaction(FACTION_HOSTIL); crazed->SetReactState(REACT_PASSIVE); crazed->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); crazed->GetMotionMaster()->MovePoint(1, Loc[i + 4]); } if (!_firstCrazed) { DoScriptText(SAY_SUMMON_ADDS, me); _firstCrazed = true; } break; } } }