class UnitObserver
{
public:
enum Event
{
ATTACK = 0,
CAST,
DAMAGE_DEALT,
DAMAGE_TAKEN,
HEAL,
PROPERTY_CHANGED,
DEATH
};
struct EventData
{
Event type;
Unit* source;
Unit* target;
float damage;
float healamount;
Damagetype damType;
Ability* ability;
Unit::Property property;
};
UnitObserver();
virtual ~UnitObserver();
virtual void onEvent( EventData& data ) = 0;
};
// .....
r = _engine->RegisterEnum( "Event" );
assert( r >= 0 );
r = _engine->RegisterEnumValue( "Event", "ATTACK", UnitObserver::ATTACK );
assert( r >= 0 );
r = _engine->RegisterEnumValue( "Event", "CAST", UnitObserver::CAST );
assert( r >= 0 );
r = _engine->RegisterEnumValue( "Event", "DAMAGE_DEALT", UnitObserver::DAMAGE_DEALT );
assert( r >= 0 );
r = _engine->RegisterEnumValue( "Event", "DAMAGE_TAKEN", UnitObserver::DAMAGE_TAKEN );
assert( r >= 0 );
r = _engine->RegisterEnumValue( "Event", "HEAL", UnitObserver::HEAL );
assert( r >= 0 );
r = _engine->RegisterEnumValue( "Event", "PROPERTY_CHANGED", UnitObserver::PROPERTY_CHANGED );
assert( r >= 0 );
r = _engine->RegisterEnumValue( "Event", "DEATH", UnitObserver::DEATH );
assert( r >= 0 );
r = _engine->RegisterObjectType( "Ability", 0, asOBJ_REF );
assert( r >= 0 );
r = _engine->RegisterObjectType( "Unit", 0, asOBJ_REF );
assert( r >= 0 );
r = _engine->RegisterInterface( "Player" );
assert( r>= 0 );
r = _engine->RegisterObjectType( "EventData", sizeof(UnitObserver::EventData), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS );
assert( r>= 0 );
r = _engine->RegisterObjectProperty( "EventData", "Event type", asOFFSET(UnitObserver::EventData,type) );
assert( r>= 0 );
r = _engine->RegisterObjectProperty( "EventData", "Unit@ source", asOFFSET(UnitObserver::EventData,source) );
assert( r>= 0 );
r = _engine->RegisterObjectProperty( "EventData", "Unit@ target", asOFFSET(UnitObserver::EventData,target) );
assert( r>= 0 );
r = _engine->RegisterObjectProperty( "EventData", "float damage", asOFFSET(UnitObserver::EventData,damage) );
assert( r>= 0 );
r = _engine->RegisterObjectProperty( "EventData", "float healamount", asOFFSET(UnitObserver::EventData,healamount) );
assert( r>= 0 );
r = _engine->RegisterObjectProperty( "EventData", "Damagetype damType", asOFFSET(UnitObserver::EventData,damType) );
assert( r>= 0 );
r = _engine->RegisterObjectProperty( "EventData", "Ability@ ability", asOFFSET(UnitObserver::EventData,ability) );
assert( r>= 0 );
r = _engine->RegisterObjectProperty( "EventData", "Unitproperty property", asOFFSET(UnitObserver::EventData,property) );
assert( r>= 0 );
// ...
r = _engine->RegisterObjectBehaviour( "Unit", asBEHAVE_ADDREF, "void f()", asMETHOD(Unit, addRef), asCALL_THISCALL );
assert( r >= 0 );
r = _engine->RegisterObjectBehaviour( "Unit", asBEHAVE_RELEASE, "void f()", asMETHOD(Unit, release), asCALL_THISCALL );
assert( r >= 0 );
// ...
std::string s = std::string( type->GetName() ) + "@ " + std::string( type->GetName() ) + "(Ability @, Unit @)";
scriptabi->_factoryID = type->GetFactoryIdByDecl( s.c_str() );
if( scriptabi->_factoryID < 0 )
{
std::cout << "Couldn't find factory for the type " << type->GetName() << " in file " << scriptPath << std::endl;
delete scriptabi;
return 0;
}
scriptabi->_onUpdateID = type->GetMethodIdByDecl( "void onUpdate()" );
scriptabi->_onAddID = type->GetMethodIdByDecl( "void onAdd()" );
scriptabi->_onRemoveID = type->GetMethodIdByDecl( "void onRemove()" );
scriptabi->_onEventID = type->GetMethodIdByDecl( "void onEvent(EventData@ data)" );