Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Welcome to our site

Take a moment to join our board


Comet - Open Source Conquer Online Server

Recommended Posts


Comet is a Conquer Online server project containing an account server and game server. The account server authenticates players, while the game server services players in the game world. This simple two-server architecture acts as a good introduction into server programming and networking. The server is interoperable with the Conquer Online game client, patch 5017 (not provided by this project).


This project was initially created for an interview as a 3-week programming project. Now, it's a base source that I'm opening up to the community. Feel free to add to it and submit push requests. I'm mostly active on my GitLab account, but feel free to hit me up on Discord or Cooldown if I don't get to things soon enough.


Source Control: https://gitlab.com/spirited/comet
Readme: https://gitlab.com/spirited/comet/blob/master/Readme.md
Issue Tracker: https://gitlab.com/spirited/comet/issues
Storyboard: https://trello.com/b/tb8ChBlF/comet 

  • Like 3

Share this post

Link to post
Share on other sites

It's been about 5 years since I've done anything Conquer related. Had the itch to dink around with it again. Excited to try your source and especially exited that it's on git and vscode. Thanks spritied. Former epvper myself.

  • Like 2

Share this post

Link to post
Share on other sites
10 hours ago, Grrowley said:

It's been about 5 years since I've done anything Conquer related. Had the itch to dink around with it again. Excited to try your source and especially exited that it's on git and vscode. Thanks spritied. Former epvper myself.

Cool, I hope you get a small kick out of it. It really is bare bones right now, though. It logs in and that's it. I hope others will pick it up and contribute, but only time will tell. I know I have too many projects going on to work on it right now. Hope you get something from it, at the least. Let me know if there's anything I can help with, too. 

Share this post

Link to post
Share on other sites
23 minutes ago, Spuzzum said:

Okay, so I'm starting World Conquer v4 with this XD

Yey!! I'm so glad. Let me know if you have any questions.

Share this post

Link to post
Share on other sites

First, I just want to thank a few of you for your interest and feedback on this source. I received concerns regarding how Comet utilizes channels and tasks, and so I made some improvements. I increased the number of channels to one per background service task. This means clients will now be assigned a specific worker based on availability rather than letting any worker process packets from that client. That should guarantee that packets from the client aren't accidentally processed out of order. Since this is the project's first major update, I also updated its dotnet core version to 3.1 and cleared it of all vetting issues. Additionally, packet processing is now using the async-await pattern. I'm not entirely confident in my understanding of Tasks, so please review if you have time. Thanks.

Share this post

Link to post
Share on other sites

This is going to be my last modification with Comet for a while, besides basic branch maintenance. I improved character creation by randomizing character appearances and spawning new characters in Birth Village. Random numbers are being generated by a new service using the async-await pattern and a bound channel. That way, the server can generate random numbers reliably across multiple threads without locking. And with that, Chimera calls. Thanks for the feedback I've gotten, and I hope you all contribute to the project. Cheers.

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Nyorai
      Conquer Origins was brought to existence as a way to replicate the prime days of the popular and beloved multiplayer game Conquer Online. Throughout the years, many things have changed in the game, shifting it completely from its essence what from what veterans remember it for. Our goal at Conquer Origins is to provide a small niche of people with the opportunity to relive those days once again, meeting new people whom they may one day call friends and create a few more memories of the game to remember.
      The main focus we have is to please our community and make sure that everyone who join us is having a great time. Therefore, feedback is something extremely valued by us and it's something we're consistenly asking from our community as it is the only way for us to understand everyone's needs and what direction the server should take.
      Our history
      We're certain most people have either heard or played our very first server: Shannara. It has run for 3+ years, was the most populated classic server for almost 2 years and has given us both the experience and the motivation to run a server and manage communities. Last summer, the community that was playing at the time requested us to work on a new server with lower rates, without some of the custom content we had at Shannara and with some improvements in terms of quality of life (QoL) gameplay, amongst many other things. For nearly a year we restructured most of the Shannara source (that already had 3+ years of work in it) and tried to squeeze out every single bug we could find. We believe Shannara has put out tons of groundbreaking and unique content and with Origins we expect not only to keep that legacy but make it even better.
      What can you expect?
      Level 130 as the maximum level you can achieve All official monsters and default spawns locations Maximum composition level being the original +9 All official quests and events there were in the game Identical calculations for Experience, Damage, etc. Identical algorithms for all sort of spells (Line, Fan, Collide, etc.) Original classes (Archer, Warrior, Trojan, Water, Fire) Original composition system What have we improved?
      Possibility to run the game at Fullscreen and custom resolutions Increased view/jump range Set custom FPS limit according to your needs Modern Quality of Life features to enhance the player experience Custom power-leveling matching system Custom Anticheat to prevent players from using hacks/cheats Implemented support for custom cosmetics (weapon skins) Custom launcher that lets you customize your game client Our rates
      When Conquer Origins was launched, we knew there were going to be bugs and lots of balancing to be done due to the fact we had restructured most of the source. Therefore, we made the decision to launch the server with really low rates without any multipliers meaning they were identical to the official rates. We have ran the server like that for a few months now and only recently we've significantly buffed the rates which will allow new players to easily catch up with the ones who've been testing and helping improve the server. Since rates may suffer some changes from time to time or due to special events, we'll be leaving an URL at the end of the thread where you'll be able to check the current rates at all times.
      Custom Content
      Ever since the release of Origins we have been putting out custom content that is improving the gameplay of our community. I'll be leaving some screenshots of features that include but are not limited to: user-friendly voting system that will remind you when you can vote again, quest dialog where you can check your available quests, advanced mining and hunting options for VIP players, changelog that will let you check all the new and previous changes, ground items displaying the item quality and composition and much more.
      Visit us: https://www.conquerorigins.com/
      Check our rates: https://www.conquerorigins.com/Statistics/Rates
      Join us on Discord: https://discord.gg/wX2K7sG

    • By W1cked
      I had help from @Spirited to figure this stuff out and port it to Go. I know a lot of people in the emulator communities don't use Go, but I hope with more packages released it will lift the barrier for people to use it.
      It's pretty straight forward, use the NewRC5 method instead of a struct literal. Encrypt by calling Encrypt and supplying a dst byte slice the same size as the src slice. For Decrypting, do the same thing.

      This adheres to the Cipher.Block interface, so for your client/conn structs you can just use that interface type.
      package rc5 import ( "encoding/binary" "math/bits" ) const ( WordSize = 16 Rounds = 12 KeySize = WordSize / 4 SubSize = 2 * (Rounds + 1) ) type RC5 struct { Key []uint32 Sub []uint32 } func NewRC5() RC5 { c := RC5{} c.Key = make([]uint32, KeySize) c.Sub = make([]uint32, SubSize) //Conquer default key c.generateKeys([]byte{ 0x3C, 0xDC, 0xFE, 0xE8, 0xC4, 0x54, 0xD6, 0x7E, 0x16, 0xA6, 0xF8, 0x1A, 0xE8, 0xD0, 0x38, 0xBE, }) return c } func (r *RC5) generateKeys(buf []byte) { //Initialize key expansion //seedLength := len(buf) / WordSize * WordSize for i := 0; i < KeySize; i++ { r.Key[i] = binary.LittleEndian.Uint32(buf[i*4:]) } //Generate r.Sub r.Sub[0] = 0xB7E15163 for i := 1; i < SubSize; i++ { r.Sub[i] = r.Sub[i-1] - 0x61C88647 } //Generate key vector var a, b uint32 var i, j int for x := 0; x < 3*SubSize; x++ { r.Sub[i] = bits.RotateLeft32(r.Sub[i]+(a+b), 3) a = r.Sub[i] r.Key[j] = bits.RotateLeft32(r.Key[j]+(a+b), int(a+b)) b = r.Key[j] i = (i + 1) % SubSize j = (j + 1) % KeySize } } func (r *RC5) Encrypt(dst, src []byte) { length := len(src) / 8 if (len(src) % 8) > 0 { length = length + 1 } copy(dst, src) for word := 0; word < length; word++ { a := binary.LittleEndian.Uint32(dst[8*word:]) + r.Sub[0] b := binary.LittleEndian.Uint32(dst[(8*word + 4):]) + r.Sub[1] for round := 1; round <= Rounds; round++ { a = bits.RotateLeft32(a^b, int(b)) + r.Sub[2*round] b = bits.RotateLeft32(b^a, int(a)) + r.Sub[2*round+1] } binary.LittleEndian.PutUint32(dst[8*word:], a) binary.LittleEndian.PutUint32(dst[8*word+4:], b) } } func (r *RC5) Decrypt(dst, src []byte) { length := len(src) / 8 if (len(src) % 8) > 0 { length = length + 1 } copy(dst, src) for word := 0; word < length; word++ { a := binary.LittleEndian.Uint32(dst[8*word:]) b := binary.LittleEndian.Uint32(dst[(8*word)+4:]) for round := Rounds; round > 0; round-- { b = bits.RotateLeft32(b-r.Sub[2*round+1], -int(a)) ^ a a = bits.RotateLeft32(a-r.Sub[2*round], -int(b)) ^ b } binary.LittleEndian.PutUint32(dst[8*word:], a-r.Sub[0]) binary.LittleEndian.PutUint32(dst[8*word+4:], b-r.Sub[1]) } } func BlockSize() int { return 8 }  
    • By Spirited
      This is a simple command-line tool for editing portals in dmaps. It outputs a list of portals from a dmap in the format index,x,y, and allows you to write them back to the dmap in the same format. It can be compiled for Windows, Linux, or Mac using the Golang compiler, and I have attached the Windows build of the tool. I wrote the tool in about an hour, so it's a bit messy, but all open source and MIT licensed for whoever wants to do something with it. Figured that I'd write it on the third request.

Important Information

By using this site, you agree to our Terms of Use.