• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Problem with drawing effects under creatures

poe6man3

Member
Joined
Aug 6, 2020
Messages
87
Solutions
1
Reaction score
12
So i were trying to make this feature and it is working but i hit a wall and cant figure out why missiles are not being drawn can somebody help me out ?

Im using Otland Client

My changes I added in const.h
C++:
DrawUnderEffects = 65536,
and

C++:
DrawEverything = DrawGround | DrawGroundBorders | DrawUnderEffects | DrawWalls | DrawItems |
                         DrawCreatures | DrawEffects | DrawMissiles | DrawCreaturesInformation |
                         DrawStaticTexts | DrawAnimatedTexts | DrawAnimations | DrawBars | DrawNames |
                         DrawLights | DrawManaBar
In mapview.cpp most changes are drawflags and it/2/3
C++:
void MapView::draw(const Rect& rect)
{
    // update visible tiles cache when needed
    if(m_mustUpdateVisibleTilesCache || m_updateTilesPos > 0)
        updateVisibleTilesCache(m_mustUpdateVisibleTilesCache ? 0 : m_updateTilesPos);

    float scaleFactor = m_tileSize/(float)Otc::TILE_PIXELS;
    Position cameraPosition = getCameraPosition();

    int drawFlags = 0;
    int drawFlags2 = 0;
    int drawFlags3 = 0;
    // First branch:
    // This is unlikely to be false because a lot of us
    // don't wanna hear their GPU fan while playing a
    // 2D game.
    //
    // Second & Third branch:
    // This is likely to be true since not many people have
    // low-end graphics cards.
    if (unlikely(g_map.isForcingAnimations()) || (likely(g_map.isShowingAnimations()) && m_viewMode == NEAR_VIEW)) {
        drawFlags = Otc::DrawAnimations;
        drawFlags2 = Otc::DrawAnimations;
        drawFlags3 = Otc::DrawAnimations;
    }

    if (m_viewMode == NEAR_VIEW) {
        drawFlags |= Otc::DrawGround | Otc::DrawGroundBorders;
        drawFlags2 |= Otc::DrawUnderEffects;
        drawFlags3 |= Otc::DrawWalls | Otc::DrawItems | Otc::DrawCreatures | Otc::DrawEffects | Otc::DrawMissiles;
    }
    else {
        drawFlags |= Otc::DrawGround | Otc::DrawGroundBorders;
        drawFlags3 |= Otc::DrawWalls | Otc::DrawItems | Otc::DrawMissiles;
    }

    if(m_mustDrawVisibleTilesCache || (drawFlags & Otc::DrawAnimations || drawFlags2 & Otc::DrawAnimations || drawFlags3 & Otc::DrawAnimations)) {
        m_framebuffer->bind();

        if(m_mustCleanFramebuffer) {
            Rect clearRect = Rect(0, 0, m_drawDimension * m_tileSize);
            g_painter->setColor(Color::black);
            g_painter->drawFilledRect(clearRect);

            if(m_drawLights) {
                m_lightView->reset();
                m_lightView->resize(m_framebuffer->getSize());

                Light ambientLight;
                if(cameraPosition.z <= Otc::SEA_FLOOR) {
                    ambientLight = g_map.getLight();
                } else {
                    ambientLight.color = 215;
                    ambientLight.intensity = 0;
                }
                ambientLight.intensity = std::max<int>(m_minimumAmbientLight*255, ambientLight.intensity);
                m_lightView->setGlobalLight(ambientLight);
            }
        }
        g_painter->setColor(Color::white);

        auto it = m_cachedVisibleTiles.begin(), end = m_cachedVisibleTiles.end();
        auto it2 = m_cachedVisibleTiles.begin();
        auto it3 = m_cachedVisibleTiles.begin();
        for(int z=m_cachedLastVisibleFloor;z>=m_cachedFirstVisibleFloor;--z) {

            while(it != end) {
                const TilePtr& tile = *it;
                Position tilePos = tile->getPosition();
                if(tilePos.z != z)
                    break;
                else
                    ++it;

                if (g_map.isCovered(tilePos, m_cachedFirstVisibleFloor)) {
                    tile->draw(transformPositionTo2D(tilePos, cameraPosition), scaleFactor, drawFlags);
                }
                else {
                    tile->draw(transformPositionTo2D(tilePos, cameraPosition), scaleFactor, drawFlags, m_lightView.get());
                }
            } 

            while (it2 != end) {
                const TilePtr& tile = *it2;
                Position tilePos = tile->getPosition();
                if (tilePos.z != z)
                    break;
                else
                    ++it2;

                if (g_map.isCovered(tilePos, m_cachedFirstVisibleFloor)) {
                    tile->draw(transformPositionTo2D(tilePos, cameraPosition), scaleFactor, drawFlags2);
                }
                else {
                    tile->draw(transformPositionTo2D(tilePos, cameraPosition), scaleFactor, drawFlags2, m_lightView.get());
                }
            }

            while (it3 != end) {
                const TilePtr& tile = *it3;
                Position tilePos = tile->getPosition();
                if (tilePos.z != z)
                    break;
                else
                    ++it3;

                if (g_map.isCovered(tilePos, m_cachedFirstVisibleFloor)) {
                    tile->draw(transformPositionTo2D(tilePos, cameraPosition), scaleFactor, drawFlags3);
                }
                else {
                    tile->draw(transformPositionTo2D(tilePos, cameraPosition), scaleFactor, drawFlags3, m_lightView.get());
                }
            }

            if(drawFlags2 & Otc::DrawMissiles) {
                for(const MissilePtr& missile : g_map.getFloorMissiles(z)) {
                    missile->draw(transformPositionTo2D(missile->getPosition(), cameraPosition), scaleFactor, drawFlags3 & Otc::DrawAnimations, m_lightView.get());
                }
            }
        }

        m_framebuffer->release();

        // generating mipmaps each frame can be slow in older cards
        //m_framebuffer->getTexture()->buildHardwareMipmaps();

        m_mustDrawVisibleTilesCache = false;
    }
In thingtype.cpp added
C++:
else if (node2->tag() == "drawUnderCreatureEffect") {
            if (node2->value<bool>())
                m_drawundercreatureeffect = 1;
            else
                m_drawundercreatureeffect = 0;
        }

In thingtype.h added
Code:
bool drawUnderCreatureEffect() { return m_drawundercreatureeffect; }

and

bool m_drawundercreatureeffect;

in tile.cpp
Added efects under creature

C++:
 // Draw Effects Under Creatures
    if (drawFlags & Otc::DrawUnderEffects) {
        for (const EffectPtr& effect : m_effects) {
            if (effect->getThingType()->drawUnderCreatureEffect()) {
                effect->drawEffect(dest - m_drawElevation * scaleFactor, scaleFactor, animate, m_position.x - g_map.getCentralPosition().x, m_position.y - g_map.getCentralPosition().y, lightView);
            }
        }
    }

And changed drawing normal effects into this
C++:
// Draw Effects

    if (drawFlags & Otc::DrawEffects) {

        for (const EffectPtr& effect : m_effects) {

            if (!(effect->getThingType()->drawUnderCreatureEffect())) {

                effect->drawEffect(dest - m_drawElevation * scaleFactor, scaleFactor, animate, m_position.x - g_map.getCentralPosition().x, m_position.y - g_map.getCentralPosition().y, lightView);

            }

        }
 
There is a typo at L115 in mapview.cpp: drawFlags2 => drawFlags3
 
Back
Top