Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
            }
        }