summaryrefslogtreecommitdiffstats
path: root/MCServer
diff options
context:
space:
mode:
Diffstat (limited to 'MCServer')
-rw-r--r--MCServer/Plugins/APIDump/APIDesc.lua9
-rw-r--r--MCServer/Plugins/APIDump/Classes/Projectiles.lua24
-rw-r--r--MCServer/Plugins/InfoReg.lua1
-rw-r--r--MCServer/webadmin/files/guest.html2
-rw-r--r--MCServer/webadmin/files/header.pngbin0 -> 221 bytes
-rw-r--r--MCServer/webadmin/files/home.gifbin0 -> 1026 bytes
-rw-r--r--MCServer/webadmin/files/loading.gifbin0 -> 7364 bytes
-rw-r--r--MCServer/webadmin/files/log_out.pngbin0 -> 995 bytes
-rw-r--r--MCServer/webadmin/files/login.css219
-rw-r--r--MCServer/webadmin/files/login.gifbin0 -> 586 bytes
-rw-r--r--MCServer/webadmin/files/logo_login.pngbin0 -> 18057 bytes
-rw-r--r--MCServer/webadmin/files/pmfolder.gifbin0 -> 995 bytes
-rw-r--r--MCServer/webadmin/files/style.css572
-rw-r--r--MCServer/webadmin/files/sub_pmfolder.gifbin0 -> 1022 bytes
-rw-r--r--MCServer/webadmin/files/tcat.pngbin0 -> 183 bytes
-rw-r--r--MCServer/webadmin/files/thead.pngbin0 -> 132 bytes
-rw-r--r--MCServer/webadmin/login_template.html78
-rw-r--r--MCServer/webadmin/template.lua116
18 files changed, 719 insertions, 302 deletions
diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua
index 6a151b5ef..9b87781a6 100644
--- a/MCServer/Plugins/APIDump/APIDesc.lua
+++ b/MCServer/Plugins/APIDump/APIDesc.lua
@@ -534,6 +534,7 @@ end
GetUUID = { Params = "", Return = "string", Notes = "Returns the authentication-based UUID of the client. This UUID should be used to identify the player when persisting any player-related data. Returns a 32-char UUID (no dashes)" },
GetUsername = { Params = "", Return = "string", Notes = "Returns the username that the client has provided" },
GetViewDistance = { Params = "", Return = "number", Notes = "Returns the viewdistance (number of chunks loaded for the player in each direction)" },
+ GetRequestedViewDistance = { Params = "", Return = "number", Notes = "Returns the view distance that the player request, not the used view distance." },
HasPluginChannel = { Params = "ChannelName", Return = "bool", Notes = "Returns true if the client has registered to receive messages on the specified plugin channel." },
IsUUIDOnline = { Params = "UUID", Return = "bool", Notes = "(STATIC) Returns true if the UUID is generated by online auth, false if it is an offline-generated UUID. We use Version-3 UUIDs for offline UUIDs, online UUIDs are Version-4, thus we can tell them apart. Accepts both 32-char and 36-char UUIDs (with and without dashes). If the string given is not a valid UUID, returns false."},
Kick = { Params = "Reason", Return = "", Notes = "Kicks the user with the specified reason" },
@@ -614,7 +615,7 @@ function OnPlayerJoined(a_Player)
-- Send an example composite chat message to the player:
a_Player:SendMessage(cCompositeChat()
:AddTextPart("Hello, ")
- :AddUrlPart(a_Player:GetName(), "www.mc-server.org", "u@2") -- Colored underlined link
+ :AddUrlPart(a_Player:GetName(), "http://www.mc-server.org", "u@2") -- Colored underlined link
:AddSuggestCommandPart(", and welcome.", "/help", "u") -- Underlined suggest-command
:AddRunCommandPart(" SetDay", "/time set 0") -- Regular text that will execute command when clicked
:SetMessageType(mtJoin) -- It is a join-message
@@ -2137,6 +2138,7 @@ cPluginManager.AddHook(cPluginManager.HOOK_CHAT, OnChatMessage);
BroadcastChatWarning = { Params = "MessageText", Return = "", Notes = "Broadcasts the specified message to all players, with its message type set to mtWarning. Use for concerning events, such as plugin reload etc." },
CreateAndInitializeWorld = { Params = "WorldName", Return = "{{cWorld|cWorld}}", Notes = "Creates a new world and initializes it. If there is a world whith the same name it returns nil.<br/><br/><b>NOTE</b>This function is currently unsafe, do not use!" },
FindAndDoWithPlayer = { Params = "PlayerName, CallbackFunction", Return = "", Notes = "Calls the given callback function for all players with names partially (or fully) matching the name string provided." },
+ DoWithPlayerByUUID = { Params = "PlayerUUID, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is the player with the uuid, calls the CallbackFunction with the {{cPlayer}} parameter representing the player. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cPlayer|Player}}, [CallbackData])</pre> The function returns false if the player was not found, or whatever bool value the callback returned if the player was found." },
ForEachPlayer = { Params = "CallbackFunction", Return = "", Notes = "Calls the given callback function for each player. The callback function has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cPlayer|cPlayer}})</pre>" },
ForEachWorld = { Params = "CallbackFunction", Return = "", Notes = "Calls the given callback function for each world. The callback function has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cWorld|cWorld}})</pre>" },
Get = { Params = "", Return = "Root object", Notes = "(STATIC)This function returns the cRoot object." },
@@ -2406,6 +2408,7 @@ end
{ Params = "{{Vector3i|BlockCoords}}, BlockType, BlockMeta", Return = "", Notes = "Sets the block at the specified coords, without waking up the simulators or replacing the block entities for the previous block type. Do not use if the block being replaced has a block entity tied to it!" },
},
FindAndDoWithPlayer = { Params = "PlayerNameHint, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a player of a name similar to the specified name (weighted-match), calls the CallbackFunction with the {{cPlayer}} parameter representing the player. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cPlayer|Player}}, [CallbackData])</pre> The function returns false if the player was not found, or whatever bool value the callback returned if the player was found. Note that the name matching is very loose, so it is a good idea to check the player name in the callback function." },
+ DoWithPlayerByUUID = { Params = "PlayerUUID, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is the player with the uuid, calls the CallbackFunction with the {{cPlayer}} parameter representing the player. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cPlayer|Player}}, [CallbackData])</pre> The function returns false if the player was not found, or whatever bool value the callback returned if the player was found." },
ForEachBlockEntityInChunk = { Params = "ChunkX, ChunkZ, CallbackFunction, [CallbackData]", Return = "bool", Notes = "Calls the specified callback for each block entity in the chunk. Returns true if all block entities in the chunk have been processed (including when there are zero block entities), or false if the callback has aborted the enumeration by returning true. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cBlockEntity|BlockEntity}}, [CallbackData])</pre> The callback should return false or no value to continue with the next block entity, or true to abort the enumeration. Use {{tolua}}.cast() to cast the Callback's BlockEntity parameter to the correct {{cBlockEntity}} descendant." },
ForEachChestInChunk = { Params = "ChunkX, ChunkZ, CallbackFunction, [CallbackData]", Return = "bool", Notes = "Calls the specified callback for each chest in the chunk. Returns true if all chests in the chunk have been processed (including when there are zero chests), or false if the callback has aborted the enumeration by returning true. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cChestEntity|ChestEntity}}, [CallbackData])</pre> The callback should return false or no value to continue with the next chest, or true to abort the enumeration." },
ForEachEntity = { Params = "CallbackFunction, [CallbackData]", Return = "bool", Notes = "Calls the specified callback for each entity in the loaded world. Returns true if all the entities have been processed (including when there are zero entities), or false if the callback function has aborted the enumeration by returning true. The callback function has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cEntity|Entity}}, [CallbackData])</pre> The callback should return false or no value to continue with the next entity, or true to abort the enumeration." },
@@ -2497,7 +2500,7 @@ end
SetCommandBlocksEnabled = { Params = "IsEnabled (bool)", Return = "", Notes = "Sets whether command blocks should be enabled on the (entire) server." },
SetShouldUseChatPrefixes = { Params = "", Return = "ShouldUse (bool)", Notes = "Sets whether coloured chat prefixes such as [INFO] is used with the SendMessageXXX() or BroadcastChatXXX(), or simply the entire message is coloured in the respective colour." },
ShouldUseChatPrefixes = { Params = "", Return = "bool", Notes = "Returns whether coloured chat prefixes are prepended to chat messages or the entire message is simply coloured." },
- SetSignLines = { Params = "X, Y, Z, Line1, Line2, Line3, Line4, [{{cPlayer|Player}}]", Return = "", Notes = "Sets the sign text at the specified coords. The sign-updating hooks are called for the change. The Player parameter is used to indicate the player from whom the change has come, it may be nil. Same as UpdateSign()." },
+ SetSignLines = { Params = "X, Y, Z, Line1, Line2, Line3, Line4, [{{cPlayer|Player}}]", Return = "", Notes = "Sets the sign text at the specified coords. The sign-updating hooks are called for the change. The Player parameter is used to indicate the player from whom the change has come, it may be nil." },
SetTicksUntilWeatherChange = { Params = "NumTicks", Return = "", Notes = "Sets the number of ticks after which the weather will be changed." },
SetTimeOfDay = { Params = "TimeOfDayTicks", Return = "", Notes = "Sets the time of day, expressed as number of ticks past sunrise, in the range 0 .. 24000." },
SetWeather = { Params = "Weather", Return = "", Notes = "Sets the current weather (wSunny, wRain, wStorm) and resets the TicksUntilWeatherChange to the default value for the new weather. The normal weather-changing hooks are called for the change." },
@@ -2512,7 +2515,7 @@ end
SpawnExperienceOrb = { Params = "X, Y, Z, Reward", Return = "EntityID", Notes = "Spawns an {{cExpOrb|experience orb}} at the specified coords, with the given reward" },
SpawnPrimedTNT = { Params = "X, Y, Z, FuseTicks, InitialVelocityCoeff", Return = "", Notes = "Spawns a {{cTNTEntity|primed TNT entity}} at the specified coords, with the given fuse ticks. The entity gets a random speed multiplied by the InitialVelocityCoeff, 1 being the default value." },
TryGetHeight = { Params = "BlockX, BlockZ", Return = "IsValid, Height", Notes = "Returns true and height of the highest non-air block if the chunk is loaded, or false otherwise." },
- UpdateSign = { Params = "X, Y, Z, Line1, Line2, Line3, Line4, [{{cPlayer|Player}}]", Return = "", Notes = "Sets the sign text at the specified coords. The sign-updating hooks are called for the change. The Player parameter is used to indicate the player from whom the change has come, it may be nil. Same as SetSignLiens()" },
+ UpdateSign = { Params = "X, Y, Z, Line1, Line2, Line3, Line4, [{{cPlayer|Player}}]", Return = "", Notes = "(<b>DEPRECATED</b>) Please use SetSignLines()." },
UseBlockEntity = { Params = "{{cPlayer|Player}}, BlockX, BlockY, BlockZ", Return = "", Notes = "Makes the specified Player use the block entity at the specified coords (open chest UI, etc.) If the cords are in an unloaded chunk or there's no block entity, ignores the call." },
WakeUpSimulators = { Params = "BlockX, BlockY, BlockZ", Return = "", Notes = "Wakes up the simulators for the specified block." },
WakeUpSimulatorsInArea = { Params = "MinBlockX, MaxBlockX, MinBlockY, MaxBlockY, MinBlockZ, MaxBlockZ", Return = "", Notes = "Wakes up the simulators for all the blocks in the specified area (edges inclusive)." },
diff --git a/MCServer/Plugins/APIDump/Classes/Projectiles.lua b/MCServer/Plugins/APIDump/Classes/Projectiles.lua
index aef6a048c..748f58b71 100644
--- a/MCServer/Plugins/APIDump/Classes/Projectiles.lua
+++ b/MCServer/Plugins/APIDump/Classes/Projectiles.lua
@@ -123,35 +123,47 @@ return
cSplashPotionEntity =
{
- Desc = "",
- Functions = {},
+ Desc = [[
+ Represents a thrown splash potion.
+ ]],
+ Functions =
+ {
+ GetEntityEffect = { Params = "", Return = "{{cEntityEffect}}", Notes = "Returns the entity effect in this potion" },
+ GetEntityEffectType = { Params = "", Return = "{{cEntityEffect|Entity effect type}}", Notes = "Returns the effect type of this potion" },
+ GetPotionColor = { Params = "", Return = "number", Notes = "Returns the color index of the particles emitted by this potion" },
+ SetEntityEffect = { Params = "{{cEntityEffect}}", Return = "", Notes = "Sets the entity effect for this potion" },
+ SetEntityEffectType = { Params = "{{cEntityEffect|Entity effect type}}", Return = "", Notes = "Sets the effect type of this potion" },
+ SetPotionColor = { Params = "number", Return = "", Notes = "Sets the color index of the particles for this potion" },
+ },
Inherits = "cProjectileEntity",
}, -- cSplashPotionEntity
cThrownEggEntity =
{
- Desc = "",
+ Desc = [[
+ Represents a thrown egg.
+ ]],
Functions = {},
Inherits = "cProjectileEntity",
}, -- cThrownEggEntity
cThrownEnderPearlEntity =
{
- Desc = "",
+ Desc = "Represents a thrown ender pearl.",
Functions = {},
Inherits = "cProjectileEntity",
}, -- cThrownEnderPearlEntity
cThrownSnowballEntity =
{
- Desc = "",
+ Desc = "Represents a thrown snowball.",
Functions = {},
Inherits = "cProjectileEntity",
}, -- cThrownSnowballEntity
cWitherSkullEntity =
{
- Desc = "",
+ Desc = "Represents a wither skull being shot.",
Functions = {},
Inherits = "cProjectileEntity",
}, -- cWitherSkullEntity
diff --git a/MCServer/Plugins/InfoReg.lua b/MCServer/Plugins/InfoReg.lua
index da5a9972c..92c4a2e59 100644
--- a/MCServer/Plugins/InfoReg.lua
+++ b/MCServer/Plugins/InfoReg.lua
@@ -51,6 +51,7 @@ local function MultiCommandHandler(a_Split, a_Player, a_CmdString, a_CmdInfo, a_
return a_CmdInfo.Handler(a_Split, a_Player);
end
-- Let the player know they need to give a subcommand:
+ assert(type(a_CmdInfo.Subcommands) == "table", "Info.lua error: There is no handler for command \"" .. a_CmdString .. "\" and there are no subcommands defined at level " .. a_Level)
ListSubcommands(a_Player, a_CmdInfo.Subcommands, a_CmdString);
return true;
end
diff --git a/MCServer/webadmin/files/guest.html b/MCServer/webadmin/files/guest.html
new file mode 100644
index 000000000..7ae78a3f0
--- /dev/null
+++ b/MCServer/webadmin/files/guest.html
@@ -0,0 +1,2 @@
+Hello! Welcome to the MCServer WebAdmin.<br>
+This is a default message, edit <b>files/guest.html</b> to add your own custom message.
diff --git a/MCServer/webadmin/files/header.png b/MCServer/webadmin/files/header.png
new file mode 100644
index 000000000..97b067715
--- /dev/null
+++ b/MCServer/webadmin/files/header.png
Binary files differ
diff --git a/MCServer/webadmin/files/home.gif b/MCServer/webadmin/files/home.gif
new file mode 100644
index 000000000..b10e0bed7
--- /dev/null
+++ b/MCServer/webadmin/files/home.gif
Binary files differ
diff --git a/MCServer/webadmin/files/loading.gif b/MCServer/webadmin/files/loading.gif
new file mode 100644
index 000000000..b8d06f669
--- /dev/null
+++ b/MCServer/webadmin/files/loading.gif
Binary files differ
diff --git a/MCServer/webadmin/files/log_out.png b/MCServer/webadmin/files/log_out.png
new file mode 100644
index 000000000..63232417a
--- /dev/null
+++ b/MCServer/webadmin/files/log_out.png
Binary files differ
diff --git a/MCServer/webadmin/files/login.css b/MCServer/webadmin/files/login.css
new file mode 100644
index 000000000..5d87da4c5
--- /dev/null
+++ b/MCServer/webadmin/files/login.css
@@ -0,0 +1,219 @@
+/* Copyright Justin S and MCServer Team, licensed under CC-BY-SA 3.0 */
+* {
+ margin: 0;
+}
+
+body {
+ font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+ -webkit-font-smoothing: antialiased;
+ background: #fff url(header.png) repeat-x top left;
+ width: 100%;
+ min-width: 100%;
+ overflow: hidden;
+}
+
+a:link {
+ color: #555;
+ text-decoration: none;
+}
+
+a:visited {
+ color: #444;
+ text-decoration: none;
+}
+
+a:hover, a:active {
+ color: #000;
+ text-decoration: underline;
+}
+
+img {
+ border: none;
+}
+
+h1 {
+ color: #069;
+}
+
+.row1 {
+ border-bottom: 1px solid #000;
+ height: 100px;
+ max-height: 100px;
+}
+
+.row2 {
+ margin: 0 auto;
+ text-align: center;
+ vertical-align: middle;
+}
+
+.contention {
+ color: #000;
+ text-align: left;
+ line-height: 1.4;
+ margin: 0;
+ font-family: Tahoma,Verdana,Arial,Sans-Serif;
+ font-size: 13px;
+}
+
+button {
+ background: #fff;
+ color: #000;
+ border: 1px solid #ccc;
+ padding: 3px;
+ font-family: Tahoma,Verdana,Arial,Sans-Serif;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+ margin: -3px 0;
+}
+
+button:hover {
+ border-top-color: #28597a;
+ background: #28597a;
+ color: #ccc;
+}
+
+button:active {
+ border-top-color: #1b435e;
+ background: #1b435e;
+}
+
+.push10 {
+ padding-bottom: 75px;
+}
+
+#panel .upper {
+ background: #dcdbdc url(tcat.png) repeat-x;
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #bbb;
+ padding: 7px;
+}
+
+#footer {
+ z-index: 99999;
+}
+
+#footer ul.menu {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+#footer ul.menu li {
+ margin: 0 5px;
+ display: inline;
+}
+
+#footer .upper {
+ background: #dcdbdc url(tcat.png) repeat-x;
+ border-top: 1px solid #bbb;
+ padding: 6px;
+ overflow: hidden;
+ font-size: 12px;
+}
+
+#footer .upper ul.bottom_links {
+ float: left;
+ margin: 3px 0 0 -5px;
+}
+
+#footer .lower {
+ background: #a1a2a2 url(thead.png) top left repeat-x;
+ color: #fff;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ddd;
+ overflow: hidden;
+ padding: 8px;
+ font-size: 11px;
+}
+
+#footer .lower a:link, #footer .lower a:visited {
+ color: #fff;
+ font-weight: 700;
+}
+
+#footer .lower a:hover, #footer .lower a:active {
+ color: #fff;
+ font-weight: 700;
+}
+
+#footer .lower #current_time {
+ float: right;
+ padding-right: 6px;
+}
+
+.wrapper {
+ width: 85%;
+ min-width: 970px;
+ max-width: 1500px;
+ margin: auto;
+}
+
+#footer {
+ position: fixed;
+ left: 0;
+ bottom: 0;
+ height: 60px;
+ width: 100%;
+ background: #999;
+ border-top: 1px #000 solid;
+}
+
+* html #footer {
+ position: absolute;
+ top: expression((0-(footer.offsetHeight)+(document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight)+(ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop))+'px');
+}
+
+tr td.trow2:first-child {
+ border-left: 0;
+}
+
+tr td.trow2:last-child {
+ border-right: 0;
+}
+
+.tborder {
+ -moz-border-radius: 7px;
+ -webkit-border-radius: 7px;
+ border-radius: 7px;
+}
+
+.thead, .rounded_top {
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-topright: 6px;
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-top-right-radius: 6px;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+}
+
+table {
+ color: #000;
+ font-size: 13px;
+}
+
+.tborder {
+ background: #fff;
+ width: 100%;
+ margin: auto;
+ border: 1px solid #ccc;
+ padding: 1px;
+}
+
+.thead {
+ background: #a1a2a2 url(thead.png) top left repeat-x;
+ color: #fff;
+ border-bottom: 1px solid #8e8f8f;
+ padding: 8px;
+}
+
+.trow2 {
+ background: #efefef;
+ border: 1px solid;
+ border-color: #fff #ddd #ddd #fff;
+}
+
+.padtopp {
+ padding-top: 25px;
+}
diff --git a/MCServer/webadmin/files/login.gif b/MCServer/webadmin/files/login.gif
new file mode 100644
index 000000000..ce2cb6fc0
--- /dev/null
+++ b/MCServer/webadmin/files/login.gif
Binary files differ
diff --git a/MCServer/webadmin/files/logo_login.png b/MCServer/webadmin/files/logo_login.png
new file mode 100644
index 000000000..d2155f928
--- /dev/null
+++ b/MCServer/webadmin/files/logo_login.png
Binary files differ
diff --git a/MCServer/webadmin/files/pmfolder.gif b/MCServer/webadmin/files/pmfolder.gif
new file mode 100644
index 000000000..3fc68fdcb
--- /dev/null
+++ b/MCServer/webadmin/files/pmfolder.gif
Binary files differ
diff --git a/MCServer/webadmin/files/style.css b/MCServer/webadmin/files/style.css
index 7f01b34b2..7c0671970 100644
--- a/MCServer/webadmin/files/style.css
+++ b/MCServer/webadmin/files/style.css
@@ -1,353 +1,427 @@
-body, html
-{
- font-family: "Open Sans", Tahoma, sans-serif;
- padding: 0;
- margin: 0;
- font-weight: 400;
- background-color: #fbe9e7;
- color: rgba(0, 0, 0, 0.87);
+/* Copyright Justin S and MCServer Team, licensed under CC-BY-SA 3.0 */
+* {
+ margin: 0;
}
-.light { font-weight: 300; }
-.bold { font-weight: 600; }
+body {
+ font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+ -webkit-font-smoothing: antialiased;
+ background: #fff;
+ width: 100%;
+ min-width: 100%;
+ height:100%;
+ min-height:100%;
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+
+a:link {
+ color: #555;
+ text-decoration: none;
+}
+
+a:visited {
+ color: #444;
+ text-decoration: none;
+}
-#wrapper
-{
- background-color: #ff5722;
- margin: 40px auto;
- width: 99%;
- max-width: 1200px;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-shadow: 0px 4px 5px rgba(0, 0, 0, 0.15);
- color: rgba(0, 0, 0, 0.87);
+a:hover, a:active {
+ color: #000;
+ text-decoration: underline;
}
-.title
-{
- font-size: 30pt;
- padding: 10px 40px;
- text-decoration: none;
- color: white;
- text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3);
- display: block;
+img {
+ border: none;
}
-#sidebar
-{
- float: left;
- width: 20%;
+h1 {
+ color: #069;
+ text-shadow: 2px 2px #000;
}
-.sideNav
-{
- list-style: none;
- background-color: #fafafa;
- margin: 20px 0;
- padding: 5px 0;
- width: 100%;
- box-shadow: 1px 0px 10px rgba(0, 0, 0, 0.2);
+.row1 {
+ border-bottom: 1px #000 solid;
+ height: 100px;
+ max-height: 100px;
+ background: #fff url(header.png) repeat-x top left;
}
-.sideNav li
-{
- padding: 10px;
- color: rgba(0, 0, 0, 0.54);
+.row2 {
+ margin: 0 auto;
+ text-align: center;
+ vertical-align: middle;
+ margin-top: 25px;
+ margin-bottom: 25px;
}
-.sideNav li.link
-{
- padding-left: 30px;
+.contention {
+ color: #000;
+ text-align: left;
+ line-height: 1.4;
+ margin: 0;
+ font-family: Tahoma,Verdana,Arial,Sans-Serif;
+ font-size: 13px;
+ margin-bottom:75px;
}
-.sideNav li.link a
-{
- text-decoration: none;
- color: rgba(0, 0, 0, 0.87);
+.push25 {
}
-#container
-{
- margin: 0;
- padding: 0;
- overflow: hidden;
- background-color: #f5f5f5;
+#panel ul.menu {
+ margin: 0;
+ padding: 0;
+ list-style: none;
}
-#main
-{
- float: right;
- width: 80%;
- padding: 0 15px 20px 15px;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
+#panel ul.menu li {
+ margin: 0 5px;
+ display: inline;
}
-.clear
-{
- clear: both;
+#panel ul.menu li a {
+ padding-left: 20px;
+ background-repeat: no-repeat;
+ background-position: left center;
}
-table
-{
- width: 100%;
- border-collapse: collapse;
+#panel .upper ul.top_links {
+ float: right;
+ font-weight: 700;
}
-table td
-{
- padding: 5px;
+#panel .upper {
+ background: #dcdbdc url(tcat.png) repeat-x;
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #bbb;
+ padding: 7px;
}
-table th
-{
- border-bottom: 1px solid rgba(0, 0, 0, 0.12);
- padding: 5px;
- text-align: center;
+#footer ul.menu {
+ margin: 0;
+ padding: 0;
+ list-style: none;
}
-table tr:nth-child(odd)
-{
- background-color: rgba(0, 0, 0, 0.015);
+#footer ul.menu li {
+ margin: 0 5px;
+ display: inline;
}
-p
-{
- margin: 8px 0;
- padding: 8px 3px;
+#footer .upper {
+ background: #dcdbdc url(tcat.png) repeat-x;
+ border-top: 1px solid #bbb;
+ padding: 6px;
+ overflow: hidden;
+ font-size: 12px;
}
-a
-{
- text-decoration: none;
- color: #0277bd;
- -webkit-transition: color 0.1s linear;
- -moz-transition: color 0.1s linear;
- transition: color 0.1s linear;
+#footer .upper ul.bottom_links {
+ float: left;
+ margin: 3px 0 0 -5px;
}
-a:hover
-{
- color: #01579b;
+#footer .lower {
+ background: #a1a2a2 url(thead.png) top left repeat-x;
+ color: #fff;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ddd;
+ overflow: hidden;
+ padding: 8px;
+ font-size: 11px;
}
-.welcome-msg
-{
- color: rgba(0, 0, 0, 0.54);
+#footer .lower a:link,#footer .lower a:visited {
+ color: #fff;
+ font-weight: 700;
}
-.username
-{
- text-transform: capitalize;
- color: rgba(0, 0, 0, 0.87);
+#footer .lower a:hover,#footer .lower a:active {
+ color: #fff;
+ font-weight: 700;
}
-a:hover
-{
- color: black;
+#footer .lower #current_time {
+ float: right;
+ padding-right: 6px;
}
-input, select
-{
- padding: 8px;
+.wrapper {
+ width: 85%;
+ min-width: 970px;
+ max-width: 1500px;
+ margin: auto;
}
-form
-{
- padding: 4px;
+#footer {
+ position: fixed;
+ left:0;
+ bottom:0;
+ height: 61px;
+ width: 100%;
+ background: #999;
+ border-top: 1px #000 solid;
+ border-bottom: 1px #000 solid;
}
-.info input[type="submit"], .info button, .info input[type="button"],
-.warn input[type="submit"], .warn button, .warn input[type="button"],
-.err input[type="submit"], .err button, .err input[type="button"]
-{
- float: right;
+* html #footer {
+ position: absolute;
+ top: expression((0-(footer.offsetHeight)+(document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight)+(ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop))+'px');
}
-.err
-{
- color: white;
- display: block;
- background-color: #e51c23 !important;
- padding: 15px;
- line-height: 30px;
- min-height: 30px;
+tr td.trow1:first-child, tr td.trow2:first-child {
+ border-left: 0;
}
-.err:before
-{
- content: "ERROR: ";
+tr td.trow1:last-child, tr td.trow2:last-child {
+ border-right: 0;
}
-.warn
-{
- color: white;
- display: block;
- background-color: #ff5722 !important;
- padding: 15px;
- line-height: 30px;
- min-height: 30px;
+.tborder {
+ -moz-border-radius: 7px;
+ -webkit-border-radius: 7px;
+ border-radius: 7px;
}
-.warn:before
-{
- content: "WARNING: ";
+.thead {
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-topright: 6px;
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-top-right-radius: 6px;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
}
-.info
-{
- color: white;
- display: block;
- background-color: #5677fc !important;
- padding: 15px;
- line-height: 30px;
- min-height: 30px;
+table {
+ color: #000;
+ font-size: 13px;
}
-.info:before
-{
- content: "INFORMATION: ";
+.tborder {
+ background: #fff;
+ width: 100%;
+ margin: auto;
+ border: 1px solid #ccc;
+ padding: 1px;
}
-#footer .fleft
-{
- float: left;
+.thead {
+ background: #a1a2a2 url(thead.png) top left repeat-x;
+ color: #fff;
+ border-bottom: 1px solid #8e8f8f;
+ padding: 8px;
}
-#footer .fright
-{
- float: right;
- text-align: right;
+.tcat {
+ background: #dcdbdc url(tcat.png) repeat-x;
+ color: #fff;
+ border-bottom: 1px solid #bbb;
+ padding: 6px;
+ font-size: 12px;
}
-#footer
-{
- margin: 0;
- padding: 10px;
- font-size: 9pt;
- color: rgba(255, 255, 255, 0.8);
- box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.2) inset;
+.trow1 {
+ background: #f5f5f5;
+ border: 1px solid;
+ border-color: #fff #ddd #ddd #fff;
}
-#footer a
-{
- text-transform: none;
- color: white;
+.trow2 {
+ background: #efefef;
+ border: 1px solid;
+ border-color: #fff #ddd #ddd #fff;
+ padding: 15px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
}
-input[type="submit"], button, input[type="button"]
-{
- background-color: #ffc107;
- padding: 8px 15px 8px 15px;
- margin: 0 2px;
- display: inline-block;
- text-align: center;
- color: black;
- box-shadow: 0px 2px 3px rgba(0,0,0,0.2);
- border: none;
- outline: none;
- cursor: pointer;
+table {
+ color: #000;
+ font-size: 13px;
+ text-align: left;
}
-input[type="submit"]:hover, button:hover, input[type="button"]:hover
-{
- background-color: #ffca28;
+.tborder {
+ background: #fff;
+ width: 100%;
+ margin: auto;
+ border: 1px solid #ccc;
+ padding: 1px;
}
-input[type="submit"]:active, button:active, input[type="button"]:active
-{
- background-color: #ffd54f;
- -webkit-transform: translateY(1px);
- -moz-transform: translateY(1px);
- transform: translateY(1px);
+.thead {
+ background: #a1a2a2 url(thead.png) top left repeat-x;
+ color: #fff;
+ border-bottom: 1px solid #8e8f8f;
+ padding: 8px;
}
-hr
-{
- border: none;
- height: 1px;
- background-color: rgba(0, 0, 0, 0.12);
+.tcat {
+ background: #dcdbdc url(tcat.png) repeat-x;
+ color: #fff;
+ border-bottom: 1px solid #bbb;
+ padding: 6px;
+ font-size: 12px;
}
-h4
-{
- padding-bottom: 10px;
- margin-bottom: 12px;
- border-bottom: 1px solid rgba(0, 0, 0, 0.12);
+.trow1 {
+ background: #f5f5f5;
+ border: 1px solid;
+ border-color: #fff #ddd #ddd #fff;
}
+.trow2 {
+ background: #efefef;
+ border: 1px solid;
+ border-color: #fff #ddd #ddd #fff;
+}
-/**** PAGE SPECIFIC CSS ****/
+.smalltext {
+ font-size: 11px;
+}
-/* remove the * for disabling: */
+textarea {
+ background: #fff;
+ color: #000;
+ border: 1px solid #ccc;
+ padding: 2px;
+ line-height: 1.4;
+ font-family: Tahoma,Verdana,Arial,Sans-Serif;
+ font-size: 13px;
+}
-.page-core-server-settings table td
-{
- text-align: center;
- width: 25%;
+select {
+ background: #fff;
+ padding: 3px;
+ border: 1px solid #ccc;
+ font-family: Tahoma,Verdana,Arial,Sans-Serif;
}
-.page-core-server-settings.no-param table td:nth-child(1) a,
-.page-core-server-settings.param-tab-general table td:nth-child(1) a
-{
- font-weight: 600;
- color: rgba(0, 0, 0, 0.87);
+.usercp_nav_item {
+ display: block;
+ padding: 1px 0 1px 23px;
}
-.page-core-server-settings.param-tab-monsters table td:nth-child(2) a
-{
- font-weight: 600;
- color: rgba(0, 0, 0, 0.87);
+.usercp_nav_pmfolder {
+ background: url(pmfolder.gif) no-repeat left center;
}
-.page-core-server-settings.param-tab-worlds table td:nth-child(3) a
-{
- font-weight: 600;
- color: rgba(0, 0, 0, 0.87);
+.usercp_nav_sub_pmfolder {
+ padding-left: 40px;
+ background: url(sub_pmfolder.gif) no-repeat left center;
}
-.page-core-server-settings.param-tab-world table td:nth-child(4) a
-{
- font-weight: 600;
- color: rgba(0, 0, 0, 0.87);
+.usercp_nav_home {
+ background: url(home.gif) no-repeat left center;
}
-.page-core-permissions form table tr,
-.page-core-permissions form table td,
-.page-core-permissions form table th
-{
- border: none;
- background-color: transparent;
+.pagehead {
+ top: 0;
+ left: 0;
+ width: 100%;
}
-.page-core-permissions form table tr:nth-child(1) th
-{
- width: 35%;
+table {
+ width: 100%;
}
-.page-core-permissions form table tr:nth-child(1) td
-{
- width: 65%;
+table th {
+ border-bottom: 1px solid rgba(0,0,0,0.12);
+ padding: 5px;
+ text-align: left;
}
-.page-core-permissions form table td input
-{
- width: 100%;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- margin: 0;
+table tr:nth-child(odd) {
+ background-color: rgba(0,0,0,0.015);
}
-#ChatDiv
-{
- margin-bottom: 10px;
+p {
+ margin: 4px 0;
+ padding: 4px 3px;
}
-#ChatMessage
-{
- width: 100%;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
+a {
+ text-decoration: none;
+ color: #000;
+ -webkit-transition: color .1s linear;
+ -moz-transition: color .1s linear;
+ transition: color .1s linear;
}
-/**/
+a:hover {
+ color: #888;
+}
+
+input[type="text"] {
+ background: #fff;
+ color: #000;
+ border: 1px solid #ccc;
+ padding: 2px;
+ line-height: 1.4;
+ font-family: Tahoma,Verdana,Arial,Sans-Serif;
+ font-size: 13px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+}
+
+input[type="text"]:hover {
+ background-color: #E5E4E2;
+}
+
+input[type="text"]:focus {
+ background-color: #E5E4E2;
+}
+
+hr {
+ border: none;
+ height: 1px;
+ background-color: rgba(0,0,0,0.12);
+}
+
+h4 {
+ padding-bottom: 10px;
+ margin-bottom: 12px;
+ border-bottom: 1px solid rgba(0,0,0,0.12);
+}
+
+#ChatDiv {
+ margin-bottom: 10px;
+}
+
+#ChatMessage {
+ width: 92%;
+ margin-right: 5px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+
+input[type="submit"] {
+ padding: 3px;
+ padding-left: 5px;
+ padding-right: 5px;
+ cursor: pointer;
+ font-family: Tahoma,Verdana,Arial,Sans-Serif;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+ background: #f5f5f5;
+ border: 1px solid #ccc;
+}
+
+input[type="submit"]:hover {
+ background-color: #E5E4E2;
+}
+
+button:disabled,input:disabled {
+ padding: 3px;
+ padding-left: 5px;
+ padding-right: 5px;
+ cursor: pointer;
+ font-family: Tahoma,Verdana,Arial,Sans-Serif;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+ border: none!important;
+ color: #fff!important;
+ background-color: #ccc!important;
+}
diff --git a/MCServer/webadmin/files/sub_pmfolder.gif b/MCServer/webadmin/files/sub_pmfolder.gif
new file mode 100644
index 000000000..3d0d6e627
--- /dev/null
+++ b/MCServer/webadmin/files/sub_pmfolder.gif
Binary files differ
diff --git a/MCServer/webadmin/files/tcat.png b/MCServer/webadmin/files/tcat.png
new file mode 100644
index 000000000..eb64eb3d6
--- /dev/null
+++ b/MCServer/webadmin/files/tcat.png
Binary files differ
diff --git a/MCServer/webadmin/files/thead.png b/MCServer/webadmin/files/thead.png
new file mode 100644
index 000000000..81aa04bac
--- /dev/null
+++ b/MCServer/webadmin/files/thead.png
Binary files differ
diff --git a/MCServer/webadmin/login_template.html b/MCServer/webadmin/login_template.html
index 913a85db0..7a8601065 100644
--- a/MCServer/webadmin/login_template.html
+++ b/MCServer/webadmin/login_template.html
@@ -1,25 +1,69 @@
+<!-- Copyright Justin S and MCServer Team, licensed under CC-BY-SA 3.0 */ -->
<html>
<head>
<title>MCServer WebAdmin - Login</title>
- <meta charset="UTF-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link href="login.css" rel="stylesheet" type="text/css">
<link rel="icon" href="favicon.ico">
- <style type="text/css">
- header {
- margin: 0 auto;
- text-align: center;
- vertical-align: middle;
- }
- </style>
</head>
-
<body>
- <header>
- <img src="mc-logo.png" alt="MCServer Logo" class="logo">
- <h1>MCServer - WebAdmin</h1>
- <form method="get" action="webadmin/">
- <input type="submit" value="Log in">
- </form>
- </header>
+<div class="contention">
+ <div class="row1">
+ <div class="wrapper">
+ <img src="logo_login.png" alt="MCServer Logo" class="logo">
+ </div>
+ </div>
+ <div id="panel">
+ <div class="upper">
+ <div class="wrapper">
+ <div>
+ <form method="get" action="webadmin/" />
+ <button type="submit" value="Log in" style="width:150px;height:25px;font-family:'Source Sans Pro',sans-serif;background:transparent;border:none!important;vertical-align:middle">
+ <strong><img src="login.gif" style="vertical-align:bottom" /> WebAdmin Log in</strong>
+ </button>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row2 push10">
+ <div class="wrapper padtopp">
+ <table border="0" cellspacing="0" cellpadding="5" class="tborder" style="margin-bottom:5px">
+ <tbody>
+ <tr>
+ <td class="thead rounded_top">
+ <div style="float:left!important"><strong>MCServer WebAdmin</strong></div>
+ </td>
+ </tr>
+ <tr>
+ <td class="trow2 post_content">
+ <div class="post_body">
+ <iframe width="100%" height="100%" style="border:none;min-height:350px;max-height:450px" src="/guest.html"></iframe>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</div>
+<div id="footer">
+ <div class="upper">
+ <div class="wrapper">
+ <ul class="menu bottom_links">
+ <li><a href="http://www.mc-server.org" target="_blank">MCServer</a></li>
+ <li><a href="http://forum.mc-server.org" target="_blank">Forums</a></li>
+ <li><a href="http://builds.cuberite.org" target="_blank">Buildserver</a></li>
+ <li><a href="http://mc-server.xoft.cz/LuaAPI" target="_blank">API Documentation</a></li>
+ <li><a href="http://book.mc-server.org/" target="_blank">User's Manual</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="lower">
+ <div class="wrapper">
+ <span id="copyright">Copyright © <a href="http://www.mc-server.org" target="_blank">MCServer Team</a> 2014.</span>
+ </div>
+ </div>
+</div>
</body>
-
</html>
diff --git a/MCServer/webadmin/template.lua b/MCServer/webadmin/template.lua
index 05ca224b1..4d3934da8 100644
--- a/MCServer/webadmin/template.lua
+++ b/MCServer/webadmin/template.lua
@@ -81,22 +81,56 @@ function ShowPage(WebAdmin, TemplateRequest)
end
Output([[
-<!DOCTYPE html>
+<!-- Copyright Justin S and MCServer Team, licensed under CC-BY-SA 3.0 -->
+<html>
<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<link rel="icon" href="/favicon.ico">
-<title>]] .. Title .. [[</title>
-<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,600,300' rel='stylesheet' type='text/css'>
-<link rel="stylesheet" type="text/css" href="/style.css">
+ <title>]] .. Title .. [[</title>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" type="text/css" href="/style.css">
+ <link rel="icon" href="/favicon.ico">
</head>
<body>
-<div id="wrapper">
- <div id="containerHolder">
- <a href="./" class="title light">MCServer</a>
- <div id="container">
- <div id="sidebar">
- <ul class="sideNav">
- <li class='link'><a href=']] .. BaseURL .. [['>Home</a></li>
+<div class="contention push25">
+ <div class="pagehead">
+ <div class="row1">
+ <div class="wrapper">
+ <img src="/logo_login.png" alt="MCServer Logo" class="logo">
+ </div>
+ </div>
+ <div id="panel">
+ <div class="upper">
+ <div class="wrapper">
+ <ul class="menu top_links">
+ <li><a>Server Name: <strong>]] .. cRoot:Get():GetServer():GetServerID() .. [[</strong></a></li>
+ <li><a>Memory: <strong>]] .. MemoryUsageKiB / 1024 .. [[MB</strong></a></li>
+ <li><a>Chunks: <strong>]] .. NumChunks .. [[</strong></a></li>
+ </ul>
+ <div class="welcome"><strong>Welcome back, ]] .. TemplateRequest.Request.Username .. [[</strong>&nbsp;&nbsp;&nbsp;<a href=".././"><img src="/log_out.png" style="vertical-align:bottom;"> Log Out</a></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row2">
+ <div class="wrapper">
+ <table width="100%" border="0" align="center">
+ <tbody>
+ <tr>
+ <td width="180" valign="top">
+ <table border="0" cellspacing="0" cellpadding="5" class="tborder">
+ <tbody>
+ <tr>
+ <td class="thead"><strong>Menu</strong></td>
+ </tr>
+ <tr>
+ <td class="trow1 smalltext"><a href=']] .. BaseURL .. [[' class='usercp_nav_item usercp_nav_home'>Home</a></td>
+ </tr>
+ <tr>
+ <td class="tcat"><div><span class="smalltext"><strong><font color="#000">Server Management</font></strong></span></div></td>
+ </tr>
+ </tbody>
+ <tbody style="" id="usercppms_e">
+ <tr>
+ <td class="trow1 smalltext">
]])
@@ -105,30 +139,58 @@ function ShowPage(WebAdmin, TemplateRequest)
local PluginWebTitle = value:GetWebTitle()
local TabNames = value:GetTabNames()
if (GetTableSize(TabNames) > 0) then
- Output("<li>"..PluginWebTitle.."</li>\n");
+ Output("<div><a class='usercp_nav_item usercp_nav_pmfolder' style='text-decoration:none;'><b>"..PluginWebTitle.."</b></a></div>\n");
for webname,prettyname in pairs(TabNames) do
- Output("<li class='link'><a href='" .. BaseURL .. PluginWebTitle .. "/" .. webname .. "'>" .. prettyname .. "</a></li>\n")
+ Output("<div><a href='" .. BaseURL .. PluginWebTitle .. "/" .. webname .. "' class='usercp_nav_item usercp_nav_sub_pmfolder'>" .. prettyname .. "</a></div>\n")
end
+
+ Output("<br>\n");
end
end
Output([[
- </ul>
- </div>
-
- <div id="main" class="page-]] .. string.lower(PluginPage.PluginName .. "-" .. string.gsub(PluginPage.TabName, "[^a-zA-Z0-9]+", "-")) .. reqParamsClass .. [[">
- <h2 class="welcome-msg">Welcome <span class="username">]] .. TemplateRequest.Request.Username .. [[</span></h2>
-
- <hr/>
-
- <h3>]] .. SubTitle .. [[</h3>
- ]] .. PageContent .. [[</div>
- <div class="clear"></div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ <td valign="top" style='padding-left:25px;'>
+ <table border="0" cellspacing="0" cellpadding="5" class="tborder">
+ <tbody>
+ <tr>
+ <td class="thead" colspan="2"><strong>]] .. SubTitle .. [[</strong></td>
+ </tr>
+ <tr>
+ <td class="trow2">]] .. PageContent .. [[</td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+<div id="footer">
+ <div class="upper">
+ <div class="wrapper">
+ <ul class="menu bottom_links">
+ <li><a href="http://www.mc-server.org" target="_blank">MCServer</a></li>
+ <li><a href="http://forum.mc-server.org" target="_blank">Forums</a></li>
+ <li><a href="http://builds.cuberite.org" target="_blank">Buildserver</a></li>
+ <li><a href="http://mc-server.xoft.cz/LuaAPI" target="_blank">API Documentation</a></li>
+ <li><a href="http://book.mc-server.org/" target="_blank">User's Manual</a></li>
+ </ul>
</div>
</div>
- <div id="footer"><div class="fleft">running MCServer using <span class="bold">]] .. MemoryUsageKiB / 1024 .. [[MB</span> of memory; <span class="bold">]] .. NumChunks .. [[</span> chunks</div><div class="fright">design by <a href="//www.github.com/WebFreak001">WebFreak001</a></div><div class="clear"></div></div>
+ <div class="lower">
+ <div class="wrapper">
+ <span id="copyright">Copyright © <a href="http://www.mc-server.org" target="_blank">MCServer Team</a> 2014.</span>
+ </div>
+ </div>
+</div>
</div>
</body>
</html>