Merge branch 'avination' into careminster
commit
e6e6e8ab15
|
@ -190,8 +190,15 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
{
|
{
|
||||||
if (textureEntry.FaceTextures.Length > cacheItems[i].TextureIndex)
|
if (textureEntry.FaceTextures.Length > cacheItems[i].TextureIndex)
|
||||||
{
|
{
|
||||||
cacheItems[i].TextureID =
|
Primitive.TextureEntryFace face = textureEntry.FaceTextures[cacheItems[i].TextureIndex];
|
||||||
textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID;
|
if (face == null)
|
||||||
|
{
|
||||||
|
textureEntry.CreateFace(cacheItems[i].TextureIndex);
|
||||||
|
textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID =
|
||||||
|
AppearanceManager.DEFAULT_AVATAR_TEXTURE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
cacheItems[i].TextureID =face.TextureID;
|
||||||
if (m_scene.AssetService != null)
|
if (m_scene.AssetService != null)
|
||||||
cacheItems[i].TextureAsset =
|
cacheItems[i].TextureAsset =
|
||||||
m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString());
|
m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString());
|
||||||
|
@ -213,8 +220,16 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
{
|
{
|
||||||
if (textureEntry.FaceTextures.Length > cacheItems[i].TextureIndex)
|
if (textureEntry.FaceTextures.Length > cacheItems[i].TextureIndex)
|
||||||
{
|
{
|
||||||
|
Primitive.TextureEntryFace face = textureEntry.FaceTextures[cacheItems[i].TextureIndex];
|
||||||
|
if (face == null)
|
||||||
|
{
|
||||||
|
textureEntry.CreateFace(cacheItems[i].TextureIndex);
|
||||||
|
textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID =
|
||||||
|
AppearanceManager.DEFAULT_AVATAR_TEXTURE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
cacheItems[i].TextureID =
|
cacheItems[i].TextureID =
|
||||||
textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID;
|
face.TextureID;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -677,20 +677,53 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
private void SetAppearanceAssets(UUID userID, AvatarAppearance appearance)
|
private void SetAppearanceAssets(UUID userID, AvatarAppearance appearance)
|
||||||
{
|
{
|
||||||
IInventoryService invService = m_scene.InventoryService;
|
IInventoryService invService = m_scene.InventoryService;
|
||||||
|
bool resetwearable = false;
|
||||||
if (invService.GetRootFolder(userID) != null)
|
if (invService.GetRootFolder(userID) != null)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++)
|
for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < appearance.Wearables[i].Count; j++)
|
for (int j = 0; j < appearance.Wearables[i].Count; j++)
|
||||||
{
|
{
|
||||||
|
// Check if the default wearables are not set
|
||||||
if (appearance.Wearables[i][j].ItemID == UUID.Zero)
|
if (appearance.Wearables[i][j].ItemID == UUID.Zero)
|
||||||
continue;
|
{
|
||||||
|
switch ((WearableType) i)
|
||||||
|
{
|
||||||
|
case WearableType.Eyes:
|
||||||
|
case WearableType.Hair:
|
||||||
|
case WearableType.Shape:
|
||||||
|
case WearableType.Skin:
|
||||||
|
//case WearableType.Underpants:
|
||||||
|
TryAndRepair((WearableType)i, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
m_log.Warn("[AVFACTORY]: UUID.Zero Wearables, passing fake values.");
|
||||||
|
resetwearable = true;
|
||||||
|
break;
|
||||||
|
|
||||||
// Ignore ruth's assets
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ignore ruth's assets except for the body parts! missing body parts fail avatar appearance on V1
|
||||||
if (appearance.Wearables[i][j].ItemID == AvatarWearable.DefaultWearables[i][0].ItemID)
|
if (appearance.Wearables[i][j].ItemID == AvatarWearable.DefaultWearables[i][0].ItemID)
|
||||||
continue;
|
{
|
||||||
|
switch ((WearableType)i)
|
||||||
|
{
|
||||||
|
case WearableType.Eyes:
|
||||||
|
case WearableType.Hair:
|
||||||
|
case WearableType.Shape:
|
||||||
|
case WearableType.Skin:
|
||||||
|
//case WearableType.Underpants:
|
||||||
|
TryAndRepair((WearableType)i, invService, userID, appearance);
|
||||||
|
|
||||||
|
m_log.WarnFormat("[AVFACTORY]: {0} Default Wearables, passing existing values.", (WearableType)i);
|
||||||
|
resetwearable = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
InventoryItemBase baseItem = new InventoryItemBase(appearance.Wearables[i][j].ItemID, userID);
|
InventoryItemBase baseItem = new InventoryItemBase(appearance.Wearables[i][j].ItemID, userID);
|
||||||
baseItem = invService.GetItem(baseItem);
|
baseItem = invService.GetItem(baseItem);
|
||||||
|
|
||||||
|
@ -704,17 +737,239 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
"[AVFACTORY]: Can't find inventory item {0} for {1}, setting to default",
|
"[AVFACTORY]: Can't find inventory item {0} for {1}, setting to default",
|
||||||
appearance.Wearables[i][j].ItemID, (WearableType)i);
|
appearance.Wearables[i][j].ItemID, (WearableType)i);
|
||||||
|
|
||||||
appearance.Wearables[i].RemoveItem(appearance.Wearables[i][j].ItemID);
|
TryAndRepair((WearableType)i, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
|
||||||
|
if (appearance.Wearables[(int) WearableType.Eyes] == null)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[AVFACTORY]: {0} Eyes are Null, passing existing values.", (WearableType.Eyes));
|
||||||
|
|
||||||
|
TryAndRepair(WearableType.Eyes, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (appearance.Wearables[(int) WearableType.Eyes][0].ItemID == UUID.Zero)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[AVFACTORY]: Eyes are UUID.Zero are broken, {0} {1}",
|
||||||
|
appearance.Wearables[(int) WearableType.Eyes][0].ItemID,
|
||||||
|
appearance.Wearables[(int) WearableType.Eyes][0].AssetID);
|
||||||
|
TryAndRepair(WearableType.Eyes, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
|
||||||
|
if (appearance.Wearables[(int)WearableType.Shape] == null)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[AVFACTORY]: {0} shape is Null, passing existing values.", (WearableType.Shape));
|
||||||
|
|
||||||
|
TryAndRepair(WearableType.Shape, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (appearance.Wearables[(int)WearableType.Shape][0].ItemID == UUID.Zero)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[AVFACTORY]: Shape is UUID.Zero and broken, {0} {1}",
|
||||||
|
appearance.Wearables[(int)WearableType.Shape][0].ItemID,
|
||||||
|
appearance.Wearables[(int)WearableType.Shape][0].AssetID);
|
||||||
|
TryAndRepair(WearableType.Shape, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
|
||||||
|
if (appearance.Wearables[(int)WearableType.Hair] == null)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[AVFACTORY]: {0} Hair is Null, passing existing values.", (WearableType.Hair));
|
||||||
|
|
||||||
|
TryAndRepair(WearableType.Hair, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (appearance.Wearables[(int)WearableType.Hair][0].ItemID == UUID.Zero)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[AVFACTORY]: Hair is UUID.Zero and broken, {0} {1}",
|
||||||
|
appearance.Wearables[(int)WearableType.Hair][0].ItemID,
|
||||||
|
appearance.Wearables[(int)WearableType.Hair][0].AssetID);
|
||||||
|
TryAndRepair(WearableType.Hair, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// I don't know why we have to test for this again... but the above switches do not capture these scenarios for some reason....
|
||||||
|
if (appearance.Wearables[(int)WearableType.Skin] == null)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[AVFACTORY]: {0} Skin is Null, passing existing values.", (WearableType.Skin));
|
||||||
|
|
||||||
|
TryAndRepair(WearableType.Skin, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (appearance.Wearables[(int)WearableType.Skin][0].ItemID == UUID.Zero)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[AVFACTORY]: Skin is UUID.Zero and broken, {0} {1}",
|
||||||
|
appearance.Wearables[(int)WearableType.Skin][0].ItemID,
|
||||||
|
appearance.Wearables[(int)WearableType.Skin][0].AssetID);
|
||||||
|
TryAndRepair(WearableType.Skin, invService, userID, appearance);
|
||||||
|
resetwearable = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (resetwearable)
|
||||||
|
{
|
||||||
|
ScenePresence presence = null;
|
||||||
|
if (m_scene.TryGetScenePresence(userID, out presence))
|
||||||
|
{
|
||||||
|
presence.ControllingClient.SendWearables(presence.Appearance.Wearables,
|
||||||
|
presence.Appearance.Serial++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[AVFACTORY]: user {0} has no inventory, appearance isn't going to work", userID);
|
m_log.WarnFormat("[AVFACTORY]: user {0} has no inventory, appearance isn't going to work", userID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private void TryAndRepair(WearableType type, IInventoryService invService, UUID userID,AvatarAppearance appearance)
|
||||||
|
{
|
||||||
|
UUID defaultwearable = GetDefaultItem(type);
|
||||||
|
if (defaultwearable != UUID.Zero)
|
||||||
|
{
|
||||||
|
UUID newInvItem = UUID.Random();
|
||||||
|
InventoryItemBase itembase = new InventoryItemBase(newInvItem, userID)
|
||||||
|
{
|
||||||
|
AssetID =
|
||||||
|
defaultwearable,
|
||||||
|
AssetType
|
||||||
|
=
|
||||||
|
(int)
|
||||||
|
AssetType
|
||||||
|
.Bodypart,
|
||||||
|
CreatorId
|
||||||
|
=
|
||||||
|
userID
|
||||||
|
.ToString
|
||||||
|
(),
|
||||||
|
//InvType = (int)InventoryType.Wearable,
|
||||||
|
|
||||||
|
Description
|
||||||
|
=
|
||||||
|
"Failed Wearable Replacement",
|
||||||
|
Folder =
|
||||||
|
invService
|
||||||
|
.GetFolderForType
|
||||||
|
(userID,
|
||||||
|
AssetType
|
||||||
|
.Bodypart)
|
||||||
|
.ID,
|
||||||
|
Flags = (uint) type,
|
||||||
|
Name = Enum.GetName(typeof (WearableType), type),
|
||||||
|
BasePermissions = (uint) PermissionMask.Copy,
|
||||||
|
CurrentPermissions = (uint) PermissionMask.Copy,
|
||||||
|
EveryOnePermissions = (uint) PermissionMask.Copy,
|
||||||
|
GroupPermissions = (uint) PermissionMask.Copy,
|
||||||
|
NextPermissions = (uint) PermissionMask.Copy
|
||||||
|
};
|
||||||
|
invService.AddItem(itembase);
|
||||||
|
UUID LinkInvItem = UUID.Random();
|
||||||
|
itembase = new InventoryItemBase(LinkInvItem, userID)
|
||||||
|
{
|
||||||
|
AssetID =
|
||||||
|
newInvItem,
|
||||||
|
AssetType
|
||||||
|
=
|
||||||
|
(int)
|
||||||
|
AssetType
|
||||||
|
.Link,
|
||||||
|
CreatorId
|
||||||
|
=
|
||||||
|
userID
|
||||||
|
.ToString
|
||||||
|
(),
|
||||||
|
InvType = (int) InventoryType.Wearable,
|
||||||
|
|
||||||
|
Description
|
||||||
|
=
|
||||||
|
"Failed Wearable Replacement",
|
||||||
|
Folder =
|
||||||
|
invService
|
||||||
|
.GetFolderForType
|
||||||
|
(userID,
|
||||||
|
AssetType
|
||||||
|
.CurrentOutfitFolder)
|
||||||
|
.ID,
|
||||||
|
Flags = (uint) type,
|
||||||
|
Name = Enum.GetName(typeof (WearableType), type),
|
||||||
|
BasePermissions = (uint) PermissionMask.Copy,
|
||||||
|
CurrentPermissions = (uint) PermissionMask.Copy,
|
||||||
|
EveryOnePermissions = (uint) PermissionMask.Copy,
|
||||||
|
GroupPermissions = (uint) PermissionMask.Copy,
|
||||||
|
NextPermissions = (uint) PermissionMask.Copy
|
||||||
|
};
|
||||||
|
invService.AddItem(itembase);
|
||||||
|
appearance.Wearables[(int)type] = new AvatarWearable(newInvItem, GetDefaultItem(type));
|
||||||
|
ScenePresence presence = null;
|
||||||
|
if (m_scene.TryGetScenePresence(userID, out presence))
|
||||||
|
{
|
||||||
|
m_scene.SendInventoryUpdate(presence.ControllingClient,
|
||||||
|
invService.GetFolderForType(userID,
|
||||||
|
AssetType
|
||||||
|
.CurrentOutfitFolder),
|
||||||
|
false, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private UUID GetDefaultItem(WearableType wearable)
|
||||||
|
{
|
||||||
|
// These are Urban male.. but it doesn't matter as long as the assets exist.
|
||||||
|
UUID ret = UUID.Zero;
|
||||||
|
switch (wearable)
|
||||||
|
{
|
||||||
|
case WearableType.Eyes:
|
||||||
|
ret = new UUID("46d7f979-c060-0ad6-5d3c-8de38c941c8d");
|
||||||
|
break;
|
||||||
|
case WearableType.Hair:
|
||||||
|
ret = new UUID("21ae002d-57af-441a-81ff-86f5f674b9b9");
|
||||||
|
break;
|
||||||
|
case WearableType.Pants:
|
||||||
|
ret = new UUID("e3440698-48fd-41ac-af9b-f680547cbef2");
|
||||||
|
break;
|
||||||
|
case WearableType.Shape:
|
||||||
|
ret = new UUID("7c1f1354-2aba-4e55-8357-1545c2c003ce");
|
||||||
|
break;
|
||||||
|
case WearableType.Shirt:
|
||||||
|
ret = new UUID("f8fefa00-b019-4072-9c04-ff79c65348b9");
|
||||||
|
break;
|
||||||
|
case WearableType.Shoes:
|
||||||
|
ret = new UUID("6455d2cf-0ee1-4c9a-9812-da03371bf719");
|
||||||
|
break;
|
||||||
|
case WearableType.Skin:
|
||||||
|
ret = new UUID("29c99e80-cf59-4fa0-9f8e-e4a1ccaf2fa3");
|
||||||
|
break;
|
||||||
|
case WearableType.Socks:
|
||||||
|
ret = new UUID("96472ac3-1e18-49e5-b2e4-17c03791ea96");
|
||||||
|
break;
|
||||||
|
case WearableType.Underpants:
|
||||||
|
ret = new UUID("d6c7b174-8a2d-473f-a80f-3b7d7b7b3a96");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Client Event Handlers
|
#region Client Event Handlers
|
||||||
|
|
|
@ -5109,7 +5109,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
|
if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
|
||||||
{
|
{
|
||||||
if (grp.RootPart.Expires <= DateTime.Now)
|
if (grp.GetSittingAvatarsCount() == 0 && grp.RootPart.Expires <= DateTime.Now)
|
||||||
DeleteSceneObject(grp, false);
|
DeleteSceneObject(grp, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -995,63 +995,67 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
|
|
||||||
d.ContactGeom maxContact = curContact;
|
d.ContactGeom maxContact = curContact;
|
||||||
// if (IgnoreNegSides && curContact.side1 < 0)
|
// if (IgnoreNegSides && curContact.side1 < 0)
|
||||||
// maxContact.depth = float.MinValue;
|
// maxContact.depth = float.MinValue;
|
||||||
|
|
||||||
d.ContactGeom minContact = curContact;
|
d.ContactGeom minContact = curContact;
|
||||||
// if (IgnoreNegSides && curContact.side1 < 0)
|
// if (IgnoreNegSides && curContact.side1 < 0)
|
||||||
// minContact.depth = float.MaxValue;
|
// minContact.depth = float.MaxValue;
|
||||||
|
|
||||||
IntPtr Joint;
|
IntPtr Joint;
|
||||||
bool FeetCollision = false;
|
bool FeetCollision = false;
|
||||||
int ncontacts = 0;
|
int ncontacts = 0;
|
||||||
|
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (m_global_contactcount >= maxContactsbeforedeath)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// if (!(IgnoreNegSides && curContact.side1 < 0))
|
// if (!(IgnoreNegSides && curContact.side1 < 0))
|
||||||
|
{
|
||||||
|
bool noskip = true;
|
||||||
|
if (dop1ava)
|
||||||
{
|
{
|
||||||
bool noskip = true;
|
if (!(((OdeCharacter)p1).Collide(g1, false, ref curContact, ref FeetCollision)))
|
||||||
if (dop1ava)
|
|
||||||
{
|
|
||||||
if (!(((OdeCharacter)p1).Collide(g1,false, ref curContact, ref FeetCollision)))
|
|
||||||
|
|
||||||
noskip = false;
|
noskip = false;
|
||||||
}
|
}
|
||||||
else if (dop2ava)
|
else if (dop2ava)
|
||||||
{
|
{
|
||||||
if (!(((OdeCharacter)p2).Collide(g2,true, ref curContact, ref FeetCollision)))
|
if (!(((OdeCharacter)p2).Collide(g2, true, ref curContact, ref FeetCollision)))
|
||||||
noskip = false;
|
noskip = false;
|
||||||
}
|
|
||||||
|
|
||||||
if (noskip)
|
|
||||||
{
|
|
||||||
m_global_contactcount++;
|
|
||||||
ncontacts++;
|
|
||||||
|
|
||||||
Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale);
|
|
||||||
d.JointAttach(Joint, b1, b2);
|
|
||||||
|
|
||||||
if (curContact.depth > maxContact.depth)
|
|
||||||
maxContact = curContact;
|
|
||||||
|
|
||||||
if (curContact.depth < minContact.depth)
|
|
||||||
minContact = curContact;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (++i >= count)
|
if (noskip)
|
||||||
break;
|
{
|
||||||
|
m_global_contactcount++;
|
||||||
|
if (m_global_contactcount >= maxContactsbeforedeath)
|
||||||
|
break;
|
||||||
|
|
||||||
if (!GetCurContactGeom(i, ref curContact))
|
ncontacts++;
|
||||||
break;
|
|
||||||
|
Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale);
|
||||||
|
if (Joint == IntPtr.Zero)
|
||||||
|
break;
|
||||||
|
|
||||||
|
d.JointAttach(Joint, b1, b2);
|
||||||
|
|
||||||
|
if (curContact.depth > maxContact.depth)
|
||||||
|
maxContact = curContact;
|
||||||
|
|
||||||
|
if (curContact.depth < minContact.depth)
|
||||||
|
minContact = curContact;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (++i >= count)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!GetCurContactGeom(i, ref curContact))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (ncontacts > 0)
|
if (ncontacts > 0)
|
||||||
{
|
{
|
||||||
ContactPoint maxDepthContact = new ContactPoint(
|
ContactPoint maxDepthContact = new ContactPoint(
|
||||||
|
|
Loading…
Reference in New Issue