Main Site | Forum | Rules | Downloads | Wiki | Features | Podcast

NLSC Forum

Switch to full style
Patchmaking tutorials for NBA 2K15.
Post a reply

[NBA2K15 PC] Tutorial - Managing files [ C# Tutorial and SourceCode ]

Wed Nov 05, 2014 6:08 am

Since i wont have any time to make progress in tool making i will post tutorials about it to make modding a step up

So ... start

In VisualSTUDIO Express go
File>NewProject>Teplates>Visual C#>Windows>WindowsFormAplication
enter name of project [Name of my proj is tutorials] > than ok

Change DEBUG to release

Add 3 listboxes from toolbox
Rename listbox1 to main [ design name ]
Rename listbox2 to sections [ design name ]
Rename lostbox3 to logbox [ design name ]
Select FORM go to events and double click load
and copy code below
Code:

       private void Form1_Load(object sender, EventArgs e)
        {
            foreach (string s in nba2knames)
            {
                if (File.Exists(Directory.GetCurrentDirectory() + "\\" + s))
                {
                    main.Items.Add(s);
                }
                else
                {

                }
            }
        }


for using part we use
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


above Form1Load insert

Code:
 string[] nba2knames = File.ReadAllLines("2knames.txt"); //read file names
        public static string moddingfolder = Directory.GetCurrentDirectory() + "\\ModdingFolder\\"; //modding folder for file export-import
        string outputfolder = moddingfolder + "export\\"; //export folder in modding folder
        byte[] iffscan = { 0x94, 0xEF, 0x3B, 0xFF };  //94EF3BFF is IFF header
        byte[] pkzippattern = { 0x50, 0x4B, 0x03, 0x04 }; //504B0304 is PK Zip Header
        byte[] zlibpattern05 = { 0x00, 0x05, 0x78, 0xDA }; // zlib pattern1
        byte[] zlibpattern = { 0x00, 0x06, 0x78, 0xDA }; //zlib pattern2

        List<long> pkchunkslist = new List<long>(new long[] { }); // list to store pkoffsets
        long finalpkzipposs = 0;

 public static int ToInt32BigEndian(byte[] buf, int i)
        {
            return (buf[i] << 24) | (buf[i + 1] << 16) | (buf[i + 2] << 8) | buf[i + 3];
        }

       


MAIN BOX

under mainbox properties/events double click on SelectedIndexChanged
Code:
    private void main_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (main.SelectedIndex != -1)
            {
                sections.Items.Clear();
                string fldr = outputfolder + main.SelectedItem.ToString();
                if (Directory.Exists(fldr) == false)
                {
                    Directory.CreateDirectory(outputfolder + main.SelectedItem.ToString());
                }

                Int64 read = 0;
                FileInfo fi = new FileInfo(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
                long lo = fi.Length;
                using (FileStream fs = new FileStream(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString(), FileMode.Open, FileAccess.Read))
                {
                    byte[] buf = new byte[1024 * 1024 * 400];
                    if (main.SelectedIndex != -1)
                    {
                        BinaryReader brxz = new BinaryReader(fs);
                        while (read < fs.Length)
                        {
                            brxz.BaseStream.Position = read;
                            buf = brxz.ReadBytes(buf.Length);

                            if (lo > 419430400)
                            {
                                GetPositionAfterMatchLarge(buf, iffscan, read);
                                read += buf.Length;
                            }
                            else
                            {
                                GetPositionAfterMatch(buf, iffscan);
                                read += buf.Length;
                            }
                        }
                        brxz.Close();
                    }
                }
                logbox.Items.Add(main.SelectedItem.ToString() + " ready!");

            }

            else
            {
                MessageBox.Show("Please select item");
            }
        }


and insert this above private void main_SelectedIndexChanged

Code:
      #region scanlargefiles
        public void GetPositionAfterMatchLarge(byte[] data, byte[] pattern, long add) // byte[] data is buffer, pattern is iff pattern, adress is adress where to scan
        {
            for (int i = 0; i < data.Length - pattern.Length; i++)
            {
                bool match = true;
                for (int k = 0; k < pattern.Length; k++)
                {
                    if (data[i + k] != pattern[k])
                    {
                        match = false;
                        break;
                    }
                }
                if (match)
                {
                    sections.Items.Add(add + i);
                }
            }
        }
        #endregion

        #region scan smaller files [ team data ]
        public void GetPositionAfterMatch(byte[] data, byte[] pattern) // scan for iff possitions
        {
            for (int i = 0; i < data.Length - pattern.Length; i++)
            {
                bool match = true;
                for (int k = 0; k < pattern.Length; k++)
                {
                    if (data[i + k] != pattern[k])
                    {
                        match = false;
                        break;
                    }
                }
                if (match)
                {
                    sections.Items.Add(i);
                }
            }
        }
        #endregion 


*********
SECTIONS/IFFS [exports iffs to moddingfolder]

Go back to design and click sections box and under properties/events doubleclick on SelectedIndexChanged

Code:
       private void sections_SelectedIndexChanged(object sender, EventArgs e)
        {
           
            if (sections.SelectedIndex != -1)
            {
                GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
     
            }
            else
            {
                MessageBox.Show("Please select item");
            }
        }


and code for GetChunkSize

Code:
      public int GetChunkSize(long poschunk, string radnifilex)
        {
            int loc = 0;
            BinaryReader brsize = new BinaryReader(File.Open(radnifilex, FileMode.Open, FileAccess.Read));
            brsize.BaseStream.Position = poschunk + 8;
            byte[] temptorev = brsize.ReadBytes(4);
            int nch;
            nch = ToInt32BigEndian(temptorev, 0);
            label1.Text = nch.ToString();
            brsize.BaseStream.Position = poschunk;
            byte[] export = brsize.ReadBytes(nch);
            brsize.Close();
            File.WriteAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff", export);
            return loc;
        }
        #endregion


*******
Sections/IFFS [ scan for pks and zlibs ]

in design select sectionbox and in properties/events double click on doubleclick events

Code:
    private void sections_DoubleClick(object sender, EventArgs e)
        {
            pkzips.Items.Clear();
            zlibbox.Items.Clear();
            GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
            byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
            finalpkzipposs = ifftemp.Length;
            GetPositionAfterMatchCustom(ifftemp);
            GetPositionAfterMatchCustomZlib(ifftemp);

            pkzips.DataSource = pkchunkslist;
            logbox.Items.Add("Scanned " + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");

        }


*******
UNPACK ALL IFFS from main file to moddingfolder

in designer add a button and doubleclick on it

Code:
    private void sections_DoubleClick(object sender, EventArgs e)
        {
            pkzips.Items.Clear();
            zlibbox.Items.Clear();
            GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
            byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
            finalpkzipposs = ifftemp.Length;
            GetPositionAfterMatchCustom(ifftemp);
            GetPositionAfterMatchCustomZlib(ifftemp);

            pkzips.DataSource = pkchunkslist;
            logbox.Items.Add("Scanned " + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");

        }


and code for fullPK export
Code:
   public void fullPKexport(int index)
        {
            int total = sections.Items.Count;
            index = 0;
            int pkchunkindex = 0;
            long indexiff = 0;
            int nomember = 0;
            long startpkoffset = 0;
            long endpkfileoffset = 0;
            byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff"); //read iff
            finalpkzipposs = ifftemp.Length;

            GetPositionAfterMatchCustom(ifftemp);
            if (pkchunkslist.Count > 0)
            {
                if (Directory.Exists("testx1") == true)
                {
                    Directory.Delete("testx1", true);
                }
            }
            byte[] data = { };
            nomember = pkchunkslist.Count;
            while (pkchunkindex < nomember)
            {
                startpkoffset = long.Parse(pkchunkslist[pkchunkindex].ToString());
                using (System.IO.Stream fss = File.OpenRead(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff"))
                {
                    BinaryReader briff = new BinaryReader(fss);
                    long internindexx = indexiff;

                    if (pkchunkindex == nomember - 1)
                    {

                        endpkfileoffset = long.Parse(finalpkzipposs.ToString());

                    }
                    else
                    {

                        string s = pkchunkslist[pkchunkindex + 1].ToString();
                        endpkfileoffset = long.Parse(s);
                    }
                    briff.BaseStream.Position = startpkoffset;
                    data = briff.ReadBytes(Convert.ToInt32(endpkfileoffset - startpkoffset));
                    long datasizetext = data.Length;
                    File.WriteAllBytes("test.dat", data);
                    ExtractFile("test.dat", "testx1");
                    if (Directory.Exists("testx1") == true)
                    {
                        string[] filestomove = Directory.GetFiles("testx1");
                        foreach (string s in filestomove)
                        {
                            string s2 = s.Replace("testx1\\", "");
                            if (Directory.Exists(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString()) == false)
                            {
                                Directory.CreateDirectory(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString());
                            }
                            if (File.Exists(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2) == true)
                            {
                                File.Delete(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2);
                            }
                            File.Move(s, outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2);
                            File.WriteAllText(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\info.txt", "Data size when zipped = " + datasizetext.ToString() + "bytes");
                        }
                        pkchunkindex++;
                        Directory.Delete("testx1", true);
                    }
                    else
                    {
                        pkchunkslist.RemoveAt(pkchunkindex + 1);
                        nomember = nomember - 1;
                    }
                    briff.Close();
                }
            }
        }
     





FULLCODE [in case i skipped something and i did..]


Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tutorials
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string[] nba2knames = File.ReadAllLines("2knames.txt"); //read file names
        public static string moddingfolder = Directory.GetCurrentDirectory() + "\\ModdingFolder\\"; //modding folder for file export-import
        string outputfolder = moddingfolder + "export\\"; //export folder in modding folder
        byte[] iffscan = { 0x94, 0xEF, 0x3B, 0xFF };  //94EF3BFF is IFF header
        byte[] pkzippattern = { 0x50, 0x4B, 0x03, 0x04 }; //504B0304 is PK Zip Header
        byte[] zlibpattern05 = { 0x00, 0x05, 0x78, 0xDA };
        byte[] zlibpattern = { 0x00, 0x06, 0x78, 0xDA };

        List<long> pkchunkslist = new List<long>(new long[] { }); // list to store pkoffsets
        long finalpkzipposs = 0;
       
        #region scanlargefiles
        public void GetPositionAfterMatchLarge(byte[] data, byte[] pattern, long add) // byte[] data is buffer, pattern is iff pattern, adress is adress where to scan
        {
            for (int i = 0; i < data.Length - pattern.Length; i++)
            {
                bool match = true;
                for (int k = 0; k < pattern.Length; k++)
                {
                    if (data[i + k] != pattern[k])
                    {
                        match = false;
                        break;
                    }
                }
                if (match)
                {
                    sections.Items.Add(add + i);
                }
            }
        }
        #endregion

        #region scan smaller files [ team data ]
        public void GetPositionAfterMatch(byte[] data, byte[] pattern) // scan for iff possitions
        {
            for (int i = 0; i < data.Length - pattern.Length; i++)
            {
                bool match = true;
                for (int k = 0; k < pattern.Length; k++)
                {
                    if (data[i + k] != pattern[k])
                    {
                        match = false;
                        break;
                    }
                }
                if (match)
                {
                    sections.Items.Add(i);
                }
            }
        }
        #endregion 

 
        #region findpkheaderoffsets
        public void GetPositionAfterMatchCustom(byte[] data)
        {
            for (int i = 0; i < data.Length - pkzippattern.Length; i++)
            {
                bool match = true;
                for (int k = 0; k < pkzippattern.Length; k++)
                {
                    if (data[i + k] != pkzippattern[k])
                    {
                        match = false;
                        break;
                    }
                }
                if (match)
                {
                    pkchunkslist.Add(i);
                }
            }
        }
        #endregion

        #region exportpkfromiff
        public void fullPKexport(int index)
        {
            int total = sections.Items.Count;
            index = 0;
            int pkchunkindex = 0;

            long indexiff = 0;
            int nomember = 0;

            long startpkoffset = 0;
            long endpkfileoffset = 0;




            byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff"); //read iff
            finalpkzipposs = ifftemp.Length;

            GetPositionAfterMatchCustom(ifftemp);
            if (pkchunkslist.Count > 0)
            {
                if (Directory.Exists("testx1") == true)
                {
                    Directory.Delete("testx1", true);
                }
            }
            byte[] data = { };
            nomember = pkchunkslist.Count;
            while (pkchunkindex < nomember)
            {

                startpkoffset = long.Parse(pkchunkslist[pkchunkindex].ToString());
                using (System.IO.Stream fss = File.OpenRead(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff"))
                {
                    BinaryReader briff = new BinaryReader(fss);
                    long internindexx = indexiff;



                    if (pkchunkindex == nomember - 1)
                    {

                        endpkfileoffset = long.Parse(finalpkzipposs.ToString());

                    }
                    else
                    {

                        string s = pkchunkslist[pkchunkindex + 1].ToString();
                        endpkfileoffset = long.Parse(s);
                    }
                    briff.BaseStream.Position = startpkoffset;
                    data = briff.ReadBytes(Convert.ToInt32(endpkfileoffset - startpkoffset));
                    long datasizetext = data.Length;
                    File.WriteAllBytes("test.dat", data);
                    ExtractFile("test.dat", "testx1");
                    if (Directory.Exists("testx1") == true)
                    {
                        string[] filestomove = Directory.GetFiles("testx1");
                        foreach (string s in filestomove)
                        {
                            string s2 = s.Replace("testx1\\", "");
                            if (Directory.Exists(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString()) == false)
                            {
                                Directory.CreateDirectory(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString());
                            }
                            if (File.Exists(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2) == true)
                            {
                                File.Delete(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2);
                            }
                            File.Move(s, outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2);
                            File.WriteAllText(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\info.txt", "Data size when zipped = " + datasizetext.ToString() + "bytes");
                        }
                        pkchunkindex++;
                        Directory.Delete("testx1", true);
                    }
                    else
                    {
                        pkchunkslist.RemoveAt(pkchunkindex + 1);
                        nomember = nomember - 1;
                    }

                    briff.Close();
                }
            }




        }
        #endregion

        #region extractpkfile
        public void ExtractFile(string source, string destination)
        {
            if (Ionic.Zip.ZipFile.IsZipFile(source) == true)
            {
                string zPath = "7zG.exe";
                try
                {
                    ProcessStartInfo pro = new ProcessStartInfo();
                    pro.WindowStyle = ProcessWindowStyle.Hidden;
                    pro.FileName = zPath;
                    pro.Arguments = "x -y \"" + source + "\" -o" + "\"" + destination + "\"";
                    Process x = Process.Start(pro);
                    x.WaitForExit();
                    x.Close();

                }
                catch (System.Exception Ex)
                {
                }
            }
            else
            {
            }

        }
        #endregion



        public static int ToInt32BigEndian(byte[] buf, int i)
        {
            return (buf[i] << 24) | (buf[i + 1] << 16) | (buf[i + 2] << 8) | buf[i + 3];
        }

   

        #region exportifffrommain
        public void exportiff()
        {
            using (System.IO.Stream input = System.IO.File.OpenRead(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString()))
            {
                BinaryReader bx = new BinaryReader(input);
                byte[] exp = { };
                string size = input.Length.ToString();
                bx.BaseStream.Position = long.Parse(sections.SelectedItem.ToString());
                byte[] exportIFFx = bx.ReadBytes(Int32.Parse(size));
                File.WriteAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff", exportIFFx);
                bx.Close();

                logbox.Items.Add("Saved " + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
            }
        }
        #endregion

        #region getsizeofiffs
        public int GetChunkSize(long poschunk, string radnifilex)
        {
            int loc = 0;
            BinaryReader brsize = new BinaryReader(File.Open(radnifilex, FileMode.Open, FileAccess.Read));
            brsize.BaseStream.Position = poschunk + 8;
            byte[] temptorev = brsize.ReadBytes(4);
            int nch;
            nch = ToInt32BigEndian(temptorev, 0);
            label1.Text = nch.ToString();
            brsize.BaseStream.Position = poschunk;
            byte[] export = brsize.ReadBytes(nch);
            brsize.Close();
            File.WriteAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff", export);
            return loc;
        }
        #endregion
       

        #region findzliboffsets
        public void GetPositionAfterMatchCustomZlib(byte[] data)
        {
            for (int i = 0; i < data.Length - zlibpattern.Length; i++)
            {
                bool match = true;
                bool match2 = true;
                for (int k = 0; k < zlibpattern.Length; k++)
                {
                    if (data[i + k] != zlibpattern[k])
                    {


                        match = false;

                        if (data[i + k] != zlibpattern05[k])
                        {
                            match2 = false;
                            break;
                        }
                    }
                }
                if (match == true || match2 == true)
                {
                    zlibbox.Items.Add(i + 2);
                }

            }
        }
        #endregion



        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (string s in nba2knames)
            {
                if (File.Exists(Directory.GetCurrentDirectory() + "\\" + s))
                {
                    main.Items.Add(s);
                }
                else
                {

                }
            }
        }

        private void main_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (main.SelectedIndex != -1)
            {
                sections.Items.Clear();
                string fldr = outputfolder + main.SelectedItem.ToString();
                if (Directory.Exists(fldr) == false)
                {
                    Directory.CreateDirectory(outputfolder + main.SelectedItem.ToString());
                }

                Int64 read = 0;
                FileInfo fi = new FileInfo(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
                long lo = fi.Length;
                using (FileStream fs = new FileStream(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString(), FileMode.Open, FileAccess.Read))
                {
                    byte[] buf = new byte[1024 * 1024 * 400];
                    if (main.SelectedIndex != -1)
                    {
                        BinaryReader brxz = new BinaryReader(fs);
                        while (read < fs.Length)
                        {
                            brxz.BaseStream.Position = read;
                            buf = brxz.ReadBytes(buf.Length);

                            if (lo > 419430400)
                            {
                                GetPositionAfterMatchLarge(buf, iffscan, read);
                                read += buf.Length;
                            }
                            else
                            {
                                GetPositionAfterMatch(buf, iffscan);
                                read += buf.Length;
                            }
                        }
                        brxz.Close();
                    }
                }
                logbox.Items.Add(main.SelectedItem.ToString() + " ready!");

            }

            else
            {
                MessageBox.Show("Please select item");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void sections_SelectedIndexChanged(object sender, EventArgs e)
        {
           
            if (sections.SelectedIndex != -1)
            {
                GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
     
            }
            else
            {
                MessageBox.Show("Please select item");
            }
        }

        #region scanoffsetstolistbox
        private void sections_DoubleClick(object sender, EventArgs e)
        {
            pkzips.Items.Clear();
            zlibbox.Items.Clear();
            GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
            byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
            finalpkzipposs = ifftemp.Length;
            GetPositionAfterMatchCustom(ifftemp);
            GetPositionAfterMatchCustomZlib(ifftemp);

            pkzips.DataSource = pkchunkslist;
            logbox.Items.Add("Scanned " + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");

        }
        #endregion

        #region extractallpkzipsfromiffs
        private void button2_Click(object sender, EventArgs e)
        {
            int sectionindex = 0;
            while (sectionindex < sections.Items.Count)
            {
                sections.SelectedIndex = sectionindex;
                fullPKexport(sectionindex);
                sectionindex = sectionindex + 1;
                pkchunkslist.Clear(); //clear pkzip list of offsets
                zlibbox.Items.Clear(); //clear zlibbs
            }
            MessageBox.Show("DONE!");
        }
        #endregion

    }
}




Hope others will continue work since i wont be able in next 7-10 days for sure...
Cheers

Re: [NBA2K15 PC] Tutorial - Managing files [ C# Tutorial and SourceCode ]

Wed Nov 05, 2014 7:30 am

Thank you very much. (Y)

Re: [NBA2K15 PC] Tutorial - Managing files [ C# Tutorial and SourceCode ]

Thu Nov 06, 2014 12:26 am

no probs

i will post another tutorial
that one will be about file research

Re: [NBA2K15 PC] Tutorial - Managing files [ C# Tutorial and SourceCode ]

Sat Nov 08, 2014 2:16 pm

Thank you Nesa! You've opened the door for a whole new level of modding. It's great to get an insight into what goes into making these tools.

I'm looking forward to reading the file research tutorial.

Re: [NBA2K15 PC] Tutorial - Managing files [ C# Tutorial and SourceCode ]

Fri Nov 14, 2014 12:55 pm

Which version of Visual Studio do you advise?
Post a reply