mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-04-05 23:13:33 +00:00
Compare commits
14 Commits
0.6.1-alph
...
378dfe8e22
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
378dfe8e22 | ||
|
|
61f0124beb | ||
|
|
ff5c57f6ba | ||
|
|
eac71a93d1 | ||
|
|
fa249728e5 | ||
|
|
84e8744387 | ||
|
|
27f0287986 | ||
|
|
109bbcfdb1 | ||
|
|
cbd81b47ce | ||
|
|
c146791845 | ||
|
|
a7c75d2ad2 | ||
|
|
468ae4a211 | ||
|
|
9405e8daad | ||
|
|
bef09a3305 |
BIN
data/images/environment/foliagecolor.png
Normal file
BIN
data/images/environment/foliagecolor.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
BIN
data/images/environment/grasscolor.png
Normal file
BIN
data/images/environment/grasscolor.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
@@ -153,6 +153,7 @@ options.group.tweaks=Tweaks
|
|||||||
options.allowSprint=Allow sprint
|
options.allowSprint=Allow sprint
|
||||||
options.barOnTop=HUD above inventory
|
options.barOnTop=HUD above inventory
|
||||||
options.rpiCursor=Show Raspberry PI cursor
|
options.rpiCursor=Show Raspberry PI cursor
|
||||||
|
options.foliageTint=Tint Grass and Leaves
|
||||||
options.autoJump=Auto Jump
|
options.autoJump=Auto Jump
|
||||||
options.thirdperson=Third Person
|
options.thirdperson=Third Person
|
||||||
options.servervisible=Server Visible
|
options.servervisible=Server Visible
|
||||||
|
|||||||
@@ -209,6 +209,8 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
|||||||
../../../src/world/level/MobSpawner.cpp \
|
../../../src/world/level/MobSpawner.cpp \
|
||||||
../../../src/world/level/Region.cpp \
|
../../../src/world/level/Region.cpp \
|
||||||
../../../src/world/level/TickNextTickData.cpp \
|
../../../src/world/level/TickNextTickData.cpp \
|
||||||
|
../../../src/world/level/FoliageColor.cpp \
|
||||||
|
../../../src/world/level/GrassColor.cpp \
|
||||||
../../../src/world/level/biome/Biome.cpp \
|
../../../src/world/level/biome/Biome.cpp \
|
||||||
../../../src/world/level/biome/BiomeSource.cpp \
|
../../../src/world/level/biome/BiomeSource.cpp \
|
||||||
../../../src/world/level/chunk/LevelChunk.cpp \
|
../../../src/world/level/chunk/LevelChunk.cpp \
|
||||||
|
|||||||
@@ -183,6 +183,8 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
|||||||
../../../src/world/level/MobSpawner.cpp \
|
../../../src/world/level/MobSpawner.cpp \
|
||||||
../../../src/world/level/Region.cpp \
|
../../../src/world/level/Region.cpp \
|
||||||
../../../src/world/level/TickNextTickData.cpp \
|
../../../src/world/level/TickNextTickData.cpp \
|
||||||
|
../../../src/world/level/FoliageColor.cpp \
|
||||||
|
../../../src/world/level/GrassColor.cpp \
|
||||||
../../../src/world/level/biome/Biome.cpp \
|
../../../src/world/level/biome/Biome.cpp \
|
||||||
../../../src/world/level/biome/BiomeSource.cpp \
|
../../../src/world/level/biome/BiomeSource.cpp \
|
||||||
../../../src/world/level/chunk/LevelChunk.cpp \
|
../../../src/world/level/chunk/LevelChunk.cpp \
|
||||||
|
|||||||
@@ -90,6 +90,7 @@
|
|||||||
#include "../network/command/CommandServer.h"
|
#include "../network/command/CommandServer.h"
|
||||||
#include "gamemode/CreatorMode.h"
|
#include "gamemode/CreatorMode.h"
|
||||||
|
|
||||||
|
#include "../world/level/GrassColor.h"
|
||||||
static void checkGlError(const char* tag) {
|
static void checkGlError(const char* tag) {
|
||||||
#ifdef GLDEBUG
|
#ifdef GLDEBUG
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -1125,12 +1126,31 @@ void Minecraft::init()
|
|||||||
textures = new Textures(&options, platform());
|
textures = new Textures(&options, platform());
|
||||||
textures->addDynamicTexture(new WaterTexture());
|
textures->addDynamicTexture(new WaterTexture());
|
||||||
textures->addDynamicTexture(new WaterSideTexture());
|
textures->addDynamicTexture(new WaterSideTexture());
|
||||||
|
textures->addDynamicTexture(new FireTexture());
|
||||||
gui.texturesLoaded(textures);
|
gui.texturesLoaded(textures);
|
||||||
|
|
||||||
levelRenderer = new LevelRenderer(this);
|
levelRenderer = new LevelRenderer(this);
|
||||||
gameRenderer = new GameRenderer(this);
|
gameRenderer = new GameRenderer(this);
|
||||||
particleEngine = new ParticleEngine(level, textures);
|
particleEngine = new ParticleEngine(level, textures);
|
||||||
|
|
||||||
|
// 4j's code for reference
|
||||||
|
// FoliageColor::init(textures->loadTexturePixels(L"misc/foliagecolor.png"));
|
||||||
|
|
||||||
|
|
||||||
|
// my code
|
||||||
|
TextureId foliageId = (textures->loadTexture("environment/foliagecolor.png")); // loading the uh png for foliage color
|
||||||
|
int* foliagePixels = textures->loadTexturePixels(foliageId, "environment/foliagecolor.png");
|
||||||
|
// now i can finally initialize foliage color, probably not the best way to handle this but i cant be arsed rn
|
||||||
|
FoliageColor::init(foliagePixels);
|
||||||
|
|
||||||
|
TextureId grassId = (textures->loadTexture("environment/grasscolor.png")); // loading the uh png for foliage color
|
||||||
|
int* grassPixels = textures->loadTexturePixels(grassId, "environment/grasscolor.png");
|
||||||
|
GrassColor::init(grassPixels);
|
||||||
|
|
||||||
|
bool tint = options.getBooleanValue(OPTIONS_FOLIAGE_TINT); // finally, toggleable foliage color
|
||||||
|
FoliageColor::setUseTint(tint);
|
||||||
|
GrassColor::setUseTint(tint);
|
||||||
|
|
||||||
// Platform specific initialization here
|
// Platform specific initialization here
|
||||||
font = new Font(&options, "font/default8.png", textures);
|
font = new Font(&options, "font/default8.png", textures);
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,8 @@ OptionBool useTouchscreen("useTouchscreen", true);
|
|||||||
|
|
||||||
OptionBool serverVisible("servervisible", true);
|
OptionBool serverVisible("servervisible", true);
|
||||||
|
|
||||||
|
OptionBool foliageTint("foliagetint", false);
|
||||||
|
|
||||||
OptionInt keyForward("key.forward", Keyboard::KEY_W);
|
OptionInt keyForward("key.forward", Keyboard::KEY_W);
|
||||||
OptionInt keyLeft("key.left", Keyboard::KEY_A);
|
OptionInt keyLeft("key.left", Keyboard::KEY_A);
|
||||||
OptionInt keyBack("key.back", Keyboard::KEY_S);
|
OptionInt keyBack("key.back", Keyboard::KEY_S);
|
||||||
@@ -136,6 +138,8 @@ void Options::initTable() {
|
|||||||
|
|
||||||
m_options[OPTIONS_USE_TOUCHSCREEN] = &useTouchscreen;
|
m_options[OPTIONS_USE_TOUCHSCREEN] = &useTouchscreen;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible;
|
m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible;
|
||||||
|
|
||||||
m_options[OPTIONS_KEY_FORWARD] = &keyForward;
|
m_options[OPTIONS_KEY_FORWARD] = &keyForward;
|
||||||
@@ -160,6 +164,7 @@ void Options::initTable() {
|
|||||||
m_options[OPTIONS_BAR_ON_TOP] = &barOnTop;
|
m_options[OPTIONS_BAR_ON_TOP] = &barOnTop;
|
||||||
m_options[OPTIONS_ALLOW_SPRINT] = &allowSprint;
|
m_options[OPTIONS_ALLOW_SPRINT] = &allowSprint;
|
||||||
m_options[OPTIONS_RPI_CURSOR] = &rpiCursor;
|
m_options[OPTIONS_RPI_CURSOR] = &rpiCursor;
|
||||||
|
m_options[OPTIONS_FOLIAGE_TINT] = &foliageTint;
|
||||||
|
|
||||||
m_options[OPTIONS_AUTOJUMP] = &autoJump;
|
m_options[OPTIONS_AUTOJUMP] = &autoJump;
|
||||||
m_options[OPTIONS_LAST_IP] = &lastIp;
|
m_options[OPTIONS_LAST_IP] = &lastIp;
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ enum OptionId {
|
|||||||
OPTIONS_LAST_IP,
|
OPTIONS_LAST_IP,
|
||||||
|
|
||||||
OPTIONS_RPI_CURSOR,
|
OPTIONS_RPI_CURSOR,
|
||||||
|
OPTIONS_FOLIAGE_TINT,
|
||||||
// Should be last!
|
// Should be last!
|
||||||
OPTIONS_COUNT
|
OPTIONS_COUNT
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,69 +1,56 @@
|
|||||||
#include "CreativeMode.h"
|
#include "CreativeMode.h"
|
||||||
#include "../Minecraft.h"
|
#include "../Minecraft.h"
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
#include "../particle/ParticleEngine.h"
|
#include "../particle/ParticleEngine.h"
|
||||||
#endif
|
#endif
|
||||||
#include "../player/LocalPlayer.h"
|
#include "../player/LocalPlayer.h"
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
#include "../renderer/LevelRenderer.h"
|
#include "../renderer/LevelRenderer.h"
|
||||||
#include "../sound/SoundEngine.h"
|
#include "../sound/SoundEngine.h"
|
||||||
#endif
|
#endif
|
||||||
#include "../../world/level/Level.h"
|
#include "../../world/level/Level.h"
|
||||||
//#include "../../network/Packet.h"
|
//#include "../../network/Packet.h"
|
||||||
#include "../../network/packet/RemoveBlockPacket.h"
|
#include "../../network/packet/RemoveBlockPacket.h"
|
||||||
#include "../../world/entity/player/Abilities.h"
|
#include "../../world/entity/player/Abilities.h"
|
||||||
|
|
||||||
static const int DestructionTickDelay = 5;
|
static const int DestructionTickDelay = 5;
|
||||||
|
|
||||||
CreativeMode::CreativeMode(Minecraft* minecraft)
|
CreativeMode::CreativeMode(Minecraft* minecraft)
|
||||||
: super(minecraft)
|
: super(minecraft)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreativeMode::startDestroyBlock(int x, int y, int z, int face) {
|
void CreativeMode::startDestroyBlock(int x, int y, int z, int face) {
|
||||||
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
creativeDestroyBlock(x, y, z, face);
|
creativeDestroyBlock(x, y, z, face);
|
||||||
destroyDelay = DestructionTickDelay;
|
destroyDelay = DestructionTickDelay;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreativeMode::creativeDestroyBlock(int x, int y, int z, int face) {
|
void CreativeMode::creativeDestroyBlock(int x, int y, int z, int face) {
|
||||||
minecraft->level->extinguishFire(x, y, z, face);
|
minecraft->level->extinguishFire(x, y, z, face);
|
||||||
destroyBlock(x, y, z, face);
|
destroyBlock(x, y, z, face);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreativeMode::continueDestroyBlock(int x, int y, int z, int face) {
|
void CreativeMode::continueDestroyBlock(int x, int y, int z, int face) {
|
||||||
destroyDelay--;
|
destroyDelay--;
|
||||||
if (destroyDelay <= 0) {
|
if (destroyDelay <= 0) {
|
||||||
destroyDelay = DestructionTickDelay;
|
destroyDelay = DestructionTickDelay;
|
||||||
creativeDestroyBlock(x, y, z, face);
|
creativeDestroyBlock(x, y, z, face);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreativeMode::stopDestroyBlock() {
|
void CreativeMode::stopDestroyBlock() {
|
||||||
destroyDelay = 0;
|
destroyDelay = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreativeMode::initAbilities( Abilities& abilities ) {
|
void CreativeMode::initAbilities( Abilities& abilities ) {
|
||||||
abilities.mayfly = true;
|
abilities.mayfly = true;
|
||||||
abilities.instabuild = true;
|
abilities.instabuild = true;
|
||||||
abilities.invulnerable = true;
|
abilities.invulnerable = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CreativeMode::isCreativeType() {
|
bool CreativeMode::isCreativeType() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreativeMode::releaseUsingItem( Player* player ) {
|
|
||||||
if(player->getCarriedItem() != NULL) {
|
|
||||||
int oldItemId = player->getCarriedItem()->id;
|
|
||||||
int oldAux = player->getAuxData();
|
|
||||||
super::releaseUsingItem(player);
|
|
||||||
if(player->getCarriedItem() != NULL && player->getCarriedItem()->id == oldItemId) {
|
|
||||||
player->getCarriedItem()->setAuxValue(oldAux);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
super::releaseUsingItem(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,27 +1,26 @@
|
|||||||
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
|
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
|
||||||
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
|
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
|
||||||
|
|
||||||
//package net.minecraft.client.gamemode;
|
//package net.minecraft.client.gamemode;
|
||||||
|
|
||||||
#include "GameMode.h"
|
#include "GameMode.h"
|
||||||
|
|
||||||
class CreativeMode: public GameMode
|
class CreativeMode: public GameMode
|
||||||
{
|
{
|
||||||
typedef GameMode super;
|
typedef GameMode super;
|
||||||
public:
|
public:
|
||||||
CreativeMode(Minecraft* minecraft);
|
CreativeMode(Minecraft* minecraft);
|
||||||
|
|
||||||
void startDestroyBlock(int x, int y, int z, int face);
|
void startDestroyBlock(int x, int y, int z, int face);
|
||||||
void continueDestroyBlock(int x, int y, int z, int face);
|
void continueDestroyBlock(int x, int y, int z, int face);
|
||||||
void stopDestroyBlock();
|
void stopDestroyBlock();
|
||||||
|
|
||||||
bool isCreativeType();
|
bool isCreativeType();
|
||||||
|
|
||||||
void initAbilities(Abilities& abilities);
|
void initAbilities(Abilities& abilities);
|
||||||
|
|
||||||
void releaseUsingItem(Player* player);
|
private:
|
||||||
private:
|
void creativeDestroyBlock(int x, int y, int z, int face);
|
||||||
void creativeDestroyBlock(int x, int y, int z, int face);
|
};
|
||||||
};
|
|
||||||
|
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__*/
|
||||||
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__*/
|
|
||||||
|
|||||||
@@ -1,115 +1,102 @@
|
|||||||
#include "CreatorMode.h"
|
#include "CreatorMode.h"
|
||||||
#include "../Minecraft.h"
|
#include "../Minecraft.h"
|
||||||
#include "../particle/ParticleEngine.h"
|
#include "../particle/ParticleEngine.h"
|
||||||
#include "../player/LocalPlayer.h"
|
#include "../player/LocalPlayer.h"
|
||||||
#include "../renderer/LevelRenderer.h"
|
#include "../renderer/LevelRenderer.h"
|
||||||
#include "../sound/SoundEngine.h"
|
#include "../sound/SoundEngine.h"
|
||||||
#include "../../world/level/Level.h"
|
#include "../../world/level/Level.h"
|
||||||
//#include "../../network/Packet.h"
|
//#include "../../network/Packet.h"
|
||||||
#include "../../network/packet/RemoveBlockPacket.h"
|
#include "../../network/packet/RemoveBlockPacket.h"
|
||||||
#include "../../world/entity/player/Abilities.h"
|
#include "../../world/entity/player/Abilities.h"
|
||||||
|
|
||||||
static const int DestructionTickDelay = 5;
|
static const int DestructionTickDelay = 5;
|
||||||
|
|
||||||
class Creator: public ICreator {
|
class Creator: public ICreator {
|
||||||
//virtual void getEvents();
|
//virtual void getEvents();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Creator(/*int eventLifeTime*/)
|
Creator(/*int eventLifeTime*/)
|
||||||
: _tileEvents(32),
|
: _tileEvents(32),
|
||||||
_tickId(0)
|
_tickId(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTick(int tick) {
|
void setTick(int tick) {
|
||||||
_tickId = tick;
|
_tickId = tick;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventList<TileEvent>& getTileEvents() { return _tileEvents; }
|
EventList<TileEvent>& getTileEvents() { return _tileEvents; }
|
||||||
|
|
||||||
void addevent_blockUse(int entityId, int x, int y, int z, int face) {
|
void addevent_blockUse(int entityId, int x, int y, int z, int face) {
|
||||||
TileEvent t = {
|
TileEvent t = {
|
||||||
entityId,
|
entityId,
|
||||||
x,y,z,
|
x,y,z,
|
||||||
face
|
face
|
||||||
};
|
};
|
||||||
_tileEvents.add(t, _tickId);
|
_tileEvents.add(t, _tickId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EventList<TileEvent> _tileEvents;
|
EventList<TileEvent> _tileEvents;
|
||||||
int _tickId;
|
int _tickId;
|
||||||
};
|
};
|
||||||
|
|
||||||
CreatorMode::CreatorMode(Minecraft* minecraft)
|
CreatorMode::CreatorMode(Minecraft* minecraft)
|
||||||
: super(minecraft)
|
: super(minecraft)
|
||||||
{
|
{
|
||||||
_creator = new Creator();
|
_creator = new Creator();
|
||||||
}
|
}
|
||||||
|
|
||||||
CreatorMode::~CreatorMode() {
|
CreatorMode::~CreatorMode() {
|
||||||
delete _creator;
|
delete _creator;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatorMode::startDestroyBlock(int x, int y, int z, int face) {
|
void CreatorMode::startDestroyBlock(int x, int y, int z, int face) {
|
||||||
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CreatorDestroyBlock(x, y, z, face);
|
CreatorDestroyBlock(x, y, z, face);
|
||||||
destroyDelay = DestructionTickDelay;
|
destroyDelay = DestructionTickDelay;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatorMode::CreatorDestroyBlock(int x, int y, int z, int face) {
|
void CreatorMode::CreatorDestroyBlock(int x, int y, int z, int face) {
|
||||||
minecraft->level->extinguishFire(x, y, z, face);
|
minecraft->level->extinguishFire(x, y, z, face);
|
||||||
destroyBlock(x, y, z, face);
|
destroyBlock(x, y, z, face);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatorMode::continueDestroyBlock(int x, int y, int z, int face) {
|
void CreatorMode::continueDestroyBlock(int x, int y, int z, int face) {
|
||||||
destroyDelay--;
|
destroyDelay--;
|
||||||
if (destroyDelay <= 0) {
|
if (destroyDelay <= 0) {
|
||||||
destroyDelay = DestructionTickDelay;
|
destroyDelay = DestructionTickDelay;
|
||||||
CreatorDestroyBlock(x, y, z, face);
|
CreatorDestroyBlock(x, y, z, face);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CreatorMode::useItemOn( Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit ) {
|
bool CreatorMode::useItemOn( Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit ) {
|
||||||
if (item && item->id == ((Item*)Item::sword_iron)->id)
|
if (item && item->id == ((Item*)Item::sword_iron)->id)
|
||||||
_creator->addevent_blockUse(player->entityId, x, y, z, face);
|
_creator->addevent_blockUse(player->entityId, x, y, z, face);
|
||||||
return super::useItemOn(player, level, item, x, y, z, face, hit);
|
return super::useItemOn(player, level, item, x, y, z, face, hit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatorMode::stopDestroyBlock() {
|
void CreatorMode::stopDestroyBlock() {
|
||||||
destroyDelay = 0;
|
destroyDelay = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatorMode::initAbilities( Abilities& abilities ) {
|
void CreatorMode::initAbilities( Abilities& abilities ) {
|
||||||
abilities.mayfly = true;
|
abilities.mayfly = true;
|
||||||
abilities.instabuild = true;
|
abilities.instabuild = true;
|
||||||
abilities.invulnerable = true;
|
abilities.invulnerable = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CreatorMode::isCreativeType() {
|
bool CreatorMode::isCreativeType() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatorMode::releaseUsingItem( Player* player ) {
|
ICreator* CreatorMode::getCreator() {
|
||||||
if(player->getCarriedItem() != NULL) {
|
return _creator;
|
||||||
int oldItemId = player->getCarriedItem()->id;
|
}
|
||||||
int oldAux = player->getAuxData();
|
|
||||||
super::releaseUsingItem(player);
|
void CreatorMode::tick() {
|
||||||
if(player->getCarriedItem() != NULL && player->getCarriedItem()->id == oldItemId) {
|
_creator->setTick(minecraft->level->getTime());
|
||||||
player->getCarriedItem()->setAuxValue(oldAux);
|
super::tick();
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
super::releaseUsingItem(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ICreator* CreatorMode::getCreator() {
|
|
||||||
return _creator;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CreatorMode::tick() {
|
|
||||||
_creator->setTick(minecraft->level->getTime());
|
|
||||||
super::tick();
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,61 +1,61 @@
|
|||||||
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
|
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
|
||||||
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
|
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
|
||||||
|
|
||||||
//package net.minecraft.client.gamemode;
|
//package net.minecraft.client.gamemode;
|
||||||
|
|
||||||
#include "GameMode.h"
|
#include "GameMode.h"
|
||||||
#include "../../world/PosTranslator.h"
|
#include "../../world/PosTranslator.h"
|
||||||
|
|
||||||
class ICreator {
|
class ICreator {
|
||||||
public:
|
public:
|
||||||
virtual ~ICreator() {}
|
virtual ~ICreator() {}
|
||||||
|
|
||||||
struct TileEvent {
|
struct TileEvent {
|
||||||
int entityId;
|
int entityId;
|
||||||
int x, y, z;
|
int x, y, z;
|
||||||
int face;
|
int face;
|
||||||
|
|
||||||
void write(std::stringstream& ss, IPosTranslator& t) const {
|
void write(std::stringstream& ss, IPosTranslator& t) const {
|
||||||
int xx = x, yy = y, zz = z;
|
int xx = x, yy = y, zz = z;
|
||||||
t.to(xx, yy, zz);
|
t.to(xx, yy, zz);
|
||||||
ss << xx << "," << yy << "," << zz << "," << face << "," << entityId;
|
ss << xx << "," << yy << "," << zz << "," << face << "," << entityId;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
class EventList {
|
class EventList {
|
||||||
public:
|
public:
|
||||||
EventList(int size) {
|
EventList(int size) {
|
||||||
_events.reserve(size);
|
_events.reserve(size);
|
||||||
_maxSize = (int)size;
|
_maxSize = (int)size;
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
void clear() {
|
void clear() {
|
||||||
_index = -1;
|
_index = -1;
|
||||||
_size = 0;
|
_size = 0;
|
||||||
}
|
}
|
||||||
void add(const T& item, int tick) {
|
void add(const T& item, int tick) {
|
||||||
if (_size < _maxSize) {
|
if (_size < _maxSize) {
|
||||||
_events.push_back(Item());
|
_events.push_back(Item());
|
||||||
++_size;
|
++_size;
|
||||||
}
|
}
|
||||||
Item& e = _events[_nextIndex()];
|
Item& e = _events[_nextIndex()];
|
||||||
e.item = item;
|
e.item = item;
|
||||||
e.timestamp = tick;
|
e.timestamp = tick;
|
||||||
}
|
}
|
||||||
int size() const {
|
int size() const {
|
||||||
return _size;
|
return _size;
|
||||||
}
|
}
|
||||||
|
|
||||||
const T& operator[](int i) const {
|
const T& operator[](int i) const {
|
||||||
return _events[_getIndex(i)].item;
|
return _events[_getIndex(i)].item;
|
||||||
}
|
}
|
||||||
|
|
||||||
T& operator[](int i) {
|
T& operator[](int i) {
|
||||||
return _events[_getIndex(i)].item;
|
return _events[_getIndex(i)].item;
|
||||||
}
|
}
|
||||||
|
|
||||||
void write(std::stringstream& ss, IPosTranslator& t, int minTimetamp) const {
|
void write(std::stringstream& ss, IPosTranslator& t, int minTimetamp) const {
|
||||||
int i = _getFirstNewerIndex(minTimetamp);
|
int i = _getFirstNewerIndex(minTimetamp);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
return;
|
return;
|
||||||
@@ -66,63 +66,62 @@ public:
|
|||||||
ss << "|";
|
ss << "|";
|
||||||
if (++i == _size) i = 0;
|
if (++i == _size) i = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int _getIndex(int i) const { return (1 + _index + i) % _size; }
|
int _getIndex(int i) const { return (1 + _index + i) % _size; }
|
||||||
int _nextIndex() {
|
int _nextIndex() {
|
||||||
if (++_index == _size) _index = 0;
|
if (++_index == _size) _index = 0;
|
||||||
return _index;
|
return _index;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _getFirstNewerIndex(int timestamp) const {
|
int _getFirstNewerIndex(int timestamp) const {
|
||||||
for (int i = _index + 1, j = 0; j < _size; ++i, ++j) {
|
for (int i = _index + 1, j = 0; j < _size; ++i, ++j) {
|
||||||
if (i == _size) i = 0;
|
if (i == _size) i = 0;
|
||||||
if (_events[i].timestamp >= timestamp) return i;
|
if (_events[i].timestamp >= timestamp) return i;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
struct Item {
|
struct Item {
|
||||||
int timestamp;
|
int timestamp;
|
||||||
T item;
|
T item;
|
||||||
};
|
};
|
||||||
|
|
||||||
int _index;
|
int _index;
|
||||||
int _size;
|
int _size;
|
||||||
int _maxSize;
|
int _maxSize;
|
||||||
std::vector<Item> _events;
|
std::vector<Item> _events;
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual EventList<TileEvent>& getTileEvents() = 0;
|
virtual EventList<TileEvent>& getTileEvents() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Creator;
|
class Creator;
|
||||||
|
|
||||||
class CreatorMode: public GameMode
|
class CreatorMode: public GameMode
|
||||||
{
|
{
|
||||||
typedef GameMode super;
|
typedef GameMode super;
|
||||||
public:
|
public:
|
||||||
CreatorMode(Minecraft* minecraft);
|
CreatorMode(Minecraft* minecraft);
|
||||||
~CreatorMode();
|
~CreatorMode();
|
||||||
|
|
||||||
void startDestroyBlock(int x, int y, int z, int face);
|
void startDestroyBlock(int x, int y, int z, int face);
|
||||||
void continueDestroyBlock(int x, int y, int z, int face);
|
void continueDestroyBlock(int x, int y, int z, int face);
|
||||||
void stopDestroyBlock();
|
void stopDestroyBlock();
|
||||||
|
|
||||||
bool useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit);
|
bool useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit);
|
||||||
|
|
||||||
void tick();
|
void tick();
|
||||||
ICreator* getCreator();
|
ICreator* getCreator();
|
||||||
|
|
||||||
bool isCreativeType();
|
bool isCreativeType();
|
||||||
|
|
||||||
void initAbilities(Abilities& abilities);
|
void initAbilities(Abilities& abilities);
|
||||||
|
|
||||||
void releaseUsingItem(Player* player);
|
private:
|
||||||
private:
|
void CreatorDestroyBlock(int x, int y, int z, int face);
|
||||||
void CreatorDestroyBlock(int x, int y, int z, int face);
|
|
||||||
|
Creator* _creator;
|
||||||
Creator* _creator;
|
};
|
||||||
};
|
|
||||||
|
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__*/
|
||||||
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__*/
|
|
||||||
|
|||||||
@@ -1,174 +1,174 @@
|
|||||||
#include "GameMode.h"
|
#include "GameMode.h"
|
||||||
#include "../Minecraft.h"
|
#include "../Minecraft.h"
|
||||||
#include "../../network/packet/UseItemPacket.h"
|
#include "../../network/packet/UseItemPacket.h"
|
||||||
#include "../../network/packet/PlayerActionPacket.h"
|
#include "../../network/packet/PlayerActionPacket.h"
|
||||||
#include "../../world/level/Level.h"
|
#include "../../world/level/Level.h"
|
||||||
#include "../../world/item/ItemInstance.h"
|
#include "../../world/item/ItemInstance.h"
|
||||||
#include "../player/LocalPlayer.h"
|
#include "../player/LocalPlayer.h"
|
||||||
#include "client/Options.h"
|
#include "client/Options.h"
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
#include "../sound/SoundEngine.h"
|
#include "../sound/SoundEngine.h"
|
||||||
#include "../particle/ParticleEngine.h"
|
#include "../particle/ParticleEngine.h"
|
||||||
#endif
|
#endif
|
||||||
#include "../../network/RakNetInstance.h"
|
#include "../../network/RakNetInstance.h"
|
||||||
#include "../../network/packet/RemoveBlockPacket.h"
|
#include "../../network/packet/RemoveBlockPacket.h"
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
#include "../renderer/LevelRenderer.h"
|
#include "../renderer/LevelRenderer.h"
|
||||||
#endif
|
#endif
|
||||||
#include "../../world/level/material/Material.h"
|
#include "../../world/level/material/Material.h"
|
||||||
|
|
||||||
GameMode::GameMode( Minecraft* minecraft)
|
GameMode::GameMode( Minecraft* minecraft)
|
||||||
: minecraft(minecraft),
|
: minecraft(minecraft),
|
||||||
destroyProgress(0),
|
destroyProgress(0),
|
||||||
oDestroyProgress(0),
|
oDestroyProgress(0),
|
||||||
destroyTicks(0),
|
destroyTicks(0),
|
||||||
destroyDelay(0)
|
destroyDelay(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*virtual*/
|
/*virtual*/
|
||||||
Player* GameMode::createPlayer(Level* level) {
|
Player* GameMode::createPlayer(Level* level) {
|
||||||
return new LocalPlayer(minecraft, level, minecraft->options.getStringValue(OPTIONS_USERNAME), level->dimension->id, isCreativeType());
|
return new LocalPlayer(minecraft, level, minecraft->options.getStringValue(OPTIONS_USERNAME), level->dimension->id, isCreativeType());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*virtual*/
|
/*virtual*/
|
||||||
void GameMode::interact(Player* player, Entity* entity) {
|
void GameMode::interact(Player* player, Entity* entity) {
|
||||||
player->interact(entity);
|
player->interact(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*virtual*/
|
/*virtual*/
|
||||||
void GameMode::attack(Player* player, Entity* entity) {
|
void GameMode::attack(Player* player, Entity* entity) {
|
||||||
if (minecraft->level->adventureSettings.noPvP && entity->isPlayer())
|
if (minecraft->level->adventureSettings.noPvP && entity->isPlayer())
|
||||||
return;
|
return;
|
||||||
if (minecraft->level->adventureSettings.noPvM && entity->isMob())
|
if (minecraft->level->adventureSettings.noPvM && entity->isMob())
|
||||||
return;
|
return;
|
||||||
player->attack(entity);
|
player->attack(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* virtual */
|
/* virtual */
|
||||||
void GameMode::startDestroyBlock( int x, int y, int z, int face ) {
|
void GameMode::startDestroyBlock( int x, int y, int z, int face ) {
|
||||||
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
||||||
return;
|
return;
|
||||||
destroyBlock(x, y, z, face);
|
destroyBlock(x, y, z, face);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*virtual*/
|
/*virtual*/
|
||||||
bool GameMode::destroyBlock(int x, int y, int z, int face) {
|
bool GameMode::destroyBlock(int x, int y, int z, int face) {
|
||||||
Level* level = minecraft->level;
|
Level* level = minecraft->level;
|
||||||
Tile* oldTile = Tile::tiles[level->getTile(x, y, z)];
|
Tile* oldTile = Tile::tiles[level->getTile(x, y, z)];
|
||||||
if (!oldTile)
|
if (!oldTile)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (level->adventureSettings.immutableWorld) {
|
if (level->adventureSettings.immutableWorld) {
|
||||||
if (oldTile != (Tile*)Tile::leaves
|
if (oldTile != (Tile*)Tile::leaves
|
||||||
&& oldTile->material != Material::plant) {
|
&& oldTile->material != Material::plant) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
minecraft->particleEngine->destroy(x, y, z);
|
minecraft->particleEngine->destroy(x, y, z);
|
||||||
#endif
|
#endif
|
||||||
int data = level->getData(x, y, z);
|
int data = level->getData(x, y, z);
|
||||||
bool changed = level->setTile(x, y, z, 0);
|
bool changed = level->setTile(x, y, z, 0);
|
||||||
if (changed) {
|
if (changed) {
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
minecraft->soundEngine->play(oldTile->soundType->getBreakSound(), x + 0.5f, y + 0.5f, z + 0.5f, (oldTile->soundType->getVolume() + 1) / 2, oldTile->soundType->getPitch() * 0.8f);
|
minecraft->soundEngine->play(oldTile->soundType->getBreakSound(), x + 0.5f, y + 0.5f, z + 0.5f, (oldTile->soundType->getVolume() + 1) / 2, oldTile->soundType->getPitch() * 0.8f);
|
||||||
#endif
|
#endif
|
||||||
oldTile->destroy(level, x, y, z, data);
|
oldTile->destroy(level, x, y, z, data);
|
||||||
if (minecraft->options.getBooleanValue(OPTIONS_DESTROY_VIBRATION)) minecraft->platform()->vibrate(24);
|
if (minecraft->options.getBooleanValue(OPTIONS_DESTROY_VIBRATION)) minecraft->platform()->vibrate(24);
|
||||||
|
|
||||||
if (minecraft->isOnline()) {
|
if (minecraft->isOnline()) {
|
||||||
RemoveBlockPacket packet(minecraft->player, x, y, z);
|
RemoveBlockPacket packet(minecraft->player, x, y, z);
|
||||||
minecraft->raknetInstance->send(packet);
|
minecraft->raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
/*virtual*/
|
/*virtual*/
|
||||||
bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit) {
|
bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit) {
|
||||||
float clickX = hit.x - x;
|
float clickX = hit.x - x;
|
||||||
float clickY = hit.y - y;
|
float clickY = hit.y - y;
|
||||||
float clickZ = hit.z - z;
|
float clickZ = hit.z - z;
|
||||||
item = player->inventory->getSelected();
|
if (level->isClientSide) {
|
||||||
if(level->isClientSide) {
|
item = player->inventory->getSelected();
|
||||||
UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ);
|
UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ);
|
||||||
minecraft->raknetInstance->send(packet);
|
minecraft->raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
int t = level->getTile(x, y, z);
|
int t = level->getTile(x, y, z);
|
||||||
if (t == Tile::invisible_bedrock->id) return false;
|
if (t == Tile::invisible_bedrock->id) return false;
|
||||||
if (t > 0 && Tile::tiles[t]->use(level, x, y, z, player))
|
if (t > 0 && Tile::tiles[t]->use(level, x, y, z, player))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (item == NULL) return false;
|
if (item == NULL) return false;
|
||||||
if(isCreativeType()) {
|
if(isCreativeType()) {
|
||||||
int aux = item->getAuxValue();
|
int aux = item->getAuxValue();
|
||||||
int count = item->count;
|
int count = item->count;
|
||||||
bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
||||||
item->setAuxValue(aux);
|
item->setAuxValue(aux);
|
||||||
item->count = count;
|
item->count = count;
|
||||||
return success;
|
return success;
|
||||||
} else {
|
} else {
|
||||||
return item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
return item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GameMode::useItem( Player* player, Level* level, ItemInstance* item ) {
|
bool GameMode::useItem( Player* player, Level* level, ItemInstance* item ) {
|
||||||
int oldCount = item->count;
|
int oldCount = item->count;
|
||||||
|
|
||||||
ItemInstance* itemInstance = item->use(level, player);
|
ItemInstance* itemInstance = item->use(level, player);
|
||||||
if(level->isClientSide) {
|
if(level->isClientSide) {
|
||||||
UseItemPacket packet(item, player->entityId, player->aimDirection);
|
UseItemPacket packet(item, player->entityId, player->aimDirection);
|
||||||
minecraft->raknetInstance->send(packet);
|
minecraft->raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
if (itemInstance != item || (itemInstance != NULL && itemInstance->count != oldCount)) {
|
if (itemInstance != item || (itemInstance != NULL && itemInstance->count != oldCount)) {
|
||||||
//player.inventory.items[player.inventory.selected] = itemInstance;
|
//player.inventory.items[player.inventory.selected] = itemInstance;
|
||||||
//if (itemInstance.count == 0) {
|
//if (itemInstance.count == 0) {
|
||||||
// player.inventory.items[player.inventory.selected] = NULL;
|
// player.inventory.items[player.inventory.selected] = NULL;
|
||||||
//}
|
//}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemInstance* GameMode::handleInventoryMouseClick( int containerId, int slotNum, int buttonNum, Player* player ) {
|
ItemInstance* GameMode::handleInventoryMouseClick( int containerId, int slotNum, int buttonNum, Player* player ) {
|
||||||
//return player.containerMenu.clicked(slotNum, buttonNum, player);
|
//return player.containerMenu.clicked(slotNum, buttonNum, player);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameMode::handleCloseInventory( int containerId, Player* player ) {
|
void GameMode::handleCloseInventory( int containerId, Player* player ) {
|
||||||
//player.containerMenu.removed(player);
|
//player.containerMenu.removed(player);
|
||||||
//player.containerMenu = player.inventoryMenu;
|
//player.containerMenu = player.inventoryMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
float GameMode::getPickRange() {
|
float GameMode::getPickRange() {
|
||||||
return 5.0f;
|
return 5.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameMode::initPlayer( Player* player ) {
|
void GameMode::initPlayer( Player* player ) {
|
||||||
initAbilities(player->abilities);
|
initAbilities(player->abilities);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameMode::releaseUsingItem(Player* player){
|
void GameMode::releaseUsingItem(Player* player){
|
||||||
if(minecraft->level->isClientSide) {
|
if (minecraft->level->isClientSide && player->isUsingItem()) {
|
||||||
PlayerActionPacket packet(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 0, player->entityId);
|
PlayerActionPacket packet(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 0, player->entityId);
|
||||||
minecraft->raknetInstance->send(packet);
|
minecraft->raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
player->releaseUsingItem();
|
player->releaseUsingItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameMode::tick() {
|
void GameMode::tick() {
|
||||||
oDestroyProgress = destroyProgress;
|
oDestroyProgress = destroyProgress;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameMode::render( float a ) {
|
void GameMode::render( float a ) {
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
if (destroyProgress <= 0) {
|
if (destroyProgress <= 0) {
|
||||||
minecraft->gui.progress = 0;
|
minecraft->gui.progress = 0;
|
||||||
minecraft->levelRenderer->destroyProgress = 0;
|
minecraft->levelRenderer->destroyProgress = 0;
|
||||||
} else {
|
} else {
|
||||||
float dp = oDestroyProgress + (destroyProgress - oDestroyProgress) * a;
|
float dp = oDestroyProgress + (destroyProgress - oDestroyProgress) * a;
|
||||||
minecraft->gui.progress = dp;
|
minecraft->gui.progress = dp;
|
||||||
minecraft->levelRenderer->destroyProgress = dp;
|
minecraft->levelRenderer->destroyProgress = dp;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ static const float kMinimumTrackingForDrag = 5;
|
|||||||
static const float kMinIndicatorLength = 34.0f / 3;
|
static const float kMinIndicatorLength = 34.0f / 3;
|
||||||
static const float PKScrollIndicatorEndSize = 3;
|
static const float PKScrollIndicatorEndSize = 3;
|
||||||
static const float PKScrollIndicatorThickness = 7.0f /3;
|
static const float PKScrollIndicatorThickness = 7.0f /3;
|
||||||
|
static const float kWheelOverscrollMax = 80.0f;
|
||||||
|
static const float kWheelOverscrollDamping = 0.6f;
|
||||||
|
static const float kWheelOverscrollRestoreAlpha = 0.18f;
|
||||||
|
|
||||||
ScrollingPane::ScrollingPane(
|
ScrollingPane::ScrollingPane(
|
||||||
int optionFlags,
|
int optionFlags,
|
||||||
@@ -70,13 +73,19 @@ ScrollingPane::ScrollingPane(
|
|||||||
}
|
}
|
||||||
//LOGI("%d, %d :: %d\n", bbox.w, itemBbox.w, this->columns);
|
//LOGI("%d, %d :: %d\n", bbox.w, itemBbox.w, this->columns);
|
||||||
|
|
||||||
rows = 1 + (numItems-1) / this->columns,
|
rows = 1 + (numItems-1) / this->columns;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (columns * itemBbox.w <= bbox.w) flags |= SF_LockX;
|
if (columns * itemBbox.w <= bbox.w) flags |= SF_LockX;
|
||||||
if (rows * itemBbox.h <= bbox.h) flags |= SF_LockY;
|
if (rows * itemBbox.h <= bbox.h) flags |= SF_LockY;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// initialize content bounds immediately
|
||||||
|
adjustContentSize();
|
||||||
|
minPoint.set((float)(this->size.w - this->adjustedContentSize.w), (float)(this->size.h - this->adjustedContentSize.h), 0);
|
||||||
|
this->snapContentOffsetToBounds(false);
|
||||||
|
|
||||||
|
|
||||||
dragDeltas.reserve(128);
|
dragDeltas.reserve(128);
|
||||||
|
|
||||||
te_moved = 0;
|
te_moved = 0;
|
||||||
@@ -114,6 +123,34 @@ void ScrollingPane::tick() {
|
|||||||
updateScrollFade(vScroll);
|
updateScrollFade(vScroll);
|
||||||
updateScrollFade(hScroll);
|
updateScrollFade(hScroll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isNotSet(SF_HardLimits) && !Mouse::isButtonDown(MouseAction::ACTION_LEFT) && !dragging && !tracking && !decelerating) {
|
||||||
|
float targetX = _contentOffset.x;
|
||||||
|
float targetY = _contentOffset.y;
|
||||||
|
bool corrected = false;
|
||||||
|
|
||||||
|
if (targetX > 0.0f) {
|
||||||
|
targetX = Mth::lerp(targetX, 0.0f, kWheelOverscrollRestoreAlpha);
|
||||||
|
corrected = true;
|
||||||
|
} else if (targetX < minPoint.x) {
|
||||||
|
targetX = Mth::lerp(targetX, minPoint.x, kWheelOverscrollRestoreAlpha);
|
||||||
|
corrected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetY > 0.0f) {
|
||||||
|
targetY = Mth::lerp(targetY, 0.0f, kWheelOverscrollRestoreAlpha);
|
||||||
|
corrected = true;
|
||||||
|
} else if (targetY < minPoint.y) {
|
||||||
|
targetY = Mth::lerp(targetY, minPoint.y, kWheelOverscrollRestoreAlpha);
|
||||||
|
corrected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (corrected) {
|
||||||
|
if (Mth::abs(targetX - _contentOffset.x) < 0.25f) targetX = (targetX > 0.0f ? 0.0f : (targetX < minPoint.x ? minPoint.x : targetX));
|
||||||
|
if (Mth::abs(targetY - _contentOffset.y) < 0.25f) targetY = (targetY > 0.0f ? 0.0f : (targetY < minPoint.y ? minPoint.y : targetY));
|
||||||
|
setContentOffset(Vec3(targetX, targetY, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ScrollingPane::getGridItemFor_slow(int itemIndex, GridItem& out) {
|
bool ScrollingPane::getGridItemFor_slow(int itemIndex, GridItem& out) {
|
||||||
@@ -549,11 +586,39 @@ void ScrollingPane::stepThroughDecelerationAnimation(bool noAnimation) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ScrollingPane::scrollBy(float dx, float dy) {
|
void ScrollingPane::scrollBy(float dx, float dy) {
|
||||||
// adjust the translation offsets fpx/fpy by the requested amount
|
// compute target content offset from wheel delta (in screen-space w/ opposite sign)
|
||||||
float nfpx = fpx + dx;
|
float targetX = _contentOffset.x - dx;
|
||||||
float nfpy = fpy + dy;
|
float targetY = _contentOffset.y - dy;
|
||||||
// convert back to content offset (fpx = -contentOffset.x)
|
|
||||||
setContentOffset(Vec3(-nfpx, -nfpy, 0));
|
if (isSet(SF_LockX)) targetX = _contentOffset.x;
|
||||||
|
if (isSet(SF_LockY)) targetY = _contentOffset.y;
|
||||||
|
|
||||||
|
if (isSet(SF_HardLimits)) {
|
||||||
|
targetX = Mth::clamp(targetX, minPoint.x, 0.0f);
|
||||||
|
targetY = Mth::clamp(targetY, minPoint.y, 0.0f);
|
||||||
|
} else {
|
||||||
|
if (targetX > 0.0f) {
|
||||||
|
float overshoot = targetX;
|
||||||
|
overshoot = Mth::Min(overshoot, kWheelOverscrollMax);
|
||||||
|
targetX = overshoot * kWheelOverscrollDamping;
|
||||||
|
} else if (targetX < minPoint.x) {
|
||||||
|
float overshoot = targetX - minPoint.x;
|
||||||
|
overshoot = Mth::Max(overshoot, -kWheelOverscrollMax);
|
||||||
|
targetX = minPoint.x + overshoot * kWheelOverscrollDamping;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetY > 0.0f) {
|
||||||
|
float overshoot = targetY;
|
||||||
|
overshoot = Mth::Min(overshoot, kWheelOverscrollMax);
|
||||||
|
targetY = overshoot * kWheelOverscrollDamping;
|
||||||
|
} else if (targetY < minPoint.y) {
|
||||||
|
float overshoot = targetY - minPoint.y;
|
||||||
|
overshoot = Mth::Max(overshoot, -kWheelOverscrollMax);
|
||||||
|
targetY = minPoint.y + overshoot * kWheelOverscrollDamping;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setContentOffset(Vec3(targetX, targetY, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScrollingPane::setContentOffset(float x, float y) {
|
void ScrollingPane::setContentOffset(float x, float y) {
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ void CreditsScreen::init() {
|
|||||||
buttons.push_back(bHeader);
|
buttons.push_back(bHeader);
|
||||||
buttons.push_back(btnBack);
|
buttons.push_back(btnBack);
|
||||||
|
|
||||||
|
// TODO: rewrite it
|
||||||
// prepare text lines
|
// prepare text lines
|
||||||
_lines.clear();
|
_lines.clear();
|
||||||
_lines.push_back("Minecraft: Pocket Edition");
|
_lines.push_back("Minecraft: Pocket Edition");
|
||||||
@@ -39,6 +40,7 @@ void CreditsScreen::init() {
|
|||||||
_lines.push_back("Kolyah35");
|
_lines.push_back("Kolyah35");
|
||||||
_lines.push_back("karson");
|
_lines.push_back("karson");
|
||||||
_lines.push_back("deepfriedwaffles");
|
_lines.push_back("deepfriedwaffles");
|
||||||
|
_lines.push_back("EpikIzCool");
|
||||||
_lines.push_back("");
|
_lines.push_back("");
|
||||||
// avoid color tags around the URL so it isn't mangled by the parser please
|
// avoid color tags around the URL so it isn't mangled by the parser please
|
||||||
_lines.push_back("Join our Discord server: https://discord.gg/c58YesBxve");
|
_lines.push_back("Join our Discord server: https://discord.gg/c58YesBxve");
|
||||||
|
|||||||
@@ -225,7 +225,8 @@ void OptionsScreen::generateOptionScreens() {
|
|||||||
|
|
||||||
optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft)
|
optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft)
|
||||||
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft)
|
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft)
|
||||||
.addOptionItem(OPTIONS_RPI_CURSOR, minecraft);
|
.addOptionItem(OPTIONS_RPI_CURSOR, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_FOLIAGE_TINT, minecraft);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsScreen::mouseClicked(int x, int y, int buttonNum) {
|
void OptionsScreen::mouseClicked(int x, int y, int buttonNum) {
|
||||||
|
|||||||
@@ -1,291 +1,293 @@
|
|||||||
#include "TouchIngameBlockSelectionScreen.h"
|
#include "TouchIngameBlockSelectionScreen.h"
|
||||||
#include "../crafting/WorkbenchScreen.h"
|
#include "../crafting/WorkbenchScreen.h"
|
||||||
#include "../../Screen.h"
|
#include "../../Screen.h"
|
||||||
#include "../../components/ImageButton.h"
|
#include "../../components/ImageButton.h"
|
||||||
#include "../../components/InventoryPane.h"
|
#include "../../components/InventoryPane.h"
|
||||||
#include "../../../gamemode/GameMode.h"
|
#include "../../../gamemode/GameMode.h"
|
||||||
#include "../../../renderer/TileRenderer.h"
|
#include "../../../renderer/TileRenderer.h"
|
||||||
#include "../../../player/LocalPlayer.h"
|
#include "../../../player/LocalPlayer.h"
|
||||||
#include "../../../renderer/gles.h"
|
#include "../../../renderer/gles.h"
|
||||||
#include "../../../renderer/entity/ItemRenderer.h"
|
#include "../../../renderer/entity/ItemRenderer.h"
|
||||||
#include "../../../renderer/Tesselator.h"
|
#include "../../../renderer/Tesselator.h"
|
||||||
#include "../../../renderer/Textures.h"
|
#include "../../../renderer/Textures.h"
|
||||||
#include "../../../Minecraft.h"
|
#include "../../../Minecraft.h"
|
||||||
#include "../../../sound/SoundEngine.h"
|
#include "../../../sound/SoundEngine.h"
|
||||||
#include "../../../../world/entity/player/Inventory.h"
|
#include "../../../../world/entity/player/Inventory.h"
|
||||||
#include "../../../../platform/input/Mouse.h"
|
#include "../../../../platform/input/Mouse.h"
|
||||||
#include "../../../../util/Mth.h"
|
#include "../../../../util/Mth.h"
|
||||||
#include "../../../../world/item/ItemInstance.h"
|
#include "../../../../world/item/ItemInstance.h"
|
||||||
#include "../../../../world/entity/player/Player.h"
|
#include "../../../../world/entity/player/Player.h"
|
||||||
#include "../../../../world/item/crafting/Recipe.h"
|
#include "../../../../world/item/crafting/Recipe.h"
|
||||||
#include "../../../player/input/touchscreen/TouchAreaModel.h"
|
#include "../../../player/input/touchscreen/TouchAreaModel.h"
|
||||||
#include "../ArmorScreen.h"
|
#include "../ArmorScreen.h"
|
||||||
|
|
||||||
namespace Touch {
|
namespace Touch {
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
static const std::string demoVersionString("Not available in the Lite version");
|
static const std::string demoVersionString("Not available in the Lite version");
|
||||||
#else
|
#else
|
||||||
static const std::string demoVersionString("Not available in the demo version");
|
static const std::string demoVersionString("Not available in the demo version");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
static const float BorderPixels = 4;
|
static const float BorderPixels = 4;
|
||||||
#ifdef DEMO_MODE
|
#ifdef DEMO_MODE
|
||||||
static const float BlockPixels = 22;
|
static const float BlockPixels = 22;
|
||||||
#else
|
#else
|
||||||
static const float BlockPixels = 22;
|
static const float BlockPixels = 22;
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
static const float BorderPixels = 4;
|
static const float BorderPixels = 4;
|
||||||
static const float BlockPixels = 24;
|
static const float BlockPixels = 24;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const int ItemSize = (int)(BlockPixels + 2*BorderPixels);
|
static const int ItemSize = (int)(BlockPixels + 2*BorderPixels);
|
||||||
|
|
||||||
static const int Bx = 10; // Border Frame width
|
static const int Bx = 10; // Border Frame width
|
||||||
static const int By = 6; // Border Frame height
|
static const int By = 6; // Border Frame height
|
||||||
|
|
||||||
//
|
//
|
||||||
// Block selection screen
|
// Block selection screen
|
||||||
//
|
//
|
||||||
IngameBlockSelectionScreen::IngameBlockSelectionScreen()
|
IngameBlockSelectionScreen::IngameBlockSelectionScreen()
|
||||||
: selectedItem(0),
|
: selectedItem(0),
|
||||||
_blockList(NULL),
|
_blockList(NULL),
|
||||||
_pendingClose(false),
|
_pendingClose(false),
|
||||||
bArmor (4, "Armor"),
|
bArmor (4, "Armor"),
|
||||||
bDone (3, ""),
|
bDone (3, ""),
|
||||||
//bDone (3, "Done"),
|
//bDone (3, "Done"),
|
||||||
bMenu (2, "Menu"),
|
bMenu (2, "Menu"),
|
||||||
bCraft (1, "Craft"),
|
bCraft (1, "Craft"),
|
||||||
bHeader (0, "Select blocks")
|
bHeader (0, "Select blocks")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
IngameBlockSelectionScreen::~IngameBlockSelectionScreen()
|
IngameBlockSelectionScreen::~IngameBlockSelectionScreen()
|
||||||
{
|
{
|
||||||
delete _blockList;
|
delete _blockList;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IngameBlockSelectionScreen::init()
|
void IngameBlockSelectionScreen::init()
|
||||||
{
|
{
|
||||||
Inventory* inventory = minecraft->player->inventory;
|
Inventory* inventory = minecraft->player->inventory;
|
||||||
|
|
||||||
//const int itemWidth = 2 * BorderPixels +
|
//const int itemWidth = 2 * BorderPixels +
|
||||||
|
|
||||||
int maxWidth = width - Bx - Bx;
|
int maxWidth = width - Bx - Bx;
|
||||||
InventoryColumns = maxWidth / ItemSize;
|
InventoryColumns = maxWidth / ItemSize;
|
||||||
const int realWidth = InventoryColumns * ItemSize;
|
const int realWidth = InventoryColumns * ItemSize;
|
||||||
const int realBx = (width - realWidth) / 2;
|
const int realBx = (width - realWidth) / 2;
|
||||||
|
|
||||||
IntRectangle rect(realBx,
|
IntRectangle rect(realBx,
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
24 + By - ((width==240)?1:0), realWidth, ((width==240)?1:0) + height-By-By-20-24);
|
24 + By - ((width==240)?1:0), realWidth, ((width==240)?1:0) + height-By-By-20-24);
|
||||||
#else
|
#else
|
||||||
24 + By, realWidth, height-By-By-20-24);
|
24 + By, realWidth, height-By-By-20-24);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_blockList = new InventoryPane(this, minecraft, rect, width, BorderPixels, inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE, ItemSize, (int)BorderPixels);
|
_blockList = new InventoryPane(this, minecraft, rect, width, BorderPixels, inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE, ItemSize, (int)BorderPixels);
|
||||||
_blockList->fillMarginX = realBx;
|
_blockList->fillMarginX = realBx;
|
||||||
|
|
||||||
//for (int i = 0; i < inventory->getContainerSize(); ++i)
|
//for (int i = 0; i < inventory->getContainerSize(); ++i)
|
||||||
//LOGI("> %d - %s\n", i, inventory->getItem(i)? inventory->getItem(i)->getDescriptionId().c_str() : "<-->\n");
|
//LOGI("> %d - %s\n", i, inventory->getItem(i)? inventory->getItem(i)->getDescriptionId().c_str() : "<-->\n");
|
||||||
|
|
||||||
InventorySize = inventory->getContainerSize();
|
// Grid indices are 0..N-1 for main inventory only; slots 0..MAX_SELECTION_SIZE-1 are hotbar links.
|
||||||
InventoryRows = 1 + (InventorySize-1) / InventoryColumns;
|
InventorySize = inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE;
|
||||||
|
InventoryRows = 1 + (InventorySize-1) / InventoryColumns;
|
||||||
//
|
|
||||||
// Buttons
|
//
|
||||||
//
|
// Buttons
|
||||||
ImageDef def;
|
//
|
||||||
def.name = "gui/spritesheet.png";
|
ImageDef def;
|
||||||
def.x = 0;
|
def.name = "gui/spritesheet.png";
|
||||||
def.y = 1;
|
def.x = 0;
|
||||||
def.width = def.height = 18;
|
def.y = 1;
|
||||||
def.setSrc(IntRectangle(60, 0, 18, 18));
|
def.width = def.height = 18;
|
||||||
bDone.setImageDef(def, true);
|
def.setSrc(IntRectangle(60, 0, 18, 18));
|
||||||
bDone.width = bDone.height = 19;
|
bDone.setImageDef(def, true);
|
||||||
|
bDone.width = bDone.height = 19;
|
||||||
bDone.scaleWhenPressed = false;
|
|
||||||
|
bDone.scaleWhenPressed = false;
|
||||||
buttons.push_back(&bHeader);
|
|
||||||
buttons.push_back(&bDone);
|
buttons.push_back(&bHeader);
|
||||||
if (!minecraft->isCreativeMode()) {
|
buttons.push_back(&bDone);
|
||||||
buttons.push_back(&bCraft);
|
if (!minecraft->isCreativeMode()) {
|
||||||
buttons.push_back(&bArmor);
|
buttons.push_back(&bCraft);
|
||||||
}
|
buttons.push_back(&bArmor);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
void IngameBlockSelectionScreen::setupPositions() {
|
|
||||||
bHeader.y = bDone.y = bCraft.y = 0;
|
void IngameBlockSelectionScreen::setupPositions() {
|
||||||
bDone.x = width - bDone.width;
|
bHeader.y = bDone.y = bCraft.y = 0;
|
||||||
bCraft.x = 0;//width - bDone.w - bCraft.w;
|
bDone.x = width - bDone.width;
|
||||||
bCraft.width = bArmor.width = 48;
|
bCraft.x = 0;//width - bDone.w - bCraft.w;
|
||||||
bArmor.x = bCraft.width;
|
bCraft.width = bArmor.width = 48;
|
||||||
|
bArmor.x = bCraft.width;
|
||||||
if (minecraft->isCreativeMode()) {
|
|
||||||
bHeader.x = 0;
|
if (minecraft->isCreativeMode()) {
|
||||||
bHeader.width = width;// - bDone.w;
|
bHeader.x = 0;
|
||||||
bHeader.xText = width/2; // Center of the screen
|
bHeader.width = width;// - bDone.w;
|
||||||
} else {
|
bHeader.xText = width/2; // Center of the screen
|
||||||
bHeader.x = bCraft.width + bArmor.width;
|
} else {
|
||||||
bHeader.width = width - bCraft.width - bArmor.width;// - bDone.w;
|
bHeader.x = bCraft.width + bArmor.width;
|
||||||
bHeader.xText = bHeader.x + (bHeader.width - bDone.width) /2;
|
bHeader.width = width - bCraft.width - bArmor.width;// - bDone.w;
|
||||||
}
|
bHeader.xText = bHeader.x + (bHeader.width - bDone.width) /2;
|
||||||
|
}
|
||||||
clippingArea.x = 0;
|
|
||||||
clippingArea.w = minecraft->width;
|
clippingArea.x = 0;
|
||||||
clippingArea.y = 0;
|
clippingArea.w = minecraft->width;
|
||||||
clippingArea.h = (int)(Gui::GuiScale * 24);
|
clippingArea.y = 0;
|
||||||
}
|
clippingArea.h = (int)(Gui::GuiScale * 24);
|
||||||
|
}
|
||||||
void IngameBlockSelectionScreen::removed()
|
|
||||||
{
|
void IngameBlockSelectionScreen::removed()
|
||||||
minecraft->gui.inventoryUpdated();
|
{
|
||||||
}
|
minecraft->gui.inventoryUpdated();
|
||||||
|
}
|
||||||
int IngameBlockSelectionScreen::getSlotPosX(int slotX) {
|
|
||||||
// @todo: Number of columns
|
int IngameBlockSelectionScreen::getSlotPosX(int slotX) {
|
||||||
return width / 2 - InventoryColumns * 10 + slotX * 20 + 2;
|
// @todo: Number of columns
|
||||||
}
|
return width / 2 - InventoryColumns * 10 + slotX * 20 + 2;
|
||||||
|
}
|
||||||
int IngameBlockSelectionScreen::getSlotPosY(int slotY) {
|
|
||||||
return height - 16 - 3 - 22 * 2 - 22 * slotY;
|
int IngameBlockSelectionScreen::getSlotPosY(int slotY) {
|
||||||
}
|
return height - 16 - 3 - 22 * 2 - 22 * slotY;
|
||||||
|
}
|
||||||
int IngameBlockSelectionScreen::getSlotHeight() {
|
|
||||||
// same as non-touch implementation
|
int IngameBlockSelectionScreen::getSlotHeight() {
|
||||||
return 22;
|
// same as non-touch implementation
|
||||||
}
|
return 22;
|
||||||
|
}
|
||||||
void IngameBlockSelectionScreen::mouseClicked(int x, int y, int buttonNum) {
|
|
||||||
_pendingClose = _blockList->_clickArea->isInside((float)x, (float)y);
|
void IngameBlockSelectionScreen::mouseClicked(int x, int y, int buttonNum) {
|
||||||
if (!_pendingClose)
|
_pendingClose = _blockList->_clickArea->isInside((float)x, (float)y);
|
||||||
super::mouseClicked(x, y, buttonNum);
|
if (!_pendingClose)
|
||||||
}
|
super::mouseClicked(x, y, buttonNum);
|
||||||
|
}
|
||||||
void IngameBlockSelectionScreen::mouseReleased(int x, int y, int buttonNum) {
|
|
||||||
if (_pendingClose && _blockList->_clickArea->isInside((float)x, (float)y))
|
void IngameBlockSelectionScreen::mouseReleased(int x, int y, int buttonNum) {
|
||||||
minecraft->setScreen(NULL);
|
if (_pendingClose && _blockList->_clickArea->isInside((float)x, (float)y))
|
||||||
else
|
minecraft->setScreen(NULL);
|
||||||
super::mouseReleased(x, y, buttonNum);
|
else
|
||||||
}
|
super::mouseReleased(x, y, buttonNum);
|
||||||
|
}
|
||||||
void IngameBlockSelectionScreen::mouseWheel(int dx, int dy, int xm, int ym)
|
|
||||||
{
|
void IngameBlockSelectionScreen::mouseWheel(int dx, int dy, int xm, int ym)
|
||||||
if (dy == 0) return;
|
{
|
||||||
if (_blockList) {
|
if (dy == 0) return;
|
||||||
float amount = -dy * getSlotHeight();
|
if (_blockList) {
|
||||||
_blockList->scrollBy(0, amount);
|
float amount = -dy * getSlotHeight();
|
||||||
}
|
_blockList->scrollBy(0, amount);
|
||||||
int cols = InventoryColumns;
|
}
|
||||||
int maxIndex = InventorySize - 1;
|
int cols = InventoryColumns;
|
||||||
int idx = selectedItem;
|
int maxIndex = InventorySize - 1;
|
||||||
if (dy > 0) {
|
int idx = selectedItem;
|
||||||
if (idx >= cols) idx -= cols;
|
if (dy > 0) {
|
||||||
} else {
|
if (idx >= cols) idx -= cols;
|
||||||
if (idx + cols <= maxIndex) idx += cols;
|
} else {
|
||||||
}
|
if (idx + cols <= maxIndex) idx += cols;
|
||||||
selectedItem = idx;
|
}
|
||||||
}
|
selectedItem = idx;
|
||||||
|
}
|
||||||
bool IngameBlockSelectionScreen::addItem(const InventoryPane* pane, int itemId)
|
|
||||||
{
|
bool IngameBlockSelectionScreen::addItem(const InventoryPane* pane, int itemId)
|
||||||
Inventory* inventory = minecraft->player->inventory;
|
{
|
||||||
itemId += Inventory::MAX_SELECTION_SIZE;
|
Inventory* inventory = minecraft->player->inventory;
|
||||||
|
itemId += Inventory::MAX_SELECTION_SIZE;
|
||||||
if (!inventory->getItem(itemId))
|
|
||||||
return false;
|
if (!inventory->getItem(itemId))
|
||||||
|
return false;
|
||||||
inventory->moveToSelectionSlot(0, itemId, true);
|
|
||||||
|
inventory->moveToSelectionSlot(0, itemId, true);
|
||||||
inventory->selectSlot(0);
|
|
||||||
#ifdef __APPLE__
|
inventory->selectSlot(0);
|
||||||
minecraft->soundEngine->playUI("random.pop", 0.3f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random()));
|
#ifdef __APPLE__
|
||||||
#else
|
minecraft->soundEngine->playUI("random.pop", 0.3f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random()));
|
||||||
minecraft->soundEngine->playUI("random.pop2", 1.0f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random()));
|
#else
|
||||||
#endif
|
minecraft->soundEngine->playUI("random.pop2", 1.0f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random()));
|
||||||
|
#endif
|
||||||
// Flash the selected gui item
|
|
||||||
minecraft->gui.flashSlot(inventory->selected);
|
// Flash the selected gui item
|
||||||
return true;
|
minecraft->gui.flashSlot(inventory->selected);
|
||||||
}
|
return true;
|
||||||
|
}
|
||||||
void IngameBlockSelectionScreen::tick()
|
|
||||||
{
|
void IngameBlockSelectionScreen::tick()
|
||||||
_blockList->tick();
|
{
|
||||||
super::tick();
|
_blockList->tick();
|
||||||
}
|
super::tick();
|
||||||
|
}
|
||||||
void IngameBlockSelectionScreen::render( int xm, int ym, float a )
|
|
||||||
{
|
void IngameBlockSelectionScreen::render( int xm, int ym, float a )
|
||||||
glDisable2(GL_DEPTH_TEST);
|
{
|
||||||
glEnable2(GL_BLEND);
|
glDisable2(GL_DEPTH_TEST);
|
||||||
|
glEnable2(GL_BLEND);
|
||||||
Screen::render(xm, ym, a);
|
|
||||||
_blockList->render(xm, ym, a);
|
Screen::render(xm, ym, a);
|
||||||
|
_blockList->render(xm, ym, a);
|
||||||
// render frame
|
|
||||||
IntRectangle& bbox = _blockList->rect;
|
// render frame
|
||||||
Tesselator::instance.colorABGR(0xffffffff);
|
IntRectangle& bbox = _blockList->rect;
|
||||||
minecraft->textures->loadAndBindTexture("gui/itemframe.png");
|
Tesselator::instance.colorABGR(0xffffffff);
|
||||||
glEnable2(GL_BLEND);
|
minecraft->textures->loadAndBindTexture("gui/itemframe.png");
|
||||||
glColor4f2(1, 1, 1, 1);
|
glEnable2(GL_BLEND);
|
||||||
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glColor4f2(1, 1, 1, 1);
|
||||||
blit(0, bbox.y-By, 0, 0, width, bbox.h+By+By, 215, 256); // why bbox.h + 1*B?
|
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
glDisable2(GL_BLEND);
|
blit(0, bbox.y-By, 0, 0, width, bbox.h+By+By, 215, 256); // why bbox.h + 1*B?
|
||||||
|
glDisable2(GL_BLEND);
|
||||||
glEnable2(GL_DEPTH_TEST);
|
|
||||||
}
|
glEnable2(GL_DEPTH_TEST);
|
||||||
|
}
|
||||||
void IngameBlockSelectionScreen::renderDemoOverlay() {
|
|
||||||
#ifdef DEMO_MODE
|
void IngameBlockSelectionScreen::renderDemoOverlay() {
|
||||||
fill( getSlotPosX(0) - 3, getSlotPosY(1) - 3,
|
#ifdef DEMO_MODE
|
||||||
getSlotPosX(9) - 3, getSlotPosY(-1) - 3, 0xa0 << 24);
|
fill( getSlotPosX(0) - 3, getSlotPosY(1) - 3,
|
||||||
|
getSlotPosX(9) - 3, getSlotPosY(-1) - 3, 0xa0 << 24);
|
||||||
const int centerX = (getSlotPosX(4) + getSlotPosX(5)) / 2;
|
|
||||||
const int centerY = (getSlotPosY(0) + getSlotPosY(1)) / 2 + 5;
|
const int centerX = (getSlotPosX(4) + getSlotPosX(5)) / 2;
|
||||||
drawCenteredString(minecraft->font, demoVersionString, centerX, centerY, 0xffffffff);
|
const int centerY = (getSlotPosY(0) + getSlotPosY(1)) / 2 + 5;
|
||||||
#endif /*DEMO_MODE*/
|
drawCenteredString(minecraft->font, demoVersionString, centerX, centerY, 0xffffffff);
|
||||||
}
|
#endif /*DEMO_MODE*/
|
||||||
|
}
|
||||||
void IngameBlockSelectionScreen::buttonClicked(Button* button) {
|
|
||||||
if (button->id == bDone.id)
|
void IngameBlockSelectionScreen::buttonClicked(Button* button) {
|
||||||
minecraft->setScreen(NULL);
|
if (button->id == bDone.id)
|
||||||
|
minecraft->setScreen(NULL);
|
||||||
if (button->id == bMenu.id)
|
|
||||||
minecraft->screenChooser.setScreen(SCREEN_PAUSE);
|
if (button->id == bMenu.id)
|
||||||
|
minecraft->screenChooser.setScreen(SCREEN_PAUSE);
|
||||||
if (button->id == bCraft.id)
|
|
||||||
minecraft->setScreen(new WorkbenchScreen(Recipe::SIZE_2X2));
|
if (button->id == bCraft.id)
|
||||||
|
minecraft->setScreen(new WorkbenchScreen(Recipe::SIZE_2X2));
|
||||||
if (button == &bArmor)
|
|
||||||
minecraft->setScreen(new ArmorScreen());
|
if (button == &bArmor)
|
||||||
}
|
minecraft->setScreen(new ArmorScreen());
|
||||||
|
}
|
||||||
bool IngameBlockSelectionScreen::isAllowed( int slot )
|
|
||||||
{
|
bool IngameBlockSelectionScreen::isAllowed( int slot )
|
||||||
if (slot < 0 || slot >= minecraft->player->inventory->getContainerSize())
|
{
|
||||||
return false;
|
const int gridCount = minecraft->player->inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE;
|
||||||
|
if (slot < 0 || slot >= gridCount)
|
||||||
#ifdef DEMO_MODE
|
return false;
|
||||||
if (slot >= (minecraft->isCreativeMode()? 28 : 27)) return false;
|
|
||||||
#endif
|
#ifdef DEMO_MODE
|
||||||
return true;
|
if (slot >= (minecraft->isCreativeMode()? 28 : 27)) return false;
|
||||||
}
|
#endif
|
||||||
|
return true;
|
||||||
bool IngameBlockSelectionScreen::hasClippingArea( IntRectangle& out )
|
}
|
||||||
{
|
|
||||||
out = clippingArea;
|
bool IngameBlockSelectionScreen::hasClippingArea( IntRectangle& out )
|
||||||
return true;
|
{
|
||||||
}
|
out = clippingArea;
|
||||||
|
return true;
|
||||||
std::vector<const ItemInstance*> IngameBlockSelectionScreen::getItems( const InventoryPane* forPane )
|
}
|
||||||
{
|
|
||||||
std::vector<const ItemInstance*> out;
|
std::vector<const ItemInstance*> IngameBlockSelectionScreen::getItems( const InventoryPane* forPane )
|
||||||
for (int i = Inventory::MAX_SELECTION_SIZE; i < minecraft->player->inventory->getContainerSize(); ++i)
|
{
|
||||||
out.push_back(minecraft->player->inventory->getItem(i));
|
std::vector<const ItemInstance*> out;
|
||||||
return out;
|
for (int i = Inventory::MAX_SELECTION_SIZE; i < minecraft->player->inventory->getContainerSize(); ++i)
|
||||||
}
|
out.push_back(minecraft->player->inventory->getItem(i));
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -388,6 +388,12 @@ void LocalPlayer::calculateFlight(float xa, float ya, float za) {
|
|||||||
ya = 0;
|
ya = 0;
|
||||||
za = za * flySpeed;
|
za = za * flySpeed;
|
||||||
|
|
||||||
|
if (sprinting) {
|
||||||
|
float sprintBoost = getWalkingSpeedModifier(); // 1.3x
|
||||||
|
xa *= sprintBoost;
|
||||||
|
za *= sprintBoost;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
if (Keyboard::isKeyDown(103)) ya = .2f * flySpeed;
|
if (Keyboard::isKeyDown(103)) ya = .2f * flySpeed;
|
||||||
if (Keyboard::isKeyDown(102)) ya = -.2f * flySpeed;
|
if (Keyboard::isKeyDown(102)) ya = -.2f * flySpeed;
|
||||||
@@ -506,7 +512,7 @@ void LocalPlayer::aiStep() {
|
|||||||
if (sprintDoubleTapTimer > 0) sprintDoubleTapTimer--;
|
if (sprintDoubleTapTimer > 0) sprintDoubleTapTimer--;
|
||||||
prevForwardHeld = forwardHeld;
|
prevForwardHeld = forwardHeld;
|
||||||
}
|
}
|
||||||
if (input->sneaking || abilities.flying)
|
if (input->sneaking)
|
||||||
sprinting = false;
|
sprinting = false;
|
||||||
|
|
||||||
if (input->sneaking) {
|
if (input->sneaking) {
|
||||||
|
|||||||
@@ -7,6 +7,10 @@
|
|||||||
#include "../../world/level/Region.h"
|
#include "../../world/level/Region.h"
|
||||||
#include "../../world/level/chunk/LevelChunk.h"
|
#include "../../world/level/chunk/LevelChunk.h"
|
||||||
#include "../../util/Mth.h"
|
#include "../../util/Mth.h"
|
||||||
|
|
||||||
|
#include "../../world/level/biome/BiomeSource.h"
|
||||||
|
|
||||||
|
#include "../../world/level/Level.h"
|
||||||
//#include "../../platform/time.h"
|
//#include "../../platform/time.h"
|
||||||
|
|
||||||
/*static*/ int Chunk::updates = 0;
|
/*static*/ int Chunk::updates = 0;
|
||||||
@@ -259,4 +263,4 @@ void Chunk::resetUpdates()
|
|||||||
{
|
{
|
||||||
updates = 0;
|
updates = 0;
|
||||||
//swRebuild.reset();
|
//swRebuild.reset();
|
||||||
}
|
}
|
||||||
@@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
#include "../../client/player/LocalPlayer.h"
|
#include "../../client/player/LocalPlayer.h"
|
||||||
|
|
||||||
|
#include "../../world/level/GrassColor.h"
|
||||||
|
|
||||||
#ifdef GFX_SMALLER_CHUNKS
|
#ifdef GFX_SMALLER_CHUNKS
|
||||||
/* static */ const int LevelRenderer::CHUNK_SIZE = 8;
|
/* static */ const int LevelRenderer::CHUNK_SIZE = 8;
|
||||||
#else
|
#else
|
||||||
@@ -143,6 +145,10 @@ void LevelRenderer::setLevel( Level* level )
|
|||||||
level->addListener(this);
|
level->addListener(this);
|
||||||
allChanged();
|
allChanged();
|
||||||
}
|
}
|
||||||
|
if (mc->options.getBooleanValue(OPTIONS_AMBIENT_OCCLUSION)) {
|
||||||
|
mc->useAmbientOcclusion = !mc->useAmbientOcclusion;
|
||||||
|
allChanged();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LevelRenderer::allChanged()
|
void LevelRenderer::allChanged()
|
||||||
@@ -155,6 +161,11 @@ void LevelRenderer::allChanged()
|
|||||||
Tile::leaves_carried->setFancy(fancy);
|
Tile::leaves_carried->setFancy(fancy);
|
||||||
lastViewDistance = mc->options.getIntValue(OPTIONS_VIEW_DISTANCE);
|
lastViewDistance = mc->options.getIntValue(OPTIONS_VIEW_DISTANCE);
|
||||||
|
|
||||||
|
bool tint = mc->options.getBooleanValue(OPTIONS_FOLIAGE_TINT);
|
||||||
|
FoliageColor::setUseTint(tint);
|
||||||
|
GrassColor::setUseTint(tint);
|
||||||
|
|
||||||
|
|
||||||
int dist = (512 >> 3) << (3 - lastViewDistance);
|
int dist = (512 >> 3) << (3 - lastViewDistance);
|
||||||
if (lastViewDistance <= 2 && mc->isPowerVR())
|
if (lastViewDistance <= 2 && mc->isPowerVR())
|
||||||
dist = (int)((float)dist * 0.8f);
|
dist = (int)((float)dist * 0.8f);
|
||||||
|
|||||||
@@ -249,6 +249,37 @@ int Textures::crispBlend( int c0, int c1 )
|
|||||||
return (a << 24) | (r << 16) | (g << 8) | b;
|
return (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// shredder here, moved the code from minecraft.cpp bcus that isnt the right place
|
||||||
|
// had to implement this because i couldn't find a similar function in the code to do this
|
||||||
|
int* Textures::loadTexturePixels(TextureId texId, const std::string& resourceName){
|
||||||
|
|
||||||
|
const TextureData* texture = getTemporaryTextureData(texId); // storing raw pixels
|
||||||
|
|
||||||
|
int size = texture->w * texture->h; // gets the size of our funny lil guy
|
||||||
|
int* pixels = new int[size]; // memory leaks be galore
|
||||||
|
unsigned char* raw = texture->data; // storing raw data into our beloved variable
|
||||||
|
for (int i = 0; i < (texture->w * texture->h); i++){
|
||||||
|
// my head hurts i hate working with this
|
||||||
|
|
||||||
|
|
||||||
|
// uh since each pixel stores r g b a, aka the color channels which are each one byte, we multiply them by 4 to move from one pixel to another
|
||||||
|
|
||||||
|
int r = raw[i * 4 + 0]; // gets us the first channel aka red
|
||||||
|
int g = raw[i * 4 + 1]; // gets us the second channel green
|
||||||
|
int b = raw[i * 4 + 2]; // gets us the third channel blue
|
||||||
|
int a = raw[i * 4 + 3]; // gets us the alpha channel
|
||||||
|
|
||||||
|
// woohoo pixels uh should have been seperated into their colors now hopefully
|
||||||
|
|
||||||
|
// r g b a
|
||||||
|
// ugh we now got to turn it into the AA RR GGBB format aak 0xAARRGGBB
|
||||||
|
// b gets 0 - 7 (8 bits), g gets 7 - 15 (8 bits), r gets 16 - 23 (8 bits), alpha gets the last ones 24 - 31 (8 bits),
|
||||||
|
pixels[i] = (a << 24) | (r << 16) | (g << 8) | (b); // shuld combine them into one 32 bit int unless i did something dumb
|
||||||
|
}
|
||||||
|
return pixels; // your meal has been prepared john colors
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///*public*/ int loadHttpTexture(std::string url, std::string backup) {
|
///*public*/ int loadHttpTexture(std::string url, std::string backup) {
|
||||||
// HttpTexture texture = httpTextures.get(url);
|
// HttpTexture texture = httpTextures.get(url);
|
||||||
// if (texture != NULL) {
|
// if (texture != NULL) {
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ public:
|
|||||||
TextureId assignTexture(const std::string& resourceName, const TextureData& img);
|
TextureId assignTexture(const std::string& resourceName, const TextureData& img);
|
||||||
const TextureData* getTemporaryTextureData(TextureId id);
|
const TextureData* getTemporaryTextureData(TextureId id);
|
||||||
|
|
||||||
|
int* loadTexturePixels(TextureId texId, const std::string& resourceName);
|
||||||
|
|
||||||
void tick(bool uploadToGraphicsCard);
|
void tick(bool uploadToGraphicsCard);
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#include "../../world/level/tile/BedTile.h"
|
#include "../../world/level/tile/BedTile.h"
|
||||||
#include "../../world/level/tile/StemTile.h"
|
#include "../../world/level/tile/StemTile.h"
|
||||||
#include "../../world/level/tile/StairTile.h"
|
#include "../../world/level/tile/StairTile.h"
|
||||||
|
#include "../../world/level/tile/FireTile.h"
|
||||||
#include "../../world/Direction.h"
|
#include "../../world/Direction.h"
|
||||||
#include "../../world/Facing.h"
|
#include "../../world/Facing.h"
|
||||||
#include "tileentity/TileEntityRenderer.h"
|
#include "tileentity/TileEntityRenderer.h"
|
||||||
@@ -157,8 +158,8 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z )
|
|||||||
return tesselateRowInWorld(tt, x, y, z);
|
return tesselateRowInWorld(tt, x, y, z);
|
||||||
} else if (shape == Tile::SHAPE_TORCH) {
|
} else if (shape == Tile::SHAPE_TORCH) {
|
||||||
return tesselateTorchInWorld(tt, x, y, z);
|
return tesselateTorchInWorld(tt, x, y, z);
|
||||||
//} else if (shape == Tile::SHAPE_FIRE) {
|
} else if (shape == Tile::SHAPE_FIRE) {
|
||||||
// return tesselateFireInWorld(tt, x, y, z);
|
return tesselateFireInWorld(tt, x, y, z);
|
||||||
//} else if (shape == Tile::SHAPE_RED_DUST) {
|
//} else if (shape == Tile::SHAPE_RED_DUST) {
|
||||||
// return tesselateDustInWorld(tt, x, y, z);
|
// return tesselateDustInWorld(tt, x, y, z);
|
||||||
} else if (shape == Tile::SHAPE_LADDER) {
|
} else if (shape == Tile::SHAPE_LADDER) {
|
||||||
@@ -222,6 +223,278 @@ bool TileRenderer::tesselateTorchInWorld( Tile* tt, int x, int y, int z )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
||||||
|
{
|
||||||
|
// @todo: fire alpha transparency seems to be scuffed, also it seems i might have messed up the second layer while porting from lce/java , need to look into it - shredder
|
||||||
|
|
||||||
|
Tesselator& t = Tesselator::instance;
|
||||||
|
|
||||||
|
int tex = tt->getTexture(0);
|
||||||
|
|
||||||
|
if (fixedTexture >= 0) tex = fixedTexture;
|
||||||
|
|
||||||
|
float br = tt->getBrightness( level, x, y, z );
|
||||||
|
t.color( br, br, br );
|
||||||
|
|
||||||
|
int xt = ((tex & 0xf) << 4);
|
||||||
|
int yt = tex & 0xf0;
|
||||||
|
|
||||||
|
float u0 = (xt) / 256.0f;
|
||||||
|
float u1 = (xt + 15.99f) / 256.0f;
|
||||||
|
float v0 = (yt) / 256.0f;
|
||||||
|
float v1 = (yt + 15.99f) / 256.0f;
|
||||||
|
float h = 1.4f;
|
||||||
|
|
||||||
|
if ( level->isSolidBlockingTile( x, y - 1, z ) || Tile::fire->canBurn( level, x, y - 1, z ) )
|
||||||
|
{
|
||||||
|
float x0 = x + 0.5f + 0.2f;
|
||||||
|
float x1 = x + 0.5f - 0.2f;
|
||||||
|
float z0 = z + 0.5f + 0.2f;
|
||||||
|
float z1 = z + 0.5f - 0.2f;
|
||||||
|
|
||||||
|
float x0_ = x + 0.5f - 0.3f;
|
||||||
|
float x1_ = x + 0.5f + 0.3f;
|
||||||
|
float z0_ = z + 0.5f - 0.3f;
|
||||||
|
float z1_ = z + 0.5f + 0.3f;
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
u0 = (xt) / 256.0f;
|
||||||
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
|
v0 = (yt) / 256.0f;
|
||||||
|
v1 = (yt + 15.99f) / 256.0f;
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
x0 = x + 0.5f - 0.5f;
|
||||||
|
x1 = x + 0.5f + 0.5f;
|
||||||
|
z0 = z + 0.5f - 0.5f;
|
||||||
|
z1 = z + 0.5f + 0.5f;
|
||||||
|
|
||||||
|
x0_ = x + 0.5f - 0.4f;
|
||||||
|
x1_ = x + 0.5f + 0.4f;
|
||||||
|
z0_ = z + 0.5f - 0.4f;
|
||||||
|
z1_ = z + 0.5f + 0.4f;
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
|
||||||
|
u0 = (xt) / 256.0f;
|
||||||
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
|
v0 = (yt) / 256.0f;
|
||||||
|
v1 = (yt + 15.99f) / 256.0f;
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float r = 0.2f;
|
||||||
|
float yo = 1 / 16.0f;
|
||||||
|
if ( ( ( x + y + z ) & 1 ) == 1 )
|
||||||
|
{
|
||||||
|
u0 = (xt) / 256.0f;
|
||||||
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
|
v0 = (yt) / 256.0f;
|
||||||
|
v1 = (yt + 15.99f) / 256.0f;
|
||||||
|
}
|
||||||
|
if ( ( ( x / 2 + y / 2 + z / 2 ) & 1 ) == 1 )
|
||||||
|
{
|
||||||
|
float tmp = u1;
|
||||||
|
u1 = u0;
|
||||||
|
u0 = tmp;
|
||||||
|
}
|
||||||
|
if ( Tile::fire->canBurn( level, x - 1, y, z ) )
|
||||||
|
{
|
||||||
|
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
}
|
||||||
|
if ( Tile::fire->canBurn( level, x + 1, y, z ) )
|
||||||
|
{
|
||||||
|
t.vertexUV( ( float )( x + 1 - r ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1 - 0 ), ( float )( y + 0 + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1 - 0 ), ( float )( y + 0 + yo ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1 - r ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x + 1.0f - r ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f - 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f - 0 ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f - r ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
}
|
||||||
|
if ( Tile::fire->canBurn( level, x, y, z - 1 ) )
|
||||||
|
{
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
r ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
r ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
r ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||||
|
0.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z +
|
||||||
|
r ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
}
|
||||||
|
if ( Tile::fire->canBurn( level, x, y, z + 1 ) )
|
||||||
|
{
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
|
||||||
|
r ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
|
||||||
|
0.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
|
||||||
|
r ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
|
||||||
|
r ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
|
||||||
|
0.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
|
||||||
|
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
|
||||||
|
r ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
}
|
||||||
|
if ( Tile::fire->canBurn( level, x, y + 1.0f, z ) )
|
||||||
|
{
|
||||||
|
double x0 = x + 0.5f + 0.5f;
|
||||||
|
double x1 = x + 0.5f - 0.5f;
|
||||||
|
double z0 = z + 0.5f + 0.5f;
|
||||||
|
double z1 = z + 0.5f - 0.5f;
|
||||||
|
|
||||||
|
double x0_ = x + 0.5f - 0.5f;
|
||||||
|
double x1_ = x + 0.5f + 0.5f;
|
||||||
|
double z0_ = z + 0.5f - 0.5f;
|
||||||
|
double z1_ = z + 0.5f + 0.5f;
|
||||||
|
|
||||||
|
u0 = (xt) / 256.0f;
|
||||||
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
|
v0 = (yt) / 256.0f;
|
||||||
|
v1 = (yt + 15.99f) / 256.0f;
|
||||||
|
|
||||||
|
y += 1;
|
||||||
|
h = -0.2f;
|
||||||
|
|
||||||
|
if ( ( ( x + y + z ) & 1 ) == 0 )
|
||||||
|
{
|
||||||
|
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z +
|
||||||
|
0 ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z +
|
||||||
|
0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z +
|
||||||
|
1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z +
|
||||||
|
1 ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
u0 = (xt) / 256.0f;
|
||||||
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
|
v0 = (yt) / 256.0f;
|
||||||
|
v1 = (yt + 15.99f) / 256.0f;
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x1 ), ( float )( y + 0.0f ), ( float )( z +
|
||||||
|
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x1 ), ( float )( y + 0.0f ), ( float )( z +
|
||||||
|
0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z +
|
||||||
|
0 ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
|
||||||
|
h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
|
||||||
|
0.0f ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
||||||
|
0.0f ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
||||||
|
h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
|
u0 = (xt) / 256.0f;
|
||||||
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
|
v0 = (yt) / 256.0f;
|
||||||
|
v1 = (yt + 15.99f) / 256.0f;
|
||||||
|
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
||||||
|
h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
||||||
|
0.0f ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
|
||||||
|
0.0f ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
|
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
|
||||||
|
h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool TileRenderer::tesselateLadderInWorld( Tile* tt, int x, int y, int z )
|
bool TileRenderer::tesselateLadderInWorld( Tile* tt, int x, int y, int z )
|
||||||
{
|
{
|
||||||
Tesselator& t = Tesselator::instance;
|
Tesselator& t = Tesselator::instance;
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ public:
|
|||||||
bool tesselateFenceGateInWorld(FenceGateTile* tt, int x, int y, int z);
|
bool tesselateFenceGateInWorld(FenceGateTile* tt, int x, int y, int z);
|
||||||
bool tesselateBedInWorld(Tile *tt, int x, int y, int z);
|
bool tesselateBedInWorld(Tile *tt, int x, int y, int z);
|
||||||
bool tesselateRowInWorld(Tile* tt, int x, int y, int z);
|
bool tesselateRowInWorld(Tile* tt, int x, int y, int z);
|
||||||
|
bool tesselateFireInWorld(Tile* tt, int x, int y, int z);
|
||||||
|
|
||||||
|
|
||||||
void tesselateTorch(Tile* tt, float x, float y, float z, float xxa, float zza);
|
void tesselateTorch(Tile* tt, float x, float y, float z, float xxa, float zza);
|
||||||
void tesselateCrossTexture(Tile* tt, int data, float x, float y, float z);
|
void tesselateCrossTexture(Tile* tt, int data, float x, float y, float z);
|
||||||
|
|||||||
@@ -206,3 +206,93 @@ void WaterSideTexture::tick() {
|
|||||||
pixels[i * 4 + 3] = a;
|
pixels[i * 4 + 3] = a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FireTexture::FireTexture()
|
||||||
|
: super(((Tile*)Tile::fire)->tex),
|
||||||
|
_tick(0),
|
||||||
|
_frame(0)
|
||||||
|
{
|
||||||
|
current = new float[16*20];
|
||||||
|
next = new float[16*20];
|
||||||
|
heat = new float[16*20];
|
||||||
|
heata = new float[16*20];
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; ++i) {
|
||||||
|
current[i] = 0;
|
||||||
|
next[i] = 0;
|
||||||
|
heat[i] = 0;
|
||||||
|
heata[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FireTexture::~FireTexture() {
|
||||||
|
delete[] current;
|
||||||
|
delete[] next;
|
||||||
|
delete[] heat;
|
||||||
|
delete[] heata;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// oh boy time to implement fire textures, i am so fucked - shredder
|
||||||
|
|
||||||
|
void FireTexture::tick() {
|
||||||
|
// loop generates fire texture on the empty texture grid, hopefully shouldnt be too taxing on older hardware - shredder
|
||||||
|
for (int x = 0; x < 16; x++) {
|
||||||
|
for (int y = 0; y < 20; y++) {
|
||||||
|
int count = 18;
|
||||||
|
float pow = this->current[x + (y + 1) % 20 * 16] * (float)(count);
|
||||||
|
for (int xx = x - 1; xx <= x + 1; xx++) {
|
||||||
|
for (int yy = y; yy <= y + 1; yy++) {
|
||||||
|
if (xx >= 0 && yy >= 0 && xx < 16 && yy < 20) {
|
||||||
|
pow += this->current[xx + yy * 16];
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this->next[x + y * 16] = pow / (float(count) * 1.06f);
|
||||||
|
if (y >= 19) {
|
||||||
|
this->next[x + y * 16] = float(Mth::random() * Mth::random() * Mth::random() * 4.0 + Mth::random() * 0.1f + 0.2f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// hopefully this doesn't cause any mysterious issues - shredder
|
||||||
|
float* tmp = next;
|
||||||
|
next = current;
|
||||||
|
current = tmp;
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++) {
|
||||||
|
float pow = this->current[i] * 1.8f;
|
||||||
|
if (pow > 1.0f) {
|
||||||
|
pow = 1.0f;
|
||||||
|
}
|
||||||
|
if (pow < 0.0f) {
|
||||||
|
pow = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int r = (int) (pow * 155.0f + 100.0f);
|
||||||
|
int g = (int)(pow * pow * 255.0f);
|
||||||
|
int b = (int)(pow * pow * pow * pow * pow * pow * pow * pow * pow * pow * 255.0f);
|
||||||
|
int a = 255;
|
||||||
|
if (pow < 0.5f) {
|
||||||
|
a = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @TODO: cant be arsed rn to implement the anaglyph3d check would be nice to check if it does - shredder
|
||||||
|
//if (this->anaglyph3d) {
|
||||||
|
// float rr = (r * 30 + g * 59 + b * 11) / 100;
|
||||||
|
// float gg = (r * 30 + g * 70) / 100;
|
||||||
|
// float bb = (r * 30 + b * 70) / 100;
|
||||||
|
// r = rr;
|
||||||
|
// g = gg;
|
||||||
|
// b = bb;
|
||||||
|
//}
|
||||||
|
|
||||||
|
pixels[i * 4 + 0] = r;
|
||||||
|
pixels[i * 4 + 1] = g;
|
||||||
|
pixels[i * 4 + 2] = b;
|
||||||
|
pixels[i * 4 + 3] = a;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -56,4 +56,21 @@ public:
|
|||||||
void tick();
|
void tick();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class FireTexture: public DynamicTexture
|
||||||
|
{
|
||||||
|
typedef DynamicTexture super;
|
||||||
|
int _tick;
|
||||||
|
int _frame;
|
||||||
|
|
||||||
|
float* current;
|
||||||
|
float* next;
|
||||||
|
float* heat;
|
||||||
|
float* heata;
|
||||||
|
|
||||||
|
public:
|
||||||
|
FireTexture();
|
||||||
|
~FireTexture();
|
||||||
|
|
||||||
|
void tick();
|
||||||
|
};
|
||||||
#endif /*NET_MINECRAFT_CLIENT_RENDERER_PTEXTURE__DynamicTexture_H__*/
|
#endif /*NET_MINECRAFT_CLIENT_RENDERER_PTEXTURE__DynamicTexture_H__*/
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public:
|
|||||||
setMaxDamage(64);
|
setMaxDamage(64);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
bool useOn(ItemInstance* instance, Player* player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ) {
|
bool useOn(ItemInstance* instance, Player* player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ) {
|
||||||
if (face == 0) y--;
|
if (face == 0) y--;
|
||||||
if (face == 1) y++;
|
if (face == 1) y++;
|
||||||
@@ -30,14 +30,14 @@ public:
|
|||||||
|
|
||||||
int targetType = level->getTile(x, y, z);
|
int targetType = level->getTile(x, y, z);
|
||||||
if (targetType == 0) {
|
if (targetType == 0) {
|
||||||
level->playSound(x + 0.5, y + 0.5, z + 0.5, "fire.ignite", 1, sharedRandom.nextFloat() * 0.4f + 0.8f);
|
level->playSound(x + 0.5, y + 0.5, z + 0.5, "fire.ignite", 1, random.nextFloat() * 0.4f + 0.8f);
|
||||||
level->setTile(x, y, z, Tile::fire->id);
|
level->setTile(x, y, z, ((Tile*)Tile::fire)->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
instance->hurt(1);
|
instance->hurt(1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*NET_MINECRAFT_WORLD_ITEM__FlintAndSteelItem_H__*/
|
#endif /*NET_MINECRAFT_WORLD_ITEM__FlintAndSteelItem_H__*/
|
||||||
|
|||||||
13
src/world/level/FoliageColor.cpp
Normal file
13
src/world/level/FoliageColor.cpp
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#include "FoliageColor.h"
|
||||||
|
|
||||||
|
// TODO: Probably move all the stuff from the header into here so it's a bit cleaner
|
||||||
|
bool FoliageColor::useTint = true;
|
||||||
|
|
||||||
|
int FoliageColor::get(float temp, float rain) {
|
||||||
|
rain *= temp;
|
||||||
|
int x = (int) ((1 - temp) * 255);
|
||||||
|
int y = (int) ((1 - rain) * 255);
|
||||||
|
return pixels[y << 8 | x];
|
||||||
|
}
|
||||||
|
|
||||||
|
int* FoliageColor::pixels = nullptr;
|
||||||
@@ -6,31 +6,49 @@
|
|||||||
class FoliageColor
|
class FoliageColor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// static void init(int[] pixels) {
|
static bool useTint;
|
||||||
// FoliageColor::pixels = pixels;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// static int get(float temp, float rain) {
|
|
||||||
// rain *= temp;
|
|
||||||
// int x = (int) ((1 - temp) * 255);
|
|
||||||
// int y = (int) ((1 - rain) * 255);
|
|
||||||
// return pixels[y << 8 | x];
|
|
||||||
// }
|
|
||||||
|
|
||||||
static int getEvergreenColor() {
|
static void setUseTint(bool value) {
|
||||||
return 0x619961;
|
useTint = value;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
Shredder here, Ive converted the unused commented out code into their correct syntax, though if i did something incorrectly feel free to take reference from the
|
||||||
|
commented out code
|
||||||
|
*/
|
||||||
|
|
||||||
static int getBirchColor() {
|
// static void init(int[] pixels) {
|
||||||
return 0x80a755;
|
// FoliageColor::pixels = pixels;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
|
// static int get(float temp, float rain) {
|
||||||
|
// rain *= temp;
|
||||||
|
// int x = (int) ((1 - temp) * 255);
|
||||||
|
// int y = (int) ((1 - rain) * 255);
|
||||||
|
// return pixels[y << 8 | x];
|
||||||
|
// }
|
||||||
|
|
||||||
static int getDefaultColor() {
|
|
||||||
return 0x48b518;
|
static void init(int* p) {
|
||||||
}
|
pixels = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int get(float temp, float rain);
|
||||||
|
|
||||||
|
static int getEvergreenColor() {
|
||||||
|
return 0x619961;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getBirchColor() {
|
||||||
|
return 0x80a755;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getDefaultColor() {
|
||||||
|
return 0xFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//static int pixels[256*256];
|
// static int pixels[256*256];
|
||||||
|
static int* pixels;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*NET_MINECRAFT_WORLD_LEVEL__FoliageColor_H__*/
|
#endif /*NET_MINECRAFT_WORLD_LEVEL__FoliageColor_H__*/
|
||||||
|
|||||||
13
src/world/level/GrassColor.cpp
Normal file
13
src/world/level/GrassColor.cpp
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#include "GrassColor.h"
|
||||||
|
|
||||||
|
// TODO: Probably move all the stuff from the header into here so it's a bit cleaner
|
||||||
|
bool GrassColor::useTint = true;
|
||||||
|
|
||||||
|
int GrassColor::get(float temp, float rain) {
|
||||||
|
rain *= temp;
|
||||||
|
int x = (int) ((1 - temp) * 255);
|
||||||
|
int y = (int) ((1 - rain) * 255);
|
||||||
|
return pixels[y << 8 | x];
|
||||||
|
}
|
||||||
|
|
||||||
|
int* GrassColor::pixels = nullptr;
|
||||||
42
src/world/level/GrassColor.h
Normal file
42
src/world/level/GrassColor.h
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
#ifndef NET_MINECRAFT_WORLD_LEVEL__GrassColor_H__
|
||||||
|
#define NET_MINECRAFT_WORLD_LEVEL__GrassColor_H__
|
||||||
|
|
||||||
|
//package net.minecraft.world.level;
|
||||||
|
|
||||||
|
class GrassColor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static bool useTint;
|
||||||
|
|
||||||
|
static void setUseTint(bool value) {
|
||||||
|
useTint = value;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Shredder here, Ive converted the unused commented out code into their correct syntax, though if i did something incorrectly feel free to take reference from the
|
||||||
|
commented out code
|
||||||
|
*/
|
||||||
|
|
||||||
|
// static void init(int[] pixels) {
|
||||||
|
// GrassColor::pixels = pixels;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// static int get(float temp, float rain) {
|
||||||
|
// rain *= temp;
|
||||||
|
// int x = (int) ((1 - temp) * 255);
|
||||||
|
// int y = (int) ((1 - rain) * 255);
|
||||||
|
// return pixels[y << 8 | x];
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
static void init(int* p) {
|
||||||
|
pixels = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int get(float temp, float rain);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// static int pixels[256*256];
|
||||||
|
static int* pixels;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /*NET_MINECRAFT_WORLD_LEVEL__GrassColor_H__*/
|
||||||
@@ -1599,8 +1599,8 @@ bool Level::containsFireTile(const AABB& box) {
|
|||||||
for (int z = z0; z < z1; z++) {
|
for (int z = z0; z < z1; z++) {
|
||||||
int t = getTile(x, y, z);
|
int t = getTile(x, y, z);
|
||||||
|
|
||||||
if (/*t == ((Tile*)(Tile::fire))->id
|
if (t == ((Tile*)(Tile::fire))->id
|
||||||
||*/ t == Tile::lava->id
|
|| t == Tile::lava->id
|
||||||
|| t == Tile::calmLava->id) {
|
|| t == Tile::calmLava->id) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,9 @@
|
|||||||
|
|
||||||
//package net.minecraft.world.level;
|
//package net.minecraft.world.level;
|
||||||
|
|
||||||
/*
|
|
||||||
class BiomeSource;
|
class BiomeSource;
|
||||||
|
/*
|
||||||
class TileEntity;
|
class TileEntity;
|
||||||
*/
|
*/
|
||||||
class Material;
|
class Material;
|
||||||
@@ -29,7 +30,7 @@ public:
|
|||||||
virtual bool isSolidRenderTile(int x, int i, int z) = 0;
|
virtual bool isSolidRenderTile(int x, int i, int z) = 0;
|
||||||
virtual bool isSolidBlockingTile(int x, int i, int z) = 0;
|
virtual bool isSolidBlockingTile(int x, int i, int z) = 0;
|
||||||
|
|
||||||
//virtual BiomeSource* getBiomeSource() = 0;
|
virtual BiomeSource* getBiomeSource() = 0;
|
||||||
virtual Biome* getBiome(int x, int z) = 0;
|
virtual Biome* getBiome(int x, int z) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "tile/Tile.h"
|
#include "tile/Tile.h"
|
||||||
#include "Level.h"
|
#include "Level.h"
|
||||||
|
|
||||||
|
|
||||||
Region::Region(Level* level, int x1, int y1, int z1, int x2, int y2, int z2) {
|
Region::Region(Level* level, int x1, int y1, int z1, int x2, int y2, int z2) {
|
||||||
this->level = level;
|
this->level = level;
|
||||||
|
|
||||||
@@ -135,6 +136,6 @@ Biome* Region::getBiome( int x, int z ) {
|
|||||||
return level->getBiome(x, z);
|
return level->getBiome(x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
//BiomeSource getBiomeSource() {
|
BiomeSource* Region::getBiomeSource() {
|
||||||
// return level.getBiomeSource();
|
return level->getBiomeSource();
|
||||||
//}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "LevelSource.h"
|
#include "LevelSource.h"
|
||||||
|
|
||||||
|
|
||||||
class Level;
|
class Level;
|
||||||
class Material;
|
class Material;
|
||||||
class LevelChunk;
|
class LevelChunk;
|
||||||
@@ -27,6 +28,7 @@ public:
|
|||||||
int getData(int x, int y, int z);
|
int getData(int x, int y, int z);
|
||||||
const Material* getMaterial(int x, int y, int z);
|
const Material* getMaterial(int x, int y, int z);
|
||||||
Biome* getBiome(int x, int z);
|
Biome* getBiome(int x, int z);
|
||||||
|
BiomeSource* getBiomeSource() override;
|
||||||
private:
|
private:
|
||||||
int xc1, zc1;
|
int xc1, zc1;
|
||||||
LevelChunk*** chunks;
|
LevelChunk*** chunks;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "../levelgen/feature/TreeFeature.h"
|
#include "../levelgen/feature/TreeFeature.h"
|
||||||
#include "../levelgen/feature/TallgrassFeature.h"
|
#include "../levelgen/feature/TallgrassFeature.h"
|
||||||
|
#include "../levelgen/feature/BasicTree.h"
|
||||||
|
|
||||||
#include "../../entity/EntityTypes.h"
|
#include "../../entity/EntityTypes.h"
|
||||||
#include "../../entity/MobCategory.h"
|
#include "../../entity/MobCategory.h"
|
||||||
@@ -140,7 +141,7 @@ void Biome::teardownBiomes() {
|
|||||||
Feature* Biome::getTreeFeature( Random* random )
|
Feature* Biome::getTreeFeature( Random* random )
|
||||||
{
|
{
|
||||||
if (random->nextInt(10) == 0) {
|
if (random->nextInt(10) == 0) {
|
||||||
//return /*new*/ BasicTree();
|
return new BasicTree(false);
|
||||||
}
|
}
|
||||||
return new TreeFeature(false);
|
return new TreeFeature(false);
|
||||||
}
|
}
|
||||||
@@ -148,6 +149,9 @@ Feature* Biome::getGrassFeature( Random* random ) {
|
|||||||
return new TallgrassFeature(Tile::tallgrass->id, TallGrass::TALL_GRASS);
|
return new TallgrassFeature(Tile::tallgrass->id, TallGrass::TALL_GRASS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Biome* Biome::getBiome( float temperature, float downfall )
|
Biome* Biome::getBiome( float temperature, float downfall )
|
||||||
{
|
{
|
||||||
int a = (int) (temperature * 63);
|
int a = (int) (temperature * 63);
|
||||||
|
|||||||
@@ -69,11 +69,11 @@ Biome* BiomeSource::getBiome( int x, int z )
|
|||||||
return getBiomeBlock(x, z, 1, 1)[0];
|
return getBiomeBlock(x, z, 1, 1)[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
//float BiomeSource::getTemperature( int x, int z )
|
float BiomeSource::getTemperature( int x, int z )
|
||||||
//{
|
{
|
||||||
// temperatures = temperatureMap->getRegion(temperatures, x, z, 1, 1, tempScale, tempScale, 0.5f);
|
temperatures = temperatureMap->getRegion(temperatures, x, z, 1, 1, tempScale, tempScale, 0.5f);
|
||||||
// return temperatures[0];
|
return temperatures[0];
|
||||||
//}
|
}
|
||||||
|
|
||||||
Biome** BiomeSource::getBiomeBlock( int x, int z, int w, int h )
|
Biome** BiomeSource::getBiomeBlock( int x, int z, int w, int h )
|
||||||
{
|
{
|
||||||
@@ -123,7 +123,7 @@ Biome** BiomeSource::getBiomeBlock( Biome** biomes__, int x, int z, int w, int h
|
|||||||
return biomes;
|
return biomes;
|
||||||
}
|
}
|
||||||
|
|
||||||
float* BiomeSource::getTemperatureBlock( /*float* temperatures__, */int x, int z, int w, int h )
|
float* BiomeSource::getTemperatureBlock( float* temperatures__, int x, int z, int w, int h )
|
||||||
{
|
{
|
||||||
//LOGI("gTempBlock: 1\n");
|
//LOGI("gTempBlock: 1\n");
|
||||||
//const int size = w * h;
|
//const int size = w * h;
|
||||||
@@ -164,8 +164,8 @@ float* BiomeSource::getTemperatureBlock( /*float* temperatures__, */int x, int z
|
|||||||
return temperatures;
|
return temperatures;
|
||||||
}
|
}
|
||||||
|
|
||||||
//float* BiomeSource::getDownfallBlock( /*float* downfalls__,*/ int x, int z, int w, int h )
|
float* BiomeSource::getDownfallBlock( float* downfalls__, int x, int z, int w, int h )
|
||||||
//{
|
{
|
||||||
// //const int size = w * h;
|
// //const int size = w * h;
|
||||||
// //if (lenDownfalls < size) {
|
// //if (lenDownfalls < size) {
|
||||||
// // delete[] downfalls;
|
// // delete[] downfalls;
|
||||||
@@ -173,6 +173,6 @@ float* BiomeSource::getTemperatureBlock( /*float* temperatures__, */int x, int z
|
|||||||
// // lenDownfalls = size;
|
// // lenDownfalls = size;
|
||||||
// //}
|
// //}
|
||||||
//
|
//
|
||||||
// downfalls = downfallMap->getRegion(downfalls, x, z, w, w, downfallScale, downfallScale, 0.5f);
|
downfalls = downfallMap->getRegion(downfalls, x, z, w, w, downfallScale, downfallScale, 0.5f);
|
||||||
// return downfalls;
|
return downfalls;
|
||||||
//}
|
}
|
||||||
|
|||||||
@@ -31,13 +31,13 @@ public:
|
|||||||
virtual Biome* getBiome(const ChunkPos& chunk);
|
virtual Biome* getBiome(const ChunkPos& chunk);
|
||||||
virtual Biome* getBiome(int x, int z);
|
virtual Biome* getBiome(int x, int z);
|
||||||
|
|
||||||
//virtual float getTemperature(int x, int z);
|
virtual float getTemperature(int x, int z);
|
||||||
|
|
||||||
// Note: The arrays returned here are temporary in the meaning that their
|
// Note: The arrays returned here are temporary in the meaning that their
|
||||||
// contents might change in the future. If you need to SAVE the
|
// contents might change in the future. If you need to SAVE the
|
||||||
// values, do a shallow copy to an array of your own.
|
// values, do a shallow copy to an array of your own.
|
||||||
virtual float* getTemperatureBlock(/*float* temperatures, */ int x, int z, int w, int h);
|
virtual float* getTemperatureBlock(float* temperatures, int x, int z, int w, int h);
|
||||||
//virtual float* getDownfallBlock(/*float* downfalls, */int x, int z, int w, int h);
|
virtual float* getDownfallBlock(float* downfalls, int x, int z, int w, int h);
|
||||||
virtual Biome** getBiomeBlock(int x, int z, int w, int h);
|
virtual Biome** getBiomeBlock(int x, int z, int w, int h);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "Biome.h"
|
#include "Biome.h"
|
||||||
#include "../levelgen/feature/TreeFeature.h"
|
#include "../levelgen/feature/TreeFeature.h"
|
||||||
#include "../levelgen/feature/BirchFeature.h"
|
#include "../levelgen/feature/BirchFeature.h"
|
||||||
|
#include "../levelgen/feature/BasicTree.h"
|
||||||
|
|
||||||
class ForestBiome: public Biome
|
class ForestBiome: public Biome
|
||||||
{
|
{
|
||||||
@@ -15,7 +16,7 @@ public:
|
|||||||
return new BirchFeature();
|
return new BirchFeature();
|
||||||
}
|
}
|
||||||
if (random->nextInt(3) == 0) {
|
if (random->nextInt(3) == 0) {
|
||||||
//return new BasicTree();
|
return new BasicTree(false);
|
||||||
}
|
}
|
||||||
return new TreeFeature(false);
|
return new TreeFeature(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,13 +6,14 @@
|
|||||||
#include "Biome.h"
|
#include "Biome.h"
|
||||||
#include "../../../util/Random.h"
|
#include "../../../util/Random.h"
|
||||||
#include "../levelgen/feature/TreeFeature.h"
|
#include "../levelgen/feature/TreeFeature.h"
|
||||||
|
#include "../levelgen/feature/BasicTree.h"
|
||||||
|
|
||||||
class RainforestBiome: public Biome
|
class RainforestBiome: public Biome
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Feature* getTreeFeature(Random* random) {
|
Feature* getTreeFeature(Random* random) {
|
||||||
if (random->nextInt(3) == 0) {
|
if (random->nextInt(3) == 0) {
|
||||||
//return new BasicTree();
|
return new BasicTree(false);
|
||||||
}
|
}
|
||||||
return new TreeFeature(false);
|
return new TreeFeature(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#if 0
|
|
||||||
|
|
||||||
#include "CanyonFeature.h"
|
#include "CanyonFeature.h"
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ void CanyonFeature::addTunnel( int xOffs, int zOffs, unsigned char* blocks, floa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CanyonFeature::addFeature( Level level, int x, int z, int xOffs, int zOffs, char* blocks )
|
void CanyonFeature::addFeature(Level* level, int x, int z, int xOffs, int zOffs,unsigned char* blocks)
|
||||||
{
|
{
|
||||||
if (random.nextInt(15) != 0) return;
|
if (random.nextInt(15) != 0) return;
|
||||||
|
|
||||||
@@ -151,6 +151,7 @@ void CanyonFeature::addFeature( Level level, int x, int z, int xOffs, int zOffs,
|
|||||||
float thickness = (random.nextFloat() * 2 + random.nextFloat()) + 1;
|
float thickness = (random.nextFloat() * 2 + random.nextFloat()) + 1;
|
||||||
|
|
||||||
addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, thickness, yRot, xRot, 0, 0, 5.0);
|
addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, thickness, yRot, xRot, 0, 0, 5.0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* //private
|
/* //private
|
||||||
@@ -165,4 +166,4 @@ void CanyonFeature::addFeature( Level level, int x, int z, int xOffs, int zOffs,
|
|||||||
for (int z = zOffs - r; z <= zOffs + r; z++) {
|
for (int z = zOffs - r; z <= zOffs + r; z++) {
|
||||||
random.setSeed((x * xScale + z * zScale) ^ level.seed);*/
|
random.setSeed((x * xScale + z * zScale) ^ level.seed);*/
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#ifndef NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__
|
#ifndef NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__
|
||||||
#define NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__
|
#define NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
//package net.minecraft.world.level.levelgen;
|
//package net.minecraft.world.level.levelgen;
|
||||||
|
|
||||||
@@ -12,8 +12,8 @@ class CanyonFeature: public LargeFeature {
|
|||||||
/*protected*/
|
/*protected*/
|
||||||
void addTunnel(int xOffs, int zOffs, unsigned char* blocks, float xCave, float yCave, float zCave, float thickness, float yRot, float xRot, int step, int dist, float yScale);
|
void addTunnel(int xOffs, int zOffs, unsigned char* blocks, float xCave, float yCave, float zCave, float thickness, float yRot, float xRot, int step, int dist, float yScale);
|
||||||
/*protected*/
|
/*protected*/
|
||||||
void addFeature(Level level, int x, int z, int xOffs, int zOffs, char* blocks);
|
void addFeature(Level* level, int x, int z, int xOffs, int zOffs,unsigned char* blocks);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif /*NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__*/
|
#endif /*NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__*/
|
||||||
|
|||||||
@@ -370,6 +370,18 @@ void RandomLevelSource::postProcess(ChunkSource* parent, int xt, int zt) {
|
|||||||
}
|
}
|
||||||
//printf("placing tree at %d, %d, %d\n", x, y, z);
|
//printf("placing tree at %d, %d, %d\n", x, y, z);
|
||||||
}
|
}
|
||||||
|
// for (int i = 0; i < forests; i++) {
|
||||||
|
// int x = xo + random.nextInt(16) + 8;
|
||||||
|
// int z = zo + random.nextInt(16) + 8;
|
||||||
|
//int y = level->getHeightmap(x, z);
|
||||||
|
// Feature* tree = biome->getBasicTreeFeature(&random);
|
||||||
|
//if (tree) {
|
||||||
|
// tree->init(1, 1, 1);
|
||||||
|
// tree->place(level, &random, x, y, z);
|
||||||
|
// delete tree;
|
||||||
|
//}
|
||||||
|
////printf("placing tree at %d, %d, %d\n", x, y, z);
|
||||||
|
// }
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
int x = xo + random.nextInt(16) + 8;
|
int x = xo + random.nextInt(16) + 8;
|
||||||
@@ -461,7 +473,7 @@ void RandomLevelSource::postProcess(ChunkSource* parent, int xt, int zt) {
|
|||||||
MobSpawner::postProcessSpawnMobs(level, biome, xo + 8, zo + 8, 16, 16, &random);
|
MobSpawner::postProcessSpawnMobs(level, biome, xo + 8, zo + 8, 16, 16, &random);
|
||||||
|
|
||||||
//LOGI("Reading temp: 1\n");
|
//LOGI("Reading temp: 1\n");
|
||||||
float* temperatures = level->getBiomeSource()->getTemperatureBlock(/*NULL,*/ xo + 8, zo + 8, 16, 16);
|
float* temperatures = level->getBiomeSource()->getTemperatureBlock(NULL, xo + 8, zo + 8, 16, 16);
|
||||||
for (int x = xo + 8; x < xo + 8 + 16; x++)
|
for (int x = xo + 8; x < xo + 8 + 16; x++)
|
||||||
for (int z = zo + 8; z < zo + 8 + 16; z++) {
|
for (int z = zo + 8; z < zo + 8 + 16; z++) {
|
||||||
int xp = x - (xo + 8);
|
int xp = x - (xo + 8);
|
||||||
|
|||||||
446
src/world/level/levelgen/feature/BasicTree.h
Normal file
446
src/world/level/levelgen/feature/BasicTree.h
Normal file
@@ -0,0 +1,446 @@
|
|||||||
|
#ifndef NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__
|
||||||
|
#define NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__
|
||||||
|
|
||||||
|
//package net.minecraft.world.level.levelgen.feature;
|
||||||
|
|
||||||
|
#include "Feature.h"
|
||||||
|
|
||||||
|
#include "../../../../util/Random.h"
|
||||||
|
#include "../../Level.h"
|
||||||
|
|
||||||
|
#include "../../tile/TreeTile.h"
|
||||||
|
|
||||||
|
class Level;
|
||||||
|
|
||||||
|
class BasicTree : public Feature
|
||||||
|
{
|
||||||
|
typedef Feature super;
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
unsigned char axisConversionArray[6];
|
||||||
|
Random *rnd;
|
||||||
|
Level *thisLevel;
|
||||||
|
int origin[3];
|
||||||
|
int height;
|
||||||
|
int trunkHeight;
|
||||||
|
double trunkHeightScale;
|
||||||
|
double branchDensity;
|
||||||
|
double branchSlope;
|
||||||
|
double widthScale;
|
||||||
|
double foliageDensity;
|
||||||
|
int trunkWidth;
|
||||||
|
int heightVariance;
|
||||||
|
int foliageHeight;
|
||||||
|
int **foliageCoords;
|
||||||
|
int foliageCoordsLength;
|
||||||
|
void prepare(){
|
||||||
|
trunkHeight = (int) (height * trunkHeightScale);
|
||||||
|
if (trunkHeight >= height) trunkHeight = height - 1;
|
||||||
|
int clustersPerY = (int) (1.382 + pow(foliageDensity * height / 13.0, 2));
|
||||||
|
if (clustersPerY < 1) clustersPerY = 1;
|
||||||
|
int **tempFoliageCoords = new int *[clustersPerY * height];
|
||||||
|
for( int i = 0; i < clustersPerY * height; i++ )
|
||||||
|
{
|
||||||
|
tempFoliageCoords[i] = new int[4];
|
||||||
|
}
|
||||||
|
int y = origin[1] + height - foliageHeight;
|
||||||
|
int clusterCount = 1;
|
||||||
|
int trunkTop = origin[1] + trunkHeight;
|
||||||
|
int relativeY = y - origin[1];
|
||||||
|
|
||||||
|
tempFoliageCoords[0][0] = origin[0];
|
||||||
|
tempFoliageCoords[0][1] = y;
|
||||||
|
tempFoliageCoords[0][2] = origin[2];
|
||||||
|
tempFoliageCoords[0][3] = trunkTop;
|
||||||
|
y--;
|
||||||
|
|
||||||
|
while (relativeY >= 0)
|
||||||
|
{
|
||||||
|
int num = 0;
|
||||||
|
|
||||||
|
float shapefac = treeShape(relativeY);
|
||||||
|
if (shapefac < 0)
|
||||||
|
{
|
||||||
|
y--;
|
||||||
|
relativeY--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double originOffset = 0.5;
|
||||||
|
while (num < clustersPerY)
|
||||||
|
{
|
||||||
|
double radius = widthScale * (shapefac * (rnd->nextFloat() + 0.328));
|
||||||
|
double angle = rnd->nextFloat() * 2.0 * 3.14159;
|
||||||
|
int x = Mth::floor(radius * sin(angle) + origin[0] + originOffset);
|
||||||
|
int z = Mth::floor(radius * cos(angle) + origin[2] + originOffset);
|
||||||
|
int checkStart[] = { x, y, z };
|
||||||
|
int checkEnd[] = { x, y + foliageHeight, z };
|
||||||
|
if (checkLine(checkStart, checkEnd) == -1) {
|
||||||
|
int checkBranchBase[] = { origin[0], origin[1], origin[2] };
|
||||||
|
double distance = sqrt(pow(abs(origin[0] - checkStart[0]), 2.0) + pow(abs(origin[2] - checkStart[2]), 2.0));
|
||||||
|
double branchHeight = distance * branchSlope;
|
||||||
|
if ((checkStart[1] - branchHeight) > trunkTop)
|
||||||
|
{
|
||||||
|
checkBranchBase[1] = trunkTop;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
checkBranchBase[1] = (int) (checkStart[1] - branchHeight);
|
||||||
|
}
|
||||||
|
if (checkLine(checkBranchBase, checkStart) == -1)
|
||||||
|
{
|
||||||
|
tempFoliageCoords[clusterCount][0] = x;
|
||||||
|
tempFoliageCoords[clusterCount][1] = y;
|
||||||
|
tempFoliageCoords[clusterCount][2] = z;
|
||||||
|
tempFoliageCoords[clusterCount][3] = checkBranchBase[1];
|
||||||
|
clusterCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
y--;
|
||||||
|
relativeY--;
|
||||||
|
}
|
||||||
|
|
||||||
|
foliageCoordsLength = clusterCount;
|
||||||
|
foliageCoords = tempFoliageCoords;
|
||||||
|
|
||||||
|
for( int i = clusterCount; i < clustersPerY * height; i++ )
|
||||||
|
{
|
||||||
|
delete [] tempFoliageCoords[i];
|
||||||
|
tempFoliageCoords[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void crossection(int x, int y, int z, float radius, unsigned char direction, int material)
|
||||||
|
{
|
||||||
|
|
||||||
|
int rad = (int) (radius + 0.618);
|
||||||
|
unsigned char secidx1 = axisConversionArray[direction];
|
||||||
|
unsigned char secidx2 = axisConversionArray[direction + 3];
|
||||||
|
int center[] = { x, y, z };
|
||||||
|
int position[] = { 0, 0, 0 };
|
||||||
|
int offset1 = -rad;
|
||||||
|
int offset2 = -rad;
|
||||||
|
int thismat;
|
||||||
|
position[direction] = center[direction];
|
||||||
|
while (offset1 <= rad)
|
||||||
|
{
|
||||||
|
position[secidx1] = center[secidx1] + offset1;
|
||||||
|
offset2 = -rad;
|
||||||
|
while (offset2 <= rad)
|
||||||
|
{
|
||||||
|
double thisdistance = pow(abs(offset1) + 0.5, 2) + pow(abs(offset2) + 0.5, 2);
|
||||||
|
if (thisdistance > radius * radius)
|
||||||
|
{
|
||||||
|
offset2++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
position[secidx2] = center[secidx2] + offset2;
|
||||||
|
|
||||||
|
thismat = thisLevel->getTile(position[0], position[1], position[2]);
|
||||||
|
|
||||||
|
if (!((thismat == 0) || (thismat == Tile::leaves->id)))
|
||||||
|
{
|
||||||
|
offset2++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
placeBlock(thisLevel, position[0], position[1], position[2], material, 0);
|
||||||
|
|
||||||
|
offset2++;
|
||||||
|
}
|
||||||
|
offset1++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
float treeShape(int y){
|
||||||
|
if (y < (((float) height) * 0.3)) return (float) -1.618;
|
||||||
|
float radius = ((float) height) / ((float) 2.0);
|
||||||
|
float adjacent = (((float) height) / ((float) 2.0)) - y;
|
||||||
|
float distance;
|
||||||
|
if (adjacent == 0) distance = radius;
|
||||||
|
else if (abs(adjacent) >= radius) distance = (float) 0.0;
|
||||||
|
else distance = (float) sqrt(pow(abs(radius), 2) - pow(abs(adjacent), 2));
|
||||||
|
distance *= (float) 0.5;
|
||||||
|
return distance;
|
||||||
|
}
|
||||||
|
float foliageShape(int y){
|
||||||
|
if ((y < 0) || (y >= foliageHeight)) return (float) -1;
|
||||||
|
else if ((y == 0) || (y == (foliageHeight - 1))) return (float) 2;
|
||||||
|
else return (float) 3;
|
||||||
|
}
|
||||||
|
void foliageCluster(int x, int y, int z){
|
||||||
|
|
||||||
|
int topy = y + foliageHeight;
|
||||||
|
int cury = topy - 1;
|
||||||
|
float radius;
|
||||||
|
while (cury >= y)
|
||||||
|
{
|
||||||
|
radius = foliageShape(cury - y);
|
||||||
|
crossection(x, cury, z, radius, (unsigned char) 1, Tile::leaves->id);
|
||||||
|
cury--;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
void limb(int *start, int *end, int material)
|
||||||
|
{
|
||||||
|
int delta[] = { 0, 0, 0 };
|
||||||
|
unsigned char idx = 0;
|
||||||
|
unsigned char primidx = 0;
|
||||||
|
while (idx < 3)
|
||||||
|
{
|
||||||
|
delta[idx] = end[idx] - start[idx];
|
||||||
|
if (abs(delta[idx]) > abs(delta[primidx]))
|
||||||
|
{
|
||||||
|
primidx = idx;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
if (delta[primidx] == 0) return;
|
||||||
|
unsigned char secidx1 = axisConversionArray[primidx];
|
||||||
|
unsigned char secidx2 = axisConversionArray[primidx + 3];
|
||||||
|
char primsign;
|
||||||
|
if (delta[primidx] > 0) primsign = 1;
|
||||||
|
else primsign = -1;
|
||||||
|
double secfac1 = ((double) delta[secidx1]) / ((double) delta[primidx]);
|
||||||
|
double secfac2 = ((double) delta[secidx2]) / ((double) delta[primidx]);
|
||||||
|
int coordinate[] = { 0, 0, 0 };
|
||||||
|
int primoffset = 0;
|
||||||
|
int endoffset = delta[primidx] + primsign;
|
||||||
|
while (primoffset != endoffset)
|
||||||
|
{
|
||||||
|
coordinate[primidx] = Mth::floor(start[primidx] + primoffset + 0.5);
|
||||||
|
coordinate[secidx1] = Mth::floor(start[secidx1] + (primoffset * secfac1) + 0.5);
|
||||||
|
coordinate[secidx2] = Mth::floor(start[secidx2] + (primoffset * secfac2) + 0.5);
|
||||||
|
|
||||||
|
int dir = 0;
|
||||||
|
int xdiff = abs(coordinate[0] - start[0]);
|
||||||
|
int zdiff = abs(coordinate[2] - start[2]);
|
||||||
|
int maxdiff = (std::max)(xdiff, zdiff);
|
||||||
|
|
||||||
|
if (maxdiff > 0)
|
||||||
|
{
|
||||||
|
if (xdiff == maxdiff)
|
||||||
|
{
|
||||||
|
dir = 0;
|
||||||
|
}
|
||||||
|
else if (zdiff == maxdiff)
|
||||||
|
{
|
||||||
|
dir = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
placeBlock(thisLevel, coordinate[0], coordinate[1], coordinate[2], material, dir);
|
||||||
|
primoffset += primsign;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void makeFoliage(){
|
||||||
|
int idx = 0;
|
||||||
|
int finish = foliageCoordsLength;
|
||||||
|
while (idx < finish)
|
||||||
|
{
|
||||||
|
int x = foliageCoords[idx][0];
|
||||||
|
int y = foliageCoords[idx][1];
|
||||||
|
int z = foliageCoords[idx][2];
|
||||||
|
foliageCluster(x, y, z);
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool trimBranches(int localY){
|
||||||
|
if (localY < (height * 0.2)) return false;
|
||||||
|
else return true;
|
||||||
|
}
|
||||||
|
void makeTrunk(){
|
||||||
|
int x = origin[0];
|
||||||
|
int startY = origin[1];
|
||||||
|
int topY = origin[1] + trunkHeight;
|
||||||
|
int z = origin[2];
|
||||||
|
int startCoord[] = { x, startY, z };
|
||||||
|
int endCoord[] = { x, topY, z };
|
||||||
|
limb(startCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
if (trunkWidth == 2)
|
||||||
|
{
|
||||||
|
startCoord[0] += 1;
|
||||||
|
endCoord[0] += 1;
|
||||||
|
limb(startCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
startCoord[2] += 1;
|
||||||
|
endCoord[2] += 1;
|
||||||
|
limb(startCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
startCoord[0] += -1;
|
||||||
|
endCoord[0] += -1;
|
||||||
|
limb(startCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void makeBranches(){
|
||||||
|
int idx = 0;
|
||||||
|
int finish = foliageCoordsLength;
|
||||||
|
int baseCoord[] = { origin[0], origin[1], origin[2] };
|
||||||
|
while (idx < finish)
|
||||||
|
{
|
||||||
|
int *coordValues = foliageCoords[idx];
|
||||||
|
int endCoord[] = { coordValues[0], coordValues[1], coordValues[2] };
|
||||||
|
baseCoord[1] = coordValues[3];
|
||||||
|
int localY = baseCoord[1] - origin[1];
|
||||||
|
if (trimBranches(localY))
|
||||||
|
{
|
||||||
|
limb(baseCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int checkLine(int *start, int *end){
|
||||||
|
|
||||||
|
int delta[] = { 0, 0, 0 };
|
||||||
|
unsigned char idx = 0;
|
||||||
|
unsigned char primidx = 0;
|
||||||
|
while (idx < 3)
|
||||||
|
{
|
||||||
|
delta[idx] = end[idx] - start[idx];
|
||||||
|
if (abs(delta[idx]) > abs(delta[primidx]))
|
||||||
|
{
|
||||||
|
primidx = idx;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
if (delta[primidx] == 0) return -1;
|
||||||
|
unsigned char secidx1 = axisConversionArray[primidx];
|
||||||
|
unsigned char secidx2 = axisConversionArray[primidx + 3];
|
||||||
|
char primsign;
|
||||||
|
if (delta[primidx] > 0) primsign = 1;
|
||||||
|
else primsign = -1;
|
||||||
|
double secfac1 = ((double) delta[secidx1]) / ((double) delta[primidx]);
|
||||||
|
double secfac2 = ((double) delta[secidx2]) / ((double) delta[primidx]);
|
||||||
|
int coordinate[] = { 0, 0, 0 };
|
||||||
|
int primoffset = 0;
|
||||||
|
int endoffset = delta[primidx] + primsign;
|
||||||
|
int thismat;
|
||||||
|
while (primoffset != endoffset)
|
||||||
|
{
|
||||||
|
coordinate[primidx] = start[primidx] + primoffset;
|
||||||
|
coordinate[secidx1] = Mth::floor(start[secidx1] + (primoffset * secfac1));
|
||||||
|
coordinate[secidx2] = Mth::floor(start[secidx2] + (primoffset * secfac2));
|
||||||
|
thismat = thisLevel->getTile(coordinate[0], coordinate[1], coordinate[2]);
|
||||||
|
if (!((thismat == 0) || (thismat == Tile::leaves->id)))
|
||||||
|
{
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
primoffset += primsign;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (primoffset == endoffset)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return abs(primoffset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool checkLocation(){
|
||||||
|
|
||||||
|
int startPosition[] = { origin[0], origin[1], origin[2] };
|
||||||
|
int endPosition[] = { origin[0], origin[1] + height - 1, origin[2] };
|
||||||
|
|
||||||
|
|
||||||
|
int baseMaterial = thisLevel->getTile(origin[0], origin[1] - 1, origin[2]);
|
||||||
|
if (!((baseMaterial == 2) || (baseMaterial == 3)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int allowedHeight = checkLine(startPosition, endPosition);
|
||||||
|
if (allowedHeight == -1)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (allowedHeight < 6)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
height = allowedHeight;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
BasicTree(bool doUpdate){
|
||||||
|
axisConversionArray[0] = 2;
|
||||||
|
axisConversionArray[1] = 0;
|
||||||
|
axisConversionArray[2] = 0;
|
||||||
|
axisConversionArray[3] = 1;
|
||||||
|
axisConversionArray[4] = 2;
|
||||||
|
axisConversionArray[5] = 1;
|
||||||
|
rnd = new Random();
|
||||||
|
origin[0] = 0;
|
||||||
|
origin[1] = 0;
|
||||||
|
origin[2] = 0;
|
||||||
|
height = 0;
|
||||||
|
trunkHeight = 0;
|
||||||
|
trunkHeightScale = 0.618;
|
||||||
|
branchDensity = 1.0;
|
||||||
|
branchSlope = 0.381;
|
||||||
|
widthScale = 1.0;
|
||||||
|
foliageDensity = 1.0;
|
||||||
|
trunkWidth = 1;
|
||||||
|
heightVariance = 12;
|
||||||
|
foliageHeight = 4;
|
||||||
|
foliageCoords = NULL;
|
||||||
|
foliageCoordsLength = 0;
|
||||||
|
}
|
||||||
|
virtual ~BasicTree(){
|
||||||
|
delete rnd;
|
||||||
|
|
||||||
|
for( int i = 0; i < foliageCoordsLength; i++ )
|
||||||
|
{
|
||||||
|
delete [] foliageCoords[i];
|
||||||
|
}
|
||||||
|
delete [] foliageCoords;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void init(double heightInit, double widthInit, double foliageDensityInit){
|
||||||
|
|
||||||
|
heightVariance = (int) (heightInit * 12);
|
||||||
|
if (heightInit > 0.5) foliageHeight = 5;
|
||||||
|
widthScale = widthInit;
|
||||||
|
foliageDensity = foliageDensityInit;
|
||||||
|
}
|
||||||
|
virtual bool place(Level *level, Random *random, int x, int y, int z){
|
||||||
|
|
||||||
|
thisLevel = level;
|
||||||
|
int seed = random->nextLong();
|
||||||
|
rnd->setSeed(seed);
|
||||||
|
origin[0] = x;
|
||||||
|
origin[1] = y;
|
||||||
|
origin[2] = z;
|
||||||
|
if (height == 0)
|
||||||
|
{
|
||||||
|
height = 5 + rnd->nextInt(heightVariance);
|
||||||
|
}
|
||||||
|
if (!(checkLocation()))
|
||||||
|
{
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
prepare();
|
||||||
|
|
||||||
|
makeFoliage();
|
||||||
|
|
||||||
|
makeTrunk();
|
||||||
|
|
||||||
|
makeBranches();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif /*NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__*/
|
||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
setFlammable(Tile::tnt->id, FLAME_MEDIUM, BURN_INSTANT);
|
setFlammable(Tile::tnt->id, FLAME_MEDIUM, BURN_INSTANT);
|
||||||
setFlammable(Tile::cloth->id, FLAME_EASY, BURN_EASY);
|
setFlammable(Tile::cloth->id, FLAME_EASY, BURN_EASY);
|
||||||
|
|
||||||
//setTicking(true); //@fire
|
setTicking(true); //@fire
|
||||||
}
|
}
|
||||||
|
|
||||||
AABB* getAABB(Level* level, int x, int y, int z) {
|
AABB* getAABB(Level* level, int x, int y, int z) {
|
||||||
@@ -70,9 +70,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void tick(Level* level, int x, int y, int z, Random* random) {
|
void tick(Level* level, int x, int y, int z, Random* random) {
|
||||||
return; //@fire
|
|
||||||
|
|
||||||
bool infiniBurn = false;//level->getTile(x, y - 1, z) == Tile::hellRock->id;
|
bool infiniBurn = level->getTile(x, y - 1, z) == Tile::netherrack->id;
|
||||||
|
|
||||||
int age = level->getData(x, y, z);
|
int age = level->getData(x, y, z);
|
||||||
if (age < 15) {
|
if (age < 15) {
|
||||||
@@ -148,7 +148,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void neighborChanged(Level* level, int x, int y, int z, int type) {
|
void neighborChanged(Level* level, int x, int y, int z, int type) {
|
||||||
return; //@fire
|
|
||||||
if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) {
|
if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) {
|
||||||
level->setTile(x, y, z, 0);
|
level->setTile(x, y, z, 0);
|
||||||
return;
|
return;
|
||||||
@@ -156,7 +155,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void onPlace(Level* level, int x, int y, int z) {
|
void onPlace(Level* level, int x, int y, int z) {
|
||||||
return; //@fire
|
|
||||||
if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) {
|
if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) {
|
||||||
level->setTile(x, y, z, 0);
|
level->setTile(x, y, z, 0);
|
||||||
return;
|
return;
|
||||||
@@ -169,7 +167,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ignite(Level* level, int x, int y, int z) {
|
void ignite(Level* level, int x, int y, int z) {
|
||||||
return; //@fire
|
|
||||||
|
|
||||||
bool lit = false;
|
bool lit = false;
|
||||||
if (!lit) lit = tryIgnite(level, x, y + 1, z);
|
if (!lit) lit = tryIgnite(level, x, y + 1, z);
|
||||||
@@ -184,11 +181,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void animateTick(Level* level, int x, int y, int z, Random* random) {
|
void animateTick(Level* level, int x, int y, int z, Random* random) {
|
||||||
return; //@fire
|
|
||||||
|
|
||||||
//if (random.nextInt(24) == 0) {
|
if (random->nextInt(24) == 0) {
|
||||||
// level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, "fire.fire", 1 + random.nextFloat(), random.nextFloat() * 0.7f + 0.3f);
|
level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, "fire.fire", 1 + random->nextFloat(), random->nextFloat() * 0.7f + 0.3f);
|
||||||
//}
|
}
|
||||||
|
|
||||||
if (level->isSolidBlockingTile(x, y - 1, z) || Tile::fire->canBurn(level, x, y - 1, z)) {
|
if (level->isSolidBlockingTile(x, y - 1, z) || Tile::fire->canBurn(level, x, y - 1, z)) {
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
@@ -248,7 +244,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void checkBurn(Level* level, int x, int y, int z, int chance, Random* random) {
|
void checkBurn(Level* level, int x, int y, int z, int chance, Random* random) {
|
||||||
return; //@fire
|
|
||||||
|
|
||||||
int odds = burnOdds[level->getTile(x, y, z)];
|
int odds = burnOdds[level->getTile(x, y, z)];
|
||||||
if (random->nextInt(chance) < odds) {
|
if (random->nextInt(chance) < odds) {
|
||||||
@@ -265,7 +260,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool isValidFireLocation(Level* level, int x, int y, int z) {
|
bool isValidFireLocation(Level* level, int x, int y, int z) {
|
||||||
return false; //@fire
|
|
||||||
|
|
||||||
if (canBurn(level, x + 1, y, z)) return true;
|
if (canBurn(level, x + 1, y, z)) return true;
|
||||||
if (canBurn(level, x - 1, y, z)) return true;
|
if (canBurn(level, x - 1, y, z)) return true;
|
||||||
@@ -278,7 +272,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int getFireOdds(Level* level, int x, int y, int z) {
|
int getFireOdds(Level* level, int x, int y, int z) {
|
||||||
return 0; //@fire
|
|
||||||
|
|
||||||
int odds = 0;
|
int odds = 0;
|
||||||
if (!level->isEmptyTile(x, y, z)) return 0;
|
if (!level->isEmptyTile(x, y, z)) return 0;
|
||||||
@@ -294,7 +287,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool tryIgnite(Level* level, int x, int y, int z) {
|
bool tryIgnite(Level* level, int x, int y, int z) {
|
||||||
return false; //@fire
|
|
||||||
|
|
||||||
int t = level->getTile(x, y, z);
|
int t = level->getTile(x, y, z);
|
||||||
if (t == Tile::fire->id) return true;
|
if (t == Tile::fire->id) return true;
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
#include "GrassTile.h"
|
#include "GrassTile.h"
|
||||||
#include "../material/Material.h"
|
#include "../material/Material.h"
|
||||||
#include "../../entity/item/ItemEntity.h"
|
#include "../../entity/item/ItemEntity.h"
|
||||||
|
#include "../GrassColor.h"
|
||||||
|
#include "../Level.h"
|
||||||
|
#include "../LevelSource.h"
|
||||||
|
#include "../biome/BiomeSource.h"
|
||||||
|
#include "../../../client/Minecraft.h"
|
||||||
|
|
||||||
GrassTile::GrassTile(int id)
|
GrassTile::GrassTile(int id)
|
||||||
: super(id, Material::dirt)
|
: super(id, Material::dirt)
|
||||||
@@ -24,11 +29,18 @@ int GrassTile::getTexture( int face, int data ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int GrassTile::getColor( LevelSource* level, int x, int y, int z ) {
|
int GrassTile::getColor( LevelSource* level, int x, int y, int z ) {
|
||||||
//level.getBiomeSource().getBiomeBlock(x, z, 1, 1);
|
|
||||||
//float temp = level.getBiomeSource().temperatures[0];
|
|
||||||
//float rain = level.getBiomeSource().downfalls[0];
|
|
||||||
|
|
||||||
return 0x339933;//GrassColor.get(temp, rain);
|
if(!GrassColor::useTint){
|
||||||
|
return 0x339933;
|
||||||
|
}
|
||||||
|
|
||||||
|
level->getBiomeSource()->getBiomeBlock(x, z, 1, 1);
|
||||||
|
float temp = level->getBiomeSource()->temperatures[0];
|
||||||
|
float rain = level->getBiomeSource()->downfalls[0];
|
||||||
|
|
||||||
|
// return 0x339933;//GrassColor.get(temp, rain); // we need to hook this up with OPTION_FOLIAGE_TINT
|
||||||
|
|
||||||
|
return GrassColor::get(temp, rain);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GrassTile::tick( Level* level, int x, int y, int z, Random* random ) {
|
void GrassTile::tick( Level* level, int x, int y, int z, Random* random ) {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class GrassTile: public Tile
|
|||||||
{
|
{
|
||||||
typedef Tile super;
|
typedef Tile super;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static const int MIN_BRIGHTNESS = 4;
|
static const int MIN_BRIGHTNESS = 4;
|
||||||
|
|
||||||
GrassTile(int id);
|
GrassTile(int id);
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
#include "../../item/Item.h"
|
#include "../../item/Item.h"
|
||||||
#include "../../item/ItemInstance.h"
|
#include "../../item/ItemInstance.h"
|
||||||
#include "../FoliageColor.h"
|
#include "../FoliageColor.h"
|
||||||
|
#include "../LevelSource.h"
|
||||||
|
#include "../biome/BiomeSource.h"
|
||||||
|
|
||||||
class Entity;
|
class Entity;
|
||||||
|
|
||||||
@@ -54,8 +56,16 @@ public:
|
|||||||
if (data == BIRCH_LEAF) {
|
if (data == BIRCH_LEAF) {
|
||||||
return FoliageColor::getBirchColor();
|
return FoliageColor::getBirchColor();
|
||||||
}
|
}
|
||||||
|
if (!FoliageColor::useTint){
|
||||||
|
return FoliageColor::getDefaultColor();
|
||||||
|
}
|
||||||
|
|
||||||
return FoliageColor::getDefaultColor();
|
// return FoliageColor::getDefaultColor(); we need to hook this up with OPTION_FOLIAGE_TINT
|
||||||
|
level->getBiomeSource()->getBiomeBlock(x, z, 1, 1);
|
||||||
|
float temperature = level->getBiomeSource()->temperatures[0];
|
||||||
|
float rainfall = level->getBiomeSource()->downfalls[0];
|
||||||
|
return FoliageColor::get(temperature, rainfall);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onRemove(Level* level, int x, int y, int z) {
|
void onRemove(Level* level, int x, int y, int z) {
|
||||||
|
|||||||
Reference in New Issue
Block a user