Added GUI Styles with 3 options: Java, Pi/Xperia and Pocket Hopefully fixed touch input eating and breaking blocks bug Fire should render on all mobs now Fixed only one side of the first person burning animation being animated Added Window Scaling Option for PC Users (Hasn't been tested on other platforms Render Distance is now configurable from the settings menu Tried to fix shadows again on IOS and Android, hopefully works? Block Outline Selection now has a thicker outline for better visibility
354 lines
9.5 KiB
C++
Executable File
354 lines
9.5 KiB
C++
Executable File
#include "IngameBlockSelectionScreen.h"
|
|
#include "../../renderer/TileRenderer.h"
|
|
#include "../../renderer/Lighting.h"
|
|
#include "../../player/LocalPlayer.h"
|
|
#include "../../renderer/gles.h"
|
|
#include "../../Minecraft.h"
|
|
#include "../../sound/SoundEngine.h"
|
|
#include "../../../world/entity/player/Inventory.h"
|
|
#include "../../../platform/input/Mouse.h"
|
|
|
|
#include "../Gui.h"
|
|
#include "../../renderer/Textures.h"
|
|
#include "../../gamemode/GameMode.h"
|
|
#include "ArmorScreen.h"
|
|
#include "crafting/WorkbenchScreen.h"
|
|
#include "../components/Button.h"
|
|
|
|
#if defined(__APPLE__)
|
|
static const std::string demoVersionString("Not available in the Lite version");
|
|
#else
|
|
static const std::string demoVersionString("Not available in the demo version");
|
|
#endif
|
|
|
|
IngameBlockSelectionScreen::IngameBlockSelectionScreen()
|
|
: selectedItem(0),
|
|
_area(0,0,0,0),
|
|
_pendingQuit(false),
|
|
InventoryRows(1),
|
|
InventoryCols(1),
|
|
InventorySize(1),
|
|
bArmor(1, "Armor"),
|
|
bCrafting(1, "Crafting")
|
|
{
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::init()
|
|
{
|
|
Inventory* inventory = minecraft->player->inventory;
|
|
InventoryCols = minecraft->isCreativeMode()? 13 : 9;
|
|
InventorySize = inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE;
|
|
InventoryRows = 1 + (InventorySize - 1) / InventoryCols;
|
|
|
|
_area = RectangleArea( (float)getSlotPosX(0) - 4,
|
|
(float)getSlotPosY(0) - 4,
|
|
(float)getSlotPosX(InventoryCols) + 4,
|
|
(float)getSlotPosY(InventoryRows) + 4);
|
|
|
|
if (!minecraft->isCreativeMode()) {
|
|
bArmor.width = 42;
|
|
bCrafting.width = 42;
|
|
|
|
bArmor.x = 0;
|
|
bArmor.y = height - bArmor.height;
|
|
|
|
bCrafting.x = 0;
|
|
bCrafting.y = height - bCrafting.height - 30;
|
|
buttons.push_back(&bArmor);
|
|
buttons.push_back(&bCrafting);
|
|
}
|
|
|
|
ItemInstance* selected = inventory->getSelected();
|
|
if (!selected || selected->isNull()) {
|
|
selectedItem = 0;
|
|
return;
|
|
}
|
|
|
|
for (int i = Inventory::MAX_SELECTION_SIZE; i < InventorySize; i++) {
|
|
if (selected == minecraft->player->inventory->getItem(i))
|
|
{
|
|
selectedItem = i - Inventory::MAX_SELECTION_SIZE;
|
|
break;
|
|
}
|
|
}
|
|
if (!isAllowed(selectedItem))
|
|
selectedItem = 0;
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::removed()
|
|
{
|
|
minecraft->gui.inventoryUpdated();
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::renderSlots()
|
|
{
|
|
//static Stopwatch w;
|
|
//w.start();
|
|
|
|
glColor4f2(1, 1, 1, 1);
|
|
|
|
blitOffset = -90;
|
|
|
|
glEnable2(GL_RESCALE_NORMAL);
|
|
//glPushMatrix2();
|
|
//glRotatef2(180, 1, 0, 0);
|
|
Lighting::turnOn(minecraft);
|
|
//glPopMatrix2();
|
|
|
|
minecraft->textures->loadAndBindTexture("gui/gui.png");
|
|
for (int r = 0; r < InventoryRows; r++)
|
|
{
|
|
int x = getSlotPosX(0) - 3;
|
|
int y = getSlotPosY(r) - 3;
|
|
|
|
if (InventoryCols == 9) {
|
|
blit(x, y, 0, 0, 182, 22);
|
|
} else {
|
|
// first 8 slots
|
|
blit(x, y, 0, 0, 182-20, 22);
|
|
// last k slots
|
|
const int k = 5;
|
|
const int w = k * 20;
|
|
blit(x + 162, y, 182-w, 0, w, 22);
|
|
}
|
|
}
|
|
if (selectedItem >= 0)
|
|
{
|
|
int x = getSlotPosX(selectedItem % InventoryCols) - 4;// width / 2 - 182 / 2 - 1 + () * 20;
|
|
int y = getSlotPosY(selectedItem / InventoryCols) - 4;// height - 22 * 3 - 1 - (selectedItem / InventoryCols) * 22;
|
|
blit(x, y, 0, 22, 24, 22);
|
|
}
|
|
|
|
for (int r = 0; r < InventoryRows; r++)
|
|
{
|
|
int y = getSlotPosY(r);
|
|
for (int i = 0; i < InventoryCols; i++) {
|
|
int x = getSlotPosX(i);
|
|
renderSlot(r * InventoryCols + i + Inventory::MAX_SELECTION_SIZE, x, y, 0);
|
|
}
|
|
}
|
|
|
|
//w.stop();
|
|
//w.printEvery(1000, "render-blocksel");
|
|
|
|
glDisable2(GL_RESCALE_NORMAL);
|
|
Lighting::turnOff();
|
|
}
|
|
|
|
int IngameBlockSelectionScreen::getSlotPosX(int slotX) {
|
|
return width / 2 - InventoryCols * 10 + slotX * 20 + 2;
|
|
}
|
|
|
|
int IngameBlockSelectionScreen::getSlotPosY(int slotY) {
|
|
//return height - 63 - 22 * (3 - slotY);
|
|
int yy = InventoryCols==9? 8 : 3;
|
|
return yy + slotY * getSlotHeight();
|
|
}
|
|
|
|
//int IngameBlockSelectionScreen::getLinearSlotId(int x, int y) {
|
|
// return
|
|
//}
|
|
|
|
|
|
#include "../../../world/item/ItemInstance.h"
|
|
#include "../../renderer/entity/ItemRenderer.h"
|
|
|
|
void IngameBlockSelectionScreen::renderSlot(int slot, int x, int y, float a)
|
|
{
|
|
ItemInstance* item = minecraft->player->inventory->getItem(slot);
|
|
if (!item) return;
|
|
|
|
ItemRenderer::renderGuiItem(minecraft->font, minecraft->textures, item, (float)x, (float)y, true);
|
|
|
|
if (minecraft->gameMode->isCreativeType()) return;
|
|
if (!isAllowed(slot - Inventory::MAX_SELECTION_SIZE)) return;
|
|
|
|
glPushMatrix2();
|
|
glScalef2(Gui::InvGuiScale + Gui::InvGuiScale, Gui::InvGuiScale + Gui::InvGuiScale, 1);
|
|
const float k = 0.5f * Gui::GuiScale;
|
|
minecraft->gui.renderSlotText(item, k*x, k*y, true, true);
|
|
glPopMatrix2();
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::keyPressed(int eventKey)
|
|
{
|
|
int selX = selectedItem % InventoryCols;
|
|
int selY = selectedItem / InventoryCols;
|
|
|
|
int tmpSelectedSlot = selectedItem;
|
|
|
|
Options& o = minecraft->options;
|
|
if (eventKey == o.getIntValue(OPTIONS_KEY_LEFT) && selX > 0)
|
|
{
|
|
tmpSelectedSlot -= 1;
|
|
}
|
|
else if (eventKey == o.getIntValue(OPTIONS_KEY_RIGHT) && selX < (InventoryCols - 1))
|
|
{
|
|
tmpSelectedSlot += 1;
|
|
}
|
|
else if (eventKey == o.getIntValue(OPTIONS_KEY_BACK) && selY < (InventoryRows - 1))
|
|
{
|
|
tmpSelectedSlot += InventoryCols;
|
|
}
|
|
else if (eventKey == o.getIntValue(OPTIONS_KEY_FORWARD) && selY > 0)
|
|
{
|
|
tmpSelectedSlot -= InventoryCols;
|
|
}
|
|
|
|
if (isAllowed(tmpSelectedSlot))
|
|
selectedItem = tmpSelectedSlot;
|
|
|
|
if (eventKey == o.getIntValue(OPTIONS_KEY_MENU_OK))
|
|
selectSlotAndClose();
|
|
|
|
#ifdef RPI
|
|
if (eventKey == o.getIntValue(OPTIONS_KEY_MENU_CANCEL)
|
|
|| eventKey == Keyboard::KEY_ESCAPE)
|
|
minecraft->setScreen(NULL);
|
|
#else
|
|
if (eventKey == o.getIntValue(OPTIONS_KEY_MENU_CANCEL))
|
|
minecraft->setScreen(NULL);
|
|
#endif
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// wheel support for creative inventory; scroll moves selection vertically
|
|
void IngameBlockSelectionScreen::mouseWheel(int dx, int dy, int xm, int ym)
|
|
{
|
|
if (dy == 0) return;
|
|
// just move selection up/down one row; desktop UI doesn't have a pane
|
|
int cols = InventoryCols;
|
|
int maxIndex = InventorySize - 1;
|
|
int idx = selectedItem;
|
|
if (dy > 0) {
|
|
// wheel up -> previous row
|
|
if (idx >= cols) idx -= cols;
|
|
} else {
|
|
// wheel down -> next row
|
|
if (idx + cols <= maxIndex) idx += cols;
|
|
}
|
|
selectedItem = idx;
|
|
}
|
|
|
|
int IngameBlockSelectionScreen::getSelectedSlot(int x, int y)
|
|
{
|
|
int left = width / 2 - InventoryCols * 10;
|
|
int top = -4 + getSlotPosY(0);
|
|
|
|
if (x >= left && y >= top)
|
|
{
|
|
int xSlot = (x - left) / 20;
|
|
if (xSlot < InventoryCols) {
|
|
int row = ((y-top) / getSlotHeight());
|
|
return row * InventoryCols + xSlot;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::mouseClicked(int x, int y, int buttonNum)
|
|
{
|
|
if (buttonNum == MouseAction::ACTION_LEFT) {
|
|
|
|
int slot = getSelectedSlot(x, y);
|
|
if (isAllowed(slot))
|
|
{
|
|
selectedItem = slot;
|
|
//minecraft->soundEngine->playUI("random.click", 1, 1);
|
|
} else {
|
|
_pendingQuit = !_area.isInside((float)x, (float)y)
|
|
&& !bArmor.isInside(x, y) && !bCrafting.isInside(x, y);
|
|
}
|
|
}
|
|
if (!_pendingQuit)
|
|
super::mouseClicked(x, y, buttonNum);
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::mouseReleased(int x, int y, int buttonNum)
|
|
{
|
|
if (buttonNum == MouseAction::ACTION_LEFT) {
|
|
|
|
int slot = getSelectedSlot(x, y);
|
|
if (isAllowed(slot) && slot == selectedItem)
|
|
{
|
|
selectSlotAndClose();
|
|
} else {
|
|
if (_pendingQuit && !_area.isInside((float)x, (float)y))
|
|
minecraft->setScreen(NULL);
|
|
}
|
|
}
|
|
if (!_pendingQuit)
|
|
super::mouseReleased(x, y, buttonNum);
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::selectSlotAndClose()
|
|
{
|
|
Inventory* inventory = minecraft->player->inventory;
|
|
// Flash the selected gui item
|
|
//inventory->moveToSelectedSlot(selectedItem + Inventory::MAX_SELECTION_SIZE, true);
|
|
inventory->moveToSelectionSlot(0, selectedItem + Inventory::MAX_SELECTION_SIZE, true);
|
|
inventory->selectSlot(0);
|
|
minecraft->gui.flashSlot(inventory->selected);
|
|
|
|
minecraft->soundEngine->playUI("random.click", 1, 1);
|
|
minecraft->setScreen(NULL);
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::render( int xm, int ym, float a )
|
|
{
|
|
glDisable2(GL_DEPTH_TEST);
|
|
fill(0, 0, width, height, (0x80) << 24);
|
|
glEnable2(GL_BLEND);
|
|
|
|
glDisable2(GL_ALPHA_TEST);
|
|
glEnable2(GL_BLEND);
|
|
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
renderSlots();
|
|
renderDemoOverlay();
|
|
|
|
glEnable2(GL_ALPHA_TEST);
|
|
glDisable2(GL_BLEND);
|
|
|
|
glEnable2(GL_DEPTH_TEST);
|
|
|
|
Screen::render(xm, ym, a);
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::renderDemoOverlay() {
|
|
#ifdef DEMO_MODE
|
|
fill( getSlotPosX(0) - 3, getSlotPosY(3) - 3,
|
|
getSlotPosX(InventoryCols) - 3, getSlotPosY(InventoryRows) - 3, 0xa0 << 24);
|
|
|
|
const int centerX = (getSlotPosX(4) + getSlotPosX(5)) / 2;
|
|
const int centerY = (getSlotPosY(3) + getSlotPosY(InventoryRows-1)) / 2 + 5;
|
|
drawCenteredString(minecraft->font, demoVersionString, centerX, centerY, 0xffffffff);
|
|
#endif /*DEMO_MODE*/
|
|
}
|
|
|
|
bool IngameBlockSelectionScreen::isAllowed(int slot) {
|
|
if (slot < 0 || slot >= InventorySize)
|
|
return false;
|
|
|
|
#ifdef DEMO_MODE
|
|
return slot < (minecraft->isCreativeMode()? 28 : 27);
|
|
#endif /*DEMO_MODE*/
|
|
|
|
return true;
|
|
}
|
|
|
|
int IngameBlockSelectionScreen::getSlotHeight() {
|
|
return InventoryCols==9? 22 : 20;
|
|
}
|
|
|
|
void IngameBlockSelectionScreen::buttonClicked( Button* button )
|
|
{
|
|
if (button == &bArmor) {
|
|
minecraft->setScreen(new ArmorScreen());
|
|
}
|
|
if (button == &bCrafting) {
|
|
minecraft->setScreen(new WorkbenchScreen(Recipe::SIZE_2X2));
|
|
}
|
|
super::buttonClicked(button);
|
|
}
|