forked from github/server
Messages als LUA-Objekte. Damit lassen sich jetzt auch von LUA aus lokalisierte messages an Parteien versenden.
This commit is contained in:
parent
6426004640
commit
b3c4dda44a
|
@ -0,0 +1,163 @@
|
|||
#include <config.h>
|
||||
#include <eressea.h>
|
||||
#include "message.h"
|
||||
|
||||
// kernel includes
|
||||
#include <kernel/faction.h>
|
||||
#include <kernel/item.h>
|
||||
#include <kernel/unit.h>
|
||||
|
||||
// util includes
|
||||
#include <util/message.h>
|
||||
|
||||
// lua includes
|
||||
#include <lua.hpp>
|
||||
#include <luabind/luabind.hpp>
|
||||
#include <luabind/iterator_policy.hpp>
|
||||
#ifdef HAVE_LUABIND_B7
|
||||
# include <luabind/operator.hpp>
|
||||
#endif
|
||||
|
||||
#include <ostream>
|
||||
|
||||
using namespace luabind;
|
||||
|
||||
#define E_OK 0
|
||||
#define E_INVALID_MESSAGE 1
|
||||
#define E_INVALID_PARAMETER_NAME 2
|
||||
#define E_INVALID_PARAMETER_TYPE 3
|
||||
#define E_INVALID_PARAMETER_VALUE 4
|
||||
|
||||
class lua_message {
|
||||
public:
|
||||
lua_message(const char *type) : msg(0), args(0) {
|
||||
mtype = mt_find(type);
|
||||
if (mtype) {
|
||||
args = (variant*)calloc(mtype->nparameters, sizeof(variant));
|
||||
}
|
||||
}
|
||||
|
||||
~lua_message() {
|
||||
if (msg) msg_release(msg);
|
||||
if (mtype) {
|
||||
for (int i=0;i!=mtype->nparameters;++i) {
|
||||
if (mtype->types[i]->release) {
|
||||
mtype->types[i]->release(args[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int set_resource(const char * param, const char * resname) {
|
||||
if (mtype==0) return E_INVALID_MESSAGE;
|
||||
|
||||
int i = get_param(param);
|
||||
if (i==mtype->nparameters) {
|
||||
return E_INVALID_PARAMETER_NAME;
|
||||
}
|
||||
if (strcmp(mtype->types[i]->name, "resource")!=0) {
|
||||
return E_INVALID_PARAMETER_TYPE;
|
||||
}
|
||||
|
||||
args[i].v = (void*)rt_find(resname);
|
||||
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
int set_unit(const char * param, const unit& u) {
|
||||
if (mtype==0) return E_INVALID_MESSAGE;
|
||||
|
||||
int i = get_param(param);
|
||||
if (i==mtype->nparameters) {
|
||||
return E_INVALID_PARAMETER_NAME;
|
||||
}
|
||||
if (strcmp(mtype->types[i]->name, "unit")!=0) {
|
||||
return E_INVALID_PARAMETER_TYPE;
|
||||
}
|
||||
|
||||
args[i].v = (void*)&u;
|
||||
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
int set_string(const char * param, const char * value) {
|
||||
if (mtype==0) return E_INVALID_MESSAGE;
|
||||
|
||||
int i = get_param(param);
|
||||
if (i==mtype->nparameters) {
|
||||
return E_INVALID_PARAMETER_NAME;
|
||||
}
|
||||
if (strcmp(mtype->types[i]->name, "string")!=0) {
|
||||
return E_INVALID_PARAMETER_TYPE;
|
||||
}
|
||||
|
||||
variant var;
|
||||
var.v = (void*)value;
|
||||
args[i] = mtype->types[i]->copy(var);
|
||||
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
int set_int(const char * param, int value) {
|
||||
if (mtype==0) return E_INVALID_MESSAGE;
|
||||
|
||||
int i = get_param(param);
|
||||
if (i==mtype->nparameters) {
|
||||
return E_INVALID_PARAMETER_NAME;
|
||||
}
|
||||
if (strcmp(mtype->types[i]->name, "int")!=0) {
|
||||
return E_INVALID_PARAMETER_TYPE;
|
||||
}
|
||||
|
||||
args[i].i = value;
|
||||
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
int send_faction(faction& f) {
|
||||
if (mtype==0) return E_INVALID_MESSAGE;
|
||||
if (msg==NULL) {
|
||||
msg = msg_create(mtype, args);
|
||||
}
|
||||
add_message(&f.msgs, msg);
|
||||
return E_OK;
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_param(const char * param) {
|
||||
for (int i=0;i!=mtype->nparameters;++i) {
|
||||
if (strcmp(mtype->pnames[i], param)==0) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return mtype->nparameters;
|
||||
}
|
||||
|
||||
const message_type * mtype;
|
||||
message * msg;
|
||||
variant * args;
|
||||
};
|
||||
|
||||
static std::ostream&
|
||||
operator<<(std::ostream& stream, const lua_message& msg)
|
||||
{
|
||||
stream << "(message object)";
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
bind_message(lua_State * L)
|
||||
{
|
||||
module(L)[
|
||||
class_<lua_message>("message")
|
||||
.def(constructor<const char *>())
|
||||
.def(tostring(self))
|
||||
|
||||
.def("set_unit", &lua_message::set_unit)
|
||||
.def("set_resource", &lua_message::set_resource)
|
||||
.def("set_int", &lua_message::set_int)
|
||||
.def("set_string", &lua_message::set_string)
|
||||
.def("send_faction", &lua_message::send_faction)
|
||||
];
|
||||
}
|
Loading…
Reference in New Issue