diff --git a/.gitignore b/.gitignore
index f8ef2cf..ce34e58 100644
--- a/.gitignore
+++ b/.gitignore
@@ -188,6 +188,9 @@ xcuserdata/
# Avoid including Minecraft Classic assets from Mojang, for now.
/game/assets/patches/*.png
/game/assets/patches/classic/*.png
+!/game/assets/patches/n_rocket_launcher.png
+!/game/assets/patches/n_rocket_launched.png
+!/game/assets/patches/n_rocket.png
# Ignore keep directory - where you can keep files for later use
/keep
diff --git a/game/assets/patches/n_rocket.png b/game/assets/patches/n_rocket.png
new file mode 100644
index 0000000..ff95e74
Binary files /dev/null and b/game/assets/patches/n_rocket.png differ
diff --git a/game/assets/patches/n_rocket_launched.png b/game/assets/patches/n_rocket_launched.png
new file mode 100644
index 0000000..3d22eab
Binary files /dev/null and b/game/assets/patches/n_rocket_launched.png differ
diff --git a/game/assets/patches/n_rocket_launcher.png b/game/assets/patches/n_rocket_launcher.png
new file mode 100644
index 0000000..2728ce5
Binary files /dev/null and b/game/assets/patches/n_rocket_launcher.png differ
diff --git a/game/assets/patches/patch_data.txt b/game/assets/patches/patch_data.txt
index 4407911..61d77a4 100644
--- a/game/assets/patches/patch_data.txt
+++ b/game/assets/patches/patch_data.txt
@@ -15,6 +15,11 @@
grass_sides_tint|true
+# Add festive patches
+terrain|2|14|n_rocket_launcher.png
+terrain|3|14|n_rocket_launched.png
+items|14|2|n_rocket.png
+
# Stop now to ignore the below commands. They're for a patch I'm working on that I don't want to release yet.
stop_now
diff --git a/platforms/windows/projects/Client/Client.vcxproj b/platforms/windows/projects/Client/Client.vcxproj
index 16f9a41..e86041a 100644
--- a/platforms/windows/projects/Client/Client.vcxproj
+++ b/platforms/windows/projects/Client/Client.vcxproj
@@ -338,6 +338,7 @@
+
@@ -456,6 +457,7 @@
+
diff --git a/platforms/windows/projects/Client/Client.vcxproj.filters b/platforms/windows/projects/Client/Client.vcxproj.filters
index 6a6932b..cfe7b69 100644
--- a/platforms/windows/projects/Client/Client.vcxproj.filters
+++ b/platforms/windows/projects/Client/Client.vcxproj.filters
@@ -434,6 +434,9 @@
Header Files\Model
+
+ Header Files\Renderer\Entity
+
@@ -784,5 +787,8 @@
Source Files\Renderer\Entity
+
+ Source Files\Renderer\Entity
+
\ No newline at end of file
diff --git a/platforms/windows/projects/World/World.vcxproj b/platforms/windows/projects/World/World.vcxproj
index ea64b6f..7965738 100644
--- a/platforms/windows/projects/World/World.vcxproj
+++ b/platforms/windows/projects/World/World.vcxproj
@@ -231,6 +231,7 @@
+
@@ -241,6 +242,7 @@
+
@@ -291,9 +293,11 @@
+
+
@@ -364,6 +368,7 @@
+
@@ -401,6 +406,7 @@
+
@@ -451,6 +457,7 @@
+
diff --git a/platforms/windows/projects/World/World.vcxproj.filters b/platforms/windows/projects/World/World.vcxproj.filters
index fc0ac5a..8e0eec8 100644
--- a/platforms/windows/projects/World/World.vcxproj.filters
+++ b/platforms/windows/projects/World/World.vcxproj.filters
@@ -458,6 +458,18 @@
Source Files\Entity
+
+ Source Files\Tile
+
+
+ Source Files\Item
+
+
+ Source Files\Entity
+
+
+ Source Files\Particle
+
@@ -775,5 +787,14 @@
Header Files\Entity
+
+ Header Files\Tile
+
+
+ Header Files\Item
+
+
+ Header Files\Entity
+
\ No newline at end of file
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index ecd4fb3..4917a8d 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -37,6 +37,7 @@ add_library(reminecraftpe-core STATIC
client/renderer/entity/CowRenderer.cpp
client/renderer/entity/PigRenderer.cpp
client/renderer/entity/ChickenRenderer.cpp
+ client/renderer/entity/RocketRenderer.cpp
client/renderer/RenderList.cpp
client/renderer/Chunk.cpp
client/renderer/RenderChunk.cpp
@@ -219,6 +220,7 @@ add_library(reminecraftpe-core STATIC
world/item/Inventory.cpp
world/item/DoorItem.cpp
world/item/ItemInstance.cpp
+ world/item/RocketItem.cpp
world/item/Item.cpp
world/particle/RedDustParticle.cpp
world/particle/TerrainParticle.cpp
@@ -229,6 +231,7 @@ add_library(reminecraftpe-core STATIC
world/particle/SmokeParticle.cpp
world/particle/Particle.cpp
world/particle/LavaParticle.cpp
+ world/particle/FireworkParticle.cpp
world/tile/InvisibleTile.cpp
world/tile/Sapling.cpp
world/tile/TreeTile.cpp
@@ -266,6 +269,7 @@ add_library(reminecraftpe-core STATIC
world/tile/ObsidianTile.cpp
world/tile/FarmTile.cpp
world/tile/DoorTile.cpp
+ world/tile/RocketLauncherTile.cpp
renderer/GL/GL.cpp
)
target_include_directories(reminecraftpe-core PUBLIC . ..)
diff --git a/source/client/gui/screens/StartMenuScreen.cpp b/source/client/gui/screens/StartMenuScreen.cpp
index d534fd8..e3ac74f 100644
--- a/source/client/gui/screens/StartMenuScreen.cpp
+++ b/source/client/gui/screens/StartMenuScreen.cpp
@@ -549,6 +549,10 @@ void StartMenuScreen::render(int a, int b, float c)
if (!crampedMode)
drawSplash();
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ m_pMinecraft->m_pTextures->loadAndBindTexture("terrain.png");
+ this->blit(0, 0, 0, 0, 256, 256, 256, 256);
+
Screen::render(a, b, c);
}
diff --git a/source/client/renderer/GameRenderer.cpp b/source/client/renderer/GameRenderer.cpp
index 1e64694..749c76f 100644
--- a/source/client/renderer/GameRenderer.cpp
+++ b/source/client/renderer/GameRenderer.cpp
@@ -523,7 +523,7 @@ void GameRenderer::renderLevel(float f)
glDisable(GL_FOG);
- if (true) // @TODO
+ if (false) // TODO: Figure out how to enable weather
renderWeather(f);
if (field_44 == 1.0f)
diff --git a/source/client/renderer/LevelRenderer.cpp b/source/client/renderer/LevelRenderer.cpp
index 5e88bb2..670e80b 100644
--- a/source/client/renderer/LevelRenderer.cpp
+++ b/source/client/renderer/LevelRenderer.cpp
@@ -1184,7 +1184,11 @@ void LevelRenderer::takePicture(TripodCamera* pCamera, Entity* pOwner)
void LevelRenderer::addParticle(const std::string& name, float x, float y, float z, float vx, float vy, float vz)
{
// TODO: Who's the genius who decided it'd be better to check a name string rather than an enum?
- if (m_pMinecraft->m_pMobPersp->distanceToSqr_inline(x, y, z) > 256.0f)
+ float maxDist = 256.0f;
+ if (name == "explodeColor")
+ maxDist = 16384.0f;
+
+ if (m_pMinecraft->m_pMobPersp->distanceToSqr_inline(x, y, z) > maxDist)
return;
ParticleEngine* pe = m_pMinecraft->m_pParticleEngine;
@@ -1203,11 +1207,29 @@ void LevelRenderer::addParticle(const std::string& name, float x, float y, float
pe->add(new ExplodeParticle(m_pLevel, x, y, z, vx, vy, vz));
return;
}
+ if (name == "explodeColor")
+ {
+ ExplodeParticle* pExplPart = new ExplodeParticle(m_pLevel, x, y, z, vx, vy, vz);
+ pExplPart->m_bIsUnlit = true;
+ pExplPart->field_F8 = Mth::random();
+ pExplPart->field_FC = Mth::random();
+ pExplPart->field_100 = Mth::random();
+ pExplPart->scale(3.0f);
+ pe->add(pExplPart);
+ return;
+ }
if (name == "flame")
{
pe->add(new FlameParticle(m_pLevel, x, y, z, vx, vy, vz));
return;
}
+ if (name == "flame2")
+ {
+ FlameParticle* pFlamePart = new FlameParticle(m_pLevel, x, y, z, vx, vy, vz);
+ pFlamePart->scale(4.0f);
+ pe->add(pFlamePart);
+ return;
+ }
if (name == "lava")
{
pe->add(new LavaParticle(m_pLevel, x, y, z));
@@ -1230,15 +1252,24 @@ void LevelRenderer::addParticle(const std::string& name, float x, float y, float
void LevelRenderer::playSound(const std::string& name, float x, float y, float z, float a, float b)
{
// TODO: Who's the genius who decided it'd be better to check a name string rather than an enum?
- float mult = 1.0f, dist = 16.0f;
+ float mult = 1.0f, maxDist = 16.0f;
+ float playerDist = m_pMinecraft->m_pMobPersp->distanceToSqr(x, y, z);
if (a > 1.0f)
{
mult = 16.0f;
- dist = a * mult;
+ maxDist = a * mult;
}
- if (dist * dist > m_pMinecraft->m_pMobPersp->distanceToSqr(x, y, z))
+ if (name == "random.explode")
+ {
+ a *= 1.0f - playerDist / 65536.0f;
+ if (a < 0)
+ return;
+ maxDist = 256.0f;
+ }
+
+ if (maxDist * maxDist > playerDist)
m_pMinecraft->m_pSoundEngine->play(name, x, y, z, a, b);
}
diff --git a/source/client/renderer/entity/RocketRenderer.cpp b/source/client/renderer/entity/RocketRenderer.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/RocketRenderer.hpp b/source/client/renderer/entity/RocketRenderer.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/common/Mth.cpp b/source/common/Mth.cpp
index 0a30486..3327f1b 100644
--- a/source/common/Mth.cpp
+++ b/source/common/Mth.cpp
@@ -166,7 +166,6 @@ int Mth::random(int max)
float Mth::random()
{
- return g_Random.genrand_int32() * (1.0f / 4294967295.0f);
- // divided by 2^32-1
+ return g_Random.nextFloat();
}
diff --git a/source/common/Utils.hpp b/source/common/Utils.hpp
index b7dbbac..d6f3b4d 100644
--- a/source/common/Utils.hpp
+++ b/source/common/Utils.hpp
@@ -279,6 +279,7 @@ enum eTileID
TILE_INFO_UPDATEGAME2 = 249,
TILE_OBSIDIAN_CRYING = 200, // custom stuff - ID of 200
+ TILE_ROCKET_LAUNCHER,
ITEM_SHOVEL_IRON = 256,
ITEM_PICKAXE_IRON,
@@ -385,6 +386,9 @@ enum eTileID
ITEM_RECORD_01,
ITEM_RECORD_02,
ITEM_CAMERA = 456,
+
+ // Custom items
+ ITEM_ROCKET = 470,
};
enum // Textures
diff --git a/source/world/entity/Entity.cpp b/source/world/entity/Entity.cpp
index 41afe1f..b88adc8 100644
--- a/source/world/entity/Entity.cpp
+++ b/source/world/entity/Entity.cpp
@@ -438,7 +438,9 @@ label_45:
bool bPlaySound = true;
const Tile::SoundType *sound = Tile::tiles[tileID]->m_pSound;
- if (m_pLevel->getTile(tileX, tileY + 1, tileZ) == Tile::topSnow->m_ID)
+ if (!isPlayer()) // no idea why this wasn't already a thing
+ bPlaySound = false;
+ else if (m_pLevel->getTile(tileX, tileY + 1, tileZ) == Tile::topSnow->m_ID)
sound = Tile::topSnow->m_pSound;
else if (Tile::tiles[tileID]->m_pMaterial->isLiquid())
bPlaySound = false;
diff --git a/source/world/entity/Rocket.cpp b/source/world/entity/Rocket.cpp
new file mode 100644
index 0000000..7a481c2
--- /dev/null
+++ b/source/world/entity/Rocket.cpp
@@ -0,0 +1,85 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+
+#include "Rocket.hpp"
+#include "Player.hpp"
+#include "world/level/Level.hpp"
+
+Rocket::Rocket(Level* level, float x, float y, float z) : Entity(level)
+{
+ field_B8C = 0;
+ field_B90 = 80;
+ field_C8 = RENDER_CAMERA;
+
+ field_34 = 1;
+
+ setSize(1.0f, 1.5f);
+ field_84 = field_8C * 0.5f - 0.25f;
+
+ setPos(x, y, z);
+ field_3C.x = x;
+ field_3C.y = y;
+ field_3C.z = z;
+
+ m_vel.y = 1.0f;
+}
+
+float Rocket::getShadowHeightOffs()
+{
+ return 0.0f;
+}
+
+bool Rocket::interact(Player* player)
+{
+ return true;
+}
+
+int Rocket::interactPreventDefault()
+{
+ return 1;
+}
+
+bool Rocket::isPickable()
+{
+ return !m_bRemoved;
+}
+
+bool Rocket::isPushable()
+{
+ return false;
+}
+
+void Rocket::tick()
+{
+ field_3C = m_pos;
+
+ m_vel.y *= 0.99f;
+
+ move(m_vel.x, m_vel.y, m_vel.z);
+
+ field_B90--;
+ if (field_B90 == 0)
+ {
+ for (int i = 0; i < 50; i++)
+ {
+ float yaw = sharedRandom.nextFloat() * float(M_PI) * 2;
+ float pitch = sharedRandom.nextFloat() * float(M_PI) * 2;
+
+ float xo = sharedRandom.nextFloat() * cosf(yaw);
+ float zo = sharedRandom.nextFloat() * sinf(yaw);
+ float yo = sharedRandom.nextFloat() * sinf(pitch);
+
+ m_pLevel->addParticle("explodeColor", m_pos.x, m_pos.y, m_pos.z, xo, yo, zo);
+ }
+
+ m_pLevel->playSound(this, "random.explode", 1.0f, 1.0f);
+
+ remove();
+ return;
+ }
+}
diff --git a/source/world/entity/Rocket.hpp b/source/world/entity/Rocket.hpp
new file mode 100644
index 0000000..d027df6
--- /dev/null
+++ b/source/world/entity/Rocket.hpp
@@ -0,0 +1,32 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+
+#pragma once
+
+#include "Mob.hpp"
+
+class Level;
+class Player;
+
+class Rocket : public Entity
+{
+public:
+ Rocket(Level*, float, float, float);
+
+ float getShadowHeightOffs() override;
+ bool interact(Player* player) override;
+ int interactPreventDefault() override;
+ bool isPickable() override;
+ bool isPushable() override;
+ void tick() override;
+
+public:
+ int field_B8C;
+ int field_B90;
+};
+
diff --git a/source/world/item/Inventory.cpp b/source/world/item/Inventory.cpp
index 87b08f8..8d0fff1 100644
--- a/source/world/item/Inventory.cpp
+++ b/source/world/item/Inventory.cpp
@@ -66,6 +66,8 @@ void Inventory::prepareCreativeInventory()
addCreativeItem(Tile::sponge->m_ID);
addCreativeItem(Tile::sapling->m_ID);
addCreativeItem(Tile::cryingObsidian->m_ID);
+ addCreativeItem(Tile::rocketLauncher->m_ID);
+ addCreativeItem(Tile::redStoneOre->m_ID);
// test stuff
addCreativeItem(Tile::water->m_ID);
@@ -76,6 +78,7 @@ void Inventory::prepareCreativeInventory()
addCreativeItem(Item::camera->m_itemID);
addCreativeItem(Item::door_wood->m_itemID);
addCreativeItem(Item::door_iron->m_itemID);
+ addCreativeItem(Item::rocket->m_itemID);
for (int i = 0; i < C_MAX_HOTBAR_ITEMS; i++)
m_hotbar[i] = i;
diff --git a/source/world/item/Item.cpp b/source/world/item/Item.cpp
index e8e80ab..454249a 100644
--- a/source/world/item/Item.cpp
+++ b/source/world/item/Item.cpp
@@ -12,6 +12,7 @@
#include "DoorItem.hpp"
#include "TileItem.hpp"
#include "TilePlanterItem.hpp"
+#include "RocketItem.hpp"
#define ITEM(x) ((x) - 256)
@@ -194,6 +195,10 @@ void Item::initItems()
Item::camera = NEW_X_ITEMN(CameraItem, ITEM_CAMERA)
->setIcon(2, 15)
->setDescriptionId("camera");
+
+ Item::rocket = NEW_X_ITEMN(RocketItem, ITEM_ROCKET)
+ ->setIcon(14, 2)
+ ->setDescriptionId("rocket");
}
int Item::getIcon(ItemInstance* pInstance)
@@ -411,7 +416,8 @@ Item
*Item::diode,
*Item::record_01,
*Item::record_02,
- *Item::camera;
+ *Item::camera,
+ *Item::rocket;
Item::Tier
Item::Tier::WOOD (0, 59, 2.0f, 0),
diff --git a/source/world/item/Item.hpp b/source/world/item/Item.hpp
index 34a05b6..8695485 100644
--- a/source/world/item/Item.hpp
+++ b/source/world/item/Item.hpp
@@ -198,5 +198,6 @@ public: // Static declarations
*diode,
*record_01,
*record_02,
- *camera;
+ *camera,
+ *rocket;
};
diff --git a/source/world/item/RocketItem.cpp b/source/world/item/RocketItem.cpp
new file mode 100644
index 0000000..494a9c5
--- /dev/null
+++ b/source/world/item/RocketItem.cpp
@@ -0,0 +1,38 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+
+#include "RocketItem.hpp"
+#include "world/level/Level.hpp"
+#include "world/entity/Player.hpp"
+#include "world/entity/Rocket.hpp"
+
+RocketItem::RocketItem(int id) : Item(id)
+{
+}
+
+bool RocketItem::useOn(ItemInstance* inst, Player* player, Level* level, int x, int y, int z, int dir)
+{
+ if (level->getTile(x, y, z) == Tile::topSnow->m_ID)
+ {
+ dir = DIR_YNEG;
+ }
+ else switch (dir)
+ {
+ case DIR_YNEG: y--; break;
+ case DIR_YPOS: y++; break;
+ case DIR_ZNEG: z--; break;
+ case DIR_ZPOS: z++; break;
+ case DIR_XNEG: x--; break;
+ case DIR_XPOS: x++; break;
+ }
+
+ level->addEntity(new Rocket(level, float(x), float(y), float(z)));
+
+ inst->m_amount--;
+ return true;
+}
diff --git a/source/world/item/RocketItem.hpp b/source/world/item/RocketItem.hpp
new file mode 100644
index 0000000..cc407a8
--- /dev/null
+++ b/source/world/item/RocketItem.hpp
@@ -0,0 +1,18 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+#pragma once
+
+#include "Item.hpp"
+
+class RocketItem : public Item
+{
+public:
+ RocketItem(int id);
+
+ bool useOn(ItemInstance*, Player*, Level*, int x, int y, int z, int dir) override;
+};
diff --git a/source/world/particle/FireworkParticle.cpp b/source/world/particle/FireworkParticle.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/world/particle/FireworkParticle.hpp b/source/world/particle/FireworkParticle.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/world/particle/Particle.cpp b/source/world/particle/Particle.cpp
index 4445cb6..b432f56 100644
--- a/source/world/particle/Particle.cpp
+++ b/source/world/particle/Particle.cpp
@@ -22,6 +22,7 @@ void Particle::_init()
field_F8 = 1.0f;
field_FC = 1.0f;
field_100 = 1.0f;
+ m_bIsUnlit = false;
}
Particle::Particle(Level* level, float x, float y, float z, float vx, float vy, float vz) : Entity(level)
@@ -82,7 +83,7 @@ void Particle::render(Tesselator& t, float f, float a4, float a5, float a6, floa
float posX = Lerp(field_3C.x, m_pos.x, f) - xOff;
float posY = Lerp(field_3C.y, m_pos.y, f) - yOff;
float posZ = Lerp(field_3C.z, m_pos.z, f) - zOff;
- float fBright = getBrightness(f);
+ float fBright = m_bIsUnlit ? 1.0f : getBrightness(f);
float sizeX = a4 * field_F0 * 0.1f;
float sizeY = a5 * field_F0 * 0.1f;
diff --git a/source/world/particle/Particle.hpp b/source/world/particle/Particle.hpp
index 5c32bca..9253b03 100644
--- a/source/world/particle/Particle.hpp
+++ b/source/world/particle/Particle.hpp
@@ -56,6 +56,7 @@ public:
float field_F8;
float field_FC;
float field_100;
+ bool m_bIsUnlit;
static float xOff, yOff, zOff;
};
diff --git a/source/world/tile/Bush.cpp b/source/world/tile/Bush.cpp
index 4f84974..b9b7ba7 100644
--- a/source/world/tile/Bush.cpp
+++ b/source/world/tile/Bush.cpp
@@ -18,7 +18,7 @@ Bush::Bush(int id, int texture) : Tile(id, Material::plant)
int Bush::getRenderShape()
{
- return 1;
+ return SHAPE_CROSS;
}
bool Bush::isCubeShaped()
diff --git a/source/world/tile/RocketLauncherTile.cpp b/source/world/tile/RocketLauncherTile.cpp
new file mode 100644
index 0000000..543ec30
--- /dev/null
+++ b/source/world/tile/RocketLauncherTile.cpp
@@ -0,0 +1,41 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+#include "RocketLauncherTile.hpp"
+#include "world/item/RocketItem.hpp"
+
+RocketLauncherTile::RocketLauncherTile(int id, int texture) : Tile(id, texture, Material::wood)
+{
+}
+
+AABB* RocketLauncherTile::getAABB(Level*, int x, int y, int z)
+{
+ return nullptr;
+}
+
+int RocketLauncherTile::getRenderShape()
+{
+ return SHAPE_CROSS;
+}
+
+bool RocketLauncherTile::isCubeShaped()
+{
+ return false;
+}
+
+bool RocketLauncherTile::isSolidRender()
+{
+ return false;
+}
+
+int RocketLauncherTile::use(Level* pLevel, int x, int y, int z, Player* player)
+{
+ // spawn a rocket
+
+
+ return 1;
+}
diff --git a/source/world/tile/RocketLauncherTile.hpp b/source/world/tile/RocketLauncherTile.hpp
new file mode 100644
index 0000000..1c91979
--- /dev/null
+++ b/source/world/tile/RocketLauncherTile.hpp
@@ -0,0 +1,23 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+
+#pragma once
+
+#include "Tile.hpp"
+
+class RocketLauncherTile : public Tile
+{
+public:
+ RocketLauncherTile(int id, int texture);
+
+ virtual AABB* getAABB(Level*, int x, int y, int z) override;
+ virtual int getRenderShape() override;
+ virtual bool isCubeShaped() override;
+ virtual bool isSolidRender() override;
+ virtual int use(Level* pLevel, int x, int y, int z, Player* player);
+};
diff --git a/source/world/tile/Tile.cpp b/source/world/tile/Tile.cpp
index dbde70b..f0883b5 100644
--- a/source/world/tile/Tile.cpp
+++ b/source/world/tile/Tile.cpp
@@ -48,6 +48,7 @@
#include "SpongeTile.hpp"
#include "BookshelfTile.hpp"
#include "WireTile.hpp"
+#include "RocketLauncherTile.hpp"
std::string Tile::TILE_DESCRIPTION_PREFIX = "tile.";
@@ -697,6 +698,12 @@ void Tile::initTiles()
->setSoundType(Tile::SOUND_STONE)
->setDescriptionId("cryingObsidian");
+ // Jolly
+ Tile::rocketLauncher = (new RocketLauncherTile(TILE_ROCKET_LAUNCHER, 16*14+2))
+ ->init()
+ ->setSoundType(Tile::SOUND_STONE)
+ ->setDescriptionId("rocketLauncher");
+
for (int i = 0; i < C_MAX_TILES; i++)
{
if (Tile::tiles[i])
@@ -1144,4 +1151,5 @@ Tile
*Tile::lapisBlock,
*Tile::bookshelf,
*Tile::mossStone,
- *Tile::cryingObsidian;
+ *Tile::cryingObsidian,
+ *Tile::rocketLauncher;
diff --git a/source/world/tile/Tile.hpp b/source/world/tile/Tile.hpp
index 878ba4e..4994ae2 100644
--- a/source/world/tile/Tile.hpp
+++ b/source/world/tile/Tile.hpp
@@ -213,7 +213,8 @@ public: // static variables
* lapisBlock,
* bookshelf,
* mossStone,
- * cryingObsidian;
+ * cryingObsidian,
+ * rocketLauncher;
public:
int m_TextureFrame;