// Package to allow add-ons to use server.lua or client.lua // instead of or in addition to server.cs or client.cs // Relevant .lua files are is executed before .cs files. function _bllua_strEndsWith(%str, %sch) { %schL = strLen(%sch); return getSubStr(%str, strLen(%str)-%schL, %schL) $= %sch; } //function _bllua_strRemoveEnd(%str, %sch) { // %schL = strLen(%sch); // return getSubStr(%str, 0, strLen(%str)-%schL); //} function _bllua_fileIsExecCs(%fn) { return _bllua_strEndsWith(%fn, "/server.cs" ) || _bllua_strEndsWith(%fn, "/server.lua") || _bllua_strEndsWith(%fn, "/client.cs" ) || _bllua_strEndsWith(%fn, "/client.lua"); } function _bllua_execAddon(%dirName, %type) { %i = 0; %fnLua = "Add-Ons/" @ %dirName @ "/" @ %type @ ".lua"; if(isFile(%fnLua)) { luaexec(%fnLua); %i++; } %fnCs = "Add-Ons/" @ %dirName @ "/" @ %type @ ".cs"; if(isFile(%fnCs )) { exec(%fnCs ); %i++; } if(%i==0) { error("Error Loading Add-On " @ %dirName @ ": Neither " @ %type @ ".cs nor " @ %type @ ".lua exist"); } } // Rewrite built-in functions that scan for server.cs or client.cs // and make them scan for server.lua or client.lua as well // Note: I had to completely override several large functions, // many of which are highly redundant, because Badspot didn't know // what functional decomposition was when he wrote this shit. package _bllua_addon_exec { function CustomGameGuiServer::populateAddOnList() { deleteVariables("$CustomGameGuiServer::AddOn*"); $CustomGameGuiServer::AddOnCount = 0; %pattern = "Add-Ons/*/server.*"; %filename = findFirstFile(%pattern); while(isFile(%filename)) { if(_bllua_fileIsExecCs(%filename)) { %path = filePath(%filename); %dirName = getSubStr(%path, strlen("Add-Ons/"), strlen(%path) - strlen("Add-Ons/")); if(!%seenDirName[%dirName]) { %seenDirName[%dirName] = 1; %varName = getSafeVariableName(%dirName); if(isValidAddOn(%dirName, 1)) { $CustomGameGuiServer::AddOn[$CustomGameGuiServer::AddOnCount] = %dirName; $CustomGameGuiServer::AddOnCount++; } } } %filename = findNextFile(%pattern); } } function GameModeGuiServer::GetMissingAddOns(%filename) { if(!isFile(%filename)) { error("ERROR: GameModeGuiServer::GetMissingAddOns(" @ %filename @ ") - file does not exist"); return 0; } %path = filePath(%filename); %missingAddons = ""; %descriptionFile = %path @ "/description.txt"; %previewFile = %path @ "/preview.jpg"; %thumbFile = %path @ "/thumb.jpg"; %saveFile = %path @ "/save.bls"; %colorSetFile = %path @ "/colorSet.txt"; if(!isFile(%descriptionFile)) %missingAddons = %missingAddons TAB %descriptionFile; if(!isFile(%previewFile)) %missingAddons = %missingAddons TAB %previewFile; if(!isFile(%thumbFile)) %missingAddons = %missingAddons TAB %thumbFile; if(!isFile(%saveFile)) %missingAddons = %missingAddons TAB %saveFile; if(!isFile(%colorSetFile)) %missingAddons = %missingAddons TAB %colorSetFile; %file = new FileObject(""){}; %file.openForRead(%filename); while(!%file.isEOF()) { %line = %file.readLine(); %label = getWord(%line, 0); %value = trim(getWords(%line, 1, 999)); if(%label !$= "") { if(getSubStr(%label, 0, 2) !$= "//") { if(%label $= "ADDON") { if(!isFile("Add-Ons/" @ %value @ "/description.txt") || (!isFile("Add-Ons/" @ %value @ "/server.cs" ) && !isFile("Add-Ons/" @ %value @ "/server.lua") ) ) { if(strlen(%missingAddons) > 0) %missingAddons = %missingAddons TAB %value; else %missingAddons = %value; } } else { if(%label $= "MUSIC") { if(!isFile("Add-Ons/Music/" @ %value @ ".ogg")) { if(strlen(%missingAddons) > 0) %missingAddons = %missingAddons TAB %value @ ".ogg"; else %missingAddons = %value; } } } } } } %file.close(); %file.delete(); return %missingAddons; } function loadAddOns() { echo(""); updateAddOnList(); echo("--------- Loading Add-Ons (+BlockLua) ---------"); deleteVariables("$AddOnLoaded__*"); %dir = "Add-Ons/*/server.*"; %filename = findFirstFile(%dir); %dirCount = 0; if(isFile("Add-Ons/System_ReturnToBlockland/server.cs")) { %dirNameList[%dirCount] = "System_ReturnToBlockland"; %dirCount++; } while(%filename !$= "") { if(_bllua_fileIsExecCs(%filename)) { %path = filePath(%filename); %dirName = getSubStr(%path, strlen("Add-Ons/"), strlen(%path) - strlen("Add-Ons/")); if(!%seenDirName[%dirName]) { %seenDirName[%dirName] = 1; if(%dirName !$= "System_ReturnToBlockland") { %dirNameList[%dirCount] = %dirName; %dirCount++; } } } %filename = findNextFile(%dir); } for(%addOnItr = 0; %addOnItr < %dirCount; %addOnItr++) { %dirName = %dirNameList[%addOnItr]; %varName = getSafeVariableName(%dirName); if(!$Server::Dedicated) { if(getRealTime() - $lastProgressBarTime > 200) { LoadingProgress.setValue(%addOnItr / %dirCount); $lastProgressBarTime = getRealTime(); Canvas.repaint(); } } if($AddOn__[%varName] $= 1 && isValidAddOn(%dirName)) { if(%dirName $= "JVS_Content" && $AddOn__["Support_LegacyDoors"] $= 1) { echo(" Skipping JVS_Content in favor of Support_LegacyDoors"); } else if(!$AddOnLoaded__[%varName]) { $AddOnLoaded__[%varName] = 1; %zipFile = "Add-Ons/" @ %dirName @ ".zip"; if(isFile(%zipFile)) { %zipCRC = getFileCRC(%zipFile); echo("\c5Loading Add-On: " @ %dirName @ " \c2(CRC:" @ %zipCRC @ ")"); } else { echo("\c5Loading Add-On: " @ %dirName); } if(VerifyAddOnScripts(%dirName)==0) { echo("\c3ADD-ON " @ %dirName @ " CONTAINS SYNTAX ERRORS\n"); } else { %oldDBCount = DataBlockGroup.getCount(); _bllua_execAddon(%dirName, "server"); %dbDiff = DataBlockGroup.getCount() - %oldDBCount; echo("\c2" @ %dbDiff @ " datablocks added."); echo(""); } } } } echo(""); } function loadGameModeAddOns() { echo(""); echo("--------- Loading Add-Ons (Game Mode) (+BlockLua) ---------"); deleteVariables("$AddOnLoaded__*"); for(%i=0; %i<$GameMode::AddOnCount; %i++) { %dirName = $GameMode::AddOn[%i]; %varName = getSafeVariableName(%dirName); if(!$Server::Dedicated) { if(getRealTime() - $lastProgressBarTime > 200) { LoadingProgress.setValue(%i / $GameMode::AddOnCount); $lastProgressBarTime = getRealTime(); Canvas.repaint(); } } if(!isValidAddOn(%dirName)) { error("ERROR: Invalid add-on \'" @ %dirName @ "\' specified for game mode \'" @ $GameModeArg @ "\'"); } else { $AddOnLoaded__[%varName] = 1; %zipFile = "Add-Ons/" @ %dirName @ ".zip"; if(isFile(%zipFile)) { %zipCRC = getFileCRC(%zipFile); echo("\c5Loading Add-On: " @ %dirName @ " \c2(CRC:" @ %zipCRC @ ")"); } else { echo("\c5Loading Add-On: " @ %dirName); } if(VerifyAddOnScripts(%dirName) == 0) { echo("\c3ADD-ON " @ %dirName @ " CONTAINS SYNTAX ERRORS\n"); } else { %oldDBCount = DataBlockGroup.getCount(); _bllua_execAddon(%dirName, "server"); %dbDiff = DataBlockGroup.getCount() - %oldDBCount; echo("\c2" @ %dbDiff @ " datablocks added."); echo(""); } } } echo(""); } function loadClientAddOns() { echo(""); echo("--------- Loading Client Add-Ons (+BlockLua) ---------"); if(isFile("base/server/crapOns_Cache.cs")) exec("base/server/crapOns_Cache.cs"); %dir = "Add-Ons/*/client.*"; %filename = findFirstFile(%dir); %dirCount = 0; if(isFile("Add-Ons/System_ReturnToBlockland/client.cs")) { %dirNameList[%dirCount] = "System_ReturnToBlockland"; %dirCount++; } while(%filename !$= "") { if(_bllua_fileIsExecCs(%filename)) { %path = filePath(%filename); %dirName = getSubStr(%path, strlen("Add-Ons/"), strlen(%path) - strlen("Add-Ons/")); if(!%seenDirName[%dirName]) { %seenDirName[%dirName] = 1; if(%dirName !$= "System_ReturnToBlockland") { %dirNameList[%dirCount] = %dirName; %dirCount++; } } } %filename = findNextFile(%dir); } for(%i=0; %i<%dirCount; %i++) { %dirName = %dirNameList[%i]; %varName = getSafeVariableName(%dirName); echo(""); echo("Client checking Add-On: " @ %dirName); if(!clientIsValidAddOn(%dirName, 1)) { //deleteVariables("$AddOn__" @ %varName); // wtf } else { %name = %dirName; %zipFile = "Add-Ons/" @ %dirName @ ".zip"; if(isFile(%zipFile)) { %zipCRC = getFileCRC(%zipFile); echo("\c5Loading Add-On: " @ %dirName @ " \c2(CRC:" @ %zipCRC @ ")"); } else { echo("\c5Loading Add-On: " @ %dirName); } if(ClientVerifyAddOnScripts(%dirName)==0) echo("\c3ADD-ON " @ %dirName @ " CONTAINS SYNTAX ERRORS\n"); else _bllua_execAddon(%dirName, "client"); } } echo(""); } function updateAddOnList() { echo("\n--------- Updating Add-On List (+BlockLua) ---------"); deleteVariables("$AddOn__*"); if(isFile("config/server/ADD_ON_LIST.cs")) { exec("config/server/ADD_ON_LIST.cs"); } else { exec("base/server/defaultAddOnList.cs"); } if(isFile("base/server/crapOns_Cache.cs")) { exec("base/server/crapOns_Cache.cs"); } %dir = "Add-Ons/*/server.*"; %fileCount = getFileCount(%dir); %filename = findFirstFile(%dir); while(%filename !$= "") { if(_bllua_fileIsExecCs(%filename)) { %path = filePath(%filename); %dirName = getSubStr(%path, strlen("Add-Ons/"), strlen(%path) - strlen("Add-Ons/")); if(!%seenDirName[%dirName]) { %seenDirName[%dirName] = 1; %varName = getSafeVariableName(%dirName); echo("Checking Add-On " @ %dirName); if(!isValidAddOn(%dirName, 1)) { deleteVariables("$AddOn__" @ %varName); } else { if (mFloor($AddOn__[%varName]) <= 0) $AddOn__[%varName] = -1; else $AddOn__[%varName] = 1; } } } %filename = findNextFile(%dir); } echo(""); export("$AddOn__*", "config/server/ADD_ON_LIST.cs"); } }; activatePackage(_bllua_addon_exec); // Have to make new versions of these because packaging them is blocked FSFR function forceRequiredAddOn_L(%dirName) { if(%dirName $= "JVS_Content") { if($GameModeArg $= "") { if($AddOn__["Support_LegacyDoors"] == 1 || !isFile("add-ons/JVS_Content/server.cs") || ($AddOn__["Support_LegacyDoors"] != 1 && $AddOn__["JVS_Content"] != 1)) { %dirName = "Support_LegacyDoors"; } } else { %foundJVSContent = 0; for(%i=0; %i<$GameMode::AddOnCount; %i++) { if ($GameMode::AddOn[%i] $= "JVS_Content") { %foundJVSContent = 1; } } if(!%foundJVSContent) %dirName = "Support_LegacyDoors"; } } if(strstr(%dirName, " ") != -1) %dirName = strreplace(%dirName, " ", "_"); //if(strstr(%dirName, "/") != -1) // return $Error::AddOn_Nested; %varName = getSafeVariableName(%dirName); if($GameModeArg !$= "") { %foundIt = 0; for(%i=0; %i<$GameMode::AddOnCount; %i++) { if ($GameMode::AddOn[%i] $= %dirName) { %foundIt = 1; break; } } if(!%foundIt) { error("ERROR: ForceRequiredAddOn_L(\'" @ %dirName @ "\') - you can\'t force load an add-on that is not included in gamemode.txt"); if (GameWindowExists() && !$Server::Dedicated) { schedule(11, 0, MessageBoxOK, "Game Mode Error", "Required add-on " @ %dirName @ " should be added to gamemode.txt"); } if (!isEventPending($disconnectEvent)) { $disconnectEvent = schedule(10, 0, disconnect); } return $Error::AddOn_NotFound; } } if($AddOnLoaded__[%varName] == 1) return $Error::None; if($AddOn__[%varName] $= "" && $GameModeArg $= "" || !isValidAddOn(%dirName)) { error("ERROR: ForceRequiredAddOn() - " @ %dirName @ " is not a valid add-on"); return $Error::AddOn_NotFound; } echo(" Loading Add-On " @ %dirName @ ""); _bllua_execAddon(%dirName, "server"); $AddOnLoaded__[%varName] = 1; if($AddOn__[%varName] $= 1) return $Error::None; else return $Error::AddOn_Disabled; } function loadRequiredAddOn_L(%dirName) { if(%dirName $= "JVS_Content") { if($GameModeArg $= "") { if($AddOn__["Support_LegacyDoors"] == 1 || !isFile("add-ons/JVS_Content/server.cs") || ($AddOn__["Support_LegacyDoors"] != 1 && $AddOn__["JVS_Content"] != 1)) { %dirName = "Support_LegacyDoors"; } } else { %foundJVSContent = 0; for(%i=0; %i<$GameMode::AddOnCount; %i++) { if ($GameMode::AddOn[%i] $= "JVS_Content") { %foundJVSContent = 1; } } if(!%foundJVSContent) %dirName = "Support_LegacyDoors"; } } if(strstr(%dirName, " ") != -1) %dirName = strreplace(%dirName, " ", "_"); //if(strstr(%dirName, "/") != -1) // return $Error::AddOn_Nested; %varName = getSafeVariableName(%dirName); if ($GameModeArg !$= "") { %foundIt = 0; for(%i=0; %i<$GameMode::AddOnCount; %i++) { if ($GameMode::AddOn[%i] $= %dirName) { %foundIt = 1; break; } } if(!%foundIt) { error("ERROR: LoadRequiredAddOn_L(\'" @ %dirName @ "\') - you can\'t force load an add-on that is not included in gamemode.txt"); if (GameWindowExists() && !$Server::Dedicated) schedule(11, 0, MessageBoxOK, "Game Mode Error", "Required add-on " @ %dirName @ " should be added to gamemode.txt"); if (!isEventPending($disconnectEvent)) $disconnectEvent = schedule(10, 0, disconnect); return $Error::AddOn_NotFound; } } if($AddOnLoaded__[%varName] == 1) return $Error::None; if($AddOn__[%varName] $= 1) { echo(" Loading Add-On " @ %dirName @ ""); _bllua_execAddon(%dirName, "server"); $AddOnLoaded__[%varName] = 1; return $Error::None; } else { return $Error::AddOn_Disabled; } } echo(" Executed loadaddons.cs");