mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
253 lines
9.4 KiB
Plaintext
253 lines
9.4 KiB
Plaintext
/*
|
|
Originally from /Source/gg2/Scripts/Plugins/loadserverplugins.gml in Gang Garrison 2
|
|
|
|
Copyright (C) 2008-2013 Faucet Software
|
|
http://www.ganggarrison.com
|
|
|
|
This program is free software;
|
|
you can redistribute it and/or modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 3 of the License, or (at your option)
|
|
any later version.
|
|
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the GNU General Public License for more details.
|
|
You should have received a copy of the GNU General Public License along with this program; if not,
|
|
see <http://www.gnu.org/licenses>.
|
|
|
|
Additional permission under GNU GPL version 3 section 7
|
|
If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,
|
|
the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
|
|
the licensors of this Program grant you additional permission to convey the resulting work.
|
|
*/
|
|
|
|
// loads plugins from ganggarrison.com asked for by server
|
|
// argument0 - comma separated plugin list (pluginname@md5hash)
|
|
// returns true on success, false on failure
|
|
var list, hashList, text, i, pluginname, pluginhash, realhash, url, handle, filesize, progress, tempfile, tempdir, failed, lastContact, isCached;
|
|
|
|
failed = false;
|
|
list = ds_list_create();
|
|
lastContact = 0;
|
|
isCached = false;
|
|
isDebug = false;
|
|
hashList = ds_list_create();
|
|
|
|
// split plugin list string
|
|
list = split(argument0, ',');
|
|
|
|
// Split hashes from plugin names
|
|
for (i = 0; i < ds_list_size(list); i += 1)
|
|
{
|
|
text = ds_list_find_value(list, i);
|
|
pluginname = string_copy(text, 0, string_pos("@", text) - 1);
|
|
pluginhash = string_copy(text, string_pos("@", text) + 1, string_length(text) - string_pos("@", text));
|
|
ds_list_replace(list, i, pluginname);
|
|
ds_list_add(hashList, pluginhash);
|
|
}
|
|
|
|
// Check plugin names and check for duplicates
|
|
for (i = 0; i < ds_list_size(list); i += 1)
|
|
{
|
|
pluginname = ds_list_find_value(list, i);
|
|
|
|
// invalid plugin name
|
|
if (!checkpluginname(pluginname))
|
|
{
|
|
show_message('Error loading server-sent plugins - invalid plugin name:#"' + pluginname + '"');
|
|
return false;
|
|
}
|
|
// is duplicate
|
|
else if (ds_list_find_index(list, pluginname) != i)
|
|
{
|
|
show_message('Error loading server-sent plugins - duplicate plugin:#"' + pluginname + '"');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Download plugins
|
|
for (i = 0; i < ds_list_size(list); i += 1)
|
|
{
|
|
pluginname = ds_list_find_value(list, i);
|
|
pluginhash = ds_list_find_value(hashList, i);
|
|
isDebug = file_exists(working_directory + "\ServerPluginsDebug\" + pluginname + ".zip");
|
|
isCached = file_exists(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash);
|
|
tempfile = temp_directory + "\" + pluginname + ".zip.tmp";
|
|
tempdir = temp_directory + "\" + pluginname + ".tmp";
|
|
|
|
// check to see if we have a local copy for debugging
|
|
if (isDebug)
|
|
{
|
|
file_copy(working_directory + "\ServerPluginsDebug\" + pluginname + ".zip", tempfile);
|
|
// show warning
|
|
if (global.isHost)
|
|
{
|
|
show_message(
|
|
"Warning: server-sent plugin '"
|
|
+ pluginname
|
|
+ "' is being loaded from ServerPluginsDebug. Make sure clients have the same version, else they may be unable to connect."
|
|
);
|
|
}
|
|
else
|
|
{
|
|
show_message(
|
|
"Warning: server-sent plugin '"
|
|
+ pluginname
|
|
+ "' is being loaded from ServerPluginsDebug. Make sure the server has the same version, else you may be unable to connect."
|
|
);
|
|
}
|
|
}
|
|
// otherwise, check if we have it cached
|
|
else if (isCached)
|
|
{
|
|
file_copy(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash, tempfile);
|
|
}
|
|
// otherwise, download as usual
|
|
else
|
|
{
|
|
// construct the URL
|
|
// http://www.ganggarrison.com/plugins/$PLUGINNAME$@$PLUGINHASH$.zip)
|
|
url = PLUGIN_SOURCE + pluginname + "@" + pluginhash + ".zip";
|
|
|
|
// let's make the download handle
|
|
handle = httpGet(url, -1);
|
|
|
|
// download it
|
|
while (!httpRequestStatus(handle)) {
|
|
// prevent game locking up
|
|
io_handle();
|
|
|
|
httpRequestStep(handle);
|
|
|
|
if (!global.isHost) {
|
|
// send ping if we haven't contacted server in 20 seconds
|
|
// we need to do this to keep the connection open
|
|
if (current_time-lastContact > 20000) {
|
|
write_byte(global.serverSocket, PING);
|
|
socket_send(global.serverSocket);
|
|
lastContact = current_time;
|
|
}
|
|
}
|
|
|
|
// draw progress bar since they may be waiting a while
|
|
filesize = httpRequestResponseBodySize(handle);
|
|
progress = httpRequestResponseBodyProgress(handle);
|
|
draw_background_ext(background_index[0], 0, 0, background_xscale[0], background_yscale[0], 0, c_white, 1);
|
|
draw_set_color(c_white);
|
|
draw_set_alpha(1);
|
|
draw_set_halign(fa_left);
|
|
draw_rectangle(50, 550, 300, 560, 2);
|
|
draw_text(50, 530, "Downloading server-sent plugin " + string(i + 1) + "/" + string(ds_list_size(list)) + ' - "' + pluginname + '"');
|
|
if (filesize != -1)
|
|
draw_rectangle(50, 550, 50 + progress / filesize * 250, 560, 0);
|
|
screen_refresh();
|
|
}
|
|
|
|
// errored
|
|
if (httpRequestStatus(handle) == 2)
|
|
{
|
|
show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":#' + httpRequestError(handle));
|
|
failed = true;
|
|
break;
|
|
}
|
|
|
|
// request failed
|
|
if (httpRequestStatusCode(handle) != 200)
|
|
{
|
|
show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":#' + string(httpRequestStatusCode(handle)) + ' ' + httpRequestReasonPhrase(handle));
|
|
failed = true;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
write_buffer_to_file(httpRequestResponseBody(handle), tempfile);
|
|
if (!file_exists(tempfile))
|
|
{
|
|
show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":# No such file?');
|
|
failed = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
httpRequestDestroy(handle);
|
|
}
|
|
|
|
// check file integrity
|
|
realhash = GG2DLL_compute_MD5(tempfile);
|
|
if (realhash != pluginhash)
|
|
{
|
|
show_message('Error loading server-sent plugins - integrity check failed (MD5 hash mismatch) for:#"' + pluginname + '"');
|
|
failed = true;
|
|
break;
|
|
}
|
|
|
|
// don't try to cache debug plugins
|
|
if (!isDebug)
|
|
{
|
|
// add to cache if we don't already have it
|
|
if (!file_exists(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash))
|
|
{
|
|
// make sure directory exists
|
|
if (!directory_exists(working_directory + "\ServerPluginsCache"))
|
|
{
|
|
directory_create(working_directory + "\ServerPluginsCache");
|
|
}
|
|
// store in cache
|
|
file_copy(tempfile, working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash);
|
|
}
|
|
}
|
|
|
|
// let's get 7-zip to extract the files
|
|
extractzip(tempfile, tempdir);
|
|
|
|
// if the directory doesn't exist, extracting presumably failed
|
|
if (!directory_exists(tempdir))
|
|
{
|
|
show_message('Error loading server-sent plugins - extracting zip failed for:#"' + pluginname + '"');
|
|
failed = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!failed)
|
|
{
|
|
// Execute plugins
|
|
for (i = 0; i < ds_list_size(list); i += 1)
|
|
{
|
|
pluginname = ds_list_find_value(list, i);
|
|
tempdir = temp_directory + "\" + pluginname + ".tmp";
|
|
|
|
// Debugging facility, so we know *which* plugin caused compile/execute error
|
|
fp = file_text_open_write(working_directory + "\last_plugin.log");
|
|
file_text_write_string(fp, pluginname);
|
|
file_text_close(fp);
|
|
|
|
// packetID is (i), so make queues for it
|
|
ds_map_add(global.pluginPacketBuffers, i, ds_queue_create());
|
|
ds_map_add(global.pluginPacketPlayers, i, ds_queue_create());
|
|
|
|
// Execute plugin
|
|
execute_file(
|
|
// the plugin's main gml file must be in the root of the zip
|
|
// it is called plugin.gml
|
|
tempdir + "\plugin.gml",
|
|
// the plugin needs to know where it is
|
|
// so the temporary directory is passed as first argument
|
|
tempdir,
|
|
// the plugin needs to know its packetID
|
|
// so it is passed as the second argument
|
|
i
|
|
);
|
|
}
|
|
}
|
|
|
|
// Delete last plugin log
|
|
file_delete(working_directory + "\last_plugin.log");
|
|
|
|
// Get rid of plugin list
|
|
ds_list_destroy(list);
|
|
|
|
// Get rid of plugin hash list
|
|
ds_list_destroy(hashList);
|
|
|
|
return !failed;
|