From 2a99b7c6c9cc7f488d8c3140de80e667323e41b6 Mon Sep 17 00:00:00 2001 From: Nicole Collings <100Toby1@gmail.com> Date: Thu, 24 Oct 2019 20:16:39 -0700 Subject: [PATCH] Give Player control over GameGui, unlock mouse when in menu. --- mods/default/script/entity/dropped_item.lua | 2 + mods/default/script/main.lua | 46 ++++++----- src/def/LocalDefs.cpp | 4 +- src/def/LocalDefs.h | 2 +- src/game/graph/window/Window.cpp | 2 +- src/game/hud/GameGui.cpp | 85 +++++---------------- src/game/hud/GameGui.h | 9 ++- src/game/scene/GameScene.cpp | 25 ++---- src/game/scene/GameScene.h | 2 - src/game/scene/world/Player.cpp | 37 ++++++++- src/game/scene/world/Player.h | 13 +++- src/lua/api/modules/cCloseMenu.h | 19 +++++ src/lua/api/modules/cShowMenu.h | 8 +- src/lua/api/type/LuaPlayer.cpp | 6 +- src/lua/api/type/LuaPlayer.h | 2 + src/lua/api/type/cLuaPlayer.h | 4 +- src/lua/client/LocalLuaParser.cpp | 11 +-- src/lua/client/LocalLuaParser.h | 5 +- 18 files changed, 149 insertions(+), 133 deletions(-) create mode 100644 src/lua/api/modules/cCloseMenu.h diff --git a/mods/default/script/entity/dropped_item.lua b/mods/default/script/entity/dropped_item.lua index 040e4b02..f9681a6e 100644 --- a/mods/default/script/entity/dropped_item.lua +++ b/mods/default/script/entity/dropped_item.lua @@ -26,6 +26,8 @@ zepha.register_entity("zeus:default:test", { y = self.object.pos.y, z = self.object.pos.z + 0.08 * math.cos(math.rad(self.object.yaw))}) self.object:int_yaw(self.object.yaw + 2) + + self.object:int_yaw(math.deg(math.atan2(zepha.player.pos.x - self.object.pos.x, zepha.player.pos.z - self.object.pos.z)) + 180) end }) diff --git a/mods/default/script/main.lua b/mods/default/script/main.lua index 571a6426..52397dd5 100644 --- a/mods/default/script/main.lua +++ b/mods/default/script/main.lua @@ -7,31 +7,35 @@ zepha.register_keybind("open_inventory", { description = "Open Inventory", default = zepha.keys.e, on_press = function() - zepha.show_menu({ - key = "form_root", - type = "rect", - - size = "1920px, 1080px", - background = "#0004", - - children = {{ - key = "inv_root", + if zepha.player.menu_state == "" then + zepha.show_menu("inventory", { + key = "form_root", type = "rect", - position = "202px, 138px", - size = "236px, 118px", - padding = "20px, 10px, 8px, 10px", - background = "inventory" - }, { - key = "hotwheel_root", - type = "rect", + size = "1920px, 1080px", + background = "#0004", - position = "296px, 268px", - size = "52px, 52px", - background = "inventory_wheel" - } } - }); + children = {{ + key = "inv_root", + type = "rect", + position = "202px, 138px", + size = "236px, 118px", + padding = "20px, 10px, 8px, 10px", + background = "inventory" + }, { + key = "hotwheel_root", + type = "rect", + + position = "296px, 268px", + size = "52px, 52px", + background = "inventory_wheel" + } } + }); + else + zepha.close_menu() + end +-- print(zepha.player.menu_state) -- zepha.show_menu([[ -- rect[form_root] -- size=1920px 1080px diff --git a/src/def/LocalDefs.cpp b/src/def/LocalDefs.cpp index 440c877e..9f46e16f 100644 --- a/src/def/LocalDefs.cpp +++ b/src/def/LocalDefs.cpp @@ -15,8 +15,8 @@ LocalDefs::LocalDefs(const std::string& path) : textureAtlas.loadDirectory(tex_path); } -void LocalDefs::initLuaApi(LocalWorld &world, GameGui& gui, Player& player) { - luaApi.init(*this, world, gui, player); +void LocalDefs::initLuaApi(LocalWorld &world, Player& player) { + luaApi.init(*this, world, player); } LocalDefinitionAtlas &LocalDefs::defs() { diff --git a/src/def/LocalDefs.h b/src/def/LocalDefs.h index 61de52bb..415eba4c 100644 --- a/src/def/LocalDefs.h +++ b/src/def/LocalDefs.h @@ -19,7 +19,7 @@ public: TextureAtlas& textures(); LocalLuaParser& lua(); - void initLuaApi(LocalWorld &world, GameGui& gui, Player& player); + void initLuaApi(LocalWorld &world, Player& player); void update(double delta, bool* keys); ~LocalDefs() = default; diff --git a/src/game/graph/window/Window.cpp b/src/game/graph/window/Window.cpp index 7f835ee1..e78500ad 100644 --- a/src/game/graph/window/Window.cpp +++ b/src/game/graph/window/Window.cpp @@ -26,7 +26,7 @@ int Window::initialize() { return 1; } - //Version 3.2 + //Version 3.3 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); diff --git a/src/game/hud/GameGui.cpp b/src/game/hud/GameGui.cpp index d91ca732..4de6717e 100644 --- a/src/game/hud/GameGui.cpp +++ b/src/game/hud/GameGui.cpp @@ -5,83 +5,38 @@ #include "GameGui.h" GameGui::GameGui(glm::vec2 bufferSize, TextureAtlas& atlas) { - auto crosshair = std::make_shared("crosshair"); + auto crosshair = std::make_shared("__crosshair"); crosshair->create({22, 22}, {}, atlas.getTextureRef("crosshair")); crosshair->setPos({bufferSize.x / 2 - 11, bufferSize.y / 2 - 9}); add(crosshair); - auto viginette = std::make_shared("viginette"); + auto viginette = std::make_shared("__viginette"); viginette->create(bufferSize, {}, atlas.getTextureRef("viginette")); add(viginette); -// auto root = std::make_shared("root"); -// root->create(bufferSize, {}, {0, 0, 0, 0.25}); -// add(root); - -// auto inv_root = std::make_shared("inv_root"); -// inv_root->create({648, 270}, {60, 30, 24, 30}, atlas.getTextureRef("inventory")); -// inv_root->setPos({bufferSize.x / 2 - 354, bufferSize.y / 2 - 90}); -// root->add(inv_root); -// -// std::array mats = { -// "zeus:materials:stick", -// "zeus:materials:rock", -// "zeus:materials:flint", -// "aurailus:basictools:flint_pickaxe", -// "aurailus:basictools:flint_hatchet", -// "aurailus:basictools:flint_shovel" -// }; -// -// for (int i = 0; i < 5; i++) { -// for (int j = 0; j < 12; j++) { -// auto inv_slot = std::make_shared("inv_slot_" + to_string(i) + "_" + to_string(j)); -// inv_slot->create({48, 48}, {}, atlas.getTextureRef(mats[rand() % 6])); -// inv_slot->setPos({3 + j * 54, 3 + i * 54}); -// inv_root->add(inv_slot); -// } -// } -// -// auto shortcuts_root = std::make_shared("shortcut_root"); -// shortcuts_root->create({156, 156}, {}, atlas.getTextureRef("inventory_wheel")); -// shortcuts_root->setPos({bufferSize.x / 2 - 72, bufferSize.y - 200}); -// root->add(shortcuts_root); -// -// std::array vec_roots = { -// glm::vec2 { 133, -26 }, -// glm::vec2 { 155, 37 }, -// glm::vec2 { 133, 100}, -// glm::vec2 {-241, -26 }, -// glm::vec2 {-263, 37 }, -// glm::vec2 {-241, 100} -// }; -// -// for (auto i = 0; i < 6; i++) { -// glm::vec2 vec = vec_roots[i]; -// -// auto shortcut_slot = std::make_shared("shortcut_slot_" + to_string(i)); -// shortcut_slot->create({216, 54}, {15, 24, 15, 24}, atlas.getTextureRef("inventory_wheel_slot")); -// shortcut_slot->setPos(vec); -// shortcuts_root->add(shortcut_slot); -// } -// -// root->setVisible(false); + auto root = std::make_shared("__root"); + add(root); } void GameGui::bufferResized(glm::vec2 bufferSize) { - get("crosshair")->setPos({bufferSize.x / 2 - 11, bufferSize.y / 2 - 9}); - get("viginette")->setScale({bufferSize.x, bufferSize.y}); + get("__crosshair")->setPos({bufferSize.x / 2 - 11, bufferSize.y / 2 - 9}); + get("__viginette")->setScale({bufferSize.x, bufferSize.y}); +} + +void GameGui::setMenu(const std::string& state, std::shared_ptr component) { + menuState = state; + get("__root")->add(component); +} + +void GameGui::closeMenu() { + menuState = ""; + get("__root")->remove("__lua_root"); +} + +const std::string &GameGui::getMenuState() { + return menuState; } void GameGui::setVisible(bool visible) { GUIComponent::setVisible(visible); -// get("root")->setVisible(invOpen); -} - -void GameGui::setInvOpen(bool open) { -// get("root")->setVisible(open); - invOpen = open; -} - -bool GameGui::isInvOpen() { - return invOpen; } \ No newline at end of file diff --git a/src/game/hud/GameGui.h b/src/game/hud/GameGui.h index 2b7bdb33..fc3b7639 100644 --- a/src/game/hud/GameGui.h +++ b/src/game/hud/GameGui.h @@ -7,7 +7,6 @@ #include "components/basic/GUIRect.h" #include "components/basic/GUIContainer.h" #include "../graph/drawable/DrawableGroup.h" -#include "../ClientState.h" #include "../entity/Entity.h" class GameGui : public GUIContainer { @@ -16,9 +15,11 @@ public: void bufferResized(glm::vec2 bufferSize); void setVisible(bool visible) override; - void setInvOpen(bool open); - bool isInvOpen(); - bool invOpen; + void setMenu(const std::string& state, std::shared_ptr component); + void closeMenu(); + const std::string& getMenuState(); + + std::string menuState = ""; }; diff --git a/src/game/scene/GameScene.cpp b/src/game/scene/GameScene.cpp index dfffce92..47f135f7 100644 --- a/src/game/scene/GameScene.cpp +++ b/src/game/scene/GameScene.cpp @@ -10,22 +10,14 @@ GameScene::GameScene(ClientState& state) : Scene(state), server(state.connection, defs), world(defs, &playerPos, &server), - player(world, defs, state.renderer.getCamera()), - - gameGui (state.renderer.getCamera().getBufferDimensions(), defs.textures()), + player(world, defs, state.renderer), debugGui(state.renderer.getCamera().getBufferDimensions(), defs) { state.renderer.setClearColor(148, 194, 240); state.renderer.getWindow().lockMouse(true); - defs.initLuaApi(world, gameGui, player); + defs.initLuaApi(world, player); world.init(); - - gui.push_back(&gameGui); - gui.push_back(&debugGui); - - debugGui.initItemDisplays(defs); - entities.push_back(&player); server.init(&world); Packet r(PacketType::CONNECT_DATA_RECVD); @@ -39,15 +31,14 @@ void GameScene::update() { Window& window = state.renderer.getWindow(); - playerPos = player.getPos(); + //Update Player player.update(window.input, state.deltaTime, window.getDeltaX(), window.getDeltaY()); + playerPos = player.getPos(); for (auto entity : entities) entity->update(state.deltaTime); if (state.renderer.resized) { debugGui.bufferResized(state.renderer.getCamera().getBufferDimensions()); - gameGui.bufferResized(state.renderer.getCamera().getBufferDimensions()); - state.renderer.resized = false; } @@ -61,7 +52,7 @@ void GameScene::update() { if (window.input.isKeyPressed(GLFW_KEY_F1)) { hudVisible = !hudVisible; debugGui.changeVisibilityState(hudVisible ? debugVisible ? 0 : 2 : 1); - gameGui.setVisible(hudVisible); + player.setGuiVisible(hudVisible); } if (window.input.isKeyPressed(GLFW_KEY_F3)) { @@ -83,20 +74,20 @@ void GameScene::draw() { renderer.beginChunkDeferredCalls(); renderer.enableTexture(&defs.textures().getAtlasTexture()); - Timer t("rendering chunks"); drawCalls = world.renderChunks(renderer); -// t.printElapsedMs(); renderer.beginEntityDeferredCalls(); for (auto entity : entities) entity->draw(renderer); world.renderEntities(renderer); + player.draw(renderer); renderer.endDeferredCalls(); renderer.beginGUIDrawCalls(); renderer.enableTexture(&defs.textures().getAtlasTexture()); - for (auto entity : gui) entity->draw(renderer); + player.drawGUI(renderer); + debugGui.draw(renderer); renderer.swapBuffers(); } diff --git a/src/game/scene/GameScene.h b/src/game/scene/GameScene.h index 37c20265..c1e12d11 100644 --- a/src/game/scene/GameScene.h +++ b/src/game/scene/GameScene.h @@ -35,9 +35,7 @@ public: LocalWorld world; std::vector entities; - std::vector gui; - GameGui gameGui; DebugGui debugGui; int drawCalls = 0; diff --git a/src/game/scene/world/Player.cpp b/src/game/scene/world/Player.cpp index 073eb5ac..e86f5153 100644 --- a/src/game/scene/world/Player.cpp +++ b/src/game/scene/world/Player.cpp @@ -5,13 +5,18 @@ #include "Player.h" #include "../../../util/Ray.h" -Player::Player(LocalWorld& world, LocalDefs& defs, Camera& camera) : +Player::Player(LocalWorld& world, LocalDefs& defs, Renderer& renderer) : world(world), - camera(camera), + renderer(renderer), defs(defs), + gameGui(renderer.getCamera().getBufferDimensions(), defs.textures()), wireframe(WireframeEntity({}, 0.01, {1, 1, 1})) {} void Player::update(InputManager &input, double delta, double mouseX, double mouseY) { + if (renderer.resized) { + gameGui.bufferResized(renderer.getCamera().getBufferDimensions()); + //Gamescene unsets renderer.resized right after + } posUpdate(input, delta); viewUpdate(mouseX, mouseY); pointerUpdate(input, delta); @@ -44,6 +49,7 @@ void Player::posUpdate(InputManager &input, double delta) { } } + auto& camera = renderer.getCamera(); glm::vec3 frontFlat = glm::normalize(glm::vec3(camera.getFront().x, 0, camera.getFront().z)); glm::vec3 rightFlat = glm::normalize(glm::vec3(camera.getRight().x, 0, camera.getRight().z)); @@ -93,6 +99,7 @@ void Player::viewUpdate(double deltaX, double deltaY) { if (pitch > 90.f) pitch = 90.f; if (pitch < -90.f) pitch = -90.f; + auto& camera = renderer.getCamera(); camera.setYaw(yaw); camera.setPitch(pitch); camera.setPos({pos.x, pos.y + EYE_HEIGHT, pos.z}); @@ -145,7 +152,7 @@ void Player::pointerUpdate(InputManager &input, double delta) { } if (input.isMousePressed(GLFW_MOUSE_BUTTON_RIGHT)) { world.localSetBlock(pointedThing.pos + SelectionBox::faceToOffset(pointedThing.face), - defs.defs().blockFromStr("default:cobblestone").index); + defs.defs().blockFromStr("zeus:default:cobblestone").index); } } else { @@ -229,7 +236,7 @@ glm::vec3 Player::getPos() { void Player::setPos(glm::vec3 pos) { this->pos = pos; - camera.setPos(pos); + this->renderer.getCamera().setPos({pos.x, pos.y + EYE_HEIGHT, pos.z}); } glm::vec3 Player::getVel() { @@ -262,4 +269,26 @@ PointedThing& Player::getPointedThing() { void Player::draw(Renderer &renderer) { wireframe.draw(renderer); +} + +void Player::drawGUI(Renderer &renderer) { + gameGui.draw(renderer); +} + +void Player::setGuiVisible(bool hudVisible) { + gameGui.setVisible(hudVisible); +} + +GameGui& Player::getGui() { + return gameGui; +} + +void Player::setMenu(const std::string& state, sptr root) { + gameGui.setMenu(state, root); + renderer.getWindow().lockMouse(false); +} + +void Player::closeMenu() { + gameGui.closeMenu(); + renderer.getWindow().lockMouse(true); } \ No newline at end of file diff --git a/src/game/scene/world/Player.h b/src/game/scene/world/Player.h index 1a0ab886..99435a8e 100644 --- a/src/game/scene/world/Player.h +++ b/src/game/scene/world/Player.h @@ -14,6 +14,7 @@ #include "../../entity/world/BlockCrackEntity.h" #include "../../graph/drawable/DrawableGroup.h" #include "../../../world/block/PointedThing.h" +#include "../../hud/GameGui.h" class Player : public Drawable { public: @@ -21,7 +22,7 @@ public: static constexpr float LOOK_PRECISION = 0.01f; static constexpr float EYE_HEIGHT = 1.65f; - Player(LocalWorld& world, LocalDefs& defs, Camera& camera); + Player(LocalWorld& world, LocalDefs& defs, Renderer& renderer); void update(InputManager &input, double delta, double mouseX, double mouseY); @@ -43,13 +44,21 @@ public: void setPitch(float pitch); float getPitch(); + GameGui& getGui(); + void setMenu(const std::string& state, sptr root); + void closeMenu(); + void setGuiVisible(bool hudVisible); + void draw(Renderer& renderer) override; + void drawGUI(Renderer& renderer); PointedThing& getPointedThing(); + private: - Camera& camera; + Renderer& renderer; LocalDefs& defs; LocalWorld& world; + GameGui gameGui; glm::vec3 pos {}; glm::vec3 vel {}; diff --git a/src/lua/api/modules/cCloseMenu.h b/src/lua/api/modules/cCloseMenu.h new file mode 100644 index 00000000..157e9ca0 --- /dev/null +++ b/src/lua/api/modules/cCloseMenu.h @@ -0,0 +1,19 @@ +// +// Created by aurailus on 01/08/19. +// + +#pragma once + +#include "../../../def/LocalDefs.h" +#include "../../../game/scene/world/Player.h" +#include + +namespace ClientApi { + void close_menu(sol::table &core, LocalDefs& defs, Player& player) { + + core.set_function("close_menu", [&]() { + player.closeMenu(); + }); + } +} + diff --git a/src/lua/api/modules/cShowMenu.h b/src/lua/api/modules/cShowMenu.h index 55bd4842..427e9e4b 100644 --- a/src/lua/api/modules/cShowMenu.h +++ b/src/lua/api/modules/cShowMenu.h @@ -136,11 +136,11 @@ void processElement(LocalDefs& defs, sol::table& element, std::shared_ptr("root"); - gui.add(root); + core.set_function("show_menu", [&](std::string state, sol::table gui_root) { + auto root = std::make_shared("__lua_root"); + player.setMenu(state, root); processElement(defs, gui_root, static_pointer_cast(root)); }); diff --git a/src/lua/api/type/LuaPlayer.cpp b/src/lua/api/type/LuaPlayer.cpp index 12d1a389..7e3f5477 100644 --- a/src/lua/api/type/LuaPlayer.cpp +++ b/src/lua/api/type/LuaPlayer.cpp @@ -41,4 +41,8 @@ void LuaPlayer::set_look_pitch(float rot) { float LuaPlayer::get_look_pitch() { return player.getPitch(); -} \ No newline at end of file +} + +std::string LuaPlayer::get_menu_state() { + return player.getGui().getMenuState(); +} diff --git a/src/lua/api/type/LuaPlayer.h b/src/lua/api/type/LuaPlayer.h index d3c7ba82..42b0429e 100644 --- a/src/lua/api/type/LuaPlayer.h +++ b/src/lua/api/type/LuaPlayer.h @@ -26,4 +26,6 @@ public: void set_look_pitch(float rot); float get_look_pitch(); + + std::string get_menu_state(); }; diff --git a/src/lua/api/type/cLuaPlayer.h b/src/lua/api/type/cLuaPlayer.h index dc9c2e3e..04895fd3 100644 --- a/src/lua/api/type/cLuaPlayer.h +++ b/src/lua/api/type/cLuaPlayer.h @@ -26,7 +26,9 @@ namespace ClientApi { "block_pos", sol::property(&LuaPlayer::get_block_pos, &LuaPlayer::set_pos), "vel", sol::property(&LuaPlayer::get_vel, &LuaPlayer::set_vel), "look_yaw", sol::property(&LuaPlayer::get_look_yaw, &LuaPlayer::set_look_yaw), - "look_yaw", sol::property(&LuaPlayer::get_look_pitch, &LuaPlayer::set_look_pitch) + "look_yaw", sol::property(&LuaPlayer::get_look_pitch, &LuaPlayer::set_look_pitch), + + "menu_state", sol::property(&LuaPlayer::get_menu_state) ); } } \ No newline at end of file diff --git a/src/lua/client/LocalLuaParser.cpp b/src/lua/client/LocalLuaParser.cpp index 0042124b..cdeb6bd1 100644 --- a/src/lua/client/LocalLuaParser.cpp +++ b/src/lua/client/LocalLuaParser.cpp @@ -8,7 +8,6 @@ #include "LocalRegisterKeybinds.h" #include "../../def/LocalDefs.h" -#include "../../game/hud/GameGui.h" #include "../api/type/LuaPlayer.h" #include "../../game/scene/world/Player.h" @@ -34,11 +33,12 @@ #include "../api/modules/cRemoveEntity.h" #include "../api/modules/cShowMenu.h" +#include "../api/modules/cCloseMenu.h" #include "../api/modules/cRegisterKeybind.h" #include "../api/functions/cUpdateEntities.h" -void LocalLuaParser::init(LocalDefs& defs, LocalWorld& world, GameGui& gui, Player& player) { +void LocalLuaParser::init(LocalDefs& defs, LocalWorld& world, Player& player) { //Load Base Libraries lua.open_libraries(sol::lib::base, sol::lib::string, sol::lib::math, sol::lib::table); @@ -46,7 +46,7 @@ void LocalLuaParser::init(LocalDefs& defs, LocalWorld& world, GameGui& gui, Play // lua_atpanic(lua, sol::c_call); //Load Modules - loadModules(defs, world, gui, player); + loadModules(defs, world, player); //Load Mods loadMods(); @@ -55,7 +55,7 @@ void LocalLuaParser::init(LocalDefs& defs, LocalWorld& world, GameGui& gui, Play registerDefinitions(defs); } -void LocalLuaParser::loadModules(LocalDefs &defs, LocalWorld &world, GameGui& gui, Player& player) { +void LocalLuaParser::loadModules(LocalDefs &defs, LocalWorld &world, Player& player) { //Create Zepha Table core = lua.create_table(); lua["zepha"] = core; @@ -86,7 +86,8 @@ void LocalLuaParser::loadModules(LocalDefs &defs, LocalWorld &world, GameGui& gu ClientApi::add_entity(lua, core, defs, world); ClientApi::remove_entity(lua, core, defs, world); - ClientApi::show_menu(core, defs, gui); + ClientApi::show_menu(core, defs, player); + ClientApi::close_menu(core, defs, player); ClientApi::register_keybind(lua, core); ClientApi::update_entities(lua); diff --git a/src/lua/client/LocalLuaParser.h b/src/lua/client/LocalLuaParser.h index 9da33fac..83005110 100644 --- a/src/lua/client/LocalLuaParser.h +++ b/src/lua/client/LocalLuaParser.h @@ -11,14 +11,13 @@ class LocalDefs; class LocalWorld; -class GameGui; class Player; class LocalLuaParser : public LuaParser { public: - void init(LocalDefs& defs, LocalWorld& world, GameGui& gui, Player& player); + void init(LocalDefs& defs, LocalWorld& world, Player& player); - void loadModules(LocalDefs& defs, LocalWorld& world, GameGui& gui, Player& player); + void loadModules(LocalDefs& defs, LocalWorld& world, Player& player); void loadMods(); void registerDefinitions(LocalDefs &defs);