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
and
In mapview.cpp most changes are drawflags and it/2/3
In thingtype.cpp added
In thingtype.h added
in tile.cpp
Added efects under creature
And changed drawing normal effects into this
Im using Otland Client
My changes I added in const.h
C++:
DrawUnderEffects = 65536,
C++:
DrawEverything = DrawGround | DrawGroundBorders | DrawUnderEffects | DrawWalls | DrawItems |
DrawCreatures | DrawEffects | DrawMissiles | DrawCreaturesInformation |
DrawStaticTexts | DrawAnimatedTexts | DrawAnimations | DrawBars | DrawNames |
DrawLights | DrawManaBar
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;
}
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);
}
}