ManaPlus
playerhandler.cpp
Go to the documentation of this file.
1 /*
2  * The ManaPlus Client
3  * Copyright (C) 2004-2009 The Mana World Development Team
4  * Copyright (C) 2009-2010 The Mana Developers
5  * Copyright (C) 2011-2018 The ManaPlus Developers
6  *
7  * This file is part of The ManaPlus Client.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <http://www.gnu.org/licenses/>.
21  */
22 
24 
25 #include "notifymanager.h"
26 #include "party.h"
27 
28 #include "being/localplayer.h"
29 #include "being/playerinfo.h"
30 
31 #include "const/net/nostat.h"
32 
34 
37 
39 
40 #include "net/eathena/messageout.h"
42 #include "net/eathena/sp.h"
43 
44 #include "resources/db/unitsdb.h"
45 
46 #include "debug.h"
47 
48 extern int packetVersion;
49 extern int packetVersionRe;
50 extern int serverVersion;
51 
52 namespace EAthena
53 {
54 
56  Ea::PlayerHandler()
57 {
58  playerHandler = this;
59 }
60 
62 {
63  playerHandler = nullptr;
64 }
65 
67  const Keep keep) const
68 {
70  outMsg.writeBeingId(id, "target id");
71  if (keep == Keep_true)
72  outMsg.writeInt8(7, "action");
73  else
74  outMsg.writeInt8(0, "action");
75 }
76 
78 {
80 }
81 
82 void PlayerHandler::emote(const uint8_t emoteId) const
83 {
85  outMsg.writeInt8(emoteId, "emote id");
86 }
87 
89  const int amount) const
90 {
91  if (attr >= Attributes::PLAYER_STR && attr <= Attributes::PLAYER_LUK)
92  {
94  outMsg.writeInt16(CAST_S16(attr), "attribute id");
95  outMsg.writeInt8(CAST_S8(amount), "increase");
96  }
97 }
98 
99 void PlayerHandler::increaseSkill(const uint16_t skillId) const
100 {
102  return;
103 
105  outMsg.writeInt16(skillId, "skill id");
106 }
107 
108 void PlayerHandler::pickUp(const FloorItem *const floorItem) const
109 {
110  if (floorItem == nullptr)
111  return;
112 
114  const BeingId id = floorItem->getId();
115  if (packetVersion >= 20101124)
116  {
117  outMsg.writeBeingId(id, "object id");
118  }
119  else if (packetVersion >= 20080827)
120  {
121  outMsg.writeInt32(0, "unused");
122  outMsg.writeInt8(0, "unused");
123  outMsg.writeBeingId(id, "object id");
124  }
125  else if (packetVersion >= 20070212)
126  {
127  outMsg.writeInt32(0, "unused");
128  outMsg.writeBeingId(id, "object id");
129  }
130  else if (packetVersion >= 20070108)
131  {
132  outMsg.writeInt32(0, "unused");
133  outMsg.writeInt8(0, "unused");
134  outMsg.writeBeingId(id, "object id");
135  }
136  else if (packetVersion >= 20050719)
137  {
138  outMsg.writeInt32(0, "unused");
139  outMsg.writeInt16(0, "unused");
140  outMsg.writeInt8(0, "unused");
141  outMsg.writeBeingId(id, "object id");
142  }
143  else if (packetVersion >= 20050718)
144  {
145  outMsg.writeInt8(0, "unused");
146  outMsg.writeBeingId(id, "object id");
147  }
148  else if (packetVersion >= 20050628)
149  {
150  outMsg.writeInt32(0, "unused");
151  outMsg.writeInt8(0, "unused");
152  outMsg.writeBeingId(id, "object id");
153  }
154  else if (packetVersion >= 20050509)
155  {
156  outMsg.writeInt16(0, "unused");
157  outMsg.writeBeingId(id, "object id");
158  }
159  else if (packetVersion >= 20050110)
160  {
161  outMsg.writeInt16(0, "unused");
162  outMsg.writeInt8(0, "unused");
163  outMsg.writeBeingId(id, "object id");
164  }
165  else if (packetVersion >= 20041129)
166  {
167  outMsg.writeInt8(0, "unused");
168  outMsg.writeBeingId(id, "object id");
169  }
170  else if (packetVersion >= 20041025)
171  {
172  outMsg.writeInt16(0, "unused");
173  outMsg.writeInt8(0, "unused");
174  outMsg.writeBeingId(id, "object id");
175  }
176  else if (packetVersion >= 20041005)
177  {
178  outMsg.writeInt32(0, "unused");
179  outMsg.writeBeingId(id, "object id");
180  }
181  else if (packetVersion >= 20040920)
182  {
183  outMsg.writeInt32(0, "unused");
184  outMsg.writeInt32(0, "unused");
185  outMsg.writeBeingId(id, "object id");
186  }
187  else if (packetVersion >= 20040906)
188  {
189  outMsg.writeInt32(0, "unused");
190  outMsg.writeInt8(0, "unused");
191  outMsg.writeBeingId(id, "object id");
192  }
193  else if (packetVersion >= 20040809)
194  {
195  outMsg.writeInt32(0, "unused");
196  outMsg.writeInt16(0, "unused");
197  outMsg.writeInt8(0, "unused");
198  outMsg.writeBeingId(id, "object id");
199  }
200  else if (packetVersion >= 20040713)
201  {
202  outMsg.writeInt32(0, "unused");
203  outMsg.writeBeingId(id, "object id");
204  }
205  else
206  {
207  outMsg.writeBeingId(id, "object id");
208  }
209 
211 }
212 
213 void PlayerHandler::setDirection(const unsigned char direction) const
214 {
216  if (packetVersion >= 20101124)
217  {
218  outMsg.writeInt8(0, "head direction");
219  outMsg.writeInt8(0, "unused");
220  outMsg.writeInt8(MessageOut::toServerDirection(direction),
221  "player direction");
222  }
223  else if (packetVersion >= 20080827)
224  {
225  outMsg.writeInt16(0, "unused");
226  outMsg.writeInt8(0, "head direction");
227  outMsg.writeInt32(0, "unused");
228  outMsg.writeInt8(MessageOut::toServerDirection(direction),
229  "player direction");
230  }
231  else if (packetVersion >= 20070212)
232  {
233  outMsg.writeInt32(0, "unused");
234  outMsg.writeInt16(0, "unused");
235  outMsg.writeInt8(0, "head direction");
236  outMsg.writeInt16(0, "unused");
237  outMsg.writeInt8(MessageOut::toServerDirection(direction),
238  "player direction");
239  }
240  else if (packetVersion >= 20070108)
241  {
242  outMsg.writeInt32(0, "unused");
243  outMsg.writeInt32(0, "unused");
244  outMsg.writeInt8(0, "head direction");
245  outMsg.writeInt16(0, "unused");
246  outMsg.writeInt8(MessageOut::toServerDirection(direction),
247  "player direction");
248  }
249  else if (packetVersion >= 20060327)
250  {
251  outMsg.writeInt32(0, "unused");
252  outMsg.writeInt8(0, "unused");
253  outMsg.writeInt8(0, "head direction");
254  outMsg.writeInt8(0, "unused");
255  outMsg.writeInt16(0, "unused");
256  outMsg.writeInt8(MessageOut::toServerDirection(direction),
257  "player direction");
258  }
259  else if (packetVersion >= 20050719)
260  {
261  outMsg.writeInt32(0, "unused");
262  outMsg.writeInt16(0, "unused");
263  outMsg.writeInt8(0, "head direction");
264  outMsg.writeInt8(0, "unused");
265  outMsg.writeInt32(0, "unused");
266  outMsg.writeInt16(0, "unused");
267  outMsg.writeInt8(MessageOut::toServerDirection(direction),
268  "player direction");
269  }
270  else if (packetVersion >= 20050718)
271  {
272  outMsg.writeInt32(0, "unused");
273  outMsg.writeInt8(0, "head direction");
274  outMsg.writeInt8(0, "unused");
275  outMsg.writeInt16(0, "unused");
276  outMsg.writeInt8(MessageOut::toServerDirection(direction),
277  "player direction");
278  }
279  else if (packetVersion >= 20050628)
280  {
281  outMsg.writeInt32(0, "unused");
282  outMsg.writeInt16(0, "unused");
283  outMsg.writeInt8(0, "head direction");
284  outMsg.writeInt8(0, "unused");
285  outMsg.writeInt32(0, "unused");
286  outMsg.writeInt16(0, "unused");
287  outMsg.writeInt8(MessageOut::toServerDirection(direction),
288  "player direction");
289  }
290  else if (packetVersion >= 20050509)
291  {
292  outMsg.writeInt8(0, "unused");
293  outMsg.writeInt32(0, "unused");
294  outMsg.writeInt16(0, "unused");
295  outMsg.writeInt8(0, "head direction");
296  outMsg.writeInt8(0, "unused");
297  outMsg.writeInt16(0, "unused");
298  outMsg.writeInt8(MessageOut::toServerDirection(direction),
299  "player direction");
300  }
301  else if (packetVersion >= 20050110)
302  {
303  outMsg.writeInt32(0, "unused");
304  outMsg.writeInt32(0, "unused");
305  outMsg.writeInt16(0, "unused");
306  outMsg.writeInt8(0, "head direction");
307  outMsg.writeInt8(0, "unused");
308  outMsg.writeInt32(0, "unused");
309  outMsg.writeInt32(0, "unused");
310  outMsg.writeInt8(MessageOut::toServerDirection(direction),
311  "player direction");
312  }
313  else if (packetVersion >= 20041129)
314  {
315  outMsg.writeInt8(0, "unused");
316  outMsg.writeInt8(0, "head direction");
317  outMsg.writeInt8(0, "unused");
318  outMsg.writeInt16(0, "unused");
319  outMsg.writeInt8(MessageOut::toServerDirection(direction),
320  "player direction");
321  }
322  else if (packetVersion >= 20041025)
323  {
324  outMsg.writeInt32(0, "unused");
325  outMsg.writeInt8(0, "head direction");
326  outMsg.writeInt8(0, "unused");
327  outMsg.writeInt32(0, "unused");
328  outMsg.writeInt16(0, "unused");
329  outMsg.writeInt8(MessageOut::toServerDirection(direction),
330  "player direction");
331  }
332  else if (packetVersion >= 20041005)
333  {
334  outMsg.writeInt16(0, "unused");
335  outMsg.writeInt8(0, "unused");
336  outMsg.writeInt8(0, "head direction");
337  outMsg.writeInt32(0, "unused");
338  outMsg.writeInt16(0, "unused");
339  outMsg.writeInt8(MessageOut::toServerDirection(direction),
340  "player direction");
341  }
342  else if (packetVersion >= 20040920)
343  {
344  outMsg.writeInt32(0, "unused");
345  outMsg.writeInt16(0, "unused");
346  outMsg.writeInt8(0, "head direction");
347  outMsg.writeInt32(0, "unused");
348  outMsg.writeInt32(0, "unused");
349  outMsg.writeInt8(MessageOut::toServerDirection(direction),
350  "player direction");
351  }
352  else if (packetVersion >= 20040906)
353  {
354  outMsg.writeInt16(0, "unused");
355  outMsg.writeInt8(0, "head direction");
356  outMsg.writeInt16(0, "unused");
357  outMsg.writeInt16(0, "unused");
358  outMsg.writeInt8(MessageOut::toServerDirection(direction),
359  "player direction");
360  }
361  else if (packetVersion >= 20040809)
362  {
363  outMsg.writeInt16(0, "unused");
364  outMsg.writeInt16(0, "unused");
365  outMsg.writeInt8(0, "unused");
366  outMsg.writeInt8(0, "head direction");
367  outMsg.writeInt16(0, "unused");
368  outMsg.writeInt8(0, "unused");
369  outMsg.writeInt8(MessageOut::toServerDirection(direction),
370  "player direction");
371  }
372  else if (packetVersion >= 20040713)
373  {
374  outMsg.writeInt8(0, "unused");
375  outMsg.writeInt8(0, "unused");
376  outMsg.writeInt8(0, "unused");
377  outMsg.writeInt8(0, "head direction");
378  outMsg.writeInt16(0, "unused");
379  outMsg.writeInt16(0, "unused");
380  outMsg.writeInt16(0, "unused");
381  outMsg.writeInt8(MessageOut::toServerDirection(direction),
382  "player direction");
383  }
384  else
385  {
386  outMsg.writeInt8(0, "head direction");
387  outMsg.writeInt8(0, "unused");
388  outMsg.writeInt8(MessageOut::toServerDirection(direction),
389  "player direction");
390  }
391 }
392 
393 void PlayerHandler::setDestination(const int x, const int y,
394  const int direction) const
395 {
397  if (packetVersion >= 20080827 && packetVersion < 20101124)
398  outMsg.writeInt32(0, "unused");
399  outMsg.writeCoordinates(CAST_U16(x),
400  CAST_U16(y),
401  CAST_U8(direction), "destination");
402 }
403 
404 void PlayerHandler::changeAction(const BeingActionT &action) const
405 {
406  unsigned char type;
407  switch (action)
408  {
409  case BeingAction::SIT:
410  type = 2;
411  break;
412  case BeingAction::STAND:
414  type = 3;
415  break;
416  default:
417  case BeingAction::MOVE:
418  case BeingAction::ATTACK:
419  case BeingAction::DEAD:
420  case BeingAction::HURT:
421  case BeingAction::SPAWN:
422  case BeingAction::CAST:
423  return;
424  }
425 
427  outMsg.writeInt32(0, "unused");
428  outMsg.writeInt8(type, "action");
429 }
430 
432 {
434  outMsg.writeInt8(0, "action");
435 }
436 
438 {
440 }
441 
442 void PlayerHandler::updateStatus(const uint8_t status) const
443 {
445  outMsg.writeInt8(status, "status");
446  outMsg.writeInt8(0, "unused");
447 }
448 
449 void PlayerHandler::setShortcut(const int idx,
450  const uint8_t type,
451  const int id,
452  const int level) const
453 {
455  outMsg.writeInt16(CAST_S16(idx), "index");
456  outMsg.writeInt8(CAST_S8(type), "type");
457  outMsg.writeInt32(id, "id");
458  outMsg.writeInt16(CAST_S16(level), "level");
459 }
460 
461 void PlayerHandler::shortcutShiftRow(const int row) const
462 {
463  if (packetVersion < 20140129)
464  return;
466  outMsg.writeInt8(CAST_S8(row), "row");
467 }
468 
470 {
472 }
473 
474 void PlayerHandler::changeCart(const int type) const
475 {
477  outMsg.writeInt16(CAST_S16(type), "type");
478 }
479 
481 {
483 }
484 
486 {
488 }
489 
491 {
493 }
494 
496 {
498  outMsg.writeInt32(0, "char id");
499  outMsg.writeInt32(0, "account id");
500 }
501 
503 {
505 }
506 
508  const int data) const
509 {
511  outMsg.writeInt32(id, "config option");
512  outMsg.writeInt32(data, "config data");
513 }
514 
515 #define setStatComplex(stat) \
516  PlayerInfo::setStatBase(stat, CAST_S32(base), notify); \
517  if (mod != NoStat) \
518  PlayerInfo::setStatMod(stat, mod, Notify_true)
519 
521  const int type,
522  const int64_t base,
523  const int mod,
524  const Notify notify) const
525 {
526  switch (type)
527  {
528  case Sp::SPEED:
531  CAST_S32(base),
532  Notify_true);
534  0,
535  Notify_true);
536  break;
537  case Sp::BASEEXP:
539  base,
540  Notify_true);
541  break;
542  case Sp::JOBEXP:
544  base,
545  Notify_true);
546  break;
547  case Sp::KARMA:
549  CAST_S32(base),
550  Notify_true);
552  0,
553  Notify_true);
554  break;
555  case Sp::MANNER:
557  CAST_S32(base),
558  Notify_true);
560  0,
561  Notify_true);
562  break;
563  case Sp::HP:
565  base,
566  Notify_true);
567  if (localPlayer->isInParty() && (Party::getParty(1) != nullptr))
568  {
569  PartyMember *const m = Party::getParty(1)
571  if (m != nullptr)
572  {
573  m->setHp(CAST_S32(base));
576  }
577  }
578  break;
579  case Sp::MAXHP:
581  base,
582  Notify_true);
583 
584  if (localPlayer->isInParty() && (Party::getParty(1) != nullptr))
585  {
586  PartyMember *const m = Party::getParty(1)->getMember(
587  localPlayer->getId());
588  if (m != nullptr)
589  {
591  m->setMaxHp(CAST_S32(base));
592  }
593  }
594  break;
595  case Sp::SP:
597  base,
598  Notify_true);
599  break;
600  case Sp::MAXSP:
602  base,
603  Notify_true);
604  break;
605  case Sp::STATUSPOINT:
607  base,
608  Notify_true);
609  break;
610  case Sp::BASELEVEL:
612  base,
613  Notify_true);
614  if (localPlayer != nullptr)
615  {
616  localPlayer->setLevel(CAST_S32(base));
618  }
619  break;
620  case Sp::SKILLPOINT:
622  base,
623  Notify_true);
624  if (skillDialog != nullptr)
625  skillDialog->update();
626  break;
627  case Sp::STR:
629  break;
630  case Sp::AGI:
632  break;
633  case Sp::VIT:
635  break;
636  case Sp::INT:
638  break;
639  case Sp::DEX:
641  break;
642  case Sp::LUK:
644  break;
645  case Sp::ZENY:
646  {
647  const int oldMoney = PlayerInfo::getAttribute(Attributes::MONEY);
648  const int newMoney = CAST_S32(base);
649  if (newMoney > oldMoney)
650  {
652  UnitsDb::formatCurrency(newMoney - oldMoney));
653  }
654  else if (newMoney < oldMoney)
655  {
657  UnitsDb::formatCurrency(oldMoney - newMoney).c_str());
658  }
659 
661  newMoney,
662  Notify_true);
663  break;
664  }
665  case Sp::NEXTBASEEXP:
667  base,
668  Notify_true);
669  break;
670  case Sp::NEXTJOBEXP:
672  base,
673  Notify_true);
674  break;
675  case Sp::WEIGHT:
677  base,
678  Notify_true);
679  break;
680  case Sp::MAXWEIGHT:
682  base,
683  Notify_true);
684  break;
685  case Sp::USTR:
687  CAST_S32(base));
688  break;
689  case Sp::UAGI:
691  CAST_S32(base));
692  break;
693  case Sp::UVIT:
695  CAST_S32(base));
696  break;
697  case Sp::UINT:
699  CAST_S32(base));
700  break;
701  case Sp::UDEX:
703  CAST_S32(base));
704  break;
705  case Sp::ULUK:
707  CAST_S32(base));
708  break;
709 
710  case Sp::ATK1:
712  CAST_S32(base),
713  Notify_true);
715  break;
716  case Sp::ATK2:
718  CAST_S32(base),
719  Notify_true);
721  break;
722  case Sp::MATK1:
724  CAST_S32(base),
725  Notify_true);
726  break;
727  case Sp::MATK2:
729  CAST_S32(base),
730  Notify_true);
731  break;
732  case Sp::DEF1:
734  CAST_S32(base),
735  Notify_true);
736  break;
737  case Sp::DEF2:
739  CAST_S32(base),
740  Notify_true);
741  break;
742  case Sp::MDEF1:
744  CAST_S32(base),
745  Notify_true);
746  break;
747  case Sp::MDEF2:
749  CAST_S32(base),
750  Notify_true);
751  break;
752  case Sp::HIT:
754  CAST_S32(base),
755  Notify_true);
756  break;
757  case Sp::FLEE1:
759  CAST_S32(base),
760  Notify_true);
761  break;
762  case Sp::FLEE2:
764  CAST_S32(base),
765  Notify_true);
766  break;
767  case Sp::CRITICAL:
769  CAST_S32(base),
770  Notify_true);
771  break;
772  case Sp::ASPD:
775  CAST_S32(base),
776  Notify_true);
778  0,
779  Notify_true);
781  break;
782  case Sp::JOBLEVEL:
784  base,
785  Notify_true);
786  break;
787 
788  default:
790  break;
791  }
792 }
793 
794 void PlayerHandler::selectStyle(const int headColor,
795  const int headStyle,
796  const int bodyColor,
797  const int topStyle,
798  const int middleStyle,
799  const int bottomStyle,
800  const int bodyStyle) const
801 {
802  if (packetVersion < 20151104)
803  return;
805  outMsg.writeInt16(CAST_S16(headColor), "head color");
806  outMsg.writeInt16(CAST_S16(headStyle), "head style");
807  outMsg.writeInt16(CAST_S16(bodyColor), "body color");
808  outMsg.writeInt16(CAST_S16(topStyle), "top style");
809  outMsg.writeInt16(CAST_S16(middleStyle), "middle style");
810  outMsg.writeInt16(CAST_S16(bottomStyle), "bottom style");
811  if (packetVersionRe >= 20180718)
812  outMsg.writeInt16(CAST_S16(bodyStyle), "body style");
813 }
814 
815 #undef setStatComplex
816 
817 } // namespace EAthena
int CMSG_SKILL_LEVELUP_REQUEST
Definition: protocolout.cpp:82
Net::PlayerHandler * playerHandler
Definition: net.cpp:92
Definition: sp.h:48
void setAttackSpeed(const int speed)
Definition: being.h:463
void setDestination(const int x, const int y, const int direction) const
void emote(const uint8_t emoteId) const
Definition: sp.h:73
int CMSG_CHANGE_CART
static void pushPickup(const BeingId floorId)
void setStatMod(const AttributesT id, const int value, const Notify notify)
Definition: playerinfo.cpp:157
BeingAction ::T BeingActionT
Definition: beingaction.h:40
#define CAST_U8
Definition: cast.h:26
Definition: sp.h:66
int CMSG_SET_STATUS
static unsigned char toServerDirection(unsigned char direction) A_CONST
Definition: messageout.cpp:241
void setStatBase(const AttributesT id, const int value, const Notify notify)
Definition: playerinfo.cpp:141
int CMSG_ONLINE_LIST
int CMSG_PLAYER_CHANGE_DEST
const bool Keep_true
Definition: keep.h:29
void changeAction(const BeingActionT &action) const
BeingId getId() const
Definition: actorsprite.h:63
Definition: sp.h:45
void increaseAttribute(const AttributesT attr, const int amount) const
Definition: sp.h:72
int BeingId
Definition: beingid.h:29
Definition: sp.h:81
std::string formatCurrency(const int value)
Definition: unitsdb.cpp:323
int CMSG_PLAYER_RESTART
Definition: sp.h:62
int packetVersion
Definition: client.cpp:124
int CMSG_PLAYER_AUTO_REVIVE
Definition: sp.h:46
StatusWindow * statusWindow
bool msg(InputEvent &event)
Definition: chat.cpp:38
void notify(const unsigned int message)
int CMSG_DORI_DORI
int CMSG_EXPLOSION_SPIRITS
void setWalkSpeed(const int speed)
Definition: being.h:451
void updateAttrs()
Definition: playerinfo.cpp:417
Definition: sp.h:30
Definition: sp.h:77
int CMSG_SET_CONFIG_OPTION
Definition: protocolout.cpp:96
Definition: sp.h:33
void setDirection(const unsigned char direction) const
int CMSG_PLAYER_SELECT_STYLE
void attack(const BeingId id, const Keep keep) const
void requestOnlineList() const
int serverVersion
Definition: client.cpp:123
Definition: sp.h:67
Definition: sp.h:31
#define CAST_U16
Definition: cast.h:28
Definition: sp.h:32
Definition: sp.h:43
#define CAST_S32
Definition: cast.h:29
int CMSG_PLAYER_CHANGE_DIR
Definition: protocolout.cpp:99
Definition: sp.h:78
std::string update(const int id)
Definition: sp.h:54
void changeCart(const int type) const
void setHp(const int hp)
Definition: avatar.h:92
uint32_t data
static Party * getParty(const int16_t id)
Definition: party.cpp:312
#define setStatComplex(stat)
LocalPlayer * localPlayer
void setAttribute(const AttributesT id, const int64_t value, const Notify notify)
Definition: playerinfo.cpp:108
Definition: sp.h:80
Definition: sp.h:35
PartyMember * getMember(const BeingId id) const
Definition: party.cpp:98
void explosionSpirits() const
void increaseSkill(const uint16_t skillId) const
Definition: sp.h:64
#define CAST_S8
Definition: cast.h:25
Definition: sp.h:50
int CMSG_REMOVE_OPTION
bool isInParty() const
Definition: being.h:320
Definition: sp.h:71
int CMSG_STAT_UPDATE_REQUEST
Definition: protocolout.cpp:83
#define createOutPacket(name)
Definition: messageout.h:36
Definition: sp.h:65
Definition: sp.h:37
int CMSG_PVP_INFO
void setConfigOption(const int id, const int data) const
Definition: sp.h:63
void updateName()
Definition: being.cpp:3425
SkillDialog * skillDialog
Definition: skilldialog.cpp:65
int CMSG_PLAYER_SET_MEMO
Definition: sp.h:38
void shortcutShiftRow(const int row) const
void updateStatus(const uint8_t status) const
Definition: sp.h:36
int packetVersionRe
Definition: client.cpp:126
void pickUp(const FloorItem *const floorItem) const
void setShortcut(const int idx, const uint8_t type, const int id, const int level) const
int CMSG_PLAYER_CHANGE_ACT
Attributes ::T AttributesT
Definition: attributes.h:117
Definition: sp.h:83
Definition: sp.h:34
int CMSG_SHORTCUTS_ROW_SHIFT
int CMSG_SET_SHORTCUTS
#define CAST_S16
Definition: cast.h:27
int CMSG_ITEM_PICKUP
Definition: protocolout.cpp:98
void selectStyle(const int headColor, const int headStyle, const int bodyColor, const int topStyle, const int middleStyle, const int bottomStyle, const int bodyStyle) const
void setMaxHp(const int maxHp)
Definition: avatar.h:98
Definition: sp.h:76
int32_t getAttribute(const AttributesT id)
Definition: playerinfo.cpp:100
Definition: sp.h:47
int CMSG_PLAYER_STOP_ATTACK
Definition: sp.h:44
Definition: sp.h:79
const bool Notify_true
Definition: notify.h:29
Definition: sp.h:74
#define UNIMPLEMENTEDPACKETFIELD(field)
Definition: logger.h:58
void setLevel(const int n)
Definition: being.h:600
void setStat(Net::MessageIn &msg, const int type, const int64_t base, const int mod, const Notify notify) const
Definition: sp.h:75
void setPointsNeeded(const AttributesT id, const int needed)
int CMSG_PLAYER_EMOTE