have the server send some settings to the client

This commit is contained in:
darkrose 2014-09-23 02:45:48 +10:00
parent 207558cf06
commit aeb33cef9d
6 changed files with 80 additions and 81 deletions

View File

@ -195,6 +195,9 @@ Client::Client(
device->getSceneManager(), 666),
device->getSceneManager()
),
m_server_damage(false),
m_server_suffocation(false),
m_server_hunger(false),
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, this),
m_sound(sound),
m_device(device),
@ -543,7 +546,7 @@ void Client::step(float dtime)
ClientEnvEvent event = m_env.getClientEvent();
if (event.type == CEE_NONE) {
break;
}else if (event.type == CEE_PLAYER_DAMAGE) {
}else if (event.type == CEE_PLAYER_DAMAGE && getServerDamage()) {
if (m_ignore_damage_timer <= 0) {
s8 damage = event.player_damage.amount;
sendDamage(damage,0,0);
@ -554,7 +557,7 @@ void Client::step(float dtime)
event.player_damage.amount = damage;
m_client_event_queue.push_back(event);
}
}else if (event.type == CEE_PLAYER_SUFFOCATE) {
}else if (event.type == CEE_PLAYER_SUFFOCATE && getServerSuffocation()) {
if (m_ignore_damage_timer <= 0) {
s8 damage = event.player_damage.amount;
sendDamage(0,damage,0);
@ -569,7 +572,7 @@ void Client::step(float dtime)
event.player_damage.amount = damage;
m_client_event_queue.push_back(event);
}
}else if (event.type == CEE_PLAYER_HUNGER) {
}else if (event.type == CEE_PLAYER_HUNGER && getServerHunger()) {
if (m_ignore_damage_timer <= 0) {
s8 damage = event.player_damage.amount;
sendDamage(0,0,damage);
@ -946,73 +949,16 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
//infostream<<"Adding mesh update task for received block"<<std::endl;
addUpdateMeshTaskWithEdge(p, true);
}
else if(command == TOCLIENT_PLAYERPOS)
else if(command == TOCLIENT_SERVERSETTINGS)
{
infostream<<"Received deprecated TOCLIENT_PLAYERPOS"
<<std::endl;
/*u16 our_peer_id;
{
//JMutexAutoLock lock(m_con_mutex); //bulk comment-out
our_peer_id = m_con.GetPeerID();
}
// Cancel if we don't have a peer id
if(our_peer_id == PEER_ID_INEXISTENT){
infostream<<"TOCLIENT_PLAYERPOS cancelled: "
"we have no peer id"
<<std::endl;
return;
}*/
std::string datastring((char*)&data[2], datasize-2);
std::istringstream is(datastring, std::ios_base::binary);
{ //envlock
//JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
u8 damage = readU8(is);
u8 suffocation = readU8(is);
u8 hunger = readU8(is);
u32 player_size = 2+12+12+4+4;
u32 player_count = (datasize-2) / player_size;
u32 start = 2;
for(u32 i=0; i<player_count; i++)
{
u16 peer_id = readU16(&data[start]);
Player *player = m_env.getPlayer(peer_id);
// Skip if player doesn't exist
if(player == NULL)
{
start += player_size;
continue;
}
// Skip if player is local player
if(player->isLocal())
{
start += player_size;
continue;
}
v3s32 ps = readV3S32(&data[start+2]);
v3s32 ss = readV3S32(&data[start+2+12]);
s32 pitch_i = readS32(&data[start+2+12+12]);
s32 yaw_i = readS32(&data[start+2+12+12+4]);
/*infostream<<"Client: got "
<<"pitch_i="<<pitch_i
<<" yaw_i="<<yaw_i<<std::endl;*/
f32 pitch = (f32)pitch_i / 100.0;
f32 yaw = (f32)yaw_i / 100.0;
v3f position((f32)ps.X/100., (f32)ps.Y/100., (f32)ps.Z/100.);
v3f speed((f32)ss.X/100., (f32)ss.Y/100., (f32)ss.Z/100.);
player->setPosition(position);
player->setSpeed(speed);
player->setPitch(pitch);
player->setYaw(yaw);
/*infostream<<"Client: player "<<peer_id
<<" pitch="<<pitch
<<" yaw="<<yaw<<std::endl;*/
start += player_size;
}
} //envlock
setServerSettings(damage,suffocation,hunger);
}
else if(command == TOCLIENT_PLAYERINFO)
{
@ -1149,9 +1095,12 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
u8 hp = readU8(is);
u8 air = readU8(is);
u8 hunger = readU8(is);
player->hp = hp;
player->air = air;
player->hunger = hunger;
if (m_server_damage)
player->hp = hp;
if (m_server_suffocation)
player->air = air;
if (m_server_hunger)
player->hunger = hunger;
}
else if(command == TOCLIENT_INVENTORY)
{
@ -1864,6 +1813,13 @@ void Client::sendPlayerItem(u16 item)
Send(0, data, true);
}
void Client::setServerSettings(bool damage, bool suffocation, bool hunger)
{
m_server_damage = damage;
m_server_suffocation = suffocation;
m_server_hunger = hunger;
}
void Client::removeNode(v3s16 p)
{
//JMutexAutoLock envlock(m_env_mutex); //bulk comment-out

View File

@ -332,6 +332,10 @@ public:
void setPointedNode(v3s16 p) {m_pointed_node = p;}
v3s16 getPointedNode() {return m_pointed_node;}
bool getServerDamage() {return m_server_damage;}
bool getServerSuffocation() {return m_server_suffocation;}
bool getServerHunger() {return m_server_hunger;}
private:
// Virtual methods from con::PeerHandler
@ -347,6 +351,8 @@ private:
// Send the item number 'item' as player item to the server
void sendPlayerItem(u16 item);
void setServerSettings(bool damage, bool suffocation, bool hunger);
float m_packetcounter_timer;
float m_connection_reinit_timer;
float m_avg_rtt_timer;
@ -358,6 +364,11 @@ private:
ClientEnvironment m_env;
// when connecting to a server it will give these via TOCLIENT_SERVERSETTINGS
bool m_server_damage;
bool m_server_suffocation;
bool m_server_hunger;
con::Connection m_con;
HTTPClient *m_httpclient;
ISoundManager *m_sound;

View File

@ -54,16 +54,12 @@ enum ToClientCommand
TOCLIENT_ADDNODE = 0x21,
TOCLIENT_REMOVENODE = 0x22,
TOCLIENT_PLAYERPOS = 0x23, // Obsolete
TOCLIENT_SERVERSETTINGS = 0x23,
/*
[0] u16 command
// Followed by an arbitary number of these:
// Number is determined from packet length.
[N] u16 peer_id
[N+2] v3s32 position*100
[N+2+12] v3s32 speed*100
[N+2+12+12] s32 pitch*100
[N+2+12+12+4] s32 yaw*100
u16 command
u8 enable_damage
u8 enable_suffocation
u8 enable_hunger
*/
TOCLIENT_PLAYERINFO = 0x24,

View File

@ -2385,9 +2385,12 @@ void the_game(
Draw hotbar
*/
if (show_hud) {
s32 hunger = 0;
if (client.getServerHunger())
hunger = client.getHunger();
draw_hotbar(driver, font, v2s32(displaycenter.X, screensize.Y),
hotbar_imagesize, hotbar_itemcount, &local_inventory,
client.getHP(), client.getAir(), client.getHunger());
client.getHP(), client.getAir(), hunger);
}
/*

View File

@ -2061,6 +2061,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
Send complete position information
*/
SendMovePlayer(player);
SendSettings(player);
return;
}
@ -5184,7 +5185,16 @@ void Server::BroadcastChatMessage(const std::wstring &message)
void Server::SendPlayerHP(Player *player)
{
SendHP(m_con, player->peer_id, player->hp, player->air,player->hunger);
u8 hp = player->hp;
u8 air = player->air;
u8 hunger = player->hunger;
if (!g_settings->getBool("enable_damage"))
hp = 0;
if (!g_settings->getBool("enable_suffocation"))
air = 20;
if (!g_settings->getBool("enable_hunger"))
hunger = 0;
SendHP(m_con, player->peer_id, hp,air,hunger);
}
void Server::SendPlayerCookie(Player *player)
@ -5203,6 +5213,27 @@ void Server::SendPlayerCookie(Player *player)
m_con.Send(player->peer_id, 0, data, true);
}
void Server::SendSettings(Player *player)
{
std::ostringstream os(std::ios_base::binary);
u8 setting;
writeU16(os, TOCLIENT_SERVERSETTINGS);
setting = g_settings->getBool("enable_damage");
writeU8(os, setting);
setting = g_settings->getBool("enable_suffocation");
writeU8(os, setting);
setting = g_settings->getBool("enable_hunger");
writeU8(os, setting);
// Make data buffer
std::string s = os.str();
SharedBuffer<u8> data((u8*)s.c_str(), s.size());
// Send as reliable
m_con.Send(player->peer_id, 0, data, true);
}
void Server::SendMovePlayer(Player *player)
{
DSTACK(__FUNCTION_NAME);

View File

@ -536,6 +536,8 @@ private:
void BroadcastChatMessage(const std::wstring &message);
void SendPlayerHP(Player *player);
void SendPlayerCookie(Player *player);
// tell the client what kind of game is being played
void SendSettings(Player *player);
/*
Send a node removal/addition event to all clients except ignore_id.
Additionally, if far_players!=NULL, players further away than