2018-01-28 13:49:51 +01:00
|
|
|
#include "InstanceContent.h"
|
2018-01-29 13:05:33 +11:00
|
|
|
|
2018-02-06 00:01:23 +01:00
|
|
|
#include <common/Common.h>
|
2018-02-04 23:35:16 +01:00
|
|
|
#include <common/Logging/Logger.h>
|
|
|
|
#include <common/Util/Util.h>
|
|
|
|
#include <common/Util/UtilMath.h>
|
2018-02-07 00:00:48 +01:00
|
|
|
#include <common/Network/PacketDef/Ipcs.h>
|
|
|
|
#include <common/Network/PacketDef/Zone/ServerZoneDef.h>
|
|
|
|
|
|
|
|
#include "Event/Director.h"
|
2018-02-09 02:34:43 +11:00
|
|
|
#include "Script/ScriptManager.h"
|
2018-02-04 23:35:16 +01:00
|
|
|
|
|
|
|
#include "Actor/Player.h"
|
|
|
|
|
2018-02-06 00:01:23 +01:00
|
|
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
|
|
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
|
|
|
|
2018-02-04 23:35:16 +01:00
|
|
|
extern Core::Logger g_log;
|
2018-02-09 02:34:43 +11:00
|
|
|
extern Core::Scripting::ScriptManager g_scriptMgr;
|
2018-02-04 23:35:16 +01:00
|
|
|
|
2018-02-06 00:01:23 +01:00
|
|
|
using namespace Core::Common;
|
|
|
|
using namespace Core::Network::Packets;
|
|
|
|
using namespace Core::Network::Packets::Server;
|
|
|
|
|
2018-01-29 19:40:27 +11:00
|
|
|
Core::InstanceContent::InstanceContent( boost::shared_ptr< Core::Data::InstanceContent > pInstanceContent,
|
|
|
|
uint32_t guId,
|
|
|
|
const std::string& internalName,
|
2018-01-29 19:41:41 +01:00
|
|
|
const std::string& contentName,
|
|
|
|
uint32_t instanceContentId )
|
2018-02-06 00:01:23 +01:00
|
|
|
: Zone( static_cast< uint16_t >( pInstanceContent->territoryType ), guId, internalName, contentName ),
|
|
|
|
Director( Event::Director::InstanceContent, instanceContentId ),
|
2018-01-29 19:41:41 +01:00
|
|
|
m_instanceContentInfo( pInstanceContent ),
|
|
|
|
m_instanceContentId( instanceContentId ),
|
|
|
|
m_state( Created )
|
2018-01-29 13:05:33 +11:00
|
|
|
{
|
2018-02-09 02:34:43 +11:00
|
|
|
g_scriptMgr.onInstanceInit( *this );
|
2018-01-29 13:05:33 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
Core::InstanceContent::~InstanceContent()
|
|
|
|
{
|
|
|
|
|
2018-01-29 19:41:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t Core::InstanceContent::getInstanceContentId() const
|
|
|
|
{
|
|
|
|
return m_instanceContentId;
|
|
|
|
}
|
|
|
|
|
2018-02-04 23:35:16 +01:00
|
|
|
Core::Data::ExdDataGenerated::InstanceContentPtr Core::InstanceContent::getInstanceContentInfo() const
|
2018-01-29 19:41:41 +01:00
|
|
|
{
|
|
|
|
return m_instanceContentInfo;
|
|
|
|
}
|
2018-02-04 23:35:16 +01:00
|
|
|
|
|
|
|
void Core::InstanceContent::onEnterTerritory( Entity::PlayerPtr pPlayer )
|
|
|
|
{
|
|
|
|
g_log.debug( "InstanceContent::onEnterTerritory: Zone#" + std::to_string( getGuId() ) + "|"
|
|
|
|
+ std::to_string( getInstanceContentId() ) +
|
|
|
|
+ ", Entity#" + std::to_string( pPlayer->getId() ) );
|
2018-02-06 00:01:23 +01:00
|
|
|
|
2018-02-07 00:00:48 +01:00
|
|
|
// mark player as "bound by duty"
|
2018-02-06 00:01:23 +01:00
|
|
|
pPlayer->setStateFlag( PlayerStateFlag::BoundByDuty );
|
2018-02-07 00:00:48 +01:00
|
|
|
|
|
|
|
// if the instance was not started yet, director init is sent on enter event.
|
|
|
|
// else it will be sent on finish loading.
|
|
|
|
if( m_state == Created )
|
|
|
|
sendDirectorInit( pPlayer );
|
|
|
|
|
2018-02-04 23:35:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Core::InstanceContent::onLeaveTerritory( Entity::PlayerPtr pPlayer )
|
|
|
|
{
|
|
|
|
g_log.debug( "InstanceContent::onLeaveTerritory: Zone#" + std::to_string( getGuId() ) + "|"
|
|
|
|
+ std::to_string( getInstanceContentId() ) +
|
|
|
|
+ ", Entity#" + std::to_string( pPlayer->getId() ) );
|
2018-02-07 00:00:48 +01:00
|
|
|
sendDirectorClear( pPlayer );
|
|
|
|
|
|
|
|
pPlayer->setDirectorInitialized( false );
|
|
|
|
// remove "bound by duty" state
|
2018-02-06 00:01:23 +01:00
|
|
|
pPlayer->unsetStateFlag( PlayerStateFlag::BoundByDuty );
|
2018-02-04 23:35:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Core::InstanceContent::onUpdate( uint32_t currTime )
|
|
|
|
{
|
|
|
|
|
2018-02-07 00:00:48 +01:00
|
|
|
switch( m_state )
|
|
|
|
{
|
|
|
|
case Created:
|
|
|
|
{
|
|
|
|
// temporary handling for instance state progression
|
|
|
|
if( m_playerMap.size() < 1 )
|
|
|
|
return;
|
|
|
|
|
|
|
|
for( const auto &playerIt : m_playerMap )
|
|
|
|
{
|
|
|
|
if( !playerIt.second->isLoadingComplete() || !playerIt.second->isDirectorInitialized() )
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for( const auto &playerIt : m_playerMap )
|
|
|
|
{
|
|
|
|
auto pPlayer = playerIt.second;
|
|
|
|
pPlayer->queuePacket(
|
|
|
|
ActorControlPacket143( pPlayer->getId(), DirectorUpdate,
|
|
|
|
getDirectorId(), 0x40000001, m_instanceContentInfo->timeLimitmin * 60u ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
m_state = DutyInProgress;
|
2018-02-09 00:04:46 +11:00
|
|
|
m_instanceExpireTime = Util::getTimeSeconds() + ( m_instanceContentInfo->timeLimitmin * 60u );
|
2018-02-07 00:00:48 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case DutyReset:
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DutyInProgress:
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case DutyFinished:
|
|
|
|
break;
|
|
|
|
}
|
2018-02-09 02:34:43 +11:00
|
|
|
|
|
|
|
g_scriptMgr.onInstanceUpdate( *this, currTime );
|
2018-02-04 23:35:16 +01:00
|
|
|
}
|
2018-02-06 00:01:23 +01:00
|
|
|
|
|
|
|
void Core::InstanceContent::onFinishLoading( Entity::PlayerPtr pPlayer )
|
|
|
|
{
|
2018-02-07 00:00:48 +01:00
|
|
|
if( m_state != Created )
|
|
|
|
sendDirectorInit( pPlayer );
|
2018-02-06 00:01:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Core::InstanceContent::onInitDirector( Entity::PlayerPtr pPlayer )
|
|
|
|
{
|
2018-02-07 00:00:48 +01:00
|
|
|
sendDirectorVars( pPlayer );
|
|
|
|
pPlayer->setDirectorInitialized( true );
|
|
|
|
}
|
2018-02-06 00:01:23 +01:00
|
|
|
|
2018-02-07 00:00:48 +01:00
|
|
|
void Core::InstanceContent::setVar( uint8_t index, uint8_t value )
|
|
|
|
{
|
|
|
|
if( index > 19 )
|
|
|
|
return;
|
|
|
|
|
|
|
|
switch( index )
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
setDirectorUI8AL( value );
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
setDirectorUI8AH( value );
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
setDirectorUI8BL( value );
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
setDirectorUI8BH( value );
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
setDirectorUI8CL( value );
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
setDirectorUI8CH( value );
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
setDirectorUI8DL( value );
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
setDirectorUI8DH( value );
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
setDirectorUI8EL( value );
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
setDirectorUI8EH( value );
|
|
|
|
break;
|
|
|
|
case 10:
|
|
|
|
setDirectorUI8FL( value );
|
|
|
|
break;
|
|
|
|
case 11:
|
|
|
|
setDirectorUI8FH( value );
|
|
|
|
break;
|
|
|
|
case 12:
|
|
|
|
setDirectorUI8GL( value );
|
|
|
|
break;
|
|
|
|
case 13:
|
|
|
|
setDirectorUI8GH( value );
|
|
|
|
break;
|
|
|
|
case 14:
|
|
|
|
setDirectorUI8HL( value );
|
|
|
|
break;
|
|
|
|
case 15:
|
|
|
|
setDirectorUI8HH( value );
|
|
|
|
break;
|
|
|
|
case 16:
|
|
|
|
setDirectorUI8IL( value );
|
|
|
|
break;
|
|
|
|
case 17:
|
|
|
|
setDirectorUI8IH( value );
|
|
|
|
break;
|
|
|
|
case 18:
|
|
|
|
setDirectorUI8JL( value );
|
|
|
|
break;
|
|
|
|
case 19:
|
|
|
|
setDirectorUI8JH( value );
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for( const auto &playerIt : m_playerMap )
|
|
|
|
{
|
|
|
|
sendDirectorVars( playerIt.second );
|
|
|
|
}
|
2018-02-06 00:01:23 +01:00
|
|
|
}
|
2018-02-10 02:47:32 +11:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
}
|