1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-01 08:27:46 +00:00

Merge branch 'ThreePointOh' of https://github.com/SapphireServer/Sapphire into threepointoh

This commit is contained in:
Alice Ogeda 2022-01-20 20:14:40 -03:00
commit 4eca7355c2
8 changed files with 414 additions and 24 deletions

View file

@ -627,4 +627,6 @@ namespace Sapphire::Network::ActorControl
}; };
} }

View file

@ -41,6 +41,8 @@
#include <Manager/TerritoryMgr.h> #include <Manager/TerritoryMgr.h>
#include <Manager/RNGMgr.h> #include <Manager/RNGMgr.h>
#include <Manager/PlayerMgr.h> #include <Manager/PlayerMgr.h>
#include <Manager/TaskMgr.h>
#include <Task/RemoveBNpcTask.h>
#include <Service.h> #include <Service.h>
using namespace Sapphire::Common; using namespace Sapphire::Common;
@ -774,6 +776,9 @@ void Sapphire::Entity::BNpc::onDeath()
m_timeOfDeath = Util::getTimeSeconds(); m_timeOfDeath = Util::getTimeSeconds();
setOwner( nullptr ); setOwner( nullptr );
auto& taskMgr = Common::Service< World::Manager::TaskMgr >::ref();
auto removeTask = std::make_shared< Sapphire::World::RemoveBNpcTask >( 10000, getAsBNpc() );
taskMgr.queueTask( removeTask );
auto& exdData = Common::Service< Data::ExdData >::ref(); auto& exdData = Common::Service< Data::ExdData >::ref();
auto paramGrowthInfo = exdData.getRow< Component::Excel::ParamGrow >( m_level ); auto paramGrowthInfo = exdData.getRow< Component::Excel::ParamGrow >( m_level );

View file

@ -10,12 +10,13 @@ using namespace Sapphire::World;
void TaskMgr::update( uint64_t tickCount ) void TaskMgr::update( uint64_t tickCount )
{ {
for( auto it = m_taskList.begin(); it != m_taskList.end(); ) for( auto it = m_taskList.begin(); it != m_taskList.end(); )
{ {
auto pTask = *it; auto pTask = *it;
// is the task ready for execution? // is the task ready for execution?
if( ( tickCount - pTask->getQueueTimeMs() ) >= pTask->getDelayTimeMs() ) if( ( tickCount - pTask->getQueueTimeMs() ) >= pTask->getDelayTimeMs() )
{ {
Logger::info( "[TaskMgr] " + pTask->toString() );
pTask->execute(); pTask->execute();
it = m_taskList.erase( it ); it = m_taskList.erase( it );
} }

View file

@ -32,6 +32,343 @@ using namespace Sapphire::Network::Packets::WorldPackets::Client;
using namespace Sapphire::Network::ActorControl; using namespace Sapphire::Network::ActorControl;
using namespace Sapphire::World::Manager; using namespace Sapphire::World::Manager;
const char* packetCommandToString( uint16_t commandId )
{
switch( commandId )
{
case DRAWN_SWORD:
return "DRAWN_SWORD";
case AUTO_ATTACK:
return "DRAWN_SWORD";
case TARGET_DECIDE:
return "TARGET_DECIDE";
case REQUEST_ACTION:
return "REQUEST_ACTION";
case CANCEL_MOUNT:
return "CANCEL_MOUNT";
case COMPANION:
return "COMPANION";
case COMPANION_CANCEL:
return "COMPANION_CANCEL";
case REQUEST_STATUS_RESET:
return "REQUEST_STATUS_RESET";
case CANCEL_CAST:
return "CANCEL_CAST";
case MOUNT_LINK:
return "MOUNT_LINK";
case UNMOUNT_LINK:
return "UNMOUNT_LINK";
case BALLISTA_ACCESS:
return "BALLISTA_ACCESS";
case REVIVE:
return "REVIVE";
case FINISH_LOADING:
return "FINISH_LOADING";
case TELEPO_INQUIRY:
return "TELEPO_INQUIRY";
case TELEPO_INVITATION_ANSWER:
return "TELEPO_INVITATION_ANSWER";
case TELEPO_CANCEL:
return "TELEPO_CANCEL";
case RAISE_CANCEL:
return "RAISE_CANCEL";
case WARP_REPLY:
return "WARP_REPLY";
case REQUEST_MODE:
return "REQUEST_MODE";
case PUBLIC_INSTANCE:
return "PUBLIC_INSTANCE";
case NEWBIE_TELEPO_INQUIRY:
return "NEWBIE_TELEPO_INQUIRY";
case INSPECT:
return "INSPECT";
case MARKING:
return "MARKING";
case ACTIVE_TITLE:
return "ACTIVE_TITLE";
case TITLE_LIST:
return "TITLE_LIST";
case BORROW_ACTION:
return "BORROW_ACTION";
case RANDOM:
return "RANDOM";
case NAME:
return "NAME";
case SET_HOWTO:
return "SET_HOWTO";
case SET_CUTSCENE:
return "SET_CUTSCENE";
case PHYSICAL_BONUS:
return "PHYSICAL_BONUS";
case GROUND_MARKING:
return "GROUND_MARKING";
case CONTENTS_NOTE_REQUEST:
return "CONTENTS_NOTE_REQUEST";
case BAHAMUTGUIDE_AGREEMENT_CHECK_REPLY:
return "BAHAMUTGUIDE_AGREEMENT_CHECK_REPLY";
case SET_MARKET_PRICE:
return "SET_MARKET_PRICE";
case DEPOP_RETAINER:
return "DEPOP_RETAINER";
case MARKET_EDIT_START:
return "MARKET_EDIT_START";
case MARKET_EDIT_END:
return "MARKET_EDIT_END";
case MONSTER_NOTE_RANK_NEW_FLAG:
return "MONSTER_NOTE_RANK_NEW_FLAG";
case CHANGE_ITEM_COLOR:
return "CHANGE_ITEM_COLOR";
case LOAD_LEGACY_ITEM:
return "LOAD_LEGACY_ITEM";
case BRING_OUT_LEGACY_ITEM:
return "BRING_OUT_LEGACY_ITEM";
case FCCHEST_LOAD:
return "FCCHEST_LOAD";
case FCCHEST_LOCK:
return "FCCHEST_LOCK";
case FCCHEST_UNLOCK:
return "FCCHEST_UNLOCK";
case START_MATERIA_CRAFT:
return "START_MATERIA_CRAFT";
case PREPARE_MATERIA_CRAFT:
return "PREPARE_MATERIA_CRAFT";
case CANCEL_MATERIA_CRAFT:
return "CANCEL_MATERIA_CRAFT";
case ACCEPT_MATERIA_REQUEST:
return "ACCEPT_MATERIA_REQUEST";
case CANCEL_ATTACH_MATERIA_REQUEST:
return "CANCEL_ATTACH_MATERIA_REQUEST";
case CHECK_FOR_MATERIA_REQUEST:
return "CHECK_FOR_MATERIA_REQUEST";
case EXCHANGE_INACTIVE_MATERIA:
return "EXCHANGE_INACTIVE_MATERIA";
case DECAL_ITEM:
return "DECAL_ITEM";
case DECAL_MANNEQUIN:
return "DECAL_MANNEQUIN";
case DECAL_STORAGE_GROUP:
return "DECAL_STORAGE_GROUP";
case SELL_INACTIVE_MATERIA:
return "SELL_INACTIVE_MATERIA";
case MATERIA_REQUEST_CLASS_CHANGED:
return "MATERIA_REQUEST_CLASS_CHANGED";
case ITEM_RESYNC:
return "ITEM_RESYNC";
case FCCHEST_GIL_DEPOSIT:
return "FCCHEST_GIL_DEPOSIT";
case FCCHEST_GIL_TAKE:
return "FCCHEST_GIL_TAKE";
case FCCHEST_LOAD_LOG:
return "FCCHEST_LOAD_LOG";
case SET_VANITY_PATTERN:
return "SET_VANITY_PATTERN";
case REQUEST_RETAINER_LIST:
return "REQUEST_RETAINER_LIST";
case REMOVE_VANITY_PATTERN:
return "REMOVE_VANITY_PATTERN";
case CABINET_REQUEST:
return "CABINET_REQUEST";
case CABINET_STORAGE:
return "CABINET_STORAGE";
case CABINET_TAKEOUT:
return "CABINET_TAKEOUT";
case SALVAGE:
return "SALVAGE";
case REQUEST_SALVAGE_SUCCESS_RATE:
return "REQUEST_SALVAGE_SUCCESS_RATE";
case MOBHUNT_RECEIPT_ORDER:
return "MOBHUNT_RECEIPT_ORDER";
case MOBHUNT_BREAK_ORDER:
return "MOBHUNT_BREAK_ORDER";
case EMOTE:
return "EMOTE";
case EMOTE_WITH_WARP:
return "EMOTE_WITH_WARP";
case EMOTE_CANCEL:
return "EMOTE_CANCEL";
case EMOTE_MODE_CANCEL:
return "EMOTE_MODE_CANCEL";
case EMOTE_MODE_CANCEL_WITH_WARP:
return "EMOTE_MODE_CANCEL_WITH_WARP";
case POSE_EMOTE_CONFIG:
return "POSE_EMOTE_CONFIG";
case POSE_EMOTE_WORK:
return "POSE_EMOTE_WORK";
case POSE_EMOTE_CANCEL:
return "POSE_EMOTE_CANCEL";
case JUMP_START:
return "JUMP_START";
case JUMP_LANDING:
return "JUMP_LANDING";
case GIMMICK_JUMP_END:
return "GIMMICK_JUMP_END";
case START_CRAFT:
return "START_CRAFT";
case FISHING:
return "FISHING";
case PACKET_COMMOND_TRACKING:
return "PACKET_COMMOND_TRACKING";
case PACKET_COMMOND_JOURNAL_CONFIG:
return "PACKET_COMMOND_JOURNAL_CONFIG";
case GATHERING_NOTEBOOK_START:
return "GATHERING_NOTEBOOK_START";
case GATHERING_NOTEBOOK_DIVISION:
return "GATHERING_NOTEBOOK_DIVISION";
case GATHERING_NOTEBOOK_AREA:
return "GATHERING_NOTEBOOK_AREA";
case RECIPE_NOTEBOOK_START:
return "RECIPE_NOTEBOOK_START";
case RECIPE_NOTEBOOK_DIVISION:
return "RECIPE_NOTEBOOK_DIVISION";
case END_AUTO_CRAFT:
return "END_AUTO_CRAFT";
case CANCEL_QUEST:
return "CANCEL_QUEST";
case DIRECTOR_INIT_RETURN:
return "DIRECTOR_INIT_RETURN";
case CANCEL_GUILDLEVE:
return "CANCEL_GUILDLEVE";
case RETRY_GUILDLEVE:
return "RETRY_GUILDLEVE";
case START_GUILDLEVE:
return "START_GUILDLEVE";
case RETIRE_GUILDLEVE:
return "RETIRE_GUILDLEVE";
case CHANGE_GUILDLEVE_DIFFICULTY:
return "CHANGE_GUILDLEVE_DIFFICULTY";
case SYNC_DIRECTOR:
return "SYNC_DIRECTOR";
case EVENT_HANDLER:
return "EVENT_HANDLER";
case FATE_START:
return "FATE_START";
case FATE_INIT_RETURN:
return "FATE_INIT_RETURN";
case FATE_CREATE_CHARACTER_RETURN:
return "FATE_CREATE_CHARACTER_RETURN";
case FATE_SYNC_CONTEXT_WORK:
return "FATE_SYNC_CONTEXT_WORK";
case FATE_LEVEL_SYNC:
return "FATE_LEVEL_SYNC";
case FATE_INIT_CHARACTER_RETURN:
return "FATE_INIT_CHARACTER_RETURN";
case ACHIEVEMENT_REQUEST_RATE:
return "ACHIEVEMENT_REQUEST_RATE";
case ACHIEVEMENT_REQUEST:
return "ACHIEVEMENT_REQUEST";
case TROPHY_RECEPTION:
return "TROPHY_RECEPTION";
case TROPHY_ACQUISITION:
return "TROPHY_ACQUISITION";
case HOUSING_LOCK_LAND_BY_BUILD:
return "HOUSING_LOCK_LAND_BY_BUILD";
case HOUSING_LOCK_LAND_BY_EXTERIOR:
return "HOUSING_LOCK_LAND_BY_EXTERIOR";
case HOUSING_LOCK_LAND_BY_INTERIOR:
return "HOUSING_LOCK_LAND_BY_INTERIOR";
case HOUSING_LOCK_LAND_BY_BREAK:
return "HOUSING_LOCK_LAND_BY_BREAK";
case HOUSING_UNLOCK_HOUSE:
return "HOUSING_UNLOCK_HOUSE";
case HOUSING_AUCTION_INFO:
return "HOUSING_AUCTION_INFO";
case HOUSING_GET_PROFILE:
return "HOUSING_GET_PROFILE";
case HOUSING_GET_PROFILE_LIST:
return "HOUSING_GET_PROFILE_LIST";
case HOUSING_RELEASE:
return "HOUSING_RELEASE";
case HOUSING_BUILD:
return "HOUSING_BUILD";
case HOUSING_BREAK:
return "HOUSING_BREAK";
case HOUSING_LOAD_PARTS:
return "HOUSING_LOAD_PARTS";
case HOUSING_LOAD_ROOM:
return "HOUSING_LOAD_ROOM";
case HOUSING_LOAD_YARD:
return "HOUSING_LOAD_YARD";
case HOUSING_UNPLACE:
return "HOUSING_UNPLACE";
case HOUSING_HOUSE_NAME:
return "HOUSING_HOUSE_NAME";
case HOUSING_GREETING:
return "HOUSING_GREETING";
case HOUSING_GREETING_BY_ADDRESS:
return "HOUSING_GREETING_BY_ADDRESS";
case HOUSING_WELCOME:
return "HOUSING_WELCOME";
case HOUSING_LOAD_FURNITURE:
return "HOUSING_LOAD_FURNITURE";
case HOUSING_WARP_TO_SAFE:
return "HOUSING_WARP_TO_SAFE";
case HOUSING_LAYOUTMODE:
return "HOUSING_LAYOUTMODE";
case HOUSING_RELEASE_PERSONAL_ROOM:
return "HOUSING_RELEASE_PERSONAL_ROOM";
case HOUSING_GET_PERSONAL_ROOM_PROFILE_LIST:
return "HOUSING_GET_PERSONAL_ROOM_PROFILE_LIST";
case HOUSING_GET_PERSONAL_ROOM_PROFILE:
return "HOUSING_GET_PERSONAL_ROOM_PROFILE";
case HOUSING_GET_BUDDY_STABLE_LIST:
return "HOUSING_GET_BUDDY_STABLE_LIST";
case HOUSING_TRAIN_BUDDY:
return "HOUSING_TRAIN_BUDDY";
case HOUSING_FEED_BUDDY:
return "HOUSING_FEED_BUDDY";
case PVP_LEARN_ACTION:
return "PVP_LEARN_ACTION";
case PVP_LEARN_ACTION_TRAIT:
return "PVP_LEARN_ACTION_TRAIT";
case PVP_LEARN_TRAIT:
return "PVP_LEARN_TRAIT";
case PVP_ACTION:
return "PVP_ACTION";
case PVP_RESET_REWARD:
return "PVP_RESET_REWARD";
case DISCARD_TREASURE_MAP:
return "DISCARD_TREASURE_MAP";
case TREASURE_HUNT_GET_MAP_TIME:
return "TREASURE_HUNT_GET_MAP_TIME";
case SET_RETAINER_TASK:
return "SET_RETAINER_TASK";
case CANCEL_RETAINER_TASK:
return "CANCEL_RETAINER_TASK";
case SET_VENTURE_TUTORIAL_FLAGS:
return "SET_VENTURE_TUTORIAL_FLAGS";
case SET_RETAINER_FLAGS:
return "SET_RETAINER_FLAGS";
case RELIC_NOTE_CLEAR:
return "RELIC_NOTE_CLEAR";
case RELIC_GEM_ABSORB_MATERIA:
return "RELIC_GEM_ABSORB_MATERIA";
case REPAIR_ITEM:
return "REPAIR_ITEM";
case REPAIR_ITEM_NPC:
return "REPAIR_ITEM_NPC";
case REPAIR_STORAGE_GROUP:
return "REPAIR_STORAGE_GROUP";
case REPAIR_STORAGE_GROUP_NPC:
return "REPAIR_STORAGE_GROUP_NPC";
case REPAIR_MANNEQUIN:
return "REPAIR_MANNEQUIN";
case REPAIR_MANNEQUIN_NPC:
return "REPAIR_MANNEQUIN_NPC";
case BUDDY_ACTION:
return "BUDDY_ACTION";
case BUDDY_EQUIP:
return "BUDDY_EQUIP";
case BUDDY_INCREASE_SKILL_LINE:
return "BUDDY_INCREASE_SKILL_LINE";
case PET_COMMAND:
return "PET_COMMAND";
case SCREEN_SHOT:
return "SCREEN_SHOT";
default:
return "UNKNOWN";
}
}
void examineHandler( Sapphire::Entity::Player& player, uint32_t targetId ) void examineHandler( Sapphire::Entity::Player& player, uint32_t targetId )
{ {
using namespace Sapphire; using namespace Sapphire;
@ -72,8 +409,8 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
const auto param3 = packet.data().Target; const auto param3 = packet.data().Target;
Logger::debug( "[{0}] Incoming Packet Command: {1:X} ( p1:{2:X} p2:{3:X} p3:{4:X} )", Logger::debug( "\t\t {5} | {1:X} ( p1:{2:X} p2:{3:X} p3:{4:X} )",
m_pSession->getId(), commandId, param1, param2, param3 ); m_pSession->getId(), commandId, param1, param2, param3, packetCommandToString( commandId ) );
//Logger::Log(LoggingSeverity::debug, "[" + std::to_string(m_pSession->getId()) + "] " + pInPacket->toString()); //Logger::Log(LoggingSeverity::debug, "[" + std::to_string(m_pSession->getId()) + "] " + pInPacket->toString());
@ -121,7 +458,7 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
} }
case PacketCommand::COMPANION: case PacketCommand::COMPANION:
{ {
player.setCompanion( static_cast< uint16_t >( param1 ) ); player.setCompanion( static_cast< uint8_t >( param1 ) );
break; break;
} }
case PacketCommand::REQUEST_STATUS_RESET: // Remove status (clicking it off) case PacketCommand::REQUEST_STATUS_RESET: // Remove status (clicking it off)
@ -480,7 +817,7 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
default: default:
{ {
Logger::debug( "[{0}] Unhandled action: {1:04X}", m_pSession->getId(), commandId ); Logger::debug( "[{0}] Unhandled Command: {1:04X}", m_pSession->getId(), commandId );
break; break;
} }
} }

View file

@ -0,0 +1,41 @@
#include "RemoveBNpcTask.h"
#include <Logging/Logger.h>
#include <Actor/BNpc.h>
#include <Manager/TerritoryMgr.h>
#include <Service.h>
#include <Territory/Territory.h>
#include <utility>
using namespace Sapphire::World;
RemoveBNpcTask::RemoveBNpcTask( uint64_t delayTime, Entity::BNpcPtr bnpc ) :
Task( delayTime ),
m_pBNpc( std::move( bnpc ) )
{
}
void RemoveBNpcTask::onQueue()
{
Logger::debug( { __FUNCTION__ } );
}
void RemoveBNpcTask::execute()
{
auto teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref();
auto pZone = teriMgr.getTerritoryByGuId( m_pBNpc->getTerritoryId() );
if( !pZone )
return;
pZone->removeActor( m_pBNpc );
}
std::string RemoveBNpcTask::toString()
{
return fmt::format( "RemoveBNpcTask: BNpc#{}, TerritoryId#{}, ElapsedTimeMs: {}", m_pBNpc->getId(), m_pBNpc->getTerritoryId(), getDelayTimeMs() );
}

View file

@ -0,0 +1,23 @@
#pragma once
#include <cstdint>
#include <string>
#include <ForwardsZone.h>
#include "Task.h"
namespace Sapphire::World
{
class RemoveBNpcTask : public Task
{
public:
RemoveBNpcTask( uint64_t delayTime, Entity::BNpcPtr bnpc );
void onQueue() override;
void execute() override;
std::string toString() override;
private:
Entity::BNpcPtr m_pBNpc;
};
}

View file

@ -417,21 +417,6 @@ void Sapphire::Territory::updateBNpcs( uint64_t tickCount )
m_lastMobUpdate = tickCount; m_lastMobUpdate = tickCount;
uint64_t currTime = Common::Util::getTimeSeconds(); uint64_t currTime = Common::Util::getTimeSeconds();
for( const auto& entry : m_bNpcMap )
{
Entity::BNpcPtr pBNpc = entry.second;
if( !pBNpc )
continue;
if( !pBNpc->isAlive() )
if( currTime - pBNpc->getTimeOfDeath() > 10 )
{
removeActor( pBNpc );
break;
}
}
// Update loop may move actors from cell to cell, breaking iterator validity // Update loop may move actors from cell to cell, breaking iterator validity
std::vector< Entity::BNpcPtr > activeBNpc; std::vector< Entity::BNpcPtr > activeBNpc;

View file

@ -263,10 +263,6 @@ void WorldServer::run( int32_t argc, char* argv[] )
Logger::info( "World server running on {0}:{1}", m_ip, m_port ); Logger::info( "World server running on {0}:{1}", m_ip, m_port );
taskMgr->queueTask( std::make_shared< Sapphire::World::TestTask >( 10000 ) );
taskMgr->queueTask( std::make_shared< Sapphire::World::TestTask >( 5000 ) );
taskMgr->queueTask( std::make_shared< Sapphire::World::TestTask >( 2000 ) );
mainLoop(); mainLoop();
for( auto& thread_entry : thread_list ) for( auto& thread_entry : thread_list )