mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-27 22:57:45 +00:00
Merge pull request #250 from GokuWeedLord/instancescripting
instance scripting + object creation
This commit is contained in:
commit
f2a407c5e4
12 changed files with 247 additions and 11 deletions
|
@ -5,3 +5,55 @@ Core::Entity::GameObject::GameObject( ObjKind type ) :
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t Core::Entity::GameObject::getId() const
|
||||||
|
{
|
||||||
|
return m_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::Entity::GameObject::ObjKind Core::Entity::GameObject::getObjKind() const
|
||||||
|
{
|
||||||
|
return m_objKind;
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::Common::FFXIVARR_POSITION3& Core::Entity::GameObject::getPos()
|
||||||
|
{
|
||||||
|
return m_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::GameObject::setPos( float x, float y, float z )
|
||||||
|
{
|
||||||
|
m_pos.x = x;
|
||||||
|
m_pos.y = y;
|
||||||
|
m_pos.z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::GameObject::setPos( const Core::Common::FFXIVARR_POSITION3& pos )
|
||||||
|
{
|
||||||
|
m_pos = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
float Core::Entity::GameObject::getRot() const
|
||||||
|
{
|
||||||
|
return m_rot;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::GameObject::setRot( float rot )
|
||||||
|
{
|
||||||
|
m_rot = rot;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Core::Entity::GameObject::isPlayer() const
|
||||||
|
{
|
||||||
|
return m_objKind == ObjKind::Player;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Core::Entity::GameObject::isBNpc() const
|
||||||
|
{
|
||||||
|
return m_objKind == ObjKind::BattleNpc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Core::Entity::GameObject::isENpc() const
|
||||||
|
{
|
||||||
|
return m_objKind == ObjKind::EventNpc;
|
||||||
|
}
|
|
@ -50,8 +50,8 @@ namespace Core {
|
||||||
ObjKind m_objKind;
|
ObjKind m_objKind;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GameObject( ObjKind type );
|
explicit GameObject( ObjKind type );
|
||||||
virtual ~GameObject() {};
|
//virtual ~GameObject() {};
|
||||||
|
|
||||||
uint32_t getId() const;
|
uint32_t getId() const;
|
||||||
|
|
||||||
|
|
47
src/servers/sapphire_zone/Actor/InstanceObject.cpp
Normal file
47
src/servers/sapphire_zone/Actor/InstanceObject.cpp
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#include "InstanceObject.h"
|
||||||
|
#include "Zone/InstanceContent.h"
|
||||||
|
|
||||||
|
Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t hierachyId ) :
|
||||||
|
Core::Entity::GameObject( ObjKind::EventObj ),
|
||||||
|
m_hierachyId( hierachyId )
|
||||||
|
{
|
||||||
|
m_id = objectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::Entity::InstanceObject::InstanceObject( uint32_t objectId, uint32_t hierachyId, Common::FFXIVARR_POSITION3 pos )
|
||||||
|
: InstanceObject( objectId, hierachyId )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Core::Entity::InstanceObject::getHierachyId() const
|
||||||
|
{
|
||||||
|
return m_hierachyId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::InstanceObject::setHierachyId( uint32_t hierachyId )
|
||||||
|
{
|
||||||
|
m_hierachyId = hierachyId;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Core::Entity::InstanceObject::getState() const
|
||||||
|
{
|
||||||
|
return m_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::InstanceObject::setState( uint8_t state )
|
||||||
|
{
|
||||||
|
m_state = state;
|
||||||
|
|
||||||
|
m_parentInstance->updateInstanceObj( InstanceObjectPtr( this ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::InstanceObject::setParentInstance( Core::InstanceContentPtr instance )
|
||||||
|
{
|
||||||
|
m_parentInstance = instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::InstanceContentPtr Core::Entity::InstanceObject::getParentInstance() const
|
||||||
|
{
|
||||||
|
return m_parentInstance;
|
||||||
|
}
|
33
src/servers/sapphire_zone/Actor/InstanceObject.h
Normal file
33
src/servers/sapphire_zone/Actor/InstanceObject.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#ifndef SAPPHIRE_INSTANCEOBJECT_H
|
||||||
|
#define SAPPHIRE_INSTANCEOBJECT_H
|
||||||
|
|
||||||
|
#include "GameObject.h"
|
||||||
|
|
||||||
|
namespace Core
|
||||||
|
{
|
||||||
|
namespace Entity
|
||||||
|
{
|
||||||
|
class InstanceObject : public GameObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InstanceObject( uint32_t objectId, uint32_t hierachyId );
|
||||||
|
InstanceObject( uint32_t objectId, uint32_t hierachyId, Common::FFXIVARR_POSITION3 pos );
|
||||||
|
|
||||||
|
uint32_t getHierachyId() const;
|
||||||
|
void setHierachyId( uint32_t hierachyId );
|
||||||
|
|
||||||
|
uint8_t getState() const;
|
||||||
|
void setState( uint8_t state );
|
||||||
|
|
||||||
|
InstanceContentPtr getParentInstance() const;
|
||||||
|
void setParentInstance( InstanceContentPtr instance );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
uint32_t m_hierachyId;
|
||||||
|
uint8_t m_state;
|
||||||
|
InstanceContentPtr m_parentInstance;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //SAPPHIRE_INSTANCEOBJECT_H
|
|
@ -13,6 +13,7 @@ namespace Core
|
||||||
{
|
{
|
||||||
TYPE_FORWARD( Cell );
|
TYPE_FORWARD( Cell );
|
||||||
TYPE_FORWARD( Zone );
|
TYPE_FORWARD( Zone );
|
||||||
|
TYPE_FORWARD( InstanceContent );
|
||||||
TYPE_FORWARD( Item );
|
TYPE_FORWARD( Item );
|
||||||
TYPE_FORWARD( ItemContainer );
|
TYPE_FORWARD( ItemContainer );
|
||||||
TYPE_FORWARD( Inventory );
|
TYPE_FORWARD( Inventory );
|
||||||
|
@ -33,6 +34,7 @@ namespace Core
|
||||||
TYPE_FORWARD( BattleNpc );
|
TYPE_FORWARD( BattleNpc );
|
||||||
TYPE_FORWARD( EventNpc );
|
TYPE_FORWARD( EventNpc );
|
||||||
TYPE_FORWARD( BattleNpcTemplate );
|
TYPE_FORWARD( BattleNpcTemplate );
|
||||||
|
TYPE_FORWARD( InstanceObject );
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Event
|
namespace Event
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <Actor/Actor.h>
|
#include <Actor/Actor.h>
|
||||||
#include <Actor/Player.h>
|
#include <Actor/Player.h>
|
||||||
#include <StatusEffect/StatusEffect.h>
|
#include <StatusEffect/StatusEffect.h>
|
||||||
|
#include <Zone/InstanceContent.h>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define EXPORT __declspec( dllexport )
|
#define EXPORT __declspec( dllexport )
|
||||||
|
@ -48,7 +49,7 @@ public:
|
||||||
class StatusEffectScript : public ScriptObject
|
class StatusEffectScript : public ScriptObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
StatusEffectScript( uint32_t effectId ) :
|
explicit StatusEffectScript( uint32_t effectId ) :
|
||||||
ScriptObject( effectId, typeid( StatusEffectScript ).hash_code() )
|
ScriptObject( effectId, typeid( StatusEffectScript ).hash_code() )
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
@ -66,7 +67,7 @@ public:
|
||||||
class ActionScript : public ScriptObject
|
class ActionScript : public ScriptObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ActionScript( uint32_t abilityId ) :
|
explicit ActionScript( uint32_t abilityId ) :
|
||||||
ScriptObject( abilityId, typeid( ActionScript ).hash_code() )
|
ScriptObject( abilityId, typeid( ActionScript ).hash_code() )
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
@ -79,7 +80,7 @@ public:
|
||||||
class EventScript : public ScriptObject
|
class EventScript : public ScriptObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EventScript( uint32_t questId ) :
|
explicit EventScript( uint32_t questId ) :
|
||||||
ScriptObject( questId, typeid( EventScript ).hash_code() )
|
ScriptObject( questId, typeid( EventScript ).hash_code() )
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
@ -97,7 +98,7 @@ public:
|
||||||
class BattleNpcScript : public ScriptObject
|
class BattleNpcScript : public ScriptObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BattleNpcScript( uint32_t npcId ) :
|
explicit BattleNpcScript( uint32_t npcId ) :
|
||||||
ScriptObject( npcId, typeid( BattleNpcScript ).hash_code() )
|
ScriptObject( npcId, typeid( BattleNpcScript ).hash_code() )
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
@ -105,11 +106,22 @@ public:
|
||||||
class ZoneScript : public ScriptObject
|
class ZoneScript : public ScriptObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ZoneScript( uint32_t zoneId ) :
|
explicit ZoneScript( uint32_t zoneId ) :
|
||||||
ScriptObject( zoneId, typeid( ZoneScript ).hash_code() )
|
ScriptObject( zoneId, typeid( ZoneScript ).hash_code() )
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual void onZoneInit() { }
|
virtual void onZoneInit() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class InstanceContentScript : public ScriptObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit InstanceContentScript( uint32_t instanceContentId ) :
|
||||||
|
ScriptObject( instanceContentId, typeid( InstanceContentScript ).hash_code() )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual void onInit( InstanceContent& instance ) { }
|
||||||
|
virtual void onUpdate( InstanceContent& instance, uint32_t currTime ) { }
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -332,7 +332,7 @@ bool Core::Scripting::ScriptManager::onStatusTimeOut( Entity::ActorPtr pActor, u
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onZoneInit( ZonePtr pZone )
|
bool Core::Scripting::ScriptManager::onZoneInit( ZonePtr pZone )
|
||||||
{
|
{
|
||||||
auto script = m_nativeScriptManager->getScript< ZoneScript >(pZone->getTerritoryId() );
|
auto script = m_nativeScriptManager->getScript< ZoneScript >( pZone->getTerritoryId() );
|
||||||
if( script )
|
if( script )
|
||||||
{
|
{
|
||||||
script->onZoneInit();
|
script->onZoneInit();
|
||||||
|
@ -342,6 +342,30 @@ bool Core::Scripting::ScriptManager::onZoneInit( ZonePtr pZone )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Core::Scripting::ScriptManager::onInstanceInit( InstanceContent& instance )
|
||||||
|
{
|
||||||
|
auto script = m_nativeScriptManager->getScript< InstanceContentScript >( instance.getInstanceContentId() );
|
||||||
|
if( script )
|
||||||
|
{
|
||||||
|
script->onInit( instance );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Core::Scripting::ScriptManager::onInstanceUpdate( InstanceContent& instance, uint32_t currTime )
|
||||||
|
{
|
||||||
|
auto script = m_nativeScriptManager->getScript< InstanceContentScript >( instance.getInstanceContentId() );
|
||||||
|
if( script )
|
||||||
|
{
|
||||||
|
script->onUpdate( instance, currTime );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Scripting::NativeScriptManager& Core::Scripting::ScriptManager::getNativeScriptHandler()
|
Scripting::NativeScriptManager& Core::Scripting::ScriptManager::getNativeScriptHandler()
|
||||||
{
|
{
|
||||||
return *m_nativeScriptManager;
|
return *m_nativeScriptManager;
|
||||||
|
|
|
@ -59,6 +59,8 @@ namespace Core
|
||||||
bool onEventHandlerReturn( Entity::Player& player, uint32_t eventId, uint16_t subEvent, uint16_t param1, uint16_t param2, uint16_t param3 );
|
bool onEventHandlerReturn( Entity::Player& player, uint32_t eventId, uint16_t subEvent, uint16_t param1, uint16_t param2, uint16_t param3 );
|
||||||
bool onEventHandlerTradeReturn( Entity::Player& player, uint32_t eventId, uint16_t subEvent, uint16_t param, uint32_t catalogId );
|
bool onEventHandlerTradeReturn( Entity::Player& player, uint32_t eventId, uint16_t subEvent, uint16_t param, uint32_t catalogId );
|
||||||
|
|
||||||
|
bool onInstanceInit( InstanceContent& instance );
|
||||||
|
bool onInstanceUpdate( InstanceContent& instance, uint32_t currTime );
|
||||||
|
|
||||||
void loadDir( const std::string& dirname, std::set<std::string> &files, const std::string& ext );
|
void loadDir( const std::string& dirname, std::set<std::string> &files, const std::string& ext );
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
#include <vector>
|
|
||||||
#include <Script/NativeScriptApi.h>
|
#include <Script/NativeScriptApi.h>
|
||||||
|
|
||||||
class ScriptObject;
|
|
||||||
|
|
||||||
@ScriptIncludes@
|
@ScriptIncludes@
|
||||||
|
|
||||||
const ScriptObject* ptrs[] =
|
const ScriptObject* ptrs[] =
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include <ScriptObject.h>
|
||||||
|
#include <Zone/InstanceContent.h>
|
||||||
|
|
||||||
|
class TheNavel : public InstanceContentScript
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TheNavel() : InstanceContentScript( 20002 )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void onInit( InstanceContent& instance ) override
|
||||||
|
{
|
||||||
|
auto exit = new Entity::InstanceObject( EXIT_OBJECT, 0, { 0, 0, -10 } );
|
||||||
|
instance.registerInstanceObj( Entity::InstanceObjectPtr( exit ) );
|
||||||
|
|
||||||
|
auto start = new Entity::InstanceObject( START_CIRCLE, 4236868, { 0, 0, 24 } );
|
||||||
|
instance.registerInstanceObj( Entity::InstanceObjectPtr( start ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void onUpdate( InstanceContent& instance, uint32_t currTime ) override
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr auto EXIT_OBJECT = 2000139;
|
||||||
|
static constexpr auto START_CIRCLE = 2000182;
|
||||||
|
};
|
|
@ -8,6 +8,7 @@
|
||||||
#include <common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
|
|
||||||
#include "Event/Director.h"
|
#include "Event/Director.h"
|
||||||
|
#include "Script/ScriptManager.h"
|
||||||
|
|
||||||
#include "Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
|
@ -15,6 +16,7 @@
|
||||||
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
|
extern Core::Scripting::ScriptManager g_scriptMgr;
|
||||||
|
|
||||||
using namespace Core::Common;
|
using namespace Core::Common;
|
||||||
using namespace Core::Network::Packets;
|
using namespace Core::Network::Packets;
|
||||||
|
@ -31,6 +33,7 @@ Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceC
|
||||||
m_instanceContentId( instanceContentId ),
|
m_instanceContentId( instanceContentId ),
|
||||||
m_state( Created )
|
m_state( Created )
|
||||||
{
|
{
|
||||||
|
g_scriptMgr.onInstanceInit( *this );
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::InstanceContent::~InstanceContent()
|
Core::InstanceContent::~InstanceContent()
|
||||||
|
@ -119,6 +122,8 @@ void Core::InstanceContent::onUpdate( uint32_t currTime )
|
||||||
case DutyFinished:
|
case DutyFinished:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_scriptMgr.onInstanceUpdate( *this, currTime );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::InstanceContent::onFinishLoading( Entity::PlayerPtr pPlayer )
|
void Core::InstanceContent::onFinishLoading( Entity::PlayerPtr pPlayer )
|
||||||
|
@ -208,3 +213,33 @@ void Core::InstanceContent::setVar( uint8_t index, uint8_t value )
|
||||||
sendDirectorVars( playerIt.second );
|
sendDirectorVars( playerIt.second );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Core::InstanceContent::registerInstanceObj( Core::Entity::InstanceObjectPtr object )
|
||||||
|
{
|
||||||
|
if( !object )
|
||||||
|
return;
|
||||||
|
|
||||||
|
object->setParentInstance( InstanceContentPtr( this ) );
|
||||||
|
|
||||||
|
m_instanceObjects[object->getId()] = object;
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::Entity::InstanceObjectPtr Core::InstanceContent::getInstanceObject( uint32_t objId )
|
||||||
|
{
|
||||||
|
auto obj = m_instanceObjects.find( objId );
|
||||||
|
if( obj == m_instanceObjects.end() )
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return obj->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::InstanceContent::updateInstanceObj( Core::Entity::InstanceObjectPtr object )
|
||||||
|
{
|
||||||
|
if( !object )
|
||||||
|
return;
|
||||||
|
|
||||||
|
for( const auto& playerId : m_playerMap )
|
||||||
|
{
|
||||||
|
// send that packet with le data
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,6 +5,7 @@
|
||||||
#include "Event/Director.h"
|
#include "Event/Director.h"
|
||||||
#include "Forwards.h"
|
#include "Forwards.h"
|
||||||
#include <common/Exd/ExdDataGenerated.h>
|
#include <common/Exd/ExdDataGenerated.h>
|
||||||
|
#include "Actor/InstanceObject.h"
|
||||||
|
|
||||||
namespace Core
|
namespace Core
|
||||||
{
|
{
|
||||||
|
@ -35,6 +36,9 @@ public:
|
||||||
|
|
||||||
void setVar( uint8_t index, uint8_t value );
|
void setVar( uint8_t index, uint8_t value );
|
||||||
|
|
||||||
|
void registerInstanceObj( Entity::InstanceObjectPtr object );
|
||||||
|
Entity::InstanceObjectPtr getInstanceObject( uint32_t objId );
|
||||||
|
void updateInstanceObj( Entity::InstanceObjectPtr object );
|
||||||
|
|
||||||
Core::Data::ExdDataGenerated::InstanceContentPtr getInstanceContentInfo() const;
|
Core::Data::ExdDataGenerated::InstanceContentPtr getInstanceContentInfo() const;
|
||||||
|
|
||||||
|
@ -48,6 +52,7 @@ private:
|
||||||
|
|
||||||
int64_t m_instanceExpireTime;
|
int64_t m_instanceExpireTime;
|
||||||
|
|
||||||
|
std::unordered_map< uint32_t, Core::Entity::InstanceObjectPtr > m_instanceObjects;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue