From: Keith F. <ven...@us...> - 2003-10-03 08:12:14
|
Update of /cvsroot/planeshift/planeshift/src/server In directory sc8-pr-cvs1:/tmp/cvs-serv16164 Modified Files: gem.h gem.cpp Log Message: Extended game events to be conditional on gemObjects if you use the subclass psGameObjectEvent. If you use this, you don't have to do anything else--and your Trigger() function will only be called if the object is still valid. Index: gem.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/gem.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** gem.h 1 Oct 2003 22:16:00 -0000 1.4 --- gem.h 3 Oct 2003 08:12:08 -0000 1.5 *************** *** 92,95 **** --- 92,109 ---- /** + * This class generically allows objects to be notified + * when a gemObject is removed. psGameObjectEvent uses + * this heavily to make sure that timed events for an + * object are not run when obsolete, but other classes + * may use this too as appropriate. + */ + class iDisconnectReceiver + { + public: + virtual void Disconnecting(void * object)=0; + }; + + + /** * A gemObject is any solid, graphical object visible in PS with normal physics * and normal collision detection. *************** *** 106,109 **** --- 120,124 ---- csVector3 pos; iSector *sector; + bool is_alive; csArray<iDisconnectReceiver*> receivers; *************** *** 128,131 **** --- 143,148 ---- virtual bool IsValid(void) { return (entity!=NULL); } + void SetAlive(bool flag) { is_alive = flag; } + bool IsAlive() { return is_alive; } iCelEntity *GetEntity() { return entity; } bool IsActor(){ return false; } *************** *** 300,303 **** --- 317,356 ---- void SetupDialog(int NPCID); }; + + /** + * This class automatically implements timed events which depend + * on the existence and validity of a gemObject of any kind. It + * will make sure this event is cancelled and skipped when the + * gemObject is deleted before the event is fired. + */ + class psGameObjectEvent : public psGameEvent, iDisconnectReceiver + { + public: + bool valid; + gemObject *dependency; + + psGameObjectEvent(csTicks ticks,int offsetticks,gemObject *depends) + : psGameEvent(ticks,offsetticks) + { + valid = true; + dependency = depends; + + // Register for disconnect events + dependency->Register(this); + } + + virtual void Disconnecting(void * object) + { + valid = false; + } + + virtual bool CheckTrigger() + { + dependency->Unregister(this); + return valid; + } + }; + + #endif Index: gem.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/gem.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** gem.cpp 1 Oct 2003 22:16:00 -0000 1.4 --- gem.cpp 3 Oct 2003 08:12:08 -0000 1.5 *************** *** 343,346 **** --- 343,347 ---- proxlist = NULL; + is_alive = false; csRef<iCelPropertyClass> pc; *************** *** 860,863 **** --- 861,865 ---- factname,pos.x,pos.y,pos.z,sector->QueryObject()->GetName() ); + is_alive = true; logging_chat = 0; } |