コード例 #1
0
 public override void Pack(BinaryWriter writer)
 {
     writer.Write(ObjectID);
     ObjDesc.Pack(writer);
     writer.Write(ObjectInstanceSequence);
     writer.Write(ObjectVisualDescSequence);
 }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
 public override void Pack(BinaryWriter writer)
 {
     writer.Write(ObjectID);
     ObjDesc.Pack(writer);
     PhysicsDesc.Pack(writer);
     Wdesc.Pack(writer);
 }
コード例 #4
0
ファイル: Server.cs プロジェクト: OptimShi/ACViewer
        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);
        }
コード例 #5
0
 public override void Unpack(BinaryReader reader)
 {
     base.Unpack(reader);
     ObjectID = reader.ReadUInt32();
     ObjDesc.Unpack(reader);
     PhysicsDesc.Unpack(reader);
     Wdesc.Unpack(reader);
 }
コード例 #6
0
 public override void Unpack(BinaryReader reader)
 {
     base.Unpack(reader);
     ObjectID = reader.ReadUInt32();
     ObjDesc.Unpack(reader);
     ObjectInstanceSequence   = reader.ReadUInt16();
     ObjectVisualDescSequence = reader.ReadUInt16();
 }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
    /// <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);
    }
コード例 #10
0
        /// <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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
ファイル: CharGen.cs プロジェクト: MatthewRandall/ACE
        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);
            }
        }
コード例 #13
0
        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;
        }
コード例 #14
0
        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);
            }
        }