mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-25 11:07:45 +00:00
Merge branch 'master' into work
This commit is contained in:
commit
84c9b3b39c
96 changed files with 2389 additions and 2369 deletions
|
@ -22,7 +22,7 @@ When making a PR, please make sure that it follows our style guidelines and good
|
||||||
|
|
||||||
### Coding style
|
### Coding style
|
||||||
|
|
||||||
Indentations are Allman-style based, 4-space, no tabs.
|
Indentations are Allman-style based, 3-space, no tabs.
|
||||||
Space between arguments in function calls, as well as for types.
|
Space between arguments in function calls, as well as for types.
|
||||||
|
|
||||||
Example (shortened from ActionHandler.cpp):
|
Example (shortened from ActionHandler.cpp):
|
||||||
|
@ -30,34 +30,34 @@ Example (shortened from ActionHandler.cpp):
|
||||||
```cpp
|
```cpp
|
||||||
switch( commandId )
|
switch( commandId )
|
||||||
{
|
{
|
||||||
case 0x01: // Toggle sheathe
|
case 0x01: // Toggle sheathe
|
||||||
{
|
{
|
||||||
if ( param11 == 1 )
|
if ( param11 == 1 )
|
||||||
pPlayer->setStance( Entity::Actor::Stance::Active );
|
pPlayer->setStance( Entity::Actor::Stance::Active );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pPlayer->setStance( Entity::Actor::Stance::Passive );
|
pPlayer->setStance( Entity::Actor::Stance::Passive );
|
||||||
pPlayer->setAutoattack( false );
|
pPlayer->setAutoattack( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), 0, param11, 1 ) );
|
pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), 0, param11, 1 ) );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x03: // Change target
|
case 0x03: // Change target
|
||||||
{
|
{
|
||||||
uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 );
|
uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 );
|
||||||
pPlayer->changeTarget( targetId );
|
pPlayer->changeTarget( targetId );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Feature implementation
|
### Feature implementation
|
||||||
|
|
||||||
Please make sure edge cases have been tested, behavior is aligned with retail and (if applicable) your queries make sense.
|
Please make sure edge cases have been tested, behavior is aligned with retail and (if applicable) your queries make sense.
|
||||||
Any changes to the SQL base should be noted (and reflected in the update.sql file in rootDirectory/sql).
|
Any changes to the SQL base should be noted (and reflected in the update.sql file in rootDirectory/sql).
|
||||||
|
|
|
@ -3,15 +3,16 @@
|
||||||
<!-- Port the lobby server accepts client connections on -->
|
<!-- Port the lobby server accepts client connections on -->
|
||||||
<ListenPort>54994</ListenPort>
|
<ListenPort>54994</ListenPort>
|
||||||
<AuthPort>54998</AuthPort>
|
<AuthPort>54998</AuthPort>
|
||||||
<!-- Ip the lobby server listens on -->
|
<!-- Ip the lobby server listens on -->
|
||||||
<ListenIp>127.0.0.1</ListenIp>
|
<ListenIp>127.0.0.1</ListenIp>
|
||||||
<!-- Path of FFXIV dat files -->
|
<!-- Path of FFXIV dat files -->
|
||||||
<DataPath>C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv</DataPath>
|
<DataPath>C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv</DataPath>
|
||||||
|
<!-- <DataPath>/opt/sapphire_3_15_0/bin/sqpack</DataPath> -->
|
||||||
<!-- IP of the lobby server -->
|
<!-- IP of the lobby server -->
|
||||||
<LobbyHost>127.0.0.1</LobbyHost>
|
<LobbyHost>127.0.0.1</LobbyHost>
|
||||||
<!-- IP of the frontier server -->
|
<!-- IP of the frontier server -->
|
||||||
<FrontierHost>127.0.0.1</FrontierHost>
|
<FrontierHost>127.0.0.1</FrontierHost>
|
||||||
<!-- Secret used for server auth - you *must* change this for public servers -->
|
<!-- Secret used for server auth - you *must* change this for public servers -->
|
||||||
<ServerSecret>default</ServerSecret>
|
<ServerSecret>default</ServerSecret>
|
||||||
<!-- Web server port -->
|
<!-- Web server port -->
|
||||||
<HttpPort>80</HttpPort>
|
<HttpPort>80</HttpPort>
|
||||||
|
@ -28,4 +29,4 @@
|
||||||
<!-- GM Rank for newly created characters - should be changed to 0 for public servers -->
|
<!-- GM Rank for newly created characters - should be changed to 0 for public servers -->
|
||||||
<DefaultGMRank>255</DefaultGMRank>
|
<DefaultGMRank>255</DefaultGMRank>
|
||||||
</Parameters>
|
</Parameters>
|
||||||
</Settings>
|
</Settings>
|
||||||
|
|
|
@ -64,7 +64,6 @@ CREATE TABLE `charainfo` (
|
||||||
`HowTo` binary(33) DEFAULT NULL,
|
`HowTo` binary(33) DEFAULT NULL,
|
||||||
`Minions` binary(33) DEFAULT NULL,
|
`Minions` binary(33) DEFAULT NULL,
|
||||||
`Mounts` binary(13) DEFAULT NULL,
|
`Mounts` binary(13) DEFAULT NULL,
|
||||||
`Orchestrion` binary(38) DEFAULT NULL,
|
|
||||||
`EquippedMannequin` int(5) DEFAULT '0',
|
`EquippedMannequin` int(5) DEFAULT '0',
|
||||||
`ConfigFlags` smallint(5) NOT NULL DEFAULT '0',
|
`ConfigFlags` smallint(5) NOT NULL DEFAULT '0',
|
||||||
`QuestCompleteFlags` binary(200) DEFAULT NULL,
|
`QuestCompleteFlags` binary(200) DEFAULT NULL,
|
||||||
|
@ -76,7 +75,7 @@ CREATE TABLE `charainfo` (
|
||||||
`GMRank` int(3) DEFAULT '0',
|
`GMRank` int(3) DEFAULT '0',
|
||||||
`Unlocks` binary(64) DEFAULT NULL,
|
`Unlocks` binary(64) DEFAULT NULL,
|
||||||
`CFPenaltyUntil` int(11) DEFAULT NULL,
|
`CFPenaltyUntil` int(11) DEFAULT NULL,
|
||||||
`UPDATE_DATE` datetime DEFAULT NULL,
|
`UPDATE_DATE` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (`CharacterId`)
|
PRIMARY KEY (`CharacterId`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
|
|
@ -32,13 +32,13 @@ FOR %%X IN (*.sql) DO (
|
||||||
REM handle update.sql last
|
REM handle update.sql last
|
||||||
) ELSE (
|
) ELSE (
|
||||||
ECHO Importing %%X
|
ECHO Importing %%X
|
||||||
%PATH_MYSQL% %DBNAME% -h %DBADDRESS% -u %USER% < %%X
|
%PATH_MYSQL% %DBNAME% -h %DBADDRESS% -u %USER% %PASSWORD% < %%X
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
IF EXIST "update.sql" (
|
IF EXIST "update.sql" (
|
||||||
ECHO Importing update.sql
|
ECHO Importing update.sql
|
||||||
%PATH_MYSQL% %DBNAME% -h %DBADDRESS% -u %USER% < update.sql
|
%PATH_MYSQL% %DBNAME% -h %DBADDRESS% -u %USER% %PASSWORD% < update.sql
|
||||||
)
|
)
|
||||||
|
|
||||||
ECHO Finished!
|
ECHO Finished!
|
||||||
|
|
|
@ -38,4 +38,7 @@ ALTER TABLE infolinkshell
|
||||||
MODIFY COLUMN UPDATE_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
|
MODIFY COLUMN UPDATE_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
|
||||||
|
|
||||||
ALTER TABLE uniqueiddata
|
ALTER TABLE uniqueiddata
|
||||||
MODIFY COLUMN UPDATE_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
|
MODIFY COLUMN UPDATE_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
|
||||||
|
|
||||||
|
ALTER TABLE charainfo
|
||||||
|
ADD `Orchestrion` binary(38) DEFAULT NULL AFTER `Mounts`;
|
||||||
|
|
|
@ -45,31 +45,37 @@ public:
|
||||||
template<class T>
|
template<class T>
|
||||||
T getValAt( uint16_t pos ) const
|
T getValAt( uint16_t pos ) const
|
||||||
{
|
{
|
||||||
assert(m_segHdr.size > pos);
|
assert( m_segHdr.size > pos );
|
||||||
return *reinterpret_cast< const T* >( &m_dataBuf[0] + pos );
|
return *reinterpret_cast< const T* >( &m_dataBuf[0] + pos );
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBytesAt( uint16_t offset, uint8_t * bytes, uint16_t length )
|
void setBytesAt( uint16_t offset, uint8_t * bytes, uint16_t length )
|
||||||
{
|
{
|
||||||
assert(m_segHdr.size > offset);
|
assert( m_segHdr.size > offset );
|
||||||
memcpy( reinterpret_cast< uint8_t* >( &m_dataBuf[0] + offset ), bytes, length );
|
memcpy( reinterpret_cast< uint8_t* >( &m_dataBuf[0] + offset ), bytes, length );
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * getStringAt( uint16_t pos ) const
|
const char * getStringAt( uint16_t pos ) const
|
||||||
{
|
{
|
||||||
assert(m_segHdr.size > pos);
|
assert( m_segHdr.size > pos );
|
||||||
return reinterpret_cast< const char* >( &m_dataBuf[0] + pos );
|
return reinterpret_cast< const char* >( &m_dataBuf[0] + pos );
|
||||||
}
|
}
|
||||||
|
|
||||||
void setStringAt( uint16_t pos, const std::string& str )
|
void setStringAt( uint16_t pos, const std::string& str )
|
||||||
{
|
{
|
||||||
assert(m_segHdr.size > pos);
|
assert( m_segHdr.size > pos );
|
||||||
memcpy( reinterpret_cast< uint8_t* >( &m_dataBuf[0] + pos ), str.c_str(), str.length() );
|
memcpy( reinterpret_cast< uint8_t* >( &m_dataBuf[0] + pos ), str.c_str(), str.length() );
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t * getData()
|
const uint8_t * getData() const
|
||||||
{
|
{
|
||||||
return reinterpret_cast< uint8_t* >( &m_dataBuf[0] );
|
return reinterpret_cast< const uint8_t* >( &m_dataBuf[0] );
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint8_t * getDataAt(uint16_t pos) const
|
||||||
|
{
|
||||||
|
assert( m_segHdr.size > pos );
|
||||||
|
return reinterpret_cast< const uint8_t* >( &m_dataBuf[0] + pos );
|
||||||
}
|
}
|
||||||
|
|
||||||
void setHeader( uint16_t size, uint16_t type, uint32_t id1, uint32_t id2, uint16_t subType, uint32_t unknown = 0xFED2E000 );
|
void setHeader( uint16_t size, uint16_t type, uint32_t id1, uint32_t id2, uint16_t subType, uint32_t unknown = 0xFED2E000 );
|
||||||
|
|
|
@ -815,7 +815,7 @@ struct FFXIVIpcPlayerStats : FFXIVIpcBasePacket<PlayerStats>
|
||||||
uint32_t unknown;
|
uint32_t unknown;
|
||||||
uint32_t unknown_1;
|
uint32_t unknown_1;
|
||||||
uint32_t unknown_2;
|
uint32_t unknown_2;
|
||||||
uint32_t parry;
|
uint32_t tenacity;
|
||||||
uint32_t attack;
|
uint32_t attack;
|
||||||
uint32_t defense;
|
uint32_t defense;
|
||||||
uint32_t accuracy;
|
uint32_t accuracy;
|
||||||
|
@ -837,7 +837,11 @@ struct FFXIVIpcPlayerStats : FFXIVIpcBasePacket<PlayerStats>
|
||||||
uint32_t skillSpeed;
|
uint32_t skillSpeed;
|
||||||
uint32_t spellSpeed1;
|
uint32_t spellSpeed1;
|
||||||
uint32_t spellSpeedMod;
|
uint32_t spellSpeedMod;
|
||||||
uint32_t unknown_6[5];
|
uint32_t unknown_6;
|
||||||
|
uint32_t craftsmanship;
|
||||||
|
uint32_t control;
|
||||||
|
uint32_t gathering;
|
||||||
|
uint32_t perception;
|
||||||
uint32_t resistanceSlow;
|
uint32_t resistanceSlow;
|
||||||
uint32_t resistanceSilence;
|
uint32_t resistanceSilence;
|
||||||
uint32_t resistanceBlind;
|
uint32_t resistanceBlind;
|
||||||
|
@ -846,7 +850,7 @@ struct FFXIVIpcPlayerStats : FFXIVIpcBasePacket<PlayerStats>
|
||||||
uint32_t resistanceSleep;
|
uint32_t resistanceSleep;
|
||||||
uint32_t resistanceBind;
|
uint32_t resistanceBind;
|
||||||
uint32_t resistanceHeavy;
|
uint32_t resistanceHeavy;
|
||||||
uint32_t unknown_7[9];
|
uint32_t unknown_7[9]; // possibly level sync stats.
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -881,10 +885,11 @@ struct FFXIVIpcPlayerStateFlags : FFXIVIpcBasePacket<PlayerStateFlags>
|
||||||
struct FFXIVIpcPlayerClassInfo : FFXIVIpcBasePacket<PlayerClassInfo>
|
struct FFXIVIpcPlayerClassInfo : FFXIVIpcBasePacket<PlayerClassInfo>
|
||||||
{
|
{
|
||||||
uint16_t classId;
|
uint16_t classId;
|
||||||
uint16_t unknown;
|
uint8_t unknown;
|
||||||
uint16_t level;
|
uint8_t isSpecialist;
|
||||||
uint16_t level1;
|
uint16_t level; // Locks actions, equipment, prob more
|
||||||
uint8_t unknownFields[48];
|
uint16_t level1; // Locks roles, prob more
|
||||||
|
uint32_t roleActions[10];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -200,7 +200,7 @@ void Core::Network::SapphireAPI::deleteCharacter( std::string name, uint32_t acc
|
||||||
g_charaDb.execute( "DELETE FROM charaitemcrystal WHERE CharacterId LIKE '" + std::to_string( id ) + "';" );
|
g_charaDb.execute( "DELETE FROM charaitemcrystal WHERE CharacterId LIKE '" + std::to_string( id ) + "';" );
|
||||||
g_charaDb.execute( "DELETE FROM charaiteminventory WHERE CharacterId LIKE '" + std::to_string( id ) + "';" );
|
g_charaDb.execute( "DELETE FROM charaiteminventory WHERE CharacterId LIKE '" + std::to_string( id ) + "';" );
|
||||||
g_charaDb.execute( "DELETE FROM charaitemgearset WHERE CharacterId LIKE '" + std::to_string( id ) + "';" );
|
g_charaDb.execute( "DELETE FROM charaitemgearset WHERE CharacterId LIKE '" + std::to_string( id ) + "';" );
|
||||||
g_charaDb.execute( "DELETE FROM charaquest WHERE CharacterId LIKE '" + std::to_string( id ) + "';" );
|
g_charaDb.execute( "DELETE FROM charaquestnew WHERE CharacterId LIKE '" + std::to_string( id ) + "';" );
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector< Core::PlayerMinimal > Core::Network::SapphireAPI::getCharList( uint32_t accountId )
|
std::vector< Core::PlayerMinimal > Core::Network::SapphireAPI::getCharList( uint32_t accountId )
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
||||||
#include "Action.h"
|
#include "Action.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
|
|
||||||
|
|
||||||
Core::Action::Action::Action()
|
Core::Action::Action::Action()
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef _ACTION_H_
|
#ifndef _ACTION_H_
|
||||||
#define _ACTION_H_
|
#define _ACTION_H_
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "../Forwards.h"
|
||||||
|
|
||||||
namespace Core { namespace Action {
|
namespace Core { namespace Action {
|
||||||
|
|
||||||
|
@ -57,4 +57,4 @@ namespace Core { namespace Action {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
#include "ActionCast.h"
|
#include "ActionCast.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Script/ScriptManager.h"
|
||||||
|
|
||||||
using namespace Core::Common;
|
using namespace Core::Common;
|
||||||
using namespace Core::Network;
|
using namespace Core::Network;
|
||||||
|
@ -52,7 +52,8 @@ void Core::Action::ActionCast::onStart()
|
||||||
castPacket.data().action_id = m_id;
|
castPacket.data().action_id = m_id;
|
||||||
castPacket.data().skillType = Common::SkillType::Normal;
|
castPacket.data().skillType = Common::SkillType::Normal;
|
||||||
castPacket.data().unknown_1 = m_id;
|
castPacket.data().unknown_1 = m_id;
|
||||||
castPacket.data().cast_time = static_cast< float >( m_castTime / 1000 ); // This is used for the cast bar above the target bar of the caster.
|
// This is used for the cast bar above the target bar of the caster.
|
||||||
|
castPacket.data().cast_time = static_cast< float >( m_castTime / 1000 );
|
||||||
castPacket.data().target_id = m_pTarget->getId();
|
castPacket.data().target_id = m_pTarget->getId();
|
||||||
|
|
||||||
m_pSource->sendToInRangeSet( castPacket, true );
|
m_pSource->sendToInRangeSet( castPacket, true );
|
||||||
|
@ -73,10 +74,10 @@ void Core::Action::ActionCast::onFinish()
|
||||||
pPlayer->sendStateFlags();
|
pPlayer->sendStateFlags();
|
||||||
|
|
||||||
/*auto control = ActorControlPacket143( m_pTarget->getId(), ActorControlType::Unk7,
|
/*auto control = ActorControlPacket143( m_pTarget->getId(), ActorControlType::Unk7,
|
||||||
0x219, m_id, m_id, m_id, m_id );
|
0x219, m_id, m_id, m_id, m_id );
|
||||||
m_pSource->sendToInRangeSet( control, true );*/
|
m_pSource->sendToInRangeSet( control, true );*/
|
||||||
|
|
||||||
g_scriptMgr.onCastFinish( pPlayer, m_pTarget, m_id );
|
g_scriptMgr.onCastFinish( *pPlayer, m_pTarget, m_id );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Action::ActionCast::onInterrupt()
|
void Core::Action::ActionCast::onInterrupt()
|
||||||
|
@ -89,7 +90,7 @@ void Core::Action::ActionCast::onInterrupt()
|
||||||
m_pSource->getAsPlayer()->sendStateFlags();
|
m_pSource->getAsPlayer()->sendStateFlags();
|
||||||
|
|
||||||
auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt,
|
auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt,
|
||||||
0x219, 1, m_id, 0 );
|
0x219, 1, m_id, 0 );
|
||||||
|
|
||||||
// Note: When cast interrupt from taking too much damage, set the last value to 1. This enables the cast interrupt effect. Example:
|
// Note: When cast interrupt from taking too much damage, set the last value to 1. This enables the cast interrupt effect. Example:
|
||||||
// auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, 0x219, 1, m_id, 0 );
|
// auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, 0x219, 1, m_id, 0 );
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
#ifndef _ACTIONCAST_H_
|
#ifndef _ACTIONCAST_H_
|
||||||
#define _ACTIONCAST_H_
|
#define _ACTIONCAST_H_
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "../Forwards.h"
|
||||||
#include "Action.h"
|
#include "Action.h"
|
||||||
|
|
||||||
namespace Core { namespace Action {
|
namespace Core {
|
||||||
|
namespace Action {
|
||||||
|
|
||||||
class ActionCast : public Action
|
class ActionCast : public Action
|
||||||
{
|
{
|
||||||
|
@ -25,4 +26,4 @@ namespace Core { namespace Action {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
|
|
||||||
#include "ActionCollision.h"
|
#include "ActionCollision.h"
|
||||||
#include <src/servers/Server_Zone/Actor/Actor.h>
|
#include "Actor/Actor.h"
|
||||||
#include <src/servers/Server_Zone/Actor/Player.h>
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <boost/make_shared.hpp>
|
#include <boost/make_shared.hpp>
|
||||||
|
|
||||||
|
@ -16,7 +17,7 @@ using namespace Core::Common;
|
||||||
bool ActionCollision::isActorApplicable( ActorPtr actorPtr, TargetFilter targetFilter )
|
bool ActionCollision::isActorApplicable( ActorPtr actorPtr, TargetFilter targetFilter )
|
||||||
{
|
{
|
||||||
bool actorApplicable = false;
|
bool actorApplicable = false;
|
||||||
switch ( targetFilter )
|
switch( targetFilter )
|
||||||
{
|
{
|
||||||
case TargetFilter::All:
|
case TargetFilter::All:
|
||||||
{
|
{
|
||||||
|
@ -57,14 +58,14 @@ std::set< Core::Entity::ActorPtr > ActionCollision::getActorsHitFromAction( FFXI
|
||||||
{
|
{
|
||||||
std::set< ActorPtr > actorsCollided;
|
std::set< ActorPtr > actorsCollided;
|
||||||
|
|
||||||
switch ( static_cast< ActionCollisionType >( actionInfo->aoe_type ) )
|
switch( static_cast< ActionCollisionType >( actionInfo->aoe_type ) )
|
||||||
{
|
{
|
||||||
case ActionCollisionType::None:
|
case ActionCollisionType::None:
|
||||||
case ActionCollisionType::SingleTarget:
|
case ActionCollisionType::SingleTarget:
|
||||||
{
|
{
|
||||||
// This is actually needed. There is "splash damage" in actions marked as single target.
|
// This is actually needed. There is "splash damage" in actions marked as single target.
|
||||||
// Notice how we're using aoe_width. How collision works for SingleTarget is unknown as of now.
|
// Notice how we're using aoe_width. How collision works for SingleTarget is unknown as of now.
|
||||||
for ( auto pActor : actorsInRange )
|
for( auto pActor : actorsInRange )
|
||||||
{
|
{
|
||||||
// Make sure actor exists. If it doesn't we done goofed.
|
// Make sure actor exists. If it doesn't we done goofed.
|
||||||
assert( pActor );
|
assert( pActor );
|
||||||
|
@ -84,7 +85,7 @@ std::set< Core::Entity::ActorPtr > ActionCollision::getActorsHitFromAction( FFXI
|
||||||
}
|
}
|
||||||
case ActionCollisionType::Circle:
|
case ActionCollisionType::Circle:
|
||||||
{
|
{
|
||||||
for ( auto pActor : actorsInRange )
|
for( auto pActor : actorsInRange )
|
||||||
{
|
{
|
||||||
assert( pActor );
|
assert( pActor );
|
||||||
|
|
||||||
|
@ -92,15 +93,13 @@ std::set< Core::Entity::ActorPtr > ActionCollision::getActorsHitFromAction( FFXI
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ( radiusCollision( pActor->getPos(), aoePosition, actionInfo->aoe_range ) )
|
if ( radiusCollision( pActor->getPos(), aoePosition, actionInfo->aoe_range ) )
|
||||||
{
|
|
||||||
actorsCollided.insert( pActor );
|
actorsCollided.insert( pActor );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ActionCollisionType::Box:
|
case ActionCollisionType::Box:
|
||||||
{
|
{
|
||||||
for ( auto pActor : actorsInRange )
|
for( auto pActor : actorsInRange )
|
||||||
{
|
{
|
||||||
assert( pActor );
|
assert( pActor );
|
||||||
|
|
||||||
|
@ -137,4 +136,4 @@ bool ActionCollision::boxCollision( FFXIVARR_POSITION3 actorPosition, FFXIVARR_P
|
||||||
actorPosition.x > aoePosition.x &&
|
actorPosition.x > aoePosition.x &&
|
||||||
actorPosition.y < aoePosition.y + height &&
|
actorPosition.y < aoePosition.y + height &&
|
||||||
actorPosition.y > aoePosition.y;
|
actorPosition.y > aoePosition.y;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,43 +1,43 @@
|
||||||
#ifndef _ACTIONCOLLISION_H
|
#ifndef _ACTIONCOLLISION_H
|
||||||
#define _ACTIONCOLLISION_H
|
#define _ACTIONCOLLISION_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
|
||||||
#include <src/servers/Server_Zone/Actor/Actor.h>
|
#include "Actor/Actor.h"
|
||||||
#include "Action.h"
|
#include "Action.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Entity {
|
namespace Entity {
|
||||||
|
|
||||||
enum class TargetFilter
|
enum class TargetFilter
|
||||||
{
|
{
|
||||||
All, // All actors in the AoE are applicable for collision
|
All, // All actors in the AoE are applicable for collision
|
||||||
Players, // Only players
|
Players, // Only players
|
||||||
Allies, // Only allies (players, ally NPCs)
|
Allies, // Only allies (players, ally NPCs)
|
||||||
Party, // Only party members
|
Party, // Only party members
|
||||||
Enemies // Only enemies
|
Enemies // Only enemies
|
||||||
};
|
};
|
||||||
|
|
||||||
class ActionCollision
|
class ActionCollision
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static bool isActorApplicable( ActorPtr actorPtr, TargetFilter targetFilter );
|
static bool isActorApplicable( ActorPtr actorPtr, TargetFilter targetFilter );
|
||||||
static std::set< ActorPtr > getActorsHitFromAction( Common::FFXIVARR_POSITION3 aoePosition,
|
static std::set< ActorPtr > getActorsHitFromAction( Common::FFXIVARR_POSITION3 aoePosition,
|
||||||
std::set< ActorPtr > actorsInRange,
|
std::set< ActorPtr > actorsInRange,
|
||||||
boost::shared_ptr< Data::ActionInfo > actionInfo,
|
boost::shared_ptr< Data::ActionInfo > actionInfo,
|
||||||
TargetFilter targetFilter );
|
TargetFilter targetFilter );
|
||||||
|
|
||||||
private:
|
|
||||||
static bool radiusCollision( Common::FFXIVARR_POSITION3 actorPosition, Common::FFXIVARR_POSITION3 aoePosition,
|
|
||||||
uint16_t radius );
|
|
||||||
|
|
||||||
static bool boxCollision( Common::FFXIVARR_POSITION3 actorPosition, Common::FFXIVARR_POSITION3 aoePosition,
|
private:
|
||||||
uint16_t width, uint16_t height );
|
static bool radiusCollision( Common::FFXIVARR_POSITION3 actorPosition, Common::FFXIVARR_POSITION3 aoePosition,
|
||||||
|
uint16_t radius );
|
||||||
};
|
|
||||||
|
|
||||||
}
|
static bool boxCollision( Common::FFXIVARR_POSITION3 actorPosition, Common::FFXIVARR_POSITION3 aoePosition,
|
||||||
|
uint16_t width, uint16_t height );
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
#include "ActionMount.h"
|
#include "ActionMount.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Script/ScriptManager.h"
|
||||||
|
|
||||||
using namespace Core::Common;
|
using namespace Core::Common;
|
||||||
using namespace Core::Network;
|
using namespace Core::Network;
|
||||||
|
@ -23,7 +23,7 @@ extern Core::Scripting::ScriptManager g_scriptMgr;
|
||||||
|
|
||||||
Core::Action::ActionMount::ActionMount()
|
Core::Action::ActionMount::ActionMount()
|
||||||
{
|
{
|
||||||
m_handleActionType = Common::HandleActionType::Event;
|
m_handleActionType = HandleActionType::Event;
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Action::ActionMount::ActionMount( Entity::ActorPtr pActor, uint16_t mountId )
|
Core::Action::ActionMount::ActionMount( Entity::ActorPtr pActor, uint16_t mountId )
|
||||||
|
@ -75,19 +75,20 @@ void Core::Action::ActionMount::onFinish()
|
||||||
pPlayer->unsetStateFlag( PlayerStateFlag::Casting );
|
pPlayer->unsetStateFlag( PlayerStateFlag::Casting );
|
||||||
pPlayer->sendStateFlags();
|
pPlayer->sendStateFlags();
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcEffect > effectPacket(pPlayer->getId());
|
ZoneChannelPacket< FFXIVIpcEffect > effectPacket( pPlayer->getId() );
|
||||||
effectPacket.data().targetId = pPlayer->getId();
|
effectPacket.data().targetId = pPlayer->getId();
|
||||||
effectPacket.data().actionAnimationId = m_id;
|
effectPacket.data().actionAnimationId = m_id;
|
||||||
effectPacket.data().unknown_62 = 13; // Affects displaying action name next to number in floating text
|
// Affects displaying action name next to number in floating text
|
||||||
|
effectPacket.data().unknown_62 = 13;
|
||||||
effectPacket.data().actionTextId = 4;
|
effectPacket.data().actionTextId = 4;
|
||||||
effectPacket.data().numEffects = 1;
|
effectPacket.data().numEffects = 1;
|
||||||
effectPacket.data().rotation = Math::Util::floatToUInt16Rot(pPlayer->getRotation());
|
effectPacket.data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRotation() );
|
||||||
effectPacket.data().effectTarget = INVALID_GAME_OBJECT_ID;
|
effectPacket.data().effectTarget = INVALID_GAME_OBJECT_ID;
|
||||||
effectPacket.data().effects[0].effectType = ActionEffectType::Mount;
|
effectPacket.data().effects[0].effectType = ActionEffectType::Mount;
|
||||||
effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage;
|
effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage;
|
||||||
effectPacket.data().effects[0].value = m_id;
|
effectPacket.data().effects[0].value = m_id;
|
||||||
|
|
||||||
pPlayer->sendToInRangeSet(effectPacket, true);
|
pPlayer->sendToInRangeSet( effectPacket, true );
|
||||||
|
|
||||||
pPlayer->mount( m_id );
|
pPlayer->mount( m_id );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
#ifndef _ACTIONMOUNT_H_
|
#ifndef _ACTIONMOUNT_H_
|
||||||
#define _ACTIONMOUNT_H_
|
#define _ACTIONMOUNT_H_
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "../Forwards.h"
|
||||||
#include "Action.h"
|
#include "Action.h"
|
||||||
|
|
||||||
namespace Core { namespace Action {
|
namespace Core {
|
||||||
|
namespace Action {
|
||||||
|
|
||||||
class ActionMount : public Action
|
class ActionMount : public Action
|
||||||
{
|
{
|
||||||
|
@ -25,4 +26,4 @@ namespace Core { namespace Action {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
#include "ActionTeleport.h"
|
#include "ActionTeleport.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
using namespace Core::Common;
|
using namespace Core::Common;
|
||||||
using namespace Core::Network;
|
using namespace Core::Network;
|
||||||
|
@ -18,7 +18,7 @@ extern Core::Logger g_log;
|
||||||
|
|
||||||
Core::Action::ActionTeleport::ActionTeleport()
|
Core::Action::ActionTeleport::ActionTeleport()
|
||||||
{
|
{
|
||||||
m_handleActionType = Common::HandleActionType::Event;
|
m_handleActionType = HandleActionType::Event;
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Action::ActionTeleport::ActionTeleport( Entity::ActorPtr pActor, uint16_t targetZone, uint16_t cost )
|
Core::Action::ActionTeleport::ActionTeleport( Entity::ActorPtr pActor, uint16_t targetZone, uint16_t cost )
|
||||||
|
@ -81,7 +81,7 @@ void Core::Action::ActionTeleport::onFinish()
|
||||||
//auto control = Network::Packets::Server::ActorControlPacket142( m_pSource->getId(), Common::ActorControlType::TeleportDone );
|
//auto control = Network::Packets::Server::ActorControlPacket142( m_pSource->getId(), Common::ActorControlType::TeleportDone );
|
||||||
//m_pSource->sendToInRangeSet( control, false );
|
//m_pSource->sendToInRangeSet( control, false );
|
||||||
|
|
||||||
pPlayer->setZoningType( Common::ZoneingType::Teleport );
|
pPlayer->setZoningType( ZoneingType::Teleport );
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcEffect > effectPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcEffect > effectPacket( pPlayer->getId() );
|
||||||
effectPacket.data().targetId = pPlayer->getId();
|
effectPacket.data().targetId = pPlayer->getId();
|
||||||
|
@ -90,7 +90,7 @@ void Core::Action::ActionTeleport::onFinish()
|
||||||
effectPacket.data().actionTextId = 5;
|
effectPacket.data().actionTextId = 5;
|
||||||
effectPacket.data().unknown_5 = 1;
|
effectPacket.data().unknown_5 = 1;
|
||||||
effectPacket.data().numEffects = 1;
|
effectPacket.data().numEffects = 1;
|
||||||
effectPacket.data().rotation = static_cast< uint16_t >( 0x8000 * ( (pPlayer->getRotation() + 3.1415926) ) / 3.1415926 );
|
effectPacket.data().rotation = static_cast< uint16_t >( 0x8000 * ( ( pPlayer->getRotation() + 3.1415926 ) ) / 3.1415926 );
|
||||||
effectPacket.data().effectTarget = pPlayer->getId();
|
effectPacket.data().effectTarget = pPlayer->getId();
|
||||||
pPlayer->sendToInRangeSet( effectPacket, true );
|
pPlayer->sendToInRangeSet( effectPacket, true );
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
#ifndef _ACTIONTELEPORT_H_
|
#ifndef _ACTIONTELEPORT_H_
|
||||||
#define _ACTIONTELEPORT_H_
|
#define _ACTIONTELEPORT_H_
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "../Forwards.h"
|
||||||
#include "Action.h"
|
#include "Action.h"
|
||||||
|
|
||||||
namespace Core { namespace Action {
|
namespace Core {
|
||||||
|
namespace Action {
|
||||||
|
|
||||||
class ActionTeleport : public Action
|
class ActionTeleport : public Action
|
||||||
{
|
{
|
||||||
|
@ -27,4 +28,4 @@ namespace Core { namespace Action {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
|
|
||||||
#include "EventAction.h"
|
#include "EventAction.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Server_Zone/Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Event/Event.h"
|
#include "Server_Zone/Event/Event.h"
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
extern Core::Data::ExdData g_exdData;
|
extern Core::Data::ExdData g_exdData;
|
||||||
|
@ -18,7 +18,7 @@ using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
Core::Action::EventAction::EventAction()
|
Core::Action::EventAction::EventAction()
|
||||||
{
|
{
|
||||||
m_handleActionType = Common::HandleActionType::Event;
|
m_handleActionType = HandleActionType::Event;
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Action::EventAction::EventAction( Entity::ActorPtr pActor, uint32_t eventId, uint16_t action,
|
Core::Action::EventAction::EventAction( Entity::ActorPtr pActor, uint32_t eventId, uint16_t action,
|
||||||
|
@ -75,7 +75,6 @@ void Core::Action::EventAction::onFinish()
|
||||||
m_onActionFinishClb( *m_pSource->getAsPlayer(), m_eventId, m_additional );
|
m_onActionFinishClb( *m_pSource->getAsPlayer(), m_eventId, m_additional );
|
||||||
|
|
||||||
auto control = ActorControlPacket142( m_pSource->getId(), Common::ActorControlType::CastStart, 0, m_id );
|
auto control = ActorControlPacket142( m_pSource->getId(), Common::ActorControlType::CastStart, 0, m_id );
|
||||||
|
|
||||||
|
|
||||||
if( !pEvent->hasPlayedScene() )
|
if( !pEvent->hasPlayedScene() )
|
||||||
m_pSource->getAsPlayer()->eventFinish( m_eventId, 1 );
|
m_pSource->getAsPlayer()->eventFinish( m_eventId, 1 );
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
#ifndef _EVENTACTION_H_
|
#ifndef _EVENTACTION_H_
|
||||||
#define _EVENTACTION_H_
|
#define _EVENTACTION_H_
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "../Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Action/Action.h"
|
#include "Action.h"
|
||||||
|
|
||||||
namespace Core { namespace Action {
|
namespace Core {
|
||||||
|
namespace Action {
|
||||||
|
|
||||||
class EventAction : public Action
|
class EventAction : public Action
|
||||||
{
|
{
|
||||||
|
@ -34,4 +35,4 @@ namespace Core { namespace Action {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
#include "EventItemAction.h"
|
#include "EventItemAction.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
Core::Action::EventItemAction::EventItemAction()
|
Core::Action::EventItemAction::EventItemAction()
|
||||||
{
|
{
|
||||||
m_handleActionType = Common::HandleActionType::Event;
|
m_handleActionType = HandleActionType::Event;
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Action::EventItemAction::EventItemAction( Entity::ActorPtr pActor, uint32_t eventId, uint16_t action,
|
Core::Action::EventItemAction::EventItemAction( Entity::ActorPtr pActor, uint32_t eventId, uint16_t action,
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
#ifndef _EVENTITEMACTION_H_
|
#ifndef _EVENTITEMACTION_H_
|
||||||
#define _EVENTITEMACTION_H_
|
#define _EVENTITEMACTION_H_
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "../Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Action/Action.h"
|
#include "Action.h"
|
||||||
|
|
||||||
namespace Core { namespace Action {
|
namespace Core {
|
||||||
|
namespace Action {
|
||||||
|
|
||||||
class EventItemAction : public Action
|
class EventItemAction : public Action
|
||||||
{
|
{
|
||||||
|
@ -32,4 +33,4 @@ namespace Core { namespace Action {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,26 +1,25 @@
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacket.h>
|
#include <Server_Common/Network/GamePacket.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Action/Action.h"
|
#include "Action/Action.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h"
|
#include "Network/PacketWrappers/UpdateHpMpTpPacket.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffectContainer.h"
|
#include "StatusEffect/StatusEffect.h"
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffect.h"
|
#include "Action/ActionCollision.h"
|
||||||
#include "src/servers/Server_Zone/Action/ActionCollision.h"
|
#include "ServerZone.h"
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "Session.h"
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Math/CalcBattle.h"
|
||||||
#include "src/servers/Server_Zone/Math/CalcBattle.h"
|
|
||||||
#include "Actor.h"
|
#include "Actor.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
|
|
||||||
|
@ -33,6 +32,11 @@ using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
Core::Entity::Actor::Actor()
|
Core::Entity::Actor::Actor()
|
||||||
{
|
{
|
||||||
|
// initialize the free slot queue
|
||||||
|
for( uint8_t i = 0; i < MAX_STATUS_EFFECTS; i++ )
|
||||||
|
{
|
||||||
|
m_statusEffectFreeSlotQueue.push( i );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Entity::Actor::~Actor()
|
Core::Entity::Actor::~Actor()
|
||||||
|
@ -660,7 +664,7 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
uint64_t param2, Entity::Actor& pTarget )
|
uint64_t param2, Entity::Actor& pTarget )
|
||||||
{
|
{
|
||||||
|
|
||||||
if ( isPlayer() )
|
if( isPlayer() )
|
||||||
{
|
{
|
||||||
getAsPlayer()->sendDebug( std::to_string( pTarget.getId() ) );
|
getAsPlayer()->sendDebug( std::to_string( pTarget.getId() ) );
|
||||||
getAsPlayer()->sendDebug( "Handle script skill type: " + std::to_string( type ) );
|
getAsPlayer()->sendDebug( "Handle script skill type: " + std::to_string( type ) );
|
||||||
|
@ -682,7 +686,7 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
effectPacket.data().effectTarget = pTarget.getId();
|
effectPacket.data().effectTarget = pTarget.getId();
|
||||||
|
|
||||||
// Todo: for each actor, calculate how much damage the calculated value should deal to them - 2-step damage calc. we only have 1-step
|
// Todo: for each actor, calculate how much damage the calculated value should deal to them - 2-step damage calc. we only have 1-step
|
||||||
switch ( type )
|
switch( type )
|
||||||
{
|
{
|
||||||
|
|
||||||
case ActionEffectType::Damage:
|
case ActionEffectType::Damage:
|
||||||
|
@ -692,7 +696,7 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::NormalDamage;
|
effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::NormalDamage;
|
||||||
effectPacket.data().effects[0].unknown_3 = 7;
|
effectPacket.data().effects[0].unknown_3 = 7;
|
||||||
|
|
||||||
if ( !actionInfoPtr->is_aoe )
|
if( !actionInfoPtr->is_aoe )
|
||||||
{
|
{
|
||||||
// If action on this specific target is valid...
|
// If action on this specific target is valid...
|
||||||
if ( isPlayer() && !ActionCollision::isActorApplicable( pTarget.shared_from_this(), TargetFilter::Enemies ) )
|
if ( isPlayer() && !ActionCollision::isActorApplicable( pTarget.shared_from_this(), TargetFilter::Enemies ) )
|
||||||
|
@ -700,11 +704,11 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
|
|
||||||
sendToInRangeSet( effectPacket, true );
|
sendToInRangeSet( effectPacket, true );
|
||||||
|
|
||||||
pTarget.takeDamage( static_cast< uint32_t >( param1 ) );
|
|
||||||
|
|
||||||
if ( pTarget.isAlive() )
|
if ( pTarget.isAlive() )
|
||||||
pTarget.onActionHostile( shared_from_this() );
|
pTarget.onActionHostile( shared_from_this() );
|
||||||
|
|
||||||
|
pTarget.takeDamage( static_cast< uint32_t >( param1 ) );
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -712,7 +716,7 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
auto actorsCollided = ActionCollision::getActorsHitFromAction( pTarget.getPos(), getInRangeActors( true ),
|
auto actorsCollided = ActionCollision::getActorsHitFromAction( pTarget.getPos(), getInRangeActors( true ),
|
||||||
actionInfoPtr, TargetFilter::Enemies );
|
actionInfoPtr, TargetFilter::Enemies );
|
||||||
|
|
||||||
for ( const auto& pHitActor : actorsCollided )
|
for( const auto& pHitActor : actorsCollided )
|
||||||
{
|
{
|
||||||
effectPacket.data().targetId = pHitActor->getId();
|
effectPacket.data().targetId = pHitActor->getId();
|
||||||
effectPacket.data().effectTarget = pHitActor->getId();
|
effectPacket.data().effectTarget = pHitActor->getId();
|
||||||
|
@ -720,17 +724,17 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
// todo: send to range of what? ourselves? when mob script hits this is going to be lacking
|
// todo: send to range of what? ourselves? when mob script hits this is going to be lacking
|
||||||
sendToInRangeSet( effectPacket, true );
|
sendToInRangeSet( effectPacket, true );
|
||||||
|
|
||||||
pHitActor->takeDamage( static_cast< uint32_t >( param1 ) );
|
|
||||||
|
|
||||||
if( pHitActor->isAlive() )
|
if( pHitActor->isAlive() )
|
||||||
pHitActor->onActionHostile( shared_from_this() );
|
pHitActor->onActionHostile( shared_from_this() );
|
||||||
|
|
||||||
|
pHitActor->takeDamage( static_cast< uint32_t >( param1 ) );
|
||||||
|
|
||||||
// Debug
|
// Debug
|
||||||
if ( isPlayer() )
|
if ( isPlayer() )
|
||||||
{
|
{
|
||||||
if ( pHitActor->isPlayer() ) {
|
if ( pHitActor->isPlayer() )
|
||||||
getAsPlayer()->sendDebug( "AoE hit actor " + std::to_string( pHitActor->getId() ) + " (" + pHitActor->getName() + ")" );
|
getAsPlayer()->sendDebug( "AoE hit actor " + std::to_string( pHitActor->getId() ) + " (" + pHitActor->getName() + ")" );
|
||||||
}
|
|
||||||
else
|
else
|
||||||
getAsPlayer()->sendDebug( "AoE hit actor " + std::to_string( pHitActor->getId() ) );
|
getAsPlayer()->sendDebug( "AoE hit actor " + std::to_string( pHitActor->getId() ) );
|
||||||
}
|
}
|
||||||
|
@ -748,9 +752,9 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
effectPacket.data().effects[0].effectType = ActionEffectType::Heal;
|
effectPacket.data().effects[0].effectType = ActionEffectType::Heal;
|
||||||
effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::NormalHeal;
|
effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::NormalHeal;
|
||||||
|
|
||||||
if ( !actionInfoPtr->is_aoe )
|
if( !actionInfoPtr->is_aoe )
|
||||||
{
|
{
|
||||||
if ( isPlayer() && !ActionCollision::isActorApplicable( pTarget.shared_from_this(), TargetFilter::Allies ) )
|
if( isPlayer() && !ActionCollision::isActorApplicable( pTarget.shared_from_this(), TargetFilter::Allies ) )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
sendToInRangeSet( effectPacket, true );
|
sendToInRangeSet( effectPacket, true );
|
||||||
|
@ -764,7 +768,7 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
auto actorsCollided = ActionCollision::getActorsHitFromAction( pTarget.getPos(), getInRangeActors( true ),
|
auto actorsCollided = ActionCollision::getActorsHitFromAction( pTarget.getPos(), getInRangeActors( true ),
|
||||||
actionInfoPtr, TargetFilter::Allies );
|
actionInfoPtr, TargetFilter::Allies );
|
||||||
|
|
||||||
for ( auto pHitActor : actorsCollided )
|
for( auto pHitActor : actorsCollided )
|
||||||
{
|
{
|
||||||
effectPacket.data().targetId = pTarget.getId();
|
effectPacket.data().targetId = pTarget.getId();
|
||||||
effectPacket.data().effectTarget = pHitActor->getId();
|
effectPacket.data().effectTarget = pHitActor->getId();
|
||||||
|
@ -773,11 +777,10 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
pHitActor->heal( calculatedHeal );
|
pHitActor->heal( calculatedHeal );
|
||||||
|
|
||||||
// Debug
|
// Debug
|
||||||
if ( isPlayer() )
|
if( isPlayer() )
|
||||||
{
|
{
|
||||||
if ( pHitActor->isPlayer() ) {
|
if( pHitActor->isPlayer() )
|
||||||
getAsPlayer()->sendDebug( "AoE hit actor " + std::to_string( pHitActor->getId() ) + " (" + pHitActor->getName() + ")" );
|
getAsPlayer()->sendDebug( "AoE hit actor " + std::to_string( pHitActor->getId() ) + " (" + pHitActor->getName() + ")" );
|
||||||
}
|
|
||||||
else
|
else
|
||||||
getAsPlayer()->sendDebug( "AoE hit actor " + std::to_string( pHitActor->getId() ) );
|
getAsPlayer()->sendDebug( "AoE hit actor " + std::to_string( pHitActor->getId() ) );
|
||||||
}
|
}
|
||||||
|
@ -794,7 +797,30 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint16_t actionId, u
|
||||||
/*! \param StatusEffectPtr to be applied to the actor */
|
/*! \param StatusEffectPtr to be applied to the actor */
|
||||||
void Core::Entity::Actor::addStatusEffect( StatusEffect::StatusEffectPtr pEffect )
|
void Core::Entity::Actor::addStatusEffect( StatusEffect::StatusEffectPtr pEffect )
|
||||||
{
|
{
|
||||||
m_pStatusEffectContainer->addStatusEffect( pEffect );
|
int8_t nextSlot = getStatusEffectFreeSlot();
|
||||||
|
// if there is no slot left, do not add the effect
|
||||||
|
if( nextSlot == -1 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
pEffect->applyStatus();
|
||||||
|
m_statusEffectMap[nextSlot] = pEffect;
|
||||||
|
|
||||||
|
ZoneChannelPacket< Server::FFXIVIpcAddStatusEffect > statusEffectAdd( getId() );
|
||||||
|
statusEffectAdd.data().actor_id = pEffect->getTargetActorId();
|
||||||
|
statusEffectAdd.data().actor_id1 = pEffect->getSrcActorId();
|
||||||
|
statusEffectAdd.data().current_hp = getHp();
|
||||||
|
statusEffectAdd.data().current_mp = getMp();
|
||||||
|
statusEffectAdd.data().current_tp = getTp();
|
||||||
|
statusEffectAdd.data().duration = static_cast< float >( pEffect->getDuration() ) / 1000;
|
||||||
|
statusEffectAdd.data().effect_id = pEffect->getId();
|
||||||
|
statusEffectAdd.data().effect_index = nextSlot;
|
||||||
|
statusEffectAdd.data().max_hp = getMaxHp();
|
||||||
|
statusEffectAdd.data().max_mp = getMaxMp();
|
||||||
|
statusEffectAdd.data().max_something = 1;
|
||||||
|
//statusEffectAdd.data().unknown2 = 28;
|
||||||
|
statusEffectAdd.data().param = pEffect->getParam();
|
||||||
|
|
||||||
|
sendToInRangeSet( statusEffectAdd, isPlayer() );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \param StatusEffectPtr to be applied to the actor */
|
/*! \param StatusEffectPtr to be applied to the actor */
|
||||||
|
@ -809,22 +835,173 @@ void Core::Entity::Actor::addStatusEffectById( uint32_t id, int32_t duration, En
|
||||||
/*! \param StatusEffectPtr to be applied to the actor */
|
/*! \param StatusEffectPtr to be applied to the actor */
|
||||||
void Core::Entity::Actor::addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Actor& pSource, uint16_t param )
|
void Core::Entity::Actor::addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Actor& pSource, uint16_t param )
|
||||||
{
|
{
|
||||||
if( !m_pStatusEffectContainer->hasStatusEffect( id ) )
|
if( hasStatusEffect( id ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
StatusEffect::StatusEffectPtr effect( new StatusEffect::StatusEffect( id, pSource.shared_from_this(),
|
||||||
|
shared_from_this(), duration, 3000 ) );
|
||||||
|
effect->setParam( param );
|
||||||
|
addStatusEffect( effect );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
float Core::Entity::Actor::getRotation() const
|
||||||
|
{
|
||||||
|
return m_rot;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::Actor::setRotation( float rot )
|
||||||
|
{
|
||||||
|
m_rot = rot;
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t Core::Entity::Actor::getStatusEffectFreeSlot()
|
||||||
|
{
|
||||||
|
int8_t freeEffectSlot = -1;
|
||||||
|
|
||||||
|
if( m_statusEffectFreeSlotQueue.empty() )
|
||||||
|
return freeEffectSlot;
|
||||||
|
|
||||||
|
freeEffectSlot = m_statusEffectFreeSlotQueue.front();
|
||||||
|
m_statusEffectFreeSlotQueue.pop();
|
||||||
|
|
||||||
|
return freeEffectSlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::Actor::statusEffectFreeSlot( uint8_t slotId )
|
||||||
|
{
|
||||||
|
m_statusEffectFreeSlotQueue.push( slotId );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::Actor::removeSingleStatusEffectById( uint32_t id )
|
||||||
|
{
|
||||||
|
for( auto effectIt : m_statusEffectMap )
|
||||||
{
|
{
|
||||||
StatusEffect::StatusEffectPtr effect( new StatusEffect::StatusEffect( id, pSource.shared_from_this(),
|
if( effectIt.second->getId() == id )
|
||||||
shared_from_this(), duration, 3000 ) );
|
{
|
||||||
effect->setParam( param );
|
removeStatusEffect( effectIt.first );
|
||||||
addStatusEffect( effect );
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \param Status that should be removed, based on its ID. */
|
void Core::Entity::Actor::removeStatusEffect( uint8_t effectSlotId )
|
||||||
void Core::Entity::Actor::removeSingleStatusEffectFromId( uint32_t id )
|
|
||||||
{
|
{
|
||||||
m_pStatusEffectContainer->removeSingleStatusEffectFromId( id );
|
auto pEffectIt = m_statusEffectMap.find( effectSlotId );
|
||||||
|
if( pEffectIt == m_statusEffectMap.end() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
statusEffectFreeSlot( effectSlotId );
|
||||||
|
|
||||||
|
auto pEffect = pEffectIt->second;
|
||||||
|
pEffect->removeStatus();
|
||||||
|
|
||||||
|
sendToInRangeSet( ActorControlPacket142( getId(), StatusEffectLose, pEffect->getId() ), isPlayer() );
|
||||||
|
|
||||||
|
m_statusEffectMap.erase( effectSlotId );
|
||||||
|
|
||||||
|
sendStatusEffectUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::StatusEffect::StatusEffectContainerPtr Core::Entity::Actor::getStatusEffectContainer() const
|
std::map< uint8_t, Core::StatusEffect::StatusEffectPtr > Core::Entity::Actor::getStatusEffectMap() const
|
||||||
{
|
{
|
||||||
return m_pStatusEffectContainer;
|
return m_statusEffectMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Core::Entity::Actor::sendStatusEffectUpdate()
|
||||||
|
{
|
||||||
|
uint64_t currentTimeMs = Util::getTimeMs();
|
||||||
|
|
||||||
|
ZoneChannelPacket< Server::FFXIVIpcStatusEffectList > statusEffectList( getId() );
|
||||||
|
|
||||||
|
statusEffectList.data().current_hp = getHp();
|
||||||
|
statusEffectList.data().current_mp = getMp();
|
||||||
|
statusEffectList.data().currentTp = getTp();
|
||||||
|
statusEffectList.data().max_hp = getMaxHp();
|
||||||
|
statusEffectList.data().max_mp = getMaxMp();
|
||||||
|
uint8_t slot = 0;
|
||||||
|
for( auto effectIt : m_statusEffectMap )
|
||||||
|
{
|
||||||
|
float timeLeft = static_cast< float >( effectIt.second->getDuration() -
|
||||||
|
( currentTimeMs - effectIt.second->getStartTimeMs() ) ) / 1000;
|
||||||
|
statusEffectList.data().effect[slot].duration = timeLeft;
|
||||||
|
statusEffectList.data().effect[slot].effect_id = effectIt.second->getId();
|
||||||
|
statusEffectList.data().effect[slot].sourceActorId = effectIt.second->getSrcActorId();
|
||||||
|
slot++;
|
||||||
|
}
|
||||||
|
|
||||||
|
sendToInRangeSet( statusEffectList, isPlayer() );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::Actor::updateStatusEffects()
|
||||||
|
{
|
||||||
|
uint64_t currentTimeMs = Util::getTimeMs();
|
||||||
|
|
||||||
|
uint32_t thisTickDmg = 0;
|
||||||
|
uint32_t thisTickHeal = 0;
|
||||||
|
|
||||||
|
for( auto effectIt : m_statusEffectMap )
|
||||||
|
{
|
||||||
|
uint8_t effectIndex = effectIt.first;
|
||||||
|
auto effect = effectIt.second;
|
||||||
|
|
||||||
|
uint64_t lastTick = effect->getLastTickMs();
|
||||||
|
uint64_t startTime = effect->getStartTimeMs();
|
||||||
|
uint32_t duration = effect->getDuration();
|
||||||
|
uint32_t tickRate = effect->getTickRate();
|
||||||
|
|
||||||
|
if( ( currentTimeMs - startTime ) > duration )
|
||||||
|
{
|
||||||
|
// remove status effect
|
||||||
|
removeStatusEffect( effectIndex );
|
||||||
|
// break because removing invalidates iterators
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( currentTimeMs - lastTick ) > tickRate )
|
||||||
|
{
|
||||||
|
effect->setLastTick( currentTimeMs );
|
||||||
|
effect->onTick();
|
||||||
|
|
||||||
|
auto thisEffect = effect->getTickEffect();
|
||||||
|
|
||||||
|
switch( thisEffect.first )
|
||||||
|
{
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
thisTickDmg += thisEffect.second;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
thisTickHeal += thisEffect.second;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if( thisTickDmg != 0 )
|
||||||
|
{
|
||||||
|
takeDamage( thisTickDmg );
|
||||||
|
sendToInRangeSet( ActorControlPacket142( getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::Damage ), thisTickDmg ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( thisTickHeal != 0 )
|
||||||
|
{
|
||||||
|
heal( thisTickDmg );
|
||||||
|
sendToInRangeSet( ActorControlPacket142( getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::Heal ), thisTickHeal ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Core::Entity::Actor::hasStatusEffect( uint32_t id )
|
||||||
|
{
|
||||||
|
if( m_statusEffectMap.find( id ) != m_statusEffectMap.end() )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
#ifndef _ACTOR_H_
|
#ifndef _ACTOR_H_
|
||||||
#define _ACTOR_H_
|
#define _ACTOR_H_
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <boost/enable_shared_from_this.hpp>
|
#include <boost/enable_shared_from_this.hpp>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Entity {
|
namespace Entity {
|
||||||
|
@ -79,7 +80,7 @@ public:
|
||||||
uint32_t mnd = 0;
|
uint32_t mnd = 0;
|
||||||
uint32_t pie = 0;
|
uint32_t pie = 0;
|
||||||
|
|
||||||
uint32_t parry = 0;
|
uint32_t tenacity = 0;
|
||||||
uint32_t attack = 0;
|
uint32_t attack = 0;
|
||||||
uint32_t defense = 0;
|
uint32_t defense = 0;
|
||||||
uint32_t accuracy = 0;
|
uint32_t accuracy = 0;
|
||||||
|
@ -160,11 +161,15 @@ protected:
|
||||||
uint64_t m_targetId;
|
uint64_t m_targetId;
|
||||||
/*! Ptr to a queued action */
|
/*! Ptr to a queued action */
|
||||||
Action::ActionPtr m_pCurrentAction;
|
Action::ActionPtr m_pCurrentAction;
|
||||||
/*! Container for status effects */
|
|
||||||
StatusEffect::StatusEffectContainerPtr m_pStatusEffectContainer;
|
|
||||||
/*! Invincibility type */
|
/*! Invincibility type */
|
||||||
Common::InvincibilityType m_invincibilityType;
|
Common::InvincibilityType m_invincibilityType;
|
||||||
|
|
||||||
|
/*! Status effects */
|
||||||
|
const uint8_t MAX_STATUS_EFFECTS = 30;
|
||||||
|
std::queue< uint8_t > m_statusEffectFreeSlotQueue;
|
||||||
|
std::vector< std::pair< uint8_t, uint32_t> > m_statusEffectList;
|
||||||
|
std::map< uint8_t, StatusEffect::StatusEffectPtr > m_statusEffectMap;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Actor();
|
Actor();
|
||||||
|
|
||||||
|
@ -174,18 +179,36 @@ public:
|
||||||
|
|
||||||
uint32_t getId() const;
|
uint32_t getId() const;
|
||||||
|
|
||||||
|
/// Status effect functions
|
||||||
|
void addStatusEffect( StatusEffect::StatusEffectPtr pEffect );
|
||||||
|
void removeStatusEffect( uint8_t effectSlotId );
|
||||||
|
void removeSingleStatusEffectById( uint32_t id );
|
||||||
|
void updateStatusEffects();
|
||||||
|
|
||||||
|
bool hasStatusEffect( uint32_t id );
|
||||||
|
|
||||||
|
int8_t getStatusEffectFreeSlot();
|
||||||
|
void statusEffectFreeSlot( uint8_t slotId );
|
||||||
|
|
||||||
|
std::map< uint8_t, Core::StatusEffect::StatusEffectPtr > getStatusEffectMap() const;
|
||||||
|
|
||||||
|
void sendStatusEffectUpdate();
|
||||||
|
// add a status effect by id
|
||||||
|
void addStatusEffectById( uint32_t id, int32_t duration, Entity::Actor& pSource, uint16_t param = 0 );
|
||||||
|
|
||||||
|
// add a status effect by id if it doesn't exist
|
||||||
|
void addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Actor& pSource, uint16_t param = 0 );
|
||||||
|
|
||||||
|
// remove a status effect by id
|
||||||
|
void removeSingleStatusEffectFromId( uint32_t id );
|
||||||
|
/// End Status Effect Functions
|
||||||
|
|
||||||
void setPosition( const Common::FFXIVARR_POSITION3& pos );
|
void setPosition( const Common::FFXIVARR_POSITION3& pos );
|
||||||
void setPosition( float x, float y, float z );
|
void setPosition( float x, float y, float z );
|
||||||
|
|
||||||
void setRotation( float rot )
|
void setRotation( float rot );
|
||||||
{
|
|
||||||
m_rot = rot;
|
|
||||||
}
|
|
||||||
|
|
||||||
float getRotation() const
|
float getRotation() const;
|
||||||
{
|
|
||||||
return m_rot;
|
|
||||||
}
|
|
||||||
|
|
||||||
Common::FFXIVARR_POSITION3& getPos();
|
Common::FFXIVARR_POSITION3& getPos();
|
||||||
|
|
||||||
|
@ -309,20 +332,6 @@ public:
|
||||||
// set the current cell
|
// set the current cell
|
||||||
void setCell( Cell* pCell );
|
void setCell( Cell* pCell );
|
||||||
|
|
||||||
// add a status effect
|
|
||||||
void addStatusEffect( StatusEffect::StatusEffectPtr pEffect );
|
|
||||||
|
|
||||||
// add a status effect by id
|
|
||||||
void addStatusEffectById( uint32_t id, int32_t duration, Entity::Actor& pSource, uint16_t param = 0 );
|
|
||||||
|
|
||||||
// add a status effect by id if it doesn't exist
|
|
||||||
void addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Actor& pSource, uint16_t param = 0 );
|
|
||||||
|
|
||||||
// remove a status effect by id
|
|
||||||
void removeSingleStatusEffectFromId( uint32_t id );
|
|
||||||
|
|
||||||
//get the status effect container
|
|
||||||
StatusEffect::StatusEffectContainerPtr getStatusEffectContainer() const;
|
|
||||||
|
|
||||||
// TODO: Why did i even declare them publicly here?!
|
// TODO: Why did i even declare them publicly here?!
|
||||||
std::set< ActorPtr > m_inRangeActors;
|
std::set< ActorPtr > m_inRangeActors;
|
||||||
|
|
|
@ -4,18 +4,17 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
|
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "BattleNpc.h"
|
#include "BattleNpc.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/MoveActorPacket.h"
|
#include "Network/PacketWrappers/MoveActorPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffectContainer.h"
|
|
||||||
|
|
||||||
using namespace Core::Common;
|
using namespace Core::Common;
|
||||||
using namespace Core::Network::Packets;
|
using namespace Core::Network::Packets;
|
||||||
|
@ -40,7 +39,7 @@ Core::Entity::BattleNpc::~BattleNpc()
|
||||||
|
|
||||||
Core::Entity::BattleNpc::BattleNpc( uint16_t modelId, uint16_t nameid, const Common::FFXIVARR_POSITION3& spawnPos,
|
Core::Entity::BattleNpc::BattleNpc( uint16_t modelId, uint16_t nameid, const Common::FFXIVARR_POSITION3& spawnPos,
|
||||||
uint16_t bnpcBaseId, uint32_t type, uint8_t level, uint8_t behaviour,
|
uint16_t bnpcBaseId, uint32_t type, uint8_t level, uint8_t behaviour,
|
||||||
uint32_t mobType )
|
uint32_t mobType ) : Actor()
|
||||||
{
|
{
|
||||||
BattleNpc::m_nextID++;
|
BattleNpc::m_nextID++;
|
||||||
m_id = BattleNpc::m_nextID;
|
m_id = BattleNpc::m_nextID;
|
||||||
|
@ -87,13 +86,8 @@ Core::Entity::BattleNpc::BattleNpc( uint16_t modelId, uint16_t nameid, const Com
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::initStatusEffectContainer()
|
|
||||||
{
|
|
||||||
m_pStatusEffectContainer = StatusEffect::StatusEffectContainerPtr( new StatusEffect::StatusEffectContainer( shared_from_this() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// spawn this player for pTarget
|
// spawn this player for pTarget
|
||||||
void Core::Entity::BattleNpc::spawn( Core::Entity::PlayerPtr pTarget )
|
void Core::Entity::BattleNpc::spawn( PlayerPtr pTarget )
|
||||||
{
|
{
|
||||||
//GamePacketNew< FFXIVIpcActorSpawn > spawnPacket( getId(), pTarget->getId() );
|
//GamePacketNew< FFXIVIpcActorSpawn > spawnPacket( getId(), pTarget->getId() );
|
||||||
|
|
||||||
|
@ -155,7 +149,7 @@ void Core::Entity::BattleNpc::spawn( Core::Entity::PlayerPtr pTarget )
|
||||||
}
|
}
|
||||||
|
|
||||||
// despawn
|
// despawn
|
||||||
void Core::Entity::BattleNpc::despawn( Core::Entity::ActorPtr pTarget )
|
void Core::Entity::BattleNpc::despawn( ActorPtr pTarget )
|
||||||
{
|
{
|
||||||
|
|
||||||
auto pPlayer = pTarget->getAsPlayer();
|
auto pPlayer = pTarget->getAsPlayer();
|
||||||
|
@ -177,7 +171,7 @@ Core::Entity::StateMode Core::Entity::BattleNpc::getMode() const
|
||||||
return m_mode;
|
return m_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::setMode( Core::Entity::StateMode mode )
|
void Core::Entity::BattleNpc::setMode( StateMode mode )
|
||||||
{
|
{
|
||||||
m_mode = mode;
|
m_mode = mode;
|
||||||
}
|
}
|
||||||
|
@ -187,7 +181,7 @@ uint8_t Core::Entity::BattleNpc::getbehavior() const
|
||||||
return m_behavior;
|
return m_behavior;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::hateListAdd( Core::Entity::ActorPtr pActor, int32_t hateAmount )
|
void Core::Entity::BattleNpc::hateListAdd( ActorPtr pActor, int32_t hateAmount )
|
||||||
{
|
{
|
||||||
auto hateEntry = new HateListEntry();
|
auto hateEntry = new HateListEntry();
|
||||||
hateEntry->m_hateAmount = hateAmount;
|
hateEntry->m_hateAmount = hateAmount;
|
||||||
|
@ -217,7 +211,7 @@ Core::Entity::ActorPtr Core::Entity::BattleNpc::hateListGetHighest()
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::setOwner( Core::Entity::PlayerPtr pPlayer )
|
void Core::Entity::BattleNpc::setOwner( PlayerPtr pPlayer )
|
||||||
{
|
{
|
||||||
m_pOwner = pPlayer;
|
m_pOwner = pPlayer;
|
||||||
|
|
||||||
|
@ -240,7 +234,7 @@ void Core::Entity::BattleNpc::setOwner( Core::Entity::PlayerPtr pPlayer )
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::sendPositionUpdate()
|
void Core::Entity::BattleNpc::sendPositionUpdate()
|
||||||
{
|
{
|
||||||
MoveActorPacket movePacket( shared_from_this(), 0x3A, 0x00, 0, 0x5A );
|
MoveActorPacket movePacket( *this, 0x3A, 0x00, 0, 0x5A );
|
||||||
sendToInRangeSet( movePacket );
|
sendToInRangeSet( movePacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +278,7 @@ bool Core::Entity::BattleNpc::moveTo( Common::FFXIVARR_POSITION3& pos )
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::aggro( Core::Entity::ActorPtr pActor )
|
void Core::Entity::BattleNpc::aggro( ActorPtr pActor )
|
||||||
{
|
{
|
||||||
|
|
||||||
m_lastAttack = Util::getTimeMs();
|
m_lastAttack = Util::getTimeMs();
|
||||||
|
@ -302,7 +296,7 @@ void Core::Entity::BattleNpc::aggro( Core::Entity::ActorPtr pActor )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::deaggro( Core::Entity::ActorPtr pActor )
|
void Core::Entity::BattleNpc::deaggro( ActorPtr pActor )
|
||||||
{
|
{
|
||||||
if( !hateListHasActor( pActor ) )
|
if( !hateListHasActor( pActor ) )
|
||||||
hateListRemove( pActor );
|
hateListRemove( pActor );
|
||||||
|
@ -328,7 +322,7 @@ void Core::Entity::BattleNpc::hateListClear()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::hateListRemove( Core::Entity::ActorPtr pActor )
|
void Core::Entity::BattleNpc::hateListRemove( ActorPtr pActor )
|
||||||
{
|
{
|
||||||
auto it = m_hateList.begin();
|
auto it = m_hateList.begin();
|
||||||
for( ; it != m_hateList.end(); ++it )
|
for( ; it != m_hateList.end(); ++it )
|
||||||
|
@ -348,7 +342,7 @@ void Core::Entity::BattleNpc::hateListRemove( Core::Entity::ActorPtr pActor )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Entity::BattleNpc::hateListHasActor( Core::Entity::ActorPtr pActor )
|
bool Core::Entity::BattleNpc::hateListHasActor( ActorPtr pActor )
|
||||||
{
|
{
|
||||||
auto it = m_hateList.begin();
|
auto it = m_hateList.begin();
|
||||||
for( ; it != m_hateList.end(); ++it )
|
for( ; it != m_hateList.end(); ++it )
|
||||||
|
@ -369,7 +363,7 @@ uint32_t Core::Entity::BattleNpc::getNameId() const
|
||||||
return m_nameId;
|
return m_nameId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::hateListUpdate( Core::Entity::ActorPtr pActor, int32_t hateAmount )
|
void Core::Entity::BattleNpc::hateListUpdate( ActorPtr pActor, int32_t hateAmount )
|
||||||
{
|
{
|
||||||
|
|
||||||
auto it = m_hateList.begin();
|
auto it = m_hateList.begin();
|
||||||
|
@ -458,7 +452,7 @@ void Core::Entity::BattleNpc::onDeath()
|
||||||
hateListClear();
|
hateListClear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::BattleNpc::onActionHostile( Core::Entity::ActorPtr pSource )
|
void Core::Entity::BattleNpc::onActionHostile( ActorPtr pSource )
|
||||||
{
|
{
|
||||||
|
|
||||||
if( hateListGetHighest() == nullptr )
|
if( hateListGetHighest() == nullptr )
|
||||||
|
@ -487,9 +481,7 @@ void Core::Entity::BattleNpc::update( int64_t currTime )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !m_pStatusEffectContainer )
|
updateStatusEffects();
|
||||||
initStatusEffectContainer();
|
|
||||||
m_pStatusEffectContainer->update();
|
|
||||||
float distance = Math::Util::distance( m_pos.x, m_pos.y, m_pos.z,
|
float distance = Math::Util::distance( m_pos.x, m_pos.y, m_pos.z,
|
||||||
m_posOrigin.x, m_posOrigin.y, m_posOrigin.z );
|
m_posOrigin.x, m_posOrigin.y, m_posOrigin.z );
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
#include "Actor.h"
|
#include "Actor.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
namespace Entity {
|
namespace Entity {
|
||||||
|
|
||||||
enum StateMode
|
enum StateMode
|
||||||
|
@ -76,7 +75,7 @@ public:
|
||||||
|
|
||||||
void onDeath() override;
|
void onDeath() override;
|
||||||
|
|
||||||
void onActionHostile( Core::Entity::ActorPtr pSource ) override;
|
void onActionHostile( ActorPtr pSource ) override;
|
||||||
|
|
||||||
ActorPtr getClaimer() const;
|
ActorPtr getClaimer() const;
|
||||||
|
|
||||||
|
@ -113,4 +112,4 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,48 +1,45 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include <src/servers/Server_Common/Config/XMLConfig.h>
|
#include <Server_Common/Config/XMLConfig.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacket.h>
|
#include <Server_Common/Network/GamePacket.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Session.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "BattleNpc.h"
|
#include "BattleNpc.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Zone/ZoneMgr.h"
|
#include "Zone/ZoneMgr.h"
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
|
#include "Network/PacketWrappers/InitUIPacket.h"
|
||||||
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
|
#include "Network/PacketWrappers/ChatPacket.h"
|
||||||
|
#include "Network/PacketWrappers/ModelEquipPacket.h"
|
||||||
|
#include "Network/PacketWrappers/ActorSpawnPacket.h"
|
||||||
|
#include "Network/PacketWrappers/UpdateHpMpTpPacket.h"
|
||||||
|
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
||||||
|
#include "Network/PacketWrappers/PlayerSpawnPacket.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Script/ScriptManager.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ChatPacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ModelEquipPacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorSpawnPacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h"
|
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Inventory/Item.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffectContainer.h"
|
#include "Inventory/Inventory.h"
|
||||||
|
#include "Event/Event.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Item.h"
|
#include "Action/Action.h"
|
||||||
|
#include "Action/EventAction.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
#include "Action/EventItemAction.h"
|
||||||
#include "src/servers/Server_Zone/Event/Event.h"
|
#include "Zone/ZonePosition.h"
|
||||||
#include "src/servers/Server_Zone/Action/Action.h"
|
#include "Math/CalcStats.h"
|
||||||
#include "src/servers/Server_Zone/Action/EventAction.h"
|
#include "Math/CalcBattle.h"
|
||||||
#include "src/servers/Server_Zone/Action/EventItemAction.h"
|
|
||||||
#include "src/servers/Server_Zone/Zone/ZonePosition.h"
|
|
||||||
#include "src/servers/Server_Zone/Math/CalcStats.h"
|
|
||||||
#include "src/servers/Server_Zone/Math/CalcBattle.h"
|
|
||||||
#include <boost/make_shared.hpp>
|
#include <boost/make_shared.hpp>
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
|
@ -57,6 +54,7 @@ using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
// player constructor
|
// player constructor
|
||||||
Core::Entity::Player::Player() :
|
Core::Entity::Player::Player() :
|
||||||
|
Actor(),
|
||||||
m_lastWrite( 0 ),
|
m_lastWrite( 0 ),
|
||||||
m_lastPing( 0 ),
|
m_lastPing( 0 ),
|
||||||
m_bIsLogin( false ),
|
m_bIsLogin( false ),
|
||||||
|
@ -237,12 +235,13 @@ void Core::Entity::Player::calculateStats()
|
||||||
m_baseStats.mnd = static_cast< uint32_t >( base * ( static_cast< float >( classInfo.mod_mnd ) / 100 ) + tribeInfo.mod_mnd );
|
m_baseStats.mnd = static_cast< uint32_t >( base * ( static_cast< float >( classInfo.mod_mnd ) / 100 ) + tribeInfo.mod_mnd );
|
||||||
m_baseStats.pie = static_cast< uint32_t >( base * ( static_cast< float >( classInfo.mod_pie ) / 100 ) + tribeInfo.mod_pie );
|
m_baseStats.pie = static_cast< uint32_t >( base * ( static_cast< float >( classInfo.mod_pie ) / 100 ) + tribeInfo.mod_pie );
|
||||||
|
|
||||||
m_baseStats.skillSpeed = paramGrowthInfo.base_secondary;
|
m_baseStats.skillSpeed = paramGrowthInfo.base_secondary;
|
||||||
m_baseStats.spellSpeed = paramGrowthInfo.base_secondary;
|
m_baseStats.spellSpeed = paramGrowthInfo.base_secondary;
|
||||||
m_baseStats.accuracy = paramGrowthInfo.base_secondary;
|
m_baseStats.accuracy = paramGrowthInfo.base_secondary;
|
||||||
m_baseStats.critHitRate = paramGrowthInfo.base_secondary;
|
m_baseStats.critHitRate = paramGrowthInfo.base_secondary;
|
||||||
m_baseStats.attackPotMagic = paramGrowthInfo.base_secondary;
|
m_baseStats.attackPotMagic = paramGrowthInfo.base_secondary;
|
||||||
m_baseStats.healingPotMagic = paramGrowthInfo.base_secondary;
|
m_baseStats.healingPotMagic = paramGrowthInfo.base_secondary;
|
||||||
|
m_baseStats.tenacity = paramGrowthInfo.base_secondary;
|
||||||
|
|
||||||
m_baseStats.max_mp = Math::CalcStats::calculateMaxMp( getAsPlayer() );
|
m_baseStats.max_mp = Math::CalcStats::calculateMaxMp( getAsPlayer() );
|
||||||
|
|
||||||
|
@ -419,7 +418,7 @@ void Core::Entity::Player::setZone( uint32_t zoneId )
|
||||||
}
|
}
|
||||||
queuePacket( contentFinderList );
|
queuePacket( contentFinderList );
|
||||||
|
|
||||||
Server::InitUIPacket initUIPacket( pPlayer );
|
Server::InitUIPacket initUIPacket( *pPlayer );
|
||||||
queuePacket( initUIPacket );
|
queuePacket( initUIPacket );
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcPlayerClassInfo > classInfoPacket( getId() );
|
ZoneChannelPacket< FFXIVIpcPlayerClassInfo > classInfoPacket( getId() );
|
||||||
|
@ -435,6 +434,9 @@ void Core::Entity::Player::setZone( uint32_t zoneId )
|
||||||
gcAffPacket.data().gcRank[1] = m_gcRank[1];
|
gcAffPacket.data().gcRank[1] = m_gcRank[1];
|
||||||
gcAffPacket.data().gcRank[2] = m_gcRank[2];
|
gcAffPacket.data().gcRank[2] = m_gcRank[2];
|
||||||
queuePacket( gcAffPacket );
|
queuePacket( gcAffPacket );
|
||||||
|
|
||||||
|
m_itemLevel = getInventory()->calculateEquippedGearItemLevel();
|
||||||
|
sendItemLevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcInitZone > initZonePacket( getId() );
|
ZoneChannelPacket< FFXIVIpcInitZone > initZonePacket( getId() );
|
||||||
|
@ -715,7 +717,7 @@ void Core::Entity::Player::gainLevel()
|
||||||
|
|
||||||
void Core::Entity::Player::unlock()
|
void Core::Entity::Player::unlock()
|
||||||
{
|
{
|
||||||
queuePacket( PlayerStateFlagsPacket( getAsPlayer(), PlayerStateFlagList{} ) );
|
queuePacket( PlayerStateFlagsPacket( *getAsPlayer(), PlayerStateFlagList{} ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::sendStatusUpdate( bool toSelf )
|
void Core::Entity::Player::sendStatusUpdate( bool toSelf )
|
||||||
|
@ -751,7 +753,7 @@ uint8_t Core::Entity::Player::getLevel() const
|
||||||
return static_cast< uint8_t >( m_classArray[classJobIndex] );
|
return static_cast< uint8_t >( m_classArray[classJobIndex] );
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Core::Entity::Player::getLevelForClass( Core::Common::ClassJob pClass ) const
|
uint8_t Core::Entity::Player::getLevelForClass( Common::ClassJob pClass ) const
|
||||||
{
|
{
|
||||||
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( pClass )].exp_idx;
|
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( pClass )].exp_idx;
|
||||||
return static_cast< uint8_t >( m_classArray[classJobIndex] );
|
return static_cast< uint8_t >( m_classArray[classJobIndex] );
|
||||||
|
@ -780,7 +782,7 @@ void Core::Entity::Player::setInCombat( bool mode )
|
||||||
m_bInCombat = mode;
|
m_bInCombat = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::setClassJob( Core::Common::ClassJob classJob )
|
void Core::Entity::Player::setClassJob( Common::ClassJob classJob )
|
||||||
{
|
{
|
||||||
m_class = classJob;
|
m_class = classJob;
|
||||||
uint8_t level = getLevel();
|
uint8_t level = getLevel();
|
||||||
|
@ -809,7 +811,7 @@ void Core::Entity::Player::setLevel( uint8_t level )
|
||||||
m_classArray[classJobIndex] = level;
|
m_classArray[classJobIndex] = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::setLevelForClass( uint8_t level, Core::Common::ClassJob classjob )
|
void Core::Entity::Player::setLevelForClass( uint8_t level, Common::ClassJob classjob )
|
||||||
{
|
{
|
||||||
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( classjob )].exp_idx;
|
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( classjob )].exp_idx;
|
||||||
m_classArray[classJobIndex] = level;
|
m_classArray[classJobIndex] = level;
|
||||||
|
@ -817,7 +819,7 @@ void Core::Entity::Player::setLevelForClass( uint8_t level, Core::Common::ClassJ
|
||||||
|
|
||||||
void Core::Entity::Player::sendModel()
|
void Core::Entity::Player::sendModel()
|
||||||
{
|
{
|
||||||
ModelEquipPacket modelEquip( getAsPlayer() );
|
ModelEquipPacket modelEquip( *getAsPlayer() );
|
||||||
sendToInRangeSet( modelEquip, true );
|
sendToInRangeSet( modelEquip, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -848,7 +850,7 @@ uint64_t Core::Entity::Player::getModelSystemWeapon() const
|
||||||
|
|
||||||
int8_t Core::Entity::Player::getAetheryteMaskAt( uint8_t index ) const
|
int8_t Core::Entity::Player::getAetheryteMaskAt( uint8_t index ) const
|
||||||
{
|
{
|
||||||
if( index > 11 )
|
if( index > sizeof( m_aetheryte ) )
|
||||||
return 0;
|
return 0;
|
||||||
return m_aetheryte[index];
|
return m_aetheryte[index];
|
||||||
}
|
}
|
||||||
|
@ -879,18 +881,18 @@ void Core::Entity::Player::setLookAt( uint8_t index, uint8_t value )
|
||||||
}
|
}
|
||||||
|
|
||||||
// spawn this player for pTarget
|
// spawn this player for pTarget
|
||||||
void Core::Entity::Player::spawn( Core::Entity::PlayerPtr pTarget )
|
void Core::Entity::Player::spawn( Entity::PlayerPtr pTarget )
|
||||||
{
|
{
|
||||||
g_log.debug( "[" + std::to_string( pTarget->getId() ) + "] Spawning " +
|
g_log.debug( "[" + std::to_string( pTarget->getId() ) + "] Spawning " +
|
||||||
getName() + " for " +
|
getName() + " for " +
|
||||||
pTarget->getName() );
|
pTarget->getName() );
|
||||||
|
|
||||||
PlayerSpawnPacket spawnActor( getAsPlayer(), pTarget );
|
PlayerSpawnPacket spawnActor( *getAsPlayer(), *pTarget );
|
||||||
pTarget->queuePacket( spawnActor );
|
pTarget->queuePacket( spawnActor );
|
||||||
}
|
}
|
||||||
|
|
||||||
// despawn
|
// despawn
|
||||||
void Core::Entity::Player::despawn( Core::Entity::ActorPtr pTarget )
|
void Core::Entity::Player::despawn( Entity::ActorPtr pTarget )
|
||||||
{
|
{
|
||||||
auto pPlayer = pTarget->getAsPlayer();
|
auto pPlayer = pTarget->getAsPlayer();
|
||||||
|
|
||||||
|
@ -901,7 +903,7 @@ void Core::Entity::Player::despawn( Core::Entity::ActorPtr pTarget )
|
||||||
|
|
||||||
Core::Entity::ActorPtr Core::Entity::Player::lookupTargetById( uint64_t targetId )
|
Core::Entity::ActorPtr Core::Entity::Player::lookupTargetById( uint64_t targetId )
|
||||||
{
|
{
|
||||||
Core::Entity::ActorPtr targetActor;
|
ActorPtr targetActor;
|
||||||
auto inRange = getInRangeActors( true );
|
auto inRange = getInRangeActors( true );
|
||||||
for( auto actor : inRange )
|
for( auto actor : inRange )
|
||||||
{
|
{
|
||||||
|
@ -961,13 +963,11 @@ bool Core::Entity::Player::actionHasCastTime( uint32_t actionId ) //TODO: Add lo
|
||||||
if( actionInfoPtr->is_instant )
|
if( actionInfoPtr->is_instant )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if( actionInfoPtr->cast_time == 0 )
|
return actionInfoPtr->cast_time != 0;
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Entity::Player::hasStateFlag( Core::Common::PlayerStateFlag flag ) const
|
bool Core::Entity::Player::hasStateFlag( Common::PlayerStateFlag flag ) const
|
||||||
{
|
{
|
||||||
int32_t iFlag = static_cast< uint32_t >( flag );
|
int32_t iFlag = static_cast< uint32_t >( flag );
|
||||||
|
|
||||||
|
@ -978,7 +978,7 @@ bool Core::Entity::Player::hasStateFlag( Core::Common::PlayerStateFlag flag ) co
|
||||||
return ( m_stateFlags[index] & value ) != 0;
|
return ( m_stateFlags[index] & value ) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::setStateFlag( Core::Common::PlayerStateFlag flag )
|
void Core::Entity::Player::setStateFlag( Common::PlayerStateFlag flag )
|
||||||
{
|
{
|
||||||
int32_t iFlag = static_cast< uint32_t >( flag );
|
int32_t iFlag = static_cast< uint32_t >( flag );
|
||||||
|
|
||||||
|
@ -1006,10 +1006,10 @@ void Core::Entity::Player::setStateFlags( std::vector< Common::PlayerStateFlag >
|
||||||
|
|
||||||
void Core::Entity::Player::sendStateFlags()
|
void Core::Entity::Player::sendStateFlags()
|
||||||
{
|
{
|
||||||
queuePacket( PlayerStateFlagsPacket( getAsPlayer() ) );
|
queuePacket( PlayerStateFlagsPacket( *getAsPlayer() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::unsetStateFlag( Core::Common::PlayerStateFlag flag )
|
void Core::Entity::Player::unsetStateFlag( Common::PlayerStateFlag flag )
|
||||||
{
|
{
|
||||||
if( !hasStateFlag( flag ) )
|
if( !hasStateFlag( flag ) )
|
||||||
return;
|
return;
|
||||||
|
@ -1056,7 +1056,7 @@ void Core::Entity::Player::update( int64_t currTime )
|
||||||
if( !isAlive() )
|
if( !isAlive() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_pStatusEffectContainer->update();
|
updateStatusEffects();
|
||||||
|
|
||||||
m_lastUpdate = currTime;
|
m_lastUpdate = currTime;
|
||||||
|
|
||||||
|
@ -1083,7 +1083,7 @@ void Core::Entity::Player::update( int64_t currTime )
|
||||||
|
|
||||||
|
|
||||||
if( Math::Util::distance(getPos().x, getPos().y, getPos().z,
|
if( Math::Util::distance(getPos().x, getPos().y, getPos().z,
|
||||||
actor->getPos().x, actor->getPos().y, actor->getPos().z) <= range )
|
actor->getPos().x, actor->getPos().y, actor->getPos().z) <= range )
|
||||||
{
|
{
|
||||||
|
|
||||||
if( ( currTime - m_lastAttack ) > mainWeap->getDelay() )
|
if( ( currTime - m_lastAttack ) > mainWeap->getDelay() )
|
||||||
|
@ -1109,7 +1109,7 @@ void Core::Entity::Player::update( int64_t currTime )
|
||||||
|
|
||||||
void Core::Entity::Player::onMobKill( uint16_t nameId )
|
void Core::Entity::Player::onMobKill( uint16_t nameId )
|
||||||
{
|
{
|
||||||
g_scriptMgr.onMobKill( getAsPlayer(), nameId );
|
g_scriptMgr.onMobKill( *getAsPlayer(), nameId );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::freePlayerSpawnId( uint32_t actorId )
|
void Core::Entity::Player::freePlayerSpawnId( uint32_t actorId )
|
||||||
|
@ -1144,57 +1144,57 @@ uint8_t Core::Entity::Player::getHomepoint() const
|
||||||
return m_homePoint;
|
return m_homePoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t * Core::Entity::Player::getClassArray()
|
uint16_t* Core::Entity::Player::getClassArray()
|
||||||
{
|
{
|
||||||
return m_classArray;
|
return m_classArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint16_t * Core::Entity::Player::getClassArray() const
|
const uint16_t* Core::Entity::Player::getClassArray() const
|
||||||
{
|
{
|
||||||
return m_classArray;
|
return m_classArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t * Core::Entity::Player::getLookArray() const
|
const uint8_t* Core::Entity::Player::getLookArray() const
|
||||||
{
|
{
|
||||||
return m_customize;
|
return m_customize;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t * Core::Entity::Player::getModelArray() const
|
const uint32_t* Core::Entity::Player::getModelArray() const
|
||||||
{
|
{
|
||||||
return m_modelEquip;
|
return m_modelEquip;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t * Core::Entity::Player::getExpArray()
|
uint32_t* Core::Entity::Player::getExpArray()
|
||||||
{
|
{
|
||||||
return m_expArray;
|
return m_expArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t * Core::Entity::Player::getExpArray() const
|
const uint32_t* Core::Entity::Player::getExpArray() const
|
||||||
{
|
{
|
||||||
return m_expArray;
|
return m_expArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t * Core::Entity::Player::getHowToArray()
|
uint8_t* Core::Entity::Player::getHowToArray()
|
||||||
{
|
{
|
||||||
return m_howTo;
|
return m_howTo;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t * Core::Entity::Player::getHowToArray() const
|
const uint8_t* Core::Entity::Player::getHowToArray() const
|
||||||
{
|
{
|
||||||
return m_howTo;
|
return m_howTo;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t * Core::Entity::Player::getUnlockBitmask() const
|
const uint8_t* Core::Entity::Player::getUnlockBitmask() const
|
||||||
{
|
{
|
||||||
return m_unlocks;
|
return m_unlocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t * Core::Entity::Player::getOrchestrionBitmask() const
|
const uint8_t* Core::Entity::Player::getOrchestrionBitmask() const
|
||||||
{
|
{
|
||||||
return m_orchestrion;
|
return m_orchestrion;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t * Core::Entity::Player::getMountGuideBitmask() const
|
const uint8_t* Core::Entity::Player::getMountGuideBitmask() const
|
||||||
{
|
{
|
||||||
return m_mountGuide;
|
return m_mountGuide;
|
||||||
}
|
}
|
||||||
|
@ -1214,12 +1214,12 @@ uint8_t Core::Entity::Player::getGc() const
|
||||||
return m_gc;
|
return m_gc;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t * Core::Entity::Player::getGcRankArray() const
|
const uint8_t* Core::Entity::Player::getGcRankArray() const
|
||||||
{
|
{
|
||||||
return m_gcRank;
|
return m_gcRank;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::queuePacket( Core::Network::Packets::GamePacketPtr pPacket )
|
void Core::Entity::Player::queuePacket( Network::Packets::GamePacketPtr pPacket )
|
||||||
{
|
{
|
||||||
auto pSession = g_serverZone.getSession( m_id );
|
auto pSession = g_serverZone.getSession( m_id );
|
||||||
|
|
||||||
|
@ -1233,7 +1233,7 @@ void Core::Entity::Player::queuePacket( Core::Network::Packets::GamePacketPtr pP
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::queueChatPacket( Core::Network::Packets::GamePacketPtr pPacket )
|
void Core::Entity::Player::queueChatPacket( Network::Packets::GamePacketPtr pPacket )
|
||||||
{
|
{
|
||||||
auto pSession = g_serverZone.getSession( m_id );
|
auto pSession = g_serverZone.getSession( m_id );
|
||||||
|
|
||||||
|
@ -1256,7 +1256,7 @@ void Core::Entity::Player::setLoadingComplete( bool bComplete )
|
||||||
m_bLoadingComplete = bComplete;
|
m_bLoadingComplete = bComplete;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::performZoning(uint16_t zoneId, const Common::FFXIVARR_POSITION3 &pos, float rotation)
|
void Core::Entity::Player::performZoning( uint16_t zoneId, const Common::FFXIVARR_POSITION3 &pos, float rotation )
|
||||||
{
|
{
|
||||||
m_pos = pos;
|
m_pos = pos;
|
||||||
m_zoneId = zoneId;
|
m_zoneId = zoneId;
|
||||||
|
@ -1310,12 +1310,12 @@ void Core::Entity::Player::sendNotice( const std::string& message ) //Purple Tex
|
||||||
|
|
||||||
void Core::Entity::Player::sendUrgent( const std::string& message ) //Red Text
|
void Core::Entity::Player::sendUrgent( const std::string& message ) //Red Text
|
||||||
{
|
{
|
||||||
queuePacket( ChatPacket( getAsPlayer(), ChatType::ServerUrgent, message ) );
|
queuePacket( ChatPacket( *getAsPlayer(), ChatType::ServerUrgent, message ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::sendDebug( const std::string& message ) //Grey Text
|
void Core::Entity::Player::sendDebug( const std::string& message ) //Grey Text
|
||||||
{
|
{
|
||||||
queuePacket( ChatPacket( getAsPlayer(), ChatType::ServerDebug, message ) );
|
queuePacket( ChatPacket( *getAsPlayer(), ChatType::ServerDebug, message ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::updateHowtosSeen( uint32_t howToId )
|
void Core::Entity::Player::updateHowtosSeen( uint32_t howToId )
|
||||||
|
@ -1329,14 +1329,14 @@ void Core::Entity::Player::updateHowtosSeen( uint32_t howToId )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core::Entity::Player::onMobAggro( Core::Entity::BattleNpcPtr pBNpc )
|
void Core::Entity::Player::onMobAggro( BattleNpcPtr pBNpc )
|
||||||
{
|
{
|
||||||
hateListAdd( pBNpc );
|
hateListAdd( pBNpc );
|
||||||
|
|
||||||
queuePacket( ActorControlPacket142( getId(), ToggleAggro, 1 ) );
|
queuePacket( ActorControlPacket142( getId(), ToggleAggro, 1 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::onMobDeaggro( Core::Entity::BattleNpcPtr pBNpc )
|
void Core::Entity::Player::onMobDeaggro( BattleNpcPtr pBNpc )
|
||||||
{
|
{
|
||||||
hateListRemove( pBNpc );
|
hateListRemove( pBNpc );
|
||||||
|
|
||||||
|
@ -1344,7 +1344,7 @@ void Core::Entity::Player::onMobDeaggro( Core::Entity::BattleNpcPtr pBNpc )
|
||||||
queuePacket( ActorControlPacket142( getId(), ToggleAggro ) );
|
queuePacket( ActorControlPacket142( getId(), ToggleAggro ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::hateListAdd( Core::Entity::BattleNpcPtr pBNpc )
|
void Core::Entity::Player::hateListAdd( BattleNpcPtr pBNpc )
|
||||||
|
|
||||||
{
|
{
|
||||||
if( m_freeHateSlotQueue.empty() )
|
if( m_freeHateSlotQueue.empty() )
|
||||||
|
@ -1356,7 +1356,7 @@ void Core::Entity::Player::hateListAdd( Core::Entity::BattleNpcPtr pBNpc )
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::hateListRemove( Core::Entity::BattleNpcPtr pBNpc )
|
void Core::Entity::Player::hateListRemove( BattleNpcPtr pBNpc )
|
||||||
{
|
{
|
||||||
|
|
||||||
auto it = m_actorIdTohateSlotMap.begin();
|
auto it = m_actorIdTohateSlotMap.begin();
|
||||||
|
@ -1374,7 +1374,7 @@ void Core::Entity::Player::hateListRemove( Core::Entity::BattleNpcPtr pBNpc )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Entity::Player::hateListHasMob( Core::Entity::BattleNpcPtr pBNpc )
|
bool Core::Entity::Player::hateListHasMob( BattleNpcPtr pBNpc )
|
||||||
{
|
{
|
||||||
|
|
||||||
auto it = m_actorIdTohateSlotMap.begin();
|
auto it = m_actorIdTohateSlotMap.begin();
|
||||||
|
@ -1416,7 +1416,7 @@ void Core::Entity::Player::setIsLogin( bool bIsLogin )
|
||||||
m_bIsLogin = bIsLogin;
|
m_bIsLogin = bIsLogin;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t * Core::Entity::Player::getTitleList()
|
uint8_t* Core::Entity::Player::getTitleList()
|
||||||
{
|
{
|
||||||
return m_titleList;
|
return m_titleList;
|
||||||
}
|
}
|
||||||
|
@ -1589,6 +1589,11 @@ void Core::Entity::Player::setOpeningSequence( uint8_t seq )
|
||||||
m_openingSequence = seq;
|
m_openingSequence = seq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t Core::Entity::Player::getItemLevel() const
|
||||||
|
{
|
||||||
|
return m_itemLevel;
|
||||||
|
}
|
||||||
|
|
||||||
/// Tells client to offset their eorzean time by given timestamp.
|
/// Tells client to offset their eorzean time by given timestamp.
|
||||||
void Core::Entity::Player::setEorzeaTimeOffset( uint64_t timestamp )
|
void Core::Entity::Player::setEorzeaTimeOffset( uint64_t timestamp )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
#ifndef _PLAYER_H
|
#ifndef _PLAYER_H
|
||||||
#define _PLAYER_H
|
#define _PLAYER_H
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
|
||||||
#include "Actor.h"
|
#include "Actor.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
#include "Inventory/Inventory.h"
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
|
@ -206,6 +206,10 @@ public:
|
||||||
void unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem );
|
void unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem );
|
||||||
/*! equip a weapon, possibly forcing a job change */
|
/*! equip a weapon, possibly forcing a job change */
|
||||||
void equipWeapon( ItemPtr pItem );
|
void equipWeapon( ItemPtr pItem );
|
||||||
|
/*! get player ilvl */
|
||||||
|
uint16_t getItemLevel() const;
|
||||||
|
/*! send player ilvl */
|
||||||
|
void sendItemLevel();
|
||||||
/*! get a const pointer to the inventory object */
|
/*! get a const pointer to the inventory object */
|
||||||
InventoryPtr getInventory() const;
|
InventoryPtr getInventory() const;
|
||||||
/*! get the current main hand model */
|
/*! get the current main hand model */
|
||||||
|
@ -238,7 +242,7 @@ public:
|
||||||
/*! returns the level of the currently active class / job */
|
/*! returns the level of the currently active class / job */
|
||||||
uint8_t getLevel() const override;
|
uint8_t getLevel() const override;
|
||||||
/*! returns the level of the provided class / job */
|
/*! returns the level of the provided class / job */
|
||||||
uint8_t getLevelForClass( Core::Common::ClassJob pClass ) const;
|
uint8_t getLevelForClass( Common::ClassJob pClass ) const;
|
||||||
/*! returns the exp of the currently active class / job */
|
/*! returns the exp of the currently active class / job */
|
||||||
uint32_t getExp() const;
|
uint32_t getExp() const;
|
||||||
/*! sets the exp of the currently active class / job */
|
/*! sets the exp of the currently active class / job */
|
||||||
|
@ -250,9 +254,9 @@ public:
|
||||||
/*! set level on the currently active class / job to given level */
|
/*! set level on the currently active class / job to given level */
|
||||||
void setLevel( uint8_t level );
|
void setLevel( uint8_t level );
|
||||||
/*! set level on the provided class / job to given level */
|
/*! set level on the provided class / job to given level */
|
||||||
void setLevelForClass( uint8_t level, Core::Common::ClassJob classjob );
|
void setLevelForClass( uint8_t level, Common::ClassJob classjob );
|
||||||
/*! change class or job to given class / job */
|
/*! change class or job to given class / job */
|
||||||
void setClassJob( Core::Common::ClassJob classJob );
|
void setClassJob( Common::ClassJob classJob );
|
||||||
/*! returns a pointer to the class array */
|
/*! returns a pointer to the class array */
|
||||||
uint16_t* getClassArray();
|
uint16_t* getClassArray();
|
||||||
/*! returns a const pointer to the class array */
|
/*! returns a const pointer to the class array */
|
||||||
|
@ -594,16 +598,20 @@ private:
|
||||||
|
|
||||||
uint8_t m_openingSequence;
|
uint8_t m_openingSequence;
|
||||||
|
|
||||||
|
uint16_t m_itemLevel;
|
||||||
InventoryPtr m_pInventory;
|
InventoryPtr m_pInventory;
|
||||||
|
|
||||||
std::map< uint32_t, Event::EventPtr > m_eventMap;
|
std::map< uint32_t, Event::EventPtr > m_eventMap;
|
||||||
std::map< uint32_t, uint8_t > m_playerIdToSpawnIdMap; // maps player to spawn id
|
std::map< uint32_t, uint8_t > m_playerIdToSpawnIdMap; // maps player to spawn id
|
||||||
std::queue< uint8_t > m_freeSpawnIdQueue; // queue with spawn ids free to be assigned
|
std::queue< uint8_t > m_freeSpawnIdQueue; // queue with spawn ids free to be assigned
|
||||||
std::queue< uint8_t > m_freeHateSlotQueue; // queue with "hate slots" free to be assigned
|
std::queue< uint8_t > m_freeHateSlotQueue; // queue with "hate slots" free to be assigned
|
||||||
std::map< uint32_t, uint8_t > m_actorIdTohateSlotMap;
|
std::map< uint32_t, uint8_t > m_actorIdTohateSlotMap;
|
||||||
|
|
||||||
std::map< uint32_t, uint8_t > m_questIdToQuestIdx; // quest mapping, quest id to quest container index
|
std::map< uint32_t, uint8_t > m_questIdToQuestIdx; // quest mapping, quest id to quest container index
|
||||||
std::map< uint8_t, uint32_t > m_questIdxToQuestId; // quest mapping, quest container index to questId
|
std::map< uint8_t, uint32_t > m_questIdxToQuestId; // quest mapping, quest container index to questId
|
||||||
boost::shared_ptr< Common::QuestActive > m_activeQuests[30];
|
boost::shared_ptr< Common::QuestActive > m_activeQuests[30];
|
||||||
int16_t m_questTracking[5];
|
int16_t m_questTracking[5];
|
||||||
|
|
||||||
uint8_t m_stateFlags[7];
|
uint8_t m_stateFlags[7];
|
||||||
uint8_t m_gmRank;
|
uint8_t m_gmRank;
|
||||||
uint16_t zoneId;
|
uint16_t zoneId;
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacket.h>
|
#include <Server_Common/Network/GamePacket.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
#include <src/servers/Server_Common/Config/XMLConfig.h>
|
#include <Server_Common/Config/XMLConfig.h>
|
||||||
|
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h"
|
#include "Network/PacketWrappers/InitUIPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventStartPacket.h"
|
#include "Network/PacketWrappers/EventStartPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventPlayPacket.h"
|
#include "Network/PacketWrappers/EventPlayPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventFinishPacket.h"
|
#include "Network/PacketWrappers/EventFinishPacket.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Action/EventAction.h"
|
#include "Action/EventAction.h"
|
||||||
#include "src/servers/Server_Zone/Action/EventItemAction.h"
|
#include "Action/EventItemAction.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Event/Event.h"
|
#include "Event/Event.h"
|
||||||
#include "src/servers/Server_Zone/Event/Event.h"
|
#include "Event/Event.h"
|
||||||
#include "Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
extern Core::ServerZone g_serverZone;
|
extern Core::ServerZone g_serverZone;
|
||||||
|
|
|
@ -1,16 +1,20 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
|
#include <Server_Common/Network/GamePacket.h>
|
||||||
|
#include <Server_Common/Logging/Logger.h>
|
||||||
|
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Zone/ZoneMgr.h"
|
#include "Zone/ZoneMgr.h"
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacket.h>
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Inventory/Inventory.h"
|
||||||
|
#include "Inventory/Item.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
extern Core::Logger g_log;
|
||||||
#include "src/servers/Server_Zone/Inventory/Item.h"
|
|
||||||
|
|
||||||
using namespace Core::Common;
|
using namespace Core::Common;
|
||||||
using namespace Core::Network::Packets;
|
using namespace Core::Network::Packets;
|
||||||
|
@ -21,8 +25,13 @@ Core::InventoryPtr Core::Entity::Player::getInventory() const
|
||||||
return m_pInventory;
|
return m_pInventory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Core::Entity::Player::sendItemLevel()
|
||||||
|
{
|
||||||
|
queuePacket( ActorControlPacket142( getId(), SetItemLevel, getItemLevel(), 0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: This has to be redone and simplified
|
// TODO: This has to be redone and simplified
|
||||||
void Core::Entity::Player::equipWeapon( Core::ItemPtr pItem )
|
void Core::Entity::Player::equipWeapon( ItemPtr pItem )
|
||||||
{
|
{
|
||||||
ClassJob currentClass = static_cast< ClassJob >( getClass() );
|
ClassJob currentClass = static_cast< ClassJob >( getClass() );
|
||||||
|
|
||||||
|
@ -77,10 +86,10 @@ void Core::Entity::Player::equipWeapon( Core::ItemPtr pItem )
|
||||||
}
|
}
|
||||||
|
|
||||||
// equip an item
|
// equip an item
|
||||||
void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, Core::ItemPtr pItem, bool sendModel )
|
void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem, bool sendUpdate )
|
||||||
{
|
{
|
||||||
|
|
||||||
// Console->outDebOnly("Equipping into slot %i", equipSlotID);
|
//g_log.debug( "Equipping into slot " + std::to_string( equipSlotId ) );
|
||||||
|
|
||||||
uint64_t model = pItem->getModelId1();
|
uint64_t model = pItem->getModelId1();
|
||||||
uint64_t model2 = pItem->getModelId2();
|
uint64_t model2 = pItem->getModelId2();
|
||||||
|
@ -109,14 +118,21 @@ void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, Core::It
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( sendModel )
|
if( sendUpdate )
|
||||||
|
{
|
||||||
this->sendModel();
|
this->sendModel();
|
||||||
|
m_itemLevel = getInventory()->calculateEquippedGearItemLevel();
|
||||||
|
sendItemLevel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Entity::Player::unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem )
|
void Core::Entity::Player::unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem )
|
||||||
{
|
{
|
||||||
m_modelEquip[static_cast< uint8_t >( equipSlotId )] = 0;
|
m_modelEquip[static_cast< uint8_t >( equipSlotId )] = 0;
|
||||||
sendModel();
|
sendModel();
|
||||||
|
|
||||||
|
m_itemLevel = getInventory()->calculateEquippedGearItemLevel();
|
||||||
|
sendItemLevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Core::Entity::Player::getCurrency( uint8_t type ) const
|
uint32_t Core::Entity::Player::getCurrency( uint8_t type ) const
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacket.h>
|
#include <Server_Common/Network/GamePacket.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/QuestMessagePacket.h"
|
#include "Network/PacketWrappers/QuestMessagePacket.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Server_Zone/Session.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
#include "Server_Zone/Inventory/Inventory.h"
|
||||||
|
|
||||||
extern Core::Data::ExdData g_exdData;
|
extern Core::Data::ExdData g_exdData;
|
||||||
|
|
||||||
|
|
|
@ -1,35 +1,32 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacket.h>
|
#include <Server_Common/Network/GamePacket.h>
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include <src/servers/Server_Common/Config/XMLConfig.h>
|
#include <Server_Common/Config/XMLConfig.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
|
#include <Server_Common/Common.h>
|
||||||
|
#include <Server_Common/Database/DatabaseDef.h>
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
|
||||||
#include <servers/Server_Common/Common.h>
|
|
||||||
|
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Zone/ZoneMgr.h"
|
#include "Zone/ZoneMgr.h"
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h"
|
#include "Network/PacketWrappers/InitUIPacket.h"
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffectContainer.h"
|
#include "Inventory/Inventory.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
|
||||||
|
|
||||||
#include <Server_Common/Database/DatabaseDef.h>
|
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
extern Core::ServerZone g_serverZone;
|
extern Core::ServerZone g_serverZone;
|
||||||
|
@ -42,11 +39,11 @@ using namespace Core::Network::Packets;
|
||||||
using namespace Core::Network::Packets::Server;
|
using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
// load player from the db
|
// load player from the db
|
||||||
bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession )
|
bool Core::Entity::Player::load( uint32_t charId, SessionPtr pSession )
|
||||||
{
|
{
|
||||||
const std::string char_id_str = std::to_string( charId );
|
const std::string char_id_str = std::to_string( charId );
|
||||||
|
|
||||||
auto stmt = g_charaDb.getPreparedStatement( Core::Db::CharaDbStatements::CHARA_SEL );
|
auto stmt = g_charaDb.getPreparedStatement( Db::CharaDbStatements::CHARA_SEL );
|
||||||
|
|
||||||
stmt->setUInt( 1, charId );
|
stmt->setUInt( 1, charId );
|
||||||
auto res = g_charaDb.query( stmt );
|
auto res = g_charaDb.query( stmt );
|
||||||
|
@ -178,7 +175,8 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession )
|
||||||
m_lastTickTime = 0;
|
m_lastTickTime = 0;
|
||||||
|
|
||||||
auto pPlayer = getAsPlayer();
|
auto pPlayer = getAsPlayer();
|
||||||
m_pInventory = InventoryPtr( new Inventory( pPlayer ) );
|
// TODO: remove Inventory and actually inline it in Player class
|
||||||
|
m_pInventory = InventoryPtr( new Inventory( pPlayer.get() ) );
|
||||||
|
|
||||||
pPlayer->calculateStats();
|
pPlayer->calculateStats();
|
||||||
|
|
||||||
|
@ -211,8 +209,6 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession )
|
||||||
|
|
||||||
initSpawnIdQueue();
|
initSpawnIdQueue();
|
||||||
|
|
||||||
m_pStatusEffectContainer = StatusEffect::StatusEffectContainerPtr( new StatusEffect::StatusEffectContainer( shared_from_this() ) );
|
|
||||||
|
|
||||||
if( !m_playerIdToSpawnIdMap.empty() )
|
if( !m_playerIdToSpawnIdMap.empty() )
|
||||||
m_playerIdToSpawnIdMap.clear();
|
m_playerIdToSpawnIdMap.clear();
|
||||||
|
|
||||||
|
@ -222,7 +218,7 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession )
|
||||||
bool Core::Entity::Player::loadActiveQuests()
|
bool Core::Entity::Player::loadActiveQuests()
|
||||||
{
|
{
|
||||||
|
|
||||||
auto stmt = g_charaDb.getPreparedStatement( Core::Db::CharaDbStatements::CHARA_QUEST_SEL );
|
auto stmt = g_charaDb.getPreparedStatement( Db::CharaDbStatements::CHARA_QUEST_SEL );
|
||||||
|
|
||||||
stmt->setUInt( 1, m_id );
|
stmt->setUInt( 1, m_id );
|
||||||
auto res = g_charaDb.query( stmt );
|
auto res = g_charaDb.query( stmt );
|
||||||
|
@ -259,7 +255,7 @@ bool Core::Entity::Player::loadClassData()
|
||||||
{
|
{
|
||||||
|
|
||||||
// ClassIdx, Exp, Lvl
|
// ClassIdx, Exp, Lvl
|
||||||
auto stmt = g_charaDb.getPreparedStatement( Core::Db::CharaDbStatements::CHARA_CLASS_SEL );
|
auto stmt = g_charaDb.getPreparedStatement( Db::CharaDbStatements::CHARA_CLASS_SEL );
|
||||||
stmt->setUInt( 1, m_id );
|
stmt->setUInt( 1, m_id );
|
||||||
auto res = g_charaDb.query( stmt );
|
auto res = g_charaDb.query( stmt );
|
||||||
|
|
||||||
|
@ -278,7 +274,7 @@ bool Core::Entity::Player::loadClassData()
|
||||||
|
|
||||||
bool Core::Entity::Player::loadSearchInfo()
|
bool Core::Entity::Player::loadSearchInfo()
|
||||||
{
|
{
|
||||||
auto stmt = g_charaDb.getPreparedStatement( Core::Db::CharaDbStatements::CHARA_SEARCHINFO_SEL );
|
auto stmt = g_charaDb.getPreparedStatement( Db::CharaDbStatements::CHARA_SEARCHINFO_SEL );
|
||||||
stmt->setUInt( 1, m_id );
|
stmt->setUInt( 1, m_id );
|
||||||
auto res = g_charaDb.query( stmt );
|
auto res = g_charaDb.query( stmt );
|
||||||
|
|
||||||
|
@ -306,7 +302,7 @@ void Core::Entity::Player::updateSql()
|
||||||
"EquippedMannequin 44, ConfigFlags 45, QuestCompleteFlags 46, OpeningSequence 47, "
|
"EquippedMannequin 44, ConfigFlags 45, QuestCompleteFlags 46, OpeningSequence 47, "
|
||||||
"QuestTracking 48, GrandCompany 49, GrandCompanyRank 50, Discovery 51, GMRank 52, Unlocks 53, "
|
"QuestTracking 48, GrandCompany 49, GrandCompanyRank 50, Discovery 51, GMRank 52, Unlocks 53, "
|
||||||
"CFPenaltyUntil 54"*/
|
"CFPenaltyUntil 54"*/
|
||||||
auto stmt = g_charaDb.getPreparedStatement( Core::Db::CharaDbStatements::CHARA_UP );
|
auto stmt = g_charaDb.getPreparedStatement( Db::CharaDbStatements::CHARA_UP );
|
||||||
|
|
||||||
stmt->setInt( 1, getHp() );
|
stmt->setInt( 1, getHp() );
|
||||||
stmt->setInt( 2, getMp() );
|
stmt->setInt( 2, getMp() );
|
||||||
|
@ -433,7 +429,7 @@ void Core::Entity::Player::updateDbClass() const
|
||||||
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx;
|
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx;
|
||||||
|
|
||||||
//Exp = ?, Lvl = ? WHERE CharacterId = ? AND ClassIdx = ?
|
//Exp = ?, Lvl = ? WHERE CharacterId = ? AND ClassIdx = ?
|
||||||
auto stmtS = g_charaDb.getPreparedStatement( Core::Db::CHARA_CLASS_UP );
|
auto stmtS = g_charaDb.getPreparedStatement( Db::CHARA_CLASS_UP );
|
||||||
stmtS->setInt( 1, getExp() );
|
stmtS->setInt( 1, getExp() );
|
||||||
stmtS->setInt( 2, getLevel() );
|
stmtS->setInt( 2, getLevel() );
|
||||||
stmtS->setInt( 3, m_id );
|
stmtS->setInt( 3, m_id );
|
||||||
|
@ -443,17 +439,17 @@ void Core::Entity::Player::updateDbClass() const
|
||||||
|
|
||||||
void Core::Entity::Player::updateDbSearchInfo() const
|
void Core::Entity::Player::updateDbSearchInfo() const
|
||||||
{
|
{
|
||||||
auto stmtS = g_charaDb.getPreparedStatement( Core::Db::CHARA_SEARCHINFO_UP_SELECTCLASS );
|
auto stmtS = g_charaDb.getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SELECTCLASS );
|
||||||
stmtS->setInt( 1, m_searchSelectClass );
|
stmtS->setInt( 1, m_searchSelectClass );
|
||||||
stmtS->setInt( 2, m_id );
|
stmtS->setInt( 2, m_id );
|
||||||
g_charaDb.execute( stmtS );
|
g_charaDb.execute( stmtS );
|
||||||
|
|
||||||
auto stmtS1 = g_charaDb.getPreparedStatement( Core::Db::CHARA_SEARCHINFO_UP_SELECTREGION );
|
auto stmtS1 = g_charaDb.getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SELECTREGION );
|
||||||
stmtS1->setInt( 1, m_searchSelectRegion );
|
stmtS1->setInt( 1, m_searchSelectRegion );
|
||||||
stmtS1->setInt( 2, m_id );
|
stmtS1->setInt( 2, m_id );
|
||||||
g_charaDb.execute( stmtS1 );
|
g_charaDb.execute( stmtS1 );
|
||||||
|
|
||||||
auto stmtS2 = g_charaDb.getPreparedStatement( Core::Db::CHARA_SEARCHINFO_UP_SELECTREGION );
|
auto stmtS2 = g_charaDb.getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SELECTREGION );
|
||||||
stmtS2->setString( 1, string( m_searchMessage != nullptr ? m_searchMessage : "" ) );
|
stmtS2->setString( 1, string( m_searchMessage != nullptr ? m_searchMessage : "" ) );
|
||||||
stmtS2->setInt( 2, m_id );
|
stmtS2->setInt( 2, m_id );
|
||||||
g_charaDb.execute( stmtS2 );
|
g_charaDb.execute( stmtS2 );
|
||||||
|
@ -467,7 +463,7 @@ void Core::Entity::Player::updateDbAllQuests() const
|
||||||
if( !m_activeQuests[i] )
|
if( !m_activeQuests[i] )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto stmtS3 = g_charaDb.getPreparedStatement( Core::Db::CHARA_QUEST_UP );
|
auto stmtS3 = g_charaDb.getPreparedStatement( Db::CHARA_QUEST_UP );
|
||||||
stmtS3->setInt( 1, m_activeQuests[i]->c.sequence );
|
stmtS3->setInt( 1, m_activeQuests[i]->c.sequence );
|
||||||
stmtS3->setInt( 2, m_activeQuests[i]->c.flags );
|
stmtS3->setInt( 2, m_activeQuests[i]->c.flags );
|
||||||
stmtS3->setInt( 3, m_activeQuests[i]->c.UI8A );
|
stmtS3->setInt( 3, m_activeQuests[i]->c.UI8A );
|
||||||
|
@ -486,7 +482,7 @@ void Core::Entity::Player::updateDbAllQuests() const
|
||||||
|
|
||||||
void Core::Entity::Player::deleteQuest( uint16_t questId ) const
|
void Core::Entity::Player::deleteQuest( uint16_t questId ) const
|
||||||
{
|
{
|
||||||
auto stmt = g_charaDb.getPreparedStatement( Core::Db::CHARA_QUEST_DEL );
|
auto stmt = g_charaDb.getPreparedStatement( Db::CHARA_QUEST_DEL );
|
||||||
stmt->setInt( 1, m_id );
|
stmt->setInt( 1, m_id );
|
||||||
stmt->setInt( 2, questId );
|
stmt->setInt( 2, questId );
|
||||||
g_charaDb.execute( stmt );
|
g_charaDb.execute( stmt );
|
||||||
|
@ -494,7 +490,7 @@ void Core::Entity::Player::deleteQuest( uint16_t questId ) const
|
||||||
|
|
||||||
void Core::Entity::Player::insertQuest( uint16_t questId, uint8_t index, uint8_t seq ) const
|
void Core::Entity::Player::insertQuest( uint16_t questId, uint8_t index, uint8_t seq ) const
|
||||||
{
|
{
|
||||||
auto stmt = g_charaDb.getPreparedStatement( Core::Db::CHARA_QUEST_INS );
|
auto stmt = g_charaDb.getPreparedStatement( Db::CHARA_QUEST_INS );
|
||||||
stmt->setInt( 1, m_id );
|
stmt->setInt( 1, m_id );
|
||||||
stmt->setInt( 2, index );
|
stmt->setInt( 2, index );
|
||||||
stmt->setInt( 3, questId );
|
stmt->setInt( 3, questId );
|
||||||
|
@ -508,4 +504,4 @@ void Core::Entity::Player::insertQuest( uint16_t questId, uint8_t index, uint8_t
|
||||||
stmt->setInt( 11, 0 );
|
stmt->setInt( 11, 0 );
|
||||||
stmt->setInt( 12, 0 );
|
stmt->setInt( 12, 0 );
|
||||||
g_charaDb.execute( stmt );
|
g_charaDb.execute( stmt );
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ cmake_policy(SET CMP0015 NEW)
|
||||||
cmake_policy(SET CMP0014 OLD)
|
cmake_policy(SET CMP0014 OLD)
|
||||||
|
|
||||||
project(Sapphire_Zone)
|
project(Sapphire_Zone)
|
||||||
|
include_directories( ${CMAKE_CURRENT_SOURCE_DIR} )
|
||||||
|
|
||||||
file(GLOB SERVER_PUBLIC_INCLUDE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
file(GLOB SERVER_PUBLIC_INCLUDE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
/*.h
|
/*.h
|
||||||
|
|
|
@ -1,23 +1,20 @@
|
||||||
#ifndef _GAMECOMMAND_H_
|
#ifndef _GAMECOMMAND_H_
|
||||||
#define _GAMECOMMAND_H_
|
#define _GAMECOMMAND_H_
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
class DebugCommandHandler;
|
class DebugCommandHandler;
|
||||||
|
|
||||||
// CGameCommand is used to define in game text command callbacks
|
|
||||||
// TODO it should probably be renamed to something more intuitive
|
|
||||||
// TODO the command identifier, currently '@' should probably be defined in here aswell so it is easily replaced
|
|
||||||
class DebugCommand
|
class DebugCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
using pFunc = void ( DebugCommandHandler::* )( char *, Entity::PlayerPtr, boost::shared_ptr< DebugCommand > );
|
using pFunc = void ( DebugCommandHandler::* )( char *, Entity::Player&, boost::shared_ptr< DebugCommand > );
|
||||||
|
|
||||||
// String for the command
|
// String for the command
|
||||||
std::string m_commandName;
|
std::string m_commandName;
|
||||||
|
|
|
@ -1,36 +1,36 @@
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Version.h>
|
#include <Server_Common/Version.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
|
#include <Server_Common/Database/DatabaseDef.h>
|
||||||
|
|
||||||
#include "DebugCommand.h"
|
#include "DebugCommand.h"
|
||||||
#include "DebugCommandHandler.h"
|
#include "DebugCommandHandler.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h"
|
#include "Network/PacketWrappers/InitUIPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Script/ScriptManager.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Actor/BattleNpc.h"
|
#include "Actor/BattleNpc.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffect.h"
|
#include "StatusEffect/StatusEffect.h"
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Session.h"
|
||||||
#include <boost/make_shared.hpp>
|
#include <boost/make_shared.hpp>
|
||||||
|
|
||||||
#include <Server_Common/Database/DatabaseDef.h>
|
|
||||||
|
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
|
|
||||||
|
@ -63,18 +63,18 @@ Core::DebugCommandHandler::~DebugCommandHandler()
|
||||||
}
|
}
|
||||||
|
|
||||||
// add a command set to the register map
|
// add a command set to the register map
|
||||||
void Core::DebugCommandHandler::registerCommand( const std::string& n, Core::DebugCommand::pFunc functionPtr,
|
void Core::DebugCommandHandler::registerCommand( const std::string& n, DebugCommand::pFunc functionPtr,
|
||||||
const std::string& hText, uint8_t uLevel )
|
const std::string& hText, uint8_t uLevel )
|
||||||
{
|
{
|
||||||
m_commandMap[std::string( n )] = boost::make_shared<DebugCommand>( n, functionPtr, hText, uLevel );
|
m_commandMap[std::string( n )] = boost::make_shared< DebugCommand >( n, functionPtr, hText, uLevel );
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to retrieve the command in question, execute if found
|
// try to retrieve the command in question, execute if found
|
||||||
void Core::DebugCommandHandler::execCommand( char * data, Core::Entity::PlayerPtr pPlayer )
|
void Core::DebugCommandHandler::execCommand( char * data, Entity::Player& player )
|
||||||
{
|
{
|
||||||
|
|
||||||
// define callback pointer
|
// define callback pointer
|
||||||
void ( DebugCommandHandler::*pf )( char *, Entity::PlayerPtr, boost::shared_ptr< DebugCommand > );
|
void ( DebugCommandHandler::*pf )( char *, Entity::Player&, boost::shared_ptr< DebugCommand > );
|
||||||
|
|
||||||
std::string commandString;
|
std::string commandString;
|
||||||
|
|
||||||
|
@ -94,18 +94,18 @@ void Core::DebugCommandHandler::execCommand( char * data, Core::Entity::PlayerPt
|
||||||
|
|
||||||
if( it == m_commandMap.end() )
|
if( it == m_commandMap.end() )
|
||||||
// no command found, do something... or not
|
// no command found, do something... or not
|
||||||
pPlayer->sendUrgent( "Command not found." );
|
player.sendUrgent( "Command not found." );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( pPlayer->getGmRank() < it->second->getRequiredGmLevel() )
|
if( player.getGmRank() < it->second->getRequiredGmLevel() )
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( "You are not allowed to use this command." );
|
player.sendUrgent( "You are not allowed to use this command." );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// command found, call the callback function and pass parameters if present.
|
// command found, call the callback function and pass parameters if present.
|
||||||
pf = ( *it ).second->m_pFunc;
|
pf = ( *it ).second->m_pFunc;
|
||||||
( this->*pf )( data, pPlayer, ( *it ).second );
|
( this->*pf )( data, player, ( *it ).second );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,14 +117,14 @@ void Core::DebugCommandHandler::execCommand( char * data, Core::Entity::PlayerPt
|
||||||
// Definition of the commands
|
// Definition of the commands
|
||||||
///////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void Core::DebugCommandHandler::scriptReload( char * data, Core::Entity::PlayerPtr pPlayer,
|
void Core::DebugCommandHandler::scriptReload( char * data, Entity::Player& player,
|
||||||
boost::shared_ptr<Core::DebugCommand> command )
|
boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
g_scriptMgr.reload();
|
g_scriptMgr.reload();
|
||||||
pPlayer->sendDebug( "Scripts reloaded." );
|
player.sendDebug( "Scripts reloaded." );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::DebugCommandHandler::help( char* data, Entity::PlayerPtr pPlayer, boost::shared_ptr< Core::DebugCommand > command )
|
void Core::DebugCommandHandler::help( char* data, Entity::Player& player, boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug( "Registered debug commands:" );
|
pPlayer->sendDebug( "Registered debug commands:" );
|
||||||
for( auto cmd : m_commandMap )
|
for( auto cmd : m_commandMap )
|
||||||
|
@ -132,11 +132,12 @@ void Core::DebugCommandHandler::help( char* data, Entity::PlayerPtr pPlayer, boo
|
||||||
if( pPlayer->getGmRank() >= cmd.second->m_gmLevel )
|
if( pPlayer->getGmRank() >= cmd.second->m_gmLevel )
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug( " - " + cmd.first + " - " + cmd.second->getHelpText() );
|
pPlayer->sendDebug( " - " + cmd.first + " - " + cmd.second->getHelpText() );
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr<Core::DebugCommand> command )
|
void Core::DebugCommandHandler::set( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
std::string subCommand = "";
|
std::string subCommand = "";
|
||||||
std::string params = "";
|
std::string params = "";
|
||||||
|
@ -156,7 +157,7 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
if( command->getName().length() + 1 + pos + 1 < strlen( data ) )
|
if( command->getName().length() + 1 + pos + 1 < strlen( data ) )
|
||||||
params = std::string( data + command->getName().length() + 1 + pos + 1 );
|
params = std::string( data + command->getName().length() + 1 + pos + 1 );
|
||||||
|
|
||||||
g_log.debug( "[" + std::to_string( pPlayer->getId() ) + "] " +
|
g_log.debug( "[" + std::to_string( player.getId() ) + "] " +
|
||||||
"subCommand " + subCommand + " params: " + params );
|
"subCommand " + subCommand + " params: " + params );
|
||||||
|
|
||||||
|
|
||||||
|
@ -170,25 +171,25 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
|
|
||||||
if( ( posX == 0xcccccccc ) || ( posY == 0xcccccccc ) || ( posZ == 0xcccccccc ) )
|
if( ( posX == 0xcccccccc ) || ( posY == 0xcccccccc ) || ( posZ == 0xcccccccc ) )
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( "Syntaxerror." );
|
player.sendUrgent( "Syntaxerror." );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( subCommand == "pos" )
|
if( subCommand == "pos" )
|
||||||
pPlayer->setPosition( static_cast< float >( posX ),
|
player.setPosition( static_cast< float >( posX ),
|
||||||
static_cast< float >( posY ),
|
static_cast< float >( posY ),
|
||||||
static_cast< float >( posZ ) );
|
static_cast< float >( posZ ) );
|
||||||
else
|
else
|
||||||
pPlayer->setPosition( pPlayer->getPos().x + static_cast< float >( posX ),
|
player.setPosition( player.getPos().x + static_cast< float >( posX ),
|
||||||
pPlayer->getPos().y + static_cast< float >( posY ),
|
player.getPos().y + static_cast< float >( posY ),
|
||||||
pPlayer->getPos().z + static_cast< float >( posZ ) );
|
player.getPos().z + static_cast< float >( posZ ) );
|
||||||
|
|
||||||
Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorSetPos >
|
Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorSetPos >
|
||||||
setActorPosPacket( pPlayer->getId() );
|
setActorPosPacket( player.getId() );
|
||||||
setActorPosPacket.data().x = pPlayer->getPos().x;
|
setActorPosPacket.data().x = player.getPos().x;
|
||||||
setActorPosPacket.data().y = pPlayer->getPos().y;
|
setActorPosPacket.data().y = player.getPos().y;
|
||||||
setActorPosPacket.data().z = pPlayer->getPos().z;
|
setActorPosPacket.data().z = player.getPos().z;
|
||||||
pPlayer->queuePacket( setActorPosPacket );
|
player.queuePacket( setActorPosPacket );
|
||||||
|
|
||||||
}
|
}
|
||||||
else if( ( subCommand == "tele" ) && ( params != "" ) )
|
else if( ( subCommand == "tele" ) && ( params != "" ) )
|
||||||
|
@ -196,7 +197,7 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
int32_t aetheryteId;
|
int32_t aetheryteId;
|
||||||
sscanf( params.c_str(), "%i", &aetheryteId );
|
sscanf( params.c_str(), "%i", &aetheryteId );
|
||||||
|
|
||||||
pPlayer->teleport( aetheryteId );
|
player.teleport( aetheryteId );
|
||||||
}
|
}
|
||||||
else if( ( subCommand == "discovery" ) && ( params != "" ) )
|
else if( ( subCommand == "discovery" ) && ( params != "" ) )
|
||||||
{
|
{
|
||||||
|
@ -204,10 +205,10 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
int32_t discover_id;
|
int32_t discover_id;
|
||||||
sscanf( params.c_str(), "%i %i", &map_id, &discover_id );
|
sscanf( params.c_str(), "%i %i", &map_id, &discover_id );
|
||||||
|
|
||||||
Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcDiscovery > discoveryPacket( pPlayer->getId() );
|
Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcDiscovery > discoveryPacket( player.getId() );
|
||||||
discoveryPacket.data().map_id = map_id;
|
discoveryPacket.data().map_id = map_id;
|
||||||
discoveryPacket.data().map_part_id = discover_id;
|
discoveryPacket.data().map_part_id = discover_id;
|
||||||
pPlayer->queuePacket( discoveryPacket );
|
player.queuePacket( discoveryPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( ( subCommand == "discovery_pos" ) && ( params != "" ) )
|
else if( ( subCommand == "discovery_pos" ) && ( params != "" ) )
|
||||||
|
@ -231,8 +232,8 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
|
|
||||||
else if( subCommand == "discovery_reset" )
|
else if( subCommand == "discovery_reset" )
|
||||||
{
|
{
|
||||||
pPlayer->resetDiscovery();
|
player.resetDiscovery();
|
||||||
pPlayer->queuePacket( Network::Packets::Server::InitUIPacket( pPlayer ) );
|
player.queuePacket( Network::Packets::Server::InitUIPacket( player ) );
|
||||||
}
|
}
|
||||||
else if( subCommand == "classjob" )
|
else if( subCommand == "classjob" )
|
||||||
{
|
{
|
||||||
|
@ -240,28 +241,28 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
|
|
||||||
sscanf( params.c_str(), "%d", &id );
|
sscanf( params.c_str(), "%d", &id );
|
||||||
|
|
||||||
if( pPlayer->getLevelForClass( static_cast<Core::Common::ClassJob> ( id ) ) == 0 )
|
if( player.getLevelForClass( static_cast< Common::ClassJob > ( id ) ) == 0 )
|
||||||
{
|
{
|
||||||
pPlayer->setLevelForClass( 1, static_cast<Core::Common::ClassJob> ( id ) );
|
player.setLevelForClass( 1, static_cast< Common::ClassJob > ( id ) );
|
||||||
pPlayer->setClassJob( static_cast<Core::Common::ClassJob> ( id ) );
|
player.setClassJob( static_cast< Common::ClassJob > ( id ) );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pPlayer->setClassJob( static_cast<Core::Common::ClassJob> ( id ) );
|
player.setClassJob( static_cast< Common::ClassJob > ( id ) );
|
||||||
}
|
}
|
||||||
else if( subCommand == "cfpenalty" )
|
else if( subCommand == "cfpenalty" )
|
||||||
{
|
{
|
||||||
int32_t minutes;
|
int32_t minutes;
|
||||||
sscanf( params.c_str(), "%d", &minutes );
|
sscanf( params.c_str(), "%d", &minutes );
|
||||||
|
|
||||||
pPlayer->setCFPenaltyMinutes( minutes );
|
player.setCFPenaltyMinutes( minutes );
|
||||||
}
|
}
|
||||||
else if( subCommand == "eorzeatime" )
|
else if( subCommand == "eorzeatime" )
|
||||||
{
|
{
|
||||||
uint64_t timestamp;
|
uint64_t timestamp;
|
||||||
sscanf( params.c_str(), "%" SCNu64, ×tamp );
|
sscanf( params.c_str(), "%" SCNu64, ×tamp );
|
||||||
|
|
||||||
pPlayer->setEorzeaTimeOffset( timestamp );
|
player.setEorzeaTimeOffset( timestamp );
|
||||||
pPlayer->sendNotice( "Eorzea time offset: " + std::to_string( timestamp ) );
|
player.sendNotice( "Eorzea time offset: " + std::to_string( timestamp ) );
|
||||||
}
|
}
|
||||||
else if( subCommand == "model" )
|
else if( subCommand == "model" )
|
||||||
{
|
{
|
||||||
|
@ -269,26 +270,26 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
sscanf( params.c_str(), "%d %d", &slot, &val );
|
sscanf( params.c_str(), "%d %d", &slot, &val );
|
||||||
|
|
||||||
pPlayer->setModelForSlot( static_cast<Inventory::EquipSlot>( slot ), val );
|
player.setModelForSlot( static_cast< Inventory::EquipSlot >( slot ), val );
|
||||||
pPlayer->sendModel();
|
player.sendModel();
|
||||||
pPlayer->sendDebug( "Model updated" );
|
player.sendDebug( "Model updated" );
|
||||||
}
|
}
|
||||||
else if( subCommand == "mount" )
|
else if( subCommand == "mount" )
|
||||||
{
|
{
|
||||||
int32_t id;
|
int32_t id;
|
||||||
sscanf( params.c_str(), "%d", &id );
|
sscanf( params.c_str(), "%d", &id );
|
||||||
|
|
||||||
pPlayer->dismount();
|
player.dismount();
|
||||||
pPlayer->mount( id );
|
player.mount( id );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( subCommand + " is not a valid SET command." );
|
player.sendUrgent( subCommand + " is not a valid SET command." );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr<Core::DebugCommand> command )
|
void Core::DebugCommandHandler::add( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
std::string subCommand;
|
std::string subCommand;
|
||||||
std::string params = "";
|
std::string params = "";
|
||||||
|
@ -311,7 +312,7 @@ void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
if( command->getName().length() + 1 + pos + 1 < strlen( data ) )
|
if( command->getName().length() + 1 + pos + 1 < strlen( data ) )
|
||||||
params = std::string( data + command->getName().length() + 1 + pos + 1 );
|
params = std::string( data + command->getName().length() + 1 + pos + 1 );
|
||||||
|
|
||||||
g_log.debug( "[" + std::to_string( pPlayer->getId() ) + "] " +
|
g_log.debug( "[" + std::to_string( player.getId() ) + "] " +
|
||||||
"subCommand " + subCommand + " params: " + params );
|
"subCommand " + subCommand + " params: " + params );
|
||||||
|
|
||||||
|
|
||||||
|
@ -323,18 +324,18 @@ void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
|
|
||||||
sscanf( params.c_str(), "%d %d %hu", &id, &duration, ¶m );
|
sscanf( params.c_str(), "%d %d %hu", &id, &duration, ¶m );
|
||||||
|
|
||||||
StatusEffect::StatusEffectPtr effect( new StatusEffect::StatusEffect( id, pPlayer, pPlayer, duration, 3000 ) );
|
StatusEffect::StatusEffectPtr effect( new StatusEffect::StatusEffect( id, player.getAsPlayer(), player.getAsPlayer(), duration, 3000 ) );
|
||||||
effect->setParam( param );
|
effect->setParam( param );
|
||||||
|
|
||||||
pPlayer->addStatusEffect( effect );
|
player.addStatusEffect( effect );
|
||||||
}
|
}
|
||||||
else if( subCommand == "title" )
|
else if( subCommand == "title" )
|
||||||
{
|
{
|
||||||
uint32_t titleId;
|
uint32_t titleId;
|
||||||
sscanf( params.c_str(), "%u", &titleId );
|
sscanf( params.c_str(), "%u", &titleId );
|
||||||
|
|
||||||
pPlayer->addTitle( titleId );
|
player.addTitle( titleId );
|
||||||
pPlayer->sendNotice( "Added title (ID: " + std::to_string( titleId ) + ")" );
|
player.sendNotice( "Added title (ID: " + std::to_string( titleId ) + ")" );
|
||||||
}
|
}
|
||||||
else if( subCommand == "spawn" )
|
else if( subCommand == "spawn" )
|
||||||
{
|
{
|
||||||
|
@ -342,9 +343,9 @@ void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
|
|
||||||
sscanf( params.c_str(), "%d %d", &model, &name );
|
sscanf( params.c_str(), "%d %d", &model, &name );
|
||||||
|
|
||||||
Entity::BattleNpcPtr pBNpc( new Entity::BattleNpc( model, name, pPlayer->getPos() ) );
|
Entity::BattleNpcPtr pBNpc( new Entity::BattleNpc( model, name, player.getPos() ) );
|
||||||
|
|
||||||
auto pZone = pPlayer->getCurrentZone();
|
auto pZone = player.getCurrentZone();
|
||||||
pBNpc->setCurrentZone( pZone );
|
pBNpc->setCurrentZone( pZone );
|
||||||
pZone->pushActor( pBNpc );
|
pZone->pushActor( pBNpc );
|
||||||
|
|
||||||
|
@ -354,8 +355,8 @@ void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
// temporary research packet
|
// temporary research packet
|
||||||
int32_t opcode;
|
int32_t opcode;
|
||||||
sscanf( params.c_str(), "%x", &opcode );
|
sscanf( params.c_str(), "%x", &opcode );
|
||||||
Network::Packets::GamePacketPtr pPe( new Network::Packets::GamePacket( opcode, 0x30, pPlayer->getId(), pPlayer->getId() ) );
|
Network::Packets::GamePacketPtr pPe( new Network::Packets::GamePacket( opcode, 0x30, player.getId(), player.getId() ) );
|
||||||
pPlayer->queuePacket( pPe );
|
player.queuePacket( pPe );
|
||||||
}
|
}
|
||||||
else if( subCommand == "actrl" )
|
else if( subCommand == "actrl" )
|
||||||
{
|
{
|
||||||
|
@ -373,9 +374,9 @@ void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
|
|
||||||
sscanf( params.c_str(), "%x %x %x %x %x %x %x %x", &opcode, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, &playerId );
|
sscanf( params.c_str(), "%x %x %x %x %x %x %x %x", &opcode, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, &playerId );
|
||||||
|
|
||||||
pPlayer->sendNotice( "Injecting ACTOR_CONTROL " + std::to_string( opcode ) );
|
player.sendNotice( "Injecting ACTOR_CONTROL " + std::to_string( opcode ) );
|
||||||
|
|
||||||
Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorControl143 > actorControl( playerId, pPlayer->getId() );
|
Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorControl143 > actorControl( playerId, player.getId() );
|
||||||
actorControl.data().category = opcode;
|
actorControl.data().category = opcode;
|
||||||
actorControl.data().param1 = param1;
|
actorControl.data().param1 = param1;
|
||||||
actorControl.data().param2 = param2;
|
actorControl.data().param2 = param2;
|
||||||
|
@ -383,18 +384,18 @@ void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
actorControl.data().param4 = param4;
|
actorControl.data().param4 = param4;
|
||||||
actorControl.data().param5 = param5;
|
actorControl.data().param5 = param5;
|
||||||
actorControl.data().param6 = param6;
|
actorControl.data().param6 = param6;
|
||||||
pPlayer->queuePacket( actorControl );
|
player.queuePacket( actorControl );
|
||||||
|
|
||||||
|
|
||||||
/*sscanf(params.c_str(), "%x %x %x %x %x %x %x", &opcode, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, &playerId);
|
/*sscanf(params.c_str(), "%x %x %x %x %x %x %x", &opcode, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, &playerId);
|
||||||
|
|
||||||
Network::Packets::Server::ServerNoticePacket noticePacket(pPlayer, "Injecting ACTOR_CONTROL " + std::to_string(opcode));
|
Network::Packets::Server::ServerNoticePacket noticePacket( player, "Injecting ACTOR_CONTROL " + std::to_string( opcode ) );
|
||||||
|
|
||||||
pPlayer->queuePacket(noticePacket);
|
player.queuePacket( noticePacket );
|
||||||
|
|
||||||
Network::Packets::Server::ActorControlPacket143 controlPacket(pPlayer, opcode,
|
Network::Packets::Server::ActorControlPacket143 controlPacket( player, opcode,
|
||||||
param1, param2, param3, param4, param5, param6, playerId);
|
param1, param2, param3, param4, param5, param6, playerId );
|
||||||
pPlayer->queuePacket(controlPacket);*/
|
player.queuePacket( controlPacket );*/
|
||||||
|
|
||||||
}
|
}
|
||||||
else if( subCommand == "unlock" )
|
else if( subCommand == "unlock" )
|
||||||
|
@ -410,13 +411,13 @@ void Core::DebugCommandHandler::add( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( subCommand + " is not a valid ADD command." );
|
player.sendUrgent( subCommand + " is not a valid ADD command." );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::DebugCommandHandler::get( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr<Core::DebugCommand> command )
|
void Core::DebugCommandHandler::get( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
std::string subCommand;
|
std::string subCommand;
|
||||||
std::string params = "";
|
std::string params = "";
|
||||||
|
@ -436,45 +437,45 @@ void Core::DebugCommandHandler::get( char * data, Core::Entity::PlayerPtr pPlaye
|
||||||
if( command->getName().length() + 1 + pos + 1 < strlen( data ) )
|
if( command->getName().length() + 1 + pos + 1 < strlen( data ) )
|
||||||
params = std::string( data + command->getName().length() + 1 + pos + 1 );
|
params = std::string( data + command->getName().length() + 1 + pos + 1 );
|
||||||
|
|
||||||
g_log.debug( "[" + std::to_string( pPlayer->getId() ) + "] " +
|
g_log.debug( "[" + std::to_string( player.getId() ) + "] " +
|
||||||
"subCommand " + subCommand + " params: " + params );
|
"subCommand " + subCommand + " params: " + params );
|
||||||
|
|
||||||
|
|
||||||
if( subCommand == "pos" )
|
if( subCommand == "pos" )
|
||||||
{
|
{
|
||||||
|
|
||||||
int16_t map_id = g_exdData.m_zoneInfoMap[pPlayer->getCurrentZone()->getId()].map_id;
|
int16_t map_id = g_exdData.m_zoneInfoMap[player.getCurrentZone()->getId()].map_id;
|
||||||
|
|
||||||
pPlayer->sendNotice( "Pos:\n" +
|
player.sendNotice( "Pos:\n" +
|
||||||
std::to_string( pPlayer->getPos().x ) + "\n" +
|
std::to_string( player.getPos().x ) + "\n" +
|
||||||
std::to_string( pPlayer->getPos().y ) + "\n" +
|
std::to_string( player.getPos().y ) + "\n" +
|
||||||
std::to_string( pPlayer->getPos().z ) + "\n" +
|
std::to_string( player.getPos().z ) + "\n" +
|
||||||
std::to_string( pPlayer->getRotation() ) + "\nMapId: " +
|
std::to_string( player.getRotation() ) + "\nMapId: " +
|
||||||
std::to_string( map_id ) + "\nZoneID: " +
|
std::to_string( map_id ) + "\nZoneID: " +
|
||||||
std::to_string( pPlayer->getCurrentZone()->getId() ) + "\n" );
|
std::to_string( player.getCurrentZone()->getId() ) + "\n" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( subCommand + " is not a valid GET command." );
|
player.sendUrgent( subCommand + " is not a valid GET command." );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::DebugCommandHandler::injectPacket( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr< Core::DebugCommand > command )
|
void Core::DebugCommandHandler::injectPacket( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
auto pSession = g_serverZone.getSession( pPlayer->getId() );
|
auto pSession = g_serverZone.getSession( player.getId() );
|
||||||
if( pSession )
|
if( pSession )
|
||||||
pSession->getZoneConnection()->injectPacket( data + 7, pPlayer );
|
pSession->getZoneConnection()->injectPacket( data + 7, player );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::DebugCommandHandler::injectChatPacket( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr< Core::DebugCommand > command )
|
void Core::DebugCommandHandler::injectChatPacket( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
auto pSession = g_serverZone.getSession( pPlayer->getId() );
|
auto pSession = g_serverZone.getSession( player.getId() );
|
||||||
if( pSession )
|
if( pSession )
|
||||||
pSession->getChatConnection()->injectPacket( data + 8, pPlayer );
|
pSession->getChatConnection()->injectPacket( data + 8, player );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::DebugCommandHandler::nudge( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command )
|
void Core::DebugCommandHandler::nudge( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
std::string subCommand;
|
std::string subCommand;
|
||||||
|
|
||||||
|
@ -483,7 +484,7 @@ void Core::DebugCommandHandler::nudge( char * data, Entity::PlayerPtr pPlayer, b
|
||||||
|
|
||||||
std::size_t spos = tmpCommand.find_first_of( " " );
|
std::size_t spos = tmpCommand.find_first_of( " " );
|
||||||
|
|
||||||
auto& pos = pPlayer->getPos();
|
auto& pos = player.getPos();
|
||||||
|
|
||||||
int32_t offset = 0;
|
int32_t offset = 0;
|
||||||
char direction[20];
|
char direction[20];
|
||||||
|
@ -491,45 +492,44 @@ void Core::DebugCommandHandler::nudge( char * data, Entity::PlayerPtr pPlayer, b
|
||||||
|
|
||||||
sscanf( tmpCommand.c_str(), "%d %s", &offset, direction );
|
sscanf( tmpCommand.c_str(), "%d %s", &offset, direction );
|
||||||
|
|
||||||
|
|
||||||
if( direction[0] == 'u' || direction[0] == '+' )
|
if( direction[0] == 'u' || direction[0] == '+' )
|
||||||
{
|
{
|
||||||
pos.y += offset;
|
pos.y += offset;
|
||||||
pPlayer->sendNotice( "nudge: Placing up " + std::to_string( offset ) + " yalms" );
|
player.sendNotice( "nudge: Placing up " + std::to_string( offset ) + " yalms" );
|
||||||
}
|
}
|
||||||
else if( direction[0] == 'd' || direction[0] == '-' )
|
else if( direction[0] == 'd' || direction[0] == '-' )
|
||||||
{
|
{
|
||||||
pos.y -= offset;
|
pos.y -= offset;
|
||||||
pPlayer->sendNotice( "nudge: Placing down " + std::to_string( offset ) + " yalms" );
|
player.sendNotice( "nudge: Placing down " + std::to_string( offset ) + " yalms" );
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float angle = pPlayer->getRotation() + ( PI / 2 );
|
float angle = player.getRotation() + ( PI / 2 );
|
||||||
pos.x -= offset * cos( angle );
|
pos.x -= offset * cos( angle );
|
||||||
pos.z += offset * sin( angle );
|
pos.z += offset * sin( angle );
|
||||||
pPlayer->sendNotice( "nudge: Placing forward " + std::to_string( offset ) + " yalms" );
|
player.sendNotice( "nudge: Placing forward " + std::to_string( offset ) + " yalms" );
|
||||||
}
|
}
|
||||||
if( offset != 0 )
|
if( offset != 0 )
|
||||||
{
|
{
|
||||||
Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorSetPos >
|
Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorSetPos >
|
||||||
setActorPosPacket( pPlayer->getId() );
|
setActorPosPacket( player.getId() );
|
||||||
setActorPosPacket.data().x = pPlayer->getPos().x;
|
setActorPosPacket.data().x = player.getPos().x;
|
||||||
setActorPosPacket.data().y = pPlayer->getPos().y;
|
setActorPosPacket.data().y = player.getPos().y;
|
||||||
setActorPosPacket.data().z = pPlayer->getPos().z;
|
setActorPosPacket.data().z = player.getPos().z;
|
||||||
setActorPosPacket.data().r16 = Math::Util::floatToUInt16Rot( pPlayer->getRotation() );
|
setActorPosPacket.data().r16 = Math::Util::floatToUInt16Rot( player.getRotation() );
|
||||||
pPlayer->queuePacket( setActorPosPacket );
|
player.queuePacket( setActorPosPacket );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::DebugCommandHandler::serverInfo( char * data, Core::Entity::PlayerPtr pPlayer, boost::shared_ptr< Core::DebugCommand > command )
|
void Core::DebugCommandHandler::serverInfo( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug( "SapphireServer " + Version::VERSION + "\nRev: " + Version::GIT_HASH );
|
player.sendDebug( "SapphireServer " + Version::VERSION + "\nRev: " + Version::GIT_HASH );
|
||||||
pPlayer->sendDebug( "Compiled: " __DATE__ " " __TIME__ );
|
player.sendDebug( "Compiled: " __DATE__ " " __TIME__ );
|
||||||
pPlayer->sendDebug( "Sessions: " + std::to_string( g_serverZone.getSessionCount() ) );
|
player.sendDebug( "Sessions: " + std::to_string( g_serverZone.getSessionCount() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::DebugCommandHandler::unlockCharacter( char* data, Entity::PlayerPtr pPlayer, boost::shared_ptr< Core::DebugCommand > command )
|
void Core::DebugCommandHandler::unlockCharacter( char* data, Entity::Player& player, boost::shared_ptr< DebugCommand > command )
|
||||||
{
|
{
|
||||||
pPlayer->unlock();
|
pPlayer->unlock();
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "DebugCommand.h"
|
#include "DebugCommand.h"
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ class DebugCommandHandler
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
// container mapping command string to command object
|
// container mapping command string to command object
|
||||||
std::map<std::string, boost::shared_ptr<DebugCommand> > m_commandMap;
|
std::map< std::string, boost::shared_ptr< DebugCommand > > m_commandMap;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DebugCommandHandler();
|
DebugCommandHandler();
|
||||||
|
@ -25,25 +25,25 @@ public:
|
||||||
void registerCommand( const std::string& n, DebugCommand::pFunc, const std::string& hText, uint8_t uLevel );
|
void registerCommand( const std::string& n, DebugCommand::pFunc, const std::string& hText, uint8_t uLevel );
|
||||||
|
|
||||||
// execute command if registered
|
// execute command if registered
|
||||||
void execCommand( char * data, Entity::PlayerPtr pPlayer );
|
void execCommand( char * data, Entity::Player& player );
|
||||||
|
|
||||||
// help command
|
// help command
|
||||||
void help( char* data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void help( char* data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
|
|
||||||
// command handler callbacks
|
// command handler callbacks
|
||||||
void set( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void set( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
void get( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void get( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
void add( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void add( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
//void debug( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
//void debug( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
void scriptReload( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void scriptReload( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
|
|
||||||
void injectPacket( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void injectPacket( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
void injectChatPacket( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void injectChatPacket( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
void nudge( char* data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void nudge( char* data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
void serverInfo( char * data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void serverInfo( char * data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
|
|
||||||
void unlockCharacter( char* data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void unlockCharacter( char* data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
void targetInfo( char* data, Entity::PlayerPtr pPlayer, boost::shared_ptr<DebugCommand> command );
|
void targetInfo( char* data, Entity::Player& player, boost::shared_ptr< DebugCommand > command );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ Core::Scripting::EventReturnCallback Core::Event::Event::getEventReturnCallback(
|
||||||
return m_callback;
|
return m_callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Event::Event::setEventReturnCallback( Core::Scripting::EventReturnCallback callback )
|
void Core::Event::Event::setEventReturnCallback( Scripting::EventReturnCallback callback )
|
||||||
{
|
{
|
||||||
m_callback = callback;
|
m_callback = callback;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
#include "EventHelper.h"
|
#include "EventHelper.h"
|
||||||
#include "Event.h"
|
#include "Event.h"
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
|
||||||
|
|
||||||
extern Core::Data::ExdData g_exdData;
|
extern Core::Data::ExdData g_exdData;
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,22 @@
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
|
|
||||||
#include "Inventory.h"
|
#include "Inventory.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
#include "ItemContainer.h"
|
#include "ItemContainer.h"
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
|
#include <boost/algorithm/clamp.hpp>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "../Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
|
|
||||||
#include <Server_Common/Database/DatabaseDef.h>
|
#include <Server_Common/Database/DatabaseDef.h>
|
||||||
|
|
||||||
|
@ -27,7 +28,7 @@ using namespace Core::Network;
|
||||||
using namespace Core::Network::Packets;
|
using namespace Core::Network::Packets;
|
||||||
using namespace Core::Network::Packets::Server;
|
using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
Core::Inventory::Inventory( Core::Entity::PlayerPtr pOwner )
|
Core::Inventory::Inventory( Core::Entity::Player* pOwner )
|
||||||
{
|
{
|
||||||
|
|
||||||
m_pOwner = pOwner;
|
m_pOwner = pOwner;
|
||||||
|
@ -438,6 +439,30 @@ bool Core::Inventory::removeCrystal( CrystalType type, uint32_t amount )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Core::Inventory::isOneHandedWeapon( ItemUICategory weaponCategory )
|
||||||
|
{
|
||||||
|
switch ( weaponCategory )
|
||||||
|
{
|
||||||
|
case ItemUICategory::AlchemistsPrimaryTool:
|
||||||
|
case ItemUICategory::ArmorersPrimaryTool:
|
||||||
|
case ItemUICategory::BotanistsPrimaryTool:
|
||||||
|
case ItemUICategory::CulinariansPrimaryTool:
|
||||||
|
case ItemUICategory::OnehandedConjurersArm:
|
||||||
|
case ItemUICategory::CarpentersPrimaryTool:
|
||||||
|
case ItemUICategory::FishersPrimaryTool:
|
||||||
|
case ItemUICategory::GladiatorsArm:
|
||||||
|
case ItemUICategory::GoldsmithsPrimaryTool:
|
||||||
|
case ItemUICategory::LeatherworkersPrimaryTool:
|
||||||
|
case ItemUICategory::MinersPrimaryTool:
|
||||||
|
case ItemUICategory::OnehandedThaumaturgesArm:
|
||||||
|
case ItemUICategory::WeaversPrimaryTool:
|
||||||
|
case ItemUICategory::BlacksmithsPrimaryTool:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool Core::Inventory::isObtainable( uint32_t catalogId, uint8_t quantity )
|
bool Core::Inventory::isObtainable( uint32_t catalogId, uint8_t quantity )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -450,7 +475,8 @@ int16_t Core::Inventory::addItem( uint16_t inventoryId, int8_t slotId, uint32_t
|
||||||
|
|
||||||
auto itemInfo = g_exdData.getItemInfo( catalogId );
|
auto itemInfo = g_exdData.getItemInfo( catalogId );
|
||||||
|
|
||||||
if( !itemInfo )
|
// if item data doesn't exist or it's a blank field
|
||||||
|
if( !itemInfo || itemInfo->item_level == 0 )
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -828,6 +854,40 @@ void Core::Inventory::send()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t Core::Inventory::calculateEquippedGearItemLevel()
|
||||||
|
{
|
||||||
|
uint32_t iLvlResult = 0;
|
||||||
|
|
||||||
|
auto gearSetMap = m_inventoryMap[GearSet0]->getItemMap();
|
||||||
|
|
||||||
|
auto it = gearSetMap.begin();
|
||||||
|
|
||||||
|
while ( it != gearSetMap.end() )
|
||||||
|
{
|
||||||
|
auto currItem = it->second;
|
||||||
|
|
||||||
|
if ( currItem )
|
||||||
|
{
|
||||||
|
iLvlResult += currItem->getItemLevel();
|
||||||
|
|
||||||
|
// If item is weapon and isn't one-handed
|
||||||
|
if ( currItem->isWeapon() && !isOneHandedWeapon( currItem->getCategory() ) )
|
||||||
|
{
|
||||||
|
iLvlResult += currItem->getItemLevel();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_log.debug( "Is one handed" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::algorithm::clamp( iLvlResult / 13, 0, 9999 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t Core::Inventory::getFreeSlotsInBags()
|
uint8_t Core::Inventory::getFreeSlotsInBags()
|
||||||
{
|
{
|
||||||
uint8_t slots = 0;
|
uint8_t slots = 0;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef INVENTORY_H_
|
#ifndef INVENTORY_H_
|
||||||
#define INVENTORY_H_
|
#define INVENTORY_H_
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "../Forwards.h"
|
||||||
|
|
||||||
namespace Core
|
namespace Core
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,7 @@ using InventoryMap = std::map< uint16_t, ItemContainerPtr >;
|
||||||
class Inventory
|
class Inventory
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Inventory( Entity::PlayerPtr pOwner );
|
Inventory( Entity::Player* pOwner );
|
||||||
~Inventory();
|
~Inventory();
|
||||||
|
|
||||||
enum ContainerType : uint16_t
|
enum ContainerType : uint16_t
|
||||||
|
@ -153,6 +153,10 @@ public:
|
||||||
|
|
||||||
bool updateContainer( uint16_t containerId, uint8_t slotId, ItemPtr pItem );
|
bool updateContainer( uint16_t containerId, uint8_t slotId, ItemPtr pItem );
|
||||||
|
|
||||||
|
/*! heck if weapon category qualifies the weapon as onehanded */
|
||||||
|
bool isOneHandedWeapon( Common::ItemUICategory weaponCategory );
|
||||||
|
/*! calculate and return player ilvl based off equipped gear */
|
||||||
|
uint16_t calculateEquippedGearItemLevel();
|
||||||
/*! return the current amount of currency of type */
|
/*! return the current amount of currency of type */
|
||||||
uint32_t getCurrency( CurrencyType type );
|
uint32_t getCurrency( CurrencyType type );
|
||||||
/*! add amount to the current of type */
|
/*! add amount to the current of type */
|
||||||
|
@ -191,7 +195,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Entity::PlayerPtr m_pOwner;
|
Entity::Player* m_pOwner;
|
||||||
InventoryMap m_inventoryMap;
|
InventoryMap m_inventoryMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
|
|
||||||
extern Core::Data::ExdData g_exdData;
|
extern Core::Data::ExdData g_exdData;
|
||||||
|
@ -30,6 +30,7 @@ Core::Item::Item( uint64_t uId, uint32_t catalogId, uint64_t model1, uint64_t mo
|
||||||
m_magicalDmg = itemInfo->magical_damage;
|
m_magicalDmg = itemInfo->magical_damage;
|
||||||
m_weaponDmg = ( m_physicalDmg != 0 ) ? m_physicalDmg : m_magicalDmg;
|
m_weaponDmg = ( m_physicalDmg != 0 ) ? m_physicalDmg : m_magicalDmg;
|
||||||
m_autoAttackDmg = static_cast< float >( m_weaponDmg * m_delayMs ) / 3000;
|
m_autoAttackDmg = static_cast< float >( m_weaponDmg * m_delayMs ) / 3000;
|
||||||
|
m_itemLevel = itemInfo->item_level;
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::Item::~Item()
|
Core::Item::~Item()
|
||||||
|
@ -57,11 +58,21 @@ uint16_t Core::Item::getMagicalDmg() const
|
||||||
return m_magicalDmg;
|
return m_magicalDmg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t Core::Item::getItemLevel() const
|
||||||
|
{
|
||||||
|
return m_itemLevel;
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t Core::Item::getWeaponDmg() const
|
uint16_t Core::Item::getWeaponDmg() const
|
||||||
{
|
{
|
||||||
return m_weaponDmg;
|
return m_weaponDmg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Core::Item::isWeapon() const
|
||||||
|
{
|
||||||
|
return (m_weaponDmg != 0);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t Core::Item::getId() const
|
uint32_t Core::Item::getId() const
|
||||||
{
|
{
|
||||||
return m_id;
|
return m_id;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef _ITEM_H_
|
#ifndef _ITEM_H_
|
||||||
#define _ITEM_H_
|
#define _ITEM_H_
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
|
@ -48,8 +48,12 @@ public:
|
||||||
|
|
||||||
uint16_t getWeaponDmg() const;
|
uint16_t getWeaponDmg() const;
|
||||||
|
|
||||||
|
bool isWeapon() const;
|
||||||
|
|
||||||
float getAutoAttackDmg() const;
|
float getAutoAttackDmg() const;
|
||||||
|
|
||||||
|
uint16_t getItemLevel() const;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint32_t m_id;
|
uint32_t m_id;
|
||||||
|
@ -71,9 +75,10 @@ protected:
|
||||||
uint16_t m_magicalDmg;
|
uint16_t m_magicalDmg;
|
||||||
uint16_t m_weaponDmg;
|
uint16_t m_weaponDmg;
|
||||||
float m_autoAttackDmg;
|
float m_autoAttackDmg;
|
||||||
|
uint16_t m_itemLevel;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "../Forwards.h"
|
||||||
#include "ItemContainer.h"
|
#include "ItemContainer.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
|
#include <Server_Common/Database/DatabaseDef.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
|
|
||||||
#include <Server_Common/Database/DatabaseDef.h>
|
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ Core::ItemPtr Core::ItemContainer::getItem( uint8_t slotId )
|
||||||
return m_itemMap[slotId];
|
return m_itemMap[slotId];
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::ItemContainer::setItem( uint8_t slotId, Core::ItemPtr pItem )
|
void Core::ItemContainer::setItem( uint8_t slotId, ItemPtr pItem )
|
||||||
{
|
{
|
||||||
if( ( slotId > m_size ) )
|
if( ( slotId > m_size ) )
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
#pragma once
|
|
||||||
#ifndef _ITEMCONTAINER_H_
|
#ifndef _ITEMCONTAINER_H_
|
||||||
#define _ITEMCONTAINER_H_
|
#define _ITEMCONTAINER_H_
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
|
||||||
#include "../Forwards.h"
|
#include "../Forwards.h"
|
||||||
|
|
||||||
|
@ -17,7 +16,7 @@ namespace Core
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ItemContainer(uint16_t locationId);
|
ItemContainer( uint16_t locationId );
|
||||||
~ItemContainer();
|
~ItemContainer();
|
||||||
|
|
||||||
uint16_t getId() const;
|
uint16_t getId() const;
|
||||||
|
@ -30,9 +29,9 @@ namespace Core
|
||||||
|
|
||||||
const ItemMap& getItemMap() const;
|
const ItemMap& getItemMap() const;
|
||||||
|
|
||||||
ItemPtr getItem(uint8_t slotId);
|
ItemPtr getItem( uint8_t slotId );
|
||||||
|
|
||||||
void setItem(uint8_t slotId, ItemPtr item);
|
void setItem( uint8_t slotId, ItemPtr item );
|
||||||
|
|
||||||
int16_t getFreeSlot();
|
int16_t getFreeSlot();
|
||||||
|
|
||||||
|
@ -45,4 +44,4 @@ namespace Core
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,9 +2,8 @@
|
||||||
|
|
||||||
#include <Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <Server_Zone/Actor/Actor.h>
|
#include "Actor/Actor.h"
|
||||||
#include <Server_Zone/Actor/Player.h>
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
#include "CalcBattle.h"
|
#include "CalcBattle.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,4 +41,4 @@ uint32_t CalcBattle::calculateHealValue( PlayerPtr pPlayer, uint32_t potency )
|
||||||
|
|
||||||
// consider 3% variation
|
// consider 3% variation
|
||||||
return potency / 10;
|
return potency / 10;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define _CALCBATTLE_H
|
#define _CALCBATTLE_H
|
||||||
|
|
||||||
#include <Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <Server_Zone/Actor/Actor.h>
|
#include "Actor/Actor.h"
|
||||||
|
|
||||||
using namespace Core::Entity;
|
using namespace Core::Entity;
|
||||||
|
|
||||||
|
@ -21,4 +21,4 @@ namespace Math {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
#include <Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <Server_Zone/Actor/Actor.h>
|
#include "Actor/Actor.h"
|
||||||
#include <Server_Zone/Actor/Player.h>
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
#include "CalcStats.h"
|
#include "CalcStats.h"
|
||||||
|
|
||||||
|
@ -111,4 +111,4 @@ uint32_t CalcStats::calculateMaxMp( PlayerPtr pPlayer )
|
||||||
uint16_t result = static_cast< uint16_t >( floor( floor( piety - baseStat ) * ( pietyScalar / 100 ) + baseMp ) * jobModMp / 100 );
|
uint16_t result = static_cast< uint16_t >( floor( floor( piety - baseStat ) * ( pietyScalar / 100 ) + baseMp ) * jobModMp / 100 );
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define _CALCSTATS_H
|
#define _CALCSTATS_H
|
||||||
|
|
||||||
#include <Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <Server_Zone/Actor/Actor.h>
|
#include "Actor/Actor.h"
|
||||||
|
|
||||||
using namespace Core::Entity;
|
using namespace Core::Entity;
|
||||||
|
|
||||||
|
@ -23,4 +23,4 @@ namespace Math {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketParser.h>
|
#include <Server_Common/Network/GamePacketParser.h>
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
#include "GameConnection.h"
|
#include "GameConnection.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Session.h"
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h"
|
#include "Network/PacketWrappers/InitUIPacket.h"
|
||||||
#include "src/servers/Server_Zone/DebugCommand/DebugCommandHandler.h"
|
#include "DebugCommand/DebugCommandHandler.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
extern Core::DebugCommandHandler g_gameCommandMgr;
|
extern Core::DebugCommandHandler g_gameCommandMgr;
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
|
@ -133,8 +133,7 @@ void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer )
|
||||||
Disconnect();
|
Disconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if( headerResult == Malformed )
|
||||||
if( headerResult == Malformed )
|
|
||||||
{
|
{
|
||||||
g_log.info( "Dropping connection due to malformed packet header." );
|
g_log.info( "Dropping connection due to malformed packet header." );
|
||||||
Disconnect();
|
Disconnect();
|
||||||
|
@ -153,8 +152,7 @@ void Core::Network::GameConnection::OnRecv( std::vector< uint8_t > & buffer )
|
||||||
Disconnect();
|
Disconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if( packetResult == Malformed )
|
||||||
if (packetResult == Malformed)
|
|
||||||
{
|
{
|
||||||
g_log.info( "Dropping connection due to malformed packets." );
|
g_log.info( "Dropping connection due to malformed packets." );
|
||||||
Disconnect();
|
Disconnect();
|
||||||
|
@ -198,7 +196,7 @@ void Core::Network::GameConnection::handleZonePacket( const Packets::GamePacket&
|
||||||
boost::str( boost::format( "%|04X|" ) %
|
boost::str( boost::format( "%|04X|" ) %
|
||||||
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" );
|
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" );
|
||||||
|
|
||||||
( this->*( it->second ) )( pPacket, m_pSession->getPlayer() );
|
( this->*( it->second ) )( pPacket, *m_pSession->getPlayer() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -226,7 +224,7 @@ void Core::Network::GameConnection::handleChatPacket( const Packets::GamePacket&
|
||||||
boost::str( boost::format( "%|04X|" ) %
|
boost::str( boost::format( "%|04X|" ) %
|
||||||
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" );
|
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" );
|
||||||
|
|
||||||
( this->*( it->second ) )( pPacket, m_pSession->getPlayer() );
|
( this->*( it->second ) )( pPacket, *m_pSession->getPlayer() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -309,7 +307,7 @@ void Core::Network::GameConnection::sendSinglePacket( Packets::GamePacket* pPack
|
||||||
sendPackets( &pRP );
|
sendPackets( &pRP );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::injectPacket( const std::string& packetpath, Core::Entity::PlayerPtr pPlayer )
|
void Core::Network::GameConnection::injectPacket( const std::string& packetpath, Core::Entity::Player& pPlayer )
|
||||||
{
|
{
|
||||||
|
|
||||||
char packet[0x11570];
|
char packet[0x11570];
|
||||||
|
@ -338,7 +336,7 @@ void Core::Network::GameConnection::injectPacket( const std::string& packetpath,
|
||||||
// cycle through the packet entries and queue each one
|
// cycle through the packet entries and queue each one
|
||||||
for( int32_t k = 0x18; k < size; )
|
for( int32_t k = 0x18; k < size; )
|
||||||
{
|
{
|
||||||
uint32_t tmpId = pPlayer->getId();
|
uint32_t tmpId = pPlayer.getId();
|
||||||
// replace ids in the entryheader if needed
|
// replace ids in the entryheader if needed
|
||||||
if( !memcmp( packet + k + 0x04, packet + k + 0x08, 4 ) )
|
if( !memcmp( packet + k + 0x04, packet + k + 0x08, 4 ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,18 +1,15 @@
|
||||||
|
|
||||||
#ifndef GAMECONNECTION_H
|
#ifndef GAMECONNECTION_H
|
||||||
#define GAMECONNECTION_H
|
#define GAMECONNECTION_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/Connection.h>
|
#include <Server_Common/Network/Connection.h>
|
||||||
#include <src/servers/Server_Common/Network/Acceptor.h>
|
#include <Server_Common/Network/Acceptor.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
|
#include <Server_Common/Network/GamePacket.h>
|
||||||
|
#include <Server_Common/Util/LockedQueue.h>
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacket.h>
|
#include "Forwards.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Util/LockedQueue.h>
|
#define DECLARE_HANDLER( x ) void x( const Packets::GamePacket& inPacket, Entity::Player& player )
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
|
||||||
|
|
||||||
#define DECLARE_HANDLER( x ) void x( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer )
|
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
@ -29,18 +26,18 @@ class GameConnection : public Connection
|
||||||
{
|
{
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef void ( GameConnection::* Handler )( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer );
|
typedef void ( GameConnection::* Handler )( const Packets::GamePacket& inPacket, Entity::Player& player );
|
||||||
|
|
||||||
using HandlerMap = std::map< uint16_t, Handler >;
|
using HandlerMap = std::map< uint16_t, Handler >;
|
||||||
using HandlerStrMap = std::map< uint16_t, std::string >;
|
using HandlerStrMap = std::map< uint16_t, std::string >;
|
||||||
|
|
||||||
AcceptorPtr m_pAcceptor;
|
AcceptorPtr m_pAcceptor;
|
||||||
|
|
||||||
// handler for game packets (main type 0x03, connection type 1)
|
// handler for game packets ( main type 0x03, connection type 1 )
|
||||||
HandlerMap m_zoneHandlerMap;
|
HandlerMap m_zoneHandlerMap;
|
||||||
HandlerStrMap m_zoneHandlerStrMap;
|
HandlerStrMap m_zoneHandlerStrMap;
|
||||||
|
|
||||||
// handler for game packets (main type 0x03, connection type 2)
|
// handler for game packets ( main type 0x03, connection type 2 )
|
||||||
HandlerMap m_chatHandlerMap;
|
HandlerMap m_chatHandlerMap;
|
||||||
HandlerStrMap m_chatHandlerStrMap;
|
HandlerStrMap m_chatHandlerStrMap;
|
||||||
|
|
||||||
|
@ -80,11 +77,11 @@ public:
|
||||||
|
|
||||||
void handleChatPacket( const Packets::GamePacket& pPacket );
|
void handleChatPacket( const Packets::GamePacket& pPacket );
|
||||||
|
|
||||||
void sendPackets( Packets::PacketContainer * pPacket );
|
void sendPackets( Packets::PacketContainer* pPacket );
|
||||||
|
|
||||||
void sendSinglePacket( Packets::GamePacket * pPacket );
|
void sendSinglePacket( Packets::GamePacket* pPacket );
|
||||||
|
|
||||||
void injectPacket( const std::string& packetpath, Entity::PlayerPtr pPlayer );
|
void injectPacket( const std::string& packetpath, Entity::Player& player );
|
||||||
|
|
||||||
DECLARE_HANDLER( initHandler );
|
DECLARE_HANDLER( initHandler );
|
||||||
DECLARE_HANDLER( finishLoadingHandler );
|
DECLARE_HANDLER( finishLoadingHandler );
|
||||||
|
|
|
@ -1,39 +1,39 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Session.h"
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
#include "src/servers/Server_Zone/Zone/ZonePosition.h"
|
#include "Zone/ZonePosition.h"
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
#include "src/servers/Server_Zone/Zone/ZoneMgr.h"
|
#include "Zone/ZoneMgr.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h"
|
#include "Network/PacketWrappers/InitUIPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PingPacket.h"
|
#include "Network/PacketWrappers/PingPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/MoveActorPacket.h"
|
#include "Network/PacketWrappers/MoveActorPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ChatPacket.h"
|
#include "Network/PacketWrappers/ChatPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventStartPacket.h"
|
#include "Network/PacketWrappers/EventStartPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventFinishPacket.h"
|
#include "Network/PacketWrappers/EventFinishPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/DebugCommand/DebugCommandHandler.h"
|
#include "DebugCommand/DebugCommandHandler.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
#include "Inventory/Inventory.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Event/EventHelper.h"
|
#include "Event/EventHelper.h"
|
||||||
#include "src/servers/Server_Zone/Action/Action.h"
|
#include "Action/Action.h"
|
||||||
#include "src/servers/Server_Zone/Action/ActionTeleport.h"
|
#include "Action/ActionTeleport.h"
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
extern Core::ServerZone g_serverZone;
|
extern Core::ServerZone g_serverZone;
|
||||||
|
@ -46,7 +46,7 @@ using namespace Core::Network::Packets;
|
||||||
using namespace Core::Network::Packets::Server;
|
using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
uint16_t commandId = inPacket.getValAt< uint16_t >( 0x20 );
|
uint16_t commandId = inPacket.getValAt< uint16_t >( 0x20 );
|
||||||
uint64_t param1 = inPacket.getValAt< uint64_t >( 0x24 );
|
uint64_t param1 = inPacket.getValAt< uint64_t >( 0x24 );
|
||||||
|
@ -70,14 +70,14 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
||||||
case 0x01: // Toggle sheathe
|
case 0x01: // Toggle sheathe
|
||||||
{
|
{
|
||||||
if ( param11 == 1 )
|
if ( param11 == 1 )
|
||||||
pPlayer->setStance( Entity::Actor::Stance::Active );
|
player.setStance( Entity::Actor::Stance::Active );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pPlayer->setStance( Entity::Actor::Stance::Passive );
|
player.setStance( Entity::Actor::Stance::Passive );
|
||||||
pPlayer->setAutoattack( false );
|
player.setAutoattack( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), 0, param11, 1 ) );
|
player.sendToInRangeSet( ActorControlPacket142( player.getId(), 0, param11, 1 ) );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -85,13 +85,13 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
||||||
{
|
{
|
||||||
if ( param11 == 1 )
|
if ( param11 == 1 )
|
||||||
{
|
{
|
||||||
pPlayer->setAutoattack( true );
|
player.setAutoattack( true );
|
||||||
pPlayer->setStance( Entity::Actor::Stance::Active );
|
player.setStance( Entity::Actor::Stance::Active );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pPlayer->setAutoattack( false );
|
player.setAutoattack( false );
|
||||||
|
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), 1, param11, 1 ) );
|
player.sendToInRangeSet( ActorControlPacket142( player.getId(), 1, param11, 1 ) );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -99,51 +99,51 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
||||||
{
|
{
|
||||||
|
|
||||||
uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 );
|
uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 );
|
||||||
pPlayer->changeTarget( targetId );
|
player.changeTarget( targetId );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x65:
|
case 0x65:
|
||||||
{
|
{
|
||||||
pPlayer->dismount();
|
player.dismount();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x68: // Remove status (clicking it off)
|
case 0x68: // 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
|
||||||
pPlayer->removeSingleStatusEffectFromId( static_cast< uint32_t >( param1 ) );
|
player.removeSingleStatusEffectById( static_cast< uint32_t >( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x69: // Cancel cast
|
case 0x69: // Cancel cast
|
||||||
{
|
{
|
||||||
if( pPlayer->getCurrentAction() )
|
if( player.getCurrentAction() )
|
||||||
pPlayer->getCurrentAction()->setInterrupted();
|
player.getCurrentAction()->setInterrupted();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x12E: // Set player title
|
case 0x12E: // Set player title
|
||||||
{
|
{
|
||||||
pPlayer->setTitle( static_cast< uint16_t >( param1 ) );
|
player.setTitle( static_cast< uint16_t >( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x12F: // Get title list
|
case 0x12F: // Get title list
|
||||||
{
|
{
|
||||||
ZoneChannelPacket< FFXIVIpcPlayerTitleList > titleListPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcPlayerTitleList > titleListPacket( player.getId() );
|
||||||
memcpy( titleListPacket.data().titleList, pPlayer->getTitleList(), sizeof( titleListPacket.data().titleList ) );
|
memcpy( titleListPacket.data().titleList, player.getTitleList(), sizeof( titleListPacket.data().titleList ) );
|
||||||
|
|
||||||
pPlayer->queuePacket( titleListPacket );
|
player.queuePacket( titleListPacket );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x133: // Update howtos seen
|
case 0x133: // Update howtos seen
|
||||||
{
|
{
|
||||||
uint32_t howToId = static_cast< uint32_t >( param1 );
|
uint32_t howToId = static_cast< uint32_t >( param1 );
|
||||||
pPlayer->updateHowtosSeen( howToId );
|
player.updateHowtosSeen( howToId );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x1F4: // emote
|
case 0x1F4: // emote
|
||||||
{
|
{
|
||||||
uint64_t targetId = pPlayer->getTargetId();
|
uint64_t targetId = player.getTargetId();
|
||||||
uint32_t emoteId = inPacket.getValAt< uint32_t >( 0x24 );
|
uint32_t emoteId = inPacket.getValAt< uint32_t >( 0x24 );
|
||||||
|
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket144( pPlayer->getId(), Emote, emoteId, 0, 0, 0, targetId ) );
|
player.sendToInRangeSet( ActorControlPacket144( player.getId(), Emote, emoteId, 0, 0, 0, targetId ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0xC8: // return dead
|
case 0xC8: // return dead
|
||||||
|
@ -152,10 +152,10 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
||||||
{
|
{
|
||||||
case ResurrectType::RaiseSpell:
|
case ResurrectType::RaiseSpell:
|
||||||
// todo: handle raise case (set position to raiser, apply weakness status, set hp/mp/tp as well as packet)
|
// todo: handle raise case (set position to raiser, apply weakness status, set hp/mp/tp as well as packet)
|
||||||
pPlayer->returnToHomepoint();
|
player.returnToHomepoint();
|
||||||
break;
|
break;
|
||||||
case ResurrectType::Return:
|
case ResurrectType::Return:
|
||||||
pPlayer->returnToHomepoint();
|
player.returnToHomepoint();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -164,39 +164,39 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
||||||
}
|
}
|
||||||
case 0xC9: // Finish zoning
|
case 0xC9: // Finish zoning
|
||||||
{
|
{
|
||||||
switch( pPlayer->getZoningType() )
|
switch( player.getZoningType() )
|
||||||
{
|
{
|
||||||
case ZoneingType::None:
|
case ZoneingType::None:
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01 ), true );
|
player.sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01 ), true );
|
||||||
break;
|
break;
|
||||||
case ZoneingType::Teleport:
|
case ZoneingType::Teleport:
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0, 0, 110 ), true );
|
player.sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01, 0, 0, 110 ), true );
|
||||||
break;
|
break;
|
||||||
case ZoneingType::Return:
|
case ZoneingType::Return:
|
||||||
case ZoneingType::ReturnDead:
|
case ZoneingType::ReturnDead:
|
||||||
{
|
{
|
||||||
if( pPlayer->getStatus() == Entity::Actor::ActorStatus::Dead )
|
if( player.getStatus() == Entity::Actor::ActorStatus::Dead )
|
||||||
{
|
{
|
||||||
pPlayer->resetHp();
|
player.resetHp();
|
||||||
pPlayer->resetMp();
|
player.resetMp();
|
||||||
pPlayer->setStatus( Entity::Actor::ActorStatus::Idle );
|
player.setStatus( Entity::Actor::ActorStatus::Idle );
|
||||||
|
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 111 ), true );
|
player.sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01, 0x01, 0, 111 ), true );
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus, static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true );
|
player.sendToInRangeSet( ActorControlPacket142( player.getId(), SetStatus, static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x00, 0, 111 ), true );
|
player.sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01, 0x00, 0, 111 ), true );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ZoneingType::FadeIn:
|
case ZoneingType::FadeIn:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pPlayer->setZoningType( Common::ZoneingType::None );
|
player.setZoningType( Common::ZoneingType::None );
|
||||||
|
|
||||||
pPlayer->unsetStateFlag( PlayerStateFlag::BetweenAreas );
|
player.unsetStateFlag( PlayerStateFlag::BetweenAreas );
|
||||||
pPlayer->unsetStateFlag( PlayerStateFlag::BetweenAreas1 );
|
player.unsetStateFlag( PlayerStateFlag::BetweenAreas1 );
|
||||||
pPlayer->sendStateFlags();
|
player.sendStateFlags();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
||||||
|
|
||||||
if( targetAetheryte )
|
if( targetAetheryte )
|
||||||
{
|
{
|
||||||
auto fromAetheryte = g_exdData.getAetheryteInfo( g_exdData.m_zoneInfoMap[pPlayer->getZoneId()].aetheryte_index );
|
auto fromAetheryte = g_exdData.getAetheryteInfo( g_exdData.m_zoneInfoMap[player.getZoneId()].aetheryte_index );
|
||||||
|
|
||||||
// calculate cost - does not apply for favorite points or homepoints neither checks for aether tickets
|
// calculate cost - does not apply for favorite points or homepoints neither checks for aether tickets
|
||||||
auto cost = static_cast< uint16_t > ( ( sqrt( pow( fromAetheryte->map_coord_x - targetAetheryte->map_coord_x, 2 ) +
|
auto cost = static_cast< uint16_t > ( ( sqrt( pow( fromAetheryte->map_coord_x - targetAetheryte->map_coord_x, 2 ) +
|
||||||
|
@ -216,22 +216,27 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
|
||||||
// cap at 999 gil
|
// cap at 999 gil
|
||||||
cost = cost > uint16_t{999} ? uint16_t{999} : cost;
|
cost = cost > uint16_t{999} ? uint16_t{999} : cost;
|
||||||
|
|
||||||
bool insufficientGil = pPlayer->getCurrency( Inventory::CurrencyType::Gil ) < cost;
|
bool insufficientGil = player.getCurrency( Inventory::CurrencyType::Gil ) < cost;
|
||||||
// todo: figure out what param1 really does
|
// todo: figure out what param1 really does
|
||||||
pPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), TeleportStart, insufficientGil ? 2 : 0, param11 ) );
|
player.queuePacket( ActorControlPacket143( player.getId(), TeleportStart, insufficientGil ? 2 : 0, param11 ) );
|
||||||
|
|
||||||
if( !insufficientGil )
|
if( !insufficientGil )
|
||||||
{
|
{
|
||||||
Action::ActionTeleportPtr pActionTeleport( new Action::ActionTeleport( pPlayer, param11, cost ) );
|
Action::ActionTeleportPtr pActionTeleport( new Action::ActionTeleport( player.getAsPlayer(), param11, cost ) );
|
||||||
pPlayer->setCurrentAction( pActionTeleport );
|
player.setCurrentAction( pActionTeleport );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 0x1B5: // Dye item
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Unhandled action: " +
|
g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Unhandled action: " +
|
||||||
boost::str( boost::format( "%|04X|" ) % (uint32_t) ( commandId & 0xFFFF ) ) );
|
boost::str( boost::format( "%|04X|" ) % (uint32_t) ( commandId & 0xFFFF ) ) );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +1,19 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
|
||||||
|
|
||||||
|
#include "Network/GameConnection.h"
|
||||||
|
#include "Session.h"
|
||||||
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
|
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
||||||
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
|
#include "Forwards.h"
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
|
|
||||||
|
@ -25,11 +23,11 @@ using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
|
|
||||||
void Core::Network::GameConnection::cfDutyInfoRequest( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::cfDutyInfoRequest( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
ZoneChannelPacket< FFXIVIpcCFDutyInfo > dutyInfoPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcCFDutyInfo > dutyInfoPacket( player.getId() );
|
||||||
|
|
||||||
auto penaltyMinutes = pPlayer->getCFPenaltyMinutes();
|
auto penaltyMinutes = player.getCFPenaltyMinutes();
|
||||||
if (penaltyMinutes > 255)
|
if (penaltyMinutes > 255)
|
||||||
{
|
{
|
||||||
// cap it since it's uint8_t in packets
|
// cap it since it's uint8_t in packets
|
||||||
|
@ -39,13 +37,13 @@ void Core::Network::GameConnection::cfDutyInfoRequest( const Packets::GamePacket
|
||||||
|
|
||||||
queueOutPacket( dutyInfoPacket );
|
queueOutPacket( dutyInfoPacket );
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcCFPlayerInNeed > inNeedsPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcCFPlayerInNeed > inNeedsPacket( player.getId() );
|
||||||
queueOutPacket( inNeedsPacket );
|
queueOutPacket( inNeedsPacket );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::cfRegisterDuty( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::cfRegisterDuty( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer)
|
Entity::Player& player)
|
||||||
{
|
{
|
||||||
// TODO use for loop for this
|
// TODO use for loop for this
|
||||||
auto contentId1 = inPacket.getValAt< uint16_t >( 46 );
|
auto contentId1 = inPacket.getValAt< uint16_t >( 46 );
|
||||||
|
@ -54,28 +52,28 @@ void Core::Network::GameConnection::cfRegisterDuty( const Packets::GamePacket& i
|
||||||
auto contentId4 = inPacket.getValAt< uint16_t >( 52 );
|
auto contentId4 = inPacket.getValAt< uint16_t >( 52 );
|
||||||
auto contentId5 = inPacket.getValAt< uint16_t >( 54 );
|
auto contentId5 = inPacket.getValAt< uint16_t >( 54 );
|
||||||
|
|
||||||
pPlayer->sendDebug("Duty register request");
|
player.sendDebug("Duty register request");
|
||||||
pPlayer->sendDebug("ContentId1" + std::to_string(contentId1));
|
player.sendDebug("ContentId1" + std::to_string(contentId1));
|
||||||
pPlayer->sendDebug("ContentId2" + std::to_string(contentId2));
|
player.sendDebug("ContentId2" + std::to_string(contentId2));
|
||||||
pPlayer->sendDebug("ContentId3" + std::to_string(contentId3));
|
player.sendDebug("ContentId3" + std::to_string(contentId3));
|
||||||
pPlayer->sendDebug("ContentId4" + std::to_string(contentId4));
|
player.sendDebug("ContentId4" + std::to_string(contentId4));
|
||||||
pPlayer->sendDebug("ContentId5" + std::to_string(contentId5));
|
player.sendDebug("ContentId5" + std::to_string(contentId5));
|
||||||
|
|
||||||
// let's cancel it because otherwise you can't register it again
|
// let's cancel it because otherwise you can't register it again
|
||||||
ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( player.getId() );
|
||||||
cfCancelPacket.data().state1 = 3;
|
cfCancelPacket.data().state1 = 3;
|
||||||
cfCancelPacket.data().state2 = 1; // Your registration is withdrawn.
|
cfCancelPacket.data().state2 = 1; // Your registration is withdrawn.
|
||||||
queueOutPacket( cfCancelPacket );
|
queueOutPacket( cfCancelPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::cfRegisterRoulette( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::cfRegisterRoulette( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer)
|
Entity::Player& player)
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug("Roulette register");
|
player.sendDebug("Roulette register");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::cfDutyAccepted( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::cfDutyAccepted( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer)
|
Entity::Player& player)
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug("TODO: Duty accept");
|
player.sendDebug("TODO: Duty accept");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Session.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventStartPacket.h"
|
#include "Network/PacketWrappers/EventStartPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventFinishPacket.h"
|
#include "Network/PacketWrappers/EventFinishPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Script/ScriptManager.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Event/EventHelper.h"
|
#include "Event/EventHelper.h"
|
||||||
|
|
||||||
extern Core::Scripting::ScriptManager g_scriptMgr;
|
extern Core::Scripting::ScriptManager g_scriptMgr;
|
||||||
|
|
||||||
|
@ -27,22 +27,22 @@ using namespace Core::Network::Packets;
|
||||||
using namespace Core::Network::Packets::Server;
|
using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
uint16_t eventHandlerId = inPacket.getValAt< uint16_t >( 0x12 );
|
uint16_t eventHandlerId = inPacket.getValAt< uint16_t >( 0x12 );
|
||||||
|
|
||||||
// we need to abort the event in case it has not been scripted so the player wont be locked up
|
// we need to abort the event in case it has not been scripted so the player wont be locked up
|
||||||
auto abortEventFunc = []( Core::Entity::PlayerPtr pPlayer, uint64_t actorId, uint32_t eventId )
|
auto abortEventFunc = []( Core::Entity::Player& player, uint64_t actorId, uint32_t eventId )
|
||||||
{
|
{
|
||||||
pPlayer->queuePacket( EventStartPacket( pPlayer->getId(), actorId, eventId, 1, 0, 0 ) );
|
player.queuePacket( EventStartPacket( player.getId(), actorId, eventId, 1, 0, 0 ) );
|
||||||
pPlayer->queuePacket( EventFinishPacket( pPlayer->getId(), eventId, 1, 0 ) );
|
player.queuePacket( EventFinishPacket( player.getId(), eventId, 1, 0 ) );
|
||||||
// this isn't ideal as it will also reset any other status that might be active
|
// this isn't ideal as it will also reset any other status that might be active
|
||||||
pPlayer->queuePacket( PlayerStateFlagsPacket( pPlayer, PlayerStateFlagList{} ) );
|
player.queuePacket( PlayerStateFlagsPacket( player, PlayerStateFlagList{} ) );
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string eventIdStr = boost::str( boost::format( "%|04X|" ) % static_cast< uint32_t >( eventHandlerId & 0xFFFF ) );
|
std::string eventIdStr = boost::str( boost::format( "%|04X|" ) % static_cast< uint32_t >( eventHandlerId & 0xFFFF ) );
|
||||||
pPlayer->sendDebug( "---------------------------------------" );
|
player.sendDebug( "---------------------------------------" );
|
||||||
pPlayer->sendDebug( "EventHandler ( " + eventIdStr + " )" );
|
player.sendDebug( "EventHandler ( " + eventIdStr + " )" );
|
||||||
|
|
||||||
switch( eventHandlerId )
|
switch( eventHandlerId )
|
||||||
{
|
{
|
||||||
|
@ -52,8 +52,8 @@ void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inP
|
||||||
uint64_t actorId = inPacket.getValAt< uint64_t >( 0x20 );
|
uint64_t actorId = inPacket.getValAt< uint64_t >( 0x20 );
|
||||||
uint32_t eventId = inPacket.getValAt< uint32_t >( 0x28 );
|
uint32_t eventId = inPacket.getValAt< uint32_t >( 0x28 );
|
||||||
|
|
||||||
if( !g_scriptMgr.onTalk( pPlayer, actorId, eventId ) )
|
if( !g_scriptMgr.onTalk( player, actorId, eventId ) )
|
||||||
abortEventFunc( pPlayer, actorId, eventId );
|
abortEventFunc( player, actorId, eventId );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,8 +65,8 @@ void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inP
|
||||||
|
|
||||||
std::string eventName = Event::getEventName( eventId );
|
std::string eventName = Event::getEventName( eventId );
|
||||||
|
|
||||||
if( !g_scriptMgr.onEmote( pPlayer, actorId, eventId, static_cast< uint8_t >( emoteId ) ) )
|
if( !g_scriptMgr.onEmote( player, actorId, eventId, static_cast< uint8_t >( emoteId ) ) )
|
||||||
abortEventFunc( pPlayer, actorId, eventId );
|
abortEventFunc( player, actorId, eventId );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,8 +81,8 @@ void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inP
|
||||||
|
|
||||||
std::string eventName = Event::getEventName( eventId );
|
std::string eventName = Event::getEventName( eventId );
|
||||||
|
|
||||||
if( !g_scriptMgr.onWithinRange( pPlayer, eventId, eventParam1, x, y, z ) )
|
if( !g_scriptMgr.onWithinRange( player, eventId, eventParam1, x, y, z ) )
|
||||||
abortEventFunc( pPlayer, 0, eventId );
|
abortEventFunc( player, 0, eventId );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,8 +96,8 @@ void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inP
|
||||||
|
|
||||||
std::string eventName = Event::getEventName( eventId );
|
std::string eventName = Event::getEventName( eventId );
|
||||||
|
|
||||||
if( !g_scriptMgr.onOutsideRange( pPlayer, eventId, eventParam1, x, y, z ) )
|
if( !g_scriptMgr.onOutsideRange( player, eventId, eventParam1, x, y, z ) )
|
||||||
abortEventFunc( pPlayer, 0, eventId );
|
abortEventFunc( player, 0, eventId );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,8 +109,8 @@ void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inP
|
||||||
|
|
||||||
std::string eventName = Event::getEventName( eventId );
|
std::string eventName = Event::getEventName( eventId );
|
||||||
|
|
||||||
if( !g_scriptMgr.onEnterTerritory( pPlayer, eventId, eventParam1, eventParam2 ) )
|
if( !g_scriptMgr.onEnterTerritory( player, eventId, eventParam1, eventParam2 ) )
|
||||||
abortEventFunc( pPlayer, 0, eventId );
|
abortEventFunc( player, 0, eventId );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,8 +125,8 @@ void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inP
|
||||||
|
|
||||||
std::string eventName = Event::getEventName( eventId );
|
std::string eventName = Event::getEventName( eventId );
|
||||||
|
|
||||||
if( !g_scriptMgr.onEventHandlerReturn( pPlayer, eventId, subEvent, param1, param2, param3 ) )
|
if( !g_scriptMgr.onEventHandlerReturn( player, eventId, subEvent, param1, param2, param3 ) )
|
||||||
abortEventFunc( pPlayer, 0, eventId );
|
abortEventFunc( player, 0, eventId );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,14 +137,12 @@ void Core::Network::GameConnection::eventHandler( const Packets::GamePacket& inP
|
||||||
uint16_t subEvent = inPacket.getValAt< uint16_t >( 0x24 );
|
uint16_t subEvent = inPacket.getValAt< uint16_t >( 0x24 );
|
||||||
std::string lsName = inPacket.getStringAt( 0x27 );
|
std::string lsName = inPacket.getStringAt( 0x27 );
|
||||||
|
|
||||||
|
ZoneChannelPacket< FFXIVIpcEventLinkshell > linkshellEvent( player.getId() );
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcEventLinkshell > linkshellEvent( pPlayer->getId() );
|
|
||||||
linkshellEvent.data().eventId = eventId;
|
linkshellEvent.data().eventId = eventId;
|
||||||
linkshellEvent.data().scene = static_cast< uint8_t >(subEvent);
|
linkshellEvent.data().scene = static_cast< uint8_t >( subEvent );
|
||||||
linkshellEvent.data().param3 = 1;
|
linkshellEvent.data().param3 = 1;
|
||||||
linkshellEvent.data().unknown1 = 0x15a;
|
linkshellEvent.data().unknown1 = 0x15a;
|
||||||
pPlayer->queuePacket( linkshellEvent );
|
player.queuePacket( linkshellEvent );
|
||||||
|
|
||||||
// abortEventFunc( pPlayer, 0, eventId );
|
// abortEventFunc( pPlayer, 0, eventId );
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,39 +1,39 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Session.h"
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
#include "src/servers/Server_Zone/Zone/ZonePosition.h"
|
#include "Zone/ZonePosition.h"
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
#include "src/servers/Server_Zone/Zone/ZoneMgr.h"
|
#include "Zone/ZoneMgr.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h"
|
#include "Network/PacketWrappers/InitUIPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PingPacket.h"
|
#include "Network/PacketWrappers/PingPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/MoveActorPacket.h"
|
#include "Network/PacketWrappers/MoveActorPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ChatPacket.h"
|
#include "Network/PacketWrappers/ChatPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventStartPacket.h"
|
#include "Network/PacketWrappers/EventStartPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventFinishPacket.h"
|
#include "Network/PacketWrappers/EventFinishPacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/DebugCommand/DebugCommandHandler.h"
|
#include "DebugCommand/DebugCommandHandler.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
#include "Inventory/Inventory.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Event/EventHelper.h"
|
#include "Event/EventHelper.h"
|
||||||
#include "src/servers/Server_Zone/Action/Action.h"
|
#include "Action/Action.h"
|
||||||
#include "src/servers/Server_Zone/Action/ActionTeleport.h"
|
#include "Action/ActionTeleport.h"
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
extern Core::ServerZone g_serverZone;
|
extern Core::ServerZone g_serverZone;
|
||||||
|
@ -93,9 +93,9 @@ enum GmCommand
|
||||||
JumpNpc = 0x025F,
|
JumpNpc = 0x025F,
|
||||||
};
|
};
|
||||||
|
|
||||||
void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer )
|
void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPacket, Entity::Player& player )
|
||||||
{
|
{
|
||||||
if( pPlayer->getGmRank() <= 0 )
|
if( player.getGmRank() <= 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
|
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
|
||||||
|
@ -103,19 +103,20 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
uint32_t param2 = inPacket.getValAt< uint32_t >( 0x28 );
|
uint32_t param2 = inPacket.getValAt< uint32_t >( 0x28 );
|
||||||
uint32_t param3 = inPacket.getValAt< uint32_t >( 0x38 );
|
uint32_t param3 = inPacket.getValAt< uint32_t >( 0x38 );
|
||||||
|
|
||||||
g_log.debug( pPlayer->getName() + " used GM1 commandId: " + std::to_string( commandId ) +
|
g_log.debug( player.getName() + " used GM1 commandId: " + std::to_string( commandId ) +
|
||||||
", params: " + std::to_string( param1 ) + ", " +
|
", params: " + std::to_string( param1 ) + ", " +
|
||||||
std::to_string( param2 ) + ", " + std::to_string( param3 ) );
|
std::to_string( param2 ) + ", " + std::to_string( param3 ) );
|
||||||
|
|
||||||
Core::Entity::ActorPtr targetActor;
|
Core::Entity::ActorPtr targetActor;
|
||||||
|
|
||||||
|
|
||||||
if( pPlayer->getId() == param3 )
|
if( player.getId() == param3 )
|
||||||
{
|
{
|
||||||
targetActor = pPlayer;
|
targetActor = player.getAsPlayer();
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
auto inRange = pPlayer->getInRangeActors();
|
{
|
||||||
|
auto inRange = player.getInRangeActors();
|
||||||
for( auto actor : inRange )
|
for( auto actor : inRange )
|
||||||
{
|
{
|
||||||
if( actor->getId() == param3 )
|
if( actor->getId() == param3 )
|
||||||
|
@ -132,13 +133,13 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
case GmCommand::Lv:
|
case GmCommand::Lv:
|
||||||
{
|
{
|
||||||
targetPlayer->setLevel( param1 );
|
targetPlayer->setLevel( param1 );
|
||||||
pPlayer->sendNotice( "Level for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
player.sendNotice( "Level for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Race:
|
case GmCommand::Race:
|
||||||
{
|
{
|
||||||
targetPlayer->setLookAt( CharaLook::Race, param1 );
|
targetPlayer->setLookAt( CharaLook::Race, param1 );
|
||||||
pPlayer->sendNotice( "Race for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
player.sendNotice( "Race for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
targetPlayer->spawn( targetPlayer );
|
targetPlayer->spawn( targetPlayer );
|
||||||
auto inRange = targetPlayer->getInRangeActors();
|
auto inRange = targetPlayer->getInRangeActors();
|
||||||
for( auto actor : inRange )
|
for( auto actor : inRange )
|
||||||
|
@ -151,7 +152,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
case GmCommand::Tribe:
|
case GmCommand::Tribe:
|
||||||
{
|
{
|
||||||
targetPlayer->setLookAt( CharaLook::Tribe, param1 );
|
targetPlayer->setLookAt( CharaLook::Tribe, param1 );
|
||||||
pPlayer->sendNotice( "Tribe for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
player.sendNotice( "Tribe for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
targetPlayer->spawn( targetPlayer );
|
targetPlayer->spawn( targetPlayer );
|
||||||
auto inRange = targetPlayer->getInRangeActors();
|
auto inRange = targetPlayer->getInRangeActors();
|
||||||
for( auto actor : inRange )
|
for( auto actor : inRange )
|
||||||
|
@ -164,7 +165,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
case GmCommand::Sex:
|
case GmCommand::Sex:
|
||||||
{
|
{
|
||||||
targetPlayer->setLookAt( CharaLook::Gender, param1 );
|
targetPlayer->setLookAt( CharaLook::Gender, param1 );
|
||||||
pPlayer->sendNotice( "Sex for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
player.sendNotice( "Sex for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
targetPlayer->spawn( targetPlayer );
|
targetPlayer->spawn( targetPlayer );
|
||||||
auto inRange = targetActor->getInRangeActors();
|
auto inRange = targetActor->getInRangeActors();
|
||||||
for( auto actor : inRange )
|
for( auto actor : inRange )
|
||||||
|
@ -176,14 +177,14 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
}
|
}
|
||||||
case GmCommand::Time:
|
case GmCommand::Time:
|
||||||
{
|
{
|
||||||
pPlayer->setEorzeaTimeOffset( param2 );
|
player.setEorzeaTimeOffset( param2 );
|
||||||
pPlayer->sendNotice( "Eorzea time offset: " + std::to_string( param2 ) );
|
player.sendNotice( "Eorzea time offset: " + std::to_string( param2 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Weather:
|
case GmCommand::Weather:
|
||||||
{
|
{
|
||||||
targetPlayer->getCurrentZone()->setWeatherOverride( param1 );
|
targetPlayer->getCurrentZone()->setWeatherOverride( param1 );
|
||||||
pPlayer->sendNotice( "Weather in Zone \"" + targetPlayer->getCurrentZone()->getName() + "\" of " +
|
player.sendNotice( "Weather in Zone \"" + targetPlayer->getCurrentZone()->getName() + "\" of " +
|
||||||
targetPlayer->getName() + " set in range." );
|
targetPlayer->getName() + " set in range." );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -192,14 +193,14 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
if( targetPlayer->getZoneId() != pPlayer->getZoneId() )
|
if( targetPlayer->getZoneId() != pPlayer->getZoneId() )
|
||||||
targetPlayer->setZone( pPlayer->getZoneId() );
|
targetPlayer->setZone( pPlayer->getZoneId() );
|
||||||
|
|
||||||
targetPlayer->changePosition( pPlayer->getPos().x, pPlayer->getPos().y, pPlayer->getPos().z,
|
targetPlayer->changePosition( player.getPos().x, player.getPos().y, player.getPos().z,
|
||||||
pPlayer->getRotation() );
|
player.getRotation() );
|
||||||
pPlayer->sendNotice( "Calling " + targetPlayer->getName() );
|
player.sendNotice( "Calling " + targetPlayer->getName() );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Inspect:
|
case GmCommand::Inspect:
|
||||||
{
|
{
|
||||||
pPlayer->sendNotice( "Name: " + targetPlayer->getName() +
|
player.sendNotice( "Name: " + targetPlayer->getName() +
|
||||||
"\nGil: " + std::to_string( targetPlayer->getCurrency( 1 ) ) +
|
"\nGil: " + std::to_string( targetPlayer->getCurrency( 1 ) ) +
|
||||||
"\nZone: " + targetPlayer->getCurrentZone()->getName() +
|
"\nZone: " + targetPlayer->getCurrentZone()->getName() +
|
||||||
"(" + std::to_string( targetPlayer->getZoneId() ) + ")" +
|
"(" + std::to_string( targetPlayer->getZoneId() ) + ")" +
|
||||||
|
@ -212,14 +213,14 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
}
|
}
|
||||||
case GmCommand::Speed:
|
case GmCommand::Speed:
|
||||||
{
|
{
|
||||||
targetPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), Flee, param1 ) );
|
targetPlayer->queuePacket( ActorControlPacket143( player.getId(), Flee, param1 ) );
|
||||||
pPlayer->sendNotice( "Speed for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
player.sendNotice( "Speed for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Kill:
|
case GmCommand::Kill:
|
||||||
{
|
{
|
||||||
targetActor->takeDamage( 9999999 );
|
targetActor->takeDamage( 9999999 );
|
||||||
pPlayer->sendNotice( "Killed " + std::to_string( targetActor->getId() ) );
|
player.sendNotice( "Killed " + std::to_string( targetActor->getId() ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Icon:
|
case GmCommand::Icon:
|
||||||
|
@ -236,34 +237,34 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
strcpy( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() );
|
strcpy( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() );
|
||||||
targetPlayer->queuePacket( searchInfoPacket );
|
targetPlayer->queuePacket( searchInfoPacket );
|
||||||
|
|
||||||
targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon,
|
targetPlayer->sendToInRangeSet( ActorControlPacket142( player.getId(), SetStatusIcon,
|
||||||
static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ),
|
static_cast< uint8_t >( player.getOnlineStatus() ) ),
|
||||||
true );
|
true );
|
||||||
pPlayer->sendNotice( "Icon for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
player.sendNotice( "Icon for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Hp:
|
case GmCommand::Hp:
|
||||||
{
|
{
|
||||||
targetPlayer->setHp( param1 );
|
targetPlayer->setHp( param1 );
|
||||||
pPlayer->sendNotice( "Hp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
player.sendNotice( "Hp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Mp:
|
case GmCommand::Mp:
|
||||||
{
|
{
|
||||||
targetPlayer->setMp( param1 );
|
targetPlayer->setMp( param1 );
|
||||||
pPlayer->sendNotice( "Mp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
player.sendNotice( "Mp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Gp:
|
case GmCommand::Gp:
|
||||||
{
|
{
|
||||||
targetPlayer->setHp( param1 );
|
targetPlayer->setHp( param1 );
|
||||||
pPlayer->sendNotice( "Gp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
player.sendNotice( "Gp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Exp:
|
case GmCommand::Exp:
|
||||||
{
|
{
|
||||||
targetPlayer->gainExp( param1 );
|
targetPlayer->gainExp( param1 );
|
||||||
pPlayer->sendNotice( std::to_string( param1 ) + " Exp was added to " + targetPlayer->getName() );
|
player.sendNotice( std::to_string( param1 ) + " Exp was added to " + targetPlayer->getName() );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Inv:
|
case GmCommand::Inv:
|
||||||
|
@ -273,7 +274,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
else
|
else
|
||||||
targetActor->setInvincibilityType( Common::InvincibilityType::InvincibilityRefill );
|
targetActor->setInvincibilityType( Common::InvincibilityType::InvincibilityRefill );
|
||||||
|
|
||||||
pPlayer->sendNotice( "Invincibility for " + targetPlayer->getName() +
|
player.sendNotice( "Invincibility for " + targetPlayer->getName() +
|
||||||
" was switched." );
|
" was switched." );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -286,13 +287,13 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
for( uint8_t i = 0; i < 255; i++ )
|
for( uint8_t i = 0; i < 255; i++ )
|
||||||
targetActor->getAsPlayer()->learnSong( i, 0 );
|
targetActor->getAsPlayer()->learnSong( i, 0 );
|
||||||
|
|
||||||
pPlayer->sendNotice( "All Songs for " + targetPlayer->getName() +
|
player.sendNotice( "All Songs for " + targetPlayer->getName() +
|
||||||
" were turned on." );
|
" were turned on." );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
targetActor->getAsPlayer()->learnSong( param2, 0 );
|
targetActor->getAsPlayer()->learnSong( param2, 0 );
|
||||||
pPlayer->sendNotice( "Song " + std::to_string( param2 ) + " for " + targetPlayer->getName() +
|
player.sendNotice( "Song " + std::to_string( param2 ) + " for " + targetPlayer->getName() +
|
||||||
" was turned on." );
|
" was turned on." );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -327,18 +328,18 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
|
|
||||||
if( param1 == 0xcccccccc )
|
if( param1 == 0xcccccccc )
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( "Syntaxerror." );
|
player.sendUrgent( "Syntaxerror." );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !targetPlayer->addItem( -1, param1, param2 ) )
|
if( !targetPlayer->addItem( -1, param1, param2 ) )
|
||||||
pPlayer->sendUrgent( "Item " + std::to_string( param1 ) + " not found..." );
|
player.sendUrgent( "Item " + std::to_string( param1 ) + " not found..." );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Gil:
|
case GmCommand::Gil:
|
||||||
{
|
{
|
||||||
targetPlayer->addCurrency( 1, param1 );
|
targetPlayer->addCurrency( 1, param1 );
|
||||||
pPlayer->sendNotice( "Added " + std::to_string( param1 ) + " Gil for " + targetPlayer->getName() );
|
player.sendNotice( "Added " + std::to_string( param1 ) + " Gil for " + targetPlayer->getName() );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Collect:
|
case GmCommand::Collect:
|
||||||
|
@ -347,12 +348,12 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
|
|
||||||
if( gil < param1 )
|
if( gil < param1 )
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( "Player does not have enough Gil(" + std::to_string( gil ) + ")" );
|
player.sendUrgent( "Player does not have enough Gil(" + std::to_string( gil ) + ")" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
targetPlayer->removeCurrency( 1, param1 );
|
targetPlayer->removeCurrency( 1, param1 );
|
||||||
pPlayer->sendNotice( "Removed " + std::to_string( param1 ) +
|
player.sendNotice( "Removed " + std::to_string( param1 ) +
|
||||||
" Gil from " + targetPlayer->getName() +
|
" Gil from " + targetPlayer->getName() +
|
||||||
"(" + std::to_string( gil ) + " before)" );
|
"(" + std::to_string( gil ) + " before)" );
|
||||||
}
|
}
|
||||||
|
@ -386,14 +387,14 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
case GmCommand::GC:
|
case GmCommand::GC:
|
||||||
{
|
{
|
||||||
targetPlayer->setGc( param1 );
|
targetPlayer->setGc( param1 );
|
||||||
pPlayer->sendNotice( "GC for " + targetPlayer->getName() +
|
player.sendNotice( "GC for " + targetPlayer->getName() +
|
||||||
" was set to " + std::to_string( targetPlayer->getGc() ) );
|
" was set to " + std::to_string( targetPlayer->getGc() ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::GCRank:
|
case GmCommand::GCRank:
|
||||||
{
|
{
|
||||||
targetPlayer->setGcRankAt( targetPlayer->getGc() - 1, param1 );
|
targetPlayer->setGcRankAt( targetPlayer->getGc() - 1, param1 );
|
||||||
pPlayer->sendNotice( "GC Rank for " + targetPlayer->getName() +
|
player.sendNotice( "GC Rank for " + targetPlayer->getName() +
|
||||||
" for GC " + std::to_string( targetPlayer->getGc() ) +
|
" for GC " + std::to_string( targetPlayer->getGc() ) +
|
||||||
" was set to " + std::to_string( targetPlayer->getGcRankArray()[targetPlayer->getGc() - 1] ) );
|
" was set to " + std::to_string( targetPlayer->getGcRankArray()[targetPlayer->getGc() - 1] ) );
|
||||||
break;
|
break;
|
||||||
|
@ -407,13 +408,13 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
for( uint8_t i = 0; i < 255; i++ )
|
for( uint8_t i = 0; i < 255; i++ )
|
||||||
targetActor->getAsPlayer()->registerAetheryte( i );
|
targetActor->getAsPlayer()->registerAetheryte( i );
|
||||||
|
|
||||||
pPlayer->sendNotice( "All Aetherytes for " + targetPlayer->getName() +
|
player.sendNotice( "All Aetherytes for " + targetPlayer->getName() +
|
||||||
" were turned on." );
|
" were turned on." );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
targetActor->getAsPlayer()->registerAetheryte( param2 );
|
targetActor->getAsPlayer()->registerAetheryte( param2 );
|
||||||
pPlayer->sendNotice( "Aetheryte " + std::to_string( param2 ) + " for " + targetPlayer->getName() +
|
player.sendNotice( "Aetheryte " + std::to_string( param2 ) + " for " + targetPlayer->getName() +
|
||||||
" was turned on." );
|
" was turned on." );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -425,55 +426,56 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
|
||||||
auto zoneInfo = g_zoneMgr.getZone( param1 );
|
auto zoneInfo = g_zoneMgr.getZone( param1 );
|
||||||
if( !zoneInfo )
|
if( !zoneInfo )
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( "Invalid zone " + std::to_string( param1 ) );
|
player.sendUrgent( "Invalid zone " + std::to_string( param1 ) );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
targetPlayer->setPosition( targetPlayer->getPos() );
|
targetPlayer->setPosition( targetPlayer->getPos() );
|
||||||
targetPlayer->performZoning( param1, targetPlayer->getPos(), 0 );
|
targetPlayer->performZoning( param1, targetPlayer->getPos(), 0 );
|
||||||
|
|
||||||
pPlayer->sendNotice( targetPlayer->getName() + " was warped to zone " + std::to_string( param1 ) + " (" + zoneInfo->getName() + ")" );
|
pPlayer->sendNotice( targetPlayer->getName() + " was warped to zone " + std::to_string( param1 ) + " (" + zoneInfo->getName() + ")" );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::TeriInfo:
|
case GmCommand::TeriInfo:
|
||||||
{
|
{
|
||||||
pPlayer->sendNotice( "ZoneId: " + std::to_string( pPlayer->getZoneId() ) + "\nName: " +
|
player.sendNotice( "ZoneId: " + std::to_string( player.getZoneId() ) + "\nName: " +
|
||||||
pPlayer->getCurrentZone()->getName() + "\nInternalName: " +
|
player.getCurrentZone()->getName() + "\nInternalName: " +
|
||||||
pPlayer->getCurrentZone()->getInternalName() + "\nPopCount: " +
|
player.getCurrentZone()->getInternalName() + "\nPopCount: " +
|
||||||
std::to_string( pPlayer->getCurrentZone()->getPopCount() ) +
|
std::to_string( player.getCurrentZone()->getPopCount() ) +
|
||||||
"\nCurrentWeather:" + std::to_string( pPlayer->getCurrentZone()->getCurrentWeather() ) +
|
"\nCurrentWeather:" + std::to_string( player.getCurrentZone()->getCurrentWeather() ) +
|
||||||
"\nNextWeather:" + std::to_string( pPlayer->getCurrentZone()->getNextWeather() ) );
|
"\nNextWeather:" + std::to_string( player.getCurrentZone()->getNextWeather() ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Jump:
|
case GmCommand::Jump:
|
||||||
{
|
{
|
||||||
|
|
||||||
auto inRange = pPlayer->getInRangeActors();
|
auto inRange = player.getInRangeActors();
|
||||||
for( auto actor : inRange )
|
for( auto actor : inRange )
|
||||||
{
|
{
|
||||||
pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
|
player.changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
|
||||||
targetActor->getRotation() );
|
targetActor->getRotation() );
|
||||||
}
|
}
|
||||||
pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() + " in range." );
|
player.sendNotice( "Jumping to " + targetPlayer->getName() + " in range." );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
pPlayer->sendUrgent( "GM1 Command not implemented: " + std::to_string( commandId ) );
|
player.sendUrgent( "GM1 Command not implemented: " + std::to_string( commandId ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer )
|
void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPacket, Entity::Player& player )
|
||||||
{
|
{
|
||||||
if( pPlayer->getGmRank() <= 0 )
|
if( player.getGmRank() <= 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
|
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
|
||||||
std::string param1 = inPacket.getStringAt( 0x34 );
|
std::string param1 = inPacket.getStringAt( 0x34 );
|
||||||
|
|
||||||
g_log.debug( pPlayer->getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 );
|
g_log.debug( player.getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 );
|
||||||
|
|
||||||
auto targetSession = g_serverZone.getSession( param1 );
|
auto targetSession = g_serverZone.getSession( param1 );
|
||||||
Core::Entity::ActorPtr targetActor;
|
Core::Entity::ActorPtr targetActor;
|
||||||
|
@ -486,11 +488,11 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac
|
||||||
{
|
{
|
||||||
if( param1 == "self" )
|
if( param1 == "self" )
|
||||||
{
|
{
|
||||||
targetActor = pPlayer;
|
targetActor = player.getAsPlayer();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( "Player " + param1 + " not found on this server." );
|
player.sendUrgent( "Player " + param1 + " not found on this server." );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -508,25 +510,25 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac
|
||||||
targetPlayer->resetMp();
|
targetPlayer->resetMp();
|
||||||
targetPlayer->setStatus( Entity::Actor::ActorStatus::Idle );
|
targetPlayer->setStatus( Entity::Actor::ActorStatus::Idle );
|
||||||
|
|
||||||
targetPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true );
|
targetPlayer->sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true );
|
||||||
targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus,
|
targetPlayer->sendToInRangeSet( ActorControlPacket142( player.getId(), SetStatus,
|
||||||
static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true );
|
static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true );
|
||||||
pPlayer->sendNotice( "Raised " + targetPlayer->getName() );
|
player.sendNotice( "Raised " + targetPlayer->getName() );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Jump:
|
case GmCommand::Jump:
|
||||||
{
|
{
|
||||||
if( targetPlayer->getZoneId() != pPlayer->getZoneId() )
|
if( targetPlayer->getZoneId() != player.getZoneId() )
|
||||||
{
|
{
|
||||||
pPlayer->setZone( targetPlayer->getZoneId() );
|
player.setZone( targetPlayer->getZoneId() );
|
||||||
}
|
}
|
||||||
pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
|
player.changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
|
||||||
targetActor->getRotation() );
|
targetActor->getRotation() );
|
||||||
pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() );
|
player.sendNotice( "Jumping to " + targetPlayer->getName() );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
pPlayer->sendUrgent( "GM2 Command not implemented: " + std::to_string( commandId ) );
|
player.sendUrgent( "GM2 Command not implemented: " + std::to_string( commandId ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,29 +1,29 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Session.h"
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
#include "src/servers/Server_Zone/Zone/ZonePosition.h"
|
#include "Zone/ZonePosition.h"
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
#include "src/servers/Server_Zone/Zone/ZoneMgr.h"
|
#include "Zone/ZoneMgr.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/DebugCommand/DebugCommandHandler.h"
|
#include "DebugCommand/DebugCommandHandler.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
#include "Inventory/Inventory.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
extern Core::ServerZone g_serverZone;
|
extern Core::ServerZone g_serverZone;
|
||||||
|
@ -37,7 +37,7 @@ using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
|
|
||||||
void Core::Network::GameConnection::inventoryModifyHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::inventoryModifyHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
uint32_t seq = inPacket.getValAt< uint32_t >( 0x20 );
|
uint32_t seq = inPacket.getValAt< uint32_t >( 0x20 );
|
||||||
uint8_t action = inPacket.getValAt< uint8_t >( 0x24 );
|
uint8_t action = inPacket.getValAt< uint8_t >( 0x24 );
|
||||||
|
@ -46,10 +46,10 @@ void Core::Network::GameConnection::inventoryModifyHandler( const Packets::GameP
|
||||||
uint16_t fromContainer = inPacket.getValAt< uint16_t >( 0x2C );
|
uint16_t fromContainer = inPacket.getValAt< uint16_t >( 0x2C );
|
||||||
uint16_t toContainer = inPacket.getValAt< uint16_t >( 0x40 );
|
uint16_t toContainer = inPacket.getValAt< uint16_t >( 0x40 );
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcInventoryActionAck > ackPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcInventoryActionAck > ackPacket( player.getId() );
|
||||||
ackPacket.data().sequence = seq;
|
ackPacket.data().sequence = seq;
|
||||||
ackPacket.data().type = 7;
|
ackPacket.data().type = 7;
|
||||||
pPlayer->queuePacket( ackPacket );
|
player.queuePacket( ackPacket );
|
||||||
|
|
||||||
|
|
||||||
g_log.debug( inPacket.toString() );
|
g_log.debug( inPacket.toString() );
|
||||||
|
@ -61,19 +61,19 @@ void Core::Network::GameConnection::inventoryModifyHandler( const Packets::GameP
|
||||||
|
|
||||||
case 0x07: // discard item action
|
case 0x07: // discard item action
|
||||||
{
|
{
|
||||||
pPlayer->getInventory()->discardItem( fromContainer, fromSlot );
|
player.getInventory()->discardItem( fromContainer, fromSlot );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x08: // move item action
|
case 0x08: // move item action
|
||||||
{
|
{
|
||||||
pPlayer->getInventory()->moveItem( fromContainer, fromSlot, toContainer, toSlot );
|
player.getInventory()->moveItem( fromContainer, fromSlot, toContainer, toSlot );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x09: // swap item action
|
case 0x09: // swap item action
|
||||||
{
|
{
|
||||||
pPlayer->getInventory()->swapItem( fromContainer, fromSlot, toContainer, toSlot );
|
player.getInventory()->swapItem( fromContainer, fromSlot, toContainer, toSlot );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -1,43 +1,42 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Chat/ServerChatDef.h>
|
#include <Server_Common/Network/PacketDef/Chat/ServerChatDef.h>
|
||||||
|
#include <Server_Common/Database/DatabaseDef.h>
|
||||||
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
|
#include "Network/GameConnection.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Session.h"
|
||||||
|
#include "Zone/Zone.h"
|
||||||
|
#include "Zone/ZonePosition.h"
|
||||||
|
#include "ServerZone.h"
|
||||||
|
#include "Zone/ZoneMgr.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Network/PacketWrappers/InitUIPacket.h"
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Network/PacketWrappers/PingPacket.h"
|
||||||
#include "src/servers/Server_Zone/Zone/ZonePosition.h"
|
#include "Network/PacketWrappers/MoveActorPacket.h"
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "Network/PacketWrappers/ChatPacket.h"
|
||||||
#include "src/servers/Server_Zone/Zone/ZoneMgr.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
|
#include "Network/PacketWrappers/EventStartPacket.h"
|
||||||
|
#include "Network/PacketWrappers/EventFinishPacket.h"
|
||||||
|
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h"
|
#include "DebugCommand/DebugCommandHandler.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PingPacket.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/MoveActorPacket.h"
|
#include "Inventory/Inventory.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ChatPacket.h"
|
#include "Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Event/EventHelper.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Action/Action.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Action/ActionTeleport.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventStartPacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/EventFinishPacket.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/DebugCommand/DebugCommandHandler.h"
|
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
|
||||||
#include "src/servers/Server_Zone/Event/EventHelper.h"
|
|
||||||
#include "src/servers/Server_Zone/Action/Action.h"
|
|
||||||
#include "src/servers/Server_Zone/Action/ActionTeleport.h"
|
|
||||||
|
|
||||||
#include <Server_Common/Database/DatabaseDef.h>
|
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
extern Core::ServerZone g_serverZone;
|
extern Core::ServerZone g_serverZone;
|
||||||
|
@ -50,15 +49,15 @@ using namespace Core::Network::Packets;
|
||||||
using namespace Core::Network::Packets::Server;
|
using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
void Core::Network::GameConnection::fcInfoReqHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::fcInfoReqHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
GamePacketPtr pPe( new GamePacket( 0xDD, 0x78, pPlayer->getId(), pPlayer->getId() ) );
|
GamePacketPtr pPe( new GamePacket( 0xDD, 0x78, player.getId(), player.getId() ) );
|
||||||
pPe->setValAt< uint8_t >( 0x48, 0x01 );
|
pPe->setValAt< uint8_t >( 0x48, 0x01 );
|
||||||
queueOutPacket( pPe );
|
queueOutPacket( pPe );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::setSearchInfoHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::setSearchInfoHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
uint32_t inval = inPacket.getValAt< uint32_t >( 0x20 );
|
uint32_t inval = inPacket.getValAt< uint32_t >( 0x20 );
|
||||||
uint32_t inval1 = inPacket.getValAt< uint32_t >( 0x24 );
|
uint32_t inval1 = inPacket.getValAt< uint32_t >( 0x24 );
|
||||||
|
@ -66,54 +65,53 @@ void Core::Network::GameConnection::setSearchInfoHandler( const Packets::GamePac
|
||||||
|
|
||||||
uint8_t selectRegion = inPacket.getValAt< uint8_t >( 0x31 );
|
uint8_t selectRegion = inPacket.getValAt< uint8_t >( 0x31 );
|
||||||
|
|
||||||
pPlayer->setSearchInfo( selectRegion, 0, inPacket.getStringAt( 0x32 ) );
|
player.setSearchInfo( selectRegion, 0, inPacket.getStringAt( 0x32 ) );
|
||||||
|
|
||||||
pPlayer->setOnlineStatusMask( status );
|
player.setOnlineStatusMask( status );
|
||||||
|
|
||||||
if( pPlayer->isNewAdventurer() && !( inval & 0x01000000 ) )
|
if( player.isNewAdventurer() && !( inval & 0x01000000 ) )
|
||||||
// mark player as not new adventurer anymore
|
// mark player as not new adventurer anymore
|
||||||
pPlayer->setNewAdventurer( false );
|
player.setNewAdventurer( false );
|
||||||
else if( inval & 0x01000000 )
|
else if( inval & 0x01000000 )
|
||||||
// mark player as new adventurer
|
// mark player as new adventurer
|
||||||
pPlayer->setNewAdventurer( true );
|
player.setNewAdventurer( true );
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcSetOnlineStatus > statusPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcSetOnlineStatus > statusPacket( player.getId() );
|
||||||
statusPacket.data().onlineStatusFlags = status;
|
statusPacket.data().onlineStatusFlags = status;
|
||||||
queueOutPacket( statusPacket );
|
queueOutPacket( statusPacket );
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcSetSearchInfo > searchInfoPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcSetSearchInfo > searchInfoPacket( player.getId() );
|
||||||
searchInfoPacket.data().onlineStatusFlags = status;
|
searchInfoPacket.data().onlineStatusFlags = status;
|
||||||
searchInfoPacket.data().selectRegion = pPlayer->getSearchSelectRegion();
|
searchInfoPacket.data().selectRegion = player.getSearchSelectRegion();
|
||||||
strcpy( searchInfoPacket.data().searchMessage, pPlayer->getSearchMessage() );
|
strcpy( searchInfoPacket.data().searchMessage, player.getSearchMessage() );
|
||||||
queueOutPacket( searchInfoPacket );
|
queueOutPacket( searchInfoPacket );
|
||||||
|
|
||||||
pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon,
|
player.sendToInRangeSet( ActorControlPacket142( player.getId(), SetStatusIcon,
|
||||||
static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ),
|
static_cast< uint8_t >( player.getOnlineStatus() ) ), true );
|
||||||
true );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::reqSearchInfoHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::reqSearchInfoHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
ZoneChannelPacket< FFXIVIpcInitSearchInfo > searchInfoPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcInitSearchInfo > searchInfoPacket( player.getId() );
|
||||||
searchInfoPacket.data().onlineStatusFlags = pPlayer->getOnlineStatusMask();
|
searchInfoPacket.data().onlineStatusFlags = player.getOnlineStatusMask();
|
||||||
searchInfoPacket.data().selectRegion = pPlayer->getSearchSelectRegion();
|
searchInfoPacket.data().selectRegion = player.getSearchSelectRegion();
|
||||||
strcpy( searchInfoPacket.data().searchMessage, pPlayer->getSearchMessage() );
|
strcpy( searchInfoPacket.data().searchMessage, player.getSearchMessage() );
|
||||||
queueOutPacket( searchInfoPacket );
|
queueOutPacket( searchInfoPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::linkshellListHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::linkshellListHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
ZoneChannelPacket< FFXIVIpcLinkshellList > linkshellListPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcLinkshellList > linkshellListPacket( player.getId() );
|
||||||
queueOutPacket( linkshellListPacket );
|
queueOutPacket( linkshellListPacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
// if the player is marked for zoning we no longer want to update his pos
|
// if the player is marked for zoning we no longer want to update his pos
|
||||||
if( pPlayer->isMarkedForZoning() )
|
if( player.isMarkedForZoning() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct testMov
|
struct testMov
|
||||||
|
@ -178,23 +176,23 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa
|
||||||
//pInPacket->debugPrint();
|
//pInPacket->debugPrint();
|
||||||
|
|
||||||
bool bPosChanged = false;
|
bool bPosChanged = false;
|
||||||
if( ( pPlayer->getPos().x != inPacket.getValAt< float >( 0x2c ) ) ||
|
if( ( player.getPos().x != inPacket.getValAt< float >( 0x2c ) ) ||
|
||||||
( pPlayer->getPos().y != inPacket.getValAt< float >( 0x30 ) ) ||
|
( player.getPos().y != inPacket.getValAt< float >( 0x30 ) ) ||
|
||||||
( pPlayer->getPos().z != inPacket.getValAt< float >( 0x34 ) ) )
|
( player.getPos().z != inPacket.getValAt< float >( 0x34 ) ) )
|
||||||
bPosChanged = true;
|
bPosChanged = true;
|
||||||
if( !bPosChanged && pPlayer->getRotation() == inPacket.getValAt< float >( 0x20 ) )
|
if( !bPosChanged && player.getRotation() == inPacket.getValAt< float >( 0x20 ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pPlayer->setRotation( inPacket.getValAt< float >( 0x20 ) );
|
player.setRotation( inPacket.getValAt< float >( 0x20 ) );
|
||||||
pPlayer->setPosition( inPacket.getValAt< float >( 0x2c ),
|
player.setPosition( inPacket.getValAt< float >( 0x2c ),
|
||||||
inPacket.getValAt< float >( 0x30 ),
|
inPacket.getValAt< float >( 0x30 ),
|
||||||
inPacket.getValAt< float >( 0x34 ) );
|
inPacket.getValAt< float >( 0x34 ) );
|
||||||
|
|
||||||
if( ( pPlayer->getCurrentAction() != nullptr ) && bPosChanged )
|
if( ( player.getCurrentAction() != nullptr ) && bPosChanged )
|
||||||
pPlayer->getCurrentAction()->setInterrupted();
|
player.getCurrentAction()->setInterrupted();
|
||||||
|
|
||||||
// if no one is in range, don't bother trying to send a position update
|
// if no one is in range, don't bother trying to send a position update
|
||||||
if( !pPlayer->hasInRangeActor() )
|
if( !player.hasInRangeActor() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint8_t unk = inPacket.getValAt< uint8_t >( 0x29 );
|
uint8_t unk = inPacket.getValAt< uint8_t >( 0x29 );
|
||||||
|
@ -278,26 +276,26 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MoveActorPacket movePacket( pPlayer, unk1, unk2, unk3, unk4 );
|
MoveActorPacket movePacket( player, unk1, unk2, unk3, unk4 );
|
||||||
pPlayer->sendToInRangeSet( movePacket );
|
player.sendToInRangeSet( movePacket );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::reqEquipDisplayFlagsHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::reqEquipDisplayFlagsHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
g_log.info( "[" + std::to_string( pPlayer->getId() ) + "] Setting EquipDisplayFlags to " + std::to_string( inPacket.getValAt< uint8_t >( 0x20 ) ) );
|
g_log.info( "[" + std::to_string( player.getId() ) + "] Setting EquipDisplayFlags to " + std::to_string( inPacket.getValAt< uint8_t >( 0x20 ) ) );
|
||||||
pPlayer->setEquipDisplayFlags( inPacket.getValAt< uint8_t >( 0x20 ) );
|
player.setEquipDisplayFlags( inPacket.getValAt< uint8_t >( 0x20 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::zoneLineHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::zoneLineHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
uint32_t zoneLineId = inPacket.getValAt< uint32_t >( 0x20 );
|
uint32_t zoneLineId = inPacket.getValAt< uint32_t >( 0x20 );
|
||||||
|
|
||||||
pPlayer->sendDebug( "Walking ZoneLine " + std::to_string( zoneLineId ) );
|
player.sendDebug( "Walking ZoneLine " + std::to_string( zoneLineId ) );
|
||||||
|
|
||||||
auto pZone = pPlayer->getCurrentZone();
|
auto pZone = player.getCurrentZone();
|
||||||
|
|
||||||
auto pLine = g_zoneMgr.getZonePosition( zoneLineId );
|
auto pLine = g_zoneMgr.getZonePosition( zoneLineId );
|
||||||
|
|
||||||
|
@ -307,34 +305,34 @@ void Core::Network::GameConnection::zoneLineHandler( const Packets::GamePacket&
|
||||||
|
|
||||||
if( pLine != nullptr )
|
if( pLine != nullptr )
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug( "ZoneLine " + std::to_string( zoneLineId ) + " found." );
|
player.sendDebug( "ZoneLine " + std::to_string( zoneLineId ) + " found." );
|
||||||
targetPos = pLine->getTargetPosition();
|
targetPos = pLine->getTargetPosition();
|
||||||
targetZone = pLine->getTargetZoneId();
|
targetZone = pLine->getTargetZoneId();
|
||||||
rotation = pLine->getTargetRotation();
|
rotation = pLine->getTargetRotation();
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcPrepareZoning > preparePacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcPrepareZoning > preparePacket( player.getId() );
|
||||||
preparePacket.data().targetZone = targetZone;
|
preparePacket.data().targetZone = targetZone;
|
||||||
|
|
||||||
//ActorControlPacket143 controlPacket( pPlayer, ActorControlType::DespawnZoneScreenMsg,
|
//ActorControlPacket143 controlPacket( pPlayer, ActorControlType::DespawnZoneScreenMsg,
|
||||||
// 0x03, pPlayer->getId(), 0x01, targetZone );
|
// 0x03, player.getId(), 0x01, targetZone );
|
||||||
pPlayer->queuePacket( preparePacket );
|
player.queuePacket( preparePacket );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// No zoneline found, revert to last zone
|
// No zoneline found, revert to last zone
|
||||||
pPlayer->sendUrgent( "ZoneLine " + std::to_string( zoneLineId ) + " not found." );
|
player.sendUrgent( "ZoneLine " + std::to_string( zoneLineId ) + " not found." );
|
||||||
targetPos.x = 0;
|
targetPos.x = 0;
|
||||||
targetPos.y = 0;
|
targetPos.y = 0;
|
||||||
targetPos.z = 0;
|
targetPos.z = 0;
|
||||||
targetZone = pZone->getId();
|
targetZone = pZone->getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
pPlayer->performZoning( targetZone, targetPos, rotation);
|
player.performZoning( targetZone, targetPos, rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core::Network::GameConnection::discoveryHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::discoveryHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
uint32_t ref_position_id = inPacket.getValAt< uint32_t >( 0x20 );
|
uint32_t ref_position_id = inPacket.getValAt< uint32_t >( 0x20 );
|
||||||
|
|
||||||
|
@ -344,47 +342,47 @@ void Core::Network::GameConnection::discoveryHandler( const Packets::GamePacket&
|
||||||
|
|
||||||
if( !pQR->next() )
|
if( !pQR->next() )
|
||||||
{
|
{
|
||||||
pPlayer->sendNotice( "Discovery ref pos ID: " + std::to_string( ref_position_id ) + " not found. " );
|
player.sendNotice( "Discovery ref pos ID: " + std::to_string( ref_position_id ) + " not found. " );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcDiscovery > discoveryPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcDiscovery > discoveryPacket( player.getId() );
|
||||||
discoveryPacket.data().map_id = pQR->getUInt( 2 );
|
discoveryPacket.data().map_id = pQR->getUInt( 2 );
|
||||||
discoveryPacket.data().map_part_id = pQR->getUInt( 3 );
|
discoveryPacket.data().map_part_id = pQR->getUInt( 3 );
|
||||||
|
|
||||||
pPlayer->queuePacket( discoveryPacket );
|
player.queuePacket( discoveryPacket );
|
||||||
pPlayer->sendNotice( "Discovery ref pos ID: " + std::to_string( ref_position_id ) );
|
player.sendNotice( "Discovery ref pos ID: " + std::to_string( ref_position_id ) );
|
||||||
|
|
||||||
pPlayer->discover( pQR->getUInt16( 2 ), pQR->getUInt16( 3 ) );
|
player.discover( pQR->getUInt16( 2 ), pQR->getUInt16( 3 ) );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core::Network::GameConnection::playTimeHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::playTimeHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
ZoneChannelPacket< FFXIVIpcPlayTime > playTimePacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcPlayTime > playTimePacket( player.getId() );
|
||||||
playTimePacket.data().playTimeInMinutes = pPlayer->getPlayTime() / 60;
|
playTimePacket.data().playTimeInMinutes = player.getPlayTime() / 60;
|
||||||
pPlayer->queuePacket( playTimePacket );
|
player.queuePacket( playTimePacket );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core::Network::GameConnection::initHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::initHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
// init handler means this is a login procedure
|
// init handler means this is a login procedure
|
||||||
pPlayer->setIsLogin( true );
|
player.setIsLogin( true );
|
||||||
|
|
||||||
pPlayer->setZone( pPlayer->getZoneId() );
|
player.setZone( player.getZoneId() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core::Network::GameConnection::blackListHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::blackListHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
uint8_t count = inPacket.getValAt< uint8_t >( 0x21 );
|
uint8_t count = inPacket.getValAt< uint8_t >( 0x21 );
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcBlackList > blackListPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcBlackList > blackListPacket( player.getId() );
|
||||||
blackListPacket.data().sequence = count;
|
blackListPacket.data().sequence = count;
|
||||||
// TODO: Fill with actual blacklist data
|
// TODO: Fill with actual blacklist data
|
||||||
//blackListPacket.data().entry[0].contentId = 1;
|
//blackListPacket.data().entry[0].contentId = 1;
|
||||||
|
@ -395,39 +393,39 @@ void Core::Network::GameConnection::blackListHandler( const Packets::GamePacket&
|
||||||
|
|
||||||
|
|
||||||
void Core::Network::GameConnection::pingHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::pingHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
int32_t inVal = inPacket.getValAt< int32_t >( 0x20 );
|
int32_t inVal = inPacket.getValAt< int32_t >( 0x20 );
|
||||||
PingPacket pingPacket( pPlayer, inVal );
|
PingPacket pingPacket( player, inVal );
|
||||||
queueOutPacket( pingPacket );
|
queueOutPacket( pingPacket );
|
||||||
|
|
||||||
pPlayer->setLastPing( static_cast< uint32_t >( time( nullptr ) ) );
|
player.setLastPing( static_cast< uint32_t >( time( nullptr ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
// player is done zoning
|
// player is done zoning
|
||||||
pPlayer->setLoadingComplete( true );
|
player.setLoadingComplete( true );
|
||||||
|
|
||||||
// if this is a login event
|
// if this is a login event
|
||||||
if( pPlayer->isLogin() )
|
if( player.isLogin() )
|
||||||
{
|
{
|
||||||
// fire the onLogin Event
|
// fire the onLogin Event
|
||||||
pPlayer->onLogin();
|
player.onLogin();
|
||||||
pPlayer->setIsLogin( false );
|
player.setIsLogin( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
// spawn the player for himself
|
// spawn the player for himself
|
||||||
pPlayer->spawn( pPlayer );
|
player.spawn( player.getAsPlayer() );
|
||||||
|
|
||||||
// notify the zone of a change in position to force an "inRangeActor" update
|
// notify the zone of a change in position to force an "inRangeActor" update
|
||||||
pPlayer->getCurrentZone()->changeActorPosition( pPlayer );
|
player.getCurrentZone()->changeActorPosition( player.getAsPlayer() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
|
|
||||||
uint8_t type = inPacket.getValAt< uint8_t >( 0x2A );
|
uint8_t type = inPacket.getValAt< uint8_t >( 0x2A );
|
||||||
|
@ -436,7 +434,7 @@ void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket
|
||||||
if( type == 0x02 )
|
if( type == 0x02 )
|
||||||
{ // party list
|
{ // party list
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcSocialList > listPacket( pPlayer->getId() );;
|
ZoneChannelPacket< FFXIVIpcSocialList > listPacket( player.getId() );
|
||||||
|
|
||||||
listPacket.data().type = 2;
|
listPacket.data().type = 2;
|
||||||
listPacket.data().sequence = count;
|
listPacket.data().sequence = count;
|
||||||
|
@ -444,26 +442,26 @@ void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket
|
||||||
int32_t entrysizes = sizeof( listPacket.data().entries );
|
int32_t entrysizes = sizeof( listPacket.data().entries );
|
||||||
memset( listPacket.data().entries, 0, sizeof( listPacket.data().entries ) );
|
memset( listPacket.data().entries, 0, sizeof( listPacket.data().entries ) );
|
||||||
|
|
||||||
listPacket.data().entries[0].bytes[2] = pPlayer->getCurrentZone()->getId();
|
listPacket.data().entries[0].bytes[2] = player.getCurrentZone()->getId();
|
||||||
listPacket.data().entries[0].bytes[3] = 0x80;
|
listPacket.data().entries[0].bytes[3] = 0x80;
|
||||||
listPacket.data().entries[0].bytes[4] = 0x02;
|
listPacket.data().entries[0].bytes[4] = 0x02;
|
||||||
listPacket.data().entries[0].bytes[6] = 0x3B;
|
listPacket.data().entries[0].bytes[6] = 0x3B;
|
||||||
listPacket.data().entries[0].bytes[11] = 0x10;
|
listPacket.data().entries[0].bytes[11] = 0x10;
|
||||||
listPacket.data().entries[0].classJob = static_cast< uint8_t >( pPlayer->getClass() );
|
listPacket.data().entries[0].classJob = static_cast< uint8_t >( player.getClass() );
|
||||||
listPacket.data().entries[0].contentId = pPlayer->getContentId();
|
listPacket.data().entries[0].contentId = player.getContentId();
|
||||||
listPacket.data().entries[0].level = pPlayer->getLevel();
|
listPacket.data().entries[0].level = player.getLevel();
|
||||||
listPacket.data().entries[0].zoneId = pPlayer->getCurrentZone()->getId();
|
listPacket.data().entries[0].zoneId = player.getCurrentZone()->getId();
|
||||||
listPacket.data().entries[0].zoneId1 = 0x0100;
|
listPacket.data().entries[0].zoneId1 = 0x0100;
|
||||||
// TODO: no idea what this does
|
// TODO: no idea what this does
|
||||||
//listPacket.data().entries[0].one = 1;
|
//listPacket.data().entries[0].one = 1;
|
||||||
|
|
||||||
memcpy( listPacket.data().entries[0].name, pPlayer->getName().c_str(), strlen( pPlayer->getName().c_str() ) );
|
memcpy( listPacket.data().entries[0].name, player.getName().c_str(), strlen( player.getName().c_str() ) );
|
||||||
|
|
||||||
// TODO: actually store and read language from somewhere
|
// TODO: actually store and read language from somewhere
|
||||||
listPacket.data().entries[0].bytes1[0] = 0x01;//flags (lang)
|
listPacket.data().entries[0].bytes1[0] = 0x01;//flags (lang)
|
||||||
// TODO: these flags need to be figured out
|
// TODO: these flags need to be figured out
|
||||||
//listPacket.data().entries[0].bytes1[1] = 0x00;//flags
|
//listPacket.data().entries[0].bytes1[1] = 0x00;//flags
|
||||||
listPacket.data().entries[0].onlineStatusMask = pPlayer->getOnlineStatusMask();
|
listPacket.data().entries[0].onlineStatusMask = player.getOnlineStatusMask();
|
||||||
|
|
||||||
queueOutPacket( listPacket );
|
queueOutPacket( listPacket );
|
||||||
|
|
||||||
|
@ -471,7 +469,7 @@ void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket
|
||||||
else if( type == 0x0b )
|
else if( type == 0x0b )
|
||||||
{ // friend list
|
{ // friend list
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcSocialList > listPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcSocialList > listPacket( player.getId() );
|
||||||
listPacket.data().type = 0x0B;
|
listPacket.data().type = 0x0B;
|
||||||
listPacket.data().sequence = count;
|
listPacket.data().sequence = count;
|
||||||
memset( listPacket.data().entries, 0, sizeof( listPacket.data().entries ) );
|
memset( listPacket.data().entries, 0, sizeof( listPacket.data().entries ) );
|
||||||
|
@ -485,7 +483,7 @@ void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
|
|
||||||
std::string chatString( inPacket.getStringAt( 0x3a ) );
|
std::string chatString( inPacket.getStringAt( 0x3a ) );
|
||||||
|
@ -495,35 +493,35 @@ void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPa
|
||||||
if( chatString.at( 0 ) == '!' )
|
if( chatString.at( 0 ) == '!' )
|
||||||
{
|
{
|
||||||
// execute game console command
|
// execute game console command
|
||||||
g_gameCommandMgr.execCommand( const_cast< char * >( chatString.c_str() ) + 1, pPlayer );
|
g_gameCommandMgr.execCommand( const_cast< char * >( chatString.c_str() ) + 1, player );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatType chatType = static_cast<ChatType>( inPacket.getValAt< uint8_t >( 0x38 ) );
|
ChatType chatType = static_cast< ChatType >( inPacket.getValAt< uint8_t >( 0x38 ) );
|
||||||
|
|
||||||
//ToDo, need to implement sending GM chat types.
|
//ToDo, need to implement sending GM chat types.
|
||||||
ChatPacket chatPacket( pPlayer, chatType, chatString );
|
ChatPacket chatPacket( player, chatType, chatString );
|
||||||
|
|
||||||
switch( chatType )
|
switch( chatType )
|
||||||
{
|
{
|
||||||
case ChatType::Say:
|
case ChatType::Say:
|
||||||
{
|
{
|
||||||
pPlayer->getCurrentZone()->queueOutPacketForRange( pPlayer, 50, chatPacket );
|
player.getCurrentZone()->queueOutPacketForRange( player, 50, chatPacket );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ChatType::Yell:
|
case ChatType::Yell:
|
||||||
{
|
{
|
||||||
pPlayer->getCurrentZone()->queueOutPacketForRange(pPlayer, 6000, chatPacket);
|
player.getCurrentZone()->queueOutPacketForRange( player, 6000, chatPacket );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ChatType::Shout:
|
case ChatType::Shout:
|
||||||
{
|
{
|
||||||
pPlayer->getCurrentZone()->queueOutPacketForRange( pPlayer, 6000, chatPacket );
|
player.getCurrentZone()->queueOutPacketForRange( player, 6000, chatPacket );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
pPlayer->getCurrentZone()->queueOutPacketForRange( pPlayer, 50, chatPacket );
|
player.getCurrentZone()->queueOutPacketForRange( player, 50, chatPacket );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -535,19 +533,19 @@ void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPa
|
||||||
// log right back in.
|
// log right back in.
|
||||||
// Also the packet needs to be converted to an ipc structure
|
// Also the packet needs to be converted to an ipc structure
|
||||||
void Core::Network::GameConnection::logoutHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::logoutHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
ZoneChannelPacket< FFXIVIpcLogout > logoutPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcLogout > logoutPacket( player.getId() );
|
||||||
logoutPacket.data().flags1 = 0x02;
|
logoutPacket.data().flags1 = 0x02;
|
||||||
logoutPacket.data().flags2 = 0x2000;
|
logoutPacket.data().flags2 = 0x2000;
|
||||||
queueOutPacket( logoutPacket );
|
queueOutPacket( logoutPacket );
|
||||||
|
|
||||||
pPlayer->setMarkedForRemoval();
|
player.setMarkedForRemoval();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Core::Network::GameConnection::tellHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::tellHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
std::string targetPcName = inPacket.getStringAt( 0x21 );
|
std::string targetPcName = inPacket.getStringAt( 0x21 );
|
||||||
std::string msg = inPacket.getStringAt( 0x41 );
|
std::string msg = inPacket.getStringAt( 0x41 );
|
||||||
|
@ -556,7 +554,7 @@ void Core::Network::GameConnection::tellHandler( const Packets::GamePacket& inPa
|
||||||
|
|
||||||
if( !pSession )
|
if( !pSession )
|
||||||
{
|
{
|
||||||
ChatChannelPacket< FFXIVIpcTellErrNotFound > tellErrPacket( pPlayer->getId() );
|
ChatChannelPacket< FFXIVIpcTellErrNotFound > tellErrPacket( player.getId() );
|
||||||
strcpy( tellErrPacket.data().receipientName, targetPcName.c_str() );
|
strcpy( tellErrPacket.data().receipientName, targetPcName.c_str() );
|
||||||
sendSinglePacket( tellErrPacket );
|
sendSinglePacket( tellErrPacket );
|
||||||
|
|
||||||
|
@ -589,9 +587,9 @@ void Core::Network::GameConnection::tellHandler( const Packets::GamePacket& inPa
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatChannelPacket< FFXIVIpcTell > tellPacket( pPlayer->getId() );
|
ChatChannelPacket< FFXIVIpcTell > tellPacket( player.getId() );
|
||||||
strcpy( tellPacket.data().msg, msg.c_str() );
|
strcpy( tellPacket.data().msg, msg.c_str() );
|
||||||
strcpy( tellPacket.data().receipientName, pPlayer->getName().c_str() );
|
strcpy( tellPacket.data().receipientName, player.getName().c_str() );
|
||||||
// TODO: do these have a meaning?
|
// TODO: do these have a meaning?
|
||||||
//tellPacket.data().u1 = 0x92CD7337;
|
//tellPacket.data().u1 = 0x92CD7337;
|
||||||
//tellPacket.data().u2a = 0x2E;
|
//tellPacket.data().u2a = 0x2E;
|
||||||
|
@ -601,12 +599,12 @@ void Core::Network::GameConnection::tellHandler( const Packets::GamePacket& inPa
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::performNoteHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::performNoteHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
GamePacketNew< FFXIVIpcPerformNote, ServerZoneIpcType > performPacket( pPlayer->getId() );
|
ZoneChannelPacket< FFXIVIpcPerformNote > performPacket( player.getId() );
|
||||||
|
|
||||||
uint8_t inVal = inPacket.getValAt< uint8_t >( 0x20 );
|
auto inVal = inPacket.getDataAt( 0x20 );
|
||||||
memcpy( &performPacket.data().data[0], &inVal, 32 );
|
memcpy( &performPacket.data().data[0], inVal, 32 );
|
||||||
|
|
||||||
pPlayer->sendToInRangeSet( performPacket );
|
player.sendToInRangeSet( performPacket );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,34 +1,34 @@
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Session.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
#include "Network/PacketWrappers/ActorControlPacket142.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
#include "Network/PacketWrappers/ActorControlPacket143.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket144.h"
|
#include "Network/PacketWrappers/ActorControlPacket144.h"
|
||||||
|
#include "Network/PacketWrappers/MoveActorPacket.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
#include "Network/PacketWrappers/PlayerStateFlagsPacket.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/DebugCommand/DebugCommandHandler.h"
|
#include "DebugCommand/DebugCommandHandler.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Action/Action.h"
|
#include "Action/Action.h"
|
||||||
#include "src/servers/Server_Zone/Action/ActionCast.h"
|
#include "Action/ActionCast.h"
|
||||||
#include "src/servers/Server_Zone/Action/ActionMount.h"
|
#include "Action/ActionMount.h"
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Script/ScriptManager.h"
|
||||||
#include "Server_Zone/Network/PacketWrappers/MoveActorPacket.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern Core::Scripting::ScriptManager g_scriptMgr;
|
extern Core::Scripting::ScriptManager g_scriptMgr;
|
||||||
|
@ -40,7 +40,7 @@ using namespace Core::Network::Packets;
|
||||||
using namespace Core::Network::Packets::Server;
|
using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inPacket,
|
||||||
Entity::PlayerPtr pPlayer )
|
Entity::Player& player )
|
||||||
{
|
{
|
||||||
uint8_t type = inPacket.getValAt< uint32_t >( 0x21 );
|
uint8_t type = inPacket.getValAt< uint32_t >( 0x21 );
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inP
|
||||||
|
|
||||||
uint64_t targetId = inPacket.getValAt< uint64_t >( 0x30 );
|
uint64_t targetId = inPacket.getValAt< uint64_t >( 0x30 );
|
||||||
|
|
||||||
pPlayer->sendDebug( "Skill type:" + std::to_string( type ) );
|
player.sendDebug( "Skill type:" + std::to_string( type ) );
|
||||||
|
|
||||||
switch( type )
|
switch( type )
|
||||||
{
|
{
|
||||||
|
@ -58,16 +58,16 @@ void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inP
|
||||||
if( action < 1000000 ) // normal action
|
if( action < 1000000 ) // normal action
|
||||||
{
|
{
|
||||||
std::string actionIdStr = boost::str( boost::format( "%|04X|" ) % action );
|
std::string actionIdStr = boost::str( boost::format( "%|04X|" ) % action );
|
||||||
pPlayer->sendDebug( "---------------------------------------" );
|
player.sendDebug( "---------------------------------------" );
|
||||||
pPlayer->sendDebug( "ActionHandler ( " + actionIdStr + " | " +
|
player.sendDebug( "ActionHandler ( " + actionIdStr + " | " +
|
||||||
g_exdData.getActionInfo( action )->name +
|
g_exdData.getActionInfo( action )->name +
|
||||||
" | " + std::to_string( targetId ) + " )" );
|
" | " + std::to_string( targetId ) + " )" );
|
||||||
|
|
||||||
pPlayer->queuePacket( ActorControlPacket142( pPlayer->getId(), ActorControlType::ActionStart, 0x01, action ) );
|
player.queuePacket( ActorControlPacket142( player.getId(), ActorControlType::ActionStart, 0x01, action ) );
|
||||||
|
|
||||||
if( action == 5 )
|
if( action == 5 )
|
||||||
{
|
{
|
||||||
auto currentAction = pPlayer->getCurrentAction();
|
auto currentAction = player.getCurrentAction();
|
||||||
|
|
||||||
// we should always have an action here, if not there is a bug
|
// we should always have an action here, if not there is a bug
|
||||||
assert( currentAction );
|
assert( currentAction );
|
||||||
|
@ -75,22 +75,22 @@ void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inP
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Core::Entity::ActorPtr targetActor = pPlayer;
|
Core::Entity::ActorPtr targetActor = player.getAsPlayer();
|
||||||
if( targetId != pPlayer->getId() )
|
if( targetId != player.getId() )
|
||||||
{
|
{
|
||||||
targetActor = pPlayer->lookupTargetById( targetId );
|
targetActor = player.lookupTargetById( targetId );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !pPlayer->actionHasCastTime( action ) )
|
if( !player.actionHasCastTime( action ) )
|
||||||
{
|
{
|
||||||
g_scriptMgr.onCastFinish( pPlayer, targetActor, action );
|
g_scriptMgr.onCastFinish( player, targetActor, action );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Action::ActionCastPtr pActionCast( new Action::ActionCast( pPlayer, targetActor, action ) );
|
Action::ActionCastPtr pActionCast( new Action::ActionCast( player.getAsPlayer(), targetActor, action ) );
|
||||||
pPlayer->setCurrentAction( pActionCast );
|
player.setCurrentAction( pActionCast );
|
||||||
pPlayer->sendDebug( "setCurrentAction()" );
|
player.sendDebug( "setCurrentAction()" );
|
||||||
pPlayer->getCurrentAction()->onStart();
|
player.getCurrentAction()->onStart();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inP
|
||||||
if( info )
|
if( info )
|
||||||
{
|
{
|
||||||
g_log.debug( info->name );
|
g_log.debug( info->name );
|
||||||
g_scriptMgr.onEventItem( pPlayer, action, info->eventId, info->castTime, targetId );
|
g_scriptMgr.onEventItem( player, action, info->eventId, info->castTime, targetId );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( action > 3000000 ) // unknown
|
else if( action > 3000000 ) // unknown
|
||||||
|
@ -116,15 +116,15 @@ void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inP
|
||||||
|
|
||||||
case Common::SkillType::MountSkill:
|
case Common::SkillType::MountSkill:
|
||||||
|
|
||||||
pPlayer->sendDebug( "Request mount " + std::to_string( action ) );
|
player.sendDebug( "Request mount " + std::to_string( action ) );
|
||||||
|
|
||||||
Action::ActionMountPtr pActionMount( new Action::ActionMount(pPlayer, action) );
|
Action::ActionMountPtr pActionMount( new Action::ActionMount( player.getAsPlayer(), action ) );
|
||||||
pPlayer->setCurrentAction( pActionMount );
|
player.setCurrentAction( pActionMount );
|
||||||
pPlayer->sendDebug("setCurrentAction()");
|
player.sendDebug( "setCurrentAction()" );
|
||||||
pPlayer->getCurrentAction()->onStart();
|
player.getCurrentAction()->onStart();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef _ACTORCONTROL142_H
|
#ifndef _ACTORCONTROL142_H
|
||||||
#define _ACTORCONTROL142_H
|
#define _ACTORCONTROL142_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef _ACTORCONTROL143_H
|
#ifndef _ACTORCONTROL143_H
|
||||||
#define _ACTORCONTROL143_H
|
#define _ACTORCONTROL143_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef _ACTORCONTROL144_H
|
#ifndef _ACTORCONTROL144_H
|
||||||
#define _ACTORCONTROL144_H
|
#define _ACTORCONTROL144_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#ifndef _ACTORSPAWN_H
|
#ifndef _ACTORSPAWN_H
|
||||||
#define _ACTORSPAWN_H
|
#define _ACTORSPAWN_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef _CHATPACKET_H
|
#ifndef _CHATPACKET_H
|
||||||
#define _CHATPACKET_H
|
#define _CHATPACKET_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
@ -18,17 +18,17 @@ class ChatPacket :
|
||||||
public ZoneChannelPacket< FFXIVIpcChat >
|
public ZoneChannelPacket< FFXIVIpcChat >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ChatPacket( Entity::PlayerPtr player, Common::ChatType chatType, const std::string& msg ) :
|
ChatPacket( Entity::Player& player, Common::ChatType chatType, const std::string& msg ) :
|
||||||
ZoneChannelPacket< FFXIVIpcChat >( player->getId(), player->getId() )
|
ZoneChannelPacket< FFXIVIpcChat >( player.getId(), player.getId() )
|
||||||
{
|
{
|
||||||
initialize( player, chatType, msg );
|
initialize( player, chatType, msg );
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize( Entity::PlayerPtr player, Common::ChatType chatType, const std::string& msg )
|
void initialize( Entity::Player& player, Common::ChatType chatType, const std::string& msg )
|
||||||
{
|
{
|
||||||
m_data.chatType = chatType;
|
m_data.chatType = chatType;
|
||||||
strcpy( m_data.name, player->getName().c_str() );
|
strcpy( m_data.name, player.getName().c_str() );
|
||||||
strcpy( m_data.msg, msg.c_str() );
|
strcpy( m_data.msg, msg.c_str() );
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -38,4 +38,4 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*_CHATPACKET_H*/
|
#endif /*_CHATPACKET_H*/
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef _EVENTFINISH_H
|
#ifndef _EVENTFINISH_H
|
||||||
#define _EVENTFINISH_H
|
#define _EVENTFINISH_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef _EVENTPLAY_H
|
#ifndef _EVENTPLAY_H
|
||||||
#define _EVENTPLAY_H
|
#define _EVENTPLAY_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef _EVENTSTART_H
|
#ifndef _EVENTSTART_H
|
||||||
#define _EVENTSTART_H
|
#define _EVENTSTART_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#ifndef _CORE_NETWORK_PACKETS_INITUIPACKET_H
|
#ifndef _CORE_NETWORK_PACKETS_INITUIPACKET_H
|
||||||
#define _CORE_NETWORK_PACKETS_INITUIPACKET_H
|
#define _CORE_NETWORK_PACKETS_INITUIPACKET_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include "Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
@ -18,59 +18,59 @@ namespace Server {
|
||||||
class InitUIPacket : public ZoneChannelPacket< FFXIVIpcInitUI >
|
class InitUIPacket : public ZoneChannelPacket< FFXIVIpcInitUI >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InitUIPacket( Entity::PlayerPtr player ) :
|
InitUIPacket( Entity::Player& player ) :
|
||||||
ZoneChannelPacket< FFXIVIpcInitUI >( player->getId(), player->getId() )
|
ZoneChannelPacket< FFXIVIpcInitUI >( player.getId(), player.getId() )
|
||||||
{
|
{
|
||||||
initialize( player );
|
initialize( player );
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize( Entity::PlayerPtr player )
|
void initialize( Entity::Player& player )
|
||||||
{
|
{
|
||||||
m_data.contentId = player->getContentId();
|
m_data.contentId = player.getContentId();
|
||||||
|
|
||||||
// TODO: Support rested experience.
|
// TODO: Support rested experience.
|
||||||
m_data.restedExp = 0;
|
m_data.restedExp = 0;
|
||||||
//m_data.padding = 0x100;
|
//m_data.padding = 0x100;
|
||||||
m_data.charId = player->getId();
|
m_data.charId = player.getId();
|
||||||
m_data.race = player->getLookAt( Common::CharaLook::Race );
|
m_data.race = player.getLookAt( Common::CharaLook::Race );
|
||||||
m_data.tribe = player->getLookAt( Common::CharaLook::Tribe );
|
m_data.tribe = player.getLookAt( Common::CharaLook::Tribe );
|
||||||
m_data.gender = player->getLookAt( Common::CharaLook::Gender );
|
m_data.gender = player.getLookAt( Common::CharaLook::Gender );
|
||||||
m_data.currentClass = static_cast< uint8_t >( player->getClass() );
|
m_data.currentClass = static_cast< uint8_t >( player.getClass() );
|
||||||
m_data.currentJob = static_cast< uint8_t >( player->getClass() );
|
m_data.currentJob = static_cast< uint8_t >( player.getClass() );
|
||||||
m_data.deity = static_cast< uint8_t >( player->getGuardianDeity() );
|
m_data.deity = static_cast< uint8_t >( player.getGuardianDeity() );
|
||||||
m_data.namedayMonth = player->getBirthMonth();
|
m_data.namedayMonth = player.getBirthMonth();
|
||||||
m_data.namedayDay = player->getBirthDay();
|
m_data.namedayDay = player.getBirthDay();
|
||||||
// TODO: Support grand company status.
|
// TODO: Support grand company status.
|
||||||
m_data.grandCompany = static_cast< Common::GrandCompany >( player->getGc() );
|
m_data.grandCompany = static_cast< Common::GrandCompany >( player.getGc() );
|
||||||
//m_data.gcRank = GCRank::None;
|
//m_data.gcRank = GCRank::None;
|
||||||
|
|
||||||
// TODO: Support starting city.
|
// TODO: Support starting city.
|
||||||
//m_data.startCity = Town::Gridania;
|
//m_data.startCity = Town::Gridania;
|
||||||
m_data.homepoint = player->getHomepoint();
|
m_data.homepoint = player.getHomepoint();
|
||||||
|
|
||||||
memset( &m_data.name[0], 0, sizeof( m_data.name ) );
|
memset( &m_data.name[0], 0, sizeof( m_data.name ) );
|
||||||
|
|
||||||
strcpy( &m_data.name[0], player->getName().c_str() );
|
strcpy( &m_data.name[0], player.getName().c_str() );
|
||||||
|
|
||||||
memcpy( m_data.aetheryte, player->getAetheryteArray(), sizeof ( m_data.aetheryte ) );
|
memcpy( m_data.aetheryte, player.getAetheryteArray(), sizeof ( m_data.aetheryte ) );
|
||||||
|
|
||||||
// Set the class levels and exp.
|
// Set the class levels and exp.
|
||||||
for( uint8_t i = 0; i < 25; i++ )
|
for( uint8_t i = 0; i < 25; i++ )
|
||||||
{
|
{
|
||||||
m_data.levels[i] = player->getClassArray()[i];
|
m_data.levels[i] = player.getClassArray()[i];
|
||||||
m_data.exp[i] = player->getExpArray()[i];
|
m_data.exp[i] = player.getExpArray()[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy( m_data.orchestrionMask, player->getOrchestrionBitmask(), sizeof( m_data.orchestrionMask ) );
|
memcpy( m_data.orchestrionMask, player.getOrchestrionBitmask(), sizeof( m_data.orchestrionMask ) );
|
||||||
|
|
||||||
memcpy( m_data.mountGuideMask, player->getMountGuideBitmask(), sizeof( m_data.mountGuideMask) );
|
memcpy( m_data.mountGuideMask, player.getMountGuideBitmask(), sizeof( m_data.mountGuideMask) );
|
||||||
|
|
||||||
memcpy( m_data.unlockBitmask, player->getUnlockBitmask(), sizeof( m_data.unlockBitmask ) );
|
memcpy( m_data.unlockBitmask, player.getUnlockBitmask(), sizeof( m_data.unlockBitmask ) );
|
||||||
|
|
||||||
memcpy( m_data.discovery, player->getDiscoveryBitmask(), sizeof( m_data.discovery ) );
|
memcpy( m_data.discovery, player.getDiscoveryBitmask(), sizeof( m_data.discovery ) );
|
||||||
|
|
||||||
memcpy( m_data.howto, player->getHowToArray(), sizeof( m_data.howto ) );
|
memcpy( m_data.howto, player.getHowToArray(), sizeof( m_data.howto ) );
|
||||||
|
|
||||||
m_data.unknown_13 = 0x46;
|
m_data.unknown_13 = 0x46;
|
||||||
m_data.expansion = 2;
|
m_data.expansion = 2;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef _MODELEQUIPPACKET_H
|
#ifndef _MODELEQUIPPACKET_H
|
||||||
#define _MODELEQUIPPACKET_H
|
#define _MODELEQUIPPACKET_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
@ -17,22 +17,22 @@ class ModelEquipPacket :
|
||||||
public ZoneChannelPacket< FFXIVIpcModelEquip >
|
public ZoneChannelPacket< FFXIVIpcModelEquip >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ModelEquipPacket( Entity::PlayerPtr player ) :
|
ModelEquipPacket( Entity::Player& player ) :
|
||||||
ZoneChannelPacket< FFXIVIpcModelEquip >( player->getId(), player->getId() )
|
ZoneChannelPacket< FFXIVIpcModelEquip >( player.getId(), player.getId() )
|
||||||
{
|
{
|
||||||
initialize( player );
|
initialize( player );
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize( Entity::PlayerPtr player )
|
void initialize( Entity::Player& player )
|
||||||
{
|
{
|
||||||
m_data.mainWeapon = player->getModelMainWeapon();
|
m_data.mainWeapon = player.getModelMainWeapon();
|
||||||
m_data.offWeapon = player->getModelSubWeapon();
|
m_data.offWeapon = player.getModelSubWeapon();
|
||||||
m_data.models[0] = player->getModelForSlot( Inventory::EquipSlot::Head );
|
m_data.models[0] = player.getModelForSlot( Inventory::EquipSlot::Head );
|
||||||
m_data.models[1] = player->getModelForSlot( Inventory::EquipSlot::Body );
|
m_data.models[1] = player.getModelForSlot( Inventory::EquipSlot::Body );
|
||||||
m_data.models[2] = player->getModelForSlot( Inventory::EquipSlot::Hands );
|
m_data.models[2] = player.getModelForSlot( Inventory::EquipSlot::Hands );
|
||||||
m_data.models[3] = player->getModelForSlot( Inventory::EquipSlot::Legs );
|
m_data.models[3] = player.getModelForSlot( Inventory::EquipSlot::Legs );
|
||||||
m_data.models[4] = player->getModelForSlot( Inventory::EquipSlot::Feet );
|
m_data.models[4] = player.getModelForSlot( Inventory::EquipSlot::Feet );
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -41,4 +41,4 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*_MODELEQUIPPACKET_H*/
|
#endif /*_MODELEQUIPPACKET_H*/
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#ifndef _MOVEACTORPACKET_H
|
#ifndef _MOVEACTORPACKET_H
|
||||||
#define _MOVEACTORPACKET_H
|
#define _MOVEACTORPACKET_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
@ -21,24 +21,24 @@ class MoveActorPacket :
|
||||||
public ZoneChannelPacket< FFXIVIpcActorMove >
|
public ZoneChannelPacket< FFXIVIpcActorMove >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MoveActorPacket( Entity::ActorPtr actor, uint8_t unk1, uint8_t unk2, uint8_t unk3, uint16_t unk4 ) :
|
MoveActorPacket( Entity::Actor& actor, uint8_t unk1, uint8_t unk2, uint8_t unk3, uint16_t unk4 ) :
|
||||||
ZoneChannelPacket< FFXIVIpcActorMove >( actor->getId(), actor->getId() )
|
ZoneChannelPacket< FFXIVIpcActorMove >( actor.getId(), actor.getId() )
|
||||||
{
|
{
|
||||||
initialize( actor, unk1, unk2, unk3, unk4 );
|
initialize( actor, unk1, unk2, unk3, unk4 );
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize( Entity::ActorPtr actor, uint8_t unk1, uint8_t unk2, uint8_t unk3, uint16_t unk4 )
|
void initialize( Entity::Actor& actor, uint8_t unk1, uint8_t unk2, uint8_t unk3, uint16_t unk4 )
|
||||||
{
|
{
|
||||||
|
|
||||||
m_data.rotation = Math::Util::floatToUInt8Rot( actor->getRotation() );
|
m_data.rotation = Math::Util::floatToUInt8Rot( actor.getRotation() );
|
||||||
m_data.unknown_1 = unk1;
|
m_data.unknown_1 = unk1;
|
||||||
m_data.unknown_2 = unk2;
|
m_data.unknown_2 = unk2;
|
||||||
m_data.unknown_3 = unk3;
|
m_data.unknown_3 = unk3;
|
||||||
m_data.unknown_4 = unk4;
|
m_data.unknown_4 = unk4;
|
||||||
m_data.posX = Math::Util::floatToUInt16( actor->getPos().x );
|
m_data.posX = Math::Util::floatToUInt16( actor.getPos().x );
|
||||||
m_data.posY = Math::Util::floatToUInt16( actor->getPos().y );
|
m_data.posY = Math::Util::floatToUInt16( actor.getPos().y );
|
||||||
m_data.posZ = Math::Util::floatToUInt16( actor->getPos().z );
|
m_data.posZ = Math::Util::floatToUInt16( actor.getPos().z );
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -48,4 +48,4 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*_MOVEACTORPACKET_H*/
|
#endif /*_MOVEACTORPACKET_H*/
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef _CORE_NETWORK_PACKETS_PINGPACKET_H
|
#ifndef _CORE_NETWORK_PACKETS_PINGPACKET_H
|
||||||
#define _CORE_NETWORK_PACKETS_PINGPACKET_H
|
#define _CORE_NETWORK_PACKETS_PINGPACKET_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
@ -17,14 +17,14 @@ class PingPacket :
|
||||||
public ZoneChannelPacket< FFXIVIpcPing >
|
public ZoneChannelPacket< FFXIVIpcPing >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PingPacket( Entity::PlayerPtr player, int32_t inVal ) :
|
PingPacket( Entity::Player& player, int32_t inVal ) :
|
||||||
ZoneChannelPacket< FFXIVIpcPing >( player->getId(), player->getId() )
|
ZoneChannelPacket< FFXIVIpcPing >( player.getId(), player.getId() )
|
||||||
{
|
{
|
||||||
initialize( player, inVal );
|
initialize( player, inVal );
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize( Entity::PlayerPtr player, int32_t inVal )
|
void initialize( Entity::Player& player, int32_t inVal )
|
||||||
{
|
{
|
||||||
m_data.timeInMilliseconds = 0x000014D00000000 + inVal;
|
m_data.timeInMilliseconds = 0x000014D00000000 + inVal;
|
||||||
};
|
};
|
||||||
|
@ -35,4 +35,4 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*_CORE_NETWORK_PACKETS_CPINGPACKET_H*/
|
#endif /*_CORE_NETWORK_PACKETS_CPINGPACKET_H*/
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
#ifndef _PLAYERSPAWN_H
|
#ifndef _PLAYERSPAWN_H
|
||||||
#define _PLAYERSPAWN_H
|
#define _PLAYERSPAWN_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Inventory.h"
|
#include "Inventory/Inventory.h"
|
||||||
#include "src/servers/Server_Zone/Inventory/Item.h"
|
#include "Inventory/Item.h"
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffectContainer.h"
|
#include "StatusEffect/StatusEffect.h"
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffect.h"
|
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
@ -23,97 +22,97 @@ namespace Server {
|
||||||
public GamePacketNew< FFXIVIpcPlayerSpawn, ServerZoneIpcType >
|
public GamePacketNew< FFXIVIpcPlayerSpawn, ServerZoneIpcType >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PlayerSpawnPacket( Entity::PlayerPtr pPlayer, Entity::PlayerPtr pTarget ) :
|
PlayerSpawnPacket( Entity::Player& player, Entity::Player& target ) :
|
||||||
GamePacketNew< FFXIVIpcPlayerSpawn, ServerZoneIpcType >( pPlayer->getId(), pTarget->getId() )
|
GamePacketNew< FFXIVIpcPlayerSpawn, ServerZoneIpcType >( player.getId(), target.getId() )
|
||||||
{
|
{
|
||||||
initialize( pPlayer, pTarget );
|
initialize( player, target );
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize( Entity::PlayerPtr pPlayer, Entity::PlayerPtr pTarget )
|
void initialize( Entity::Player& player, Entity::Player& target )
|
||||||
{
|
{
|
||||||
// todo: figure out unkown offsets
|
// todo: figure out unkown offsets
|
||||||
// TODO: temporary gm rank
|
// TODO: temporary gm rank
|
||||||
//m_data.gmRank = 0xff;
|
//m_data.gmRank = 0xff;
|
||||||
|
|
||||||
m_data.classJob = static_cast< uint8_t >( pPlayer->getClass() );
|
m_data.classJob = static_cast< uint8_t >( player.getClass() );
|
||||||
//m_data.status = static_cast< uint8_t >( pPlayer->getStatus() );
|
//m_data.status = static_cast< uint8_t >( pPlayer->getStatus() );
|
||||||
|
|
||||||
m_data.hPCurr = pPlayer->getHp();
|
m_data.hPCurr = player.getHp();
|
||||||
m_data.mPCurr = pPlayer->getMp();
|
m_data.mPCurr = player.getMp();
|
||||||
m_data.tPCurr = pPlayer->getTp();
|
m_data.tPCurr = player.getTp();
|
||||||
m_data.hPMax = pPlayer->getMaxHp();
|
m_data.hPMax = player.getMaxHp();
|
||||||
m_data.mPMax = pPlayer->getMaxMp();
|
m_data.mPMax = player.getMaxMp();
|
||||||
|
|
||||||
//m_data.tPMax = 3000;
|
//m_data.tPMax = 3000;
|
||||||
m_data.level = pPlayer->getLevel();
|
m_data.level = player.getLevel();
|
||||||
m_data.gmRank = pPlayer->getGmRank();
|
m_data.gmRank = player.getGmRank();
|
||||||
m_data.pose = 0;
|
m_data.pose = 0;
|
||||||
|
|
||||||
memcpy( m_data.look, pPlayer->getLookArray(), 26 );
|
memcpy( m_data.look, player.getLookArray(), 26 );
|
||||||
|
|
||||||
auto item = pPlayer->getInventory()->getItemAt( Inventory::GearSet0, Inventory::EquipSlot::MainHand );
|
auto item = player.getInventory()->getItemAt( Inventory::GearSet0, Inventory::EquipSlot::MainHand );
|
||||||
if( item )
|
if( item )
|
||||||
m_data.mainWeaponModel = item->getModelId1();
|
m_data.mainWeaponModel = item->getModelId1();
|
||||||
m_data.secWeaponModel = pPlayer->getModelSubWeapon();
|
m_data.secWeaponModel = player.getModelSubWeapon();
|
||||||
|
|
||||||
m_data.models[0] = pPlayer->getModelForSlot( Inventory::EquipSlot::Head );
|
m_data.models[0] = player.getModelForSlot( Inventory::EquipSlot::Head );
|
||||||
m_data.models[1] = pPlayer->getModelForSlot( Inventory::EquipSlot::Body );
|
m_data.models[1] = player.getModelForSlot( Inventory::EquipSlot::Body );
|
||||||
m_data.models[2] = pPlayer->getModelForSlot( Inventory::EquipSlot::Hands );
|
m_data.models[2] = player.getModelForSlot( Inventory::EquipSlot::Hands );
|
||||||
m_data.models[3] = pPlayer->getModelForSlot( Inventory::EquipSlot::Legs );
|
m_data.models[3] = player.getModelForSlot( Inventory::EquipSlot::Legs );
|
||||||
m_data.models[4] = pPlayer->getModelForSlot( Inventory::EquipSlot::Feet );
|
m_data.models[4] = player.getModelForSlot( Inventory::EquipSlot::Feet );
|
||||||
strcpy( m_data.name, pPlayer->getName().c_str() );
|
strcpy( m_data.name, player.getName().c_str() );
|
||||||
|
|
||||||
m_data.pos.x = pPlayer->getPos().x;
|
m_data.pos.x = player.getPos().x;
|
||||||
m_data.pos.y = pPlayer->getPos().y;
|
m_data.pos.y = player.getPos().y;
|
||||||
m_data.pos.z = pPlayer->getPos().z;
|
m_data.pos.z = player.getPos().z;
|
||||||
m_data.rotation = Math::Util::floatToUInt16Rot( pPlayer->getRotation() );
|
m_data.rotation = Math::Util::floatToUInt16Rot( player.getRotation() );
|
||||||
|
|
||||||
|
|
||||||
m_data.title = pPlayer->getTitle();
|
m_data.title = player.getTitle();
|
||||||
m_data.voice = pPlayer->getVoiceId();
|
m_data.voice = player.getVoiceId();
|
||||||
m_data.currentMount = pPlayer->getCurrentMount();
|
m_data.currentMount = player.getCurrentMount();
|
||||||
|
|
||||||
m_data.onlineStatus = static_cast< uint8_t >( pPlayer->getOnlineStatus() );
|
m_data.onlineStatus = static_cast< uint8_t >( player.getOnlineStatus() );
|
||||||
|
|
||||||
//m_data.u23 = 0x04;
|
//m_data.u23 = 0x04;
|
||||||
//m_data.u24 = 256;
|
//m_data.u24 = 256;
|
||||||
m_data.state = static_cast< uint8_t >( pPlayer->getStatus() );
|
m_data.state = static_cast< uint8_t >( player.getStatus() );
|
||||||
m_data.type = 1;
|
m_data.type = 1;
|
||||||
if( pTarget == pPlayer )
|
if( target.getId() == player.getId() )
|
||||||
{
|
{
|
||||||
m_data.spawnIndex = 0x00;
|
m_data.spawnIndex = 0x00;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_data.spawnIndex = pTarget->getSpawnIdForActorId( pPlayer->getId() );
|
m_data.spawnIndex = target.getSpawnIdForActorId( player.getId() );
|
||||||
}
|
}
|
||||||
// 0x20 == spawn hidden to be displayed by the spawneffect control
|
// 0x20 == spawn hidden to be displayed by the spawneffect control
|
||||||
m_data.displayFlags = pPlayer->getStance();
|
m_data.displayFlags = player.getStance();
|
||||||
|
|
||||||
if( pPlayer->getZoningType() != Common::ZoneingType::None )
|
if( player.getZoningType() != Common::ZoneingType::None )
|
||||||
{
|
{
|
||||||
m_data.displayFlags |= Entity::Actor::DisplayFlags::Invisible;
|
m_data.displayFlags |= Entity::Actor::DisplayFlags::Invisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pPlayer->getEquipDisplayFlags() & Core::Common::EquipDisplayFlags::HideHead )
|
if( player.getEquipDisplayFlags() & Core::Common::EquipDisplayFlags::HideHead )
|
||||||
{
|
{
|
||||||
m_data.displayFlags |= Entity::Actor::DisplayFlags::HideHead;
|
m_data.displayFlags |= Entity::Actor::DisplayFlags::HideHead;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pPlayer->getEquipDisplayFlags() & Core::Common::EquipDisplayFlags::HideWeapon )
|
if( player.getEquipDisplayFlags() & Core::Common::EquipDisplayFlags::HideWeapon )
|
||||||
{
|
{
|
||||||
m_data.displayFlags |= Entity::Actor::DisplayFlags::HideWeapon;
|
m_data.displayFlags |= Entity::Actor::DisplayFlags::HideWeapon;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pPlayer->getEquipDisplayFlags() & Core::Common::EquipDisplayFlags::Visor )
|
if( player.getEquipDisplayFlags() & Core::Common::EquipDisplayFlags::Visor )
|
||||||
{
|
{
|
||||||
m_data.displayFlags |= Entity::Actor::DisplayFlags::Visor;
|
m_data.displayFlags |= Entity::Actor::DisplayFlags::Visor;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_data.currentMount = pPlayer->getCurrentMount();
|
m_data.currentMount = player.getCurrentMount();
|
||||||
|
|
||||||
m_data.targetId = pPlayer->getTargetId();
|
m_data.targetId = player.getTargetId();
|
||||||
//m_data.type = 1;
|
//m_data.type = 1;
|
||||||
//m_data.unknown_33 = 4;
|
//m_data.unknown_33 = 4;
|
||||||
//m_data.unknown_38 = 0x70;
|
//m_data.unknown_38 = 0x70;
|
||||||
|
@ -122,10 +121,11 @@ namespace Server {
|
||||||
|
|
||||||
uint64_t currentTimeMs = Util::getTimeMs();
|
uint64_t currentTimeMs = Util::getTimeMs();
|
||||||
|
|
||||||
for( auto const& effect : pPlayer->getStatusEffectContainer()->getEffectMap() )
|
for( auto const& effect : player.getStatusEffectMap() )
|
||||||
{
|
{
|
||||||
m_data.effect[effect.first].effect_id = effect.second->getId();
|
m_data.effect[effect.first].effect_id = effect.second->getId();
|
||||||
m_data.effect[effect.first].duration = static_cast< float >( effect.second->getDuration() - ( currentTimeMs - effect.second->getStartTimeMs() ) ) / 1000;
|
m_data.effect[effect.first].duration = static_cast< float >( effect.second->getDuration() -
|
||||||
|
( currentTimeMs - effect.second->getStartTimeMs() ) ) / 1000;
|
||||||
m_data.effect[effect.first].sourceActorId = effect.second->getSrcActorId();
|
m_data.effect[effect.first].sourceActorId = effect.second->getSrcActorId();
|
||||||
m_data.effect[effect.first].unknown1 = effect.second->getParam();
|
m_data.effect[effect.first].unknown1 = effect.second->getParam();
|
||||||
}
|
}
|
||||||
|
@ -138,4 +138,4 @@ namespace Server {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*_PlayerSpawn_H*/
|
#endif /*_PlayerSpawn_H*/
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef _PLAYERSTATE_H
|
#ifndef _PLAYERSTATE_H
|
||||||
#define _PLAYERSTATE_H
|
#define _PLAYERSTATE_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
@ -17,14 +17,14 @@ class PlayerStateFlagsPacket :
|
||||||
public ZoneChannelPacket< FFXIVIpcPlayerStateFlags >
|
public ZoneChannelPacket< FFXIVIpcPlayerStateFlags >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PlayerStateFlagsPacket( Entity::PlayerPtr pActor ) :
|
PlayerStateFlagsPacket( Entity::Player& player ) :
|
||||||
ZoneChannelPacket< FFXIVIpcPlayerStateFlags >( pActor->getId(), pActor->getId() )
|
ZoneChannelPacket< FFXIVIpcPlayerStateFlags >( player.getId(), player.getId() )
|
||||||
{
|
{
|
||||||
initialize( pActor->getStateFlags() );
|
initialize( player.getStateFlags() );
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerStateFlagsPacket( Entity::PlayerPtr pActor, std::vector< Common::PlayerStateFlag > flags ) :
|
PlayerStateFlagsPacket( Entity::Player& player, std::vector< Common::PlayerStateFlag > flags ) :
|
||||||
ZoneChannelPacket< FFXIVIpcPlayerStateFlags >( pActor->getId(), pActor->getId() )
|
ZoneChannelPacket< FFXIVIpcPlayerStateFlags >( player.getId(), player.getId() )
|
||||||
{
|
{
|
||||||
uint8_t newFlags[7];
|
uint8_t newFlags[7];
|
||||||
memset( newFlags, 0, 7 );
|
memset( newFlags, 0, 7 );
|
||||||
|
@ -55,4 +55,4 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*_PLAYERSTATE_H*/
|
#endif /*_PLAYERSTATE_H*/
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef _QUESTMESSAGE_H
|
#ifndef _QUESTMESSAGE_H
|
||||||
#define _QUESTMESSAGE_H
|
#define _QUESTMESSAGE_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef _SERVERNOTICEPACKET_H
|
#ifndef _SERVERNOTICEPACKET_H
|
||||||
#define _SERVERNOTICEPACKET_H
|
#define _SERVERNOTICEPACKET_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#ifndef _UPDATEHPMPTP_H
|
#ifndef _UPDATEHPMPTP_H
|
||||||
#define _UPDATEHPMPTP_H
|
#define _UPDATEHPMPTP_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Zone/Actor/Actor.h>
|
#include <Actor/Actor.h>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <chaiscript/chaiscript.hpp>
|
#include <chaiscript/chaiscript.hpp>
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Script/ChaiscriptStdLib.h>
|
#include <Server_Common/Script/ChaiscriptStdLib.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Actor/BattleNpc.h"
|
#include "Actor/BattleNpc.h"
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
#include "src/servers/Server_Zone/Event/Event.h"
|
#include "Event/Event.h"
|
||||||
#include "src/servers/Server_Zone/Event/EventHelper.h"
|
#include "Event/EventHelper.h"
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffect.h"
|
#include "StatusEffect/StatusEffect.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Script/ScriptManager.h"
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
@ -55,11 +55,11 @@ void Core::Scripting::ScriptManager::loadDir( std::string dirname, std::set<std:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Scripting::ScriptManager::onPlayerFirstEnterWorld( Core::Entity::PlayerPtr pPlayer )
|
void Core::Scripting::ScriptManager::onPlayerFirstEnterWorld( Entity::Player& player )
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::string test = m_onFirstEnterWorld( *pPlayer );
|
std::string test = m_onFirstEnterWorld( player );
|
||||||
}
|
}
|
||||||
catch( const std::exception &e )
|
catch( const std::exception &e )
|
||||||
{
|
{
|
||||||
|
@ -87,18 +87,18 @@ const boost::shared_ptr< chaiscript::ChaiScript >& Core::Scripting::ScriptManage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onTalk( Core::Entity::PlayerPtr pPlayer, uint64_t actorId, uint32_t eventId )
|
bool Core::Scripting::ScriptManager::onTalk( Entity::Player& player, uint64_t actorId, uint32_t eventId )
|
||||||
{
|
{
|
||||||
std::string eventName = "onTalk";
|
std::string eventName = "onTalk";
|
||||||
std::string objName = Event::getEventName( eventId );
|
std::string objName = Event::getEventName( eventId );
|
||||||
|
|
||||||
pPlayer->sendDebug( "Actor: " +
|
player.sendDebug( "Actor: " +
|
||||||
std::to_string( actorId ) + " -> " +
|
std::to_string( actorId ) + " -> " +
|
||||||
std::to_string( Core::Event::mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ) ) +
|
std::to_string( Event::mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ) ) +
|
||||||
" \neventId: " +
|
" \neventId: " +
|
||||||
std::to_string( eventId ) +
|
std::to_string( eventId ) +
|
||||||
" (0x" + boost::str( boost::format( "%|08X|" )
|
" (0x" + boost::str( boost::format( "%|08X|" )
|
||||||
% static_cast< uint64_t >( eventId & 0xFFFFFFF ) ) + ")" );
|
% static_cast< uint64_t >( eventId & 0xFFFFFFF ) ) + ")" );
|
||||||
|
|
||||||
uint16_t eventType = eventId >> 16;
|
uint16_t eventType = eventId >> 16;
|
||||||
|
|
||||||
|
@ -106,26 +106,26 @@ bool Core::Scripting::ScriptManager::onTalk( Core::Entity::PlayerPtr pPlayer, ui
|
||||||
{
|
{
|
||||||
// Get object from engine
|
// Get object from engine
|
||||||
auto obj = m_pChaiHandler->eval( objName );
|
auto obj = m_pChaiHandler->eval( objName );
|
||||||
pPlayer->sendDebug( "Calling: " + objName + "." + eventName );
|
player.sendDebug( "Calling: " + objName + "." + eventName );
|
||||||
|
|
||||||
pPlayer->eventStart( actorId, eventId, Event::Event::Talk, 0, 0 );
|
player.eventStart( actorId, eventId, Event::Event::Talk, 0, 0 );
|
||||||
|
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &,
|
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &,
|
||||||
uint32_t, Entity::Player&, uint64_t ) > >( eventName );
|
uint32_t, Entity::Player&, uint64_t ) > >( eventName );
|
||||||
fn( obj, eventId, *pPlayer, actorId );
|
fn( obj, eventId, player, actorId );
|
||||||
|
|
||||||
pPlayer->checkEvent( eventId );
|
player.checkEvent( eventId );
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug( e.what( ) );
|
player.sendDebug( e.what( ) );
|
||||||
|
|
||||||
if( eventType == Common::EventType::Quest )
|
if( eventType == Common::EventType::Quest )
|
||||||
{
|
{
|
||||||
auto questInfo = g_exdData.getQuestInfo( eventId );
|
auto questInfo = g_exdData.getQuestInfo( eventId );
|
||||||
if( questInfo )
|
if( questInfo )
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( "Quest not implemented: " + questInfo->name );
|
player.sendUrgent( "Quest not implemented: " + questInfo->name );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,7 +135,7 @@ bool Core::Scripting::ScriptManager::onTalk( Core::Entity::PlayerPtr pPlayer, ui
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onEnterTerritory( Core::Entity::PlayerPtr pPlayer, uint32_t eventId,
|
bool Core::Scripting::ScriptManager::onEnterTerritory( Entity::Player& player, uint32_t eventId,
|
||||||
uint16_t param1, uint16_t param2 )
|
uint16_t param1, uint16_t param2 )
|
||||||
{
|
{
|
||||||
std::string eventName = "onEnterTerritory";
|
std::string eventName = "onEnterTerritory";
|
||||||
|
@ -146,25 +146,25 @@ bool Core::Scripting::ScriptManager::onEnterTerritory( Core::Entity::PlayerPtr p
|
||||||
// Get object from engine
|
// Get object from engine
|
||||||
auto obj = m_pChaiHandler->eval( objName );
|
auto obj = m_pChaiHandler->eval( objName );
|
||||||
|
|
||||||
pPlayer->sendDebug( "Calling: " + objName + "." + eventName );
|
player.sendDebug( "Calling: " + objName + "." + eventName );
|
||||||
|
|
||||||
pPlayer->eventStart( pPlayer->getId(), eventId, Event::Event::EnterTerritory, 0, pPlayer->getZoneId() );
|
player.eventStart( player.getId(), eventId, Event::Event::EnterTerritory, 0, player.getZoneId() );
|
||||||
|
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t,
|
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t,
|
||||||
Entity::Player&, uint16_t, uint16_t ) > >( eventName );
|
Entity::Player&, uint16_t, uint16_t ) > >( eventName );
|
||||||
fn( obj, eventId, *pPlayer, param1, param2 );
|
fn( obj, eventId, player, param1, param2 );
|
||||||
|
|
||||||
pPlayer->checkEvent( eventId );
|
player.checkEvent( eventId );
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug( e.what() );
|
player.sendDebug( e.what() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onWithinRange( Entity::PlayerPtr pPlayer, uint32_t eventId, uint32_t param1,
|
bool Core::Scripting::ScriptManager::onWithinRange( Entity::Player& player, uint32_t eventId, uint32_t param1,
|
||||||
float x, float y, float z )
|
float x, float y, float z )
|
||||||
{
|
{
|
||||||
std::string eventName = "onWithinRange";
|
std::string eventName = "onWithinRange";
|
||||||
|
@ -175,25 +175,25 @@ bool Core::Scripting::ScriptManager::onWithinRange( Entity::PlayerPtr pPlayer, u
|
||||||
// Get object from engine
|
// Get object from engine
|
||||||
auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) );
|
auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) );
|
||||||
|
|
||||||
pPlayer->sendDebug( "Calling: " + objName + "." + eventName );
|
player.sendDebug( "Calling: " + objName + "." + eventName );
|
||||||
|
|
||||||
pPlayer->eventStart( pPlayer->getId(), eventId, Event::Event::WithinRange, 1, param1 );
|
player.eventStart( player.getId(), eventId, Event::Event::WithinRange, 1, param1 );
|
||||||
|
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint32_t,
|
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint32_t,
|
||||||
float, float, float ) > >( eventName );
|
float, float, float ) > >( eventName );
|
||||||
fn( obj, eventId, *pPlayer, param1, x, y, z );
|
fn( obj, eventId, player, param1, x, y, z );
|
||||||
|
|
||||||
pPlayer->checkEvent( eventId );
|
player.checkEvent( eventId );
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug( e.what() );
|
player.sendDebug( e.what() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onOutsideRange( Entity::PlayerPtr pPlayer, uint32_t eventId, uint32_t param1,
|
bool Core::Scripting::ScriptManager::onOutsideRange( Entity::Player& player, uint32_t eventId, uint32_t param1,
|
||||||
float x, float y, float z )
|
float x, float y, float z )
|
||||||
{
|
{
|
||||||
std::string eventName = "onOutsideRange";
|
std::string eventName = "onOutsideRange";
|
||||||
|
@ -204,25 +204,25 @@ bool Core::Scripting::ScriptManager::onOutsideRange( Entity::PlayerPtr pPlayer,
|
||||||
// Get object from engine
|
// Get object from engine
|
||||||
auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) );
|
auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) );
|
||||||
|
|
||||||
pPlayer->sendDebug( "Calling: " + objName + "." + eventName );
|
player.sendDebug( "Calling: " + objName + "." + eventName );
|
||||||
|
|
||||||
pPlayer->eventStart( pPlayer->getId(), eventId, Event::Event::OutsideRange, 1, param1 );
|
player.eventStart( player.getId(), eventId, Event::Event::OutsideRange, 1, param1 );
|
||||||
|
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint32_t,
|
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&, uint32_t,
|
||||||
float, float, float ) > >( eventName );
|
float, float, float ) > >( eventName );
|
||||||
fn( obj, eventId, *pPlayer, param1, x, y, z );
|
fn( obj, eventId, player, param1, x, y, z );
|
||||||
|
|
||||||
pPlayer->checkEvent( eventId );
|
player.checkEvent( eventId );
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug( e.what() );
|
player.sendDebug( e.what() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onEmote( Core::Entity::PlayerPtr pPlayer, uint64_t actorId,
|
bool Core::Scripting::ScriptManager::onEmote( Entity::Player& player, uint64_t actorId,
|
||||||
uint32_t eventId, uint8_t emoteId )
|
uint32_t eventId, uint8_t emoteId )
|
||||||
{
|
{
|
||||||
std::string eventName = "onEmote";
|
std::string eventName = "onEmote";
|
||||||
|
@ -232,15 +232,15 @@ bool Core::Scripting::ScriptManager::onEmote( Core::Entity::PlayerPtr pPlayer, u
|
||||||
{
|
{
|
||||||
auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) );
|
auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) );
|
||||||
|
|
||||||
pPlayer->sendDebug( "Calling: " + objName + "." + eventName );
|
player.sendDebug( "Calling: " + objName + "." + eventName );
|
||||||
|
|
||||||
pPlayer->eventStart( actorId, eventId, Event::Event::Emote, 0, emoteId );
|
player.eventStart( actorId, eventId, Event::Event::Emote, 0, emoteId );
|
||||||
|
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&,
|
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&,
|
||||||
uint64_t, uint8_t ) > >( eventName );
|
uint64_t, uint8_t ) > >( eventName );
|
||||||
fn( obj, eventId, *pPlayer, actorId, emoteId );
|
fn( obj, eventId, player, actorId, emoteId );
|
||||||
|
|
||||||
pPlayer->checkEvent( eventId );
|
player.checkEvent( eventId );
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
|
@ -251,7 +251,7 @@ bool Core::Scripting::ScriptManager::onEmote( Core::Entity::PlayerPtr pPlayer, u
|
||||||
auto questInfo = g_exdData.getQuestInfo( eventId );
|
auto questInfo = g_exdData.getQuestInfo( eventId );
|
||||||
if( questInfo )
|
if( questInfo )
|
||||||
{
|
{
|
||||||
pPlayer->sendDebug( "Quest not implemented: " + questInfo->name + "\n" + e.what() );
|
player.sendDebug( "Quest not implemented: " + questInfo->name + "\n" + e.what() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -260,22 +260,22 @@ bool Core::Scripting::ScriptManager::onEmote( Core::Entity::PlayerPtr pPlayer, u
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onEventHandlerReturn( Core::Entity::PlayerPtr pPlayer, uint32_t eventId,
|
bool Core::Scripting::ScriptManager::onEventHandlerReturn( Entity::Player& player, uint32_t eventId,
|
||||||
uint16_t subEvent, uint16_t param1, uint16_t param2,
|
uint16_t subEvent, uint16_t param1, uint16_t param2,
|
||||||
uint16_t param3 )
|
uint16_t param3 )
|
||||||
{
|
{
|
||||||
|
|
||||||
pPlayer->sendDebug( "eventId: " +
|
player.sendDebug( "eventId: " +
|
||||||
std::to_string( eventId ) +
|
std::to_string( eventId ) +
|
||||||
" ( 0x" + boost::str( boost::format( "%|08X|" ) % ( uint64_t ) ( eventId & 0xFFFFFFF ) ) + " ) " +
|
" ( 0x" + boost::str( boost::format( "%|08X|" ) % ( uint64_t ) ( eventId & 0xFFFFFFF ) ) + " ) " +
|
||||||
" scene: " + std::to_string( subEvent ) +
|
" scene: " + std::to_string( subEvent ) +
|
||||||
" p1: " + std::to_string( param1 ) +
|
" p1: " + std::to_string( param1 ) +
|
||||||
" p2: " + std::to_string( param2 ) +
|
" p2: " + std::to_string( param2 ) +
|
||||||
" p3: " + std::to_string( param3 ) );
|
" p3: " + std::to_string( param3 ) );
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
auto pEvent = pPlayer->getEvent( eventId );
|
auto pEvent = player.getEvent( eventId );
|
||||||
if( pEvent )
|
if( pEvent )
|
||||||
{
|
{
|
||||||
pEvent->setPlayedScene( false );
|
pEvent->setPlayedScene( false );
|
||||||
|
@ -284,27 +284,27 @@ bool Core::Scripting::ScriptManager::onEventHandlerReturn( Core::Entity::PlayerP
|
||||||
// if there is one, proceed to call it
|
// if there is one, proceed to call it
|
||||||
if( eventCallback )
|
if( eventCallback )
|
||||||
{
|
{
|
||||||
eventCallback( *pPlayer, eventId, param1, param2, param3 );
|
eventCallback( player, eventId, param1, param2, param3 );
|
||||||
if( !pEvent->hasPlayedScene() )
|
if( !pEvent->hasPlayedScene() )
|
||||||
pPlayer->eventFinish( eventId, 1 );
|
player.eventFinish( eventId, 1 );
|
||||||
else
|
else
|
||||||
pEvent->setPlayedScene( false );
|
pEvent->setPlayedScene( false );
|
||||||
}
|
}
|
||||||
// else, finish the event.
|
// else, finish the event.
|
||||||
else
|
else
|
||||||
pPlayer->eventFinish( eventId, 1 );
|
player.eventFinish( eventId, 1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
pPlayer->sendNotice( e.what() );
|
player.sendNotice( e.what() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onEventHandlerTradeReturn( Core::Entity::PlayerPtr pPlayer, uint32_t eventId,
|
bool Core::Scripting::ScriptManager::onEventHandlerTradeReturn( Entity::Player& player, uint32_t eventId,
|
||||||
uint16_t subEvent, uint16_t param, uint32_t catalogId )
|
uint16_t subEvent, uint16_t param, uint32_t catalogId )
|
||||||
{
|
{
|
||||||
std::string eventName = Event::getEventName( eventId ) + "_TRADE";
|
std::string eventName = Event::getEventName( eventId ) + "_TRADE";
|
||||||
|
@ -313,7 +313,7 @@ bool Core::Scripting::ScriptManager::onEventHandlerTradeReturn( Core::Entity::Pl
|
||||||
{
|
{
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( Entity::Player&, uint32_t,
|
auto fn = m_pChaiHandler->eval< std::function< void( Entity::Player&, uint32_t,
|
||||||
uint16_t, uint16_t, uint32_t ) > >( eventName );
|
uint16_t, uint16_t, uint32_t ) > >( eventName );
|
||||||
fn( *pPlayer, eventId, subEvent, param, catalogId );
|
fn( player, eventId, subEvent, param, catalogId );
|
||||||
}
|
}
|
||||||
catch( ... )
|
catch( ... )
|
||||||
{
|
{
|
||||||
|
@ -323,7 +323,7 @@ bool Core::Scripting::ScriptManager::onEventHandlerTradeReturn( Core::Entity::Pl
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onEventItem( Entity::PlayerPtr pPlayer, uint32_t eventItemId,
|
bool Core::Scripting::ScriptManager::onEventItem( Entity::Player& player, uint32_t eventItemId,
|
||||||
uint32_t eventId, uint32_t castTime, uint64_t targetId )
|
uint32_t eventId, uint32_t castTime, uint64_t targetId )
|
||||||
{
|
{
|
||||||
std::string eventName = "onEventItem";
|
std::string eventName = "onEventItem";
|
||||||
|
@ -333,17 +333,17 @@ bool Core::Scripting::ScriptManager::onEventItem( Entity::PlayerPtr pPlayer, uin
|
||||||
{
|
{
|
||||||
auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) );
|
auto obj = m_pChaiHandler->eval( Event::getEventName( eventId ) );
|
||||||
|
|
||||||
pPlayer->sendDebug( "Calling: " + objName + "." + eventName );
|
player.sendDebug( "Calling: " + objName + "." + eventName );
|
||||||
|
|
||||||
pPlayer->eventStart( targetId, eventId, Event::Event::Item, 0, 0 );
|
player.eventStart( targetId, eventId, Event::Event::Item, 0, 0 );
|
||||||
|
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&,
|
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, uint32_t, Entity::Player&,
|
||||||
uint32_t, uint32_t, uint64_t ) > >( eventName );
|
uint32_t, uint32_t, uint64_t ) > >( eventName );
|
||||||
fn( obj, eventId, *pPlayer, eventItemId, castTime, targetId );
|
fn( obj, eventId, player, eventItemId, castTime, targetId );
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
pPlayer->sendNotice( e.what() );
|
player.sendNotice( e.what() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ bool Core::Scripting::ScriptManager::onEventItem( Entity::PlayerPtr pPlayer, uin
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onMobKill( Entity::PlayerPtr pPlayer, uint16_t nameId )
|
bool Core::Scripting::ScriptManager::onMobKill( Entity::Player& player, uint16_t nameId )
|
||||||
{
|
{
|
||||||
std::string eventName = "onBnpcKill_" + std::to_string( nameId );
|
std::string eventName = "onBnpcKill_" + std::to_string( nameId );
|
||||||
|
|
||||||
|
@ -359,7 +359,7 @@ bool Core::Scripting::ScriptManager::onMobKill( Entity::PlayerPtr pPlayer, uint1
|
||||||
// loop through all active quests and try to call available onMobKill callbacks
|
// loop through all active quests and try to call available onMobKill callbacks
|
||||||
for( size_t i = 0; i < 30; i++ )
|
for( size_t i = 0; i < 30; i++ )
|
||||||
{
|
{
|
||||||
auto activeQuests = pPlayer->getQuestActive( static_cast< uint16_t >( i ) );
|
auto activeQuests = player.getQuestActive( static_cast< uint16_t >( i ) );
|
||||||
if( !activeQuests )
|
if( !activeQuests )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -369,12 +369,12 @@ bool Core::Scripting::ScriptManager::onMobKill( Entity::PlayerPtr pPlayer, uint1
|
||||||
auto obj = m_pChaiHandler->eval( Event::getEventName( 0x00010000 | questId ) );
|
auto obj = m_pChaiHandler->eval( Event::getEventName( 0x00010000 | questId ) );
|
||||||
std::string objName = Event::getEventName( 0x00010000 | questId );
|
std::string objName = Event::getEventName( 0x00010000 | questId );
|
||||||
|
|
||||||
pPlayer->sendDebug("Calling: " + objName + "." + eventName);
|
player.sendDebug("Calling: " + objName + "." + eventName);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Player& ) > >(eventName);
|
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Player& ) > >(eventName);
|
||||||
fn( obj, *pPlayer );
|
fn( obj, player );
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
|
@ -387,7 +387,7 @@ bool Core::Scripting::ScriptManager::onMobKill( Entity::PlayerPtr pPlayer, uint1
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::Scripting::ScriptManager::onCastFinish( Entity::PlayerPtr pPlayer, Entity::ActorPtr pTarget, uint32_t actionId )
|
bool Core::Scripting::ScriptManager::onCastFinish( Entity::Player& player, Entity::ActorPtr pTarget, uint32_t actionId )
|
||||||
{
|
{
|
||||||
std::string eventName = "onFinish";
|
std::string eventName = "onFinish";
|
||||||
|
|
||||||
|
@ -396,14 +396,14 @@ bool Core::Scripting::ScriptManager::onCastFinish( Entity::PlayerPtr pPlayer, En
|
||||||
auto obj = m_pChaiHandler->eval( "skillDef_" + std::to_string( actionId ) );
|
auto obj = m_pChaiHandler->eval( "skillDef_" + std::to_string( actionId ) );
|
||||||
std::string objName = "skillDef_" + std::to_string( actionId );
|
std::string objName = "skillDef_" + std::to_string( actionId );
|
||||||
|
|
||||||
pPlayer->sendDebug( "Calling: " + objName + "." + eventName );
|
player.sendDebug( "Calling: " + objName + "." + eventName );
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Player&,
|
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Player&,
|
||||||
Entity::Actor& ) > >( eventName );
|
Entity::Actor& ) > >( eventName );
|
||||||
fn( obj, *pPlayer, *pTarget );
|
fn( obj, player, *pTarget );
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( e.what() );
|
player.sendUrgent( e.what() );
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -446,7 +446,7 @@ bool Core::Scripting::ScriptManager::onStatusTick( Entity::ActorPtr pActor, Core
|
||||||
pActor->getAsPlayer()->sendDebug( "Calling: " + objName + "." + eventName );
|
pActor->getAsPlayer()->sendDebug( "Calling: " + objName + "." + eventName );
|
||||||
|
|
||||||
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Actor&,
|
auto fn = m_pChaiHandler->eval< std::function< void( chaiscript::Boxed_Value &, Entity::Actor&,
|
||||||
Core::StatusEffect::StatusEffect& ) > >( eventName );
|
StatusEffect::StatusEffect& ) > >( eventName );
|
||||||
fn( obj, *pActor, effect );
|
fn( obj, *pActor, effect );
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
#include "../Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
|
|
||||||
namespace chaiscript
|
namespace chaiscript
|
||||||
|
@ -37,20 +37,20 @@ namespace Core
|
||||||
|
|
||||||
const boost::shared_ptr< chaiscript::ChaiScript >& getHandler() const;
|
const boost::shared_ptr< chaiscript::ChaiScript >& getHandler() const;
|
||||||
|
|
||||||
void onPlayerFirstEnterWorld( Entity::PlayerPtr pPlayer );
|
void onPlayerFirstEnterWorld( Entity::Player& player );
|
||||||
|
|
||||||
static bool registerBnpcTemplate( std::string templateName, uint32_t bnpcBaseId, uint32_t bnpcNameId, uint32_t modelId, std::string aiName );
|
static bool registerBnpcTemplate( std::string templateName, uint32_t bnpcBaseId, uint32_t bnpcNameId, uint32_t modelId, std::string aiName );
|
||||||
|
|
||||||
bool onTalk( Entity::PlayerPtr pPlayer, uint64_t actorId, uint32_t eventId );
|
bool onTalk( Entity::Player& player, uint64_t actorId, uint32_t eventId );
|
||||||
bool onEnterTerritory( Entity::PlayerPtr pPlayer, uint32_t eventId, uint16_t param1, uint16_t param2 );
|
bool onEnterTerritory( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 );
|
||||||
bool onWithinRange( Entity::PlayerPtr pPlayer, uint32_t eventId, uint32_t param1, float x, float y, float z );
|
bool onWithinRange( Entity::Player& player, uint32_t eventId, uint32_t param1, float x, float y, float z );
|
||||||
bool onOutsideRange( Entity::PlayerPtr pPlayer, uint32_t eventId, uint32_t param1, float x, float y, float z );
|
bool onOutsideRange( Entity::Player& player, uint32_t eventId, uint32_t param1, float x, float y, float z );
|
||||||
bool onEmote( Entity::PlayerPtr pPlayer, uint64_t actorId, uint32_t eventId, uint8_t emoteId );
|
bool onEmote( Entity::Player& player, uint64_t actorId, uint32_t eventId, uint8_t emoteId );
|
||||||
bool onEventItem( Entity::PlayerPtr pPlayer, uint32_t eventItemId, uint32_t eventId, uint32_t castTime, uint64_t targetId );
|
bool onEventItem( Entity::Player& player, uint32_t eventItemId, uint32_t eventId, uint32_t castTime, uint64_t targetId );
|
||||||
|
|
||||||
bool onMobKill( Entity::PlayerPtr pPlayer, uint16_t nameId );
|
bool onMobKill( Entity::Player& player, uint16_t nameId );
|
||||||
|
|
||||||
bool onCastFinish( Entity::PlayerPtr pPlayer, Entity::ActorPtr pTarget, uint32_t actionId );
|
bool onCastFinish( Entity::Player& pPlayer, Entity::ActorPtr pTarget, uint32_t actionId );
|
||||||
|
|
||||||
bool onStatusReceive( Entity::ActorPtr pActor, uint32_t effectId );
|
bool onStatusReceive( Entity::ActorPtr pActor, uint32_t effectId );
|
||||||
bool onStatusTick( Entity::ActorPtr pActor, Core::StatusEffect::StatusEffect& effect );
|
bool onStatusTick( Entity::ActorPtr pActor, Core::StatusEffect::StatusEffect& effect );
|
||||||
|
@ -58,8 +58,8 @@ namespace Core
|
||||||
|
|
||||||
bool onZoneInit( ZonePtr pZone );
|
bool onZoneInit( ZonePtr pZone );
|
||||||
|
|
||||||
bool onEventHandlerReturn( Entity::PlayerPtr pPlayer, 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::PlayerPtr pPlayer, 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 );
|
||||||
|
|
||||||
|
|
||||||
void loadDir( std::string dirname, std::set<std::string>& chaiFiles );
|
void loadDir( std::string dirname, std::set<std::string>& chaiFiles );
|
||||||
|
|
|
@ -4,18 +4,17 @@
|
||||||
#include <Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <Server_Common/Script/ChaiscriptStdLib.h>
|
#include <Server_Common/Script/ChaiscriptStdLib.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Script/ScriptManager.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Zone/Zone.h"
|
#include "Zone/Zone.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Actor/BattleNpc.h"
|
#include "Actor/BattleNpc.h"
|
||||||
#include "src/servers/Server_Zone/Event/Event.h"
|
#include "Event/Event.h"
|
||||||
#include "src/servers/Server_Zone/Event/EventHelper.h"
|
#include "Event/EventHelper.h"
|
||||||
|
#include "Network/PacketWrappers/ServerNoticePacket.h"
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ServerNoticePacket.h"
|
#include "StatusEffect/StatusEffect.h"
|
||||||
#include "src/servers/Server_Zone/StatusEffect/StatusEffect.h"
|
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#include "ServerZone.h"
|
#include "ServerZone.h"
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Version.h>
|
#include <Server_Common/Version.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Config/XMLConfig.h>
|
#include <Server_Common/Config/XMLConfig.h>
|
||||||
#include <src/servers/Server_Common/Version.h>
|
#include <Server_Common/Version.h>
|
||||||
|
|
||||||
#include <MySqlBase.h>
|
#include <MySqlBase.h>
|
||||||
#include <Connection.h>
|
#include <Connection.h>
|
||||||
|
@ -61,7 +61,7 @@ Core::XMLConfigPtr Core::ServerZone::getConfig() const
|
||||||
|
|
||||||
size_t Core::ServerZone::getSessionCount() const
|
size_t Core::ServerZone::getSessionCount() const
|
||||||
{
|
{
|
||||||
return m_sessionMap.size();
|
return m_sessionMapById.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::ServerZone::registerBnpcTemplate( std::string templateName, uint32_t bnpcBaseId,
|
bool Core::ServerZone::registerBnpcTemplate( std::string templateName, uint32_t bnpcBaseId,
|
||||||
|
@ -263,7 +263,7 @@ void Core::ServerZone::mainLoop()
|
||||||
auto currTime = static_cast< uint32_t >( time( nullptr ) );
|
auto currTime = static_cast< uint32_t >( time( nullptr ) );
|
||||||
|
|
||||||
lock_guard< std::mutex > lock( this->m_sessionMutex );
|
lock_guard< std::mutex > lock( this->m_sessionMutex );
|
||||||
for( auto sessionIt : this->m_sessionMap )
|
for( auto sessionIt : this->m_sessionMapById )
|
||||||
{
|
{
|
||||||
auto session = sessionIt.second;
|
auto session = sessionIt.second;
|
||||||
if( session && session->getPlayer() )
|
if( session && session->getPlayer() )
|
||||||
|
@ -284,8 +284,8 @@ void Core::ServerZone::mainLoop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
auto it = this->m_sessionMap.begin();
|
auto it = this->m_sessionMapById.begin();
|
||||||
for( ; it != this->m_sessionMap.end(); )
|
for( ; it != this->m_sessionMapById.end(); )
|
||||||
{
|
{
|
||||||
uint32_t diff = currTime - it->second->getLastDataTime();
|
uint32_t diff = currTime - it->second->getLastDataTime();
|
||||||
|
|
||||||
|
@ -298,7 +298,8 @@ void Core::ServerZone::mainLoop()
|
||||||
// if( it->second.unique() )
|
// if( it->second.unique() )
|
||||||
{
|
{
|
||||||
g_log.info("[" + std::to_string(it->second->getId() ) + "] Session removal" );
|
g_log.info("[" + std::to_string(it->second->getId() ) + "] Session removal" );
|
||||||
it = this->m_sessionMap.erase( it );
|
it = this->m_sessionMapById.erase( it );
|
||||||
|
removeSession( pPlayer->getName() );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -310,7 +311,8 @@ void Core::ServerZone::mainLoop()
|
||||||
it->second->close();
|
it->second->close();
|
||||||
// if( it->second.unique() )
|
// if( it->second.unique() )
|
||||||
{
|
{
|
||||||
it = this->m_sessionMap.erase(it );
|
it = this->m_sessionMapById.erase( it );
|
||||||
|
removeSession( pPlayer->getName() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -329,9 +331,9 @@ bool Core::ServerZone::createSession( uint32_t sessionId )
|
||||||
|
|
||||||
const std::string session_id_str = std::to_string( sessionId );
|
const std::string session_id_str = std::to_string( sessionId );
|
||||||
|
|
||||||
auto it = m_sessionMap.find( sessionId );
|
auto it = m_sessionMapById.find( sessionId );
|
||||||
|
|
||||||
if( it != m_sessionMap.end() )
|
if( it != m_sessionMapById.end() )
|
||||||
{
|
{
|
||||||
g_log.error( "[" + session_id_str + "] Error creating session" );
|
g_log.error( "[" + session_id_str + "] Error creating session" );
|
||||||
return false;
|
return false;
|
||||||
|
@ -340,7 +342,7 @@ bool Core::ServerZone::createSession( uint32_t sessionId )
|
||||||
g_log.info( "[" + session_id_str + "] Creating new session" );
|
g_log.info( "[" + session_id_str + "] Creating new session" );
|
||||||
|
|
||||||
boost::shared_ptr<Session> newSession( new Session( sessionId ) );
|
boost::shared_ptr<Session> newSession( new Session( sessionId ) );
|
||||||
m_sessionMap[sessionId] = newSession;
|
m_sessionMapById[sessionId] = newSession;
|
||||||
|
|
||||||
if( !newSession->loadPlayer() )
|
if( !newSession->loadPlayer() )
|
||||||
{
|
{
|
||||||
|
@ -348,7 +350,7 @@ bool Core::ServerZone::createSession( uint32_t sessionId )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_playerSessionMap[newSession->getPlayer()->getName()] = newSession;
|
m_sessionMapByName[newSession->getPlayer()->getName()] = newSession;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -356,15 +358,15 @@ bool Core::ServerZone::createSession( uint32_t sessionId )
|
||||||
|
|
||||||
void Core::ServerZone::removeSession( uint32_t sessionId )
|
void Core::ServerZone::removeSession( uint32_t sessionId )
|
||||||
{
|
{
|
||||||
m_sessionMap.erase( sessionId );
|
m_sessionMapById.erase( sessionId );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::ServerZone::updateSession( uint32_t id )
|
void Core::ServerZone::updateSession( uint32_t id )
|
||||||
{
|
{
|
||||||
std::lock_guard< std::mutex > lock( m_sessionMutex );
|
std::lock_guard< std::mutex > lock( m_sessionMutex );
|
||||||
auto it = m_sessionMap.find( id );
|
auto it = m_sessionMapById.find( id );
|
||||||
|
|
||||||
if( it != m_sessionMap.end() )
|
if( it != m_sessionMapById.end() )
|
||||||
it->second->loadPlayer();
|
it->second->loadPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -372,9 +374,9 @@ Core::SessionPtr Core::ServerZone::getSession( uint32_t id )
|
||||||
{
|
{
|
||||||
//std::lock_guard<std::mutex> lock( m_sessionMutex );
|
//std::lock_guard<std::mutex> lock( m_sessionMutex );
|
||||||
|
|
||||||
auto it = m_sessionMap.find( id );
|
auto it = m_sessionMapById.find( id );
|
||||||
|
|
||||||
if( it != m_sessionMap.end() )
|
if( it != m_sessionMapById.end() )
|
||||||
return ( it->second );
|
return ( it->second );
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -384,9 +386,9 @@ Core::SessionPtr Core::ServerZone::getSession( std::string playerName )
|
||||||
{
|
{
|
||||||
//std::lock_guard<std::mutex> lock( m_sessionMutex );
|
//std::lock_guard<std::mutex> lock( m_sessionMutex );
|
||||||
|
|
||||||
auto it = m_playerSessionMap.find( playerName );
|
auto it = m_sessionMapByName.find( playerName );
|
||||||
|
|
||||||
if (it != m_playerSessionMap.end())
|
if (it != m_sessionMapByName.end())
|
||||||
return (it->second);
|
return (it->second);
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -394,15 +396,15 @@ Core::SessionPtr Core::ServerZone::getSession( std::string playerName )
|
||||||
|
|
||||||
void Core::ServerZone::removeSession( std::string playerName )
|
void Core::ServerZone::removeSession( std::string playerName )
|
||||||
{
|
{
|
||||||
m_playerSessionMap.erase( playerName );
|
m_sessionMapByName.erase( playerName );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::ServerZone::updateSession( std::string playerName )
|
void Core::ServerZone::updateSession( std::string playerName )
|
||||||
{
|
{
|
||||||
std::lock_guard< std::mutex > lock( m_sessionMutex );
|
std::lock_guard< std::mutex > lock( m_sessionMutex );
|
||||||
auto it = m_playerSessionMap.find( playerName );
|
auto it = m_sessionMapByName.find( playerName );
|
||||||
|
|
||||||
if( it != m_playerSessionMap.end() )
|
if( it != m_sessionMapByName.end() )
|
||||||
it->second->loadPlayer();
|
it->second->loadPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
#ifndef __GAMESERVER_H
|
#ifndef __GAMESERVER_H
|
||||||
#define __GAMESERVER_H
|
#define __GAMESERVER_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "Forwards.h"
|
#include "Forwards.h"
|
||||||
#include "src/servers/Server_Zone/Actor/BattleNpcTemplate.h"
|
#include "Actor/BattleNpcTemplate.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
|
@ -61,8 +61,8 @@ namespace Core {
|
||||||
|
|
||||||
std::mutex m_sessionMutex;
|
std::mutex m_sessionMutex;
|
||||||
|
|
||||||
std::map< uint32_t, SessionPtr > m_sessionMap;
|
std::map< uint32_t, SessionPtr > m_sessionMapById;
|
||||||
std::map< std::string, SessionPtr > m_playerSessionMap;
|
std::map< std::string, SessionPtr > m_sessionMapByName;
|
||||||
|
|
||||||
std::map< uint32_t, uint32_t > m_zones;
|
std::map< uint32_t, uint32_t > m_zones;
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
#include "Session.h"
|
#include "Session.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
|
|
||||||
Core::Session::Session( uint32_t sessionId )
|
Core::Session::Session( uint32_t sessionId )
|
||||||
: m_sessionId( sessionId )
|
: m_sessionId( sessionId )
|
||||||
|
@ -23,13 +23,13 @@ Core::Session::~Session()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Session::setZoneConnection( Core::Network::GameConnectionPtr pZoneCon )
|
void Core::Session::setZoneConnection( Network::GameConnectionPtr pZoneCon )
|
||||||
{
|
{
|
||||||
pZoneCon->m_conType = Network::ConnectionType::Zone;
|
pZoneCon->m_conType = Network::ConnectionType::Zone;
|
||||||
m_pZoneConnection = pZoneCon;
|
m_pZoneConnection = pZoneCon;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Session::setChatConnection( Core::Network::GameConnectionPtr pChatCon )
|
void Core::Session::setChatConnection( Network::GameConnectionPtr pChatCon )
|
||||||
{
|
{
|
||||||
pChatCon->m_conType = Network::ConnectionType::Chat;
|
pChatCon->m_conType = Network::ConnectionType::Chat;
|
||||||
m_pChatConnection = pChatCon;
|
m_pChatConnection = pChatCon;
|
||||||
|
|
|
@ -5,11 +5,8 @@
|
||||||
|
|
||||||
#include "Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
|
|
||||||
class Session : public boost::enable_shared_from_this< Session >
|
class Session : public boost::enable_shared_from_this< Session >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
|
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Actor.h"
|
#include "Actor/Actor.h"
|
||||||
|
|
||||||
#include "StatusEffect.h"
|
#include "StatusEffect.h"
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Script/ScriptManager.h"
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
extern Core::Data::ExdData g_exdData;
|
extern Core::Data::ExdData g_exdData;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core
|
namespace Core
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,218 +0,0 @@
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Actor.h"
|
|
||||||
#include "StatusEffect.h"
|
|
||||||
#include "StatusEffectContainer.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h"
|
|
||||||
#include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h"
|
|
||||||
|
|
||||||
|
|
||||||
using namespace Core::Common;
|
|
||||||
using namespace Core::Network::Packets;
|
|
||||||
using namespace Core::Network::Packets::Server;
|
|
||||||
|
|
||||||
Core::StatusEffect::StatusEffectContainer::StatusEffectContainer( Entity::ActorPtr pOwner )
|
|
||||||
: m_pOwner( pOwner )
|
|
||||||
{
|
|
||||||
// initialize the free slot queue
|
|
||||||
for( uint8_t i = 0; i < MAX_EFFECTS; i++ )
|
|
||||||
{
|
|
||||||
m_freeEffectSlotQueue.push( i );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t Core::StatusEffect::StatusEffectContainer::getFreeSlot()
|
|
||||||
{
|
|
||||||
int8_t freeEffectSlot = -1;
|
|
||||||
|
|
||||||
if( m_freeEffectSlotQueue.empty() )
|
|
||||||
return freeEffectSlot;
|
|
||||||
|
|
||||||
freeEffectSlot = m_freeEffectSlotQueue.front();
|
|
||||||
m_freeEffectSlotQueue.pop();
|
|
||||||
|
|
||||||
return freeEffectSlot;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Core::StatusEffect::StatusEffectContainer::freeSlot( uint8_t slotId )
|
|
||||||
{
|
|
||||||
m_freeEffectSlotQueue.push( slotId );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Core::StatusEffect::StatusEffectContainer::~StatusEffectContainer()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Core::StatusEffect::StatusEffectContainer::addStatusEffect( StatusEffectPtr pEffect )
|
|
||||||
{
|
|
||||||
int8_t nextSlot = getFreeSlot();
|
|
||||||
// if there is no slot left, do not add the effect
|
|
||||||
if( nextSlot == -1 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
pEffect->applyStatus();
|
|
||||||
m_effectMap[nextSlot] = pEffect;
|
|
||||||
|
|
||||||
ZoneChannelPacket< Server::FFXIVIpcAddStatusEffect > statusEffectAdd( m_pOwner->getId() );
|
|
||||||
statusEffectAdd.data().actor_id = pEffect->getTargetActorId();
|
|
||||||
statusEffectAdd.data().actor_id1 = pEffect->getSrcActorId();
|
|
||||||
statusEffectAdd.data().current_hp = m_pOwner->getHp();
|
|
||||||
statusEffectAdd.data().current_mp = m_pOwner->getMp();
|
|
||||||
statusEffectAdd.data().current_tp = m_pOwner->getTp();
|
|
||||||
statusEffectAdd.data().duration = static_cast< float >( pEffect->getDuration() ) / 1000;
|
|
||||||
statusEffectAdd.data().effect_id = pEffect->getId();
|
|
||||||
statusEffectAdd.data().effect_index = nextSlot;
|
|
||||||
statusEffectAdd.data().max_hp = m_pOwner->getMaxHp();
|
|
||||||
statusEffectAdd.data().max_mp = m_pOwner->getMaxMp();
|
|
||||||
statusEffectAdd.data().max_something = 1;
|
|
||||||
//statusEffectAdd.data().unknown2 = 28;
|
|
||||||
statusEffectAdd.data().param = pEffect->getParam();
|
|
||||||
|
|
||||||
|
|
||||||
bool sendToSelf = m_pOwner->isPlayer() ? true : false;
|
|
||||||
m_pOwner->sendToInRangeSet( statusEffectAdd, sendToSelf );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Core::StatusEffect::StatusEffectContainer::removeSingleStatusEffectFromId( uint32_t id )
|
|
||||||
{
|
|
||||||
for (auto effectIt : m_effectMap)
|
|
||||||
{
|
|
||||||
if (effectIt.second->getId() == id)
|
|
||||||
{
|
|
||||||
removeStatusEffect( effectIt.first );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Core::StatusEffect::StatusEffectContainer::removeStatusEffect( uint8_t effectSlotId )
|
|
||||||
{
|
|
||||||
auto pEffectIt = m_effectMap.find( effectSlotId );
|
|
||||||
if( pEffectIt == m_effectMap.end() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
freeSlot( effectSlotId );
|
|
||||||
|
|
||||||
auto pEffect = pEffectIt->second;
|
|
||||||
pEffect->removeStatus();
|
|
||||||
|
|
||||||
bool sendToSelf = m_pOwner->isPlayer() ? true : false;
|
|
||||||
m_pOwner->sendToInRangeSet( ActorControlPacket142( m_pOwner->getId(), StatusEffectLose, pEffect->getId() ), sendToSelf );
|
|
||||||
|
|
||||||
m_effectMap.erase( effectSlotId );
|
|
||||||
|
|
||||||
sendUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::map< uint8_t, Core::StatusEffect::StatusEffectPtr > Core::StatusEffect::StatusEffectContainer::getEffectMap() const
|
|
||||||
{
|
|
||||||
return m_effectMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Core::StatusEffect::StatusEffectContainer::sendUpdate()
|
|
||||||
{
|
|
||||||
uint64_t currentTimeMs = Util::getTimeMs();
|
|
||||||
|
|
||||||
ZoneChannelPacket< Server::FFXIVIpcStatusEffectList > statusEffectList( m_pOwner->getId() );
|
|
||||||
|
|
||||||
statusEffectList.data().current_hp = m_pOwner->getHp();
|
|
||||||
statusEffectList.data().current_mp = m_pOwner->getMp();
|
|
||||||
statusEffectList.data().currentTp = m_pOwner->getTp();
|
|
||||||
statusEffectList.data().max_hp = m_pOwner->getMaxHp();
|
|
||||||
statusEffectList.data().max_mp = m_pOwner->getMaxMp();
|
|
||||||
uint8_t slot = 0;
|
|
||||||
for( auto effectIt : m_effectMap )
|
|
||||||
{
|
|
||||||
float timeLeft = static_cast< float >( effectIt.second->getDuration() - ( currentTimeMs - effectIt.second->getStartTimeMs() ) ) / 1000;
|
|
||||||
statusEffectList.data().effect[slot].duration = timeLeft;
|
|
||||||
statusEffectList.data().effect[slot].effect_id = effectIt.second->getId();
|
|
||||||
statusEffectList.data().effect[slot].sourceActorId = effectIt.second->getSrcActorId();
|
|
||||||
slot++;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool sendToSelf = m_pOwner->isPlayer();
|
|
||||||
m_pOwner->sendToInRangeSet( statusEffectList, sendToSelf );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Core::StatusEffect::StatusEffectContainer::update()
|
|
||||||
{
|
|
||||||
uint64_t currentTimeMs = Util::getTimeMs();
|
|
||||||
|
|
||||||
uint32_t thisTickDmg = 0;
|
|
||||||
uint32_t thisTickHeal = 0;
|
|
||||||
|
|
||||||
for( auto effectIt : m_effectMap )
|
|
||||||
{
|
|
||||||
uint8_t effectIndex = effectIt.first;
|
|
||||||
auto effect = effectIt.second;
|
|
||||||
|
|
||||||
uint64_t lastTick = effect->getLastTickMs();
|
|
||||||
uint64_t startTime = effect->getStartTimeMs();
|
|
||||||
uint32_t duration = effect->getDuration();
|
|
||||||
uint32_t tickRate = effect->getTickRate();
|
|
||||||
|
|
||||||
if( ( currentTimeMs - startTime ) > duration )
|
|
||||||
{
|
|
||||||
// remove status effect
|
|
||||||
removeStatusEffect( effectIndex );
|
|
||||||
// break because removing invalidates iterators
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ( currentTimeMs - lastTick ) > tickRate )
|
|
||||||
{
|
|
||||||
effect->setLastTick( currentTimeMs );
|
|
||||||
effect->onTick();
|
|
||||||
|
|
||||||
auto thisEffect = effect->getTickEffect();
|
|
||||||
|
|
||||||
switch( thisEffect.first )
|
|
||||||
{
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
thisTickDmg += thisEffect.second;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
thisTickHeal += thisEffect.second;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if( thisTickDmg != 0 )
|
|
||||||
{
|
|
||||||
m_pOwner->takeDamage( thisTickDmg );
|
|
||||||
m_pOwner->sendToInRangeSet( ActorControlPacket142( m_pOwner->getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::Damage ), thisTickDmg ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( thisTickHeal != 0 )
|
|
||||||
{
|
|
||||||
m_pOwner->heal( thisTickDmg );
|
|
||||||
m_pOwner->sendToInRangeSet( ActorControlPacket142( m_pOwner->getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::Heal ), thisTickHeal ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Core::StatusEffect::StatusEffectContainer::hasStatusEffect( uint32_t id )
|
|
||||||
{
|
|
||||||
for( auto effectIt : m_effectMap )
|
|
||||||
{
|
|
||||||
if( effectIt.second->getId() == id )
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
|
@ -1,49 +0,0 @@
|
||||||
#ifndef _STATUSEFFECTCONTAINER_H_
|
|
||||||
#define _STATUSEFFECTCONTAINER_H_
|
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
|
||||||
|
|
||||||
#include <queue>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
|
||||||
|
|
||||||
namespace Core
|
|
||||||
{
|
|
||||||
namespace StatusEffect
|
|
||||||
{
|
|
||||||
|
|
||||||
class StatusEffectContainer
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
StatusEffectContainer( Entity::ActorPtr pOwner );
|
|
||||||
~StatusEffectContainer();
|
|
||||||
|
|
||||||
void addStatusEffect( StatusEffectPtr pEffect );
|
|
||||||
void removeStatusEffect( uint8_t effectSlotId );
|
|
||||||
void removeSingleStatusEffectFromId( uint32_t id );
|
|
||||||
void update();
|
|
||||||
|
|
||||||
bool hasStatusEffect( uint32_t id );
|
|
||||||
|
|
||||||
int8_t getFreeSlot();
|
|
||||||
void freeSlot( uint8_t slotId );
|
|
||||||
|
|
||||||
std::map< uint8_t, Core::StatusEffect::StatusEffectPtr > getEffectMap() const;
|
|
||||||
|
|
||||||
void sendUpdate();
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
const uint8_t MAX_EFFECTS = 30;
|
|
||||||
|
|
||||||
Entity::ActorPtr m_pOwner;
|
|
||||||
std::queue< uint8_t > m_freeEffectSlotQueue;
|
|
||||||
|
|
||||||
std::vector< std::pair< uint8_t, uint32_t> > m_tickEffectList;
|
|
||||||
std::map< uint8_t, StatusEffectPtr > m_effectMap;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,9 +1,8 @@
|
||||||
|
|
||||||
#include "Cell.h"
|
#include "Cell.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Actor/Actor.h"
|
#include "Actor/Actor.h"
|
||||||
#include "src/servers/Server_Zone/Actor/BattleNpc.h"
|
#include "Actor/BattleNpc.h"
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
#include "Zone.h"
|
#include "Zone.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,7 +46,6 @@ namespace Core
|
||||||
{
|
{
|
||||||
|
|
||||||
entry->setCurrentZone( m_pZone );
|
entry->setCurrentZone( m_pZone );
|
||||||
entry->getAsBattleNpc()->initStatusEffectContainer();
|
|
||||||
m_pZone->pushActor( entry );
|
m_pZone->pushActor( entry );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -170,4 +168,4 @@ namespace Core
|
||||||
m_bUnloadPending = false;
|
m_bUnloadPending = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
|
@ -1,36 +1,35 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Logging/Logger.h>
|
#include <Server_Common/Logging/Logger.h>
|
||||||
#include <src/servers/Server_Common/Util/Util.h>
|
#include <Server_Common/Util/Util.h>
|
||||||
#include <src/servers/Server_Common/Util/UtilMath.h>
|
#include <Server_Common/Util/UtilMath.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacket.h>
|
#include <Server_Common/Network/GamePacket.h>
|
||||||
#include <src/servers/Server_Common/Network/GamePacketNew.h>
|
#include <Server_Common/Network/GamePacketNew.h>
|
||||||
#include <src/servers/Server_Common/Exd/ExdData.h>
|
#include <Server_Common/Exd/ExdData.h>
|
||||||
#include <src/servers/Server_Common/Network/CommonNetwork.h>
|
#include <Server_Common/Network/CommonNetwork.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
#include <Server_Common/Network/PacketDef/Zone/ServerZoneDef.h>
|
||||||
#include <src/servers/Server_Common/Network/PacketContainer.h>
|
#include <Server_Common/Network/PacketContainer.h>
|
||||||
|
#include <Server_Common/Database/DatabaseDef.h>
|
||||||
|
|
||||||
#include "Zone.h"
|
#include "Zone.h"
|
||||||
#include "ZoneMgr.h"
|
#include "ZoneMgr.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Session.h"
|
#include "Session.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Actor.h"
|
#include "Actor/Actor.h"
|
||||||
#include "src/servers/Server_Zone/Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
#include "src/servers/Server_Zone/Actor/BattleNpc.h"
|
#include "Actor/BattleNpc.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Network/GameConnection.h"
|
#include "Network/GameConnection.h"
|
||||||
#include "src/servers/Server_Zone/ServerZone.h"
|
#include "ServerZone.h"
|
||||||
#include "src/servers/Server_Zone/Script/ScriptManager.h"
|
#include "Script/ScriptManager.h"
|
||||||
|
|
||||||
#include "CellHandler.h"
|
#include "CellHandler.h"
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include <Server_Common/Database/DatabaseDef.h>
|
|
||||||
|
|
||||||
extern Core::Logger g_log;
|
extern Core::Logger g_log;
|
||||||
extern Core::ServerZone g_serverZone;
|
extern Core::ServerZone g_serverZone;
|
||||||
extern Core::Data::ExdData g_exdData;
|
extern Core::Data::ExdData g_exdData;
|
||||||
|
@ -180,16 +179,10 @@ void Zone::loadCellCache()
|
||||||
pos.x = posX;
|
pos.x = posX;
|
||||||
pos.y = posY;
|
pos.y = posY;
|
||||||
pos.z = posZ;
|
pos.z = posZ;
|
||||||
Entity::BattleNpcPtr pBNpc( new Entity::BattleNpc( modelId, nameId,
|
Entity::BattleNpcPtr pBNpc( new Entity::BattleNpc( modelId, nameId, pos,
|
||||||
pos,
|
|
||||||
sizeId, type, level, behaviour, mobType ) );
|
sizeId, type, level, behaviour, mobType ) );
|
||||||
pBNpc->setRotation( static_cast< float >( rotation ) );
|
pBNpc->setRotation( static_cast< float >( rotation ) );
|
||||||
cache.push_back( pBNpc );
|
cache.push_back( pBNpc );
|
||||||
|
|
||||||
//pushActor( pBNpc );
|
|
||||||
|
|
||||||
//m_zonePositionMap[id] = ZonePositionPtr( new ZonePosition( id, targetZoneId, Position( posX, posY, posZ, posO ), radius ) );
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -290,9 +283,6 @@ void Zone::pushActor( Entity::ActorPtr pActor )
|
||||||
g_log.debug( "[Zone:" + m_zoneCode + "] Adding player [" + std::to_string( pActor->getId() ) + "]" );
|
g_log.debug( "[Zone:" + m_zoneCode + "] Adding player [" + std::to_string( pActor->getId() ) + "]" );
|
||||||
auto pPlayer = pActor->getAsPlayer();
|
auto pPlayer = pActor->getAsPlayer();
|
||||||
|
|
||||||
// fire the onEnter Lua event
|
|
||||||
//LuaManager->onRegionEnter(this, pPlayer);
|
|
||||||
|
|
||||||
auto pSession = g_serverZone.getSession( pPlayer->getId() );
|
auto pSession = g_serverZone.getSession( pPlayer->getId() );
|
||||||
if( pSession )
|
if( pSession )
|
||||||
m_sessionSet.insert( pSession );
|
m_sessionSet.insert( pSession );
|
||||||
|
@ -343,7 +333,7 @@ void Zone::removeActor( Entity::ActorPtr pActor )
|
||||||
{
|
{
|
||||||
Entity::ActorPtr pCurAct;
|
Entity::ActorPtr pCurAct;
|
||||||
|
|
||||||
for( auto iter = pActor->m_inRangeActors.begin(); iter != pActor->m_inRangeActors.end();)
|
for( auto iter = pActor->m_inRangeActors.begin(); iter != pActor->m_inRangeActors.end(); )
|
||||||
{
|
{
|
||||||
pCurAct = *iter;
|
pCurAct = *iter;
|
||||||
auto iter2 = iter++;
|
auto iter2 = iter++;
|
||||||
|
@ -354,21 +344,21 @@ void Zone::removeActor( Entity::ActorPtr pActor )
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Zone::queueOutPacketForRange( Entity::PlayerPtr pSourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry )
|
void Zone::queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry )
|
||||||
{
|
{
|
||||||
for( auto it = m_playerMap.begin(); it != m_playerMap.end(); ++it )
|
for( auto it = m_playerMap.begin(); it != m_playerMap.end(); ++it )
|
||||||
{
|
{
|
||||||
float distance = Math::Util::distance( pSourcePlayer->getPos().x,
|
float distance = Math::Util::distance( sourcePlayer.getPos().x,
|
||||||
pSourcePlayer->getPos().y,
|
sourcePlayer.getPos().y,
|
||||||
pSourcePlayer->getPos().z,
|
sourcePlayer.getPos().z,
|
||||||
( *it ).second->getPos().x,
|
( *it ).second->getPos().x,
|
||||||
( *it ).second->getPos().y,
|
( *it ).second->getPos().y,
|
||||||
( *it ).second->getPos().z );
|
( *it ).second->getPos().z );
|
||||||
|
|
||||||
if( ( distance < range ) && pSourcePlayer->getId() != ( *it ).second->getId() )
|
if( ( distance < range ) && sourcePlayer.getId() != ( *it ).second->getId() )
|
||||||
{
|
{
|
||||||
auto pSession = g_serverZone.getSession( ( *it ).second->getId() );
|
auto pSession = g_serverZone.getSession( ( *it ).second->getId() );
|
||||||
pPacketEntry->setValAt<uint32_t>( 0x08, ( *it ).second->getId() );
|
pPacketEntry->setValAt< uint32_t >( 0x08, ( *it ).second->getId() );
|
||||||
if( pSession )
|
if( pSession )
|
||||||
pSession->getZoneConnection()->queueOutPacket( pPacketEntry );
|
pSession->getZoneConnection()->queueOutPacket( pPacketEntry );
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
#define _ZONE_H
|
#define _ZONE_H
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
|
||||||
#include "Cell.h"
|
#include "Cell.h"
|
||||||
#include "CellHandler.h"
|
#include "CellHandler.h"
|
||||||
|
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <boost/enable_shared_from_this.hpp>
|
#include <boost/enable_shared_from_this.hpp>
|
||||||
|
@ -15,11 +15,10 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
namespace Entity
|
namespace Entity
|
||||||
{
|
{
|
||||||
class Actor;
|
class Actor;
|
||||||
class Player;
|
class Player;
|
||||||
}
|
}
|
||||||
|
|
||||||
class Session;
|
class Session;
|
||||||
|
@ -39,8 +38,8 @@ protected:
|
||||||
|
|
||||||
bool m_bPrivate;
|
bool m_bPrivate;
|
||||||
|
|
||||||
std::unordered_map<int32_t, Entity::PlayerPtr > m_playerMap;
|
std::unordered_map< int32_t, Entity::PlayerPtr > m_playerMap;
|
||||||
std::unordered_map<int32_t, Entity::BattleNpcPtr > m_BattleNpcMap;
|
std::unordered_map< int32_t, Entity::BattleNpcPtr > m_BattleNpcMap;
|
||||||
|
|
||||||
std::set< Entity::BattleNpcPtr > m_BattleNpcDeadMap;
|
std::set< Entity::BattleNpcPtr > m_BattleNpcDeadMap;
|
||||||
|
|
||||||
|
@ -90,7 +89,7 @@ public:
|
||||||
|
|
||||||
void updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell );
|
void updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell );
|
||||||
|
|
||||||
void queueOutPacketForRange( Entity::PlayerPtr pSourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry );
|
void queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry );
|
||||||
|
|
||||||
virtual uint32_t getId();
|
virtual uint32_t getId();
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
#include "ZoneMgr.h"
|
#include "ZoneMgr.h"
|
||||||
#include "Zone.h"
|
#include "Zone.h"
|
||||||
|
|
||||||
#include "ZonePosition.h"
|
#include "ZonePosition.h"
|
||||||
|
|
||||||
#include <Server_Common/Database/DatabaseDef.h>
|
#include <Server_Common/Database/DatabaseDef.h>
|
||||||
|
@ -65,51 +64,6 @@ namespace Core {
|
||||||
m_zoneMap[info.id] = pZone;
|
m_zoneMap[info.id] = pZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
//do
|
|
||||||
//{
|
|
||||||
// Db::Field *field = pQR->fetch();
|
|
||||||
// uint16_t id = field[0].getUInt16();
|
|
||||||
// std::string inName = field[1].getString();
|
|
||||||
// std::string name = field[2].getString();
|
|
||||||
// uint32_t layoutId = field[3].getUInt32();
|
|
||||||
// bool isPrivate = field[4].getBool();
|
|
||||||
|
|
||||||
// if(!isPrivate)
|
|
||||||
// {
|
|
||||||
// g_log.Log(LoggingSeverity::info, std::to_string(id) + "\t" + inName + " - " + name);
|
|
||||||
|
|
||||||
// ZonePtr pZone( new Zone( id, layoutId, name, inName, isPrivate ) );
|
|
||||||
|
|
||||||
// m_zoneMap[id] = pZone;
|
|
||||||
|
|
||||||
// // start the region worker
|
|
||||||
// // ThreadPool->executeTask(pRegion);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// //Console->outTime(" --> %s", inName.c_str());
|
|
||||||
// //Console->outTime("\tCached private instance...", name.c_str());
|
|
||||||
|
|
||||||
// //// write the instance data into the instance cache for later use
|
|
||||||
// //InstanceCacheEntry * pICE = new InstanceCacheEntry();
|
|
||||||
// //pICE->id = id;
|
|
||||||
// //pICE->inName = inName;
|
|
||||||
// //pICE->minX = minX;
|
|
||||||
// //pICE->maxX = maxX;
|
|
||||||
// //pICE->minY = minY;
|
|
||||||
// //pICE->maxY = maxY;
|
|
||||||
// //pICE->name = name;
|
|
||||||
// //pICE->layoutId = layoutId;
|
|
||||||
// //pICE->isPrivate = isPrivate;
|
|
||||||
|
|
||||||
// //m_instanceCache[pICE->id] = pICE;
|
|
||||||
// //m_instanceCacheName[inName] = pICE;
|
|
||||||
|
|
||||||
// //createInstance(pICE);
|
|
||||||
// }
|
|
||||||
|
|
||||||
//} while(pQR->nextRow());
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include "src/servers/Server_Zone/Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ Core::ZonePosition::ZonePosition()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::ZonePosition::ZonePosition( uint32_t id, uint32_t targetZoneId, const Core::Common::FFXIVARR_POSITION3& targetPosition, uint32_t radius, float rotation )
|
Core::ZonePosition::ZonePosition( uint32_t id, uint32_t targetZoneId, const Common::FFXIVARR_POSITION3& targetPosition, uint32_t radius, float rotation )
|
||||||
{
|
{
|
||||||
m_id = id;
|
m_id = id;
|
||||||
m_targetZoneId = targetZoneId;
|
m_targetZoneId = targetZoneId;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef _ZONELINE_H
|
#ifndef _ZONELINE_H
|
||||||
#define _ZONELINE_H
|
#define _ZONELINE_H
|
||||||
|
|
||||||
#include <src/servers/Server_Common/Common.h>
|
#include <Server_Common/Common.h>
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,12 @@ compile with STANDALONE defined to compile without boost and sapphire dependenci
|
||||||
usage:
|
usage:
|
||||||
- regular
|
- regular
|
||||||
- compile with root sapphire dir cmakelists
|
- compile with root sapphire dir cmakelists
|
||||||
- sapphire/src/tools/bin/pcb_reader2 "<path/to/game/sqpack/ffxiv>" <territory>
|
- sapphire/src/tools/bin/pcb_reader2 <territory> "<path/to/game/sqpack/ffxiv>"
|
||||||
- standalone
|
- standalone
|
||||||
- compile main.cpp with STANDALONE defined in build arg
|
- compile main.cpp with STANDALONE defined in build arg
|
||||||
- download ffxivexplorer <http://ffxivexplorer.fragmenterworks.com/>
|
- download ffxivexplorer <http://ffxivexplorer.fragmenterworks.com/>
|
||||||
|
- ffxivexplorer > path/to/ffxiv's/game/sqpack/ffxiv/0a0000.dat
|
||||||
|
- exd/territorytype.exh > `File > Export` and copy `territorytype.exh.csv` from exproted directory to `pcb_reader.exe` directory
|
||||||
- ffxivexplorer > path/to/ffxiv's/game/sqpack/ffxiv/020000.dat
|
- ffxivexplorer > path/to/ffxiv's/game/sqpack/ffxiv/020000.dat
|
||||||
- ctrl click the following:
|
- ctrl click the following:
|
||||||
- `bg/ffxiv/[REGION]/common/collision`
|
- `bg/ffxiv/[REGION]/common/collision`
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
#include "pcb.h"
|
#include "pcb.h"
|
||||||
#include "lgb.h"
|
#include "lgb.h"
|
||||||
|
@ -84,39 +85,38 @@ int parseBlockEntry( char* data, std::vector<PCB_BLOCK_ENTRY>& entries, int gOff
|
||||||
|
|
||||||
std::string zoneNameToPath( const std::string& name )
|
std::string zoneNameToPath( const std::string& name )
|
||||||
{
|
{
|
||||||
char teri = name[0];
|
std::string path;
|
||||||
char region = name[1];
|
auto inFile = std::ifstream( "territorytype.exh.csv" );
|
||||||
char type = name[2];
|
if( inFile.good() )
|
||||||
char zone = name[3];
|
|
||||||
static std::map< char, std::string > teriMap
|
|
||||||
{
|
{
|
||||||
{ 'r', "roc" },
|
std::string line;
|
||||||
{ 'w', "wil" },
|
std::regex re("(\\d+),\"(.*)\",\"(.*)\",.*");
|
||||||
{ 'l', "lak" },
|
while( std::getline( inFile, line ) )
|
||||||
{ 'o', "ocn" },
|
{
|
||||||
{ 'f', "fst" },
|
std::smatch match;
|
||||||
{ 'a', "air" },
|
if( std::regex_match( line, match, re ) )
|
||||||
{ 's', "sea" },
|
{
|
||||||
{ 'z', "zon" }
|
if( name == match[2].str() )
|
||||||
};
|
{
|
||||||
|
path = match[3].str();
|
||||||
static std::map< char, std::string > typeMap
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( !path.empty() )
|
||||||
{
|
{
|
||||||
{ 'f', "fld" },
|
//path = path.substr( path.find_first_of( "/" ) + 1, path.size() - path.find_first_of( "/" ));
|
||||||
{ 't', "twn" },
|
//path = std::string( "ffxiv/" ) + path;
|
||||||
{ 'd', "dun" },
|
path = std::string( "bg" ) + path.substr( 0, path.find( "/level/" ) );
|
||||||
{ 'b', "bah" },
|
std::cout << "[Info] " << "Found path for " << name << ": " << path << std::endl;
|
||||||
{ 'i', "ind" },
|
}
|
||||||
{ 'e', "evt" },
|
else
|
||||||
};
|
{
|
||||||
std::string ret;
|
throw std::runtime_error( "Unable to find path for " + name +
|
||||||
const auto& teriRet = teriMap[teri];
|
".\n\tPlease open 0a0000.win32.index with FFXIV Explorer and extract territorytype.exh as CSV\n\tand copy territorytype.exh.csv into pcb_reader.exe directory" );
|
||||||
const auto& typeRet = typeMap[type];
|
}
|
||||||
ret += teriRet + "_";
|
return path;
|
||||||
ret += teri;
|
|
||||||
ret += region;
|
|
||||||
ret += "/" + typeRet + "/" + name;
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void readFileToBuffer( const std::string& path, std::vector< char >& buf )
|
void readFileToBuffer( const std::string& path, std::vector< char >& buf )
|
||||||
|
@ -141,24 +141,25 @@ int main( int argc, char* argv[] )
|
||||||
{
|
{
|
||||||
auto startTime = std::chrono::system_clock::now();
|
auto startTime = std::chrono::system_clock::now();
|
||||||
|
|
||||||
std::string gamePath = "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv";
|
// todo: support expansions
|
||||||
|
std::string gamePath = "C:\\Program Files (x86)\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv";
|
||||||
std::string zoneName = "r1f1";
|
std::string zoneName = "r1f1";
|
||||||
|
|
||||||
if( argc > 1 )
|
if( argc > 1 )
|
||||||
{
|
{
|
||||||
gamePath = argv[1];
|
zoneName = argv[1];
|
||||||
if( argc > 2 )
|
if( argc > 2 )
|
||||||
{
|
{
|
||||||
zoneName = argv[2];
|
gamePath = argv[2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const auto& zonePath = zoneNameToPath( zoneName );
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::string listPcbPath( "bg/ffxiv/" + zonePath + "/collision/list.pcb" );
|
const auto& zonePath = zoneNameToPath( zoneName );
|
||||||
std::string bgLgbPath( "bg/ffxiv/" + zonePath + "/level/bg.lgb" );
|
std::string listPcbPath( zonePath + "/collision/list.pcb" );
|
||||||
std::string collisionFilePath( "bg/ffxiv/" + zonePath + "/collision/" );
|
std::string bgLgbPath( zonePath + "/level/bg.lgb" );
|
||||||
|
std::string collisionFilePath( zonePath + "/collision/" );
|
||||||
std::vector< char > section;
|
std::vector< char > section;
|
||||||
std::vector< char > section1;
|
std::vector< char > section1;
|
||||||
|
|
||||||
|
@ -274,7 +275,7 @@ int main( int argc, char* argv[] )
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
std::cout << "Unable to load collision mesh " << fileName << "\n\tError:\n\t" << e.what() << "\n";
|
std::cout << "[Error] " << "Unable to load collision mesh " << fileName << "\n\tError:\n\t" << e.what() << "\n";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -301,7 +302,7 @@ int main( int argc, char* argv[] )
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
std::cout << "Unable to load SGB " << fileName << "\n\tError:\n\t" << e.what() << "\n";
|
std::cout << "[Error] " << "Unable to load SGB " << fileName << "\n\tError:\n\t" << e.what() << "\n";
|
||||||
sgbFiles.insert( std::make_pair( fileName, sgbFile ) );
|
sgbFiles.insert( std::make_pair( fileName, sgbFile ) );
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -394,8 +395,8 @@ int main( int argc, char* argv[] )
|
||||||
loadPcbFile( fileName );
|
loadPcbFile( fileName );
|
||||||
pushVerts( pcbFiles[fileName], fileName );
|
pushVerts( pcbFiles[fileName], fileName );
|
||||||
}
|
}
|
||||||
std::cout << "Writing obj file " << "\n";
|
std::cout << "[Info] " << "Writing obj file " << "\n";
|
||||||
std::cout << bgLgb.groups.size() << " groups " << "\n";
|
std::cout << "[Info] " << bgLgb.groups.size() << " groups " << "\n";
|
||||||
uint32_t totalGroups = 0;
|
uint32_t totalGroups = 0;
|
||||||
uint32_t totalGroupEntries = 0;
|
uint32_t totalGroupEntries = 0;
|
||||||
for( const auto& group : bgLgb.groups )
|
for( const auto& group : bgLgb.groups )
|
||||||
|
@ -467,15 +468,18 @@ int main( int argc, char* argv[] )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::cout << "\n\nLoaded " << pcbFiles.size() << " PCB Files \n";
|
std::cout << "\n[Info] " << "Loaded " << pcbFiles.size() << " PCB Files \n";
|
||||||
std::cout << "Total Groups " << totalGroups << " Total entries " << totalGroupEntries << "\n";
|
std::cout << "[Info] " << "Total Groups " << totalGroups << " Total entries " << totalGroupEntries << "\n";
|
||||||
}
|
}
|
||||||
std::cout << "Finished exporting " << zoneName << " in " <<
|
std::cout << "[Success] " << "Finished exporting " << zoneName << " in " <<
|
||||||
std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now() - startTime ).count() << " seconds\n";
|
std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now() - startTime ).count() << " seconds\n";
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
std::cout << e.what() << std::endl;
|
std::cout << "[Error] " << e.what() << std::endl;
|
||||||
|
std::cout << "[Error] " << "Unable to extract collision data.\n\tIf using standalone ensure your working directory folder layout is \n\tbg/[ffxiv|ex1|ex2]/teri/type/zone/[level|collision]" << std::endl;
|
||||||
|
std::cout << std::endl;
|
||||||
|
std::cout << "[Info] " << "Usage: pcb_reader2 territory \"path/to/game/sqpack/ffxiv\" " << std::endl;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue