void PlayerInterface::disconnectPlayerCleanup( PlayerID &player_id ) { PlayerAllianceUpdate allie_update; unsigned short player_index; unsigned short disconnect_player_index; disconnect_player_index = player_id.getIndex(); for ( player_index = 0; player_index < max_players; player_index++ ) { if ( isAllied( disconnect_player_index, player_index ) == true ) { allie_update.set( disconnect_player_index, player_index, _player_break_alliance ); SERVER->sendMessage( &allie_update, sizeof( PlayerAllianceUpdate ), 0 ); } if ( isAllied( player_index, disconnect_player_index ) == true ) { allie_update.set( player_index, disconnect_player_index, _player_break_alliance ); SERVER->sendMessage( &allie_update, sizeof( PlayerAllianceUpdate ), 0 ); } } // ** for player_lists[ disconnect_player_index ].setStatus( _player_state_free ); PlayerState *player_state = getPlayerState( player_id ); PlayerStateSync player_state_update(player_state->getNetworkPlayerState()); SERVER->sendMessage( &player_state_update, sizeof( PlayerStateSync ), 0 ); }
unsigned int Aircraft::getCategory() const { if (isAllied()) return Category::PlayerAircraft; else return Category::EnemyAircraft; }
void Aircraft::checkProjectileLaunch(sf::Time dt, CommandQueue& commands) { // Enemies try to fire all the time if (!isAllied()) fire(); // Check for automatic gunfire, allow only in intervals if (mIsFiring && mFireCountdown <= sf::Time::Zero) { // Interval expired: We can fire a new bullet commands.push(mFireCommand); mFireCountdown += Table[mType].fireInterval / (mFireRateLevel + 1.f); mIsFiring = false; } else if (mFireCountdown > sf::Time::Zero) { // Interval not expired: Decrease it further mFireCountdown -= dt; mIsFiring = false; } // Check for missile launch if (mIsLaunchingMissile) { commands.push(mMissileCommand); mIsLaunchingMissile = false; } }
void Aircraft::checkPickupDrop(CommandQueue& commands) { if (!isAllied() && randomInt(3) == 0 && !mSpawnedPickup) commands.push(mDropPickupCommand); mSpawnedPickup = true; }
Aircraft::Aircraft(Type type, const TextureHolder& textures, const FontHolder& fonts) : Entity(Table[type].hitpoints) , mType(type), mSprite(textures.get(Table[mType].texture), Table[mType].textRect),mHealthDisplay(nullptr) , mTravelledDistance(0.f), mDirectionIndex(0), mIsFiring(false), mFireCountdown(sf::Time::Zero) , mFireRateLevel(1), mFireCommand(), mSpreadLevel(1), mIsMarkedForRemoval(false) , mMissileCommand(), mIsLaunchMissile(false), mMissileAmmo(2), mDropPickupCommand() { if (!isAllied()) mFireRateLevel = 0; centerOrigin(mSprite); std::unique_ptr<TextNode> healthDisplay(new TextNode(fonts, "")); mHealthDisplay = healthDisplay.get(); attachChild(std::move(healthDisplay)); mFireCommand.category = Category::Scene; mFireCommand.action = [this, &textures](SceneNode& node, sf::Time) { createBullet(node, textures); }; mMissileCommand.category = Category::Scene; mMissileCommand.action = [this, &textures] (SceneNode& node, sf::Time) { createProjectile(node, Projectile::Missile, 0.f, 0.5f, textures); }; mDropPickupCommand.category = Category::Scene; mDropPickupCommand.action = [this, &textures] (SceneNode& node, sf::Time) { createPickup(node, textures); }; }
void Aircraft::createProjectile(SceneNode& node, Projectile::Type type, float xOffset, float yOffset, const TextureHolder& textures) const { std::unique_ptr<Projectile> projectile(new Projectile(type, textures)); sf::Vector2f offset(xOffset * mSprite.getGlobalBounds().width, yOffset * mSprite.getGlobalBounds().height); sf::Vector2f velocity(0, projectile->getMaxSpeed()); float sign = isAllied() ? -1.f : +1.f; projectile->setPosition(getWorldPosition() + offset * sign); projectile->setVelocity(velocity * sign); node.attachChild(std::move(projectile)); }
void Aircraft::createBullet(SceneNode &node, const TextureHolder &textures) const { Projectile::Type type = isAllied() ? Projectile::AlliedBullet : Projectile::EnemyBullet; switch (mSpreadLevel) { case 1: createProjectile(node, type, 0.0f, 0.5f, textures); break; case 2: createProjectile(node, type, -0.33f, 0.33f, textures); createProjectile(node, type, 0.33f, 0.33f, textures); break; case 3: createProjectile(node, type, -0.33f, 0.33f, textures); createProjectile(node, type, 0.0f, 0.5f, textures); createProjectile(node, type, 0.33f, 0.33f, textures); break; } }
void Aircraft::checkPickupDrop(CommandQueue& commands) { if (!isAllied() && randomInt(3) == 0) commands.push(mDropPickupCommand); }