diff --git a/bin/web/assets/css/global.css b/bin/web/assets/css/global.css index 290a0199..c906893f 100644 --- a/bin/web/assets/css/global.css +++ b/bin/web/assets/css/global.css @@ -139,11 +139,25 @@ p.pageSubTitle{ } .commit-history { - padding-left: 20px; + padding: 0; + list-style: none; + margin: 0 -15px 0 -15px; } -.commit-history li a { +.commit-history > li { + +} + +.commit-history > li:nth-child(odd) { + background: #444; +} + +.commit-history> li > a { color: #fff; + padding: 5px 20px; + display: block; + font-size: 11px; + line-height: 12px; } .commit-history li a:hover { diff --git a/bin/web/assets/css/styles.css b/bin/web/assets/css/styles.css index 5e8f52ec..3bf1cf47 100644 --- a/bin/web/assets/css/styles.css +++ b/bin/web/assets/css/styles.css @@ -95,7 +95,6 @@ .s-login-btn { width: 150px; background: #0e6bc9; - right: -7px; /* ugh. refer to padding-left on input above - more bounding box issues... */ position: relative; } @@ -153,7 +152,7 @@ h2.text-center{ .s-link-badge-wrapper { clear: both; - + padding: 0 5px; } .s-link-badge { @@ -166,12 +165,10 @@ h2.text-center{ margin-top: 25px; color: white; border-bottom: 3px solid #43348D; - margin-bottom: 15px; } .s-link-badge-discord { background: #7082E1 url("../img/fa-discord-icon.png") 10px 7px no-repeat; - margin-right: 60px; /* Ideally we'd just use pull-right with the last col-xs-5 but IE7 bounding box render??? */ } .s-link-badge-github { diff --git a/bin/web/createUser.html b/bin/web/createUser.html index fe9398e0..de80751b 100644 --- a/bin/web/createUser.html +++ b/bin/web/createUser.html @@ -18,11 +18,11 @@ xhr.onreadystatechange = function() { if (xhr.readyState == 4) { - try{ + try { var response = readBody(xhr); var parsed = JSON.parse(response); window.external.Boot(parsed.sId, parsed.lobbyHost, parsed.frontierHost); - }catch(err){ + } catch(err) { document.getElementById("Error").innerHTML = "User creation failed."; } } @@ -51,11 +51,14 @@ Join us on Discord! - + Our Github repository -

Github stuff here soon!

+

Recent Activity

+
diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index e6b7af5b..42aaae59 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -252,7 +252,7 @@ namespace Core { EmoteReq = 0x1F4, EmoteCancel = 0x1F6, - PersistantEmoteCancel = 0x1F7, + PersistentEmoteCancel = 0x1F7, PoseChange = 0x1F9, PoseReapply = 0x1FA, PoseCancel = 0x1FB, diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index dedc5058..f402873c 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -381,7 +381,7 @@ struct FFXIVIpcPlayerSpawn : FFXIVIpcBasePacket uint16_t activeMinion; uint8_t spawnIndex; uint8_t state; - uint8_t persistantEmote; + uint8_t persistentEmote; uint8_t modelType; // modelType -> eventSystemDefine uint8_t subtype; uint8_t voice; diff --git a/src/servers/sapphire_lobby/GameConnection.cpp b/src/servers/sapphire_lobby/GameConnection.cpp index 8b853b96..798bf8ec 100644 --- a/src/servers/sapphire_lobby/GameConnection.cpp +++ b/src/servers/sapphire_lobby/GameConnection.cpp @@ -132,7 +132,7 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui serverListPacket->data().server[0].index = 0; serverListPacket->data().final = 1; strcpy( serverListPacket->data().server[0].name, - g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); + g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); pRP.addPacket( serverListPacket ); auto retainerListPacket = makeLobbyPacket< FFXIVIpcRetainerList >( tmpId ); @@ -233,7 +233,7 @@ void Core::Network::GameConnection::enterWorld( FFXIVARR_PACKET_RAW& packet, uin enterWorldPacket->data().contentId = lookupId; enterWorldPacket->data().seq = sequence; strcpy( enterWorldPacket->data().host, - g_serverLobby.getConfig()->getValue< std::string >( "GlobalNetwork.ZoneHost" ).c_str() ); + g_serverLobby.getConfig()->getValue< std::string >( "GlobalNetwork.ZoneHost" ).c_str() ); enterWorldPacket->data().port = g_serverLobby.getConfig()->getValue< uint16_t >( "GlobalNetwork.ZonePort" ); enterWorldPacket->data().charId = logInCharId; memcpy( enterWorldPacket->data().sid, m_pSession->getSessionId(), 66 ); @@ -313,7 +313,7 @@ bool Core::Network::GameConnection::createOrModifyChar( FFXIVARR_PACKET_RAW& pac charCreatePacket->data().content_id = newContentId; strcpy( charCreatePacket->data().name, name.c_str() ); strcpy( charCreatePacket->data().world, - g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); + g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); charCreatePacket->data().type = 1; charCreatePacket->data().seq = sequence; charCreatePacket->data().unknown = 1; @@ -336,7 +336,7 @@ bool Core::Network::GameConnection::createOrModifyChar( FFXIVARR_PACKET_RAW& pac charCreatePacket->data().content_id = newContentId; strcpy( charCreatePacket->data().name, name.c_str() ); strcpy( charCreatePacket->data().world, - g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); + g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); charCreatePacket->data().type = 2; charCreatePacket->data().seq = sequence; charCreatePacket->data().unknown = 1; @@ -489,7 +489,7 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: m_bEncryptionInitialized = true; auto pe1 = boost::make_shared< FFXIVRawPacket >( 0x0A, 0x290, 0, 0 ); - *reinterpret_cast< uint32_t* >(&pe1->data()[0]) = 0xE0003C2A; + *reinterpret_cast< uint32_t* >( &pe1->data()[0] ) = 0xE0003C2A; BlowFish blowfish; blowfish.initialize( m_encKey, 0x10 ); diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 3054a8e2..eb1ef7a1 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -67,6 +67,7 @@ Core::Entity::Player::Player() : m_bAutoattack( false ), m_markedForRemoval( false ), m_mount( 0 ), + m_emote( 0 ), m_directorInitialized( false ), m_onEnterEventDone( false ) { @@ -1381,6 +1382,16 @@ uint8_t Core::Entity::Player::getCurrentMount() const return m_mount; } +void Core::Entity::Player::setPersistentEmote( uint32_t emoteId ) +{ + m_emote = emoteId; +} + +uint32_t Core::Entity::Player::getPersistentEmote() const +{ + return m_emote; +} + void Core::Entity::Player::autoAttack( CharaPtr pTarget ) { diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index a842958f..3354d966 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -387,6 +387,10 @@ public: void dismount(); /*! get the current mount */ uint8_t getCurrentMount() const; + /*! set current persistent emote */ + void setPersistentEmote( uint32_t emoteId ); + /*! get current persistent emote */ + uint32_t getPersistentEmote() const; void calculateStats() override; void sendStats(); @@ -714,6 +718,7 @@ private: uint32_t m_cfPenaltyUntil; // unix time uint8_t m_mount; + uint32_t m_emote; Util::SpawnIndexAllocator< uint8_t > m_objSpawnIndexAllocator; Util::SpawnIndexAllocator< uint8_t > m_actorSpawnIndexAllocator; diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index c48adc71..aae34235 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -144,6 +144,23 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR uint32_t emoteId = param11; bool isSilent = param2 == 1; + auto pExdData = g_fw.get< Data::ExdDataGenerated >(); + auto emoteData = pExdData->get< Data::Emote >( emoteId ); + + if( !emoteData ) + return; + + // TODO: This is wrong!! EmoteCategory does not define whether an emote is persistent or not. + // What defines an emote as persistent is EmoteData != 0 + bool isPersistent = emoteData->emoteCategory == static_cast< uint8_t >( EmoteCategory::Persistent ); + + if( isPersistent ) + { + player.setStance( Entity::Chara::Stance::Passive ); + player.setAutoattack( false ); + player.setPersistentEmote( emoteId ); + } + player.emote( emoteId, targetId, isSilent ); break; } @@ -152,13 +169,14 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR player.emoteInterrupt(); break; } - case ClientTriggerType::PersistantEmoteCancel: // cancel persistant emote + case ClientTriggerType::PersistentEmoteCancel: // cancel persistent emote { + player.setPersistentEmote( 0 ); player.emoteInterrupt(); - auto SetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), + auto pSetStatusPacket = boost::make_shared< ActorControlPacket142 >( player.getId(), SetStatus, static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle ) ); - player.sendToInRangeSet( SetStatusPacket ); + player.sendToInRangeSet( pSetStatusPacket ); break; } case ClientTriggerType::PoseChange: // change pose diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h index 4694ea22..91c78825 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -118,6 +118,7 @@ namespace Server { } m_data.currentMount = player.getCurrentMount(); + m_data.persistentEmote = player.getPersistentEmote(); m_data.targetId = player.getTargetId(); //m_data.type = 1; diff --git a/src/tools/exd_struct_gen/ex.json b/src/tools/exd_struct_gen/ex.json index 8dd7ef24..6f27ec8c 100644 --- a/src/tools/exd_struct_gen/ex.json +++ b/src/tools/exd_struct_gen/ex.json @@ -3551,6 +3551,18 @@ { "name": "Name" }, + { + "index": 1, + "type": "repeat", + "count": 7, + "definition": { + "name": "ActionTimeline", + "converter": { + "type": "link", + "target": "ActionTimeline" + } + } + }, { "index": 11, "name": "EmoteCategory", @@ -3559,6 +3571,14 @@ "target": "EmoteCategory" } }, + { + "index": 12, + "name": "EmoteMode", + "converter": { + "type": "link", + "target": "EmoteMode" + } + }, { "index": 18, "name": "TextCommand", @@ -3589,6 +3609,10 @@ "type": "link", "target": "LogMessage" } + }, + { + "index": 22, + "name": "UnlockLink" } ] },