1 /*
2 * The ManaPlus Client
3 * Copyright (C) 2013-2019 The ManaPlus Developers
4 * Copyright (C) 2019-2021 Andrei Karas
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/pethandler.h"
23
24 #include "being/playerinfo.h"
25
26 #include "net/serverfeatures.h"
27
28 #include "net/eathena/messageout.h"
29 #include "net/eathena/protocolout.h"
30
31 #include "resources/item/item.h"
32
33 #include "debug.h"
34
35 extern int packetVersion;
36
37 namespace EAthena
38 {
39
PetHandler()40 PetHandler::PetHandler()
41 {
42 petHandler = this;
43 }
44
~PetHandler()45 PetHandler::~PetHandler()
46 {
47 petHandler = nullptr;
48 }
49
move(const int x,const int y) const50 void PetHandler::move(const int x,
51 const int y) const
52 {
53 if (!serverFeatures->haveMovePet())
54 return;
55 createOutPacket(CMSG_PET_MOVE_TO);
56 outMsg.writeInt32(0, "pet id");
57 outMsg.writeInt16(CAST_S16(x), "x");
58 outMsg.writeInt16(CAST_S16(y), "y");
59 }
60
emote(const uint8_t emoteId)61 void PetHandler::emote(const uint8_t emoteId)
62 {
63 createOutPacket(CMSG_PET_EMOTE);
64 outMsg.writeInt8(emoteId, "emote id");
65 }
66
catchPet(const Being * const being) const67 void PetHandler::catchPet(const Being *const being) const
68 {
69 if (being == nullptr)
70 return;
71
72 createOutPacket(CMSG_PET_CATCH);
73 outMsg.writeBeingId(being->getId(), "monster id");
74 }
75
sendPetMessage(const int data) const76 void PetHandler::sendPetMessage(const int data) const
77 {
78 createOutPacket(CMSG_PET_SEND_MESSAGE);
79 outMsg.writeInt32(data, "param");
80 }
81
setName(const std::string & name) const82 void PetHandler::setName(const std::string &name) const
83 {
84 createOutPacket(CMSG_PET_SET_NAME);
85 outMsg.writeString(name, 24, "name");
86 }
87
requestStatus() const88 void PetHandler::requestStatus() const
89 {
90 createOutPacket(CMSG_PET_MENU_ACTION);
91 outMsg.writeInt8(0, "action");
92 }
93
feed() const94 void PetHandler::feed() const
95 {
96 createOutPacket(CMSG_PET_MENU_ACTION);
97 outMsg.writeInt8(1, "action");
98 }
99
dropLoot() const100 void PetHandler::dropLoot() const
101 {
102 createOutPacket(CMSG_PET_MENU_ACTION);
103 outMsg.writeInt8(2, "action"); // performance
104 }
105
returnToEgg() const106 void PetHandler::returnToEgg() const
107 {
108 createOutPacket(CMSG_PET_MENU_ACTION);
109 outMsg.writeInt8(3, "action");
110 PlayerInfo::setPet(nullptr);
111 }
112
unequip() const113 void PetHandler::unequip() const
114 {
115 createOutPacket(CMSG_PET_MENU_ACTION);
116 outMsg.writeInt8(4, "action");
117 }
118
setDirection(const unsigned char type) const119 void PetHandler::setDirection(const unsigned char type) const
120 {
121 if (!serverFeatures->haveMovePet())
122 return;
123 createOutPacket(CMSG_PET_DIRECTION);
124 outMsg.writeInt32(0, "pet id");
125 outMsg.writeInt8(0, "head direction");
126 outMsg.writeInt8(0, "unused");
127 outMsg.writeInt8(MessageOut::toServerDirection(type),
128 "pet direction");
129 }
130
evolution(const Item * const item) const131 void PetHandler::evolution(const Item *const item) const
132 {
133 if (packetVersion < 20140122 ||
134 item == nullptr)
135 {
136 return;
137 }
138 createOutPacket(CMSG_PET_EVOLUTION);
139 outMsg.writeItemId(item->getId(), "egg id");
140 }
141
142 } // namespace EAthena
143