104 lines
3.3 KiB
C++
104 lines
3.3 KiB
C++
|
#pragma once
|
|||
|
|
|||
|
#include <cstdint>
|
|||
|
|
|||
|
namespace block {
|
|||
|
|
|||
|
// For internal use only. These are examples, we will probably need
|
|||
|
// a different way of assigning IDs in the future but a list should
|
|||
|
// be fine for now, I guess.
|
|||
|
// I don’t know how Minecraft assigns its IDs or if it even matters
|
|||
|
// given that it has used string IDs for a while now. We just need an
|
|||
|
// internal way to distinguish between classes.
|
|||
|
namespace ids {
|
|||
|
const uint16_t AIR = 0;
|
|||
|
const uint16_t STONE = 1;
|
|||
|
}
|
|||
|
|
|||
|
// These are intended to be combined using bitwise OR.
|
|||
|
namespace collisionBehavior {
|
|||
|
// Let the block handle it.
|
|||
|
// A function on the relevant block class will deal with it.
|
|||
|
const uint8_t UNKNOWN = 0b00000000;
|
|||
|
|
|||
|
// Collision box inhibits movement?
|
|||
|
// (stone or stone slab)
|
|||
|
const uint8_t SOLID = 0b00000001;
|
|||
|
|
|||
|
// Does collision box fill entire block?
|
|||
|
// (stone or grass block)
|
|||
|
//
|
|||
|
// The shape of the collision box is part of the relevant block class
|
|||
|
// when this bit is unset.
|
|||
|
const uint8_t FULL_BLOCK = 0b00000010;
|
|||
|
|
|||
|
const uint8_t SOLID_FULL_BLOCK = SOLID | FULL_BLOCK;
|
|||
|
|
|||
|
// Slow down entities when inside the block?
|
|||
|
// (vines or soulsand)
|
|||
|
//
|
|||
|
// Entities are considered to be inside a given block when rounding
|
|||
|
// their coordinates results in the coordinates of the block.
|
|||
|
//
|
|||
|
// The amount of slowdown is controlled by a function on the relevant
|
|||
|
// block class.
|
|||
|
const uint8_t SLOWDOWN = 0b00000100;
|
|||
|
|
|||
|
// Slow down entities when touching the collision box of the block?
|
|||
|
// (honey block)
|
|||
|
//
|
|||
|
// The amount of slowdown is controlled by a function on the relevant
|
|||
|
// block class.
|
|||
|
const uint8_t SURFACE_SLOWDOWN = 0b00001000;
|
|||
|
|
|||
|
// Deal damage when entities are inside it?
|
|||
|
// (berry bush)
|
|||
|
//
|
|||
|
// Entities are considered to be inside a given block when rounding
|
|||
|
// their coordinates results in the coordinates of the block.
|
|||
|
//
|
|||
|
// The amount of damage is controlled by a function on the relevant
|
|||
|
// block class.
|
|||
|
const uint8_t DAMAGE = 0b00010000;
|
|||
|
|
|||
|
// Deal damage when entities touch the collision box?
|
|||
|
// (magma block)
|
|||
|
//
|
|||
|
// The amount of damage is controlled by a function on the relevant
|
|||
|
// block class.
|
|||
|
const uint8_t SURFACE_DAMAGE = 0b00010000;
|
|||
|
|
|||
|
// Is the block bouncy?
|
|||
|
// (bed or slime block)
|
|||
|
//
|
|||
|
// The bounciness of the block is handled by the relevant block class.
|
|||
|
const uint8_t BOUNCY = 0b00100000;
|
|||
|
}
|
|||
|
|
|||
|
class Generic {
|
|||
|
private:
|
|||
|
public:
|
|||
|
virtual uint16_t id() = 0;
|
|||
|
virtual uint8_t collisionBehavior() = 0;
|
|||
|
|
|||
|
//TODO: (not pure) virtual functions for collision box, slowdown, damage, bounciness, etc.
|
|||
|
|
|||
|
//TODO: (not pure) virtual function for hitbox (defaults to full block)
|
|||
|
}
|
|||
|
|
|||
|
class Air {
|
|||
|
public:
|
|||
|
uint16_t id() {
|
|||
|
return ids::AIR;
|
|||
|
}
|
|||
|
uint8_t collisionBehavior() {
|
|||
|
// is a full block but doesn't collide or anything else
|
|||
|
return collisionBehavior::FULL_BLOCK;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
BlockGeneric* getNewBlockFromID(uint16_t id) {
|
|||
|
//TODO
|
|||
|
}
|
|||
|
}
|