update
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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__*/
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
54
src/plugins/LuaPlayer.hpp
Normal 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
11
src/plugins/LuaServer.cpp
Normal 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);
|
||||||
|
}
|
||||||
7
src/plugins/LuaServer.hpp
Normal file
7
src/plugins/LuaServer.hpp
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class LuaServer {
|
||||||
|
public:
|
||||||
|
void sendServerMessage(std::string msg);
|
||||||
|
};
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user