bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) { if (!(player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_COMPLETE || player->GetQuestStatus(QUEST_BREAKING_THROUGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_BREAKING_THROUGH) == QUEST_STATUS_COMPLETE)) return false; WorldLocation pPosition; switch (trigger->id) { case 5332: // trigger on the lower entrance case 5338: // trigger on top case 5339: // trigger inside pPosition = WorldLocation(571, 3733.68f, 3563.25f, 290.812f, 3.665192f); break; case 5334: pPosition = WorldLocation(571, 3802.38f, 3585.95f, 49.5765f, 0.0f); break; case 5340: if(player->GetTeam() == ALLIANCE) // Quest "Last Rites" - alliance only pPosition = WorldLocation(571, 3687.91f, 3577.28f, 473.342f, 0.0f); else // Quest "Breaking through" - horde only pPosition = WorldLocation(571, 3745.8806f, 3570.0364f, 341.6437f, 0.4917f); break; default: return false; } player->TeleportTo(pPosition); return false; }
bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) { if (!(player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_COMPLETE || player->GetQuestStatus(QUEST_BREAKING_THROUGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_BREAKING_THROUGH) == QUEST_STATUS_COMPLETE)) return false; WorldLocation pPosition; switch (trigger->id) { case 5332: case 5338: pPosition = WorldLocation(571, 3733.68f, 3563.25f, 290.812f, 3.665192f); break; case 5334: pPosition = WorldLocation(571, 3802.38f, 3585.95f, 49.5765f, 0.0f); break; case 5340: pPosition = WorldLocation(571, 3687.91f, 3577.28f, 473.342f, 0.0f); break; default: return false; } player->TeleportTo(pPosition); return false; }
void npc_toc_announcerAI::ChooseEvent(uint8 encounterId, Player *chooser) { if (m_pInstance->GetData(encounterId) == DONE) return; uint32 startTimer = 0; switch (encounterId) { case TYPE_BEASTS: case TYPE_JARAXXUS: case TYPE_CRUSADERS: case TYPE_VALKIRIES: case TYPE_LICH_KING: currentEncounter = encounterId; encounterStage = 0; startTimer = 1000; break; case TYPE_ANUBARAK: chooser->TeleportTo(WorldLocation(m_creature->GetMapId(), SpawnLoc[LOC_UNDERGROUND], 0)); break; default: break; } if (startTimer) { m_TimerMgr->SetUpdatable(true); AddNonCastTimer(TIMER_PHASE_HANDLING, startTimer, 0); AddNonCastTimer(TIMER_RUNAWAY, startTimer+1000, 0); } }
bool MOTransport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint8 animprogress, uint16 dynamicLowValue) { Relocate(WorldLocation(mapid, x, y, z, ang)); // FIXME - instance id and phaseMask isn't set to values different from std. if(!IsPositionValid()) { sLog.outError("Transport (GUID: %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)", guidlow,x,y); return false; } Object::_Create(ObjectGuid(HIGHGUID_MO_TRANSPORT, guidlow)); GameObjectInfo const* goinfo = ObjectMgr::GetGameObjectInfo(guidlow); if (!goinfo) { sLog.outErrorDb("Transport not created: entry in `gameobject_template` not found, guidlow: %u map: %u (X: %f Y: %f Z: %f) ang: %f",guidlow, mapid, x, y, z, ang); return false; } m_goInfo = goinfo; SetObjectScale(goinfo->size); SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction); //SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags); SetUInt32Value(GAMEOBJECT_FLAGS, (GO_FLAG_TRANSPORT | GO_FLAG_NODESPAWN)); SetUInt32Value(GAMEOBJECT_LEVEL, GetPeriod(true)); SetEntry(goinfo->id); SetDisplayId(goinfo->displayId); SetGoState(GO_STATE_READY); SetGoType(GameobjectTypes(goinfo->type)); SetGoArtKit(0); SetGoAnimProgress(animprogress); SetUInt16Value(GAMEOBJECT_DYNAMIC, 0, dynamicLowValue); SetUInt16Value(GAMEOBJECT_DYNAMIC, 1, 0); SetName(goinfo->name); m_transportKit = new TransportKit(*this); m_anchorageTimer.SetInterval(0); m_anchorageTimer.Reset(); return true; }
bool DynamicObject::Create(uint32 guidlow, Unit* caster, uint32 spellId, SpellEffectIndex effIndex, float x, float y, float z, int32 duration, float radius, DynamicObjectType type) { WorldObject::_Create(ObjectGuid(HIGHGUID_DYNAMICOBJECT, guidlow), caster->GetPhaseMask()); Relocate(WorldLocation(caster->GetMapId(), x, y, z, 0.0f, caster->GetPhaseMask(), caster->GetInstanceId())); SetMap(caster->GetMap()); if (!IsPositionValid()) { sLog.outError("DynamicObject (spell %u eff %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)", spellId, effIndex, GetPositionX(), GetPositionY()); return false; } SpellEntry const* spellProto = sSpellStore.LookupEntry(spellId); if (!spellProto) { sLog.outError("DynamicObject (spell %u) not created. Spell not exist!", spellId); return false; } SetEntry(spellId); SetObjectScale(DEFAULT_OBJECT_SCALE); if (type == DYNAMIC_OBJECT_RAID_MARKER) { MANGOS_ASSERT(caster->GetTypeId() == TYPEID_PLAYER && ((Player*)caster)->GetGroup() && "DYNAMIC_OBJECT_RAID_MARKER must only be casted by players and that are in group."); SetGuidValue(DYNAMICOBJECT_CASTER, ((Player*)caster)->GetGroup()->GetObjectGuid()); } else SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetObjectGuid()); SetUInt32Value(DYNAMICOBJECT_BYTES, spellProto->GetSpellVisual() | (type << 28)); SetUInt32Value(DYNAMICOBJECT_SPELLID, spellId); SetFloatValue(DYNAMICOBJECT_RADIUS, radius); SetUInt32Value(DYNAMICOBJECT_CASTTIME, WorldTimer::getMSTime()); // new 2.4.0 m_aliveDuration = duration; m_radius = radius; m_effIndex = effIndex; m_spellId = spellId; m_positive = IsPositiveEffect(spellProto, m_effIndex); return true; }
return *this; } bool Position::operator == (Position const& pos) const { return (((Location)*this) == ((Location)pos)) && (GetPhaseMask() & pos.GetPhaseMask()); }; float Position::GetDistance(Position const& pos) const { return (GetPhaseMask() & pos.GetPhaseMask()) ? ((Location)*this).GetDistance((Location)pos) : MAX_VISIBILITY_DISTANCE + 1.0f; }; WorldLocation const WorldLocation::Null = WorldLocation(); WorldLocation::WorldLocation(uint32 _mapid, float _x, float _y, float _z, float _o, uint32 phaseMask, uint32 _instance, uint32 _realmid) : Position(_x, _y, _z, _o, phaseMask), mapid(_mapid), instance(_instance), realmid(_realmid), m_Tpos(Position()) { if (realmid == 0) SetRealmId(sWorld.getConfig(CONFIG_UINT32_REALMID)); }; bool WorldLocation::IsValidMapCoord(WorldLocation const& loc) { if (loc.HasMap()) return MapManager::IsValidMapCoord(loc); else return MaNGOS::IsValidMapCoord(loc.getX(), loc.getY(), loc.getZ(), loc.getO()); }
// teleport player to given game_tele.entry static bool HandleTeleNameCommand(ChatHandler* handler, const char* args) { char* nameStr; char* teleStr; handler->extractOptFirstArg((char*)args, &nameStr, &teleStr); if (!teleStr) return false; Player* target; ObjectGuid target_guid; std::string target_name; if (!handler->extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) return false; if (strcmp(teleStr, "$home") == 0) // References target's homebind { if (target) target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->GetOrientation()); else { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND); stmt->setUInt64(0, target_guid.GetCounter()); PreparedQueryResult resultDB = CharacterDatabase.Query(stmt); if (resultDB) { Field* fieldsDB = resultDB->Fetch(); WorldLocation loc(fieldsDB[0].GetUInt16(), fieldsDB[2].GetFloat(), fieldsDB[3].GetFloat(), fieldsDB[4].GetFloat(), 0.0f); uint32 zoneId = fieldsDB[1].GetUInt16(); SQLTransaction dummy; Player::SavePositionInDB(loc, zoneId, target_guid, dummy); } } return true; } // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r GameTele const* tele = handler->extractGameTeleFromLink(teleStr); if (!tele) { handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); handler->SetSentErrorMessage(true); return false; } if (target) { // check online security if (handler->HasLowerSecurity(target, ObjectGuid::Empty)) return false; std::string chrNameLink = handler->playerLink(target_name); if (target->IsBeingTeleported() == true) { handler->PSendSysMessage(LANG_IS_TELEPORTED, chrNameLink.c_str()); handler->SetSentErrorMessage(true); return false; } handler->PSendSysMessage(LANG_TELEPORTING_TO, chrNameLink.c_str(), "", tele->name.c_str()); if (handler->needReportToTarget(target)) ChatHandler(target->GetSession()).PSendSysMessage(LANG_TELEPORTED_TO_BY, handler->GetNameLink().c_str()); // stop flight if need if (target->IsInFlight()) { target->GetMotionMaster()->MovementExpired(); target->CleanupAfterTaxiFlight(); } // save only in non-flight case else target->SaveRecallPosition(); target->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation); } else { // check offline security if (handler->HasLowerSecurity(NULL, target_guid)) return false; std::string nameLink = handler->playerLink(target_name); handler->PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE), tele->name.c_str()); SQLTransaction dummy; Player::SavePositionInDB(WorldLocation(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation), sMapMgr->GetZoneId(tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid, dummy); } return true; }
SPELL_POISONSHOCK = 28741, SPELL_POISONSHOCK_H = 54122, SPELL_NECROTICPOISON = 28776, SPELL_FRENZY = 54123, SPELL_FRENZY_H = 54124, MOB_WEBWRAP = 16486, MOB_SPIDERLING = 17055 }; // Positions for Web Wrap cocoons (near the wall) static const uint32 MAX_PLAYERS_WEB_WRAP = 3; WorldLocation WWlocs[MAX_PLAYERS_WEB_WRAP] = { WorldLocation(533,3502.164f,-3832.138f,305.178f,1.570f), WorldLocation(533,3544.651f,-3850.027f,299.068f,2.356f), WorldLocation(533,3561.365f,-3884.543f,297.819f,3.141f) }; // Cocoon AI. It frees player from SPELL_WEBWRAP_SELF when cocoon dies struct MANGOS_DLL_DECL mob_webwrapAI : public ScriptedAI { mob_webwrapAI(Creature *c) : ScriptedAI(c) {victimGUID = 0; Reset();} ObjectGuid victimGUID; void Reset() { victimGUID = 0; } void Aggro(Unit *who)
void LfgGroup::TeleportPlayer(Player *plr, DungeonInfo *dungeonInfo, uint32 originalDungeonId, bool newPlr) { if(newPlr) { plr->m_lookingForGroup.queuedDungeons.clear(); // must be before remove grom group if (Group *group = plr->GetGroup()) { if (!group->isLfgGroup()) { group->RemoveMember(plr->GetGUID(), 0); if (group->GetMembersCount() == 0) group->Disband(true); } plr->SetGroup(NULL); } plr->UnbindInstance(dungeonInfo->start_map, m_dungeonInfo->isHeroic() ? DUNGEON_DIFFICULTY_HEROIC : DUNGEON_DIFFICULTY_NORMAL); plr->ResetInstances(INSTANCE_RESET_GROUP_JOIN,false); plr->ResetInstances(INSTANCE_RESET_GROUP_JOIN,true); plr->ResetInstances(INSTANCE_RESET_ALL, true); plr->ResetInstances(INSTANCE_RESET_ALL, false); if (plr->getLevel() >= LEVELREQUIREMENT_HEROIC) { if (plr->GetDungeonDifficulty() != GetDungeonDifficulty()) plr->SetDungeonDifficulty(GetDungeonDifficulty()); if (plr->GetRaidDifficulty() != GetRaidDifficulty()) plr->SetRaidDifficulty(GetRaidDifficulty()); } plr->SetGroup(this, 0); plr->SetGroupInvite(NULL); uint32 taxi_start = 0; uint32 taxi_end = 0; uint32 mount_spell = 0; WorldLocation joinLoc; if (!plr->m_taxi.empty()) { taxi_start = plr->m_taxi.GetTaxiSource(); taxi_end = plr->m_taxi.GetTaxiDestination(); joinLoc = WorldLocation(plr->GetMapId(), plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), plr->GetOrientation()); } else { // Mount spell id storing if (plr->IsMounted()) { Unit::AuraList const& auras = plr->GetAurasByType(SPELL_AURA_MOUNTED); if (!auras.empty()) mount_spell = (*auras.begin())->GetId(); } if(!mount_spell && plr->getClass() == CLASS_DRUID) { Unit::AuraList const& auras = plr->GetAurasByType(SPELL_AURA_MOD_SHAPESHIFT); if (!auras.empty()) mount_spell = (*auras.begin())->GetId(); } //Nearest graveyard if in dungeon if (plr->GetMap()->IsDungeon()) { if (const WorldSafeLocsEntry* entry = sObjectMgr.GetClosestGraveYard(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), plr->GetMapId(), plr->GetTeam())) joinLoc = WorldLocation(entry->map_id, entry->x, entry->y, entry->z, 0.f); else joinLoc = plr->GetLocation(); } else joinLoc = plr->GetLocation(); } CharacterDatabase.PExecute("DELETE FROM group_member WHERE memberGuid='%u'", GUID_LOPART(plr->GetGUID())); CharacterDatabase.PExecute("INSERT INTO group_member(groupId,memberGuid,assistant,subgroup,lfg_join_x,lfg_join_y,lfg_join_z,lfg_join_o,lfg_join_map,taxi_start,taxi_end,mount_spell) " "VALUES('%u','%u','%u','%u','%f','%f','%f','%f','%u','%u','%u','%u')", m_Id, GUID_LOPART(plr->GetGUID()), 0, 1, joinLoc.x(), joinLoc.y(), joinLoc.z(), joinLoc.orientation, joinLoc.mapid, taxi_start, taxi_end, mount_spell); //Set info to player plr->m_lookingForGroup.joinLoc = joinLoc; plr->m_lookingForGroup.taxi_start = taxi_start; plr->m_lookingForGroup.taxi_end = taxi_end; plr->m_lookingForGroup.mount_spell = mount_spell; plr->m_lookingForGroup.roles = GetPlayerRole(plr->GetGUID()); if (IsRandom()) plr->CastSpell(plr, LFG_RANDOM_COOLDOWN, true); } // resurrect the player if (!plr->isAlive()) { plr->ResurrectPlayer(1.0f); plr->SpawnCorpseBones(); } // stop taxi flight at port if (plr->isInFlight()) { plr->GetMotionMaster()->MovementExpired(false); plr->GetMotionMaster()->Clear(false, true); plr->GetMotionMaster()->MoveIdle(); plr->m_taxi.ClearTaxiDestinations(); } plr->ScheduleDelayedOperation(DELAYED_LFG_ENTER_DUNGEON); plr->ScheduleDelayedOperation(DELAYED_SAVE_PLAYER); plr->ScheduleDelayedOperation(DELAYED_LFG_CLEAR_LOCKS); if(IsMixed()) { plr->m_lookingForGroup.SetMixedDungeon(dungeonInfo->start_map); if(newPlr) plr->setFaction(sWorld.getConfig(CONFIG_UINT32_TEAM_BG_FACTION_BLUE)); } if (IsInDungeon()) { if(newPlr) { for (GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next()) { Player *player = itr->getSource(); if (!player || player->GetMapId() != GetDungeonInfo()->map) continue; plr->TeleportTo(player->GetLocation()); return; } } plr->TeleportTo(dungeonInfo->start_map, dungeonInfo->start_x, dungeonInfo->start_y, dungeonInfo->start_z, dungeonInfo->start_o); return; } //Must re-add player to reset id... Map *map = plr->GetMap(); if(map->GetId() == dungeonInfo->start_map) { map->Remove(plr, false); map->Add(plr); } plr->TeleportTo(dungeonInfo->start_map, dungeonInfo->start_x, dungeonInfo->start_y, dungeonInfo->start_z, dungeonInfo->start_o); }