Beispiel #1
0
        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);
        }
Beispiel #2
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);
        }