From 49f27fffbe07e66a3047812a838f03d7636cc4a9 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 1 Jun 2013 18:45:31 +0300 Subject: Add chat command /testparticle for testing particle effects on player. Command: /testparticle particle.xml - set particle effect on player. /testparticle - remove particle effect. Each second it check for particle file update and reloading it if need. --- src/commands.cpp | 6 ++++++ src/commands.h | 4 +++- src/gui/updaterwindow.cpp | 9 +++++++++ src/gui/updaterwindow.h | 2 ++ src/localplayer.cpp | 43 +++++++++++++++++++++++++++++++++++++++---- src/localplayer.h | 7 +++++++ src/net/download.cpp | 7 +++++++ src/net/download.h | 2 ++ 8 files changed, 75 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/commands.cpp b/src/commands.cpp index da771ede4..3d30e2169 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -1192,6 +1192,12 @@ impHandler2(enableAway) chatWindow->saveState(); } +impHandler1(testParticle) +{ + if (player_node) + player_node->setTestParticle(args); +} + impHandler0(testsdlfont) { #if defined USE_OPENGL && defined DEBUG_SDLFONT diff --git a/src/commands.h b/src/commands.h index 62f9eaead..f41a16339 100644 --- a/src/commands.h +++ b/src/commands.h @@ -123,6 +123,7 @@ namespace Commands decHandler(removeName); decHandler(disableAway); decHandler(enableAway); + decHandler(testParticle); void replaceVars(std::string &str); } // namespace Commands @@ -213,6 +214,7 @@ enum COMMAND_MOVETOHOME, COMMAND_SETHOME, COMMAND_MAGICATTACK, + COMMAND_TEST_PARTICLE, COMMAND_HACK, END_COMMANDS }; @@ -296,13 +298,13 @@ static const CommandInfo commands[] = {"", &Commands::dontRemoveName, -1, false}, {"", &Commands::removeName, -1, false}, {"disableaway", &Commands::disableAway, -1, false}, - {"enableaway", &Commands::enableAway, -1, false}, {"drop", nullptr, Input::KEY_QUICK_DROP, false}, {"dropn", nullptr, Input::KEY_QUICK_DROPN, false}, {"movetotarget", nullptr, Input::KEY_MOVE_TO_TARGET, false}, {"movetohome", nullptr, Input::KEY_MOVE_TO_HOME, false}, {"sethome", nullptr, Input::KEY_SET_HOME, false}, {"magicattack", nullptr, Input::KEY_MAGIC_ATTACK, false}, + {"testparticle", &Commands::testParticle, -1, true}, {"hack", &Commands::hack, -1, true} }; diff --git a/src/gui/updaterwindow.cpp b/src/gui/updaterwindow.cpp index 28efe9499..80ff0c580 100644 --- a/src/gui/updaterwindow.cpp +++ b/src/gui/updaterwindow.cpp @@ -925,6 +925,15 @@ bool UpdaterWindow::validateFile(const std::string &filePath, return adler == hash; } +unsigned long UpdaterWindow::getFileHash(const std::string &filePath) +{ + int size = 0; + char *buf = static_cast(ResourceManager::loadFile(filePath, size)); + if (!buf) + return 0; + return Net::Download::adlerBuffer(buf, size); +} + void UpdaterWindow::handleLink(const std::string &link, gcn::MouseEvent *event A_UNUSED) { diff --git a/src/gui/updaterwindow.h b/src/gui/updaterwindow.h index 440344367..e317e3f95 100644 --- a/src/gui/updaterwindow.h +++ b/src/gui/updaterwindow.h @@ -145,6 +145,8 @@ class UpdaterWindow final : public Window, static void unloadManaPlusUpdates(const std::string &dir, const ResourceManager *const resman); + static unsigned long getFileHash(const std::string &filePath); + private: void download(); diff --git a/src/localplayer.cpp b/src/localplayer.cpp index e77d3f249..c69e5b58a 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -50,6 +50,7 @@ #include "gui/sdlfont.h" #include "gui/skilldialog.h" #include "gui/socialwindow.h" +#include "gui/updaterwindow.h" #include "gui/viewport.h" #include "gui/widgets/gmtab.h" @@ -114,8 +115,8 @@ LocalPlayer::LocalPlayer(const int id, const int subtype) : mLastTargetY(0), mHomes(), mTarget(nullptr), - mPlayerFollowed(""), - mPlayerImitated(""), + mPlayerFollowed(), + mPlayerImitated(), mNextDestX(0), mNextDestY(0), mPickUpTarget(nullptr), @@ -156,9 +157,13 @@ LocalPlayer::LocalPlayer(const int id, const int subtype) : mNavigatePath(), mTargetDeadPlayers(config.getBoolValue("targetDeadPlayers")), mServerAttack(config.getBoolValue("serverAttack")), - mLastHitFrom(""), - mWaitFor(""), + mLastHitFrom(), + mWaitFor(), mAdvertTime(0), + mTestParticle(nullptr), + mTestParticleName(), + mTestParticleTime(0), + mTestParticleHash(0l), mBlockAdvert(false), mEnableAdvert(config.getBoolValue("enableAdvert")), mTradebot(config.getBoolValue("tradebot")), @@ -358,6 +363,18 @@ void LocalPlayer::slowLogic() else mAdvertTime = time + 30; } + + if (mTestParticleTime != time && !mTestParticleName.empty()) + { + unsigned long hash = UpdaterWindow::getFileHash(mTestParticleName); + if (hash != mTestParticleHash) + { + setTestParticle(mTestParticleName, false); + mTestParticleHash = hash; + } + mTestParticleTime = time; + } + BLOCK_END("LocalPlayer::slowLogic") } @@ -4310,6 +4327,24 @@ void LocalPlayer::updateStatus() const } } +void LocalPlayer::setTestParticle(const std::string &fileName, bool updateHash) +{ + mTestParticleName = fileName; + mTestParticleTime = cur_time; + if (mTestParticle) + { + mChildParticleEffects.removeLocally(mTestParticle); + mTestParticle = nullptr; + } + if (!fileName.empty()) + { + mTestParticle = particleEngine->addEffect(fileName, 0, 0, false); + controlParticle(mTestParticle); + if (updateHash) + mTestParticleHash = UpdaterWindow::getFileHash(mTestParticleName); + } +} + void AwayListener::action(const gcn::ActionEvent &event) { if (event.getId() == "ok" && player_node && player_node->getAway()) diff --git a/src/localplayer.h b/src/localplayer.h index 857b61167..6786ee0b0 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -468,6 +468,9 @@ class LocalPlayer final : public Being, void updateStatus() const; + void setTestParticle(const std::string &fileName, + bool updateHash = true); + std::string getInvertDirectionString(); std::string getCrazyMoveTypeString(); @@ -632,6 +635,10 @@ class LocalPlayer final : public Being, std::string mLastHitFrom; std::string mWaitFor; int mAdvertTime; + Particle *mTestParticle; + std::string mTestParticleName; + int mTestParticleTime; + unsigned long mTestParticleHash; bool mBlockAdvert; bool mEnableAdvert; bool mTradebot; diff --git a/src/net/download.cpp b/src/net/download.cpp index fad0bf6f2..a8f0e1c0c 100644 --- a/src/net/download.cpp +++ b/src/net/download.cpp @@ -125,6 +125,13 @@ unsigned long Download::fadler32(FILE *const file) return adler; } +unsigned long Download::adlerBuffer(char *buffer, int size) +{ + unsigned long adler = adler32(0L, Z_NULL, 0); + return adler32(static_cast(adler), + reinterpret_cast(buffer), size); +} + void Download::addHeader(const std::string &header) { mHeaders = curl_slist_append(mHeaders, header.c_str()); diff --git a/src/net/download.h b/src/net/download.h index d351a8355..d0025c2b3 100644 --- a/src/net/download.h +++ b/src/net/download.h @@ -100,6 +100,8 @@ class Download final static void secureCurl(CURL *const curl); + static unsigned long adlerBuffer(char *buffer, int size); + private: static int downloadThread(void *ptr); static int downloadProgress(void *clientp, double dltotal, -- cgit v1.2.3-60-g2f50