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)); SetPhaseMask(creator.GetPhaseMask(), false); CopyPhaseFrom(creator); SetEntry(conversationEntry); SetObjectScale(1.0f); SetUInt32Value(ConversationFields.LastLineEndTime, conversationTemplate.LastLineEndTime); _duration = conversationTemplate.LastLineEndTime; ushort actorsIndex = 0; foreach (ConversationActorTemplate actor in conversationTemplate.Actors) { if (actor != null) { ConversationDynamicFieldActor actorField = new ConversationDynamicFieldActor(); actorField.ActorTemplate = actor; actorField.Type = ConversationDynamicFieldActor.ActorType.CreatureActor; SetDynamicStructuredValue(ConversationDynamicFields.Actors, actorsIndex++, actorField); } else { ++actorsIndex; } } ushort linesIndex = 0; foreach (ConversationLineTemplate line in conversationTemplate.Lines) { SetDynamicStructuredValue(ConversationDynamicFields.Lines, linesIndex++, line); } if (!GetMap().AddToMap(this)) { return(false); } return(true); }
/// <summary> /// Converstation /// </summary> /// <param name="latest">Comments</param> public void Conversation(Comment latest, ProfileFull toUser) { var template = new ConversationTemplate() { Latest = latest, }; try { var subject = string.Format("[Borentra] Your friend {0} has sent you a message!", latest.FromDisplayName); this.SendGeneric(toUser.Email, latest.FromDisplayName, subject, "New Message", template.TransformText()); } catch { } }
public static Conversation CreateConversation(uint conversationEntry, Unit creator, Position pos, List <ObjectGuid> participants, SpellInfo spellInfo = null) { ConversationTemplate conversationTemplate = Global.ConversationDataStorage.GetConversationTemplate(conversationEntry); if (conversationTemplate == null) { return(null); } ulong lowGuid = creator.GetMap().GenerateLowGuid(HighGuid.Conversation); Conversation conversation = new Conversation(); if (!conversation.Create(lowGuid, conversationEntry, creator.GetMap(), creator, pos, participants, spellInfo)) { return(null); } return(conversation); }
private static void ReadCreateObjectBlock(Packet packet, WowGuid guid, uint map, object index) { var objType = packet.ReadByteE <ObjectType>("Object Type", index); WoWObject obj; switch (objType) { case ObjectType.Unit: obj = new Unit(); break; case ObjectType.GameObject: obj = new GameObject(); break; case ObjectType.Item: obj = new Item(); break; case ObjectType.Player: obj = new Player(); break; case ObjectType.AreaTrigger: obj = new SpellAreaTrigger(); break; case ObjectType.Conversation: obj = new ConversationTemplate(); break; default: obj = new WoWObject(); break; } var moves = ReadMovementUpdateBlock(packet, guid, obj, index); var updates = ReadValuesUpdateBlock(packet, objType, index, true); var dynamicUpdates = ReadDynamicValuesUpdateBlock(packet, objType, index, true); obj.Type = objType; obj.Movement = moves; obj.UpdateFields = updates; obj.DynamicUpdateFields = dynamicUpdates; obj.Map = map; obj.Area = CoreParsers.WorldStateHandler.CurrentAreaId; obj.Zone = CoreParsers.WorldStateHandler.CurrentZoneId; obj.PhaseMask = (uint)CoreParsers.MovementHandler.CurrentPhaseMask; obj.Phases = new HashSet <ushort>(V6_0_2_19033.Parsers.MovementHandler.ActivePhases.Keys); obj.DifficultyID = CoreParsers.MovementHandler.CurrentDifficultyID; // If this is the second time we see the same object (same guid, // same position) update its phasemask if (Storage.Objects.ContainsKey(guid)) { var existObj = Storage.Objects[guid].Item1; CoreParsers.UpdateHandler.ProcessExistingObject(ref existObj, obj, guid); // can't do "ref Storage.Objects[guid].Item1 directly } else { Storage.Objects.Add(guid, obj, packet.TimeSpan); } if (guid.HasEntry() && (objType == ObjectType.Unit || objType == ObjectType.GameObject)) { packet.AddSniffData(Utilities.ObjectTypeToStore(objType), (int)guid.GetEntry(), "SPAWN"); } }
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); }
private static void ReadCreateObjectBlock(Packet packet, WowGuid guid, uint map, object index) { ObjectType objType = ObjectTypeConverter.Convert(packet.ReadByteE <ObjectType801>("Object Type", index)); if (ClientVersion.RemovedInVersion(ClientVersionBuild.V8_1_0_28724)) { packet.ReadInt32("HeirFlags", index); } WoWObject obj; switch (objType) { case ObjectType.Unit: obj = new Unit(); break; case ObjectType.GameObject: obj = new GameObject(); break; case ObjectType.Player: obj = new Player(); break; case ObjectType.AreaTrigger: obj = new SpellAreaTrigger(); break; case ObjectType.Conversation: obj = new ConversationTemplate(); break; default: obj = new WoWObject(); break; } var moves = ReadMovementUpdateBlock(packet, guid, obj, index); if (ClientVersion.AddedInVersion(ClientVersionBuild.V8_1_0_28724)) { var updatefieldSize = packet.ReadUInt32(); using (var fieldsData = new Packet(packet.ReadBytes((int)updatefieldSize), packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName)) { var flags = fieldsData.ReadByteE <UpdateFieldFlag>("FieldFlags", index); var handler = CoreFields.UpdateFields.GetHandler(); obj.ObjectData = handler.ReadCreateObjectData(fieldsData, flags, index); switch (objType) { case ObjectType.Item: handler.ReadCreateItemData(fieldsData, flags, index); break; case ObjectType.Container: handler.ReadCreateItemData(fieldsData, flags, index); handler.ReadCreateContainerData(fieldsData, flags, index); break; case ObjectType.AzeriteEmpoweredItem: handler.ReadCreateItemData(fieldsData, flags, index); handler.ReadCreateAzeriteEmpoweredItemData(fieldsData, flags, index); break; case ObjectType.AzeriteItem: handler.ReadCreateItemData(fieldsData, flags, index); handler.ReadCreateAzeriteItemData(fieldsData, flags, index); break; case ObjectType.Unit: (obj as Unit).UnitData = handler.ReadCreateUnitData(fieldsData, flags, index); break; case ObjectType.Player: handler.ReadCreateUnitData(fieldsData, flags, index); handler.ReadCreatePlayerData(fieldsData, flags, index); break; case ObjectType.ActivePlayer: handler.ReadCreateUnitData(fieldsData, flags, index); handler.ReadCreatePlayerData(fieldsData, flags, index); handler.ReadCreateActivePlayerData(fieldsData, flags, index); break; case ObjectType.GameObject: (obj as GameObject).GameObjectData = handler.ReadCreateGameObjectData(fieldsData, flags, index); break; case ObjectType.DynamicObject: handler.ReadCreateDynamicObjectData(fieldsData, flags, index); break; case ObjectType.Corpse: handler.ReadCreateCorpseData(fieldsData, flags, index); break; case ObjectType.AreaTrigger: (obj as SpellAreaTrigger).AreaTriggerData = handler.ReadCreateAreaTriggerData(fieldsData, flags, index); break; case ObjectType.SceneObject: handler.ReadCreateSceneObjectData(fieldsData, flags, index); break; case ObjectType.Conversation: (obj as ConversationTemplate).ConversationData = handler.ReadCreateConversationData(fieldsData, flags, index); break; } } } else { var updates = CoreParsers.UpdateHandler.ReadValuesUpdateBlockOnCreate(packet, objType, index); var dynamicUpdates = CoreParsers.UpdateHandler.ReadDynamicValuesUpdateBlockOnCreate(packet, objType, index); obj.UpdateFields = updates; obj.DynamicUpdateFields = dynamicUpdates; } obj.Type = objType; obj.Movement = moves; obj.Map = map; obj.Area = CoreParsers.WorldStateHandler.CurrentAreaId; obj.Zone = CoreParsers.WorldStateHandler.CurrentZoneId; obj.PhaseMask = (uint)CoreParsers.MovementHandler.CurrentPhaseMask; obj.Phases = new HashSet <ushort>(CoreParsers.MovementHandler.ActivePhases.Keys); obj.DifficultyID = CoreParsers.MovementHandler.CurrentDifficultyID; // If this is the second time we see the same object (same guid, // same position) update its phasemask if (Storage.Objects.ContainsKey(guid)) { var existObj = Storage.Objects[guid].Item1; CoreParsers.UpdateHandler.ProcessExistingObject(ref existObj, obj, guid); // can't do "ref Storage.Objects[guid].Item1 directly } else { Storage.Objects.Add(guid, obj, packet.TimeSpan); } if (guid.HasEntry() && (objType == ObjectType.Unit || objType == ObjectType.GameObject)) { packet.AddSniffData(Utilities.ObjectTypeToStore(objType), (int)guid.GetEntry(), "SPAWN"); } }
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)); CopyPhaseFrom(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); }
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];