Rotciv 2 Postado Março 26, 2006 Share Postado Março 26, 2006 (editado) Créditos a Strider Ai está o código do Ruly the account manager: Em Game.cpp, na inclusão dos headers, inclua ioaccount.h: #ifdef YUR_LOGIN_QUEUEif (!p || c->access >= g_config.ACCESS_ENTER || #ifdef YUR_PREMIUM_PROMOTION (p->premmium == true && !g_config.QUEUE_PREMMY) ||#endif //YUR_PREMIUM_PROMOTION loginQueue.login(p->accountNumber, getPlayersOnline(), max_players, placeInQueue)) {#else //YUR_LOGIN_QUEUEif (!p || c->access >= g_config.ACCESS_ENTER || getPlayersOnline() < max_players Adicione: void Game::updateTile(const Position& pos){SpectatorVec list;SpectatorVec::iterator i;getSpectators(Range(pos), list);for(i = list.begin(); i != list.end(); ++i)(*i)->onTileUpdated(pos);}#endif //SG_LVLDOOR#ifdef TLM_BEDbool Game::loadBeds(std::string file) { xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, p, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return -1; } tmp = root->children; int x,y,z,id; while(tmp){ if (strcmp((char*) tmp->name, "bed")==0){ x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); id = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "id")); Position mainPos(x, y, z); Item *mainItem = Item::CreateItem(id); Tile *mainTile = getTile(mainPos.x, mainPos.y, mainPos.z); if (mainTile && mainItem){ Position nextPos(x, y, z); Item *nextItem = Item::CreateItem(id+1); if (id == BED_ID1 || id == BED_ID3 || id == BED_ID7 || id == BED_ID8){ nextPos.y++; } else if(id == BED_ID2 || id == BED_ID4 || id == BED_ID9 || id == BED_ID10){ nextPos.x++; } Tile *nextTile = getTile(nextPos.x, nextPos.y, nextPos.z); if (nextTile && nextItem){ mainTile->addThing(mainItem); mainItem->pos = mainPos; nextTile->addThing(nextItem); nextItem->pos = nextPos; } } } tmp = tmp->next; } xmlFreeDoc(doc); return 0; } return -1;}std::string Game::getBedSleeper(const Position pos){ std::string file="data/world/beds.xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return "Nobody"; } tmp = root->children; while(tmp){ if (strcmp((const char*) tmp->name, "bed")==0){ int x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); int y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); int z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); if (x == pos.x && y == pos.y && z == pos.z){ return (const char*)xmlGetProp(tmp, (const xmlChar *)"name"); } } tmp = tmp->next; } xmlFreeDoc(doc); } return "Nobody";}unsigned int Game::getBedID(const Position pos){ std::string file="data/world/beds.xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return 0; } tmp = root->children; while(tmp){ if (strcmp((const char*) tmp->name, "bed")==0){ int x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); int y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); int z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); if (x == pos.x && y == pos.y && z == pos.z){ return atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "id")); } } tmp = tmp->next; } xmlFreeDoc(doc); } return 0;}bool Game::changeBed(const Position pos, unsigned int oldid, std::string sleepname){ Tile *maintile = getTile(pos.x,pos.y,pos.z); Item *mainitem = dynamic_cast<Item*>(maintile->getThingByStackPos(maintile->getThingCount()-1)); if (mainitem && maintile->isPz()){ Position tilePos(pos.x, pos.y, pos.z); if (oldid == BED_ID1 || oldid == BED_ID3 || oldid == BED_ID7 || oldid == BED_ID8){ tilePos.y++; } else if(oldid == BED_ID2 || oldid == BED_ID4 || oldid == BED_ID9 || oldid == BED_ID10){ tilePos.x++; } Tile *nexttile = getTile(tilePos.x,tilePos.y,tilePos.z); Item *nextitem = dynamic_cast<Item*>(nexttile->getThingByStackPos(maintile->getThingCount()-1)); if (nextitem && nexttile->isPz()){ if (oldid == BED_ID1 || oldid == BED_ID3){ mainitem->setID(oldid+8); } else if(oldid == BED_ID2){ mainitem->setID(BED_ID10); } else if(oldid == BED_ID4){ mainitem->setID(BED_ID9); } else if(oldid == BED_ID7 || oldid == BED_ID8){ mainitem->setID(oldid-8); } else if(oldid == BED_ID9){ mainitem->setID(BED_ID4); } else if(oldid == BED_ID10){ mainitem->setID(BED_ID2); } nextitem->setID(mainitem->getID()+1); SpectatorVec list; SpectatorVec::iterator it; getSpectators(Range(tilePos, true), list); //players for(it = list.begin(); it != list.end(); ++it) { if(dynamic_cast<Player*>(*it)) { (*it)->onTileUpdated(pos); (*it)->onTileUpdated(tilePos); } } //Player *player = dynamic_cast<Player*>(player); //player->onTileUpdated(pos); //player->onTileUpdated(tilePos); std::string file="data/world/beds.xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return false; } Position bedPos[1000];// 1000 = number of beds unsigned int id[1000]; std::string name[1000]; int i = 0; tmp = root->children; while(tmp){ if (strcmp((const char*) tmp->name, "bed")==0){ i++; bedPos[i].x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x" )); bedPos[i].y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y" )); bedPos[i].z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z" )); id[i] = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "id" )); name[i] = (const char*) xmlGetProp(tmp, (const xmlChar*) "name"); if (bedPos[i] == pos){ id[i] = mainitem->getID(); name[i] = sleepname; } } tmp = tmp->next; } doc = xmlNewDoc((const xmlChar*)"1.0"); doc->children = xmlNewDocNode(doc, NULL, (const xmlChar*)"beds", NULL); root = doc->children; std::stringstream sb; for(int x = 1; x <= i; x++){ tmp = xmlNewNode(NULL,(const xmlChar*)"bed"); sb << bedPos[x].x; xmlSetProp(tmp, (const xmlChar*) "x" , (const xmlChar*)sb.str().c_str()); sb.str(""); sb << bedPos[x].y; xmlSetProp(tmp, (const xmlChar*) "y" , (const xmlChar*)sb.str().c_str()); sb.str(""); sb << bedPos[x].z; xmlSetProp(tmp, (const xmlChar*) "z" , (const xmlChar*)sb.str().c_str()); sb.str(""); sb << id[x]; xmlSetProp(tmp, (const xmlChar*) "id", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << name[x]; xmlSetProp(tmp, (const xmlChar*) "name", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlAddChild(root, tmp); } xmlSaveFile(file.c_str(), doc); xmlFreeDoc(doc); return true; }return false;}}}Position Game::getBedPos(std::string name){ std::string file="data/world/beds.xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return Position(0xFFFF,0xFFFF,0xFF); } tmp = root->children; while(tmp){ if (strcmp((const char*) tmp->name, "bed")==0){ std::string sleepname = (const char*)xmlGetProp(tmp, (const xmlChar *)"name"); if (sleepname == name){ int x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); int y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); int z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); return Position(x,y,z); } } tmp = tmp->next; } xmlFreeDoc(doc); } return Position(0xFFFF,0xFFFF,0xFF);}#endif Adicione: #ifdef RULY_ACCMANAGERvoid Game::accCreator(Player* player, std::string &text){ player->onCreatureSay(player, SPEAK_SAY, text); if(player->managerActive == 0){ if(text == "hi" || text == "hello") { player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Hello dude, how are you feeling today?"); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: If you want to continue, just type \"account\"."); return; } else if(text == "account") { player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Ok, feel free to type the account that you wish!"); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Fique a vontade para digitar a sua conta."); player->managerActive = 1; return; } else{ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Sorry, i cant understand this, can you type again?"); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Desculpe, eu não entendo. Pode digitar novamente?"); return; } } if(player->managerActive == 1) { if(player->willSayYesOrNo == 0){ bool okj = false; if(text.length() >= 8 || text.length() <= 4) { player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Your account must have more than 4 digits and less than 8."); return; } for(int i = 0; i < text.length(); i++){ if(isdigit(text[i])) okj = true; else{ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: You must type only numbers."); return; } } if(okj){ std::string filename="data/accounts/"+text+".xml"; //std::transform (filename.begin(),filename.end(), filename.begin(), tolower); std::ifstream ifile; ifile.open(filename.c_str()); // Passing the return value of a function to another function if (ifile){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Sorry, this account already exist =(. Type another account."); } else{ std::stringstream msg; msg << "Ruly the Acc Manager: So, do you want "<<text<<" as your account?"; player->sendTextMessage(MSG_BLUE_TEXT, msg.str().c_str()); player->willSayYesOrNo = 1; player->newAcc = text; } ifile.close(); return; } } if(player->willSayYesOrNo == 1){ if(text == "yes"){ player->managerActive = 3; player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Ok, please type a password."); player->willSayYesOrNo = 0; return; } else if(text == "no"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Ok..."); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: If you want to continue, just type \"account\"."); player->willSayYesOrNo = 0; player->managerActive = 0; return; } else{ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Sorry, invalid command."); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: If you want to continue, just type \"account\"."); player->willSayYesOrNo = 0; player->managerActive = 0; return; } } } if(player->managerActive == 2){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: You alredy created your account. Please log off from this manager and log using your account and password."); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Você já criou a sua conta. Por favor saia desse gerenciador e entre com a sua conta e a sua senha."); return; } if(player->managerActive == 3){ if(player->passIsOk == 0){ std::stringstream msg; msg << "Ruly the Acc Manager: So, do you want "<<text<<" as your password?"; player->sendTextMessage(MSG_BLUE_TEXT, msg.str().c_str()); player->newPass = text; player->passIsOk = 1; return; } if(player->passIsOk == 1){ if(text == "yes"){ //Create Account std::string filename = "data/accounts/"+player->newAcc+".xml"; std::stringstream sb; xmlDocPtr doc; xmlMutexLock(xmlmutex); xmlNodePtr nn, sn, pn, root; doc = xmlNewDoc((const xmlChar*)"1.0"); doc->children = xmlNewDocNode(doc, NULL, (const xmlChar*)"account", NULL); root = doc->children; //xmlSetProp(root, (const xmlChar*) "pass", (const xmlChar*)"manager01"); sb.str(""); sb << player->newPass;xmlSetProp(root, (const xmlChar*) "pass", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlSetProp(root, (const xmlChar*) "type", (const xmlChar*)"1"); sb.str(""); xmlSetProp(root, (const xmlChar*) "premDays", (const xmlChar*)"0"); sb.str(""); sb.str(""); sb << player->newAcc; sn = xmlNewNode(NULL,(const xmlChar*)"characters"); pn = xmlNewNode(NULL,(const xmlChar*)"character"); //xmlSetProp(pn, (const xmlChar*) "name", (const xmlChar*)"Trs Manager"); xmlSetProp(pn, (const xmlChar*) "name", (const xmlChar*)sb.str().c_str()); xmlAddChild(sn, pn); xmlAddChild(root, sn); if (xmlSaveFile(filename.c_str(), doc)) { #ifdef __DEBUG__ std::cout << ":: Accound Created!\n"; #endif xmlFreeDoc(doc); xmlMutexUnlock(xmlmutex); //return; } else { std::cout << "\tCouldn't save character =(\n"; xmlFreeDoc(doc); xmlMutexUnlock(xmlmutex); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Ops, we had a problem...Please start all again."); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Ops, nós temos um problema, não foi possível criar a sua conta. Por favor reinicie todo o processo."); player->managerActive = 1; return; } //Step to create the personal acc manager player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Ok, your account has been created. Relog using your account and password."); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Você já criou a sua conta. Por favor saia desse gerenciador e entre com a sua conta e a sua senha."); player->passIsOk = 0; player->managerActive = 2; std::cout << " New Account Created: " << player->newAcc << "." << std::endl; doSavePlayer(player); return; } else if(text == "no"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Type another password then..."); player->passIsOk = 0; return; } else{ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Sorry I cant understand this..."); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Type another password then..."); player->passIsOk = 0; return; } } } }bool Game::doSavePlayer(Player* player){ std::string filename2 = "data/players/"+player->newAcc+".xml"; std::stringstream sb; xmlDocPtr doc; xmlMutexLock(xmlmutex); xmlNodePtr nn, sn, pn, root; doc = xmlNewDoc((const xmlChar*)"1.0"); doc->children = xmlNewDocNode(doc, NULL, (const xmlChar*)"player", NULL); root = doc->children; sb << player->newAcc; xmlSetProp(root, (const xmlChar*) "name", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << player->newAcc; xmlSetProp(root, (const xmlChar*) "account", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "1"; xmlSetProp(root, (const xmlChar*) "sex", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "2"; xmlSetProp(root, (const xmlChar*) "lookdir", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "0"; xmlSetProp(root, (const xmlChar*) "exp", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "0"; xmlSetProp(root, (const xmlChar*) "voc", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "1"; xmlSetProp(root, (const xmlChar*) "level", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "0"; xmlSetProp(root, (const xmlChar*) "access", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "300"; xmlSetProp(root, (const xmlChar*) "cap", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "0"; xmlSetProp(root, (const xmlChar*) "maglevel", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "0"; xmlSetProp(root, (const xmlChar*) "vipsize", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "1"; xmlSetProp(root, (const xmlChar*) "lastlogin", (const xmlChar*)sb.str().c_str()); sb.str(""); pn = xmlNewNode(NULL,(const xmlChar*)"spawn"); sb << "207"; xmlSetProp(pn, (const xmlChar*) "x", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "26"; xmlSetProp(pn, (const xmlChar*) "y", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "7"; xmlSetProp(pn, (const xmlChar*) "z", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlAddChild(root, pn); pn = xmlNewNode(NULL,(const xmlChar*)"temple"); sb << "207"; xmlSetProp(pn, (const xmlChar*) "x", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "26"; xmlSetProp(pn, (const xmlChar*) "y", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "7"; xmlSetProp(pn, (const xmlChar*) "z", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlAddChild(root, pn); pn = xmlNewNode(NULL,(const xmlChar*)"health"); sb << "100"; xmlSetProp(pn, (const xmlChar*) "now", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "100"; xmlSetProp(pn, (const xmlChar*) "max", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << "0"; xmlSetProp(pn, (const xmlChar*) "food", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlAddChild(root, pn); pn = xmlNewNode(NULL,(const xmlChar*)"mana"); sb << 100; xmlSetProp(pn, (const xmlChar*) "now", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << 100; xmlSetProp(pn, (const xmlChar*) "max", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << 0; xmlSetProp(pn, (const xmlChar*) "spent", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlAddChild(root, pn); pn = xmlNewNode(NULL,(const xmlChar*)"look"); sb << 73; xmlSetProp(pn, (const xmlChar*) "type", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << 50; xmlSetProp(pn, (const xmlChar*) "head", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << 50; xmlSetProp(pn, (const xmlChar*) "body", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << 50; xmlSetProp(pn, (const xmlChar*) "legs", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << 50; xmlSetProp(pn, (const xmlChar*) "feet", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlAddChild(root, pn); //Save the character if (xmlSaveFile(filename2.c_str(), doc)) { #ifdef __DEBUG__ std::cout << "\tSaved character succefully!\n"; #endif xmlFreeDoc(doc); xmlMutexUnlock(xmlmutex); return true; } else { std::cout << "\tCouldn't save character =(\n"; xmlFreeDoc(doc); xmlMutexUnlock(xmlmutex); return false; }}void Game::accManager(Player* player, std::string &text){ player->onCreatureSay(player, SPEAK_SAY, text); if(player->managerActive == 0){ if(text == "character"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Please type your new char name."); player->managerActive = 1; return; } if(text == "password"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Sorry, you cant change password."); player->managerActive == 1; return; } } if(player->managerActive == 1){ bool okj = false; if(text.length() > 15 || text.length() < 1) { player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Your name must have more than 1 char, and less than 15."); return; } for(int i = 0; i <= text.length(); i++){ if(!isdigit(text[i])) okj = true; else{ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: You can't type numbers on your name."); return; } }for(int i=0; i <= text.length(); i++){ if((text[i] == 'g' && text[i+1] == 'm') || (text[i] == 'g' && text[i+1] == 'M') || (text[i] == 'G' && text[i+1] == 'm') || (text[i] == 'G' && text[i+1] == 'M') || (text[i] == 't' && text[i+1] == 'r') || (text[i] == 'T' && text[i+1] == 'r') || (text[i] == 't' && text[i+1] == 'R') || (text[i] == 'T' && text[i+1] == 'R') || (text[i] == 'f' && text[i+1] == 'u' && text[i+2] == 'c' && text[i+3] == 'k') || (text[i] == 'F' && text[i+1] == 'U' && text[i+2] == 'C' && text[i+3] == 'K') || (text[i] == 'F' && text[i+1] == 'u' && text[i+2] == 'c' && text[i+3] == 'k') || (text[i] == 's' && text[i+1] == 'h' && text[i+2] == 'i' && text[i+3] == 't') || (text[i] == 'b' && text[i+1] == 'i' && text[i+2] == 't' && text[i+3] == 'c' && text[i+4] == 'h') || (text[i] == 'B' && text[i+1] == 'i' && text[i+2] == 't' && text[i+3] == 'c' && text[i+4] == 'h') || (text[i] == '~') || (text[i] == '.') || (text[i] == ';') || (text[i] == '\\') || (text[i] == '/') || (text[i] == '?') || (text[i] == ',') || (text[i] == '<') || (text[i] == '>') || (text[i] == '(') || (text[i] == ')') || (text[i] == '-') || (text[i] == '_') || (text[i] == '=') || (text[i] == '[') || (text[i] == ']') || (text[i] == '{') || (text[i] == '}') || (text[i] == '|') || (text[i] == '`') || (text[i] == '*') || (text[i] == '&') || (text[i] == '^') || (text[i] == '%') || (text[i] == '$') || (text[i] == '#') || (text[i] == '@') || (text[i] == '!')){ player->sendTextMessage(MSG_RED_TEXT, "Ruly the Acc Manager: Your name violates the name rules.\nPlease retype your name."); return; } } if(text[0] == ' ' || text[0] == ' '){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Invalid character on your name...Type it again."); return; } std::string filename="data/players/"+text+".xml"; std::ifstream ifile; ifile.open(filename.c_str()); // Passing the return value of a function to another function if (ifile){ player->sendTextMessage(MSG_SMALLINFO, "Ruly the Acc Manager: Sorry, this player already exist, type another name."); return; } if(okj){ std::stringstream inutil; inutil <<"Ruly the Acc Manager: "<<text<<". Interesting name. Male or female?"; player->newCharName = text; player->managerActive = 2; player->sendTextMessage(MSG_BLUE_TEXT, inutil.str().c_str()); return; } } if(player->managerActive == 2){ if(text == "male"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: So we got more 1 men(or not) on this server... What vocation do you want to follow?"); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: You can be a \"knight\", a \"paladin\", a \"druid\" or a \"sorcerer\"."); player->newSex = 1; player->managerActive = 3; return; } else if(text == "female"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: OH YEAH!! A new girl?!?! What vocation do you want to follow babe?"); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: You can be a \"knight\", a \"paladin\", a \"druid\" or a \"sorcerer\"."); player->newSex = 0; player->managerActive = 3; return; } else{ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: I cant understand this gender, do you typed it right???"); return; } } if(player->managerActive == 3){ if(text == "knight"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: A powerfull warrior you want to be, are you sure?"); player->newVoc = 4; player->managerActive = 4; return; } else if(text == "paladin"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: A mighty archer you want to be, are you sure?"); player->newVoc = 3; player->managerActive = 4; return; } else if(text == "druid"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: A warrior of the nature you want to be, are you sure?"); player->newVoc = 2; player->managerActive = 4; return; } else if(text == "sorcerer"){ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: A dangerous magician you want to be, are you sure?"); player->newVoc = 1; player->managerActive = 4; return; } else{ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Pay atention to what you write young adventurer, this vocation is invalid."); return; } } if(player->managerActive == 4) { if(text == "yes") { doSaveNewAccount(player); std::stringstream x; x << "data/players/" << player->newCharName << ".xml"; const char *file = x.str().c_str(); ofstream save(file); save << "<?xml version=\"1.0\"?>\n"; save << "<player name=\"" << player->newCharName << "\" account=\"" << player->accountNumber << "\" "; save << "sex=\"" << player->newSex << "\" "; //save << "lookdir=\"0\" exp=\"4200\" "; save << "lookdir=\"0\" exp=\"" << g_config.MANAGER_P_EXP << "\" "; save << "voc=\"" << player->newVoc << "\" "; if(player->newVoc == 1 || player->newVoc == 2) save << "level=\"" << g_config.MANAGER_P_LVL << "\" access=\"0\" cap=\"" << g_config.MANAGER_CAP_MAGE << "\" "; else if(player->newVoc == 3) save << "level=\"" << g_config.MANAGER_P_LVL << "\" access=\"0\" cap=\"" << g_config.MANAGER_CAP_PALLY << "\" "; else if(player->newVoc == 4) save << "level=\"" << g_config.MANAGER_P_LVL << "\" access=\"0\" cap=\"" << g_config.MANAGER_CAP_KNIGHT << "\" "; if(player->newVoc == 1) save << "maglevel=\"" << g_config.MANAGER_MAGE_ML << "\">\n"; else if(player->newVoc == 2) save << "maglevel=\"" << g_config.MANAGER_MAGE_ML << "\">\n"; else if(player->newVoc == 3) save << "maglevel=\"" << g_config.MANAGER_PALLY_ML << "\">\n"; else if(player->newVoc == 4) save << "maglevel=\"" << g_config.MANAGER_KNIGHT_ML << "\">\n"; save << "<spawn x=\"" << g_config.MANAGER_TEMPLE_X << "\" y=\"" << g_config.MANAGER_TEMPLE_Y << "\" z=\"" << g_config.MANAGER_TEMPLE_Z << "\"/>\n"; save << "<temple x=\"" << g_config.MANAGER_TEMPLE_X << "\" y=\"" << g_config.MANAGER_TEMPLE_Y << "\" z=\"" << g_config.MANAGER_TEMPLE_Z << "\"/>\n"; if(player->newVoc == 1 || player->newVoc == 2) save << "<health now=\"" << g_config.MANAGER_MAGES_HP << "\" max=\"" << g_config.MANAGER_MAGES_HP << "\" food=\"0\"/>\n"; else if(player->newVoc == 3) save << "<health now=\"" << g_config.MANAGER_PALLY_HP << "\" max=\"" << g_config.MANAGER_PALLY_HP << "\" food=\"0\"/>\n"; else if(player->newVoc == 4) save << "<health now=\"" << g_config.MANAGER_KNIGHT_HP << "\" max=\"" << g_config.MANAGER_KNIGHT_HP << "\" food=\"0\"/>\n"; if(player->newVoc == 1 || player->newVoc == 2) save << "<mana now=\"" << g_config.MANAGER_MAGES_MANA << "\" max=\"" << g_config.MANAGER_MAGES_MANA << "\" spent=\"0\"/>\n"; else if(player->newVoc == 3) save << "<mana now=\"" << g_config.MANAGER_PALLY_MANA << "\" max=\"" << g_config.MANAGER_PALLY_MANA << "\" spent=\"0\"/>\n"; else if(player->newVoc == 4) save << "<mana now=\"" << g_config.MANAGER_KNIGHT_MANA << "\" max=\"" << g_config.MANAGER_KNIGHT_MANA << "\" spent=\"0\"/>\n"; if(player->newSex == 0) save << "<look type=\"136\" head=\"97\" body=\"129\" legs=\"129\" feet=\"114\"/>\n"; else save << "<look type=\"128\" head=\"97\" body=\"129\" legs=\"129\" feet=\"81\"/>\n"; save << "<skills>\n"; if(player->newVoc == 1 || player->newVoc == 2) { save << "<skill skillid=\"0\" level=\"" << g_config.MANAGER_MAGES_FIST << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"1\" level=\"" << g_config.MANAGER_MAGES_CLUB << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"2\" level=\"" << g_config.MANAGER_MAGES_SWORD << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"3\" level=\"" << g_config.MANAGER_MAGES_AXE << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"4\" level=\"" << g_config.MANAGER_MAGES_DISTANCE << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"5\" level=\"" << g_config.MANAGER_MAGES_SHIELD << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"6\" level=\"" << g_config.MANAGER_MAGES_FISHING << "\" tries=\"0\"/>\n"; } else if(player->newVoc == 3) { save << "<skill skillid=\"0\" level=\"" << g_config.MANAGER_PALLY_FIST << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"1\" level=\"" << g_config.MANAGER_PALLY_CLUB << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"2\" level=\"" << g_config.MANAGER_PALLY_SWORD << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"3\" level=\"" << g_config.MANAGER_PALLY_AXE << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"4\" level=\"" << g_config.MANAGER_PALLY_DISTANCE << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"5\" level=\"" << g_config.MANAGER_PALLY_SHIELD << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"6\" level=\"" << g_config.MANAGER_PALLY_FISHING << "\" tries=\"0\"/>\n"; } else if(player->newVoc == 4) { save << "<skill skillid=\"0\" level=\"" << g_config.MANAGER_KNIGHT_FIST << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"1\" level=\"" << g_config.MANAGER_KNIGHT_CLUB << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"2\" level=\"" << g_config.MANAGER_KNIGHT_SWORD << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"3\" level=\"" << g_config.MANAGER_KNIGHT_AXE << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"4\" level=\"" << g_config.MANAGER_KNIGHT_DISTANCE << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"5\" level=\"" << g_config.MANAGER_KNIGHT_SHIELD << "\" tries=\"0\"/>\n"; save << "<skill skillid=\"6\" level=\"" << g_config.MANAGER_KNIGHT_FISHING << "\" tries=\"0\"/>\n"; } save << "</skills>\n"; save << "<inventory>\n"; save << "<slot slotid=\"1\"><item id=\"" << g_config.MANAGER_ALL_SLOT1 << "\"/></slot>\n"; if(player->newVoc == 1 || player->newVoc == 2) { save << "<slot slotid=\"3\"><item id=\"3940\"><inside><item id=\"2260\"/><item id=\"2260\"/><item id=\"2260\"/><item id=\"2120\"/><item id=\"2554\"/><item id=\"2152\" count=\"2\"/></inside></item></slot>\n"; save << "<slot slotid=\"5\"><item id=\"" << g_config.MANAGER_ALL_SLOT5 << "\"/></slot>\n"; save << "<slot slotid=\"6\"><item id=\"" << g_config.MANAGER_ALL_SLOT6 << "\"/></slot>\n"; save << "<slot slotid=\"10\"><item id=\"" << g_config.MANAGER_ALL_SLOT10 << "\"/></slot>\n"; } else if(player->newVoc == 3) { save << "<slot slotid=\"3\"><item id=\"3940\"><inside><item id=\"2543\" count=\"100\"/><item id=\"2120\"/><item id=\"2554\"/><item id=\"2580\"/><item id=\"2152\" count=\"2\"/></inside></item></slot>\n"; save << "<slot slotid=\"5\"><item id=\"" << g_config.MANAGER_ALL_SLOT5 << "\"/></slot>\n"; save << "<slot slotid=\"6\"><item id=\"" << g_config.MANAGER_ALL_SLOT6 << "\"/></slot>\n"; save << "<slot slotid=\"10\"><item id=\"" << g_config.MANAGER_ALL_SLOT10 << "\"/></slot>\n"; } else if(player->newVoc == 4) { save << "<slot slotid=\"3\"><item id=\"3940\"><inside><item id=\"2413\"/><item id=\"2120\"/><item id=\"2554\"/><item id=\"2152\" count=\"2\"/></inside></item></slot>\n"; save << "<slot slotid=\"5\"><item id=\"" << g_config.MANAGER_ALL_SLOT5 << "\"/></slot>\n"; save << "<slot slotid=\"6\"><item id=\"" << g_config.MANAGER_ALL_SLOT6 << "\"/></slot>\n"; save << "<slot slotid=\"10\"><item id=\"" << g_config.MANAGER_ALL_SLOT10 << "\"/></slot>\n"; } save << "<slot slotid=\"4\"><item id=\"" << g_config.MANAGER_ALL_SLOT4 << "\"/></slot>\n"; save << "<slot slotid=\"7\"><item id=\"" << g_config.MANAGER_ALL_SLOT7 << "\"/></slot>\n"; save << "<slot slotid=\"8\"><item id=\"" << g_config.MANAGER_ALL_SLOT8 << "\"/></slot>\n"; save << "</inventory>\n"; save << "<depots><depot depotid=\"1\"><item id=\"2591\"><inside><item id=\"2594\"/></inside></item></depot><depot depotid=\"2\"><item id=\"2591\"><inside><item id=\"2594\"/></inside></item></depot><depot depotid=\"3\"><item id=\"2591\"><inside><item id=\"2594\"/></inside></item></depot><depot depotid=\"4\"><item id=\"2591\"><inside><item id=\"2594\"/></inside></item></depot><depot depotid=\"5\"><item id=\"2591\"><inside><item id=\"2594\"/></inside></item></depot></depots><storage/>\n</player>"; save.close(); player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Operation complete. Please log out and login again."); std::cout << " New Char Created: " << player->newCharName << "." << std::endl; return; } else if(text == "no"){ player->newVoc = 0; player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Ok, choose another vocation then."); player->managerActive = 3; return; } else{ player->sendTextMessage(MSG_BLUE_TEXT, "Ruly the Acc Manager: Cant understand this command, can you type again?"); return; } }}void Game::doPreVoc(Player* player){ if(player->newSex == 1) player->newLookMaster = 128; else player->newLookMaster = 77; if(player->newVoc == 1)//Sorcerer { player->newHealth = 1200; player->newHealthMax = 1200; player->newMana = 2400; player->newManaMax = 2400; player->newMagLvl = 65; } if(player->newVoc == 2)//Druid { player->newHealth = 1200; player->newHealthMax = 1200; player->newMana = 2400; player->newManaMax = 2400; player->newMagLvl = 65; } if(player->newVoc == 3)//Pally { player->newHealth = 1400; player->newHealthMax = 1400; player->newMana = 1400; player->newManaMax = 1400; player->newMagLvl = 20; } if(player->newVoc == 4)//Knight { player->newHealth = 2500; player->newHealthMax = 2500; player->newMana = 1000; player->newManaMax = 1000; player->newMagLvl = 9; }}void Game::doSaveNewAccount(Player* player){ Account account = IOAccount::instance()->loadAccount(player->accountNumber); char accstring[16]; sprintf(accstring, "%i", account.accnumber); std::list<std::string>::iterator it; for (it = account.charList.begin(); it != account.charList.end(); it++) { if((*it) != "" && (*it) != accstring && (*it) != account.password){ player->charOnList[player->passIsOk] = (*it); } player->passIsOk += 1; } doStep2(player);}void Game::doStep2(Player* player)//We had to read before to save... Sad thing huh?{ //Create Account Account account = IOAccount::instance()->loadAccount(player->accountNumber); std::stringstream PKWarning; PKWarning << "data/accounts/"<<player->accountNumber<<".xml"; std::string filename = PKWarning.str().c_str(); std::stringstream sb; xmlDocPtr doc; xmlMutexLock(xmlmutex); xmlNodePtr nn, sn, pn, root; doc = xmlNewDoc((const xmlChar*)"1.0"); doc->children = xmlNewDocNode(doc, NULL, (const xmlChar*)"account", NULL); root = doc->children; sb << account.password;xmlSetProp(root, (const xmlChar*) "pass", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlSetProp(root, (const xmlChar*) "type", (const xmlChar*)"1"); sb.str(""); xmlSetProp(root, (const xmlChar*) "premDays", (const xmlChar*)"0"); sb.str(""); sn = xmlNewNode(NULL,(const xmlChar*)"characters"); std::stringstream sc; pn = xmlNewNode(NULL,(const xmlChar*)"character"); sb << player->accountNumber; xmlSetProp(pn, (const xmlChar*) "name", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlAddChild(sn, pn); for(int a=1; a<=20; ++a){ if(player->charOnList[a] != "" && player->charOnList[a] != account.password){ pn = xmlNewNode(NULL,(const xmlChar*)"character"); sc << player->charOnList[a]; xmlSetProp(pn, (const xmlChar*) "name", (const xmlChar*)sc.str().c_str()); sc.str(""); xmlAddChild(sn, pn); } } std::stringstream sd; pn = xmlNewNode(NULL,(const xmlChar*)"character"); sd << player->newCharName; xmlSetProp(pn, (const xmlChar*) "name", (const xmlChar*)sd.str().c_str()); sd.str(""); xmlAddChild(sn, pn); xmlAddChild(root, sn); if (xmlSaveFile(filename.c_str(), doc)) { #ifdef __DEBUG__ std::cout << ":: Accound Created!\n"; #endif xmlFreeDoc(doc); xmlMutexUnlock(xmlmutex); return; } else { std::cout << "\tCouldn't save character =(\n"; xmlFreeDoc(doc); xmlMutexUnlock(xmlmutex); return; }}#endif Na declaração das funções adicione: #ifdef RULY_ACCMANAGER void accCreator(Player* player, std::string &text);void accManager(Player* player, std::string &text);bool doSavePlayer(Player* player);void doPreVoc(Player* player);void doSaveNewAccount(Player* player);void doStep2(Player* player);#endif Editado Abril 10, 2006 por GM Rotciv Link para o comentário Compartilhar em outros sites More sharing options...
Rotciv 2 Postado Março 26, 2006 Autor Share Postado Março 26, 2006 (editado) Continuando... Agora em luascript, vamos declarar as variáveis à serem utilizadas pelo Account Manager. Na função LuaScript::OpenFile(). Depois de: #ifdef RULY_ACCMANAGER MANAGER_P_EXP = getGlobalNumber("managerexp",4200); MANAGER_P_LVL = getGlobalNumber("managerlvl",8); MANAGER_CAP_MAGE = getGlobalNumber("managercapmage",4200); MANAGER_CAP_PALLY = getGlobalNumber("managercappally",4200); MANAGER_CAP_KNIGHT = getGlobalNumber("managercapknight",4200); MANAGER_MAGE_ML = getGlobalNumber("managermageml",0); MANAGER_PALLY_ML = getGlobalNumber("managerpallyml",0); MANAGER_KNIGHT_ML = getGlobalNumber("managerknightml",0); MANAGER_TEMPLE_X = getGlobalNumber("managertemplex",160); MANAGER_TEMPLE_Y = getGlobalNumber("managertempley",54); MANAGER_TEMPLE_Z = getGlobalNumber("managertemplez",7); MANAGER_MAGES_HP = getGlobalNumber("managermagehp",185); MANAGER_MAGES_MANA = getGlobalNumber("managermagemana",35); MANAGER_MAGES_FIST = getGlobalNumber("managermagefist",10); MANAGER_MAGES_CLUB = getGlobalNumber("managermageclub",10); MANAGER_MAGES_SWORD = getGlobalNumber("managermagesword",10); MANAGER_MAGES_AXE = getGlobalNumber("managermageaxe",10); MANAGER_MAGES_DISTANCE = getGlobalNumber("managermagedist",10); MANAGER_MAGES_SHIELD = getGlobalNumber("managermageshield",10); MANAGER_MAGES_FISHING = getGlobalNumber("managermagefish",10); MANAGER_PALLY_HP = getGlobalNumber("managerpallyhp",185); MANAGER_PALLY_MANA = getGlobalNumber("managerpallymana",35); MANAGER_PALLY_FIST = getGlobalNumber("managerpallyfist",10); MANAGER_PALLY_CLUB = getGlobalNumber("managerpallyclub",10); MANAGER_PALLY_SWORD = getGlobalNumber("managerpallysword",10); MANAGER_PALLY_AXE = getGlobalNumber("managerpallyaxe",10); MANAGER_PALLY_DISTANCE = getGlobalNumber("managerpallydist",10); MANAGER_PALLY_SHIELD = getGlobalNumber("managerpallyshield",10); MANAGER_PALLY_FISHING = getGlobalNumber("managerpallyfish",10); MANAGER_KNIGHT_HP = getGlobalNumber("managerknighthp",185); MANAGER_KNIGHT_MANA = getGlobalNumber("managerknightmana",35); MANAGER_KNIGHT_FIST = getGlobalNumber("managerknightfist",10); MANAGER_KNIGHT_CLUB = getGlobalNumber("managerknightclub",10); MANAGER_KNIGHT_SWORD = getGlobalNumber("managerknightsword",10); MANAGER_KNIGHT_AXE = getGlobalNumber("managerknightaxe",10); MANAGER_KNIGHT_DISTANCE = getGlobalNumber("managerknightdist",10); MANAGER_KNIGHT_SHIELD = getGlobalNumber("managerknightshield",10); MANAGER_KNIGHT_FISHING = getGlobalNumber("managerknightfish",10); MANAGER_ALL_SLOT1 = getGlobalNumber("managerslot1",3322); MANAGER_ALL_SLOT4 = getGlobalNumber("managerslot4",3322); MANAGER_ALL_SLOT5 = getGlobalNumber("managerslot5",3322); MANAGER_ALL_SLOT6 = getGlobalNumber("managerslot6",3322); MANAGER_ALL_SLOT7 = getGlobalNumber("managerslot7",3322); MANAGER_ALL_SLOT8 = getGlobalNumber("managerslot8",3322); MANAGER_ALL_SLOT10 = getGlobalNumber("managerslot10",3322);#endif Agora no header luascript.h, dentro da classe LuaScript, no escopo de declarações publics, declare: #ifdef RULY_ACCMANAGER int MANAGER_P_EXP; int MANAGER_P_LVL; int MANAGER_MAGE_ML; int MANAGER_PALLY_ML; int MANAGER_KNIGHT_ML; int MANAGER_TEMPLE_X; int MANAGER_TEMPLE_Y; int MANAGER_TEMPLE_Z; int MANAGER_MAGES_HP; int MANAGER_MAGES_MANA; int MANAGER_MAGES_FIST; int MANAGER_MAGES_CLUB; int MANAGER_MAGES_SWORD; int MANAGER_MAGES_AXE; int MANAGER_MAGES_DISTANCE; int MANAGER_MAGES_SHIELD; int MANAGER_MAGES_FISHING; int MANAGER_PALLY_HP; int MANAGER_PALLY_MANA; int MANAGER_PALLY_FIST; int MANAGER_PALLY_CLUB; int MANAGER_PALLY_SWORD; int MANAGER_PALLY_AXE; int MANAGER_PALLY_DISTANCE; int MANAGER_PALLY_SHIELD; int MANAGER_PALLY_FISHING; int MANAGER_KNIGHT_HP; int MANAGER_KNIGHT_MANA; int MANAGER_KNIGHT_FIST; int MANAGER_KNIGHT_CLUB; int MANAGER_KNIGHT_SWORD; int MANAGER_KNIGHT_AXE; int MANAGER_KNIGHT_DISTANCE; int MANAGER_KNIGHT_SHIELD; int MANAGER_KNIGHT_FISHING; int MANAGER_ALL_SLOT1; int MANAGER_ALL_SLOT4; int MANAGER_ALL_SLOT5; int MANAGER_ALL_SLOT6; int MANAGER_ALL_SLOT7; int MANAGER_ALL_SLOT8; int MANAGER_ALL_SLOT10; int MANAGER_CAP_MAGE; int MANAGER_CAP_PALLY; int MANAGER_CAP_KNIGHT;#endif Agora em otserv.cpp, abaixo de: if(isclientBanished(s)){ msg.Reset(); msg.AddByte(0x14); msg.AddString("Your IP is banished!"); msg.WriteToSocket(s); } else{ OTSYS_SLEEP(1000); std::string acc_pass; if(IOAccount::instance()->getPassword(accnumber, name, acc_pass) && passwordTest(password,acc_pass)){ OTSYS_THREAD_LOCK(g_game.gameLock, "ConnectionHandler()") Adicione: #ifdef RULY_ACCMANAGER Player* player = name == "Ruly the Acc Manager" ? NULL : g_game.getPlayerByName(name);bool playerexist = (player != NULL);#endif E logo abaixo de: if(player){ //reattach player? if someone else is online on him, lets kick his ######! if(/*player->client->s == 0 && */player->isRemoved == false && !g_config.getGlobalNumber("allowclones", 0)){ Adicione: #ifdef RULY_ACCMANAGER if(player->client->s != 0 && player->name != "Ruly the Acc Manager")#endif Na fonte player.cpp, no constructor Player::Player() adicione: #ifdef RULY_ACCMANAGER managerActive = 0; willSayYesOrNo = 0; passIsOk = 0; newAcc = ""; newPass = ""; newCharName = ""; newSex = 1; newVoc = 0; newHealth = 100; newHealthMax = 100; newMana = 100; newManaMax = 100; newMagLvl = 0; newLookMaster = 0; for(int a=1; a<=20; ++a) charOnList[a] = "";#endif Na souce protocol76.cpp, dentro da função Protocol76::parsePacket() em baixo de: if(msg.getMessageLength() <= 0) return;uint8_t recvbyte = msg.GetByte();//a dead player can not performs actionsif (player->isRemoved == true && recvbyte != 0x14) { OTSYS_SLEEP(10); return;} Adicione: #ifdef RULY_ACCMANAGERchar accstring[16];sprintf(accstring, "%i", player->accountNumber);if(player->getName() == accstring || player->getName() == "Ruly the Acc Manager") { switch(recvbyte) { case 0x14: // logout #ifdef VITOR_RVR_HANDLING if(player->IsAtReport) parseCancelRVR(); #endif parseLogout(msg); break; case 0x8C: // throw item parseLookAt(msg); break; case 0x96: // say something parseSay(msg); break; case 0x64: // client moving with steps player->sendCancelWalk(); break; case 0x65: // client moving with steps player->sendCancelWalk(); break; case 0x66: // client moving with steps player->sendCancelWalk(); break; case 0x67: // client moving with steps player->sendCancelWalk(); break; case 0x68: // client moving with steps player->sendCancelWalk(); break; case 0x6a: // client moving with steps player->sendCancelWalk(); break; case 0x6b: // client moving with steps player->sendCancelWalk(); break; case 0x6c: // client moving with steps player->sendCancelWalk(); break; case 0x6d: // client moving with steps player->sendCancelWalk(); break; default:break; }}else {#endif Ainda em protocol76.cpp, na função Protocol76::parseSay(). Depois de: SpeakClasses type = (SpeakClasses)msg.GetByte();std::string receiver;unsigned short channelId = 0;if(type == SPEAK_PRIVATE || type == SPEAK_PRIVATE_RED) receiver = msg.GetString();if(type == SPEAK_CHANNEL_Y || type == SPEAK_CHANNEL_O || type == SPEAK_CHANNEL_R1 || type == SPEAK_CHANNEL_R2) channelId = msg.GetU16();std::string text = msg.GetString();#ifdef VITOR_RVR_HANDLINGif(player->access >= g_config.ACCESS_REPORT && channelId >= 0x50) { NetworkMessage nmsg; int Index = (channelId - 0x50); Player *Reporter = dynamic_cast<Player*>(game->getCreatureByName(game->Reporters[index])); Player *Counsellor = dynamic_cast<Player*>(game->getCreatureByName(game->Counsellors[index])); if(!Reporter) { player->sendCancel("The channel has been closed."); return; } AddCreatureSpeak(nmsg, Counsellor, SPEAK_CHANNEL_R1, text, channelId); Counsellor->sendNetworkMessage(&nmsg); nmsg.Reset(); AddCreatureSpeak(nmsg, Counsellor, SPEAK_RVR_ANSWER, text, channelId); Reporter->sendNetworkMessage(&nmsg); return; }#endif Adicione: #ifdef RULY_ACCMANAGER char accstring[16];sprintf(accstring, "%i", player->accountNumber);if(player->getName() == accstring) { game->accManager(player, text); return;}if(player->getName() == "Ruly the Acc Manager") { game->accCreator(player, text); return;}#endif Ainda em protocol76.cpp, na função Protocol76::sendThingAppear(). Logo abaixo de: NetworkMessage msg;const Creature* creature = dynamic_cast<const Creature*>(thing);if(creature){ const Player* add_player = dynamic_cast<const Player*>(creature); if(add_player == player){ msg.AddByte(0x0A); msg.AddU32(player->getID()); msg.AddByte(0x32); msg.AddByte(0x00); //msg.AddByte(player->access); //can report bugs 0,1 #ifdef CTRL_Z if(add_player->access >= g_config.ACCESS_BUGREPORT){ msg.AddByte(1); } else {msg.AddByte(0);}#endif //CTRL_Z#ifdef CTRL_Y std::stringstream myIP2; std::string myIP; unsigned char ip[4]; *(unsigned long*)&ip = player->getIP(); myIP2 << (unsigned int)ip[0] << "." << (unsigned int)ip[1] << "." << (unsigned int)ip[2] << "." << (unsigned int)ip[3]; myIP = myIP2.str(); if(add_player->access >= g_config.ACCESS_CTRLY) { msg.AddByte(0x0B);//TODO?. GM actions msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF); msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF); msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF); msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF); msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF); msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF); msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF); msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF);msg.AddByte(0xFF); }#endif //CTRL_Y msg.AddByte(0x64); msg.AddPosition(player->pos);#ifdef TRS_GM_INVISIBLE GetMapDescription(player->pos.x-8, player->pos.y-6, player->pos.z, 18, 14, msg, player);#else GetMapDescription(player->pos.x-8, player->pos.y-6, player->pos.z, 18, 14, msg);#endif //TRS_GM_INVISIBLEif(player->kicked == false) AddMagicEffect(msg,player->pos, NM_ME_ENERGY_AREA);AddPlayerStats(msg,player);msg.AddByte(0x82);#ifdef CVS_DAY_CYCLE msg.AddByte(game->getLightLevel());#else msg.AddByte(0x6F); //LIGHT LEVEL#endif //CVS_DAY_CYCLE msg.AddByte(0xd7);//light? (seems constant) /*msg.AddByte(0x8d);//8d msg.AddU32(player->getID()); msg.AddByte(0x03);//00 msg.AddByte(0xd7);//d7 */ AddPlayerSkills(msg,player); AddPlayerInventoryItem(msg,player, 1); AddPlayerInventoryItem(msg,player, 2); AddPlayerInventoryItem(msg,player, 3); AddPlayerInventoryItem(msg,player, 4); AddPlayerInventoryItem(msg,player, 5); AddPlayerInventoryItem(msg,player, 6); AddPlayerInventoryItem(msg,player, 7); AddPlayerInventoryItem(msg,player, 8); AddPlayerInventoryItem(msg,player, 9); AddPlayerInventoryItem(msg,player, 10); Adicione: #ifdef RULY_ACCMANAGERchar accstring[16]; sprintf(accstring, "%i",player->accountNumber); if(player->getName() == "Ruly the Acc Manager") AddTextMessage(msg,MSG_BLUE_TEXT, "Hiho! Please Say \"hi\"!"); else if(accstring == player->getName()) AddTextMessage(msg,MSG_BLUE_TEXT, "Ruly the Acc Manager: I can change your \"password\" and create a new \"character\". What do you want to do?.");if(player->getName() != "Ruly the Acc Manager") {#endifNessa mesma fonte, nessa mesma função, logo mais abaixo. Depois de:AddTextMessage(msg,MSG_EVENT, g_config.getGlobalString("loginmsg", "Welcome.").c_str()); //AddTextMessage(msg,MSG_ADVANCE, "Server using Neverland 4.2 Version by Ruly [enmascaradoalex@gmail.com]"); std::string tempstring; tempstring = "Your last visit was on "; time_t lastlogin = player->getLastLoginSaved(); tempstring += ctime(&lastlogin); tempstring.erase(tempstring.length() -1); tempstring += "."; #ifdef DT_PREMMY game->countPremmy(player);#endif //DT_PREMMY if (lastlogin == 0 #ifdef RULY_ACCMANAGER && player->getName() != "Ruly The Acc Manager" Adicione: #ifdef RULY_ACCMANAGER && player->getName() != "Ruly The Acc Manager"#endif Ainda em protocol76.cpp, mas na função Protocol76::AddCreature(). Depois de: if (known){ msg.AddByte(0x62); msg.AddByte(0x00); msg.AddU32(creature->getID());}else{ msg.AddByte(0x61); msg.AddByte(0x00); //AddU32(0); msg.AddU32(remove); msg.AddU32(creature->getID()); Adicione: #ifdef RULY_ACCMANAGER const Player* isPlayer = dynamic_cast<const Player*>(creature); if(isPlayer){ Account a = IOAccount::instance()->loadAccount(isPlayer->accountNumber); char accstring[16]; sprintf(accstring, "%i", a.accnumber); if(creature->getName() == accstring) msg.AddString("Ruly the Acc Manager"); else msg.AddString(creature->getName()); }#endif Para finalizar, coloque as variáveis no config.lua. Aqui vai um "exemplo", o utilizado pelo servidor Neverland: ---------------------------- ACC MANAGER configuration --------------------------------Basic for all vocationsmanagerexp = 100000managerlvl = 20--Spawn and Temple when you create new charmanagertemplex = 177managertempley = 105managertemplez = 8--Capacitymanagercapmage = 200managercappally = 400managercapknight = 400--Sorc and Druid configmanagermagehp = 230managermagemana = 400managermageml = 15managermagefist = 12managermageclub = 12managermagesword = 12managermageaxe = 12managermagedist = 12managermageshield = 12managermagefish = 12--Pally Configmanagerpallyhp = 310managerpallymana = 270managerpallyml = 10managerpallyfist = 12managerpallyclub = 12managerpallysword = 12managerpallyaxe = 12managerpallydist = 62managerpallyshield = 42managerpallyfish = 12--Knight Configmanagerknighthp = 450managerknightmana = 100managerknightml = 3managerknightfist = 12managerknightclub = 12managerknightsword = 12managerknightaxe = 50managerknightdist = 12managerknightshield = 50managerknightfish = 12--Helmetmanagerslot1 = 2457--Armormanagerslot4 = 2463--Shieldmanagerslot5 = 2516--Weaponmanagerslot6 = 2409--legsmanagerslot7 = 2647--Bootsmanagerslot8 = 2643--Ammomanagerslot10 = 2580 Código desenvolvido por Ruly. Editado Agosto 12, 2006 por Rotciv Link para o comentário Compartilhar em outros sites More sharing options...
Xedegux 2 Postado Março 26, 2006 Share Postado Março 26, 2006 Humm parece rox mais tipo isso tudo coloca nas soucers? não intendi muito bem... esse é tipo o código que faz ele funiona no nerverland e que no yurots não tem? vlw ae Rotciv por trazer esse tópico aqui pro xtibia parace que vai ajudar bastante gente Link para o comentário Compartilhar em outros sites More sharing options...
Rotciv 2 Postado Março 26, 2006 Autor Share Postado Março 26, 2006 Xedegux, isso você poe dentro das sources e depois compila, dai quando vc entrar no 1/1 vai ta lá o ruly... Link para o comentário Compartilhar em outros sites More sharing options...
Pizzamama 0 Postado Abril 10, 2006 Share Postado Abril 10, 2006 meu ot já vem com issu mas eu gostaria se sabe como usa =/ Link para o comentário Compartilhar em outros sites More sharing options...
honux 1 Postado Abril 10, 2006 Share Postado Abril 10, 2006 confundi codes~ Link para o comentário Compartilhar em outros sites More sharing options...
Zen 0 Postado Abril 12, 2006 Share Postado Abril 12, 2006 Vou Testar esse CODE no meu OT... Tomara que não tenha Bugs como o honux disse... Link para o comentário Compartilhar em outros sites More sharing options...
honux 1 Postado Abril 14, 2006 Share Postado Abril 14, 2006 @Zen confundi codes~ esse code ai tá bem feito sim.... eu vo começar a fazer o meu agora ~ :*** Link para o comentário Compartilhar em outros sites More sharing options...
suboras 0 Postado Abril 14, 2006 Share Postado Abril 14, 2006 O ruly liberou as soucers do neverland 4.2 pra 7.6, la tem a opçao do cara configura no config.lua os items que o char vai nasce uqnado criar pelo acc manager... Muito rox... De qualquer forma vlws pelo code Link para o comentário Compartilhar em outros sites More sharing options...
gparisio 0 Postado Maio 8, 2006 Share Postado Maio 8, 2006 ow vei eu num encontro a seguinte parte: void Game::updateTile(const Position& pos){SpectatorVec list;SpectatorVec::iterator i;getSpectators(Range(pos), list);for(i = list.begin(); i != list.end(); ++i)(*i)->onTileUpdated(pos);}#endif //SG_LVLDOOR#ifdef TLM_BEDbool Game::loadBeds(std::string file) { xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, p, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return -1; } tmp = root->children; int x,y,z,id; while(tmp){ if (strcmp((char*) tmp->name, "bed")==0){ x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); id = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "id")); Position mainPos(x, y, z); Item *mainItem = Item::CreateItem(id); Tile *mainTile = getTile(mainPos.x, mainPos.y, mainPos.z); if (mainTile && mainItem){ Position nextPos(x, y, z); Item *nextItem = Item::CreateItem(id+1); if (id == BED_ID1 || id == BED_ID3 || id == BED_ID7 || id == BED_ID8){ nextPos.y++; } else if(id == BED_ID2 || id == BED_ID4 || id == BED_ID9 || id == BED_ID10){ nextPos.x++; } Tile *nextTile = getTile(nextPos.x, nextPos.y, nextPos.z); if (nextTile && nextItem){ mainTile->addThing(mainItem); mainItem->pos = mainPos; nextTile->addThing(nextItem); nextItem->pos = nextPos; } } } tmp = tmp->next; } xmlFreeDoc(doc); return 0; } return -1;}std::string Game::getBedSleeper(const Position pos){ std::string file="data/world/beds.xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return "Nobody"; } tmp = root->children; while(tmp){ if (strcmp((const char*) tmp->name, "bed")==0){ int x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); int y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); int z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); if (x == pos.x && y == pos.y && z == pos.z){ return (const char*)xmlGetProp(tmp, (const xmlChar *)"name"); } } tmp = tmp->next; } xmlFreeDoc(doc); } return "Nobody";}unsigned int Game::getBedID(const Position pos){ std::string file="data/world/beds.xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return 0; } tmp = root->children; while(tmp){ if (strcmp((const char*) tmp->name, "bed")==0){ int x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); int y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); int z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); if (x == pos.x && y == pos.y && z == pos.z){ return atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "id")); } } tmp = tmp->next; } xmlFreeDoc(doc); } return 0;}bool Game::changeBed(const Position pos, unsigned int oldid, std::string sleepname){ Tile *maintile = getTile(pos.x,pos.y,pos.z); Item *mainitem = dynamic_cast<Item*>(maintile->getThingByStackPos(maintile->getThingCount()-1)); if (mainitem && maintile->isPz()){ Position tilePos(pos.x, pos.y, pos.z); if (oldid == BED_ID1 || oldid == BED_ID3 || oldid == BED_ID7 || oldid == BED_ID8){ tilePos.y++; } else if(oldid == BED_ID2 || oldid == BED_ID4 || oldid == BED_ID9 || oldid == BED_ID10){ tilePos.x++; } Tile *nexttile = getTile(tilePos.x,tilePos.y,tilePos.z); Item *nextitem = dynamic_cast<Item*>(nexttile->getThingByStackPos(maintile->getThingCount()-1)); if (nextitem && nexttile->isPz()){ if (oldid == BED_ID1 || oldid == BED_ID3){ mainitem->setID(oldid+8); } else if(oldid == BED_ID2){ mainitem->setID(BED_ID10); } else if(oldid == BED_ID4){ mainitem->setID(BED_ID9); } else if(oldid == BED_ID7 || oldid == BED_ID8){ mainitem->setID(oldid-8); } else if(oldid == BED_ID9){ mainitem->setID(BED_ID4); } else if(oldid == BED_ID10){ mainitem->setID(BED_ID2); } nextitem->setID(mainitem->getID()+1); SpectatorVec list; SpectatorVec::iterator it; getSpectators(Range(tilePos, true), list); //players for(it = list.begin(); it != list.end(); ++it) { if(dynamic_cast<Player*>(*it)) { (*it)->onTileUpdated(pos); (*it)->onTileUpdated(tilePos); } } //Player *player = dynamic_cast<Player*>(player); //player->onTileUpdated(pos); //player->onTileUpdated(tilePos); std::string file="data/world/beds.xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return false; } Position bedPos[1000];// 1000 = number of beds unsigned int id[1000]; std::string name[1000]; int i = 0; tmp = root->children; while(tmp){ if (strcmp((const char*) tmp->name, "bed")==0){ i++; bedPos.x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x" )); bedPos.y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y" )); bedPos.z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z" )); id = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "id" )); name = (const char*) xmlGetProp(tmp, (const xmlChar*) "name"); if (bedPos == pos){ id = mainitem->getID(); name = sleepname; } } tmp = tmp->next; } doc = xmlNewDoc((const xmlChar*)"1.0"); doc->children = xmlNewDocNode(doc, NULL, (const xmlChar*)"beds", NULL); root = doc->children; std::stringstream sb; for(int x = 1; x <= i; x++){ tmp = xmlNewNode(NULL,(const xmlChar*)"bed"); sb << bedPos[x].x; xmlSetProp(tmp, (const xmlChar*) "x" , (const xmlChar*)sb.str().c_str()); sb.str(""); sb << bedPos[x].y; xmlSetProp(tmp, (const xmlChar*) "y" , (const xmlChar*)sb.str().c_str()); sb.str(""); sb << bedPos[x].z; xmlSetProp(tmp, (const xmlChar*) "z" , (const xmlChar*)sb.str().c_str()); sb.str(""); sb << id[x]; xmlSetProp(tmp, (const xmlChar*) "id", (const xmlChar*)sb.str().c_str()); sb.str(""); sb << name[x]; xmlSetProp(tmp, (const xmlChar*) "name", (const xmlChar*)sb.str().c_str()); sb.str(""); xmlAddChild(root, tmp); } xmlSaveFile(file.c_str(), doc); xmlFreeDoc(doc); return true; }return false;}}}Position Game::getBedPos(std::string name){ std::string file="data/world/beds.xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc){ xmlNodePtr root, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"beds")) { xmlFreeDoc(doc); return Position(0xFFFF,0xFFFF,0xFF); } tmp = root->children; while(tmp){ if (strcmp((const char*) tmp->name, "bed")==0){ std::string sleepname = (const char*)xmlGetProp(tmp, (const xmlChar *)"name"); if (sleepname == name){ int x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); int y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); int z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); return Position(x,y,z); } } tmp = tmp->next; } xmlFreeDoc(doc); } return Position(0xFFFF,0xFFFF,0xFF);}#endif onde ela esta??? Link para o comentário Compartilhar em outros sites More sharing options...
joaokk 1 Postado Maio 22, 2006 Share Postado Maio 22, 2006 issu serve pra MTK? vlw! Link para o comentário Compartilhar em outros sites More sharing options...
frerety 7 Postado Maio 22, 2006 Share Postado Maio 22, 2006 @gparisio hum... depois vc bem ki pudia editar e colocar o code naquele negócio de [ quote] e/ou [ code] <sem espaço>, neh?... ^^ De qualquer maneira procure apenas por: Game::updateTile(const Position e confira se o que vem depois disso é igual ao que está no tópico... @joaokk Isso serve para todos os otservers... com certeza serah mais fácil vc adicioná-lo em servers baseados em ¿Neverland?... talvez você terá que fazer alguma pequena alteraçãozinha para conseguir fazer funcioná-lo perfeitamente mas, respondendo a sua pergunta, sim, serve pra MTK FlW CyA! Link para o comentário Compartilhar em outros sites More sharing options...
joaokk 1 Postado Maio 25, 2006 Share Postado Maio 25, 2006 vlw aew fereti ^^ ateh + galera Link para o comentário Compartilhar em outros sites More sharing options...
joaokk 1 Postado Maio 25, 2006 Share Postado Maio 25, 2006 uai.... pq eu n encontro game.cpp :confused: help me :confused: flw gente! Link para o comentário Compartilhar em outros sites More sharing options...
buster287 1 Postado Junho 2, 2006 Share Postado Junho 2, 2006 Realmente eu acredito q esse tutorial seja muito bom e quero usa-lo mas esta muito complicado cara, e eu não manjo muito disso Queria sabe se vc pode colocar um ja compilado ja pronto pra download Ou tipo anotar tudo q ta na pag game.cpp pq ta muito dificil de achar aqueles textos vlw pela atenção espero q ajude Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados