mirror of
https://github.com/worldforge/cyphesis
synced 2026-08-13 12:26:04 -04:00
client closes connection. * rulesets/Thing.cpp: If object to be created has no loc, set loc to be the same as creator before passing to the factory. * rulesets/Entity.cpp: Clarify debug output when determining location of new entities. * client/CommClient.cpp: Push output into debug mecanism. Switch order of Create/Login for admin account so ordinary operation does not issue an error. Admin account is created at startup, so there is no need for the client to create it. Al Riddoch <alriddoch@zepler.org>
104 lines
2.9 KiB
C++
104 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 <common/BaseEntity.h>
|
|
#include <rulesets/EntityFactory.h>
|
|
|
|
#include "CommClient.h"
|
|
#include "CreatorClient.h"
|
|
|
|
#include <common/debug.h>
|
|
|
|
static const bool debug_flag = false;
|
|
|
|
using Atlas::Message::Object;
|
|
|
|
CommClient::CommClient()
|
|
{
|
|
}
|
|
|
|
Object::MapType
|
|
CommClient::createPlayer(const std::string & name,
|
|
const std::string & password)
|
|
{
|
|
playerName = name;
|
|
Object::MapType player_ent;
|
|
player_ent["id"] = name;
|
|
player_ent["password"] = password;
|
|
player_ent["parents"] = Object::ListType(1, "player");
|
|
|
|
debug(cout << "Loggin " << name << " in with " << password << " as password"
|
|
<< endl << flush;);
|
|
|
|
Login loginAccountOp(Login::Instantiate());
|
|
loginAccountOp.SetArgs(Object::ListType(1,player_ent));
|
|
send(loginAccountOp);
|
|
|
|
if (connection.wait()) {
|
|
Create createAccountOp(Create::Instantiate());
|
|
createAccountOp.SetArgs(Object::ListType(1,player_ent));
|
|
send(createAccountOp);
|
|
if (connection.wait()) {
|
|
std::cerr << "ERROR: Failed to log into server" << std::endl
|
|
<< std::flush;
|
|
return Object::MapType();
|
|
}
|
|
}
|
|
|
|
Object::MapType ent = connection.getReply();
|
|
|
|
//if (ent.find("characters") != ent.end()) {
|
|
//}
|
|
|
|
return ent;
|
|
}
|
|
|
|
CreatorClient * CommClient::createCharacter(const std::string & type)
|
|
{
|
|
Object::MapType character;
|
|
character["name"] = playerName;
|
|
character["parents"] = Object::ListType(1,type);
|
|
|
|
Create createOp=Create::Instantiate();
|
|
createOp.SetFrom(playerName);
|
|
createOp.SetArgs(Object::ListType(1,character));
|
|
send(createOp);
|
|
|
|
if (connection.wait()) {
|
|
std::cerr << "ERROR: Failed to create character type: "
|
|
<< type << std::endl << std::flush;
|
|
return NULL;
|
|
}
|
|
Object::MapType body=connection.getReply();
|
|
|
|
const std::string & id = body.find("id")->second.AsString();
|
|
|
|
edict_t tmp;
|
|
|
|
CreatorClient * obj = new CreatorClient(id, type, connection);
|
|
obj->merge(body);
|
|
obj->getLocation(body, tmp);
|
|
// obj = EntityFactory::instance()->newThing(type, body, tmp);
|
|
// FIXME Do we need to create a local entity for this as is done in
|
|
// the python version? If so, do we need to keep track of a full world
|
|
// model here, or just in the minds (when we become an AI client
|
|
return obj;
|
|
}
|
|
|
|
// I'm making this pure virtual, to see if that is desired.
|
|
//void CommClient::idle() {
|
|
// time.sleep(0.1);
|
|
//}
|
|
|
|
void CommClient::handleNet()
|
|
{
|
|
RootOperation * input;
|
|
while ((input = connection.pop()) != NULL) {
|
|
oplist result = character->message(*input);
|
|
for (oplist::const_iterator I=result.begin(); I != result.end(); I++) {
|
|
send(*(*I));
|
|
}
|
|
delete input;
|
|
}
|
|
}
|