[Download] Nullsub some quirky gsc functions (#449)
* [Download] Nullsub some quirky gsc functions * [Script] Show deprecation warning * [Script] Expand error message
This commit is contained in:
parent
92ed9afae7
commit
28653a0e8d
@ -5,7 +5,6 @@ namespace Components
|
|||||||
{
|
{
|
||||||
mg_mgr Download::Mgr;
|
mg_mgr Download::Mgr;
|
||||||
Download::ClientDownload Download::CLDownload;
|
Download::ClientDownload Download::CLDownload;
|
||||||
std::vector<std::shared_ptr<Download::ScriptDownload>> Download::ScriptDownloads;
|
|
||||||
|
|
||||||
std::thread Download::ServerThread;
|
std::thread Download::ServerThread;
|
||||||
bool Download::Terminate;
|
bool Download::Terminate;
|
||||||
@ -927,77 +926,8 @@ namespace Components
|
|||||||
Dvar::Register<bool>("mod_force_download_server", false, Game::DVAR_ARCHIVE, "Set to true to force the client to run the download server for mods (for mods in private matches).");
|
Dvar::Register<bool>("mod_force_download_server", false, Game::DVAR_ARCHIVE, "Set to true to force the client to run the download server for mods (for mods in private matches).");
|
||||||
}, Scheduler::Pipeline::MAIN);
|
}, Scheduler::Pipeline::MAIN);
|
||||||
|
|
||||||
Scheduler::Loop([]
|
Script::AddFunction("HttpGet", Script::ShowDeprecationWarning);
|
||||||
{
|
Script::AddFunction("HttpCancel", Script::ShowDeprecationWarning);
|
||||||
int workingCount = 0;
|
|
||||||
|
|
||||||
for (auto i = Download::ScriptDownloads.begin(); i != Download::ScriptDownloads.end();)
|
|
||||||
{
|
|
||||||
auto download = *i;
|
|
||||||
|
|
||||||
if (download->isDone())
|
|
||||||
{
|
|
||||||
download->notifyDone();
|
|
||||||
i = Download::ScriptDownloads.erase(i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (download->isWorking())
|
|
||||||
{
|
|
||||||
download->notifyProgress();
|
|
||||||
++workingCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto& download : Download::ScriptDownloads)
|
|
||||||
{
|
|
||||||
if (workingCount > 5) break;
|
|
||||||
if (!download->isWorking())
|
|
||||||
{
|
|
||||||
download->startWorking();
|
|
||||||
++workingCount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}, Scheduler::Pipeline::MAIN);
|
|
||||||
|
|
||||||
Events::OnVMShutdown([]
|
|
||||||
{
|
|
||||||
Download::ScriptDownloads.clear();
|
|
||||||
});
|
|
||||||
|
|
||||||
Script::AddFunction("HttpGet", []
|
|
||||||
{
|
|
||||||
const auto* url = Game::Scr_GetString(0);
|
|
||||||
|
|
||||||
if (url == nullptr)
|
|
||||||
{
|
|
||||||
Game::Scr_ParamError(0, "^1HttpGet: Illegal parameter!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto object = Game::AllocObject();
|
|
||||||
|
|
||||||
Game::Scr_AddObject(object);
|
|
||||||
|
|
||||||
Download::ScriptDownloads.push_back(std::make_shared<ScriptDownload>(url, object));
|
|
||||||
Game::RemoveRefToObject(object);
|
|
||||||
});
|
|
||||||
|
|
||||||
Script::AddFunction("HttpCancel", []
|
|
||||||
{
|
|
||||||
const auto object = Game::Scr_GetObject(0);
|
|
||||||
for (const auto& download : Download::ScriptDownloads)
|
|
||||||
{
|
|
||||||
if (object == download->getObject())
|
|
||||||
{
|
|
||||||
download->cancel();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Download::~Download()
|
Download::~Download()
|
||||||
@ -1020,7 +950,5 @@ namespace Components
|
|||||||
{
|
{
|
||||||
Download::CLDownload.clear();
|
Download::CLDownload.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Download::ScriptDownloads.clear();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,132 +82,8 @@ namespace Components
|
|||||||
size_t receivedBytes;
|
size_t receivedBytes;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ScriptDownload
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ScriptDownload(const std::string& _url, unsigned int _object) : url(_url), object(_object), webIO(nullptr), done(false), notifyRequired(false), totalSize(0), currentSize(0)
|
|
||||||
{
|
|
||||||
Game::AddRefToObject(this->getObject());
|
|
||||||
}
|
|
||||||
|
|
||||||
ScriptDownload(ScriptDownload&& other) noexcept = delete;
|
|
||||||
ScriptDownload& operator=(ScriptDownload&& other) noexcept = delete;
|
|
||||||
|
|
||||||
~ScriptDownload()
|
|
||||||
{
|
|
||||||
if (this->getObject())
|
|
||||||
{
|
|
||||||
Game::RemoveRefToObject(this->getObject());
|
|
||||||
this->object = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this->workerThread.joinable())
|
|
||||||
{
|
|
||||||
this->workerThread.join();
|
|
||||||
}
|
|
||||||
|
|
||||||
this->destroyWebIO();
|
|
||||||
}
|
|
||||||
|
|
||||||
void startWorking()
|
|
||||||
{
|
|
||||||
if (!this->isWorking())
|
|
||||||
{
|
|
||||||
this->workerThread = std::thread(std::bind(&ScriptDownload::handler, this));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isWorking()
|
|
||||||
{
|
|
||||||
return this->workerThread.joinable();
|
|
||||||
}
|
|
||||||
|
|
||||||
void notifyProgress()
|
|
||||||
{
|
|
||||||
if (this->notifyRequired)
|
|
||||||
{
|
|
||||||
this->notifyRequired = false;
|
|
||||||
|
|
||||||
if (Game::Scr_IsSystemActive())
|
|
||||||
{
|
|
||||||
Game::Scr_AddInt(static_cast<int>(this->totalSize));
|
|
||||||
Game::Scr_AddInt(static_cast<int>(this->currentSize));
|
|
||||||
Game::Scr_NotifyId(this->getObject(), Game::SL_GetString("progress", 0), 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateProgress(size_t _currentSize, size_t _toalSize)
|
|
||||||
{
|
|
||||||
this->currentSize = _currentSize;
|
|
||||||
this->totalSize = _toalSize;
|
|
||||||
this->notifyRequired = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void notifyDone()
|
|
||||||
{
|
|
||||||
if (!this->isDone()) return;
|
|
||||||
|
|
||||||
if (Game::Scr_IsSystemActive())
|
|
||||||
{
|
|
||||||
Game::Scr_AddString(this->result.data()); // No binary data supported yet
|
|
||||||
Game::Scr_AddInt(this->success);
|
|
||||||
Game::Scr_NotifyId(this->getObject(), Game::SL_GetString("done", 0), 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isDone() { return this->done; };
|
|
||||||
|
|
||||||
std::string getUrl() { return this->url; }
|
|
||||||
unsigned int getObject() { return this->object; }
|
|
||||||
|
|
||||||
void cancel()
|
|
||||||
{
|
|
||||||
if (this->webIO)
|
|
||||||
{
|
|
||||||
this->webIO->cancelDownload();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string url;
|
|
||||||
std::string result;
|
|
||||||
unsigned int object;
|
|
||||||
std::thread workerThread;
|
|
||||||
Utils::WebIO* webIO;
|
|
||||||
|
|
||||||
bool done;
|
|
||||||
bool success;
|
|
||||||
bool notifyRequired;
|
|
||||||
size_t totalSize;
|
|
||||||
size_t currentSize;
|
|
||||||
|
|
||||||
void handler()
|
|
||||||
{
|
|
||||||
this->destroyWebIO();
|
|
||||||
|
|
||||||
this->webIO = new Utils::WebIO("IW4x");
|
|
||||||
this->webIO->setProgressCallback(std::bind(&ScriptDownload::updateProgress, this, std::placeholders::_1, std::placeholders::_2));
|
|
||||||
|
|
||||||
this->result = this->webIO->get(this->url, &this->success);
|
|
||||||
|
|
||||||
this->destroyWebIO();
|
|
||||||
this->done = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void destroyWebIO()
|
|
||||||
{
|
|
||||||
if (this->webIO)
|
|
||||||
{
|
|
||||||
delete this->webIO;
|
|
||||||
this->webIO = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static mg_mgr Mgr;
|
static mg_mgr Mgr;
|
||||||
static ClientDownload CLDownload;
|
static ClientDownload CLDownload;
|
||||||
static std::vector<std::shared_ptr<ScriptDownload>> ScriptDownloads;
|
|
||||||
static std::thread ServerThread;
|
static std::thread ServerThread;
|
||||||
static bool Terminate;
|
static bool Terminate;
|
||||||
static bool ServerRunning;
|
static bool ServerRunning;
|
||||||
|
@ -531,6 +531,14 @@ namespace Components
|
|||||||
return &Game::svs_clients[ent->s.number];
|
return &Game::svs_clients[ent->s.number];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Script::ShowDeprecationWarning()
|
||||||
|
{
|
||||||
|
Toast::Show("cardicon_gumby", "WARNING!", "You are using deprecated HttpGet/HttpCancel GSC function.", 2048);
|
||||||
|
Logger::Print(Game::CON_CHANNEL_SCRIPT, "*** DEPRECATION WARNING ***\n");
|
||||||
|
Logger::PrintError(Game::CON_CHANNEL_ERROR, "Attempted to execute deprecated built-in HttpGet/HttpCancel! These functions have been deemed unsafe and are scheduled for removal. Please update your mod!\n");
|
||||||
|
Logger::Print(Game::CON_CHANNEL_SCRIPT, "***************************\n");
|
||||||
|
}
|
||||||
|
|
||||||
void Script::AddFunctions()
|
void Script::AddFunctions()
|
||||||
{
|
{
|
||||||
Script::AddFunction("ReplaceFunc", [] // gsc: ReplaceFunc(<function>, <function>)
|
Script::AddFunction("ReplaceFunc", [] // gsc: ReplaceFunc(<function>, <function>)
|
||||||
|
@ -14,6 +14,8 @@ namespace Components
|
|||||||
|
|
||||||
static const char* GetCodePosForParam(int index);
|
static const char* GetCodePosForParam(int index);
|
||||||
|
|
||||||
|
static void ShowDeprecationWarning();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct ScriptFunction
|
struct ScriptFunction
|
||||||
{
|
{
|
||||||
@ -59,7 +61,6 @@ namespace Components
|
|||||||
static void Scr_StartupGameType_Stub();
|
static void Scr_StartupGameType_Stub();
|
||||||
static void GScr_LoadGameTypeScript_Stub();
|
static void GScr_LoadGameTypeScript_Stub();
|
||||||
|
|
||||||
static bool IsDeprecated(const std::string& name);
|
|
||||||
static Game::BuiltinFunction BuiltIn_GetFunctionStub(const char** pName, int* type);
|
static Game::BuiltinFunction BuiltIn_GetFunctionStub(const char** pName, int* type);
|
||||||
static Game::BuiltinMethod BuiltIn_GetMethodStub(const char** pName, int* type);
|
static Game::BuiltinMethod BuiltIn_GetMethodStub(const char** pName, int* type);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user