1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-28 07:07:45 +00:00

Merge pull request #8 from SapphireMordred/housing

Housing
This commit is contained in:
XeAri 2018-11-20 09:18:07 +01:00 committed by GitHub
commit 5ea6e820f4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 91 additions and 8 deletions

View file

@ -0,0 +1,50 @@
#include <ScriptObject.h>
#include <Actor/Player.h>
#include <Exd/ExdDataGenerated.h>
#include <Framework.h>
using namespace Core;
class WarpTaxi : public Sapphire::ScriptAPI::EventScript
{
public:
WarpTaxi() :
Sapphire::ScriptAPI::EventScript( 0x0002005a )
{
}
void inner( Entity::Player& player, const Event::SceneResult& result )
{
if( result.param1 != 256 )
{
std::function< void( Entity::Player&, const Event::SceneResult& ) > fn = std::bind( &WarpTaxi::inner, this, std::placeholders::_1, std::placeholders::_2 );
player.playScene( 1310721, 0, HIDE_HOTBAR, 0, 1, 341, fn );
}
}
void inner2( Entity::Player& player, uint64_t actorId )
{
player.eventStart( actorId, 1310721, Event::EventHandler::Nest, 0, 0 );
std::function< void( Entity::Player&, const Event::SceneResult& ) > fn = std::bind( &WarpTaxi::inner, this, std::placeholders::_1, std::placeholders::_2 );
player.playScene( 1310721, 0, HIDE_HOTBAR, 0, 1, 341, fn );
}
void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override
{
auto exddata = getFramework()->get< Core::Data::ExdDataGenerated >();
if( !exddata )
return;
auto warp = exddata->get< Core::Data::Warp >( eventId );
if( !warp )
return;
player.eventStart( actorId, warp->defaultTalk1, Event::EventHandler::Nest, 0, 0, std::bind( &WarpTaxi::inner2, this, std::placeholders::_1, std::placeholders::_2 ) );
player.playScene( warp->defaultTalk1, 0, HIDE_HOTBAR, [warp, this]( Entity::Player& player, const Event::SceneResult& result )
{
} );
}
};

View file

@ -61,7 +61,7 @@ namespace Core::Entity
/*! start/register a normal event */ /*! start/register a normal event */
void void
eventStart( uint64_t actorId, uint32_t eventId, Event::EventHandler::EventType eventParam, uint8_t eventParam1, eventStart( uint64_t actorId, uint32_t eventId, Event::EventHandler::EventType eventParam, uint8_t eventParam1,
uint32_t eventParam2 ); uint32_t eventParam2, Event::EventHandler::EventFinishCallback callback = nullptr );
/*! play a subevent */ /*! play a subevent */
void playScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); void playScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 );

View file

@ -92,11 +92,13 @@ void Core::Entity::Player::directorPlayScene( uint32_t eventId, uint32_t scene,
void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId, void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId,
Event::EventHandler::EventType eventType, uint8_t eventParam1, Event::EventHandler::EventType eventType, uint8_t eventParam1,
uint32_t eventParam2 ) uint32_t eventParam2, Event::EventHandler::EventFinishCallback callback )
{ {
auto newEvent = Event::make_EventHandler( this, actorId, eventId, eventType, eventParam2 ); auto newEvent = Event::make_EventHandler( this, actorId, eventId, eventType, eventParam2 );
newEvent->setEventFinishCallback( callback );
addEvent( newEvent ); addEvent( newEvent );
setStateFlag( PlayerStateFlag::InNpcEvent ); setStateFlag( PlayerStateFlag::InNpcEvent );
@ -163,8 +165,8 @@ Core::Event::EventHandlerPtr Core::Entity::Player::bootstrapSceneEvent( uint32_t
if( !pEvent && getEventCount() ) if( !pEvent && getEventCount() )
{ {
// We're trying to play a nested event, need to start it first. // We're trying to play a nested event, need to start it first.
eventStart( getId(), eventId, Event::EventHandler::Nest, 0, 0 ); //eventStart( getId(), eventId, Event::EventHandler::Nest, 0, 0 );
pEvent = getEvent( eventId ); //pEvent = getEvent( eventId );
} }
else if( !pEvent ) else if( !pEvent )
{ {
@ -185,6 +187,16 @@ void Core::Entity::Player::playScene( uint32_t eventId, uint32_t scene,
if( !pEvent ) if( !pEvent )
return; return;
if( pEvent->getEventType() == Event::EventHandler::Nest )
{
auto events = eventList();
for( auto it : events )
{
it.second->setPlayedScene( true );
}
}
pEvent->setPlayedScene( true ); pEvent->setPlayedScene( true );
pEvent->setEventReturnCallback( eventCallback ); pEvent->setEventReturnCallback( eventCallback );
pEvent->setSceneChainCallback( nullptr ); pEvent->setSceneChainCallback( nullptr );
@ -246,12 +258,17 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer )
case Event::EventHandler::Nest: case Event::EventHandler::Nest:
{ {
queuePacket( std::make_shared< EventFinishPacket >( getId(), pEvent->getId(), queuePacket( std::make_shared< EventFinishPacket >( getId(), pEvent->getId(),
pEvent->getEventType(), pEvent->getEventParam() ) ); pEvent->getEventType(), pEvent->getEventParam() ) );
removeEvent( pEvent->getId() ); removeEvent( pEvent->getId() );
auto callback = pEvent->getEventFinishCallback();
if( callback )
callback( *this, pEvent->getActorId() );
auto events = eventList(); auto events = eventList();
for( auto it : events ) /*for( auto it : events )
{ {
if( it.second->hasPlayedScene() == false ) if( it.second->hasPlayedScene() == false )
@ -262,14 +279,14 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer )
it.second->getEventParam() ) ); it.second->getEventParam() ) );
removeEvent( it.second->getId() ); removeEvent( it.second->getId() );
} }
} }*/
break; break;
} }
default: default:
{ {
queuePacket( std::make_shared< EventFinishPacket >( getId(), pEvent->getId(), queuePacket( std::make_shared< EventFinishPacket >( getId(), pEvent->getId(),
pEvent->getEventType(), pEvent->getEventParam() ) ); pEvent->getEventType(), pEvent->getEventParam() ) );
break; break;
} }
} }

View file

@ -64,6 +64,16 @@ void Core::Event::EventHandler::setSceneChainCallback( Core::Event::EventHandler
m_chainCallback = callback; m_chainCallback = callback;
} }
Core::Event::EventHandler::EventFinishCallback Core::Event::EventHandler::getEventFinishCallback() const
{
return m_finishCallback;
}
void Core::Event::EventHandler::setEventFinishCallback( EventFinishCallback callback )
{
m_finishCallback = callback;
}
bool Core::Event::EventHandler::hasPlayedScene() const bool Core::Event::EventHandler::hasPlayedScene() const
{ {
return m_playedScene; return m_playedScene;

View file

@ -75,6 +75,7 @@ namespace Core::Event
using SceneReturnCallback = std::function< void( Entity::Player&, const SceneResult& ) >; using SceneReturnCallback = std::function< void( Entity::Player&, const SceneResult& ) >;
using SceneChainCallback = std::function< void( Entity::Player& ) >; using SceneChainCallback = std::function< void( Entity::Player& ) >;
using EventFinishCallback = std::function< void( Entity::Player&, uint64_t ) >;
EventHandler( Entity::Player* pOwner, uint64_t actorId, uint32_t eventId, EventType eventType, EventHandler( Entity::Player* pOwner, uint64_t actorId, uint32_t eventId, EventType eventType,
uint32_t eventParam ); uint32_t eventParam );
@ -107,6 +108,10 @@ namespace Core::Event
void setSceneChainCallback( SceneChainCallback callback ); void setSceneChainCallback( SceneChainCallback callback );
EventFinishCallback getEventFinishCallback() const;
void setEventFinishCallback( EventFinishCallback callback );
bool hasNestedEvent() const; bool hasNestedEvent() const;
void removeNestedEvent(); void removeNestedEvent();
@ -125,6 +130,7 @@ namespace Core::Event
bool m_playedScene; bool m_playedScene;
SceneReturnCallback m_returnCallback; SceneReturnCallback m_returnCallback;
SceneChainCallback m_chainCallback; SceneChainCallback m_chainCallback;
EventFinishCallback m_finishCallback;
}; };
} }