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
|
2001-04-16 16:26:44 +00:00
|
|
|
// Copyright (C) 2000,2001 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
|
2001-03-07 11:49:43 +00:00
|
|
|
|
2006-10-26 00:48:00 +00:00
|
|
|
|
2001-03-07 11:49:43 +00:00
|
|
|
#include "Plant.h"
|
|
|
|
|
|
2008-09-26 21:09:35 +00:00
|
|
|
#include "StatusProperty.h"
|
|
|
|
|
#include "BBoxProperty.h"
|
2013-07-26 14:09:20 +02:00
|
|
|
#include "AreaProperty.h"
|
|
|
|
|
#include "physics/Shape.h"
|
2002-05-18 Al Riddoch <alriddoch@zepler.org>
* client/ObserverClient.cpp, server/Account.cpp, server/Connection.h,
server/Routing.h: Formatting cleanup
* client/Py_CreatorClient.cpp, rulesets/Area.cpp, rulesets/Area.h,
rulesets/Character.cpp, rulesets/Character.h, rulesets/Entity.cpp,
rulesets/Entity.h, rulesets/Line.cpp, rulesets/Line.h,
rulesets/Plant.cpp, rulesets/Plant.h, rulesets/Py_Mind.cpp,
rulesets/Py_Thing.cpp, rulesets/Stackable.cpp, rulesets/Stackable.h:
Replace operator[] with get() method for querying attributes.
Make this get() method const, and re-write the internals so
that it more cleanly handles attributes.
* common/BaseWorld.h: Re-write world.getObject() so that it
no longer uses std::map::operator[], as the old method was
inserting NULLs into the world dictionary when non-existant
entities were queried.
* rulesets/Character.cpp: Clean up outstanding issues when movement
position is supplied, and is very close to being correct, and
clarify comments about movement when neither destination nor
source are provided.
* rulesets/Character.cpp: Modify mind2body interface so that setting
the TO of ops is done in the individual handlers, and copying
the operation globally is avoided.
* rulesets/MemMap_methods.h: Remove dodgy debug code.
* rulesets/Pedestrian.cpp: Clarify movement fixme.
* rulesets/Py_Operation.cpp: Clarify operation time handler fixme.
* rulesets/Stackable.cpp: Clarify fixme's in combine and divide
handlers.
* server/CommServer.cpp: Remove redundant fixme.
* server/Connection.cpp, server/ServerRouting.cpp,
server/ServerRouting.h, server/ServerRouting_methods.h,
server/server.cpp:
Move inline ServerRouting::getObject into class header.
* server/WorldRouter.cpp, server/WorldRouter.h:
Clean up includes, and move updateTime into the main body of the
file. Clean up code formatting when handling maps and dictionaries.
Clarify error output and comments about NULL objects in the world
dictionary.
2002-05-18 18:09:14 +00:00
|
|
|
|
2003-03-07 00:22:12 +00:00
|
|
|
#include "common/const.h"
|
2003-09-17 15:05:08 +00:00
|
|
|
#include "common/debug.h"
|
2003-03-07 00:22:12 +00:00
|
|
|
#include "common/random.h"
|
2008-09-26 21:09:35 +00:00
|
|
|
#include "common/compose.hpp"
|
|
|
|
|
#include "common/TypeNode.h"
|
2008-09-27 16:18:43 +00:00
|
|
|
#include "common/Property.h"
|
* tools/cydbload.cpp: Added parameter handling so any file can
be loaded into the database.
* tools/cycmd.cpp: Cleaned up usage and help functions.
* tools/cyisoload.cpp: Cleaned up usage(), and made sure build
completes okay if libraries are missing, and missing
functionality is reported to the user.
* server/server.cpp: Added config options that specifies that
the contents of the db should loaded on server startup. Cleaned
up some debug code.
* server/WorldTime.cpp, server/WorldRouter.cpp,
server/Connection.cpp, rulesets/Structure.h,
rulesets/Python_API.cpp, rulesets/Py_WorldTime.cpp,
rulesets/Movement.cpp, rulesets/Entity.cpp,
physics/Vector3D.h, common/persistance.cpp,
common/database.h, common/database.cpp: Removed output either
to debug mode, or removed altogether.
* common/BaseEntity.h, common/BaseEntity.cpp: Removed redundant header
includes.
* server/ServerRouting.cpp, common/persistance.h,
common/persistance.cpp: Modified admin account function names it
fit convention.
* module/Location.h: Fixed collision detection so that entities
with velocity set to 0 still get checked.
* rulesets/Entity.cpp, rulesets/Thing.cpp, rulesets/Character.cpp,
rulesets/BaseMind.cpp, rulesets/Creator.cpp,
rulesets/ExternalMind.cpp, rulesets/Food.cpp, rulesets/MemMap.cpp,
rulesets/Movement.cpp, rulesets/Pedestrian.cpp, rulesets/Plant.cpp,
rulesets/Py_Location.cpp, rulesets/Py_*.cpp, rulesets/World.cpp:
Removed unnecessary #includes.
Al Riddoch <alriddoch@zepler.org>
2001-06-04 11:22:27 +00:00
|
|
|
|
2004-11-15 14:19:38 +00:00
|
|
|
#include "common/log.h"
|
|
|
|
|
|
2005-06-28 21:45:06 +00:00
|
|
|
#include "common/Eat.h"
|
2008-09-26 21:09:35 +00:00
|
|
|
#include "common/Tick.h"
|
|
|
|
|
#include "common/Update.h"
|
2004-11-13 16:42:55 +00:00
|
|
|
|
|
|
|
|
#include <wfmath/atlasconv.h>
|
2008-09-03 20:57:49 +00:00
|
|
|
#include <wfmath/MersenneTwister.h>
|
2002-07-14 21:04:50 +00:00
|
|
|
|
2005-08-27 14:52:12 +00:00
|
|
|
#include <Atlas/Objects/Operation.h>
|
|
|
|
|
#include <Atlas/Objects/Anonymous.h>
|
2002-05-18 Al Riddoch <alriddoch@zepler.org>
* client/ObserverClient.cpp, server/Account.cpp, server/Connection.h,
server/Routing.h: Formatting cleanup
* client/Py_CreatorClient.cpp, rulesets/Area.cpp, rulesets/Area.h,
rulesets/Character.cpp, rulesets/Character.h, rulesets/Entity.cpp,
rulesets/Entity.h, rulesets/Line.cpp, rulesets/Line.h,
rulesets/Plant.cpp, rulesets/Plant.h, rulesets/Py_Mind.cpp,
rulesets/Py_Thing.cpp, rulesets/Stackable.cpp, rulesets/Stackable.h:
Replace operator[] with get() method for querying attributes.
Make this get() method const, and re-write the internals so
that it more cleanly handles attributes.
* common/BaseWorld.h: Re-write world.getObject() so that it
no longer uses std::map::operator[], as the old method was
inserting NULLs into the world dictionary when non-existant
entities were queried.
* rulesets/Character.cpp: Clean up outstanding issues when movement
position is supplied, and is very close to being correct, and
clarify comments about movement when neither destination nor
source are provided.
* rulesets/Character.cpp: Modify mind2body interface so that setting
the TO of ops is done in the individual handlers, and copying
the operation globally is avoided.
* rulesets/MemMap_methods.h: Remove dodgy debug code.
* rulesets/Pedestrian.cpp: Clarify movement fixme.
* rulesets/Py_Operation.cpp: Clarify operation time handler fixme.
* rulesets/Stackable.cpp: Clarify fixme's in combine and divide
handlers.
* server/CommServer.cpp: Remove redundant fixme.
* server/Connection.cpp, server/ServerRouting.cpp,
server/ServerRouting.h, server/ServerRouting_methods.h,
server/server.cpp:
Move inline ServerRouting::getObject into class header.
* server/WorldRouter.cpp, server/WorldRouter.h:
Clean up includes, and move updateTime into the main body of the
file. Clean up code formatting when handling maps and dictionaries.
Clarify error output and comments about NULL objects in the world
dictionary.
2002-05-18 18:09:14 +00:00
|
|
|
|
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;
|
2005-08-27 14:52:12 +00:00
|
|
|
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::Create;
|
2005-06-28 21:45:06 +00:00
|
|
|
using Atlas::Objects::Operation::Eat;
|
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::Move;
|
|
|
|
|
using Atlas::Objects::Operation::Tick;
|
2008-09-26 21:09:35 +00:00
|
|
|
using Atlas::Objects::Operation::Update;
|
2005-08-27 14:52:12 +00:00
|
|
|
using Atlas::Objects::Entity::Anonymous;
|
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
|
|
|
|
2003-09-17 15:05:08 +00:00
|
|
|
static const bool debug_flag = false;
|
|
|
|
|
|
2008-01-26 Al Riddoch <alriddoch@googlemail.com>
* common/BaseEntity.cpp, common/BaseEntity.h: Remove the code that
handle ID, and just inherit from Identified.
* client/CharacterClient.cpp, client/CreatorClient.cpp,
common/OOGThing.cpp, rulesets/BaseMind.cpp, rulesets/Character.cpp,
rulesets/Creator.cpp, rulesets/Entity.cpp,
rulesets/LocatedEntity.cpp, rulesets/MemEntity.cpp,
rulesets/Plant.cpp, rulesets/Stackable.cpp, rulesets/Structure.cpp,
rulesets/Thing.cpp, rulesets/World.cpp, server/Account.cpp,
server/Admin.cpp, server/ExternalMind.cpp, server/Lobby.cpp,
server/Peer.cpp, server/Player.cpp, server/ServerRouting.cpp,
server/SlaveClientConnection.cpp: Add calls to the virtually
inherited Identified constructor as required.
2008-01-26 17:43:20 +00:00
|
|
|
Plant::Plant(const std::string & id, long intId) :
|
2014-02-18 20:41:57 +01:00
|
|
|
Thing(id, intId)
|
2001-03-07 11:49:43 +00:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2004-11-02 Al Riddoch <alriddoch@zepler.org>
* rulesets/Entity.cpp, rulesets/Entity.h: Make get(), set(), and
addToMessage() non-virtual, and convert them to using new property
mechanism. Add the necessary properties in the constructor.
* rulesets/Area.cpp, rulesets/Area.h, rulesets/Character.cpp,
rulesets/Character.h, rulesets/Line.cpp, rulesets/Line.h,
rulesets/Plant.cpp, rulesets/Plant.h, rulesets/Stackable.cpp,
rulesets/Stackable.h, rulesets/World.cpp, rulesets/World.h:
Remove virtual get() set() and addToMessage() methods. These
are now entirely in Entity.
* rulesets/World.cpp, rulesets/World.h: Remove some functions
for handling terrain data now handled by properties.
Clean up Set code to get rid of nasty unnecessary exception
try / catch block.
2004-11-02 20:44:24 +00:00
|
|
|
Plant::~Plant()
|
2003-05-05 Al Riddoch <alriddoch@zepler.org>
* server/EntityFactory.cpp, rulesets/Python_API.h,
rulesets/Python_API.cpp, rulesets/PythonThingScript.h,
rulesets/PythonThingScript.cpp, rulesets/PythonMindScript.cpp,
rulesets/Py_World.cpp, rulesets/Py_Thing.h, rulesets/Py_Thing.cpp,
rulesets/Py_Operation.cpp, rulesets/Py_Map.cpp,
rulesets/Py_Location.cpp, rulesets/Movement.h,
rulesets/MemMap_methods.h, rulesets/MemMap.h, rulesets/MemMap.cpp,
rulesets/Entity.cpp, rulesets/BaseMind.cpp,
client/Py_CreatorClient.cpp:
Rename all references from thing to entity, as thing is
no longer the base class for IG entities.
* rulesets/World.h, rulesets/World.cpp, rulesets/Thing.h,
rulesets/Structure.h, rulesets/Stackable.h, rulesets/Stackable.cpp,
rulesets/Plant.h, rulesets/Plant.cpp, rulesets/Missile.h,
rulesets/Line.h, rulesets/Line.cpp, rulesets/Food.h,
rulesets/Food.cpp, rulesets/Creator.h, rulesets/Character.h,
rulesets/Character.cpp, rulesets/Area.h, rulesets/Area.cpp:
Add a typedef for the parent class of all entity classes.
* rulesets/Plant.h, rulesets/Plant.cpp:
Add in code to fully integrate hardcoded attributes.
2003-05-05 21:57:50 +00:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-08 15:08:19 +02:00
|
|
|
/// \brief Generate operations to drop a fruit.
|
2008-09-08 20:05:06 +00:00
|
|
|
///
|
2015-04-08 15:08:19 +02:00
|
|
|
void Plant::dropFruit(OpVector & res, const std::string& fruitName)
|
2001-03-07 11:49:43 +00:00
|
|
|
{
|
2008-09-26 21:09:35 +00:00
|
|
|
|
2015-04-08 15:08:19 +02:00
|
|
|
debug(std::cout << "Dropping a fruit from "
|
2003-09-17 15:05:08 +00:00
|
|
|
<< m_type << " plant." << std::endl << std::flush;);
|
2013-07-26 11:18:48 +02:00
|
|
|
float height = m_location.bBox().highCorner().z();
|
2015-04-08 15:08:19 +02:00
|
|
|
float rx = m_location.pos().x() + uniform( height,
|
|
|
|
|
-height);
|
|
|
|
|
float ry = m_location.pos().y() + uniform( height,
|
|
|
|
|
-height);
|
|
|
|
|
Anonymous fruit_arg;
|
|
|
|
|
fruit_arg->setParents(std::list<std::string>(1, fruitName));
|
|
|
|
|
Location floc(m_location.m_loc, Point3D(rx, ry, 0));
|
|
|
|
|
floc.addToEntity(fruit_arg);
|
|
|
|
|
Create create;
|
|
|
|
|
create->setTo(getId());
|
|
|
|
|
create->setArgs1(fruit_arg);
|
|
|
|
|
res.push_back(create);
|
2001-03-07 11:49:43 +00:00
|
|
|
}
|
|
|
|
|
|
2005-06-28 21:45:06 +00:00
|
|
|
void Plant::NourishOperation(const Operation & op, OpVector & res)
|
|
|
|
|
{
|
2006-06-02 15:38:27 +00:00
|
|
|
debug(std::cout << "Plant::Nourish(" << getId() << "," << m_type << ")"
|
|
|
|
|
<< std::endl << std::flush;);
|
2005-08-27 14:52:12 +00:00
|
|
|
if (op->getArgs().empty()) {
|
2005-07-01 00:45:57 +00:00
|
|
|
error(op, "Nourish has no argument", res, getId());
|
|
|
|
|
return;
|
|
|
|
|
}
|
2005-08-27 14:52:12 +00:00
|
|
|
const Root & arg = op->getArgs().front();
|
|
|
|
|
Element mass;
|
2005-08-30 23:53:34 +00:00
|
|
|
if (arg->copyAttr("mass", mass) != 0 || !mass.isNum()) {
|
2005-07-01 00:45:57 +00:00
|
|
|
return;
|
|
|
|
|
}
|
2014-02-19 14:00:14 +01:00
|
|
|
if (!m_nourishment) {
|
|
|
|
|
m_nourishment = mass.asNum();
|
|
|
|
|
} else {
|
|
|
|
|
*m_nourishment += mass.asNum();
|
|
|
|
|
}
|
2015-09-11 17:10:23 +02:00
|
|
|
debug(std::cout << "Nourishment: " << *m_nourishment
|
2005-07-01 00:45:57 +00:00
|
|
|
<< std::endl << std::flush;);
|
2005-06-28 21:45:06 +00:00
|
|
|
}
|
|
|
|
|
|
2004-12-06 Al Riddoch <alriddoch@zepler.org>
* client/BaseClient.cpp, client/BaseClient.h, client/CreatorClient.cpp,
client/CreatorClient.h, common/BaseEntity.cpp, common/BaseEntity.h,
common/BaseWorld.h, common/OOGThing.cpp, common/OOGThing.h,
common/op_switch.h, common/refno.h, common/types.h,
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/Food.cpp,
rulesets/Food.h, rulesets/MemMap.cpp, rulesets/Plant.cpp,
rulesets/Plant.h, rulesets/Py_Map.cpp, rulesets/PythonMindScript.cpp,
rulesets/PythonThingScript.cpp, 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/Connection_methods.h, server/ExternalMind.cpp,
server/ExternalMind.h, server/Lobby.cpp, server/Lobby.h,
server/Player.cpp, server/Player.h, server/WorldRouter.cpp,
server/WorldRouter.h, tests/Creatortest.cpp, tests/Worldtest.cpp:
Add a new Operation typedef to clean up headers, and get round
limitation in doxygen.
2004-12-06 16:35:44 +00:00
|
|
|
void Plant::TickOperation(const Operation & op, OpVector & res)
|
2001-03-07 11:49:43 +00:00
|
|
|
{
|
2003-11-22 13:19:36 +00:00
|
|
|
debug(std::cout << "Plant::Tick(" << getId() << "," << m_type << ")"
|
|
|
|
|
<< std::endl << std::flush;);
|
2008-09-03 20:57:49 +00:00
|
|
|
// Use a value seeded from the ID, so it's always the same.
|
|
|
|
|
WFMath::MTRand::instance.seed(getIntId());
|
2011-04-28 00:42:16 +01:00
|
|
|
double jitter = WFMath::MTRand::instance.rand() * 10.;
|
2008-09-03 20:57:49 +00:00
|
|
|
|
2005-08-27 14:52:12 +00:00
|
|
|
Tick tick_op;
|
2005-06-28 21:45:06 +00:00
|
|
|
tick_op->setTo(getId());
|
2008-09-03 20:57:49 +00:00
|
|
|
tick_op->setFutureSeconds(consts::basic_tick * m_speed + jitter);
|
2005-06-28 21:45:06 +00:00
|
|
|
res.push_back(tick_op);
|
|
|
|
|
|
2008-09-26 21:09:35 +00:00
|
|
|
// The update op will broadcast notification for all properties that
|
|
|
|
|
// are marked flag_unsent
|
|
|
|
|
Update update;
|
|
|
|
|
update->setTo(getId());
|
|
|
|
|
res.push_back(update);
|
2005-07-01 00:45:57 +00:00
|
|
|
|
2014-02-18 20:41:57 +01:00
|
|
|
//Only do nourishment check if we've had a chance to send an Eat op.
|
|
|
|
|
//Else we'll be shrinking each time the server is restarted.
|
|
|
|
|
if (m_nourishment) {
|
|
|
|
|
StatusProperty * status = requirePropertyClass<StatusProperty>("status", 1);
|
|
|
|
|
double & new_status = status->data();
|
|
|
|
|
status->setFlags(flag_unsent);
|
|
|
|
|
if (*m_nourishment <= 0) {
|
|
|
|
|
debug(std::cout << "No nourishment; shrinking."
|
|
|
|
|
<< std::endl << std::flush;);
|
|
|
|
|
new_status -= 0.1;
|
|
|
|
|
} else {
|
|
|
|
|
new_status += 0.1;
|
|
|
|
|
if (new_status > 1.) {
|
|
|
|
|
new_status = 1.;
|
|
|
|
|
}
|
2013-07-26 11:18:48 +02:00
|
|
|
|
2014-02-18 20:41:57 +01:00
|
|
|
Property<double> * mass_prop = requirePropertyClass<Property<double> >("mass", 0.);
|
|
|
|
|
double & mass = mass_prop->data();
|
|
|
|
|
double old_mass = mass;
|
|
|
|
|
mass += *m_nourishment;
|
2007-12-03 Al Riddoch <alriddoch@zepler.org>
* rulesets/Character.cpp, rulesets/Character.h, rulesets/Entity.cpp,
rulesets/Entity.h, rulesets/Plant.cpp, rulesets/Py_Thing.cpp,
rulesets/StatusProperty.cpp, rulesets/attributes.h,
server/CorePropertyManager.cpp, server/Persistor.cpp,
server/Persistor_impl.h, server/Restorer.cpp,
server/Restorer_impl.h: Remove the hard coded status property from
Entity, and the hard coded food property from character. Fix
the logic handling digestion and plants to use the new softer
properties.
2007-12-03 20:40:55 +00:00
|
|
|
|
2014-02-18 20:41:57 +01:00
|
|
|
*m_nourishment = 0;
|
|
|
|
|
Element maxmass_attr;
|
|
|
|
|
if (getAttrType("maxmass", maxmass_attr, Element::TYPE_FLOAT) == 0) {
|
|
|
|
|
mass = std::min(mass, maxmass_attr.Float());
|
|
|
|
|
}
|
|
|
|
|
PropertyBase * biomass = modPropertyType<double>("biomass");
|
|
|
|
|
if (biomass != nullptr) {
|
|
|
|
|
biomass->set(mass);
|
|
|
|
|
biomass->setFlags(flag_unsent);
|
2008-09-26 21:09:35 +00:00
|
|
|
}
|
2014-08-25 21:48:43 +02:00
|
|
|
//TODO: we need to sort out how to handle mass and biomass
|
|
|
|
|
mass_prop->set(mass);
|
|
|
|
|
mass_prop->setFlags(flag_unsent);
|
2013-07-26 14:09:20 +02:00
|
|
|
|
2014-02-18 20:41:57 +01:00
|
|
|
BBox & bbox = m_location.m_bBox;
|
|
|
|
|
// FIXME Handle the bbox without needing the Set operation.
|
|
|
|
|
if (old_mass != 0 && bbox.isValid()) {
|
|
|
|
|
float scale = (float)(mass / old_mass);
|
|
|
|
|
float height_scale = std::pow(scale, 0.33333f);
|
|
|
|
|
debug(std::cout << "scale " << scale << ", " << height_scale
|
|
|
|
|
<< std::endl << std::flush;);
|
|
|
|
|
debug(std::cout << "Old " << bbox << std::endl << std::flush;);
|
|
|
|
|
// FIXME Rammming in a bbox without checking if its valid.
|
|
|
|
|
bbox = BBox(Point3D(bbox.lowCorner().x() * height_scale,
|
|
|
|
|
bbox.lowCorner().y() * height_scale,
|
|
|
|
|
bbox.lowCorner().z() * height_scale),
|
|
|
|
|
Point3D(bbox.highCorner().x() * height_scale,
|
|
|
|
|
bbox.highCorner().y() * height_scale,
|
|
|
|
|
bbox.highCorner().z() * height_scale));
|
|
|
|
|
debug(std::cout << "New " << bbox << std::endl << std::flush;);
|
|
|
|
|
BBoxProperty * box_property = modPropertyClass<BBoxProperty>("bbox");
|
|
|
|
|
if (box_property != nullptr) {
|
|
|
|
|
box_property->data() = bbox;
|
|
|
|
|
box_property->apply(this);
|
2014-08-25 21:48:43 +02:00
|
|
|
box_property->setFlags(flag_unsent);
|
2014-02-18 20:41:57 +01:00
|
|
|
} else {
|
|
|
|
|
log(ERROR, String::compose("Plant %1 type \"%2\" has a valid "
|
|
|
|
|
"bbox, but no bbox property",
|
|
|
|
|
getIntId(), getType()->name()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
scaleArea();
|
2013-07-26 14:09:20 +02:00
|
|
|
|
2014-02-18 20:41:57 +01:00
|
|
|
}
|
2007-12-03 Al Riddoch <alriddoch@zepler.org>
* data/animals.xml: Give all the animals BIOMASS.
* data/characters.xml: Add mass to some character classes that were
missing it.
* rulesets/Character.cpp, rulesets/Character.h, rulesets/Entity.cpp,
rulesets/Entity.h, rulesets/Plant.cpp, rulesets/Statistics.cpp,
rulesets/World.cpp, server/CorePropertyManager.cpp,
server/Persistor.cpp, server/Persistor_impl.h,
server/Restorer_impl.h: Remove the hard coded mass property from
Entity.
* rulesets/mason/world/statistics/Statistics.py: Fix scripts which
assume entities will have mass.
2007-12-03 23:18:51 +00:00
|
|
|
}
|
2014-02-18 20:41:57 +01:00
|
|
|
status->apply(this);
|
2005-07-01 00:45:57 +00:00
|
|
|
}
|
2014-02-18 20:41:57 +01:00
|
|
|
|
|
|
|
|
if (m_location.m_loc != nullptr) {
|
2015-07-08 22:55:40 +02:00
|
|
|
Element mode_attr;
|
|
|
|
|
if (getAttrType("mode", mode_attr, Element::TYPE_STRING) == 0 && mode_attr.String() == "planted") {
|
|
|
|
|
//Only send eat ops if we're planted.
|
|
|
|
|
Eat eat_op;
|
|
|
|
|
eat_op->setTo(m_location.m_loc->getId());
|
|
|
|
|
res.push_back(eat_op);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Initialize nourishment to zero once we've had a chance to sent our first Eat op.
|
2015-04-08 23:24:02 +02:00
|
|
|
if (!m_nourishment) {
|
2014-02-19 14:00:14 +01:00
|
|
|
m_nourishment = .0;
|
|
|
|
|
}
|
2014-02-18 20:41:57 +01:00
|
|
|
}
|
|
|
|
|
|
2005-07-01 00:45:57 +00:00
|
|
|
|
2013-07-01 20:14:38 +02:00
|
|
|
//Only handle fruits if the plant is of adult size.
|
2008-10-01 18:20:57 +00:00
|
|
|
Property<int> * fruits_prop = modPropertyType<int>("fruits");
|
2013-07-26 11:18:48 +02:00
|
|
|
if (fruits_prop != nullptr) {
|
2008-09-08 20:05:06 +00:00
|
|
|
Element sizeAdult;
|
2013-07-25 19:23:45 +02:00
|
|
|
if (getAttrType("sizeAdult", sizeAdult, Element::TYPE_FLOAT) == 0 ||
|
|
|
|
|
getAttrType("sizeAdult", sizeAdult, Element::TYPE_INT) == 0) {
|
2013-07-26 11:18:48 +02:00
|
|
|
//Only drop fruits if we're an adult
|
|
|
|
|
if (m_location.bBox().isValid() &&
|
|
|
|
|
(m_location.bBox().highCorner().z() >= sizeAdult.asNum())) {
|
2015-04-08 15:08:19 +02:00
|
|
|
handleFruiting(res, *fruits_prop);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Plant::handleFruiting(OpVector & res, Property<int>& fruits_prop) {
|
|
|
|
|
Element fruitName;
|
|
|
|
|
if (getAttrType("fruitName", fruitName, Element::TYPE_STRING) != 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto& fruits = fruits_prop.data();
|
|
|
|
|
Element fruitsChance;
|
|
|
|
|
if (getAttrType("fruitChance", fruitsChance, Element::TYPE_INT) == 0) {
|
|
|
|
|
//First check if we should drop fruits.
|
|
|
|
|
if (fruits > 0) {
|
|
|
|
|
//TODO: use a different attribute than fruitChance for this
|
|
|
|
|
if (randint(0, 100) < fruitsChance.Int()) {
|
|
|
|
|
fruits--;
|
|
|
|
|
fruits_prop.setFlags(flag_unsent);
|
|
|
|
|
dropFruit(res, fruitName.String());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Then see if we should increase the number of fruits.
|
|
|
|
|
Element fruitsMax;
|
|
|
|
|
//Increase fruits if there's either no max value, or we haven't reached it yet.
|
|
|
|
|
if (getAttrType("fruitsMax", fruitsMax, Element::TYPE_INT) != 0 || fruitsMax.Int() > fruits_prop.data()) {
|
|
|
|
|
//FruitChance is between [0..100] (percentage).
|
|
|
|
|
if (randint(0, 100) < fruitsChance.Int()) {
|
|
|
|
|
fruits++;
|
|
|
|
|
fruits_prop.setFlags(flag_unsent);
|
2008-09-08 20:05:06 +00:00
|
|
|
}
|
|
|
|
|
}
|
2001-03-07 11:49:43 +00:00
|
|
|
}
|
|
|
|
|
}
|
2004-04-19 18:22:22 +00:00
|
|
|
|
2004-12-06 Al Riddoch <alriddoch@zepler.org>
* client/BaseClient.cpp, client/BaseClient.h, client/CreatorClient.cpp,
client/CreatorClient.h, common/BaseEntity.cpp, common/BaseEntity.h,
common/BaseWorld.h, common/OOGThing.cpp, common/OOGThing.h,
common/op_switch.h, common/refno.h, common/types.h,
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/Food.cpp,
rulesets/Food.h, rulesets/MemMap.cpp, rulesets/Plant.cpp,
rulesets/Plant.h, rulesets/Py_Map.cpp, rulesets/PythonMindScript.cpp,
rulesets/PythonThingScript.cpp, 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/Connection_methods.h, server/ExternalMind.cpp,
server/ExternalMind.h, server/Lobby.cpp, server/Lobby.h,
server/Player.cpp, server/Player.h, server/WorldRouter.cpp,
server/WorldRouter.h, tests/Creatortest.cpp, tests/Worldtest.cpp:
Add a new Operation typedef to clean up headers, and get round
limitation in doxygen.
2004-12-06 16:35:44 +00:00
|
|
|
void Plant::TouchOperation(const Operation & op, OpVector & res)
|
2004-04-19 18:22:22 +00:00
|
|
|
{
|
2013-07-26 11:18:48 +02:00
|
|
|
Element sizeAdult;
|
|
|
|
|
if (getAttrType("sizeAdult", sizeAdult, Element::TYPE_FLOAT) == 0
|
|
|
|
|
|| getAttrType("sizeAdult", sizeAdult, Element::TYPE_INT) == 0) {
|
|
|
|
|
//Only drop fruits if we're an adult
|
|
|
|
|
if (m_location.bBox().isValid()
|
|
|
|
|
&& (m_location.bBox().highCorner().z() >= sizeAdult.asNum())) {
|
|
|
|
|
|
|
|
|
|
Property<int> * fruits_prop = modPropertyType<int>("fruits");
|
2015-04-08 15:08:19 +02:00
|
|
|
if (fruits_prop != nullptr) {
|
|
|
|
|
if (fruits_prop->data() <= 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Element fruitName;
|
|
|
|
|
if (getAttrType("fruitName", fruitName, Element::TYPE_STRING) != 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Element fruitsChance;
|
|
|
|
|
if (getAttrType("fruitChance", fruitsChance, Element::TYPE_INT) != 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//TODO: use a different attribute than fruitChance for this
|
|
|
|
|
if (randint(0, 100) < fruitsChance.Int()) {
|
|
|
|
|
fruits_prop->data()--;
|
|
|
|
|
fruits_prop->setFlags(flag_unsent);
|
|
|
|
|
dropFruit(res, fruitName.String());
|
|
|
|
|
|
|
|
|
|
Update update;
|
|
|
|
|
update->setTo(getId());
|
|
|
|
|
res.push_back(update);
|
|
|
|
|
}
|
|
|
|
|
|
2013-07-26 11:18:48 +02:00
|
|
|
}
|
|
|
|
|
}
|
2004-04-19 18:22:22 +00:00
|
|
|
}
|
|
|
|
|
}
|
2013-07-26 14:09:20 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
void Plant::scaleArea() {
|
|
|
|
|
static float AREA_SCALING_FACTOR=3.0f;
|
|
|
|
|
|
|
|
|
|
const WFMath::AxisBox<3>& bbox = m_location.bBox();
|
|
|
|
|
if (bbox.isValid()) {
|
|
|
|
|
//If there's an area we need to scale that with the bbox
|
|
|
|
|
AreaProperty * area_property = modPropertyClass<AreaProperty>("area");
|
|
|
|
|
if (area_property != nullptr) {
|
|
|
|
|
WFMath::AxisBox<2> footprint = area_property->shape()->footprint();
|
|
|
|
|
//We'll make it so that the footprint of the area is AREA_SCALING_FACTOR times the footprint of the bbox
|
|
|
|
|
auto area_radius = footprint.boundingSphere().radius();
|
|
|
|
|
if (area_radius != 0.0f) {
|
|
|
|
|
|
|
|
|
|
//We're only interested in the horizontal radius of the plant
|
|
|
|
|
WFMath::AxisBox<2> flat_bbox(WFMath::Point<2>(bbox.lowerBound(0), bbox.lowerBound(1)), WFMath::Point<2>(bbox.upperBound(0), bbox.upperBound(1)));
|
|
|
|
|
auto plant_radius = flat_bbox.boundingSphere().radius();
|
|
|
|
|
|
|
|
|
|
auto desired_radius = plant_radius * AREA_SCALING_FACTOR;
|
|
|
|
|
auto scaling_factor = desired_radius / area_radius;
|
|
|
|
|
|
2013-08-22 20:33:08 +02:00
|
|
|
//No need to alter if the scale is the same.
|
|
|
|
|
//Also don't scale the unless the difference is at least 10% in either direction.
|
|
|
|
|
//The reason for this is that we don't want to alter the area each tick since
|
|
|
|
|
//the client often must perform a sometimes expensive material regeneration
|
|
|
|
|
//calculation every time a terrain area changes. With many plants this runs the
|
|
|
|
|
//risk of bogging down the client then.
|
|
|
|
|
if (!WFMath::Equal(scaling_factor, 1.0f)
|
|
|
|
|
&& (scaling_factor > 1.1f || scaling_factor < 0.9f)) {
|
2013-07-26 14:09:20 +02:00
|
|
|
std::unique_ptr<Form<2>> new_area_shape(
|
|
|
|
|
area_property->shape()->copy());
|
|
|
|
|
new_area_shape->scale(scaling_factor);
|
|
|
|
|
Atlas::Message::MapType shapeElement;
|
|
|
|
|
new_area_shape->toAtlas(shapeElement);
|
|
|
|
|
|
|
|
|
|
Atlas::Message::Element areaElement;
|
|
|
|
|
area_property->get(areaElement);
|
|
|
|
|
areaElement.asMap()["shape"] = shapeElement;
|
|
|
|
|
|
|
|
|
|
area_property->set(areaElement);
|
2014-01-19 22:46:45 +01:00
|
|
|
area_property->apply(this);
|
2013-07-26 14:09:20 +02:00
|
|
|
area_property->setFlags(flag_unsent);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|