I love the smell of UnrealEd crashing in the morning. – tarquin

Legacy:IAdvWebAdminSettings (UT3)

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to: navigation, search

The WebAdmin.IAdvWebAdminSettings class provides a more powerful method for a settings provider than the default system. An IAdvWebAdminSettings implementor must subclass a Settings (UT3) class.

When the the IAdvWebAdminSettings interface is implemented the settings commands, as explained here, will not be called. But the functions listed below will be called.

Functions[edit]

function initSettings(WorldInfo worldinfo, DataStoreCache dscache)
Called when the instance is created. The DataStoreCache (UT3) can be used to retrieve various information about gametypes, mutators, maps, and weapons.
function cleanup()
Called when the instance is queued to be cleanup. It should be used to unset all actor references.
function bool saveSettings(WebRequest request, WebAdminMessages messages)
Called when the settings should be saved. Return true when the settings were saved. Use the messages instance for feedback to the user about incorrect values and what not.
function renderSettings(WebResponse response, SettingsRenderer renderer, optional string substName = "settings")
Called to render the settings. This produce the HTML code for all settings this implementation should expose. You can use the given SettingsRenderer to perform standard rendering.

Example implementation[edit]

/**
 * Settings for the UTMutator_Arena
 *
 * Copyright 2008 Epic Games, Inc. All Rights Reserved
 *
 * @author  Michiel 'elmuerte' Hendriks
 */
class UTMutator_WeaponReplacementSettings extends Settings implements(IAdvWebAdminSettings);
 
`include(WebAdmin.uci)
 
struct WeaponData
{
	var class<Weapon> cls;
	var class ammoCls; // exact tyle is not relevant
	var UTUIDataProvider_Weapon data;
};
 
var array<WeaponData> weapons;
 
function initSettings(WorldInfo worldinfo, DataStoreCache dscache)
{
	local class<Weapon> weaponClass< SEMI >
	local class ammoCls;
 
	local int i, idx;
	dscache.loadWeapons();
	for (i = 0; i < dscache.weapons.Length; i++)
	{
		weaponClass = class<Weapon>(DynamicLoadObject(dscache.weapons[i].ClassName, class'class', true));
		ammocls = class(DynamicLoadObject(dscache.weapons[i].AmmoClassPath, class'class', true));
		if (weaponClass == none) continue;
		idx = weapons.length;
		weapons.length = idx+1;
		weapons[idx].cls = weaponClass< SEMI >
		weapons[idx].ammoCls = ammoCls;
		weapons[idx].data = dscache.weapons[i];
	}
}
 
function cleanup()
{
	weapons.length = 0;
}
 
function bool saveSettings(WebRequest request, WebAdminMessages messages)
{
	local int i, idx;
	local string cls;
	local ReplacementInfo entry;
 
	class'UTMutator_WeaponReplacement'.default.WeaponsToReplace.Length = 0;
	class'UTMutator_WeaponReplacement'.default.AmmoToReplace.Length = 0;
	for (i = 0; i < weapons.length; i++)
	{
		cls = request.GetVariable("weapon.."$weapons[i].data.ClassName);
		if (Len(cls) == 0) continue;
		if (cls ~= weapons[i].data.ClassName) continue;
		for (idx = 0; idx < weapons.Length; idx++)
		{
			if (weapons[idx].data.ClassName ~= cls) break;
		}
		if (idx == weapons.Length) continue;
 
		entry.OldClassName = weapons[i].cls.name;
		entry.NewClassPath = weapons[idx].data.ClassName;
		class'UTMutator_WeaponReplacement'.default.WeaponsToReplace.AddItem(entry);
		if (weapons[i].ammoCls != none)
		{
			entry.OldClassName = weapons[i].ammoCls.name;
			entry.NewClassPath = weapons[idx].data.AmmoClassPath;
			class'UTMutator_WeaponReplacement'.default.AmmoToReplace.AddItem(entry);
		}
	}
 
	class'UTMutator_WeaponReplacement'.static.StaticSaveConfig();
	return true;
}
 
function renderSettings(WebResponse response, SettingsRenderer renderer, optional string substName = "settings")
{
	local string substvar, selectedValue, options;
	local int i, j, idx;
 
	for (i = 0; i < weapons.Length; i++)
	{
		response.subst("setting.id", string(i));
		response.subst("setting.name", weapons[i].data.ClassName);
		response.subst("setting.formname", "weapon.."$weapons[i].data.ClassName);
		response.subst("setting.text", `HTMLEscape(weapons[i].data.FriendlyName));
 
		idx = class'UTMutator_WeaponReplacement'.default.WeaponsToReplace.find('OldClassName', weapons[i].cls.name);
		if (idx != INDEX_NONE)
		{
			selectedValue = class'UTMutator_WeaponReplacement'.default.WeaponsToReplace[idx].NewClassPath;
		}
		else {
			selectedValue = weapons[i].cls.GetPackageName()$"."$weapons[i].cls.name;
		}
		options = "";
 		for (j = 0; j < weapons.Length; j++)
		{
			response.subst("setting.option.value", weapons[j].data.ClassName);
			response.subst("setting.option.text", `HTMLEscape(weapons[j].data.FriendlyName));
			if (weapons[j].data.ClassName ~= selectedValue)
			{
				response.subst("setting.option.selected", "selected=\"selected\"");
			}
			else {
				response.subst("setting.option.selected", "");
			}
			options $= response.LoadParsedUHTM(renderer.getPath() $ "/" $ renderer.getFilePrefix() $ "option.inc");
		}
		response.subst("setting.options", options);
		response.subst("setting.html", response.LoadParsedUHTM(renderer.getPath() $ "/" $ renderer.getFilePrefix() $ "select.inc"));
		substvar $= response.LoadParsedUHTM(renderer.getPath() $ "/" $ renderer.getFilePrefix() $ "entry.inc");
	}
	response.Subst(substName, substvar);
}