1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-28 15:17:46 +00:00
sapphire/src/servers/sapphire_zone/Script/NativeScriptApi.h

218 lines
6.5 KiB
C
Raw Normal View History

#ifndef NATIVE_SCRIPT_API
#define NATIVE_SCRIPT_API
#include <string>
#include <typeinfo>
#include <typeindex>
2018-08-12 22:30:18 +10:00
#include <Event/EventHandler.h>
#include "Forwards.h"
2017-12-10 17:13:57 +11:00
#ifdef _MSC_VER
#define EXPORT __declspec( dllexport )
#else
#define EXPORT __attribute__((visibility("default")))
#endif
2017-12-11 21:10:54 +11:00
using namespace Core;
2018-07-24 23:16:26 +10:00
// todo: this is shit
2017-12-13 14:05:50 +11:00
// constant script ids for certain events
#define EVENTSCRIPT_AETHERYTE_ID 0x50000
#define EVENTSCRIPT_AETHERNET_ID 0x50001
/*!
2018-07-24 23:16:26 +10:00
* @brief The base class that any script should inherit from and set the type param accordingly
*/
class ScriptObject
{
protected:
2017-12-11 21:10:54 +11:00
uint32_t m_id;
std::size_t m_type;
public:
/*!
* @param id an ID which uniquely identifies this script in relation to it's type
* @param type The RTTI hash code of the implementing type to uniquely identify it
*/
ScriptObject( uint32_t id, std::size_t type ) :
m_id( id ),
m_type( type )
{ }
/*!
2018-07-24 23:16:26 +10:00
* @brief Gets the ID set for this script
*
* @return The allocated ID of the script set during object construction
*/
2017-12-11 21:10:54 +11:00
virtual uint32_t getId() const
{
return m_id;
}
/*!
2018-07-24 23:16:26 +10:00
* @brief Gets the unique identifier (hash_code) of the script
*
* @return The hash_code of the script
*/
virtual std::size_t getType() const
{
return m_type;
}
};
/*!
2018-07-24 23:16:26 +10:00
* @brief The base class for any scripts that implement behaviour related to status effects.
*/
2017-12-10 03:01:21 +11:00
class StatusEffectScript : public ScriptObject
{
public:
2018-02-09 02:34:43 +11:00
explicit StatusEffectScript( uint32_t effectId ) :
ScriptObject( effectId, typeid( StatusEffectScript ).hash_code() )
{ }
/*!
* @brief Called on each tick that a status effect is active on an actor
2018-07-24 23:16:26 +10:00
*
* @param actor the actor the status effect is ticking on
*/
virtual void onTick( Entity::Chara& actor ) { }
/*!
* @brief Called when the status effect is applied to an actor
2018-07-24 23:16:26 +10:00
*
* @param actor the actor on which the status effect was applied to
*/
virtual void onApply( Entity::Chara& actor ) { }
/*!
* @brief Called when the actor (usually a player) removes the status effect by right clicking it
2018-07-24 23:16:26 +10:00
*
* @param actor The actor on which the effect was removed from
*/
virtual void onRemove( Entity::Chara& actor ) { }
/*!
* @brief Called when the status effect expires
2018-07-24 23:16:26 +10:00
*
* @param actor The actor on which the efect expired on
*/
virtual void onExpire( Entity::Chara& actor ) { }
/*!
* @brief Called when the player with the status effect collides with another player, eg. hot potato
2018-07-24 23:16:26 +10:00
*
* @param actor The actor which has status effect
* @param actorHit The actor who collided with the status effect owner
*/
virtual void onPlayerCollision( Entity::Chara& actor, Entity::Chara& actorHit ) { }
/*!
2018-07-24 23:16:26 +10:00
* @brief Called when the owner finishes a cast
*
* @param actor The actor who finished a cast
*/
virtual void onPlayerFinishCast( Entity::Chara& actor ) { }
/*!
2018-07-24 23:16:26 +10:00
* @brief Called when the status effect owner was damaged
*
* @param actor The actor that was damaged
*/
virtual void onPlayerDamaged( Entity::Chara& actor ) { }
/*!
2018-07-24 23:16:26 +10:00
* @brief Called when the status effect owner dies
*
* @param actor The actor that died
*/
virtual void onPlayerDeath( Entity::Chara& actor ) { }
};
/*!
2018-07-24 23:16:26 +10:00
* @brief The base class for any scripts that implement behaviour related to actions
*/
class ActionScript : public ScriptObject
{
public:
2018-02-09 02:34:43 +11:00
explicit ActionScript( uint32_t abilityId ) :
ScriptObject( abilityId, typeid( ActionScript ).hash_code() )
{ }
virtual void onStart( Entity::Chara& sourceActor, Entity::Chara& targetActor ) { }
virtual void onCastFinish( Entity::Player& player, Entity::Chara& targetActor ) { }
virtual void onInterrupt( Entity::Chara& sourceActor/*, Core::Entity::Chara targetActor*/ ) { }
};
/*!
2018-07-24 23:16:26 +10:00
* @brief The base class for any scripts that implement behaviour related to the event system.
* This includes but is not limited to: NPCs, shops, some world objects
*/
class EventScript : public ScriptObject
{
protected:
template< typename Ret, class Obj >
inline Event::EventHandler::SceneChainCallback bindScene( Ret ( Obj::*f )( Entity::Player& ) )
{
return std::bind( f, static_cast< Obj* >( this ), std::placeholders::_1 );
}
public:
2018-02-09 02:34:43 +11:00
explicit EventScript( uint32_t questId ) :
ScriptObject( questId, typeid( EventScript ).hash_code() )
{ }
2017-12-11 22:52:10 +11:00
virtual void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) { }
2017-12-11 21:10:54 +11:00
virtual void onNpcKill( uint32_t npcId, Entity::Player& player ) { }
virtual void onEmote( uint64_t actorId, uint32_t eventId, uint32_t emoteId, Entity::Player& player ) { }
virtual void onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { }
virtual void onWithinRange( Entity::Player& player, uint32_t eventId, uint32_t param1, float x, float y, float z ) { }
virtual void onOutsideRange( Entity::Player& player, uint32_t eventId, uint32_t param1, float x, float y, float z ) { }
virtual void onEventItem( Entity::Player& player, uint32_t eventItemId, uint32_t eventId, uint32_t castTime, uint64_t targetId ) { }
virtual void onEventHandlerTradeReturn( Entity::Player& player, uint32_t eventId, uint16_t subEvent, uint16_t param, uint32_t catalogId ) { }
};
/*!
2018-07-24 23:16:26 +10:00
* @brief The base class for any scripts that implement behaviour related to BattleNPCs
*/
2017-12-10 03:01:21 +11:00
class BattleNpcScript : public ScriptObject
{
public:
2018-02-09 02:34:43 +11:00
explicit BattleNpcScript( uint32_t npcId ) :
ScriptObject( npcId, typeid( BattleNpcScript ).hash_code() )
{ }
};
/*!
2018-07-24 23:16:26 +10:00
* @brief The base class for any scripts that implement behaviour related to zones
*/
2017-12-10 03:01:21 +11:00
class ZoneScript : public ScriptObject
{
public:
2018-02-09 02:34:43 +11:00
explicit ZoneScript( uint32_t zoneId ) :
ScriptObject( zoneId, typeid( ZoneScript ).hash_code() )
{ }
virtual void onZoneInit() { }
};
/*!
2018-07-24 23:16:26 +10:00
* @brief The base class for any scripts that implement behaviour related to instance content zones
*/
2018-02-09 02:34:43 +11:00
class InstanceContentScript : public ScriptObject
{
public:
explicit InstanceContentScript( uint32_t instanceContentId ) :
ScriptObject( uint32_t{ 0x8003 } << 16 | instanceContentId, typeid( InstanceContentScript ).hash_code() )
2018-02-09 02:34:43 +11:00
{ }
virtual void onInit( InstanceContentPtr instance ) { }
virtual void onUpdate( InstanceContentPtr instance, uint32_t currTime ) { }
virtual void onEnterTerritory( InstanceContentPtr instance, Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) { }
2018-02-09 02:34:43 +11:00
};
#endif