diff --git a/bin/config/settings_rest.xml b/bin/config/settings_rest.xml
index 1ee97228..af0c2fb9 100644
--- a/bin/config/settings_rest.xml
+++ b/bin/config/settings_rest.xml
@@ -11,7 +11,7 @@
127.0.0.1
127.0.0.1
-
+
default
80
@@ -23,4 +23,9 @@
sapphire
+
+
+
+ 255
+
\ No newline at end of file
diff --git a/src/servers/Server_Lobby/GameConnection.cpp b/src/servers/Server_Lobby/GameConnection.cpp
index c9388e5d..21f45ef3 100644
--- a/src/servers/Server_Lobby/GameConnection.cpp
+++ b/src/servers/Server_Lobby/GameConnection.cpp
@@ -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 );
- uint32_t logInCharId;
+ uint32_t logInCharId = -1;
std::string logInCharName;
auto charList = g_restConnector.getCharList( ( char * )m_pSession->getSessionId() );
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 ) + ")" );
diff --git a/src/servers/Server_REST/PlayerMinimal.cpp b/src/servers/Server_REST/PlayerMinimal.cpp
index 591b05ca..98ebe9ac 100644
--- a/src/servers/Server_REST/PlayerMinimal.cpp
+++ b/src/servers/Server_REST/PlayerMinimal.cpp
@@ -270,6 +270,7 @@ namespace Core {
" unlocks, "
" QuestTracking, "
" Aetheryte, "
+ " GMRank, "
" UPDATE_DATE ) "
" VALUES (" + std::to_string( m_iD ) + ", "
+ 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*)unlocks, 64 ) ) + "'), "
+ "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 ) "
diff --git a/src/servers/Server_REST/PlayerMinimal.h b/src/servers/Server_REST/PlayerMinimal.h
index af195966..01083752 100644
--- a/src/servers/Server_REST/PlayerMinimal.h
+++ b/src/servers/Server_REST/PlayerMinimal.h
@@ -140,6 +140,16 @@ namespace Core {
m_tribe = tribe;
}
+ uint8_t getGmRank()
+ {
+ return m_birthMonth;
+ }
+
+ void setGmRank( uint8_t rank )
+ {
+ m_gmRank = rank;
+ }
+
uint32_t m_modelEquip[10];
private:
@@ -162,6 +172,8 @@ namespace Core {
std::map m_classMap;
uint8_t m_look[26];
+ uint8_t m_gmRank;
+
char m_name[34];
diff --git a/src/servers/Server_REST/SapphireAPI.cpp b/src/servers/Server_REST/SapphireAPI.cpp
index a1072585..79bfd87f 100644
--- a/src/servers/Server_REST/SapphireAPI.cpp
+++ b/src/servers/Server_REST/SapphireAPI.cpp
@@ -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;
@@ -166,6 +166,7 @@ int Core::Network::SapphireAPI::createCharacter( const int& accountId, const std
newPlayer.setBirthDay( tmpVector2.at( 3 ), tmpVector2.at( 2 ) );
newPlayer.setClass( tmpVector2.at( 4 ) );
newPlayer.setTribe( tmpVector2.at( 5 ) );
+ newPlayer.setGmRank( gmRank );
newPlayer.saveAsNew();
diff --git a/src/servers/Server_REST/SapphireAPI.h b/src/servers/Server_REST/SapphireAPI.h
index 09b86729..c16c6919 100644
--- a/src/servers/Server_REST/SapphireAPI.h
+++ b/src/servers/Server_REST/SapphireAPI.h
@@ -27,7 +27,7 @@ namespace Core
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 );
diff --git a/src/servers/Server_REST/main.cpp b/src/servers/Server_REST/main.cpp
index df383565..419dc0a6 100644
--- a/src/servers/Server_REST/main.cpp
+++ b/src/servers/Server_REST/main.cpp
@@ -331,7 +331,7 @@ int main(int argc, char* argv[])
}
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 ) + "\"}";
*response << "HTTP/1.1 200\r\nContent-Length: " << json_string.length() << "\r\n\r\n" << json_string;
diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp
index 406ceefb..45aa6d3c 100644
--- a/src/servers/Server_Zone/Actor/Player.cpp
+++ b/src/servers/Server_Zone/Actor/Player.cpp
@@ -110,6 +110,16 @@ uint16_t Core::Entity::Player::getZoneId() const
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
{
return m_mode;
@@ -780,11 +790,6 @@ void Core::Entity::Player::setLevelForClass( uint8_t level, Core::Common::ClassJ
setSyncFlag( PlayerSyncFlags::ExpLevel );
}
-uint8_t Core::Entity::Player::getUserLevel() const
-{
- return m_userLevel;
-}
-
void Core::Entity::Player::eventActionStart( uint32_t eventId,
uint32_t action,
ActionCallback finishCallback,
diff --git a/src/servers/Server_Zone/Actor/Player.h b/src/servers/Server_Zone/Actor/Player.h
index 6146cce4..a34d8a46 100644
--- a/src/servers/Server_Zone/Actor/Player.h
+++ b/src/servers/Server_Zone/Actor/Player.h
@@ -478,6 +478,9 @@ public:
uint16_t getZoneId() const;
+ uint8_t getGmRank() const;
+ void setGmRank( uint8_t rank );
+
uint8_t getMode() const;
void setMode( uint8_t mode );
@@ -589,7 +592,7 @@ private:
boost::shared_ptr< Common::QuestActive > m_activeQuests[30];
int16_t m_questTracking[5];
uint8_t m_stateFlags[7];
- uint8_t m_userLevel;
+ uint8_t m_gmRank;
uint16_t zoneId;
bool m_bInCombat;
diff --git a/src/servers/Server_Zone/Actor/PlayerSql.cpp b/src/servers/Server_Zone/Actor/PlayerSql.cpp
index 6f7b507b..e5ba6a92 100644
--- a/src/servers/Server_Zone/Actor/PlayerSql.cpp
+++ b/src/servers/Server_Zone/Actor/PlayerSql.cpp
@@ -80,7 +80,8 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession )
"cd.GrandCompany, "
"cd.GrandCompanyRank, "
"cd.CFPenaltyUntil, "
- "cd.OpeningSequence "
+ "cd.OpeningSequence, "
+ "cd.GMRank "
"FROM charabase AS c "
" INNER JOIN charadetail AS cd "
" 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_gmRank = field[37].getUInt8();
+
m_pCell = nullptr;
if( !loadActiveQuests() || !loadClassData() || !loadSearchInfo() )
g_log.error( "Player id " + char_id_str + " data corrupt!" );
- m_userLevel = 1;
-
m_maxHp = getMaxHp();
m_maxMp = getMaxMp();
diff --git a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp
index 88136b4f..697bcbf8 100644
--- a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp
+++ b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp
@@ -70,6 +70,12 @@ void Core::DebugCommandHandler::registerCommand( const std::string& n, Core::Deb
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
void ( DebugCommandHandler::*pf )( char *, Entity::PlayerPtr, boost::shared_ptr< DebugCommand > );
diff --git a/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp
index f0e082ca..f51c776f 100644
--- a/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp
+++ b/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp
@@ -49,380 +49,384 @@ using namespace Core::Network::Packets::Server;
enum GmCommand
{
- Pos = 0x0000,
- Lv = 0x0001,
- Race = 0x0002,
- Tribe = 0x0003,
- Sex = 0x0004,
- Time = 0x0005,
- Weather = 0x0006,
- Call = 0x0007,
- Inspect = 0x0008,
- Speed = 0x0009,
- Invis = 0x000D,
+ Pos = 0x0000,
+ Lv = 0x0001,
+ Race = 0x0002,
+ Tribe = 0x0003,
+ Sex = 0x0004,
+ Time = 0x0005,
+ Weather = 0x0006,
+ Call = 0x0007,
+ Inspect = 0x0008,
+ Speed = 0x0009,
+ Invis = 0x000D,
- Raise = 0x0010,
- Kill = 0x000E,
- Icon = 0x0012,
+ Raise = 0x0010,
+ Kill = 0x000E,
+ Icon = 0x0012,
- Hp = 0x0064,
- Mp = 0x0065,
- Tp = 0x0066,
- Gp = 0x0067,
+ Hp = 0x0064,
+ Mp = 0x0065,
+ Tp = 0x0066,
+ Gp = 0x0067,
- Item = 0x00C8,
- Gil = 0x00C9,
- Collect = 0x00CA,
+ Item = 0x00C8,
+ Gil = 0x00C9,
+ Collect = 0x00CA,
- QuestAccept = 0x012C,
- QuestCancel = 0x012D,
- QuestComplete = 0x012E,
- QuestIncomplete = 0x012F,
- QuestSequence = 0x0130,
- QuestInspect = 0x0131,
- GC = 0x0154,
- GCRank = 0x0155,
- TeriInfo = 0x025D,
- Jump = 0x025E,
- JumpNpc = 0x025F,
+ QuestAccept = 0x012C,
+ QuestCancel = 0x012D,
+ QuestComplete = 0x012E,
+ QuestIncomplete = 0x012F,
+ QuestSequence = 0x0130,
+ QuestInspect = 0x0131,
+ GC = 0x0154,
+ GCRank = 0x0155,
+ TeriInfo = 0x025D,
+ Jump = 0x025E,
+ JumpNpc = 0x025F,
};
-void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPacket,
- Entity::PlayerPtr pPlayer )
+void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer )
{
- uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
- uint32_t param1 = inPacket.getValAt< uint32_t >( 0x24 );
- uint32_t param2 = inPacket.getValAt< uint32_t >( 0x28 );
- uint32_t param3 = inPacket.getValAt< uint32_t >( 0x38 );
+ if( pPlayer->getGmRank() <= 0 )
+ return;
- 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 ) );
+ uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
+ uint32_t param1 = inPacket.getValAt< uint32_t >( 0x24 );
+ 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 )
- {
- targetActor = pPlayer;
- }
- else {
- auto inRange = pPlayer->getInRangeActors();
- for( auto actor : inRange )
- {
- if( actor->getId() == param3 )
- targetActor = actor;
- }
- }
+ if( pPlayer->getId() == param3 )
+ {
+ targetActor = pPlayer;
+ }
+ else {
+ auto inRange = pPlayer->getInRangeActors();
+ for( auto actor : inRange )
+ {
+ if( actor->getId() == param3 )
+ targetActor = actor;
+ }
+ }
- if( !targetActor )
- return;
- auto targetPlayer = targetActor->getAsPlayer();
+ if( !targetActor )
+ return;
+ auto targetPlayer = targetActor->getAsPlayer();
- switch( commandId )
- {
- case GmCommand::Kill:
- {
- targetActor->takeDamage( 9999999 );
- pPlayer->sendNotice( "Killed " + std::to_string( targetActor->getId() ) );
- break;
- }
- case GmCommand::QuestSequence:
- {
- targetPlayer->updateQuest( param1, param2 );
- break;
- }
- case GmCommand::QuestComplete:
- {
- targetPlayer->finishQuest( param1 );
- break;
- }
- case GmCommand::QuestAccept:
- {
- targetPlayer->updateQuest( param1, 1 );
- break;
- }
- case GmCommand::QuestCancel:
- {
- targetPlayer->removeQuest( param1 );
- break;
- }
- case GmCommand::QuestIncomplete:
- {
- targetPlayer->unfinishQuest( param1 );
- break;
- }
- case GmCommand::Speed:
- {
- targetPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), Flee, param1 ) );
- pPlayer->sendNotice( "Speed for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
- break;
- }
- case GmCommand::Gil:
- {
- targetPlayer->addCurrency( 1, param1 );
- pPlayer->sendNotice( "Added " + std::to_string( param1 ) + " Gil for " + targetPlayer->getName() );
- break;
- }
- case GmCommand::Lv:
- {
- targetPlayer->setLevel( param1 );
- pPlayer->sendNotice( "Level for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
- break;
- }
- case GmCommand::Hp:
- {
- targetPlayer->setHp( param1 );
- pPlayer->sendNotice( "Hp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
- break;
- }
- case GmCommand::Mp:
- {
- targetPlayer->setMp( param1 );
- pPlayer->sendNotice( "Mp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
- break;
- }
- case GmCommand::Gp:
- {
- targetPlayer->setHp( param1 );
- pPlayer->sendNotice( "Gp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
- break;
- }
- case GmCommand::Sex:
- {
- targetPlayer->setLookAt( CharaLook::Gender, param1 );
- pPlayer->sendNotice( "Sex for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
- targetPlayer->spawn( targetPlayer );
- auto inRange = targetActor->getInRangeActors();
- for( auto actor : inRange )
- {
- targetPlayer->despawn( actor->getAsPlayer() );
- targetPlayer->spawn( actor->getAsPlayer() );
- }
- break;
- }
- case GmCommand::Race:
- {
- targetPlayer->setLookAt( CharaLook::Race, param1 );
- pPlayer->sendNotice( "Race for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
- targetPlayer->spawn( targetPlayer );
- auto inRange = targetPlayer->getInRangeActors();
- for( auto actor : inRange )
- {
- targetPlayer->despawn( actor->getAsPlayer() );
- targetPlayer->spawn( actor->getAsPlayer() );
- }
- break;
- }
- case GmCommand::Tribe:
- {
- targetPlayer->setLookAt( CharaLook::Tribe, param1 );
- pPlayer->sendNotice( "Tribe for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
- targetPlayer->spawn( targetPlayer );
- auto inRange = targetPlayer->getInRangeActors();
- for( auto actor : inRange )
- {
- targetPlayer->despawn( actor->getAsPlayer() );
- targetPlayer->spawn( actor->getAsPlayer() );
- }
- break;
- }
- case GmCommand::Item:
- {
- if( param2 < 1 || param2 > 99 )
- {
- param2 = 1;
- }
+ switch( commandId )
+ {
+ case GmCommand::Kill:
+ {
+ targetActor->takeDamage( 9999999 );
+ pPlayer->sendNotice( "Killed " + std::to_string( targetActor->getId() ) );
+ break;
+ }
+ case GmCommand::QuestSequence:
+ {
+ targetPlayer->updateQuest( param1, param2 );
+ break;
+ }
+ case GmCommand::QuestComplete:
+ {
+ targetPlayer->finishQuest( param1 );
+ break;
+ }
+ case GmCommand::QuestAccept:
+ {
+ targetPlayer->updateQuest( param1, 1 );
+ break;
+ }
+ case GmCommand::QuestCancel:
+ {
+ targetPlayer->removeQuest( param1 );
+ break;
+ }
+ case GmCommand::QuestIncomplete:
+ {
+ targetPlayer->unfinishQuest( param1 );
+ break;
+ }
+ case GmCommand::Speed:
+ {
+ targetPlayer->queuePacket( ActorControlPacket143( pPlayer->getId(), Flee, param1 ) );
+ pPlayer->sendNotice( "Speed for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
+ break;
+ }
+ case GmCommand::Gil:
+ {
+ targetPlayer->addCurrency( 1, param1 );
+ pPlayer->sendNotice( "Added " + std::to_string( param1 ) + " Gil for " + targetPlayer->getName() );
+ break;
+ }
+ case GmCommand::Lv:
+ {
+ targetPlayer->setLevel( param1 );
+ pPlayer->sendNotice( "Level for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
+ break;
+ }
+ case GmCommand::Hp:
+ {
+ targetPlayer->setHp( param1 );
+ pPlayer->sendNotice( "Hp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
+ break;
+ }
+ case GmCommand::Mp:
+ {
+ targetPlayer->setMp( param1 );
+ pPlayer->sendNotice( "Mp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
+ break;
+ }
+ case GmCommand::Gp:
+ {
+ targetPlayer->setHp( param1 );
+ pPlayer->sendNotice( "Gp for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
+ break;
+ }
+ case GmCommand::Sex:
+ {
+ targetPlayer->setLookAt( CharaLook::Gender, param1 );
+ pPlayer->sendNotice( "Sex for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
+ targetPlayer->spawn( targetPlayer );
+ auto inRange = targetActor->getInRangeActors();
+ for( auto actor : inRange )
+ {
+ targetPlayer->despawn( actor->getAsPlayer() );
+ targetPlayer->spawn( actor->getAsPlayer() );
+ }
+ break;
+ }
+ case GmCommand::Race:
+ {
+ targetPlayer->setLookAt( CharaLook::Race, param1 );
+ pPlayer->sendNotice( "Race for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
+ targetPlayer->spawn( targetPlayer );
+ auto inRange = targetPlayer->getInRangeActors();
+ for( auto actor : inRange )
+ {
+ targetPlayer->despawn( actor->getAsPlayer() );
+ targetPlayer->spawn( actor->getAsPlayer() );
+ }
+ break;
+ }
+ case GmCommand::Tribe:
+ {
+ targetPlayer->setLookAt( CharaLook::Tribe, param1 );
+ pPlayer->sendNotice( "Tribe for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
+ targetPlayer->spawn( targetPlayer );
+ auto inRange = targetPlayer->getInRangeActors();
+ for( auto actor : inRange )
+ {
+ targetPlayer->despawn( actor->getAsPlayer() );
+ targetPlayer->spawn( actor->getAsPlayer() );
+ }
+ break;
+ }
+ case GmCommand::Item:
+ {
+ if( param2 < 1 || param2 > 99 )
+ {
+ param2 = 1;
+ }
- if( ( param1 == 0xcccccccc ) )
- {
- pPlayer->sendUrgent( "Syntaxerror." );
- return;
- }
+ if( ( param1 == 0xcccccccc ) )
+ {
+ pPlayer->sendUrgent( "Syntaxerror." );
+ return;
+ }
- if( !targetPlayer->addItem( -1, param1, param2 ) )
- pPlayer->sendUrgent( "Item " + std::to_string( param1 ) + " not found..." );
- break;
- }
- case GmCommand::Weather:
- {
- targetPlayer->getCurrentZone()->setWeatherOverride( param1 );
- pPlayer->sendNotice( "Weather in Zone \"" + targetPlayer->getCurrentZone()->getName() + "\" of " +
- targetPlayer->getName() + " set in range." );
- break;
- }
- case GmCommand::TeriInfo:
- {
- pPlayer->sendNotice( "ZoneId: " + std::to_string( pPlayer->getZoneId() ) + "\nName: " +
- pPlayer->getCurrentZone()->getName() + "\nInternalName: " +
- pPlayer->getCurrentZone()->getInternalName() + "\nPopCount: " +
- std::to_string( pPlayer->getCurrentZone()->getPopCount() ) +
- "\nCurrentWeather:" + std::to_string( pPlayer->getCurrentZone()->getCurrentWeather() ) +
- "\nNextWeather:" + std::to_string( pPlayer->getCurrentZone()->getNextWeather() ) );
- break;
- }
- case GmCommand::Jump:
- {
+ if( !targetPlayer->addItem( -1, param1, param2 ) )
+ pPlayer->sendUrgent( "Item " + std::to_string( param1 ) + " not found..." );
+ break;
+ }
+ case GmCommand::Weather:
+ {
+ targetPlayer->getCurrentZone()->setWeatherOverride( param1 );
+ pPlayer->sendNotice( "Weather in Zone \"" + targetPlayer->getCurrentZone()->getName() + "\" of " +
+ targetPlayer->getName() + " set in range." );
+ break;
+ }
+ case GmCommand::TeriInfo:
+ {
+ pPlayer->sendNotice( "ZoneId: " + std::to_string( pPlayer->getZoneId() ) + "\nName: " +
+ pPlayer->getCurrentZone()->getName() + "\nInternalName: " +
+ pPlayer->getCurrentZone()->getInternalName() + "\nPopCount: " +
+ std::to_string( pPlayer->getCurrentZone()->getPopCount() ) +
+ "\nCurrentWeather:" + std::to_string( pPlayer->getCurrentZone()->getCurrentWeather() ) +
+ "\nNextWeather:" + std::to_string( pPlayer->getCurrentZone()->getNextWeather() ) );
+ break;
+ }
+ case GmCommand::Jump:
+ {
- auto inRange = pPlayer->getInRangeActors();
- for( auto actor : inRange )
- {
- pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
- targetActor->getRotation() );
- }
- pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() + " in range." );
- break;
- }
- case GmCommand::Collect:
- {
- uint32_t gil = targetPlayer->getCurrency( 1 );
+ auto inRange = pPlayer->getInRangeActors();
+ for( auto actor : inRange )
+ {
+ pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z,
+ targetActor->getRotation() );
+ }
+ pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() + " in range." );
+ break;
+ }
+ case GmCommand::Collect:
+ {
+ uint32_t gil = targetPlayer->getCurrency( 1 );
- if( gil < param1 )
- {
- pPlayer->sendUrgent( "Player does not have enough Gil(" + std::to_string( gil ) + ")" );
- }
- else
- {
- targetPlayer->removeCurrency( 1, param1 );
- pPlayer->sendNotice( "Removed " + std::to_string( param1 ) +
- " Gil from " + targetPlayer->getName() +
- "(" + std::to_string( gil ) + " before)" );
- }
- break;
- }
- case GmCommand::Icon:
- {
- targetPlayer->setOnlineStatusMask( param1 );
+ if( gil < param1 )
+ {
+ pPlayer->sendUrgent( "Player does not have enough Gil(" + std::to_string( gil ) + ")" );
+ }
+ else
+ {
+ targetPlayer->removeCurrency( 1, param1 );
+ pPlayer->sendNotice( "Removed " + std::to_string( param1 ) +
+ " Gil from " + targetPlayer->getName() +
+ "(" + std::to_string( gil ) + " before)" );
+ }
+ break;
+ }
+ case GmCommand::Icon:
+ {
+ targetPlayer->setOnlineStatusMask( param1 );
- GamePacketNew< FFXIVIpcSetOnlineStatus, ServerZoneIpcType > statusPacket( targetPlayer->getId() );
- statusPacket.data().onlineStatusFlags = param1;
- queueOutPacket( statusPacket );
+ GamePacketNew< FFXIVIpcSetOnlineStatus, ServerZoneIpcType > statusPacket( targetPlayer->getId() );
+ statusPacket.data().onlineStatusFlags = param1;
+ queueOutPacket( statusPacket );
- GamePacketNew< FFXIVIpcSetSearchInfo, ServerZoneIpcType > searchInfoPacket( targetPlayer->getId() );
- searchInfoPacket.data().onlineStatusFlags = param1;
- searchInfoPacket.data().selectRegion = targetPlayer->getSearchSelectRegion();
- sprintf( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() );
- targetPlayer->queuePacket( searchInfoPacket );
+ GamePacketNew< FFXIVIpcSetSearchInfo, ServerZoneIpcType > searchInfoPacket( targetPlayer->getId() );
+ searchInfoPacket.data().onlineStatusFlags = param1;
+ searchInfoPacket.data().selectRegion = targetPlayer->getSearchSelectRegion();
+ sprintf( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() );
+ targetPlayer->queuePacket( searchInfoPacket );
- targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon,
- static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ),
- true );
- pPlayer->sendNotice( "Icon for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
- break;
- }
- case GmCommand::GC:
- {
- targetPlayer->setGc( param1 );
- pPlayer->sendNotice( "GC for " + targetPlayer->getName() +
- " was set to " + std::to_string( targetPlayer->getGc() ) );
- break;
- }
- case GmCommand::GCRank:
- {
- targetPlayer->setGcRankAt( targetPlayer->getGc() - 1, param1 );
- pPlayer->sendNotice( "GC Rank for " + targetPlayer->getName() +
- " for GC " + std::to_string( targetPlayer->getGc()) +
- " was set to " + std::to_string( targetPlayer->getGcRankArray()[targetPlayer->getGc() - 1] ) );
- break;
- }
+ targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon,
+ static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ),
+ true );
+ pPlayer->sendNotice( "Icon for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) );
+ break;
+ }
+ case GmCommand::GC:
+ {
+ targetPlayer->setGc( param1 );
+ pPlayer->sendNotice( "GC for " + targetPlayer->getName() +
+ " was set to " + std::to_string( targetPlayer->getGc() ) );
+ break;
+ }
+ case GmCommand::GCRank:
+ {
+ targetPlayer->setGcRankAt( targetPlayer->getGc() - 1, param1 );
+ pPlayer->sendNotice( "GC Rank for " + targetPlayer->getName() +
+ " for GC " + std::to_string( targetPlayer->getGc() ) +
+ " was set to " + std::to_string( targetPlayer->getGcRankArray()[targetPlayer->getGc() - 1] ) );
+ break;
+ }
- default:
- pPlayer->sendUrgent( "GM1 Command not implemented: " + std::to_string( commandId ) );
- break;
- }
+ default:
+ pPlayer->sendUrgent( "GM1 Command not implemented: " + std::to_string( commandId ) );
+ break;
+ }
- pPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
- targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
+ pPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
+ targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
}
-void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPacket,
- Entity::PlayerPtr pPlayer )
+void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer )
{
- uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 );
- std::string param1 = inPacket.getStringAt( 0x34 );
+ if( pPlayer->getGmRank() <= 0 )
+ 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 );
- Core::Entity::ActorPtr targetActor;
+ g_log.debug( pPlayer->getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 );
- if( targetSession != nullptr )
- {
- targetActor = targetSession->getPlayer();
- }
- else
- {
- if( param1 == "self" )
- {
- targetActor = pPlayer;
- }
- else
- {
- pPlayer->sendUrgent("Player " + param1 + " not found on this server.");
- return;
- }
- }
+ auto targetSession = g_serverZone.getSession( param1 );
+ Core::Entity::ActorPtr targetActor;
- if( !targetActor )
- return;
- auto targetPlayer = targetActor->getAsPlayer();
+ if( targetSession != nullptr )
+ {
+ targetActor = targetSession->getPlayer();
+ }
+ else
+ {
+ if( param1 == "self" )
+ {
+ targetActor = pPlayer;
+ }
+ else
+ {
+ pPlayer->sendUrgent( "Player " + param1 + " not found on this server." );
+ return;
+ }
+ }
- switch( commandId )
- {
- case GmCommand::Raise:
- {
- targetPlayer->resetHp();
- targetPlayer->resetMp();
- targetPlayer->setStatus( Entity::Actor::ActorStatus::Idle );
- targetPlayer->setSyncFlag( Status );
+ if( !targetActor )
+ return;
+ auto targetPlayer = targetActor->getAsPlayer();
- targetPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true );
- targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus,
- static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true );
- pPlayer->sendNotice( "Raised " + targetPlayer->getName());
- break;
- }
- case GmCommand::Jump:
- {
- 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() );
+ switch( commandId )
+ {
+ case GmCommand::Raise:
+ {
+ targetPlayer->resetHp();
+ targetPlayer->resetMp();
+ targetPlayer->setStatus( Entity::Actor::ActorStatus::Idle );
+ targetPlayer->setSyncFlag( Status );
- targetPlayer->changePosition( pPlayer->getPos().x, pPlayer->getPos().y, pPlayer->getPos().z,
- pPlayer->getRotation() );
- 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;
- }
+ targetPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true );
+ targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus,
+ static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true );
+ pPlayer->sendNotice( "Raised " + targetPlayer->getName() );
+ break;
+ }
+ case GmCommand::Jump:
+ {
+ 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() );
- default:
- pPlayer->sendUrgent( "GM2 Command not implemented: " + std::to_string( commandId ) );
- break;
- }
+ targetPlayer->changePosition( pPlayer->getPos().x, pPlayer->getPos().y, pPlayer->getPos().z,
+ pPlayer->getRotation() );
+ 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 );
- targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
+ default:
+ pPlayer->sendUrgent( "GM2 Command not implemented: " + std::to_string( commandId ) );
+ break;
+ }
+
+ pPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
+ targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
}
diff --git a/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h
index d4e726a0..5bd39a09 100644
--- a/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h
+++ b/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h
@@ -45,7 +45,7 @@ namespace Server {
m_data.tPCurr = pPlayer->getTp();
m_data.hPMax = pPlayer->getMaxHp();
m_data.mPMax = pPlayer->getMaxMp();
- m_data.gmRank = 0xff;
+ m_data.gmRank = pPlayer->getGmRank();
//m_data.tPMax = 3000;
m_data.level = pPlayer->getLevel();
memcpy( m_data.look, pPlayer->getLookArray(), 26 );