aboutsummaryrefslogtreecommitdiff
path: root/src/genericobject.h
blob: b92570831475025bb973fded7dc216ff05182a71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
Minetest
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#ifndef GENERICOBJECT_HEADER
#define GENERICOBJECT_HEADER

#include <string>
#include "irrlichttypes_bloated.h"
#include <iostream>

enum GenericCMD {
	GENERIC_CMD_SET_PROPERTIES,
	GENERIC_CMD_UPDATE_POSITION,
	GENERIC_CMD_SET_TEXTURE_MOD,
	GENERIC_CMD_SET_SPRITE,
	GENERIC_CMD_PUNCHED,
	GENERIC_CMD_UPDATE_ARMOR_GROUPS,
	GENERIC_CMD_SET_ANIMATION,
	GENERIC_CMD_SET_BONE_POSITION,
	GENERIC_CMD_ATTACH_TO,
	GENERIC_CMD_SET_PHYSICS_OVERRIDE,
	GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES
};

#include "object_properties.h"
std::string gob_cmd_set_properties(const ObjectProperties &prop);
ObjectProperties gob_read_set_properties(std::istream &is);

std::string gob_cmd_update_position(
	v3f position,
	v3f velocity,
	v3f acceleration,
	f32 yaw,
	bool do_interpolate,
	bool is_movement_end,
	f32 update_interval
);

std::string gob_cmd_set_texture_mod(const std::string &mod);

std::string gob_cmd_set_sprite(
	v2s16 p,
	u16 num_frames,
	f32 framelength,
	bool select_horiz_by_yawpitch
);

std::string gob_cmd_punched(s16 damage, s16 result_hp);

#include "itemgroup.h"
std::string gob_cmd_update_armor_groups(const ItemGroupList &armor_groups);

std::string gob_cmd_update_physics_override(float physics_override_speed,
		float physics_override_jump, float physics_override_gravity, bool sneak, bool sneak_glitch);

std::string gob_cmd_update_animation(v2f frames, float frame_speed, float frame_blend, bool frame_loop);

std::string gob_cmd_update_bone_position(std::string bone, v3f position, v3f rotation);

std::string gob_cmd_update_attachment(int parent_id, std::string bone, v3f position, v3f rotation);

std::string gob_cmd_update_nametag_attributes(video::SColor color);

#endif

pan class="hl com">GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include <fstream> #include <iostream> #include <sstream> #include <algorithm> #include "version.h" #include "settings.h" #include "serverlist.h" #include "filesys.h" #include "porting.h" #include "log.h" #include "network/networkprotocol.h" #include <json/json.h> #include "convert_json.h" #include "httpfetch.h" #include "util/string.h" namespace ServerList { std::string getFilePath() { std::string serverlist_file = g_settings->get("serverlist_file"); std::string dir_path = "client" DIR_DELIM "serverlist" DIR_DELIM; fs::CreateDir(porting::path_user + DIR_DELIM "client"); fs::CreateDir(porting::path_user + DIR_DELIM + dir_path); return porting::path_user + DIR_DELIM + dir_path + serverlist_file; } std::vector<ServerListSpec> getLocal() { std::string path = ServerList::getFilePath(); std::string liststring; if (fs::PathExists(path)) { std::ifstream istream(path.c_str()); if (istream.is_open()) { std::ostringstream ostream; ostream << istream.rdbuf(); liststring = ostream.str(); istream.close(); } } return deSerialize(liststring); } std::vector<ServerListSpec> getOnline() { std::ostringstream geturl; u16 proto_version_min = g_settings->getFlag("send_pre_v25_init") ? CLIENT_PROTOCOL_VERSION_MIN_LEGACY : CLIENT_PROTOCOL_VERSION_MIN; geturl << g_settings->get("serverlist_url") << "/list?proto_version_min=" << proto_version_min << "&proto_version_max=" << CLIENT_PROTOCOL_VERSION_MAX; Json::Value root = fetchJsonValue(geturl.str(), NULL); std::vector<ServerListSpec> server_list; if (!root.isObject()) { return server_list; } root = root["list"]; if (!root.isArray()) { return server_list; } for (unsigned int i = 0; i < root.size(); i++) { if (root[i].isObject()) { server_list.push_back(root[i]); } } return server_list; } // Delete a server from the local favorites list bool deleteEntry(const ServerListSpec &server) { std::vector<ServerListSpec> serverlist = ServerList::getLocal(); for (std::vector<ServerListSpec>::iterator it = serverlist.begin(); it != serverlist.end();) { if ((*it)["address"] == server["address"] && (*it)["port"] == server["port"]) { it = serverlist.erase(it); } else { ++it; } } std::string path = ServerList::getFilePath(); std::ostringstream ss(std::ios_base::binary); ss << ServerList::serialize(serverlist); if (!fs::safeWriteToFile(path, ss.str())) return false; return true; } // Insert a server to the local favorites list bool insert(const ServerListSpec &server) { // Remove duplicates ServerList::deleteEntry(server); std::vector<ServerListSpec> serverlist = ServerList::getLocal(); // Insert new server at the top of the list serverlist.insert(serverlist.begin(), server); std::string path = ServerList::getFilePath(); std::ostringstream ss(std::ios_base::binary); ss << ServerList::serialize(serverlist); if (!fs::safeWriteToFile(path, ss.str())) return false; return true; } std::vector<ServerListSpec> deSerialize(const std::string &liststring) { std::vector<ServerListSpec> serverlist; std::istringstream stream(liststring); std::string line, tmp; while (std::getline(stream, line)) { std::transform(line.begin(), line.end(), line.begin(), ::toupper); if (line == "[SERVER]") { ServerListSpec server; std::getline(stream, tmp); server["name"] = tmp; std::getline(stream, tmp); server["address"] = tmp; std::getline(stream, tmp); server["port"] = tmp; std::getline(stream, tmp); server["description"] = tmp; serverlist.push_back(server); } } return serverlist; } const std::string serialize(const std::vector<ServerListSpec> &serverlist) { std::string liststring; for (std::vector<ServerListSpec>::const_iterator it = serverlist.begin(); it != serverlist.end(); ++it) { liststring += "[server]\n"; liststring += (*it)["name"].asString() + '\n'; liststring += (*it)["address"].asString() + '\n'; liststring += (*it)["port"].asString() + '\n'; liststring += (*it)["description"].asString() + '\n'; liststring += '\n'; } return liststring; } const std::string serializeJson(const std::vector<ServerListSpec> &serverlist) { Json::Value root; Json::Value list(Json::arrayValue); for (std::vector<ServerListSpec>::const_iterator it = serverlist.begin(); it != serverlist.end(); ++it) { list.append(*it); } root["list"] = list; Json::FastWriter writer; return writer.write(root); } #if USE_CURL void sendAnnounce(const std::string &action, const u16 port, const std::vector<std::string> &clients_names, const double uptime, const u32 game_time, const float lag, const std::string &gameid, const std::string &mg_name, const std::vector<ModSpec> &mods) { Json::Value server; server["action"] = action; server["port"] = port; if (g_settings->exists("server_address")) { server["address"] = g_settings->get("server_address"); } if (action != "delete") {