/*==LICENSE==*
CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011 Cyan Worlds, Inc.
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 3 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, see .
Additional permissions under GNU GPL version 3 section 7
If you modify this Program, or any covered work, by linking or
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
(or a modified version of those libraries),
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
licensors of this Program grant you additional
permission to convey the resulting work. Corresponding Source for a
non-source form of such a combination shall include the source code for
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
work.
You can contact Cyan Worlds, Inc. by email legal@cyan.com
or by snail mail at:
Cyan Worlds, Inc.
14617 N Newport Hwy
Mead, WA 99021
*==LICENSE==*/
#ifndef _plNotifyMsg_h_
#define _plNotifyMsg_h_
#include "plMessage.h"
#include "hsResMgr.h"
#include "../pnModifier/plSingleModifier.h"
#include "hsUtils.h"
#include "hsGeometry3.h"
//
// repeatable Event data in Notify message
//
// Updated 4.13.2002 mcn - Unions are all well and good, but only work on simple data types, and since
// plKey now isn't so simple...
class proEventData
{
public:
// keep this enum synchronized with the list at the top of PlasmaTypes.py
enum eventType
{
kCollision=1,
kPicked =2,
kControlKey=3,
kVariable=4,
kFacing=5,
kContained=6,
kActivate=7,
kCallback=8,
kResponderState=9,
kMultiStage=10,
kSpawned=11,
kClickDrag=12,
kCoop=13,
kOfferLinkingBook=14,
kBook=15,
kClimbingBlockerHit=16,
kNone
};
proEventData( Int32 evtType = kNone ) : fEventType( evtType )
{
}
virtual ~proEventData() {}
enum dataType
{
kNumber=1,
kKey,
kNotta
};
// what the multstage event types are for multistage.fEvent
enum multiStageEventType
{
kEnterStage=1,
kBeginingOfLoop,
kAdvanceNextStage,
kRegressPrevStage,
kNothing
};
Int32 fEventType; // what type of event (evenType enum)
static proEventData* ICreateEventDataType(Int32 type);
static proEventData* Read(hsStream* stream, hsResMgr* mgr);
void Write(hsStream* stream, hsResMgr* mgr);
static proEventData* ReadVersion(hsStream* s, hsResMgr* mgr);
void WriteVersion(hsStream* s, hsResMgr* mgr);
protected:
virtual void IInit() {}
virtual void IDestruct() {}
virtual void IRead(hsStream* stream, hsResMgr* mgr) {}
virtual void IWrite(hsStream* stream, hsResMgr* mgr) {}
virtual void IReadVersion(hsStream* s, hsResMgr* mgr) {}
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr) {}
};
// The following macro makes it easy (or easier) to define new event data types
#define proEventType(type) class pro##type##EventData : public proEventData { public: pro##type##EventData() : proEventData( k##type ) {IInit();} virtual ~pro##type##EventData(){IDestruct();}
proEventType(Collision)
hsBool fEnter; // entering? (false is exit)
plKey fHitter; // collision hitter (other probably player)
plKey fHittee; // collision hittee (probably us)
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(Picked)
plKey fPicker; // who picked it (problably player)
plKey fPicked; // object that was picked
hsBool fEnabled; // pick (true) or un-pick (false)
hsPoint3 fHitPoint; // where on the picked object that it was picked on
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(Spawned)
plKey fSpawner; // who spawned it (typicall plNPCSpawnMod)
plKey fSpawnee; // what was spawned (typically a scene object with an armature mod)
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(ControlKey)
Int32 fControlKey; // what control key was hit
hsBool fDown; // was the key going down (false if going up)
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(Variable)
char* fName; // name of variable
Int32 fDataType; // type of data
// Can't be a union, sadly, but it isn't that much of a waste of space...
hsScalar fNumber; // if its a number
plKey fKey; // if its a plKey (pointer to something)
protected:
virtual void IInit();
virtual void IDestruct();
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(Facing)
plKey fFacer; // what was facing
plKey fFacee; // what was being faced
hsScalar dot; // the dot prod of their view vectors
hsBool enabled; // Now meets facing requirement (true) or no longer meets requirement (false)
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(Contained)
plKey fContained; // who's inside of
plKey fContainer; // this containing volume
hsBool fEntering; // entering volume (true) or exiting (false)
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(Activate)
hsBool fActive; // Whether or not to use the data in this field
hsBool fActivate; // the data
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(Callback)
Int32 fEventType; // enumerated in plEventCallbackMsg.h
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(ResponderState)
Int32 fState; // what state the responder should be switched to before triggering
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(MultiStage)
Int32 fStage;
Int32 fEvent;
plKey fAvatar; // who was running the stage
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(Coop)
UInt32 fID; // player ID of the initiator
UInt16 fSerial; // serial number for the initiator
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(ClickDrag)
plKey picker; // always the local avatar in this case
plKey picked;
hsScalar animPos; // 0.0 to 1.0 animation percentage
};
proEventType(OfferLinkingBook)
plKey offerer; // the avatar offering the linking book to you
int targetAge; // the age the book is for - taken from konstant list of age buttons in xLinkingBookPopupGUI.py
int offeree; // who we are offering the book to
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(Book)
UInt32 fEvent; // The type of event. See pfJournalBook.h for enumsu
UInt32 fLinkID; // The link ID of the image clicked, if an image link event, otherwise unused
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
proEventType(ClimbingBlockerHit)
plKey fBlockerKey; // collision hittee (probably us)
protected:
virtual void IRead(hsStream* stream, hsResMgr* mgr);
virtual void IWrite(hsStream* stream, hsResMgr* mgr);
virtual void IReadVersion(hsStream* s, hsResMgr* mgr);
virtual void IWriteVersion(hsStream* s, hsResMgr* mgr);
};
/////////////////////////////////////////////////////////////////////////////
//
// MESSAGE : plNotifyMsg
// PARAMETERS : none
//
// PURPOSE : This is the message that notifies someone (either a responder or activator)
// : that some event or transition of state has happened
//
//
class plNotifyMsg : public plMessage
{
protected:
virtual void IInit();
public:
plNotifyMsg() { IInit(); }
plNotifyMsg(const plKey &s, const plKey &r);
~plNotifyMsg();
CLASSNAME_REGISTER( plNotifyMsg );
GETINTERFACE_ANY( plNotifyMsg, plMessage );
// data area
enum notificationType
{
kActivator=0,
kVarNotification,
kNotifySelf,
kResponderFF, // Fast forward
kResponderChangeState, // Change state without triggering
};
Int32 fType; // what type of notification
hsScalar fState; // state of the notifier 0.0=false, 1.0=true
Int32 fID; // special ID mostly for responder State transitions
hsTArray fEvents;// list of events with data
void SetType(notificationType type) { fType = type; }
void SetState(hsScalar state) { fState = state; }
// event records for the notify message
void AddEvent( proEventData* ed);
void AddCollisionEvent( hsBool enter, const plKey &other, const plKey &self, hsBool onlyOneCollision=true );
void AddPickEvent( const plKey &other, const plKey& self, hsBool enabled, hsPoint3 hitPoint );
void AddControlKeyEvent( Int32 key, hsBool down );
void AddVariableEvent( const char* name, hsScalar number );
void AddVariableEvent( const char *name, const plKey &key);
void AddFacingEvent( const plKey &other, const plKey &self, hsScalar dot, hsBool enabled);
void AddContainerEvent( const plKey &container, const plKey &contained, hsBool entering);
void AddActivateEvent( hsBool activate );
void AddCallbackEvent( Int32 event );
void AddResponderStateEvent( Int32 state );
void AddMultiStageEvent( Int32 stage, Int32 event, const plKey& avatar );
void AddCoopEvent(UInt32 id, UInt16 serial);
void AddSpawnedEvent (const plKey &spawner, const plKey &spawned);
void AddClickDragEvent(const plKey& dragger, const plKey& dragee, hsScalar animPos);
void AddOfferBookEvent(const plKey& offerer, int targetAge, int offeree);
void AddBookEvent( UInt32 event, UInt32 linkID = 0 );
void AddHitClimbingBlockerEvent(const plKey &blocker);
proEventData* FindEventRecord( Int32 eventtype );
Int32 GetEventCount() { return fEvents.Count(); }
proEventData* GetEventRecord(Int32 i) { return fEvents[i]; }
void ClearEvents();
// Searches the event records for an event triggered by an avatar, and returns that key
plKey GetAvatarKey();
// IO
void Read(hsStream* stream, hsResMgr* mgr);
void Write(hsStream* stream, hsResMgr* mgr);
void ReadVersion(hsStream* s, hsResMgr* mgr);
void WriteVersion(hsStream* s, hsResMgr* mgr);
};
#endif // _plNotifyMsg_h_