public override void Pack(BinaryWriter writer) { writer.Write(ObjectID); ObjDesc.Pack(writer); writer.Write(ObjectInstanceSequence); writer.Write(ObjectVisualDescSequence); }
/// <summary> /// Sets the object description for a corpse /// </summary> public override ObjDesc CalculateObjDesc() { if (Biota.BiotaPropertiesAnimPart.Count == 0 && Biota.BiotaPropertiesPalette.Count == 0 && Biota.BiotaPropertiesTextureMap.Count == 0) { return(base.CalculateObjDesc()); // No Saved ObjDesc, let base handle it. } var objDesc = new ObjDesc(); AddBaseModelData(objDesc); foreach (var animPart in Biota.BiotaPropertiesAnimPart.OrderBy(b => b.Order)) { objDesc.AnimPartChanges.Add(new AnimationPartChange { PartIndex = animPart.Index, PartID = animPart.AnimationId }); } foreach (var subPalette in Biota.BiotaPropertiesPalette) { objDesc.SubPalettes.Add(new SubPalette { SubID = subPalette.SubPaletteId, Offset = subPalette.Offset, NumColors = subPalette.Length }); } foreach (var textureMap in Biota.BiotaPropertiesTextureMap.OrderBy(b => b.Order)) { objDesc.TextureChanges.Add(new TextureMapChange { PartIndex = textureMap.Index, OldTexture = textureMap.OldId, NewTexture = textureMap.NewId }); } return(objDesc); }
public override void Pack(BinaryWriter writer) { writer.Write(ObjectID); ObjDesc.Pack(writer); PhysicsDesc.Pack(writer); Wdesc.Pack(writer); }
public static void AddEncounter(WorldObject wo) { Encounters.Add(wo); var objDesc = new ObjDesc(wo.SetupTableId, wo.ClothingBase ?? 0, (PaletteTemplate)(wo.PaletteTemplate ?? 0), (float)(wo.Shade ?? 0.0)); if (wo is Creature creature) { foreach (var equippedObject in creature.EquippedObjects.Values.OrderBy(i => (int)(i.ClothingPriority ?? 0))) { if ((equippedObject.CurrentWieldedLocation & EquipMask.Selectable) != 0) { continue; } objDesc.Add(equippedObject.ClothingBase ?? 0, (PaletteTemplate)(equippedObject.PaletteTemplate ?? 0), (float)(equippedObject.Shade ?? 0.0)); } } wo.PhysicsObj.UpdateObjDesc(objDesc); var r_PhysicsObj = new R_PhysicsObj(wo.PhysicsObj); Buffer.AddEncounter(r_PhysicsObj, objDesc); if (UpdateObjs == null) { UpdateObjs = new List <WorldObject>(); } UpdateObjs.Add(wo); }
public override void Unpack(BinaryReader reader) { base.Unpack(reader); ObjectID = reader.ReadUInt32(); ObjDesc.Unpack(reader); PhysicsDesc.Unpack(reader); Wdesc.Unpack(reader); }
public override void Unpack(BinaryReader reader) { base.Unpack(reader); ObjectID = reader.ReadUInt32(); ObjDesc.Unpack(reader); ObjectInstanceSequence = reader.ReadUInt16(); ObjectVisualDescSequence = reader.ReadUInt16(); }
public static ObjDescEvent read(BinaryReader binaryReader) { ObjDescEvent newObj = new ObjDescEvent(); newObj.object_id = binaryReader.ReadUInt32(); newObj.desc = ObjDesc.read(binaryReader); newObj.timestamps = PhysicsTimestampPack.read(binaryReader); return(newObj); }
public static UpdateObject read(BinaryReader binaryReader) { UpdateObject newObj = new UpdateObject(); newObj.object_id = binaryReader.ReadUInt32(); newObj.objdesc = ObjDesc.read(binaryReader); newObj.physicsdesc = PhysicsDesc.read(binaryReader); newObj.wdesc = PublicWeenieDesc.read(binaryReader); return(newObj); }
/// <summary> /// Update this instance! /// </summary> void Update() { // Get the list of objects - runs on the Unity main thread ObjList list = new ObjList(); foreach (var o in objects) { ObjDesc desc = new ObjDesc() { name = o.name, pos = o.transform.position }; list.objects.Add(desc); } // Set the JSON string (uses thread-safe property) Json = JsonUtility.ToJson(list); }
/// <summary> /// Sets the object description for a corpse /// </summary> public override ObjDesc CalculateObjDesc() { if (Biota.PropertiesAnimPart.GetCount(BiotaDatabaseLock) == 0 && Biota.PropertiesPalette.GetCount(BiotaDatabaseLock) == 0 && Biota.PropertiesTextureMap.GetCount(BiotaDatabaseLock) == 0) { return(base.CalculateObjDesc()); // No Saved ObjDesc, let base handle it. } var objDesc = new ObjDesc(); AddBaseModelData(objDesc); Biota.PropertiesAnimPart.CopyTo(objDesc.AnimPartChanges, BiotaDatabaseLock); Biota.PropertiesPalette.CopyTo(objDesc.SubPalettes, BiotaDatabaseLock); Biota.PropertiesTextureMap.CopyTo(objDesc.TextureChanges, BiotaDatabaseLock); return(objDesc); }
public static ObjDesc read(BinaryReader binaryReader) { ObjDesc newObj = new ObjDesc(); binaryReader.ReadByte(); // Unk, should always be == 17 byte numPalettes = binaryReader.ReadByte(); byte numTMCs = binaryReader.ReadByte(); byte numAPCs = binaryReader.ReadByte(); if (numPalettes > 0) { newObj.paletteID = Util.readDataIDOfKnownType(0x4000000, binaryReader); for (int i = 0; i < numPalettes; ++i) { newObj.subpalettes.Add(Subpalette.read(binaryReader)); } } if (numTMCs > 0) { for (int i = 0; i < numTMCs; ++i) { newObj.tmChanges.Add(TextureMapChange.read(binaryReader)); } } if (numAPCs > 0) { for (int i = 0; i < numAPCs; ++i) { newObj.apChanges.Add(AnimPartChange.read(binaryReader)); } } Util.readToAlign(binaryReader); return(newObj); }
public static CharGen ReadFromDat() { // Check the FileCache so we don't need to hit the FileSystem repeatedly if (DatManager.PortalDat.FileCache.ContainsKey(0x0E000002)) { return((CharGen)DatManager.PortalDat.FileCache[0x0E000002]); } else { // Create the datReader for the proper file DatReader datReader = DatManager.PortalDat.GetReaderForFile(0x0E000002); CharGen cg = new CharGen(); cg.Did = datReader.ReadInt32(); datReader.Offset = 8; /// STARTER AREAS. There are 5 dungeons per starting city, and one landscape span for Olthoi. int numStarterAreas = datReader.ReadByte(); for (int i = 0; i < numStarterAreas; i++) { string starterAreaName = datReader.ReadPString(); int numAreas = datReader.ReadByte(); List <Loc> starterAreas = new List <Loc>(); for (int j = 0; j < numAreas; j++) { Loc starterArea = new Loc(datReader.ReadInt32(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle()); starterAreas.Add(starterArea); } cg.StarterAreas.Add(starterAreas); } /// HERITAGE GROUPS -- 11 standard player races and 2 Olthoi. datReader.Offset++; // Not sure what this byte 0x01 is indicating, but we'll skip it because we can. int heritageGroupCount = datReader.ReadByte(); for (int i = 0; i < heritageGroupCount; i++) { HeritageGroupCG heritage = new HeritageGroupCG(); int heritageIndex = datReader.ReadInt32(); heritage.Name = datReader.ReadPString(); heritage.IconImage = datReader.ReadUInt32(); heritage.SetupID = datReader.ReadUInt32(); heritage.EnvironmentSetupID = datReader.ReadUInt32(); heritage.AttributeCredits = datReader.ReadUInt32(); heritage.SkillCredits = datReader.ReadUInt32(); // Start Areas correspond go the CG.StarterAreas List. int numPrimaryStartAreas = datReader.ReadByte(); for (int j = 0; j < numPrimaryStartAreas; j++) { heritage.PrimaryStartAreaList.Add(datReader.ReadInt32()); } int numSecondaryStartAreas = datReader.ReadByte(); for (int j = 0; j < numSecondaryStartAreas; j++) { heritage.SecondaryStartAreaList.Add(datReader.ReadInt32()); } // Racial Skills int skillCount = datReader.ReadByte(); for (int j = 0; j < skillCount; j++) { SkillCG skill = new SkillCG(); skill.SkillNum = datReader.ReadUInt32(); skill.NormalCost = datReader.ReadUInt32(); skill.PrimaryCost = datReader.ReadUInt32(); heritage.SkillList.Add(skill); } // Adventurer, Bow Hunter, etc. int templateCount = datReader.ReadByte(); for (int j = 0; j < templateCount; j++) { TemplateCG template = new TemplateCG(); template.Name = datReader.ReadPString(); template.IconImage = datReader.ReadUInt32(); template.Title = datReader.ReadUInt32(); // Attributes template.Strength = datReader.ReadUInt32(); template.Endurance = datReader.ReadUInt32(); template.Coordination = datReader.ReadUInt32(); template.Quickness = datReader.ReadUInt32(); template.Focus = datReader.ReadUInt32(); template.Self = datReader.ReadUInt32(); skillCount = datReader.ReadByte(); for (int k = 0; k < skillCount; k++) { template.NormalSkillsList.Add(datReader.ReadUInt32()); } skillCount = datReader.ReadByte(); for (int k = 0; k < skillCount; k++) { template.PrimarySkillsList.Add(datReader.ReadUInt32()); } heritage.TemplateList.Add(template); } datReader.Offset++; // 0x01 byte here. Not sure what/why, so skip it! int numGenders = datReader.ReadByte(); // this is always 2, but let's read it anyways... for (int j = 0; j < numGenders; j++) { SexCG sex = new SexCG(); int genderID = datReader.ReadInt32(); sex.Name = datReader.ReadPString(); sex.Scale = datReader.ReadUInt32(); sex.SetupID = datReader.ReadUInt32(); sex.SoundTable = datReader.ReadUInt32(); sex.IconImage = datReader.ReadUInt32(); sex.BasePalette = datReader.ReadUInt32(); sex.SkinPalSet = datReader.ReadUInt32(); sex.PhysicsTable = datReader.ReadUInt32(); sex.MotionTable = datReader.ReadUInt32(); sex.CombatTable = datReader.ReadUInt32(); sex.BaseObjDesc = ObjDesc.ReadFromDat(ref datReader); int numHairColors = datReader.ReadByte(); for (int k = 0; k < numHairColors; k++) { sex.HairColorList.Add(datReader.ReadUInt32()); } int numHairStyles = datReader.ReadByte(); for (int k = 0; k < numHairStyles; k++) { HairStyleCG hairstyle = new HairStyleCG(); hairstyle.IconImage = datReader.ReadUInt32(); hairstyle.Bald = Convert.ToBoolean(datReader.ReadByte()); hairstyle.AlternateSetup = datReader.ReadUInt32(); hairstyle.ObjDesc = ObjDesc.ReadFromDat(ref datReader); sex.HairStyleList.Add(hairstyle); } int numEyeColors = datReader.ReadByte(); for (int k = 0; k < numEyeColors; k++) { sex.EyeColorList.Add(datReader.ReadUInt32()); } int numEyeStrips = datReader.ReadByte(); for (int k = 0; k < numEyeStrips; k++) { EyeStripCG eyestrip = new EyeStripCG(); eyestrip.IconImage = datReader.ReadUInt32(); eyestrip.IconImageBald = datReader.ReadUInt32(); eyestrip.ObjDesc = ObjDesc.ReadFromDat(ref datReader); eyestrip.ObjDescBald = ObjDesc.ReadFromDat(ref datReader); sex.EyeStripList.Add(eyestrip); } int numNoseStrips = datReader.ReadByte(); // Breathe Right? for (int k = 0; k < numNoseStrips; k++) { FaceStripCG nosestrip = new FaceStripCG(); nosestrip.IconImage = datReader.ReadUInt32(); nosestrip.ObjDesc = ObjDesc.ReadFromDat(ref datReader); sex.NoseStripList.Add(nosestrip); } int numMouthStrips = datReader.ReadByte(); // Breathe Right? for (int k = 0; k < numMouthStrips; k++) { FaceStripCG mouthstrip = new FaceStripCG(); mouthstrip.IconImage = datReader.ReadUInt32(); mouthstrip.ObjDesc = ObjDesc.ReadFromDat(ref datReader); sex.MouthStripList.Add(mouthstrip); } int numHeadGear = datReader.ReadByte(); for (int k = 0; k < numHeadGear; k++) { GearCG headgear = new GearCG(); headgear.Name = datReader.ReadPString(); headgear.ClothingTable = datReader.ReadUInt32(); headgear.WeenieDefault = datReader.ReadUInt32(); sex.HeadgearList.Add(headgear); } int numShirts = datReader.ReadByte(); for (int k = 0; k < numShirts; k++) { GearCG shirt = new GearCG(); shirt.Name = datReader.ReadPString(); shirt.ClothingTable = datReader.ReadUInt32(); shirt.WeenieDefault = datReader.ReadUInt32(); sex.ShirtList.Add(shirt); } int numPants = datReader.ReadByte(); for (int k = 0; k < numPants; k++) { GearCG pants = new GearCG(); pants.Name = datReader.ReadPString(); pants.ClothingTable = datReader.ReadUInt32(); pants.WeenieDefault = datReader.ReadUInt32(); sex.PantsList.Add(pants); } int numFootwear = datReader.ReadByte(); for (int k = 0; k < numFootwear; k++) { GearCG footwear = new GearCG(); footwear.Name = datReader.ReadPString(); footwear.ClothingTable = datReader.ReadUInt32(); footwear.WeenieDefault = datReader.ReadUInt32(); sex.FootwearList.Add(footwear); } int numClothingColors = datReader.ReadByte(); for (int k = 0; k < numClothingColors; k++) { sex.ClothingColorsList.Add(datReader.ReadUInt32()); } heritage.SexList.Add(genderID, sex); } cg.HeritageGroups.Add(heritageIndex, heritage); } // Store this object in the FileCache DatManager.PortalDat.FileCache[0x0E000002] = cg; return(cg); } }
public void LoadModel(uint wcid) { Server.Initting = true; Buffer.ClearBuffer(); TextureCache.Init(); LScape.unload_landblocks_all(); Console.WriteLine($"Loading {wcid}"); GfxObjMode = false; var wo = WorldObjectFactory.CreateNewWorldObject(wcid); if (wo == null) { return; } wo.InitPhysicsObj(); var location = new Position(); location.ObjCellID = 0x00000001; location.Frame.Origin = new System.Numerics.Vector3(12, 12, 0); var success = wo.PhysicsObj.enter_world(location); if (!success || wo.PhysicsObj.CurCell == null) { wo.PhysicsObj.DestroyObject(); wo.PhysicsObj = null; Console.WriteLine($"WorldObjectViewer.LoadModel({wcid}).AddPhysicsObj({wo.Name}, {location}) - failed to spawn"); return; } Console.WriteLine($"Spawned {wcid} - {wo.Name} @ {location}"); var objDesc = new ObjDesc(wo.SetupTableId, wo.ClothingBase ?? 0, (PaletteTemplate)(wo.PaletteTemplate ?? 0), (float)(wo.Shade ?? 0.0)); if (wo is Creature creature) { objDesc.AddBaseModelData(wo); var equippedObjects = creature.EquippedObjects.Values.OrderBy(i => (int)(i.ClothingPriority ?? 0)).ToList(); foreach (var equippedObject in equippedObjects) { if ((equippedObject.CurrentWieldedLocation & EquipMask.Selectable) != 0) { continue; } objDesc.Add(equippedObject.ClothingBase ?? 0, (PaletteTemplate)(equippedObject.PaletteTemplate ?? 0), (float)(equippedObject.Shade ?? 0.0)); } } wo.PhysicsObj.UpdateObjDesc(objDesc); var r_PhysicsObj = new R_PhysicsObj(wo.PhysicsObj); Buffer.AddInstance(r_PhysicsObj, objDesc); if (!LoadedOnce) { //Camera.Position = Vector3.Zero; //Camera.Dir = Vector3.Normalize(new Vector3(1, 1, 0)); Camera.Position = new Vector3(11.782367f, 12.763985f, 1.6514041f); Camera.Dir = new Vector3(0.30761153f, -0.94673103f, 0.093334414f); Camera.Up = Vector3.UnitZ; Camera.CreateLookAt(); Camera.Speed = Camera.Model_Speed; } Buffer.BuildTextureAtlases(Buffer.InstanceTextureAtlasChains); Buffer.BuildBuffer(Buffer.RB_Instances); Server.InstancesLoaded = true; Server.Initting = false; LoadedOnce = true; }
public CompiledBuffer(Stream ms) { var br = new BinaryReader(ms); _header = br.BaseStream.ReadStruct <header>(); if (_header.rarefpool_descs_offset != 0) { throw new Exception("m_header.u32arr_offset != 0"); } _uk1 = br.ReadUInt16(); UInt16 ids_cnt; ids_cnt = br.ReadUInt16(); if (ids_cnt != _header.ids_cnt) { throw new Exception("ids_cnt != m_header.ids_cnt"); } _ids = new List <ulong>(); for (int i = 0; i < ids_cnt; i++) { _ids.Add(br.ReadUInt64()); } long baseOff = ms.Position; UInt32 rarefpool_descs_size = _header.rarefpool_data_offset - _header.rarefpool_descs_offset; StrTable1asStr = new Dictionary <int, string>(); StrTable1asHash = new Dictionary <int, UInt64>(); for (int i = 0; i < rarefpool_descs_size / 4; i++) { ms.Seek(baseOff + _header.rarefpool_descs_offset + i * 4, SeekOrigin.Begin); UInt32 maskData = br.ReadUInt32(); UInt32 off = maskData & strTable1OffsetMask; UInt32 len = (maskData >> (int)strTable1SizeBitShift) & sizeBitMask; if (_uk1 == 0) { ms.Seek(baseOff + off, SeekOrigin.Begin); string name = new string(br.ReadChars((int)len)); StrTable1asStr.Add(i, name); StrTable1asHash.Add(i, FNV1A64HashAlgorithm.HashString(name)); } else { ms.Seek(baseOff + off, SeekOrigin.Begin); StrTable1asHash.Add(i, br.ReadUInt64()); } } UInt32 strpool_descs_size = _header.strpool_data_offset - _header.strpool_descs_offset; StrTable2asStr = new Dictionary <int, string>(); for (int i = 0; i < strpool_descs_size / 4; i++) { ms.Seek(baseOff + _header.strpool_descs_offset + i * 4, SeekOrigin.Begin); UInt32 maskData = br.ReadUInt32(); UInt32 off = maskData & strTable2OffsetMask; UInt32 len = (maskData >> (int)strTable2SizeBitShift) & sizeBitMask; ms.Seek(baseOff + off, SeekOrigin.Begin); string name = new string(br.ReadChars((int)len)); StrTable2asStr.Add(i, name); } UInt32 obj_descs_size = _header.objdata_offset - _header.obj_descs_offset; ObjectDescs = new List <ObjDesc>(); for (int i = 0; i < obj_descs_size / 8; i++) { ms.Seek(baseOff + _header.obj_descs_offset + i * 8, SeekOrigin.Begin); UInt32 varNameIdx = br.ReadUInt32(); UInt32 off = br.ReadUInt32(); ObjDesc obj_desc = new ObjDesc(varNameIdx, off + baseOff); ObjectDescs.Add(obj_desc); } }