mirror of
https://github.com/worldforge/cyphesis
synced 2026-08-13 12:26:04 -04:00
atlas object inheritance tree. * server/Connection.cpp: Added code to allow client to query atlas object inheritance using get ops. * example/client/InheritanceClient.*: Added example client which queries the inheritance tree of the server. * rulesets/MemMap.h, rulesets/Py_Map.cpp: Made hooks lists private, and added methods to access them. * server/Account.cpp, server/Lobby.h: Added correct handling of OOG look ops when looking at own characters, other accounts, or the lobby. * server/ServerRouting.h: Added function to generate serial numbers for operations. * server/WorldRouter.cpp: Assign genuine serial number to all in game operations as they are pulled off the queue. * Cleaned up header file multiple inclusion checks for uniqueness, and made sure of ISO compliant use of std::string. Al Riddoch <alriddoch@zepler.org>
104 lines
2.8 KiB
C++
104 lines
2.8 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 <Atlas/Objects/Operation/Combine.h>
|
|
#include <Atlas/Objects/Operation/Divide.h>
|
|
#include <Atlas/Objects/Operation/Delete.h>
|
|
|
|
#include <common/const.h>
|
|
|
|
// A stackable object, ie one which can represent multiple object of the
|
|
// same type. Used for things like coins.
|
|
|
|
#include "Stackable.h"
|
|
#include "Script.h"
|
|
|
|
using Atlas::Message::Object;
|
|
|
|
Stackable::Stackable() : num(1)
|
|
{
|
|
}
|
|
|
|
Stackable::~Stackable()
|
|
{
|
|
}
|
|
|
|
const Object & Stackable::operator[](const std::string & aname)
|
|
{
|
|
if (aname == "num") {
|
|
attributes[aname] = Object(num);
|
|
}
|
|
return Thing::operator[](aname);
|
|
}
|
|
|
|
void Stackable::set(const std::string & aname, const Object & attr)
|
|
{
|
|
if ((aname == "num") && attr.IsInt()) {
|
|
num = attr.AsInt();
|
|
} else {
|
|
Thing::set(aname, attr);
|
|
}
|
|
}
|
|
|
|
void Stackable::addToObject(Object::MapType & omap) const
|
|
{
|
|
if (num != 1) {
|
|
omap["num"] = Object(num);
|
|
}
|
|
Entity::addToObject(omap);
|
|
}
|
|
|
|
oplist Stackable::CombineOperation(const Combine & op)
|
|
{
|
|
oplist res;
|
|
if (script->Operation("combine", op, res) != 0) {
|
|
return res;
|
|
}
|
|
const Object::ListType & args = op.GetArgs();
|
|
for(Object::ListType::const_iterator I= args.begin(); I!= args.end(); I++) {
|
|
const std::string & id = I->AsMap().find("id")->second.AsString();
|
|
if (id == fullid) { continue; }
|
|
Stackable * obj = (Stackable*)world->getObject(id);
|
|
if (obj->type != type) { continue; }
|
|
num = num + obj->num;
|
|
|
|
Delete * d = new Delete(Delete::Instantiate());
|
|
Object::MapType dent;
|
|
dent["id"] = id;
|
|
d->SetTo(id);
|
|
d->SetArgs(Object::ListType(1,dent));
|
|
res.push_back(d);
|
|
}
|
|
return res;
|
|
// FIXME DO we need to send a sight?
|
|
}
|
|
|
|
oplist Stackable::DivideOperation(const Divide & op)
|
|
{
|
|
oplist res;
|
|
if (script->Operation("divide", op, res) != 0) {
|
|
return res;
|
|
}
|
|
const Object::ListType & args = op.GetArgs();
|
|
for(Object::ListType::const_iterator I= args.begin(); I!= args.end(); I++) {
|
|
const Object::MapType & ent = I->AsMap();
|
|
int new_num = 1;
|
|
Object::MapType::const_iterator J = ent.find("num");
|
|
if (J != ent.end()) {
|
|
if (J->second.IsInt()) { new_num = J->second.AsInt(); }
|
|
}
|
|
if (num <= new_num) { continue; }
|
|
|
|
Object::MapType new_ent;
|
|
Object::ListType parents(1,type);
|
|
new_ent["parents"] = parents;
|
|
new_ent["num"] = new_num;
|
|
Create * c = new Create( Create::Instantiate());
|
|
c->SetArgs(Object::ListType(1,new_ent));
|
|
c->SetTo(fullid);
|
|
res.push_back(c);
|
|
}
|
|
return res;
|
|
// FIXME DO we need to send a sight?
|
|
}
|