epvp*coders project #0001

06/30/2006 14:40 CyRuSTheViRuS#1
epvp*coders project #0001
Codename : Loki

[Only registered and activated users can see links. Click Here To Register...]

.:: Status ::.
AccountServer Emulator : 100%
CharServer Emulator : 100%
ZoneServer Emulator : 3%

Source : [Only registered and activated users can see links. Click Here To Register...]

Wer versuchen will den Server mal aufzusetzen sollte am besten noch n MySQL Server laufen haben und da folgendes Script ausführen.
Man sollte außerdem noch einen User anlegen mit den Benutzerdaten loki/magicalmirror. Außer ihr änderts halt im Code.

Code:
# MySQL-Front 3.2 (Build 14.8)

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES latin1 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='SYSTEM' */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */;
/*!40101 SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */;
/*!40103 SET SQL_NOTES='ON' */;


# Host: localhost  Database: loki
# ------------------------------------------------------
# Server version 5.0.22-community-nt

DROP DATABASE IF EXISTS `loki`;
CREATE DATABASE `loki` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `loki`;

#
# Table structure for table accounts
#

CREATE TABLE `accounts` (
 `AccountID` int(11) NOT NULL default '0',
 `Username` text NOT NULL,
 `Password` text NOT NULL,
 `SessionID1` int(11) NOT NULL default '0',
 `SessionID2` int(11) NOT NULL default '0',
 `Registration_Date` datetime NOT NULL default '0000-00-00 00:00:00',
 `LastIP` text NOT NULL,
 PRIMARY KEY (`AccountID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

#
# Dumping data for table accounts
#

INSERT INTO `accounts` VALUES (10000,'cyrus','master',76741,0,'0000-00-00 00:00:00','127.0.0.1');

#
# Table structure for table characters
#

CREATE TABLE `characters` (
 `CharID` int(11) NOT NULL auto_increment,
 `CharSlot` int(11) default '0',
 `AccountID` int(11) default '0',
 `CharName` text,
 `Class` int(11) default '0',
 `BaseExp` int(11) default '0',
 `BaseLevel` int(11) default '0',
 `JobExp` int(11) default '0',
 `JobLevel` int(11) default '0',
 `State` int(11) default '0',
 `Ailments` int(11) default '0',
 `Option_` int(11) default '0',
 `Zeny` int(11) default '0',
 `HP` int(11) default '0',
 `MaxHP` int(11) default '0',
 `SP` int(11) default '0',
 `MaxSP` int(11) default '0',
 `Karma` int(11) default '0',
 `Manner` int(11) default '0',
 `StatusPoints` int(11) default '0',
 `SkillPoints` int(11) default '0',
 `HairColor` int(11) default '0',
 `HairStyle` int(11) default '0',
 `STR` int(11) default '0',
 `AGI` int(11) default '0',
 `DEX` int(11) default '0',
 `INT_` int(11) default '0',
 `LUK` int(11) default '0',
 `VIT` int(11) default '0',
 `HeadTop` int(11) default '0',
 `HeadMid` int(11) default '0',
 `HeadBtm` int(11) default '0',
 `ClothesColor` int(11) default '0',
 PRIMARY KEY (`CharID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

#
# Dumping data for table characters
#

INSERT INTO `characters` VALUES (9,0,10000,'CyRuS',0,0,1,0,1,0,0,0,800,50,50,20,20,0,0,0,0,0,1,9,9,9,1,1,1,0,0,0,0);
INSERT INTO `characters` VALUES (11,1,10000,'CyRuS2',0,0,1,0,1,0,0,0,800,50,50,20,20,0,0,0,0,0,1,9,9,9,1,1,1,0,0,0,0);

#
# Table structure for table serverinfo
#

CREATE TABLE `serverinfo` (
 `id` int(11) NOT NULL auto_increment,
 `ServerType` int(11) default NULL,
 `ServerName` text,
 `ServerPort` int(11) default NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

#
# Dumping data for table serverinfo
#

INSERT INTO `serverinfo` VALUES (1,1,'Loki - Main',4500);

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

.:: ChangeLog ::.

Quote:
Originally posted by old

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Feedbacks : [Only registered and activated users can see links. Click Here To Register...]

PS: Ich arbeite nun alleine an dem Projekt, da ich mich auf meine "Mitarbeiter" nicht verlassen konnte.
Ich werde das nun auch alleine durchziehen, is einfacher so als wenn ich mich dauernd auf irgendwen verlassen muss und am Ende nix kommt.
07/11/2006 20:01 CyRuSTheViRuS#2
Update 11.07.06
---------------------
AccountServer funktioniert nun.
Base endgültig fertiggestellt.
Jegliche Funktionen und Methoden (SQL, MultiThreading, Socket...) wurden erneut überarbeitet.
AccountServer kann mehrere hundert Anfragen in wenigen Sekunden bearbeiten. Die Frage ob MySQL dann noch mithällt is ne andere ;D
07/13/2006 16:01 CyRuSTheViRuS#3
Update 13.07.06
---------------------
Da ich wenig Zeit während der Woche habe, solang ich noch keine Ferien hab, nur ein kleines Update.

Threading überarbeitet...
-AccountServer hat beim warten auf Verbindungen ab und zu gelaggt.
Multiple CharServer Support eingebaut (Siehe Screenshot)
07/16/2006 17:28 CyRuSTheViRuS#4
Update 16.07.06
---------------------
AccountServer abgeschlossen!
-Wird nur noch bei Gelegenheit auf Bugs untersucht und geupdated.
CharacterServer angefangen
-Charliste kann nun angezeigt werden (siehe Screenshot)

ToDo:
-Character erstellen
-Character löschen
07/20/2006 11:09 CyRuSTheViRuS#5
Update 20.07.06 . 2
---------------------
CharacterServer abgeschlossen
-Wird nur noch bei bedarf auf bugs gefixt
ZoneServer begonnen
Auth funzt.
Man kann schonmal ingame stehen ;) (siehe Screenshot)



Update 20.07.06
---------------------
CharacterServer überarbeitet
-Krims Krams ... Funktionen neugeschrieben usw usw
Character anzeigen funktioniert nun (siehe Screenshot)
Character erstellen auch (siehe Screenshot)
Das Lösch Feature wird wahrscheinlich schnell eingebaut sein.
Dannach gehts gleich weiter mit ZoneServer

ToDo:
-Character löschen
-ZoneServer
09/21/2006 15:45 CyRuSTheViRuS#6
Joa, hier mal der Source, für alle die es interessiert.
Vorweg noch etwas :
Mein Coding-Stil ist vielleicht nicht perfekt oder optimal, reicht mir aber aus.
Codeoptimierung liegt da bis jetzt nicht wirklich vor nur in sofern wie ichs während dem Coden vorgenommen habe.
Tipps, Vorschläge (die den Code) betreffen können gerne gepostet werden.

Source: [Only registered and activated users can see links. Click Here To Register...]
09/21/2006 17:40 SilonVier#7
Hi Virus, ich finde es gut das du den Quellcode veröffentlicht hast :-)

Quote:
Originally posted by CyRuSTheViRuS@Sep 21 2006, 15:45
Tipps, Vorschläge (die den Code) betreffen können gerne gepostet werden.
Hmm ok :D :

Punkt 1:

Diverse SQL-Injection Lücken (z. B. folge Username) - auch wenn sich da nicht sehr viel Code einschleusen lässt.
Mir persönlich gefällt der SqlHelper den du verwenden kannst, das ganze würde beispielsweise so Aussehen (C#):
Code:
return ( int )SqlHelper.ExecuteScalar(
  Configuration.DatabaseConnection,
  CommandType.Text,
  @"
  	SELECT COUNT([Text]) FROM dbo.CategoryNames
  	WHERE [Text] = @CatName
  ",
  new SqlParameter( "@CatName", catName )
  ) > 0;
Damit ist auch keine SQL Injection mehr möglich.


Punkt 2:

Deine Konfigurationen, beispielsweise die DatabaseConnection (die du mehrfach in irgendwelchen Funktionen setzt), kann in die "App.Config" und du greifst mit
Code:
ConfigurationSettings.AppSettings[ "DatabaseConnection" ];
darauf zu. Optimal eine Configuration.cs/vb und da eine Property :-)


Punkt 3:

Da es sich um eine WinForm handelt, kannst du ruhig die DBConnection beim Start öffnen und beim beenden der Applikation schließen. Bei Multithreading sollte man auf die Verfügbarkeit in den jeweiligen Threads achten.
Hier ist auch ganz gut eine Property zu gebrauchen. Beim get prüfst du ob du schon eine hast und gibst die zurück, wenn nicht, dann erstellst du eine und gibst _die_ zurück ;-)


Punkt 4:

Funktionen die so ähnlich heissen wie "out6A00", "out6900" (von deiner verwendeten Konvention sollten die sowieso groß anfangen ;)), solltet du vermeiden. Wie wäre es vorne mit "SendPacket" und stehen die Byte 6A und 69 nicht für bestimmte Aktionen? - die könnte man in den Namen mit einbringen.


Punkt 5:

Hier erstmal ein Codeschnipsel wie du deine Charstruct ausliest:

Code:
    Dim CharacterName As String
...
    Player.Charname = CharacterName
    Player.STR = Packet.GetValue(26)
    Player.AGI = Packet.GetValue(27)
    Player.VIT = Packet.GetValue(28)
    Player.INT = Packet.GetValue(29)
    Player.DEX = Packet.GetValue(30)
    Player.LUK = Packet.GetValue(31)
Du könntest deine "Charakter" struct was die Größe angeht direkt der struct vom Spiel anpassen (z. B. richtige Datentypen, exakte Arraylänge beim Charnamen). So müsstest du nach dem Empfang des Packets einfach nur ab Beginn der struct mit der struct länge (müsste unter VB wohl auch sizeof sein) in deine struct einlesen und damit wäre der Teil mit weniger als 5 Zeilen erledigt :-)


Punkt 6:

Soweit ich das richtig gesehen habe, hast du ziemlich viel Code der in allen 3 Projekten verwendet wird und bei Änderungen müsstest du demnach an 3 Stellen das updaten. Du könntest z. B. eine neue Assembly erstellen, in der du den Code auslagerst und die von allen Projekten eingebunden wird.



Ich hoffe das waren einige brauchbare Vorschläge.
09/21/2006 18:43 CyRuSTheViRuS#8
Jo die Vorschläge bzw Tipps sind sehr brauchbar, danke dir erstmal und werde sie auf jedenfall berücksichtigen sobald ich mich mal wieder an das Projekt bzw etwas neues mache.
11/30/2006 04:26 .Unknow.#9
LOL
11/30/2006 04:30 evulhotdog#10
i would like test this, also play it
01/03/2007 16:36 css_cheatos#11
nur ma so ne frage kommt da noch was oder is der jetzt auf eis gesetzt ??