From 7ee0ba330e0c8dae21284b68f829b01c03b2d0fe Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 4 Jan 2018 16:14:14 +1100 Subject: [PATCH] generally simplify scripting system internals --- .../sapphire_zone/Script/NativeScriptApi.h | 21 +++-- .../Script/NativeScriptManager.cpp | 91 +------------------ .../Script/NativeScriptManager.h | 37 +++----- .../sapphire_zone/Script/ScriptLoader.cpp | 3 +- .../sapphire_zone/Script/ScriptManager.cpp | 27 +++--- 5 files changed, 42 insertions(+), 137 deletions(-) diff --git a/src/servers/sapphire_zone/Script/NativeScriptApi.h b/src/servers/sapphire_zone/Script/NativeScriptApi.h index f5f1ba59..65d317d4 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptApi.h +++ b/src/servers/sapphire_zone/Script/NativeScriptApi.h @@ -20,11 +20,12 @@ using namespace Core; enum ScriptType { - StatusEffect, - Action, - Quest, - BattleNpc, - Zone + None, + ScriptedStatusEffect, + ScriptedAction, + ScriptedEvent, + ScriptedBattleNpc, + ScriptedZone }; class ScriptObject @@ -62,7 +63,7 @@ class StatusEffectScript : public ScriptObject { public: StatusEffectScript( std::string name, uint32_t effectId ) : - ScriptObject( name, effectId, ScriptType::StatusEffect ) + ScriptObject( name, effectId, ScriptType::ScriptedStatusEffect ) { } virtual void onTick( Entity::Actor& actor ) { } @@ -80,7 +81,7 @@ class ActionScript : public ScriptObject { public: ActionScript( std::string name, uint32_t abilityId ) : - ScriptObject( name, abilityId, ScriptType::Action ) + ScriptObject( name, abilityId, ScriptType::ScriptedAction ) { } virtual void onStart( Entity::Actor& sourceActor, Entity::Actor& targetActor ) { } @@ -93,7 +94,7 @@ class EventScript : public ScriptObject { public: EventScript( std::string name, uint32_t questId ) : - ScriptObject( name, questId, ScriptType::Quest ) + ScriptObject( name, questId, ScriptType::ScriptedEvent ) { } virtual void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) { } @@ -111,7 +112,7 @@ class BattleNpcScript : public ScriptObject { public: BattleNpcScript( std::string name, uint32_t npcId ) : - ScriptObject( name, npcId, ScriptType::BattleNpc ) + ScriptObject( name, npcId, ScriptType::ScriptedBattleNpc ) { } }; @@ -119,7 +120,7 @@ class ZoneScript : public ScriptObject { public: ZoneScript( std::string name, uint32_t zoneId ) : - ScriptObject( name, zoneId, ScriptType::Zone ) + ScriptObject( name, zoneId, ScriptType::ScriptedZone ) { } virtual void onZoneInit() { } diff --git a/src/servers/sapphire_zone/Script/NativeScriptManager.cpp b/src/servers/sapphire_zone/Script/NativeScriptManager.cpp index 51961ba3..d71541e9 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptManager.cpp +++ b/src/servers/sapphire_zone/Script/NativeScriptManager.cpp @@ -1,55 +1,7 @@ #include "NativeScriptManager.h" namespace Core { - namespace Scripting { - - NativeScriptManager::NativeScriptManager( ) - { } - - StatusEffectScript* NativeScriptManager::getStatusEffectScript( uint32_t statusId ) - { - auto script = m_statusEffectScripts.find( statusId ); - if( script == m_statusEffectScripts.end() ) - return nullptr; - - return script->second; - } - - ActionScript* NativeScriptManager::getActionScript( uint32_t actionId ) - { - auto script = m_actionScripts.find( actionId ); - if( script == m_actionScripts.end() ) - return nullptr; - - return script->second; - } - - EventScript* NativeScriptManager::getEventScript( uint32_t questId ) - { - auto script = m_eventScripts.find( questId ); - if( script == m_eventScripts.end() ) - return nullptr; - - return script->second; - } - - BattleNpcScript* NativeScriptManager::getBattleNpcScript( uint32_t npcId ) - { - auto script = m_battleNpcScripts.find( npcId ); - if( script == m_battleNpcScripts.end() ) - return nullptr; - - return script->second; - } - - ZoneScript* NativeScriptManager::getZoneScript( uint32_t zoneId ) - { - auto script = m_zoneScripts.find( zoneId ); - if( script == m_zoneScripts.end() ) - return nullptr; - - return script->second; - } +namespace Scripting { bool NativeScriptManager::loadScript( const std::string& path ) { @@ -75,24 +27,7 @@ namespace Core { auto script = scripts[i]; module->scripts.push_back( script ); - switch( script->getType() ) - { - case ScriptType::StatusEffect: - m_statusEffectScripts[ script->getId() ] = dynamic_cast< StatusEffectScript* >( script ); - break; - case ScriptType::Action: - m_actionScripts[ script->getId() ] = dynamic_cast< ActionScript* >( script ); - break; - case ScriptType::Quest: - m_eventScripts[ script->getId() ] = dynamic_cast< EventScript* >( script ); - break; - case ScriptType::BattleNpc: - m_battleNpcScripts[ script->getId() ] = dynamic_cast< BattleNpcScript* >( script ); - break; - case ScriptType::Zone: - m_zoneScripts[ script->getId() ] = dynamic_cast< ZoneScript* >( script ); - break; - } + m_scripts[ script->getType() ][ script->getId() ] = script; success = true; } @@ -124,27 +59,7 @@ namespace Core { { for( auto& script : info->scripts ) { - switch( script->getType() ) - { - case ScriptType::StatusEffect: - removeValueFromMap< uint32_t, StatusEffectScript* >( script, m_statusEffectScripts ); - break; - case ScriptType::Action: - removeValueFromMap< uint32_t, ActionScript* >( script, m_actionScripts ); - break; - case ScriptType::Quest: - removeValueFromMap< uint32_t, EventScript* >( script, m_eventScripts ); - break; - case ScriptType::BattleNpc: - removeValueFromMap< uint32_t, BattleNpcScript* >( script, m_battleNpcScripts ); - break; - case ScriptType::Zone: - removeValueFromMap< uint32_t, ZoneScript* >( script, m_zoneScripts ); - break; - - default: - continue; - } + m_scripts[ script->getType() ].erase( script->getId() ); delete script; } diff --git a/src/servers/sapphire_zone/Script/NativeScriptManager.h b/src/servers/sapphire_zone/Script/NativeScriptManager.h index eed78851..73b7a4b8 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptManager.h +++ b/src/servers/sapphire_zone/Script/NativeScriptManager.h @@ -1,5 +1,5 @@ -#ifndef NATIVE_SCRIPT_H -#define NATIVE_SCRIPT_H +#ifndef NATIVE_SCRIPT_MGR_H +#define NATIVE_SCRIPT_MGR_H #include #include @@ -19,11 +19,7 @@ namespace Scripting { class NativeScriptManager { protected: - std::unordered_map< uint32_t, StatusEffectScript* > m_statusEffectScripts; - std::unordered_map< uint32_t, ActionScript* > m_actionScripts; - std::unordered_map< uint32_t, EventScript* > m_eventScripts; - std::unordered_map< uint32_t, BattleNpcScript* > m_battleNpcScripts; - std::unordered_map< uint32_t, ZoneScript* > m_zoneScripts; + std::unordered_map< ScriptType, std::unordered_map< uint32_t, ScriptObject* > > m_scripts; ScriptLoader m_loader; @@ -32,13 +28,7 @@ namespace Scripting { bool unloadScript( ScriptInfo* info ); public: - NativeScriptManager( ); - - StatusEffectScript* getStatusEffectScript( uint32_t statusId ); - ActionScript* getActionScript( uint32_t actionId ); - EventScript* getEventScript( uint32_t questId ); - BattleNpcScript* getBattleNpcScript( uint32_t npcId ); - ZoneScript* getZoneScript( uint32_t zoneId ); + NativeScriptManager( ) = default; bool loadScript( const std::string& path ); bool unloadScript( const std::string& name ); @@ -50,19 +40,16 @@ namespace Scripting { const std::string getModuleExtension(); bool isModuleLoaded( const std::string& name ); - template< typename key, typename val > - bool removeValueFromMap( ScriptObject* ptr, std::unordered_map< key, val >& map ) + // todo: use some template magic (type_traits is_same?) to avoid ScriptType param + // not sure if worthwhile given that it adds an extra place where script types need to be managed + template< typename T > + T* getScript( ScriptType type, uint32_t scriptId ) { - for( typename std::unordered_map< key, val >::iterator it = map.begin(); it != map.end(); ++it ) - { - if( ptr == static_cast< ScriptObject* >( it->second ) ) - { - map.erase( it ); - return true; - } - } + auto script = m_scripts[ type ].find( scriptId ); + if( script == m_scripts[ type ].end() ) + return nullptr; - return false; + return static_cast< T* >( script->second ); } }; diff --git a/src/servers/sapphire_zone/Script/ScriptLoader.cpp b/src/servers/sapphire_zone/Script/ScriptLoader.cpp index e37678cd..b6d1ad0e 100644 --- a/src/servers/sapphire_zone/Script/ScriptLoader.cpp +++ b/src/servers/sapphire_zone/Script/ScriptLoader.cpp @@ -134,10 +134,11 @@ bool Core::Scripting::ScriptLoader::unloadScript( ModuleHandle handle ) if( it->second->handle == handle ) { auto info = it->second; - m_scriptMap.erase( it ); if( unloadModule( handle ) ) { + m_scriptMap.erase( it ); + // remove cached file fs::remove( info->cache_path ); diff --git a/src/servers/sapphire_zone/Script/ScriptManager.cpp b/src/servers/sapphire_zone/Script/ScriptManager.cpp index d475639c..5188ae23 100644 --- a/src/servers/sapphire_zone/Script/ScriptManager.cpp +++ b/src/servers/sapphire_zone/Script/ScriptManager.cpp @@ -166,7 +166,7 @@ bool Core::Scripting::ScriptManager::onTalk( Entity::Player& player, uint64_t ac scriptId = EVENTSCRIPT_AETHERNET_ID; } - auto script = m_nativeScriptManager->getEventScript( scriptId ); + auto script = m_nativeScriptManager->getScript< EventScript >( ScriptType::ScriptedEvent, scriptId ); if( script ) { player.sendDebug( "Calling: " + objName + "." + eventName ); @@ -203,7 +203,7 @@ bool Core::Scripting::ScriptManager::onEnterTerritory( Entity::Player& player, u player.sendDebug( "Calling: " + objName + "." + eventName + " - " + std::to_string( eventId ) ); - auto script = m_nativeScriptManager->getEventScript( eventId ); + auto script = m_nativeScriptManager->getScript< EventScript >( ScriptType::ScriptedEvent, eventId ); if( script ) { player.eventStart( player.getId(), eventId, Event::Event::EnterTerritory, 0, player.getZoneId() ); @@ -226,7 +226,7 @@ bool Core::Scripting::ScriptManager::onWithinRange( Entity::Player& player, uint std::string objName = Event::getEventName( eventId ); player.sendDebug( "Calling: " + objName + "." + eventName + " - " + std::to_string( eventId ) + " p1: " + std::to_string( param1 ) ); - auto script = m_nativeScriptManager->getEventScript( eventId ); + auto script = m_nativeScriptManager->getScript< EventScript >( ScriptType::ScriptedEvent, eventId ); if( script ) { player.eventStart( player.getId(), eventId, Event::Event::WithinRange, 1, param1 ); @@ -248,7 +248,7 @@ bool Core::Scripting::ScriptManager::onOutsideRange( Entity::Player& player, uin std::string objName = Event::getEventName( eventId ); player.sendDebug( "Calling: " + objName + "." + eventName + " - " + std::to_string( eventId ) ); - auto script = m_nativeScriptManager->getEventScript( eventId ); + auto script = m_nativeScriptManager->getScript< EventScript >( ScriptType::ScriptedEvent, eventId ); if( script ) { player.eventStart( player.getId(), eventId, Event::Event::WithinRange, 1, param1 ); @@ -269,7 +269,7 @@ bool Core::Scripting::ScriptManager::onEmote( Entity::Player& player, uint64_t a std::string eventName = "onEmote"; std::string objName = Event::getEventName( eventId ); - auto script = m_nativeScriptManager->getEventScript( eventId ); + auto script = m_nativeScriptManager->getScript< EventScript >( ScriptType::ScriptedEvent, eventId ); if( script ) { player.sendDebug( "Calling: " + objName + "." + eventName ); @@ -346,7 +346,7 @@ bool Core::Scripting::ScriptManager::onEventHandlerReturn( Entity::Player& playe bool Core::Scripting::ScriptManager::onEventHandlerTradeReturn( Entity::Player& player, uint32_t eventId, uint16_t subEvent, uint16_t param, uint32_t catalogId ) { - auto script = m_nativeScriptManager->getEventScript( eventId ); + auto script = m_nativeScriptManager->getScript< EventScript >( ScriptType::ScriptedEvent, eventId ); if( script ) { script->onEventHandlerTradeReturn( player, eventId, subEvent, param, catalogId ); @@ -364,7 +364,7 @@ bool Core::Scripting::ScriptManager::onEventItem( Entity::Player& player, uint32 std::string objName = Event::getEventName( eventId ); player.sendDebug( "Calling: " + objName + "." + eventName + " - " + std::to_string( eventId ) ); - auto script = m_nativeScriptManager->getEventScript( eventId ); + auto script = m_nativeScriptManager->getScript< EventScript >( ScriptType::ScriptedEvent, eventId ); if( script ) { player.eventStart( targetId, eventId, Event::Event::Item, 0, 0 ); @@ -391,7 +391,7 @@ bool Core::Scripting::ScriptManager::onMobKill( Entity::Player& player, uint16_t uint16_t questId = activeQuests->c.questId; - auto script = m_nativeScriptManager->getEventScript( questId ); + auto script = m_nativeScriptManager->getScript< EventScript >( ScriptType::ScriptedEvent, questId ); if( script ) { std::string objName = Event::getEventName( 0x00010000 | questId ); @@ -407,7 +407,7 @@ bool Core::Scripting::ScriptManager::onMobKill( Entity::Player& player, uint16_t bool Core::Scripting::ScriptManager::onCastFinish( Entity::Player& player, Entity::ActorPtr pTarget, uint32_t actionId ) { - auto script = m_nativeScriptManager->getActionScript( actionId ); + auto script = m_nativeScriptManager->getScript< ActionScript >( ScriptType::ScriptedAction, actionId ); if( script ) script->onCastFinish( player, *pTarget ); @@ -417,7 +417,8 @@ bool Core::Scripting::ScriptManager::onCastFinish( Entity::Player& player, Entit bool Core::Scripting::ScriptManager::onStatusReceive( Entity::ActorPtr pActor, uint32_t effectId ) { - auto script = m_nativeScriptManager->getStatusEffectScript( effectId ); + auto script = m_nativeScriptManager->getScript< StatusEffectScript >( ScriptType::ScriptedStatusEffect, effectId ); + if( script ) { if( pActor->isPlayer() ) @@ -433,7 +434,7 @@ bool Core::Scripting::ScriptManager::onStatusReceive( Entity::ActorPtr pActor, u bool Core::Scripting::ScriptManager::onStatusTick( Entity::ActorPtr pActor, Core::StatusEffect::StatusEffect& effect ) { - auto script = m_nativeScriptManager->getStatusEffectScript( effect.getId() ); + auto script = m_nativeScriptManager->getScript< StatusEffectScript >( ScriptType::ScriptedStatusEffect, effect.getId() ); if( script ) { if( pActor->isPlayer() ) @@ -449,7 +450,7 @@ bool Core::Scripting::ScriptManager::onStatusTick( Entity::ActorPtr pActor, Core bool Core::Scripting::ScriptManager::onStatusTimeOut( Entity::ActorPtr pActor, uint32_t effectId ) { - auto script = m_nativeScriptManager->getStatusEffectScript( effectId ); + auto script = m_nativeScriptManager->getScript< StatusEffectScript >( ScriptType::ScriptedStatusEffect, effectId ); if( script ) { if( pActor->isPlayer() ) @@ -465,7 +466,7 @@ bool Core::Scripting::ScriptManager::onStatusTimeOut( Entity::ActorPtr pActor, u bool Core::Scripting::ScriptManager::onZoneInit( ZonePtr pZone ) { - auto script = m_nativeScriptManager->getZoneScript( pZone->getId() ); + auto script = m_nativeScriptManager->getScript< ZoneScript >( ScriptType::ScriptedZone, pZone->getId() ); if( script ) { script->onZoneInit();