From a81413e046f329f72b77041cc7c5007ea7e6c1a4 Mon Sep 17 00:00:00 2001 From: Matt Gomez Date: Sun, 7 Jul 2024 21:02:56 -0600 Subject: [PATCH] update : https://github.com/opentibiabr/canary/commit/94901112ba6d1d152261402a56756125191b6756 --- .../creaturescripts/others/player_death.lua | 7 +++++++ .../creaturescripts/monster/boss_lever_death.lua | 3 +++ src/creatures/players/player.cpp | 14 ++++++++++++++ src/creatures/players/player.hpp | 6 ++++++ src/lua/functions/core/game/global_functions.cpp | 2 +- src/lua/functions/core/game/lua_enums.cpp | 14 ++++++++++++++ .../creatures/player/player_functions.cpp | 15 +++++++++++++++ .../creatures/player/player_functions.hpp | 4 ++++ src/server/network/protocol/protocolgame.cpp | 11 +++++++++++ src/server/network/protocol/protocolgame.hpp | 1 + src/server/network/protocol/protocolstatus.cpp | 2 +- src/utils/tools.cpp | 5 ++++- src/utils/tools.hpp | 2 +- src/utils/utils_definitions.hpp | 16 ++++++++++++++++ 14 files changed, 98 insertions(+), 4 deletions(-) diff --git a/data-otxserver/scripts/creaturescripts/others/player_death.lua b/data-otxserver/scripts/creaturescripts/others/player_death.lua index f34fb6e3a..2eacfccf4 100644 --- a/data-otxserver/scripts/creaturescripts/others/player_death.lua +++ b/data-otxserver/scripts/creaturescripts/others/player_death.lua @@ -40,6 +40,12 @@ function playerDeath.onDeath(player, corpse, killer, mostDamageKiller, unjustifi mostDamageName = "field item" end + player:takeScreenshot(byPlayer and SCREENSHOT_TYPE_DEATHPVP or SCREENSHOT_TYPE_DEATHPVE) + + if mostDamageKiller and mostDamageKiller:isPlayer() then + mostDamageKiller:takeScreenshot(SCREENSHOT_TYPE_PLAYERKILL) + end + local playerGuid = player:getGuid() db.query( "INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `is_player`, `mostdamage_by`, `mostdamage_is_player`, `unjustified`, `mostdamage_unjustified`) VALUES (" @@ -79,6 +85,7 @@ function playerDeath.onDeath(player, corpse, killer, mostDamageKiller, unjustifi end if byPlayer == 1 then + killer:takeScreenshot(SCREENSHOT_TYPE_PLAYERKILL) local targetGuild = player:getGuild() local targetGuildId = targetGuild and targetGuild:getId() or 0 if targetGuildId ~= 0 then diff --git a/data/scripts/creaturescripts/monster/boss_lever_death.lua b/data/scripts/creaturescripts/monster/boss_lever_death.lua index a2c58d1e4..4e0352716 100644 --- a/data/scripts/creaturescripts/monster/boss_lever_death.lua +++ b/data/scripts/creaturescripts/monster/boss_lever_death.lua @@ -30,6 +30,9 @@ function onBossDeath.onDeath(creature) zn:removePlayers() end, bossLever.timeAfterKill * 1000, zone) end + onDeathForDamagingPlayers(creature, function(creature, player) + player:takeScreenshot(SCREENSHOT_TYPE_BOSSDEFEATED) + end) return true end diff --git a/src/creatures/players/player.cpp b/src/creatures/players/player.cpp index eddffa20a..273079873 100644 --- a/src/creatures/players/player.cpp +++ b/src/creatures/players/player.cpp @@ -696,6 +696,11 @@ void Player::addSkillAdvance(skills_t skill, uint64_t count) { std::ostringstream ss; ss << "You advanced to " << getSkillName(skill) << " level " << skills[skill].level << '.'; sendTextMessage(MESSAGE_EVENT_ADVANCE, ss.str()); + if (skill == SKILL_LEVEL) { + sendTakeScreenshot(SCREENSHOT_TYPE_LEVELUP); + } else { + sendTakeScreenshot(SCREENSHOT_TYPE_SKILLUP); + } g_creatureEvents().playerAdvance(static_self_cast(), skill, (skills[skill].level - 1), skills[skill].level); @@ -2325,8 +2330,10 @@ void Player::addManaSpent(uint64_t amount) { std::ostringstream ss; ss << "You advanced to magic level " << magLevel << '.'; sendTextMessage(MESSAGE_EVENT_ADVANCE, ss.str()); + sendTakeScreenshot(SCREENSHOT_TYPE_SKILLUP); g_creatureEvents().playerAdvance(static_self_cast(), SKILL_MAGLEVEL, magLevel - 1, magLevel); + sendTakeScreenshot(SCREENSHOT_TYPE_SKILLUP); sendUpdateStats = true; currReqMana = nextReqMana; @@ -2464,6 +2471,7 @@ void Player::addExperience(std::shared_ptr target, uint64_t exp, bool std::ostringstream ss; ss << "You advanced from Level " << prevLevel << " to Level " << level << '.'; sendTextMessage(MESSAGE_EVENT_ADVANCE, ss.str()); + sendTakeScreenshot(SCREENSHOT_TYPE_LEVELUP); } if (nextLevelExp > currLevelExp) { @@ -6010,6 +6018,7 @@ bool Player::addOfflineTrainingTries(skills_t skill, uint64_t tries) { std::ostringstream ss; ss << "You advanced to magic level " << magLevel << '.'; sendTextMessage(MESSAGE_EVENT_ADVANCE, ss.str()); + sendTakeScreenshot(SCREENSHOT_TYPE_SKILLUP); } uint8_t newPercent; @@ -6066,6 +6075,11 @@ bool Player::addOfflineTrainingTries(skills_t skill, uint64_t tries) { std::ostringstream ss; ss << "You advanced to " << getSkillName(skill) << " level " << skills[skill].level << '.'; sendTextMessage(MESSAGE_EVENT_ADVANCE, ss.str()); + if (skill == SKILL_LEVEL) { + sendTakeScreenshot(SCREENSHOT_TYPE_LEVELUP); + } else { + sendTakeScreenshot(SCREENSHOT_TYPE_SKILLUP); + } } uint8_t newPercent; diff --git a/src/creatures/players/player.hpp b/src/creatures/players/player.hpp index 627b640ad..2c765850f 100644 --- a/src/creatures/players/player.hpp +++ b/src/creatures/players/player.hpp @@ -1730,6 +1730,12 @@ class Player final : public Creature, public Cylinder, public Bankable { } } + void sendTakeScreenshot(Screenshot_t screenshotType) { + if (client) { + client->sendTakeScreenshot(screenshotType); + } + } + void onThink(uint32_t interval) override; void postAddNotification(std::shared_ptr thing, std::shared_ptr oldParent, int32_t index, CylinderLink_t link = LINK_OWNER) override; diff --git a/src/lua/functions/core/game/global_functions.cpp b/src/lua/functions/core/game/global_functions.cpp index af89c1854..c8a857cff 100644 --- a/src/lua/functions/core/game/global_functions.cpp +++ b/src/lua/functions/core/game/global_functions.cpp @@ -217,7 +217,7 @@ int GlobalFunctions::luaGetWorldLight(lua_State* L) { int GlobalFunctions::luaGetWorldUpTime(lua_State* L) { // getWorldUpTime() - uint64_t uptime = (OTSYS_TIME() - ProtocolStatus::start) / 1000; + uint64_t uptime = (OTSYS_TIME(true) - ProtocolStatus::start) / 1000; lua_pushnumber(L, uptime); return 1; } diff --git a/src/lua/functions/core/game/lua_enums.cpp b/src/lua/functions/core/game/lua_enums.cpp index 2e3813e07..d0be72158 100644 --- a/src/lua/functions/core/game/lua_enums.cpp +++ b/src/lua/functions/core/game/lua_enums.cpp @@ -214,6 +214,20 @@ void LuaEnums::initOthersEnums(lua_State* L) { registerEnum(L, WEAPON_WAND); registerEnum(L, WEAPON_AMMO); registerEnum(L, WEAPON_MISSILE); + + registerEnum(L, SCREENSHOT_TYPE_NONE); + registerEnum(L, SCREENSHOT_TYPE_ACHIEVEMENT); + registerEnum(L, SCREENSHOT_TYPE_BESTIARYENTRYCOMPLETED); + registerEnum(L, SCREENSHOT_TYPE_BESTIARYENTRYUNLOCKED); + registerEnum(L, SCREENSHOT_TYPE_BOSSDEFEATED); + registerEnum(L, SCREENSHOT_TYPE_DEATHPVE); + registerEnum(L, SCREENSHOT_TYPE_DEATHPVP); + registerEnum(L, SCREENSHOT_TYPE_LEVELUP); + registerEnum(L, SCREENSHOT_TYPE_PLAYERKILLASSIST); + registerEnum(L, SCREENSHOT_TYPE_PLAYERKILL); + registerEnum(L, SCREENSHOT_TYPE_PLAYERATTACKING); + registerEnum(L, SCREENSHOT_TYPE_TREASUREFOUND); + registerEnum(L, SCREENSHOT_TYPE_SKILLUP); } void LuaEnums::initAccountEnums(lua_State* L) { diff --git a/src/lua/functions/creatures/player/player_functions.cpp b/src/lua/functions/creatures/player/player_functions.cpp index 52fd4517f..609ecbe95 100644 --- a/src/lua/functions/creatures/player/player_functions.cpp +++ b/src/lua/functions/creatures/player/player_functions.cpp @@ -4223,6 +4223,7 @@ int PlayerFunctions::luaPlayerAddAchievement(lua_State* L) { achievementId = g_game().getAchievementByName(getString(L, 2)).id; } + player->sendTakeScreenshot(SCREENSHOT_TYPE_ACHIEVEMENT); pushBoolean(L, player->achiev()->add(achievementId, getBoolean(L, 3, true))); return 1; } @@ -4378,3 +4379,17 @@ int PlayerFunctions::luaPlayerCreateTransactionSummary(lua_State* L) { pushBoolean(L, true); return 1; } + +int PlayerFunctions::luaPlayerTakeScreenshot(lua_State* L) { + // player:takeScreenshot(screenshotType) + const auto &player = getUserdataShared(L, 1); + if (!player) { + lua_pushnil(L); + return 1; + } + + auto screenshotType = getNumber(L, 2); + player->sendTakeScreenshot(screenshotType); + pushBoolean(L, true); + return 1; +} diff --git a/src/lua/functions/creatures/player/player_functions.hpp b/src/lua/functions/creatures/player/player_functions.hpp index 281e51ae8..3912753a1 100644 --- a/src/lua/functions/creatures/player/player_functions.hpp +++ b/src/lua/functions/creatures/player/player_functions.hpp @@ -375,6 +375,8 @@ class PlayerFunctions final : LuaScriptInterface { // Store Summary registerMethod(L, "Player", "createTransactionSummary", PlayerFunctions::luaPlayerCreateTransactionSummary); + registerMethod(L, "Player", "takeScreenshot", PlayerFunctions::luaPlayerTakeScreenshot); + GroupFunctions::init(L); GuildFunctions::init(L); MountFunctions::init(L); @@ -737,5 +739,7 @@ class PlayerFunctions final : LuaScriptInterface { static int luaPlayerCreateTransactionSummary(lua_State* L); + static int luaPlayerTakeScreenshot(lua_State* L); + friend class CreatureFunctions; }; diff --git a/src/server/network/protocol/protocolgame.cpp b/src/server/network/protocol/protocolgame.cpp index 18c23fbb1..3ac22ac6b 100644 --- a/src/server/network/protocol/protocolgame.cpp +++ b/src/server/network/protocol/protocolgame.cpp @@ -9156,3 +9156,14 @@ void ProtocolGame::sendHotkeyPreset() { writeToOutputBuffer(msg); } } + +void ProtocolGame::sendTakeScreenshot(Screenshot_t screenshotType) { + if (screenshotType == SCREENSHOT_TYPE_NONE || oldProtocol) { + return; + } + + NetworkMessage msg; + msg.addByte(0x75); + msg.addByte(screenshotType); + writeToOutputBuffer(msg); +} diff --git a/src/server/network/protocol/protocolgame.hpp b/src/server/network/protocol/protocolgame.hpp index 55e9cbfba..8e99aa68a 100644 --- a/src/server/network/protocol/protocolgame.hpp +++ b/src/server/network/protocol/protocolgame.hpp @@ -516,6 +516,7 @@ class ProtocolGame final : public Protocol { void sendDoubleSoundEffect(const Position &pos, SoundEffect_t mainSoundId, SourceEffect_t mainSource, SoundEffect_t secondarySoundId, SourceEffect_t secondarySource); void sendHotkeyPreset(); + void sendTakeScreenshot(Screenshot_t screenshotType); void sendDisableLoginMusic(); uint8_t m_playerDeathTime = 0; diff --git a/src/server/network/protocol/protocolstatus.cpp b/src/server/network/protocol/protocolstatus.cpp index ca40a8c00..be630886c 100644 --- a/src/server/network/protocol/protocolstatus.cpp +++ b/src/server/network/protocol/protocolstatus.cpp @@ -23,7 +23,7 @@ std::string ProtocolStatus::SERVER_VERSION = "6"; std::string ProtocolStatus::SERVER_DEVELOPERS = "OpenTibiaBR Organization. Based on: Canary (3.1.2). And data edited by: Mattyx14"; std::map ProtocolStatus::ipConnectMap; -const uint64_t ProtocolStatus::start = OTSYS_TIME(); +const uint64_t ProtocolStatus::start = OTSYS_TIME(true); void ProtocolStatus::onRecvFirstMessage(NetworkMessage &msg) { uint32_t ip = getIP(); diff --git a/src/utils/tools.cpp b/src/utils/tools.cpp index 6504fda85..f89b2c2f2 100644 --- a/src/utils/tools.cpp +++ b/src/utils/tools.cpp @@ -1515,7 +1515,10 @@ void UPDATE_OTSYS_TIME() { OTSYSTIME = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); } -int64_t OTSYS_TIME() { +int64_t OTSYS_TIME(bool useTime) { + if (useTime) { + return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + } return OTSYSTIME; } diff --git a/src/utils/tools.hpp b/src/utils/tools.hpp index 1f8ed3822..a4426a066 100644 --- a/src/utils/tools.hpp +++ b/src/utils/tools.hpp @@ -147,7 +147,7 @@ bool isCaskItem(uint16_t itemId); std::string getObjectCategoryName(ObjectCategory_t category); bool isValidObjectCategory(ObjectCategory_t category); -int64_t OTSYS_TIME(); +int64_t OTSYS_TIME(bool useTime = false); void UPDATE_OTSYS_TIME(); SpellGroup_t stringToSpellGroup(const std::string &value); diff --git a/src/utils/utils_definitions.hpp b/src/utils/utils_definitions.hpp index 7466c83a8..be50fd35b 100644 --- a/src/utils/utils_definitions.hpp +++ b/src/utils/utils_definitions.hpp @@ -751,3 +751,19 @@ enum Concoction_t : uint16_t { DeathAmplification = 36741, PhysicalAmplification = 36742, }; + +enum Screenshot_t : uint8_t { + SCREENSHOT_TYPE_NONE = 0, + SCREENSHOT_TYPE_ACHIEVEMENT = 1, + SCREENSHOT_TYPE_BESTIARYENTRYCOMPLETED = 2, + SCREENSHOT_TYPE_BESTIARYENTRYUNLOCKED = 3, + SCREENSHOT_TYPE_BOSSDEFEATED = 4, + SCREENSHOT_TYPE_DEATHPVE = 5, + SCREENSHOT_TYPE_DEATHPVP = 6, + SCREENSHOT_TYPE_LEVELUP = 7, + SCREENSHOT_TYPE_PLAYERKILLASSIST = 8, + SCREENSHOT_TYPE_PLAYERKILL = 9, + SCREENSHOT_TYPE_PLAYERATTACKING = 10, + SCREENSHOT_TYPE_TREASUREFOUND = 11, + SCREENSHOT_TYPE_SKILLUP = 12 +};