cyphesis/server/Account.cpp

588 lines
18 KiB
C++
Raw Normal View History

2006-01-19 Al Riddoch <alriddoch@zepler.org> * aiclient/ClientAccount.cpp, aiclient/ClientAccount.h, aiclient/ClientConnection.cpp, aiclient/ClientConnection.h, aiclient/client.cpp, aiclient/client.h, client/BaseClient.cpp, client/BaseClient.h, client/CharacterClient.cpp, client/CharacterClient.h, client/ClientConnection.cpp, client/ClientConnection.h, client/CreatorClient.cpp, client/CreatorClient.h, client/ObserverClient.cpp, client/ObserverClient.h, client/Py_CreatorClient.cpp, client/Py_CreatorClient.h, client/client.cpp, client/define_world.cpp, client/define_world.h, common/Add.h, common/Affect.h, common/AtlasFileLoader.cpp, common/AtlasFileLoader.h, common/Attack.h, common/BaseEntity.cpp, common/BaseEntity.h, common/BaseWorld.cpp, common/BaseWorld.h, common/Burn.h, common/Chop.h, common/Connect.h, common/CustomOp.cpp, common/CustomOp.h, common/CustomOp_impl.h, common/Cut.h, common/Database.cpp, common/Database.h, common/Delve.h, common/Dig.h, common/Eat.h, common/FormattedXMLWriter.cpp, common/FormattedXMLWriter.h, common/Generic.h, common/Load.h, common/Monitor.h, common/Mow.h, common/Nourish.h, common/OOGThing.cpp, common/OOGThing.h, common/Property.cpp, common/Property.h, common/Property_impl.h, common/Save.h, common/Setup.h, common/Tick.h, common/Unseen.h, common/Update.h, common/Use.h, common/Wield.h, common/accountbase.cpp, common/accountbase.h, common/const.cpp, common/const.h, common/custom.cpp, common/debug.h, common/globals.cpp, common/globals.h, common/id.cpp, common/id.h, common/inheritance.cpp, common/inheritance.h, common/inheritance_impl.h, common/log.cpp, common/log.h, common/newid.cpp, common/nls.h, common/op_switch.h, common/operations.cpp, common/operations.h, common/random.h, common/refno.h, common/serialno.cpp, common/serialno.h, common/system.cpp, common/system.h, common/terrain_utils.cpp, common/terrain_utils.h, common/type_utils.h, common/types.h, common/utility.cpp, common/utility.h, modules/DateTime.cpp, modules/DateTime.h, modules/Location.cpp, modules/Location.h, modules/WorldTime.cpp, modules/WorldTime.h, physics/BBox.cpp, physics/BBox.h, physics/Collision.cpp, physics/Collision.h, physics/Quaternion.cpp, physics/Quaternion.h, physics/Vector3D.cpp, physics/Vector3D.h, physics/VectorPol.h, rulesets/Area.cpp, rulesets/Area.h, rulesets/AreaProperty.cpp, rulesets/AreaProperty.h, rulesets/ArithmeticScript.cpp, rulesets/ArithmeticScript.h, rulesets/BaseMind.cpp, rulesets/BaseMind.h, rulesets/CalendarProperty.cpp, rulesets/CalendarProperty.h, rulesets/Character.cpp, rulesets/Character.h, rulesets/Combat.cpp, rulesets/Combat.h, rulesets/Container.cpp, rulesets/Container.h, rulesets/Creator.cpp, rulesets/Creator.h, rulesets/Entity.cpp, rulesets/Entity.h, rulesets/EntityProperties.cpp, rulesets/Entity_getLocation.h, rulesets/Fell.cpp, rulesets/Fell.h, rulesets/Food.cpp, rulesets/Food.h, rulesets/Line.cpp, rulesets/Line.h, rulesets/LineProperty.cpp, rulesets/LineProperty.h, rulesets/MemEntity.cpp, rulesets/MemEntity.h, rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/MemMap_methods.h, rulesets/MindFactory.cpp, rulesets/MindFactory.h, rulesets/Missile.h, rulesets/Motion.cpp, rulesets/Motion.h, rulesets/Movement.cpp, rulesets/Movement.h, rulesets/Pedestrian.cpp, rulesets/Pedestrian.h, rulesets/Plant.cpp, rulesets/Plant.h, rulesets/Py_BBox.cpp, rulesets/Py_BBox.h, rulesets/Py_EntityWrapper.h, rulesets/Py_Location.cpp, rulesets/Py_Location.h, rulesets/Py_Map.cpp, rulesets/Py_Map.h, rulesets/Py_Mind.cpp, rulesets/Py_Mind.h, rulesets/Py_Object.cpp, rulesets/Py_Object.h, rulesets/Py_Operation.cpp, rulesets/Py_Operation.h, rulesets/Py_Oplist.cpp, rulesets/Py_Oplist.h, rulesets/Py_Optime.cpp, rulesets/Py_Optime.h, rulesets/Py_Point3D.cpp, rulesets/Py_Point3D.h, rulesets/Py_Property.cpp, rulesets/Py_Property.h, rulesets/Py_Quaternion.cpp, rulesets/Py_Quaternion.h, rulesets/Py_RootEntity.cpp, rulesets/Py_RootEntity.h, rulesets/Py_Statistics.cpp, rulesets/Py_Statistics.h, rulesets/Py_Task.cpp, rulesets/Py_Task.h, rulesets/Py_Thing.cpp, rulesets/Py_Thing.h, rulesets/Py_Vector3D.cpp, rulesets/Py_Vector3D.h, rulesets/Py_World.cpp, rulesets/Py_World.h, rulesets/Py_WorldTime.cpp, rulesets/Py_WorldTime.h, rulesets/PythonArithmeticScript.cpp, rulesets/PythonArithmeticScript.h, rulesets/PythonMindScript.cpp, rulesets/PythonMindScript.h, rulesets/PythonScript.cpp, rulesets/PythonScript.h, rulesets/PythonThingScript.cpp, rulesets/PythonThingScript.h, rulesets/PythonWrapper.cpp, rulesets/PythonWrapper.h, rulesets/Python_API.cpp, rulesets/Python_API.h, rulesets/Python_Script_Utils.h, rulesets/Script.cpp, rulesets/Script.h, rulesets/Stackable.cpp, rulesets/Stackable.h, rulesets/Statistics.cpp, rulesets/Statistics.h, rulesets/StatisticsProperty.cpp, rulesets/StatisticsProperty.h, rulesets/Structure.cpp, rulesets/Structure.h, rulesets/Task.cpp, rulesets/Task.h, rulesets/TaskScript.cpp, rulesets/TaskScript.h, rulesets/TerrainProperty.cpp, rulesets/TerrainProperty.h, rulesets/Thing.cpp, rulesets/Thing.h, rulesets/ThingFactory.cpp, rulesets/ThingFactory.h, rulesets/World.cpp, rulesets/World.h, rulesets/attributes.h, server/Account.cpp, server/Account.h, server/Admin.cpp, server/Admin.h, server/ArithmeticFactory.cpp, server/ArithmeticFactory.h, server/CommClient.cpp, server/CommClient.h, server/CommIdleSocket.cpp, server/CommIdleSocket.h, server/CommListener.cpp, server/CommListener.h, server/CommLocalClient.cpp, server/CommLocalClient.h, server/CommMDNSPublisher.cpp, server/CommMDNSPublisher.h, server/CommMaster.cpp, server/CommMaster.h, server/CommMetaClient.cpp, server/CommMetaClient.h, server/CommPSQLSocket.cpp, server/CommPSQLSocket.h, server/CommPeer.cpp, server/CommPeer.h, server/CommPeerListener.cpp, server/CommPeerListener.h, server/CommRemoteClient.cpp, server/CommRemoteClient.h, server/CommServer.cpp, server/CommServer.h, server/CommSlaveClient.cpp, server/CommSlaveClient.h, server/CommSlaveListener.cpp, server/CommSlaveListener.h, server/CommSocket.cpp, server/CommSocket.h, server/CommUnixListener.cpp, server/CommUnixListener.h, server/Connection.cpp, server/Connection.h, server/Connection_methods.h, server/EntityFactory.cpp, server/EntityFactory.h, server/ExternalMind.cpp, server/ExternalMind.h, server/Idle.cpp, server/Idle.h, server/Lobby.cpp, server/Lobby.h, server/Master.cpp, server/Master.h, server/Peer.cpp, server/Peer.h, server/Persistance.cpp, server/Persistance.h, server/PersistantThingFactory.cpp, server/PersistantThingFactory.h, server/PersistantThingFactory_impl.h, server/Persistor.cpp, server/Persistor.h, server/Persistor_impl.h, server/Player.cpp, server/Player.h, server/Restoration.cpp, server/Restoration.h, server/Restorer.cpp, server/Restorer.h, server/Restorer_impl.h, server/ScriptFactory.cpp, server/ScriptFactory.h, server/ServerRouting.cpp, server/ServerRouting.h, server/ServerRouting_methods.h, server/SlaveClientConnection.cpp, server/SlaveClientConnection.h, server/TaskFactory.cpp, server/TaskFactory.h, server/TrustedConnection.cpp, server/TrustedConnection.h, server/WorldRouter.cpp, server/WorldRouter.h, server/server.cpp, server/server.h, server/slave.cpp, tests/Areatest.cpp, tests/BaseEntitytest.cpp, tests/Charactertest.cpp, tests/Containertest.cpp, tests/Creatortest.cpp, tests/EntityExerciser.h, tests/EntityFactorytest.cpp, tests/Entitytest.cpp, tests/Foodtest.cpp, tests/IGEntityExerciser.h, tests/Linetest.cpp, tests/Locationtest.cpp, tests/OOGThingtest.cpp, tests/Planttest.cpp, tests/Propertytest.cpp, tests/Stackabletest.cpp, tests/Structuretest.cpp, tests/Tasktest.cpp, tests/TestWorld.h, tests/Thingtest.cpp, tests/WorldTimetest.cpp, tests/Worldtest.cpp, tests/allOperations.h, tests/collisiontest.cpp, tests/consttest.cpp, tests/distancetest.cpp, tests/emergencetest.cpp, tests/inheritancetest.cpp, tests/logtest.cpp, tests/randomtest.cpp, tests/systemtest.cpp, tests/transformtest.cpp, tests/type_utilstest.cpp, tests/utilitytest.cpp, tools/AdminClient.cpp, tools/AdminClient.h, tools/cyaddrules.cpp, tools/cycmd.cpp, tools/cyconfig.cpp, tools/cyconvertrules.cpp, tools/cyctrl.cpp, tools/cydbload.cpp, tools/cydumprules.cpp, tools/cyisoload.cpp, tools/cyloadrules.cpp, tools/cypasswd.cpp, tools/cywatchdog.cpp: Replace the copyright and license statements with new versions that include disclaimer of warranty, and permit distribution under later versions of the GPL.
2006-01-19 02:17:06 +00:00
// Cyphesis Online RPG Server and AI Engine
// Copyright (C) 2000-2005 Alistair Riddoch
2006-01-19 Al Riddoch <alriddoch@zepler.org> * aiclient/ClientAccount.cpp, aiclient/ClientAccount.h, aiclient/ClientConnection.cpp, aiclient/ClientConnection.h, aiclient/client.cpp, aiclient/client.h, client/BaseClient.cpp, client/BaseClient.h, client/CharacterClient.cpp, client/CharacterClient.h, client/ClientConnection.cpp, client/ClientConnection.h, client/CreatorClient.cpp, client/CreatorClient.h, client/ObserverClient.cpp, client/ObserverClient.h, client/Py_CreatorClient.cpp, client/Py_CreatorClient.h, client/client.cpp, client/define_world.cpp, client/define_world.h, common/Add.h, common/Affect.h, common/AtlasFileLoader.cpp, common/AtlasFileLoader.h, common/Attack.h, common/BaseEntity.cpp, common/BaseEntity.h, common/BaseWorld.cpp, common/BaseWorld.h, common/Burn.h, common/Chop.h, common/Connect.h, common/CustomOp.cpp, common/CustomOp.h, common/CustomOp_impl.h, common/Cut.h, common/Database.cpp, common/Database.h, common/Delve.h, common/Dig.h, common/Eat.h, common/FormattedXMLWriter.cpp, common/FormattedXMLWriter.h, common/Generic.h, common/Load.h, common/Monitor.h, common/Mow.h, common/Nourish.h, common/OOGThing.cpp, common/OOGThing.h, common/Property.cpp, common/Property.h, common/Property_impl.h, common/Save.h, common/Setup.h, common/Tick.h, common/Unseen.h, common/Update.h, common/Use.h, common/Wield.h, common/accountbase.cpp, common/accountbase.h, common/const.cpp, common/const.h, common/custom.cpp, common/debug.h, common/globals.cpp, common/globals.h, common/id.cpp, common/id.h, common/inheritance.cpp, common/inheritance.h, common/inheritance_impl.h, common/log.cpp, common/log.h, common/newid.cpp, common/nls.h, common/op_switch.h, common/operations.cpp, common/operations.h, common/random.h, common/refno.h, common/serialno.cpp, common/serialno.h, common/system.cpp, common/system.h, common/terrain_utils.cpp, common/terrain_utils.h, common/type_utils.h, common/types.h, common/utility.cpp, common/utility.h, modules/DateTime.cpp, modules/DateTime.h, modules/Location.cpp, modules/Location.h, modules/WorldTime.cpp, modules/WorldTime.h, physics/BBox.cpp, physics/BBox.h, physics/Collision.cpp, physics/Collision.h, physics/Quaternion.cpp, physics/Quaternion.h, physics/Vector3D.cpp, physics/Vector3D.h, physics/VectorPol.h, rulesets/Area.cpp, rulesets/Area.h, rulesets/AreaProperty.cpp, rulesets/AreaProperty.h, rulesets/ArithmeticScript.cpp, rulesets/ArithmeticScript.h, rulesets/BaseMind.cpp, rulesets/BaseMind.h, rulesets/CalendarProperty.cpp, rulesets/CalendarProperty.h, rulesets/Character.cpp, rulesets/Character.h, rulesets/Combat.cpp, rulesets/Combat.h, rulesets/Container.cpp, rulesets/Container.h, rulesets/Creator.cpp, rulesets/Creator.h, rulesets/Entity.cpp, rulesets/Entity.h, rulesets/EntityProperties.cpp, rulesets/Entity_getLocation.h, rulesets/Fell.cpp, rulesets/Fell.h, rulesets/Food.cpp, rulesets/Food.h, rulesets/Line.cpp, rulesets/Line.h, rulesets/LineProperty.cpp, rulesets/LineProperty.h, rulesets/MemEntity.cpp, rulesets/MemEntity.h, rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/MemMap_methods.h, rulesets/MindFactory.cpp, rulesets/MindFactory.h, rulesets/Missile.h, rulesets/Motion.cpp, rulesets/Motion.h, rulesets/Movement.cpp, rulesets/Movement.h, rulesets/Pedestrian.cpp, rulesets/Pedestrian.h, rulesets/Plant.cpp, rulesets/Plant.h, rulesets/Py_BBox.cpp, rulesets/Py_BBox.h, rulesets/Py_EntityWrapper.h, rulesets/Py_Location.cpp, rulesets/Py_Location.h, rulesets/Py_Map.cpp, rulesets/Py_Map.h, rulesets/Py_Mind.cpp, rulesets/Py_Mind.h, rulesets/Py_Object.cpp, rulesets/Py_Object.h, rulesets/Py_Operation.cpp, rulesets/Py_Operation.h, rulesets/Py_Oplist.cpp, rulesets/Py_Oplist.h, rulesets/Py_Optime.cpp, rulesets/Py_Optime.h, rulesets/Py_Point3D.cpp, rulesets/Py_Point3D.h, rulesets/Py_Property.cpp, rulesets/Py_Property.h, rulesets/Py_Quaternion.cpp, rulesets/Py_Quaternion.h, rulesets/Py_RootEntity.cpp, rulesets/Py_RootEntity.h, rulesets/Py_Statistics.cpp, rulesets/Py_Statistics.h, rulesets/Py_Task.cpp, rulesets/Py_Task.h, rulesets/Py_Thing.cpp, rulesets/Py_Thing.h, rulesets/Py_Vector3D.cpp, rulesets/Py_Vector3D.h, rulesets/Py_World.cpp, rulesets/Py_World.h, rulesets/Py_WorldTime.cpp, rulesets/Py_WorldTime.h, rulesets/PythonArithmeticScript.cpp, rulesets/PythonArithmeticScript.h, rulesets/PythonMindScript.cpp, rulesets/PythonMindScript.h, rulesets/PythonScript.cpp, rulesets/PythonScript.h, rulesets/PythonThingScript.cpp, rulesets/PythonThingScript.h, rulesets/PythonWrapper.cpp, rulesets/PythonWrapper.h, rulesets/Python_API.cpp, rulesets/Python_API.h, rulesets/Python_Script_Utils.h, rulesets/Script.cpp, rulesets/Script.h, rulesets/Stackable.cpp, rulesets/Stackable.h, rulesets/Statistics.cpp, rulesets/Statistics.h, rulesets/StatisticsProperty.cpp, rulesets/StatisticsProperty.h, rulesets/Structure.cpp, rulesets/Structure.h, rulesets/Task.cpp, rulesets/Task.h, rulesets/TaskScript.cpp, rulesets/TaskScript.h, rulesets/TerrainProperty.cpp, rulesets/TerrainProperty.h, rulesets/Thing.cpp, rulesets/Thing.h, rulesets/ThingFactory.cpp, rulesets/ThingFactory.h, rulesets/World.cpp, rulesets/World.h, rulesets/attributes.h, server/Account.cpp, server/Account.h, server/Admin.cpp, server/Admin.h, server/ArithmeticFactory.cpp, server/ArithmeticFactory.h, server/CommClient.cpp, server/CommClient.h, server/CommIdleSocket.cpp, server/CommIdleSocket.h, server/CommListener.cpp, server/CommListener.h, server/CommLocalClient.cpp, server/CommLocalClient.h, server/CommMDNSPublisher.cpp, server/CommMDNSPublisher.h, server/CommMaster.cpp, server/CommMaster.h, server/CommMetaClient.cpp, server/CommMetaClient.h, server/CommPSQLSocket.cpp, server/CommPSQLSocket.h, server/CommPeer.cpp, server/CommPeer.h, server/CommPeerListener.cpp, server/CommPeerListener.h, server/CommRemoteClient.cpp, server/CommRemoteClient.h, server/CommServer.cpp, server/CommServer.h, server/CommSlaveClient.cpp, server/CommSlaveClient.h, server/CommSlaveListener.cpp, server/CommSlaveListener.h, server/CommSocket.cpp, server/CommSocket.h, server/CommUnixListener.cpp, server/CommUnixListener.h, server/Connection.cpp, server/Connection.h, server/Connection_methods.h, server/EntityFactory.cpp, server/EntityFactory.h, server/ExternalMind.cpp, server/ExternalMind.h, server/Idle.cpp, server/Idle.h, server/Lobby.cpp, server/Lobby.h, server/Master.cpp, server/Master.h, server/Peer.cpp, server/Peer.h, server/Persistance.cpp, server/Persistance.h, server/PersistantThingFactory.cpp, server/PersistantThingFactory.h, server/PersistantThingFactory_impl.h, server/Persistor.cpp, server/Persistor.h, server/Persistor_impl.h, server/Player.cpp, server/Player.h, server/Restoration.cpp, server/Restoration.h, server/Restorer.cpp, server/Restorer.h, server/Restorer_impl.h, server/ScriptFactory.cpp, server/ScriptFactory.h, server/ServerRouting.cpp, server/ServerRouting.h, server/ServerRouting_methods.h, server/SlaveClientConnection.cpp, server/SlaveClientConnection.h, server/TaskFactory.cpp, server/TaskFactory.h, server/TrustedConnection.cpp, server/TrustedConnection.h, server/WorldRouter.cpp, server/WorldRouter.h, server/server.cpp, server/server.h, server/slave.cpp, tests/Areatest.cpp, tests/BaseEntitytest.cpp, tests/Charactertest.cpp, tests/Containertest.cpp, tests/Creatortest.cpp, tests/EntityExerciser.h, tests/EntityFactorytest.cpp, tests/Entitytest.cpp, tests/Foodtest.cpp, tests/IGEntityExerciser.h, tests/Linetest.cpp, tests/Locationtest.cpp, tests/OOGThingtest.cpp, tests/Planttest.cpp, tests/Propertytest.cpp, tests/Stackabletest.cpp, tests/Structuretest.cpp, tests/Tasktest.cpp, tests/TestWorld.h, tests/Thingtest.cpp, tests/WorldTimetest.cpp, tests/Worldtest.cpp, tests/allOperations.h, tests/collisiontest.cpp, tests/consttest.cpp, tests/distancetest.cpp, tests/emergencetest.cpp, tests/inheritancetest.cpp, tests/logtest.cpp, tests/randomtest.cpp, tests/systemtest.cpp, tests/transformtest.cpp, tests/type_utilstest.cpp, tests/utilitytest.cpp, tools/AdminClient.cpp, tools/AdminClient.h, tools/cyaddrules.cpp, tools/cycmd.cpp, tools/cyconfig.cpp, tools/cyconvertrules.cpp, tools/cyctrl.cpp, tools/cydbload.cpp, tools/cydumprules.cpp, tools/cyisoload.cpp, tools/cyloadrules.cpp, tools/cypasswd.cpp, tools/cywatchdog.cpp: Replace the copyright and license statements with new versions that include disclaimer of warranty, and permit distribution under later versions of the GPL.
2006-01-19 02:17:06 +00:00
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 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 General Public License for more details.
//
// You should have received a copy of the GNU 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
// $Id$
#include "Account.h"
#include "Connection_methods.h"
#include "ServerRouting.h"
#include "Lobby.h"
* client/client.cpp, 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>
2001-08-13 17:22:27 +00:00
#include "ExternalMind.h"
2009-03-24 03:08:45 +00:00
#include "Persistence.h"
#include "rulesets/Character.h"
#include "common/id.h"
#include "common/log.h"
#include "common/const.h"
#include "common/debug.h"
#include "common/serialno.h"
#include "common/Inheritance.h"
#include "common/compose.hpp"
#include <wfmath/atlasconv.h>
#include <Atlas/Objects/Operation.h>
#include <Atlas/Objects/Anonymous.h>
#include <sigc++/adaptors/bind.h>
#include <sigc++/functors/mem_fun.h>
2004-12-03 Al Riddoch <alriddoch@zepler.org> * client/BaseClient.cpp, client/BaseClient.h, client/CharacterClient.cpp, client/CharacterClient.h, client/ClientConnection.cpp, client/ClientConnection.h, client/CreatorClient.cpp, client/CreatorClient.h, client/Py_CreatorClient.cpp, common/BaseEntity.cpp, common/BaseEntity.h, common/BaseWorld.h, common/custom.cpp, common/inheritance.cpp, common/inheritance.h, common/inheritance_impl.h, common/op_switch.h, common/type_utils.h, common/types.h, common/utility.cpp, common/utility.h, modules/Location.cpp, rulesets/BaseMind.cpp, rulesets/BaseMind.h, rulesets/Character.cpp, rulesets/Character.h, rulesets/Creator.cpp, rulesets/Creator.h, rulesets/Entity.cpp, rulesets/Entity.h, rulesets/EntityProperties.cpp, rulesets/Entity_getLocation.h, rulesets/Food.cpp, rulesets/Food.h, rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/Missile.h, rulesets/Pedestrian.cpp, rulesets/Plant.cpp, rulesets/Plant.h, rulesets/Py_Mind.cpp, rulesets/Py_Object.cpp, rulesets/Py_Operation.cpp, rulesets/Py_Operation.h, rulesets/Py_Thing.cpp, rulesets/PythonMindScript.h, rulesets/PythonScript.h, rulesets/PythonThingScript.h, rulesets/Python_API.cpp, rulesets/Script.cpp, rulesets/Script.h, rulesets/Stackable.cpp, rulesets/Stackable.h, rulesets/Thing.cpp, rulesets/Thing.h, rulesets/World.cpp, rulesets/World.h, server/Account.cpp, server/Account.h server/Admin.cpp, server/Admin.h, server/CommClient.cpp, server/Connection.cpp, server/Connection.h, server/EntityFactory.cpp, server/EntityFactory.h, server/Lobby.cpp, server/Lobby.h, server/Persistance.cpp, server/Persistance.h, server/Persistor.cpp, server/Player.cpp, server/Player.h, server/ServerRouting.cpp, server/ServerRouting.h, server/TrustedConnection.cpp, server/TrustedConnection.h, server/WorldRouter.cpp, server/WorldRouter.h, tests/Areatest.cpp, tests/Charactertest.cpp, tests/Creatortest.cpp, tests/EntityExerciser.h, tests/Entitytest.cpp, tests/Foodtest.cpp, tests/IGEntityExerciser.h, tests/Linetest.cpp, tests/Planttest.cpp, tests/Stackabletest.cpp, tests/Structuretest.cpp, tests/Thingtest.cpp, tests/Worldtest.cpp, tests/allOperations.h, tests/inheritancetest.cpp, tests/utilitytest.cpp, tools/cycmd.cpp: Modify the entity interface so that all Operation methods take references to RootOperation, as its cleaner, and requires less nasty casts. Clean up operations in headers generally.
2004-12-03 14:49:13 +00:00
using Atlas::Message::Element;
using Atlas::Message::MapType;
using Atlas::Message::ListType;
using Atlas::Objects::Root;
2004-12-03 Al Riddoch <alriddoch@zepler.org> * client/BaseClient.cpp, client/BaseClient.h, client/CharacterClient.cpp, client/CharacterClient.h, client/ClientConnection.cpp, client/ClientConnection.h, client/CreatorClient.cpp, client/CreatorClient.h, client/Py_CreatorClient.cpp, common/BaseEntity.cpp, common/BaseEntity.h, common/BaseWorld.h, common/custom.cpp, common/inheritance.cpp, common/inheritance.h, common/inheritance_impl.h, common/op_switch.h, common/type_utils.h, common/types.h, common/utility.cpp, common/utility.h, modules/Location.cpp, rulesets/BaseMind.cpp, rulesets/BaseMind.h, rulesets/Character.cpp, rulesets/Character.h, rulesets/Creator.cpp, rulesets/Creator.h, rulesets/Entity.cpp, rulesets/Entity.h, rulesets/EntityProperties.cpp, rulesets/Entity_getLocation.h, rulesets/Food.cpp, rulesets/Food.h, rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/Missile.h, rulesets/Pedestrian.cpp, rulesets/Plant.cpp, rulesets/Plant.h, rulesets/Py_Mind.cpp, rulesets/Py_Object.cpp, rulesets/Py_Operation.cpp, rulesets/Py_Operation.h, rulesets/Py_Thing.cpp, rulesets/PythonMindScript.h, rulesets/PythonScript.h, rulesets/PythonThingScript.h, rulesets/Python_API.cpp, rulesets/Script.cpp, rulesets/Script.h, rulesets/Stackable.cpp, rulesets/Stackable.h, rulesets/Thing.cpp, rulesets/Thing.h, rulesets/World.cpp, rulesets/World.h, server/Account.cpp, server/Account.h server/Admin.cpp, server/Admin.h, server/CommClient.cpp, server/Connection.cpp, server/Connection.h, server/EntityFactory.cpp, server/EntityFactory.h, server/Lobby.cpp, server/Lobby.h, server/Persistance.cpp, server/Persistance.h, server/Persistor.cpp, server/Player.cpp, server/Player.h, server/ServerRouting.cpp, server/ServerRouting.h, server/TrustedConnection.cpp, server/TrustedConnection.h, server/WorldRouter.cpp, server/WorldRouter.h, tests/Areatest.cpp, tests/Charactertest.cpp, tests/Creatortest.cpp, tests/EntityExerciser.h, tests/Entitytest.cpp, tests/Foodtest.cpp, tests/IGEntityExerciser.h, tests/Linetest.cpp, tests/Planttest.cpp, tests/Stackabletest.cpp, tests/Structuretest.cpp, tests/Thingtest.cpp, tests/Worldtest.cpp, tests/allOperations.h, tests/inheritancetest.cpp, tests/utilitytest.cpp, tools/cycmd.cpp: Modify the entity interface so that all Operation methods take references to RootOperation, as its cleaner, and requires less nasty casts. Clean up operations in headers generally.
2004-12-03 14:49:13 +00:00
using Atlas::Objects::Operation::Set;
using Atlas::Objects::Operation::Info;
using Atlas::Objects::Operation::Sight;
using Atlas::Objects::Operation::Sound;
using Atlas::Objects::Operation::Create;
using Atlas::Objects::Entity::Anonymous;
using Atlas::Objects::Entity::RootEntity;
using Atlas::Objects::smart_dynamic_cast;
2004-12-03 Al Riddoch <alriddoch@zepler.org> * client/BaseClient.cpp, client/BaseClient.h, client/CharacterClient.cpp, client/CharacterClient.h, client/ClientConnection.cpp, client/ClientConnection.h, client/CreatorClient.cpp, client/CreatorClient.h, client/Py_CreatorClient.cpp, common/BaseEntity.cpp, common/BaseEntity.h, common/BaseWorld.h, common/custom.cpp, common/inheritance.cpp, common/inheritance.h, common/inheritance_impl.h, common/op_switch.h, common/type_utils.h, common/types.h, common/utility.cpp, common/utility.h, modules/Location.cpp, rulesets/BaseMind.cpp, rulesets/BaseMind.h, rulesets/Character.cpp, rulesets/Character.h, rulesets/Creator.cpp, rulesets/Creator.h, rulesets/Entity.cpp, rulesets/Entity.h, rulesets/EntityProperties.cpp, rulesets/Entity_getLocation.h, rulesets/Food.cpp, rulesets/Food.h, rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/Missile.h, rulesets/Pedestrian.cpp, rulesets/Plant.cpp, rulesets/Plant.h, rulesets/Py_Mind.cpp, rulesets/Py_Object.cpp, rulesets/Py_Operation.cpp, rulesets/Py_Operation.h, rulesets/Py_Thing.cpp, rulesets/PythonMindScript.h, rulesets/PythonScript.h, rulesets/PythonThingScript.h, rulesets/Python_API.cpp, rulesets/Script.cpp, rulesets/Script.h, rulesets/Stackable.cpp, rulesets/Stackable.h, rulesets/Thing.cpp, rulesets/Thing.h, rulesets/World.cpp, rulesets/World.h, server/Account.cpp, server/Account.h server/Admin.cpp, server/Admin.h, server/CommClient.cpp, server/Connection.cpp, server/Connection.h, server/EntityFactory.cpp, server/EntityFactory.h, server/Lobby.cpp, server/Lobby.h, server/Persistance.cpp, server/Persistance.h, server/Persistor.cpp, server/Player.cpp, server/Player.h, server/ServerRouting.cpp, server/ServerRouting.h, server/TrustedConnection.cpp, server/TrustedConnection.h, server/WorldRouter.cpp, server/WorldRouter.h, tests/Areatest.cpp, tests/Charactertest.cpp, tests/Creatortest.cpp, tests/EntityExerciser.h, tests/Entitytest.cpp, tests/Foodtest.cpp, tests/IGEntityExerciser.h, tests/Linetest.cpp, tests/Planttest.cpp, tests/Stackabletest.cpp, tests/Structuretest.cpp, tests/Thingtest.cpp, tests/Worldtest.cpp, tests/allOperations.h, tests/inheritancetest.cpp, tests/utilitytest.cpp, tools/cycmd.cpp: Modify the entity interface so that all Operation methods take references to RootOperation, as its cleaner, and requires less nasty casts. Clean up operations in headers generally.
2004-12-03 14:49:13 +00:00
static const bool debug_flag = false;
/// \brief Account constructor
///
/// @param conn Network Connection creating this Account
/// @param uname Username for this account
/// @param passwd Password for this account
/// @param id String identifier for this account
/// @param intId Integer identifier for this account
Account::Account(Connection * conn,
const std::string & uname,
const std::string & passwd,
const std::string & id,
long intId) :
Router(id, intId),
m_connection(conn), m_username(uname), m_password(passwd)
{
}
Account::~Account()
{
2002-07-27 Al Riddoch <alriddoch@zepler.org> * tools/cyloadrules.cpp, server/server.cpp, aiclient/ClientConnection.cpp, client/ClientConnection.cpp, common/inheritance.h: Use const iterators and references whenever possible. * client/CommClient.cpp, client/CreatorClient.cpp, client/ObserverClient.cpp, client/Py_CreatorClient.cpp, common/BaseEntity.cpp, common/BaseEntity.h, common/types.h, rulesets/Area.cpp, rulesets/BaseMind.cpp, rulesets/Character.cpp, rulesets/Entity.cpp, rulesets/Food.cpp, rulesets/Line.cpp, rulesets/MemMap.cpp, rulesets/Pedestrian.cpp, rulesets/Plant.cpp, rulesets/Py_Mind.cpp, rulesets/Py_Object.cpp, rulesets/Py_Thing.cpp, rulesets/Python_API.cpp, rulesets/Stackable.cpp, rulesets/Thing.cpp, rulesets/World.cpp, server/Account.cpp, server/Admin.cpp, server/CommClient.cpp, server/CommServer.cpp, server/Connection.cpp, server/EntityFactory.cpp, server/Lobby.cpp, server/Persistance.cpp, server/Player.cpp, server/ServerRouting.cpp, server/WorldRouter.cpp: Switch to using Fragment as name for Atlas::Message::Object, to avoid name clashes on Object. * common/BaseEntity.h: Make BaseEntity inherit from SigC::Object, so signals and callbacks can be used, and add destroyed signal. * common/accountbase.h, physics/BBox.h, physics/Quaternion.h, physics/Vector3D.h, rulesets/MemMap_methods.h, rulesets/Movement.cpp, rulesets/Plant.h, rulesets/Py_Operation.cpp, rulesets/PythonMindScript.cpp, rulesets/PythonThingScript.cpp, rulesets/Script.cpp, common/inheritance.cpp: Cleaned up Atlas::Message::Object use, and excessive use of "using ...". * rulesets/Movement.h, rulesets/Pedestrian.h: Use forward declarations rather than including Move.h * server/Account.cpp, server/Account.h, server/Connection.cpp, server/Connection.h: Use destroyed signal to ensure references to in game entities are removed when those entities are destroyed. Ensure Connection is only destroyed once.
2002-07-28 13:34:58 +00:00
}
/// \brief Called when the Character has been removed from the world.
///
/// @param id Integer identifier of the Character destroyed.
void Account::characterDestroyed(long id)
2002-07-27 Al Riddoch <alriddoch@zepler.org> * tools/cyloadrules.cpp, server/server.cpp, aiclient/ClientConnection.cpp, client/ClientConnection.cpp, common/inheritance.h: Use const iterators and references whenever possible. * client/CommClient.cpp, client/CreatorClient.cpp, client/ObserverClient.cpp, client/Py_CreatorClient.cpp, common/BaseEntity.cpp, common/BaseEntity.h, common/types.h, rulesets/Area.cpp, rulesets/BaseMind.cpp, rulesets/Character.cpp, rulesets/Entity.cpp, rulesets/Food.cpp, rulesets/Line.cpp, rulesets/MemMap.cpp, rulesets/Pedestrian.cpp, rulesets/Plant.cpp, rulesets/Py_Mind.cpp, rulesets/Py_Object.cpp, rulesets/Py_Thing.cpp, rulesets/Python_API.cpp, rulesets/Stackable.cpp, rulesets/Thing.cpp, rulesets/World.cpp, server/Account.cpp, server/Admin.cpp, server/CommClient.cpp, server/CommServer.cpp, server/Connection.cpp, server/EntityFactory.cpp, server/Lobby.cpp, server/Persistance.cpp, server/Player.cpp, server/ServerRouting.cpp, server/WorldRouter.cpp: Switch to using Fragment as name for Atlas::Message::Object, to avoid name clashes on Object. * common/BaseEntity.h: Make BaseEntity inherit from SigC::Object, so signals and callbacks can be used, and add destroyed signal. * common/accountbase.h, physics/BBox.h, physics/Quaternion.h, physics/Vector3D.h, rulesets/MemMap_methods.h, rulesets/Movement.cpp, rulesets/Plant.h, rulesets/Py_Operation.cpp, rulesets/PythonMindScript.cpp, rulesets/PythonThingScript.cpp, rulesets/Script.cpp, common/inheritance.cpp: Cleaned up Atlas::Message::Object use, and excessive use of "using ...". * rulesets/Movement.h, rulesets/Pedestrian.h: Use forward declarations rather than including Move.h * server/Account.cpp, server/Account.h, server/Connection.cpp, server/Connection.h: Use destroyed signal to ensure references to in game entities are removed when those entities are destroyed. Ensure Connection is only destroyed once.
2002-07-28 13:34:58 +00:00
{
m_charactersDict.erase(id);
if (consts::enable_persistence) {
2009-03-24 03:08:45 +00:00
Persistence::instance()->delCharacter(String::compose("%1", id));
}
}
/// \brief Add a Character to those that belong to this Account
///
/// @param chr Character object to be adddded
void Account::addCharacter(Entity * chr)
{
Character * pchar = dynamic_cast<Character *>(chr);
if (pchar == 0) {
return;
}
m_charactersDict[chr->getIntId()] = chr;
chr->destroyed.connect(sigc::bind(sigc::mem_fun(this, &Account::characterDestroyed), chr->getIntId()));
}
/// \brief Create a new Character and add it to this Account
///
/// @param typestr The type name of the Character to be created
/// @param ent Atlas description of the Character to be created
Entity * Account::addNewCharacter(const std::string & typestr,
const RootEntity & ent)
{
assert(m_connection != 0);
BaseWorld & world = m_connection->m_server.m_world;
debug(std::cout << "Account::Add_character" << std::endl << std::flush;);
Entity * chr = world.addNewEntity(typestr, ent);
if (chr == 0) {
return 0;
}
debug(std::cout << "Added" << std::endl << std::flush;);
assert(chr->m_location.isValid());
debug(std::cout << "Location set to: " << chr->m_location << std::endl << std::flush;);
Character * character = dynamic_cast<Character *>(chr);
if (character != 0) {
m_connection->connectAvatar(character);
// Only genuinely playable characters should go in here. Otherwise
// if a normal entity gets into the account, and connection, it
// starts getting hard to tell whether or not they exist.
m_charactersDict[chr->getIntId()] = chr;
chr->destroyed.connect(sigc::bind(sigc::mem_fun(this, &Account::characterDestroyed), chr->getIntId()));
m_connection->addEntity(chr);
if (consts::enable_persistence) {
2009-03-24 03:08:45 +00:00
Persistence::instance()->addCharacter(*this, *chr);
}
// Hack in default objects
// This needs to be done in a generic way
Anonymous create_arg;
create_arg->setParents(std::list<std::string>(1,"coin"));
::addToEntity(Point3D(0,0,0), create_arg->modifyPos());
create_arg->setLoc(chr->getId());
// FIXME We can probably send the same op 10 times, rather than create 10
// FIXME alternatively we can set 10 args on one op
for(int i = 0; i < 10; i++) {
Create c;
c->setTo(chr->getId());
c->setArgs1(create_arg);
world.message(c, *chr);
}
create_arg = create_arg.copy();
create_arg->setParents(std::list<std::string>(1, "shirt"));
Create c;
c->setTo(chr->getId());
c->setArgs1(create_arg);
world.message(c, *chr);
create_arg = create_arg.copy();
create_arg->setParents(std::list<std::string>(1, "trousers"));
c = Create();
c->setTo(chr->getId());
c->setArgs1(create_arg);
world.message(c, *chr);
create_arg = create_arg.copy();
create_arg->setParents(std::list<std::string>(1, "cloak"));
c = Create();
c->setTo(chr->getId());
c->setArgs1(create_arg);
world.message(c, *chr);
create_arg = create_arg.copy();
create_arg->setParents(std::list<std::string>(1, "boots"));
c = Create();
c->setTo(chr->getId());
c->setArgs1(create_arg);
world.message(c, *chr);
create_arg = create_arg.copy();
create_arg->setParents(std::list<std::string>(1, "hat"));
c = Create();
c->setTo(chr->getId());
c->setArgs1(create_arg);
world.message(c, *chr);
}
logEvent(TAKE_CHAR, String::compose("%1 %2 %3 Created character (%4) "
"by account %5",
m_connection->getId(),
getId(),
chr->getId(),
chr->getType(),
m_username));
return chr;
}
void Account::LogoutOperation(const Operation & op, OpVector & res)
{
if (m_connection == 0) {
log(ERROR, "Account::LogoutOperation on account that doesn't seem to "
"be connected.");
return;
}
Info info;
info->setArgs1(op);
if (!op->isDefaultSerialno()) {
info->setRefno(op->getSerialno());
}
info->setFrom(getId());
info->setTo(getId());
m_connection->send(info);
m_connection->disconnect();
}
const char * Account::getType() const
{
return "account";
}
void Account::addToMessage(MapType & omap) const
{
omap["username"] = m_username;
omap["name"] = m_username;
if (!m_password.empty()) {
omap["password"] = m_password;
}
2004-08-07 Al Riddoch <alriddoch@zepler.org> * common/BaseEntity.cpp, common/BaseEntity.h, common/BaseWorld.h, common/Database.cpp, common/Database.h, common/FormattedXMLWriter.cpp, common/FormattedXMLWriter.h, common/accountbase.cpp, common/accountbase.h, common/custom.cpp, common/inheritance.cpp, common/inheritance.h, common/operations.h, common/type_utils.h, common/utility.cpp, common/utility.h, modules/Location.cpp, modules/Location.h, rulesets/Area.cpp, rulesets/Area.h, rulesets/BaseMind.cpp, rulesets/Character.cpp, rulesets/Character.h, rulesets/Creator.cpp, rulesets/Entity.cpp, rulesets/Entity.h, rulesets/Entity_getLocation.h, rulesets/Food.cpp, rulesets/Line.cpp, rulesets/Line.h, rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/Pedestrian.cpp, rulesets/Plant.cpp, rulesets/Plant.h, rulesets/Py_Mind.cpp, rulesets/Py_Object.cpp, rulesets/Py_Object.h, rulesets/Py_Operation.cpp, rulesets/Py_Thing.cpp, rulesets/Python_API.cpp, rulesets/Stackable.cpp, rulesets/Stackable.h, rulesets/Thing.cpp, rulesets/World.cpp, rulesets/World.h, server/Account.cpp, server/Account.h, server/Admin.cpp, server/Admin.h, server/CommClient.cpp, server/CommClient.h, server/CommListener.cpp, server/CommListener.h, server/CommLocalClient.cpp, server/CommLocalClient.h, server/CommMetaClient.h, server/CommPSQLSocket.h, server/CommRemoteClient.cpp, server/CommRemoteClient.h, server/CommServer.cpp, server/CommServer.h, server/CommSocket.cpp, server/CommSocket.h, server/CommUnixListener.cpp, server/CommUnixListener.h, server/Connection.cpp, server/Connection.h, server/EntityFactory.cpp, server/EntityFactory.h, server/Lobby.cpp, server/Lobby.h, server/Persistance.cpp, server/Persistance.h, server/PersistantThingFactory.h, server/Persistor.cpp, server/Player.cpp, server/Player.h, server/Restorer.h, server/Restorer_impl.h, server/ServerRouting.cpp, server/ServerRouting.h, server/TrustedConnection.cpp, server/TrustedConnection.h, server/WorldRouter.cpp, server/WorldRouter.h: Convert code to using Atlas Message typedefs as found in Atlas-C++ 0.6 to aid conversion later.
2004-08-16 14:26:47 +00:00
omap["parents"] = ListType(1,getType());
ListType charlist;
EntityDict::const_iterator I = m_charactersDict.begin();
EntityDict::const_iterator Iend = m_charactersDict.end();
for (; I != Iend; ++I) {
2002-07-27 Al Riddoch <alriddoch@zepler.org> * tools/cyloadrules.cpp, server/server.cpp, aiclient/ClientConnection.cpp, client/ClientConnection.cpp, common/inheritance.h: Use const iterators and references whenever possible. * client/CommClient.cpp, client/CreatorClient.cpp, client/ObserverClient.cpp, client/Py_CreatorClient.cpp, common/BaseEntity.cpp, common/BaseEntity.h, common/types.h, rulesets/Area.cpp, rulesets/BaseMind.cpp, rulesets/Character.cpp, rulesets/Entity.cpp, rulesets/Food.cpp, rulesets/Line.cpp, rulesets/MemMap.cpp, rulesets/Pedestrian.cpp, rulesets/Plant.cpp, rulesets/Py_Mind.cpp, rulesets/Py_Object.cpp, rulesets/Py_Thing.cpp, rulesets/Python_API.cpp, rulesets/Stackable.cpp, rulesets/Thing.cpp, rulesets/World.cpp, server/Account.cpp, server/Admin.cpp, server/CommClient.cpp, server/CommServer.cpp, server/Connection.cpp, server/EntityFactory.cpp, server/Lobby.cpp, server/Persistance.cpp, server/Player.cpp, server/ServerRouting.cpp, server/WorldRouter.cpp: Switch to using Fragment as name for Atlas::Message::Object, to avoid name clashes on Object. * common/BaseEntity.h: Make BaseEntity inherit from SigC::Object, so signals and callbacks can be used, and add destroyed signal. * common/accountbase.h, physics/BBox.h, physics/Quaternion.h, physics/Vector3D.h, rulesets/MemMap_methods.h, rulesets/Movement.cpp, rulesets/Plant.h, rulesets/Py_Operation.cpp, rulesets/PythonMindScript.cpp, rulesets/PythonThingScript.cpp, rulesets/Script.cpp, common/inheritance.cpp: Cleaned up Atlas::Message::Object use, and excessive use of "using ...". * rulesets/Movement.h, rulesets/Pedestrian.h: Use forward declarations rather than including Move.h * server/Account.cpp, server/Account.h, server/Connection.cpp, server/Connection.h: Use destroyed signal to ensure references to in game entities are removed when those entities are destroyed. Ensure Connection is only destroyed once.
2002-07-28 13:34:58 +00:00
charlist.push_back(I->first);
}
2002-07-27 Al Riddoch <alriddoch@zepler.org> * tools/cyloadrules.cpp, server/server.cpp, aiclient/ClientConnection.cpp, client/ClientConnection.cpp, common/inheritance.h: Use const iterators and references whenever possible. * client/CommClient.cpp, client/CreatorClient.cpp, client/ObserverClient.cpp, client/Py_CreatorClient.cpp, common/BaseEntity.cpp, common/BaseEntity.h, common/types.h, rulesets/Area.cpp, rulesets/BaseMind.cpp, rulesets/Character.cpp, rulesets/Entity.cpp, rulesets/Food.cpp, rulesets/Line.cpp, rulesets/MemMap.cpp, rulesets/Pedestrian.cpp, rulesets/Plant.cpp, rulesets/Py_Mind.cpp, rulesets/Py_Object.cpp, rulesets/Py_Thing.cpp, rulesets/Python_API.cpp, rulesets/Stackable.cpp, rulesets/Thing.cpp, rulesets/World.cpp, server/Account.cpp, server/Admin.cpp, server/CommClient.cpp, server/CommServer.cpp, server/Connection.cpp, server/EntityFactory.cpp, server/Lobby.cpp, server/Persistance.cpp, server/Player.cpp, server/ServerRouting.cpp, server/WorldRouter.cpp: Switch to using Fragment as name for Atlas::Message::Object, to avoid name clashes on Object. * common/BaseEntity.h: Make BaseEntity inherit from SigC::Object, so signals and callbacks can be used, and add destroyed signal. * common/accountbase.h, physics/BBox.h, physics/Quaternion.h, physics/Vector3D.h, rulesets/MemMap_methods.h, rulesets/Movement.cpp, rulesets/Plant.h, rulesets/Py_Operation.cpp, rulesets/PythonMindScript.cpp, rulesets/PythonThingScript.cpp, rulesets/Script.cpp, common/inheritance.cpp: Cleaned up Atlas::Message::Object use, and excessive use of "using ...". * rulesets/Movement.h, rulesets/Pedestrian.h: Use forward declarations rather than including Move.h * server/Account.cpp, server/Account.h, server/Connection.cpp, server/Connection.h: Use destroyed signal to ensure references to in game entities are removed when those entities are destroyed. Ensure Connection is only destroyed once.
2002-07-28 13:34:58 +00:00
omap["characters"] = charlist;
omap["objtype"] = "obj";
omap["id"] = getId();
}
void Account::addToEntity(const Atlas::Objects::Entity::RootEntity & ent) const
{
ent->setAttr("username", m_username);
ent->setName(m_username);
if (!m_password.empty()) {
ent->setAttr("password", m_password);
}
ent->setParents(std::list<std::string>(1,getType()));
ListType charlist;
EntityDict::const_iterator I = m_charactersDict.begin();
EntityDict::const_iterator Iend = m_charactersDict.end();
for (; I != Iend; ++I) {
charlist.push_back(I->second->getId());
}
ent->setAttr("characters", charlist);
ent->setObjtype("obj");
ent->setId(getId());
}
void Account::operation(const Operation & op, OpVector & res)
{
const OpNo op_no = op->getClassNo();
switch (op_no) {
case Atlas::Objects::Operation::CREATE_NO:
CreateOperation(op, res);
break;
case Atlas::Objects::Operation::GET_NO:
GetOperation(op, res);
break;
case Atlas::Objects::Operation::IMAGINARY_NO:
ImaginaryOperation(op, res);
break;
case Atlas::Objects::Operation::LOGOUT_NO:
LogoutOperation(op, res);
break;
case Atlas::Objects::Operation::LOOK_NO:
LookOperation(op, res);
break;
case Atlas::Objects::Operation::SET_NO:
SetOperation(op, res);
break;
case Atlas::Objects::Operation::TALK_NO:
TalkOperation(op, res);
break;
case OP_INVALID:
break;
default:
OtherOperation(op, res);
break;
}
}
void Account::CreateOperation(const Operation & op, OpVector & res)
{
debug(std::cout << "Account::Operation(create)" << std::endl << std::flush;);
const std::vector<Root> & args = op->getArgs();
if (args.empty()) {
return;
}
RootEntity arg = smart_dynamic_cast<RootEntity>(args.front());
if (!arg.isValid()) {
error(op, "Character creation arg is malformed", res, getId());
return;
}
if (!arg->hasAttrFlag(Atlas::Objects::PARENTS_FLAG)) {
error(op, "Entity has no type", res, getId());
return;
}
const std::list<std::string> & parents = arg->getParents();
if (parents.empty()) {
error(op, "Entity has empty type list.", res, getId());
return;
}
const std::string & typestr = parents.front();
if (characterError(op, arg, res)) {
return;
}
debug( std::cout << "Account creating a " << typestr << " object"
<< std::endl << std::flush; );
Anonymous new_character;
new_character->setParents(std::list<std::string>(1, typestr));
new_character->setAttr("status", 0.024);
new_character->setAttr("mind", "");
if (!arg->isDefaultName()) {
new_character->setName(arg->getName());
}
Entity * entity = addNewCharacter(typestr, new_character);
if (entity == 0) {
error(op, "Character creation failed", res, getId());
return;
}
Character * character = dynamic_cast<Character *>(entity);
if (character != 0) {
// Inform the client that it has successfully subscribed
Info info;
Anonymous info_arg;
entity->addToEntity(info_arg);
info->setArgs1(info_arg);
res.push_back(info);
}
// Inform the client of the newly created character
Sight sight;
sight->setTo(getId());
Anonymous sight_arg;
addToEntity(sight_arg);
sight->setArgs1(sight_arg);
res.push_back(sight);
}
int Account::filterTasks(const ListType & tasks,
const RootEntity & filtered_arg) const
{
ListType filtered_tasks;
ListType::const_iterator I = tasks.begin();
ListType::const_iterator Iend = tasks.end();
for (; I != Iend; ++I) {
if (!I->isMap()) {
return -1;
}
const MapType & task = I->asMap();
MapType filtered_task;
MapType::const_iterator J = task.find("name");
MapType::const_iterator Jend = task.end();
if (J == Jend || !J->second.isString()) {
log(ERROR, "Task has no name");
return -1;
}
const std::string & task_name = J->second.asString();
filtered_task["name"] = task_name;
// FIXME Use the typeinfo to check which attributes can be changed.
for (J = task.begin(); J != Jend; ++J) {
if (J->first == "name") {
continue;
}
filtered_task[J->first] = J->second;
}
filtered_tasks.push_back(filtered_task);
}
filtered_arg->setAttr("tasks", filtered_tasks);
return 0;
}
void Account::SetOperation(const Operation & op, OpVector & res)
{
debug(std::cout << "Account::Operation(set)" << std::endl << std::flush;);
const std::vector<Root> & args = op->getArgs();
if (args.empty()) {
return;
}
const Root & arg = args.front();
if (!arg->hasAttrFlag(Atlas::Objects::ID_FLAG)) {
error(op, "Set character has no ID", res, getId());
return;
}
const std::string & id = arg->getId();
long intId = integerId(id);
EntityDict::const_iterator J = m_charactersDict.find(intId);
if (J == m_charactersDict.end()) {
// Client has sent a Set op for an object that is not
// one of our characters.
return error(op, "Permission denied.", res, getId());
}
Entity * e = J->second;
Anonymous new_arg;
bool argument_valid = false;
Element guise;
if (arg->copyAttr("guise", guise) == 0) {
debug(std::cout << "Got attempt to change characters guise"
<< std::endl << std::flush;);
// Apply change to character in-game
new_arg->setAttr("guise", guise);
argument_valid = true;
}
Element height;
if (arg->copyAttr("height", height) == 0 && (height.isNum())) {
debug(std::cout << "Got attempt to change characters height"
<< std::endl << std::flush;);
const BBox & bbox = e->m_location.bBox();
if (bbox.isValid()) {
float old_height = bbox.highCorner().z() - bbox.lowCorner().z();
float scale = height.asNum() / old_height;
BBox newBox(WFMath::Point<3>(bbox.lowCorner().x() * scale,
bbox.lowCorner().y() * scale,
bbox.lowCorner().z() * scale),
WFMath::Point<3>(bbox.highCorner().x() * scale,
bbox.highCorner().y() * scale,
bbox.highCorner().z() * scale));
new_arg->setAttr("bbox", newBox.toAtlas());
argument_valid = true;
}
}
Element tasks;
if (arg->copyAttr("tasks", tasks) == 0 && (tasks.isList())) {
log(NOTICE, "Got as yet unsupported task modification from client");
if (filterTasks(tasks.asList(), new_arg) == 0) {
argument_valid = true;
}
}
if (argument_valid) {
debug(std::cout << "Passing character mods in-game"
<< std::endl << std::flush;);
Set s;
s->setTo(id);
new_arg->setId(id);
s->setArgs1(new_arg);
assert(m_connection != 0);
m_connection->m_server.m_world.message(s, *e);
}
}
void Account::ImaginaryOperation(const Operation & op, OpVector & res)
{
const std::vector<Root> & args = op->getArgs();
if (args.empty()) {
return;
}
Sight s;
s->setArgs1(op);
s->setFrom(getId());
// FIXME Remove this - broadcasting
if (!op->isDefaultSerialno()) {
s->setRefno(op->getSerialno());
}
RootEntity arg = smart_dynamic_cast<RootEntity>(args.front());
if (!arg.isValid()) {
error(op, "Imaginary arg is malformed", res, getId());
return;
}
if (arg->hasAttrFlag(Atlas::Objects::Entity::LOC_FLAG)) {
s->setTo(arg->getLoc());
} else {
s->setTo(op->getTo());
}
assert(m_connection != 0);
m_connection->m_server.m_lobby.operation(s, res);
}
void Account::TalkOperation(const Operation & op, OpVector & res)
{
const std::vector<Root> & args = op->getArgs();
if (args.empty()) {
error(op, "Talk has no args", res, getId());
return;
}
RootEntity arg = smart_dynamic_cast<RootEntity>(args.front());
if (!arg.isValid()) {
error(op, "Talk arg is malformed", res, getId());
return;
}
Sound s;
s->setArgs1(op);
s->setFrom(getId());
// FIXME Remove this - broadcasting
if (!op->isDefaultSerialno()) {
s->setRefno(op->getSerialno());
}
if (arg->hasAttrFlag(Atlas::Objects::Entity::LOC_FLAG)) {
s->setTo(arg->getLoc());
} else {
s->setTo(op->getTo());
}
assert(m_connection != 0);
m_connection->m_server.m_lobby.operation(s, res);
}
void Account::LookOperation(const Operation & op, OpVector & res)
{
assert(m_connection != 0);
const std::vector<Root> & args = op->getArgs();
if (args.empty()) {
Sight s;
s->setTo(getId());
Anonymous sight_arg;
m_connection->m_server.m_lobby.addToEntity(sight_arg);
s->setArgs1(sight_arg);
res.push_back(s);
return;
}
const Root & arg = args.front();
if (!arg->hasAttrFlag(Atlas::Objects::ID_FLAG)) {
error(op, "No target for look", res, getId());
return;
}
const std::string & to = arg->getId();
long intId = integerId(to);
EntityDict::const_iterator J = m_charactersDict.find(intId);
if (J != m_charactersDict.end()) {
Sight s;
s->setTo(getId());
Anonymous sight_arg;
J->second->addToEntity(sight_arg);
s->setArgs1(sight_arg);
res.push_back(s);
return;
}
const AccountDict & accounts = m_connection->m_server.m_lobby.getAccounts();
AccountDict::const_iterator K = accounts.find(to);
if (K != accounts.end()) {
Sight s;
s->setTo(getId());
Anonymous sight_arg;
K->second->addToEntity(sight_arg);
s->setArgs1(sight_arg);
res.push_back(s);
return;
}
error(op, "Unknown look target", res, getId());
}
void Account::GetOperation(const Operation & op, OpVector & res)
{
}
void Account::OtherOperation(const Operation & op, OpVector & res)
{
error(op, "Unknown operation", res);
}