forked from oerkki/voxelands
have the server send some settings to the client
This commit is contained in:
parent
207558cf06
commit
aeb33cef9d
|
@ -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
|
||||
|
|
11
src/client.h
11
src/client.h
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue