- Katılım
- 7 Mart 2012
- Mesajlar
- 12,586
- Konu Yazar
- #1
kendinize göre uyarlarsanız yada örnek alıp yaparsanız güzel seyler ortaya cıkar
Kod:
public bool LoadMap(string filename)
{
if (this.m_changed)
{
switch (MessageBox.Show("Changes to the warp list have been made, do you want to save? www.neronlineworld.com", "Warp Gate Editor", MessageBoxButtons.YesNoCancel))
{
case DialogResult.Cancel:
return true;
case DialogResult.Yes:
this.SaveMap();
break;
}
}
try
{
this.m_warpgates.Clear();
this.lbWarpList.Items.Clear();
this.ClearEditPane();
this.m_changed = false;
FileStream input = File.Open(filename, FileMode.Open);
BinaryReader reader = new BinaryReader(input);
long offset = 0L;
int num2 = reader.ReadInt32();
reader.ReadInt32();
offset = (num2 * num2) * 4;
reader.BaseStream.Seek(offset, SeekOrigin.Current);
offset = 0L;
float num3 = reader.ReadSingle();
float num4 = reader.ReadSingle();
int num5 = reader.ReadInt32();
if (num5 > 0)
{
int num6 = (12 * num5) * 3;
for (int i = 0; i < num6; i++)
{
reader.ReadByte();
}
}
int num8 = 0;
float num9 = 0f;
while (num9 < num4)
{
int num10 = 0;
float num11 = 0f;
while (num11 < num3)
{
if (((reader.ReadInt32() == 0) ? 0 : 1) != 0)
{
int num12 = reader.ReadInt32();
if (num12 > 0)
{
for (int k = 0; k < (num12 * 2); k++)
{
reader.ReadByte();
}
}
for (int j = 0; j < 4; j++)
{
for (int m = 0; m < 4; m++)
{
int num16 = reader.ReadInt32();
if (num16 > 0)
{
for (int n = 0; n < ((num16 * 3) * 4); n++)
{
reader.ReadByte();
}
}
}
}
}
num11 += 16f;
num10++;
}
num9 += 16f;
num8++;
}
int num18 = reader.ReadInt32();
offset = 0x18 * num18;
reader.BaseStream.Seek(offset, SeekOrigin.Current);
offset = num2 * (num2 * 2);
reader.BaseStream.Seek(offset, SeekOrigin.Current);
int num19 = reader.ReadInt32();
offset = 20 * num19;
reader.BaseStream.Seek(offset, SeekOrigin.Current);
this.m_mapDataSize = (int) reader.BaseStream.Position;
int num20 = reader.ReadInt32();
if (num20 == 0)
{
MessageBox.Show("This map file doesn't have any warp gates.", "Warp Gate Editor");
}
else
{
int num21 = ((int) (reader.BaseStream.Length - reader.BaseStream.Position)) / 0x138;
if (num21 != num20)
{
num20 = num21;
}
try
{
for (int num22 = 0; num22 < num20; num22++)
{
WarpGate item = new WarpGate();
item.ID = reader.ReadInt16();
item.Name = Encoding.Default.GetString(reader.ReadBytes(0x20));
item.Announce = Encoding.Default.GetString(reader.ReadBytes(0x100)).Trim();
reader.ReadInt16();
item.Pay = reader.ReadInt32();
item.Zone = reader.ReadInt32();
item.X = reader.ReadSingle();
item.Y = reader.ReadSingle();
item.Z = reader.ReadSingle();
item.R = reader.ReadSingle();
item.Nation = reader.ReadByte();
item.Unknown = reader.ReadByte();
reader.ReadInt16();
this.m_warpgates.Add(item);
this.lbWarpList.Items.Add(((item.Nation == 1) ? "ORC" : "HUM") + "\t" + item.Name);
}
}
catch (Exception)
{
}
}
input.Close();
this.m_fileName = filename;
string[] strArray = filename.Split(new char[] { '\\' });
this.lblFile.Text = strArray[strArray.Length - 1];
this.m_loaded = true;
return true;
}
catch (Exception exception)
{
if (this.m_warpgates.Count != 0)
{
MessageBox.Show(string.Format("There was an error while reading the warp gate segment, exception = {0}", exception), "Warp Gate Editor Error");
return true;
}
MessageBox.Show(exception.ToString());
this.lblFile.Text = string.Empty;
this.m_loaded = false;
return false;
}
}
private void loadToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Title = "Select a server map file (SMD)";
dialog.Filter = "KO server map file (*.smd)|*.smd";
if ((dialog.ShowDialog() == DialogResult.OK) && !this.LoadMap(dialog.FileName))
{
MessageBox.Show("Unable to load KO Map file.", "Warp Gate Editor");
}
}
public void SaveMap()
{
if (!this.m_loaded)
{
MessageBox.Show("You haven't loaded a map file yet!", "Warp Gate Editor");
}
else if (!this.m_changed)
{
MessageBox.Show("Nothing has changed since load.", "Warp Gate Editor");
}
else
{
try
{
FileStream input = File.Open(this.m_fileName, FileMode.Open, FileAccess.ReadWrite);
BinaryReader reader = new BinaryReader(input);
byte[] buffer = new byte[this.m_mapDataSize];
reader.Read(buffer, 0, this.m_mapDataSize);
input.Close();
input = File.Open(this.m_fileName, FileMode.Truncate, FileAccess.Write);
BinaryWriter writer = new BinaryWriter(input);
writer.Write(buffer, 0, buffer.Length);
try
{
writer.Seek(this.m_mapDataSize, SeekOrigin.Begin);
writer.Write(this.m_warpgates.Count);
for (int i = 0; i < this.m_warpgates.Count; i++)
{
WarpGate gate = this.m_warpgates[i];
writer.Write(gate.ID);
byte[] bytes = new byte[0x20];
Encoding.Default.GetBytes(gate.Name, 0, gate.Name.Length, bytes, 0);
writer.Write(bytes);
byte[] buffer3 = new byte[0x100];
Encoding.Default.GetBytes(gate.Announce, 0, gate.Announce.Length, buffer3, 0);
writer.Write(buffer3);
writer.Write((short) 0);
writer.Write(gate.Pay);
writer.Write(gate.Zone);
writer.Write(gate.X);
writer.Write(gate.Y);
writer.Write(gate.Z);
writer.Write(gate.R);
writer.Write(gate.Nation);
writer.Write(gate.Unknown);
writer.Write((short) 0);
}
input.Close();
this.m_changed = false;
}
catch (Exception exception)
{
MessageBox.Show(string.Format("Unable to save to SMD with the error: {0}", exception.ToString()), "Warp Gate Editor");
}
}
catch
{
MessageBox.Show("Unable to re-open the SMD file for writing.", "Warp Gate Editor");
}
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (this.m_changed)
{
this.SaveMap();
}
}
private void UpdateNation()
{
int num = 0;
int num2 = 0;
int num3 = 0;
int startIndex = 0;
switch (this.txtWarpID.Text.Length)
{
case 3:
num = int.Parse(this.txtWarpID.Text.Substring(startIndex, 1));
startIndex++;
break;
case 4:
num = int.Parse(this.txtWarpID.Text.Substring(startIndex, 2));
startIndex += 2;
break;
case 5:
num = int.Parse(this.txtWarpID.Text.Substring(startIndex, 3));
startIndex += 3;
break;
default:
return;
}
num2 = int.Parse(this.txtWarpID.Text.Substring(startIndex, 1));
startIndex++;
num3 = int.Parse(this.txtWarpID.Text.Substring(startIndex, this.txtWarpID.Text.Length - startIndex));
switch (num2)
{
case 1:
case 2:
this.txtWarpID.Text = string.Format("{0}{1}{2}", num, (this.cboNation.Text == "Karus") ? 1 : 2, num3);
break;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct WarpGate
{
public short ID;
public string Name;
public string Announce;
public int Pay;
public int Zone;
public float X;
public float Y;
public float Z;
public float R;
public byte Nation;
public byte Unknown;
}
}
}