Пример #1
0
        public static VMOutfitReference GetPersonSuitTS1(VMAvatar avatar, ushort id)
        {
            var  type        = (VMPersonSuits)id;
            var  bodyStrings = avatar.Object.Resource.Get <STR>(avatar.Object.OBJ.BodyStringID);
            bool male        = (avatar.GetPersonData(VMPersonDataVariable.Gender) == 0);
            var  age         = avatar.GetPersonData(VMPersonDataVariable.PersonsAge);
            var  skn         = bodyStrings.GetString(14).ToLowerInvariant();
            var  child       = (age < 18 && age != 0);

            var code = "fit";

            if (bodyStrings.GetString(1).ToLowerInvariant().Contains("fat"))
            {
                code = "fat";
            }
            else if (bodyStrings.GetString(1).ToLowerInvariant().Contains("skn"))
            {
                code = "skn";
            }
            if (child)
            {
                code = "uchd";
            }
            else
            {
                code = (male ? "m" : "f") + code;
            }

            VMOutfitReference toHandCopy = null;

            switch (type)
            {
            //todo: (tail etc), cockroach head

            case VMPersonSuits.DefaultDaywear:
                return(new VMOutfitReference(bodyStrings, false));

            case VMPersonSuits.Naked:
                toHandCopy = new VMOutfitReference("n" + code + "_01,BODY=" + "n" + code + skn + "_01", false);
                break;

            case VMPersonSuits.DefaultSwimwear:
                if (IsValid(bodyStrings.GetString(31)))
                {
                    goto case VMPersonSuits.TS1ExpandedSwimsuit;
                }
                toHandCopy = new VMOutfitReference("n" + code + "_01,BODY=" + "u" + code + skn + "_" + ((male && !child)?"briefs":"undies") + "01", false);
                break;

            case VMPersonSuits.TS1Formal:
                if (IsValid(bodyStrings.GetString(30)))
                {
                    goto case VMPersonSuits.TS1ExpandedFormal;
                }
                toHandCopy = new VMOutfitReference("f" + code + "_01,BODY=" + "f" + code + skn + "_01", false);
                break;

            case VMPersonSuits.JobOutfit:
                var jtype = avatar.GetPersonData(VMPersonDataVariable.JobType);
                var level = avatar.GetPersonData(VMPersonDataVariable.JobPromotionLevel);

                var job = Content.GameContent.Get.Jobs.GetJobLevel(jtype, level);

                var bskn = job.MaleUniformMesh;
                if (bskn == "")
                {
                    return(new VMOutfitReference(bodyStrings, false));
                }

                if (!male && job.FemaleUniformMesh != null)
                {
                    bskn = job.FemaleUniformMesh;
                }
                bskn = bskn.ToLowerInvariant().Replace("$g", code[0].ToString()).Replace("$b", code.Substring(1)).Replace("$c", skn);
                var btex = job.UniformSkin;
                btex = btex.ToLowerInvariant().Replace("$g", code[0].ToString()).Replace("$b", code.Substring(1)).Replace("$c", skn);

                toHandCopy = new VMOutfitReference(bskn + ",BODY=" + btex, false);
                break;

            case VMPersonSuits.DefaultSleepwear:
                if (IsValid(bodyStrings.GetString(32)))
                {
                    goto case VMPersonSuits.TS1ExpandedPajamas;
                }
                var pj   = (child ? "pjs" : "pajama");
                var gen  = (child ? (male ? "m" : "f") : (code));
                var gen2 = (male ? "m" : "f");
                toHandCopy = new VMOutfitReference(pj + gen + "_01,BODY=" + pj + gen2 + skn + "_01", false);
                break;

            case VMPersonSuits.SkeletonPlus:
                toHandCopy = new VMOutfitReference((child?"skeletonchd_01": "skeleton_01") + ",BODY=skeleton_01", true);
                break;

            case VMPersonSuits.SkeletonMinus:
                toHandCopy = new VMOutfitReference((child ? "skeletonchd_01" : "skeleton_01") + ",BODY=skeleneg_01", true);
                break;

            case VMPersonSuits.TS1Toga:
            case VMPersonSuits.TS1Country:
            case VMPersonSuits.TS1Luau:
            case VMPersonSuits.TS1Rave:
            case VMPersonSuits.TS1Costume:        //person strings 27. hands: 28, 29
            case VMPersonSuits.TS1ExpandedFormal: //person strings 30 (f###)
                toHandCopy = new VMOutfitReference(bodyStrings.GetString(30), false);
                break;

            case VMPersonSuits.TS1ExpandedSwimsuit:     //person strings 31 (s###)
                toHandCopy = new VMOutfitReference(bodyStrings.GetString(31), false);
                break;

            case VMPersonSuits.TS1ExpandedPajamas:     //person strings 32 (l###)
                toHandCopy = new VMOutfitReference(bodyStrings.GetString(32), false);
                break;

            case VMPersonSuits.TS1Disco:     //???
            case VMPersonSuits.TS1Winter:    //person strings 33 (w###)
                toHandCopy = new VMOutfitReference(bodyStrings.GetString(33), false);
                break;

            case VMPersonSuits.TS1HighFashion:     //person strings 34 (h###)
                toHandCopy = new VMOutfitReference(bodyStrings.GetString(34), false);
                break;
            }

            if (toHandCopy == null)
            {
                return(null);
            }
            else
            {
                if (avatar.DefaultSuits.Daywear.OftData?.LiteralHandgroup == null)
                {
                    var oft = new Vitaboy.Outfit();
                    oft.Read(bodyStrings);
                    toHandCopy.OftData.LiteralHandgroup = oft.LiteralHandgroup;
                }
                else
                {
                    toHandCopy.OftData.LiteralHandgroup = avatar.DefaultSuits.Daywear.OftData?.LiteralHandgroup;
                }
            }
            return(toHandCopy);
        }
Пример #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);
        }
Пример #3
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;
            }
        }
Пример #4
0
 public void Deserialize(BinaryReader reader)
 {
     Daywear   = new VMOutfitReference(reader);
     Swimwear  = new VMOutfitReference(reader);
     Sleepwear = new VMOutfitReference(reader);
 }
Пример #5
0
 public VMAvatarDefaultSuits(bool female)
 {
     Daywear   = new VMOutfitReference(0x24C0000000D);
     Swimwear  = new VMOutfitReference((ulong)((female) ? 0x620000000D : 0x5470000000D));
     Sleepwear = new VMOutfitReference((ulong)((female) ? 0x5150000000D : 0x5440000000D));
 }
Пример #6
0
        public override void Deserialize(BinaryReader reader)
        {
            base.Deserialize(reader);

            var anims = reader.ReadInt32();

            Animations = new VMAnimationStateMarshal[anims];
            for (int i = 0; i < anims; i++)
            {
                Animations[i] = new VMAnimationStateMarshal(reader);
            }

            var carry = reader.ReadBoolean();

            if (carry)
            {
                CarryAnimationState = new VMAnimationStateMarshal(reader);
            }

            Message        = reader.ReadString();
            MessageTimeout = reader.ReadInt32();

            var motCs = reader.ReadInt32();

            MotiveChanges = new VMMotiveChange[motCs];
            for (int i = 0; i < motCs; i++)
            {
                MotiveChanges[i] = new VMMotiveChange();
                MotiveChanges[i].Deserialize(reader);
            }
            MotiveDecay = new VMAvatarMotiveDecay();
            MotiveDecay.Deserialize(reader);

            var pdats = reader.ReadInt32();

            PersonData = new short[Math.Max(101, pdats)];
            for (int i = 0; i < pdats; i++)
            {
                PersonData[i] = reader.ReadInt16();
            }

            var mdats = reader.ReadInt32();

            MotiveData = new short[mdats];
            for (int i = 0; i < mdats; i++)
            {
                MotiveData[i] = reader.ReadInt16();
            }

            HandObject      = reader.ReadInt16();
            RadianDirection = reader.ReadSingle();

            if (Version > 1)
            {
                KillTimeout = reader.ReadInt32();
            }

            DefaultSuits = new VMAvatarDefaultSuits(reader);

            if (Version >= 15)
            {
                DynamicSuits = new VMAvatarDynamicSuits(reader);
                Decoration   = new VMAvatarDecoration(reader);
            }
            else
            {
                DynamicSuits = new VMAvatarDynamicSuits(false);
                Decoration   = new VMAvatarDecoration();
            }

            var aprs = reader.ReadInt32();

            BoundAppearances = new string[aprs];
            for (int i = 0; i < aprs; i++)
            {
                BoundAppearances[i] = reader.ReadString();
            }

            BodyOutfit = new VMOutfitReference(reader);
            HeadOutfit = new VMOutfitReference(reader);
            SkinTone   = (AppearanceType)reader.ReadByte();
        }