From 0b97ad838466ed44296a2c663b2dc034feb51f67 Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Sat, 12 Nov 2011 15:41:29 +0200
Subject: [PATCH] ServerRemotePlayer implements ServerActiveObject

---
 src/content_object.h |  3 +++
 src/player.cpp       | 26 ++++----------------------
 src/player.h         | 27 +++++++++++++++++++++++++--
 src/server.cpp       | 10 +++-------
 src/serverobject.h   |  7 ++++---
 5 files changed, 39 insertions(+), 34 deletions(-)

diff --git a/src/content_object.h b/src/content_object.h
index f092b2789..af8636148 100644
--- a/src/content_object.h
+++ b/src/content_object.h
@@ -29,5 +29,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #define ACTIVEOBJECT_TYPE_LUAENTITY 7
 
+// Special type, not stored in active object lists
+#define ACTIVEOBJECT_TYPE_PLAYER 100
+
 #endif
 
diff --git a/src/player.cpp b/src/player.cpp
index 732911828..396ce2494 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -144,16 +144,12 @@ void Player::deSerialize(std::istream &is)
 		args.parseConfigLine(line);
 	}
 
-	//args.getS32("version");
+	//args.getS32("version"); // Version field value not used
 	std::string name = args.get("name");
 	updateName(name.c_str());
-	/*std::string password = "";
-	if(args.exists("password"))
-		password = args.get("password");
-	updatePassword(password.c_str());*/
-	m_pitch = args.getFloat("pitch");
-	m_yaw = args.getFloat("yaw");
-	m_position = args.getV3F("position");
+	setPitch(args.getFloat("pitch"));
+	setYaw(args.getFloat("yaw"));
+	setPosition(args.getV3F("position"));
 	try{
 		craftresult_is_preview = args.getBool("craftresult_is_preview");
 	}catch(SettingNotFoundException &e){
@@ -164,20 +160,6 @@ void Player::deSerialize(std::istream &is)
 	}catch(SettingNotFoundException &e){
 		hp = 20;
 	}
-	/*try{
-		std::string sprivs = args.get("privs");
-		if(sprivs == "all")
-		{
-			privs = PRIV_ALL;
-		}
-		else
-		{
-			std::istringstream ss(sprivs);
-			ss>>privs;
-		}
-	}catch(SettingNotFoundException &e){
-		privs = PRIV_DEFAULT;
-	}*/
 
 	inventory.deSerialize(is);
 }
diff --git a/src/player.h b/src/player.h
index a352c1bd9..c3be07894 100644
--- a/src/player.h
+++ b/src/player.h
@@ -179,11 +179,23 @@ class Player
 	Player on the server
 */
 
-class ServerRemotePlayer : public Player
+#include "serverobject.h"
+#include "content_object.h" // Object type IDs
+
+class ServerRemotePlayer : public Player, public ServerActiveObject
 {
 public:
-	ServerRemotePlayer()
+	ServerRemotePlayer():
+		ServerActiveObject(NULL, v3f(0,0,0))
+	{
+	}
+	ServerRemotePlayer(ServerEnvironment *env, v3f pos_, u16 peer_id_,
+			const char *name_):
+		ServerActiveObject(env, pos_)
 	{
+		setPosition(pos_);
+		peer_id = peer_id_;
+		updateName(name_);
 	}
 	virtual ~ServerRemotePlayer()
 	{
@@ -198,6 +210,17 @@ class ServerRemotePlayer : public Player
 	{
 	}
 	
+	virtual void setPosition(const v3f &position)
+	{
+		Player::setPosition(position);
+		ServerActiveObject::setBasePosition(position);
+	}
+
+	/*
+		ServerActiveObject interface
+	*/
+	u8 getType() const
+		{return ACTIVEOBJECT_TYPE_PLAYER;}
 private:
 };
 
diff --git a/src/server.cpp b/src/server.cpp
index fd9703bd5..330ce21c2 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -4279,11 +4279,7 @@ Player *Server::emergePlayer(const char *name, const char *password, u16 peer_id
 		Create a new player
 	*/
 	{
-		player = new ServerRemotePlayer();
-		//player->peer_id = c.peer_id;
-		//player->peer_id = PEER_ID_INEXISTENT;
-		player->peer_id = peer_id;
-		player->updateName(name);
+		// Add authentication stuff
 		m_authmanager.add(name);
 		m_authmanager.setPassword(name, password);
 		m_authmanager.setPrivs(name,
@@ -4294,11 +4290,11 @@ Player *Server::emergePlayer(const char *name, const char *password, u16 peer_id
 		*/
 		
 		infostream<<"Server: Finding spawn place for player \""
-				<<player->getName()<<"\""<<std::endl;
+				<<name<<"\""<<std::endl;
 
 		v3f pos = findSpawnPos(m_env->getServerMap());
 
-		player->setPosition(pos);
+		player = new ServerRemotePlayer(m_env, pos, peer_id, name);
 
 		/*
 			Add player to environment
diff --git a/src/serverobject.h b/src/serverobject.h
index 6d616c75e..66118cca0 100644
--- a/src/serverobject.h
+++ b/src/serverobject.h
@@ -72,13 +72,14 @@ class ServerActiveObject : public ActiveObject
 		Some more dynamic interface
 	*/
 	virtual void setPos(v3f pos)
-	{ setBasePosition(pos); }
+		{ setBasePosition(pos); }
 	// continuous: if true, object does not stop immediately at pos
 	virtual void moveTo(v3f pos, bool continuous)
-	{ setBasePosition(pos); }
+		{ setBasePosition(pos); }
 	// If object has moved less than this and data has not changed,
 	// saving to disk may be omitted
-	virtual float getMinimumSavedMovement(){ return 2.0*BS; }
+	virtual float getMinimumSavedMovement()
+		{ return 2.0*BS; }
 
 	/*
 		Step object in time.
-- 
GitLab