/// <summary> /// creates a lifesone 3 units (just in front of) the player. /// </summary> public GameMessageCreateLifestone(Player player) : base(GameMessageOpcode.ObjectCreate, GameMessageGroup.Group0A) { float qw = player.Position.Facing.W; // north float qz = player.Position.Facing.Z; // south double x = 2 * qw * qz; double y = 1 - 2 * qz * qz; var heading = Math.Atan2(x, y); double scalar = 3.0f; var dx = -1 * Convert.ToSingle(Math.Sin(heading) * scalar); var dy = Convert.ToSingle(Math.Cos(heading) * scalar); Position newPosition = new Position(player.Position.LandblockId.Raw, player.Position.Offset.X + dx, player.Position.Offset.Y + dy, player.Position.Offset.Z + 0.5f, 0f, 0f, 0f, 0f); var weenie = WeenieHeaderFlag.Usable | WeenieHeaderFlag.BlipColour | WeenieHeaderFlag.Radar | WeenieHeaderFlag.UseRadius; ImmutableWorldObject wo = new ImmutableWorldObject(ObjectType.LifeStone, new ObjectGuid(GuidManager.NewStaticObjectGuid()), "Life Stone", 1, ObjectDescriptionFlag.LifeStone, weenie, newPosition); wo.PhysicsData.MTableResourceId = 0x09000026u; wo.PhysicsData.Stable = 0x20000014u; wo.PhysicsData.CSetup = (uint)0x020002EEu; wo.PhysicsData.PhysicsDescriptionFlag = PhysicsDescriptionFlag.CSetup | PhysicsDescriptionFlag.MTable | PhysicsDescriptionFlag.Stable | PhysicsDescriptionFlag.Position; //game data min required flags; wo.GameData.Type = (ushort)0x1355; wo.GameData.Icon = (ushort)0x1036; wo.GameData.Usable = Usable.UsableRemote; wo.GameData.RadarColour = RadarColor.LifeStone; wo.GameData.RadarBehavior = RadarBehavior.ShowAlways; wo.GameData.UseRadius = 4f; wo.SerializeCreateObject(Writer); }