]> git.lizzy.rs Git - dragonfireclient.git/blob - src/genericobject.cpp
Send only changed node metadata to clients instead of whole mapblock (#5268)
[dragonfireclient.git] / src / genericobject.cpp
1 /*
2 Minetest
3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include "genericobject.h"
21 #include <sstream>
22 #include "util/serialize.h"
23
24 std::string gob_cmd_set_properties(const ObjectProperties &prop)
25 {
26         std::ostringstream os(std::ios::binary);
27         writeU8(os, GENERIC_CMD_SET_PROPERTIES);
28         prop.serialize(os);
29         return os.str();
30 }
31
32 ObjectProperties gob_read_set_properties(std::istream &is)
33 {
34         ObjectProperties prop;
35         prop.deSerialize(is);
36         return prop;
37 }
38
39 std::string gob_cmd_update_position(
40         v3f position,
41         v3f velocity,
42         v3f acceleration,
43         v3f rotation,
44         bool do_interpolate,
45         bool is_movement_end,
46         f32 update_interval
47 ){
48         std::ostringstream os(std::ios::binary);
49         // command
50         writeU8(os, GENERIC_CMD_UPDATE_POSITION);
51         // pos
52         writeV3F1000(os, position);
53         // velocity
54         writeV3F1000(os, velocity);
55         // acceleration
56         writeV3F1000(os, acceleration);
57         // rotation
58         writeV3F1000(os, rotation);
59         // do_interpolate
60         writeU8(os, do_interpolate);
61         // is_end_position (for interpolation)
62         writeU8(os, is_movement_end);
63         // update_interval (for interpolation)
64         writeF1000(os, update_interval);
65         return os.str();
66 }
67
68 std::string gob_cmd_set_texture_mod(const std::string &mod)
69 {
70         std::ostringstream os(std::ios::binary);
71         // command
72         writeU8(os, GENERIC_CMD_SET_TEXTURE_MOD);
73         // parameters
74         os<<serializeString(mod);
75         return os.str();
76 }
77
78 std::string gob_cmd_set_sprite(
79         v2s16 p,
80         u16 num_frames,
81         f32 framelength,
82         bool select_horiz_by_yawpitch
83 ){
84         std::ostringstream os(std::ios::binary);
85         // command
86         writeU8(os, GENERIC_CMD_SET_SPRITE);
87         // parameters
88         writeV2S16(os, p);
89         writeU16(os, num_frames);
90         writeF1000(os, framelength);
91         writeU8(os, select_horiz_by_yawpitch);
92         return os.str();
93 }
94
95 std::string gob_cmd_punched(s16 damage, s16 result_hp)
96 {
97         std::ostringstream os(std::ios::binary);
98         // command
99         writeU8(os, GENERIC_CMD_PUNCHED);
100         // damage
101         writeS16(os, damage);
102         // result_hp
103         writeS16(os, result_hp);
104         return os.str();
105 }
106
107 std::string gob_cmd_update_armor_groups(const ItemGroupList &armor_groups)
108 {
109         std::ostringstream os(std::ios::binary);
110         writeU8(os, GENERIC_CMD_UPDATE_ARMOR_GROUPS);
111         writeU16(os, armor_groups.size());
112         for (const auto &armor_group : armor_groups) {
113                 os<<serializeString(armor_group.first);
114                 writeS16(os, armor_group.second);
115         }
116         return os.str();
117 }
118
119 std::string gob_cmd_update_physics_override(float physics_override_speed, float physics_override_jump,
120                 float physics_override_gravity, bool sneak, bool sneak_glitch, bool new_move)
121 {
122         std::ostringstream os(std::ios::binary);
123         // command
124         writeU8(os, GENERIC_CMD_SET_PHYSICS_OVERRIDE);
125         // parameters
126         writeF1000(os, physics_override_speed);
127         writeF1000(os, physics_override_jump);
128         writeF1000(os, physics_override_gravity);
129         // these are sent inverted so we get true when the server sends nothing
130         writeU8(os, !sneak);
131         writeU8(os, !sneak_glitch);
132         writeU8(os, !new_move);
133         return os.str();
134 }
135
136 std::string gob_cmd_update_animation(v2f frames, float frame_speed, float frame_blend, bool frame_loop)
137 {
138         std::ostringstream os(std::ios::binary);
139         // command
140         writeU8(os, GENERIC_CMD_SET_ANIMATION);
141         // parameters
142         writeV2F1000(os, frames);
143         writeF1000(os, frame_speed);
144         writeF1000(os, frame_blend);
145         // these are sent inverted so we get true when the server sends nothing
146         writeU8(os, !frame_loop);
147         return os.str();
148 }
149
150 std::string gob_cmd_update_animation_speed(float frame_speed)
151 {
152         std::ostringstream os(std::ios::binary);
153         // command
154         writeU8(os, GENERIC_CMD_SET_ANIMATION_SPEED);
155         // parameters
156         writeF1000(os, frame_speed);
157         return os.str();
158 }
159
160 std::string gob_cmd_update_bone_position(const std::string &bone, v3f position,
161                 v3f rotation)
162 {
163         std::ostringstream os(std::ios::binary);
164         // command
165         writeU8(os, GENERIC_CMD_SET_BONE_POSITION);
166         // parameters
167         os<<serializeString(bone);
168         writeV3F1000(os, position);
169         writeV3F1000(os, rotation);
170         return os.str();
171 }
172
173 std::string gob_cmd_update_attachment(int parent_id, const std::string &bone,
174                 v3f position, v3f rotation)
175 {
176         std::ostringstream os(std::ios::binary);
177         // command
178         writeU8(os, GENERIC_CMD_ATTACH_TO);
179         // parameters
180         writeS16(os, parent_id);
181         os<<serializeString(bone);
182         writeV3F1000(os, position);
183         writeV3F1000(os, rotation);
184         return os.str();
185 }
186
187 std::string gob_cmd_update_nametag_attributes(video::SColor color)
188 {
189         std::ostringstream os(std::ios::binary);
190         // command
191         writeU8(os, GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES);
192         // parameters
193         writeU8(os, 1); // version for forward compatibility
194         writeARGB8(os, color);
195         return os.str();
196 }
197
198 std::string gob_cmd_update_infant(u16 id, u8 type,
199                 const std::string &client_initialization_data)
200 {
201         std::ostringstream os(std::ios::binary);
202         // command
203         writeU8(os, GENERIC_CMD_SPAWN_INFANT);
204         // parameters
205         writeU16(os, id);
206         writeU8(os, type);
207         os<<serializeLongString(client_initialization_data);
208         return os.str();
209 }