public override VMPrimitiveExitCode Execute(VMStackFrame context, VMPrimitiveOperand args) { var operand = (VMChangeSuitOrAccessoryOperand)args; var avatar = (VMAvatar)context.Caller; if ((operand.Flags & VMChangeSuitOrAccessoryFlags.Update) == VMChangeSuitOrAccessoryFlags.Update) { //update default outfit with outfit in stringset 304 with index in temp 0 avatar.DefaultSuits.Daywear = Convert.ToUInt64(context.Callee.Object.Resource.Get <STR>(304).GetString((context.Thread.TempRegisters[0])), 16); avatar.BodyOutfit = avatar.DefaultSuits.Daywear; } else { var suit = VMSuitProvider.GetSuit(context, operand.SuitScope, operand.SuitData); if (suit == null) { return(VMPrimitiveExitCode.GOTO_TRUE); } if (suit is string) { var suitFile = (string)suit; var apr = FSO.Content.Content.Get().AvatarAppearances.Get(suitFile); if ((operand.Flags & VMChangeSuitOrAccessoryFlags.Remove) == VMChangeSuitOrAccessoryFlags.Remove) { avatar.BoundAppearances.Remove(suitFile); avatar.Avatar.RemoveAccessory(apr); } else { avatar.BoundAppearances.Add(suitFile); avatar.Avatar.AddAccessory(apr); } } else if (suit is ulong) { var oft = (ulong)suit; avatar.SetPersonData(Model.VMPersonDataVariable.CurrentOutfit, operand.SuitData); avatar.BodyOutfit = oft; } } return(VMPrimitiveExitCode.GOTO_TRUE); }
public override VMPrimitiveExitCode Execute(VMStackFrame context, VMPrimitiveOperand args) { var operand = (VMChangeSuitOrAccessoryOperand)args; var avatar = (VMAvatar)context.Caller; var outfitType = GetOutfitType(operand); if (operand.SuitScope == VMSuitScope.Object && (operand.Flags & VMChangeSuitOrAccessoryFlags.Update) == VMChangeSuitOrAccessoryFlags.Update) { //update default outfit with outfit in stringset 304 with index in temp 0 avatar.DefaultSuits.Daywear = VMOutfitReference.Parse(context.Callee.Object.Resource.Get <STR>(304).GetString((context.Thread.TempRegisters[0])), context.VM.TS1); avatar.BodyOutfit = avatar.DefaultSuits.Daywear; } else { var data = operand.SuitData; if (operand.Flags.HasFlag(VMChangeSuitOrAccessoryFlags.UseTemp)) { data = (byte)context.Thread.TempRegisters[data]; } var suit = VMSuitProvider.GetSuit(context, operand.SuitScope, data); if (suit == null) { return(VMPrimitiveExitCode.GOTO_TRUE); } if (suit is string) { var suitFile = (string)suit; var apr = (VM.UseWorld) ? FSO.Content.Content.Get().AvatarAppearances.Get(suitFile) : null; if ((operand.Flags & VMChangeSuitOrAccessoryFlags.Remove) == VMChangeSuitOrAccessoryFlags.Remove) { avatar.BoundAppearances.Remove(suitFile); if (VM.UseWorld && apr != null) { avatar.Avatar.RemoveAccessory(apr); } } else { avatar.BoundAppearances.Add(suitFile); if (VM.UseWorld && apr != null) { avatar.Avatar.AddAccessory(apr); } } } else if (suit is VMOutfitReference) { avatar.SetPersonData(Model.VMPersonDataVariable.CurrentOutfit, operand.SuitData); avatar.BodyOutfit = (VMOutfitReference)suit; } else if (suit is ulong) { if (outfitType == OutfitType.BODY) { avatar.SetPersonData(Model.VMPersonDataVariable.CurrentOutfit, operand.SuitData); avatar.BodyOutfit = new VMOutfitReference((ulong)suit); } else if (outfitType == OutfitType.ACCESSORY) { if (VM.UseWorld) { var outfit = Content.Content.Get().AvatarOutfits?.Get((ulong)suit); if ((operand.Flags & VMChangeSuitOrAccessoryFlags.Remove) == VMChangeSuitOrAccessoryFlags.Remove) { avatar.Avatar.RemoveAccessory(outfit); } else { //The clothing rack does not seem to have any way to remove accessories so I have implemented as a toggle //until we know better switch ((VMPersonSuits)operand.SuitData) { case VMPersonSuits.DecorationHead: if (avatar.Avatar.DecorationHead == outfit) { //Remove it avatar.Avatar.DecorationHead = null; } else { //Add it avatar.Avatar.DecorationHead = outfit; } break; case VMPersonSuits.DecorationBack: if (avatar.Avatar.DecorationBack == outfit) { //Remove it avatar.Avatar.DecorationBack = null; } else { //Add it avatar.Avatar.DecorationBack = outfit; } break; case VMPersonSuits.DecorationShoes: if (avatar.Avatar.DecorationShoes == outfit) { //Remove it avatar.Avatar.DecorationShoes = null; } else { //Add it avatar.Avatar.DecorationShoes = outfit; } break; case VMPersonSuits.DecorationTail: if (avatar.Avatar.DecorationTail == outfit) { //Remove it avatar.Avatar.DecorationTail = null; } else { //Add it avatar.Avatar.DecorationTail = outfit; } break; } } } } } } return(VMPrimitiveExitCode.GOTO_TRUE); }