i've been playing with this for a while now and I think its ready for you to play with it. This simple task required only 10000 lines of code and roughly 5 years of my life. Hopefully @ won't find it as "" as my other releases.
Impressions
What is it?
SRO_DevKit is a recreation of the source code of Silkroad Online. It aims to be binary compatible, meaning all code being written can be directly hooked into the game. It's far from being complete, but it already allows a lot of modifications.
Main features are:
Create new windows
Create new controls
Create icons in the notification-panel on the right
Send packets
The code also contains the full source code of the chat.
Other features are:
Contains the Interface Analysis tool shown in some of my screenshots
Contains my QuickStart release
Contains my NavMesh Explorer
Contains my Entity Explorer
Comes with a lot of addresses for free (import them into your x32dbg, Ghidra, IDA, etc)
Offers many ways to crash the game
Help wanted!
This project is explicit marked as "work in progress". It's not finished. It requires a lot of work. But you can help. By contributing your time. Your precious time you would usually spend on trying to convince people (including me) to do your stuff instead of learning how to do it yourself. Your precious time you would otherwise spend on making excuses on how you don't have time to learn and do things yourself. Stop complaining! Start doing!
You don't have to contribute great code or awesome features. You can also write guides on how to get started with certain features. Describe how to solve a certain issue. Help others getting started with the project.
The source code fairly clean. No scary assembly shit. No dirty hooks. Every method has a comment describing where to find it in the binary using a debugger. You can debug the code in Visual Studio.
I'm sorry to tell you that I'm still using Visual Studio 2005 for compiling. You can use newer Visual Studio Versions to edit the code, but using 2005 is a hard dependency and I wont help you if you're using a different compiler.
Lets be honest: None of you is going to contribute anyways.
Where is the download, bro?
Before diving right in: READ THE DOCUMENTATION!
Documentation:
Source Code:
Don't be a dick
I finally found a license that fits this community just perfectly.
Code:
DON'T BE A DICK PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
1. Do whatever you like with the original work, just don't be a dick.
Being a dick includes - but is not limited to - the following instances:
1a. Outright copyright infringement - Don't just copy this and change the name.
1b. Selling the unmodified original with no work done what-so-ever, that's REALLY being a dick.
1c. Modifying the original work to contain hidden harmful content. That would make you a PROPER dick.
2. If you become rich through modifications, related works/services, or supporting the original work,
share the love. Only a dick would make loads off this work and not buy the original work's
creator(s) a pint.
3. Code is provided with no warranty. Using somebody else's code and bitching when it goes wrong makes
you a DONKEY dick. Fix the problem yourself. A non-dick would submit the fix back.
I don't know where to start
Please have a look at the documentation. It has screenshots and download links for all the tools needed.
Can I use newer Visual Studio?
You can use any Editor you want. Compiling the project requires Visual Studio 2005. There are attempts to make it work on other versions, but I can't and won't support these.
It's crashing!!!!
Crash checklist:
Use Visual Studio 2005 for compiling
Always compile on Release, NEVER! compile on debug
Open it in a debugger and check where it crashes
Can you create an example for me?
Probably not. Depends on the task.
Can you create a dll for my server?
Definitely not!
LOL, you did released your history dude anyway it’s looks cool maybe it’ll help to the developers for who wants to do stuff like that, as the flo said don’t use it completely guys xD just keep it as example base hehe let’s contribute dyed community xDD
LOL, you did released your history dude anyway it’s looks cool maybe it’ll help to the developers for who wants to do stuff like that, as the flo said don’t use it completely guys xD just keep it as example base hehe let’s contribute dyed community xDD
I know this can be a pain in the ass. Usually you reverse huge C++ executables like Silkroad to get a basic understanding of certain parts of a program, not to rebuild the entire source.
Some time ago I literally had the same idea but with the GameServer's code.
I spent several year's reversing the binary just to get an understanding of how Silkroad works in depth. How it does communicate with other modules, how the network processing works, etc.
That being said, I did get an understanding of it. I learned how the internal process and thread management works, how it makes use of Microsoft's IOCP and how it does implement it.
The idea was to rebuild parts of the C++ code and then use this knowledge and the C++ pseudo code to build an almost perfect working emulator.
An emulator with which I would climb the "legend of silkroad" again, starting with legend 1. I always thought such a project could revive the community.
Some examples of what I've converted to pseudo code. Its not complete, not much and not all I have. I just started to create some pseudo code, my IDA database would allow much more though!
bool InterpretCertifyData(std::list<TContentType*>* lstContentType, std::list<TContent*>* lstContent, std::list<TServerFarm*>* lstServerFarm, std::list<TCertUnk*>* lstCertUnk,
std::list<TShard*>* lstShard, std::list<TMachine*>* lstMachine, std::list<TServerBody*>* lstServerBody, std::list<TServerCord*>* lstServerCord)
{
if (lstServerBody == NULL || lstServerBody->empty() || g_ServerBodiesMapId.empty()) {
BSCrash();
}
g_contentTypeList = lstContentType;
g_machineList = lstMachine;
g_contentList = lstContent;
g_serverFarmList = lstServerFarm;
g_certUnkList = lstCertUnk;
g_shardList = lstShard;
// Set pointer to TContentUnk in each TCertUnk
for (std::list<TCertUnk*>::iterator itr = lstCertUnk->begin(); itr != lstCertUnk->end(); ++itr) {
TCertUnk* certUnk = (*itr);
for (std::list<TServerFarm*>::iterator itr2 = lstServerFarm->begin(); itr2 != lstServerFarm->end(); ++itr2) {
TServerFarm* serverFarm = (*itr2);
if (certUnk->serverFarmId == serverFarm->id) {
certUnk->pServerFarm = serverFarm;
break;
}
}
}
// Set pointer to TContentUnk in each TShard
for (std::list<TShard*>::iterator itr = lstShard->begin(); itr != lstShard->end(); ++itr) {
TShard* shard = (*itr);
for (std::list<TServerFarm*>::iterator itr2 = lstServerFarm->begin(); itr2 != lstServerFarm->end(); ++itr2) {
TServerFarm* serverFarm = (*itr2);
if (shard->serverFarmId == serverFarm->id) {
shard->pServerFarm = serverFarm;
break;
}
}
}
g_serverBodyList = lstServerBody;
g_serverCordList = lstServerCord;
g_pServerBodyOfMySelf = lstServerBody->front();
// loop through machines
for (std::list<TMachine*>::iterator itr = lstMachine->begin(); itr != lstMachine->end(); ++itr) {
TMachine* machine = (*itr);
g_mapMachinesById.insert(std::pair<int, TMachine*>(machine->id, machine));
}
// loop through server bodies
for (std::list<TServerBody*>::iterator itr = lstServerBody->begin(); itr != lstServerBody->end(); ++itr) {
TServerBody* body = (*itr);
body->pModuleType = GetModuleTypeById(body->moduleType);
body->pMachine = GetMachineById(body->machineId);
// set pointer to content
body->pContent = NULL;
for (std::list<TContent*>::iterator itr2 = lstContent->begin(); itr != lstContent->end(); ++itr2) {
TContent* content = (*itr2);
if (body->contentId == content->id) {
body->pContent = content;
break;
}
}
// set pointer to contentUnk
body->pServerFarm = NULL;
for (std::list<TServerFarm*>::iterator itr2 = lstServerFarm->begin(); itr2 != lstServerFarm->end(); ++itr2) {
TServerFarm* farm = (*itr2);
if (body->serverFarmId == farm->id) {
body->pServerFarm = farm;
break;
}
}
// set pointer to shard if body has an assoc shard id
body->pShard = NULL;
for (std::list<TShard*>::iterator itr2 = lstShard->begin(); itr != lstShard->end(); ++itr2) {
TShard* shard = (*itr2);
if (body->shardId == shard->id) {
body->pShard= shard;
break;
}
}
if (body->contentId && !body->serverFarmId && !body->shardId && body->pModuleType == GetModuleTypeByName("GlobalManager")) {
body->pContent->globalManagerId = body->id;
}
if (body->pModuleType == GetModuleTypeByName("MachineManager")) {
body->pMachine->machineMgrNodeId = body->id;
}
g_mapServerBodiesById.insert(std::pair<unsigned __int16, TServerBody*>(body->id, body));
}
// add server cords to a map
for (std::list<TServerCord*>::iterator itr = lstServerCord->begin(); itr != lstServerCord->end(); ++itr) {
TServerCord* cord = (*itr);
cord->sessionId = 0;
g_mapServerCordsById.insert(std::pair<int, TServerCord*>(cord->id, cord));
}
// TODO: call sub_449700(), some strange std::list calls, bored of stl container reversing, gonna take a look at it later
// add shards to a map
for (std::list<TShard*>::iterator itr = lstShard->begin(); itr != lstShard->end(); ++itr) {
TShard* shard = (*itr);
g_mapShardsById.insert(std::pair<unsigned __int16, TShard*>(shard->id, shard));
}
if (g_handle11EA0E8) {
PostMessageA(g_handle11EA0E8, 0x7E8, 0, 0);
}
std::list<TServerCord*> linkedCords;
GetLinkedCordsOfBody(g_pServerBodyOfMySelf->id, &linkedCords);
for (std::list<TServerCord*>::iterator itr = linkedCords.begin(); itr != linkedCords.end(); ++itr) {
TServerCord* cord = (*itr);
TServerBody* otherBody = GetOtherBodyOfCord(g_pServerBodyOfMySelf, cord);
if (otherBody != NULL) {
char moduleType = otherBody->pModuleType->id;
if (moduleType == 2 || moduleType == 3 || moduleType == 4 || moduleType == 5) {
if (moduleType == g_pServerBodyOfMySelf->pModuleType->id) {
BSCrash();
}
if (otherBody->pShard) {
BSMessageBox("kek!!! why did you assign shard to common manager server? -_-+ plz check out server license table !!!");
PrintMessage(0x2000000, "kek!!! why did you assign shard to common manager server? -_-+ plz check out server license table !!!");
return false;
}
}
if (g_pServerBodyOfMySelf->pShard == NULL || otherBody->pShard == NULL) {
std::set<unsigned __int16>::iterator fnd = g_ServerNotifyTargets.find(otherBody->id);
if (fnd == g_ServerNotifyTargets.end()) {
PrintMessage(0, "Add ServerNotify : (%d) - %s", otherBody->id, otherBody->pModuleType->name);
g_ServerNotifyTargets.insert(otherBody->id);
}
}
}
}
if (g_ServerNotifyTargets.empty()) {
BSMessageBox("There is no server notify target!!! (check whether Farm has assigned shard or not...)");
PrintMessage(0x2000000, "There is no server notify target!!! (check whether Farm has assigned shard or not...)");
return false;
}
return true;
}
Sadly, due to my real life job and the sheer endless task of rebuilding even just parts of the executable, this project was set to fail before it even started.
Finally I gave up on it and pretty much left silkroad. It was a fun experience though and it definitely boosted my assembly skills.
Nowadays I think the emulator was a stupid idea, the community wouldn't appreciate such a project and it's definitely dead!
Also great to see that I'm not alone with such crazy ideas
[Source] Fix the old exp bar - by writing code! 05/17/2020 - SRO PServer Guides & Releases - 18 Replies Hello beloved, dead community,
its time for another release. Its more of a proof of concept and I hope it might inspire people to continue working on it. You don't need the source to accomplish cool things. Just write your own source.
http://i.epvpimg.com/d7hJbab.png
Ye, its super ugly looking. I choose to be a coder, not a designer. I'd be happy, if someone supplies me a proper version of the 2dt and ddj files so I can update this embarrassing screenshot.
Anyway. It allows you to...
[Release/WIP]EP6 Source code 04/15/2018 - Shaiya PServer Guides & Releases - 33 Replies Hi guys,
First of all, I want to say that this release is not recommended for public servers yet. Shortly ago I changed my server to ep6 using shen1l's pet.dll, the server crashed every day, after checking the dump files I discovered that the problem was in pet.dll, but without the source code it would be harder to find the cause of the problem. So I decided to start a project and release the source code for everyone, so that everyone can solve their problems more easily, and also so that...
[C++ Source] My Free Farm Bot [WIP] 06/28/2011 - Browsergames - 0 Replies I decided to release this on here as i have no more use for it and no intention to continue the project.
I am releasing 2 projects: One basic library for mff called libmff(although it is not really a library) there is an example on how to use it in the package.
And a helper with a fancy gui.
Note that there is almost no error checking on the helper and that it crashes if you for example forget to select a product.
You need libcurl and boost for both and GWEN(the gui toolkit by garry) for...