mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-24 21:57:44 +00:00
GM Ranks, some fixes
This commit is contained in:
parent
4b914aae3c
commit
cb7c6ab65e
13 changed files with 398 additions and 357 deletions
|
@ -11,7 +11,7 @@
|
||||||
<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 -->
|
<!-- 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>
|
||||||
|
@ -23,4 +23,9 @@
|
||||||
<Database>sapphire</Database>
|
<Database>sapphire</Database>
|
||||||
</Mysql>
|
</Mysql>
|
||||||
</General>
|
</General>
|
||||||
|
|
||||||
|
<Parameters>
|
||||||
|
<!-- GM Rank for newly created characters - should be changed to 0 for public servers -->
|
||||||
|
<DefaultGMRank>255</DefaultGMRank>
|
||||||
|
</Parameters>
|
||||||
</Settings>
|
</Settings>
|
|
@ -218,7 +218,7 @@ void Core::Network::GameConnection::enterWorld( FFXIVARR_PACKET_RAW& packet, uin
|
||||||
|
|
||||||
uint64_t lookupId = *reinterpret_cast< uint64_t* >( &packet.data[0] + 0x18 );
|
uint64_t lookupId = *reinterpret_cast< uint64_t* >( &packet.data[0] + 0x18 );
|
||||||
|
|
||||||
uint32_t logInCharId;
|
uint32_t logInCharId = -1;
|
||||||
std::string logInCharName;
|
std::string logInCharName;
|
||||||
auto charList = g_restConnector.getCharList( ( char * )m_pSession->getSessionId() );
|
auto charList = g_restConnector.getCharList( ( char * )m_pSession->getSessionId() );
|
||||||
for( uint32_t i = 0; i < charList.size(); i++ )
|
for( uint32_t i = 0; i < charList.size(); i++ )
|
||||||
|
@ -233,6 +233,8 @@ void Core::Network::GameConnection::enterWorld( FFXIVARR_PACKET_RAW& packet, uin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( logInCharId == -1 )
|
||||||
|
return;
|
||||||
|
|
||||||
g_log.info( "[" + std::to_string( m_pSession->getAccountID() ) + "] Logging in as " + logInCharName + "(" + std::to_string( logInCharId ) + ")" );
|
g_log.info( "[" + std::to_string( m_pSession->getAccountID() ) + "] Logging in as " + logInCharName + "(" + std::to_string( logInCharId ) + ")" );
|
||||||
|
|
||||||
|
|
|
@ -270,6 +270,7 @@ namespace Core {
|
||||||
" unlocks, "
|
" unlocks, "
|
||||||
" QuestTracking, "
|
" QuestTracking, "
|
||||||
" Aetheryte, "
|
" Aetheryte, "
|
||||||
|
" GMRank, "
|
||||||
" UPDATE_DATE ) "
|
" UPDATE_DATE ) "
|
||||||
" VALUES (" + std::to_string( m_iD ) + ", "
|
" VALUES (" + std::to_string( m_iD ) + ", "
|
||||||
+ std::to_string( m_guardianDeity ) + ", "
|
+ std::to_string( m_guardianDeity ) + ", "
|
||||||
|
@ -283,7 +284,8 @@ namespace Core {
|
||||||
+ "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)questComplete, 200 ) ) + "'), "
|
+ "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)questComplete, 200 ) ) + "'), "
|
||||||
+ "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)unlocks, 64 ) ) + "'), "
|
+ "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)unlocks, 64 ) ) + "'), "
|
||||||
+ "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)questTracking, 10 ) ) + "'), "
|
+ "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)questTracking, 10 ) ) + "'), "
|
||||||
+ "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)aetherytes, 12 ) ) + "'), NOW());" );
|
+ "UNHEX('" + std::string( Util::binaryToHexString( (uint8_t*)aetherytes, 12 ) ) + "'),"
|
||||||
|
+ std::to_string( m_gmRank ) + ", NOW());" );
|
||||||
|
|
||||||
|
|
||||||
g_database.execute( "INSERT INTO characlass (CharacterId, Lv_" + std::to_string( g_exdData.m_classJobInfoMap[m_class].exp_idx ) + ", UPDATE_DATE ) "
|
g_database.execute( "INSERT INTO characlass (CharacterId, Lv_" + std::to_string( g_exdData.m_classJobInfoMap[m_class].exp_idx ) + ", UPDATE_DATE ) "
|
||||||
|
|
|
@ -140,6 +140,16 @@ namespace Core {
|
||||||
m_tribe = tribe;
|
m_tribe = tribe;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t getGmRank()
|
||||||
|
{
|
||||||
|
return m_birthMonth;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setGmRank( uint8_t rank )
|
||||||
|
{
|
||||||
|
m_gmRank = rank;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t m_modelEquip[10];
|
uint32_t m_modelEquip[10];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -162,6 +172,8 @@ namespace Core {
|
||||||
std::map<uint8_t, uint16_t> m_classMap;
|
std::map<uint8_t, uint16_t> m_classMap;
|
||||||
uint8_t m_look[26];
|
uint8_t m_look[26];
|
||||||
|
|
||||||
|
uint8_t m_gmRank;
|
||||||
|
|
||||||
char m_name[34];
|
char m_name[34];
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ bool Core::Network::SapphireAPI::createAccount( const std::string& username, con
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Core::Network::SapphireAPI::createCharacter( const int& accountId, const std::string& name, const std::string& infoJson )
|
int Core::Network::SapphireAPI::createCharacter( const int& accountId, const std::string& name, const std::string& infoJson, const int& gmRank )
|
||||||
{
|
{
|
||||||
Core::PlayerMinimal newPlayer;
|
Core::PlayerMinimal newPlayer;
|
||||||
|
|
||||||
|
@ -166,6 +166,7 @@ int Core::Network::SapphireAPI::createCharacter( const int& accountId, const std
|
||||||
newPlayer.setBirthDay( tmpVector2.at( 3 ), tmpVector2.at( 2 ) );
|
newPlayer.setBirthDay( tmpVector2.at( 3 ), tmpVector2.at( 2 ) );
|
||||||
newPlayer.setClass( tmpVector2.at( 4 ) );
|
newPlayer.setClass( tmpVector2.at( 4 ) );
|
||||||
newPlayer.setTribe( tmpVector2.at( 5 ) );
|
newPlayer.setTribe( tmpVector2.at( 5 ) );
|
||||||
|
newPlayer.setGmRank( gmRank );
|
||||||
|
|
||||||
newPlayer.saveAsNew();
|
newPlayer.saveAsNew();
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ namespace Core
|
||||||
|
|
||||||
bool createAccount( const std::string& username, const std::string& pass, std::string& sId );
|
bool createAccount( const std::string& username, const std::string& pass, std::string& sId );
|
||||||
|
|
||||||
int32_t createCharacter( const int& accountId, const std::string& name, const std::string& infoJson );
|
int32_t createCharacter( const int& accountId, const std::string& name, const std::string& infoJson, const int& gmRank );
|
||||||
|
|
||||||
void deleteCharacter( std::string name, uint32_t accountId );
|
void deleteCharacter( std::string name, uint32_t accountId );
|
||||||
|
|
||||||
|
|
|
@ -331,7 +331,7 @@ int main(int argc, char* argv[])
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int32_t charId = g_sapphireAPI.createCharacter( result, name, finalJson );
|
int32_t charId = g_sapphireAPI.createCharacter( result, name, finalJson, m_pConfig->getValue< uint8_t >( "Settings.Parameters.DefaultGMRank", 255 ) );
|
||||||
|
|
||||||
std::string json_string = "{\"result\":\"" + std::to_string( charId ) + "\"}";
|
std::string json_string = "{\"result\":\"" + std::to_string( charId ) + "\"}";
|
||||||
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
|
||||||
|
|
|
@ -110,6 +110,16 @@ uint16_t Core::Entity::Player::getZoneId() const
|
||||||
return m_zoneId;
|
return m_zoneId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t Core::Entity::Player::getGmRank() const
|
||||||
|
{
|
||||||
|
return m_gmRank;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::Entity::Player::setGmRank( uint8_t rank )
|
||||||
|
{
|
||||||
|
m_gmRank = rank;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t Core::Entity::Player::getMode() const
|
uint8_t Core::Entity::Player::getMode() const
|
||||||
{
|
{
|
||||||
return m_mode;
|
return m_mode;
|
||||||
|
@ -780,11 +790,6 @@ void Core::Entity::Player::setLevelForClass( uint8_t level, Core::Common::ClassJ
|
||||||
setSyncFlag( PlayerSyncFlags::ExpLevel );
|
setSyncFlag( PlayerSyncFlags::ExpLevel );
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Core::Entity::Player::getUserLevel() const
|
|
||||||
{
|
|
||||||
return m_userLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Core::Entity::Player::eventActionStart( uint32_t eventId,
|
void Core::Entity::Player::eventActionStart( uint32_t eventId,
|
||||||
uint32_t action,
|
uint32_t action,
|
||||||
ActionCallback finishCallback,
|
ActionCallback finishCallback,
|
||||||
|
|
|
@ -478,6 +478,9 @@ public:
|
||||||
|
|
||||||
uint16_t getZoneId() const;
|
uint16_t getZoneId() const;
|
||||||
|
|
||||||
|
uint8_t getGmRank() const;
|
||||||
|
void setGmRank( uint8_t rank );
|
||||||
|
|
||||||
uint8_t getMode() const;
|
uint8_t getMode() const;
|
||||||
void setMode( uint8_t mode );
|
void setMode( uint8_t mode );
|
||||||
|
|
||||||
|
@ -589,7 +592,7 @@ private:
|
||||||
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_userLevel;
|
uint8_t m_gmRank;
|
||||||
uint16_t zoneId;
|
uint16_t zoneId;
|
||||||
|
|
||||||
bool m_bInCombat;
|
bool m_bInCombat;
|
||||||
|
|
|
@ -80,7 +80,8 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession )
|
||||||
"cd.GrandCompany, "
|
"cd.GrandCompany, "
|
||||||
"cd.GrandCompanyRank, "
|
"cd.GrandCompanyRank, "
|
||||||
"cd.CFPenaltyUntil, "
|
"cd.CFPenaltyUntil, "
|
||||||
"cd.OpeningSequence "
|
"cd.OpeningSequence, "
|
||||||
|
"cd.GMRank "
|
||||||
"FROM charabase AS c "
|
"FROM charabase AS c "
|
||||||
" INNER JOIN charadetail AS cd "
|
" INNER JOIN charadetail AS cd "
|
||||||
" ON c.CharacterId = cd.CharacterId "
|
" ON c.CharacterId = cd.CharacterId "
|
||||||
|
@ -171,13 +172,13 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession )
|
||||||
|
|
||||||
m_openingSequence = field[36].getUInt32();
|
m_openingSequence = field[36].getUInt32();
|
||||||
|
|
||||||
|
m_gmRank = field[37].getUInt8();
|
||||||
|
|
||||||
m_pCell = nullptr;
|
m_pCell = nullptr;
|
||||||
|
|
||||||
if( !loadActiveQuests() || !loadClassData() || !loadSearchInfo() )
|
if( !loadActiveQuests() || !loadClassData() || !loadSearchInfo() )
|
||||||
g_log.error( "Player id " + char_id_str + " data corrupt!" );
|
g_log.error( "Player id " + char_id_str + " data corrupt!" );
|
||||||
|
|
||||||
m_userLevel = 1;
|
|
||||||
|
|
||||||
m_maxHp = getMaxHp();
|
m_maxHp = getMaxHp();
|
||||||
m_maxMp = getMaxMp();
|
m_maxMp = getMaxMp();
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,12 @@ void Core::DebugCommandHandler::registerCommand( const std::string& n, Core::Deb
|
||||||
void Core::DebugCommandHandler::execCommand( char * data, Core::Entity::PlayerPtr pPlayer )
|
void Core::DebugCommandHandler::execCommand( char * data, Core::Entity::PlayerPtr pPlayer )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if( pPlayer->getGmRank() <= 0 )
|
||||||
|
{
|
||||||
|
pPlayer->sendUrgent( "You are not allowed to use debug commands." );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// define callback pointer
|
// define callback pointer
|
||||||
void ( DebugCommandHandler::*pf )( char *, Entity::PlayerPtr, boost::shared_ptr< DebugCommand > );
|
void ( DebugCommandHandler::*pf )( char *, Entity::PlayerPtr, boost::shared_ptr< DebugCommand > );
|
||||||
|
|
||||||
|
|
|
@ -49,380 +49,384 @@ using namespace Core::Network::Packets::Server;
|
||||||
|
|
||||||
enum GmCommand
|
enum GmCommand
|
||||||
{
|
{
|
||||||
Pos = 0x0000,
|
Pos = 0x0000,
|
||||||
Lv = 0x0001,
|
Lv = 0x0001,
|
||||||
Race = 0x0002,
|
Race = 0x0002,
|
||||||
Tribe = 0x0003,
|
Tribe = 0x0003,
|
||||||
Sex = 0x0004,
|
Sex = 0x0004,
|
||||||
Time = 0x0005,
|
Time = 0x0005,
|
||||||
Weather = 0x0006,
|
Weather = 0x0006,
|
||||||
Call = 0x0007,
|
Call = 0x0007,
|
||||||
Inspect = 0x0008,
|
Inspect = 0x0008,
|
||||||
Speed = 0x0009,
|
Speed = 0x0009,
|
||||||
Invis = 0x000D,
|
Invis = 0x000D,
|
||||||
|
|
||||||
Raise = 0x0010,
|
Raise = 0x0010,
|
||||||
Kill = 0x000E,
|
Kill = 0x000E,
|
||||||
Icon = 0x0012,
|
Icon = 0x0012,
|
||||||
|
|
||||||
Hp = 0x0064,
|
Hp = 0x0064,
|
||||||
Mp = 0x0065,
|
Mp = 0x0065,
|
||||||
Tp = 0x0066,
|
Tp = 0x0066,
|
||||||
Gp = 0x0067,
|
Gp = 0x0067,
|
||||||
|
|
||||||
Item = 0x00C8,
|
Item = 0x00C8,
|
||||||
Gil = 0x00C9,
|
Gil = 0x00C9,
|
||||||
Collect = 0x00CA,
|
Collect = 0x00CA,
|
||||||
|
|
||||||
QuestAccept = 0x012C,
|
QuestAccept = 0x012C,
|
||||||
QuestCancel = 0x012D,
|
QuestCancel = 0x012D,
|
||||||
QuestComplete = 0x012E,
|
QuestComplete = 0x012E,
|
||||||
QuestIncomplete = 0x012F,
|
QuestIncomplete = 0x012F,
|
||||||
QuestSequence = 0x0130,
|
QuestSequence = 0x0130,
|
||||||
QuestInspect = 0x0131,
|
QuestInspect = 0x0131,
|
||||||
GC = 0x0154,
|
GC = 0x0154,
|
||||||
GCRank = 0x0155,
|
GCRank = 0x0155,
|
||||||
TeriInfo = 0x025D,
|
TeriInfo = 0x025D,
|
||||||
Jump = 0x025E,
|
Jump = 0x025E,
|
||||||
JumpNpc = 0x025F,
|
JumpNpc = 0x025F,
|
||||||
};
|
};
|
||||||
void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer )
|
||||||
Entity::PlayerPtr pPlayer )
|
|
||||||
{
|
{
|
||||||
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
|
if( pPlayer->getGmRank() <= 0 )
|
||||||
uint32_t param1 = inPacket.getValAt< uint32_t >( 0x24 );
|
return;
|
||||||
uint32_t param2 = inPacket.getValAt< uint32_t >( 0x28 );
|
|
||||||
uint32_t param3 = inPacket.getValAt< uint32_t >( 0x38 );
|
|
||||||
|
|
||||||
g_log.debug( pPlayer->getName() + " used GM1 commandId: " + std::to_string( commandId ) +
|
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
|
||||||
", params: " + std::to_string( param1 ) + ", " +
|
uint32_t param1 = inPacket.getValAt< uint32_t >( 0x24 );
|
||||||
std::to_string( param2 ) + ", " + std::to_string( param3 ) );
|
uint32_t param2 = inPacket.getValAt< uint32_t >( 0x28 );
|
||||||
|
uint32_t param3 = inPacket.getValAt< uint32_t >( 0x38 );
|
||||||
|
|
||||||
Core::Entity::ActorPtr targetActor;
|
g_log.debug( pPlayer->getName() + " used GM1 commandId: " + std::to_string( commandId ) +
|
||||||
|
", params: " + std::to_string( param1 ) + ", " +
|
||||||
|
std::to_string( param2 ) + ", " + std::to_string( param3 ) );
|
||||||
|
|
||||||
|
Core::Entity::ActorPtr targetActor;
|
||||||
|
|
||||||
|
|
||||||
if( pPlayer->getId() == param3 )
|
if( pPlayer->getId() == param3 )
|
||||||
{
|
{
|
||||||
targetActor = pPlayer;
|
targetActor = pPlayer;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
auto inRange = pPlayer->getInRangeActors();
|
auto inRange = pPlayer->getInRangeActors();
|
||||||
for( auto actor : inRange )
|
for( auto actor : inRange )
|
||||||
{
|
{
|
||||||
if( actor->getId() == param3 )
|
if( actor->getId() == param3 )
|
||||||
targetActor = actor;
|
targetActor = actor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !targetActor )
|
if( !targetActor )
|
||||||
return;
|
return;
|
||||||
auto targetPlayer = targetActor->getAsPlayer();
|
auto targetPlayer = targetActor->getAsPlayer();
|
||||||
|
|
||||||
switch( commandId )
|
switch( commandId )
|
||||||
{
|
{
|
||||||
case GmCommand::Kill:
|
case GmCommand::Kill:
|
||||||
{
|
{
|
||||||
targetActor->takeDamage( 9999999 );
|
targetActor->takeDamage( 9999999 );
|
||||||
pPlayer->sendNotice( "Killed " + std::to_string( targetActor->getId() ) );
|
pPlayer->sendNotice( "Killed " + std::to_string( targetActor->getId() ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::QuestSequence:
|
case GmCommand::QuestSequence:
|
||||||
{
|
{
|
||||||
targetPlayer->updateQuest( param1, param2 );
|
targetPlayer->updateQuest( param1, param2 );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::QuestComplete:
|
case GmCommand::QuestComplete:
|
||||||
{
|
{
|
||||||
targetPlayer->finishQuest( param1 );
|
targetPlayer->finishQuest( param1 );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::QuestAccept:
|
case GmCommand::QuestAccept:
|
||||||
{
|
{
|
||||||
targetPlayer->updateQuest( param1, 1 );
|
targetPlayer->updateQuest( param1, 1 );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::QuestCancel:
|
case GmCommand::QuestCancel:
|
||||||
{
|
{
|
||||||
targetPlayer->removeQuest( param1 );
|
targetPlayer->removeQuest( param1 );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::QuestIncomplete:
|
case GmCommand::QuestIncomplete:
|
||||||
{
|
{
|
||||||
targetPlayer->unfinishQuest( param1 );
|
targetPlayer->unfinishQuest( param1 );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Speed:
|
case GmCommand::Speed:
|
||||||
{
|
{
|
||||||
targetPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), Flee, param1 ) );
|
targetPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), Flee, param1 ) );
|
||||||
pPlayer->sendNotice( "Speed for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
pPlayer->sendNotice( "Speed for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
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() );
|
pPlayer->sendNotice( "Added " + std::to_string( param1 ) + " Gil for " + targetPlayer->getName() );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
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 ) );
|
pPlayer->sendNotice( "Level 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 ) );
|
pPlayer->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 ) );
|
pPlayer->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 ) );
|
pPlayer->sendNotice( "Gp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
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 ) );
|
pPlayer->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 )
|
||||||
{
|
{
|
||||||
targetPlayer->despawn( actor->getAsPlayer() );
|
targetPlayer->despawn( actor->getAsPlayer() );
|
||||||
targetPlayer->spawn( actor->getAsPlayer() );
|
targetPlayer->spawn( actor->getAsPlayer() );
|
||||||
}
|
}
|
||||||
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 ) );
|
pPlayer->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 )
|
||||||
{
|
{
|
||||||
targetPlayer->despawn( actor->getAsPlayer() );
|
targetPlayer->despawn( actor->getAsPlayer() );
|
||||||
targetPlayer->spawn( actor->getAsPlayer() );
|
targetPlayer->spawn( actor->getAsPlayer() );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
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 ) );
|
pPlayer->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 )
|
||||||
{
|
{
|
||||||
targetPlayer->despawn( actor->getAsPlayer() );
|
targetPlayer->despawn( actor->getAsPlayer() );
|
||||||
targetPlayer->spawn( actor->getAsPlayer() );
|
targetPlayer->spawn( actor->getAsPlayer() );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Item:
|
case GmCommand::Item:
|
||||||
{
|
{
|
||||||
if( param2 < 1 || param2 > 99 )
|
if( param2 < 1 || param2 > 99 )
|
||||||
{
|
{
|
||||||
param2 = 1;
|
param2 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( param1 == 0xcccccccc ) )
|
if( ( param1 == 0xcccccccc ) )
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( "Syntaxerror." );
|
pPlayer->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..." );
|
pPlayer->sendUrgent( "Item " + std::to_string( param1 ) + " not found..." );
|
||||||
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 " +
|
pPlayer->sendNotice( "Weather in Zone \"" + targetPlayer->getCurrentZone()->getName() + "\" of " +
|
||||||
targetPlayer->getName() + " set in range." );
|
targetPlayer->getName() + " set in range." );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::TeriInfo:
|
case GmCommand::TeriInfo:
|
||||||
{
|
{
|
||||||
pPlayer->sendNotice( "ZoneId: " + std::to_string( pPlayer->getZoneId() ) + "\nName: " +
|
pPlayer->sendNotice( "ZoneId: " + std::to_string( pPlayer->getZoneId() ) + "\nName: " +
|
||||||
pPlayer->getCurrentZone()->getName() + "\nInternalName: " +
|
pPlayer->getCurrentZone()->getName() + "\nInternalName: " +
|
||||||
pPlayer->getCurrentZone()->getInternalName() + "\nPopCount: " +
|
pPlayer->getCurrentZone()->getInternalName() + "\nPopCount: " +
|
||||||
std::to_string( pPlayer->getCurrentZone()->getPopCount() ) +
|
std::to_string( pPlayer->getCurrentZone()->getPopCount() ) +
|
||||||
"\nCurrentWeather:" + std::to_string( pPlayer->getCurrentZone()->getCurrentWeather() ) +
|
"\nCurrentWeather:" + std::to_string( pPlayer->getCurrentZone()->getCurrentWeather() ) +
|
||||||
"\nNextWeather:" + std::to_string( pPlayer->getCurrentZone()->getNextWeather() ) );
|
"\nNextWeather:" + std::to_string( pPlayer->getCurrentZone()->getNextWeather() ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Jump:
|
case GmCommand::Jump:
|
||||||
{
|
{
|
||||||
|
|
||||||
auto inRange = pPlayer->getInRangeActors();
|
auto inRange = pPlayer->getInRangeActors();
|
||||||
for( auto actor : inRange )
|
for( auto actor : inRange )
|
||||||
{
|
{
|
||||||
pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
|
pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
|
||||||
targetActor->getRotation() );
|
targetActor->getRotation() );
|
||||||
}
|
}
|
||||||
pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() + " in range." );
|
pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() + " in range." );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Collect:
|
case GmCommand::Collect:
|
||||||
{
|
{
|
||||||
uint32_t gil = targetPlayer->getCurrency( 1 );
|
uint32_t gil = targetPlayer->getCurrency( 1 );
|
||||||
|
|
||||||
if( gil < param1 )
|
if( gil < param1 )
|
||||||
{
|
{
|
||||||
pPlayer->sendUrgent( "Player does not have enough Gil(" + std::to_string( gil ) + ")" );
|
pPlayer->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 ) +
|
pPlayer->sendNotice( "Removed " + std::to_string( param1 ) +
|
||||||
" Gil from " + targetPlayer->getName() +
|
" Gil from " + targetPlayer->getName() +
|
||||||
"(" + std::to_string( gil ) + " before)" );
|
"(" + std::to_string( gil ) + " before)" );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::Icon:
|
case GmCommand::Icon:
|
||||||
{
|
{
|
||||||
targetPlayer->setOnlineStatusMask( param1 );
|
targetPlayer->setOnlineStatusMask( param1 );
|
||||||
|
|
||||||
GamePacketNew< FFXIVIpcSetOnlineStatus, ServerZoneIpcType > statusPacket( targetPlayer->getId() );
|
GamePacketNew< FFXIVIpcSetOnlineStatus, ServerZoneIpcType > statusPacket( targetPlayer->getId() );
|
||||||
statusPacket.data().onlineStatusFlags = param1;
|
statusPacket.data().onlineStatusFlags = param1;
|
||||||
queueOutPacket( statusPacket );
|
queueOutPacket( statusPacket );
|
||||||
|
|
||||||
GamePacketNew< FFXIVIpcSetSearchInfo, ServerZoneIpcType > searchInfoPacket( targetPlayer->getId() );
|
GamePacketNew< FFXIVIpcSetSearchInfo, ServerZoneIpcType > searchInfoPacket( targetPlayer->getId() );
|
||||||
searchInfoPacket.data().onlineStatusFlags = param1;
|
searchInfoPacket.data().onlineStatusFlags = param1;
|
||||||
searchInfoPacket.data().selectRegion = targetPlayer->getSearchSelectRegion();
|
searchInfoPacket.data().selectRegion = targetPlayer->getSearchSelectRegion();
|
||||||
sprintf( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() );
|
sprintf( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() );
|
||||||
targetPlayer->queuePacket( searchInfoPacket );
|
targetPlayer->queuePacket( searchInfoPacket );
|
||||||
|
|
||||||
targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon,
|
targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon,
|
||||||
static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ),
|
static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ),
|
||||||
true );
|
true );
|
||||||
pPlayer->sendNotice( "Icon for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
pPlayer->sendNotice( "Icon for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GmCommand::GC:
|
case GmCommand::GC:
|
||||||
{
|
{
|
||||||
targetPlayer->setGc( param1 );
|
targetPlayer->setGc( param1 );
|
||||||
pPlayer->sendNotice( "GC for " + targetPlayer->getName() +
|
pPlayer->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() +
|
pPlayer->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;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
pPlayer->sendUrgent( "GM1 Command not implemented: " + std::to_string( commandId ) );
|
pPlayer->sendUrgent( "GM1 Command not implemented: " + std::to_string( commandId ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
|
pPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
|
||||||
targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
|
targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPacket,
|
void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer )
|
||||||
Entity::PlayerPtr pPlayer )
|
|
||||||
{
|
{
|
||||||
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
|
if( pPlayer->getGmRank() <= 0 )
|
||||||
std::string param1 = inPacket.getStringAt( 0x34 );
|
return;
|
||||||
|
|
||||||
g_log.debug( pPlayer->getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 );
|
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
|
||||||
|
std::string param1 = inPacket.getStringAt( 0x34 );
|
||||||
|
|
||||||
auto targetSession = g_serverZone.getSession( param1 );
|
g_log.debug( pPlayer->getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 );
|
||||||
Core::Entity::ActorPtr targetActor;
|
|
||||||
|
|
||||||
if( targetSession != nullptr )
|
auto targetSession = g_serverZone.getSession( param1 );
|
||||||
{
|
Core::Entity::ActorPtr targetActor;
|
||||||
targetActor = targetSession->getPlayer();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( param1 == "self" )
|
|
||||||
{
|
|
||||||
targetActor = pPlayer;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pPlayer->sendUrgent("Player " + param1 + " not found on this server.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !targetActor )
|
if( targetSession != nullptr )
|
||||||
return;
|
{
|
||||||
auto targetPlayer = targetActor->getAsPlayer();
|
targetActor = targetSession->getPlayer();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( param1 == "self" )
|
||||||
|
{
|
||||||
|
targetActor = pPlayer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pPlayer->sendUrgent( "Player " + param1 + " not found on this server." );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch( commandId )
|
if( !targetActor )
|
||||||
{
|
return;
|
||||||
case GmCommand::Raise:
|
auto targetPlayer = targetActor->getAsPlayer();
|
||||||
{
|
|
||||||
targetPlayer->resetHp();
|
|
||||||
targetPlayer->resetMp();
|
|
||||||
targetPlayer->setStatus( Entity::Actor::ActorStatus::Idle );
|
|
||||||
targetPlayer->setSyncFlag( Status );
|
|
||||||
|
|
||||||
targetPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true );
|
switch( commandId )
|
||||||
targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus,
|
{
|
||||||
static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true );
|
case GmCommand::Raise:
|
||||||
pPlayer->sendNotice( "Raised " + targetPlayer->getName());
|
{
|
||||||
break;
|
targetPlayer->resetHp();
|
||||||
}
|
targetPlayer->resetMp();
|
||||||
case GmCommand::Jump:
|
targetPlayer->setStatus( Entity::Actor::ActorStatus::Idle );
|
||||||
{
|
targetPlayer->setSyncFlag( Status );
|
||||||
if( targetPlayer->getZoneId() != pPlayer->getZoneId() )
|
|
||||||
{
|
|
||||||
pPlayer->setZone( targetPlayer->getZoneId() );
|
|
||||||
}
|
|
||||||
pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
|
|
||||||
targetActor->getRotation() );
|
|
||||||
pPlayer->sendNotice( "Jumping to " + targetPlayer->getName());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GmCommand::Call:
|
|
||||||
{
|
|
||||||
if( targetPlayer->getZoneId() != pPlayer->getZoneId() )
|
|
||||||
targetPlayer->setZone( pPlayer->getZoneId() );
|
|
||||||
|
|
||||||
targetPlayer->changePosition( pPlayer->getPos().x, pPlayer->getPos().y, pPlayer->getPos().z,
|
targetPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true );
|
||||||
pPlayer->getRotation() );
|
targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus,
|
||||||
pPlayer->sendNotice( "Calling " + targetPlayer->getName() );
|
static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true );
|
||||||
break;
|
pPlayer->sendNotice( "Raised " + targetPlayer->getName() );
|
||||||
}
|
break;
|
||||||
case GmCommand::Inspect:
|
}
|
||||||
{
|
case GmCommand::Jump:
|
||||||
pPlayer->sendNotice( "Name: " + targetPlayer->getName() +
|
{
|
||||||
"\nGil: " + std::to_string( targetPlayer->getCurrency( 1 ) ) +
|
if( targetPlayer->getZoneId() != pPlayer->getZoneId() )
|
||||||
"\nZone: " + targetPlayer->getCurrentZone()->getName() +
|
{
|
||||||
"(" + std::to_string( targetPlayer->getZoneId() ) + ")" +
|
pPlayer->setZone( targetPlayer->getZoneId() );
|
||||||
"\nClass: " + std::to_string( targetPlayer->getClass() ) +
|
}
|
||||||
"\nLevel: " + std::to_string( targetPlayer->getLevel() ) +
|
pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
|
||||||
"\nExp: " + std::to_string( targetPlayer->getExp() ) +
|
targetActor->getRotation() );
|
||||||
"\nSearchMessage: " + targetPlayer->getSearchMessage() +
|
pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() );
|
||||||
"\nPlayTime: " + std::to_string( targetPlayer->getPlayTime() ) );
|
break;
|
||||||
break;
|
}
|
||||||
}
|
case GmCommand::Call:
|
||||||
|
{
|
||||||
|
if( targetPlayer->getZoneId() != pPlayer->getZoneId() )
|
||||||
|
targetPlayer->setZone( pPlayer->getZoneId() );
|
||||||
|
|
||||||
default:
|
targetPlayer->changePosition( pPlayer->getPos().x, pPlayer->getPos().y, pPlayer->getPos().z,
|
||||||
pPlayer->sendUrgent( "GM2 Command not implemented: " + std::to_string( commandId ) );
|
pPlayer->getRotation() );
|
||||||
break;
|
pPlayer->sendNotice( "Calling " + targetPlayer->getName() );
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
|
case GmCommand::Inspect:
|
||||||
|
{
|
||||||
|
pPlayer->sendNotice( "Name: " + targetPlayer->getName() +
|
||||||
|
"\nGil: " + std::to_string( targetPlayer->getCurrency( 1 ) ) +
|
||||||
|
"\nZone: " + targetPlayer->getCurrentZone()->getName() +
|
||||||
|
"(" + std::to_string( targetPlayer->getZoneId() ) + ")" +
|
||||||
|
"\nClass: " + std::to_string( targetPlayer->getClass() ) +
|
||||||
|
"\nLevel: " + std::to_string( targetPlayer->getLevel() ) +
|
||||||
|
"\nExp: " + std::to_string( targetPlayer->getExp() ) +
|
||||||
|
"\nSearchMessage: " + targetPlayer->getSearchMessage() +
|
||||||
|
"\nPlayTime: " + std::to_string( targetPlayer->getPlayTime() ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
pPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
|
default:
|
||||||
targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
|
pPlayer->sendUrgent( "GM2 Command not implemented: " + std::to_string( commandId ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
|
||||||
|
targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace Server {
|
||||||
m_data.tPCurr = pPlayer->getTp();
|
m_data.tPCurr = pPlayer->getTp();
|
||||||
m_data.hPMax = pPlayer->getMaxHp();
|
m_data.hPMax = pPlayer->getMaxHp();
|
||||||
m_data.mPMax = pPlayer->getMaxMp();
|
m_data.mPMax = pPlayer->getMaxMp();
|
||||||
m_data.gmRank = 0xff;
|
m_data.gmRank = pPlayer->getGmRank();
|
||||||
//m_data.tPMax = 3000;
|
//m_data.tPMax = 3000;
|
||||||
m_data.level = pPlayer->getLevel();
|
m_data.level = pPlayer->getLevel();
|
||||||
memcpy( m_data.look, pPlayer->getLookArray(), 26 );
|
memcpy( m_data.look, pPlayer->getLookArray(), 26 );
|
||||||
|
|
Loading…
Add table
Reference in a new issue