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


  • Content Count

  • Joined

  • Last visited

  • Days Won


Spirited last won the day on June 25

Spirited had the most liked content!

Community Reputation

77 Excellent


About Spirited

  • Rank
  • Birthday December 18


Recent Profile Visitors

4,012 profile views
  1. Hi all, Thank you for being members of Cooldown. It was over two years ago now that we opened Cooldown to help those looking for a cleaner and more engaging game developer's board; but in creating something new, we never really found our footing. Cooldown has brilliant bursts of fun and interesting activity, but these days we socialize differently, support projects differently, and find help differently. This board currently has no drive or purpose, and finding that drive for everyone has been challenging. Therefore, until we can find a purpose to follow through on which requires a board, we have decided to close Cooldown. What this will mean is that the board will be backed up and the server will be turned off in one week. We have debated some regarding the future of Cooldown, and though I support running a board for those interested, I believe more discussion is required before making such commitments. Our current board owner Smallxmac will no longer be with the staff, but I hope you all can join me in thanking him wholeheartedly and in wishing him the best of luck in his future projects and opportunities. Thanks again, it's been a fun two and a half years. Feel free to follow up with me via private messages if you have questions. Best Regards, Spirited
  2. Spirited

    Packet Structure

    That's about how I got started as well. It just takes time and practice, like any other craft. About RC4, it was very popular back in the day. TQ's cipher is completely in-house, but reminiscent of RC4. There were a lot of variants of RC4 around that time since it was discovered to be cryptographically broken a year before Conquer was released. That's also probably why the password cipher is in RC5 as added security on top of their RC4 variant. (Of course, these are all just running theories of mine).
  3. Spirited

    Packet Structure

    Conquer Online packets aren't very large, especially in earlier patches. It's pretty standard to use a 16KB buffer in networking, but you can probably get away with half or a quarter of that. 1KB might be cutting it close. Regarding the nonsense, the entire packet is currently encrypted using TQ's custom cipher. You'll need to write your own implementation in Python to decrypt it so you can read the username string (which is why I posted mine as a reference since I know Go is a bit closer to Python). Here's a tutorial on encryption in Python: https://www.tutorialspoint.com/cryptography_with_python/cryptography_with_python_quick_guide.htm Here's an example socket system as well for Conquer Online: https://gitlab.com/spirited/comet/-/blob/master/src/Comet.Network/Sockets/TcpServerListener.cs#L105 You should be able to recognize some of the major calls even though it's in another language. C# also implements the Berkeley sockets API, just like Python.
  4. Spirited

    Packet Structure

    Yeah, I remember a lot of students from my college started with Python and struggled a lot with data types as well once being introduced to C-syntax languages. Protocol design is very C-like though if you look at protobufs or binary based protocols like the one TQ developed for Conquer Online. It sounds like you're on the right track with understanding the binary header and body, but what you need to understand is how data types are stored in memory. For example, a 32-bit unsigned integer takes up 4 bytes (a byte being the smallest addressable unit in memory). When you look at a hex dump of an integer, you'll see 4 sets of 2 digit fields. The order of those fields are determined by byte ordering. In Little Endian, you read the bytes in backwards. So if you have 10 27 00 00, that's 0x2710 (which is 10,000 in decimal). Big Endian is used more in hashing algorithms and ciphers, and you read bytes forwards. So that same number would be 00 00 27 10 (a bit more straight forward). Network protocols like TQ's binary protocol use Little Endian because you can truncate fields in packing algorithms easier. Going to your packet hex dump, what code did you write to spit that out? If you want something a bit better that follows unix packet dump format, you can try this package: https://pypi.org/project/hexdump/ Post something from that and it'll be a lot easier to see what's going on. Finally, you should know that the Conquer Online client encrypts its packets. If you're not decrypting them on arrival to the server, then you're going to get a lot of nonsense. Here's the cipher used in 5017 written in C# (link). Optionally, I wrote the cipher as part of my project in Golang as an XOR cipherstream. You're totally welcome to use it and port it to Python (would be cool if you made a release here for it). Let me know if you have any other questions. Good luck! // Package tq implements TQ Digital Entertainment's XOR cipher using the `cipher.Stream` // interface from the `crypto` package. This cipher appears to be a stream in-house // variant of RC4, which is cryptographically broken and should not be used for secure // applications unless for the purposes of interoperability with legacy applications. package tq import ( "crypto/cipher" "io" ) var ( defaultSeed uint64 = 0x6d5c796213fa0f9d defaultKey *Key = NewKey(defaultSeed) ) // Stream is an instance of TQ's XOR stream cipher, initialized with a seeded key. Stream // implements Golang's `cipher.Stream` interface. Keys can be initialized separately from // the stream, and can be shared between multiple streams. type tqStream struct { bytes uint32 *Key } // New instantiates a new instance of `tqStream`. The key argument should be of type `Key`, // and may be a pointer to a shared key vector for all clients on login. If no key is // provided, the default will be used. func New(key *Key) cipher.Stream { if key == nil { key = defaultKey } stream := new(tqStream) stream.Key = key return stream } // NewStreamReader wraps a new cipher stream into an io.Reader. It calls `XORKeyStream` // to process each slice of data which passes through. Initializes the cipher with the // default key if none is specified. func NewStreamReader(input io.Reader, key *Key) *cipher.StreamReader { return &cipher.StreamReader { S: New(key), R: input } } // NewStreamWriter wraps a new cipher stream into an io.Writer. It calls `XORKeyStream` // to process each slice of data which passes through. If any Write call returns short // then the `StreamWriter` is out of sync and must be discarded. A `StreamWriter` has no // internal buffering; `Close` does not need to be called to flush write data. // Initializes the cipher with the default key if none is specified. func NewStreamWriter(output io.Writer, key *Key) *cipher.StreamWriter { return &cipher.StreamWriter { S: New(key), W: output } } // Reset the bytes counter to zero. func (stream *tqStream) Reset() { stream.bytes = 0 } // XORKeyStream sets dst to the result of XORing src with the key stream. Dst and src // must overlap entirely or not at all. func (stream *tqStream) XORKeyStream(dst, src []byte) { for i := 0; i < len(src); i++ { dst[i] = byte(src[i] ^ 0xAB) dst[i] = byte(dst[i] >> 4 | dst[i] << 4) dst[i] = byte(dst[i] ^ stream.low[stream.bytes & 0xFF]) dst[i] = byte(dst[i] ^ stream.high[stream.bytes >> 8]) stream.bytes++ } } package tq import ( "encoding/binary" ) // Key defines a cipher key structure which can be shared between multiple streams. The // key structure can be modified using a generator and new inputs from the game server; // however, this functionality was abandoned in favor of stronger cryptographic // algorithms in later client versions. type Key struct { low [0x100]byte high [0x100]byte } // NewKey returns a new Key structure with generated low and high vectors. The keys // can be generated using the default seed or any unsigned integer seed. func NewKey(seed uint64) *Key { key := new(Key) gen := make([]byte, 8) binary.LittleEndian.PutUint64(gen[:], seed) for i := 0; i < 0x100; i++ { key.low[i] = gen[0] key.high[i] = gen[4] gen[0] = byte((gen[1] + byte(gen[0] * gen[2])) * gen[0] + gen[3]) gen[4] = byte((gen[5] - byte(gen[4] * gen[6])) * gen[4] + gen[7]) } return key } // Generate was used in older versions of the Conquer Online client to generate new key // vectors after establishing a connection to the game server and receiving the first // packet. The packet contains the two key derivation variables: an account identifier // and an access token for the server. Returns a new key structure. func (key *Key) Generate(accountID, token uint32) *Key { result := new(Key) seed := uint32(((token + accountID) ^ 0x4321) ^ token) gen := make([]byte, 8) binary.LittleEndian.PutUint32(gen[0:], seed) binary.LittleEndian.PutUint32(gen[4:], uint32(seed * seed)) for i := 0; i < 0x100; i++ { result.low[i] = byte(key.low[i] ^ gen[i % 4]) result.high[i] = byte(key.high[i] ^ gen[4 + (i % 4)]) } return result }
  5. Spirited

    Private Servers: Getting Started

    Managing expectations This thread helps outline some of the expectations and guiding principles of programming and running a private server for Conquer Online. If you're here, then you're probably either interested in learning how to program using Conquer Online private servers or just want to run a server yourself. Do note, no server right now comes without bugs or problems, and so programming knowledge is highly recommended and eventually necessary. As much as some boards claim to have "fully fixed" projects, that is a scam that I urge you do not buy into. Downloading server projects and clients You can find and download projects for private servers here: The Conquer Online private server community is very old, and therefore most projects are undocumented and without setup guides. Feel free to create a guide and post it to this section if you feel compelled, or ask questions in a new thread. If the server you're downloading doesn't have a guide, then know that most servers require MySQL. Follow the directions in the guide above; most servers have a reference to the username and password login for the database somewhere in the code or a configuration file. All server projects have been written for a specific patch of the game client. When downloading a client, be sure to select the correct patch number which corresponds with your server project: Asking questions Due to the code being super old and this community being super new, we'll be playing some catch up for a while. In the meantime, it's important that you ask questions so we can fill in those gaps. Before asking a question though, check the wiki: If the development wiki can't help you out, then create a new thread here and be sure to include the following: Summary of the problem or issue you're experiencing What the expected behavior is and what the actual behavior you're experiencing is Screenshots and error logs showing the problem Detailed steps on how you reproduce the problem Including these details really helps get your questions answered properly and quickly. Learning how to program There are lots of resources online for learning the basics! I got started programming a decade ago on Conquer Online private servers by writing NPC dialog boxes and fixing small bugs, but I knew the basics before giving that a go (which I highly recommend). To get started with programming, I suggest following Microsoft's guide on C# (most of the sources here are in C#, but otherwise just google tutorials): https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/ It helps to make your own example projects. One really good first project is to make a small text-based adventure game. Maybe ask the player for their name, and then randomize some of their stats and have them fight against a monster with its own stats. You don't have to do that for your first project, but it's very important that you apply the lessons you learn (like you would in math). Good luck, and have fun with it.
  6. Spirited

    print("Hello World")

    Hey man, glad to see you're still around and improving so much. Hopefully we're all a little better than our past selves from a decade ago. Hahaha Regarding the wiki, you can clone the repo and contribute to it just like any other git repo. I personally use Visual Studio Code because I like the markdown previewer, but you can use whatever you want. Right now, you have to be assigned the project as a contributor (which I've only given to a select group of people right now). I don't think pull requests work on the wiki portion of GitLab (I'll have to ask about that). If you can forward me your GitLab username, that'd be great. That WoW emulator project looks pretty clean.
  7. Spirited

    Ratifying Section Rules

    Additionally, I plan on adding recommendations for what's expected from members in this section. It's pretty often that people are confused on how to get started, and I'd like to help clarify those expectations to help reduce spam. That said, if anyone wants to make tutorials for introductory subjects, that would help make the section more friendly to outside people. I plan on adding a few things as well when I get the time.
  8. Spirited

    Ratifying Section Rules

    Hi all, Similar to the last thread, I'd like to propose a new set of rules specifically for the Conquer Online section. Conquer Online private server development is notoriously spammed by bot requests and commission requests, so these rules aim to help reduce spam and keep the section on-topic. Just a reminder, commission requests, posting pirated software (TQ Binaries), and demands for completed code are already against the board rules, so they will not be mentioned here. Server advertising section has a separate set of rules as well. Feedback is very welcome if you think something is off or missing. No bot or client hack requests, this includes requests for client modifications No selling coding services, projects, or tools No posting or advertising compiled bot or hack executable files In addition, I'd like to make some recommendations for when posting questions: Include a short summary of the problem Include the behavior you were expecting vs. the actual behavior Include steps on how you reproduced the problem Include pictures and errors you encountered Thanks, Spirited
  9. Spirited

    [Clue] HP Bar on old clients

    Moved to the correct section.
  10. Spirited

    UI/UX Mocking with Adobe XD

    Yeah, I found with anything photography based or videography based... Adobe is still sadly untouched.
  11. Spirited

    UI/UX Mocking with Adobe XD

    I mean, they did have student discounts and 30-day trials before. Now they just have subscriptions. It's not great for anyone like me who does photography as a hobby, or for the common independent artist who has to pay for it. Competitors are already stealing their customers though with a non-subscription model, so there's still hope. It's all about that product features to price ratio. What's horrible though is that you can still buy the non-subscription based Lightroom 6 from their website, but they ended support for it. So to get my camera working, I have to either pirate a hacked version of Lightroom CC or use their media importer and convert everything first. Adobe is such a horrible company.
  12. Introduction I want to prefix this by saying I hate Adobe with a burning passion. They deserve every ounce of pirating they get for their anti-consumer subscription models. With that out of the way, there's no denying that Adobe makes decent products if not industry leading. Adobe XD is no exception; it's a great tool for UI/UX mocking. It feels like a mix between design and workflow modeling. It's a paid program now under a subscription model... but here's a link to download it for free (it's a promotion link they still have active, so get it while you still can I suppose). Capabilities So as the picture above shows, you can create screens that mimic various device types. Some templates include multiple iPhone and Android phone models, tablets, and full-width websites. You can also define custom resolution clients for game UI/UX mocking (if that interests you). The tool goes a bit beyond just UI mocking. Buttons and input fields can actually be used to navigate between screens with different transition effects to imitate the devices the app is designed for. You can also define landscape modes, responsiveness, scrolling effects, etc. Asset Packs Besides creating your own assets or using the built in asset pack, you can download external packs. Some examples include Google Material, Apple Design, Microsoft UWP, etc. Besides the big design guideline players, you can download UX wireframe kits from the community, and there appears to be an open source community developing around it. Example Here's just a quick example of an isometric game client I made after an hour of playing around. Again, there's a lot you can do with this if you're a designer just looking to get your ideas across.
  13. Spirited

    Conquer Online - Logic

    I mean, labeling it a private server doesn't make you immune from legal action or give you any freedoms. I doubt they would ever send you a cease and desist. I was more saying that making your own game that only recreates Conquer would prevent you from putting it on Steam and other stores, even if it's free to play. Creating graphics is hard but not you can use placeholder content to get started. There're lots of assets on various stores you an buy or that are free to download just to put in temporarily. They do carry their own software licenses as well though.
  14. Spirited

    Spirited's Tea & Coffee Corner

    I've been experimenting with milk tea since the start of the quarantine, and I think I've struck gold a few times now for those interested in some home recipes. I use a lot of Harney & Sons as you may know, but you can probably substitute it out for any other similar tea. For each recipe, I steep with boiling water and then cool in the fridge for at least one hour. Then I add the powder (1 or 2 heaping tablespoons) and an ice cube and shake in a drink shaker (hand mixing or blender also works). Finally, splash some half and half and boba in there and stir. Here's the boba I use (boba, straws). It only takes about 6 minutes to make. Paris Milk Tea Tea: Harney & Sons Paris Type: Black tea Powder: Milk Tea Special Instructions: None Earl Grey Supreme Milk Tea Tea: Harney & Sons Earl Grey Supreme Type: Black tea Powder: Milk Tea Special Instructions: None Honeydew Milk Tea Tea: Harney & Sons Caribe Type: Black and green tea mix Powder: Honeydew Special Instructions: Take off boil for 1 minute before steeping to not burn tea Chocolate Hazelnut Milk Tea Tea: Harney & Sons Florence Type: Black tea Powder: Milk Tea Special Instructions: None Chocolate Chai Milk Tea Tea: Harney & Sons Chocolate Chai Supreme Type: Black tea Powder: Milk Tea Special Instructions: None Thai Milk Tea Tea: Harney & Sons Royal Breakfast Type: Black tea Powder: Thai Milk Tea Special Instructions: None Cheers!

Important Information

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