aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/Material.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/Material.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/Material.cpp')
-rw-r--r--Minecraft.World/Material.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/Minecraft.World/Material.cpp b/Minecraft.World/Material.cpp
new file mode 100644
index 00000000..9e201ad5
--- /dev/null
+++ b/Minecraft.World/Material.cpp
@@ -0,0 +1,192 @@
+#include "stdafx.h"
+#include "Material.h"
+#include "DecorationMaterial.h"
+#include "GasMaterial.h"
+#include "LiquidMaterial.h"
+#include "PortalMaterial.h"
+#include "WebMaterial.h"// 4J added, Java version just does a local alteration when instantiating the Material for webs to get the same thing
+
+Material *Material::air = NULL;
+Material *Material::grass = NULL;
+Material *Material::dirt = NULL;
+Material *Material::wood = NULL;
+Material *Material::stone = NULL;
+Material *Material::metal = NULL;
+Material *Material::heavyMetal = NULL;
+Material *Material::water = NULL;
+Material *Material::lava = NULL;
+Material *Material::leaves = NULL;
+Material *Material::plant = NULL;
+Material *Material::replaceable_plant = NULL;
+Material *Material::sponge = NULL;
+Material *Material::cloth = NULL;
+Material *Material::fire = NULL;
+Material *Material::sand = NULL;
+Material *Material::decoration = NULL;
+Material *Material::clothDecoration = NULL;
+Material *Material::glass = NULL;
+Material *Material::buildable_glass = NULL;
+Material *Material::explosive = NULL;
+Material *Material::coral = NULL;
+Material *Material::ice = NULL;
+Material *Material::topSnow = NULL;
+Material *Material::snow = NULL;
+Material *Material::cactus = NULL;
+Material *Material::clay = NULL;
+Material *Material::vegetable = NULL;
+Material *Material::egg = NULL;
+Material *Material::portal = NULL;
+Material *Material::cake = NULL;
+Material *Material::piston = NULL;
+Material *Material::web = NULL;
+
+void Material::staticCtor()
+{
+ Material::air = new GasMaterial(MaterialColor::none);
+ Material::grass = new Material(MaterialColor::grass);
+ Material::dirt = new Material(MaterialColor::dirt);
+ Material::wood = (new Material(MaterialColor::wood))->flammable();
+ Material::stone = (new Material(MaterialColor::stone))->notAlwaysDestroyable();
+ Material::metal = (new Material(MaterialColor::metal))->notAlwaysDestroyable();
+ Material::heavyMetal = (new Material(MaterialColor::metal))->notAlwaysDestroyable()->notPushable();
+ Material::water = (new LiquidMaterial(MaterialColor::water))->destroyOnPush();
+ Material::lava = (new LiquidMaterial(MaterialColor::fire))->destroyOnPush();
+ Material::leaves = (new Material(MaterialColor::plant))->flammable()->neverBuildable()->destroyOnPush();
+ Material::plant = (new DecorationMaterial(MaterialColor::plant))->destroyOnPush();
+ Material::replaceable_plant = (new DecorationMaterial(MaterialColor::plant))->flammable()->destroyOnPush()->replaceable();
+ Material::sponge = new Material(MaterialColor::cloth);
+ Material::cloth = (new Material(MaterialColor::cloth))->flammable();
+ Material::fire = (new GasMaterial(MaterialColor::none))->destroyOnPush();
+ Material::sand = new Material(MaterialColor::sand);
+ Material::decoration = (new DecorationMaterial(MaterialColor::none))->destroyOnPush();
+ Material::clothDecoration = (new DecorationMaterial(MaterialColor::cloth))->flammable();
+ Material::glass = (new Material(MaterialColor::none))->neverBuildable()->makeDestroyedByHand();
+ Material::buildable_glass = (new Material(MaterialColor::none))->makeDestroyedByHand();
+ Material::explosive = (new Material(MaterialColor::fire))->flammable()->neverBuildable();
+ Material::coral = (new Material(MaterialColor::plant))->destroyOnPush();
+ Material::ice = (new Material(MaterialColor::ice))->neverBuildable()->makeDestroyedByHand();
+ Material::topSnow = (new DecorationMaterial(MaterialColor::snow))->replaceable()->neverBuildable()->notAlwaysDestroyable()->destroyOnPush();
+ Material::snow = (new Material(MaterialColor::snow))->notAlwaysDestroyable();
+ Material::cactus = (new Material(MaterialColor::plant))->neverBuildable()->destroyOnPush();
+ Material::clay = (new Material(MaterialColor::clay));
+ Material::vegetable = (new Material(MaterialColor::plant))->destroyOnPush();
+ Material::egg = ( new Material(MaterialColor::plant))->destroyOnPush();
+ Material::portal = (new PortalMaterial(MaterialColor::none))->notPushable();
+ Material::cake = (new Material(MaterialColor::none))->destroyOnPush();
+ // 4J added WebMaterial, Java version just does a local alteration when instantiating the Material for webs to get the same thing
+ Material::web = (new WebMaterial(MaterialColor::cloth))->notAlwaysDestroyable()->destroyOnPush();
+ Material::piston = (new Material(MaterialColor::stone))->notPushable();
+}
+
+Material::Material(MaterialColor *color)
+{
+ this->color = color;
+
+ // 4J Stu - Default inits
+ _flammable = false;
+ _replaceable = false;
+ _neverBuildable = false;
+ _isAlwaysDestroyable = true;
+ pushReaction = 0;
+ destroyedByHand = false;
+}
+
+bool Material::isLiquid()
+{
+ return false;
+}
+
+bool Material::letsWaterThrough()
+{
+ return (!isLiquid() && !isSolid());
+}
+
+bool Material::isSolid()
+{
+ return true;
+}
+
+bool Material::blocksLight()
+{
+ return true;
+}
+
+bool Material::blocksMotion()
+{
+ return true;
+}
+
+Material *Material::neverBuildable()
+{
+ this->_neverBuildable = true;
+ return this;
+}
+
+Material *Material::notAlwaysDestroyable()
+{
+ this->_isAlwaysDestroyable = false;
+ return this;
+}
+
+Material *Material::flammable()
+{
+ this->_flammable = true;
+ return this;
+}
+
+bool Material::isFlammable()
+{
+ return _flammable;
+}
+
+Material *Material::replaceable()
+{
+ this->_replaceable = true;
+ return this;
+}
+
+bool Material::isReplaceable()
+{
+ return _replaceable;
+}
+
+bool Material::isSolidBlocking()
+{
+ if (_neverBuildable) return false;
+ return blocksMotion();
+}
+
+bool Material::isAlwaysDestroyable()
+{
+ // these materials will always drop resources when destroyed, regardless
+ // of player's equipment
+ return _isAlwaysDestroyable;
+}
+
+int Material::getPushReaction()
+{
+ return pushReaction;
+}
+
+Material *Material::makeDestroyedByHand()
+{
+ this->destroyedByHand = true;
+ return this;
+}
+
+bool Material::isDestroyedByHand()
+{
+ return destroyedByHand;
+}
+
+Material *Material::destroyOnPush()
+{
+ pushReaction = PUSH_DESTROY;
+ return this;
+}
+
+Material *Material::notPushable()
+{
+ pushReaction = PUSH_BLOCK;
+ return this;
+} \ No newline at end of file