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); }
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; } }
public void Deserialize(BinaryReader reader) { Daywear = new VMOutfitReference(reader); Swimwear = new VMOutfitReference(reader); Sleepwear = new VMOutfitReference(reader); }
public VMAvatarDefaultSuits(bool female) { Daywear = new VMOutfitReference(0x24C0000000D); Swimwear = new VMOutfitReference((ulong)((female) ? 0x620000000D : 0x5470000000D)); Sleepwear = new VMOutfitReference((ulong)((female) ? 0x5150000000D : 0x5440000000D)); }
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(); }