bool Client::HandleNameApprovalPacket(const EQApplicationPacket *app) { if (GetAccountID() == 0) { clog(WORLD__CLIENT_ERR,"Name approval request with no logged in account"); return false; } snprintf(char_name, 64, "%s", (char*)app->pBuffer); uchar race = app->pBuffer[64]; uchar clas = app->pBuffer[68]; clog(WORLD__CLIENT, "Name approval request. Name=%s, race=%s, class=%s", char_name, GetRaceName(race), GetEQClassName(clas)); EQApplicationPacket *outapp; outapp = new EQApplicationPacket; outapp->SetOpcode(OP_ApproveName); outapp->pBuffer = new uchar[1]; outapp->size = 1; clog(WORLD__CLIENT, "common/client.cpp line 292 pass"); bool valid = false; if (!database.CheckNameFilter(char_name)) { clog(WORLD__CLIENT, "Invalid name"); valid = false; } /* Name must begin with an upper-case letter. */ else if (islower(char_name[0])) { clog(WORLD__CLIENT, "Must begin with uppercase"); valid = false; } else if (database.ReserveName(GetAccountID(), char_name)) { clog(WORLD__CLIENT, "common/client.cpp line 304 pass"); valid = true; } else { clog(WORLD__CLIENT, "common/client.cpp line 308 pass"); valid = false; } clog(WORLD__CLIENT, "common/client.cpp line 312 pass"); outapp->pBuffer[0] = valid? 1 : 0; QueuePacket(outapp); safe_delete(outapp); clog(WORLD__CLIENT, "common/client.cpp line 316 pass"); if (!valid) memset(char_name, 0, sizeof(char_name)); clog(WORLD__CLIENT, "common/client.cpp line 320 pass"); return true; }
QVariantList GlooxAccount::GetBookmarkedMUCs () const { QVariantList result; const QXmppBookmarkSet& set = GetBookmarks (); Q_FOREACH (const QXmppBookmarkConference& conf, set.conferences ()) { const QStringList& split = conf.jid ().split ('@', QString::SkipEmptyParts); if (split.size () != 2) { qWarning () << Q_FUNC_INFO << "incorrectly split jid for conf" << conf.jid () << split; continue; } QVariantMap cm; cm ["HumanReadableName"] = QString ("%1 (%2)") .arg (conf.jid ()) .arg (conf.nickName ()); cm ["AccountID"] = GetAccountID (); cm ["Nick"] = conf.nickName (); cm ["Room"] = split.at (0); cm ["Server"] = split.at (1); cm ["Autojoin"] = conf.autoJoin (); cm ["StoredName"] = conf.name (); result << cm; } return result; }
QVariantList IrcAccount::GetBookmarkedMUCs () const { QVariantList result; const QList<IrcBookmark>& bookmarks = GetBookmarks (); Q_FOREACH (const IrcBookmark& channel, bookmarks) { QVariantMap cm; cm ["HumanReadableName"] = QString ("%1@%2 (%3)") .arg (channel.ChannelName_ ) .arg (channel.ServerName_) .arg (channel.NickName_); cm ["AccountID"] = GetAccountID (); cm ["Server"] = channel.ServerName_; cm ["Port"] = channel.ServerPort_; cm ["ServerPassword"] = channel.ServerPassword_; cm ["Encoding"] = channel.ServerEncoding_; cm ["Channel"] = channel.ChannelName_; cm ["Password"] = channel.ChannelPassword_; cm ["Nickname"] = channel.NickName_; cm ["SSL"] = channel.SSL_; cm ["Autojoin"] = channel.AutoJoin_; cm ["StoredName"] = channel.Name_; result << cm; }
bool Client::HandleCharacterCreatePacket(const EQApplicationPacket *app) { if (GetAccountID() == 0) { clog(WORLD__CLIENT_ERR,"Account ID not set; unable to create character."); return false; } else if (app->size != sizeof(CharCreate_Struct)) { clog(WORLD__CLIENT_ERR,"Wrong size on OP_CharacterCreate. Got: %d, Expected: %d",app->size,sizeof(CharCreate_Struct)); DumpPacket(app); // the previous behavior was essentially returning true here // but that seems a bit odd to me. return true; } CharCreate_Struct *cc = (CharCreate_Struct*)app->pBuffer; if(OPCharCreate(char_name, cc) == false) { database.DeleteCharacter(char_name); EQApplicationPacket *outapp = new EQApplicationPacket(OP_ApproveName, 1); outapp->pBuffer[0] = 0; QueuePacket(outapp); safe_delete(outapp); } else { SendCharInfo(); } return true; }
bool IMAPFolders::PreSaveObject(shared_ptr<IMAPFolder> pObject, XNode *node) { pObject->SetAccountID(GetAccountID()); pObject->SetParentFolderID(m_iParentFolderID); return true; }
void Core::Process (QObject *msgObj) { IMessage *msg = qobject_cast<IMessage*> (msgObj); if (msg->GetMessageType () != IMessage::Type::ChatMessage && msg->GetMessageType () != IMessage::Type::MUCMessage) return; if (msg->GetBody ().isEmpty ()) return; if (msg->GetDirection () == IMessage::Direction::Out && msg->GetMessageType () == IMessage::Type::MUCMessage) return; const double secsDiff = msg->GetDateTime ().secsTo (QDateTime::currentDateTime ()); if (msg->GetMessageType () == IMessage::Type::MUCMessage && std::abs (secsDiff) >= 2) return; ICLEntry *entry = qobject_cast<ICLEntry*> (msg->ParentCLEntry ()); if (!entry) { qWarning () << Q_FUNC_INFO << "message's other part doesn't implement ICLEntry" << msg->GetQObject () << msg->OtherPart (); return; } if (DisabledIDs_.contains (entry->GetEntryID ())) return; const auto acc = entry->GetParentAccount (); QVariantMap data; data ["EntryID"] = entry->GetEntryID (); data ["AccountID"] = acc->GetAccountID (); data ["DateTime"] = msg->GetDateTime (); data ["Direction"] = msg->GetDirection () == IMessage::Direction::In ? "IN" : "OUT"; data ["Body"] = msg->GetBody (); data ["OtherVariant"] = msg->GetOtherVariant (); data ["Type"] = static_cast<int> (msg->GetMessageType ()); data ["EscapePolicy"] = msg->GetEscapePolicy () == IMessage::EscapePolicy::Escape ? "Esc" : "NEs"; if (const auto irtm = qobject_cast<IRichTextMessage*> (msgObj)) data ["RichBody"] = irtm->GetRichBody (); if (entry->GetEntryType () == ICLEntry::EntryType::PrivateChat) { const auto parent = entry->GetParentCLEntry (); data ["VisibleName"] = parent->GetEntryName () + "/" + entry->GetEntryName (); } else data ["VisibleName"] = entry->GetEntryName (); QMetaObject::invokeMethod (StorageThread_->GetStorage (), "addMessage", Qt::QueuedConnection, Q_ARG (QVariantMap, data)); }
void Client::SendEnterWorld(std::string name) { char char_name[32]= { 0 }; if (pZoning && database.GetLiveChar(GetAccountID(), char_name)) { if(database.GetAccountIDByChar(char_name) != GetAccountID()) { eqs->Close(); return; } else { clog(WORLD__CLIENT,"Telling client to continue session."); } } EQApplicationPacket *outapp = new EQApplicationPacket(OP_EnterWorld, strlen(char_name)+1); memcpy(outapp->pBuffer,char_name,strlen(char_name)+1); QueuePacket(outapp); safe_delete(outapp); }
bool Client::HandleNameApprovalPacket(const EQApplicationPacket *app) { if (GetAccountID() == 0) { clog(WORLD__CLIENT_ERR,"Name approval request with no logged in account"); return false; } snprintf(char_name, 64, "%s", (char*)app->pBuffer); uchar race = app->pBuffer[64]; uchar clas = app->pBuffer[68]; clog(WORLD__CLIENT,"Name approval request. Name=%s, race=%s, class=%s",char_name,GetRaceName(race),GetEQClassName(clas)); EQApplicationPacket *outapp; outapp = new EQApplicationPacket; outapp->SetOpcode(OP_ApproveName); outapp->pBuffer = new uchar[1]; outapp->size = 1; bool valid; if(!database.CheckNameFilter(char_name)) { valid = false; } else if(char_name[0] < 'A' && char_name[0] > 'Z') { //name must begin with an upper-case letter. valid = false; } else if (database.ReserveName(GetAccountID(), char_name)) { valid = true; } else { valid = false; } outapp->pBuffer[0] = valid? 1 : 0; QueuePacket(outapp); safe_delete(outapp); if(!valid) { memset(char_name, 0, sizeof(char_name)); } return true; }
void GlobalApprehensivePlugin::FireGameEvent(IGameEvent * event) { if (event == NULL) return; std::string name(event->GetName()); if (name == playerDeathEvent) { int attackerId = event->GetInt("attacker"); std::string attackerName = GetPlayerName(attackerId); uint32 attackerAccountId = GetAccountID(attackerId); int assisterId = event->GetInt("assister"); int victimId = event->GetInt("userid"); std::string victimName = GetPlayerName(victimId); uint32 victimAccountId = GetAccountID(victimId); std::string attackerWeapon(event->GetString("weapon")); bool headshot = event->GetBool("headshot"); META_CONPRINTF("%s (%d) killed %s (%d) with weapon %s\n", attackerName.c_str(), attackerAccountId, victimName.c_str(), victimAccountId, attackerWeapon.c_str()); } }
bool CVmRunEvn::CheckAppAcctOperate(CTransaction* tx) { int64_t addValue(0), minusValue(0), sumValue(0); for(auto vOpItem : MapAppOperate) { for(auto appFund : vOpItem.second) { if(ADD_FREE_OP == appFund.opeatortype || ADD_TAG_OP == appFund.opeatortype) { int64_t temp = appFund.mMoney; temp += addValue; if(temp < addValue || temp<appFund.mMoney) { return false; } addValue = temp; } else if(SUB_FREE_OP == appFund.opeatortype || SUB_TAG_OP == appFund.opeatortype) { int64_t temp = appFund.mMoney; temp += minusValue; if(temp < minusValue || temp<appFund.mMoney) { return false; } minusValue = temp; } } } sumValue = addValue - minusValue; if(sumValue > addValue) { return false; } int64_t sysContractAcct(0); for(auto item : m_output) { vector_unsigned_char vAccountId = GetAccountID(item); if(vAccountId == boost::get<CRegID>(tx->desUserId).GetVec6() && item.opeatortype == MINUS_FREE) { uint64_t value; memcpy(&value, item.money, sizeof(item.money)); int64_t temp = value; if(temp < 0) { return false; } temp += sysContractAcct; if(temp < sysContractAcct || temp < (int64_t)value) return false; sysContractAcct = temp; } } int64_t sysAcctSum = tx->llValues - sysContractAcct; if(sysAcctSum > (int64_t)tx->llValues) { return false; } if(sumValue != sysAcctSum){ LogPrint("vm", "CheckAppAcctOperate:addValue=%lld, minusValue=%lld, txValue=%lld, sysContractAcct=%lld sumValue=%lld, sysAcctSum=%lld\n", addValue, minusValue, tx->llValues, sysContractAcct,sumValue, sysAcctSum); return false; } return true; }
bool Client::HandleDeleteCharacterPacket(const EQApplicationPacket *app) { uint32 char_acct_id = database.GetAccountIDByChar((char*)app->pBuffer); if(char_acct_id == GetAccountID()) { clog(WORLD__CLIENT,"Delete character: %s",app->pBuffer); database.DeleteCharacter((char *)app->pBuffer); SendCharInfo(); } return true; }
void LJAccount::FillSettings (LJAccountConfigurationWidget *widget) { Login_ = widget->GetLogin (); const QString& pass = widget->GetPassword (); if (!pass.isNull ()) Util::SavePassword (pass, "org.LeechCraft.Blogique.PassForAccount/" + GetAccountID (), &Core::Instance ()); emit accountSettingsChanged (); Validate (); }
void ToxProtocol::RemoveAccount (QObject *accObj) { const auto account = qobject_cast<ToxAccount*> (accObj); if (!Accounts_.contains (account)) return; QSettings settings { QSettings::IniFormat, QSettings::UserScope, QCoreApplication::organizationName (), QCoreApplication::applicationName () + "_Azoth_Sarin_Accounts" }; settings.remove (account->GetAccountID ()); Accounts_.removeOne (account); emit accountRemoved (accObj); }
void Client::SendCharInfo() { if (cle) { cle->SetOnline(CLE_Status_CharSelect); } seencharsel = true; // Send OP_SendCharInfo EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendCharInfo, sizeof(CharacterSelect_Struct)); CharacterSelect_Struct* cs = (CharacterSelect_Struct*)outapp->pBuffer; database.GetCharSelectInfo(GetAccountID(), cs); QueuePacket(outapp); safe_delete(outapp); }
void AccountActionsManager::handleChangeStatusRequested () { auto action = qobject_cast<QAction*> (sender ()); const auto acc = GetAccountFromSender (sender (), Q_FUNC_INFO); QVariant stateVar = action->property ("Azoth/TargetState"); EntryStatus status; if (!stateVar.isNull ()) { const auto state = stateVar.value<State> (); status = EntryStatus (state, GetStatusText (action, state)); } else { SetStatusDialog ssd (acc->GetAccountID ()); if (ssd.exec () != QDialog::Accepted) return; status = EntryStatus (ssd.GetState (), ssd.GetStatusText ()); } acc->ChangeState (status); }
void Storage::AddAccount (const QString& id) { AccountInserter_.bindValue (":account_id", id); if (!AccountInserter_.exec ()) { Util::DBLock::DumpError (AccountInserter_); return; } AccountInserter_.finish (); try { Accounts_ [id] = GetAccountID (id); } catch (const std::exception& e) { qWarning () << Q_FUNC_INFO << "unable to refetch id for" << id << "with:" << e.what (); } }
bool Client::HandlePacket(const EQApplicationPacket *app) { EmuOpcode opcode = app->GetOpcode(); clog(WORLD__CLIENT_TRACE,"Recevied EQApplicationPacket"); _pkt(WORLD__CLIENT_TRACE,app); if (!eqs->CheckState(ESTABLISHED)) { clog(WORLD__CLIENT,"Client disconnected (net inactive on send)"); return false; } // Voidd: Anti-GM Account hack, Checks source ip against valid GM Account IP Addresses if (RuleB(World, GMAccountIPList) && this->GetAdmin() >= (RuleI(World, MinGMAntiHackStatus))) { if(!database.CheckGMIPs(long2ip(this->GetIP()).c_str(), this->GetAccountID())) { clog(WORLD__CLIENT,"GM Account not permited from source address %s and accountid %i", long2ip(this->GetIP()).c_str(), this->GetAccountID()); eqs->Close(); } } if (GetAccountID() == 0 && opcode != OP_SendLoginInfo) { // Got a packet other than OP_SendLoginInfo when not logged in clog(WORLD__CLIENT_ERR,"Expecting OP_SendLoginInfo, got %s", OpcodeNames[opcode]); return false; } switch(opcode) { case OP_SendLoginInfo: { return HandleSendLoginInfoPacket(app); } case OP_ApproveName: //Name approval { return HandleNameApprovalPacket(app); } case OP_RandomNameGenerator: { return HandleGenerateRandomNamePacket(app); } case OP_CharacterCreate: //Char create { return HandleCharacterCreatePacket(app); } case OP_EnterWorld: // Enter world { return HandleEnterWorldPacket(app); } case OP_DeleteCharacter: { return HandleDeleteCharacterPacket(app); } case OP_GuildsList: { SendGuildList(); return true; } case OP_WorldLogout: { eqs->Close(); return true; } case OP_ZoneChange: case OP_LoginUnknown1: case OP_LoginUnknown2: case OP_WearChange: case OP_LoginComplete: case OP_ApproveWorld: { // Essentially we are just 'eating' these packets, indicating // they are handled. return true; } default: { clog(WORLD__CLIENT_ERR,"Received unknown EQApplicationPacket"); _pkt(WORLD__CLIENT_ERR,app); return true; } } return true; }
void Client::EnterWorld(bool TryBootup) { if (zoneID == 0) return; ZoneServer* zs = nullptr; if(instanceID > 0) { if(database.VerifyInstanceAlive(instanceID, GetCharID())) { if(database.VerifyZoneInstance(zoneID, instanceID)) { zs = zoneserver_list.FindByInstanceID(instanceID); } else { instanceID = 0; zs = nullptr; database.MoveCharacterToBind(GetCharID()); ZoneUnavail(); return; } } else { instanceID = 0; zs = nullptr; database.MoveCharacterToBind(GetCharID()); ZoneUnavail(); return; } } else zs = zoneserver_list.FindByZoneID(zoneID); const char *zone_name=database.GetZoneName(zoneID, true); if (zs) { // warn the world we're comming, so it knows not to shutdown zs->IncommingClient(this); } else { if (TryBootup) { clog(WORLD__CLIENT,"Attempting autobootup of %s (%d:%d)",zone_name,zoneID,instanceID); autobootup_timeout.Start(); pwaitingforbootup = zoneserver_list.TriggerBootup(zoneID, instanceID); if (pwaitingforbootup == 0) { clog(WORLD__CLIENT_ERR,"No zoneserver available to boot up."); ZoneUnavail(); } return; } else { clog(WORLD__CLIENT_ERR,"Requested zone %s is no running.",zone_name); ZoneUnavail(); return; } } pwaitingforbootup = 0; cle->SetChar(charid, char_name); database.UpdateLiveChar(char_name, GetAccountID()); clog(WORLD__CLIENT,"%s %s (%d:%d)",seencharsel ? "Entering zone" : "Zoning to",zone_name,zoneID,instanceID); // database.SetAuthentication(account_id, char_name, zone_name, ip); if (seencharsel) { if (GetAdmin() < 80 && zoneserver_list.IsZoneLocked(zoneID)) { clog(WORLD__CLIENT_ERR,"Enter world failed. Zone is locked."); ZoneUnavail(); return; } ServerPacket* pack = new ServerPacket; pack->opcode = ServerOP_AcceptWorldEntrance; pack->size = sizeof(WorldToZone_Struct); pack->pBuffer = new uchar[pack->size]; memset(pack->pBuffer, 0, pack->size); WorldToZone_Struct* wtz = (WorldToZone_Struct*) pack->pBuffer; wtz->account_id = GetAccountID(); wtz->response = 0; zs->SendPacket(pack); delete pack; } else { // if they havent seen character select screen, we can assume this is a zone // to zone movement, which should be preauthorized before they leave the previous zone Clearance(1); } }
bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { if (GetAccountID() == 0) { clog(WORLD__CLIENT_ERR,"Enter world with no logged in account"); eqs->Close(); return true; } if(GetAdmin() < 0) { clog(WORLD__CLIENT,"Account banned or suspended."); eqs->Close(); return true; } if (RuleI(World, MaxClientsPerIP) >= 0) { client_list.GetCLEIP(this->GetIP()); //Check current CLE Entry IPs against incoming connection } EnterWorld_Struct *ew=(EnterWorld_Struct *)app->pBuffer; strn0cpy(char_name, ew->name, 64); EQApplicationPacket *outapp; uint32 tmpaccid = 0; charid = database.GetCharacterInfo(char_name, &tmpaccid, &zoneID, &instanceID); if (charid == 0 || tmpaccid != GetAccountID()) { clog(WORLD__CLIENT_ERR,"Could not get CharInfo for '%s'",char_name); eqs->Close(); return true; } // Make sure this account owns this character if (tmpaccid != GetAccountID()) { clog(WORLD__CLIENT_ERR,"This account does not own the character named '%s'",char_name); eqs->Close(); return true; } if (zoneID == 0 || !database.GetZoneName(zoneID)) { // This is to save people in an invalid zone, once it's removed from the DB database.MoveCharacterToZone(charid, "arena"); clog(WORLD__CLIENT_ERR, "Zone not found in database zone_id=%i, moveing char to arena character:%s", zoneID, char_name); } if(instanceID > 0) { if(!database.VerifyInstanceAlive(instanceID, GetCharID())) { zoneID = database.MoveCharacterToBind(charid); instanceID = 0; } else { if(!database.VerifyZoneInstance(zoneID, instanceID)) { zoneID = database.MoveCharacterToBind(charid); instanceID = 0; } } } if(!pZoning) { database.SetGroupID(char_name, 0, charid); database.SetFirstLogon(charid, 1); } else{ uint32 groupid = database.GetGroupID(char_name); if(groupid > 0){ char* leader = 0; char leaderbuf[64] = {0}; if((leader = database.GetGroupLeaderForLogin(char_name, leaderbuf)) && strlen(leader)>1){ EQApplicationPacket* outapp3 = new EQApplicationPacket(OP_GroupUpdate,sizeof(GroupJoin_Struct)); GroupJoin_Struct* gj=(GroupJoin_Struct*)outapp3->pBuffer; gj->action=8; strcpy(gj->yourname, char_name); strcpy(gj->membername, leader); QueuePacket(outapp3); safe_delete(outapp3); } } } outapp = new EQApplicationPacket(OP_MOTD); char tmp[500] = {0}; if (database.GetVariable("MOTD", tmp, 500)) { outapp->size = strlen(tmp)+1; outapp->pBuffer = new uchar[outapp->size]; memset(outapp->pBuffer,0,outapp->size); strcpy((char*)outapp->pBuffer, tmp); } else { // Null Message of the Day. :) outapp->size = 1; outapp->pBuffer = new uchar[outapp->size]; outapp->pBuffer[0] = 0; } QueuePacket(outapp); safe_delete(outapp); int MailKey = emu_random.Int(1, INT_MAX); database.SetMailKey(charid, GetIP(), MailKey); char ConnectionType; ConnectionType = 'C'; EQApplicationPacket *outapp2 = new EQApplicationPacket(OP_SetChatServer); char buffer[112]; const WorldConfig *Config = WorldConfig::get(); sprintf(buffer,"%s,%i,%s.%s,%c%08X", Config->ChatHost.c_str(), Config->ChatPort, Config->ShortName.c_str(), this->GetCharName(), ConnectionType, MailKey ); outapp2->size=strlen(buffer)+1; outapp2->pBuffer = new uchar[outapp2->size]; memcpy(outapp2->pBuffer,buffer,outapp2->size); QueuePacket(outapp2); safe_delete(outapp2); EnterWorld(); return true; }
bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { if (GetAccountID() == 0) { clog(WORLD__CLIENT_ERR,"Enter world with no logged in account"); eqs->Close(); return true; } if(GetAdmin() < 0) { clog(WORLD__CLIENT,"Account banned or suspended."); eqs->Close(); return true; } if (RuleI(World, MaxClientsPerIP) >= 0) { client_list.GetCLEIP(this->GetIP()); //Check current CLE Entry IPs against incoming connection } EnterWorld_Struct *ew=(EnterWorld_Struct *)app->pBuffer; strn0cpy(char_name, ew->name, 64); EQApplicationPacket *outapp; uint32 tmpaccid = 0; charid = database.GetCharacterInfo(char_name, &tmpaccid, &zoneID, &instanceID); if (charid == 0 || tmpaccid != GetAccountID()) { clog(WORLD__CLIENT_ERR,"Could not get CharInfo for '%s'",char_name); eqs->Close(); return true; } // Make sure this account owns this character if (tmpaccid != GetAccountID()) { clog(WORLD__CLIENT_ERR,"This account does not own the character named '%s'",char_name); eqs->Close(); return true; } if(!pZoning && ew->return_home && !ew->tutorial) { CharacterSelect_Struct* cs = new CharacterSelect_Struct; memset(cs, 0, sizeof(CharacterSelect_Struct)); database.GetCharSelectInfo(GetAccountID(), cs); bool home_enabled = false; for(int x = 0; x < 10; ++x) { if(strcasecmp(cs->name[x], char_name) == 0) { if(cs->gohome[x] == 1) { home_enabled = true; break; } } } safe_delete(cs); if(home_enabled) { zoneID = database.MoveCharacterToBind(charid,4); } else { clog(WORLD__CLIENT_ERR,"'%s' is trying to go home before they're able...",char_name); database.SetHackerFlag(GetAccountName(), char_name, "MQGoHome: player tried to go home before they were able."); eqs->Close(); return true; } } if(!pZoning && (RuleB(World, EnableTutorialButton) && (ew->tutorial || StartInTutorial))) { CharacterSelect_Struct* cs = new CharacterSelect_Struct; memset(cs, 0, sizeof(CharacterSelect_Struct)); database.GetCharSelectInfo(GetAccountID(), cs); bool tutorial_enabled = false; for(int x = 0; x < 10; ++x) { if(strcasecmp(cs->name[x], char_name) == 0) { if(cs->tutorial[x] == 1) { tutorial_enabled = true; break; } } } safe_delete(cs); if(tutorial_enabled) { zoneID = RuleI(World, TutorialZoneID); database.MoveCharacterToZone(charid, database.GetZoneName(zoneID)); } else { clog(WORLD__CLIENT_ERR,"'%s' is trying to go to tutorial but are not allowed...",char_name); database.SetHackerFlag(GetAccountName(), char_name, "MQTutorial: player tried to enter the tutorial without having tutorial enabled for this character."); eqs->Close(); return true; } } if (zoneID == 0 || !database.GetZoneName(zoneID)) { // This is to save people in an invalid zone, once it's removed from the DB database.MoveCharacterToZone(charid, "arena"); clog(WORLD__CLIENT_ERR, "Zone not found in database zone_id=%i, moveing char to arena character:%s", zoneID, char_name); } if(instanceID > 0) { if(!database.VerifyInstanceAlive(instanceID, GetCharID())) { zoneID = database.MoveCharacterToBind(charid); instanceID = 0; } else { if(!database.VerifyZoneInstance(zoneID, instanceID)) { zoneID = database.MoveCharacterToBind(charid); instanceID = 0; } } } if(!pZoning) { database.SetGroupID(char_name, 0, charid); database.SetFirstLogon(charid, 1); if (RuleB(World, AnnounceJoinQuits) == true) //this is having an issue, its not taking a true false swap, only takes default. { zoneserver_list.SendEmoteMessage(0, 0, 0, 15, "%s is logging on!", GetCharName()); clog(WORLD__CLIENT_ERR, "Character is logging on: %s", GetCharName()); } } else{ uint32 groupid=database.GetGroupID(char_name); if(groupid>0){ char* leader=0; char leaderbuf[64]={0}; if((leader=database.GetGroupLeaderForLogin(char_name,leaderbuf)) && strlen(leader)>1){ EQApplicationPacket* outapp3 = new EQApplicationPacket(OP_GroupUpdate,sizeof(GroupJoin_Struct)); GroupJoin_Struct* gj=(GroupJoin_Struct*)outapp3->pBuffer; gj->action=8; strcpy(gj->yourname,char_name); strcpy(gj->membername,leader); QueuePacket(outapp3); safe_delete(outapp3); } } } outapp = new EQApplicationPacket(OP_MOTD); char tmp[500] = {0}; if (database.GetVariable("MOTD", tmp, 500)) { outapp->size = strlen(tmp)+1; outapp->pBuffer = new uchar[outapp->size]; memset(outapp->pBuffer,0,outapp->size); strcpy((char*)outapp->pBuffer, tmp); } else { // Null Message of the Day. :) outapp->size = 1; outapp->pBuffer = new uchar[outapp->size]; outapp->pBuffer[0] = 0; } QueuePacket(outapp); safe_delete(outapp); int MailKey = MakeRandomInt(1, INT_MAX); database.SetMailKey(charid, GetIP(), MailKey); char ConnectionType; ConnectionType = 'C'; EQApplicationPacket *outapp2 = new EQApplicationPacket(OP_SetChatServer); char buffer[112]; const WorldConfig *Config = WorldConfig::get(); sprintf(buffer,"%s,%i,%s.%s,%c%08X", Config->ChatHost.c_str(), Config->ChatPort, Config->ShortName.c_str(), this->GetCharName(), ConnectionType, MailKey ); outapp2->size=strlen(buffer)+1; outapp2->pBuffer = new uchar[outapp2->size]; memcpy(outapp2->pBuffer,buffer,outapp2->size); QueuePacket(outapp2); safe_delete(outapp2); EnterWorld(); return true; }
UINT CAccountInfo::ProcessResponse(CHttpFile& pHttpFile) { #ifdef ARTSTORE return 1; #else //Take the HttpFile and parse it. UINT nFileLength = pHttpFile.GetLength(); CString strBuffer; CString strSearch; CString strList; LPSTR b = strBuffer.GetBuffer(nFileLength); pHttpFile.Read(b, nFileLength); strBuffer.ReleaseBuffer(); CBasicRequestInfo::ProcessResponse(strBuffer); UINT uStatusCode = atoi((LPCTSTR)GetStatusCode()); if(uStatusCode == 0 || uStatusCode == 15) //success or in use { CString strSearch; strSearch = "AccountID="; CString strTemp = ""; ParseFileForValue(strBuffer, strSearch, strTemp); m_strServerSuggestedAccountID = strTemp; if(m_strRequestedAccountID == strTemp){ SetAccountID(strTemp); CString strResult; CString strNotify; strNotify.LoadString(IDS_PGS_ACCOUNTID_NOTIFICATION); strResult.Format(strNotify, GetAccountID()); AfxMessageBox(strResult, MB_ICONINFORMATION); //at this point, the server has created our accountID (if new) CUUEncoder UUEncoder; GET_PMWAPP()->WriteProfileString(SECTION_ServerAccount, ENTRY_ServerAccountName, UUEncoder.EncodeString(GetAccountID())); GET_PMWAPP()->WriteProfileString(SECTION_ServerAccount, ENTRY_ServerPassword, UUEncoder.EncodeString(GetPassword())); }else{ //try to establish account again return 100; } } if(!GetStatusCode()) return 1; else return 0; #endif }
bool CVmRunEvn::CheckOperate(const vector<CVmOperate> &listoperate) { // judge contract rulue uint64_t addmoey = 0, miusmoney = 0; uint64_t operValue = 0; if(listoperate.size() > MAX_OUTPUT_COUNT) { return false; } for (auto& it : listoperate) { if(it.nacctype != regid && it.nacctype != base58addr) return false; if (it.opeatortype == ADD_FREE ) { memcpy(&operValue,it.money,sizeof(it.money)); uint64_t temp = addmoey; temp += operValue; if(temp < operValue || temp<addmoey) { return false; } addmoey = temp; }else if (it.opeatortype == MINUS_FREE) { //vector<unsigned char > accountid(it.accountid,it.accountid+sizeof(it.accountid)); vector_unsigned_char accountid = GetAccountID(it); if(accountid.size() != 6) return false; CRegID regId(accountid); CTransaction* tx = static_cast<CTransaction*>(listTx.get()); /// current tx's script cant't mius other script's regid if(m_ScriptDBTip->HaveScript(regId) && regId != boost::get<CRegID>(tx->desUserId)) { return false; } memcpy(&operValue,it.money,sizeof(it.money)); uint64_t temp = miusmoney; temp += operValue; if(temp < operValue || temp < miusmoney) { return false; } miusmoney = temp; } else{ // Assert(0); return false; // 输入数据错 } //vector<unsigned char> accountid(it.accountid, it.accountid + sizeof(it.accountid)); vector_unsigned_char accountid = GetAccountID(it); if(accountid.size() == 6){ CRegID regId(accountid); if(regId.IsEmpty() || regId.getKeyID( *m_view) == uint160()) return false; // app only be allowed minus self money if (!m_ScriptDBTip->HaveScript(regId) && it.opeatortype == MINUS_FREE) { return false; } } } if (addmoey != miusmoney) { return false; } return true; }
bool CVmRunEvn::OpeatorAccount(const vector<CVmOperate>& listoperate, CAccountViewCache& view, const int nCurHeight) { NewAccont.clear(); for (auto& it : listoperate) { // CTransaction* tx = static_cast<CTransaction*>(listTx.get()); // CFund fund; // memcpy(&fund.value,it.money,sizeof(it.money)); // fund.nHeight = it.outheight; uint64_t value; memcpy(&value, it.money, sizeof(it.money)); auto tem = std::make_shared<CAccount>(); // vector_unsigned_char accountid = GetAccountID(it); // if (accountid.size() == 0) { // return false; // } // vector_unsigned_char accountid(it.accountid,it.accountid+sizeof(it.accountid)); vector_unsigned_char accountid = GetAccountID(it); CRegID userregId; CKeyID userkeyid; if(accountid.size() == 6){ userregId.SetRegID(accountid); if(!view.GetAccount(CUserID(userregId), *tem.get())){ return false; /// 账户不存在 } }else{ string sharkfundaddr(accountid.begin(), accountid.end()); userkeyid = CKeyID(sharkfundaddr); if(!view.GetAccount(CUserID(userkeyid), *tem.get())) { tem->keyID = userkeyid; /// 未产生过交易记录的账户 //return false; /// 账户不存在 } } shared_ptr<CAccount> vmAccount = GetAccount(tem); if (vmAccount.get() == NULL) { RawAccont.push_back(tem); vmAccount = tem; } LogPrint("vm", "account id:%s\r\n", HexStr(accountid).c_str()); LogPrint("vm", "befer account:%s\r\n", vmAccount.get()->ToString().c_str()); bool ret = false; // vector<CScriptDBOperLog> vAuthorLog; //todolist // if(IsSignatureAccount(vmAccount.get()->regID) || vmAccount.get()->regID == boost::get<CRegID>(tx->appRegId)) { ret = vmAccount.get()->OperateAccount((OperType)it.opeatortype, value, nCurHeight); } // else{ // ret = vmAccount.get()->OperateAccount((OperType)it.opeatortype, fund, *m_ScriptDBTip, vAuthorLog, height, &GetScriptRegID().GetVec6(), true); // } // LogPrint("vm", "after account:%s\r\n", vmAccount.get()->ToString().c_str()); if (!ret) { return false; } NewAccont.push_back(vmAccount); // m_dblog->insert(m_dblog->end(), vAuthorLog.begin(), vAuthorLog.end()); } return true; }
bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) { PlayerProfile_Struct pp; ExtendedProfile_Struct ext; Inventory inv; time_t bday = time(nullptr); char startzone[50]={0}; uint32 i; struct in_addr in; int stats_sum = cc->STR + cc->STA + cc->AGI + cc->DEX + cc->WIS + cc->INT + cc->CHA; in.s_addr = GetIP(); clog(WORLD__CLIENT,"Character creation request from %s LS#%d (%s:%d) : ", GetCLE()->LSName(), GetCLE()->LSID(), inet_ntoa(in), GetPort()); clog(WORLD__CLIENT,"Name: %s", name); clog(WORLD__CLIENT,"Race: %d Class: %d Gender: %d Deity: %d Start zone: %d", cc->race, cc->class_, cc->gender, cc->deity, cc->start_zone); clog(WORLD__CLIENT,"STR STA AGI DEX WIS INT CHA Total"); clog(WORLD__CLIENT,"%3d %3d %3d %3d %3d %3d %3d %3d", cc->STR, cc->STA, cc->AGI, cc->DEX, cc->WIS, cc->INT, cc->CHA, stats_sum); clog(WORLD__CLIENT,"Face: %d Eye colors: %d %d", cc->face, cc->eyecolor1, cc->eyecolor2); clog(WORLD__CLIENT,"Hairstyle: %d Haircolor: %d", cc->hairstyle, cc->haircolor); clog(WORLD__CLIENT,"Beard: %d Beardcolor: %d", cc->beard, cc->beardcolor); // Convert incoming cc_s to the new PlayerProfile_Struct memset(&pp, 0, sizeof(PlayerProfile_Struct)); // start building the profile InitExtendedProfile(&ext); strn0cpy(pp.name, name, 63); // clean the capitalization of the name #if 0 // on second thought, don't - this will just make the creation fail // because the name won't match what was already reserved earlier for (i = 0; pp.name[i] && i < 63; i++) { if(!isalpha(pp.name[i])) return false; pp.name[i] = tolower(pp.name[i]); } pp.name[0] = toupper(pp.name[0]); #endif pp.race = cc->race; pp.class_ = cc->class_; pp.gender = cc->gender; pp.deity = cc->deity; pp.STR = cc->STR; pp.STA = cc->STA; pp.AGI = cc->AGI; pp.DEX = cc->DEX; pp.WIS = cc->WIS; pp.INT = cc->INT; pp.CHA = cc->CHA; pp.face = cc->face; pp.eyecolor1 = cc->eyecolor1; pp.eyecolor2 = cc->eyecolor2; pp.hairstyle = cc->hairstyle; pp.haircolor = cc->haircolor; pp.beard = cc->beard; pp.beardcolor = cc->beardcolor; pp.drakkin_heritage = cc->drakkin_heritage; pp.drakkin_tattoo = cc->drakkin_tattoo; pp.drakkin_details = cc->drakkin_details; pp.birthday = bday; pp.lastlogin = bday; pp.level = 1; pp.points = 5; pp.cur_hp = 1000; // 1k hp during dev only //what was the point of this? zone dosent handle this: //pp.expAA = 0xFFFFFFFF; pp.hunger_level = 6000; pp.thirst_level = 6000; // FIXME: FV roleplay, database goodness... // Racial Languages SetRacialLanguages( &pp ); SetRaceStartingSkills( &pp ); SetClassStartingSkills( &pp ); for(i = 0; i < MAX_PP_SPELLBOOK; i++) pp.spell_book[i] = 0xFFFFFFFF; for(i = 0; i < MAX_PP_MEMSPELL; i++) pp.mem_spells[i] = 0xFFFFFFFF; for(i = 0; i < BUFF_COUNT; i++) pp.buffs[i].spellid = 0xFFFF; //If server is PVP by default, make all character set to it. pp.pvp = database.GetServerType() == 1 ? 1 : 0; // if there's a startzone variable put them in there if(database.GetVariable("startzone", startzone, 50)) { clog(WORLD__CLIENT,"Found 'startzone' variable setting: %s", startzone); pp.zone_id = database.GetZoneID(startzone); if(pp.zone_id) database.GetSafePoints(pp.zone_id, 0, &pp.x, &pp.y, &pp.z); else clog(WORLD__CLIENT_ERR,"Error getting zone id for '%s'", startzone); } else // otherwise use normal starting zone logic { bool ValidStartZone = false; ValidStartZone = database.GetStartZone(&pp, cc); if(!ValidStartZone) return false; } if(!pp.zone_id) { pp.zone_id = 1; // qeynos pp.x = pp.y = pp.z = -1; } if(!pp.binds[0].zoneId) { pp.binds[0].zoneId = pp.zone_id; pp.binds[0].x = pp.x; pp.binds[0].y = pp.y; pp.binds[0].z = pp.z; pp.binds[0].heading = pp.heading; } // set starting city location to the initial bind point pp.binds[4] = pp.binds[0]; clog(WORLD__CLIENT,"Current location: %s %0.2f, %0.2f, %0.2f, %0.2f", database.GetZoneName(pp.zone_id), pp.x, pp.y, pp.z, pp.heading); clog(WORLD__CLIENT,"Bind location: %s %0.2f, %0.2f, %0.2f", database.GetZoneName(pp.binds[0].zoneId), pp.binds[0].x, pp.binds[0].y, pp.binds[0].z); // Starting Items inventory database.SetStartingItems(&pp, &inv, pp.race, pp.class_, pp.deity, pp.zone_id, pp.name, GetAdmin()); // now we give the pp and the inv we made to StoreCharacter // to see if we can store it if (!database.StoreCharacter(GetAccountID(), &pp, &inv, &ext)) { clog(WORLD__CLIENT_ERR,"Character creation failed: %s", pp.name); return false; } else { clog(WORLD__CLIENT,"Character creation successful: %s", pp.name); return true; } }
bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) { PlayerProfile_Struct pp; ExtendedProfile_Struct ext; Inventory inv; time_t bday = time(nullptr); char startzone[50]={0}; uint32 i; struct in_addr in; int stats_sum = cc->STR + cc->STA + cc->AGI + cc->DEX + cc->WIS + cc->INT + cc->CHA; in.s_addr = GetIP(); if(cc->face == 0 && cc->oldface > 0) cc->face = cc->oldface; clog(WORLD__CLIENT, "Character creation request from %s LS#%d (%s:%d) : ", GetCLE()->LSName(), GetCLE()->LSID(), inet_ntoa(in), GetPort()); clog(WORLD__CLIENT, "Name: %s", name); clog(WORLD__CLIENT, "Race: %d Class: %d Gender: %d Deity: %d Start zone: %d", cc->race, cc->class_, cc->gender, cc->deity, cc->start_zone); clog(WORLD__CLIENT, "STR STA AGI DEX WIS INT CHA Total"); clog(WORLD__CLIENT, "%3d %3d %3d %3d %3d %3d %3d %3d", cc->STR, cc->STA, cc->AGI, cc->DEX, cc->WIS, cc->INT, cc->CHA, stats_sum); clog(WORLD__CLIENT, "Face: %d Eye colors: %d %d", cc->face, cc->eyecolor1, cc->eyecolor2); clog(WORLD__CLIENT, "Hairstyle: %d Haircolor: %d", cc->hairstyle, cc->haircolor); clog(WORLD__CLIENT, "Beard: %d Beardcolor: %d", cc->beard, cc->beardcolor); /* Validate the char creation struct */ if(!CheckCharCreateInfo(cc)) { clog(WORLD__CLIENT_ERR,"CheckCharCreateInfo did not validate the request (bad race/class/stats)"); return false; } /* Convert incoming cc_s to the new PlayerProfile_Struct */ memset(&pp, 0, sizeof(PlayerProfile_Struct)); // start building the profile strn0cpy(pp.name, name, 63); pp.race = cc->race; pp.class_ = cc->class_; pp.gender = cc->gender; pp.deity = cc->deity; pp.STR = cc->STR; pp.STA = cc->STA; pp.AGI = cc->AGI; pp.DEX = cc->DEX; pp.WIS = cc->WIS; pp.INT = cc->INT; pp.CHA = cc->CHA; pp.face = cc->face; pp.eyecolor1 = cc->eyecolor1; pp.eyecolor2 = cc->eyecolor2; pp.hairstyle = cc->hairstyle; pp.haircolor = cc->haircolor; pp.beard = cc->beard; pp.beardcolor = cc->beardcolor; pp.birthday = bday; pp.lastlogin = bday; pp.level = 1; pp.points = 5; pp.cur_hp = 1000; // 1k hp during dev only pp.hunger_level = 6000; pp.thirst_level = 6000; /* Set Racial and Class specific language and skills */ SetRacialLanguages(&pp); SetRaceStartingSkills(&pp); SetClassStartingSkills(&pp); SetClassLanguages(&pp); for (i = 0; i < MAX_PP_REF_SPELLBOOK; i++) pp.spell_book[i] = 0xFFFFFFFF; for(i = 0; i < MAX_PP_REF_MEMSPELL; i++) pp.mem_spells[i] = 0xFFFFFFFF; for(i = 0; i < BUFF_COUNT; i++) pp.buffs[i].spellid = 0xFFFF; /* If server is PVP by default, make all character set to it. */ pp.pvp = database.GetServerType() == 1 ? 1 : 0; // if there's a startzone variable put them in there if(database.GetVariable("startzone", startzone, 50)) { clog(WORLD__CLIENT,"Found 'startzone' variable setting: %s", startzone); pp.zone_id = database.GetZoneID(startzone); if(pp.zone_id) database.GetSafePoints(pp.zone_id, 0, &pp.x, &pp.y, &pp.z); else clog(WORLD__CLIENT_ERR,"Error getting zone id for '%s'", startzone); } else // otherwise use normal starting zone logic { bool ValidStartZone = false; ValidStartZone = database.GetStartZone(&pp, cc); if(!ValidStartZone) return false; } /* just in case */ if (!pp.zone_id) { pp.zone_id = qeynos; pp.x = pp.y = pp.z = -1; } if (!pp.binds[0].zoneId) { pp.binds[0].zoneId = pp.zone_id; pp.binds[0].x = pp.x; pp.binds[0].y = pp.y; pp.binds[0].z = pp.z; pp.binds[0].heading = pp.heading; } // set starting city location to the initial bind point pp.binds[4] = pp.binds[0]; clog(WORLD__CLIENT, "Current location: %s %0.2f, %0.2f, %0.2f, %0.2f", database.GetZoneName(pp.zone_id), pp.x, pp.y, pp.z, pp.heading); clog(WORLD__CLIENT, "Bind location: %s %0.2f, %0.2f, %0.2f", database.GetZoneName(pp.binds[0].zoneId), pp.binds[0].x, pp.binds[0].y, pp.binds[0].z); /* Starting Items inventory */ database.SetStartingItems(&pp, &inv, pp.race, pp.class_, pp.deity, pp.zone_id, pp.name, GetAdmin()); // now we give the pp and the inv we made to StoreCharacter // to see if we can store it if (!database.StoreCharacter(GetAccountID(), &pp, &inv)) { clog(WORLD__CLIENT_ERR,"Character creation failed: %s", pp.name); return false; } clog(WORLD__CLIENT,"Character creation successful: %s", pp.name); return true; }