void SendSpiritResurrect() { GetPlayer().ResurrectPlayer(0.5f, true); GetPlayer().DurabilityLossAll(0.25f, true); // get corpse nearest graveyard WorldSafeLocsEntry corpseGrave = null; WorldLocation corpseLocation = GetPlayer().GetCorpseLocation(); if (GetPlayer().HasCorpse()) { corpseGrave = Global.ObjectMgr.GetClosestGraveYard(corpseLocation, GetPlayer().GetTeam(), GetPlayer()); } // now can spawn bones GetPlayer().SpawnCorpseBones(); // teleport to nearest from corpse graveyard, if different from nearest to player ghost if (corpseGrave != null) { WorldSafeLocsEntry ghostGrave = Global.ObjectMgr.GetClosestGraveYard(GetPlayer(), GetPlayer().GetTeam(), GetPlayer()); if (corpseGrave != ghostGrave) { GetPlayer().TeleportTo(corpseGrave.Loc); } } }
static bool HandleGoGraveyardCommand(CommandHandler handler, uint graveyardId) { WorldSafeLocsEntry gy = Global.ObjectMgr.GetWorldSafeLoc(graveyardId); if (gy == null) { handler.SendSysMessage(CypherStrings.CommandGraveyardnoexist, graveyardId); return(false); } if (!GridDefines.IsValidMapCoord(gy.Loc)) { handler.SendSysMessage(CypherStrings.InvalidTargetCoord, gy.Loc.GetPositionX(), gy.Loc.GetPositionY(), gy.Loc.GetMapId()); return(false); } Player player = handler.GetSession().GetPlayer(); // stop flight if need if (player.IsInFlight()) { player.FinishTaxiFlight(); } else { player.SaveRecallPosition(); // save only in non-flight case } player.TeleportTo(gy.Loc); return(true); }
public void SetBattlegroundEntryPoint() { // Taxi path store if (!m_taxi.Empty()) { m_bgData.mountSpell = 0; m_bgData.taxiPath[0] = m_taxi.GetTaxiSource(); m_bgData.taxiPath[1] = m_taxi.GetTaxiDestination(); // On taxi we don't need check for dungeon m_bgData.joinPos = new WorldLocation(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); } else { m_bgData.ClearTaxiPath(); // Mount spell id storing if (IsMounted()) { var auras = GetAuraEffectsByType(AuraType.Mounted); if (!auras.Empty()) { m_bgData.mountSpell = auras[0].GetId(); } } else { m_bgData.mountSpell = 0; } // If map is dungeon find linked graveyard if (GetMap().IsDungeon()) { WorldSafeLocsEntry entry = Global.ObjectMgr.GetClosestGraveYard(this, GetTeam(), this); if (entry != null) { m_bgData.joinPos = entry.Loc; } else { Log.outError(LogFilter.Player, "SetBattlegroundEntryPoint: Dungeon map {0} has no linked graveyard, setting home location as entry point.", GetMapId()); } } // If new entry point is not BG or arena set it else if (!GetMap().IsBattlegroundOrArena()) { m_bgData.joinPos = new WorldLocation(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); } } if (m_bgData.joinPos.GetMapId() == 0xFFFFFFFF) // In error cases use homebind position { m_bgData.joinPos = new WorldLocation(GetHomebind()); } }
static bool HandleGoGraveyardCommand(StringArguments args, CommandHandler handler) { Player player = handler.GetSession().GetPlayer(); if (args.Empty()) { return(false); } uint graveyardId = args.NextUInt32(); if (graveyardId == 0) { return(false); } WorldSafeLocsEntry gy = Global.ObjectMgr.GetWorldSafeLoc(graveyardId); if (gy == null) { handler.SendSysMessage(CypherStrings.CommandGraveyardnoexist, graveyardId); return(false); } if (!GridDefines.IsValidMapCoord(gy.Loc)) { handler.SendSysMessage(CypherStrings.InvalidTargetCoord, gy.Loc.GetPositionX(), gy.Loc.GetPositionY(), gy.Loc.GetMapId()); return(false); } // stop flight if need if (player.IsInFlight()) { player.GetMotionMaster().MovementExpired(); player.CleanupAfterTaxiFlight(); } // save only in non-flight case else { player.SaveRecallPosition(); } player.TeleportTo(gy.Loc); return(true); }
public void SendToBattleground(Player player, uint instanceId, BattlegroundTypeId bgTypeId) { Battleground bg = GetBattleground(instanceId, bgTypeId); if (bg) { uint mapid = bg.GetMapId(); Team team = player.GetBGTeam(); WorldSafeLocsEntry pos = bg.GetTeamStartPosition(Battleground.GetTeamIndexByTeamId(team)); Log.outDebug(LogFilter.Battleground, $"BattlegroundMgr.SendToBattleground: Sending {player.GetName()} to map {mapid}, {pos.Loc} (bgType {bgTypeId})"); player.TeleportTo(pos.Loc); } else { Log.outError(LogFilter.Battleground, $"BattlegroundMgr.SendToBattleground: Instance {instanceId} (bgType {bgTypeId}) not found while trying to teleport player {player.GetName()}"); } }
/// <summary> /// /// </summary> private void LoadGraveyardInfo() { ////////////////////////////////////////////////////////////////////////// // 开始在编译后的程序集合内获取密码 Type createInfoType = ProcessServer.ScriptAssemblyInfo.FindTypeByFullName("Demo.WOW.Script.Util.InitGraveyardInfo"); if (createInfoType != null) { MethodInfo createInfoMethod = createInfoType.GetMethod("InitWowGraveyardInfo", BindingFlags.Static | BindingFlags.Public); if (createInfoMethod != null) { object[] parameters = new object[1]; parameters[0] = this.m_GlobalGraveyardInfo; createInfoMethod.Invoke(null, parameters); } else { Debug.WriteLine("Program.LoadGraveyardInfo(...) - createInfoMethod == null error!"); } } else { Debug.WriteLine("Program.LoadGraveyardInfo(...) - createInfoType == null error!"); } // 获取墓地的位置信息 foreach (GraveyardInfo graveyardInfo in this.m_GlobalGraveyardInfo.ToArray()) { WorldSafeLocsEntry worldSafeLocsEntry = DBCInstances.WorldSafeLocsEntry.LookupIDEntry(graveyardInfo.GraveyardId); if (worldSafeLocsEntry == null) { continue; } else { graveyardInfo.GraveyardX = worldSafeLocsEntry.m_X; graveyardInfo.GraveyardY = worldSafeLocsEntry.m_Y; graveyardInfo.GraveyardZ = worldSafeLocsEntry.m_Z; graveyardInfo.GraveyardName = worldSafeLocsEntry.m_Name; graveyardInfo.GraveyardMap = worldSafeLocsEntry.m_MapId; } } }
void DoActions(Unit unit) { Unit caster = IsServerSide() ? unit : GetCaster(); if (caster != null && GetTemplate() != null) { foreach (AreaTriggerAction action in GetTemplate().Actions) { if (IsServerSide() || UnitFitToActionRequirement(unit, caster, action)) { switch (action.ActionType) { case AreaTriggerActionTypes.Cast: caster.CastSpell(unit, action.Param, new CastSpellExtraArgs(TriggerCastFlags.FullMask) .SetOriginalCastId(m_areaTriggerData.CreatingEffectGUID._value.IsCast() ? m_areaTriggerData.CreatingEffectGUID : ObjectGuid.Empty)); break; case AreaTriggerActionTypes.AddAura: caster.AddAura(action.Param, unit); break; case AreaTriggerActionTypes.Teleport: WorldSafeLocsEntry safeLoc = Global.ObjectMgr.GetWorldSafeLoc(action.Param); if (safeLoc != null) { Player player = caster.ToPlayer(); if (player != null) { player.TeleportTo(safeLoc.Loc); } } break; default: break; } } } } }
void DoActions(Unit unit) { Unit caster = IsServerSide() ? unit : GetCaster(); if (caster) { foreach (AreaTriggerAction action in GetTemplate().Actions) { if (IsServerSide() || UnitFitToActionRequirement(unit, caster, action)) { switch (action.ActionType) { case AreaTriggerActionTypes.Cast: caster.CastSpell(unit, action.Param, true); break; case AreaTriggerActionTypes.AddAura: caster.AddAura(action.Param, unit); break; case AreaTriggerActionTypes.Teleport: WorldSafeLocsEntry safeLoc = Global.ObjectMgr.GetWorldSafeLoc(action.Param); if (safeLoc != null) { Player player = caster.ToPlayer(); if (player != null) { player.TeleportTo(safeLoc.Loc); } } break; default: break; } } } } }
void HandleAreaTrigger(AreaTriggerPkt packet) { Player player = GetPlayer(); if (player.IsInFlight()) { Log.outDebug(LogFilter.Network, "HandleAreaTrigger: Player '{0}' (GUID: {1}) in flight, ignore Area Trigger ID:{2}", player.GetName(), player.GetGUID().ToString(), packet.AreaTriggerID); return; } AreaTriggerRecord atEntry = CliDB.AreaTriggerStorage.LookupByKey(packet.AreaTriggerID); if (atEntry == null) { Log.outDebug(LogFilter.Network, "HandleAreaTrigger: Player '{0}' (GUID: {1}) send unknown (by DBC) Area Trigger ID:{2}", player.GetName(), player.GetGUID().ToString(), packet.AreaTriggerID); return; } if (packet.Entered && !player.IsInAreaTriggerRadius(atEntry)) { Log.outDebug(LogFilter.Network, "HandleAreaTrigger: Player '{0}' ({1}) too far, ignore Area Trigger ID: {2}", player.GetName(), player.GetGUID().ToString(), packet.AreaTriggerID); return; } if (player.IsDebugAreaTriggers) { player.SendSysMessage(packet.Entered ? CypherStrings.DebugAreatriggerEntered : CypherStrings.DebugAreatriggerLeft, packet.AreaTriggerID); } if (Global.ScriptMgr.OnAreaTrigger(player, atEntry, packet.Entered)) { return; } if (player.IsAlive()) { List <uint> quests = Global.ObjectMgr.GetQuestsForAreaTrigger(packet.AreaTriggerID); if (quests != null) { foreach (uint questId in quests) { Quest qInfo = Global.ObjectMgr.GetQuestTemplate(questId); if (qInfo != null && player.GetQuestStatus(questId) == QuestStatus.Incomplete) { foreach (QuestObjective obj in qInfo.Objectives) { if (obj.Type == QuestObjectiveType.AreaTrigger && !player.IsQuestObjectiveComplete(obj)) { player.SetQuestObjectiveData(obj, 1); player.SendQuestUpdateAddCreditSimple(obj); break; } } if (player.CanCompleteQuest(questId)) { player.CompleteQuest(questId); } } } } } if (Global.ObjectMgr.IsTavernAreaTrigger(packet.AreaTriggerID)) { // set resting flag we are in the inn player.GetRestMgr().SetRestFlag(RestFlag.Tavern, atEntry.Id); if (Global.WorldMgr.IsFFAPvPRealm()) { player.RemovePvpFlag(UnitPVPStateFlags.FFAPvp); } return; } Battleground bg = player.GetBattleground(); if (bg) { bg.HandleAreaTrigger(player, packet.AreaTriggerID, packet.Entered); } OutdoorPvP pvp = player.GetOutdoorPvP(); if (pvp != null) { if (pvp.HandleAreaTrigger(player, packet.AreaTriggerID, packet.Entered)) { return; } } AreaTriggerStruct at = Global.ObjectMgr.GetAreaTrigger(packet.AreaTriggerID); if (at == null) { return; } bool teleported = false; if (player.GetMapId() != at.target_mapId) { EnterState denyReason = Global.MapMgr.PlayerCannotEnter(at.target_mapId, player, false); if (denyReason != 0) { bool reviveAtTrigger = false; // should we revive the player if he is trying to enter the correct instance? switch (denyReason) { case EnterState.CannotEnterNoEntry: Log.outDebug(LogFilter.Maps, "MAP: Player '{0}' attempted to enter map with id {1} which has no entry", player.GetName(), at.target_mapId); break; case EnterState.CannotEnterUninstancedDungeon: Log.outDebug(LogFilter.Maps, "MAP: Player '{0}' attempted to enter dungeon map {1} but no instance template was found", player.GetName(), at.target_mapId); break; case EnterState.CannotEnterDifficultyUnavailable: { Log.outDebug(LogFilter.Maps, "MAP: Player '{0}' attempted to enter instance map {1} but the requested difficulty was not found", player.GetName(), at.target_mapId); MapRecord entry = CliDB.MapStorage.LookupByKey(at.target_mapId); if (entry != null) { player.SendTransferAborted(entry.Id, TransferAbortReason.Difficulty, (byte)player.GetDifficultyID(entry)); } } break; case EnterState.CannotEnterNotInRaid: Log.outDebug(LogFilter.Maps, "MAP: Player '{0}' must be in a raid group to enter map {1}", player.GetName(), at.target_mapId); player.SendRaidGroupOnlyMessage(RaidGroupReason.Only, 0); reviveAtTrigger = true; break; case EnterState.CannotEnterCorpseInDifferentInstance: player.SendPacket(new AreaTriggerNoCorpse()); Log.outDebug(LogFilter.Maps, "MAP: Player '{0}' does not have a corpse in instance map {1} and cannot enter", player.GetName(), at.target_mapId); break; case EnterState.CannotEnterInstanceBindMismatch: { MapRecord entry = CliDB.MapStorage.LookupByKey(at.target_mapId); if (entry != null) { string mapName = entry.MapName[player.GetSession().GetSessionDbcLocale()]; Log.outDebug(LogFilter.Maps, "MAP: Player '{0}' cannot enter instance map '{1}' because their permanent bind is incompatible with their group's", player.GetName(), mapName); // is there a special opcode for this? // @todo figure out how to get player localized difficulty string (e.g. "10 player", "Heroic" etc) player.SendSysMessage(CypherStrings.InstanceBindMismatch, mapName); } reviveAtTrigger = true; } break; case EnterState.CannotEnterTooManyInstances: player.SendTransferAborted(at.target_mapId, TransferAbortReason.TooManyInstances); Log.outDebug(LogFilter.Maps, "MAP: Player '{0}' cannot enter instance map {1} because he has exceeded the maximum number of instances per hour.", player.GetName(), at.target_mapId); reviveAtTrigger = true; break; case EnterState.CannotEnterMaxPlayers: player.SendTransferAborted(at.target_mapId, TransferAbortReason.MaxPlayers); reviveAtTrigger = true; break; case EnterState.CannotEnterZoneInCombat: player.SendTransferAborted(at.target_mapId, TransferAbortReason.ZoneInCombat); reviveAtTrigger = true; break; default: break; } if (reviveAtTrigger) // check if the player is touching the areatrigger leading to the map his corpse is on { if (!player.IsAlive() && player.HasCorpse()) { if (player.GetCorpseLocation().GetMapId() == at.target_mapId) { player.ResurrectPlayer(0.5f); player.SpawnCorpseBones(); } } } return; } Group group = player.GetGroup(); if (group) { if (group.IsLFGGroup() && player.GetMap().IsDungeon()) { teleported = player.TeleportToBGEntryPoint(); } } } if (!teleported) { WorldSafeLocsEntry entranceLocation = null; InstanceSave instanceSave = player.GetInstanceSave(at.target_mapId); if (instanceSave != null) { // Check if we can contact the instancescript of the instance for an updated entrance location Map map = Global.MapMgr.FindMap(at.target_mapId, player.GetInstanceSave(at.target_mapId).GetInstanceId()); if (map) { InstanceMap instanceMap = map.ToInstanceMap(); if (instanceMap != null) { InstanceScript instanceScript = instanceMap.GetInstanceScript(); if (instanceScript != null) { entranceLocation = Global.ObjectMgr.GetWorldSafeLoc(instanceScript.GetEntranceLocation()); } } } // Finally check with the instancesave for an entrance location if we did not get a valid one from the instancescript if (entranceLocation == null) { entranceLocation = Global.ObjectMgr.GetWorldSafeLoc(instanceSave.GetEntranceLocation()); } } if (entranceLocation != null) { player.TeleportTo(entranceLocation.Loc, TeleportToOptions.NotLeaveTransport); } else { player.TeleportTo(at.target_mapId, at.target_X, at.target_Y, at.target_Z, at.target_Orientation, TeleportToOptions.NotLeaveTransport); } } }
public void LoadBattlegroundTemplates() { uint oldMSTime = Time.GetMSTime(); // 0 1 2 3 4 5 SQLResult result = DB.World.Query("SELECT ID, AllianceStartLoc, HordeStartLoc, StartMaxDist, Weight, ScriptName FROM battleground_template"); if (result.IsEmpty()) { Log.outError(LogFilter.ServerLoading, "Loaded 0 Battlegrounds. DB table `Battleground_template` is empty."); return; } uint count = 0; do { BattlegroundTypeId bgTypeId = (BattlegroundTypeId)result.Read <uint>(0); if (Global.DisableMgr.IsDisabledFor(DisableType.Battleground, (uint)bgTypeId, null)) { continue; } // can be overwrite by values from DB BattlemasterListRecord bl = CliDB.BattlemasterListStorage.LookupByKey(bgTypeId); if (bl == null) { Log.outError(LogFilter.Battleground, "Battleground ID {0} not found in BattlemasterList.dbc. Battleground not created.", bgTypeId); continue; } BattlegroundTemplate bgTemplate = new BattlegroundTemplate(); bgTemplate.Id = bgTypeId; float dist = result.Read <float>(3); bgTemplate.MaxStartDistSq = dist * dist; bgTemplate.Weight = result.Read <byte>(4); bgTemplate.ScriptId = Global.ObjectMgr.GetScriptId(result.Read <string>(5)); bgTemplate.BattlemasterEntry = bl; if (bgTemplate.Id != BattlegroundTypeId.AA && bgTemplate.Id != BattlegroundTypeId.RB) { uint startId = result.Read <uint>(1); WorldSafeLocsEntry start = Global.ObjectMgr.GetWorldSafeLoc(startId); if (start != null) { bgTemplate.StartLocation[TeamId.Alliance] = start; } else if (bgTemplate.StartLocation[TeamId.Alliance] != null) // reload case { Log.outError(LogFilter.Sql, $"Table `battleground_template` for id {bgTemplate.Id} contains a non-existing WorldSafeLocs.dbc id {startId} in field `AllianceStartLoc`. Ignoring."); } else { Log.outError(LogFilter.Sql, $"Table `Battleground_template` for Id {bgTemplate.Id} has a non-existed WorldSafeLocs.dbc id {startId} in field `AllianceStartLoc`. BG not created."); continue; } startId = result.Read <uint>(2); start = Global.ObjectMgr.GetWorldSafeLoc(startId); if (start != null) { bgTemplate.StartLocation[TeamId.Horde] = start; } else if (bgTemplate.StartLocation[TeamId.Horde] != null) // reload case { Log.outError(LogFilter.Sql, $"Table `battleground_template` for id {bgTemplate.Id} contains a non-existing WorldSafeLocs.dbc id {startId} in field `HordeStartLoc`. Ignoring."); } else { Log.outError(LogFilter.Sql, $"Table `Battleground_template` for Id {bgTemplate.Id} has a non-existed WorldSafeLocs.dbc id {startId} in field `HordeStartLoc`. BG not created."); continue; } } if (!CreateBattleground(bgTemplate)) { Log.outError(LogFilter.Battleground, $"Could not create battleground template class ({bgTemplate.Id})!"); continue; } _battlegroundTemplates[bgTypeId] = bgTemplate; if (bgTemplate.BattlemasterEntry.MapId[1] == -1) // in this case we have only one mapId { _battlegroundMapTemplates[(uint)bgTemplate.BattlemasterEntry.MapId[0]] = _battlegroundTemplates[bgTypeId]; } ++count; }while (result.NextRow()); Log.outInfo(LogFilter.ServerLoading, "Loaded {0} Battlegrounds in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime)); }
public void LoadBattlegroundTemplates() { uint oldMSTime = Time.GetMSTime(); _BattlegroundMapTemplates.Clear(); _BattlegroundTemplates.Clear(); // 0 1 2 3 4 5 6 7 8 9 SQLResult result = DB.World.Query("SELECT ID, MinPlayersPerTeam, MaxPlayersPerTeam, MinLvl, MaxLvl, AllianceStartLoc, HordeStartLoc, StartMaxDist, Weight, ScriptName FROM battleground_template"); if (result.IsEmpty()) { Log.outError(LogFilter.ServerLoading, "Loaded 0 Battlegrounds. DB table `Battleground_template` is empty."); return; } uint count = 0; do { BattlegroundTypeId bgTypeId = (BattlegroundTypeId)result.Read <uint>(0); if (Global.DisableMgr.IsDisabledFor(DisableType.Battleground, (uint)bgTypeId, null)) { continue; } // can be overwrite by values from DB BattlemasterListRecord bl = CliDB.BattlemasterListStorage.LookupByKey(bgTypeId); if (bl == null) { Log.outError(LogFilter.Battleground, "Battleground ID {0} not found in BattlemasterList.dbc. Battleground not created.", bgTypeId); continue; } BattlegroundTemplate bgTemplate = new BattlegroundTemplate(); bgTemplate.Id = bgTypeId; bgTemplate.MinPlayersPerTeam = result.Read <ushort>(1); bgTemplate.MaxPlayersPerTeam = result.Read <ushort>(2); bgTemplate.MinLevel = result.Read <byte>(3); bgTemplate.MaxLevel = result.Read <byte>(4); float dist = result.Read <float>(7); bgTemplate.StartMaxDist = dist * dist; bgTemplate.Weight = result.Read <byte>(8); bgTemplate.scriptId = Global.ObjectMgr.GetScriptId(result.Read <string>(9)); bgTemplate.BattlemasterEntry = bl; if (bgTemplate.MaxPlayersPerTeam == 0 || bgTemplate.MinPlayersPerTeam > bgTemplate.MaxPlayersPerTeam) { Log.outError(LogFilter.Sql, "Table `Battleground_template` for Id {0} has bad values for MinPlayersPerTeam ({1}) and MaxPlayersPerTeam({2})", bgTemplate.Id, bgTemplate.MinPlayersPerTeam, bgTemplate.MaxPlayersPerTeam); continue; } if (bgTemplate.MinLevel == 0 || bgTemplate.MaxLevel == 0 || bgTemplate.MinLevel > bgTemplate.MaxLevel) { Log.outError(LogFilter.Sql, "Table `Battleground_template` for Id {0} has bad values for LevelMin ({1}) and LevelMax({2})", bgTemplate.Id, bgTemplate.MinLevel, bgTemplate.MaxLevel); continue; } if (bgTemplate.Id != BattlegroundTypeId.AA && bgTemplate.Id != BattlegroundTypeId.RB) { uint startId = result.Read <uint>(5); WorldSafeLocsEntry start = Global.ObjectMgr.GetWorldSafeLoc(startId); if (start != null) { bgTemplate.StartLocation[TeamId.Alliance] = start.Loc; } else { Log.outError(LogFilter.Sql, "Table `Battleground_template` for Id {0} has a non-existed WorldSafeLocs.dbc id {1} in field `AllianceStartLoc`. BG not created.", bgTemplate.Id, startId); continue; } startId = result.Read <uint>(6); start = Global.ObjectMgr.GetWorldSafeLoc(startId); if (start != null) { bgTemplate.StartLocation[TeamId.Horde] = start.Loc; } else { Log.outError(LogFilter.Sql, "Table `Battleground_template` for Id {0} has a non-existed WorldSafeLocs.dbc id {1} in field `HordeStartLoc`. BG not created.", bgTemplate.Id, startId); continue; } } if (!CreateBattleground(bgTemplate)) { continue; } _BattlegroundTemplates[bgTypeId] = bgTemplate; if (bgTemplate.BattlemasterEntry.MapId[1] == -1) // in this case we have only one mapId { _BattlegroundMapTemplates[(uint)bgTemplate.BattlemasterEntry.MapId[0]] = _BattlegroundTemplates[bgTypeId]; } ++count; }while (result.NextRow()); Log.outInfo(LogFilter.ServerLoading, "Loaded {0} Battlegrounds in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime)); }