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");
}
}