forked from Kolyah35/minecraft-pe-0.6.1
1
This commit is contained in:
@@ -5,49 +5,89 @@
|
||||
#include <network/ServerSideNetworkHandler.h>
|
||||
#include <world/entity/player/Player.h>
|
||||
#include <client/Minecraft.h>
|
||||
#include <network/packet/ChatPacket.h>
|
||||
#include <network/packet/MovePlayerPacket.h>
|
||||
#include <world/entity/player/Inventory.h>
|
||||
|
||||
class LuaPlayer {
|
||||
public:
|
||||
LuaPlayer(const RakNet::RakNetGUID source) : m_source(source) {}
|
||||
|
||||
std::string getNickname() {
|
||||
Player* getPlayer() {
|
||||
auto mc = PluginsManager::get().getMinecraft();
|
||||
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback;
|
||||
|
||||
auto plr = ss->getPlayer(m_source);
|
||||
|
||||
return plr;
|
||||
}
|
||||
|
||||
std::string getNickname() {
|
||||
auto plr = getPlayer();
|
||||
if (plr != nullptr) return plr->name;
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
float getX() {
|
||||
auto mc = PluginsManager::get().getMinecraft();
|
||||
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback;
|
||||
std::tuple<float, float, float, float, float> getPos() {
|
||||
auto plr = getPlayer();
|
||||
if (plr != nullptr) return {plr->x, plr->y, plr->z, plr->yRot, plr->xRot};
|
||||
|
||||
auto plr = ss->getPlayer(m_source);
|
||||
if (plr != nullptr) return plr->x;
|
||||
|
||||
return 0;
|
||||
return {0, 0, 0, 0, 0};
|
||||
}
|
||||
|
||||
float getY() {
|
||||
void setPos(float x, float y, float z, float yRot, float xRot) {
|
||||
auto plr = getPlayer();
|
||||
if (plr == nullptr) return;
|
||||
|
||||
auto mc = PluginsManager::get().getMinecraft();
|
||||
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback;
|
||||
|
||||
auto plr = ss->getPlayer(m_source);
|
||||
if (plr != nullptr) return plr->y;
|
||||
|
||||
return 0;
|
||||
// plr->x = x;
|
||||
// plr->y = y;
|
||||
// plr->z = z;
|
||||
// plr->yRot = yRot;
|
||||
// plr->xRot = xRot;
|
||||
plr->xd = plr->yd = plr->zd = 0;
|
||||
plr->lerpTo(x, y, z, yRot, xRot, 3);
|
||||
|
||||
MovePlayerPacket move(plr->entityId, x, y, z, yRot, xRot);
|
||||
|
||||
ss->sendPrivate(move, m_source);
|
||||
}
|
||||
|
||||
float getZ() {
|
||||
void sendMessage(std::string msg) {
|
||||
auto mc = PluginsManager::get().getMinecraft();
|
||||
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback;
|
||||
ChatPacket packet(msg);
|
||||
|
||||
auto plr = ss->getPlayer(m_source);
|
||||
if (plr != nullptr) return plr->z;
|
||||
ss->sendPrivate(packet, m_source);
|
||||
}
|
||||
|
||||
return 0;
|
||||
void addItem(int id, int count, int auxValue) {
|
||||
auto plr = getPlayer();
|
||||
if (plr == nullptr) return;
|
||||
|
||||
plr->inventory->add(new ItemInstance(id, count, auxValue));
|
||||
}
|
||||
|
||||
sol::table getInventory() {
|
||||
auto plr = getPlayer();
|
||||
if (plr == nullptr) return {};
|
||||
|
||||
sol::table inv = PluginsManager::get().getLua().create_table();
|
||||
|
||||
for (int i = Inventory::MAX_SELECTION_SIZE; i < plr->inventory->getContainerSize(); i++) {
|
||||
auto itm = plr->inventory->getItem(i);
|
||||
|
||||
if (itm != NULL) {
|
||||
inv[i - 8] = {itm->id, itm->count, itm->getAuxValue()};
|
||||
} else {
|
||||
inv[i - 8] = sol::lua_nil;
|
||||
}
|
||||
}
|
||||
|
||||
return inv;
|
||||
}
|
||||
private:
|
||||
const RakNet::RakNetGUID m_source;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
void PluginsManager::init(Minecraft& minecraft) {
|
||||
m_lua.open_libraries(sol::lib::base, sol::lib::package, sol::lib::string, sol::lib::math, sol::lib::table);
|
||||
m_lua.open_libraries(sol::lib::base, sol::lib::package, sol::lib::string, sol::lib::math, sol::lib::table, sol::lib::io);
|
||||
registerTypes();
|
||||
|
||||
m_minecraft = &minecraft;
|
||||
@@ -19,10 +19,13 @@ void PluginsManager::registerTypes() {
|
||||
// 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.set_function("addCommand", [this](std::string commandName, sol::function func) {
|
||||
m_luaCommands[commandName].push_back(func);
|
||||
});
|
||||
|
||||
m_lua.new_usertype<LuaServer>(
|
||||
"Server",
|
||||
"sendMessage", &LuaServer::sendServerMessage
|
||||
@@ -31,9 +34,10 @@ void PluginsManager::registerTypes() {
|
||||
m_lua.new_usertype<LuaPlayer>(
|
||||
"Player",
|
||||
"getNickname", &LuaPlayer::getNickname,
|
||||
"getX", &LuaPlayer::getX,
|
||||
"getY", &LuaPlayer::getY,
|
||||
"getZ", &LuaPlayer::getZ
|
||||
"getPos", &LuaPlayer::getPos,
|
||||
"setPos", &LuaPlayer::setPos,
|
||||
"sendMessage", &LuaPlayer::sendMessage,
|
||||
"getInventory", &LuaPlayer::getInventory
|
||||
);
|
||||
|
||||
m_lua["Server"] = &m_srv;
|
||||
@@ -42,7 +46,13 @@ void PluginsManager::registerTypes() {
|
||||
void PluginsManager::loadPlugins() {
|
||||
std::string path = "plugins/";
|
||||
|
||||
for (const auto & entry : fs::directory_iterator(path)) {
|
||||
m_lua.script_file(entry.path().string());
|
||||
if (fs::exists(path)) {
|
||||
for (const auto& entry : fs::directory_iterator(path)) {
|
||||
if (!fs::is_directory(entry.path().string())) {
|
||||
m_lua.script_file(entry.path().string());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
std::filesystem::create_directory(path);
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,8 @@ public:
|
||||
|
||||
void loadPlugins();
|
||||
|
||||
sol::state& getLua() { return m_lua; }
|
||||
|
||||
// @ai @note maybe we should rewrite it...
|
||||
// problem that i dont know how to pass args in sol::function dynamically
|
||||
// so i used ai
|
||||
@@ -38,11 +40,29 @@ public:
|
||||
std::cout << err.what() << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename... Args>
|
||||
int emitCommands(std::string event, Args&&... args) {
|
||||
auto it = m_luaCommands.find(event);
|
||||
|
||||
if (it == m_luaCommands.end()) return 1;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Minecraft* getMinecraft() { return m_minecraft; }
|
||||
private:
|
||||
std::unordered_map<std::string, std::vector<sol::function>> m_callbacks;
|
||||
std::unordered_map<std::string, std::vector<sol::function>> m_luaCommands;
|
||||
|
||||
LuaServer m_srv;
|
||||
sol::state m_lua;
|
||||
|
||||
Reference in New Issue
Block a user