Register for your free account! | Forgot your password?

You last visited: Today at 16:19

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Opinions on code.

Discussion on Opinions on code. within the CO2 Private Server forum part of the Conquer Online 2 category.

Reply
 
Old   #1
 
12k's Avatar
 
elite*gold: 0
Join Date: Jul 2011
Posts: 218
Received Thanks: 33
Opinions on code.

Just curious on some opinions on this DB system im kind of laying out. Haven't tested nor implemented this yet, just want some ideas if u will. My thoughts is that this will prevent having to create indexes etc in SQL, yet still making it so your server doesnt have to sort through a massive item list.

Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace Database
{
    public class Database
    {
        private string DBPath = "";
        public Database(string AccountName)
        {
            this.DBPath = "Accounts/" + AccountName;
            if (!Directory.Exists(this.DBPath))
            {
                Directory.CreateDirectory(this.DBPath);
                Directory.CreateDirectory(this.DBPath + "/Items");
                Directory.CreateDirectory(this.DBPath + "/Friends");
                Directory.CreateDirectory(this.DBPath + "/Enemies");
                Directory.CreateDirectory(this.DBPath + "/Logs");
                Directory.CreateDirectory(this.DBPath + "/Skills");
                Directory.CreateDirectory(this.DBPath + "/Profs");
            }
        }
        public IDictionary<uint, ConquerItem> LoadItems()
        {
            IDictionary<uint, ConquerItem> Items = new Dictionary<uint, ConquerItem>();
            foreach (string FileName in Directory.GetFiles(this.DBPath + "/Items"))
            {
                uint ItemUID;
                if (uint.TryParse(FileName, out ItemUID))
                {
                    BinaryReader BR = new BinaryReader(new FileStream(this.DBPath + "/Items/" + FileName, FileMode.Open));
                    ConquerItem Item = new ConquerItem();
                    Item.UID = ItemUID;
                    Item.ItemID = BR.ReadUInt32(); //0-4
                    Item.Durability = BR.ReadUInt16(); //4-6
                    Item.Position = BR.ReadByte(); //6-7
                    Item.SocketOne = BR.ReadByte(); //7-8
                    Item.SocketTwo = BR.ReadByte(); //8-9
                    Item.Plus = BR.ReadByte(); //9-10
                    Item.Bless = BR.ReadByte(); //10-11
                    Item.Locked = BR.ReadByte(); //11-12
                    Item.Enchant = BR.ReadByte(); //12-13
                    Item.Color = BR.ReadByte(); //13-14
                    Item.ExtraAttribute = BR.ReadByte(); //14-15
                    int OwnerLen = BR.ReadByte(); //15-16
                    Item.Owner = ASCIIEncoding.ASCII.GetString(BR.ReadBytes(OwnerLen)); //16-32 max (16 digit account length)
                    BR.BaseStream.Close();
                    BR.Close();
                }
            }
            return Items;
        }
        public void AddItem(ConquerItem Item)
        {
            BinaryWriter BW = new BinaryWriter(new FileStream(this.DBPath + "/Items/" + Item.UID, FileMode.Create));
            BW.Write(Item.UID);
            BW.Write(Item.ItemID);
            BW.Write(Item.Durability);
            BW.Write(Item.Position);
            BW.Write(Item.SocketOne);
            BW.Write(Item.SocketTwo);
            BW.Write(Item.Plus);
            BW.Write(Item.Bless);
            BW.Write(Item.Locked);
            BW.Write(Item.Enchant);
            BW.Write(Item.Color);
            BW.Write(Item.ExtraAttribute);
            BW.Write((byte)Item.Owner.Length);
            BW.Write(Item.Owner);
            BW.BaseStream.Close();
            BW.Close();
        }
        public void UpdateItem(uint ItemUID, Enums.ItemUpdateType UpdateType, uint Value)
        {
            BinaryWriter BW = new BinaryWriter(new FileStream(this.DBPath + "/Items/" + ItemUID, FileMode.Open));
            byte Position = 0;
            switch (UpdateType)
            {
                case Enums.ItemUpdateType.UID:
                case Enums.ItemUpdateType.Owner:
                    {
                        BW.BaseStream.Close();
                        BW.Close();
                        return;
                    }
                case Enums.ItemUpdateType.ID: Position = 0; break;
                case Enums.ItemUpdateType.Durability: Position = 4; break;
                case Enums.ItemUpdateType.Position: Position = 6; break;
                case Enums.ItemUpdateType.SocketOne: Position = 7; break;
                case Enums.ItemUpdateType.SocketTwo: Position = 8; break;
                case Enums.ItemUpdateType.Plus: Position = 9; break;
                case Enums.ItemUpdateType.Bless: Position = 10; break;
                case Enums.ItemUpdateType.Locked: Position = 11; break;
                case Enums.ItemUpdateType.Enchant: Position = 12; break;
                case Enums.ItemUpdateType.Color: Position = 13; break;
                case Enums.ItemUpdateType.ExtraAttribute: Position = 14; break;
                default: break;
            }
            BW.Seek(Position, SeekOrigin.Begin);
            BW.Write(Value);
            BW.BaseStream.Close();
            BW.Close();
        }
        public void UpdateItem(uint ItemUID, Enums.ItemUpdateType UpdateType, ushort Value)
        {
            BinaryWriter BW = new BinaryWriter(new FileStream(this.DBPath + "/Items/" + ItemUID, FileMode.Open));
            byte Position = 0;
            switch (UpdateType)
            {
                case Enums.ItemUpdateType.UID:
                case Enums.ItemUpdateType.Owner:
                    {
                        BW.BaseStream.Close();
                        BW.Close();
                        return;
                    }
                case Enums.ItemUpdateType.ID: Position = 0; break;
                case Enums.ItemUpdateType.Durability: Position = 4; break;
                case Enums.ItemUpdateType.Position: Position = 6; break;
                case Enums.ItemUpdateType.SocketOne: Position = 7; break;
                case Enums.ItemUpdateType.SocketTwo: Position = 8; break;
                case Enums.ItemUpdateType.Plus: Position = 9; break;
                case Enums.ItemUpdateType.Bless: Position = 10; break;
                case Enums.ItemUpdateType.Locked: Position = 11; break;
                case Enums.ItemUpdateType.Enchant: Position = 12; break;
                case Enums.ItemUpdateType.Color: Position = 13; break;
                case Enums.ItemUpdateType.ExtraAttribute: Position = 14; break;
                default: break;
            }
            BW.Seek(Position, SeekOrigin.Begin);
            BW.Write(Value);
            BW.BaseStream.Close();
            BW.Close();
        }
        public void UpdateItem(uint ItemUID, Enums.ItemUpdateType UpdateType, byte Value)
        {
            BinaryWriter BW = new BinaryWriter(new FileStream(this.DBPath + "/Items/" + ItemUID, FileMode.Open));
            byte Position = 0;
            switch (UpdateType)
            {
                case Enums.ItemUpdateType.UID:
                case Enums.ItemUpdateType.Owner:
                    {
                        BW.BaseStream.Close();
                        BW.Close();
                        return;
                    }
                case Enums.ItemUpdateType.ID: Position = 0; break;
                case Enums.ItemUpdateType.Durability: Position = 4; break;
                case Enums.ItemUpdateType.Position: Position = 6; break;
                case Enums.ItemUpdateType.SocketOne: Position = 7; break;
                case Enums.ItemUpdateType.SocketTwo: Position = 8; break;
                case Enums.ItemUpdateType.Plus: Position = 9; break;
                case Enums.ItemUpdateType.Bless: Position = 10; break;
                case Enums.ItemUpdateType.Locked: Position = 11; break;
                case Enums.ItemUpdateType.Enchant: Position = 12; break;
                case Enums.ItemUpdateType.Color: Position = 13; break;
                case Enums.ItemUpdateType.ExtraAttribute: Position = 14; break;
                default: break;
            }
            BW.Seek(Position, SeekOrigin.Begin);
            BW.Write(Value);
            BW.BaseStream.Close();
            BW.Close();
        }
        public void UpdateItem(uint ItemUID, Enums.ItemUpdateType UpdateType, string Value)
        {
            BinaryWriter BW = new BinaryWriter(new FileStream(this.DBPath + "/Items/" + ItemUID, FileMode.Open));
            BW.Seek(15, SeekOrigin.Begin);
            BW.Write((byte)Value.Length);
            BW.Write(Value);
            BW.BaseStream.Close();
            BW.Close();
        }
        public void RemoveItem(uint ItemUID)
        {
            File.Delete(this.DBPath + "/Items/" + ItemUID);
        }
        public IList<string> LoadFriends()
        {
            IList<string> Friends = new List<string>();
            foreach (string FileName in Directory.GetFiles(this.DBPath + "/Friends"))
                Friends.Add(FileName);
            return Friends;
        }
        public void AddFriend(string FriendName)
        {
            File.Create(this.DBPath + "/Friends/" + FriendName);
        }
        public void RemoveFriend(string FriendName)
        {
            File.Delete(this.DBPath + "/Friends/" + FriendName);
        }
        public IList<string> LoadEnemies()
        {
            IList<string> Enemies = new List<string>();
            foreach (string FileName in Directory.GetFiles(this.DBPath + "/Enemies"))
                Enemies.Add(FileName);
            return Enemies;
        }
        public void AddEnemy(string EnemyName)
        {
            File.Create(this.DBPath + "/Enemies/" + EnemyName);
        }
        public void RemoveEnemy(string EnemyName)
        {
            File.Delete(this.DBPath + "/Enemies/" + EnemyName);
        }
        public IDictionary<ushort, byte> LoadSkills()
        {
            IDictionary<ushort, byte> Skills = new Dictionary<ushort, byte>();
            foreach (string FileName in Directory.GetFiles(this.DBPath + "/Skills"))
            {
                ushort SkillID;
                if (ushort.TryParse(FileName, out SkillID))
                {
                    BinaryReader BR = new BinaryReader(new FileStream(this.DBPath + "/Skills/" + FileName, FileMode.Open));
                    Skills.Add(SkillID, BR.ReadByte());
                    BR.BaseStream.Close();
                    BR.Close();
                }
            }
            return Skills;
        }
        public void AddSkill(ushort SkillID, byte Level)
        {
            BinaryWriter BW = new BinaryWriter(new FileStream(this.DBPath + "/Skills/" + SkillID, FileMode.Create));
            BW.Write(Level);
            BW.BaseStream.Close();
            BW.Close();
        }
        public void RemoveSkill(ushort SkillID)
        {
            File.Delete(this.DBPath + "/Skills/" + SkillID);
        }
        public IDictionary<ushort, byte> LoadProfs()
        {
            IDictionary<ushort, byte> Profs = new Dictionary<ushort, byte>();
            foreach (string FileName in Directory.GetFiles(this.DBPath + "/Profs"))
            {
                ushort ProfID;
                if (ushort.TryParse(FileName, out ProfID))
                {
                    BinaryReader BR = new BinaryReader(new FileStream(this.DBPath + "/Profs/" + FileName, FileMode.Open));
                    Profs.Add(ProfID, BR.ReadByte());
                    BR.BaseStream.Close();
                    BR.Close();
                }
            }
            return Profs;
        }
        public void AddProf(ushort ProfID, byte Level)
        {
            BinaryWriter BW = new BinaryWriter(new FileStream(this.DBPath + "/Profs/" + ProfID, FileMode.Create));
            BW.Write(Level);
            BW.BaseStream.Close();
            BW.Close();
        }
        public void RemoveProf(ushort ProfID)
        {
            File.Delete(this.DBPath + "/Profs/" + ProfID);
        }
    }
}
12k is offline  
Old 03/17/2013, 19:14   #2


 
Korvacs's Avatar
 
elite*gold: 20
Join Date: Mar 2006
Posts: 6,125
Received Thanks: 2,518
SQL makes this redundant, it wont scale.
Korvacs is offline  
Old 03/17/2013, 21:34   #3
 
elite*gold: 21
Join Date: Jul 2005
Posts: 9,193
Received Thanks: 5,376
^

Flatfile systems (no matter how you implement it outside of essentially writing your own relational database software) do not scale as you add more and more entries/tables/columns and rule out using incredibly powerful tools such as sql syntax to retreive data.


I think Korv has argued over this a number of times and it all boils down to why re-invent the wheel? Database systems were created to make up for the shortcomings of flat file databases. As such any flatfile database system you might create will almost certainly fall short of any public database system out there and if you're willing to put enough work into it to make it a competitive alternative then... that's its own (rather advanced) project and not something to be considered as part of something like a pserver project.


TL: DR - use a database system if you need scaleability (large number of entries that are interconnected) and use flatfile if you need relatively static data dumps that don't need to be heavily processed or retrieved/edited constantly.
pro4never is offline  
Reply


Similar Threads Similar Threads
opinions
02/12/2013 - CO2 Private Server - 0 Replies
may i have your opinions on the site? take a vote please (the sites just a base for now) http://img10.imageshack.us/img10/9386/websitef.pn g
Some opinions where could be...
11/12/2012 - Shaiya Private Server - 5 Replies
Hello everyone, on shaiya korea client i can't find in any ways the game.exe IP... HxD cannot find CONFIG Shaiya Patcher ( on ip changer exe) cannot change the IP unknown location... Does anyone have any ideea where it could be or has the IP already? Korea client wismatch alot with other game.exe from EN client...the important thing is the interface that items were not placed correctly with other game.exe. Thanks in advance :)
Need Your Opinions
03/07/2011 - Grand Chase Philippines - 13 Replies
I just got my Sieghart leveled to 59, but my armor is still a Dark Flame Set which is for a level 40. So I'm planning on getting an Epic Set this Gacha for my Sieghart but the armor looks ugly. So...........If you were me, would you still buy it despite it looking like that? I'm also thinking hard about it because its also a great chance to get that Kumi Pet. And also, does the Steampunk Savant Set look ugly to you? P.S. What is the lvl requirement and stats of that Expedition Mask? ...
Need Opinions!!!
09/16/2008 - SRO Private Server - 7 Replies
I need some opinions on some good SRO Pservers no flames please :bandit:
need opinions
08/10/2007 - General Gaming Discussion - 2 Replies
well i guess im just wondering if its just a waste of my time or somthing but im making a runescape bot... i guess... i havent gotten to far but just wondering if i should just quit it and just make one for another game.



All times are GMT +2. The time now is 16:19.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.