mirror of
https://github.com/worldforge/cyphesis
synced 2026-08-13 12:26:04 -04:00
client/ObserverClient.cpp, client/ObserverClient.h, client/ClientConnection.cpp, client/ClientConnection.h, client/define_world.cpp, client define_world.h: Started re-coding of python client code in C++. * common/accountbase.h: Database class used for simply accessing accounts. * common/OOGThing.cpp, common/OOGThing.h, server/Account.h, server/Routing.h: Moved OOGThing class into common as it is not server specific. * common/BaseWorld.cpp, common/BaseWorld.h, server/WorldRouter.cpp, server/WorldRouter.h, rulesets/Entity.h, rulesets/Py_World.cpp, rulesets/PythonThingScript.cpp, rulesets/Python_API.h, rulesets/Thing.cpp, rulesets/Thing.h: Added base class for WorldRouter so that code that previously used WorldRouter now used the interface defined by this new class. This means that the code in rulesets no longer has dependencies on code in server, so can be used in the client. * server/ExternalMind.cpp, server/ExternalMind.h, rulesets/Character.h, rulesets/Creator.cpp, server/Account.cpp: Moved ExternalMind class into server as it is server specific, so that there is no dependancy on server in rulesets. * server/Persistance.cpp. server/Persistance.h, server/Admin.cpp, server/ServerRouting.cpp, server/server.cpp: Moved high level server specific persistance class into server, so there is no dependency on server in common. * common/database.cpp, common/database.h, server/Admin.cpp, tools/cydbload.cpp, tools/cyisoload.cpp, tools/cypasswd.cpp: Increases efficiency of some interfaces by passing Object::MapType instead of MapType, when the value must be a map. * modules/WorldTime.cpp, modules/WorldTime.h, rulesets/Py_WorldTime.cpp, rulesets/Python_API.cpp: Brought the version of WorldTime in modules up to date, as this is the version now used. * rulesets/Character.cpp, server/WorldRouter.cpp, rulesets/Thing.cpp, server/Admin.cpp: Made world objects dictionary private. * rulesets/EntityFactory.cpp, rulesets/EntityFactory.h: Change newThing parameters so entity factory does not need to know about WorldRouter. * server/Lobby.cpp: Added support for people and rooms attributes of OOG room class. Al Riddoch <alriddoch@zepler.org>
92 lines
2.9 KiB
C++
92 lines
2.9 KiB
C++
// This file may be redistributed and modified only under the terms of
|
|
// the GNU General Public License (See COPYING for details).
|
|
// Copyright (C) 2000,2001 Alistair Riddoch
|
|
|
|
#include "PythonThingScript.h"
|
|
|
|
#include "Python_API.h"
|
|
|
|
#include "Thing.h"
|
|
|
|
#include <common/BaseWorld.h>
|
|
#include <common/debug.h>
|
|
|
|
using Atlas::Objects::Operation::RootOperation;
|
|
|
|
static const bool debug_flag = false;
|
|
|
|
PythonThingScript::PythonThingScript(PyObject * o, Thing & t) :
|
|
PythonScript(o, t), thing(t)
|
|
{
|
|
}
|
|
|
|
PythonThingScript::~PythonThingScript()
|
|
{
|
|
}
|
|
|
|
bool PythonThingScript::Operation(const std::string & op_type,
|
|
const RootOperation & op,
|
|
oplist & ret_list, RootOperation * sub_op)
|
|
{
|
|
if (scriptObject == NULL) {
|
|
debug( cout << "No script object asociated" << endl << flush;);
|
|
return false;
|
|
}
|
|
debug( cout << "Got script object for " << endl << flush;);
|
|
std::string op_name = op_type+"_operation";
|
|
// Construct apropriate python object thingies from op
|
|
if (!PyObject_HasAttrString(scriptObject, (char *)(op_name.c_str()))) {
|
|
debug( cout << "No method to be found for "
|
|
<< "." << op_name << endl << flush;);
|
|
return false;
|
|
}
|
|
RootOperationObject * py_op = newAtlasRootOperation(NULL);
|
|
py_op->operation = new RootOperation(op);
|
|
py_op->own = 0;
|
|
py_op->from = thing.world->getObject(op.GetFrom());
|
|
py_op->to = thing.world->getObject(op.GetTo());
|
|
PyObject * ret;
|
|
ret = PyObject_CallMethod(scriptObject, (char *)(op_name.c_str()),
|
|
"(O)", py_op);
|
|
delete py_op->operation;
|
|
Py_DECREF(py_op);
|
|
if (ret != NULL) {
|
|
debug( cout << "Called python method " << op_name
|
|
<< " for object " << endl << flush;);
|
|
if (PyOperation_Check(ret)) {
|
|
RootOperationObject * op = (RootOperationObject*)ret;
|
|
if (op->operation != NULL) {
|
|
ret_list.push_back(op->operation);
|
|
op->own = 0;
|
|
} else {
|
|
debug( cout << "Method returned invalid operation"
|
|
<< endl << flush;);
|
|
}
|
|
} else if (PyOplist_Check(ret)) {
|
|
OplistObject * op = (OplistObject*)ret;
|
|
if (op->ops != NULL) {
|
|
ret_list = *op->ops;
|
|
} else {
|
|
debug( cout << "Method returned invalid oplist"
|
|
<< endl << flush;);
|
|
}
|
|
} else {
|
|
debug( cout << "Method returned invalid object" << endl << flush;);
|
|
}
|
|
|
|
Py_DECREF(ret);
|
|
return true;
|
|
} else {
|
|
if (PyErr_Occurred() == NULL) {
|
|
debug( cout << "No method to be found for " << endl << flush;);
|
|
} else {
|
|
cerr << "Reporting python error for " << endl << flush;
|
|
PyErr_Print();
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void PythonThingScript::hook(const std::string &, Entity *)
|
|
{
|
|
}
|