From a06fcdaa4161221682314329791fb2512c059e13 Mon Sep 17 00:00:00 2001 From: William Fowler Date: Thu, 14 Oct 2021 19:04:06 -0600 Subject: [PATCH] Fix Half-Life Blue Shift. They switched the Entities and Planes lumps. --- LibBSP/Source/Extensions/PlaneExtensions.cs | 5 ++ LibBSP/Source/Extensions/VertexExtensions.cs | 4 ++ LibBSP/Source/Structs/BSP/BSP.cs | 4 +- LibBSP/Source/Structs/BSP/Edge.cs | 6 +++ LibBSP/Source/Structs/BSP/Face.cs | 18 +++++++- LibBSP/Source/Structs/BSP/Leaf.cs | 38 +++++++++++---- LibBSP/Source/Structs/BSP/Lumps/Lightmaps.cs | 1 + LibBSP/Source/Structs/BSP/Lumps/Textures.cs | 3 +- LibBSP/Source/Structs/BSP/Lumps/Visibility.cs | 1 + LibBSP/Source/Structs/BSP/Model.cs | 46 +++++++++++++------ LibBSP/Source/Structs/BSP/Node.cs | 40 ++++++++++------ LibBSP/Source/Structs/BSP/Texture.cs | 37 ++++++++++----- LibBSP/Source/Structs/Common/Entity.cs | 3 ++ LibBSP/Source/Structs/Common/Lumps/NumList.cs | 4 +- LibBSP/Source/Structs/Common/TextureInfo.cs | 6 +++ LibBSP/Source/Util/BSPReader.cs | 27 ++++++++++- 16 files changed, 192 insertions(+), 51 deletions(-) diff --git a/LibBSP/Source/Extensions/PlaneExtensions.cs b/LibBSP/Source/Extensions/PlaneExtensions.cs index d011c79..cc1655c 100644 --- a/LibBSP/Source/Extensions/PlaneExtensions.cs +++ b/LibBSP/Source/Extensions/PlaneExtensions.cs @@ -298,6 +298,7 @@ namespace LibBSP { switch (type) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: case MapType.SiN: case MapType.SoF: @@ -397,6 +398,9 @@ namespace LibBSP { /// Index for this lump, or -1 if the format doesn't have this lump or it's not implemented. public static int GetIndexForLump(MapType type) { switch (type) { + case MapType.BlueShift: { + return 0; + } case MapType.FAKK: case MapType.MOHAA: case MapType.STEF2: @@ -449,6 +453,7 @@ namespace LibBSP { switch (type) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: case MapType.SiN: case MapType.SoF: diff --git a/LibBSP/Source/Extensions/VertexExtensions.cs b/LibBSP/Source/Extensions/VertexExtensions.cs index 18fe9cf..7502479 100644 --- a/LibBSP/Source/Extensions/VertexExtensions.cs +++ b/LibBSP/Source/Extensions/VertexExtensions.cs @@ -130,6 +130,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: case MapType.SiN: case MapType.SoF: @@ -198,6 +199,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: case MapType.Source17: @@ -282,6 +284,7 @@ namespace LibBSP { switch (type) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: case MapType.SiN: case MapType.SoF: @@ -351,6 +354,7 @@ namespace LibBSP { switch (type) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: case MapType.SiN: case MapType.SoF: diff --git a/LibBSP/Source/Structs/BSP/BSP.cs b/LibBSP/Source/Structs/BSP/BSP.cs index 4797a09..d090683 100644 --- a/LibBSP/Source/Structs/BSP/BSP.cs +++ b/LibBSP/Source/Structs/BSP/BSP.cs @@ -29,6 +29,7 @@ namespace LibBSP { Undefined = 0, Quake = 29, GoldSrc = 30, // Uses mostly the same structures as Quake + BlueShift = 31, // Blue Shift has a different lump order Nightfire = 42, Vindictus = 346131372, STEF2 = 556942937, @@ -790,7 +791,8 @@ namespace LibBSP { public static int GetNumLumps(MapType version) { switch (version) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return 15; } case MapType.Quake3: { diff --git a/LibBSP/Source/Structs/BSP/Edge.cs b/LibBSP/Source/Structs/BSP/Edge.cs index 1b5e41c..d529d66 100644 --- a/LibBSP/Source/Structs/BSP/Edge.cs +++ b/LibBSP/Source/Structs/BSP/Edge.cs @@ -72,6 +72,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.SiN: case MapType.Daikatana: case MapType.Source17: @@ -102,6 +103,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.SiN: case MapType.Daikatana: case MapType.Source17: @@ -146,6 +148,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.SiN: case MapType.Daikatana: case MapType.Source17: @@ -176,6 +179,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.SiN: case MapType.Daikatana: case MapType.Source17: @@ -280,6 +284,7 @@ namespace LibBSP { switch (mapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.SiN: case MapType.Daikatana: case MapType.Source17: @@ -321,6 +326,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: case MapType.Source17: diff --git a/LibBSP/Source/Structs/BSP/Face.cs b/LibBSP/Source/Structs/BSP/Face.cs index 2b9f1d0..f5afe7d 100644 --- a/LibBSP/Source/Structs/BSP/Face.cs +++ b/LibBSP/Source/Structs/BSP/Face.cs @@ -94,6 +94,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -127,6 +128,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -167,6 +169,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -200,6 +203,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -308,6 +312,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -340,6 +345,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -378,6 +384,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -410,6 +417,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -688,6 +696,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Source18: case MapType.Source19: case MapType.Source20: @@ -719,6 +728,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Source18: case MapType.Source19: case MapType.Source20: @@ -1207,6 +1217,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: { byte[] bytes = new byte[4]; @@ -1265,6 +1276,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: { Array.Copy(value, 0, Data, 12, Math.Min(value.Length, 4)); @@ -1375,6 +1387,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: { return BitConverter.ToInt32(Data, 16); @@ -1432,6 +1445,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: { bytes.CopyTo(Data, 16); @@ -2365,6 +2379,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: { return 20; @@ -2459,7 +2474,8 @@ namespace LibBSP { case MapType.L4D2: case MapType.DMoMaM: case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return 7; } case MapType.Nightfire: diff --git a/LibBSP/Source/Structs/BSP/Leaf.cs b/LibBSP/Source/Structs/BSP/Leaf.cs index ab17586..afcf27b 100644 --- a/LibBSP/Source/Structs/BSP/Leaf.cs +++ b/LibBSP/Source/Structs/BSP/Leaf.cs @@ -62,6 +62,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.SoF: case MapType.SiN: @@ -91,6 +92,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.SoF: case MapType.SiN: @@ -134,6 +136,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: case MapType.Vindictus: { return BitConverter.ToInt32(Data, 4); @@ -177,6 +180,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: case MapType.Vindictus: { bytes.CopyTo(Data, 4); @@ -353,6 +357,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -398,6 +403,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -455,6 +461,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -500,6 +507,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -775,6 +783,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.SiN: case MapType.Source17: @@ -816,6 +825,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.SiN: case MapType.Source17: @@ -865,6 +875,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.SiN: case MapType.Source17: @@ -906,6 +917,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.SiN: case MapType.Source17: @@ -954,7 +966,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return Data[24]; } default: { @@ -965,7 +978,8 @@ namespace LibBSP { set { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { Data[24] = value; break; } @@ -980,7 +994,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return Data[25]; } default: { @@ -991,7 +1006,8 @@ namespace LibBSP { set { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { Data[25] = value; break; } @@ -1006,7 +1022,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return Data[26]; } default: { @@ -1017,7 +1034,8 @@ namespace LibBSP { set { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { Data[26] = value; break; } @@ -1032,7 +1050,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return Data[27]; } default: { @@ -1043,7 +1062,8 @@ namespace LibBSP { set { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { Data[27] = value; break; } @@ -1273,6 +1293,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.SiN: { return 28; @@ -1339,6 +1360,7 @@ namespace LibBSP { case MapType.STEF2Demo: case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: case MapType.Source17: diff --git a/LibBSP/Source/Structs/BSP/Lumps/Lightmaps.cs b/LibBSP/Source/Structs/BSP/Lumps/Lightmaps.cs index acec04b..d49caf3 100644 --- a/LibBSP/Source/Structs/BSP/Lumps/Lightmaps.cs +++ b/LibBSP/Source/Structs/BSP/Lumps/Lightmaps.cs @@ -76,6 +76,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: case MapType.Source17: diff --git a/LibBSP/Source/Structs/BSP/Lumps/Textures.cs b/LibBSP/Source/Structs/BSP/Lumps/Textures.cs index abb8308..ec6fe2b 100644 --- a/LibBSP/Source/Structs/BSP/Lumps/Textures.cs +++ b/LibBSP/Source/Structs/BSP/Lumps/Textures.cs @@ -101,7 +101,8 @@ namespace LibBSP { return; } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { int numElements = BitConverter.ToInt32(data, 0); structLength = 40; int currentOffset; diff --git a/LibBSP/Source/Structs/BSP/Lumps/Visibility.cs b/LibBSP/Source/Structs/BSP/Lumps/Visibility.cs index ac2e529..3740306 100644 --- a/LibBSP/Source/Structs/BSP/Lumps/Visibility.cs +++ b/LibBSP/Source/Structs/BSP/Lumps/Visibility.cs @@ -256,6 +256,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: case MapType.Source17: diff --git a/LibBSP/Source/Structs/BSP/Model.cs b/LibBSP/Source/Structs/BSP/Model.cs index 58df6ed..2856a42 100644 --- a/LibBSP/Source/Structs/BSP/Model.cs +++ b/LibBSP/Source/Structs/BSP/Model.cs @@ -74,6 +74,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -108,6 +109,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Daikatana: case MapType.SiN: @@ -144,7 +146,8 @@ namespace LibBSP { return BitConverter.ToInt32(Data, 28); } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 40); } default: { @@ -160,7 +163,8 @@ namespace LibBSP { break; } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 40); break; } @@ -178,7 +182,8 @@ namespace LibBSP { return BitConverter.ToInt32(Data, 32); } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 44); } default: { @@ -194,7 +199,8 @@ namespace LibBSP { break; } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 44); break; } @@ -212,7 +218,8 @@ namespace LibBSP { return BitConverter.ToInt32(Data, 36); } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 48); } default: { @@ -228,7 +235,8 @@ namespace LibBSP { break; } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 48); break; } @@ -282,7 +290,8 @@ namespace LibBSP { return BitConverter.ToInt32(Data, 44); } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 52); } default: { @@ -298,7 +307,8 @@ namespace LibBSP { break; } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 52); break; } @@ -463,7 +473,8 @@ namespace LibBSP { return BitConverter.ToInt32(Data, 48); } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 56); } default: { @@ -517,7 +528,8 @@ namespace LibBSP { break; } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 56); break; } @@ -568,7 +580,8 @@ namespace LibBSP { return BitConverter.ToInt32(Data, 52); } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 60); } default: { @@ -622,7 +635,8 @@ namespace LibBSP { break; } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 60); break; } @@ -699,6 +713,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Quake3: case MapType.SiN: @@ -737,6 +752,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Quake3: case MapType.SiN: @@ -779,6 +795,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Quake3: case MapType.Nightfire: @@ -814,6 +831,7 @@ namespace LibBSP { switch (MapType) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Quake2: case MapType.Quake3: case MapType.Nightfire: @@ -1027,7 +1045,8 @@ namespace LibBSP { return 56; } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return 64; } default: { @@ -1057,6 +1076,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: diff --git a/LibBSP/Source/Structs/BSP/Node.cs b/LibBSP/Source/Structs/BSP/Node.cs index eb5a705..af8fcc6 100644 --- a/LibBSP/Source/Structs/BSP/Node.cs +++ b/LibBSP/Source/Structs/BSP/Node.cs @@ -98,7 +98,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt16(Data, 4); } case MapType.SiN: @@ -137,7 +138,8 @@ namespace LibBSP { byte[] bytes = BitConverter.GetBytes(value); switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { Data[4] = bytes[0]; Data[5] = bytes[1]; break; @@ -194,7 +196,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt16(Data, 6); } case MapType.SiN: @@ -233,7 +236,8 @@ namespace LibBSP { byte[] bytes = BitConverter.GetBytes(value); switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { Data[6] = bytes[0]; Data[7] = bytes[1]; break; @@ -277,7 +281,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return new Vector3(BitConverter.ToInt16(Data, 8), BitConverter.ToInt16(Data, 10), BitConverter.ToInt16(Data, 12)); } case MapType.Quake2: @@ -320,7 +325,8 @@ namespace LibBSP { set { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { BitConverter.GetBytes((short)value.X()).CopyTo(Data, 8); BitConverter.GetBytes((short)value.Y()).CopyTo(Data, 10); BitConverter.GetBytes((short)value.Z()).CopyTo(Data, 12); @@ -378,7 +384,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return new Vector3(BitConverter.ToInt16(Data, 14), BitConverter.ToInt16(Data, 16), BitConverter.ToInt16(Data, 18)); } case MapType.Quake2: @@ -421,7 +428,8 @@ namespace LibBSP { set { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { BitConverter.GetBytes((short)value.X()).CopyTo(Data, 14); BitConverter.GetBytes((short)value.Y()).CopyTo(Data, 16); BitConverter.GetBytes((short)value.Z()).CopyTo(Data, 18); @@ -491,7 +499,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToUInt16(Data, 20); } case MapType.Quake2: @@ -523,7 +532,8 @@ namespace LibBSP { byte[] bytes = BitConverter.GetBytes(value); switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { Data[20] = bytes[0]; Data[21] = bytes[1]; break; @@ -563,7 +573,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToUInt16(Data, 22); } case MapType.Quake2: @@ -594,7 +605,8 @@ namespace LibBSP { byte[] bytes = BitConverter.GetBytes(value); switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { Data[22] = bytes[0]; Data[23] = bytes[1]; break; @@ -753,7 +765,8 @@ namespace LibBSP { public static int GetStructLength(MapType mapType, int lumpVersion = 0) { switch (mapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return 24; } case MapType.Quake2: @@ -814,6 +827,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: case MapType.Source17: diff --git a/LibBSP/Source/Structs/BSP/Texture.cs b/LibBSP/Source/Structs/BSP/Texture.cs index 67fdd54..d25460d 100644 --- a/LibBSP/Source/Structs/BSP/Texture.cs +++ b/LibBSP/Source/Structs/BSP/Texture.cs @@ -104,7 +104,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return Data.ToNullTerminatedString(0, 16); } case MapType.STEF2: @@ -151,7 +152,8 @@ namespace LibBSP { byte[] bytes = Encoding.ASCII.GetBytes(value); switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { for (int i = 0; i < 16; ++i) { Data[i] = 0; } @@ -381,7 +383,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return new Vector2(BitConverter.ToUInt32(Data, 16), BitConverter.ToUInt32(Data, 20)); } default: { @@ -392,7 +395,8 @@ namespace LibBSP { set { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { BitConverter.GetBytes((int)value.X()).CopyTo(Data, 16); BitConverter.GetBytes((int)value.Y()).CopyTo(Data, 20); break; @@ -408,7 +412,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 24); } default: { @@ -420,7 +425,8 @@ namespace LibBSP { byte[] bytes = BitConverter.GetBytes(value); switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 24); break; } @@ -435,7 +441,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 28); } default: { @@ -447,7 +454,8 @@ namespace LibBSP { byte[] bytes = BitConverter.GetBytes(value); switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 28); break; } @@ -462,7 +470,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 32); } default: { @@ -474,7 +483,8 @@ namespace LibBSP { byte[] bytes = BitConverter.GetBytes(value); switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 32); break; } @@ -489,7 +499,8 @@ namespace LibBSP { get { switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { return BitConverter.ToInt32(Data, 36); } default: { @@ -501,7 +512,8 @@ namespace LibBSP { byte[] bytes = BitConverter.GetBytes(value); switch (MapType) { case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { bytes.CopyTo(Data, 36); break; } @@ -726,6 +738,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: { return 2; } diff --git a/LibBSP/Source/Structs/Common/Entity.cs b/LibBSP/Source/Structs/Common/Entity.cs index 4a4496e..77fedb3 100644 --- a/LibBSP/Source/Structs/Common/Entity.cs +++ b/LibBSP/Source/Structs/Common/Entity.cs @@ -672,6 +672,9 @@ namespace LibBSP { case MapType.Titanfall: { return 0; } + case MapType.BlueShift: { + return 1; + } case MapType.FAKK: case MapType.MOHAA: { return 14; diff --git a/LibBSP/Source/Structs/Common/Lumps/NumList.cs b/LibBSP/Source/Structs/Common/Lumps/NumList.cs index e69530e..2a5adb5 100644 --- a/LibBSP/Source/Structs/Common/Lumps/NumList.cs +++ b/LibBSP/Source/Structs/Common/Lumps/NumList.cs @@ -131,7 +131,8 @@ namespace LibBSP { return 9; } case MapType.Quake: - case MapType.GoldSrc: { + case MapType.GoldSrc: + case MapType.BlueShift: { dataType = DataType.UInt16; return 11; } @@ -183,6 +184,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: case MapType.Source17: diff --git a/LibBSP/Source/Structs/Common/TextureInfo.cs b/LibBSP/Source/Structs/Common/TextureInfo.cs index 898febe..3cb13f1 100644 --- a/LibBSP/Source/Structs/Common/TextureInfo.cs +++ b/LibBSP/Source/Structs/Common/TextureInfo.cs @@ -126,6 +126,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Undefined: { return BitConverter.ToInt32(Data, 36); } @@ -157,6 +158,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Undefined: { bytes.CopyTo(Data, 36); break; @@ -195,6 +197,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Undefined: { return BitConverter.ToInt32(Data, 32); } @@ -226,6 +229,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Undefined: { bytes.CopyTo(Data, 32); break; @@ -317,6 +321,7 @@ namespace LibBSP { } case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Undefined: { return 40; } @@ -351,6 +356,7 @@ namespace LibBSP { switch (type) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: case MapType.Source17: diff --git a/LibBSP/Source/Util/BSPReader.cs b/LibBSP/Source/Util/BSPReader.cs index f0b9587..2ebe262 100644 --- a/LibBSP/Source/Util/BSPReader.cs +++ b/LibBSP/Source/Util/BSPReader.cs @@ -10,6 +10,12 @@ namespace LibBSP { /// public class BSPReader { + /// + /// A short and simple string that will always occur in the entities lump, but is extremely + /// unlikely to show up in any kind of binary data. + /// + private const string entityPattern = "\"classname\""; + private FileInfo bspFile; private Dictionary lumpFiles = null; @@ -52,6 +58,7 @@ namespace LibBSP { switch (version) { case MapType.Quake: case MapType.GoldSrc: + case MapType.BlueShift: case MapType.Nightfire: { return GetLumpInfoAtOffset(4 + (8 * index), version); } @@ -554,7 +561,25 @@ namespace LibBSP { break; } case 30: { - current = MapType.GoldSrc; + current = MapType.BlueShift; + stream.Seek(4, SeekOrigin.Begin); + int lump0offset = binaryReader.ReadInt32(); + int lump0length = binaryReader.ReadInt32(); + stream.Seek(lump0offset, SeekOrigin.Begin); + char currentChar; + int patternMatch = 0; + for (int i = 0; i < lump0length - entityPattern.Length; ++i) { + currentChar = (char)stream.ReadByte(); + if (currentChar == entityPattern[patternMatch]) { + ++patternMatch; + if (patternMatch == entityPattern.Length) { + current = MapType.GoldSrc; + break; + } + } else { + patternMatch = 0; + } + } break; } case 42: {