Ich hatte für Daniel angefangen die QuestData zu analysieren und jetzt kb mehr da drauf. Den Rest könnt ihr selber machen
Viel Spaß damit.
PHP Code:
using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace iQuest { public sealed class QuestFile { private FileStream _File; private BinaryReader Reader; public short QuestCount; private byte[] QuestHeader = new byte[2]; public static List<Quest> Quests = new List<Quest>(); private byte RewardMax = 12;
public QuestFile(string path) { if (!File.Exists(path)) { throw new Exception("File does not exists"); } _File = File.Open(path, FileMode.Open); Reader = new BinaryReader(_File); QuestHeader = Reader.ReadBytes(2); short questCount = Reader.ReadInt16(); for (short i = 0; i < questCount; i = (short)(i + 1)) { LoadQuest(); } _File.Dispose(); }
public Quest get_Item(ushort ushort_0) { foreach (Quest quest in Quests) { if (quest.ID == ushort_0) { return quest; } } return null; }
private void ParseRewards(Quest quest) { for (byte i = 0; i < RewardMax; i = (byte)(i + 1)) { QuestReward item = new QuestReward { isGiven = Reader.ReadByte(), Type = (QuestReward.RewardType)Reader.ReadByte(), unkShort = Reader.ReadUInt16() }; if (item.Type == QuestReward.RewardType.Item) { item.Value = Reader.ReadUInt16(); item.ItemCount = Reader.ReadUInt16(); item.unkDword = Reader.ReadUInt32(); } else { item.Amount = Reader.ReadUInt64(); } quest.Rewards.Add(item); } Stream baseStream = Reader.BaseStream; baseStream.Position += 6L; quest.RewardData = Reader.ReadBytes(14); }
public void SaveFile(string path) { FileStream stream = File.Create(path); BinaryWriter writor = new BinaryWriter(stream); writor.Write(QuestHeader); writor.Write((short)Quests.Count); for (int i = 0; i < Quests.Count; ++i) { long position = writor.BaseStream.Position; RestoreDefault(writor, Quests[i]);
foreach (Mob mob in Quests[i].Mobs) { writor.Write(Convert.ToByte(mob.isActive)); writor.Write(Convert.ToByte(mob.isMob)); writor.Write(mob.ID); writor.Write(Convert.ToByte(mob.HasToBeKilled)); writor.Write(mob.Amount); writor.Write(Convert.ToByte(mob.UnkDataMob)); writor.Write(Convert.ToByte(mob.UnkDataMob2)); } foreach (Item item in Quests[i].Items) { writor.Write(item.isActive); writor.Write(item.Type); writor.Write(item.ID); writor.Write(item.Amount); } writor.Write(Quests[i].DropCount); foreach (ItemDrop drop in Quests[i].ItemDrop) { writor.Write(drop.isActive); writor.Write(drop.MobID); writor.Write(drop.Amount); writor.Write(drop.ItemID); writor.Write(drop.Rate); writor.Write(drop.UnkByte1); writor.Write(drop.UnkByte2); } foreach (ItemDropPadding padding in Quests[i].ItemPadding) { writor.Write(padding.Padding); } long num2 = writor.BaseStream.Position; foreach (QuestReward reward in Quests[i].Rewards) { writor.Write(reward.isGiven); switch (reward.Type) { case QuestReward.RewardType.Exp: writor.Write((byte)0); break;
case QuestReward.RewardType.Money: writor.Write((byte)1); break;
case QuestReward.RewardType.Item: writor.Write((byte)2); break;
case QuestReward.RewardType.Fame: writor.Write((byte)4); break; } writor.Write(reward.unkShort); if (reward.Type == QuestReward.RewardType.Item) { writor.Write(reward.Value); writor.Write(reward.ItemCount); writor.Write(reward.unkDword); } else { writor.Write(reward.Amount); } } long num1 = writor.BaseStream.Position - num2; writor.Write((ushort)(Quests[i].StartScript.Length + 1)); writor.Write((ushort)(Quests[i].FinishScript.Length + 1)); writor.Write((ushort)(Quests[i].ActionScript.Length + 1)); writor.Write(Quests[i].RewardData); long num4 = writor.BaseStream.Position - position; long num5 = 672; if (num4 != 672) { throw new Exception("Required Length: " + num5.ToString() + " - Current Length: " + num4.ToString()); } WriteNulledString(writor, Quests[i].StartScript); WriteNulledString(writor, Quests[i].ActionScript); WriteNulledString(writor, Quests[i].FinishScript); } stream.Close(); stream.Dispose(); }
void ParseItems(Quest quest) { for (byte i = 0; i < 10; i = (byte) (i + 1)) { Item item = new Item { isActive = Reader.ReadByte(), Type = Reader.ReadByte(), ID = Reader.ReadUInt16(), Amount = Reader.ReadUInt16() }; quest.Items.Add(item); } quest.DropCount = Reader.ReadUInt32(); for (byte j = 0; j < quest.DropCount; j = (byte)(j + 1)) { ItemDrop drop = new ItemDrop { isActive = Reader.ReadUInt32(), MobID = Reader.ReadUInt32(), Amount = Reader.ReadUInt32(), ItemID = Reader.ReadUInt32(), Rate = Reader.ReadUInt32(), UnkByte1 = Reader.ReadUInt32(), UnkByte2 = Reader.ReadUInt32() }; quest.ItemDrop.Add(drop); } uint num3 = 0; if (quest.DropCount > 0) { num3 = (28 * (11 - quest.DropCount)) + 12; } else { num3 = (28 * (11 - quest.DropCount)) + 12; } ItemDropPadding padding = new ItemDropPadding { Padding = Reader.ReadBytes(Convert.ToInt32(num3)) }; quest.ItemPadding.Add(padding); }
private void ParseMobs(Quest quest) { for (int i = 0; i < 5; ++i) {
public sealed class Quest { public uint DropCount = 0; public List<ItemDrop> ItemDrop = new List<ItemDrop>(); public List<ItemDropPadding> ItemPadding = new List<ItemDropPadding>(); public List<Mob> Mobs = new List<Mob>(); public List<QuestReward> Rewards = new List<QuestReward>(); public List<Item> Items = new List<Item>(); public string ActionScript { get; set; } public ushort Description { get; set; } public string FinishScript { get; set; } public ushort ID { get; set; } public byte ClassType { get; set; } public byte DailyQuest { get; set; } public byte EnableQuest { get; set; } public byte InstAcc { get; set; } public byte InstHand { get; set; } public byte[] ItemData { get; set; } public ushort ItemID { get; set; } public byte ItemVanish { get; set; } public byte MaxLevel { get; set; } public byte MinLevel { get; set; } public byte MultiQuest { get; set; } public byte NeedClass { get; set; } public byte NeedItem { get; set; } public byte NeedLevel { get; set; } public byte NeedNPC { get; set; } public byte NeedPred { get; set; } public ushort Predesessor { get; set; } public byte QuestGrade { get; set; } public byte[] RewardData { get; set; } public ushort StartingNPC { get; set; } public string StartScript { get; set; } public ushort Title { get; set; }
public Dictionary<byte, byte[]> UnkBytes = new Dictionary<byte, byte[]>();
public string GetUnkString() { string tot = ""; for (int i = 0; i < RewardData.Length - 1; ++i) { tot += RewardData[i].ToString("X2") + " "; } tot += RewardData[RewardData.Length - 1].ToString("X2"); return tot; }
public void SetUnkString(string hex) { string[] splitted = hex.Split(' '); if (splitted.Length != 18) { throw new Exception("Incorrect lenght!"); } for (int i = 0; i < splitted.Length; ++i) { RewardData[i] = byte.Parse(splitted[i], System.Globalization.NumberStyles.HexNumber); } }
public sealed class Mob { public byte Amount { get; set; } public bool HasToBeKilled { get; set; } public bool isActive { get; set; } public bool isMob { get; set; } public ushort ID { get; set; } public byte UnkDataMob { get; set; } public byte UnkDataMob2 { get; set; }
}
public class QuestReward { public enum RewardType : byte { Exp = 0, Money = 1, Item = 2, Fame = 4, } public RewardType Type { get; set; } public ushort unkShort { get; set; } public ushort Value { get; set; } public ushort ItemCount { get; set; } public ulong Amount { get; set; } public byte isGiven { get; set; } public uint unkDword { get; set; }
}
public class Item { public byte Type { get; set; } public ushort ID { get; set; } public ushort Amount { get; set; } public byte isActive { get; set; } }
public class ItemDrop { public uint Amount { get; set; } public uint isActive { get; set; } public uint ItemID { get; set; } public uint MobID { get; set; } public uint Rate { get; set; } public uint UnkByte1 { get; set; } public uint UnkByte2 { get; set; } }
public class ItemDropPadding { public byte[] Padding { get; set; } } }
[PHP] Struktur / Aufbau und Sicherheit 11/18/2015 - Web Development - 3 Replies Ich habe mich bis jetzt eigentlich mit so jeder ziemlich bekannten Programmier- oder Skritptsprache, wie C/C++, C, Java, PHP und JS beschäftigt und mich wenigstens mit den Grundlagen etc. vertraut gemacht.
Dann habe ich mich als nächstes mit der Objektorientierung vertraut gemacht oder ich bin immer noch dabei. Die OOP ist ja auch ein sehr umfangreiches Gebiet und da gibt es ja auch viele verschiedene Strukturen oder "Programmaufbauten", wie z.B auch das MVC, was ja sehr bekannt ist.
...
QuestData.shn von Offiziellen Server 03/30/2015 - Fiesta Online - 2 Replies Hallo Zusammen,
Bin verzweifelt am Suchen wie ich die QuestData.shn vom Offiziellen Server öffnen kann. Die scheinen da irgendwas geändert zu haben das es mit dem iQuest nicht geht. Hoffe mir kann da irgendwer Helfen :)
Server-Struktur bei Nexon.eu 06/25/2012 - WarRock - 3 Replies Hallo User,
Ich würde ganz gerne einmal wissen, wer auf welchen Server komm!
Also, wo kann der Brasilianer drauf und wo der Türke, wo aber kann, der Deutsche nicht drauf dafür aber der Ammi etc.
International 2 ist ja wie wir in Deutschland sehen können der für uns momentan meist gefüllte Server.
Was aber sind mit Türken, Indern, Israel, Brasilien etc. etc. wo spielen sie? Und können sie überhaubt auf den international Server drauf ohne irgendwelche Proxys etc. ?
Wer kann alles...
Silkroad QuestData in pk2 07/06/2011 - SRO Coding Corner - 3 Replies Hello coders,
i've just parsed quests in chardata packet and i want to write them by their names.
So far , I've looked up this files in pk2 :
questdata.txt
textquest_otherstring.txt
textquest_queststring.txt
textquest_speech&name.txt
questcontentsdata.txt
ifquest.txt
ifquestinfo.txt