SpellCastResult CheckElevation() { WorldLocation dest = GetExplTargetDest(); if (dest != null) { if (GetCaster().HasUnitMovementFlag(MovementFlag.Root)) { return(SpellCastResult.Rooted); } if (GetCaster().GetMap().Instanceable()) { float range = GetSpellInfo().GetMaxRange(true, GetCaster()) * 1.5f; PathGenerator generatedPath = new PathGenerator(GetCaster()); generatedPath.SetPathLengthLimit(range); bool result = generatedPath.CalculatePath(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false, true); if (generatedPath.GetPathType().HasAnyFlag(PathType.Short)) { return(SpellCastResult.OutOfRange); } else if (!result || generatedPath.GetPathType().HasAnyFlag(PathType.NoPath)) { result = generatedPath.CalculatePath(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false, false); if (generatedPath.GetPathType().HasAnyFlag(PathType.Short)) { return(SpellCastResult.OutOfRange); } else if (!result || generatedPath.GetPathType().HasAnyFlag(PathType.NoPath)) { return(SpellCastResult.NoPath); } } } else if (dest.GetPositionZ() > GetCaster().GetPositionZ() + 4.0f) { return(SpellCastResult.NoPath); } return(SpellCastResult.SpellCastOk); } return(SpellCastResult.NoValidTargets); }
void HandleDummy(uint effIndex) { WorldLocation dest = GetHitDest(); if (dest != null) { GetCaster().CastSpell(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), SpellIds.HeroicLeapJump, true); } }
void HandleDummy() { if (GetCaster().HasAura(SpellIds.TighteningGrasp)) { WorldLocation pos = GetExplTargetDest(); if (pos != null) { GetCaster().CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SpellIds.TighteningGraspSlow, true); } } }
void HandleQueryCorpseLocation(QueryCorpseLocationFromClient queryCorpseLocation) { CorpseLocation packet = new CorpseLocation(); Player player = Global.ObjAccessor.FindConnectedPlayer(queryCorpseLocation.Player); if (!player || !player.HasCorpse() || !_player.IsInSameRaidWith(player)) { packet.Valid = false; // corpse not found packet.Player = queryCorpseLocation.Player; SendPacket(packet); return; } WorldLocation corpseLocation = player.GetCorpseLocation(); uint corpseMapID = corpseLocation.GetMapId(); uint mapID = corpseLocation.GetMapId(); float x = corpseLocation.GetPositionX(); float y = corpseLocation.GetPositionY(); float z = corpseLocation.GetPositionZ(); // if corpse at different map if (mapID != player.GetMapId()) { // search entrance map for proper show entrance MapRecord corpseMapEntry = CliDB.MapStorage.LookupByKey(mapID); if (corpseMapEntry != null) { if (corpseMapEntry.IsDungeon() && corpseMapEntry.CorpseMapID >= 0) { // if corpse map have entrance Map entranceMap = Global.MapMgr.CreateBaseMap((uint)corpseMapEntry.CorpseMapID); if (entranceMap != null) { mapID = (uint)corpseMapEntry.CorpseMapID; x = corpseMapEntry.Corpse.X; y = corpseMapEntry.Corpse.Y; z = entranceMap.GetHeight(player.GetPhaseShift(), x, y, MapConst.MaxHeight); } } } } packet.Valid = true; packet.Player = queryCorpseLocation.Player; packet.MapID = (int)corpseMapID; packet.ActualMapID = (int)mapID; packet.Position = new Vector3(x, y, z); packet.Transport = ObjectGuid.Empty; SendPacket(packet); }
void HandleMoveWorldportAck() { // ignore unexpected far teleports if (!GetPlayer().IsBeingTeleportedFar()) { return; } bool seamlessTeleport = GetPlayer().IsBeingTeleportedSeamlessly(); GetPlayer().SetSemaphoreTeleportFar(false); // get the teleport destination WorldLocation loc = GetPlayer().GetTeleportDest(); // possible errors in the coordinate validity check if (!GridDefines.IsValidMapCoord(loc)) { LogoutPlayer(false); return; } // get the destination map entry, not the current one, this will fix homebind and reset greeting MapRecord mapEntry = CliDB.MapStorage.LookupByKey(loc.GetMapId()); InstanceTemplate mInstance = Global.ObjectMgr.GetInstanceTemplate(loc.GetMapId()); // reset instance validity, except if going to an instance inside an instance if (!GetPlayer().m_InstanceValid&& mInstance == null) { GetPlayer().m_InstanceValid = true; } Map oldMap = GetPlayer().GetMap(); Map newMap = Global.MapMgr.CreateMap(loc.GetMapId(), GetPlayer()); if (GetPlayer().IsInWorld) { Log.outError(LogFilter.Network, "Player (Name {0}) is still in world when teleported from map {1} to new map {2}", GetPlayer().GetName(), oldMap.GetId(), loc.GetMapId()); oldMap.RemovePlayerFromMap(GetPlayer(), false); } // relocate the player to the teleport destination // the CannotEnter checks are done in TeleporTo but conditions may change // while the player is in transit, for example the map may get full if (newMap == null || newMap.CannotEnter(GetPlayer()) != 0) { Log.outError(LogFilter.Network, "Map {0} could not be created for {1} ({2}), porting player to homebind", loc.GetMapId(), newMap ? newMap.GetMapName() : "Unknown", GetPlayer().GetGUID().ToString()); GetPlayer().TeleportTo(GetPlayer().GetHomebind()); return; } float z = loc.GetPositionZ(); if (GetPlayer().HasUnitMovementFlag(MovementFlag.Hover)) { z += GetPlayer().m_unitData.HoverHeight; } GetPlayer().Relocate(loc.GetPositionX(), loc.GetPositionY(), z, loc.GetOrientation()); GetPlayer().SetFallInformation(0, GetPlayer().GetPositionZ()); GetPlayer().ResetMap(); GetPlayer().SetMap(newMap); ResumeToken resumeToken = new ResumeToken(); resumeToken.SequenceIndex = _player.m_movementCounter; resumeToken.Reason = seamlessTeleport ? 2 : 1u; SendPacket(resumeToken); if (!seamlessTeleport) { GetPlayer().SendInitialPacketsBeforeAddToMap(); } if (!GetPlayer().GetMap().AddPlayerToMap(GetPlayer(), !seamlessTeleport)) { Log.outError(LogFilter.Network, "WORLD: failed to teleport player {0} ({1}) to map {2} ({3}) because of unknown reason!", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), loc.GetMapId(), newMap ? newMap.GetMapName() : "Unknown"); GetPlayer().ResetMap(); GetPlayer().SetMap(oldMap); GetPlayer().TeleportTo(GetPlayer().GetHomebind()); return; } // Battleground state prepare (in case join to BG), at relogin/tele player not invited // only add to bg group and object, if the player was invited (else he entered through command) if (GetPlayer().InBattleground()) { // cleanup setting if outdated if (!mapEntry.IsBattlegroundOrArena()) { // We're not in BG GetPlayer().SetBattlegroundId(0, BattlegroundTypeId.None); // reset destination bg team GetPlayer().SetBGTeam(0); } // join to bg case else { Battleground bg = GetPlayer().GetBattleground(); if (bg) { if (GetPlayer().IsInvitedForBattlegroundInstance(GetPlayer().GetBattlegroundId())) { bg.AddPlayer(GetPlayer()); } } } } if (!seamlessTeleport) { GetPlayer().SendInitialPacketsAfterAddToMap(); } else { GetPlayer().UpdateVisibilityForPlayer(); Garrison garrison = GetPlayer().GetGarrison(); if (garrison != null) { garrison.SendRemoteInfo(); } } // flight fast teleport case if (GetPlayer().GetMotionMaster().GetCurrentMovementGeneratorType() == MovementGeneratorType.Flight) { if (!GetPlayer().InBattleground()) { if (!seamlessTeleport) { // short preparations to continue flight IMovementGenerator movementGenerator = GetPlayer().GetMotionMaster().Top(); movementGenerator.Initialize(GetPlayer()); } return; } // Battlegroundstate prepare, stop flight GetPlayer().GetMotionMaster().MovementExpired(); GetPlayer().CleanupAfterTaxiFlight(); } // resurrect character at enter into instance where his corpse exist after add to map if (mapEntry.IsDungeon() && !GetPlayer().IsAlive()) { if (GetPlayer().GetCorpseLocation().GetMapId() == mapEntry.Id) { GetPlayer().ResurrectPlayer(0.5f, false); GetPlayer().SpawnCorpseBones(); } } bool allowMount = !mapEntry.IsDungeon() || mapEntry.IsBattlegroundOrArena(); if (mInstance != null) { // check if this instance has a reset time and send it to player if so Difficulty diff = newMap.GetDifficultyID(); MapDifficultyRecord mapDiff = Global.DB2Mgr.GetMapDifficultyData(mapEntry.Id, diff); if (mapDiff != null) { if (mapDiff.GetRaidDuration() != 0) { long timeReset = Global.InstanceSaveMgr.GetResetTimeFor(mapEntry.Id, diff); if (timeReset != 0) { uint timeleft = (uint)(timeReset - Time.UnixTime); GetPlayer().SendInstanceResetWarning(mapEntry.Id, diff, timeleft, true); } } } // check if instance is valid if (!GetPlayer().CheckInstanceValidity(false)) { GetPlayer().m_InstanceValid = false; } // instance mounting is handled in InstanceTemplate allowMount = mInstance.AllowMount; } // mount allow check if (!allowMount) { GetPlayer().RemoveAurasByType(AuraType.Mounted); } // update zone immediately, otherwise leave channel will cause crash in mtmap uint newzone, newarea; GetPlayer().GetZoneAndAreaId(out newzone, out newarea); GetPlayer().UpdateZone(newzone, newarea); // honorless target if (GetPlayer().pvpInfo.IsHostile) { GetPlayer().CastSpell(GetPlayer(), 2479, true); } // in friendly area else if (GetPlayer().IsPvP() && !GetPlayer().HasPlayerFlag(PlayerFlags.InPVP)) { GetPlayer().UpdatePvP(false, false); } // resummon pet GetPlayer().ResummonPetTemporaryUnSummonedIfAny(); //lets process all delayed operations on successful teleport GetPlayer().ProcessDelayedOperations(); }
void SendSpiritResurrect() { GetPlayer().ResurrectPlayer(0.5f, true); GetPlayer().DurabilityLossAll(0.25f, true); // get corpse nearest graveyard WorldSafeLocsRecord corpseGrave = null; WorldLocation corpseLocation = GetPlayer().GetCorpseLocation(); if (GetPlayer().HasCorpse()) { corpseGrave = Global.ObjectMgr.GetClosestGraveYard(corpseLocation.GetPositionX(), corpseLocation.GetPositionY(), corpseLocation.GetPositionZ(), corpseLocation.GetMapId(), GetPlayer().GetTeam()); } // now can spawn bones GetPlayer().SpawnCorpseBones(); // teleport to nearest from corpse graveyard, if different from nearest to player ghost if (corpseGrave != null) { WorldSafeLocsRecord ghostGrave = Global.ObjectMgr.GetClosestGraveYard( GetPlayer().GetPositionX(), GetPlayer().GetPositionY(), GetPlayer().GetPositionZ(), GetPlayer().GetMapId(), GetPlayer().GetTeam()); if (corpseGrave != ghostGrave) { GetPlayer().TeleportTo(corpseGrave.MapID, corpseGrave.Loc.X, corpseGrave.Loc.Y, corpseGrave.Loc.Z, GetPlayer().GetOrientation()); } // or update at original position else { GetPlayer().UpdateObjectVisibility(); } } // or update at original position else { GetPlayer().UpdateObjectVisibility(); } }
public static bool IsValidMapCoord(WorldLocation loc) { return(IsValidMapCoord(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation())); }