bool Protocol79::CharlistLogin(const char *username, const char *password) { NetworkMessage nm; ONThreadSafe(threadsafe); connectiontype = CHARLIST; nm.AddU8(0x01); // protocol id nm.AddU16(0x02); // client OS nm.AddU16(protocolversion); nm.AddU32(fingerprints[FINGERPRINT_TIBIADAT]); // tibia.dat nm.AddU32(fingerprints[FINGERPRINT_TIBIASPR]); // tibia.spr nm.AddU32(fingerprints[FINGERPRINT_TIBIAPIC]); // tibia.pic nm.RSABegin(); // encryption keys for (int i = 0 ; i < 4 ; i++) { nm.AddU32(key[i]); } // account number and password nm.AddU32(atol((this->username = username).c_str())); nm.AddString(this->password = password); nm.RSAEncrypt(); if (!nm.Dump(s)) { this->errormsg = "Could not write to socket.\nPossible it's a premature disconnect.\n\nCheck you typed in the correct protocol!"; ONThreadUnsafe(threadsafe); return false; } nm.Clean(); if (!nm.FillFromSocket(s)) { this->errormsg = "Could not read from socket.\nPossibly it's a premature disconnect.\n\nCheck you typed in the correct protocol!"; ONThreadUnsafe(threadsafe); return false; } printf("Okies, lets decrypt\n"); // this->Close(); nm.XTEADecrypt(key); printf("Ok, decoded\n"); logonsuccessful = true; while ((signed int)(nm.GetSize())>0 && ParsePacket(&nm)); if ((signed int)(nm.GetSize())>0) printf("++++++++++++++++++++DIDNT EMPTY UP THE NETWORKMESSAGE!++++++++++++++++++\n"); ONThreadUnsafe(threadsafe); return logonsuccessful; }
bool Protocol77::GameworldLogin () { // this is valid for 7.7! // 7.72 has a bit different order of stuff! check out old outcast's sources NetworkMessage nm; connectiontype = GAMEWORLD; nm.AddU8(0x0A); // protocol id nm.RSABegin(); // encryption keys for (int i = 0 ; i < 4 ; i++) { nm.AddU32(key[i]); } // in 7.72 onwards move this BEFORE the keys and BEFORE the encryption nm.AddU16(0x02); // client OS nm.AddU16(protocolversion); // are we a gamemaster nm.AddChar(0); // account number and password nm.AddU32(atol(this->username.c_str())); // this does NOT exist before 7.4 nm.AddString(this->charlist[this->charlistselected]->charactername); nm.AddString(this->password); nm.RSAEncrypt(); // FIXME inside dump, we should check whether or not socket is still open // or after dump, at least nm.Dump(s); nm.Clean(); nm.FillFromSocket(s ); nm.XTEADecrypt(key); logonsuccessful = true; while ((signed int)(nm.GetSize())>0 && ParsePacket(&nm)); if ((signed int)(nm.GetSize())!=0) printf("++++++++++++++++++++DIDNT EMPTY UP THE NETWORKMESSAGE!++++++++++++++++++\n"); if (logonsuccessful) active = true; return logonsuccessful; }
bool Protocol77::CharlistLogin(const char *username, const char *password) { NetworkMessage nm; connectiontype = CHARLIST; nm.AddU8(0x01); // protocol id nm.AddU16(0x02); // client OS nm.AddU16(protocolversion); nm.AddU32(fingerprints[FINGERPRINT_TIBIADAT]); // tibia.dat nm.AddU32(fingerprints[FINGERPRINT_TIBIASPR]); // tibia.spr nm.AddU32(fingerprints[FINGERPRINT_TIBIAPIC]); // tibia.pic nm.RSABegin(); // encryption keys for (int i = 0 ; i < 4 ; i++) { nm.AddU32(key[i]); } // account number and password nm.AddU32(atol((this->username = username).c_str())); nm.AddString(this->password = password); nm.RSAEncrypt(); // FIXME inside dump, we should check whether or not socket is still open // or after dump, at least nm.Dump(s); nm.Clean(); nm.FillFromSocket(s); nm.XTEADecrypt(key); logonsuccessful = true; while ((signed int)(nm.GetSize())>0 && ParsePacket(&nm)); if ((signed int)(nm.GetSize())>0) printf("++++++++++++++++++++DIDNT EMPTY UP THE NETWORKMESSAGE!++++++++++++++++++\n"); Close(); return logonsuccessful; }
bool ProtocolME0::GameworldLogin () { NetworkMessage nm; ONThreadSafe(threadsafe); connectiontype = GAMEWORLD; //nm.AddU8(0x14); //nm.AddString(this->charlist[this->charlistselected]->charactername); //spcount ++; if (!strcmp(this->charlist[this->charlistselected]->charactername, "Character Manager")) { nm.AddU8(0x0C); // charmgr... nm.AddU8(0x01); // ...enter FILE *f = fopen((std::string("save/") + this->username + ".ous").c_str(), "r"); ASSERTFRIENDLY(f, "It appears that savefile has mysteriously disappeared. Exiting"); fclose(f); } else { nm.AddU8(0x0A); // player's creature id shall be 1 nm.AddU32(1); nm.AddU8(0x32); // report bugs? nm.AddU8(0); nm.AddU8(0); nm.AddU8(0x64); // player teleport nm.AddU16(30); nm.AddU16(30); nm.AddU8(7); int tilesremaining = 18*14*7; for (int i = 0; i < 18; i ++) for (int j = 0; j < 14; j++) { printf("%d\n", tilesremaining); nm.AddU16(102); if (i == 8 && j == 6) { nm.AddU16(0x0061); nm.AddU32(0); // remove with this id nm.AddU32(1); // creatureid -- player is 1 nm.AddString("Newbie"); nm.AddU8(25); // health nm.AddU8(0); //dir nm.AddU16(128); // lookid nm.AddU8(50); nm.AddU8(60); nm.AddU8(70); nm.AddU8(80); nm.AddU8(0); // addons nm.AddU8(0); // lightlevel nm.AddU8(0); // lightcolor nm.AddU16(500); // speed nm.AddU8(0); // skull nm.AddU8(0); // shield } tilesremaining--; nm.AddU16(0xFF00); } while(tilesremaining) { nm.AddU8(tilesremaining > 255 ? 255 : tilesremaining); tilesremaining -= tilesremaining > 255 ? 255 : tilesremaining; printf("%d\n", tilesremaining); nm.AddU8(0xFF); } } ((GM_MainMenu*)game)->DestroyCharlist(); // by default logon is a success logonsuccessful = true; packetparsing: while ((signed int)(nm.GetSize())>0 && ParsePacket(&nm)); if ((signed int)(nm.GetSize())>0) printf("++++++++++++++++++++DIDNT EMPTY UP THE NETWORKMESSAGE!++++++++++++++++++\n"); ONThreadUnsafe(threadsafe); return logonsuccessful; }
bool ProtocolME0::CharlistLogin(const char *username, const char *password) { NetworkMessage nm; ONThreadSafe(threadsafe); connectiontype = CHARLIST; this->username = username; this->password = password; FILE *f = fopen((std::string("save/") + username + ".ous").c_str(),"r"); if (!f) { FILE *fo = fopen((std::string("save/") + username + ".ous").c_str(),"w"); if (!fo) { nm.AddU8(0x0A); nm.AddString("You need write permissions on save/ subfolder of \nThe Outcast to start a local game."); goto packetparsing; } else { fprintf(fo, "%s\n", password); fclose(fo); f = fopen((std::string("save/") + username + ".ous").c_str(),"r"); } } { char filepwd[255]; fscanf(f, "%s", filepwd); if (strcmp(filepwd, password)) { nm.AddU8(0x0A); nm.AddString("You entered incorrect password."); } else { char charname[255]; nm.AddU8(0x14); nm.AddString("7435\nWelcome to Clavicula, a singleplayer mode for The Outcast!\n\nClavicula is an attempt to create a singleplayer game \nsimilar to Tibia. To create a character, choose Character\nManager option from the character list."); nm.AddU8(0x64); int pos = ftell(f); int spcount = 0; while (fscanf(f, "%s", charname)==1) spcount ++; fseek(f, pos, SEEK_SET); nm.AddU8(1 + spcount); // one character is CREATE CHARACTER, others are temp count to make dynamic list nm.AddString("Character Manager"); nm.AddString("Clavicula"); nm.AddU32(0); // ip address nm.AddU16(0); // port while (fscanf(f, "%s", charname)==1) { nm.AddString(charname); nm.AddString("Clavicula"); nm.AddU32(0); // ip address nm.AddU16(0); // port } nm.AddU16(0); // free account } } // by default logon is a success logonsuccessful = true; packetparsing: while ((signed int)(nm.GetSize())>0 && ParsePacket(&nm)); if ((signed int)(nm.GetSize())>0) printf("++++++++++++++++++++DIDNT EMPTY UP THE NETWORKMESSAGE!++++++++++++++++++\n"); ONThreadUnsafe(threadsafe); return logonsuccessful; }