This commit is contained in:
2026-07-21 22:42:28 +02:00
parent 6f1ca8fc3b
commit 67acd7f9a6
10 changed files with 159 additions and 29 deletions

View File

@@ -186,8 +186,7 @@ Minecraft::Minecraft() :
commandPort(4711), commandPort(4711),
reserved_d1(0),reserved_d2(0), reserved_d1(0),reserved_d2(0),
reserved_f1(0),reserved_f2(0), options(this), reserved_f1(0),reserved_f2(0), options(this),
m_commandManager(), m_commandManager()
m_pluginsManager(*level)
{ {
//#ifdef ANDROID //#ifdef ANDROID
@@ -1215,6 +1214,8 @@ void Minecraft::init()
checkGlError("Init complete"); checkGlError("Init complete");
#endif #endif
PluginsManager::get().init(*this);
options.load(); options.load();
setIsCreativeMode(false); // false means it's Survival Mode setIsCreativeMode(false); // false means it's Survival Mode

View File

@@ -245,8 +245,6 @@ private:
CommandServer* _commandServer; CommandServer* _commandServer;
CommandManager m_commandManager; CommandManager m_commandManager;
PluginsManager m_pluginsManager;
}; };
#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ #endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/

View File

@@ -15,15 +15,15 @@
#include "platform/time.h" #include "platform/time.h"
#include "SharedConstants.h" #include "SharedConstants.h"
#include "world/level/LevelConstants.h" #include "world/level/LevelConstants.h"
#include <sol/sol.hpp> #include <plugins/PluginsManager.hpp>
#define MAIN_CLASS NinecraftApp #define MAIN_CLASS NinecraftApp
static App* g_app = 0; static App* g_app = 0;
static int g_exitCode = 0; static int g_exitCode = 0;
void signal_callback_handler(int signum) { void signal_callback_handler(int signum) {
std::cout << "Signum caught: " << signum << std::endl; std::cout << "Signum caught: " << signum << std::endl;
if(signum == 2 || signum == 3){ // SIGINT || SIGQUIT
if (signum == 2 || signum == 3) { // SIGINT || SIGQUIT
if (g_app != 0) { if (g_app != 0) {
g_app->quit(); g_app->quit();
} else { } else {
@@ -162,6 +162,7 @@ int main(int numArguments, char* pszArgs[]) {
float startTime = getTimeS(); float startTime = getTimeS();
((MAIN_CLASS*)g_app)->selectLevel(levelDir, levelName, settings); ((MAIN_CLASS*)g_app)->selectLevel(levelDir, levelName, settings);
((MAIN_CLASS*)g_app)->hostMultiplayer(port); ((MAIN_CLASS*)g_app)->hostMultiplayer(port);
PluginsManager::get().loadPlugins();
// Reading ops // Reading ops
std::ifstream ops("ops.txt"); std::ifstream ops("ops.txt");
@@ -201,18 +202,10 @@ int main(int numArguments, char* pszArgs[]) {
} }
} }
std::string pluginsFolder = "plugins/";
struct stat sb;
if (stat(pluginsFolder.c_str(), &sb) == 0) {
} else {
}
std::cout << "Level has been generated in " << getTimeS() - startTime << std::endl; std::cout << "Level has been generated in " << getTimeS() - startTime << std::endl;
((MAIN_CLASS*)g_app)->level->saveLevelData(); ((MAIN_CLASS*)g_app)->level->saveLevelData();
std::cout << "Level has been saved!" << std::endl; std::cout << "Level has been saved!" << std::endl;
PluginsManager::get().emit("ServerLoaded");
while(!app->wantToQuit()) { while(!app->wantToQuit()) {
app->update(); app->update();

View File

@@ -39,6 +39,7 @@
#endif #endif
#include "../server/ServerPlayer.h" #include "../server/ServerPlayer.h"
#include "../world/entity/item/FallingTile.h" #include "../world/entity/item/FallingTile.h"
#include <plugins/LuaPlayer.hpp>
#define TIMES(x) for(int itc ## __LINE__ = 0; itc ## __LINE__ < x; ++ itc ## __LINE__) #define TIMES(x) for(int itc ## __LINE__ = 0; itc ## __LINE__ < x; ++ itc ## __LINE__)
@@ -163,12 +164,12 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChatPack
if (packet->message[0] == '/') { if (packet->message[0] == '/') {
// This is a command // This is a command
ChatPacket resp(minecraft->commandManager().execute(*minecraft, *player, Util::stringTrim(packet->message.substr(1)))); ChatPacket resp(minecraft->commandManager().execute(*minecraft, *player, Util::stringTrim(packet->message.substr(1))));
return sendPrivate(resp, source); return sendPrivate(resp, source);
} }
displayGameMessage("<" + player->name + "> " + packet->message); displayGameMessage("<" + player->name + "> " + packet->message);
PluginsManager::get().emit("Message", LuaPlayer(source), packet->message);
} }
void ServerSideNetworkHandler::onNewClient(const RakNet::RakNetGUID& clientGuid) void ServerSideNetworkHandler::onNewClient(const RakNet::RakNetGUID& clientGuid)
@@ -193,6 +194,7 @@ void ServerSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& guid)
std::string message = player->name; std::string message = player->name;
message += " disconnected from the game"; message += " disconnected from the game";
displayGameMessage(message); displayGameMessage(message);
PluginsManager::get().emit("PlayerDisconnect", LuaPlayer(guid));
//RemoveEntityPacket packet(player->entityId); //RemoveEntityPacket packet(player->entityId);
//raknetInstance->send(packet); //raknetInstance->send(packet);
@@ -349,6 +351,7 @@ void ServerSideNetworkHandler::onReady_ClientGeneration(const RakNet::RakNetGUID
#else #else
LOGW("%s joined the game\n", newPlayer->name.c_str()); LOGW("%s joined the game\n", newPlayer->name.c_str());
#endif #endif
PluginsManager::get().emit("PlayerJoin", LuaPlayer(source));
// Send all Entities to the new player // Send all Entities to the new player
for (unsigned int i = 0; i < level->entities.size(); ++i) { for (unsigned int i = 0; i < level->entities.size(); ++i) {

View File

@@ -66,7 +66,7 @@ public:
Player* popPendingPlayer(const RakNet::RakNetGUID& source); Player* popPendingPlayer(const RakNet::RakNetGUID& source);
void displayGameMessage(const std::string& message); void displayGameMessage(const std::string& message);
private:
/** /**
* @brief Send packet to all players * @brief Send packet to all players
*/ */
@@ -79,6 +79,8 @@ private:
Player* getPlayer(const RakNet::RakNetGUID& source); Player* getPlayer(const RakNet::RakNetGUID& source);
private:
Minecraft* minecraft; Minecraft* minecraft;
Level* level; Level* level;
IRakNetInstance* raknetInstance; IRakNetInstance* raknetInstance;

54
src/plugins/LuaPlayer.hpp Normal file
View File

@@ -0,0 +1,54 @@
#pragma once
#include <cstdint>
#include <raknet/RakNetTypes.h>
#include <plugins/PluginsManager.hpp>
#include <network/ServerSideNetworkHandler.h>
#include <world/entity/player/Player.h>
#include <client/Minecraft.h>
class LuaPlayer {
public:
LuaPlayer(const RakNet::RakNetGUID source) : m_source(source) {}
std::string getNickname() {
auto mc = PluginsManager::get().getMinecraft();
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback;
auto plr = ss->getPlayer(m_source);
if (plr != nullptr) return plr->name;
return "";
}
float getX() {
auto mc = PluginsManager::get().getMinecraft();
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback;
auto plr = ss->getPlayer(m_source);
if (plr != nullptr) return plr->x;
return 0;
}
float getY() {
auto mc = PluginsManager::get().getMinecraft();
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback;
auto plr = ss->getPlayer(m_source);
if (plr != nullptr) return plr->y;
return 0;
}
float getZ() {
auto mc = PluginsManager::get().getMinecraft();
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback;
auto plr = ss->getPlayer(m_source);
if (plr != nullptr) return plr->z;
return 0;
}
private:
const RakNet::RakNetGUID m_source;
};

11
src/plugins/LuaServer.cpp Normal file
View File

@@ -0,0 +1,11 @@
#include <plugins/LuaServer.hpp>
#include <plugins/PluginsManager.hpp>
#include <network/ServerSideNetworkHandler.h>
#include <client/Minecraft.h>
void LuaServer::sendServerMessage(std::string msg) {
auto mc = PluginsManager::get().getMinecraft();
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback;
ss->displayGameMessage(msg);
}

View File

@@ -0,0 +1,7 @@
#pragma once
#include <string>
class LuaServer {
public:
void sendServerMessage(std::string msg);
};

View File

@@ -1,16 +1,48 @@
#include <plugins/PluginsManager.hpp> #include <plugins/PluginsManager.hpp>
#include <world/level/Level.h> #include <plugins/LuaPlayer.hpp>
#include <plugins/LuaServer.hpp>
PluginsManager::PluginsManager(Level& level) : m_level(level) { #include <client/Minecraft.h>
#include <filesystem>
namespace fs = std::filesystem;
void PluginsManager::init(Minecraft& minecraft) {
m_lua.open_libraries(sol::lib::base); m_lua.open_libraries(sol::lib::base);
registerTypes(); registerTypes();
m_minecraft = &minecraft;
} }
void PluginsManager::registerTypes() { void PluginsManager::registerTypes() {
m_lua.set_function("subscribe", &PluginsManager::subscribe); // @note you cant just do that, because lua doesnt have access to the class in this case
// m_lua.set_function("subscribe", &PluginsManager::subscribe);
m_lua.set_function("subscribe", [this](std::string event, sol::protected_function func) {
// @note: why the .at() not working?
m_callbacks[event].push_back(func);
});
m_lua.new_usertype<LuaServer>(
"Server",
"sendMessage", &LuaServer::sendServerMessage
);
m_lua.new_usertype<LuaPlayer>(
"Player",
"getNickname", &LuaPlayer::getNickname,
"getX", &LuaPlayer::getX,
"getY", &LuaPlayer::getY,
"getZ", &LuaPlayer::getZ
);
m_lua["Server"] = &m_srv;
} }
void PluginsManager::subscribe(std::string event, sol::function function) { void PluginsManager::loadPlugins() {
m_callbacks.at(event).push_back(function); std::string path = "plugins/";
for (const auto & entry : fs::directory_iterator(path)) {
m_lua.script_file(entry.path().string());
}
} }

View File

@@ -2,19 +2,48 @@
#include <unordered_map> #include <unordered_map>
#include <sol/sol.hpp> #include <sol/sol.hpp>
#include <vector> #include <vector>
#include <plugins/LuaServer.hpp>
class Level; class Minecraft;
class PluginsManager { class PluginsManager {
public: public:
PluginsManager(Level& level); static inline PluginsManager& get() {
static PluginsManager inst;
return inst;
}
void init(Minecraft& minecraft);
void registerTypes(); void registerTypes();
void subscribe(std::string event, sol::function function); void loadPlugins();
// @ai @note maybe we should rewrite it...
// problem that i dont know how to pass args in sol::function dynamically
// so i used ai
// sry :(
template<typename... Args>
void emit(std::string event, Args&&... args) {
auto it = m_callbacks.find(event);
if (it == m_callbacks.end()) return;
for (auto& callback : it->second) {
sol::protected_function_result result = callback(std::forward<Args>(args)...);
if (!result.valid()) {
sol::error err = result;
std::cout << err.what() << std::endl;
}
}
}
Minecraft* getMinecraft() { return m_minecraft; }
private: private:
std::unordered_map<std::string, std::vector<sol::function>> m_callbacks; std::unordered_map<std::string, std::vector<sol::function>> m_callbacks;
LuaServer m_srv;
sol::state m_lua; sol::state m_lua;
Level& m_level; Minecraft* m_minecraft;
}; };