bool OutdoorPvPObjective::AddCreature(uint32 type, uint32 entry, uint32 teamval, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay) { Map * pMap = MapManager::Instance().FindMap(map); if (!pMap) return false; Creature* pCreature = new Creature; if (!pCreature->Create(sObjectMgr.GenerateLowGuid(HIGHGUID_UNIT), pMap, PHASEMASK_NORMAL, entry, teamval)) { sLog.outError("OutdoorPvP: Can't create creature entry: %u",entry); delete pCreature; return false; } pCreature->Relocate(x, y, z, o); if (!pCreature->IsPositionValid()) { sLog.outError("OutdoorPvP: Creature (guidlow %d, entry %d) not added. Suggested coordinates isn't valid (X: %f Y: %f)", pCreature->GetGUIDLow(), pCreature->GetEntry(), pCreature->GetPositionX(), pCreature->GetPositionY()); delete pCreature; return false; } pCreature->AIM_Initialize(); if(spawntimedelay) pCreature->SetRespawnDelay(spawntimedelay); m_Creatures[type] = MAKE_NEW_GUID(pCreature->GetGUID(), entry, HIGHGUID_UNIT); m_CreatureTypes[m_Creatures[type]] = type; pMap->Add(pCreature); return true; }
Creature* BattleGround::AddCreature(uint32 entry, uint32 type, uint32 teamval, float x, float y, float z, float o) { // note: this should normally be FindMap // but it's a hack to allow the battlegrounds to initialize at server startup Map * map = MapManager::Instance().GetMap(GetMapId(), 0); if(!map) return NULL; Creature* pCreature = new Creature; if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, entry, teamval)) { sLog.outError("Can't create creature entry: %u",entry); delete pCreature; return NULL; } pCreature->Relocate(x, y, z, o); if(!pCreature->IsPositionValid()) { sLog.outError("ERROR: Creature (guidlow %d, entry %d) not added to battleground. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); return NULL; } pCreature->AIM_Initialize(); //pCreature->SetDungeonDifficulty(0); map->Add(pCreature); m_BgCreatures[type] = pCreature->GetGUID(); return pCreature; }
Creature* BattleGround::AddCreature(uint32 entry, uint32 type, uint32 teamval, float x, float y, float z, float o, uint32 respawntime) { Map * map = MapManager::Instance().FindMap(GetMapId(),GetInstanceID()); if(!map) return NULL; Creature* pCreature = new Creature; if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, entry, teamval)) { sLog.outError("Can't create creature entry: %u",entry); delete pCreature; return NULL; } pCreature->Relocate(x, y, z, o); if(!pCreature->IsPositionValid()) { sLog.outError("ERROR: Creature (guidlow %d, entry %d) not added to battleground. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); return NULL; } pCreature->SetHomePosition(x, y, z, o); pCreature->AIM_Initialize(); map->Add(pCreature); m_BgCreatures[type] = pCreature->GetGUID(); return pCreature; }
bool ChatHandler::HandleAddSpiritCommand(const char* args) { Log::getSingleton( ).outDetail("Spawning Spirit Healers\n"); std::stringstream query; Creature* pCreature; UpdateMask unitMask; WorldPacket data; query << "select X,Y,Z,F,name_id,mapId,zoneId,faction_id from spirithealers"; QueryResult *result = sDatabase.Query( query.str( ).c_str( ) ); if(!result) { FillSystemMessageData(&data, m_session, "No spirit healers in db, exiting."); m_session->SendPacket( &data ); return true; } uint32 name; do { Field* fields = result->Fetch(); name = fields[4].GetUInt32(); Log::getSingleton( ).outDetail("%s name is %d\n", fields[4].GetString(), name); pCreature = new Creature(); pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), objmgr.GetCreatureName(name)->Name.c_str(), fields[5].GetUInt16(), fields[0].GetFloat(), fields[1].GetFloat(), fields[2].GetFloat(), fields[3].GetFloat(), name); pCreature->SetZoneId( fields[6].GetUInt16() ); pCreature->SetUInt32Value( OBJECT_FIELD_ENTRY, name ); pCreature->SetFloatValue( OBJECT_FIELD_SCALE_X, 1.0f ); pCreature->SetUInt32Value( UNIT_FIELD_DISPLAYID, 5233 ); pCreature->SetUInt32Value( UNIT_NPC_FLAGS , 1 ); pCreature->SetUInt32Value( UNIT_FIELD_FACTIONTEMPLATE , fields[7].GetUInt32() ); pCreature->SetUInt32Value( UNIT_FIELD_HEALTH, 100 + 30*(60) ); pCreature->SetUInt32Value( UNIT_FIELD_MAXHEALTH, 100 + 30*(60) ); pCreature->SetUInt32Value( UNIT_FIELD_LEVEL , 60 ); pCreature->SetFloatValue( UNIT_FIELD_COMBATREACH , 1.5f ); pCreature->SetFloatValue( UNIT_FIELD_MAXDAMAGE , 5.0f ); pCreature->SetFloatValue( UNIT_FIELD_MINDAMAGE , 8.0f ); pCreature->SetUInt32Value( UNIT_FIELD_BASEATTACKTIME, 1900 ); pCreature->SetUInt32Value( UNIT_FIELD_BASEATTACKTIME+1, 2000 ); pCreature->SetFloatValue( UNIT_FIELD_BOUNDINGRADIUS, 2.0f ); pCreature->AIM_Initialize(); Log::getSingleton( ).outError("AddObject at Level3.cpp line 172"); MapManager::Instance().GetMap(pCreature->GetMapId())->Add(pCreature); pCreature->SaveToDB(); } while( result->NextRow() ); delete result; return true; }
void Vehicle::InstallAllAccessories() { if(!GetMap()) return; CreatureDataAddon const *cainfo = GetCreatureAddon(); if(!cainfo || !cainfo->passengers) return; for (CreatureDataAddonPassengers const* cPassanger = cainfo->passengers; cPassanger->seat_idx != -1; ++cPassanger) { // Continue if seat already taken if(GetPassenger(cPassanger->seat_idx)) continue; uint32 guid = 0; bool isVehicle = false; // Set guid and check whatever it is if(cPassanger->guid != 0) guid = cPassanger->guid; else { CreatureDataAddon const* passAddon; passAddon = ObjectMgr::GetCreatureTemplateAddon(cPassanger->entry); if(passAddon && passAddon->vehicle_id != 0) isVehicle = true; else guid = sObjectMgr.GenerateLowGuid(HIGHGUID_UNIT); } // Create it Creature *pPassenger = new Creature; if(!isVehicle) { uint32 entry = cPassanger->entry; if(entry == 0) { CreatureData const* data = sObjectMgr.GetCreatureData(guid); if(!data) continue; entry = data->id; } if(!pPassenger->Create(guid, GetMap(), GetPhaseMask(), entry, 0)) continue; pPassenger->LoadFromDB(guid, GetMap()); pPassenger->Relocate(GetPositionX(), GetPositionY(), GetPositionZ()); GetMap()->Add(pPassenger); pPassenger->AIM_Initialize(); } else pPassenger = (Creature*)SummonVehicle(cPassanger->entry, GetPositionX(), GetPositionY(), GetPositionZ(), 0); // Enter vehicle... pPassenger->EnterVehicle(this, cPassanger->seat_idx, true); // ...and send update. Without this, client wont show this new creature/vehicle... WorldPacket data; pPassenger->BuildHeartBeatMsg(&data); pPassenger->SendMessageToSet(&data, false); } }
bool OutdoorPvPObjective::AddCapturePoint(uint32 entry, uint32 map, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3) { Map * pMap = MapManager::Instance().FindMap(map); if(!pMap) return false; GameObject* go = new GameObject; if (!go->Create(sObjectMgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), entry, pMap, PHASEMASK_NORMAL, x, y, z, o, rotation0, rotation1, rotation2, rotation3, 100, GO_STATE_READY)) { sLog.outError("OutdoorPvP: Gameobject template %u not found in database.", entry); delete go; // TODO: Should we return here? //return false; } else go->AddToWorld(); Creature* pCreature = new Creature; if (!pCreature->Create(sObjectMgr.GenerateLowGuid(HIGHGUID_UNIT), pMap,PHASEMASK_NORMAL, OPVP_TRIGGER_CREATURE_ENTRY, 0)) { sLog.outError("OutdoorPvP: Can't create creature entry: %u",entry); delete pCreature; return false; } pCreature->Relocate(x, y, z, o); if (!pCreature->IsPositionValid()) { sLog.outError("OutdoorPvP: Creature (guidlow %d, entry %d) not added to opvp. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); delete pCreature; return false; } pCreature->AIM_Initialize(); pMap->Add(pCreature); m_CapturePointCreature = MAKE_NEW_GUID(pCreature->GetGUID(), OPVP_TRIGGER_CREATURE_ENTRY, HIGHGUID_UNIT); m_CapturePoint = MAKE_NEW_GUID(go->GetGUID(), entry, HIGHGUID_GAMEOBJECT); // TODO: Use proper outdoor PvP GO type. GameObjectInfo const* goinfo = go->GetGOInfo(); m_ShiftMaxPhase = goinfo->raw.data[17]; m_ShiftMaxCaptureSpeed = m_ShiftMaxPhase / float(goinfo->raw.data[16]); m_NeutralValue = goinfo->raw.data[12]; return true; }
bool ChatHandler::HandleAddSpwCommand(const char* args) { char* charID = strtok((char*)args, " "); if (!charID) return false; uint32 id = atoi(charID); //QueryResult *result = sDatabase.PQuery("SELECT `modelid`,`flags`,`faction`,`level`,`name` FROM `creature_template` WHERE `entry` = '%u'", id); //if(result) //{ //Field *fields = result->Fetch(); //WorldPacket data; Player *chr = m_session->GetPlayer(); float x = chr->GetPositionX(); float y = chr->GetPositionY(); float z = chr->GetPositionZ(); float o = chr->GetOrientation(); Creature* pCreature = new Creature; if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), chr->GetMapId(), x, y, z, o, id)) { delete pCreature; return false; } pCreature->AIM_Initialize(); //pCreature->SetUInt32Value(UNIT_FIELD_HEALTH , 1); // temp set on 1 HP needs to be MAX HP (strange error) sLog.outDebug(LANG_ADD_OBJ); MapManager::Instance().GetMap(pCreature->GetMapId())->Add(pCreature); pCreature->SaveToDB(); //delete result; return true; //} //else // delete result; //return false; }
bool OutdoorPvPObjective::AddCapturePoint(uint32 entry, uint32 map, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3) { sLog.outDebug("OutdoorPvPObjective: creating capture point %u and capture point creature",entry); // check info existence GameObjectInfo const* goinfo = objmgr.GetGameObjectInfo(entry); if (!goinfo) return false; CreatureInfo const *cinfo = objmgr.GetCreatureTemplate(OPVP_TRIGGER_CREATURE_ENTRY); if(!cinfo) return false; // create capture point creature uint32 displayId = objmgr.ChooseDisplayId(0, cinfo, NULL); uint32 creature_guid = objmgr.GenerateLowGuid(HIGHGUID_UNIT); CreatureData& cdata = objmgr.NewOrExistCreatureData(creature_guid); cdata.id = OPVP_TRIGGER_CREATURE_ENTRY; cdata.mapid = map; cdata.displayid = displayId; cdata.equipmentId = cinfo->equipmentId; cdata.posX = x; cdata.posY = y; cdata.posZ = z; cdata.orientation = o; cdata.spawntimesecs = 1; cdata.spawndist = 0; cdata.currentwaypoint = 0; cdata.curhealth = cinfo->maxhealth; cdata.curmana = cinfo->maxmana; cdata.is_dead = false; cdata.movementType = cinfo->MovementType; cdata.spawnMask = 1; cdata.phaseMask = PHASEMASK_NORMAL; objmgr.AddCreatureToGrid(creature_guid, &cdata); m_CapturePointCreature = MAKE_NEW_GUID(creature_guid, OPVP_TRIGGER_CREATURE_ENTRY, HIGHGUID_UNIT); // create capture point go uint32 guid = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT); GameObjectData& data = objmgr.NewGOData(guid); data.id = entry; data.mapid = map; data.posX = x; data.posY = y; data.posZ = z; data.orientation = o; data.rotation0 = rotation0; data.rotation1 = rotation1; data.rotation2 = rotation2; data.rotation3 = rotation3; data.spawntimesecs = 1; data.animprogress = 100; data.spawnMask = 1; data.go_state = GO_STATE_READY; data.phaseMask = PHASEMASK_NORMAL; objmgr.AddGameobjectToGrid(guid, &data); m_CapturePoint = MAKE_NEW_GUID(guid, entry, HIGHGUID_GAMEOBJECT); // get the needed values from goinfo m_ShiftMaxPhase = goinfo->raw.data[17]; m_ShiftMaxCaptureSpeed = m_ShiftMaxPhase / float(goinfo->raw.data[16]); m_NeutralValue = goinfo->raw.data[12]; // add to map if map is already loaded Map * pMap = MapManager::Instance().FindMap(map); if(!pMap) return true; // add GO... GameObject * go = new GameObject; if(!go->Create(guid,entry, pMap, PHASEMASK_NORMAL, x,y,z,o,rotation0,rotation1,rotation2,rotation3,100, GO_STATE_READY)) { sLog.outError("OutdoorPvPObjective: Gameobject template %u not found in database.", entry); delete go; } else { go->SetRespawnTime(0); objmgr.SaveGORespawnTime(go->GetDBTableGUIDLow(), 0, 0); //this is useless this isn't spawned through db so it doesn't has dbtableguid (it's just 0) pMap->Add(go); } // add creature... Creature* pCreature = new Creature; if (!pCreature->Create(creature_guid, pMap,PHASEMASK_NORMAL, OPVP_TRIGGER_CREATURE_ENTRY, 0)) { sLog.outError("OutdoorPvPObjective: Can't create creature entry: %u",entry); delete pCreature; } else { pCreature->AIM_Initialize(); pCreature->Relocate(x, y, z, o); if(!pCreature->IsPositionValid()) { sLog.outError("OutdoorPvPObjective: Creature (guidlow %d, entry %d) not added to opvp. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); return false; } pMap->Add(pCreature); } return true; }
bool OutdoorPvPObjective::AddCreature(uint32 type, uint32 entry, uint32 teamval, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay) { CreatureInfo const *cinfo = objmgr.GetCreatureTemplate(entry); if(!cinfo) { return false; } uint32 displayId = objmgr.ChooseDisplayId(teamval, cinfo, NULL); CreatureModelInfo const *minfo = objmgr.GetCreatureModelRandomGender(displayId); if (!minfo) { return false; } else displayId = minfo->modelid; // it can be different (for another gender) uint32 guid = objmgr.GenerateLowGuid(HIGHGUID_UNIT); CreatureData& data = objmgr.NewOrExistCreatureData(guid); data.id = entry; data.mapid = map; data.displayid = displayId; data.equipmentId = cinfo->equipmentId; data.posX = x; data.posY = y; data.posZ = z; data.orientation = o; data.spawntimesecs = spawntimedelay; data.spawndist = 0; data.currentwaypoint = 0; data.curhealth = cinfo->maxhealth; data.curmana = cinfo->maxmana; data.is_dead = false; data.movementType = cinfo->MovementType; data.spawnMask = 1; data.phaseMask = PHASEMASK_NORMAL; objmgr.AddCreatureToGrid(guid, &data); m_Creatures[type] = MAKE_NEW_GUID(guid, entry, HIGHGUID_UNIT); m_CreatureTypes[m_Creatures[type]] = type; Map * pMap = MapManager::Instance().FindMap(map); if(!pMap) return true; Creature* pCreature = new Creature; if (!pCreature->Create(guid, pMap, PHASEMASK_NORMAL, entry, teamval)) { sLog.outError("OutdoorPvPObjective: Can't create creature entry: %u",entry); delete pCreature; return true; } pCreature->AIM_Initialize(); pCreature->Relocate(x, y, z, o); if(!pCreature->IsPositionValid()) { sLog.outError("OutdoorPvPObjective: ERROR: Creature (guidlow %d, entry %d) not added to opvp. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); return false; } if(spawntimedelay) pCreature->SetRespawnDelay(spawntimedelay); pMap->Add(pCreature); return true; }
bool ChatHandler::HandleAddSHCommand(const char *args) { WorldPacket data; Player *chr = m_session->GetPlayer(); float x = chr->GetPositionX(); float y = chr->GetPositionY(); float z = chr->GetPositionZ(); float o = chr->GetOrientation(); Creature* pCreature = new Creature(); pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), "Spirit Healer", chr->GetMapId(), x, y, z, o, objmgr.AddCreatureName(pCreature->GetName(), 5233)); pCreature->SetZoneId(chr->GetZoneId()); pCreature->SetUInt32Value(OBJECT_FIELD_ENTRY, objmgr.AddCreatureName(pCreature->GetName(), 5233)); pCreature->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); pCreature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 5233); pCreature->SetUInt32Value(UNIT_NPC_FLAGS, 33); pCreature->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE , 35); pCreature->SetUInt32Value(UNIT_FIELD_HEALTH, 100); pCreature->SetUInt32Value(UNIT_FIELD_MAXHEALTH, 100); pCreature->SetUInt32Value(UNIT_FIELD_LEVEL, 60); pCreature->SetUInt32Value(UNIT_FIELD_FLAGS, 768); pCreature->SetUInt32Value(UNIT_FIELD_AURA+0, 10848); pCreature->SetUInt32Value(UNIT_FIELD_AURALEVELS+0, 0xEEEEEE3C); pCreature->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS+0, 0xEEEEEE00); pCreature->SetUInt32Value(UNIT_FIELD_AURAFLAGS+0, 0x00000009); pCreature->SetFloatValue(UNIT_FIELD_COMBATREACH , 1.5f); pCreature->SetFloatValue(UNIT_FIELD_MAXDAMAGE , 5.0f); pCreature->SetFloatValue(UNIT_FIELD_MINDAMAGE , 8.0f); pCreature->SetUInt32Value(UNIT_FIELD_BASEATTACKTIME, 1900); pCreature->SetUInt32Value(UNIT_FIELD_BASEATTACKTIME+1, 2000); pCreature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 2.0f); pCreature->AIM_Initialize(); Log::getSingleton( ).outError("AddObject at Level3.cpp line 455"); MapManager::Instance().GetMap(pCreature->GetMapId())->Add(pCreature); pCreature->SaveToDB(); std::stringstream ss,ss2,ss3; QueryResult *result; result = sDatabase.Query( "SELECT MAX(ID) FROM npc_gossip" ); if( result ) { ss2 << "INSERT INTO npc_gossip ( ID , NPC_GUID, GOSSIP_TYPE, TEXTID, OPTION_COUNT) VALUES (" << (*result)[0].GetUInt32()+1 << ", " << pCreature->GetGUIDLow() << ", " << 1 << ", " << 1 << ", " << 1 << ")"; sDatabase.Execute( ss2.str( ).c_str( ) ); delete result; result = NULL; result = sDatabase.Query( "SELECT MAX(ID) FROM npc_options" ); if( result ) { ss << "INSERT INTO npc_options ( `ID` , `GOSSIP_ID`, `TYPE`, `OPTION`, `NPC_TEXT_NEXTID`, `SPECIAL`) VALUES (" << (*result)[0].GetUInt32()+1 << ", " << (*result)[0].GetUInt32()+2 << ", " << 0 << ", '" << "Return me to life." << "', " << 0 << ", " << 2 << ")"; sDatabase.Execute( ss.str( ).c_str( ) ); delete result; result = NULL; } result = sDatabase.Query( "SELECT MAX(ID) FROM npc_text" ); if( result ) { ss3 << "INSERT INTO npc_text ( ID , TYPE_UNUSED, TEXT) VALUES (" << (*result)[0].GetUInt32()+1 << ", " << 0 << ", '" << "It is not yet your time. I shall aid your journey back to the realm of the living... For a price." << "')"; sDatabase.Execute( ss3.str( ).c_str( ) ); delete result; result = NULL; } } return true; }
void TargetedMovementGenerator::Update(Creature &owner, const uint32 & time_diff) { if( !&owner || !owner.isAlive() || !&i_target || i_targetedHome ) return; if( owner.hasUnitState(UNIT_STAT_ROOT) || owner.hasUnitState(UNIT_STAT_STUNDED) || owner.hasUnitState(UNIT_STAT_FLEEING)) return; if( !owner.isInCombat() && !owner.hasUnitState(UNIT_STAT_FOLLOW) ) { owner.AIM_Initialize(); return; } // prevent crash after creature killed pet if (!owner.hasUnitState(UNIT_STAT_FOLLOW) && owner.getVictim() != &i_target) return; Traveller<Creature> traveller(owner); if (i_destinationHolder.UpdateTraveller(traveller, time_diff, false)) { // put targeted movement generators on a higher priority i_destinationHolder.ResetUpdate(50); float dist = i_target.GetObjectSize() + owner.GetObjectSize() + OBJECT_CONTACT_DISTANCE; // try to counter precision differences if( i_destinationHolder.GetDistanceFromDestSq(i_target) > dist * dist + 0.1) _setTargetLocation(owner, 0); else if ( !owner.HasInArc( 0.1f, &i_target ) ) { owner.SetInFront(&i_target); if( i_target.GetTypeId() == TYPEID_PLAYER ) owner.SendUpdateToPlayer( (Player*)&i_target ); } if( !owner.IsStopped() && i_destinationHolder.HasArrived()) { owner.StopMoving(); if(owner.canReachWithAttack(&i_target) && !owner.hasUnitState(UNIT_STAT_FOLLOW)) owner.Attack(&i_target); } } /* //SpellEntry* spellInfo; if( reach ) { if( owner.GetDistance2dSq( &i_target ) > 0.0f ) { DEBUG_LOG("MOVEMENT : Distance = %f",owner.GetDistance2dSq( &i_target )); owner.addUnitState(UNIT_STAT_CHASE); _setTargetLocation(owner, 0); } else if ( !owner.HasInArc( 0.0f, &i_target ) ) { DEBUG_LOG("MOVEMENT : Orientation = %f",owner.GetAngle(&i_target)); owner.SetInFront(&i_target); if( i_target.GetTypeId() == TYPEID_PLAYER ) owner.SendUpdateToPlayer( (Player*)&i_target ); } if( !owner.isInCombat() ) { owner.AIM_Initialize(); return; } } else if( i_target.isAlive() ) { if( !owner.hasUnitState(UNIT_STAT_FOLLOW) && owner.isInCombat() ) { if( spellInfo = owner.reachWithSpellAttack( &i_target ) ) { _spellAtack(owner, spellInfo); return; } } if( owner.GetDistance2dSq( &i_target ) > 0.0f ) { DEBUG_LOG("MOVEMENT : Distance = %f",owner.GetDistance2dSq( &i_target )); owner.addUnitState(UNIT_STAT_CHASE); _setTargetLocation(owner, 0); } } else if( !i_targetedHome ) { if( !owner.hasUnitState(UNIT_STAT_FOLLOW) && owner.isInCombat() && (spellInfo = owner.reachWithSpellAttack(&i_target)) ) { _spellAtack(owner, spellInfo); return; } _setTargetLocation(owner, 0); if(reach) { if( reach && owner.canReachWithAttack(&i_target) ) { owner.StopMoving(); if(!owner.hasUnitState(UNIT_STAT_FOLLOW)) owner.Attack(&i_target); owner.clearUnitState(UNIT_STAT_CHASE); DEBUG_LOG("UNIT IS THERE"); } else { _setTargetLocation(owner, 0); DEBUG_LOG("Continue to chase"); } } }*/ }