From 6fd9bb181335ca3ca943105cd49311927136ddbf Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 28 Dec 2017 00:08:20 +1100 Subject: [PATCH 1/4] remove EXPORT_SCRIPTOBJECT from generated scripts - unused now --- src/tools/quest_parser/main.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/tools/quest_parser/main.cpp b/src/tools/quest_parser/main.cpp index b3ec9928..4a5e0f50 100644 --- a/src/tools/quest_parser/main.cpp +++ b/src/tools/quest_parser/main.cpp @@ -285,12 +285,10 @@ void createScript( boost::shared_ptr< Core::Data::QuestInfo >& pQuestData, std:: "};\n\n" ); - std::string initObj( "EXPORT_SCRIPTOBJECT( " + className + " );" ); - std::ofstream outputFile; outputFile.open( "generated/" + className + ".cpp_generated" ); - outputFile << header << additional << classString << initObj; + outputFile << header << additional << classString; outputFile.close(); } From 7ee0ba330e0c8dae21284b68f829b01c03b2d0fe Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 4 Jan 2018 16:14:14 +1100 Subject: [PATCH 2/4] 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(); From 2b40db7007f7d6b31635007fe1e6e016021d1f71 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 4 Jan 2018 22:24:13 +1100 Subject: [PATCH 3/4] use dynamic_cast instead of static_cast in script getter --- src/servers/sapphire_zone/Script/NativeScriptManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Script/NativeScriptManager.h b/src/servers/sapphire_zone/Script/NativeScriptManager.h index 73b7a4b8..a2f8f80b 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptManager.h +++ b/src/servers/sapphire_zone/Script/NativeScriptManager.h @@ -49,7 +49,7 @@ namespace Scripting { if( script == m_scripts[ type ].end() ) return nullptr; - return static_cast< T* >( script->second ); + return dynamic_cast< T* >( script->second ); } }; From 5ea66826927d72d59e167b9fc987a347c8440d5b Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 4 Jan 2018 22:40:48 +1100 Subject: [PATCH 4/4] whitespace fixes --- src/servers/sapphire_zone/Script/NativeScriptManager.cpp | 4 ++-- src/servers/sapphire_zone/Script/NativeScriptManager.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/servers/sapphire_zone/Script/NativeScriptManager.cpp b/src/servers/sapphire_zone/Script/NativeScriptManager.cpp index d71541e9..9b487c03 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptManager.cpp +++ b/src/servers/sapphire_zone/Script/NativeScriptManager.cpp @@ -27,7 +27,7 @@ namespace Scripting { auto script = scripts[i]; module->scripts.push_back( script ); - m_scripts[ script->getType() ][ script->getId() ] = script; + m_scripts[script->getType()][script->getId()] = script; success = true; } @@ -59,7 +59,7 @@ namespace Scripting { { for( auto& script : info->scripts ) { - m_scripts[ script->getType() ].erase( script->getId() ); + 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 a2f8f80b..af3e256c 100644 --- a/src/servers/sapphire_zone/Script/NativeScriptManager.h +++ b/src/servers/sapphire_zone/Script/NativeScriptManager.h @@ -45,8 +45,8 @@ namespace Scripting { template< typename T > T* getScript( ScriptType type, uint32_t scriptId ) { - auto script = m_scripts[ type ].find( scriptId ); - if( script == m_scripts[ type ].end() ) + auto script = m_scripts[type].find( scriptId ); + if( script == m_scripts[type].end() ) return nullptr; return dynamic_cast< T* >( script->second );