[Refactor] :O Machines now walk the earth!!
Old vfs_node was getting a bit big for its boots, trying to be a filesystem, network interface and the whole damn computer all at once. This server-side refactor introduces a 'Machine' class that rightfully owns the VFS, network services and other machine-state sh.t.
This commit is contained in:
parent
28804998d7
commit
59783d2408
@ -62,7 +62,7 @@ void ClientNetwork::disconnect(void) {
|
|||||||
_context_thread.join();
|
_context_thread.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Should be safe to close the socket no that thread is stoped <questionmark> */
|
/* Should be safe to close the socket now that thread is stoped <questionmark> */
|
||||||
if(is_connected()) {
|
if(is_connected()) {
|
||||||
/* Close the socket. Causes outstanding async operations
|
/* Close the socket. Causes outstanding async operations
|
||||||
* in TcpConnection to compete with an error, which in return
|
* in TcpConnection to compete with an error, which in return
|
||||||
|
|||||||
@ -1,18 +1,19 @@
|
|||||||
#include "command_processor.h"
|
|
||||||
#include <sol/types.hpp>
|
#include <sol/types.hpp>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "command_processor.h"
|
||||||
#include "vfs.h"
|
#include "vfs.h"
|
||||||
#include "lua_processor.h"
|
#include "lua_processor.h"
|
||||||
#include "vfs_manager.h"
|
#include "machine_manager.h"
|
||||||
|
#include "machine.h"
|
||||||
|
|
||||||
CommandProcessor::CommandProcessor(vfs_node* home_vfs,
|
CommandProcessor::CommandProcessor(Machine* home_machine,
|
||||||
std::map<std::string, vfs_node*>& world_vfs) :
|
std::map<std::string, Machine*>& world_machines) :
|
||||||
_world_vfs(world_vfs) {
|
_home_machine(home_machine),
|
||||||
|
_session_machine(home_machine),
|
||||||
|
_world_machines(world_machines) {
|
||||||
_lua = new LuaProcessor();
|
_lua = new LuaProcessor();
|
||||||
home_vfs_root = home_vfs;
|
_current_dir = _session_machine->vfs_root;
|
||||||
session_vfs_root = home_vfs_root;
|
|
||||||
_current_dir = session_vfs_root;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandProcessor::~CommandProcessor(void) {
|
CommandProcessor::~CommandProcessor(void) {
|
||||||
@ -41,15 +42,12 @@ std::string CommandProcessor::process_command(const std::string& command) {
|
|||||||
args.push_back(arg);
|
args.push_back(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search for script in the /bin directory. */
|
/* Search for script in the /bin directory of the current session machine. */
|
||||||
std::string script_filename = command_name + ".lua";
|
std::string script_filename = command_name + ".lua";
|
||||||
vfs_node* root = _current_dir;
|
vfs_node* root = _session_machine->vfs_root;
|
||||||
while(root->parent != nullptr) {
|
|
||||||
root = root->parent;
|
|
||||||
}
|
|
||||||
if(root->children.count("bin") && root->children["bin"]->children.count(script_filename)) {
|
if(root->children.count("bin") && root->children["bin"]->children.count(script_filename)) {
|
||||||
vfs_node* script_node = root->children["bin"]->children[script_filename];
|
vfs_node* script_node = root->children["bin"]->children[script_filename];
|
||||||
bool is_remote = (session_vfs_root != home_vfs_root);
|
bool is_remote = (_session_machine != _home_machine);
|
||||||
sol::object result = _lua->execute(script_node->content, _current_dir, args, is_remote);
|
sol::object result = _lua->execute(script_node->content, _current_dir, args, is_remote);
|
||||||
if(result.is<std::string>()) {
|
if(result.is<std::string>()) {
|
||||||
return result.as<std::string>();
|
return result.as<std::string>();
|
||||||
@ -101,9 +99,9 @@ std::string CommandProcessor::_handle_vfs_action(sol::table action) {
|
|||||||
if(_current_dir->read_only) {
|
if(_current_dir->read_only) {
|
||||||
std::string remote_ip = "";
|
std::string remote_ip = "";
|
||||||
/* Check if we are on a known remote system. */
|
/* Check if we are on a known remote system. */
|
||||||
if(session_vfs_root != home_vfs_root) {
|
if(!_session_machine->is_vfs_a_copy) {
|
||||||
for(auto const& [ip, root_node] : _world_vfs) {
|
for(auto const& [ip, machine] : _world_machines) {
|
||||||
if(root_node == session_vfs_root) {
|
if(machine == _session_machine) {
|
||||||
remote_ip = ip;
|
remote_ip = ip;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -111,19 +109,29 @@ std::string CommandProcessor::_handle_vfs_action(sol::table action) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!remote_ip.empty()) {
|
if(!remote_ip.empty()) {
|
||||||
/* CoW for a remote system. */
|
/* This machine is using a shared VFS. Copy it! ;) */
|
||||||
fprintf(stderr, "CoW: Write attempt on read-only remote system '%s'."
|
fprintf(stderr, "CoW: Write attempt on read-only remote system '%s'."
|
||||||
"Creating persistant copy.\n", remote_ip.c_str());
|
"Creating persistant copy.\n", remote_ip.c_str());
|
||||||
std::string original_path = get_full_path(_current_dir);
|
std::string original_path = get_full_path(_current_dir);
|
||||||
vfs_node* new_root = copy_vfs_node(session_vfs_root, nullptr);
|
/* Copy the sh.t out of the VFS. */
|
||||||
make_vfs_writable(new_root);
|
vfs_node* new_vfs_root = copy_vfs_node(_session_machine->vfs_root, nullptr);
|
||||||
_world_vfs[remote_ip] = new_root;
|
make_vfs_writable(new_vfs_root);
|
||||||
session_vfs_root = new_root;
|
|
||||||
_current_dir = find_node_by_path(session_vfs_root, original_path);
|
/* Create the new machine that will hold the copied VFS. */
|
||||||
if(!_current_dir) { _current_dir = session_vfs_root; } /* Just in case. */
|
auto* new_machine = new Machine(_session_machine->id, _session_machine->hostname);
|
||||||
|
new_machine->vfs_root = new_vfs_root;
|
||||||
|
new_machine->services = _session_machine->services;
|
||||||
|
new_machine->is_vfs_a_copy = true; /* Mark as copy. */
|
||||||
|
|
||||||
|
/* Update the world map and the current session. */
|
||||||
|
_world_machines[remote_ip] = new_machine;
|
||||||
|
_session_machine = new_machine;
|
||||||
|
|
||||||
|
/* Update _current_dir to point to the equivalent dir in the new VFS. */
|
||||||
|
_current_dir = find_node_by_path(_session_machine->vfs_root, original_path);
|
||||||
|
if(!_current_dir) { _current_dir = _session_machine->vfs_root; }
|
||||||
} else {
|
} else {
|
||||||
/* If not a known remote system, i.e, player's own /bin, deny. */
|
return "Permission denied: Filesystem is read-only and not part of the world.";
|
||||||
return "Permission denied: Filesystem is read-only.";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -163,9 +171,9 @@ std::string CommandProcessor::_handle_vfs_action(sol::table action) {
|
|||||||
return ""; /* Success. */
|
return ""; /* Success. */
|
||||||
} else if(action_name == "ssh") {
|
} else if(action_name == "ssh") {
|
||||||
std::string target_ip = action["target"].get_or<std::string>("");
|
std::string target_ip = action["target"].get_or<std::string>("");
|
||||||
if(_world_vfs.count(target_ip)) {
|
if(_world_machines.count(target_ip)) {
|
||||||
session_vfs_root = _world_vfs[target_ip];
|
_session_machine = _world_machines[target_ip];
|
||||||
_current_dir = session_vfs_root;
|
_current_dir = _session_machine->vfs_root;
|
||||||
return "Connected to " + target_ip;
|
return "Connected to " + target_ip;
|
||||||
}
|
}
|
||||||
return "ssh: Could not resolve hostname " + target_ip + ": Name or service not known";
|
return "ssh: Could not resolve hostname " + target_ip + ": Name or service not known";
|
||||||
@ -187,26 +195,26 @@ std::string CommandProcessor::_handle_vfs_action(sol::table action) {
|
|||||||
}
|
}
|
||||||
return ""; /* Success. */
|
return ""; /* Success. */
|
||||||
} else if(action_name == "disconnect") {
|
} else if(action_name == "disconnect") {
|
||||||
session_vfs_root = home_vfs_root;
|
_session_machine = _home_machine;
|
||||||
_current_dir = home_vfs_root;
|
_current_dir = _home_machine->vfs_root;
|
||||||
return "Connection closed.";
|
return "Connection closed.";
|
||||||
} else if(action_name == "close_terminal") {
|
} else if(action_name == "close_terminal") {
|
||||||
return "__CLOSE_CONNECTION__";
|
return "__CLOSE_CONNECTION__";
|
||||||
} else if(action_name == "scan") {
|
} else if(action_name == "scan") {
|
||||||
std::string target_ip = action["target"].get_or<std::string>("");
|
std::string target_ip = action["target"].get_or<std::string>("");
|
||||||
if(!_world_vfs.count(target_ip)) {
|
if(!_world_machines.count(target_ip)) {
|
||||||
return std::string("nmap: Could not resolve host: ") + target_ip;
|
return std::string("nmap: Could not resolve host: ") + target_ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
vfs_node* target_root = _world_vfs[target_ip];
|
Machine* target_machine = _world_machines[target_ip];
|
||||||
if(target_root->services.empty()) {
|
if(target_machine->services.empty()) {
|
||||||
return std::string("No open ports for ") + target_ip;
|
return std::string("No open ports for ") + target_ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss<<"Host: "<<target_ip<<"\n";
|
ss<<"Host: "<<target_ip<<"\n";
|
||||||
ss<<"PORT\tSTATE\tSERVICE\n";
|
ss<<"PORT\tSTATE\tSERVICE\n";
|
||||||
for(auto const& [port, service_name] : target_root->services) {
|
for(auto const& [port, service_name] : target_machine->services) {
|
||||||
ss<<port<<"/tcp\t"<<"open\t"<<service_name<<"\n";
|
ss<<port<<"/tcp\t"<<"open\t"<<service_name<<"\n";
|
||||||
}
|
}
|
||||||
return ss.str();
|
return ss.str();
|
||||||
|
|||||||
@ -4,11 +4,12 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
#include "machine.h"
|
||||||
#include "vfs.h"
|
#include "vfs.h"
|
||||||
|
|
||||||
class CommandProcessor {
|
class CommandProcessor {
|
||||||
public:
|
public:
|
||||||
CommandProcessor(vfs_node* home_vfs, std::map<std::string, vfs_node*>& world_vfs);
|
CommandProcessor(Machine* home_machine, std::map<std::string, Machine*>& world_machines);
|
||||||
~CommandProcessor(void);
|
~CommandProcessor(void);
|
||||||
|
|
||||||
std::string process_command(const std::string& command);
|
std::string process_command(const std::string& command);
|
||||||
@ -16,9 +17,9 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::string _handle_vfs_action(sol::table action);
|
std::string _handle_vfs_action(sol::table action);
|
||||||
vfs_node* home_vfs_root;
|
Machine* _home_machine;
|
||||||
vfs_node* session_vfs_root;
|
Machine* _session_machine;
|
||||||
vfs_node* _current_dir;
|
vfs_node* _current_dir;
|
||||||
std::map<std::string, vfs_node*>& _world_vfs;
|
std::map<std::string, Machine*>& _world_machines;
|
||||||
LuaProcessor* _lua;
|
LuaProcessor* _lua;
|
||||||
};
|
};
|
||||||
|
|||||||
28
common/src/machine.h
Normal file
28
common/src/machine.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "vfs.h"
|
||||||
|
|
||||||
|
|
||||||
|
class Machine {
|
||||||
|
public:
|
||||||
|
Machine(uint32_t id, std::string hostname) :
|
||||||
|
id(id),
|
||||||
|
hostname(std::move(hostname)),
|
||||||
|
vfs_root(nullptr),
|
||||||
|
is_vfs_a_copy(false) {}
|
||||||
|
|
||||||
|
/* TODO: Implement recursive deletion of vfs_root. */
|
||||||
|
~Machine(void); /* Clean up VFS tree. */
|
||||||
|
|
||||||
|
uint32_t id;
|
||||||
|
std::string hostname;
|
||||||
|
vfs_node* vfs_root;
|
||||||
|
std::map<int, std::string> services;
|
||||||
|
bool is_vfs_a_copy; /* Flag for CoW mechanism. */
|
||||||
|
|
||||||
|
/* TODO: We'll add hardware and sh.t here. */
|
||||||
|
};
|
||||||
@ -1,8 +1,10 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#include "vfs_manager.h"
|
#include "machine_manager.h"
|
||||||
|
#include "machine.h"
|
||||||
#include "vfs.h"
|
#include "vfs.h"
|
||||||
|
|
||||||
/* Create a new node. */
|
/* Create a new node. */
|
||||||
@ -33,14 +35,14 @@ vfs_node* copy_vfs_node(vfs_node* original, vfs_node* new_parent) {
|
|||||||
return new_copy;
|
return new_copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
VFSManager::VFSManager(void) {
|
MachineManager::MachineManager(void) {
|
||||||
/* Create template VFS that holds shared, read-only directories. */
|
/* Create template VFS that holds shared, read-only directories. */
|
||||||
_vfs_root = new_node("/", DIR_NODE, nullptr);
|
_vfs_template_root = new_node("/", DIR_NODE, nullptr);
|
||||||
vfs_node* bin = new_node("bin", DIR_NODE, _vfs_root);
|
vfs_node* bin = new_node("bin", DIR_NODE, _vfs_template_root);
|
||||||
_vfs_root->children["bin"] = bin;
|
_vfs_template_root->children["bin"] = bin;
|
||||||
|
|
||||||
_vfs_root->read_only = true;
|
_vfs_template_root->read_only = true;
|
||||||
bin->read_only = true;
|
bin->read_only = true;
|
||||||
|
|
||||||
/* Load all scripts from assets/scripts/bin into the VFS. */
|
/* Load all scripts from assets/scripts/bin into the VFS. */
|
||||||
const std::string path = "assets/scripts/bin";
|
const std::string path = "assets/scripts/bin";
|
||||||
@ -58,12 +60,15 @@ VFSManager::VFSManager(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VFSManager::~VFSManager(void) {
|
MachineManager::~MachineManager(void) {
|
||||||
/* TODO: Implement recursive deletion of all created VFS nodes.*/
|
/* TODO: Implement recursive deletion of all created VFS nodes.*/
|
||||||
//delete _vfs_root;
|
//delete _vfs_root;
|
||||||
}
|
}
|
||||||
|
|
||||||
vfs_node* VFSManager::create_vfs(const std::string& system_type) {
|
Machine* MachineManager::create_machine(uint32_t id, const std::string& hostname,
|
||||||
|
const std::string& system_type) {
|
||||||
|
auto* new_machine = new Machine(id, hostname);
|
||||||
|
|
||||||
vfs_node* root = new_node("/", DIR_NODE, nullptr);
|
vfs_node* root = new_node("/", DIR_NODE, nullptr);
|
||||||
|
|
||||||
/* Create directories for this specific VFS. */
|
/* Create directories for this specific VFS. */
|
||||||
@ -75,10 +80,13 @@ vfs_node* VFSManager::create_vfs(const std::string& system_type) {
|
|||||||
user->children["readme.txt"] = readme;
|
user->children["readme.txt"] = readme;
|
||||||
|
|
||||||
/* Link to the shared directories from the template. */
|
/* Link to the shared directories from the template. */
|
||||||
root->children["bin"] = copy_vfs_node(_vfs_root->children["bin"], root);
|
root->children["bin"] = copy_vfs_node(_vfs_template_root->children["bin"], root);
|
||||||
|
|
||||||
|
/* Assign the VFS to the new machine. */
|
||||||
|
new_machine->vfs_root = root;
|
||||||
|
|
||||||
/* Default services. All machines have SSH currently. */
|
/* Default services. All machines have SSH currently. */
|
||||||
root->services[22] = "SSH v1.2";
|
new_machine->services[22] = "SSH v1.2";
|
||||||
|
|
||||||
if(system_type == "npc") {
|
if(system_type == "npc") {
|
||||||
vfs_node* npc_file = new_node("npc_system.txt", FILE_NODE, root);
|
vfs_node* npc_file = new_node("npc_system.txt", FILE_NODE, root);
|
||||||
@ -87,5 +95,5 @@ vfs_node* VFSManager::create_vfs(const std::string& system_type) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return root;
|
return new_machine;
|
||||||
}
|
}
|
||||||
21
common/src/machine_manager.h
Normal file
21
common/src/machine_manager.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "machine.h"
|
||||||
|
#include "vfs.h"
|
||||||
|
|
||||||
|
/* Recursive copy function for our Copy-on-Write behaviour. */
|
||||||
|
vfs_node* copy_vfs_node(vfs_node* original, vfs_node* new_parent);
|
||||||
|
|
||||||
|
class MachineManager {
|
||||||
|
public:
|
||||||
|
MachineManager(void);
|
||||||
|
~MachineManager(void); /* TODO: Implement recursive VFS deletion. */
|
||||||
|
|
||||||
|
Machine* create_machine(uint32_t id, const std::string& hostname,
|
||||||
|
const std::string& system_type);
|
||||||
|
private:
|
||||||
|
vfs_node* _vfs_template_root;
|
||||||
|
};
|
||||||
|
|
||||||
@ -24,9 +24,6 @@ struct vfs_node {
|
|||||||
/* Directories. */
|
/* Directories. */
|
||||||
vfs_child_map children;
|
vfs_child_map children;
|
||||||
vfs_node* parent;
|
vfs_node* parent;
|
||||||
|
|
||||||
/* Services (for root nodes). */
|
|
||||||
std::map<int, std::string> services;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string get_full_path(vfs_node* node);
|
std::string get_full_path(vfs_node* node);
|
||||||
|
|||||||
@ -1,19 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "vfs.h"
|
|
||||||
|
|
||||||
/* Recursive copy function for our Copy-on-Write behaviour. */
|
|
||||||
vfs_node* copy_vfs_node(vfs_node* original, vfs_node* new_parent);
|
|
||||||
|
|
||||||
class VFSManager {
|
|
||||||
public:
|
|
||||||
VFSManager(void);
|
|
||||||
~VFSManager(void); /* TODO: Implement recursive VFS deletion. */
|
|
||||||
|
|
||||||
vfs_node* create_vfs(const std::string& system_type);
|
|
||||||
private:
|
|
||||||
vfs_node* _vfs_root;
|
|
||||||
};
|
|
||||||
|
|
||||||
@ -1,6 +1,7 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "network_manager.h"
|
#include "network_manager.h"
|
||||||
|
|
||||||
@ -9,19 +10,20 @@
|
|||||||
#include "asio/ip/tcp.hpp"
|
#include "asio/ip/tcp.hpp"
|
||||||
#include "command_processor.h"
|
#include "command_processor.h"
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
|
#include "machine.h"
|
||||||
#include "net/tcp_connection.h"
|
#include "net/tcp_connection.h"
|
||||||
#include "vfs.h"
|
#include "vfs.h"
|
||||||
|
|
||||||
NetworkManager::NetworkManager(void) : _acceptor(_io_context) {
|
NetworkManager::NetworkManager(void) : _acceptor(_io_context) {
|
||||||
/* VFS setup. */
|
/* World setup. */
|
||||||
_world_vfs["8.8.8.8"] = _vfs_manager.create_vfs("npc");
|
_world_machines["8.8.8.8"] = _machine_manager.create_machine(1000, "dns.google", "npc");
|
||||||
_world_vfs["10.0.2.15"] = _vfs_manager.create_vfs("npc");
|
_world_machines["10.0.2.15"] = _machine_manager.create_machine(1001, "corp.internal", "npc");
|
||||||
|
|
||||||
/* Specific npc services. */
|
/* Specific npc services. */
|
||||||
_world_vfs["8.8.8.8"]->services[80] = "HTTPD v2.4";
|
_world_machines["8.8.8.8"]->services[80] = "HTTPD v2.4";
|
||||||
_world_vfs["10.0.2.15"]->services[21] = "FTPd v3.0";
|
_world_machines["10.0.2.15"]->services[21] = "FTPd v3.0";
|
||||||
|
|
||||||
fprintf(stderr, "Created world with %zu networks\n", _world_vfs.size());
|
fprintf(stderr, "Created world with %zu networks\n", _world_machines.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkManager::~NetworkManager(void) { stop(); }
|
NetworkManager::~NetworkManager(void) { stop(); }
|
||||||
@ -64,7 +66,9 @@ void NetworkManager::start_accept(void) {
|
|||||||
|
|
||||||
/* Create a new player for this connection. */
|
/* Create a new player for this connection. */
|
||||||
uint32_t player_id = _next_player_id++;
|
uint32_t player_id = _next_player_id++;
|
||||||
auto new_player = std::make_unique<Player>(player_id, _vfs_manager, _world_vfs);
|
Machine* player_machine = _machine_manager.create_machine(player_id, "player.home",
|
||||||
|
"player");
|
||||||
|
auto new_player = std::make_unique<Player>(player_id, player_machine, _world_machines);
|
||||||
Player* new_player_ptr = new_player.get();
|
Player* new_player_ptr = new_player.get();
|
||||||
_players[player_id] = std::move(new_player);
|
_players[player_id] = std::move(new_player);
|
||||||
new_connection->set_id(player_id);
|
new_connection->set_id(player_id);
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
#include "asio/io_context.hpp"
|
#include "asio/io_context.hpp"
|
||||||
#include "net/tcp_connection.h"
|
#include "net/tcp_connection.h"
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
#include "vfs_manager.h"
|
#include "machine_manager.h"
|
||||||
|
|
||||||
class NetworkManager {
|
class NetworkManager {
|
||||||
public:
|
public:
|
||||||
@ -34,6 +34,6 @@ private:
|
|||||||
std::unordered_map<uint32_t, std::unique_ptr<Player>> _players;
|
std::unordered_map<uint32_t, std::unique_ptr<Player>> _players;
|
||||||
uint32_t _next_player_id = 1;
|
uint32_t _next_player_id = 1;
|
||||||
|
|
||||||
std::map<std::string, vfs_node*> _world_vfs; /* For NPC's. */
|
std::map<std::string, Machine*> _world_machines; /* For NPC's. */
|
||||||
VFSManager _vfs_manager;
|
MachineManager _machine_manager;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,17 +1,15 @@
|
|||||||
#include "player.h"
|
#include "player.h"
|
||||||
#include "command_processor.h"
|
#include "command_processor.h"
|
||||||
|
#include "machine.h"
|
||||||
|
|
||||||
Player::Player(uint32_t new_id, VFSManager& vfs_manager,
|
Player::Player(uint32_t new_id, Machine* home_machine,
|
||||||
std::map<std::string, vfs_node*>& world_vfs) :
|
std::map<std::string, Machine*>& world_machines) :
|
||||||
id(new_id) {
|
id(new_id) {
|
||||||
vfs_node* player_vfs = vfs_manager.create_vfs("player");
|
cmd_processor = new CommandProcessor(home_machine, world_machines);
|
||||||
cmd_processor = new CommandProcessor(player_vfs, world_vfs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Player::~Player(void) {
|
Player::~Player(void) {
|
||||||
if(cmd_processor) {
|
if(cmd_processor) {
|
||||||
delete cmd_processor;
|
delete cmd_processor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: The VFSManager should handle deleting the player_vfs_root. */
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,16 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "command_processor.h"
|
#include "command_processor.h"
|
||||||
#include "vfs.h"
|
#include "machine.h"
|
||||||
#include "vfs_manager.h"
|
|
||||||
|
|
||||||
class CommandProcessor;
|
|
||||||
|
|
||||||
class Player {
|
class Player {
|
||||||
public:
|
public:
|
||||||
Player(uint32_t id, VFSManager& vfs_manager, std::map<std::string, vfs_node*>& world_vfs);
|
Player(uint32_t id, Machine* home_machine, std::map<std::string, Machine*>& world_machines);
|
||||||
~Player(void);
|
~Player(void);
|
||||||
|
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user