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


  • Content Count

  • Joined

  • Last visited

  • Days Won


Vendramini last won the day on February 7

Vendramini had the most liked content!

Community Reputation

4 Neutral

About Vendramini

  • Rank
  • Birthday 10/27/1994


The recent visitors block is disabled and is not being shown to other users.

  1. Vendramini

    [Proof of Concept] Item Renting

    This has been implemented in the client ~5600, I believe before that patch. It can be implemented and might work except for a few interface bugs.
  2. Oh shit, I'm so tired xD I still want to make my CQ server in C++

    1. Show previous comments  2 more
    2. Spirited


      If you wanna do cross-platform, I'd strongly recommend Qt. C++ is tricky to do cross-platform on your own. Even if you use GCC between Linux and Windows, they compile C++ differently due to bugs. Qt doesn't seem to have that problem often though, if you use their classes that is. Personally, I wouldn't work in Win32 anymore. It adds more complexity and doesn't really make sense for new apps these days. Microsoft themselves say this when describing Win32: "In general, .NET programming in C# is less complex, less error-prone, and has a more modern object-oriented API than Win32 or MFC. In most cases, its performance is more than adequate." Just things to keep in mind.

    3. Vendramini


      Thanks for the tips. Tho, I couldn't manage to install QT on VS2019 :/ but I'll try again later.

    4. Spirited


      I wouldn't use Visual Studio 2019 for anything cross platform. The IDE itself isn't cross platform. I'd either use Visual Studio Code or Qt Creator. Here's an article that talks about both of them that may help: https://www.kdab.com/using-visual-studio-code-for-writing-qt-applications/

  3. Vendramini

    Comet - Open Source Conquer Online Server

    Okay, so I'm starting World Conquer v4 with this XD * Forked
  4. Vendramini

    Simple database Migration manager

    Okay dokey. I'll update it on the next revision.
  5. Vendramini

    Simple database Migration manager

    I'm working on the improvements hehehe but since I'm working for two companies now, development of my own things became slow. I'm working on doing something like this for my company, but it's for SQLServer. I'll convert be converting it to MySQL soon. Also for naming conventions I like how it was done in C++, sometimes I mistakenly invert somethings but I try to do it correctly love sz, psz, n, dw, qw, etc. And thanks for the feedback.
  6. Vendramini

    Simple database Migration manager

    Hello! Today I've got a few free minutes at my work and coded something that I noticed that I need long time ago! There's room for improvements of course but this will be good for those who often updates their game database and also need to keep track of the changes. The script is simple and I'll be updating here as I upgrade my code on my server. using System; using System.IO; using MySql.Data.MySqlClient; namespace FtwCore.Database.Migrations { public sealed class MigrationManager { private string m_szConnectionString; private string m_szMirationsPath; public MigrationManager(string host, string user, string pass, string data, int port) { m_szMirationsPath = Environment.CurrentDirectory + "\\migrations\\"; m_szConnectionString = $"Server={host};Port={port};Database={data};Uid={user};Password={pass};charset=utf8;"; } public string LastExcepttion { get; private set; } public void Migrate() { if (!Directory.Exists(m_szMirationsPath)) Directory.CreateDirectory(m_szMirationsPath); string[] files = Directory.GetFiles(m_szMirationsPath); foreach (var file in files) { FileInfo info = new FileInfo(file); if (info.Extension != ".sql") { Console.WriteLine([email protected]"Skip migration file {info.Name} not sql"); continue; } if (Path.GetFileNameWithoutExtension(file).Length < 16) { Console.WriteLine([email protected]"Skip migration file {info.Name} name length less than 16"); continue; } string szYear = info.Name.Substring(0, 4); string szMonth = info.Name.Substring(4, 2); string szDay = info.Name.Substring(6, 2); string szHours = info.Name.Substring(8, 2); string szMinutes = info.Name.Substring(10, 2); string szSeconds = info.Name.Substring(12, 2); if (!int.TryParse(szYear, out int year) || !int.TryParse(szMonth, out int month) || !int.TryParse(szDay, out int day) || !int.TryParse(szHours, out int hour) || !int.TryParse(szMinutes, out int minute) || !int.TryParse(szSeconds, out int second) || !DateTime.TryParse($"{year}-{month}-{day} {hour}:{minute}:{second}", out DateTime dtFullTime)) { Console.WriteLine([email protected]"Skip migration file {info.Name} invalid date stamp yyyyMMddHHmmss"); continue; } string fileName = Path.GetFileName(file); if (HasExecuted(fileName)) { continue; } if (!Execute(fileName)) { Console.WriteLine([email protected]"Error on executing migration for file {info.Name}! Error: {LastExcepttion}"); continue; } ExecuteInsert($"INSERT INTO `migrations` (`file`, `execute_time`) VALUES ('{fileName}', '{DateTime.Now:yyyy-MM-dd HH:mm:ss}')"); } } public bool Execute(string fileName) { if (!fileName.ToLower().EndsWith(".sql")) fileName += ".sql"; try { using (MySqlConnection conn = new MySqlConnection(m_szConnectionString)) { conn.Open(); MySqlScript script = new MySqlScript(conn, File.ReadAllText($"{m_szMirationsPath}{fileName}")); script.Execute(); conn.Close(); } return true; } catch (MySqlException ex) { LastExcepttion = ex.Message; return false; } } public bool HasExecuted(string fileName) { string query = "SELECT id FROM migrations WHERE `file`[email protected] LIMIT 1"; try { using (MySqlConnection conn = new MySqlConnection(m_szConnectionString)) { using (MySqlCommand command = new MySqlCommand(query, conn)) { conn.Open(); command.Prepare(); command.Parameters.AddWithValue("@file", fileName); bool result = command.ExecuteReader().HasRows; conn.Close(); return result; } } } catch (MySqlException ex) { LastExcepttion = ex.Message; return false; } } public int ExecuteInsert(string szQuery) { try { int result = -1; using (MySqlConnection conn = new MySqlConnection(m_szConnectionString)) { using (MySqlCommand command = new MySqlCommand(szQuery, conn)) { conn.Open(); result = command.ExecuteNonQuery(); conn.Close(); } } return result; } catch (MySqlException ex) { LastExcepttion = ex.Message; return -1; } } public bool TestConnection() { try { using (MySqlConnection conn = new MySqlConnection(m_szConnectionString)) { conn.Open(); conn.Close(); } return true; } catch (MySqlException ex) { LastExcepttion = ex.Message; return false; } } } } How to use: Create a 'migrations' folder on your executable path Put all your SQL Scripts in files inside of it Files must have yyyyMMddHHmmss as the first 14 characters Files must have from 16 to 128 characters Before loading your mysql data just create a new instance of the MigrationManager and call .Migrate() method Done! Then, anything that you code on your test database, save the final code on a SQL file, name it 20200129183000 WhateverYouWant.sql and put in your production migrations folder! If the code hasn't been executed, your server will execute and you can keep track of the updates. Ey! I'm sending your first migration sql file so you can test it! Good luck. PS: don't forget to change the namespace! 20200129182100_MyVeryFirstMigration.sql
  7. I still have interest in this, but I also can't make the interface match the colors correctly when you insert both steeds in the interface.
  8. Vendramini

    Conquer Facebook Client

    I have CrazyTao binary server files but I never bothered about asking which version does it run. And my antivirus says that there are virus in it, like in most TQ Binaries out there. My PC is down now and I can't access it now, but if you wish I can get the files for you later.
  9. 😧 how can I change my name?

    1. Spirited


      You just ask. Send me a private message and I'll change it.

    2. Omicron


      @Spirited, this is late but you can also just enable a monthly display name change. Might be easier

    3. Spirited


      Yeah, I have no problem with that. Done.

  10. Vendramini

    SRP6 for higher clients

    There's still somewhere we can leave structures?
  11. Vendramini

    SRP6 for higher clients

    I know, I couldn't reproduce some steps
  12. Vendramini

    SRP6 for higher clients

    Hello again Well, I managed to bypass the server.dat decryption in the Conquer.exe for version 5808, but, a long time ago I tried to implement SRP6 in the 5530 version but failed with glory. Spirited sent me a link for his GO project with the implementation algorithm, buuuuuut then, I couldn't implement it in C#. I'm not sure if it would stop the disconnection problem (that affects like 30% of the login attempts), but I think it'd be good to have the whole auth system up and running. Can anybody help with this? I've searched for SRP6 examples over the web but TQ loves to mess everything they touch doing crazy things and I can't reproduce this one XD I lost my old implementation of the SRP6 (which never worked at all) and I need to start all over again.
  13. Vendramini

    Client: Disassembling Conquer in Hopper

    I have many packets that are almost complete. I managed to get the .exe that I need, now I just need to figure out how to find the structures. I've been guessing by the ::Create() functions, but they don't always have the server structures many does only fill some offsets and jump a lot
  14. Vendramini

    Client: Disassembling Conquer in Hopper

    When I get this working I'll release all 5808 packet structures lol I already did a lot of research alone (guessing offsets) but for some really unknown packets this is really hard.
  15. Vendramini

    Guide: Client Downloads

    Yes, the executable that they were using at patch ~1270

Important Information

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