void HandleScriptEffect(SpellEffIndex effIndex) { Unit* caster = GetCaster(); if (!caster) return; Creature* carriage = NULL; Creature* yak = NULL; if (caster->GetAreaId() == 5826) // Bassins chantants { carriage = caster->SummonCreature(57208, 979.06f, 2863.87f, 87.88f, 4.7822f, TEMPSUMMON_MANUAL_DESPAWN, 0, caster->GetGUID()); yak = caster->SummonCreature(57207, 979.37f, 2860.29f, 88.22f, 4.4759f, TEMPSUMMON_MANUAL_DESPAWN, 0, caster->GetGUID()); } else if (caster->GetAreaId() == 5881) // Ferme Dai-Lo { carriage = caster->SummonCreature(57208, 588.70f, 3165.63f, 88.86f, 4.4156f, TEMPSUMMON_MANUAL_DESPAWN, 0, caster->GetGUID()); yak = caster->SummonCreature(59499, 587.61f, 3161.91f, 89.31f, 4.3633f, TEMPSUMMON_MANUAL_DESPAWN, 0, caster->GetGUID()); } else if (caster->GetAreaId() == 5833) // Epave du Chercheciel { carriage = caster->SummonCreature(57208, 264.37f, 3867.60f, 73.56f, 0.9948f, TEMPSUMMON_MANUAL_DESPAWN, 0, caster->GetGUID()); yak = caster->SummonCreature(57743, 268.38f, 3872.36f, 74.50f, 0.8245f, TEMPSUMMON_MANUAL_DESPAWN, 0, caster->GetGUID()); } if (!carriage || !yak) return; //carriage->CastSpell(yak, 108627, true); carriage->GetMotionMaster()->MoveFollow(yak, 0.0f, M_PI); caster->EnterVehicle(carriage, 0); }
uint8 PlayerbotClassAI::GetHealthPercentRaid(Player *gPlayer, uint8 &countNeedHealing) { uint8 validMemberCount=0; uint16 totalHPPercent=0; std::list<Unit*> unitList; gPlayer->GetRaidMember(unitList,30); if(!unitList.empty()){ for (std::list<Unit*>::iterator itr = unitList.begin() ; itr!=unitList.end();++itr) { //Player *tPlayer = GetPlayerBot()->GetObjPlayer((*itr)->GetGUID()); Unit *tPlayer = sObjectMgr->GetPlayer((*itr)->GetGUID()); if(tPlayer == NULL) continue; if(tPlayer->isDead()) continue; if(GetPlayerBot()->GetAreaId() != tPlayer->GetAreaId()) continue; //if(tPlayer->GetGUID() == GetPlayerBot()->GetGUID()) continue; if(GetPlayerBot()->GetDistance(tPlayer) > 30) continue; uint8 fndHPPercent = tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth(); totalHPPercent+=fndHPPercent; validMemberCount++; if (fndHPPercent < 100) countNeedHealing++; //const std::string myname = GetPlayerBot()->GetName(); //const std::string hisname = tPlayer->GetName(); //sLog->outDebug("me = %s, checked= %s %u [%u / %u]", myname.c_str(), hisname.c_str(), fndHPPercent, tPlayer->GetHealth(), tPlayer->GetMaxHealth()); } } if (validMemberCount == 0) return 100; return totalHPPercent / validMemberCount; }
bool PlayerbotClassAI::DoSupportRaid(Player *gPlayer, float radius, bool dResurrect, bool dGroupHeal, bool dHeal, bool dCure, bool dBuff) { bool needHeal = false; if (dGroupHeal || dHeal) { uint8 cntNeedHeal = 0; uint8 raidHPPercent = GetHealthPercentRaid(gPlayer, cntNeedHeal); if (dGroupHeal && raidHPPercent <=90 && cntNeedHeal > 1) { if (HealGroup(gPlayer, raidHPPercent, cntNeedHeal)) return true; } if (raidHPPercent < 60 ) needHeal = true; } //std::list<Unit*> unitList; //gPlayer->GetRaidMember(unitList,30); Group *pGroup = gPlayer->GetGroup(); if (!pGroup) return false; for (GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) { Unit* tPlayer = itr->getSource(); if(!tPlayer || gPlayer->IsHostileTo(tPlayer)) continue; if(GetPlayerBot()->GetAreaId() != tPlayer->GetAreaId()) continue; if(!m_bot->IsWithinDistInMap(tPlayer, radius)) { continue; } if(tPlayer->isDead()) // May be we can rez { if(!dResurrect) continue; if(needHeal) continue; //First heal others needing heal if(tPlayer->GetGUID() == GetPlayerBot()->GetGUID()) continue; if(tPlayer->IsNonMeleeSpellCasted(true)) continue; //Already rez if(RezTarget(tPlayer)) { return true; } else continue; } if (dHeal) { uint8 tarHPPercent = tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth(); if (tarHPPercent < 100 && HealTarget(tPlayer, tarHPPercent)) return true; } if (needHeal && dHeal) continue; //First heal others needing heal if (dCure && CureTarget(tPlayer)) return true; if (dBuff && BuffPlayer(tPlayer)) return true; } return false; }
// is Resource heavy, do not spam or use heavily in loop Unit *PlayerbotClassAI::FindMainTankInRaid(Player *gPlayer) { // check if original main tank is still alive. No point regetting main // tank b/c chances are slim that it will not get reset in the middle of a fight. // But if main tank dies, try to find next best canidate if (mainTank!=NULL && mainTank->isAlive()) { return mainTank; } if (!gPlayer) return NULL; Group *pGroup = gPlayer->GetGroup(); if (!pGroup) return NULL; uint64 pLeaderGuid = pGroup->GetLeaderGUID(); Unit *pPlayer = NULL; // Check if set in raid if (pGroup->isRaidGroup()) { QueryResult result = CharacterDatabase.PQuery("SELECT memberGuid FROM group_member WHERE memberFlags='%u' AND guid = '%u'",MEMBER_FLAG_MAINTANK, pGroup->GetGUID()); if(result) { uint64 pGuid = MAKE_NEW_GUID(result->Fetch()->GetInt32(),0,HIGHGUID_PLAYER); pPlayer = sObjectMgr->GetPlayer(pGuid); if (pPlayer && pGroup->IsMember(pGuid) && pPlayer->isAlive()){ mainTank = pPlayer; return pPlayer; } } } // if could not find tank try assuming // Assume the one with highest health is the main tank uint32 maxhpfound=0; std::list<Unit*> unitList; gPlayer->GetRaidMember(unitList,30); if (!unitList.empty()){ for (std::list<Unit*>::iterator itr = unitList.begin() ; itr!=unitList.end();++itr) { //Player *tPlayer = GetPlayerBot()->GetObjPlayer((*itr)->GetGUID()); Unit *tPlayer = sObjectMgr->GetPlayer((*itr)->GetGUID()); if (tPlayer == NULL) continue; if (tPlayer->isDead()) continue; if (GetPlayerBot()->GetAreaId() != tPlayer->GetAreaId()) continue; //if(tPlayer->GetGUID() == GetPlayerBot()->GetGUID()) continue; if (GetPlayerBot()->GetDistance(tPlayer) > 50) continue; if (tPlayer->GetMaxHealth() > maxhpfound) { maxhpfound = tPlayer->GetMaxHealth(); pPlayer=tPlayer; } // Also check pets if ( (tPlayer->getClass() == (uint8) CLASS_HUNTER || tPlayer->getClass() == (uint8) CLASS_WARLOCK) && IS_PET_GUID(tPlayer->GetPetGUID()) ) { Pet* tpet = ObjectAccessor::GetPet(*tPlayer, tPlayer->GetPetGUID()); if (!tpet || !tpet->IsInWorld() || !tpet->isDead()) continue; if (tpet->GetArmor() > tPlayer->GetArmor()) //Probably a tanking capable pet.. { if (tpet->GetMaxHealth() > maxhpfound) { maxhpfound = tpet->GetMaxHealth(); pPlayer=tpet; } else if (tPlayer->GetGUID() == pPlayer->GetGUID()) {pPlayer = tpet;} //set pet as tank instead of owner } } } } mainTank = pPlayer; return pPlayer; }