Merge branch 'master' of ssh://diva@opensimulator.org/var/git/opensim
commit
ded76723eb
|
@ -83,6 +83,9 @@ namespace OpenSim.Framework
|
||||||
private int _dwell = 0;
|
private int _dwell = 0;
|
||||||
private int _otherCleanTime = 0;
|
private int _otherCleanTime = 0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Upper corner of the AABB for the parcel
|
||||||
|
/// </summary>
|
||||||
public Vector3 AABBMax {
|
public Vector3 AABBMax {
|
||||||
get {
|
get {
|
||||||
return _AABBMax;
|
return _AABBMax;
|
||||||
|
@ -91,7 +94,9 @@ namespace OpenSim.Framework
|
||||||
_AABBMax = value;
|
_AABBMax = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Lower corner of the AABB for the parcel
|
||||||
|
/// </summary>
|
||||||
public Vector3 AABBMin {
|
public Vector3 AABBMin {
|
||||||
get {
|
get {
|
||||||
return _AABBMin;
|
return _AABBMin;
|
||||||
|
@ -101,6 +106,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Area in meters^2 the parcel contains
|
||||||
|
/// </summary>
|
||||||
public int Area {
|
public int Area {
|
||||||
get {
|
get {
|
||||||
return _area;
|
return _area;
|
||||||
|
@ -110,6 +118,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ID of auction (3rd Party Integration) when parcel is being auctioned
|
||||||
|
/// </summary>
|
||||||
public uint AuctionID {
|
public uint AuctionID {
|
||||||
get {
|
get {
|
||||||
return _auctionID;
|
return _auctionID;
|
||||||
|
@ -119,6 +130,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// UUID of authorized buyer of parcel. This is UUID.Zero if anyone can buy it.
|
||||||
|
/// </summary>
|
||||||
public UUID AuthBuyerID {
|
public UUID AuthBuyerID {
|
||||||
get {
|
get {
|
||||||
return _authBuyerID;
|
return _authBuyerID;
|
||||||
|
@ -128,6 +142,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Category of parcel. Used for classifying the parcel in classified listings
|
||||||
|
/// </summary>
|
||||||
public ParcelCategory Category {
|
public ParcelCategory Category {
|
||||||
get {
|
get {
|
||||||
return _category;
|
return _category;
|
||||||
|
@ -137,6 +154,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Date that the current owner purchased or claimed the parcel
|
||||||
|
/// </summary>
|
||||||
public int ClaimDate {
|
public int ClaimDate {
|
||||||
get {
|
get {
|
||||||
return _claimDate;
|
return _claimDate;
|
||||||
|
@ -146,6 +166,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The last price that the parcel was sold at
|
||||||
|
/// </summary>
|
||||||
public int ClaimPrice {
|
public int ClaimPrice {
|
||||||
get {
|
get {
|
||||||
return _claimPrice;
|
return _claimPrice;
|
||||||
|
@ -155,6 +178,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Global ID for the parcel. (3rd Party Integration)
|
||||||
|
/// </summary>
|
||||||
public UUID GlobalID {
|
public UUID GlobalID {
|
||||||
get {
|
get {
|
||||||
return _globalID;
|
return _globalID;
|
||||||
|
@ -164,6 +190,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unique ID of the Group that owns
|
||||||
|
/// </summary>
|
||||||
public UUID GroupID {
|
public UUID GroupID {
|
||||||
get {
|
get {
|
||||||
return _groupID;
|
return _groupID;
|
||||||
|
@ -173,6 +202,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of SceneObjectPart that are owned by a Group
|
||||||
|
/// </summary>
|
||||||
public int GroupPrims {
|
public int GroupPrims {
|
||||||
get {
|
get {
|
||||||
return _groupPrims;
|
return _groupPrims;
|
||||||
|
@ -182,6 +214,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns true if the Land Parcel is owned by a group
|
||||||
|
/// </summary>
|
||||||
public bool IsGroupOwned {
|
public bool IsGroupOwned {
|
||||||
get {
|
get {
|
||||||
return _isGroupOwned;
|
return _isGroupOwned;
|
||||||
|
@ -191,6 +226,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// jp2 data for the image representative of the parcel in the parcel dialog
|
||||||
|
/// </summary>
|
||||||
public byte[] Bitmap {
|
public byte[] Bitmap {
|
||||||
get {
|
get {
|
||||||
return _bitmap;
|
return _bitmap;
|
||||||
|
@ -200,6 +238,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parcel Description
|
||||||
|
/// </summary>
|
||||||
public string Description {
|
public string Description {
|
||||||
get {
|
get {
|
||||||
return _description;
|
return _description;
|
||||||
|
@ -209,6 +250,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parcel settings. Access flags, Fly, NoPush, Voice, Scripts allowed, etc. ParcelFlags
|
||||||
|
/// </summary>
|
||||||
public uint Flags {
|
public uint Flags {
|
||||||
get {
|
get {
|
||||||
return _flags;
|
return _flags;
|
||||||
|
@ -218,6 +262,10 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines if people are able to teleport where they please on the parcel or if they
|
||||||
|
/// get constrainted to a specific point on teleport within the parcel
|
||||||
|
/// </summary>
|
||||||
public byte LandingType {
|
public byte LandingType {
|
||||||
get {
|
get {
|
||||||
return _landingType;
|
return _landingType;
|
||||||
|
@ -227,6 +275,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parcel Name
|
||||||
|
/// </summary>
|
||||||
public string Name {
|
public string Name {
|
||||||
get {
|
get {
|
||||||
return _name;
|
return _name;
|
||||||
|
@ -236,6 +287,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Status of Parcel, Leased, Abandoned, For Sale
|
||||||
|
/// </summary>
|
||||||
public ParcelStatus Status {
|
public ParcelStatus Status {
|
||||||
get {
|
get {
|
||||||
return _status;
|
return _status;
|
||||||
|
@ -245,6 +299,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Internal ID of the parcel. Sometimes the client will try to use this value
|
||||||
|
/// </summary>
|
||||||
public int LocalID {
|
public int LocalID {
|
||||||
get {
|
get {
|
||||||
return _localID;
|
return _localID;
|
||||||
|
@ -254,6 +311,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines if we scale the media based on the surface it's on
|
||||||
|
/// </summary>
|
||||||
public byte MediaAutoScale {
|
public byte MediaAutoScale {
|
||||||
get {
|
get {
|
||||||
return _mediaAutoScale;
|
return _mediaAutoScale;
|
||||||
|
@ -263,6 +323,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Texture Guid to replace with the output of the media stream
|
||||||
|
/// </summary>
|
||||||
public UUID MediaID {
|
public UUID MediaID {
|
||||||
get {
|
get {
|
||||||
return _mediaID;
|
return _mediaID;
|
||||||
|
@ -272,6 +335,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// URL to the media file to display
|
||||||
|
/// </summary>
|
||||||
public string MediaURL {
|
public string MediaURL {
|
||||||
get {
|
get {
|
||||||
return _mediaURL;
|
return _mediaURL;
|
||||||
|
@ -281,6 +347,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// URL to the shoutcast music stream to play on the parcel
|
||||||
|
/// </summary>
|
||||||
public string MusicURL {
|
public string MusicURL {
|
||||||
get {
|
get {
|
||||||
return _musicURL;
|
return _musicURL;
|
||||||
|
@ -290,6 +359,10 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of SceneObjectPart that are owned by users who do not own the parcel
|
||||||
|
/// and don't have the 'group. These are elegable for AutoReturn collection
|
||||||
|
/// </summary>
|
||||||
public int OtherPrims {
|
public int OtherPrims {
|
||||||
get {
|
get {
|
||||||
return _otherPrims;
|
return _otherPrims;
|
||||||
|
@ -299,6 +372,10 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Owner Avatar or Group of the parcel. Naturally, all land masses must be
|
||||||
|
/// owned by someone
|
||||||
|
/// </summary>
|
||||||
public UUID OwnerID {
|
public UUID OwnerID {
|
||||||
get {
|
get {
|
||||||
return _ownerID;
|
return _ownerID;
|
||||||
|
@ -308,6 +385,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of SceneObjectPart that are owned by the owner of the parcel
|
||||||
|
/// </summary>
|
||||||
public int OwnerPrims {
|
public int OwnerPrims {
|
||||||
get {
|
get {
|
||||||
return _ownerPrims;
|
return _ownerPrims;
|
||||||
|
@ -317,6 +397,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// List of access data for the parcel. User data, some bitflags, and a time
|
||||||
|
/// </summary>
|
||||||
public List<ParcelManager.ParcelAccessEntry> ParcelAccessList {
|
public List<ParcelManager.ParcelAccessEntry> ParcelAccessList {
|
||||||
get {
|
get {
|
||||||
return _parcelAccessList;
|
return _parcelAccessList;
|
||||||
|
@ -326,6 +409,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// How long in hours a Pass to the parcel is given
|
||||||
|
/// </summary>
|
||||||
public float PassHours {
|
public float PassHours {
|
||||||
get {
|
get {
|
||||||
return _passHours;
|
return _passHours;
|
||||||
|
@ -335,6 +421,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Price to purchase a Pass to a restricted parcel
|
||||||
|
/// </summary>
|
||||||
public int PassPrice {
|
public int PassPrice {
|
||||||
get {
|
get {
|
||||||
return _passPrice;
|
return _passPrice;
|
||||||
|
@ -344,6 +433,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// When the parcel is being sold, this is the price to purchase the parcel
|
||||||
|
/// </summary>
|
||||||
public int SalePrice {
|
public int SalePrice {
|
||||||
get {
|
get {
|
||||||
return _salePrice;
|
return _salePrice;
|
||||||
|
@ -353,6 +445,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of SceneObjectPart that are currently selected by avatar
|
||||||
|
/// </summary>
|
||||||
public int SelectedPrims {
|
public int SelectedPrims {
|
||||||
get {
|
get {
|
||||||
return _selectedPrims;
|
return _selectedPrims;
|
||||||
|
@ -362,6 +457,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of meters^2 in the Simulator
|
||||||
|
/// </summary>
|
||||||
public int SimwideArea {
|
public int SimwideArea {
|
||||||
get {
|
get {
|
||||||
return _simwideArea;
|
return _simwideArea;
|
||||||
|
@ -371,6 +469,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of SceneObjectPart in the Simulator
|
||||||
|
/// </summary>
|
||||||
public int SimwidePrims {
|
public int SimwidePrims {
|
||||||
get {
|
get {
|
||||||
return _simwidePrims;
|
return _simwidePrims;
|
||||||
|
@ -380,6 +481,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ID of the snapshot used in the client parcel dialog of the parcel
|
||||||
|
/// </summary>
|
||||||
public UUID SnapshotID {
|
public UUID SnapshotID {
|
||||||
get {
|
get {
|
||||||
return _snapshotID;
|
return _snapshotID;
|
||||||
|
@ -389,6 +493,10 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// When teleporting is restricted to a certain point, this is the location
|
||||||
|
/// that the user will be redirected to
|
||||||
|
/// </summary>
|
||||||
public Vector3 UserLocation {
|
public Vector3 UserLocation {
|
||||||
get {
|
get {
|
||||||
return _userLocation;
|
return _userLocation;
|
||||||
|
@ -398,6 +506,10 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// When teleporting is restricted to a certain point, this is the rotation
|
||||||
|
/// that the user will be positioned
|
||||||
|
/// </summary>
|
||||||
public Vector3 UserLookAt {
|
public Vector3 UserLookAt {
|
||||||
get {
|
get {
|
||||||
return _userLookAt;
|
return _userLookAt;
|
||||||
|
@ -407,6 +519,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Depreciated idea. Number of visitors ~= free money
|
||||||
|
/// </summary>
|
||||||
public int Dwell {
|
public int Dwell {
|
||||||
get {
|
get {
|
||||||
return _dwell;
|
return _dwell;
|
||||||
|
@ -416,6 +531,10 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of minutes to return SceneObjectGroup that are owned by someone who doesn't own
|
||||||
|
/// the parcel and isn't set to the same 'group' as the parcel.
|
||||||
|
/// </summary>
|
||||||
public int OtherCleanTime {
|
public int OtherCleanTime {
|
||||||
get {
|
get {
|
||||||
return _otherCleanTime;
|
return _otherCleanTime;
|
||||||
|
@ -425,11 +544,16 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public LandData()
|
public LandData()
|
||||||
{
|
{
|
||||||
_globalID = UUID.Random();
|
_globalID = UUID.Random();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Make a new copy of the land data
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
public LandData Copy()
|
public LandData Copy()
|
||||||
{
|
{
|
||||||
LandData landData = new LandData();
|
LandData landData = new LandData();
|
||||||
|
|
|
@ -0,0 +1,339 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenMetaverse.StructuredData;
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class AgentCircuitDataTest
|
||||||
|
{
|
||||||
|
private UUID AgentId;
|
||||||
|
private AvatarAppearance AvAppearance;
|
||||||
|
private byte[] VisualParams;
|
||||||
|
private UUID BaseFolder;
|
||||||
|
private string CapsPath;
|
||||||
|
private Dictionary<ulong, string> ChildrenCapsPaths;
|
||||||
|
private uint circuitcode = 0949030;
|
||||||
|
private string firstname;
|
||||||
|
private string lastname;
|
||||||
|
private UUID SecureSessionId;
|
||||||
|
private UUID SessionId;
|
||||||
|
private Vector3 StartPos;
|
||||||
|
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void setup()
|
||||||
|
{
|
||||||
|
AgentId = UUID.Random();
|
||||||
|
BaseFolder = UUID.Random();
|
||||||
|
CapsPath = "http://www.opensimulator.org/Caps/Foo";
|
||||||
|
ChildrenCapsPaths = new Dictionary<ulong, string>();
|
||||||
|
ChildrenCapsPaths.Add(ulong.MaxValue, "http://www.opensimulator.org/Caps/Foo2");
|
||||||
|
firstname = "CoolAvatarTest";
|
||||||
|
lastname = "test";
|
||||||
|
StartPos = new Vector3(5,23,125);
|
||||||
|
|
||||||
|
SecureSessionId = UUID.Random();
|
||||||
|
SessionId = UUID.Random();
|
||||||
|
|
||||||
|
AvAppearance = new AvatarAppearance(AgentId);
|
||||||
|
AvAppearance.SetDefaultWearables();
|
||||||
|
VisualParams = new byte[218];
|
||||||
|
AvAppearance.SetDefaultParams(VisualParams);
|
||||||
|
|
||||||
|
//body
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEIGHT] = 155;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_THICKNESS] = 00;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BODY_FAT] = 0;
|
||||||
|
|
||||||
|
//Torso
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_TORSO_MUSCLES] = 48;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_NECK_THICKNESS] = 43;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_NECK_LENGTH] = 255;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SHOULDERS] = 94;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_CHEST_MALE_NO_PECS] = 199;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_ARM_LENGTH] = 255;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HAND_SIZE] = 33;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_TORSO_LENGTH] = 240;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LOVE_HANDLES] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BELLY_SIZE] = 0;
|
||||||
|
|
||||||
|
// legs
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LEG_MUSCLES] = 82;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LEG_LENGTH] = 255;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HIP_WIDTH] = 84;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HIP_LENGTH] = 166;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BUTT_SIZE] = 64;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SADDLEBAGS] = 89;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BOWED_LEGS] = 127;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FOOT_SIZE] = 45;
|
||||||
|
|
||||||
|
|
||||||
|
// head
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_SIZE] = 255;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SQUASH_STRETCH_HEAD] = 0; // head stretch
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_SHAPE] = 155;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EGG_HEAD] = 127;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_POINTY_EARS] = 255;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEAD_LENGTH] = 45;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FACE_SHEAR] = 127;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_FOREHEAD_ANGLE] = 104;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BIG_BROW] = 94;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_PUFFY_UPPER_CHEEKS] = 0; // upper cheeks
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_DOUBLE_CHIN] = 122; // lower cheeks
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HIGH_CHEEK_BONES] = 130;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// eyes
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYE_SIZE] = 105;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WIDE_EYES] = 135;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYE_SPACING] = 184;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYELID_CORNER_UP] = 230;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYELID_INNER_CORNER_UP] = 120;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYE_DEPTH] = 158;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_UPPER_EYELID_FOLD] = 69;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BAGGY_EYES] = 38;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EYELASHES_LONG] = 127;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_POP_EYE] = 127;
|
||||||
|
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.EYES_EYE_COLOR] = 25;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.EYES_EYE_LIGHTNESS] = 127;
|
||||||
|
|
||||||
|
// ears
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BIG_EARS] = 255;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_EARS_OUT] = 127;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_ATTACHED_EARLOBES] = 127;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_POINTY_EARS] = 255;
|
||||||
|
|
||||||
|
// nose
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_NOSE_BIG_OUT] = 79;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WIDE_NOSE] = 35;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BROAD_NOSTRILS] = 86;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LOW_SEPTUM_NOSE] = 112; // nostril division
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BULBOUS_NOSE] = 25;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_NOBLE_NOSE_BRIDGE] = 25; // upper bridge
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LOWER_BRIDGE_NOSE] = 25; // lower bridge
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WIDE_NOSE_BRIDGE] = 25;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_UPTURNED_NOSE_TIP] = 107;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_BULBOUS_NOSE_TIP] = 25;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_CROOKED_NOSE] = 127;
|
||||||
|
|
||||||
|
|
||||||
|
// Mouth
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LIP_WIDTH] = 122;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_TALL_LIPS] = 10; // lip fullness
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LIP_THICKNESS] = 112;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LIP_RATIO] = 137;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_MOUTH_HEIGHT] = 176;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_MOUTH_CORNER] = 140; // Sad --> happy
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_LIP_CLEFT_DEEP] = 84;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WIDE_LIP_CLEFT] = 84;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SHIFT_MOUTH] = 127;
|
||||||
|
|
||||||
|
|
||||||
|
// chin
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_WEAK_CHIN] = 119;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_SQUARE_JAW] = 5;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_DEEP_CHIN] = 132;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_JAW_ANGLE] = 153;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_JAW_JUT] = 100;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_JOWLS] = 38;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_CLEFT_CHIN] = 89;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_CLEFT_CHIN_UPPER] = 89;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_DOUBLE_CHIN] = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// hair color
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_WHITE_HAIR] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_RAINBOW_COLOR_39] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_BLONDE_HAIR] = 24;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_RED_HAIR] = 0;
|
||||||
|
|
||||||
|
// hair style
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_VOLUME] = 160;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_FRONT] = 153;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SIDES] = 153;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_BACK] = 170;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_BIG_FRONT] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_BIG_TOP] = 117;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_BIG_BACK] = 170;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_FRONT_FRINGE] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_SIDE_FRINGE] = 142;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_BACK_FRINGE] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SIDES_FULL] = 146;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SWEEP] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SHEAR_FRONT] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SHEAR_BACK] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_TAPER_FRONT] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_TAPER_BACK] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_RUMPLED] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_PIGTAILS] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_PONYTAIL] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_SPIKED] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_TILT] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_PART_MIDDLE] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_PART_RIGHT] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_PART_LEFT] = 0;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_BANGS_PART_MIDDLE] = 155;
|
||||||
|
|
||||||
|
//Eyebrows
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_EYEBROW_SIZE] = 20;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_EYEBROW_DENSITY] = 140;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_LOWER_EYEBROWS] = 200; // eyebrow height
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_ARCED_EYEBROWS] = 124;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_POINTY_EYEBROWS] = 65;
|
||||||
|
|
||||||
|
//Facial hair
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_HAIR_THICKNESS] = 65;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_SIDEBURNS] = 235;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_MOUSTACHE] = 75;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_CHIN_CURTAINS] = 140;
|
||||||
|
VisualParams[(int)AvatarAppearance.VPElement.HAIR_SOULPATCH] = 0;
|
||||||
|
|
||||||
|
AvAppearance.VisualParams = VisualParams;
|
||||||
|
|
||||||
|
List<byte> wearbyte = new List<byte>();
|
||||||
|
for (int i = 0; i < VisualParams.Length; i++)
|
||||||
|
{
|
||||||
|
wearbyte.Add(VisualParams[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AvAppearance.SetAppearance(AvAppearance.Texture.GetBytes(), wearbyte);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test to ensure that the serialization format is the same and the underlying types don't change without notice
|
||||||
|
/// oldSerialization is just a json serialization of the OSDMap packed for the AgentCircuitData.
|
||||||
|
/// The idea is that if the current json serializer cannot parse the old serialization, then the underlying types
|
||||||
|
/// have changed and are incompatible.
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void HistoricalAgentCircuitDataOSDConversion()
|
||||||
|
{
|
||||||
|
string oldSerialization = "{\"agent_id\":\"522675bd-8214-40c1-b3ca-9c7f7fd170be\",\"base_folder\":\"c40b5f5f-476f-496b-bd69-b5a539c434d8\",\"caps_path\":\"http://www.opensimulator.org/Caps/Foo\",\"children_seeds\":[{\"handle\":\"18446744073709551615\",\"seed\":\"http://www.opensimulator.org/Caps/Foo2\"}],\"child\":false,\"circuit_code\":\"949030\",\"first_name\":\"CoolAvatarTest\",\"last_name\":\"test\",\"inventory_folder\":\"c40b5f5f-476f-496b-bd69-b5a539c434d8\",\"secure_session_id\":\"1e608e2b-0ddb-41f6-be0f-926f61cd3e0a\",\"session_id\":\"aa06f798-9d70-4bdb-9bbf-012a02ee2baf\",\"start_pos\":\"<5, 23, 125>\"}";
|
||||||
|
AgentCircuitData Agent1Data = new AgentCircuitData();
|
||||||
|
Agent1Data.AgentID = new UUID("522675bd-8214-40c1-b3ca-9c7f7fd170be");
|
||||||
|
Agent1Data.Appearance = AvAppearance;
|
||||||
|
Agent1Data.BaseFolder = new UUID("c40b5f5f-476f-496b-bd69-b5a539c434d8");
|
||||||
|
Agent1Data.CapsPath = CapsPath;
|
||||||
|
Agent1Data.child = false;
|
||||||
|
Agent1Data.ChildrenCapSeeds = ChildrenCapsPaths;
|
||||||
|
Agent1Data.circuitcode = circuitcode;
|
||||||
|
Agent1Data.firstname = firstname;
|
||||||
|
Agent1Data.InventoryFolder = new UUID("c40b5f5f-476f-496b-bd69-b5a539c434d8");
|
||||||
|
Agent1Data.lastname = lastname;
|
||||||
|
Agent1Data.SecureSessionID = new UUID("1e608e2b-0ddb-41f6-be0f-926f61cd3e0a");
|
||||||
|
Agent1Data.SessionID = new UUID("aa06f798-9d70-4bdb-9bbf-012a02ee2baf");
|
||||||
|
Agent1Data.startpos = StartPos;
|
||||||
|
|
||||||
|
OSDMap map2 = (OSDMap)OSDParser.DeserializeJson(oldSerialization);
|
||||||
|
|
||||||
|
|
||||||
|
AgentCircuitData Agent2Data = new AgentCircuitData();
|
||||||
|
Agent2Data.UnpackAgentCircuitData(map2);
|
||||||
|
|
||||||
|
Assert.That((Agent1Data.AgentID == Agent2Data.AgentID));
|
||||||
|
Assert.That((Agent1Data.BaseFolder == Agent2Data.BaseFolder));
|
||||||
|
|
||||||
|
Assert.That((Agent1Data.CapsPath == Agent2Data.CapsPath));
|
||||||
|
Assert.That((Agent1Data.child == Agent2Data.child));
|
||||||
|
Assert.That((Agent1Data.ChildrenCapSeeds.Count == Agent2Data.ChildrenCapSeeds.Count));
|
||||||
|
Assert.That((Agent1Data.circuitcode == Agent2Data.circuitcode));
|
||||||
|
Assert.That((Agent1Data.firstname == Agent2Data.firstname));
|
||||||
|
Assert.That((Agent1Data.InventoryFolder == Agent2Data.InventoryFolder));
|
||||||
|
Assert.That((Agent1Data.lastname == Agent2Data.lastname));
|
||||||
|
Assert.That((Agent1Data.SecureSessionID == Agent2Data.SecureSessionID));
|
||||||
|
Assert.That((Agent1Data.SessionID == Agent2Data.SessionID));
|
||||||
|
Assert.That((Agent1Data.startpos == Agent2Data.startpos));
|
||||||
|
/*
|
||||||
|
Enable this once VisualParams go in the packing method
|
||||||
|
for (int i=0;i<208;i++)
|
||||||
|
Assert.That((Agent1Data.Appearance.VisualParams[i] == Agent2Data.Appearance.VisualParams[i]));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test to ensure that the packing and unpacking methods work.
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestAgentCircuitDataOSDConversion()
|
||||||
|
{
|
||||||
|
AgentCircuitData Agent1Data = new AgentCircuitData();
|
||||||
|
Agent1Data.AgentID = AgentId;
|
||||||
|
Agent1Data.Appearance = AvAppearance;
|
||||||
|
Agent1Data.BaseFolder = BaseFolder;
|
||||||
|
Agent1Data.CapsPath = CapsPath;
|
||||||
|
Agent1Data.child = false;
|
||||||
|
Agent1Data.ChildrenCapSeeds = ChildrenCapsPaths;
|
||||||
|
Agent1Data.circuitcode = circuitcode;
|
||||||
|
Agent1Data.firstname = firstname;
|
||||||
|
Agent1Data.InventoryFolder = BaseFolder;
|
||||||
|
Agent1Data.lastname = lastname;
|
||||||
|
Agent1Data.SecureSessionID = SecureSessionId;
|
||||||
|
Agent1Data.SessionID = SessionId;
|
||||||
|
Agent1Data.startpos = StartPos;
|
||||||
|
|
||||||
|
|
||||||
|
OSDMap map = Agent1Data.PackAgentCircuitData();
|
||||||
|
string str = OSDParser.SerializeJsonString(map);
|
||||||
|
//System.Console.WriteLine(str);
|
||||||
|
OSDMap map2 = (OSDMap)OSDParser.DeserializeJson(str);
|
||||||
|
|
||||||
|
|
||||||
|
AgentCircuitData Agent2Data = new AgentCircuitData();
|
||||||
|
Agent2Data.UnpackAgentCircuitData(map2);
|
||||||
|
|
||||||
|
Assert.That((Agent1Data.AgentID == Agent2Data.AgentID));
|
||||||
|
Assert.That((Agent1Data.BaseFolder == Agent2Data.BaseFolder));
|
||||||
|
|
||||||
|
Assert.That((Agent1Data.CapsPath == Agent2Data.CapsPath));
|
||||||
|
Assert.That((Agent1Data.child == Agent2Data.child));
|
||||||
|
Assert.That((Agent1Data.ChildrenCapSeeds.Count == Agent2Data.ChildrenCapSeeds.Count));
|
||||||
|
Assert.That((Agent1Data.circuitcode == Agent2Data.circuitcode));
|
||||||
|
Assert.That((Agent1Data.firstname == Agent2Data.firstname));
|
||||||
|
Assert.That((Agent1Data.InventoryFolder == Agent2Data.InventoryFolder));
|
||||||
|
Assert.That((Agent1Data.lastname == Agent2Data.lastname));
|
||||||
|
Assert.That((Agent1Data.SecureSessionID == Agent2Data.SecureSessionID));
|
||||||
|
Assert.That((Agent1Data.SessionID == Agent2Data.SessionID));
|
||||||
|
Assert.That((Agent1Data.startpos == Agent2Data.startpos));
|
||||||
|
|
||||||
|
/*
|
||||||
|
Enable this once VisualParams go in the packing method
|
||||||
|
for (int i = 0; i < 208; i++)
|
||||||
|
Assert.That((Agent1Data.Appearance.VisualParams[i] == Agent2Data.Appearance.VisualParams[i]));
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3472,6 +3472,7 @@
|
||||||
<Reference name="System.Data"/>
|
<Reference name="System.Data"/>
|
||||||
<Reference name="OpenMetaverse.dll"/>
|
<Reference name="OpenMetaverse.dll"/>
|
||||||
<Reference name="OpenMetaverseTypes.dll"/>
|
<Reference name="OpenMetaverseTypes.dll"/>
|
||||||
|
<Reference name="OpenMetaverse.StructuredData.dll"/>
|
||||||
<Reference name="XMLRPC.dll"/>
|
<Reference name="XMLRPC.dll"/>
|
||||||
<Reference name="OpenSim.Framework.Console"/>
|
<Reference name="OpenSim.Framework.Console"/>
|
||||||
<Reference name="OpenSim.Framework"/>
|
<Reference name="OpenSim.Framework"/>
|
||||||
|
|
Loading…
Reference in New Issue