Beispiel #1
0
 public static void WriteFromWowFile(string wowFileLocation)
 {
     using (var file = new WoWFile(wowFileLocation))
     {
         Write(file);
     }
 }
		public override void Process(WCell.Util.Commands.CmdTrigger<ToolCmdArgs> trigger)
		{
			using (var wowFile = new WoWFile(trigger.Text.NextWord()))
			{
				GameObjectTypeExtractor.Extract(wowFile);
			}
			//base.Process(trigger);
		}
		private static void ExtractTypes(WoWFile wowFile)
		{
			List<GameObjectTypeInfo> types = new List<GameObjectTypeInfo>();

			wowFile.BaseStream.Position = s_TypeOffset;

			for (int i = 0; i < s_TypeCount; i++)
			{
				types.Add(wowFile.ReadStruct<GameObjectTypeInfo>());
			}

			s_Types = types;
		}
		public static List<UpdateField>[] Extract(WoWFile wowFile)
		{
			FindStringOffset(wowFile);
			FindDataOffset(wowFile);

			FillList(wowFile);

			FillStartAndEndValues();

			AdjustOffsets();

			return s_updateFieldsByGroup;
		}
		public static void Extract(WoWFile wowFile)
		{
			ExtractSounds(wowFile);
			ExtractTypes(wowFile);
			MakeFinal(wowFile);

			var file = new StreamWriter("gotypes.txt");
			foreach (var go in s_GameObjects)
			{
				go.DumpInfo(file);
			}
			file.Close();
		}
		private static void ExtractSounds(WoWFile wowFile)
		{
			List<GameObjectSoundEntry> sounds = new List<GameObjectSoundEntry>();

			wowFile.BaseStream.Position = s_SoundOffset;

			for (int i = 0; i < s_SoundCount; i++)
			{
				sounds.Add(wowFile.ReadStruct<GameObjectSoundEntry>());
			}

			s_Sounds = sounds;
		}
		public static void Extract(WoWFile wowFile, string outputFileName)
		{
			wowFile.BaseStream.Position = FindStartingOffset(wowFile);
			long endPosition = FindEndingOffset(wowFile);

			while (wowFile.BaseStream.Position < endPosition)
			{
				string name = wowFile.ReadCString();
				SpellFailures.Add(name);

				while ((char)wowFile.PeekByte() != 'S')
				{
					wowFile.BaseStream.Position++;
				}
			}

			SpellFailures.Reverse();
			DumpToFile(outputFileName);

			Console.WriteLine("SpellFailure Enum Extracted Successfully");
		}
		private static void MakeFinal(WoWFile wowFile)
		{
			List<GameObject> gameObjects = new List<GameObject>();
			for (int i = 0; i < s_Types.Count; i++)
			{
				GameObject go = new GameObject();

				go.InitFromType(wowFile, s_Types[i], i);

				/*long startPos = wowFile.BaseStream.Position;
                // 0x4A9724
                wowFile.BaseStream.Position = s_Types[i].NameOffset - 0x401800; // 0x4988C4
                go.Name = wowFile.ReadCString();
                //wowFile.BaseStream.Position = startPos;

                go.TypeId = s_Types[i].TypeId;
                go.SoundCount = s_Types[i].soundCount;
                go.Sounds = new GameObjectSoundEntry[go.SoundCount];*/

				gameObjects.Add(go);
			}

			s_GameObjects = gameObjects;
		}
		private static long FindStartingOffset(WoWFile wowFile)
		{
			return wowFile.FileString.IndexOf(FirstFailure);
		}
		private static long FindEndingOffset(WoWFile wowFile)
		{
			return wowFile.FileString.IndexOf(LastFailure) + LastFailure.Length;
		}
		public static void SetWowDir(string dir)
		{
			_wowFile = null;
			ToolConfig.Instance.wowDir = dir;
			_extractor = new UpdateFieldExtractor(WoWFile);
		}
Beispiel #12
0
 private static GameObjectSoundEntry[] GetSounds(WoWFile wowFile, GameObjectTypeInfo type)
 {
     return(null);
 }
		public static List<FieldVariation>[] Comparer(WoWFile oldFile, WoWFile newFile)
		{
			return new UpdateFieldComparer(oldFile, newFile).Changes;
		}
		public UpdateFieldExtractor(WoWFile wowFile)
		{
			this.wowFile = wowFile;
		}
		public static void Write(WoWFile file)
		{
			var fields = UpdateFieldExtractor.Extract(file);
			var mgr = new UpdateFieldWriter(fields);
			mgr.Write();
		}
		public UpdateFieldComparer(WoWFile oldFile, WoWFile newFile)
		{
			this.origFields = UpdateFieldExtractor.Extract(oldFile);
			this.newVersionFields = UpdateFieldExtractor.Extract(newFile);

			Compare();
		}
		public static void Dump(WoWFile oldFile, WoWFile newFile, string dir)
		{
			using (var writer = new StreamWriter(ToolConfig.OutputDir + "UpdateField Changes from " +
			                                     oldFile.Version + " to " + newFile.Version + ".txt"))
			{
				Dump(oldFile, newFile, writer);
			}
		}
 public UpdateFieldExtractor(WoWFile wowFile)
 {
     this.wowFile = wowFile;
 }
		private void ReadSounds(WoWFile wowFile, GameObjectTypeInfo type)
		{
			if (SoundCount < 1)
				return;

			//long start = type.SoundListOffset - 0x401A00;
			long start = type.SoundIdListOffset - 0x401600;// GameObjectTypeExtractor.s_VirtualOffset;

			wowFile.BaseStream.Position = start;




			for (int i = 0; i < SoundCount; i++)
			{
				Sounds[i] = new GameObjectSound();
				Sounds[i].Id = wowFile.ReadInt32();
				long startPos = wowFile.BaseStream.Position;
				if (Sounds[i].Id > GameObjectTypeExtractor.Sounds.Count)
				{
					System.Diagnostics.Debugger.Break();
				}
				wowFile.BaseStream.Position = GameObjectTypeExtractor.Sounds[Sounds[i].Id].NameOffset - GameObjectTypeExtractor.s_VirtualOffset;
				Sounds[i].Name = wowFile.ReadCString();
				wowFile.BaseStream.Position = startPos;
			}
		}
		public void InitFromType(WoWFile wowFile, GameObjectTypeInfo type, int id)
		{
			// 0x4A9724
			wowFile.BaseStream.Position = type.NameOffset - GameObjectTypeExtractor.s_VirtualOffset;//0x401800; // 0x4988C4
			Name = wowFile.ReadCString();
			TypeId = id;
			SoundCount = type.SoundCount;
			Sounds = new GameObjectSound[SoundCount];
			ReadSounds(wowFile, type);
			//DumpInfo(RalekProgram.Log);
		}
		public static ExtendedUpdateField[][] Extract(WoWFile file)
		{
			return new UpdateFieldExtractor(file).Extract();
		}
 public static ExtendedUpdateField[][] Extract(WoWFile file)
 {
     return(new UpdateFieldExtractor(file).Extract());
 }
		private static void FindDataOffset(WoWFile wowFile)
		{
			byte[] temp = new byte[16] { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };

			StringBuilder sb = new StringBuilder();
			foreach (byte b in temp)
			{
				sb.Append((char)b);
			}
			string toFind = sb.ToString();

			// Should be at 6896020 for 2.1.3
			int index = wowFile.FileString.IndexOf(toFind);

			if (index > 0)
			{
				s_dataStartOffset = index - 4;
			}
			else
			{
				Console.WriteLine("Data Offset Not Found!");
			}
		}
 public static bool DumpEnums(WoWFile file, string outputFile)
 {
     return(new UpdateFieldExtractor(file).DumpEnums(outputFile));
 }
		public static void Dump(WoWFile oldFile, WoWFile newFile, TextWriter output)
		{
			var comp = new UpdateFieldComparer(oldFile, newFile);
			comp.Dump(output);
		}
 private static long FindStartingOffset(WoWFile wowFile)
 {
     return(wowFile.FileString.IndexOf(FirstFailure));
 }
		public static bool DumpEnums(WoWFile wowFile, string outputFileName)
		{
			FindStringOffset(wowFile);
			FindDataOffset(wowFile);

			FillList(wowFile);

			FillStartAndEndValues();

			// not included in release builds apparently :/
			//FillExtraFieldList(wowFile);

			AdjustOffsets();

			WriteToFile(wowFile, outputFileName);

			Console.WriteLine("UpdateFields Extracted Successfully to: " + outputFileName);

			//FlagFinder(FieldFlag.Flag_0x10);
			//FlagFinder(FieldFlag.Flag_0x20);
			//FieldTypeFinder(FieldType.TwoInt16);

			return true;
		}
		private static void FindStringOffset(WoWFile wowFile)
		{
			// Should be 3853356 for 2.1.3
			int index = wowFile.FileString.IndexOf("OBJECT_FIELD_GUID\0");

			if (index > 0)
			{
				s_stringStartOffset = index;
			}
			else
			{
				Console.WriteLine("String Offset Not Found!");
			}
		}
        public static void Dump(WoWFile oldFile, WoWFile newFile, TextWriter output)
        {
            var comp = new UpdateFieldComparer(oldFile, newFile);

            comp.Dump(output);
        }
		private static void WriteToFile(WoWFile wowFile, string outputFile)
		{
			uint objectDelta = m_updateFieldList[m_objectEnd - 1].Offset + m_updateFieldList[m_objectEnd - 1].Size;
			uint unitDelta = m_updateFieldList[m_unitEnd - 1].Offset + m_updateFieldList[m_unitEnd - 1].Size;
			uint itemDelta = m_updateFieldList[m_itemEnd - 1].Offset + m_updateFieldList[m_unitEnd - 1].Size;

			using (StreamWriter writer = new StreamWriter(outputFile))
			{
				writer.WriteLine();
				writer.WriteLine("// UpdateFields generated for build {0}.{1}", wowFile.Version, wowFile.Build);
				writer.WriteLine();

				writer.WriteLine("namespace WCell.Core");
				writer.WriteLine("{");

				DumpEnum(m_objectStart, m_objectEnd, 0, "ObjectFields", s_objectExtraFields, writer);

				DumpEnum(m_unitStart, m_unitEnd, objectDelta, "UnitFields", s_unitExtraFields, writer);

				DumpEnum(m_playerStart, m_playerEnd, unitDelta, "PlayerFields", s_playerExtraFields, writer);

				DumpEnum(m_itemStart, m_itemEnd, objectDelta, "ItemFields", s_itemExtraFields, writer);

				DumpEnum(m_containerStart, m_containerEnd, itemDelta, "ContainerFields", s_containerExtraFields, writer);

				DumpEnum(m_dynamicObjectStart, m_dynamicObjectEnd, objectDelta, "DynamicObjectFields", s_dynamicObjectExtraFields, writer);

				DumpEnum(m_gameObjectStart, m_gameObjectEnd, objectDelta, "GameObjectFields", s_gameObjectExtraFields, writer);

				DumpEnum(m_corpseStart, m_corpseEnd, objectDelta, "CorpseFields", s_corpseExtraFields, writer);

				writer.WriteLine("}");
			}
		}
Beispiel #31
0
 public static void SetWowDir(string dir)
 {
     _wowFile = new WoWFile(dir);
     _extractor = new UpdateFieldExtractor(_wowFile);
 }
		/// <summary>
		/// Creates necessary information for the Update-PacketParser
		/// </summary>
		public static void CreatePacketParserInfo(string wowFile, string outputFile)
		{
			WoWFile file = new WoWFile(wowFile);
			var fields = UpdateFieldExtractor.Extract(file);

			using (var writer = new StreamWriter(outputFile))
			{
				for (UpdateFieldGroup g = UpdateFieldGroup.Object; g < UpdateFieldGroup.Count; g++)
				{
					foreach (var field in s_updateFieldsByGroup[(int)g]) {
						var size = field.Size;

						if (size > 1)
						{
							writer.WriteLine("SetType({0}, {1}, {2});",
								field.FullTypeName, field.FullName, field.Size);
						}
						else
						{
							writer.WriteLine("FieldTypes[{0}] = {1};", field.FullName, field.FullTypeName);
						}
					}
				}
			}
		}
		public static bool DumpEnums(WoWFile file, string outputFile)
		{
			return new UpdateFieldExtractor(file).DumpEnums(outputFile);
		}
		private static GameObjectSoundEntry[] GetSounds(WoWFile wowFile, GameObjectTypeInfo type)
		{
			return null;
		}
 public static List <FieldVariation>[] Comparer(WoWFile oldFile, WoWFile newFile)
 {
     return(new UpdateFieldComparer(oldFile, newFile).Changes);
 }