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); }
public void SetAvatarBodyStrings(STR data, VMContext context) { if (data == null) { return; } try { if (context.VM.TS1) { DefaultSuits.Daywear = new VMOutfitReference(data, false); HeadOutfit = new VMOutfitReference(data, true); BodyOutfit = DefaultSuits.Daywear; } else { var body = data.GetString(1); var randBody = data.GetString(10); if (randBody != "") { var bodySpl = randBody.Split(';'); DefaultSuits.Daywear = VMOutfitReference.Parse(bodySpl[context.NextRandom((ulong)bodySpl.Length - 1)], context.VM.TS1); } else if (body != "") { DefaultSuits.Daywear = VMOutfitReference.Parse(body, context.VM.TS1); } BodyOutfit = DefaultSuits.Daywear; var head = data.GetString(2); var randHead = data.GetString(9); if (randHead != "") { var headSpl = randHead.Split(';'); HeadOutfit = VMOutfitReference.Parse(headSpl[context.NextRandom((ulong)headSpl.Length - 1)], context.VM.TS1); } else if (head != "") { HeadOutfit = VMOutfitReference.Parse(head, context.VM.TS1); } } } catch { //head or body invalid, resort to default. } var gender = data.GetString(12); var genVar = (int)VMPersonDataVariable.Gender; if (gender.Equals("male", StringComparison.InvariantCultureIgnoreCase)) { PersonData[genVar] = 0; } else if (gender.Equals("female", StringComparison.InvariantCultureIgnoreCase)) { PersonData[genVar] = 1; } else if (gender.Equals("dogmale", StringComparison.InvariantCultureIgnoreCase)) { PersonData[genVar] = 8; } else if (gender.Equals("dogfemale", StringComparison.InvariantCultureIgnoreCase)) { PersonData[genVar] = 9; } else if (gender.Equals("catmale", StringComparison.InvariantCultureIgnoreCase)) { PersonData[genVar] = 16; } else if (gender.Equals("catfemale", StringComparison.InvariantCultureIgnoreCase)) { PersonData[genVar] = 17; } var names = data.GetString(11); if (names != "") { var nameSpl = names.Split(';'); Name = nameSpl[context.NextRandom((ulong)nameSpl.Length)]; } PersonData[(int)VMPersonDataVariable.PersonsAge] = Convert.ToInt16(data.GetString(13)); var skinTone = data.GetString(14); if (skinTone.Equals("lgt", StringComparison.InvariantCultureIgnoreCase) || context.VM.TS1) { SkinTone = AppearanceType.Light; } else if (skinTone.Equals("med", StringComparison.InvariantCultureIgnoreCase)) { SkinTone = AppearanceType.Medium; } else if (skinTone.Equals("drk", StringComparison.InvariantCultureIgnoreCase)) { SkinTone = AppearanceType.Dark; } }