bool CGmObjCockpit::InventarAdd( CGMesh * poMeshDisplay ) { if( !poMeshDisplay ) return false; if( m_uiInventarIdx >= m_oArrInventar.GetSize() ) { return false; //m_oArrInventar.Resize( uiInventarSize * 2 ); //new } CInventarEntry &roEntry( m_oArrInventar[m_uiInventarIdx] ); TVec oPos( m_oDisplayInventarPos0 ); oPos[0] += m_fInventarStep * m_uiInventarIdx; if( roEntry.Init( poMeshDisplay, oPos, m_fInventarScaleFactor ) ) ++m_uiInventarIdx; return true; }
void GameScreen::createExplosion(glm::vec3 const& position, float size, float duration, bool removeBlocks) { // Add new explosion explosions.push_back(Explosion(position, glm::vec2(size), duration)); // Limit explosion sounds to one per frame if (explosionsThisFrame < 1) { game->getSoundManager()->playSound("Sounds/bombexplosion.mp3", position, 30.f); } explosionsThisFrame++; // Find all bombs within the explosion radius Bomb::id_set nearbyBombs; glm::vec2 groundPos(glm::swizzle<glm::X, glm::Z>(position)); getNearbyBombs(groundPos, size * 0.5f, nearbyBombs); BOOST_FOREACH(Bomb::id const& id, nearbyBombs) { // Only deal with the players own bombs if (id.first == myID) { Bomb& bomb = myEntities[id.second]; if (bomb.isAlive()) { Packet::ptr packet(new Packet13RemoveBomb(myID, id.second, true)); client->write(packet); bomb.setIsAlive(false); } } } // Blow up blocks if (removeBlocks) { float blockExplosionRadius = size * 0.8f; glm::vec2 bPos = groundPos - glm::vec2(0.5f); glm::ivec2 minPos(glm::floor(bPos - glm::vec2(blockExplosionRadius))); glm::ivec2 maxPos(glm::ceil(bPos + glm::vec2(blockExplosionRadius))); minPos = glm::max(minPos, 0); maxPos = glm::min(maxPos, blockMap.getSize() - glm::ivec2(1)); std::vector<glm::ivec2> blocks; // For every block in a square... for (int x = minPos.x; x <= maxPos.x; x++) { for (int y = minPos.y; y <= maxPos.y; y++) { glm::ivec2 oPos(x, y); Block::ptr block = blockMap.getBlock(oPos); if (block && block->isDestructible() && glm::distance(glm::vec2(oPos), bPos) < blockExplosionRadius) { blocks.push_back(oPos); } } } // If any block to remove was found... if (!blocks.empty()) { Packet::ptr packet(new Packet14RemoveBlocks(blocks)); client->write(packet); } } // Give score for every explosion close to the opponents base if (glm::distance(position, opponentBasePos) < size * 0.5f) { scoreThisFrame += BASE_POINTS_PER_BOMB; } }