diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/AbstractContainerScreen.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/AbstractContainerScreen.cpp')
| -rw-r--r-- | Minecraft.Client/AbstractContainerScreen.cpp | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/Minecraft.Client/AbstractContainerScreen.cpp b/Minecraft.Client/AbstractContainerScreen.cpp new file mode 100644 index 00000000..2b3e0837 --- /dev/null +++ b/Minecraft.Client/AbstractContainerScreen.cpp @@ -0,0 +1,235 @@ +#include "stdafx.h" +#include "AbstractContainerScreen.h" +#include "ItemRenderer.h" +#include "MultiplayerLocalPlayer.h" +#include "Lighting.h" +#include "GameMode.h" +#include "KeyMapping.h" +#include "Options.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.locale.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" + +ItemRenderer *AbstractContainerScreen::itemRenderer = new ItemRenderer(); + +AbstractContainerScreen::AbstractContainerScreen(AbstractContainerMenu *menu) +{ + // 4J - added initialisers + imageWidth = 176; + imageHeight = 166; + + this->menu = menu; +} + +void AbstractContainerScreen::init() +{ + Screen::init(); + minecraft->player->containerMenu = menu; +// leftPos = (width - imageWidth) / 2; +// topPos = (height - imageHeight) / 2; + +} + +void AbstractContainerScreen::render(int xm, int ym, float a) +{ + // 4J Stu - Not used +#if 0 + renderBackground(); + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + + renderBg(a); + + glPushMatrix(); + glRotatef(120, 1, 0, 0); + Lighting::turnOn(); + glPopMatrix(); + + glPushMatrix(); + glTranslatef((float)xo, (float)yo, 0); + + glColor4f(1, 1, 1, 1); + glEnable(GL_RESCALE_NORMAL); + + Slot *hoveredSlot = NULL; + + AUTO_VAR(itEnd, menu->slots->end()); + for (AUTO_VAR(it, menu->slots->begin()); it != itEnd; it++) + { + Slot *slot = *it; //menu->slots->at(i); + + renderSlot(slot); + + if (isHovering(slot, xm, ym)) + { + hoveredSlot = slot; + + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + + int x = slot->x; + int y = slot->y; + fillGradient(x, y, x + 16, y + 16, 0x80ffffff, 0x80ffffff); + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + } + } + + shared_ptr<Inventory> inventory = minecraft->player->inventory; + if (inventory->getCarried() != NULL) + { + glTranslatef(0, 0, 32); + // Slot old = carriedSlot; + // carriedSlot = null; + itemRenderer->renderGuiItem(font, minecraft->textures, inventory->getCarried(), xm - xo - 8, ym - yo - 8); + itemRenderer->renderGuiItemDecorations(font, minecraft->textures, inventory->getCarried(), xm - xo - 8, ym - yo - 8); + // carriedSlot = old; + } + glDisable(GL_RESCALE_NORMAL); + Lighting::turnOff(); + + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + + renderLabels(); + + if (inventory->getCarried() == NULL && hoveredSlot != NULL && hoveredSlot->hasItem()) + { + + wstring elementName = trimString(Language::getInstance()->getElementName(hoveredSlot->getItem()->getDescriptionId())); + + if (elementName.length() > 0) + { + int x = xm - xo + 12; + int y = ym - yo - 12; + int width = font->width(elementName); + fillGradient(x - 3, y - 3, x + width + 3, y + 8 + 3, 0xc0000000, 0xc0000000); + + font->drawShadow(elementName, x, y, 0xffffffff); + } + + } + + glPopMatrix(); + + Screen::render(xm, ym, a); + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); +#endif +} + +void AbstractContainerScreen::renderLabels() +{ +} + +void AbstractContainerScreen::renderSlot(Slot *slot) +{ + // 4J Unused +#if 0 + int x = slot->x; + int y = slot->y; + shared_ptr<ItemInstance> item = slot->getItem(); + + if (item == NULL) + { + int icon = slot->getNoItemIcon(); + if (icon >= 0) + { + glDisable(GL_LIGHTING); + minecraft->textures->bind(minecraft->textures->loadTexture(TN_GUI_ITEMS));//L"/gui/items.png")); + blit(x, y, icon % 16 * 16, icon / 16 * 16, 16, 16); + glEnable(GL_LIGHTING); + return; + } + } + + itemRenderer->renderGuiItem(font, minecraft->textures, item, x, y); + itemRenderer->renderGuiItemDecorations(font, minecraft->textures, item, x, y); +#endif +} + +Slot *AbstractContainerScreen::findSlot(int x, int y) +{ + AUTO_VAR(itEnd, menu->slots->end()); + for (AUTO_VAR(it, menu->slots->begin()); it != itEnd; it++) + { + Slot *slot = *it; //menu->slots->at(i); + if (isHovering(slot, x, y)) return slot; + } + return NULL; +} + +bool AbstractContainerScreen::isHovering(Slot *slot, int xm, int ym) +{ + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + xm -= xo; + ym -= yo; + + return xm >= slot->x - 1 && xm < slot->x + 16 + 1 && ym >= slot->y - 1 && ym < slot->y + 16 + 1; + +} + +void AbstractContainerScreen::mouseClicked(int x, int y, int buttonNum) +{ + Screen::mouseClicked(x, y, buttonNum); + if (buttonNum == 0 || buttonNum == 1) + { + Slot *slot = findSlot(x, y); + + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + bool clickedOutside = (x < xo || y < yo || x >= xo + imageWidth || y >= yo + imageHeight); + + int slotId = -1; + if (slot != NULL) slotId = slot->index; + + if (clickedOutside) + { + slotId = AbstractContainerMenu::CLICKED_OUTSIDE; + } + + if (slotId != -1) + { + bool quickKey = slotId != AbstractContainerMenu::CLICKED_OUTSIDE && (Keyboard::isKeyDown(Keyboard::KEY_LSHIFT) || Keyboard::isKeyDown(Keyboard::KEY_RSHIFT)); + minecraft->gameMode->handleInventoryMouseClick(menu->containerId, slotId, buttonNum, quickKey, minecraft->player); + } + } + +} + +void AbstractContainerScreen::mouseReleased(int x, int y, int buttonNum) +{ + if (buttonNum == 0) + { + } +} + +void AbstractContainerScreen::keyPressed(wchar_t eventCharacter, int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE || eventKey == minecraft->options->keyBuild->key) + { + minecraft->player->closeContainer(); + } +} + +void AbstractContainerScreen::removed() +{ + if (minecraft->player == NULL) return; +} + +void AbstractContainerScreen::slotsChanged(shared_ptr<Container> container) +{ +} + +bool AbstractContainerScreen::isPauseScreen() +{ + return false; +} + +void AbstractContainerScreen::tick() +{ + Screen::tick(); + if (!minecraft->player->isAlive() || minecraft->player->removed) minecraft->player->closeContainer(); + +}
\ No newline at end of file |
