character.cpp rev 189 std::string InboxSerialize(const PtrList<Character_Inbox> &list) { std::string serialized; for (PtrList<Character_Inbox>::ConstIterator ac(list); ac; ++ac) { serialized.append(util::to_string(ac->id)); serialized.append(","); serialized.append(ac->message); serialized.append(";"); } return serialized; } PtrList<Character_Inbox> InboxUnserialize(std::string serialized) { PtrList<Character_Inbox> list; std::size_t p = 0; std::size_t lastp = std::numeric_limits<std::size_t>::max(); if (!serialized.empty() && *(serialized.end()-1) != ';') { serialized.push_back(';'); } while ((p = serialized.find_first_of(';', p+1)) != std::string::npos) { std::string part = serialized.substr(lastp+1, p-lastp-1); std::size_t pp = 0; pp = part.find_first_of(',', 0); if (pp == std::string::npos) { continue; } Character_Inbox *newinbox = new Character_Inbox; newinbox->id = util::to_int(part.substr(0, pp)); newinbox->message = part.substr(pp+1); list.push_back(newinbox); newinbox->Release(); lastp = p; } return list; } void Character::Load_Message(short id) { UTIL_PTR_LIST_FOREACH(this->inbox, Character_Inbox, in) { if(in->id == id) { PacketBuilder r(PACKET_PING, PACKET_ACCEPT); r.AddString("Message # " + util::to_string(id)); r.AddByte(255); r.AddString(in->message); this->SB(r); } } } int Character::HasMessage(short id) { UTIL_PTR_LIST_FOREACH(this->inbox, Character_Inbox, in) { if (in->id == id) { return in->id; } } return 0; } bool Character::AddMessage(short id, std::string message) { if(this->HasMessage(id)) { return false; } if(message.length() > 50) { this->ShowHint("Your message was to big and resized to fit in his in box!"); message.substr(0, 50); } Character_Inbox *newinbox = new Character_Inbox; newinbox->id = id; newinbox->message = message; this->inbox.push_back(newinbox); return true; } bool Character::DelMessage(short id) { UTIL_PTR_LIST_FOREACH(this->inbox, Character_Inbox, it) { if (it->id == id) { this->inbox.erase(it); return true; } } return false; } character.hpp /** * Serialize a list of a messages in to a text format that can be restored with InboxUnserialize */ std::string InboxSerialize(const PtrList<Character_Inbox> &list); /** * Convert a string generated by inboxSerialze back to a list of messages */ PtrList<Character_Inbox> InboxUnserialize(std::string serialized); /** * One inbox message a Character has */ struct Character_Inbox : public Shared { short id; std::string message; //Character_Achievement() : id(0), name(""){} SCRIPT_REGISTER_REF_DF(Character_Inbox) SCRIPT_REGISTER_END() }; PtrList<Character_Inbox> inbox; int HasMessage(short id); bool AddMessage(short id, std::string message); void Load_Message(short id); bool DelMessage(short id); Talk.cpp else if(command.length() == 7 && command.compare(0,7,"message") == 0 && arguments.size() > 0) { std::string name = arguments[0]; std::string message = arguments[1]; UTIL_PTR_VECTOR_FOREACH(this->server->world->characters, Character, character) { if(character->name == name) { std::transform(arguments[1].begin(),arguments[1].end(),arguments[1].begin(),static_cast<int(*)(int)>(std::tolower)); for(int i = 2; i < static_cast<int>(arguments.size()); i++) { if(message == "") { message = arguments[i]; } else { message += " " + arguments[i]; } } int id1 = 0; UTIL_PTR_LIST_FOREACH(character->inbox, Character_Inbox, in) { /*for(int i = 0; i < in->id; ++i) { //Console::Out(util::to_string(in->id) + " INID"); }*/ id1 = (in->id + 1); } character->AddMessage(id1, "From " + this->player->character->name + ": " + message); } if(this->server->world->CharacterExists(name)) //this->server->world->db.Query("UPDATE `characters` SET `inbox` = '$', WHERE `name` = '$'", 1, message.c_str()); this->server->world->db.Query("UPDATE `characters` SET `inbox` = '$' WHERE `name` = '$'", 1, message.c_str()); } } else if(command.length() == 9 && command.compare(0,9,"checkmess") == 0 && arguments.size() > 0) { int id1 = util::to_int(arguments[0]); UTIL_PTR_LIST_FOREACH(this->player->character->inbox, Character_Inbox, in) { this->player->character->ShowHint("Your have " + util::to_string(in->id) + " messages" ); if(this->player->character->HasMessage(id1)) { this->player->character->Load_Message(id1); } else { this->player->character->ShowHint(" The message specified does not exist"); } } } else if(command.length() == 6 && command.compare(0,6,"delmes") == 0 && arguments.size() > 0) { int id1 = util::to_int(arguments[0]); if(this->player->character->HasMessage(id1)) { this->player->character->DelMessage(id1); this->player->character->ShowHint("Message # " + util::to_string(id1) + " has been erased!"); } else { this->player->character->ShowHint(" The message specified does not exist"); } }