void SetTargetLocation(T owner) { if (owner == null) { return; } if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting()) { _interrupt = true; owner.StopMoving(); return; } owner.AddUnitState(UnitState.FleeingMove); Position destination = owner.GetPosition(); GetPoint(owner, ref destination); // Add LOS check for target point Position currentPosition = owner.GetPosition(); bool isInLOS = Global.VMapMgr.IsInLineOfSight(PhasingHandler.GetTerrainMapId(owner.GetPhaseShift(), owner.GetMap(), currentPosition.posX, currentPosition.posY), currentPosition.posX, currentPosition.posY, currentPosition.posZ + 2.0f, destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ() + 2.0f, ModelIgnoreFlags.Nothing); if (!isInLOS) { _timer.Reset(200); return; } if (_path == null) { _path = new PathGenerator(owner); } _path.SetPathLengthLimit(30.0f); bool result = _path.CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ()); if (!result || _path.GetPathType().HasAnyFlag(PathType.NoPath)) { _timer.Reset(100); return; } MoveSplineInit init = new MoveSplineInit(owner); init.MovebyPath(_path.GetPath()); init.SetWalk(false); int traveltime = init.Launch(); _timer.Reset(traveltime + RandomHelper.URand(800, 1500)); }
public Creature CreateNPCPassenger(ulong guid, CreatureData data) { Map map = GetMap(); if (map.GetCreatureRespawnTime(guid) != 0) { return(null); } Creature creature = Creature.CreateCreatureFromDB(guid, map, false, true); if (!creature) { return(null); } float x, y, z, o; data.spawnPoint.GetPosition(out x, out y, out z, out o); creature.SetTransport(this); creature.m_movementInfo.transport.guid = GetGUID(); creature.m_movementInfo.transport.pos.Relocate(x, y, z, o); creature.m_movementInfo.transport.seat = -1; CalculatePassengerPosition(ref x, ref y, ref z, ref o); creature.Relocate(x, y, z, o); creature.SetHomePosition(creature.GetPositionX(), creature.GetPositionY(), creature.GetPositionZ(), creature.GetOrientation()); creature.SetTransportHomePosition(creature.m_movementInfo.transport.pos); // @HACK - transport models are not added to map's dynamic LoS calculations // because the current GameObjectModel cannot be moved without recreating creature.AddUnitState(UnitState.IgnorePathfinding); if (!creature.IsPositionValid()) { Log.outError(LogFilter.Transport, "Creature (guidlow {0}, entry {1}) not created. Suggested coordinates aren't valid (X: {2} Y: {3})", creature.GetGUID().ToString(), creature.GetEntry(), creature.GetPositionX(), creature.GetPositionY()); return(null); } PhasingHandler.InitDbPhaseShift(creature.GetPhaseShift(), data.phaseUseFlags, data.phaseId, data.phaseGroup); PhasingHandler.InitDbVisibleMapId(creature.GetPhaseShift(), data.terrainSwapMap); if (!map.AddToMap(creature)) { return(null); } _staticPassengers.Add(creature); Global.ScriptMgr.OnAddCreaturePassenger(this, creature); return(creature); }
static bool HandleModifyPhaseCommand(StringArguments args, CommandHandler handler) { if (args.Empty()) { return(false); } uint phaseId = args.NextUInt32(); uint visibleMapId = args.NextUInt32(); if (phaseId != 0 && !CliDB.PhaseStorage.ContainsKey(phaseId)) { handler.SendSysMessage(CypherStrings.PhaseNotfound); return(false); } Unit target = handler.GetSelectedUnit(); if (visibleMapId != 0) { MapRecord visibleMap = CliDB.MapStorage.LookupByKey(visibleMapId); if (visibleMap == null || visibleMap.ParentMapID != target.GetMapId()) { handler.SendSysMessage(CypherStrings.PhaseNotfound); return(false); } if (!target.GetPhaseShift().HasVisibleMapId(visibleMapId)) { PhasingHandler.AddVisibleMapId(target, visibleMapId); } else { PhasingHandler.RemoveVisibleMapId(target, visibleMapId); } } if (phaseId != 0) { if (!target.GetPhaseShift().HasPhase(phaseId)) { PhasingHandler.AddPhase(target, phaseId, true); } else { PhasingHandler.RemovePhase(target, phaseId, true); } } return(true); }
void UpdateArea(uint newArea) { // FFA_PVP flags are area and not zone id dependent // so apply them accordingly m_areaUpdateId = newArea; AreaTableRecord area = CliDB.AreaTableStorage.LookupByKey(newArea); pvpInfo.IsInFFAPvPArea = area != null && area.Flags[0].HasAnyFlag(AreaFlags.Arena); UpdatePvPState(true); UpdateAreaDependentAuras(newArea); PhasingHandler.OnAreaChange(this); if (IsAreaThatActivatesPvpTalents(newArea)) { EnablePvpRules(); } else { DisablePvpRules(); } // previously this was in UpdateZone (but after UpdateArea) so nothing will break pvpInfo.IsInNoPvPArea = false; if (area != null && area.IsSanctuary()) // in sanctuary { SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.Sanctuary); pvpInfo.IsInNoPvPArea = true; if (duel == null) { CombatStopWithPets(); } } else { RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.Sanctuary); } AreaFlags areaRestFlag = (GetTeam() == Team.Alliance) ? AreaFlags.RestZoneAlliance : AreaFlags.RestZoneHorde; if (area != null && area.Flags[0].HasAnyFlag(areaRestFlag)) { _restMgr.SetRestFlag(RestFlag.FactionArea); } else { _restMgr.RemoveRestFlag(RestFlag.FactionArea); } }
public override void SpellHitTarget(Unit target, SpellInfo spell) { if (spell.Id == SpellIds.Insanity) { // Not good target or too many players if (target.GetTypeId() != TypeId.Player || insanityHandled > 4) { return; } // First target - start channel visual and set self as unnattackable if (insanityHandled == 0) { // Channel visual DoCast(me, SpellIds.InsanityVisual, true); // Unattackable me.AddUnitFlag(UnitFlags.NotSelectable); me.SetControlled(true, UnitState.Stunned); } // phase the player target.CastSpell(target, SpellIds.InsanityTarget + insanityHandled, true); SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(SpellIds.InsanityTarget + insanityHandled, GetDifficulty()); if (spellInfo == null) { return; } // summon twisted party members for this target var players = me.GetMap().GetPlayers(); foreach (var player in players) { if (!player || !player.IsAlive()) { continue; } // Summon clone Unit summon = me.SummonCreature(AKCreatureIds.TwistedVisage, me.GetPositionX(), me.GetPositionY(), me.GetPositionZ(), me.GetOrientation(), TempSummonType.CorpseDespawn, 0); if (summon) { // clone player.CastSpell(summon, SpellIds.ClonePlayer, true); // phase the summon PhasingHandler.AddPhase(summon, (uint)spellInfo.GetEffect(0).MiscValueB, true); } } ++insanityHandled; } }
static bool HandleMmapStatsCommand(StringArguments args, CommandHandler handler) { Player player = handler.GetSession().GetPlayer(); uint terrainMapId = PhasingHandler.GetTerrainMapId(player.GetPhaseShift(), player.GetMap(), player.GetPositionX(), player.GetPositionY()); handler.SendSysMessage("mmap stats:"); handler.SendSysMessage(" global mmap pathfinding is {0}abled", Global.DisableMgr.IsPathfindingEnabled(player.GetMapId()) ? "En" : "Dis"); handler.SendSysMessage(" {0} maps loaded with {1} tiles overall", Global.MMapMgr.getLoadedMapsCount(), Global.MMapMgr.getLoadedTilesCount()); Detour.dtNavMesh navmesh = Global.MMapMgr.GetNavMesh(terrainMapId); if (navmesh == null) { handler.SendSysMessage("NavMesh not loaded for current map."); return(true); } uint tileCount = 0; int nodeCount = 0; int polyCount = 0; int vertCount = 0; int triCount = 0; int triVertCount = 0; for (int i = 0; i < navmesh.getMaxTiles(); ++i) { Detour.dtMeshTile tile = navmesh.getTile(i); if (tile == null) { continue; } tileCount++; nodeCount += tile.header.bvNodeCount; polyCount += tile.header.polyCount; vertCount += tile.header.vertCount; triCount += tile.header.detailTriCount; triVertCount += tile.header.detailVertCount; } handler.SendSysMessage("Navmesh stats:"); handler.SendSysMessage(" {0} tiles loaded", tileCount); handler.SendSysMessage(" {0} BVTree nodes", nodeCount); handler.SendSysMessage(" {0} polygons ({1} vertices)", polyCount, vertCount); handler.SendSysMessage(" {0} triangles ({1} vertices)", triCount, triVertCount); return(true); }
GameObject CreateGOPassenger(ulong guid, GameObjectData data) { Map map = GetMap(); if (map.GetGORespawnTime(guid) != 0) { return(null); } GameObject go = CreateGameObjectFromDB(guid, map, false); if (!go) { return(null); } float x, y, z, o; data.spawnPoint.GetPosition(out x, out y, out z, out o); go.SetTransport(this); go.m_movementInfo.transport.guid = GetGUID(); go.m_movementInfo.transport.pos.Relocate(x, y, z, o); go.m_movementInfo.transport.seat = -1; CalculatePassengerPosition(ref x, ref y, ref z, ref o); go.Relocate(x, y, z, o); go.RelocateStationaryPosition(x, y, z, o); if (!go.IsPositionValid()) { Log.outError(LogFilter.Transport, "GameObject (guidlow {0}, entry {1}) not created. Suggested coordinates aren't valid (X: {2} Y: {3})", go.GetGUID().ToString(), go.GetEntry(), go.GetPositionX(), go.GetPositionY()); return(null); } PhasingHandler.InitDbPhaseShift(go.GetPhaseShift(), data.phaseUseFlags, data.phaseId, data.phaseGroup); PhasingHandler.InitDbVisibleMapId(go.GetPhaseShift(), data.terrainSwapMap); if (!map.AddToMap(go)) { return(null); } _staticPassengers.Add(go); return(go); }
public override void Reset() { Initialize(); instance.SetBossState(DataTypes.HeraldVolazj, EncounterState.NotStarted); instance.DoStopCriteriaTimer(CriteriaTimedTypes.Event, Misc.AchievQuickDemiseStartEvent); // Visible for all players in insanity for (uint i = 173; i <= 177; ++i) { PhasingHandler.AddPhase(me, i, false); } PhasingHandler.AddPhase(me, 169, true); ResetPlayersPhase(); // Cleanup Summons.DespawnAll(); me.RemoveUnitFlag(UnitFlags.NotSelectable); me.SetControlled(false, UnitState.Stunned); }
public bool Create(uint garrSiteId) { GarrSiteLevelRecord siteLevel = Global.GarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); if (siteLevel == null) { return(false); } _siteLevel = siteLevel; InitializePlots(); GarrisonCreateResult garrisonCreateResult = new(); garrisonCreateResult.GarrSiteLevelID = _siteLevel.Id; _owner.SendPacket(garrisonCreateResult); PhasingHandler.OnConditionChange(_owner); SendRemoteInfo(); return(true); }
public PathGenerator(Unit owner) { _polyLength = 0; pathType = PathType.Blank; _useStraightPath = false; _forceDestination = false; _pointPathLimit = 74; _endPosition = Vector3.Zero; _sourceUnit = owner; _navMesh = null; _navMeshQuery = null; Log.outDebug(LogFilter.Maps, "PathGenerator:PathGenerator for {0}", _sourceUnit.GetGUID().ToString()); uint mapId = PhasingHandler.GetTerrainMapId(_sourceUnit.GetPhaseShift(), _sourceUnit.GetMap(), _sourceUnit.GetPositionX(), _sourceUnit.GetPositionY()); if (Global.DisableMgr.IsPathfindingEnabled(_sourceUnit.GetMapId())) { _navMesh = Global.MMapMgr.GetNavMesh(mapId); _navMeshQuery = Global.MMapMgr.GetNavMeshQuery(mapId, _sourceUnit.GetInstanceId()); } CreateFilter(); }
public bool Create(ulong guidlow, Player owner) { Cypher.Assert(owner != null); Relocate(owner.GetPositionX(), owner.GetPositionY(), owner.GetPositionZ(), owner.GetOrientation()); if (!IsPositionValid()) { Log.outError(LogFilter.Player, "Corpse (guidlow {0}, owner {1}) not created. Suggested coordinates isn't valid (X: {2} Y: {3})", guidlow, owner.GetName(), owner.GetPositionX(), owner.GetPositionY()); return(false); } _Create(ObjectGuid.Create(HighGuid.Corpse, owner.GetMapId(), 0, guidlow)); SetObjectScale(1); SetOwnerGUID(owner.GetGUID()); _cellCoord = GridDefines.ComputeCellCoord(GetPositionX(), GetPositionY()); PhasingHandler.InheritPhaseShift(this, owner); return(true); }
public TempSummon SummonPassenger(uint entry, Position pos, TempSummonType summonType, SummonPropertiesRecord properties = null, uint duration = 0, Unit summoner = null, uint spellId = 0, uint vehId = 0) { Map map = GetMap(); if (map == null) { return(null); } UnitTypeMask mask = UnitTypeMask.Summon; if (properties != null) { switch (properties.Control) { case SummonCategory.Pet: mask = UnitTypeMask.Guardian; break; case SummonCategory.Puppet: mask = UnitTypeMask.Puppet; break; case SummonCategory.Vehicle: mask = UnitTypeMask.Minion; break; case SummonCategory.Wild: case SummonCategory.Ally: case SummonCategory.Unk: { switch (properties.Title) { case SummonType.Minion: case SummonType.Guardian: case SummonType.Guardian2: mask = UnitTypeMask.Guardian; break; case SummonType.Totem: case SummonType.LightWell: mask = UnitTypeMask.Totem; break; case SummonType.Vehicle: case SummonType.Vehicle2: mask = UnitTypeMask.Summon; break; case SummonType.Minipet: mask = UnitTypeMask.Minion; break; default: if (properties.Flags.HasAnyFlag(SummonPropFlags.Unk10)) // Mirror Image, Summon Gargoyle { mask = UnitTypeMask.Guardian; } break; } break; } default: return(null); } } TempSummon summon = null; switch (mask) { case UnitTypeMask.Summon: summon = new TempSummon(properties, summoner, false); break; case UnitTypeMask.Guardian: summon = new Guardian(properties, summoner, false); break; case UnitTypeMask.Puppet: summon = new Puppet(properties, summoner); break; case UnitTypeMask.Totem: summon = new Totem(properties, summoner); break; case UnitTypeMask.Minion: summon = new Minion(properties, summoner, false); break; } float x, y, z, o; pos.GetPosition(out x, out y, out z, out o); CalculatePassengerPosition(ref x, ref y, ref z, ref o); if (!summon.Create(map.GenerateLowGuid(HighGuid.Creature), map, entry, x, y, z, o, null, vehId)) { return(null); } PhasingHandler.InheritPhaseShift(summon, summoner ? (WorldObject)summoner : this); summon.SetUInt32Value(UnitFields.CreatedBySpell, spellId); summon.SetTransport(this); summon.m_movementInfo.transport.guid = GetGUID(); summon.m_movementInfo.transport.pos.Relocate(pos); summon.Relocate(x, y, z, o); summon.SetHomePosition(x, y, z, o); summon.SetTransportHomePosition(pos); // @HACK - transport models are not added to map's dynamic LoS calculations // because the current GameObjectModel cannot be moved without recreating summon.AddUnitState(UnitState.IgnorePathfinding); summon.InitStats(duration); if (!map.AddToMap(summon)) { return(null); } _staticPassengers.Add(summon); summon.InitSummon(); summon.SetTempSummonType(summonType); return(summon); }
static bool HandleWpShowCommand(StringArguments args, CommandHandler handler) { if (args.Empty()) { return(false); } // first arg: on, off, first, last string show = args.NextString(); if (string.IsNullOrEmpty(show)) { return(false); } // second arg: GUID (optional, if a creature is selected) string guid_str = args.NextString(); uint pathid; Creature target = handler.GetSelectedCreature(); // Did player provide a PathID? if (string.IsNullOrEmpty(guid_str)) { // No PathID provided // . Player must have selected a creature if (!target) { handler.SendSysMessage(CypherStrings.SelectCreature); return(false); } pathid = target.GetWaypointPath(); } else { // PathID provided // Warn if player also selected a creature // . Creature selection is ignored <- if (target) { handler.SendSysMessage(CypherStrings.WaypointCreatselected); } if (!uint.TryParse(guid_str, out pathid)) { return(false); } } // Show info for the selected waypoint if (show == "info") { // Check if the user did specify a visual waypoint if (!target || target.GetEntry() != 1) { handler.SendSysMessage(CypherStrings.WaypointVpSelect); return(false); } PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_WAYPOINT_DATA_ALL_BY_WPGUID); stmt.AddValue(0, target.GetSpawnId()); SQLResult result = DB.World.Query(stmt); if (result.IsEmpty()) { handler.SendSysMessage(CypherStrings.WaypointNotfounddbproblem, target.GetSpawnId()); return(true); } handler.SendSysMessage("|cff00ffffDEBUG: wp show info:|r"); do { pathid = result.Read <uint>(0); uint point = result.Read <uint>(1); uint delay = result.Read <uint>(2); uint flag = result.Read <uint>(3); uint ev_id = result.Read <uint>(4); uint ev_chance = result.Read <uint>(5); handler.SendSysMessage("|cff00ff00Show info: for current point: |r|cff00ffff{0}|r|cff00ff00, Path ID: |r|cff00ffff{1}|r", point, pathid); handler.SendSysMessage("|cff00ff00Show info: delay: |r|cff00ffff{0}|r", delay); handler.SendSysMessage("|cff00ff00Show info: Move flag: |r|cff00ffff{0}|r", flag); handler.SendSysMessage("|cff00ff00Show info: Waypoint event: |r|cff00ffff{0}|r", ev_id); handler.SendSysMessage("|cff00ff00Show info: Event chance: |r|cff00ffff{0}|r", ev_chance); }while (result.NextRow()); return(true); } if (show == "on") { PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_WAYPOINT_DATA_POS_BY_ID); stmt.AddValue(0, pathid); SQLResult result = DB.World.Query(stmt); if (result.IsEmpty()) { handler.SendSysMessage("|cffff33ffPath no found.|r"); return(false); } handler.SendSysMessage("|cff00ff00DEBUG: wp on, PathID: |cff00ffff{0}|r", pathid); // Delete all visuals for this NPC stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_WAYPOINT_DATA_WPGUID_BY_ID); stmt.AddValue(0, pathid); SQLResult result2 = DB.World.Query(stmt); if (!result2.IsEmpty()) { bool hasError = false; do { ulong wpguid = result2.Read <ulong>(0); Creature creature = handler.GetCreatureFromPlayerMapByDbGuid(wpguid); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointNotremoved, wpguid); hasError = true; stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CREATURE); stmt.AddValue(0, wpguid); DB.World.Execute(stmt); } else { creature.CombatStop(); creature.DeleteFromDB(); creature.AddObjectToRemoveList(); } }while (result2.NextRow()); if (hasError) { handler.SendSysMessage(CypherStrings.WaypointToofar1); handler.SendSysMessage(CypherStrings.WaypointToofar2); handler.SendSysMessage(CypherStrings.WaypointToofar3); } } do { uint point = result.Read <uint>(0); float x = result.Read <float>(1); float y = result.Read <float>(2); float z = result.Read <float>(3); uint id = 1; Player chr = handler.GetSession().GetPlayer(); Map map = chr.GetMap(); Position pos = new Position(x, y, z, chr.GetOrientation()); Creature creature = Creature.CreateCreature(id, map, pos); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointVpNotcreated, id); return(false); } PhasingHandler.InheritPhaseShift(creature, chr); creature.SaveToDB(map.GetId(), new List <Difficulty>() { map.GetDifficultyID() }); ulong dbGuid = creature.GetSpawnId(); // current "wpCreature" variable is deleted and created fresh new, otherwise old values might trigger asserts or cause undefined behavior creature.CleanupsBeforeDelete(); creature.Dispose(); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); creature = Creature.CreateCreatureFromDB(dbGuid, map); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointVpNotcreated, id); return(false); } if (target) { creature.SetDisplayId(target.GetDisplayId()); creature.SetObjectScale(0.5f); creature.SetLevel(Math.Min(point, SharedConst.StrongMaxLevel)); } // Set "wpguid" column to the visual waypoint stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_WAYPOINT_DATA_WPGUID); stmt.AddValue(0, creature.GetSpawnId()); stmt.AddValue(1, pathid); stmt.AddValue(2, point); DB.World.Execute(stmt); }while (result.NextRow()); handler.SendSysMessage("|cff00ff00Showing the current creature's path.|r"); return(true); } if (show == "first") { handler.SendSysMessage("|cff00ff00DEBUG: wp first, pathid: {0}|r", pathid); PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_WAYPOINT_DATA_POS_FIRST_BY_ID); stmt.AddValue(0, pathid); SQLResult result = DB.World.Query(stmt); if (result.IsEmpty()) { handler.SendSysMessage(CypherStrings.WaypointNotfound, pathid); return(false); } float x = result.Read <float>(0); float y = result.Read <float>(1); float z = result.Read <float>(2); Player chr = handler.GetSession().GetPlayer(); Map map = chr.GetMap(); Position pos = new Position(x, y, z, chr.GetOrientation()); Creature creature = Creature.CreateCreature(1, map, pos); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointVpNotcreated, 1); return(false); } PhasingHandler.InheritPhaseShift(creature, chr); creature.SaveToDB(map.GetId(), new List <Difficulty>() { map.GetDifficultyID() }); ulong dbGuid = creature.GetSpawnId(); // current "creature" variable is deleted and created fresh new, otherwise old values might trigger asserts or cause undefined behavior creature.CleanupsBeforeDelete(); creature.Dispose(); creature = Creature.CreateCreatureFromDB(dbGuid, map); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointVpNotcreated, 1); return(false); } if (target) { creature.SetDisplayId(target.GetDisplayId()); creature.SetObjectScale(0.5f); } return(true); } if (show == "last") { handler.SendSysMessage("|cff00ff00DEBUG: wp last, PathID: |r|cff00ffff{0}|r", pathid); PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_WAYPOINT_DATA_POS_LAST_BY_ID); stmt.AddValue(0, pathid); SQLResult result = DB.World.Query(stmt); if (result.IsEmpty()) { handler.SendSysMessage(CypherStrings.WaypointNotfoundlast, pathid); return(false); } float x = result.Read <float>(0); float y = result.Read <float>(1); float z = result.Read <float>(2); float o = result.Read <float>(3); Player chr = handler.GetSession().GetPlayer(); Map map = chr.GetMap(); Position pos = new Position(x, y, z, o); Creature creature = Creature.CreateCreature(1, map, pos); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointNotcreated, 1); return(false); } PhasingHandler.InheritPhaseShift(creature, chr); creature.SaveToDB(map.GetId(), new List <Difficulty>() { map.GetDifficultyID() }); ulong dbGuid = creature.GetSpawnId(); // current "creature" variable is deleted and created fresh new, otherwise old values might trigger asserts or cause undefined behavior creature.CleanupsBeforeDelete(); creature.Dispose(); creature = Creature.CreateCreatureFromDB(dbGuid, map); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointNotcreated, 1); return(false); } if (target) { creature.SetDisplayId(target.GetDisplayId()); creature.SetObjectScale(0.5f); } return(true); } if (show == "off") { PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_CREATURE_BY_ID); stmt.AddValue(0, 1); SQLResult result = DB.World.Query(stmt); if (result.IsEmpty()) { handler.SendSysMessage(CypherStrings.WaypointVpNotfound); return(false); } bool hasError = false; do { ulong lowguid = result.Read <ulong>(0); Creature creature = handler.GetCreatureFromPlayerMapByDbGuid(lowguid); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointNotremoved, lowguid); hasError = true; stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CREATURE); stmt.AddValue(0, lowguid); DB.World.Execute(stmt); } else { creature.CombatStop(); creature.DeleteFromDB(); creature.AddObjectToRemoveList(); } }while (result.NextRow()); // set "wpguid" column to "empty" - no visual waypoint spawned stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_WAYPOINT_DATA_ALL_WPGUID); DB.World.Execute(stmt); //DB.World.PExecute("UPDATE creature_movement SET wpguid = '0' WHERE wpguid <> '0'"); if (hasError) { handler.SendSysMessage(CypherStrings.WaypointToofar1); handler.SendSysMessage(CypherStrings.WaypointToofar2); handler.SendSysMessage(CypherStrings.WaypointToofar3); } handler.SendSysMessage(CypherStrings.WaypointVpAllremoved); return(true); } handler.SendSysMessage("|cffff33ffDEBUG: wpshow - no valid command found|r"); return(true); }
static bool HandleWpModifyCommand(StringArguments args, CommandHandler handler) { if (args.Empty()) { return(false); } // first arg: add del text emote spell waittime move string show = args.NextString(); if (string.IsNullOrEmpty(show)) { return(false); } // Check // Remember: "show" must also be the name of a column! if ((show != "delay") && (show != "action") && (show != "action_chance") && (show != "move_flag") && (show != "del") && (show != "move")) { return(false); } // Did user provide a GUID // or did the user select a creature? // . variable lowguid is filled with the GUID of the NPC uint pathid; uint point; Creature target = handler.GetSelectedCreature(); // User did select a visual waypoint? if (!target || target.GetEntry() != 1) { handler.SendSysMessage("|cffff33ffERROR: You must select a waypoint.|r"); return(false); } // Check the creature PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_WAYPOINT_DATA_BY_WPGUID); stmt.AddValue(0, target.GetSpawnId()); SQLResult result = DB.World.Query(stmt); if (result.IsEmpty()) { handler.SendSysMessage(CypherStrings.WaypointNotfoundsearch, target.GetGUID().ToString()); // Select waypoint number from database // Since we compare float values, we have to deal with // some difficulties. // Here we search for all waypoints that only differ in one from 1 thousand // See also: http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html string maxDiff = "0.01"; stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_WAYPOINT_DATA_BY_POS); stmt.AddValue(0, target.GetPositionX()); stmt.AddValue(1, maxDiff); stmt.AddValue(2, target.GetPositionY()); stmt.AddValue(3, maxDiff); stmt.AddValue(4, target.GetPositionZ()); stmt.AddValue(5, maxDiff); result = DB.World.Query(stmt); if (result.IsEmpty()) { handler.SendSysMessage(CypherStrings.WaypointNotfounddbproblem, target.GetGUID().ToString()); return(true); } } do { pathid = result.Read <uint>(0); point = result.Read <uint>(1); }while (result.NextRow()); // We have the waypoint number and the GUID of the "master npc" // Text is enclosed in "<>", all other arguments not string arg_str = args.NextString(); // Check for argument if (show != "del" && show != "move" && arg_str == null) { handler.SendSysMessage(CypherStrings.WaypointArgumentreq, show); return(false); } if (show == "del") { handler.SendSysMessage("|cff00ff00DEBUG: wp modify del, PathID: |r|cff00ffff{0}|r", pathid); target.DeleteFromDB(); target.AddObjectToRemoveList(); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_WAYPOINT_DATA); stmt.AddValue(0, pathid); stmt.AddValue(1, point); DB.World.Execute(stmt); stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_WAYPOINT_DATA_POINT); stmt.AddValue(0, pathid); stmt.AddValue(1, point); DB.World.Execute(stmt); handler.SendSysMessage(CypherStrings.WaypointRemoved); return(true); } // del if (show == "move") { handler.SendSysMessage("|cff00ff00DEBUG: wp move, PathID: |r|cff00ffff{0}|r", pathid); Player chr = handler.GetSession().GetPlayer(); Map map = chr.GetMap(); // What to do: // Move the visual spawnpoint // Respawn the owner of the waypoints target.DeleteFromDB(); target.AddObjectToRemoveList(); // re-create Creature creature = Creature.CreateCreature(1, map, chr.GetPosition()); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointVpNotcreated, 1); return(false); } PhasingHandler.InheritPhaseShift(creature, chr); creature.SaveToDB(map.GetId(), new List <Difficulty>() { map.GetDifficultyID() }); ulong dbGuid = creature.GetSpawnId(); // current "wpCreature" variable is deleted and created fresh new, otherwise old values might trigger asserts or cause undefined behavior creature.CleanupsBeforeDelete(); creature.Dispose(); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); creature = Creature.CreateCreatureFromDB(dbGuid, map); if (!creature) { handler.SendSysMessage(CypherStrings.WaypointVpNotcreated, 1); return(false); } stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_WAYPOINT_DATA_POSITION); stmt.AddValue(0, chr.GetPositionX()); stmt.AddValue(1, chr.GetPositionY()); stmt.AddValue(2, chr.GetPositionZ()); stmt.AddValue(3, pathid); stmt.AddValue(4, point); DB.World.Execute(stmt); handler.SendSysMessage(CypherStrings.WaypointChanged); return(true); } // move if (string.IsNullOrEmpty(arg_str)) { // show_str check for present in list of correct values, no sql injection possible DB.World.Execute("UPDATE waypoint_data SET {0}=null WHERE id='{1}' AND point='{2}'", show, pathid, point); // Query can't be a prepared statement } else { // show_str check for present in list of correct values, no sql injection possible DB.World.Execute("UPDATE waypoint_data SET {0}='{1}' WHERE id='{2}' AND point='{3}'", show, arg_str, pathid, point); // Query can't be a prepared statement } handler.SendSysMessage(CypherStrings.WaypointChangedNo, show); return(true); }
bool Create(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, uint spellXSpellVisualId, ObjectGuid castId, AuraEffect aurEff) { _targetGuid = target ? target.GetGUID() : ObjectGuid.Empty; _aurEff = aurEff; SetMap(caster.GetMap()); Relocate(pos); if (!IsPositionValid()) { Log.outError(LogFilter.AreaTrigger, $"AreaTrigger (spell {spell.Id}) not created. Invalid coordinates (X: {GetPositionX()} Y: {GetPositionY()})"); return(false); } _areaTriggerMiscTemplate = Global.AreaTriggerDataStorage.GetAreaTriggerMiscTemplate(spellMiscId); if (_areaTriggerMiscTemplate == null) { Log.outError(LogFilter.AreaTrigger, "AreaTrigger (spellMiscId {0}) not created. Invalid areatrigger miscid ({1})", spellMiscId, spellMiscId); return(false); } _Create(ObjectGuid.Create(HighGuid.AreaTrigger, GetMapId(), GetTemplate().Id, caster.GetMap().GenerateLowGuid(HighGuid.AreaTrigger))); SetEntry(GetTemplate().Id); SetDuration(duration); SetObjectScale(1.0f); SetGuidValue(AreaTriggerFields.Caster, caster.GetGUID()); SetGuidValue(AreaTriggerFields.CreatingEffectGuid, castId); SetUInt32Value(AreaTriggerFields.SpellId, spell.Id); SetUInt32Value(AreaTriggerFields.SpellForVisuals, spell.Id); SetUInt32Value(AreaTriggerFields.SpellXSpellVisualId, spellXSpellVisualId); SetUInt32Value(AreaTriggerFields.TimeToTargetScale, GetMiscTemplate().TimeToTargetScale != 0 ? GetMiscTemplate().TimeToTargetScale : GetUInt32Value(AreaTriggerFields.Duration)); SetFloatValue(AreaTriggerFields.BoundsRadius2d, GetTemplate().MaxSearchRadius); SetUInt32Value(AreaTriggerFields.DecalPropertiesId, GetMiscTemplate().DecalPropertiesId); for (byte scaleCurveIndex = 0; scaleCurveIndex < SharedConst.MaxAreatriggerScale; ++scaleCurveIndex) { if (GetMiscTemplate().ScaleInfo.ExtraScale[scaleCurveIndex].AsInt32 != 0) { SetUInt32Value(AreaTriggerFields.ExtraScaleCurve + scaleCurveIndex, (uint)GetMiscTemplate().ScaleInfo.ExtraScale[scaleCurveIndex].AsInt32); } } PhasingHandler.InheritPhaseShift(this, caster); if (target && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached)) { m_movementInfo.transport.guid = target.GetGUID(); } UpdateShape(); uint timeToTarget = GetMiscTemplate().TimeToTarget != 0 ? GetMiscTemplate().TimeToTarget : GetUInt32Value(AreaTriggerFields.Duration); if (GetTemplate().HasFlag(AreaTriggerFlags.HasCircularMovement)) { AreaTriggerCircularMovementInfo cmi = GetMiscTemplate().CircularMovementInfo; if (target && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached)) { cmi.TargetGUID.Set(target.GetGUID()); } else { cmi.Center.Set(new Vector3(pos.posX, pos.posY, pos.posZ)); } InitCircularMovement(cmi, timeToTarget); } else if (GetMiscTemplate().HasSplines()) { InitSplineOffsets(GetMiscTemplate().SplinePoints, timeToTarget); } // movement on transport of areatriggers on unit is handled by themself Transport transport = m_movementInfo.transport.guid.IsEmpty() ? caster.GetTransport() : null; if (transport) { float x, y, z, o; pos.GetPosition(out x, out y, out z, out o); transport.CalculatePassengerOffset(ref x, ref y, ref z, ref o); m_movementInfo.transport.pos.Relocate(x, y, z, o); // This object must be added to transport before adding to map for the client to properly display it transport.AddPassenger(this); } AI_Initialize(); // Relocate areatriggers with circular movement again if (HasCircularMovement()) { Relocate(CalculateCircularMovementPosition()); } if (!GetMap().AddToMap(this)) { // Returning false will cause the object to be deleted - remove from transport if (transport) { transport.RemovePassenger(this); } return(false); } caster._RegisterAreaTrigger(this); _ai.OnCreate(); return(true); }
bool Create(ulong lowGuid, uint conversationEntry, Map map, Unit creator, Position pos, ObjectGuid privateObjectOwner, SpellInfo spellInfo = null) { ConversationTemplate conversationTemplate = Global.ConversationDataStorage.GetConversationTemplate(conversationEntry); //ASSERT(conversationTemplate); _creatorGuid = creator.GetGUID(); SetPrivateObjectOwner(privateObjectOwner); SetMap(map); Relocate(pos); RelocateStationaryPosition(pos); _Create(ObjectGuid.Create(HighGuid.Conversation, GetMapId(), conversationEntry, lowGuid)); PhasingHandler.InheritPhaseShift(this, creator); SetEntry(conversationEntry); SetObjectScale(1.0f); _textureKitId = conversationTemplate.TextureKitId; if (conversationTemplate.Actors != null) { foreach (var actor in conversationTemplate.Actors) { if (actor != null) { ConversationActorField actorField = new(); actorField.CreatureID = actor.CreatureId; actorField.CreatureDisplayInfoID = actor.CreatureDisplayInfoId; actorField.Id = (int)actor.ActorId; actorField.Type = ConversationActorType.CreatureActor; AddDynamicUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.Actors), actorField); } } } if (conversationTemplate.ActorGuids != null) { for (ushort actorIndex = 0; actorIndex < conversationTemplate.ActorGuids.Count; ++actorIndex) { ulong actorGuid = conversationTemplate.ActorGuids[actorIndex]; if (actorGuid == 0) { continue; } foreach (var creature in map.GetCreatureBySpawnIdStore().LookupByKey(actorGuid)) { // we just need the last one, overriding is legit AddActor(creature.GetGUID(), actorIndex); } } } Global.ScriptMgr.OnConversationCreate(this, creator); List <ushort> actorIndices = new(); List <ConversationLine> lines = new(); foreach (ConversationLineTemplate line in conversationTemplate.Lines) { if (!Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.ConversationLine, line.Id, creator)) { continue; } actorIndices.Add(line.ActorIdx); ConversationLine lineField = new(); lineField.ConversationLineID = line.Id; lineField.UiCameraID = line.UiCameraID; lineField.ActorIndex = line.ActorIdx; lineField.Flags = line.Flags; ConversationLineRecord convoLine = CliDB.ConversationLineStorage.LookupByKey(line.Id); // never null for conversationTemplate->Lines for (Locale locale = Locale.enUS; locale < Locale.Total; locale = locale + 1) { if (locale == Locale.None) { continue; } _lineStartTimes[(locale, line.Id)] = _lastLineEndTimes[(int)locale];
bool Create(ulong lowGuid, uint conversationEntry, Map map, Unit creator, Position pos, List <ObjectGuid> participants, SpellInfo spellInfo = null) { ConversationTemplate conversationTemplate = Global.ConversationDataStorage.GetConversationTemplate(conversationEntry); //ASSERT(conversationTemplate); _creatorGuid = creator.GetGUID(); _participants = participants; SetMap(map); Relocate(pos); _Create(ObjectGuid.Create(HighGuid.Conversation, GetMapId(), conversationEntry, lowGuid)); PhasingHandler.InheritPhaseShift(this, creator); SetEntry(conversationEntry); SetObjectScale(1.0f); SetUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.LastLineEndTime), conversationTemplate.LastLineEndTime); _duration = conversationTemplate.LastLineEndTime; _textureKitId = conversationTemplate.TextureKitId; for (ushort actorIndex = 0; actorIndex < conversationTemplate.Actors.Count; ++actorIndex) { ConversationActorTemplate actor = conversationTemplate.Actors[actorIndex]; if (actor != null) { ConversationActor actorField = new ConversationActor(); actorField.CreatureID = actor.CreatureId; actorField.CreatureDisplayInfoID = actor.CreatureModelId; actorField.Type = ConversationActorType.CreatureActor; AddDynamicUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.Actors), actorField); } } for (ushort actorIndex = 0; actorIndex < conversationTemplate.ActorGuids.Count; ++actorIndex) { ulong actorGuid = conversationTemplate.ActorGuids[actorIndex]; if (actorGuid == 0) { continue; } foreach (var creature in map.GetCreatureBySpawnIdStore().LookupByKey(actorGuid)) { // we just need the last one, overriding is legit AddActor(creature.GetGUID(), actorIndex); } } Global.ScriptMgr.OnConversationCreate(this, creator); List <ushort> actorIndices = new List <ushort>(); List <ConversationLine> lines = new List <ConversationLine>(); foreach (ConversationLineTemplate line in conversationTemplate.Lines) { actorIndices.Add(line.ActorIdx); ConversationLine lineField = new ConversationLine(); lineField.ConversationLineID = line.Id; lineField.StartTime = line.StartTime; lineField.UiCameraID = line.UiCameraID; lineField.ActorIndex = line.ActorIdx; lineField.Flags = line.Flags; lines.Add(lineField); } SetUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.Lines), lines); Global.ScriptMgr.OnConversationCreate(this, creator); // All actors need to be set foreach (ushort actorIndex in actorIndices) { ConversationActor actor = actorIndex < m_conversationData.Actors.Size() ? m_conversationData.Actors[actorIndex] : null; if (actor == null || (actor.CreatureID == 0 && actor.ActorGUID.IsEmpty())) { Log.outError(LogFilter.Conversation, $"Failed to create conversation (Id: {conversationEntry}) due to missing actor (Idx: {actorIndex})."); return(false); } } if (!GetMap().AddToMap(this)) { return(false); } return(true); }
void UpdateArea(uint newArea) { // FFA_PVP flags are area and not zone id dependent // so apply them accordingly m_areaUpdateId = newArea; AreaTableRecord area = CliDB.AreaTableStorage.LookupByKey(newArea); bool oldFFAPvPArea = pvpInfo.IsInFFAPvPArea; pvpInfo.IsInFFAPvPArea = area != null && area.HasFlag(AreaFlags.Arena); UpdatePvPState(true); // check if we were in ffa arena and we left if (oldFFAPvPArea && !pvpInfo.IsInFFAPvPArea) { ValidateAttackersAndOwnTarget(); } PhasingHandler.OnAreaChange(this); UpdateAreaDependentAuras(newArea); if (IsAreaThatActivatesPvpTalents(newArea)) { EnablePvpRules(); } else { DisablePvpRules(); } // previously this was in UpdateZone (but after UpdateArea) so nothing will break pvpInfo.IsInNoPvPArea = false; if (area != null && area.IsSanctuary()) // in sanctuary { AddPvpFlag(UnitPVPStateFlags.Sanctuary); pvpInfo.IsInNoPvPArea = true; if (duel == null) { CombatStopWithPets(); } } else { RemovePvpFlag(UnitPVPStateFlags.Sanctuary); } AreaFlags areaRestFlag = (GetTeam() == Team.Alliance) ? AreaFlags.RestZoneAlliance : AreaFlags.RestZoneHorde; if (area != null && area.HasFlag(areaRestFlag)) { _restMgr.SetRestFlag(RestFlag.FactionArea); } else { _restMgr.RemoveRestFlag(RestFlag.FactionArea); } PushQuests(); UpdateCriteria(CriteriaType.EnterTopLevelArea, newArea); UpdateMountCapability(); }
public Transport CreateTransport(uint entry, ulong guid = 0, Map map = null, PhaseUseFlagsValues phaseUseFlags = 0, uint phaseId = 0, uint phaseGroupId = 0) { // instance case, execute GetGameObjectEntry hook if (map != null) { // SetZoneScript() is called after adding to map, so fetch the script using map if (map.IsDungeon()) { InstanceScript instance = ((InstanceMap)map).GetInstanceScript(); if (instance != null) { entry = instance.GetGameObjectEntry(0, entry); } } if (entry == 0) { return(null); } } TransportTemplate tInfo = GetTransportTemplate(entry); if (tInfo == null) { Log.outError(LogFilter.Sql, "Transport {0} will not be loaded, `transport_template` missing", entry); return(null); } // create transport... Transport trans = new(); // ...at first waypoint TaxiPathNodeRecord startNode = tInfo.keyFrames.First().Node; uint mapId = startNode.ContinentID; float x = startNode.Loc.X; float y = startNode.Loc.Y; float z = startNode.Loc.Z; float o = tInfo.keyFrames.First().InitialOrientation; // initialize the gameobject base ulong guidLow = guid != 0 ? guid : map.GenerateLowGuid(HighGuid.Transport); if (!trans.Create(guidLow, entry, mapId, x, y, z, o, 255)) { return(null); } PhasingHandler.InitDbPhaseShift(trans.GetPhaseShift(), phaseUseFlags, phaseId, phaseGroupId); MapRecord mapEntry = CliDB.MapStorage.LookupByKey(mapId); if (mapEntry != null) { if (mapEntry.Instanceable() != tInfo.inInstance) { Log.outError(LogFilter.Transport, "Transport {0} (name: {1}) attempted creation in instance map (id: {2}) but it is not an instanced transport!", entry, trans.GetName(), mapId); //return null; } } // use preset map for instances (need to know which instance) trans.SetMap(map != null ? map : Global.MapMgr.CreateMap(mapId, null)); if (map != null && map.IsDungeon()) { trans.m_zoneScript = map.ToInstanceMap().GetInstanceScript(); } // Passengers will be loaded once a player is near Global.ObjAccessor.AddObject(trans); trans.GetMap().AddToMap(trans); return(trans); }
bool Create(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisualField spellVisual, ObjectGuid castId, AuraEffect aurEff) { _targetGuid = target ? target.GetGUID() : ObjectGuid.Empty; _aurEff = aurEff; SetMap(caster.GetMap()); Relocate(pos); if (!IsPositionValid()) { Log.outError(LogFilter.AreaTrigger, $"AreaTrigger (spell {spell.Id}) not created. Invalid coordinates (X: {GetPositionX()} Y: {GetPositionY()})"); return(false); } _areaTriggerMiscTemplate = Global.AreaTriggerDataStorage.GetAreaTriggerMiscTemplate(spellMiscId); if (_areaTriggerMiscTemplate == null) { Log.outError(LogFilter.AreaTrigger, "AreaTrigger (spellMiscId {0}) not created. Invalid areatrigger miscid ({1})", spellMiscId, spellMiscId); return(false); } _areaTriggerTemplate = _areaTriggerMiscTemplate.Template; _Create(ObjectGuid.Create(HighGuid.AreaTrigger, GetMapId(), GetTemplate().Id.Id, caster.GetMap().GenerateLowGuid(HighGuid.AreaTrigger))); SetEntry(GetTemplate().Id.Id); SetDuration(duration); SetObjectScale(1.0f); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Caster), caster.GetGUID()); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.CreatingEffectGUID), castId); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellID), spell.Id); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellForVisuals), spell.Id); SpellCastVisualField spellCastVisual = m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellVisual); SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, spellVisual.SpellXSpellVisualID); SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, spellVisual.ScriptVisualID); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTargetScale), GetMiscTemplate().TimeToTargetScale != 0 ? GetMiscTemplate().TimeToTargetScale : m_areaTriggerData.Duration); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.BoundsRadius2D), GetTemplate().MaxSearchRadius); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.DecalPropertiesID), GetMiscTemplate().DecalPropertiesId); ScaleCurve extraScaleCurve = m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.ExtraScaleCurve); if (GetMiscTemplate().ExtraScale.Structured.StartTimeOffset != 0) { SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.StartTimeOffset), GetMiscTemplate().ExtraScale.Structured.StartTimeOffset); } if (GetMiscTemplate().ExtraScale.Structured.X != 0 || GetMiscTemplate().ExtraScale.Structured.Y != 0) { Vector2 point = new(GetMiscTemplate().ExtraScale.Structured.X, GetMiscTemplate().ExtraScale.Structured.Y); SetUpdateFieldValue(ref extraScaleCurve.ModifyValue(extraScaleCurve.Points, 0), point); } if (GetMiscTemplate().ExtraScale.Structured.Z != 0 || GetMiscTemplate().ExtraScale.Structured.W != 0) { Vector2 point = new(GetMiscTemplate().ExtraScale.Structured.Z, GetMiscTemplate().ExtraScale.Structured.W); SetUpdateFieldValue(ref extraScaleCurve.ModifyValue(extraScaleCurve.Points, 1), point); } unsafe { if (GetMiscTemplate().ExtraScale.Raw.Data[5] != 0) { SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.ParameterCurve), GetMiscTemplate().ExtraScale.Raw.Data[5]); } if (GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0) { SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.OverrideActive), GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0 ? true : false); } } PhasingHandler.InheritPhaseShift(this, caster); if (target && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached)) { m_movementInfo.transport.guid = target.GetGUID(); } UpdateShape(); uint timeToTarget = GetMiscTemplate().TimeToTarget != 0 ? GetMiscTemplate().TimeToTarget : m_areaTriggerData.Duration; if (GetTemplate().HasFlag(AreaTriggerFlags.HasCircularMovement)) { AreaTriggerOrbitInfo cmi = GetMiscTemplate().OrbitInfo; if (target && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached)) { cmi.PathTarget.Set(target.GetGUID()); } else { cmi.Center.Set(new Vector3(pos.posX, pos.posY, pos.posZ)); } InitOrbit(cmi, timeToTarget); } else if (GetMiscTemplate().HasSplines()) { InitSplineOffsets(GetMiscTemplate().SplinePoints, timeToTarget); } // movement on transport of areatriggers on unit is handled by themself Transport transport = m_movementInfo.transport.guid.IsEmpty() ? caster.GetTransport() : null; if (transport) { float x, y, z, o; pos.GetPosition(out x, out y, out z, out o); transport.CalculatePassengerOffset(ref x, ref y, ref z, ref o); m_movementInfo.transport.pos.Relocate(x, y, z, o); // This object must be added to transport before adding to map for the client to properly display it transport.AddPassenger(this); } AI_Initialize(); // Relocate areatriggers with circular movement again if (HasOrbit()) { Relocate(CalculateOrbitPosition()); } if (!GetMap().AddToMap(this)) { // Returning false will cause the object to be deleted - remove from transport if (transport) { transport.RemovePassenger(this); } return(false); } caster._RegisterAreaTrigger(this); _ai.OnCreate(); return(true); }
static bool HandleGroupListCommand(StringArguments args, CommandHandler handler) { // Get ALL the variables! Player playerTarget; ObjectGuid guidTarget; string nameTarget; string zoneName = ""; string onlineState = ""; // Parse the guid to uint32... ObjectGuid parseGUID = ObjectGuid.Create(HighGuid.Player, args.NextUInt64()); // ... and try to extract a player out of it. if (Global.CharacterCacheStorage.GetCharacterNameByGuid(parseGUID, out nameTarget)) { playerTarget = Global.ObjAccessor.FindPlayer(parseGUID); guidTarget = parseGUID; } // If not, we return false and end right away. else if (!handler.extractPlayerTarget(args, out playerTarget, out guidTarget, out nameTarget)) { return(false); } // Next, we need a group. So we define a group variable. Group groupTarget = null; // We try to extract a group from an online player. if (playerTarget) { groupTarget = playerTarget.GetGroup(); } // If not, we extract it from the SQL. if (!groupTarget) { PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_GROUP_MEMBER); stmt.AddValue(0, guidTarget.GetCounter()); SQLResult resultGroup = DB.Characters.Query(stmt); if (!resultGroup.IsEmpty()) { groupTarget = Global.GroupMgr.GetGroupByDbStoreId(resultGroup.Read <uint>(0)); } } // If both fails, players simply has no party. Return false. if (!groupTarget) { handler.SendSysMessage(CypherStrings.GroupNotInGroup, nameTarget); return(false); } // We get the group members after successfully detecting a group. var members = groupTarget.GetMemberSlots(); // To avoid a cluster f**k, namely trying multiple queries to simply get a group member count... handler.SendSysMessage(CypherStrings.GroupType, (groupTarget.isRaidGroup() ? "raid" : "party"), members.Count); // ... we simply move the group type and member count print after retrieving the slots and simply output it's size. // While rather dirty codestyle-wise, it saves space (if only a little). For each member, we look several informations up. foreach (var slot in members) { // Check for given flag and assign it to that iterator string flags = ""; if (slot.flags.HasAnyFlag(GroupMemberFlags.Assistant)) { flags = "Assistant"; } if (slot.flags.HasAnyFlag(GroupMemberFlags.MainTank)) { if (!string.IsNullOrEmpty(flags)) { flags += ", "; } flags += "MainTank"; } if (slot.flags.HasAnyFlag(GroupMemberFlags.MainAssist)) { if (!string.IsNullOrEmpty(flags)) { flags += ", "; } flags += "MainAssist"; } if (string.IsNullOrEmpty(flags)) { flags = "None"; } // Check if iterator is online. If is... Player p = Global.ObjAccessor.FindPlayer(slot.guid); string phases = ""; if (p && p.IsInWorld) { // ... than, it prints information like "is online", where he is, etc... onlineState = "online"; phases = PhasingHandler.FormatPhases(p.GetPhaseShift()); AreaTableRecord area = CliDB.AreaTableStorage.LookupByKey(p.GetAreaId()); if (area != null) { AreaTableRecord zone = CliDB.AreaTableStorage.LookupByKey(area.ParentAreaID); if (zone != null) { zoneName = zone.AreaName[handler.GetSessionDbcLocale()]; } } } else { // ... else, everything is set to offline or neutral values. zoneName = "<ERROR>"; onlineState = "Offline"; } // Now we can print those informations for every single member of each group! handler.SendSysMessage(CypherStrings.GroupPlayerNameGuid, slot.name, onlineState, zoneName, phases, slot.guid.ToString(), flags, LFGQueue.GetRolesString(slot.roles)); } // And finish after every iterator is done. return(true); }
static bool LocCommand(StringArguments args, CommandHandler handler) { handler.SendSysMessage("mmap tileloc:"); // grid tile location Player player = handler.GetPlayer(); int gx = (int)(32 - player.GetPositionX() / MapConst.SizeofGrids); int gy = (int)(32 - player.GetPositionY() / MapConst.SizeofGrids); float x, y, z; player.GetPosition(out x, out y, out z); handler.SendSysMessage("{0:D4}{1:D2}{2:D2}.mmtile", player.GetMapId(), gy, gx); handler.SendSysMessage("gridloc [{0}, {1}]", gx, gy); // calculate navmesh tile location uint terrainMapId = PhasingHandler.GetTerrainMapId(player.GetPhaseShift(), player.GetMap(), x, y); Detour.dtNavMesh navmesh = Global.MMapMgr.GetNavMesh(terrainMapId); Detour.dtNavMeshQuery navmeshquery = Global.MMapMgr.GetNavMeshQuery(terrainMapId, player.GetInstanceId()); if (navmesh == null || navmeshquery == null) { handler.SendSysMessage("NavMesh not loaded for current map."); return(true); } float[] min = navmesh.getParams().orig; float[] location = { y, z, x }; float[] extents = { 3.0f, 5.0f, 3.0f }; int tilex = (int)((y - min[0]) / MapConst.SizeofGrids); int tiley = (int)((x - min[2]) / MapConst.SizeofGrids); handler.SendSysMessage("Calc [{0:D2}, {1:D2}]", tilex, tiley); // navmesh poly . navmesh tile location Detour.dtQueryFilter filter = new Detour.dtQueryFilter(); float[] nothing = new float[3]; ulong polyRef = 0; if (Detour.dtStatusFailed(navmeshquery.findNearestPoly(location, extents, filter, ref polyRef, ref nothing))) { handler.SendSysMessage("Dt [??,??] (invalid poly, probably no tile loaded)"); return(true); } if (polyRef == 0) { handler.SendSysMessage("Dt [??, ??] (invalid poly, probably no tile loaded)"); } else { Detour.dtMeshTile tile = new Detour.dtMeshTile(); Detour.dtPoly poly = new Detour.dtPoly(); if (Detour.dtStatusSucceed(navmesh.getTileAndPolyByRef(polyRef, ref tile, ref poly))) { if (tile != null) { handler.SendSysMessage("Dt [{0:D2},{1:D2}]", tile.header.x, tile.header.y); return(false); } } handler.SendSysMessage("Dt [??,??] (no tile loaded)"); } return(true); }
public void Initialize(Player player) { ForEnemy = false; MemberGuid = player.GetGUID(); // Status MemberStats.Status = GroupMemberOnlineStatus.Online; if (player.IsPvP()) { MemberStats.Status |= GroupMemberOnlineStatus.PVP; } if (!player.IsAlive()) { if (player.HasFlag(PlayerFields.Flags, PlayerFlags.Ghost)) { MemberStats.Status |= GroupMemberOnlineStatus.Ghost; } else { MemberStats.Status |= GroupMemberOnlineStatus.Dead; } } if (player.IsFFAPvP()) { MemberStats.Status |= GroupMemberOnlineStatus.PVPFFA; } if (player.isAFK()) { MemberStats.Status |= GroupMemberOnlineStatus.AFK; } if (player.isDND()) { MemberStats.Status |= GroupMemberOnlineStatus.DND; } if (player.GetVehicle()) { MemberStats.Status |= GroupMemberOnlineStatus.Vehicle; } // Level MemberStats.Level = (ushort)player.getLevel(); // Health MemberStats.CurrentHealth = (int)player.GetHealth(); MemberStats.MaxHealth = (int)player.GetMaxHealth(); // Power MemberStats.PowerType = (byte)player.GetPowerType(); MemberStats.PowerDisplayID = 0; MemberStats.CurrentPower = (ushort)player.GetPower(player.GetPowerType()); MemberStats.MaxPower = (ushort)player.GetMaxPower(player.GetPowerType()); // Position MemberStats.ZoneID = (ushort)player.GetZoneId(); MemberStats.PositionX = (short)player.GetPositionX(); MemberStats.PositionY = (short)(player.GetPositionY()); MemberStats.PositionZ = (short)(player.GetPositionZ()); MemberStats.SpecID = (ushort)player.GetUInt32Value(PlayerFields.CurrentSpecId); MemberStats.PartyType[0] = (sbyte)(player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetPartyType) & 0xF); MemberStats.PartyType[1] = (sbyte)(player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetPartyType) >> 4); MemberStats.WmoGroupID = 0; MemberStats.WmoDoodadPlacementID = 0; // Vehicle if (player.GetVehicle() && player.GetVehicle().GetVehicleInfo() != null) { MemberStats.VehicleSeat = player.GetVehicle().GetVehicleInfo().SeatID[player.m_movementInfo.transport.seat]; } // Auras foreach (AuraApplication aurApp in player.GetVisibleAuras()) { PartyMemberAuraStates aura = new PartyMemberAuraStates(); aura.SpellID = (int)aurApp.GetBase().GetId(); aura.ActiveFlags = aurApp.GetEffectMask(); aura.Flags = (byte)aurApp.GetFlags(); if (aurApp.GetFlags().HasAnyFlag(AuraFlags.Scalable)) { foreach (AuraEffect aurEff in aurApp.GetBase().GetAuraEffects()) { if (aurEff == null) { continue; } if (aurApp.HasEffect(aurEff.GetEffIndex())) { aura.Points.Add((float)aurEff.GetAmount()); } } } MemberStats.Auras.Add(aura); } // Phases PhasingHandler.FillPartyMemberPhase(MemberStats.Phases, player.GetPhaseShift()); // Pet if (player.GetPet()) { Pet pet = player.GetPet(); MemberStats.PetStats.HasValue = true; MemberStats.PetStats.Value.GUID = pet.GetGUID(); MemberStats.PetStats.Value.Name = pet.GetName(); MemberStats.PetStats.Value.ModelId = (short)pet.GetDisplayId(); MemberStats.PetStats.Value.CurrentHealth = (int)pet.GetHealth(); MemberStats.PetStats.Value.MaxHealth = (int)pet.GetMaxHealth(); foreach (AuraApplication aurApp in pet.GetVisibleAuras()) { PartyMemberAuraStates aura = new PartyMemberAuraStates(); aura.SpellID = (int)aurApp.GetBase().GetId(); aura.ActiveFlags = aurApp.GetEffectMask(); aura.Flags = (byte)aurApp.GetFlags(); if (aurApp.GetFlags().HasAnyFlag(AuraFlags.Scalable)) { foreach (AuraEffect aurEff in aurApp.GetBase().GetAuraEffects()) { if (aurEff == null) { continue; } if (aurApp.HasEffect(aurEff.GetEffIndex())) { aura.Points.Add((float)aurEff.GetAmount()); } } } MemberStats.PetStats.Value.Auras.Add(aura); } } }
bool Create(ulong lowGuid, uint conversationEntry, Map map, Unit creator, Position pos, List <ObjectGuid> participants, SpellInfo spellInfo = null) { ConversationTemplate conversationTemplate = Global.ConversationDataStorage.GetConversationTemplate(conversationEntry); //ASSERT(conversationTemplate); _creatorGuid = creator.GetGUID(); _participants = participants; SetMap(map); Relocate(pos); base._Create(ObjectGuid.Create(HighGuid.Conversation, GetMapId(), conversationEntry, lowGuid)); PhasingHandler.InheritPhaseShift(this, creator); SetEntry(conversationEntry); SetObjectScale(1.0f); SetUInt32Value(ConversationFields.LastLineEndTime, conversationTemplate.LastLineEndTime); _duration = conversationTemplate.LastLineEndTime; for (ushort actorIndex = 0; actorIndex < conversationTemplate.Actors.Count; ++actorIndex) { ConversationActorTemplate actor = conversationTemplate.Actors[actorIndex]; if (actor != null) { ConversationDynamicFieldActor actorField = new ConversationDynamicFieldActor(); actorField.ActorTemplate = actor; actorField.Type = ConversationDynamicFieldActor.ActorType.CreatureActor; SetDynamicStructuredValue(ConversationDynamicFields.Actors, actorIndex, actorField); } } for (ushort actorIndex = 0; actorIndex < conversationTemplate.ActorGuids.Count; ++actorIndex) { ulong actorGuid = conversationTemplate.ActorGuids[actorIndex]; if (actorGuid == 0) { continue; } foreach (var creature in map.GetCreatureBySpawnIdStore().LookupByKey(actorGuid)) { // we just need the last one, overriding is legit AddActor(creature.GetGUID(), actorIndex); } } Global.ScriptMgr.OnConversationCreate(this, creator); List <ushort> actorIndices = new List <ushort>(); foreach (ConversationLineTemplate line in conversationTemplate.Lines) { actorIndices.Add(line.ActorIdx); AddDynamicStructuredValue(ConversationDynamicFields.Lines, line); } // All actors need to be set foreach (ushort actorIndex in actorIndices) { ConversationDynamicFieldActor actor = GetDynamicStructuredValue <ConversationDynamicFieldActor>(ConversationDynamicFields.Actors, actorIndex); if (actor == null || actor.IsEmpty()) { Log.outError(LogFilter.Conversation, $"Failed to create conversation (Id: {conversationEntry}) due to missing actor (Idx: {actorIndex})."); return(false); } } if (!GetMap().AddToMap(this)) { return(false); } return(true); }
static bool HandleGameObjectAddCommand(StringArguments args, CommandHandler handler) { if (args.Empty()) { return(false); } // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r string idStr = handler.extractKeyFromLink(args, "Hgameobject_entry"); if (string.IsNullOrEmpty(idStr)) { return(false); } if (!uint.TryParse(idStr, out uint objectId) || objectId == 0) { return(false); } uint spawntimeSecs = args.NextUInt32(); GameObjectTemplate objectInfo = Global.ObjectMgr.GetGameObjectTemplate(objectId); if (objectInfo == null) { handler.SendSysMessage(CypherStrings.GameobjectNotExist, objectId); return(false); } if (objectInfo.displayId != 0 && !CliDB.GameObjectDisplayInfoStorage.ContainsKey(objectInfo.displayId)) { // report to DB errors log as in loading case Log.outError(LogFilter.Sql, "Gameobject (Entry {0} GoType: {1}) have invalid displayId ({2}), not spawned.", objectId, objectInfo.type, objectInfo.displayId); handler.SendSysMessage(CypherStrings.GameobjectHaveInvalidData, objectId); return(false); } Player player = handler.GetPlayer(); Map map = player.GetMap(); GameObject obj = GameObject.CreateGameObject(objectInfo.entry, map, player, Quaternion.fromEulerAnglesZYX(player.GetOrientation(), 0.0f, 0.0f), 255, GameObjectState.Ready); if (!obj) { return(false); } PhasingHandler.InheritPhaseShift(obj, player); if (spawntimeSecs != 0) { obj.SetRespawnTime((int)spawntimeSecs); } // fill the gameobject data and save to the db obj.SaveToDB(map.GetId(), new List <Difficulty>() { map.GetDifficultyID() }); ulong spawnId = obj.GetSpawnId(); // this will generate a new guid if the object is in an instance obj = GameObject.CreateGameObjectFromDB(spawnId, map); if (!obj) { return(false); } // TODO: is it really necessary to add both the real and DB table guid here ? Global.ObjectMgr.AddGameObjectToGrid(spawnId, Global.ObjectMgr.GetGOData(spawnId)); handler.SendSysMessage(CypherStrings.GameobjectAdd, objectId, objectInfo.name, spawnId, player.GetPositionX(), player.GetPositionY(), player.GetPositionZ()); return(true); }