Exemplo n.º 1
0
 public void addOrOverwriteHitbox(int id, Hitbox newHitbox)
 {
     if (Hitboxes.ContainsKey(id))
     {
         Hitboxes[id] = newHitbox;
     }
     else
     {
         Hitboxes.Add(id, newHitbox);
     }
 }
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        private float SetFrame(float frame, float time, List <Command> commands)
        {
            int loopAmt = 0;
            int loopPos = 0;

            for (int i = 0; i < commands.Count; i++)
            {
                var cmd = commands[i];
                switch (cmd.Action.Code)
                {
                case 0:     //end script
                    time = int.MaxValue;
                    break;

                case 1:     //synchronous
                    time += cmd.Parameters[0];
                    break;

                case 2:     //asynchronus
                    time = cmd.Parameters[0];
                    break;

                case 3:     //start loop
                    loopAmt = cmd.Parameters[0];
                    loopPos = i;
                    break;

                case 4:     //end loop
                    loopAmt -= 1;
                    if (loopAmt != 0)
                    {
                        i = loopPos;
                    }
                    break;

                case 5:     //subroutine
                    time = SetFrame(frame, time, cmd.ReferenceCommands);
                    break;

                case 6:     //return?
                    break;

                case 7:     //goto
                    time = SetFrame(frame, time, cmd.ReferenceCommands);
                    break;

                case 11:     // Create Hitbox
                    // remove the current hitbox with this id
                    Hitboxes.RemoveAll(e => e.ID == cmd.Parameters[0]);
                    // add hitbox
                    Hitboxes.Add(new Hitbox()
                    {
                        ID     = cmd.Parameters[0],
                        BoneID = cmd.Parameters[2],
                        Size   = (short)cmd.Parameters[5] / 150f,
                        Point1 = new Vector3((short)cmd.Parameters[8] / 150f, (short)cmd.Parameters[7] / 150f, (short)cmd.Parameters[6] / 150f),
                    });
                    break;

                case 13:     // adjust size
                {
                    var hb = Hitboxes.Find(e => e.ID == cmd.Parameters[0]);
                    if (hb != null)
                    {
                        hb.Size = (short)cmd.Parameters[1] / 150f;
                    }
                }
                break;

                case 15:
                    Hitboxes.RemoveAll(e => e.ID == cmd.Parameters[0]);
                    break;

                case 16:
                    Hitboxes.Clear();
                    break;

                case 26:
                    BodyCollisionState = cmd.Parameters[1];
                    break;

                case 27:
                    // i don't really know how many bone to assume...
                    for (int j = 0; j < 100; j++)
                    {
                        if (BoneCollisionStates.ContainsKey(j))
                        {
                            BoneCollisionStates[j] = cmd.Parameters[0];
                        }
                        else
                        {
                            BoneCollisionStates.Add(j, cmd.Parameters[0]);
                        }
                    }
                    break;

                case 28:
                    if (BoneCollisionStates.ContainsKey(cmd.Parameters[0]))
                    {
                        BoneCollisionStates[cmd.Parameters[0]] = cmd.Parameters[1];
                    }
                    else
                    {
                        BoneCollisionStates.Add(cmd.Parameters[0], cmd.Parameters[1]);
                    }
                    break;

                case 37:
                    CharacterInvisibility = cmd.Parameters[1] == 1;
                    break;

                case 46:     //overlay color
                    if (cmd.Parameters[0] == 1)
                    {
                        OverlayColor = new Vector3(cmd.Parameters[1] / 255f, cmd.Parameters[2] / 255f, cmd.Parameters[3] / 255f);
                    }
                    break;
                }

                if (time > frame)
                {
                    break;
                }
            }
            return(time);
        }
Exemplo n.º 3
0
        private void Read(BinaryReader br, Dictionary <string, BinaryReader> sequenceGroups)
        {
            Header = new Header
            {
                ID             = ID.Idst,
                Version        = Version.Goldsource,
                Name           = br.ReadFixedLengthString(Encoding.ASCII, 64),
                Size           = br.ReadInt32(),
                EyePosition    = br.ReadVector3(),
                HullMin        = br.ReadVector3(),
                HullMax        = br.ReadVector3(),
                BoundingBoxMin = br.ReadVector3(),
                BoundingBoxMax = br.ReadVector3(),
                Flags          = br.ReadInt32()
            };

            // Read all the nums/offsets from the header
            var sections = new int[(int)Section.NumSections][];

            for (var i = 0; i < (int)Section.NumSections; i++)
            {
                var sec = (Section)i;

                int indexNum;
                if (sec == Section.Texture || sec == Section.Skin)
                {
                    indexNum = 3;
                }
                else
                {
                    indexNum = 2;
                }

                sections[i] = new int[indexNum];
                for (var j = 0; j < indexNum; j++)
                {
                    sections[i][j] = br.ReadInt32();
                }
            }

            // Bones
            var num      = SeekToSection(br, Section.Bone, sections);
            var numBones = num;

            for (var i = 0; i < num; i++)
            {
                var bone = new Bone
                {
                    Name          = br.ReadFixedLengthString(Encoding.ASCII, 32),
                    Parent        = br.ReadInt32(),
                    Flags         = br.ReadInt32(),
                    Controllers   = br.ReadIntArray(6),
                    Position      = br.ReadVector3(),
                    Rotation      = br.ReadVector3(),
                    PositionScale = br.ReadVector3(),
                    RotationScale = br.ReadVector3()
                };
                Bones.Add(bone);
            }

            // Bone controllers
            num = SeekToSection(br, Section.BoneController, sections);
            for (var i = 0; i < num; i++)
            {
                var boneController = new BoneController
                {
                    Bone  = br.ReadInt32(),
                    Type  = br.ReadInt32(),
                    Start = br.ReadSingle(),
                    End   = br.ReadSingle(),
                    Rest  = br.ReadInt32(),
                    Index = br.ReadInt32()
                };
                BoneControllers.Add(boneController);
            }

            // Hitboxes
            num = SeekToSection(br, Section.Hitbox, sections);
            for (var i = 0; i < num; i++)
            {
                var hitbox = new Hitbox
                {
                    Bone  = br.ReadInt32(),
                    Group = br.ReadInt32(),
                    Min   = br.ReadVector3(),
                    Max   = br.ReadVector3()
                };
                Hitboxes.Add(hitbox);
            }

            // Sequence groups
            num = SeekToSection(br, Section.SequenceGroup, sections);
            for (var i = 0; i < num; i++)
            {
                var group = new SequenceGroup
                {
                    Label = br.ReadFixedLengthString(Encoding.ASCII, 32),
                    Name  = br.ReadFixedLengthString(Encoding.ASCII, 64)
                };
                br.ReadBytes(8); // unused
                SequenceGroups.Add(group);
            }

            // Sequences
            num = SeekToSection(br, Section.Sequence, sections);
            for (var i = 0; i < num; i++)
            {
                var sequence = new Sequence
                {
                    Name                  = br.ReadFixedLengthString(Encoding.ASCII, 32),
                    Framerate             = br.ReadSingle(),
                    Flags                 = br.ReadInt32(),
                    Activity              = br.ReadInt32(),
                    ActivityWeight        = br.ReadInt32(),
                    NumEvents             = br.ReadInt32(),
                    EventIndex            = br.ReadInt32(),
                    NumFrames             = br.ReadInt32(),
                    NumPivots             = br.ReadInt32(),
                    PivotIndex            = br.ReadInt32(),
                    MotionType            = br.ReadInt32(),
                    MotionBone            = br.ReadInt32(),
                    LinearMovement        = br.ReadVector3(),
                    AutoMovePositionIndex = br.ReadInt32(),
                    AutoMoveAngleIndex    = br.ReadInt32(),
                    Min            = br.ReadVector3(),
                    Max            = br.ReadVector3(),
                    NumBlends      = br.ReadInt32(),
                    AnimationIndex = br.ReadInt32(),
                    BlendType      = br.ReadIntArray(2),
                    BlendStart     = br.ReadSingleArray(2),
                    BlendEnd       = br.ReadSingleArray(2),
                    BlendParent    = br.ReadInt32(),
                    SequenceGroup  = br.ReadInt32(),
                    EntryNode      = br.ReadInt32(),
                    ExitNode       = br.ReadInt32(),
                    NodeFlags      = br.ReadInt32(),
                    NextSequence   = br.ReadInt32()
                };

                var seqGroup = SequenceGroups[sequence.SequenceGroup];

                // Only load seqence group 0 for now (others are in other files)
                if (sequence.SequenceGroup == 0)
                {
                    var pos = br.BaseStream.Position;
                    sequence.Blends        = LoadAnimationBlends(br, sequence, numBones);
                    br.BaseStream.Position = pos;
                }
                else if (sequenceGroups.ContainsKey(seqGroup.Name))
                {
                    var reader = sequenceGroups[seqGroup.Name];
                    sequence.Blends = LoadAnimationBlends(reader, sequence, numBones);
                }

                Sequences.Add(sequence);
            }

            // Textures
            num = SeekToSection(br, Section.Texture, sections);
            var firstTextureIndex = Textures.Count;

            for (var i = 0; i < num; i++)
            {
                var texture = new Texture
                {
                    Name   = br.ReadFixedLengthString(Encoding.ASCII, 64),
                    Flags  = (TextureFlags)br.ReadInt32(),
                    Width  = br.ReadInt32(),
                    Height = br.ReadInt32(),
                    Index  = br.ReadInt32()
                };
                Textures.Add(texture);
            }

            // Texture data
            for (var i = firstTextureIndex; i < firstTextureIndex + num; i++)
            {
                var t = Textures[i];
                br.BaseStream.Position = t.Index;
                t.Data      = br.ReadBytes(t.Width * t.Height);
                t.Palette   = br.ReadBytes(256 * 3);
                Textures[i] = t;
            }

            // Skins
            var skinSection     = sections[(int)Section.Skin];
            var numSkinRefs     = skinSection[0];
            var numSkinFamilies = skinSection[1];

            br.BaseStream.Seek(skinSection[2], SeekOrigin.Begin);
            for (var i = 0; i < numSkinFamilies; i++)
            {
                var skin = new SkinFamily
                {
                    Textures = br.ReadShortArray(numSkinRefs)
                };
                Skins.Add(skin);
            }

            // Body parts
            num = SeekToSection(br, Section.BodyPart, sections);
            for (var i = 0; i < num; i++)
            {
                var part = new BodyPart
                {
                    Name       = br.ReadFixedLengthString(Encoding.ASCII, 64),
                    NumModels  = br.ReadInt32(),
                    Base       = br.ReadInt32(),
                    ModelIndex = br.ReadInt32()
                };
                var pos = br.BaseStream.Position;
                part.Models            = LoadModels(br, part);
                br.BaseStream.Position = pos;
                BodyParts.Add(part);
            }

            // Attachments
            num = SeekToSection(br, Section.Attachment, sections);
            for (var i = 0; i < num; i++)
            {
                var attachment = new Attachment
                {
                    Name    = br.ReadFixedLengthString(Encoding.ASCII, 32),
                    Type    = br.ReadInt32(),
                    Bone    = br.ReadInt32(),
                    Origin  = br.ReadVector3(),
                    Vectors = br.ReadVector3Array(3)
                };
                Attachments.Add(attachment);
            }

            // Transitions

            // Sounds & Sound groups aren't used
        }
Exemplo n.º 4
0
        /// <summary>
        ///
        /// </summary>
        private float SetFrame(float frame, float time, List <Command> commands)
        {
            int loopAmt = 0;
            int loopPos = 0;

            for (int i = 0; i < commands.Count; i++)
            {
                var cmd = commands[i];
                switch (cmd.Action.Code)
                {
                case 0 << 2:     //end script
                        time = int.MaxValue;
                    break;

                case 1 << 2:     //synchronous
                        time += cmd.Parameters[0];
                    break;

                case 2 << 2:     //asynchronus
                        time = cmd.Parameters[0];
                    break;

                case 3 << 2:     //start loop
                        loopAmt = cmd.Parameters[0];
                    loopPos     = i;
                    break;

                case 4 << 2:     //end loop
                        loopAmt -= 1;
                    if (loopAmt > 0)
                    {
                        i = loopPos;
                    }
                    break;

                case 5 << 2:     //subroutine
                        time = SetFrame(frame, time, cmd.ReferenceCommands);
                    break;

                case 6 << 2:     //return?
                        return(time);

                case 7 << 2:     //goto
                        time = SetFrame(frame, time, cmd.ReferenceCommands);
                    break;

                case 11 << 2:     // Create Hitbox
                        // remove the current hitbox with this id
                        Hitboxes.RemoveAll(e => e.ID == cmd.Parameters[0]);
                    // add hitbox
                    Hitboxes.Add(new Hitbox()
                    {
                        ID      = cmd.Parameters[0],
                        BoneID  = cmd.Parameters[2],
                        Size    = ((short)cmd.Parameters[5] / 256f),
                        Point1  = new Vector3(cmd.Parameters[6] / 256f, cmd.Parameters[7] / 256f, cmd.Parameters[8] / 256f),
                        Angle   = cmd.Parameters[9],
                        Element = cmd.Parameters[15]
                    });
                    break;

                case 13 << 2:     // adjust size
                        {
                        var hb = Hitboxes.Find(e => e.ID == cmd.Parameters[0]);
                        if (hb != null)
                        {
                            hb.Size = (short)cmd.Parameters[1] / 150f;
                        }
                        }
                        break;

                case 15 << 2:
                        Hitboxes.RemoveAll(e => e.ID == cmd.Parameters[0]);
                    break;

                case 16 << 2:
                        Hitboxes.Clear();
                    break;

                case 20 << 2:     // throw
                        ThrownFighter = true;
                    break;

                case 26 << 2:
                        BodyCollisionState = cmd.Parameters[0];
                    break;

                case 27 << 2:
                        // i don't really know how many bone to assume...
                        for (int j = 0; j < 100; j++)
                            {
                            if (BoneCollisionStates.ContainsKey(j))
                            {
                                BoneCollisionStates[j] = cmd.Parameters[0];
                            }
                            else
                            {
                                BoneCollisionStates.Add(j, cmd.Parameters[0]);
                            }
                        }
                        break;

                case 28 << 2:
                        if (cmd.Parameters.Length > 1)
                            {
                            if (BoneCollisionStates.ContainsKey(cmd.Parameters[0]))
                            {
                                BoneCollisionStates[cmd.Parameters[0]] = cmd.Parameters[1];
                            }
                            else
                            {
                                BoneCollisionStates.Add(cmd.Parameters[0], cmd.Parameters[1]);
                            }
                        }
                        break;

                case 31 << 2:     // struct vis change
                        UpdateVISMethod(cmd.Parameters[0], cmd.Parameters[2]);
                    break;

                case 37 << 2:
                        CharacterInvisibility = cmd.Parameters[1] == 1;
                    break;

                case 40 << 2:
                        AnimateMaterialMethod(cmd.Parameters[1], cmd.Parameters[3], cmd.Parameters[0], cmd.Parameters[2]);
                    break;

                case 41 << 2:
                        AnimateModelMethod(cmd.Parameters[0], cmd.Parameters[1]);
                    break;

                case 46 << 2:     //overlay color
                        if (cmd.Parameters[0] == 1)
                            {
                            OverlayColor = new Vector3(cmd.Parameters[1] / 255f, cmd.Parameters[2] / 255f, cmd.Parameters[3] / 255f);
                        }
                        break;
                }

                if (time > frame)
                {
                    break;
                }
            }
            return(time);
        }