Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
can share the setup?
can share the setup?
I want to, but not yet. Havnt played this game before so need to explore this game first and find and fix some bugs. need to extract nfs-files for future use.can share the setup?
Can u create character and passthrough to the loadingscreen? Or are u stuck at creating char? look into logs files.I uploaded the database, I made all the updates manually to the database, I ran the servers, but I can't get past the character creation part, could you help me?
Please, I've dreamed of being able to play this game for years.
tmadafuq
It doesn't enter the game world, I've already examined it, in the log it says that the bin file is returning a NULL value, I don't have the assembly knowledge to fix this, that's why I'm asking for your help.Can u create character and passthrough to the loadingscreen? Or are u stuck at creating char? look into logs files.
can create the character,but logon the world have errorCan u create character and passthrough to the loadingscreen? Or are u stuck at creating char? look into logs files.
then is we need to find the compatible client or bins to fix c++ invalidparameter.can create the character,but logon the world have error
can share the game.bin or full client? server 100% workwhat I gave to u is what I use right now.
the client cant read the data folder with db and scene in it. so its what most important things.Laplace is weird, it doesn't support fully unpacked client. I gave up on it after only achieving partial unpacking. For packing, I've got absolutely no idea how to do it
no point starting a server that unable to modify client lol
I've also fixed it, but I need to do more tests. Soon I'll post the server with the installer. About the client and the new nfs system, I think I can get something out of it, considering that it's the old launcher pattern used in xleg (I have part of it reversed, I think it's good xD).can share the game.bin or full client? server 100% work
enum lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE : __int32{
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNONE = 0x0,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMAXLevel = 0x1,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eItemMall = 0x2,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyMAXLV = 0x3,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRaid = 0x4,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLimitPlayerNode = 0x5,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLimitPlayerCount = 0x6,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eSecondPassword = 0x7,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eSurvivalMode = 0x8,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMaxRemoveCharDaily = 0x9,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNoApex = 0xA,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRankSwitch = 0xB,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNoLevelDiffDKP = 0xC,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFortuneBagAutoBind = 0xD,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eBindAfterCombine = 0xE,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyInviteCheck = 0xF,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eDailyLoginBonus = 0x10,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLotteryAlchemy = 0x11,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eItemmallCharacter = 0x12,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloudeepControl = 0x13,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch = 0x14,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eXignCodeEnable = 0x15,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRemoveCharResetTime = 0x16,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestMission = 0x17,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestWorld = 0x18,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestZone = 0x19,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumFamilyRankInfo = 0x1A,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumFriendRankInfo = 0x1B,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eBannerStartTime = 0x1C,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch3VS3 = 0x1D,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyLandSwitch = 0x1E,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyRentNPCSwitch = 0x1F,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch4Camps = 0x20,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloseCaptchaLogin = 0x21,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eTransportFamilyDungeon = 0x22,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloseNewRefreshEQsAttr = 0x23,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePeakSpell = 0x24,
lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMAX = 0x25,
}
[FUNCTIONSWITCH]
MAXLevel=120
ItemMall=1
FamilyMAXLV=10
Raid=1
# Limit Node Number
eLimitPlayerNode=
# Limit Player Count
LimitPlayerCount=
SecondPassword=0
SurvivalMode=1
MaxRemoveCharDaily=4
NoApex=0
RankSwitch=1
FortuneBagAutoBind=1
LotteryAlchemy=1
BindAfterCombine=1
ItemmallCharacter=1
ItemmallNumLimitDeadLine=20200714
NoLevelDiffDKP=0
FamilyInviteCheck=0
DailyLoginBonus=0
CloudeepControl=0
ColosseumSwitch=0
XignCodeEnable=0
RemoveCharResetTime=0
PerfTestMission=0
PerfTestWorld=0
PerfTestZone=0
ColosseumFamilyRankInfo=0
ColosseumFriendRankInfo=0
BannerStartTime=0
ColosseumSwitch3VS3=0
FamilyLandSwitch=0
FamilyRentNPCSwitch=0
ColosseumSwitch4Camps=0
CloseCaptchaLogin=0
TransportFamilyDungeon=0
CloseNewRefreshEQsAttr=0
PeakSpell=0
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <stdexcept>
#include <array>
std::array<unsigned int, 256> generateCRCTable() {
std::array<unsigned int, 256> crcTable;
unsigned int polynomial = 0xEDB88320;
for (unsigned int i = 0; i < 256; i++) {
unsigned int c = i;
for (size_t j = 0; j < 8; j++) {
if (c & 1) {
c = polynomial ^ (c >> 1);
}
else {
c >>= 1;
}
}
crcTable[i] = c;
}
return crcTable;
}
void processFiles(const std::string& inputFilePath, const std::string& outputFilePath) {
if (inputFilePath == outputFilePath) {
throw std::invalid_argument("Input and Output file paths must be different");
}
std::ifstream inputFile(inputFilePath, std::ios::binary);
std::ofstream outputFile(outputFilePath, std::ios::binary);
if (!inputFile.is_open() || !outputFile.is_open()) {
throw std::runtime_error("Failed to open files");
}
std::vector<unsigned char> inputData((std::istreambuf_iterator<char>(inputFile)),
std::istreambuf_iterator<char>());
if (inputData.size() <= 8) {
throw std::runtime_error("Input file is too short");
}
std::vector<unsigned char> outputData;
outputData.reserve(inputData.size() - 8);
std::vector<unsigned char> trimmedData(inputData.begin() + 8, inputData.end());
int encryptionKeys[] = { 'g', 'h', 'f', 'd', 's', 'j', 'd', 'l' };
auto crcTable = generateCRCTable();
unsigned int crcValue = 0x12345678;
unsigned int secretKey1 = 0x23456789;
unsigned int secretKey2 = 0x34567890;
for (int key : encryptionKeys) {
unsigned int tempCRC = (crcValue ^ key) & 0xFF;
unsigned int crcStep = crcTable[tempCRC];
crcValue = crcStep ^ (crcValue >> 8);
unsigned int updatedKey1 = (crcValue & 0xFF) + secretKey1;
secretKey1 = 0x8088405 * updatedKey1 + 1;
unsigned int tempKey = (secretKey1 >> 24) & 0xFF;
unsigned int secretStep = (secretKey2 ^ tempKey) & 0xFF;
secretKey2 = crcTable[secretStep] ^ (secretKey2 >> 8);
}
for (size_t i = 0; i < trimmedData.size(); ++i) {
unsigned char currentByte = trimmedData[i];
unsigned int factor1 = (secretKey2 & 0xFFFF) | 2;
unsigned int factor2 = factor1 ^ 1;
unsigned int mixedFactor = factor1 * factor2;
unsigned int encryptedByte = (currentByte ^ ((mixedFactor >> 8) & 0xFF)) & 0xFF;
outputData.push_back(static_cast<unsigned char>(encryptedByte));
unsigned int crcTemp = (crcValue ^ encryptedByte) & 0xFF;
crcValue = crcTable[crcTemp] ^ (crcValue >> 8);
unsigned int updatedKey2 = (crcValue & 0xFF) + secretKey1;
secretKey1 = 0x8088405 * updatedKey2 + 1;
unsigned int tempKeyUpdate = (secretKey1 >> 24) & 0xFF;
unsigned int finalSecretStep = (secretKey2 ^ tempKeyUpdate) & 0xFF;
secretKey2 = crcTable[finalSecretStep] ^ (secretKey2 >> 8);
}
outputFile.write(reinterpret_cast<const char*>(outputData.data()), outputData.size() - 2);
inputFile.close();
outputFile.close();
}
int main() {
try {
std::string inputFilePath;
std::string outputFilePath;
std::cout << "File for Decode\n";
std::cin >> inputFilePath;
processFiles(inputFilePath, inputFilePath+".DEC");
std::cout << "Write successful";
}
catch (const std::exception& ex) {
std::cerr << ex.what() << '\n';
return 1;
}
return 0;
}
thanks for your work, NICE!I've also fixed it, but I need to do more tests. Soon I'll post the server with the installer. About the client and the new nfs system, I think I can get something out of it, considering that it's the old launcher pattern used in xleg (I have part of it reversed, I think it's good xD).
Edit:
Here's my modified exeTo view the content, you need to sign in or register; I forced it not to display that existing message, so the client worked. Regarding the server files, I'm using Jagger1998 with a Grand Fantasia base. For the database, I used the one from AK v7 and the update script by Eperty123 . For the gateway server, I use the one from GF; the one that came in the release is odd and doesn't work properly (not for me, at least). Well, I didn't patch the binary; I just put the IP of my WSL2 and it worked, surprisingly. I searched for the function in IDA that initializes CSMTCP, but I couldn’t find anything, so I just ignored it. Regarding the mission server, yes, it seems not to be compatible. The error we receive might be caused by it—idk? However, everything works (well on the server side). If you have any questions, I’ll be here.
CLIENT: posted by Jagger1998
NOTE: I just want to get into the game to grab nifs xD, I find this game cute so I'll be studying the launcher. If there's anything to share, I'd appreciate it.
To run the .exe, use game.exe EasyFun, or any .bat from any other Xleg game that doesn't use .bin.
The reason I did it this way was that while debugging, I found it simpler.
If you don’t want to use the .exe, open HXD or any other hexadecimal editor you have, go to the offset :38FE10, change from C3 to 55, and it will work.
View attachment 267186
1-hour fix for the mission server crash: Open the 'Mission Server HXD' or any hex editor you have. Go to offset: 2016BF and change from 08 66 34 01 to E8 4C 40 01, and it should work.
This is the Config.ini, still in enum. If anyone wants to start testing each one, feel free to do so.
C++:enum lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE : __int32{ lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNONE = 0x0, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMAXLevel = 0x1, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eItemMall = 0x2, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyMAXLV = 0x3, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRaid = 0x4, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLimitPlayerNode = 0x5, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLimitPlayerCount = 0x6, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eSecondPassword = 0x7, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eSurvivalMode = 0x8, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMaxRemoveCharDaily = 0x9, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNoApex = 0xA, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRankSwitch = 0xB, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNoLevelDiffDKP = 0xC, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFortuneBagAutoBind = 0xD, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eBindAfterCombine = 0xE, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyInviteCheck = 0xF, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eDailyLoginBonus = 0x10, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLotteryAlchemy = 0x11, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eItemmallCharacter = 0x12, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloudeepControl = 0x13, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch = 0x14, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eXignCodeEnable = 0x15, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRemoveCharResetTime = 0x16, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestMission = 0x17, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestWorld = 0x18, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestZone = 0x19, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumFamilyRankInfo = 0x1A, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumFriendRankInfo = 0x1B, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eBannerStartTime = 0x1C, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch3VS3 = 0x1D, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyLandSwitch = 0x1E, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyRentNPCSwitch = 0x1F, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch4Camps = 0x20, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloseCaptchaLogin = 0x21, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eTransportFamilyDungeon = 0x22, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloseNewRefreshEQsAttr = 0x23, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePeakSpell = 0x24, lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMAX = 0x25, }
FUNCTIONSWITCH fixed
XML:[FUNCTIONSWITCH] MAXLevel=120 ItemMall=1 FamilyMAXLV=10 Raid=1 # Limit Node Number eLimitPlayerNode= # Limit Player Count LimitPlayerCount= SecondPassword=0 SurvivalMode=1 MaxRemoveCharDaily=4 NoApex=0 RankSwitch=1 FortuneBagAutoBind=1 LotteryAlchemy=1 BindAfterCombine=1 ItemmallCharacter=1 ItemmallNumLimitDeadLine=20200714 NoLevelDiffDKP=0 FamilyInviteCheck=0 DailyLoginBonus=0 CloudeepControl=0 ColosseumSwitch=0 XignCodeEnable=0 RemoveCharResetTime=0 PerfTestMission=0 PerfTestWorld=0 PerfTestZone=0 ColosseumFamilyRankInfo=0 ColosseumFriendRankInfo=0 BannerStartTime=0 ColosseumSwitch3VS3=0 FamilyLandSwitch=0 FamilyRentNPCSwitch=0 ColosseumSwitch4Camps=0 CloseCaptchaLogin=0 TransportFamilyDungeon=0 CloseNewRefreshEQsAttr=0 PeakSpell=0
Here is the source code for the Laplace decoder and others that use this type. I parsed it to C++, because I don't use Java, but here it is saved in case someone needs it one day.
C++:#include <iostream> #include <fstream> #include <vector> #include <cstring> #include <stdexcept> #include <array> std::array<unsigned int, 256> generateCRCTable() { std::array<unsigned int, 256> crcTable; unsigned int polynomial = 0xEDB88320; for (unsigned int i = 0; i < 256; i++) { unsigned int c = i; for (size_t j = 0; j < 8; j++) { if (c & 1) { c = polynomial ^ (c >> 1); } else { c >>= 1; } } crcTable[i] = c; } return crcTable; } void processFiles(const std::string& inputFilePath, const std::string& outputFilePath) { if (inputFilePath == outputFilePath) { throw std::invalid_argument("Input and Output file paths must be different"); } std::ifstream inputFile(inputFilePath, std::ios::binary); std::ofstream outputFile(outputFilePath, std::ios::binary); if (!inputFile.is_open() || !outputFile.is_open()) { throw std::runtime_error("Failed to open files"); } std::vector<unsigned char> inputData((std::istreambuf_iterator<char>(inputFile)), std::istreambuf_iterator<char>()); if (inputData.size() <= 8) { throw std::runtime_error("Input file is too short"); } std::vector<unsigned char> outputData; outputData.reserve(inputData.size() - 8); std::vector<unsigned char> trimmedData(inputData.begin() + 8, inputData.end()); int encryptionKeys[] = { 'g', 'h', 'f', 'd', 's', 'j', 'd', 'l' }; auto crcTable = generateCRCTable(); unsigned int crcValue = 0x12345678; unsigned int secretKey1 = 0x23456789; unsigned int secretKey2 = 0x34567890; for (int key : encryptionKeys) { unsigned int tempCRC = (crcValue ^ key) & 0xFF; unsigned int crcStep = crcTable[tempCRC]; crcValue = crcStep ^ (crcValue >> 8); unsigned int updatedKey1 = (crcValue & 0xFF) + secretKey1; secretKey1 = 0x8088405 * updatedKey1 + 1; unsigned int tempKey = (secretKey1 >> 24) & 0xFF; unsigned int secretStep = (secretKey2 ^ tempKey) & 0xFF; secretKey2 = crcTable[secretStep] ^ (secretKey2 >> 8); } for (size_t i = 0; i < trimmedData.size(); ++i) { unsigned char currentByte = trimmedData[i]; unsigned int factor1 = (secretKey2 & 0xFFFF) | 2; unsigned int factor2 = factor1 ^ 1; unsigned int mixedFactor = factor1 * factor2; unsigned int encryptedByte = (currentByte ^ ((mixedFactor >> 8) & 0xFF)) & 0xFF; outputData.push_back(static_cast<unsigned char>(encryptedByte)); unsigned int crcTemp = (crcValue ^ encryptedByte) & 0xFF; crcValue = crcTable[crcTemp] ^ (crcValue >> 8); unsigned int updatedKey2 = (crcValue & 0xFF) + secretKey1; secretKey1 = 0x8088405 * updatedKey2 + 1; unsigned int tempKeyUpdate = (secretKey1 >> 24) & 0xFF; unsigned int finalSecretStep = (secretKey2 ^ tempKeyUpdate) & 0xFF; secretKey2 = crcTable[finalSecretStep] ^ (secretKey2 >> 8); } outputFile.write(reinterpret_cast<const char*>(outputData.data()), outputData.size() - 2); inputFile.close(); outputFile.close(); } int main() { try { std::string inputFilePath; std::string outputFilePath; std::cout << "File for Decode\n"; std::cin >> inputFilePath; processFiles(inputFilePath, inputFilePath+".DEC"); std::cout << "Write successful"; } catch (const std::exception& ex) { std::cerr << ex.what() << '\n'; return 1; } return 0; }