ManaPlus
guildrecv.cpp
Go to the documentation of this file.
1 /*
2  * The ManaPlus Client
3  * Copyright (C) 2009-2010 The Mana Developers
4  * Copyright (C) 2011-2018 The ManaPlus Developers
5  *
6  * This file is part of The ManaPlus Client.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #include "net/eathena/guildrecv.h"
23 
24 #include "actormanager.h"
25 #include "configuration.h"
26 #include "notifymanager.h"
27 
28 #include "being/localplayer.h"
29 #include "being/playerinfo.h"
30 
32 
33 #include "gui/windows/chatwindow.h"
36 
38 
39 #include "net/messagein.h"
40 
42 
43 #include "utils/delete2.h"
44 #include "utils/checkutils.h"
45 #include "utils/gettext.h"
46 
47 #include "debug.h"
48 
49 namespace EAthena
50 {
51 
52 Guild *taGuild = nullptr;
53 
54 namespace GuildRecv
55 {
56  bool showBasicInfo = false;
57 } // namespace GuildRecv
58 
60 {
61  const uint8_t flag = msg.readUInt8("flag");
62 
63  switch (flag)
64  {
65  case 0:
66  // Success
68  break;
69 
70  case 1:
71  // Already in a guild
73  break;
74 
75  case 2:
76  // Unable to make (likely name already in use)
78  break;
79 
80  case 3:
81  // Emperium check failed
83  break;
84 
85  default:
86  // Unknown response
88  break;
89  }
90 }
91 
93 {
94  msg.readInt32("type"); // Type (0x57 for member, 0xd7 for master)
95 }
96 
98 {
99  const int guildId = msg.readInt32("guild id");
100  const int level = msg.readInt32("guild level");
101  const int members = msg.readInt32("connect member");
102  const int maxMembers = msg.readInt32("max member");
103  const int avgLevel = msg.readInt32("average level");
104  const int exp = msg.readInt32("exp");
105  const int nextExp = msg.readInt32("next exp");
106  msg.skip(12, "unused");
107  const int emblem = msg.readInt32("emblem id");
108  std::string name = msg.readString(24, "guild name");
109  std::string castle;
110  std::string master;
111  if (msg.getVersion() >= 20160622)
112  {
113  castle = msg.readString(16, "castles");
114  msg.readInt32("money, unused");
115  msg.readBeingId("leader char id");
116  }
117  else
118  {
119  master = msg.readString(24, "master name");
120  castle = msg.readString(16, "castles");
121  msg.readInt32("money, unused");
122  }
123 
124  if (guildTab != nullptr &&
126  {
127  showBasicInfo = false;
128  // TRANSLATORS: guild info message
129  guildTab->chatLog(strprintf(_("Guild name: %s"),
130  name.c_str()),
134  if (!master.empty())
135  {
136  // TRANSLATORS: guild info message
137  guildTab->chatLog(strprintf(_("Guild master: %s"),
138  master.c_str()),
142  }
143  // TRANSLATORS: guild info message
144  guildTab->chatLog(strprintf(_("Guild level: %d"), level),
148  // TRANSLATORS: guild info message
149  guildTab->chatLog(strprintf(_("Online members: %d"), members),
153  // TRANSLATORS: guild info message
154  guildTab->chatLog(strprintf(_("Max members: %d"), maxMembers),
158  // TRANSLATORS: guild info message
159  guildTab->chatLog(strprintf(_("Average level: %d"), avgLevel),
163  // TRANSLATORS: guild info message
164  guildTab->chatLog(strprintf(_("Guild exp: %d"), exp),
168  // TRANSLATORS: guild info message
169  guildTab->chatLog(strprintf(_("Guild next exp: %d"), nextExp),
173  // TRANSLATORS: guild info message
174  guildTab->chatLog(strprintf(_("Guild castle: %s"), castle.c_str()),
178  }
179 
180  Guild *const g = Guild::getGuild(CAST_S16(guildId));
181  if (g == nullptr)
182  return;
183  g->setName(name);
184  g->setEmblemId(emblem);
185 }
186 
188 {
189  const int length = msg.readInt16("len");
190  if (length < 4)
191  return;
192  const int count = (length - 4) / 32;
193 
194  for (int i = 0; i < count; i++)
195  {
196  msg.readInt32("opposition");
197  msg.readInt32("guild id");
198  msg.readString(24, "guild name");
199  }
200 }
201 
203 {
204  const int length = msg.readInt16("len");
205  if (length < 4)
206  return;
207  int guildSize = 0;
208  if (msg.getVersion() >= 20161026)
209  {
210  guildSize = 34;
211  reportAlways("missing guild member names");
212  }
213  else
214  {
215  guildSize = 104;
216  }
217 
218  const int count = (length - 4) / guildSize;
219  if (taGuild == nullptr)
220  {
221  logger->log1("!taGuild");
222  return;
223  }
224 
225  taGuild->clearMembers();
226 
227  int onlineNum = 0;
228  int totalNum = 0;
229  for (int i = 0; i < count; i++)
230  {
231  const BeingId id = msg.readBeingId("account id");
232  const int charId = msg.readInt32("char id");
233  msg.readInt16("hair");
234  msg.readInt16("hair color");
235  const int gender = msg.readInt16("gender");
236  const int race = msg.readInt16("class");
237  const int level = msg.readInt16("level");
238  const int exp = msg.readInt32("exp");
239  const int online = msg.readInt32("online");
240  const int pos = msg.readInt32("position");
241  std::string name;
242  if (msg.getVersion() < 20161026)
243  {
244  msg.skip(50, "unused");
245  name = msg.readString(24, "name");
246  }
247  else
248  {
249  msg.readInt32("last login"); // for now unused
250  continue;
251  }
252 
253  GuildMember *const m = taGuild->addMember(id, charId, name);
254  if (m != nullptr)
255  {
256  m->setOnline(online != 0);
257  m->setID(id);
258  m->setCharId(charId);
259  m->setGender(Being::intToGender(CAST_U8(gender)));
260  m->setLevel(level);
261  m->setExp(exp);
262  m->setPos(pos);
263  m->setRace(race);
264  if (actorManager != nullptr)
265  {
266  Being *const being = actorManager->findBeingByName(
267  name, ActorType::Player);
268  if (being != nullptr)
269  {
270  being->setGuildName(taGuild->getName());
271  if (being->getLevel() != level)
272  {
273  being->setLevel(level);
274  being->updateName();
275  }
276  }
277  }
278  if (online != 0)
279  onlineNum ++;
280  totalNum ++;
281  }
282  }
283  taGuild->sort();
284  if (actorManager != nullptr)
285  {
288  }
289  if (socialWindow != nullptr)
290  socialWindow->updateGuildCounter(onlineNum, totalNum);
291 }
292 
294 {
295  if (taGuild == nullptr)
296  {
297  logger->log1("!taGuild");
298  return;
299  }
300 
301  const int length = msg.readInt16("len");
302  if (length < 4)
303  return;
304  const int count = (length - 4) / 28;
305 
306  for (int i = 0; i < count; i++)
307  {
308  const int id = msg.readInt32("position id");
309  const std::string name = msg.readString(24, "position name");
310  taGuild->addPos(id, name);
311  }
312 }
313 
315 {
316  const int length = msg.readInt16("len");
317  if (length < 4)
318  return;
319  const int count = (length - 4) / 16;
320 
321  for (int i = 0; i < count; i++)
322  {
323  msg.readInt32("id");
324  msg.readInt32("mode");
325  msg.readInt32("same id");
326  msg.readInt32("exp mode");
327  }
328 }
329 
331 {
333  msg.readInt16("len");
334  msg.readInt32("id");
335  msg.readInt32("mode");
336  msg.readInt32("same ip");
337  msg.readInt32("exp mode");
338  msg.readString(24, "name");
339 }
340 
342 {
343  msg.readInt16("len");
344  const BeingId accountId = msg.readBeingId("account id");
345  const int charId = msg.readInt32("char id");
346  const int pos = msg.readInt32("position");
347  if (taGuild != nullptr)
348  {
349  GuildMember *const m = taGuild->getMember(accountId, charId);
350  if (m != nullptr)
351  m->setPos(pos);
352  }
353 }
354 
356 {
358  const int length = msg.readInt16("len");
359 
360  msg.readInt32("guild id");
361  msg.readInt32("emblem id");
362  if (length < 12)
363  return;
364  msg.skip(length - 12, "emblem data");
365 }
366 
368 {
369  const int count = (msg.readInt16("len") - 6) / 37;
370  msg.readInt16("skill points");
371 
372  if (skillDialog != nullptr)
374  for (int i = 0; i < count; i++)
375  {
376  const int skillId = msg.readInt16("skill id");
377  const SkillType::SkillType inf = static_cast<SkillType::SkillType>(
378  msg.readInt32("inf"));
379  const int level = msg.readInt16("skill level");
380  const int sp = msg.readInt16("sp");
381  const int range = msg.readInt16("range");
382  const std::string name = msg.readString(24, "skill name");
383  const Modifiable up = fromBool(msg.readUInt8("up flag"), Modifiable);
384  PlayerInfo::setSkillLevel(skillId, level);
385  if (skillDialog != nullptr)
386  {
387  if (!skillDialog->updateSkill(skillId, range, up, inf, sp))
388  {
390  skillId, name, level, range, up, inf, sp);
391  }
392  }
393  }
394  if (skillDialog != nullptr)
396 }
397 
399 {
400  if (guildTab != nullptr)
401  {
402  const std::string msg1 = msg.readString(60, "msg1");
403  const std::string msg2 = msg.readString(120, "msg2");
404  guildTab->chatLog(msg1,
408  guildTab->chatLog(msg2,
412  }
413  else
414  {
415  msg.readString(60, "msg1");
416  msg.readString(120, "msg2");
417  }
418 }
419 
421 {
422  const int guildId = msg.readInt32("guild id");
423 
424  if (socialWindow != nullptr)
425  {
426  const std::string guildName = msg.readString(24, "guild name");
427  socialWindow->showGuildInvite(guildName, guildId, "");
428  }
429  else
430  {
431  msg.readString(24, "guild name");
432  }
433 }
434 
436 {
437  const uint8_t flag = msg.readUInt8("flag");
438  if (guildTab == nullptr)
439  return;
440 
441  switch (flag)
442  {
443  case 0:
445  break;
446 
447  case 1:
449  break;
450 
451  case 2:
453  break;
454 
455  case 3:
457  break;
458 
459  default:
461  break;
462  }
463 }
464 
466 {
467  const std::string nick = msg.readString(24, "nick");
468  msg.readString(40, "message");
469 
470  if (taGuild != nullptr)
471  taGuild->removeMember(nick);
472 
473  if (localPlayer == nullptr)
474  return;
475 
476  if (nick == localPlayer->getName())
477  {
478  if (taGuild != nullptr)
479  {
480  taGuild->removeFromMembers();
481  taGuild->clearMembers();
482  localPlayer->removeGuild(taGuild->getId());
483  }
486 
487  if ((socialWindow != nullptr) && (taGuild != nullptr))
488  socialWindow->removeTab(taGuild);
489  if (actorManager != nullptr)
491  }
492  else
493  {
495  if (actorManager != nullptr)
496  {
497  Being *const b = actorManager->findBeingByName(
498  nick, ActorType::Player);
499 
500  if (b != nullptr)
501  b->clearGuilds();
502  if (taGuild != nullptr)
503  taGuild->removeMember(nick);
504  }
505  }
506 }
507 
509 {
510  const int msgLength = msg.readInt16("len") - 4;
511 
512  if (msgLength <= 0)
513  return;
514  if (guildTab != nullptr)
515  {
516  std::string chatMsg = msg.readString(msgLength, "message");
517  const size_t pos = chatMsg.find(" : ", 0);
518  if (pos != std::string::npos)
519  {
520  const std::string sender_name = chatMsg.substr(0, pos);
521  chatMsg.erase(0, pos + 3);
522  trim(chatMsg);
523  guildTab->chatLog(sender_name, chatMsg);
524  }
525  else
526  {
527  guildTab->chatLog(chatMsg,
531  }
532  }
533  else
534  {
535  DEBUGLOGSTR("invisible guild?");
536  msg.readString(msgLength, "message");
537  }
538 }
539 
541 {
543  msg.readInt32("id");
544  msg.readString(24, "name");
545 }
546 
548 {
550  msg.readInt32("flag");
551 }
552 
554 {
556  msg.readInt32("guild id");
557  msg.readInt32("flag");
558 }
559 
561 {
563  msg.readUInt8("flag");
564 }
565 
567 {
569  msg.readInt32("flag");
570 }
571 
572 void GuildRecv::processGuildExpulsionContinue(const std::string &nick)
573 {
574  if (taGuild != nullptr)
575  taGuild->removeMember(nick);
576 
577  if (localPlayer == nullptr)
578  return;
579 
580  if (nick == localPlayer->getName())
581  {
582  if (taGuild != nullptr)
583  {
584  taGuild->removeFromMembers();
585  taGuild->clearMembers();
586  }
589 
590  if ((socialWindow != nullptr) && (taGuild != nullptr))
591  socialWindow->removeTab(taGuild);
592  if (actorManager != nullptr)
594  }
595  else
596  {
598  if (actorManager != nullptr)
599  {
600  Being *const b = actorManager->findBeingByName(
601  nick, ActorType::Player);
602 
603  if (b != nullptr)
604  b->clearGuilds();
605  if (taGuild != nullptr)
606  taGuild->removeMember(nick);
607  }
608  }
609 }
610 
612 {
613  const BeingId id = msg.readBeingId("account id");
614  const int x = msg.readInt16("x");
615  const int y = msg.readInt16("y");
616  if (taGuild != nullptr)
617  {
618  GuildMember *const m = taGuild->getMember(id);
619  if (m != nullptr)
620  {
621  m->setX(x);
622  m->setY(y);
623  }
624  }
625 }
626 
628 {
629  const int guildId = msg.readInt32("guild id");
630  const int emblem = msg.readInt32("elblem id");
632  static_cast<GuildPositionFlags::Type>(msg.readInt32("mode")));
633  msg.readUInt8("guild master");
634  msg.readInt32("unused");
635  std::string guildName = msg.readString(24, "guild name");
636 
637  Guild *const g = Guild::getGuild(CAST_S16(guildId));
638  if (g == nullptr)
639  return;
640 
641  g->setName(guildName);
642  g->setEmblemId(emblem);
643  if (taGuild == nullptr)
644  taGuild = g;
645  if ((guildTab == nullptr) && (chatWindow != nullptr))
646  {
648  if (config.getBoolValue("showChatHistory"))
649  guildTab->loadFromLogFile("#Guild");
650  if (localPlayer != nullptr)
651  localPlayer->addGuild(taGuild);
653  }
654 
655  if (localPlayer != nullptr)
656  {
657  localPlayer->setGuild(g);
659  }
660 }
661 
663 {
664  const BeingId accountId = msg.readBeingId("account id");
665  const int charId = msg.readInt32("char id");
666  const int online = msg.readInt32("flag");
667  const GenderT gender = Being::intToGender(CAST_U8(
668  msg.readInt16("sex")));
669  msg.readInt16("hair");
670  msg.readInt16("hair color");
671  if (taGuild != nullptr)
672  {
673  GuildMember *const m = taGuild->getMember(accountId, charId);
674  if (m != nullptr)
675  {
676  m->setOnline(online != 0);
677  if (online != 0)
678  m->setGender(gender);
679  if (guildTab != nullptr)
680  guildTab->showOnline(m->getName(), fromBool(online, Online));
681  if (socialWindow != nullptr)
683  }
684  }
685 }
686 
688 {
689  const std::string nick = msg.readString(24, "name");
690  msg.readString(40, "message");
691 
693 }
694 
696 {
697  const int length = msg.readInt16("len");
698  if (length < 4)
699  return;
700 
701  int count;
702  if (msg.getVersion() < 20100803)
703  {
704  count = (length - 4) / 64;
705  for (int i = 0; i < count; i++)
706  {
707  msg.readString(24, "name");
708  msg.readString(40, "message");
709  }
710  }
711  else
712  {
713  count = (length - 4) / 40;
714  for (int i = 0; i < count; i++)
715  msg.readString(40, "message");
716  }
717 }
718 
720 {
722  msg.readBeingId("being id");
723  msg.readInt32("guild id");
724  msg.readInt16("emblem id");
725 }
726 
728 {
729  // look like unused packet
731  msg.readBeingId("being id");
732  msg.readInt32("char id");
733  msg.readInt32("online");
734 }
735 
736 } // namespace EAthena
void setGuildPositionFlags(const GuildPositionFlags::Type pos)
Definition: playerinfo.cpp:644
ChatWindow * chatWindow
Definition: chatwindow.cpp:88
std::string getName() const
Definition: avatar.h:52
virtual unsigned char readUInt8(const char *const str)
Definition: messagein.cpp:74
#define _(s)
Definition: gettext.h:34
void log1(const char *const log_text)
Definition: logger.cpp:222
void updateModels()
#define CAST_U8
Definition: cast.h:26
void showGuildInvite(const std::string &guildName, const int guildId, const std::string &inviterName)
int16_t getId() const
Definition: guild.h:127
virtual BeingId readBeingId(const char *const str)=0
void setExp(const int n)
Definition: avatar.h:146
void setPos(const int pos)
Definition: guild.h:49
void processGuildInvite(Net::MessageIn &msg)
Definition: guildrecv.cpp:420
bool removeTab(Guild *const guild)
void setLevel(const int level)
Definition: avatar.h:116
void setGuildName(const std::string &name)
Definition: being.cpp:1194
bool updateSkill(const int id, const int range, const Modifiable modifiable, const SkillType::SkillType type, const int sp)
Guild * taGuild
Definition: guildhandler.h:98
Configuration config
int BeingId
Definition: beingid.h:29
void setOnline(const bool online)
Definition: avatar.h:86
virtual int16_t readInt16(const char *const str)=0
void clearMembers()
Definition: guild.h:147
GuildMember * addMember(const BeingId accountId, const int charId, const std::string &name)
Definition: guild.cpp:111
void processGuildMasterOrMember(Net::MessageIn &msg)
Definition: guildrecv.cpp:92
void addPos(const int id, const std::string &name)
Definition: guild.cpp:351
const bool TryRemoveColors_true
void chatLog(std::string line, ChatMsgTypeT own, const IgnoreRecord ignoreRecord, const TryRemoveColors tryRemoveColors)
Definition: chattab.cpp:110
bool msg(InputEvent &event)
Definition: chat.cpp:38
void removeMember(const GuildMember *const member)
Definition: guild.cpp:186
void notify(const unsigned int message)
#define delete2(var)
Definition: delete2.h:24
Net::GuildHandler * guildHandler
Definition: net.cpp:85
virtual void memberList() const =0
void setY(const int y)
Definition: avatar.h:134
static GenderT intToGender(const uint8_t sex) A_CONST
Definition: being.h:936
void processGuildInviteAck(Net::MessageIn &msg)
Definition: guildrecv.cpp:435
void processGuildExpulsionContinue(const std::string &nick)
Definition: guildrecv.cpp:572
GuildMember * getMember(const BeingId id) const
Definition: guild.cpp:139
void hideSkills(const SkillOwner::Type owner)
void setName(const std::string &name)
Definition: guild.h:78
bool Modifiable
Definition: modifiable.h:29
void processGuildReqAlliance(Net::MessageIn &msg)
Definition: guildrecv.cpp:540
Logger * logger
Definition: logger.cpp:95
void loadFromLogFile(const std::string &name)
Definition: chattab.cpp:510
void addGuild(Guild *const guild)
Definition: being.cpp:1208
void updatePlayerColors() const
bool getBoolValue(const std::string &key) const
std::string strprintf(const char *const format,...)
Definition: stringutils.cpp:99
void clearGuilds()
Definition: being.cpp:1260
void processGuildMemberLogin(Net::MessageIn &msg)
Definition: guildrecv.cpp:662
#define fromBool(val, name)
Definition: booldefines.h:48
void processGuildAlianceInfo(Net::MessageIn &msg)
Definition: guildrecv.cpp:187
#define DEBUGLOGSTR(str)
Definition: logger.h:44
LocalPlayer * localPlayer
virtual void skip(const unsigned int length, const char *const str)
Definition: messagein.cpp:201
void processGuildLeave(Net::MessageIn &msg)
Definition: guildrecv.cpp:465
std::string trim(std::string const &str)
const bool IgnoreRecord_false
Definition: ignorerecord.h:29
void removeFromMembers()
Definition: guild.cpp:255
void processGuildPositionInfo(Net::MessageIn &msg)
Definition: guildrecv.cpp:627
void processGuildPosNameList(Net::MessageIn &msg)
Definition: guildrecv.cpp:293
void processGuildMemberList(Net::MessageIn &msg)
Definition: guildrecv.cpp:202
unsigned int getVersion() const
Definition: messagein.h:127
SocialWindow * socialWindow
void setSkillLevel(const int id, const int value)
Definition: playerinfo.cpp:126
const std::string & getName() const
Definition: being.h:231
void processGuildNotice(Net::MessageIn &msg)
Definition: guildrecv.cpp:398
void processGuildDelAlliance(Net::MessageIn &msg)
Definition: guildrecv.cpp:553
void processGuildUpdateCoords(Net::MessageIn &msg)
Definition: guildrecv.cpp:611
Gender ::T GenderT
Definition: gender.h:35
void setCharId(const int id)
Definition: avatar.h:158
void processGuildSkillInfo(Net::MessageIn &msg)
Definition: guildrecv.cpp:367
void updateName()
Definition: being.cpp:3398
void setEmblemId(const int id)
Definition: guild.h:187
void processGuildMemberPosChange(Net::MessageIn &msg)
Definition: guildrecv.cpp:341
SkillDialog * skillDialog
Definition: skilldialog.cpp:65
void processGuildBasicInfo(Net::MessageIn &msg)
Definition: guildrecv.cpp:97
void setRace(const int r)
Definition: avatar.h:170
void updateGuildCounter(const int online, const int total)
void showOnline(const std::string &nick, const Online online)
Definition: chattab.cpp:547
void processGuildPosInfoList(Net::MessageIn &msg)
Definition: guildrecv.cpp:314
GuildTab * guildTab
void sort()
Definition: guild.cpp:375
void processGuildCreateResponse(Net::MessageIn &msg)
Definition: guildrecv.cpp:59
void addSkill(const SkillOwner::Type owner, const int id, const std::string &name, const int level, const int range, const Modifiable modifiable, const SkillType::SkillType type, const int sp)
void removeGuild(const int id)
Definition: being.cpp:1219
virtual int32_t readInt32(const char *const str)=0
void setGender(const GenderT g)
Definition: avatar.h:164
virtual std::string readString(int length, const char *const dstr)
Definition: messagein.cpp:219
void processGuildReqAllianceAck(Net::MessageIn &msg)
Definition: guildrecv.cpp:547
Being * findBeingByName(const std::string &name, const ActorTypeT type) const
#define UNIMPLEMENTEDPACKET
Definition: logger.h:55
#define CAST_S16
Definition: cast.h:27
void processGuildPositionChanged(Net::MessageIn &msg)
Definition: guildrecv.cpp:330
virtual int getLevel() const
Definition: being.h:597
static Guild * getGuild(const int16_t id)
Definition: guild.cpp:356
void processGuildOppositionAck(Net::MessageIn &msg)
Definition: guildrecv.cpp:560
Definition: being.h:93
void processOnlineInfo(Net::MessageIn &msg)
Definition: guildrecv.cpp:727
Definition: guild.h:68
#define reportAlways(...)
Definition: checkutils.h:252
void processGuildEmblem(Net::MessageIn &msg)
Definition: guildrecv.cpp:719
void processGuildBroken(Net::MessageIn &msg)
Definition: guildrecv.cpp:566
void processGuildEmblemData(Net::MessageIn &msg)
Definition: guildrecv.cpp:355
void setX(const int x)
Definition: avatar.h:128
void setGuild(Guild *const guild)
Definition: being.cpp:1325
void processGuildMessage(Net::MessageIn &msg)
Definition: guildrecv.cpp:508
ActorManager * actorManager
void updatePlayerGuild() const
void processGuildExpulsion(Net::MessageIn &msg)
Definition: guildrecv.cpp:687
const std::string & getName() const
Definition: guild.h:120
void setLevel(const int n)
Definition: being.h:594
void processGuildExpulsionList(Net::MessageIn &msg)
Definition: guildrecv.cpp:695
void setID(const BeingId id)
Definition: avatar.h:152
bool msg2(InputEvent &event)
Definition: chat.cpp:40