summaryrefslogtreecommitdiff
path: root/src/rollback_interface.h
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-07-26 22:06:45 +0300
committerPerttu Ahola <celeron55@gmail.com>2012-07-27 02:27:18 +0300
commit0190f9b077dcb2b8cb41c622dd91ffc1e04dacac (patch)
tree0baa7a5d2094afdbb193e1850836c209c9395c70 /src/rollback_interface.h
parent0c91a0d59db70f3f502004d4c37fecd4e10c9401 (diff)
downloadminetest-0190f9b077dcb2b8cb41c622dd91ffc1e04dacac.tar.gz
minetest-0190f9b077dcb2b8cb41c622dd91ffc1e04dacac.tar.bz2
minetest-0190f9b077dcb2b8cb41c622dd91ffc1e04dacac.zip
Experimental-ish rollback functionality
Diffstat (limited to 'src/rollback_interface.h')
-rw-r--r--src/rollback_interface.h145
1 files changed, 145 insertions, 0 deletions
diff --git a/src/rollback_interface.h b/src/rollback_interface.h
new file mode 100644
index 000000000..0f0a11885
--- /dev/null
+++ b/src/rollback_interface.h
@@ -0,0 +1,145 @@
+/*
+Minetest-c55
+Copyright (C) 2012 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef ROLLBACK_INTERFACE_HEADER
+#define ROLLBACK_INTERFACE_HEADER
+
+#include "irr_v3d.h"
+#include <string>
+#include <iostream>
+#include "exceptions.h"
+
+class Map;
+class IGameDef;
+struct MapNode;
+class InventoryManager;
+
+struct RollbackNode
+{
+ std::string name;
+ int param1;
+ int param2;
+ std::string meta;
+
+ bool operator==(const RollbackNode &other)
+ {
+ return (name == other.name && param1 == other.param1 &&
+ param2 == other.param2 && meta == other.meta);
+ }
+ bool operator!=(const RollbackNode &other)
+ {
+ return !(*this == other);
+ }
+
+ RollbackNode():
+ param1(0),
+ param2(0)
+ {}
+
+ RollbackNode(Map *map, v3s16 p, IGameDef *gamedef);
+};
+
+struct RollbackAction
+{
+ enum Type{
+ TYPE_NOTHING,
+ TYPE_SET_NODE,
+ TYPE_MODIFY_INVENTORY_STACK,
+ } type;
+
+ int unix_time;
+ std::string actor;
+
+ v3s16 p;
+ RollbackNode n_old;
+ RollbackNode n_new;
+
+ std::string inventory_location;
+ std::string inventory_list;
+ u32 inventory_index;
+ bool inventory_add;
+ std::string inventory_stack;
+
+ RollbackAction():
+ type(TYPE_NOTHING)
+ {}
+
+ void setSetNode(v3s16 p_, const RollbackNode &n_old_,
+ const RollbackNode &n_new_)
+ {
+ type = TYPE_SET_NODE;
+ p = p_;
+ n_old = n_old_;
+ n_new = n_new_;
+ }
+
+ void setModifyInventoryStack(const std::string &inventory_location_,
+ const std::string &inventory_list_, int index_,
+ bool add_, const std::string &inventory_stack_)
+ {
+ type = TYPE_MODIFY_INVENTORY_STACK;
+ inventory_location = inventory_location_;
+ inventory_list = inventory_list_;
+ inventory_index = index_;
+ inventory_add = add_;
+ inventory_stack = inventory_stack_;
+ }
+
+ // String should not contain newlines or nulls
+ std::string toString() const;
+ void fromStream(std::istream &is) throw(SerializationError);
+
+ // Eg. flowing water level changes are not important
+ bool isImportant(IGameDef *gamedef) const;
+
+ bool applyRevert(Map *map, InventoryManager *imgr, IGameDef *gamedef) const;
+};
+
+class IRollbackReportSink
+{
+public:
+ virtual ~IRollbackReportSink(){}
+ virtual void reportAction(const RollbackAction &action) = 0;
+ virtual std::string getActor() = 0;
+ virtual void setActor(const std::string &actor) = 0;
+};
+
+class RollbackScopeActor
+{
+public:
+ RollbackScopeActor(IRollbackReportSink *sink, const std::string &actor):
+ m_sink(sink)
+ {
+ if(m_sink){
+ m_actor_was = m_sink->getActor();
+ m_sink->setActor(actor);
+ }
+ }
+ ~RollbackScopeActor()
+ {
+ if(m_sink){
+ m_sink->setActor(m_actor_was);
+ }
+ }
+private:
+ IRollbackReportSink *m_sink;
+ std::string m_actor_was;
+};
+
+#endif