#include "Player.h" #include "Game.h" Player::Player( Framework::Vec3 location, int dimensionId, int entityId ) : Entity( PlayerEntityType::INSTANCE, location, dimensionId, entityId ) { maxHP = 10; currentHP = 10; stamina = 10; maxStamina = 10; hunger = 10; maxHunger = 10; thirst = 10; maxThirst = 10; keyState = 0; jumping = 0; } void Player::setName( Framework::Text name ) { this->name = name; } const char* Player::getName() const { return name; } void Player::tick( const Dimension* zDimension, Game* zGame ) { speed = { 0, 0, speed.z }; if( (keyState | Key::MOVE_FRONT) == keyState ) speed += {faceDir.x * 1.5f, faceDir.y * 1.5f, 0}; if( (keyState | Key::MOVE_BACK) == keyState ) speed += {-faceDir.x * 1.5f, -faceDir.y * 1.5f, 0}; if( (keyState | Key::MOVE_RIGHT) == keyState ) { Vec3 right = Vec3( faceDir ).rotateZ( (float)PI / 2.f ); speed += {right.x * 1.5f, right.y * 1.5f, 0}; } if( (keyState | Key::MOVE_LEFT) == keyState ) { Vec3 left = Vec3( faceDir ).rotateZ( -(float)PI / 2.f ); speed += {left.x * 1.5f, left.y * 1.5f, 0}; } if( (keyState | Key::MOVE_DOWN) == keyState && !jumping ) speed.z = -1.5f; return Entity::tick( zDimension, zGame ); } void Player::api( Framework::StreamReader* zRequest, NetworkResponse* zResponse ) { char byte; zRequest->lese( &byte, 1 ); switch( byte ) { case 0: zRequest->lese( &byte, 1 ); switch( byte ) { case 0: keyState = keyState & ~Key::MOVE_FRONT; break; case 1: keyState = keyState & ~Key::MOVE_LEFT; break; case 2: keyState = keyState & ~Key::MOVE_BACK; break; case 3: keyState = keyState & ~Key::MOVE_RIGHT; break; case 4: if( gravityMultiplier == 0.f ) speed.z = 0; keyState = keyState & ~Key::MOVE_DOWN; break; case 5: keyState = keyState & ~Key::ROTATE_LEFT; break; case 6: keyState = keyState & ~Key::ROTATE_RIGHT; break; case 7: if( gravityMultiplier == 0.f ) speed.z = 0; keyState = keyState & ~Key::MOVE_UP; break; } break; case 1: zRequest->lese( &byte, 1 ); switch( byte ) { case 0: keyState = keyState | Key::MOVE_FRONT; break; case 1: keyState = keyState | Key::MOVE_LEFT; break; case 2: keyState = keyState | Key::MOVE_BACK; break; case 3: keyState = keyState | Key::MOVE_RIGHT; break; case 4: keyState = keyState | Key::MOVE_DOWN; break; case 5: keyState = keyState | Key::ROTATE_LEFT; break; case 6: keyState = keyState | Key::ROTATE_RIGHT; break; case 7: if( (keyState | Key::MOVE_UP) != keyState ) { if( gravityMultiplier > 0 ) { if( jumping ) { // TODO: check if flight is enabled gravityMultiplier = 0; jumping = 0; speed.z = 1.5f; } else { jumping = 1; speed.z = 5.f; } } else speed.z = 1.5f; } keyState = keyState | Key::MOVE_UP; break; } break; case 2 : zRequest->lese( (char*)&faceDir.x, 4 ); zRequest->lese( (char*)&faceDir.y, 4 ); zRequest->lese( (char*)&faceDir.z, 4 ); } } void Player::onFall( float collisionSpeed ) { Entity::onFall( collisionSpeed ); gravityMultiplier = 1.f; jumping = 0; } PlayerEntityType::PlayerEntityType() : EntityType( ID ) {} void PlayerEntityType::loadSuperEntity( Entity* zEntity, Framework::StreamReader* zReader ) const {} void PlayerEntityType::saveSuperEntity( Entity* zEntity, Framework::StreamWriter* zWriter ) const {} Entity* PlayerEntityType::createEntity( Framework::Vec3 position, int dimensionId, Game* zTarget, int entityId ) const { return new Player( position, dimensionId, entityId ); }