mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-29 15:47:46 +00:00
Merge pull request #848 from Skyliegirl33/ThreePointThree
[3.3] Some fixes and add companions and persistent emote cancel
This commit is contained in:
commit
b2f87c2f68
14 changed files with 92 additions and 18 deletions
|
@ -189,7 +189,7 @@ void PlayerMinimal::saveAsNew()
|
||||||
std::vector< uint8_t > howTo( 33 );
|
std::vector< uint8_t > howTo( 33 );
|
||||||
std::vector< uint8_t > aetherytes( 16 );
|
std::vector< uint8_t > aetherytes( 16 );
|
||||||
std::vector< uint8_t > discovery( 421 );
|
std::vector< uint8_t > discovery( 421 );
|
||||||
std::vector< uint8_t > questComplete( 350 );
|
std::vector< uint8_t > questComplete( 342 );
|
||||||
std::vector< uint8_t > unlocks( 64 );
|
std::vector< uint8_t > unlocks( 64 );
|
||||||
std::vector< uint8_t > mountGuide( 15 );
|
std::vector< uint8_t > mountGuide( 15 );
|
||||||
std::vector< uint8_t > orchestrion( 40 );
|
std::vector< uint8_t > orchestrion( 40 );
|
||||||
|
|
|
@ -816,6 +816,7 @@ namespace Sapphire::Common
|
||||||
MagicPoints = 3,
|
MagicPoints = 3,
|
||||||
TacticsPoints = 5,
|
TacticsPoints = 5,
|
||||||
TacticsPoints1 = 6,
|
TacticsPoints1 = 6,
|
||||||
|
Sprint = 18,
|
||||||
// WARGauge = 22,
|
// WARGauge = 22,
|
||||||
// DRKGauge = 25,
|
// DRKGauge = 25,
|
||||||
// AetherflowStack = 30,
|
// AetherflowStack = 30,
|
||||||
|
@ -922,6 +923,7 @@ namespace Sapphire::Common
|
||||||
{
|
{
|
||||||
KeyItemAction = 1,
|
KeyItemAction = 1,
|
||||||
ItemActionVFX = 852,
|
ItemActionVFX = 852,
|
||||||
|
ItemActionCompanion = 853,
|
||||||
ItemActionVFX2 = 944,
|
ItemActionVFX2 = 944,
|
||||||
ItemActionMount = 1322,
|
ItemActionMount = 1322,
|
||||||
};
|
};
|
||||||
|
|
|
@ -148,6 +148,8 @@ namespace Sapphire::Network::ActorControl
|
||||||
|
|
||||||
Emote = 0x122,
|
Emote = 0x122,
|
||||||
EmoteInterrupt = 0x123,
|
EmoteInterrupt = 0x123,
|
||||||
|
EmoteModeInterrupt = 0x124,
|
||||||
|
EmoteModeInterruptNonImmediate = 0x125,
|
||||||
|
|
||||||
SetPose = 0x127,
|
SetPose = 0x127,
|
||||||
|
|
||||||
|
|
|
@ -702,6 +702,7 @@ bool Action::Action::primaryCostCheck( bool subtractCosts )
|
||||||
{
|
{
|
||||||
case Common::ActionPrimaryCostType::TacticsPoints:
|
case Common::ActionPrimaryCostType::TacticsPoints:
|
||||||
case Common::ActionPrimaryCostType::TacticsPoints1:
|
case Common::ActionPrimaryCostType::TacticsPoints1:
|
||||||
|
case Common::ActionPrimaryCostType::Sprint:
|
||||||
{
|
{
|
||||||
auto curTp = m_pSource->getTp();
|
auto curTp = m_pSource->getTp();
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,13 @@ void ItemAction::execute()
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case Common::ItemActionType::ItemActionCompanion:
|
||||||
|
{
|
||||||
|
handleCompanionItem();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,6 +88,15 @@ void ItemAction::handleVFXItem()
|
||||||
m_pSource->sendToInRangeSet( effectPacket, true );
|
m_pSource->sendToInRangeSet( effectPacket, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ItemAction::handleCompanionItem()
|
||||||
|
{
|
||||||
|
auto player = getSourceChara()->getAsPlayer();
|
||||||
|
|
||||||
|
Logger::debug( "Companion arg: {0}", m_itemAction->data().Calcu0Arg[ 0 ] );
|
||||||
|
|
||||||
|
player->unlockCompanion( m_itemAction->data().Calcu0Arg[ 0 ] );
|
||||||
|
}
|
||||||
|
|
||||||
void ItemAction::handleMountItem()
|
void ItemAction::handleMountItem()
|
||||||
{
|
{
|
||||||
auto player = getSourceChara()->getAsPlayer();
|
auto player = getSourceChara()->getAsPlayer();
|
||||||
|
|
|
@ -27,6 +27,8 @@ namespace Sapphire::World::Action
|
||||||
private:
|
private:
|
||||||
void handleVFXItem();
|
void handleVFXItem();
|
||||||
|
|
||||||
|
void handleCompanionItem();
|
||||||
|
|
||||||
void handleMountItem();
|
void handleMountItem();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -1125,6 +1125,28 @@ void Player::unlockMount( uint32_t mountId )
|
||||||
queuePacket( makeActorControlSelf( getId(), Network::ActorControl::SetMountBitmask, mount->data().MountOrder, 1 ) );
|
queuePacket( makeActorControlSelf( getId(), Network::ActorControl::SetMountBitmask, mount->data().MountOrder, 1 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::unlockCompanion( uint32_t companionId )
|
||||||
|
{
|
||||||
|
auto& exdData = Common::Service< Data::ExdData >::ref();
|
||||||
|
auto companion = exdData.getRow< Excel::Companion >( companionId );
|
||||||
|
|
||||||
|
//if( companion->data(). == -1 )
|
||||||
|
// return;
|
||||||
|
|
||||||
|
uint16_t index;
|
||||||
|
uint8_t value;
|
||||||
|
Util::valueToFlagByteIndexValue( companionId, value, index );
|
||||||
|
|
||||||
|
m_minionGuide[ index ] |= value;
|
||||||
|
|
||||||
|
queuePacket( makeActorControlSelf( getId(), Network::ActorControl::LearnCompanion, companionId, 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
Player::MinionList& Player::getMinionGuideBitmask()
|
||||||
|
{
|
||||||
|
return m_minionGuide;
|
||||||
|
}
|
||||||
|
|
||||||
Player::MountList& Player::getMountGuideBitmask()
|
Player::MountList& Player::getMountGuideBitmask()
|
||||||
{
|
{
|
||||||
return m_mountGuide;
|
return m_mountGuide;
|
||||||
|
@ -1369,7 +1391,8 @@ void Player::setCompanion( uint8_t id )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_companionId = id;
|
m_companionId = id;
|
||||||
sendToInRangeSet( makeActorControl( getId(), ActorControlType::ToggleCompanion, id ), true );
|
|
||||||
|
Service< World::Manager::PlayerMgr >::ref().onCompanionUpdate( *this, m_companionId );
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Player::getCurrentCompanion() const
|
uint8_t Player::getCurrentCompanion() const
|
||||||
|
|
|
@ -32,7 +32,7 @@ namespace Sapphire::Entity
|
||||||
using HowToList = std::array< uint8_t, 34 >;
|
using HowToList = std::array< uint8_t, 34 >;
|
||||||
using MinionList = std::array< uint8_t, 40 >;
|
using MinionList = std::array< uint8_t, 40 >;
|
||||||
using MountList = std::array< uint8_t, 22 >;
|
using MountList = std::array< uint8_t, 22 >;
|
||||||
using QuestComplete = std::array< uint8_t, 350 >;
|
using QuestComplete = std::array< uint8_t, 342 >;
|
||||||
using Discovery = std::array< uint8_t, 400 >;
|
using Discovery = std::array< uint8_t, 400 >;
|
||||||
using AetheryteList = std::array< uint8_t, 21 >;
|
using AetheryteList = std::array< uint8_t, 21 >;
|
||||||
using UnlockList = std::array< uint8_t, 64 >;
|
using UnlockList = std::array< uint8_t, 64 >;
|
||||||
|
@ -463,6 +463,12 @@ namespace Sapphire::Entity
|
||||||
/*! unlock a mount */
|
/*! unlock a mount */
|
||||||
void unlockMount( uint32_t mountId );
|
void unlockMount( uint32_t mountId );
|
||||||
|
|
||||||
|
/*! unlock a companion */
|
||||||
|
void unlockCompanion( uint32_t companionId );
|
||||||
|
|
||||||
|
/*! return a const pointer to the minion guide bitmask array */
|
||||||
|
MinionList& getMinionGuideBitmask();
|
||||||
|
|
||||||
/*! return a const pointer to the setMount guide bitmask array */
|
/*! return a const pointer to the setMount guide bitmask array */
|
||||||
MountList& getMountGuideBitmask();
|
MountList& getMountGuideBitmask();
|
||||||
|
|
||||||
|
@ -878,7 +884,7 @@ namespace Sapphire::Entity
|
||||||
uint16_t m_activeTitle{};
|
uint16_t m_activeTitle{};
|
||||||
TitleList m_titleList{};
|
TitleList m_titleList{};
|
||||||
HowToList m_howTo{};
|
HowToList m_howTo{};
|
||||||
MinionList m_minions{};
|
MinionList m_minionGuide{};
|
||||||
MountList m_mountGuide{};
|
MountList m_mountGuide{};
|
||||||
QuestComplete m_questCompleteFlags{};
|
QuestComplete m_questCompleteFlags{};
|
||||||
Discovery m_discovery{};
|
Discovery m_discovery{};
|
||||||
|
|
|
@ -129,6 +129,9 @@ bool Sapphire::Entity::Player::loadFromDb( uint64_t characterId )
|
||||||
auto titleList = res->getBlobVector( "TitleList" );
|
auto titleList = res->getBlobVector( "TitleList" );
|
||||||
memcpy( reinterpret_cast< char* >( m_titleList.data() ), titleList.data(), titleList.size() );
|
memcpy( reinterpret_cast< char* >( m_titleList.data() ), titleList.data(), titleList.size() );
|
||||||
|
|
||||||
|
auto minionGuide = res->getBlobVector( "Minions" );
|
||||||
|
memcpy( reinterpret_cast< char* >( m_minionGuide.data() ), minionGuide.data(), minionGuide.size() );
|
||||||
|
|
||||||
auto mountGuide = res->getBlobVector( "Mounts" );
|
auto mountGuide = res->getBlobVector( "Mounts" );
|
||||||
memcpy( reinterpret_cast< char* >( m_mountGuide.data() ), mountGuide.data(), mountGuide.size() );
|
memcpy( reinterpret_cast< char* >( m_mountGuide.data() ), mountGuide.data(), mountGuide.size() );
|
||||||
|
|
||||||
|
@ -384,8 +387,8 @@ void Sapphire::Entity::Player::updateDbChara() const
|
||||||
memcpy( howToVec.data(), m_howTo.data(), m_howTo.size() );
|
memcpy( howToVec.data(), m_howTo.data(), m_howTo.size() );
|
||||||
stmt->setBinary( 40, howToVec );
|
stmt->setBinary( 40, howToVec );
|
||||||
|
|
||||||
std::vector< uint8_t > minionsVec( sizeof( m_minions ) );
|
std::vector< uint8_t > minionsVec( sizeof( m_minionGuide ) );
|
||||||
memcpy( minionsVec.data(), m_minions.data(), m_minions.size() );
|
memcpy( minionsVec.data(), m_minionGuide.data(), m_minionGuide.size() );
|
||||||
stmt->setBinary( 41, minionsVec );
|
stmt->setBinary( 41, minionsVec );
|
||||||
|
|
||||||
std::vector< uint8_t > mountsVec( sizeof( m_mountGuide ) );
|
std::vector< uint8_t > mountsVec( sizeof( m_mountGuide ) );
|
||||||
|
|
|
@ -224,6 +224,11 @@ void PlayerMgr::onGcUpdate( Entity::Player& player )
|
||||||
server.queueForPlayer( player.getCharacterId(), gcAffPacket );
|
server.queueForPlayer( player.getCharacterId(), gcAffPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlayerMgr::onCompanionUpdate( Entity::Player& player, uint8_t companionId )
|
||||||
|
{
|
||||||
|
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::ToggleCompanion, companionId ), true );
|
||||||
|
}
|
||||||
|
|
||||||
void PlayerMgr::onMountUpdate( Entity::Player& player, uint32_t mountId )
|
void PlayerMgr::onMountUpdate( Entity::Player& player, uint32_t mountId )
|
||||||
{
|
{
|
||||||
if( mountId != 0 )
|
if( mountId != 0 )
|
||||||
|
|
|
@ -44,6 +44,8 @@ class PlayerMgr
|
||||||
|
|
||||||
void onGcUpdate( Sapphire::Entity::Player& player );
|
void onGcUpdate( Sapphire::Entity::Player& player );
|
||||||
|
|
||||||
|
void onCompanionUpdate( Entity::Player& player, uint8_t companionId );
|
||||||
|
|
||||||
void onMountUpdate( Sapphire::Entity::Player& player, uint32_t mountId );
|
void onMountUpdate( Sapphire::Entity::Player& player, uint32_t mountId );
|
||||||
|
|
||||||
void onMobKill( Sapphire::Entity::Player& player, Sapphire::Entity::BNpc& bnpc );
|
void onMobKill( Sapphire::Entity::Player& player, Sapphire::Entity::BNpc& bnpc );
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "Network/PacketWrappers/InspectPacket.h"
|
#include "Network/PacketWrappers/InspectPacket.h"
|
||||||
#include "Network/PacketWrappers/ActorControlPacket.h"
|
#include "Network/PacketWrappers/ActorControlPacket.h"
|
||||||
#include "Network/PacketWrappers/ActorControlTargetPacket.h"
|
#include "Network/PacketWrappers/ActorControlTargetPacket.h"
|
||||||
|
#include "Network/PacketWrappers/MoveActorPacket.h"
|
||||||
|
|
||||||
#include "Action/Action.h"
|
#include "Action/Action.h"
|
||||||
|
|
||||||
|
@ -465,6 +466,11 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
|
||||||
player.setCompanion( static_cast< uint8_t >( param1 ) );
|
player.setCompanion( static_cast< uint8_t >( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PacketCommand::COMPANION_CANCEL:
|
||||||
|
{
|
||||||
|
player.setCompanion( 0 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PacketCommand::REQUEST_STATUS_RESET: // Remove status (clicking it off)
|
case PacketCommand::REQUEST_STATUS_RESET: // Remove status (clicking it off)
|
||||||
{
|
{
|
||||||
// todo: check if status can be removed by client from exd
|
// todo: check if status can be removed by client from exd
|
||||||
|
@ -548,15 +554,21 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
|
||||||
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::EmoteInterrupt ) );
|
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::EmoteInterrupt ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* case PacketCommand::PersistentEmoteCancel: // cancel persistent emote
|
case PacketCommand::EMOTE_MODE_CANCEL:
|
||||||
{
|
{
|
||||||
|
if( player.getPersistentEmote() > 0 )
|
||||||
|
{
|
||||||
|
auto movePacket = std::make_shared< MoveActorPacket >( player, player.getRot(), 2, 0, 0, 0x5A / 4 );
|
||||||
|
player.sendToInRangeSet( movePacket );
|
||||||
|
|
||||||
player.setPersistentEmote( 0 );
|
player.setPersistentEmote( 0 );
|
||||||
player.emoteInterrupt();
|
player.sendToInRangeSet( makeActorControl( player.getId(), ActorControlType::EmoteModeInterrupt ) );
|
||||||
player.setStatus( ActorStatus::Idle );
|
player.setStatus( ActorStatus::Idle );
|
||||||
auto pSetStatusPacket = makeActorControl( player.getId(), SetStatus, static_cast< uint8_t >( ActorStatus::Idle ) );
|
|
||||||
player.sendToInRangeSet( pSetStatusPacket );
|
player.sendToInRangeSet( makeActorControl( player.getId(), SetStatus, static_cast< uint8_t >( ActorStatus::Idle ) ) );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}*/
|
}
|
||||||
case PacketCommand::POSE_EMOTE_CONFIG: // change pose
|
case PacketCommand::POSE_EMOTE_CONFIG: // change pose
|
||||||
case PacketCommand::POSE_EMOTE_WORK: // reapply pose
|
case PacketCommand::POSE_EMOTE_WORK: // reapply pose
|
||||||
{
|
{
|
||||||
|
@ -567,9 +579,6 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
|
||||||
}
|
}
|
||||||
case PacketCommand::POSE_EMOTE_CANCEL: // cancel pose
|
case PacketCommand::POSE_EMOTE_CANCEL: // cancel pose
|
||||||
{
|
{
|
||||||
player.setPose( static_cast< uint8_t >( param12 ) );
|
|
||||||
auto pSetStatusPacket = makeActorControl( player.getId(), SetPose, param11, param12 );
|
|
||||||
player.sendToInRangeSet( pSetStatusPacket, true );
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PacketCommand::REVIVE: // return dead / accept raise
|
case PacketCommand::REVIVE: // return dead / accept raise
|
||||||
|
|
|
@ -58,6 +58,8 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
|
||||||
|
|
||||||
// memcpy( m_data.orchestrionMask, player.getOrchestrionBitmask(), sizeof( m_data.orchestrionMask ) );
|
// memcpy( m_data.orchestrionMask, player.getOrchestrionBitmask(), sizeof( m_data.orchestrionMask ) );
|
||||||
|
|
||||||
|
memcpy( m_data.Companion, player.getMinionGuideBitmask().data(), sizeof( m_data.Companion ) );
|
||||||
|
|
||||||
memcpy( m_data.MountList, player.getMountGuideBitmask().data(), sizeof( m_data.MountList ) );
|
memcpy( m_data.MountList, player.getMountGuideBitmask().data(), sizeof( m_data.MountList ) );
|
||||||
|
|
||||||
memcpy( m_data.Reward, player.getUnlockBitmask().data(), sizeof( m_data.Reward ) );
|
memcpy( m_data.Reward, player.getUnlockBitmask().data(), sizeof( m_data.Reward ) );
|
||||||
|
|
|
@ -87,6 +87,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server
|
||||||
m_data.PermissionInvisibility = 0;
|
m_data.PermissionInvisibility = 0;
|
||||||
|
|
||||||
m_data.GrandCompany = player.getGc();
|
m_data.GrandCompany = player.getGc();
|
||||||
|
if( m_data.GrandCompany > 0 )
|
||||||
m_data.GrandCompanyRank = player.getGcRankArray()[ player.getGc() - 1 ];
|
m_data.GrandCompanyRank = player.getGcRankArray()[ player.getGc() - 1 ];
|
||||||
|
|
||||||
//m_data.u23 = 0x04;
|
//m_data.u23 = 0x04;
|
||||||
|
|
Loading…
Add table
Reference in a new issue