Skip to content

Commit

Permalink
Improved LoginStep processing
Browse files Browse the repository at this point in the history
Added ProcessAuthStep
FastCraft sends health and compass coordinates now
Added UpdateHealth
Added isLoginDone
Added sendKeepAlive
Did a code cleanup
  • Loading branch information
sprenger120 committed Nov 26, 2011
1 parent 2ddb4a4 commit 647a0db
Show file tree
Hide file tree
Showing 2 changed files with 191 additions and 58 deletions.
221 changes: 167 additions & 54 deletions FastCraft/PlayerThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,39 +113,14 @@ void PlayerThread::run() {

try {

if (iKeepActive_LastTimestamp + FC_INTERVAL_KEEPACTIVE == getTicks()) { //Send new keep alive
iKeepActive_LastTimestamp = getTicks();

iKeepActive_LastID = Random::Int();
_Network.addByte(0x0);
_Network.addInt(iKeepActive_LastID);
_Network.Flush();
}
sendKeepAlive();
sendTime();
IncrementTicks();
ProcessQueue();
ProcessAuthStep();

if (getAuthStep() == FC_AUTHSTEP_PRECHUNKS) {
_Coordinates.X = 100.0;
_Coordinates.Y = 35.0;
_Coordinates.Z = 100.0;
_Coordinates.Stance = 35.0;
_Coordinates.OnGround = true;
_Coordinates.Pitch = 0.0F;
_Coordinates.Yaw = 0.0F;

sendClientPosition();
setAuthStep(FC_AUTHSTEP_SPAWNPOS);
}


if (getAuthStep() >= FC_AUTHSTEP_SPAWNPOS) {
_ChunkProvider.HandleMovement(_Coordinates);
setAuthStep(FC_AUTHSTEP_INVENTORY);
}

iPacket = _Network.readByte();

cout<<"Package recovered:"<<std::hex<<int(iPacket)<<"\n";

switch (iPacket) {
Expand Down Expand Up @@ -240,45 +215,81 @@ void PlayerThread::run() {
cout<<_sName<<" joined ("<<_sIP<<") EID:"<<_iEntityID<<endl;
break;
case 0xa: //Player
if (getAuthStep() < FC_AUTHSTEP_PRECHUNKS) {

switch(isLoginDone()) {
case true:
_Coordinates.OnGround = _Network.readBool();

if (!_ChunkProvider.isFullyCircleSpawned()) {
_ChunkProvider.HandleMovement(_Coordinates);
}

break;
case false:
_Network.read(1);
continue;
break;
}

_Coordinates.OnGround = _Network.readBool();
break;
case 0xb:
if (getAuthStep() < FC_AUTHSTEP_PRECHUNKS) {
case 0xb: //Coords & OnGround


switch(isLoginDone()) {
case true:
/*_Coordinates.X = _Network.readDouble();
_Coordinates.Y = _Network.readDouble();
_Coordinates.Stance = _Network.readDouble();
_Coordinates.Z = _Network.readDouble();
_Coordinates.OnGround = _Network.readBool();
*/
_Network.read(33);
continue;
_ChunkProvider.HandleMovement(_Coordinates);
break;
case false:
cout<<"authstep too low"<<"\n";
_Network.read(33);
break;
}
_Coordinates.X = _Network.readDouble();
_Coordinates.Y = _Network.readDouble();
_Coordinates.Stance = _Network.readDouble();
_Coordinates.Z = _Network.readDouble();
_Coordinates.OnGround = _Network.readBool();

break;
case 0xc:
if (getAuthStep() < FC_AUTHSTEP_PRECHUNKS) {
case 0xc: //Look & OnGround
switch(isLoginDone()) {
case true:
_Coordinates.Yaw = _Network.readFloat();
_Coordinates.Pitch = _Network.readFloat();
_Coordinates.OnGround = _Network.readBool();

if (!_ChunkProvider.isFullyCircleSpawned()) {
_ChunkProvider.HandleMovement(_Coordinates);
}
break;
case false:
cout<<"authstep too low"<<"\n";
_Network.read(9);
continue;
break;
}
_Coordinates.Yaw = _Network.readFloat();
_Coordinates.Pitch = _Network.readFloat();
_Coordinates.OnGround = _Network.readBool();


break;
case 0xd: //Client Pos Update
if (getAuthStep() < FC_AUTHSTEP_PRECHUNKS) {
case 0xd: //Full Client position
switch(isLoginDone()) {
case true:
/*_Coordinates.X = _Network.readDouble();
_Coordinates.Y = _Network.readDouble();
_Coordinates.Stance = _Network.readDouble();
_Coordinates.Z = _Network.readDouble();
_Coordinates.Yaw = _Network.readFloat();
_Coordinates.Pitch = _Network.readFloat();
_Coordinates.OnGround = _Network.readBool();
*/
_Network.read(41);
continue;
_ChunkProvider.HandleMovement(_Coordinates);
break;
case false:
cout<<"authstep too low"<<"\n";
_Network.read(41);
break;
}
_Coordinates.X = _Network.readDouble();
_Coordinates.Y = _Network.readDouble();
_Coordinates.Stance = _Network.readDouble();
_Coordinates.Z = _Network.readDouble();
_Coordinates.Yaw = _Network.readFloat();
_Coordinates.Pitch = _Network.readFloat();
_Coordinates.OnGround = _Network.readBool();
break;
case 0xFE: //Server List Ping
_sTemp.clear();
Expand Down Expand Up @@ -452,6 +463,14 @@ char PlayerThread::getAuthStep() {
return _iLoginProgress;
}

bool PlayerThread::isLoginDone() {
if (getAuthStep() == FC_AUTHSTEP_DONE) {
return true;
}else{
return false;
}
}

void PlayerThread::sendTime() {
if (getAuthStep() < FC_AUTHSTEP_TIME) {return;}
if (getAuthStep() == FC_AUTHSTEP_TIME) { //Increment authstep
Expand Down Expand Up @@ -499,4 +518,98 @@ void PlayerThread::sendClientPosition() {
_Network.addFloat(_Coordinates.Pitch);
_Network.addBool(_Coordinates.OnGround);
_Network.Flush();
}

void PlayerThread::sendKeepAlive() {
if (_TimeJobs.LastKeepAliveSend + FC_INTERVAL_KEEPACTIVE == getTicks()) { //Send new keep alive
_TimeJobs.LastKeepAliveSend = getTicks();

_Network.addByte(0x0);
_Network.addInt(Random::Int());
_Network.Flush();
}

}

void PlayerThread::UpdateHealth(short iHealth,short iFood,float nSaturation) {
//Send Health

if (iHealth > 20) {
iHealth = 20;
}

if (iHealth < 0) {
iHealth = 0;
}

if (iFood > 20) {
iFood = 20;
}

if (iFood < 0) {
iFood = 0;
}

if (nSaturation > 5.0F) {
nSaturation = 5.0F;
}

if (nSaturation < 0.0F) {
nSaturation = 0.0F;
}


_iHealth = iHealth;
_iFood = iFood;
_nSaturation = nSaturation;

_Network.addByte(0x8);
_Network.addShort(_iHealth);
_Network.addShort(_iFood);
_Network.addFloat(_nSaturation);
_Network.Flush();
}


bool PlayerThread::isSpawned() {
if (getAuthStep() >= FC_AUTHSTEP_PRECHUNKS) {
return true;
}else{
return false;
}
}

void PlayerThread::ProcessAuthStep() {

switch (getAuthStep()) {
case FC_AUTHSTEP_PRECHUNKS:
//Set start coordinates
_Coordinates.X = 100.0;
_Coordinates.Y = 35.0;
_Coordinates.Z = 100.0;
_Coordinates.Stance = 35.0;
_Coordinates.OnGround = false;
_Coordinates.Pitch = 0.0F;
_Coordinates.Yaw = 0.0F;

_ChunkProvider.HandleMovement(_Coordinates); //Send first chunk

setAuthStep(FC_AUTHSTEP_SPAWNPOS);
break;
case FC_AUTHSTEP_SPAWNPOS:
//Send spawnpos & Health
_Network.addByte(0x6);
_Network.addInt(0); //X
_Network.addInt(0); // Y
_Network.addInt(0); // Z
_Network.Flush();

UpdateHealth(20,20,5.0F);
setAuthStep(FC_AUTHSTEP_INVENTORY);
break;
case FC_AUTHSTEP_INVENTORY:
sendClientPosition(); //Login completly done
setAuthStep(FC_AUTHSTEP_DONE);
break;
}
}
28 changes: 24 additions & 4 deletions FastCraft/PlayerThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ using std::queue;

struct TimeJobs {
long long LastTimeSend;
long long LastKeepAliveSend;
};

class PlayerThread : public Poco::Runnable {
Expand All @@ -49,6 +50,9 @@ class PlayerThread : public Poco::Runnable {
string _sIP; //IP
int _iEntityID;
char _iLoginProgress;
short _iHealth;
short _iFood;
float _nSaturation;

//TCP stuff
Poco::Net::StreamSocket _Connection;
Expand Down Expand Up @@ -94,7 +98,10 @@ class PlayerThread : public Poco::Runnable {
void Kick(string); //Kick with reason
void Ban(int); //Bans player (int = Expiration, -1 for permanent ban)
void Ban(string,int); //Bans player with reason (int = Expiration, -1 for permanent ban)
void UpdateHealth(short,short,float);

//For PlayerPool
bool isSpawned(); //Returns true if the playerpool can spawn entitys

//Accessator
int getThreadID(); //Gets Thread ID - used for player instance identification
Expand All @@ -108,16 +115,29 @@ class PlayerThread : public Poco::Runnable {

static int getConnectedPlayers();
private:
bool isNameSet(); //returns true if name is set
//Queue
void ClearQueue(); //Clear send queue
void ProcessQueue(); //Returns true if connection is closed
void generateConnectionHash(); //Generate a new connection hash
void ProcessQueue();

//AuthStep
void setAuthStep(char);
char getAuthStep();
bool isLoginDone(); //returns true if the full login procedure done
void ProcessAuthStep();
bool isNameSet(); //returns true if name is set

//send... Functions
void sendClientPosition();
void sendKeepAlive();
void sendTime();//Sends time if required


//Ticks
long long getTicks();
void IncrementTicks();
void sendClientPosition();


void generateConnectionHash(); //Generate a new connection hash
};

#endif

0 comments on commit 647a0db

Please sign in to comment.