From b8cbdf3fa5fc476d021940450a95644a507a6fe7 Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 15 Feb 2018 23:50:28 +0100 Subject: [PATCH] removed all unused state flags, mapped more client actions --- src/common/Common.h | 70 +++---------------- .../Network/PacketDef/Zone/ServerZoneDef.h | 6 +- .../sapphire_zone/Action/ActionCast.cpp | 2 +- .../sapphire_zone/Action/ActionMount.cpp | 2 +- .../sapphire_zone/Action/EventAction.cpp | 8 +-- src/servers/sapphire_zone/Actor/Player.cpp | 2 +- src/servers/sapphire_zone/Actor/Player.h | 2 +- .../sapphire_zone/Actor/PlayerEvent.cpp | 5 +- .../Network/Handlers/ActionHandler.cpp | 25 ++++++- .../Network/Handlers/PacketHandlers.cpp | 6 +- .../PacketWrappers/PlayerStateFlagsPacket.h | 6 +- 11 files changed, 48 insertions(+), 86 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 15fb9800..2a62c6ef 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -380,73 +380,21 @@ namespace Common { InvincibilityStayAlive, }; - enum struct PlayerStateFlag : uint8_t + enum PlayerStateFlag : uint8_t { - NoCombat, - Combat, - Casting, - StatusAffliction, - StatusAffliction1, - Occupied, - Occupied1, - Occupied2, - Occupied3, + HideUILockChar = 0, // as the name suggests, hides the ui and logs the char... + InCombat = 1, // in Combat, locks gearchange/return/teleport + Casting = 2, + InNpcEvent = 7, // when talking to an npc, locks ui giving "occupied" message - BoundByDuty, - Occupied4, - DuelingArea, - TradeOpen, - Occupied5, - HandlingItems, - Crafting, - PreparingToCraft, - Gathering, - Fishing, + InNpcEvent1 = 10, // Sent together with InNpcEvent, when waiting for input? just a guess... - BeingRaised, - BetweenAreas, - Stealthed, - InnRoom, - Jumping, - AutoRun, - Occupied6, - BetweenAreas1, - SystemError, - LoggingOut, + BoundByDuty = 11, - InvalidLocation, - WaitingForDuty, - BoundByDuty1, - Mounting, - WatchingCutscene, - WaitingForDutyFinder, - CreatingCharacter, - Jumping1, - PvpDisplay, - StatusAfflication2, + BetweenAreas = 24, - Mounting1, - CarryingItem, - UsingPartyFinder, - HousingFunctions, - Transformed, - FreeTrail, - BeingMoved, - Mounting2, - StatusAffliction3, - StatusAffliction4, + WatchingCutscene = 50, // this is actually just a dummy, this id is different - RegisteringRaceOrMatch, - WaitingForRaceOrMatch, - WaitingForTripleTriadMatch, - InFlight, - WatchingCutscene1, - DeepDungeon, - Swimming, - Diving, - RegisteringTripleTriad, - WaitingTripleTriad, - InCrossWorldParty }; diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index aba88ad3..d63dc394 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -826,10 +826,8 @@ struct FFXIVIpcActorOwner : FFXIVIpcBasePacket */ struct FFXIVIpcPlayerStateFlags : FFXIVIpcBasePacket { - uint8_t flags[7]; - uint8_t padding1[3]; - uint32_t padding2; - uint16_t padding; + uint8_t flags[12]; + uint32_t padding; }; /** diff --git a/src/servers/sapphire_zone/Action/ActionCast.cpp b/src/servers/sapphire_zone/Action/ActionCast.cpp index ee75c48b..00e0e966 100644 --- a/src/servers/sapphire_zone/Action/ActionCast.cpp +++ b/src/servers/sapphire_zone/Action/ActionCast.cpp @@ -83,7 +83,7 @@ void Core::Action::ActionCast::onInterrupt() if( !m_pSource ) return; - m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); + //m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Casting ); auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, diff --git a/src/servers/sapphire_zone/Action/ActionMount.cpp b/src/servers/sapphire_zone/Action/ActionMount.cpp index 13dcc05d..9ec4588e 100644 --- a/src/servers/sapphire_zone/Action/ActionMount.cpp +++ b/src/servers/sapphire_zone/Action/ActionMount.cpp @@ -94,7 +94,7 @@ void Core::Action::ActionMount::onInterrupt() if( !m_pSource ) return; - m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); + //m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Casting ); auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, diff --git a/src/servers/sapphire_zone/Action/EventAction.cpp b/src/servers/sapphire_zone/Action/EventAction.cpp index 9c08f3a7..47b9895f 100644 --- a/src/servers/sapphire_zone/Action/EventAction.cpp +++ b/src/servers/sapphire_zone/Action/EventAction.cpp @@ -53,7 +53,7 @@ void Core::Action::EventAction::onStart() if( m_pSource->isPlayer() ) { m_pSource->sendToInRangeSet( control, true ); - m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Occupied2 ); + //m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Occupied2 ); } else m_pSource->sendToInRangeSet( control ); @@ -82,7 +82,7 @@ void Core::Action::EventAction::onFinish() if( m_pSource->isPlayer() ) { - m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied2 ); + //m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied2 ); m_pSource->sendToInRangeSet( control, true ); } else @@ -110,8 +110,8 @@ void Core::Action::EventAction::onInterrupt() { auto control1 = ActorControlPacket143( m_pSource->getId(), ActorControlType::FreeEventPos, m_eventId ); - m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::NoCombat ); - m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); + //m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::NoCombat ); + //m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); m_pSource->sendToInRangeSet( control ); m_pSource->sendToInRangeSet( control1 ); diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 3b0afa41..2cbcfe09 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -177,7 +177,7 @@ Core::Common::OnlineStatus Core::Entity::Player::getOnlineStatus() if( m_onlineStatus & rpMask ) status = OnlineStatus::Roleplaying; - if( hasStateFlag( PlayerStateFlag::WatchingCutscene ) || hasStateFlag( PlayerStateFlag::WatchingCutscene1 ) ) + if( hasStateFlag( PlayerStateFlag::WatchingCutscene ) ) status = OnlineStatus::ViewingCutscene; // TODO: add all the logic for returning the proper online status, there probably is a better way for this alltogether diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 712aa1c2..22a474fa 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -637,7 +637,7 @@ private: boost::shared_ptr< Common::QuestActive > m_activeQuests[30]; int16_t m_questTracking[5]; - uint8_t m_stateFlags[7]; + uint8_t m_stateFlags[12]; uint8_t m_gmRank; uint16_t zoneId; diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 7189b106..aeeb5ad9 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -84,7 +84,7 @@ void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId, addEvent( newEvent ); - setStateFlag( PlayerStateFlag::Occupied2 ); + setStateFlag( PlayerStateFlag::InNpcEvent ); EventStartPacket eventStart( getId(), actorId, eventId, eventType, eventParam1, eventParam2 ); @@ -218,7 +218,7 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer ) removeEvent( pEvent->getId() ); if( freePlayer == 1 ) - unsetStateFlag( PlayerStateFlag::Occupied2 ); + unsetStateFlag( PlayerStateFlag::InNpcEvent ); } void Core::Entity::Player::eventActionStart( uint32_t eventId, @@ -290,7 +290,6 @@ void Core::Entity::Player::onDeath() } - // TODO: slightly ugly here and way too static. Needs too be done properly void Core::Entity::Player::onTick() { diff --git a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp index d79c8001..d709f552 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp @@ -117,6 +117,10 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in player.getCurrentAction()->setInterrupted(); break; } + case 0x12D: // Mark player + { + break; + } case 0x12E: // Set player title { player.setTitle( static_cast< uint16_t >( param1 ) ); @@ -132,7 +136,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in } case 0x133: // Update howtos seen { - uint32_t howToId = static_cast< uint32_t >( param1 ); + uint32_t howToId = param11; player.updateHowtosSeen( howToId ); break; } @@ -144,7 +148,23 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in player.sendToInRangeSet( ActorControlPacket144( player.getId(), Emote, emoteId, 0, 0, 0, targetId ) ); break; } - case 0xC8: // return dead + case 0x1F7: // cancel persistant emote + { + break; + } + case 0x1F9: // change pose + { + break; + } + case 0x1FA: // reapply pose + { + break; + } + case 0x1FB: // cancel pose + { + break; + } + case 0xC8: // return dead / accept raise { switch ( static_cast < ResurrectType >( param1 ) ) { @@ -193,7 +213,6 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in player.setZoningType( Common::ZoneingType::None ); player.unsetStateFlag( PlayerStateFlag::BetweenAreas ); - player.unsetStateFlag( PlayerStateFlag::BetweenAreas1 ); break; } diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 8e5d27d5..c6232a22 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -564,16 +564,14 @@ void Core::Network::GameConnection::tellHandler( const Packets::GamePacket& inPa auto pTargetPlayer = pSession->getPlayer(); - if( pTargetPlayer->hasStateFlag( PlayerStateFlag::BetweenAreas ) || - pTargetPlayer->hasStateFlag( PlayerStateFlag::BetweenAreas1 ) ) + if( pTargetPlayer->hasStateFlag( PlayerStateFlag::BetweenAreas ) ) { // send error for player between areas // TODO: implement me return; } - if( pTargetPlayer->hasStateFlag( PlayerStateFlag::BoundByDuty ) || - pTargetPlayer->hasStateFlag( PlayerStateFlag::BoundByDuty1 ) ) + if( pTargetPlayer->hasStateFlag( PlayerStateFlag::BoundByDuty ) ) { // send error for player bound by duty // TODO: implement me diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerStateFlagsPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerStateFlagsPacket.h index 920a4a80..ac1bf5a5 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerStateFlagsPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerStateFlagsPacket.h @@ -26,8 +26,8 @@ public: PlayerStateFlagsPacket( Entity::Player& player, std::vector< Common::PlayerStateFlag > flags ) : ZoneChannelPacket< FFXIVIpcPlayerStateFlags >( player.getId(), player.getId() ) { - uint8_t newFlags[7]; - memset( newFlags, 0, 7 ); + uint8_t newFlags[12]; + memset( newFlags, 0, 12 ); for( auto& flag : flags ) { @@ -46,7 +46,7 @@ public: private: void initialize( const uint8_t* flags ) { - memcpy( m_data.flags, flags, 7 ); + memcpy( m_data.flags, flags, 12 ); }; };