Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Rusty Hearts

Status
Not open for further replies.
DRGunZ 2 Creator
Loyal Member
Joined
Jan 21, 2007
Messages
4,493
Reaction score
161
I've been playing this game for the past few days. It seems really promising. I love the anime style theme. The characters were well thought out with their background and their special abilities and weapons. The dungeon exploring could have been more thought out, but still good. I still like the game though. I'm currently using Angela with the nickname Milady, usually in the top right world or whatever they call it.

What about you guys?
 
We are Maverick!
Loyal Member
Joined
Feb 27, 2009
Messages
2,913
Reaction score
1,000
I'm using Frantz and he's pretty good at skill combo'ing. IGN is Dell. I love the cutscenes but the loading time between cutscenes and map loading seem a bit too long especially the tutorial stage. Also the whole character select/create thing was really cool looking, but they should have removed the character that we can't play yet.

I find it great except for the item shop/mailbox glitches. Also the whole stamina thing is lame in mmorpgs. I also found it dumb that after I registered for CBT they started giving out keys that come with special packages and costumes and I have no idea if I can get these packages now since I can't enter in another key. Another thing I found dumb is that their client is easily editable and un-packable just like Perfect World. You'd think they would learn by now.

I'd rate the game around 8/10 for now even though it's still in CBT. I'm sure it'll get better, also hoping for some nice CBT rewards.
 
Last edited:
DRGunZ 2 Creator
Loyal Member
Joined
Jan 21, 2007
Messages
4,493
Reaction score
161
Yeah, the loading times take forever on it. Might be due to server load and my computer specs though.
My tutorial was lagging so much that it skipped most of it.
Yes, they should remove the character we can't play yet.

I haven't heard of the glitches yet. Harmful glitches or what?
I'm sure it will get better also, it's only in Closed Beta.
 
We are Maverick!
Loyal Member
Joined
Feb 27, 2009
Messages
2,913
Reaction score
1,000
Yeah, the loading times take forever on it. Might be due to server load and my computer specs though.
My tutorial was lagging so much that it skipped most of it.
Yes, they should remove the character we can't play yet.

I haven't heard of the glitches yet. Harmful glitches or what?
I'm sure it will get better also, it's only in Closed Beta.

I've noticed only the fashion crafting glitch and mailbox/item mall glitch.

There is like 21 pages of bugs/glitches on the RH forums though lol.
 
Junior Spellweaver
Joined
Sep 21, 2008
Messages
103
Reaction score
26
IGN Kamijo. I play Frantz also.
It's still CB, so I don't really mind the bugs and glitches.
Overall the whole concept is truly awesome.
I just hope they fix what needs to be fixed and don't mess things up.
The character that we can't play yet is already in the Korean version.
It isn't really a problem. I think it's cool you already get a preview for the next playable character.
Anyway, that's what I think. :p

@Dell Honne: What game is the picture in your signature from?
 
Experienced Elementalist
Joined
Apr 2, 2011
Messages
249
Reaction score
3
I havent even touch it yet. but there will be a Server files release. that would be nice.
 
DRGunZ 2 Creator
Loyal Member
Joined
Jan 21, 2007
Messages
4,493
Reaction score
161
@Omikron :O really? I'm interested in the other character now :3
The glitches are fine, because they will be fixed.

I really have high hopes for this game :)
 
We are Maverick!
Loyal Member
Joined
Feb 27, 2009
Messages
2,913
Reaction score
1,000
IGN Kamijo. I play Frantz also.
It's still CB, so I don't really mind the bugs and glitches.
Overall the whole concept is truly awesome.
I just hope they fix what needs to be fixed and don't mess things up.
The character that we can't play yet is already in the Korean version.
It isn't really a problem. I think it's cool you already get a preview for the next playable character.
Anyway, that's what I think. :p

@Dell Honne: What game is the picture in your signature from?

It's an animation of Ragnarok online. You can find it on youtube by searching Ragnarok battle animation.

Frantz is pretty cool to play with his rape skill combos. I can't wait to see his axe moves.

I also tried out Tude. He's got this epic stun skill which is a beast skill to use against bosses since it stuns them too.

@Anyone looking to emulate this game as of now, Wait till at least official launch or OBT before starting as the game has tons of bugs/glitches that would affect players.
 
Last edited:
Junior Spellweaver
Joined
Feb 21, 2008
Messages
105
Reaction score
1
i have a Angela, Frantz, and a Tude they are all amazing characters to play but if you want a straight skill chain lady Tude is amazing at chains lol at lv3 i pulled a 43 chain on 5 mobs xD it was insane
 
Junior Spellweaver
Joined
Sep 21, 2008
Messages
103
Reaction score
26
@Dell Honne: Thanks. It did look like RO, but I wasn't sure, cause RO isn't like that when you play it. Cool how they made that. I kinda wanna play RO now. lol.

Private server for this would be pretty awesome.

I found this video with some material of lvl 40's fighting and it also shows some pets and new bosses.

It's pretty awesome. :)
 
Experienced Elementalist
Joined
Apr 2, 2011
Messages
249
Reaction score
3
Leveling is quite grinding xD
it took me almost 1hour from 1-5
 
We are Maverick!
Loyal Member
Joined
Feb 27, 2009
Messages
2,913
Reaction score
1,000
Leveling is quite grinding xD
it took me almost 1hour from 1-5

It depends on the quests and dungeons you do xD

Solo'ing VH will net you alot of EXP (I'm not sure which characters can solo VH but I know I've been solo'ing till wine cellar with frantz)
 
Experienced Elementalist
Joined
Apr 2, 2011
Messages
249
Reaction score
3
It depends on the quests and dungeons you do xD

Solo'ing VH will net you alot of EXP (I'm not sure which characters can solo VH but I know I've been solo'ing till wine cellar with frantz)

I just follow what ever the main quest is but yeah... took almost 1hour to get to level 5 xD, even with normal quest... it takes forever
 
Joined
Apr 8, 2005
Messages
401
Reaction score
37
hehe glad to see people playin it... my ign is ofc 'tinkle' that's my frantz ;> he's pretty much my main although Angela does rock too. I made one of each of course... but I wait for Natasha (4th char) since she'll be ranged (dual guns/rifle)... Frantz is pretty good at soloing VH but I think they all can... just takes some time to get used to it... Also it's super fun to play with a controller xD... I agree a PS would be nice though. :D
 
Joined
Sep 27, 2006
Messages
557
Reaction score
88
look thru the client and find out some information...

is it packed what anticheat does it use etc... grab a packet sniffer look at the packets and see if there in fact encrypted...
 
DRGunZ 2 Creator
Loyal Member
Joined
Jan 21, 2007
Messages
4,493
Reaction score
161
@tinkle, you make me really interested in Natasha. :)
@jonnybravo: it uses X-Trap.
 
We are Maverick!
Loyal Member
Joined
Feb 27, 2009
Messages
2,913
Reaction score
1,000
Seems like most of the configs are readable by notepad++

Also the client uses pck files... just like JD and PW.

I can't extract them using PW/JD's tools though so something must be different.
 
Newbie Spellweaver
Joined
Oct 22, 2008
Messages
75
Reaction score
143
Seems like most of the configs are readable by notepad++

Also the client uses pck files... just like JD and PW.

I can't extract them using PW/JD's tools though so something must be different.

Here's a file extractor I just wrote. Their format is pretty simple, just XOR encrypted file headers that are compressed and uncompressed data entries. They also have a hash value for the data, but I haven't tracked that down yet. I'll look into it later maybe.

Included is complete source + binary. Using is simple, just copy "RustyHeartsExtractor.exe" and "ZlibDll.dll" to the "Rusty Hearts" folder and run "RustyHeartsExtractor.exe". There's a ton of files, so it takes a long time to run (probably because it's single threaded, but oh well, it's just a quick tool). Any errors encountered will be output to the console (make sure RustyHearts is not running and files are not locked!)

RustyHeartsExtractor.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;

namespace RustyHeartsExtractor
{
    class Program
    {
        [DllImport("ZlibDll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int Decompress(byte[] compressed_buffer, int compressed_size, byte[] decompressed_buffer, ref int decompressed_size);

        static void Main(string[] args)
        {
            try
            {
                byte[] DecryptTable1 = new byte[]
                {
                      0x30, 0x22, 0x41, 0xA8, 0x5B, 0xA6, 0x6A, 0x49, 0xBF, 0x53, 0x35, 0xE5, 0x9E, 0x0E, 0xEC, 0xB8, 0x5E, 0x15, 0x1F, 0xC1, 0x4F, 0xEC, 0x77, 0xE8, 0xB7, 0x4E, 0x87, 0xE6, 0xF5, 0x3C, 0xB3, 0x43
                    , 0xCC, 0x53, 0x36, 0xAC, 0x5A, 0x77, 0xB8, 0xDD, 0x30, 0x74, 0x8C, 0x4A, 0x9A, 0x9B, 0xBC, 0x0A, 0xA4, 0xAD, 0xBB, 0x13, 0x4B, 0x8C, 0xD4, 0x80, 0xCE, 0x65, 0x1D, 0x08, 0x5A, 0x6A, 0x6F, 0x25
                    , 0xF9, 0x3F, 0xEF, 0x1B, 0xA4, 0x72, 0x14, 0xED, 0x97, 0x22, 0x4A, 0x2E, 0xB8, 0x96, 0x4B, 0x8E, 0x96, 0x93, 0xF1, 0x28, 0xB2, 0x0B, 0x3C, 0xF8, 0x5D, 0xAA, 0xA9, 0x82, 0x13, 0x6E, 0xC1, 0xA9
                    , 0x20, 0x57, 0xB2, 0x5B, 0x16, 0xCF, 0x9E, 0x5F, 0xD4, 0xCC, 0x2E, 0xF5, 0xC9, 0x4C, 0x1C, 0xEE, 0xE3, 0x3F, 0x29, 0xB3, 0x06, 0x70, 0x43, 0x3D, 0xF5, 0x90, 0xA2, 0x42, 0x02, 0x98, 0x50, 0xFD
                    , 0x5D, 0x4E, 0x92, 0xAD, 0xAD, 0x7F, 0xAB, 0x60, 0x2C, 0xB8, 0x43, 0x76, 0x8F, 0x5F, 0xE6, 0xA7, 0x19, 0xE0, 0xB9, 0xB5, 0x62, 0x6B, 0xD4, 0x47, 0x69, 0x34, 0x0E, 0x6D, 0xA4, 0x52, 0xE3, 0x64
                    , 0x4A, 0x65, 0x47, 0xF5, 0x3F, 0x53, 0x5E, 0x8B, 0x1B, 0xFD, 0x21, 0xF7, 0xBA, 0x68, 0xF9, 0xDF, 0x68, 0xA8, 0x96, 0x0F, 0x8B, 0x01, 0x97, 0x58, 0x8C, 0x1E, 0xEF, 0xB3, 0x41, 0x44, 0x21, 0xDA
                    , 0xE0, 0xF4, 0xE0, 0x2D, 0xCD, 0x0B, 0xF0, 0x5C, 0x59, 0xD6, 0x99, 0xE7, 0x01, 0x15, 0x67, 0x32, 0xE0, 0x12, 0x2F, 0xCD, 0xA2, 0xDE, 0x52, 0xCE, 0xEC, 0xEF, 0x77, 0x0E, 0xBC, 0x38, 0x64, 0x8D
                    , 0xB4, 0xDB, 0x67, 0xFF, 0xC8, 0x66, 0x0C, 0x8A, 0x60, 0xE1, 0x2E, 0x00, 0x43, 0xA9, 0x37, 0x9C, 0x11, 0xAA, 0xB9, 0x98, 0xED, 0x21, 0x35, 0xD4, 0xC3, 0xDE, 0x65, 0x54, 0x9D, 0x1C, 0xB0, 0xA9
                };

                byte[] compressed_bytes = null;

                using (FileStream fs = new FileStream("f00X.dat", FileMode.Open, FileAccess.Read))
                {
                    using (BinaryReader br = new BinaryReader(fs))
                    {
                        compressed_bytes = br.ReadBytes((int)br.BaseStream.Length);
                    }
                }

                for (int x = 0; x < compressed_bytes.Length; ++x)
                {
                    compressed_bytes[x] ^= DecryptTable1[x & 0xFF];
                }

                int decompressed_size = (compressed_bytes.Length << 4) - compressed_bytes.Length;
                byte[] decompressed_bytes = new byte[decompressed_size];

                int result = Decompress(compressed_bytes, compressed_bytes.Length, decompressed_bytes, ref decompressed_size);
                if (result != 0)
                {
                    Console.WriteLine("Error: Decompress returned error code {0}.", result);
                    return;
                }

                Dictionary<int, FileStream> archives = new Dictionary<int, FileStream>();
                Dictionary<int, BinaryReader> readers = new Dictionary<int, BinaryReader>();
                String[] files = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.pck");
                foreach (String file in files)
                {
                    FileStream ofs = new FileStream(file, FileMode.Open, FileAccess.Read);
                    BinaryReader obr = new BinaryReader(ofs);
                    Int32 key = Int32.Parse(Path.GetFileNameWithoutExtension(file));
                    archives.Add(key, ofs);
                    readers.Add(key, obr); 
                }

                using (MemoryStream ms = new MemoryStream(decompressed_bytes, 0, decompressed_size, false))
                {
                    using (BinaryReader br = new BinaryReader(ms))
                    {
                        while (br.BaseStream.Position != br.BaseStream.Length)
                        {
                            try
                            {
                                UInt16 len = br.ReadUInt16();
                                String name = Encoding.Unicode.GetString(br.ReadBytes(len * 2));
                                byte archive = br.ReadByte(); // Which archive is it in
                                Int32 size = br.ReadInt32(); // Size of the file
                                UInt32 hash = br.ReadUInt32(); // Guessing the hash of the data, might check it out later
                                long offset = br.ReadInt64(); // Offset in the file

                                BinaryReader br2 = readers[archive];
                                br2.BaseStream.Position = offset;
                                byte[] bytes = br2.ReadBytes(size);

                                Directory.CreateDirectory(Path.GetDirectoryName(Directory.GetCurrentDirectory() + "\\output\\" + name));
                                using (FileStream ofs = new FileStream(Directory.GetCurrentDirectory() + "\\output\\" + name, FileMode.Create, FileAccess.Write))
                                {
                                    using (BinaryWriter bw = new BinaryWriter(ofs))
                                    {
                                        bw.Write(bytes);
                                        bw.Flush();
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("Error: {0}", ex);
                            }
                        }
                    }
                }

                foreach (var kvp in archives)
                {
                    kvp.Value.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: {0}", ex);
            }
        }
    }
}

zlibdll.cpp (zlib can be downloaded from its if needed.)
Code:
#include <windows.h>
#include "zlib/zlib.h"
#include <stdio.h>

extern "C" __declspec(dllexport) int Decompress(unsigned char * compressed, unsigned int compressed_size, unsigned char * decompressed, unsigned int * decompressed_size )
{
	unsigned int est_size = *decompressed_size * 5;
	if( est_size < 4096 ) est_size = 4096;
	unsigned char * workspace = (unsigned char *)malloc( est_size );
	int result = Z_OK;
	do 
	{
		result = uncompress((Bytef*)workspace, (uLongf *)&est_size, (Bytef*)compressed, compressed_size);
		if( result == Z_OK )
		{
			if( *decompressed_size >= est_size )
			{
				*decompressed_size = est_size;
				memcpy( decompressed, workspace, est_size );
			}
			else
			{
				result = -10; // decompression size mismatch
			}
		}
		else if( result == Z_BUF_ERROR )
		{
			est_size *= 2;
			workspace = (unsigned char *)realloc(workspace, est_size);
		}
	} while( result == Z_BUF_ERROR );
	free( workspace );
	return result;
}

extern "C" __declspec(dllexport) int Compress(unsigned char * decompressed, unsigned int decompressed_size, unsigned char * compressed, unsigned int * compressed_size )
{
	unsigned int est_size = decompressed_size * 5;
	if( est_size < 4096 ) est_size = 4096;
	unsigned char * workspace = (unsigned char *)malloc( est_size );
	int result = Z_OK;
	do 
	{
		result = compress((Bytef*)workspace, (uLongf *)&est_size, (Bytef*)decompressed, decompressed_size);
		if( result == Z_OK )
		{
			*compressed_size = est_size;
			memcpy( compressed, workspace, est_size );
		}
		else if( result == Z_BUF_ERROR )
		{
			est_size *= 2;
			workspace = (unsigned char *)realloc(workspace, est_size);
		}
	} while( result == Z_BUF_ERROR );
	free( workspace );
	return result;
}

Some screens:
wesman2232 - Rusty Hearts - RaGEZONE Forums


This game has some pretty nice music! Everyone one is free to extend the code to make it threaded, add guis, or allow specific extraction capabilities. Packing shouldn't be too hard once the last field is worked out and any file headers in the data files. If you post anywhere else, please refer back to ragezone.

Download: Attached w/ Full Source ( )
 

Attachments

You must be registered for see attachments list
Status
Not open for further replies.
Back
Top